From b96e5f326261b444997867095c20be9f744a64e5 Mon Sep 17 00:00:00 2001 From: yuding <1023798085@qq.com> Date: Thu, 5 Mar 2026 11:15:57 +0800 Subject: [PATCH] refactor: slim down EngineManager from 861 to 290 lines by removing passthrough proxy pattern - EngineManager now only exposes public SDK API (initialize, loadModel, pause/resumeRendering, getEngineComponent, destroy) - Internal managers access Engine component directly via this.engineComponent getter on BaseManager - Non-manager components use registry.engine3d.getEngineComponent() for direct Engine access - Replaced getEngine() with onRawEvent()/offRawEvent() for raw engine event access - Migrated 62 call sites across 13 files (9 managers, 1 panel, 3 toolbar buttons) - Updated all architecture docs, API docs, and README to reflect new patterns --- README.md | 52 +- demo/lib/iflow-engine.es.js | 5222 ++++++++--------- demo/lib/iflow-engine.umd.js | 278 +- demo/lib/iflow-engine.umd.js.map | 2 +- docs/API调用链.md | 1260 +--- docs/ENGINNE_3D/API文档.md | 15 + docs/MODULES/管理器模块.md | 550 +- docs/引擎API对接.md | 716 +-- docs/架构设计.md | 639 +- .../toolbar/buttons/home/index.ts | 2 +- .../button-group/toolbar/buttons/map/index.ts | 2 +- .../toolbar/buttons/zoom-box/index.ts | 2 +- src/components/engine/index.ts | 214 +- src/components/walk-path-panel/index.ts | 14 +- src/core/base-manager.ts | 10 + src/locales/en-US.ts | 22 +- src/locales/types.ts | 27 +- src/locales/zh-CN.ts | 22 +- src/managers/component-detail-manager.ts | 14 +- src/managers/construct-tree-manager-btn.ts | 20 +- src/managers/engine-info-dialog-manager.ts | 2 +- src/managers/engine-manager.ts | 533 +- src/managers/measure-dialog-manager.ts | 32 +- src/managers/section-axis-dialog-manager.ts | 12 +- src/managers/section-box-dialog-manager.ts | 28 +- src/managers/section-plane-dialog-manager.ts | 8 +- src/managers/setting-dialog-manager.ts | 337 +- src/managers/walk-control-manager.ts | 12 +- 28 files changed, 3786 insertions(+), 6261 deletions(-) diff --git a/README.md b/README.md index cfcaa40..165386e 100644 --- a/README.md +++ b/README.md @@ -70,16 +70,18 @@ onMounted(() => { bimEngine.initWalkControl(); // 漫游控制 bimEngine.initMap(); // 地图 - // 加载模型 - bimEngine.engine?.loadModel({ - url: '/path/to/your/model.ifc', - onProgress: (progress) => { - console.log(`加载进度: ${progress}%`); - }, - onComplete: () => { - console.log('模型加载完成'); + // 加载模型(EngineManager 对外公共 API) + bimEngine.engine?.loadModel( + ['/path/to/your/model.ifc'], + { + onProgress: (progress) => { + console.log(`加载进度: ${progress}%`); + }, + onComplete: () => { + console.log('模型加载完成'); + } } - }); + ); } }); @@ -179,6 +181,13 @@ BIM Engine SDK 采用 **管理器模式 (Manager Pattern)** 作为核心架构, - ✅ 简化集成复杂度 - ✅ 支持按需加载 +> 架构更新(2026-03) +> +> - `EngineManager` 已从全量透传层收敛为“外部公共 API + 生命周期编排” +> - 内部 Manager 统一通过 `BaseManager.engineComponent` 直接访问 `Engine` 组件 +> - 非 Manager 场景通过 `registry.engine3d?.getEngineComponent()?.xxx()` 访问引擎能力 +> - `Engine.getEngine()` 已移除,事件订阅使用 `onRawEvent()/offRawEvent()` + ### 架构分层 ``` @@ -193,7 +202,7 @@ BIM Engine SDK 采用 **管理器模式 (Manager Pattern)** 作为核心架构, │ Manager 层 (管理器) │ │ - ToolbarManager (工具栏) │ │ - DialogManager (对话框) │ -│ - EngineManager (3D引擎) │ +│ - EngineManager (外部公共API/生命周期) │ │ - MeasureDialogManager (测量) │ │ - SectionPlaneDialogManager (剖切) │ │ - WalkControlManager (漫游) │ @@ -333,12 +342,14 @@ class BimEngine { 每个管理器负责特定功能的生命周期管理: ```typescript -// 3D 引擎管理器 -bimEngine.engine?.loadModel({ - url: '/path/to/model.ifc', - onProgress: (progress) => console.log(progress), - onComplete: () => console.log('完成') -}); +// 3D 引擎管理器(对外公共 API) +bimEngine.engine?.loadModel( + ['/path/to/model.ifc'], + { + onProgress: (progress) => console.log(progress), + onComplete: () => console.log('完成') + } +); // 测量工具管理器 bimEngine.measure?.show(); @@ -509,6 +520,15 @@ npm run dev ## 📝 更新日志 +### v1.3.2 (2026-03-05) + +**架构优化** +- ✨ EngineManager 瘦身:移除大规模 1:1 透传方法 +- ✨ 新增 `EngineManager.getEngineComponent()` 供内部访问 +- ✨ BaseManager 新增 `engineComponent` 便捷访问器 +- ✨ Manager 内部调用统一迁移为 `this.engineComponent?.xxx()` +- ✨ 原始事件访问改为 `onRawEvent()/offRawEvent()`,移除 `getEngine()` + ### v1.0.0 (2024-12-26) **核心功能** diff --git a/demo/lib/iflow-engine.es.js b/demo/lib/iflow-engine.es.js index 52ad901..8ec6414 100644 --- a/demo/lib/iflow-engine.es.js +++ b/demo/lib/iflow-engine.es.js @@ -226,28 +226,14 @@ const Mg = { advanced: "效果模式" }, edgeLine: "边线", - ground: "显示地面", - groundSize: "大小", - groundTypes: { - none: "无", - concrete: "混凝土", - grass: "草地", - tile: "瓷砖", - water: "水面", - wood: "木地板" - }, contrast: "对比度", saturation: "饱和度", lightIntensity: "光照强度", environment: "环境背景", - environments: { - default: "默认", - outdoor: "室外", - indoor: "室内", - night: "夜晚", - overcast: "阴天", - studio: "工作室" - } + backgroundVisible: "显示背景", + ground: "显示地面", + groundElevation: "地面高度", + groundElevationUnit: "m" } }, wg = { common: { @@ -476,28 +462,14 @@ const Mg = { advanced: "Quality" }, edgeLine: "Edge Lines", - ground: "Ground", - groundSize: "Size", - groundTypes: { - none: "None", - concrete: "Concrete", - grass: "Grass", - tile: "Tile", - water: "Water", - wood: "Wood" - }, contrast: "Contrast", saturation: "Saturation", lightIntensity: "Light Intensity", environment: "Environment", - environments: { - default: "Default", - outdoor: "Outdoor", - indoor: "Indoor", - night: "Night", - overcast: "Overcast", - studio: "Studio" - } + backgroundVisible: "Show Background", + ground: "Ground", + groundElevation: "Ground Elevation", + groundElevationUnit: "m" } }; class Sg { @@ -547,7 +519,7 @@ class Sg { this.listeners.forEach((e) => e(this.currentLocale)); } } -const tn = new Sg(), xe = (s) => tn.t(s), Cd = { +const tn = new Sg(), xe = (s) => tn.t(s), Td = { name: "light", primary: "#2563eb", primaryHover: "#1d4ed8", @@ -734,8 +706,8 @@ const tn = new Sg(), xe = (s) => tn.t(s), Cd = { } } }; -class Tg { - currentTheme = Cd; +class Cg { + currentTheme = Td; listeners = []; constructor() { } @@ -750,7 +722,7 @@ class Tg { * @param themeName 'dark' | 'light' */ setTheme(e) { - e === "light" ? this.applyTheme(Cd) : this.applyTheme(Eg); + e === "light" ? this.applyTheme(Td) : this.applyTheme(Eg); } /** * 应用自定义主题配置 @@ -777,7 +749,7 @@ class Tg { this.listeners.forEach((e) => e(this.currentTheme)); } } -const lt = new Tg(); +const lt = new Cg(); class ku { container; options; @@ -1153,10 +1125,10 @@ class ku { this.unsubscribeLocale && (this.unsubscribeLocale(), this.unsubscribeLocale = null), this.unsubscribeTheme && (this.unsubscribeTheme(), this.unsubscribeTheme = null), this.closeDropdown(), this.container.innerHTML = "", this.btnRefs.clear(); } } -class Cg extends ku { +class Tg extends ku { async init() { await super.init(); - const e = this.options.registry, { createHomeButton: t } = await Promise.resolve().then(() => kC), { createZoomBoxButton: n } = await Promise.resolve().then(() => OC), { createWalkMenuButton: i } = await Promise.resolve().then(() => FC), { createMapButton: r } = await Promise.resolve().then(() => VC), { createPropertyButton: a } = await Promise.resolve().then(() => WC), { createSettingButton: o } = await Promise.resolve().then(() => jC), { createInfoButton: l } = await Promise.resolve().then(() => ZC), { createFullscreenButton: c } = await Promise.resolve().then(() => $C), { createMeasureButton: h } = await Promise.resolve().then(() => JC), { createSectionMenuButton: u } = await Promise.resolve().then(() => e4), { createSectionPlaneButton: p } = await Promise.resolve().then(() => n4), { createSectionAxisButton: d } = await Promise.resolve().then(() => s4), { createSectionBoxButton: m } = await Promise.resolve().then(() => a4), { createAiChatButton: f } = await Promise.resolve().then(() => l4); + const e = this.options.registry, { createHomeButton: t } = await Promise.resolve().then(() => kT), { createZoomBoxButton: n } = await Promise.resolve().then(() => OT), { createWalkMenuButton: i } = await Promise.resolve().then(() => FT), { createMapButton: r } = await Promise.resolve().then(() => VT), { createPropertyButton: a } = await Promise.resolve().then(() => WT), { createSettingButton: o } = await Promise.resolve().then(() => jT), { createInfoButton: l } = await Promise.resolve().then(() => ZT), { createFullscreenButton: c } = await Promise.resolve().then(() => $T), { createMeasureButton: h } = await Promise.resolve().then(() => JT), { createSectionMenuButton: u } = await Promise.resolve().then(() => e4), { createSectionPlaneButton: p } = await Promise.resolve().then(() => n4), { createSectionAxisButton: d } = await Promise.resolve().then(() => s4), { createSectionBoxButton: m } = await Promise.resolve().then(() => a4), { createAiChatButton: f } = await Promise.resolve().then(() => l4); this.addGroup("group-1"), this.addButton(t(e)), this.addButton(n(e)), this.addButton(h(e)), this.addButton(u(e)), this.addButton(p(e)), this.addButton(d(e)), this.addButton(m(e)), this.addButton(i(e)), this.addButton(r(e)), this.addButton(a(e)), this.addGroup("group-2"), this.addButton(f(e)), this.addButton(o(e)), this.addButton(l(e)), this.addButton(c(e)), this.render(); } } @@ -1168,6 +1140,14 @@ class Ui { constructor(e) { this.registry = e; } + /** + * 获取 Engine 组件实例的便捷访问器 + * 内部管理器通过此 getter 直接访问 Engine 组件的全部能力 + * 替代原来的 this.registry.engine3d?.xxx() 透传链 + */ + get engineComponent() { + return this.registry.engine3d?.getEngineComponent?.() ?? null; + } /** * 订阅事件(自动追踪,destroy 时自动取消) * @param event 事件名称 @@ -1205,7 +1185,7 @@ class Ag extends Ui { } /** 初始化工具栏 */ init() { - this.toolbarContainer = document.createElement("div"), this.toolbarContainer.id = "opt-btn-groups", this.toolbarContainer.className = "bim-engine-opt-btn-container is-bottom-toolbar", this.container.appendChild(this.toolbarContainer), this.toolbar = new Cg({ + this.toolbarContainer = document.createElement("div"), this.toolbarContainer.id = "opt-btn-groups", this.toolbarContainer.className = "bim-engine-opt-btn-container is-bottom-toolbar", this.container.appendChild(this.toolbarContainer), this.toolbar = new Tg({ container: this.toolbarContainer, type: "glass-pill", showLabel: !0, @@ -1543,8 +1523,8 @@ class Rg { d.preventDefault(), d.stopPropagation(), !this.rafId && (this.rafId = requestAnimationFrame(() => { const m = d.clientX - e, f = d.clientY - t; let x = n + m, g = i + f; - const y = r - o, v = a - l - c; - x = Math.max(0, Math.min(x, y)), g = Math.max(0, Math.min(g, v)), this.element.style.left = `${x}px`, this.element.style.top = `${g}px`, this.rafId = null; + const b = r - o, v = a - l - c; + x = Math.max(0, Math.min(x, b)), g = Math.max(0, Math.min(g, v)), this.element.style.left = `${x}px`, this.element.style.top = `${g}px`, this.rafId = null; })); }, p = () => { this.rafId && (cancelAnimationFrame(this.rafId), this.rafId = null), document.removeEventListener("mousemove", u, { capture: !0 }), document.removeEventListener("mouseup", p, { capture: !0 }); @@ -1615,7 +1595,7 @@ class Lg extends Ui { this.activeDialogs.forEach((e) => e.destroy()), this.activeDialogs = [], super.destroy(); } } -const Fa = "181", Tr = { ROTATE: 0, DOLLY: 1, PAN: 2 }, wr = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }, Dg = 0, Ad = 1, Ig = 2, bm = 1, _m = 2, Ci = 3, jn = 0, cn = 1, Mt = 2, St = 0, Cr = 1, _h = 2, Pd = 3, Rd = 4, Uu = 5, Rn = 100, Ng = 101, Bg = 102, kg = 103, Ug = 104, Ps = 200, Og = 201, zg = 202, Fg = 203, Mh = 204, wh = 205, wl = 206, Hg = 207, Sl = 208, Vg = 209, Gg = 210, Wg = 211, Xg = 212, jg = 213, qg = 214, Sh = 0, Eh = 1, Th = 2, Lr = 3, Ch = 4, Ah = 5, Ph = 6, Rh = 7, Ou = 0, Zg = 1, Yg = 2, is = 0, Mm = 1, wm = 2, Sm = 3, Em = 4, Tm = 5, Cm = 6, Am = 7, Ld = "attached", $g = "detached", Pm = 300, Dr = 301, Ir = 302, El = 303, Lh = 304, zl = 306, In = 1e3, Vn = 1001, Tl = 1002, jt = 1003, Rm = 1004, xa = 1005, Bt = 1006, cl = 1007, hi = 1008, ii = 1009, Lm = 1010, Dm = 1011, Pa = 1012, zu = 1013, Ns = 1014, fn = 1015, mn = 1016, Fu = 1017, Hu = 1018, Bs = 1020, Im = 35902, Nm = 35899, Bm = 1021, km = 1022, Mn = 1023, Ra = 1026, ks = 1027, Fl = 1028, Vu = 1029, Gu = 1030, Wu = 1031, Xu = 1033, hl = 33776, ul = 33777, dl = 33778, pl = 33779, Dh = 35840, Ih = 35841, Nh = 35842, Bh = 35843, kh = 36196, Uh = 37492, Oh = 37496, zh = 37808, Fh = 37809, Hh = 37810, Vh = 37811, Gh = 37812, Wh = 37813, Xh = 37814, jh = 37815, qh = 37816, Zh = 37817, Yh = 37818, $h = 37819, Kh = 37820, Jh = 37821, Qh = 36492, eu = 36494, tu = 36495, nu = 36283, iu = 36284, su = 36285, ru = 36286, La = 2300, Da = 2301, tc = 2302, Dd = 2400, Id = 2401, Nd = 2402, Kg = 2500, Jg = 0, Um = 1, au = 2, Qg = 3200, ex = 3201, Hl = 0, tx = 1, Ji = "", Dt = "srgb", nn = "srgb-linear", Cl = "linear", ct = "srgb", qs = 7680, Bd = 519, nx = 512, ix = 513, sx = 514, Om = 515, rx = 516, ax = 517, ox = 518, lx = 519, ou = 35044, kd = "300 es", ui = 2e3, Al = 2001; +const Fa = "181", Cr = { ROTATE: 0, DOLLY: 1, PAN: 2 }, wr = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }, Dg = 0, Ad = 1, Ig = 2, ym = 1, _m = 2, Ti = 3, jn = 0, cn = 1, Mt = 2, St = 0, Tr = 1, _h = 2, Pd = 3, Rd = 4, Uu = 5, Rn = 100, Ng = 101, Bg = 102, kg = 103, Ug = 104, Ps = 200, Og = 201, zg = 202, Fg = 203, Mh = 204, wh = 205, wl = 206, Hg = 207, Sl = 208, Vg = 209, Gg = 210, Wg = 211, Xg = 212, jg = 213, qg = 214, Sh = 0, Eh = 1, Ch = 2, Lr = 3, Th = 4, Ah = 5, Ph = 6, Rh = 7, Ou = 0, Zg = 1, Yg = 2, is = 0, Mm = 1, wm = 2, Sm = 3, Em = 4, Cm = 5, Tm = 6, Am = 7, Ld = "attached", $g = "detached", Pm = 300, Dr = 301, Ir = 302, El = 303, Lh = 304, zl = 306, In = 1e3, Vn = 1001, Cl = 1002, jt = 1003, Rm = 1004, xa = 1005, Bt = 1006, cl = 1007, hi = 1008, ii = 1009, Lm = 1010, Dm = 1011, Pa = 1012, zu = 1013, Ns = 1014, fn = 1015, mn = 1016, Fu = 1017, Hu = 1018, Bs = 1020, Im = 35902, Nm = 35899, Bm = 1021, km = 1022, Mn = 1023, Ra = 1026, ks = 1027, Fl = 1028, Vu = 1029, Gu = 1030, Wu = 1031, Xu = 1033, hl = 33776, ul = 33777, dl = 33778, pl = 33779, Dh = 35840, Ih = 35841, Nh = 35842, Bh = 35843, kh = 36196, Uh = 37492, Oh = 37496, zh = 37808, Fh = 37809, Hh = 37810, Vh = 37811, Gh = 37812, Wh = 37813, Xh = 37814, jh = 37815, qh = 37816, Zh = 37817, Yh = 37818, $h = 37819, Kh = 37820, Jh = 37821, Qh = 36492, eu = 36494, tu = 36495, nu = 36283, iu = 36284, su = 36285, ru = 36286, La = 2300, Da = 2301, tc = 2302, Dd = 2400, Id = 2401, Nd = 2402, Kg = 2500, Jg = 0, Um = 1, au = 2, Qg = 3200, ex = 3201, Hl = 0, tx = 1, Ji = "", Dt = "srgb", nn = "srgb-linear", Tl = "linear", ct = "srgb", qs = 7680, Bd = 519, nx = 512, ix = 513, sx = 514, Om = 515, rx = 516, ax = 517, ox = 518, lx = 519, ou = 35044, kd = "300 es", ui = 2e3, Al = 2001; function zm(s) { for (let e = s.length - 1; e >= 0; --e) if (s[e] >= 65535) return !0; @@ -1758,10 +1738,10 @@ function xx(s, e) { function vx(s, e) { return s + Math.random() * (e - s); } -function yx(s) { +function bx(s) { return s * (0.5 - Math.random()); } -function bx(s) { +function yx(s) { s !== void 0 && (Od = s); let e = Od += 1831565813; return e = Math.imul(e ^ e >>> 15, e | 1), e ^= e + Math.imul(e ^ e >>> 7, e | 61), ((e ^ e >>> 14) >>> 0) / 4294967296; @@ -1781,7 +1761,7 @@ function Sx(s) { function Ex(s) { return Math.pow(2, Math.floor(Math.log(s) / Math.LN2)); } -function Tx(s, e, t, n, i) { +function Cx(s, e, t, n, i) { const r = Math.cos, a = Math.sin, o = r(t / 2), l = a(t / 2), c = r((e + n) / 2), h = a((e + n) / 2), u = r((e - n) / 2), p = a((e - n) / 2), d = r((n - e) / 2), m = a((n - e) / 2); switch (i) { case "XYX": @@ -1998,7 +1978,7 @@ const Ht = { * @param {number} range - Defines the value range. * @return {number} A random float. */ - randFloatSpread: yx, + randFloatSpread: bx, /** * Returns a deterministic pseudo-random float in the interval `[0, 1]`. * @@ -2007,7 +1987,7 @@ const Ht = { * @param {number} [s] - The integer seed. * @return {number} A random float. */ - seededRandom: bx, + seededRandom: yx, /** * Converts degrees to radians. * @@ -2068,7 +2048,7 @@ const Ht = { * @param {number} c - The rotation applied to the third axis, in radians. * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order. */ - setQuaternionFromProperEuler: Tx, + setQuaternionFromProperEuler: Cx, /** * Normalizes the given value according to the given typed array. * @@ -2669,12 +2649,12 @@ class qn { x < 0 && (p = -p, d = -d, m = -m, f = -f, x = -x); let g = 1 - o; if (x < 0.9995) { - const y = Math.acos(x), v = Math.sin(y); - g = Math.sin(g * y) / v, o = Math.sin(o * y) / v, l = l * g + p * o, c = c * g + d * o, h = h * g + m * o, u = u * g + f * o; + const b = Math.acos(x), v = Math.sin(b); + g = Math.sin(g * b) / v, o = Math.sin(o * b) / v, l = l * g + p * o, c = c * g + d * o, h = h * g + m * o, u = u * g + f * o; } else { l = l * g + p * o, c = c * g + d * o, h = h * g + m * o, u = u * g + f * o; - const y = 1 / Math.sqrt(l * l + c * c + h * h + u * u); - l *= y, c *= y, h *= y, u *= y; + const b = 1 / Math.sqrt(l * l + c * c + h * h + u * u); + l *= b, c *= b, h *= b, u *= b; } } e[t] = l, e[t + 1] = c, e[t + 2] = h, e[t + 3] = u; @@ -3970,8 +3950,8 @@ class Ke { * @return {Matrix3} A reference to this matrix. */ multiplyMatrices(e, t) { - const n = e.elements, i = t.elements, r = this.elements, a = n[0], o = n[3], l = n[6], c = n[1], h = n[4], u = n[7], p = n[2], d = n[5], m = n[8], f = i[0], x = i[3], g = i[6], y = i[1], v = i[4], b = i[7], _ = i[2], M = i[5], T = i[8]; - return r[0] = a * f + o * y + l * _, r[3] = a * x + o * v + l * M, r[6] = a * g + o * b + l * T, r[1] = c * f + h * y + u * _, r[4] = c * x + h * v + u * M, r[7] = c * g + h * b + u * T, r[2] = p * f + d * y + m * _, r[5] = p * x + d * v + m * M, r[8] = p * g + d * b + m * T, this; + const n = e.elements, i = t.elements, r = this.elements, a = n[0], o = n[3], l = n[6], c = n[1], h = n[4], u = n[7], p = n[2], d = n[5], m = n[8], f = i[0], x = i[3], g = i[6], b = i[1], v = i[4], y = i[7], _ = i[2], M = i[5], C = i[8]; + return r[0] = a * f + o * b + l * _, r[3] = a * x + o * v + l * M, r[6] = a * g + o * y + l * C, r[1] = c * f + h * b + u * _, r[4] = c * x + h * v + u * M, r[7] = c * g + h * y + u * C, r[2] = p * f + d * b + m * _, r[5] = p * x + d * v + m * M, r[8] = p * g + d * y + m * C, this; } /** * Multiplies every component of the matrix by the given scalar. @@ -4227,7 +4207,7 @@ const ic = /* @__PURE__ */ new Ke(), Fd = /* @__PURE__ */ new Ke().set( -0.203977, 1.0569715 ); -function Cx() { +function Tx() { const s = { enabled: !0, workingColorSpace: nn, @@ -4263,7 +4243,7 @@ function Cx() { return this.spaces[i].primaries; }, getTransfer: function(i) { - return i === Ji ? Cl : this.spaces[i].transfer; + return i === Ji ? Tl : this.spaces[i].transfer; }, getToneMappingMode: function(i) { return this.spaces[i].outputColorSpaceConfig.toneMappingMode || "standard"; @@ -4296,7 +4276,7 @@ function Cx() { [nn]: { primaries: e, whitePoint: n, - transfer: Cl, + transfer: Tl, toXYZ: Fd, fromXYZ: Hd, luminanceCoefficients: t, @@ -4314,7 +4294,7 @@ function Cx() { } }), s; } -const st = /* @__PURE__ */ Cx(); +const st = /* @__PURE__ */ Tx(); function Ni(s) { return s < 0.04045 ? s * 0.0773993808 : Math.pow(s * 0.9478672986 + 0.0521327014, 2.4); } @@ -4613,7 +4593,7 @@ class Wt extends zs { case Vn: e.x = e.x < 0 ? 0 : 1; break; - case Tl: + case Cl: Math.abs(Math.floor(e.x) % 2) === 1 ? e.x = Math.ceil(e.x) - e.x : e.x = e.x - Math.floor(e.x); break; } @@ -4625,7 +4605,7 @@ class Wt extends zs { case Vn: e.y = e.y < 0 ? 0 : 1; break; - case Tl: + case Cl: Math.abs(Math.floor(e.y) % 2) === 1 ? e.y = Math.ceil(e.y) - e.y : e.y = e.y - Math.floor(e.y); break; } @@ -4952,11 +4932,11 @@ class tt { if (Math.abs(h + p) < 0.1 && Math.abs(u + f) < 0.1 && Math.abs(m + x) < 0.1 && Math.abs(c + d + g - 3) < 0.1) return this.set(1, 0, 0, 0), this; t = Math.PI; - const v = (c + 1) / 2, b = (d + 1) / 2, _ = (g + 1) / 2, M = (h + p) / 4, T = (u + f) / 4, R = (m + x) / 4; - return v > b && v > _ ? v < 0.01 ? (n = 0, i = 0.707106781, r = 0.707106781) : (n = Math.sqrt(v), i = M / n, r = T / n) : b > _ ? b < 0.01 ? (n = 0.707106781, i = 0, r = 0.707106781) : (i = Math.sqrt(b), n = M / i, r = R / i) : _ < 0.01 ? (n = 0.707106781, i = 0.707106781, r = 0) : (r = Math.sqrt(_), n = T / r, i = R / r), this.set(n, i, r, t), this; + const v = (c + 1) / 2, y = (d + 1) / 2, _ = (g + 1) / 2, M = (h + p) / 4, C = (u + f) / 4, R = (m + x) / 4; + return v > y && v > _ ? v < 0.01 ? (n = 0, i = 0.707106781, r = 0.707106781) : (n = Math.sqrt(v), i = M / n, r = C / n) : y > _ ? y < 0.01 ? (n = 0.707106781, i = 0, r = 0.707106781) : (i = Math.sqrt(y), n = M / i, r = R / i) : _ < 0.01 ? (n = 0.707106781, i = 0.707106781, r = 0) : (r = Math.sqrt(_), n = C / r, i = R / r), this.set(n, i, r, t), this; } - let y = Math.sqrt((x - m) * (x - m) + (u - f) * (u - f) + (p - h) * (p - h)); - return Math.abs(y) < 1e-3 && (y = 1), this.x = (x - m) / y, this.y = (u - f) / y, this.z = (p - h) / y, this.w = Math.acos((c + d + g - 1) / 2), this; + let b = Math.sqrt((x - m) * (x - m) + (u - f) * (u - f) + (p - h) * (p - h)); + return Math.abs(b) < 1e-3 && (b = 1), this.x = (x - m) / b, this.y = (u - f) / b, this.z = (p - h) / b, this.w = Math.acos((c + d + g - 1) / 2), this; } /** * Sets the vector components to the position elements of the @@ -6554,7 +6534,7 @@ class De { */ lookAt(e, t, n) { const i = this.elements; - return Cn.subVectors(e, t), Cn.lengthSq() === 0 && (Cn.z = 1), Cn.normalize(), Gi.crossVectors(n, Cn), Gi.lengthSq() === 0 && (Math.abs(n.z) === 1 ? Cn.x += 1e-4 : Cn.z += 1e-4, Cn.normalize(), Gi.crossVectors(n, Cn)), Gi.normalize(), Qa.crossVectors(Cn, Gi), i[0] = Gi.x, i[4] = Qa.x, i[8] = Cn.x, i[1] = Gi.y, i[5] = Qa.y, i[9] = Cn.y, i[2] = Gi.z, i[6] = Qa.z, i[10] = Cn.z, this; + return Tn.subVectors(e, t), Tn.lengthSq() === 0 && (Tn.z = 1), Tn.normalize(), Gi.crossVectors(n, Tn), Gi.lengthSq() === 0 && (Math.abs(n.z) === 1 ? Tn.x += 1e-4 : Tn.z += 1e-4, Tn.normalize(), Gi.crossVectors(n, Tn)), Gi.normalize(), Qa.crossVectors(Tn, Gi), i[0] = Gi.x, i[4] = Qa.x, i[8] = Tn.x, i[1] = Gi.y, i[5] = Qa.y, i[9] = Tn.y, i[2] = Gi.z, i[6] = Qa.z, i[10] = Tn.z, this; } /** * Post-multiplies this matrix by the given 4x4 matrix. @@ -6583,8 +6563,8 @@ class De { * @return {Matrix4} A reference to this matrix. */ multiplyMatrices(e, t) { - const n = e.elements, i = t.elements, r = this.elements, a = n[0], o = n[4], l = n[8], c = n[12], h = n[1], u = n[5], p = n[9], d = n[13], m = n[2], f = n[6], x = n[10], g = n[14], y = n[3], v = n[7], b = n[11], _ = n[15], M = i[0], T = i[4], R = i[8], S = i[12], E = i[1], L = i[5], A = i[9], I = i[13], w = i[2], z = i[6], G = i[10], j = i[14], Y = i[3], q = i[7], ie = i[11], W = i[15]; - return r[0] = a * M + o * E + l * w + c * Y, r[4] = a * T + o * L + l * z + c * q, r[8] = a * R + o * A + l * G + c * ie, r[12] = a * S + o * I + l * j + c * W, r[1] = h * M + u * E + p * w + d * Y, r[5] = h * T + u * L + p * z + d * q, r[9] = h * R + u * A + p * G + d * ie, r[13] = h * S + u * I + p * j + d * W, r[2] = m * M + f * E + x * w + g * Y, r[6] = m * T + f * L + x * z + g * q, r[10] = m * R + f * A + x * G + g * ie, r[14] = m * S + f * I + x * j + g * W, r[3] = y * M + v * E + b * w + _ * Y, r[7] = y * T + v * L + b * z + _ * q, r[11] = y * R + v * A + b * G + _ * ie, r[15] = y * S + v * I + b * j + _ * W, this; + const n = e.elements, i = t.elements, r = this.elements, a = n[0], o = n[4], l = n[8], c = n[12], h = n[1], u = n[5], p = n[9], d = n[13], m = n[2], f = n[6], x = n[10], g = n[14], b = n[3], v = n[7], y = n[11], _ = n[15], M = i[0], C = i[4], R = i[8], S = i[12], E = i[1], L = i[5], A = i[9], I = i[13], w = i[2], z = i[6], G = i[10], j = i[14], Y = i[3], q = i[7], ie = i[11], W = i[15]; + return r[0] = a * M + o * E + l * w + c * Y, r[4] = a * C + o * L + l * z + c * q, r[8] = a * R + o * A + l * G + c * ie, r[12] = a * S + o * I + l * j + c * W, r[1] = h * M + u * E + p * w + d * Y, r[5] = h * C + u * L + p * z + d * q, r[9] = h * R + u * A + p * G + d * ie, r[13] = h * S + u * I + p * j + d * W, r[2] = m * M + f * E + x * w + g * Y, r[6] = m * C + f * L + x * z + g * q, r[10] = m * R + f * A + x * G + g * ie, r[14] = m * S + f * I + x * j + g * W, r[3] = b * M + v * E + y * w + _ * Y, r[7] = b * C + v * L + y * z + _ * q, r[11] = b * R + v * A + y * G + _ * ie, r[15] = b * S + v * I + y * j + _ * W, this; } /** * Multiplies every component of the matrix by the given scalar. @@ -6638,10 +6618,10 @@ class De { * @return {Matrix4} A reference to this matrix. */ invert() { - const e = this.elements, t = e[0], n = e[1], i = e[2], r = e[3], a = e[4], o = e[5], l = e[6], c = e[7], h = e[8], u = e[9], p = e[10], d = e[11], m = e[12], f = e[13], x = e[14], g = e[15], y = u * x * c - f * p * c + f * l * d - o * x * d - u * l * g + o * p * g, v = m * p * c - h * x * c - m * l * d + a * x * d + h * l * g - a * p * g, b = h * f * c - m * u * c + m * o * d - a * f * d - h * o * g + a * u * g, _ = m * u * l - h * f * l - m * o * p + a * f * p + h * o * x - a * u * x, M = t * y + n * v + i * b + r * _; + const e = this.elements, t = e[0], n = e[1], i = e[2], r = e[3], a = e[4], o = e[5], l = e[6], c = e[7], h = e[8], u = e[9], p = e[10], d = e[11], m = e[12], f = e[13], x = e[14], g = e[15], b = u * x * c - f * p * c + f * l * d - o * x * d - u * l * g + o * p * g, v = m * p * c - h * x * c - m * l * d + a * x * d + h * l * g - a * p * g, y = h * f * c - m * u * c + m * o * d - a * f * d - h * o * g + a * u * g, _ = m * u * l - h * f * l - m * o * p + a * f * p + h * o * x - a * u * x, M = t * b + n * v + i * y + r * _; if (M === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - const T = 1 / M; - return e[0] = y * T, e[1] = (f * p * r - u * x * r - f * i * d + n * x * d + u * i * g - n * p * g) * T, e[2] = (o * x * r - f * l * r + f * i * c - n * x * c - o * i * g + n * l * g) * T, e[3] = (u * l * r - o * p * r - u * i * c + n * p * c + o * i * d - n * l * d) * T, e[4] = v * T, e[5] = (h * x * r - m * p * r + m * i * d - t * x * d - h * i * g + t * p * g) * T, e[6] = (m * l * r - a * x * r - m * i * c + t * x * c + a * i * g - t * l * g) * T, e[7] = (a * p * r - h * l * r + h * i * c - t * p * c - a * i * d + t * l * d) * T, e[8] = b * T, e[9] = (m * u * r - h * f * r - m * n * d + t * f * d + h * n * g - t * u * g) * T, e[10] = (a * f * r - m * o * r + m * n * c - t * f * c - a * n * g + t * o * g) * T, e[11] = (h * o * r - a * u * r - h * n * c + t * u * c + a * n * d - t * o * d) * T, e[12] = _ * T, e[13] = (h * f * i - m * u * i + m * n * p - t * f * p - h * n * x + t * u * x) * T, e[14] = (m * o * i - a * f * i - m * n * l + t * f * l + a * n * x - t * o * x) * T, e[15] = (a * u * i - h * o * i + h * n * l - t * u * l - a * n * p + t * o * p) * T, this; + const C = 1 / M; + return e[0] = b * C, e[1] = (f * p * r - u * x * r - f * i * d + n * x * d + u * i * g - n * p * g) * C, e[2] = (o * x * r - f * l * r + f * i * c - n * x * c - o * i * g + n * l * g) * C, e[3] = (u * l * r - o * p * r - u * i * c + n * p * c + o * i * d - n * l * d) * C, e[4] = v * C, e[5] = (h * x * r - m * p * r + m * i * d - t * x * d - h * i * g + t * p * g) * C, e[6] = (m * l * r - a * x * r - m * i * c + t * x * c + a * i * g - t * l * g) * C, e[7] = (a * p * r - h * l * r + h * i * c - t * p * c - a * i * d + t * l * d) * C, e[8] = y * C, e[9] = (m * u * r - h * f * r - m * n * d + t * f * d + h * n * g - t * u * g) * C, e[10] = (a * f * r - m * o * r + m * n * c - t * f * c - a * n * g + t * o * g) * C, e[11] = (h * o * r - a * u * r - h * n * c + t * u * c + a * n * d - t * o * d) * C, e[12] = _ * C, e[13] = (h * f * i - m * u * i + m * n * p - t * f * p - h * n * x + t * u * x) * C, e[14] = (m * o * i - a * f * i - m * n * l + t * f * l + a * n * x - t * o * x) * C, e[15] = (a * u * i - h * o * i + h * n * l - t * u * l - a * n * p + t * o * p) * C, this; } /** * Multiplies the columns of this matrix by the given vector. @@ -6892,8 +6872,8 @@ class De { * @return {Matrix4} A reference to this matrix. */ compose(e, t, n) { - const i = this.elements, r = t._x, a = t._y, o = t._z, l = t._w, c = r + r, h = a + a, u = o + o, p = r * c, d = r * h, m = r * u, f = a * h, x = a * u, g = o * u, y = l * c, v = l * h, b = l * u, _ = n.x, M = n.y, T = n.z; - return i[0] = (1 - (f + g)) * _, i[1] = (d + b) * _, i[2] = (m - v) * _, i[3] = 0, i[4] = (d - b) * M, i[5] = (1 - (p + g)) * M, i[6] = (x + y) * M, i[7] = 0, i[8] = (m + v) * T, i[9] = (x - y) * T, i[10] = (1 - (p + f)) * T, i[11] = 0, i[12] = e.x, i[13] = e.y, i[14] = e.z, i[15] = 1, this; + const i = this.elements, r = t._x, a = t._y, o = t._z, l = t._w, c = r + r, h = a + a, u = o + o, p = r * c, d = r * h, m = r * u, f = a * h, x = a * u, g = o * u, b = l * c, v = l * h, y = l * u, _ = n.x, M = n.y, C = n.z; + return i[0] = (1 - (f + g)) * _, i[1] = (d + y) * _, i[2] = (m - v) * _, i[3] = 0, i[4] = (d - y) * M, i[5] = (1 - (p + g)) * M, i[6] = (x + b) * M, i[7] = 0, i[8] = (m + v) * C, i[9] = (x - b) * C, i[10] = (1 - (p + f)) * C, i[11] = 0, i[12] = e.x, i[13] = e.y, i[14] = e.z, i[15] = 1, this; } /** * Decomposes this matrix into its position, rotation and scale components @@ -7007,7 +6987,7 @@ class De { return e[t] = n[0], e[t + 1] = n[1], e[t + 2] = n[2], e[t + 3] = n[3], e[t + 4] = n[4], e[t + 5] = n[5], e[t + 6] = n[6], e[t + 7] = n[7], e[t + 8] = n[8], e[t + 9] = n[9], e[t + 10] = n[10], e[t + 11] = n[11], e[t + 12] = n[12], e[t + 13] = n[13], e[t + 14] = n[14], e[t + 15] = n[15], e; } } -const Js = /* @__PURE__ */ new P(), Jn = /* @__PURE__ */ new De(), Nx = /* @__PURE__ */ new P(0, 0, 0), Bx = /* @__PURE__ */ new P(1, 1, 1), Gi = /* @__PURE__ */ new P(), Qa = /* @__PURE__ */ new P(), Cn = /* @__PURE__ */ new P(), Vd = /* @__PURE__ */ new De(), Gd = /* @__PURE__ */ new qn(); +const Js = /* @__PURE__ */ new P(), Jn = /* @__PURE__ */ new De(), Nx = /* @__PURE__ */ new P(0, 0, 0), Bx = /* @__PURE__ */ new P(1, 1, 1), Gi = /* @__PURE__ */ new P(), Qa = /* @__PURE__ */ new P(), Tn = /* @__PURE__ */ new P(), Vd = /* @__PURE__ */ new De(), Gd = /* @__PURE__ */ new qn(); class Bn { /** * Constructs a new euler instance. @@ -7279,7 +7259,7 @@ class Zu { } } let kx = 0; -const Wd = /* @__PURE__ */ new P(), Qs = /* @__PURE__ */ new qn(), yi = /* @__PURE__ */ new De(), eo = /* @__PURE__ */ new P(), $r = /* @__PURE__ */ new P(), Ux = /* @__PURE__ */ new P(), Ox = /* @__PURE__ */ new qn(), Xd = /* @__PURE__ */ new P(1, 0, 0), jd = /* @__PURE__ */ new P(0, 1, 0), qd = /* @__PURE__ */ new P(0, 0, 1), Zd = { type: "added" }, zx = { type: "removed" }, er = { type: "childadded", child: null }, uc = { type: "childremoved", child: null }; +const Wd = /* @__PURE__ */ new P(), Qs = /* @__PURE__ */ new qn(), bi = /* @__PURE__ */ new De(), eo = /* @__PURE__ */ new P(), $r = /* @__PURE__ */ new P(), Ux = /* @__PURE__ */ new P(), Ox = /* @__PURE__ */ new qn(), Xd = /* @__PURE__ */ new P(1, 0, 0), jd = /* @__PURE__ */ new P(0, 1, 0), qd = /* @__PURE__ */ new P(0, 0, 1), Zd = { type: "added" }, zx = { type: "removed" }, er = { type: "childadded", child: null }, uc = { type: "childremoved", child: null }; class Et extends zs { /** * Constructs a new 3D object. @@ -7563,7 +7543,7 @@ class Et extends zs { * @return {Vector3} The converted vector. */ worldToLocal(e) { - return this.updateWorldMatrix(!0, !1), e.applyMatrix4(yi.copy(this.matrixWorld).invert()); + return this.updateWorldMatrix(!0, !1), e.applyMatrix4(bi.copy(this.matrixWorld).invert()); } /** * Rotates the object to face a point in world space. @@ -7577,7 +7557,7 @@ class Et extends zs { lookAt(e, t, n) { e.isVector3 ? eo.copy(e) : eo.set(e, t, n); const i = this.parent; - this.updateWorldMatrix(!0, !1), $r.setFromMatrixPosition(this.matrixWorld), this.isCamera || this.isLight ? yi.lookAt($r, eo, this.up) : yi.lookAt(eo, $r, this.up), this.quaternion.setFromRotationMatrix(yi), i && (yi.extractRotation(i.matrixWorld), Qs.setFromRotationMatrix(yi), this.quaternion.premultiply(Qs.invert())); + this.updateWorldMatrix(!0, !1), $r.setFromMatrixPosition(this.matrixWorld), this.isCamera || this.isLight ? bi.lookAt($r, eo, this.up) : bi.lookAt(eo, $r, this.up), this.quaternion.setFromRotationMatrix(bi), i && (bi.extractRotation(i.matrixWorld), Qs.setFromRotationMatrix(bi), this.quaternion.premultiply(Qs.invert())); } /** * Adds the given 3D object as a child to this 3D object. An arbitrary number of @@ -7646,7 +7626,7 @@ class Et extends zs { * @return {Object3D} A reference to this instance. */ attach(e) { - return this.updateWorldMatrix(!0, !1), yi.copy(this.matrixWorld).invert(), e.parent !== null && (e.parent.updateWorldMatrix(!0, !1), yi.multiply(e.parent.matrixWorld)), e.applyMatrix4(yi), e.removeFromParent(), e.parent = this, this.children.push(e), e.updateWorldMatrix(!1, !0), e.dispatchEvent(Zd), er.child = e, this.dispatchEvent(er), er.child = null, this; + return this.updateWorldMatrix(!0, !1), bi.copy(this.matrixWorld).invert(), e.parent !== null && (e.parent.updateWorldMatrix(!0, !1), bi.multiply(e.parent.matrixWorld)), e.applyMatrix4(bi), e.removeFromParent(), e.parent = this, this.children.push(e), e.updateWorldMatrix(!1, !0), e.dispatchEvent(Zd), er.child = e, this.dispatchEvent(er), er.child = null, this; } /** * Searches through the 3D object and its children, starting with the 3D object @@ -7937,7 +7917,7 @@ class Et extends zs { Et.DEFAULT_UP = /* @__PURE__ */ new P(0, 1, 0); Et.DEFAULT_MATRIX_AUTO_UPDATE = !0; Et.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = !0; -const Qn = /* @__PURE__ */ new P(), bi = /* @__PURE__ */ new P(), dc = /* @__PURE__ */ new P(), _i = /* @__PURE__ */ new P(), tr = /* @__PURE__ */ new P(), nr = /* @__PURE__ */ new P(), Yd = /* @__PURE__ */ new P(), pc = /* @__PURE__ */ new P(), fc = /* @__PURE__ */ new P(), mc = /* @__PURE__ */ new P(), gc = /* @__PURE__ */ new tt(), xc = /* @__PURE__ */ new tt(), vc = /* @__PURE__ */ new tt(); +const Qn = /* @__PURE__ */ new P(), yi = /* @__PURE__ */ new P(), dc = /* @__PURE__ */ new P(), _i = /* @__PURE__ */ new P(), tr = /* @__PURE__ */ new P(), nr = /* @__PURE__ */ new P(), Yd = /* @__PURE__ */ new P(), pc = /* @__PURE__ */ new P(), fc = /* @__PURE__ */ new P(), mc = /* @__PURE__ */ new P(), gc = /* @__PURE__ */ new tt(), xc = /* @__PURE__ */ new tt(), vc = /* @__PURE__ */ new tt(); class vt { /** * Constructs a new triangle. @@ -7975,8 +7955,8 @@ class vt { * @return {?Vector3} The barycentric coordinates for the given point */ static getBarycoord(e, t, n, i, r) { - Qn.subVectors(i, t), bi.subVectors(n, t), dc.subVectors(e, t); - const a = Qn.dot(Qn), o = Qn.dot(bi), l = Qn.dot(dc), c = bi.dot(bi), h = bi.dot(dc), u = a * c - o * o; + Qn.subVectors(i, t), yi.subVectors(n, t), dc.subVectors(e, t); + const a = Qn.dot(Qn), o = Qn.dot(yi), l = Qn.dot(dc), c = yi.dot(yi), h = yi.dot(dc), u = a * c - o * o; if (u === 0) return r.set(0, 0, 0), null; const p = 1 / u, d = (c * l - o * h) * p, m = (a * h - o * l) * p; @@ -8037,7 +8017,7 @@ class vt { * @return {boolean} Whether the triangle is oriented towards the given direction or not. */ static isFrontFacing(e, t, n, i) { - return Qn.subVectors(n, t), bi.subVectors(e, t), Qn.cross(bi).dot(i) < 0; + return Qn.subVectors(n, t), yi.subVectors(e, t), Qn.cross(yi).dot(i) < 0; } /** * Sets the triangle's vertices by copying the given values. @@ -8097,7 +8077,7 @@ class vt { * @return {number} The triangle's area. */ getArea() { - return Qn.subVectors(this.c, this.b), bi.subVectors(this.a, this.b), Qn.cross(bi).length() * 0.5; + return Qn.subVectors(this.c, this.b), yi.subVectors(this.a, this.b), Qn.cross(yi).length() * 0.5; } /** * Computes the midpoint of the triangle. @@ -8374,7 +8354,7 @@ const Hm = { yellow: 16776960, yellowgreen: 10145074 }, Wi = { h: 0, s: 0, l: 0 }, to = { h: 0, s: 0, l: 0 }; -function yc(s, e, t) { +function bc(s, e, t) { return t < 0 && (t += 1), t > 1 && (t -= 1), t < 1 / 6 ? s + (e - s) * 6 * t : t < 1 / 2 ? e : t < 2 / 3 ? s + (e - s) * 6 * (2 / 3 - t) : s; } class Fe { @@ -8454,7 +8434,7 @@ class Fe { this.r = this.g = this.b = n; else { const r = n <= 0.5 ? n * (1 + t) : n + t - n * t, a = 2 * n - r; - this.r = yc(a, r, e + 1 / 3), this.g = yc(a, r, e), this.b = yc(a, r, e - 1 / 3); + this.r = bc(a, r, e + 1 / 3), this.g = bc(a, r, e), this.b = bc(a, r, e - 1 / 3); } return st.colorSpaceToWorking(this, i), this; } @@ -8853,7 +8833,7 @@ class Dn extends zs { * Constructs a new material. */ constructor() { - super(), this.isMaterial = !0, Object.defineProperty(this, "id", { value: Fx++ }), this.uuid = Xn(), this.name = "", this.type = "Material", this.blending = Cr, this.side = jn, this.vertexColors = !1, this.opacity = 1, this.transparent = !1, this.alphaHash = !1, this.blendSrc = Mh, this.blendDst = wh, this.blendEquation = Rn, this.blendSrcAlpha = null, this.blendDstAlpha = null, this.blendEquationAlpha = null, this.blendColor = new Fe(0, 0, 0), this.blendAlpha = 0, this.depthFunc = Lr, this.depthTest = !0, this.depthWrite = !0, this.stencilWriteMask = 255, this.stencilFunc = Bd, this.stencilRef = 0, this.stencilFuncMask = 255, this.stencilFail = qs, this.stencilZFail = qs, this.stencilZPass = qs, this.stencilWrite = !1, this.clippingPlanes = null, this.clipIntersection = !1, this.clipShadows = !1, this.shadowSide = null, this.colorWrite = !0, this.precision = null, this.polygonOffset = !1, this.polygonOffsetFactor = 0, this.polygonOffsetUnits = 0, this.dithering = !1, this.alphaToCoverage = !1, this.premultipliedAlpha = !1, this.forceSinglePass = !1, this.allowOverride = !0, this.visible = !0, this.toneMapped = !0, this.userData = {}, this.version = 0, this._alphaTest = 0; + super(), this.isMaterial = !0, Object.defineProperty(this, "id", { value: Fx++ }), this.uuid = Xn(), this.name = "", this.type = "Material", this.blending = Tr, this.side = jn, this.vertexColors = !1, this.opacity = 1, this.transparent = !1, this.alphaHash = !1, this.blendSrc = Mh, this.blendDst = wh, this.blendEquation = Rn, this.blendSrcAlpha = null, this.blendDstAlpha = null, this.blendEquationAlpha = null, this.blendColor = new Fe(0, 0, 0), this.blendAlpha = 0, this.depthFunc = Lr, this.depthTest = !0, this.depthWrite = !0, this.stencilWriteMask = 255, this.stencilFunc = Bd, this.stencilRef = 0, this.stencilFuncMask = 255, this.stencilFail = qs, this.stencilZFail = qs, this.stencilZPass = qs, this.stencilWrite = !1, this.clippingPlanes = null, this.clipIntersection = !1, this.clipShadows = !1, this.shadowSide = null, this.colorWrite = !0, this.precision = null, this.polygonOffset = !1, this.polygonOffsetFactor = 0, this.polygonOffsetUnits = 0, this.dithering = !1, this.alphaToCoverage = !1, this.premultipliedAlpha = !1, this.forceSinglePass = !1, this.allowOverride = !0, this.visible = !0, this.toneMapped = !0, this.userData = {}, this.version = 0, this._alphaTest = 0; } /** * Sets the alpha value to be used when running an alpha test. The material @@ -8952,7 +8932,7 @@ class Dn extends zs { generator: "Material.toJSON" } }; - n.uuid = this.uuid, n.type = this.type, this.name !== "" && (n.name = this.name), this.color && this.color.isColor && (n.color = this.color.getHex()), this.roughness !== void 0 && (n.roughness = this.roughness), this.metalness !== void 0 && (n.metalness = this.metalness), this.sheen !== void 0 && (n.sheen = this.sheen), this.sheenColor && this.sheenColor.isColor && (n.sheenColor = this.sheenColor.getHex()), this.sheenRoughness !== void 0 && (n.sheenRoughness = this.sheenRoughness), this.emissive && this.emissive.isColor && (n.emissive = this.emissive.getHex()), this.emissiveIntensity !== void 0 && this.emissiveIntensity !== 1 && (n.emissiveIntensity = this.emissiveIntensity), this.specular && this.specular.isColor && (n.specular = this.specular.getHex()), this.specularIntensity !== void 0 && (n.specularIntensity = this.specularIntensity), this.specularColor && this.specularColor.isColor && (n.specularColor = this.specularColor.getHex()), this.shininess !== void 0 && (n.shininess = this.shininess), this.clearcoat !== void 0 && (n.clearcoat = this.clearcoat), this.clearcoatRoughness !== void 0 && (n.clearcoatRoughness = this.clearcoatRoughness), this.clearcoatMap && this.clearcoatMap.isTexture && (n.clearcoatMap = this.clearcoatMap.toJSON(e).uuid), this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture && (n.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON(e).uuid), this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture && (n.clearcoatNormalMap = this.clearcoatNormalMap.toJSON(e).uuid, n.clearcoatNormalScale = this.clearcoatNormalScale.toArray()), this.sheenColorMap && this.sheenColorMap.isTexture && (n.sheenColorMap = this.sheenColorMap.toJSON(e).uuid), this.sheenRoughnessMap && this.sheenRoughnessMap.isTexture && (n.sheenRoughnessMap = this.sheenRoughnessMap.toJSON(e).uuid), this.dispersion !== void 0 && (n.dispersion = this.dispersion), this.iridescence !== void 0 && (n.iridescence = this.iridescence), this.iridescenceIOR !== void 0 && (n.iridescenceIOR = this.iridescenceIOR), this.iridescenceThicknessRange !== void 0 && (n.iridescenceThicknessRange = this.iridescenceThicknessRange), this.iridescenceMap && this.iridescenceMap.isTexture && (n.iridescenceMap = this.iridescenceMap.toJSON(e).uuid), this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture && (n.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON(e).uuid), this.anisotropy !== void 0 && (n.anisotropy = this.anisotropy), this.anisotropyRotation !== void 0 && (n.anisotropyRotation = this.anisotropyRotation), this.anisotropyMap && this.anisotropyMap.isTexture && (n.anisotropyMap = this.anisotropyMap.toJSON(e).uuid), this.map && this.map.isTexture && (n.map = this.map.toJSON(e).uuid), this.matcap && this.matcap.isTexture && (n.matcap = this.matcap.toJSON(e).uuid), this.alphaMap && this.alphaMap.isTexture && (n.alphaMap = this.alphaMap.toJSON(e).uuid), this.lightMap && this.lightMap.isTexture && (n.lightMap = this.lightMap.toJSON(e).uuid, n.lightMapIntensity = this.lightMapIntensity), this.aoMap && this.aoMap.isTexture && (n.aoMap = this.aoMap.toJSON(e).uuid, n.aoMapIntensity = this.aoMapIntensity), this.bumpMap && this.bumpMap.isTexture && (n.bumpMap = this.bumpMap.toJSON(e).uuid, n.bumpScale = this.bumpScale), this.normalMap && this.normalMap.isTexture && (n.normalMap = this.normalMap.toJSON(e).uuid, n.normalMapType = this.normalMapType, n.normalScale = this.normalScale.toArray()), this.displacementMap && this.displacementMap.isTexture && (n.displacementMap = this.displacementMap.toJSON(e).uuid, n.displacementScale = this.displacementScale, n.displacementBias = this.displacementBias), this.roughnessMap && this.roughnessMap.isTexture && (n.roughnessMap = this.roughnessMap.toJSON(e).uuid), this.metalnessMap && this.metalnessMap.isTexture && (n.metalnessMap = this.metalnessMap.toJSON(e).uuid), this.emissiveMap && this.emissiveMap.isTexture && (n.emissiveMap = this.emissiveMap.toJSON(e).uuid), this.specularMap && this.specularMap.isTexture && (n.specularMap = this.specularMap.toJSON(e).uuid), this.specularIntensityMap && this.specularIntensityMap.isTexture && (n.specularIntensityMap = this.specularIntensityMap.toJSON(e).uuid), this.specularColorMap && this.specularColorMap.isTexture && (n.specularColorMap = this.specularColorMap.toJSON(e).uuid), this.envMap && this.envMap.isTexture && (n.envMap = this.envMap.toJSON(e).uuid, this.combine !== void 0 && (n.combine = this.combine)), this.envMapRotation !== void 0 && (n.envMapRotation = this.envMapRotation.toArray()), this.envMapIntensity !== void 0 && (n.envMapIntensity = this.envMapIntensity), this.reflectivity !== void 0 && (n.reflectivity = this.reflectivity), this.refractionRatio !== void 0 && (n.refractionRatio = this.refractionRatio), this.gradientMap && this.gradientMap.isTexture && (n.gradientMap = this.gradientMap.toJSON(e).uuid), this.transmission !== void 0 && (n.transmission = this.transmission), this.transmissionMap && this.transmissionMap.isTexture && (n.transmissionMap = this.transmissionMap.toJSON(e).uuid), this.thickness !== void 0 && (n.thickness = this.thickness), this.thicknessMap && this.thicknessMap.isTexture && (n.thicknessMap = this.thicknessMap.toJSON(e).uuid), this.attenuationDistance !== void 0 && this.attenuationDistance !== 1 / 0 && (n.attenuationDistance = this.attenuationDistance), this.attenuationColor !== void 0 && (n.attenuationColor = this.attenuationColor.getHex()), this.size !== void 0 && (n.size = this.size), this.shadowSide !== null && (n.shadowSide = this.shadowSide), this.sizeAttenuation !== void 0 && (n.sizeAttenuation = this.sizeAttenuation), this.blending !== Cr && (n.blending = this.blending), this.side !== jn && (n.side = this.side), this.vertexColors === !0 && (n.vertexColors = !0), this.opacity < 1 && (n.opacity = this.opacity), this.transparent === !0 && (n.transparent = !0), this.blendSrc !== Mh && (n.blendSrc = this.blendSrc), this.blendDst !== wh && (n.blendDst = this.blendDst), this.blendEquation !== Rn && (n.blendEquation = this.blendEquation), this.blendSrcAlpha !== null && (n.blendSrcAlpha = this.blendSrcAlpha), this.blendDstAlpha !== null && (n.blendDstAlpha = this.blendDstAlpha), this.blendEquationAlpha !== null && (n.blendEquationAlpha = this.blendEquationAlpha), this.blendColor && this.blendColor.isColor && (n.blendColor = this.blendColor.getHex()), this.blendAlpha !== 0 && (n.blendAlpha = this.blendAlpha), this.depthFunc !== Lr && (n.depthFunc = this.depthFunc), this.depthTest === !1 && (n.depthTest = this.depthTest), this.depthWrite === !1 && (n.depthWrite = this.depthWrite), this.colorWrite === !1 && (n.colorWrite = this.colorWrite), this.stencilWriteMask !== 255 && (n.stencilWriteMask = this.stencilWriteMask), this.stencilFunc !== Bd && (n.stencilFunc = this.stencilFunc), this.stencilRef !== 0 && (n.stencilRef = this.stencilRef), this.stencilFuncMask !== 255 && (n.stencilFuncMask = this.stencilFuncMask), this.stencilFail !== qs && (n.stencilFail = this.stencilFail), this.stencilZFail !== qs && (n.stencilZFail = this.stencilZFail), this.stencilZPass !== qs && (n.stencilZPass = this.stencilZPass), this.stencilWrite === !0 && (n.stencilWrite = this.stencilWrite), this.rotation !== void 0 && this.rotation !== 0 && (n.rotation = this.rotation), this.polygonOffset === !0 && (n.polygonOffset = !0), this.polygonOffsetFactor !== 0 && (n.polygonOffsetFactor = this.polygonOffsetFactor), this.polygonOffsetUnits !== 0 && (n.polygonOffsetUnits = this.polygonOffsetUnits), this.linewidth !== void 0 && this.linewidth !== 1 && (n.linewidth = this.linewidth), this.dashSize !== void 0 && (n.dashSize = this.dashSize), this.gapSize !== void 0 && (n.gapSize = this.gapSize), this.scale !== void 0 && (n.scale = this.scale), this.dithering === !0 && (n.dithering = !0), this.alphaTest > 0 && (n.alphaTest = this.alphaTest), this.alphaHash === !0 && (n.alphaHash = !0), this.alphaToCoverage === !0 && (n.alphaToCoverage = !0), this.premultipliedAlpha === !0 && (n.premultipliedAlpha = !0), this.forceSinglePass === !0 && (n.forceSinglePass = !0), this.wireframe === !0 && (n.wireframe = !0), this.wireframeLinewidth > 1 && (n.wireframeLinewidth = this.wireframeLinewidth), this.wireframeLinecap !== "round" && (n.wireframeLinecap = this.wireframeLinecap), this.wireframeLinejoin !== "round" && (n.wireframeLinejoin = this.wireframeLinejoin), this.flatShading === !0 && (n.flatShading = !0), this.visible === !1 && (n.visible = !1), this.toneMapped === !1 && (n.toneMapped = !1), this.fog === !1 && (n.fog = !1), Object.keys(this.userData).length > 0 && (n.userData = this.userData); + n.uuid = this.uuid, n.type = this.type, this.name !== "" && (n.name = this.name), this.color && this.color.isColor && (n.color = this.color.getHex()), this.roughness !== void 0 && (n.roughness = this.roughness), this.metalness !== void 0 && (n.metalness = this.metalness), this.sheen !== void 0 && (n.sheen = this.sheen), this.sheenColor && this.sheenColor.isColor && (n.sheenColor = this.sheenColor.getHex()), this.sheenRoughness !== void 0 && (n.sheenRoughness = this.sheenRoughness), this.emissive && this.emissive.isColor && (n.emissive = this.emissive.getHex()), this.emissiveIntensity !== void 0 && this.emissiveIntensity !== 1 && (n.emissiveIntensity = this.emissiveIntensity), this.specular && this.specular.isColor && (n.specular = this.specular.getHex()), this.specularIntensity !== void 0 && (n.specularIntensity = this.specularIntensity), this.specularColor && this.specularColor.isColor && (n.specularColor = this.specularColor.getHex()), this.shininess !== void 0 && (n.shininess = this.shininess), this.clearcoat !== void 0 && (n.clearcoat = this.clearcoat), this.clearcoatRoughness !== void 0 && (n.clearcoatRoughness = this.clearcoatRoughness), this.clearcoatMap && this.clearcoatMap.isTexture && (n.clearcoatMap = this.clearcoatMap.toJSON(e).uuid), this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture && (n.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON(e).uuid), this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture && (n.clearcoatNormalMap = this.clearcoatNormalMap.toJSON(e).uuid, n.clearcoatNormalScale = this.clearcoatNormalScale.toArray()), this.sheenColorMap && this.sheenColorMap.isTexture && (n.sheenColorMap = this.sheenColorMap.toJSON(e).uuid), this.sheenRoughnessMap && this.sheenRoughnessMap.isTexture && (n.sheenRoughnessMap = this.sheenRoughnessMap.toJSON(e).uuid), this.dispersion !== void 0 && (n.dispersion = this.dispersion), this.iridescence !== void 0 && (n.iridescence = this.iridescence), this.iridescenceIOR !== void 0 && (n.iridescenceIOR = this.iridescenceIOR), this.iridescenceThicknessRange !== void 0 && (n.iridescenceThicknessRange = this.iridescenceThicknessRange), this.iridescenceMap && this.iridescenceMap.isTexture && (n.iridescenceMap = this.iridescenceMap.toJSON(e).uuid), this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture && (n.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON(e).uuid), this.anisotropy !== void 0 && (n.anisotropy = this.anisotropy), this.anisotropyRotation !== void 0 && (n.anisotropyRotation = this.anisotropyRotation), this.anisotropyMap && this.anisotropyMap.isTexture && (n.anisotropyMap = this.anisotropyMap.toJSON(e).uuid), this.map && this.map.isTexture && (n.map = this.map.toJSON(e).uuid), this.matcap && this.matcap.isTexture && (n.matcap = this.matcap.toJSON(e).uuid), this.alphaMap && this.alphaMap.isTexture && (n.alphaMap = this.alphaMap.toJSON(e).uuid), this.lightMap && this.lightMap.isTexture && (n.lightMap = this.lightMap.toJSON(e).uuid, n.lightMapIntensity = this.lightMapIntensity), this.aoMap && this.aoMap.isTexture && (n.aoMap = this.aoMap.toJSON(e).uuid, n.aoMapIntensity = this.aoMapIntensity), this.bumpMap && this.bumpMap.isTexture && (n.bumpMap = this.bumpMap.toJSON(e).uuid, n.bumpScale = this.bumpScale), this.normalMap && this.normalMap.isTexture && (n.normalMap = this.normalMap.toJSON(e).uuid, n.normalMapType = this.normalMapType, n.normalScale = this.normalScale.toArray()), this.displacementMap && this.displacementMap.isTexture && (n.displacementMap = this.displacementMap.toJSON(e).uuid, n.displacementScale = this.displacementScale, n.displacementBias = this.displacementBias), this.roughnessMap && this.roughnessMap.isTexture && (n.roughnessMap = this.roughnessMap.toJSON(e).uuid), this.metalnessMap && this.metalnessMap.isTexture && (n.metalnessMap = this.metalnessMap.toJSON(e).uuid), this.emissiveMap && this.emissiveMap.isTexture && (n.emissiveMap = this.emissiveMap.toJSON(e).uuid), this.specularMap && this.specularMap.isTexture && (n.specularMap = this.specularMap.toJSON(e).uuid), this.specularIntensityMap && this.specularIntensityMap.isTexture && (n.specularIntensityMap = this.specularIntensityMap.toJSON(e).uuid), this.specularColorMap && this.specularColorMap.isTexture && (n.specularColorMap = this.specularColorMap.toJSON(e).uuid), this.envMap && this.envMap.isTexture && (n.envMap = this.envMap.toJSON(e).uuid, this.combine !== void 0 && (n.combine = this.combine)), this.envMapRotation !== void 0 && (n.envMapRotation = this.envMapRotation.toArray()), this.envMapIntensity !== void 0 && (n.envMapIntensity = this.envMapIntensity), this.reflectivity !== void 0 && (n.reflectivity = this.reflectivity), this.refractionRatio !== void 0 && (n.refractionRatio = this.refractionRatio), this.gradientMap && this.gradientMap.isTexture && (n.gradientMap = this.gradientMap.toJSON(e).uuid), this.transmission !== void 0 && (n.transmission = this.transmission), this.transmissionMap && this.transmissionMap.isTexture && (n.transmissionMap = this.transmissionMap.toJSON(e).uuid), this.thickness !== void 0 && (n.thickness = this.thickness), this.thicknessMap && this.thicknessMap.isTexture && (n.thicknessMap = this.thicknessMap.toJSON(e).uuid), this.attenuationDistance !== void 0 && this.attenuationDistance !== 1 / 0 && (n.attenuationDistance = this.attenuationDistance), this.attenuationColor !== void 0 && (n.attenuationColor = this.attenuationColor.getHex()), this.size !== void 0 && (n.size = this.size), this.shadowSide !== null && (n.shadowSide = this.shadowSide), this.sizeAttenuation !== void 0 && (n.sizeAttenuation = this.sizeAttenuation), this.blending !== Tr && (n.blending = this.blending), this.side !== jn && (n.side = this.side), this.vertexColors === !0 && (n.vertexColors = !0), this.opacity < 1 && (n.opacity = this.opacity), this.transparent === !0 && (n.transparent = !0), this.blendSrc !== Mh && (n.blendSrc = this.blendSrc), this.blendDst !== wh && (n.blendDst = this.blendDst), this.blendEquation !== Rn && (n.blendEquation = this.blendEquation), this.blendSrcAlpha !== null && (n.blendSrcAlpha = this.blendSrcAlpha), this.blendDstAlpha !== null && (n.blendDstAlpha = this.blendDstAlpha), this.blendEquationAlpha !== null && (n.blendEquationAlpha = this.blendEquationAlpha), this.blendColor && this.blendColor.isColor && (n.blendColor = this.blendColor.getHex()), this.blendAlpha !== 0 && (n.blendAlpha = this.blendAlpha), this.depthFunc !== Lr && (n.depthFunc = this.depthFunc), this.depthTest === !1 && (n.depthTest = this.depthTest), this.depthWrite === !1 && (n.depthWrite = this.depthWrite), this.colorWrite === !1 && (n.colorWrite = this.colorWrite), this.stencilWriteMask !== 255 && (n.stencilWriteMask = this.stencilWriteMask), this.stencilFunc !== Bd && (n.stencilFunc = this.stencilFunc), this.stencilRef !== 0 && (n.stencilRef = this.stencilRef), this.stencilFuncMask !== 255 && (n.stencilFuncMask = this.stencilFuncMask), this.stencilFail !== qs && (n.stencilFail = this.stencilFail), this.stencilZFail !== qs && (n.stencilZFail = this.stencilZFail), this.stencilZPass !== qs && (n.stencilZPass = this.stencilZPass), this.stencilWrite === !0 && (n.stencilWrite = this.stencilWrite), this.rotation !== void 0 && this.rotation !== 0 && (n.rotation = this.rotation), this.polygonOffset === !0 && (n.polygonOffset = !0), this.polygonOffsetFactor !== 0 && (n.polygonOffsetFactor = this.polygonOffsetFactor), this.polygonOffsetUnits !== 0 && (n.polygonOffsetUnits = this.polygonOffsetUnits), this.linewidth !== void 0 && this.linewidth !== 1 && (n.linewidth = this.linewidth), this.dashSize !== void 0 && (n.dashSize = this.dashSize), this.gapSize !== void 0 && (n.gapSize = this.gapSize), this.scale !== void 0 && (n.scale = this.scale), this.dithering === !0 && (n.dithering = !0), this.alphaTest > 0 && (n.alphaTest = this.alphaTest), this.alphaHash === !0 && (n.alphaHash = !0), this.alphaToCoverage === !0 && (n.alphaToCoverage = !0), this.premultipliedAlpha === !0 && (n.premultipliedAlpha = !0), this.forceSinglePass === !0 && (n.forceSinglePass = !0), this.wireframe === !0 && (n.wireframe = !0), this.wireframeLinewidth > 1 && (n.wireframeLinewidth = this.wireframeLinewidth), this.wireframeLinecap !== "round" && (n.wireframeLinecap = this.wireframeLinecap), this.wireframeLinejoin !== "round" && (n.wireframeLinejoin = this.wireframeLinejoin), this.flatShading === !0 && (n.flatShading = !0), this.visible === !1 && (n.visible = !1), this.toneMapped === !1 && (n.toneMapped = !1), this.fog === !1 && (n.fog = !1), Object.keys(this.userData).length > 0 && (n.userData = this.userData); function i(r) { const a = []; for (const o in r) { @@ -9098,7 +9078,7 @@ class no { } const zt = /* @__PURE__ */ new P(), io = /* @__PURE__ */ new he(); let Wx = 0; -class yt { +class bt { /** * Constructs a new buffer attribute. * @@ -9420,7 +9400,7 @@ class yt { return this.name !== "" && (e.name = this.name), this.usage !== ou && (e.usage = this.usage), e; } } -class Vm extends yt { +class Vm extends bt { /** * Constructs a new buffer attribute. * @@ -9432,7 +9412,7 @@ class Vm extends yt { super(new Uint16Array(e), t, n); } } -class Gm extends yt { +class Gm extends bt { /** * Constructs a new buffer attribute. * @@ -9444,7 +9424,7 @@ class Gm extends yt { super(new Uint32Array(e), t, n); } } -class qt extends yt { +class qt extends bt { /** * Constructs a new buffer attribute. * @@ -9457,7 +9437,7 @@ class qt extends yt { } } let Xx = 0; -const Un = /* @__PURE__ */ new De(), bc = /* @__PURE__ */ new Et(), ir = /* @__PURE__ */ new P(), An = /* @__PURE__ */ new xt(), Kr = /* @__PURE__ */ new xt(), $t = /* @__PURE__ */ new P(); +const Un = /* @__PURE__ */ new De(), yc = /* @__PURE__ */ new Et(), ir = /* @__PURE__ */ new P(), An = /* @__PURE__ */ new xt(), Kr = /* @__PURE__ */ new xt(), $t = /* @__PURE__ */ new P(); class mt extends zs { /** * Constructs a new geometry. @@ -9662,7 +9642,7 @@ class mt extends zs { * @return {BufferGeometry} A reference to this instance. */ lookAt(e) { - return bc.lookAt(e), bc.updateMatrix(), this.applyMatrix4(bc.matrix), this; + return yc.lookAt(e), yc.updateMatrix(), this.applyMatrix4(yc.matrix), this; } /** * Center the geometry based on its bounding box. @@ -9773,7 +9753,7 @@ class mt extends zs { return; } const n = t.position, i = t.normal, r = t.uv; - this.hasAttribute("tangent") === !1 && this.setAttribute("tangent", new yt(new Float32Array(4 * n.count), 4)); + this.hasAttribute("tangent") === !1 && this.setAttribute("tangent", new bt(new Float32Array(4 * n.count), 4)); const a = this.getAttribute("tangent"), o = [], l = []; for (let R = 0; R < n.count; R++) o[R] = new P(), l[R] = new P(); @@ -9783,13 +9763,13 @@ class mt extends zs { const L = 1 / (d.x * m.y - m.x * d.y); isFinite(L) && (f.copy(h).multiplyScalar(m.y).addScaledVector(u, -d.y).multiplyScalar(L), x.copy(u).multiplyScalar(d.x).addScaledVector(h, -m.x).multiplyScalar(L), o[R].add(f), o[S].add(f), o[E].add(f), l[R].add(x), l[S].add(x), l[E].add(x)); } - let y = this.groups; - y.length === 0 && (y = [{ + let b = this.groups; + b.length === 0 && (b = [{ start: 0, count: e.count }]); - for (let R = 0, S = y.length; R < S; ++R) { - const E = y[R], L = E.start, A = E.count; + for (let R = 0, S = b.length; R < S; ++R) { + const E = b[R], L = E.start, A = E.count; for (let I = L, w = L + A; I < w; I += 3) g( e.getX(I + 0), @@ -9797,18 +9777,18 @@ class mt extends zs { e.getX(I + 2) ); } - const v = new P(), b = new P(), _ = new P(), M = new P(); - function T(R) { + const v = new P(), y = new P(), _ = new P(), M = new P(); + function C(R) { _.fromBufferAttribute(i, R), M.copy(_); const S = o[R]; - v.copy(S), v.sub(_.multiplyScalar(_.dot(S))).normalize(), b.crossVectors(M, S); - const L = b.dot(l[R]) < 0 ? -1 : 1; + v.copy(S), v.sub(_.multiplyScalar(_.dot(S))).normalize(), y.crossVectors(M, S); + const L = y.dot(l[R]) < 0 ? -1 : 1; a.setXYZW(R, v.x, v.y, v.z, L); } - for (let R = 0, S = y.length; R < S; ++R) { - const E = y[R], L = E.start, A = E.count; + for (let R = 0, S = b.length; R < S; ++R) { + const E = b[R], L = E.start, A = E.count; for (let I = L, w = L + A; I < w; I += 3) - T(e.getX(I + 0)), T(e.getX(I + 1)), T(e.getX(I + 2)); + C(e.getX(I + 0)), C(e.getX(I + 1)), C(e.getX(I + 2)); } } /** @@ -9822,7 +9802,7 @@ class mt extends zs { if (t !== void 0) { let n = this.getAttribute("normal"); if (n === void 0) - n = new yt(new Float32Array(t.count * 3), 3), this.setAttribute("normal", n); + n = new bt(new Float32Array(t.count * 3), 3), this.setAttribute("normal", n); else for (let p = 0, d = n.count; p < d; p++) n.setXYZ(p, 0, 0, 0); @@ -9862,7 +9842,7 @@ class mt extends zs { for (let g = 0; g < h; g++) p[m++] = c[d++]; } - return new yt(p, h, u); + return new bt(p, h, u); } if (this.index === null) return He("BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."), this; @@ -10056,33 +10036,33 @@ class at extends Et { if (o !== null) if (Array.isArray(a)) for (let m = 0, f = p.length; m < f; m++) { - const x = p[m], g = a[x.materialIndex], y = Math.max(x.start, d.start), v = Math.min(o.count, Math.min(x.start + x.count, d.start + d.count)); - for (let b = y, _ = v; b < _; b += 3) { - const M = o.getX(b), T = o.getX(b + 1), R = o.getX(b + 2); - i = ho(this, g, e, n, c, h, u, M, T, R), i && (i.faceIndex = Math.floor(b / 3), i.face.materialIndex = x.materialIndex, t.push(i)); + const x = p[m], g = a[x.materialIndex], b = Math.max(x.start, d.start), v = Math.min(o.count, Math.min(x.start + x.count, d.start + d.count)); + for (let y = b, _ = v; y < _; y += 3) { + const M = o.getX(y), C = o.getX(y + 1), R = o.getX(y + 2); + i = ho(this, g, e, n, c, h, u, M, C, R), i && (i.faceIndex = Math.floor(y / 3), i.face.materialIndex = x.materialIndex, t.push(i)); } } else { const m = Math.max(0, d.start), f = Math.min(o.count, d.start + d.count); for (let x = m, g = f; x < g; x += 3) { - const y = o.getX(x), v = o.getX(x + 1), b = o.getX(x + 2); - i = ho(this, a, e, n, c, h, u, y, v, b), i && (i.faceIndex = Math.floor(x / 3), t.push(i)); + const b = o.getX(x), v = o.getX(x + 1), y = o.getX(x + 2); + i = ho(this, a, e, n, c, h, u, b, v, y), i && (i.faceIndex = Math.floor(x / 3), t.push(i)); } } else if (l !== void 0) if (Array.isArray(a)) for (let m = 0, f = p.length; m < f; m++) { - const x = p[m], g = a[x.materialIndex], y = Math.max(x.start, d.start), v = Math.min(l.count, Math.min(x.start + x.count, d.start + d.count)); - for (let b = y, _ = v; b < _; b += 3) { - const M = b, T = b + 1, R = b + 2; - i = ho(this, g, e, n, c, h, u, M, T, R), i && (i.faceIndex = Math.floor(b / 3), i.face.materialIndex = x.materialIndex, t.push(i)); + const x = p[m], g = a[x.materialIndex], b = Math.max(x.start, d.start), v = Math.min(l.count, Math.min(x.start + x.count, d.start + d.count)); + for (let y = b, _ = v; y < _; y += 3) { + const M = y, C = y + 1, R = y + 2; + i = ho(this, g, e, n, c, h, u, M, C, R), i && (i.faceIndex = Math.floor(y / 3), i.face.materialIndex = x.materialIndex, t.push(i)); } } else { const m = Math.max(0, d.start), f = Math.min(l.count, d.start + d.count); for (let x = m, g = f; x < g; x += 3) { - const y = x, v = x + 1, b = x + 2; - i = ho(this, a, e, n, c, h, u, y, v, b), i && (i.faceIndex = Math.floor(x / 3), t.push(i)); + const b = x, v = x + 1, y = x + 2; + i = ho(this, a, e, n, c, h, u, b, v, y), i && (i.faceIndex = Math.floor(x / 3), t.push(i)); } } } @@ -10140,19 +10120,19 @@ class rs extends mt { const l = [], c = [], h = [], u = []; let p = 0, d = 0; m("z", "y", "x", -1, -1, n, t, e, a, r, 0), m("z", "y", "x", 1, -1, n, t, -e, a, r, 1), m("x", "z", "y", 1, 1, e, n, t, i, a, 2), m("x", "z", "y", 1, -1, e, n, -t, i, a, 3), m("x", "y", "z", 1, -1, e, t, n, i, r, 4), m("x", "y", "z", -1, -1, e, t, -n, i, r, 5), this.setIndex(l), this.setAttribute("position", new qt(c, 3)), this.setAttribute("normal", new qt(h, 3)), this.setAttribute("uv", new qt(u, 2)); - function m(f, x, g, y, v, b, _, M, T, R, S) { - const E = b / T, L = _ / R, A = b / 2, I = _ / 2, w = M / 2, z = T + 1, G = R + 1; + function m(f, x, g, b, v, y, _, M, C, R, S) { + const E = y / C, L = _ / R, A = y / 2, I = _ / 2, w = M / 2, z = C + 1, G = R + 1; let j = 0, Y = 0; const q = new P(); for (let ie = 0; ie < G; ie++) { const W = ie * L - I; for (let $ = 0; $ < z; $++) { const fe = $ * E - A; - q[f] = fe * y, q[x] = W * v, q[g] = w, c.push(q.x, q.y, q.z), q[f] = 0, q[x] = 0, q[g] = M > 0 ? 1 : -1, h.push(q.x, q.y, q.z), u.push($ / T), u.push(1 - ie / R), j += 1; + q[f] = fe * b, q[x] = W * v, q[g] = w, c.push(q.x, q.y, q.z), q[f] = 0, q[x] = 0, q[g] = M > 0 ? 1 : -1, h.push(q.x, q.y, q.z), u.push($ / C), u.push(1 - ie / R), j += 1; } } for (let ie = 0; ie < R; ie++) - for (let W = 0; W < T; W++) { + for (let W = 0; W < C; W++) { const $ = p + W + z * ie, fe = p + W + z * (ie + 1), me = p + (W + 1) + z * (ie + 1), de = p + (W + 1) + z * ie; l.push($, fe, de), l.push(fe, me, de), Y += 6; } @@ -11153,7 +11133,7 @@ class kr { for (let r = 0; r < this.itemSize; r++) t.push(this.data.array[i + r]); } - return new yt(new this.array.constructor(t), this.itemSize, this.normalized); + return new bt(new this.array.constructor(t), this.itemSize, this.normalized); } else return e.interleavedBuffers === void 0 && (e.interleavedBuffers = {}), e.interleavedBuffers[this.data.uuid] === void 0 && (e.interleavedBuffers[this.data.uuid] = this.data.clone(e)), new kr(e.interleavedBuffers[this.data.uuid], this.itemSize, this.offset, this.normalized); } @@ -11552,7 +11532,7 @@ class $u { return e; } } -class Rl extends yt { +class Rl extends bt { /** * Constructs a new instanced buffer attribute. * @@ -11700,7 +11680,7 @@ class Ot extends at { this.dispatchEvent({ type: "dispose" }), this.morphTexture !== null && (this.morphTexture.dispose(), this.morphTexture = null); } } -const Tc = /* @__PURE__ */ new P(), i1 = /* @__PURE__ */ new P(), s1 = /* @__PURE__ */ new Ke(); +const Cc = /* @__PURE__ */ new P(), i1 = /* @__PURE__ */ new P(), s1 = /* @__PURE__ */ new Ke(); class It { /** * Constructs a new plane. @@ -11756,7 +11736,7 @@ class It { * @return {Plane} A reference to this plane. */ setFromCoplanarPoints(e, t, n) { - const i = Tc.subVectors(n, t).cross(i1.subVectors(e, t)).normalize(); + const i = Cc.subVectors(n, t).cross(i1.subVectors(e, t)).normalize(); return this.setFromNormalAndCoplanarPoint(i, e), this; } /** @@ -11823,7 +11803,7 @@ class It { * @return {?Vector3} The intersection point. */ intersectLine(e, t) { - const n = e.delta(Tc), i = this.normal.dot(n); + const n = e.delta(Cc), i = this.normal.dot(n); if (i === 0) return this.distanceToPoint(e.start) === 0 ? t.copy(e.start) : null; const r = -(e.start.dot(this.normal) + this.constant) / i; @@ -11880,7 +11860,7 @@ class It { * @return {Plane} A reference to this plane. */ applyMatrix4(e, t) { - const n = t || s1.getNormalMatrix(e), i = this.coplanarPoint(Tc).applyMatrix4(e), r = this.normal.applyMatrix3(n).normalize(); + const n = t || s1.getNormalMatrix(e), i = this.coplanarPoint(Cc).applyMatrix4(e), r = this.normal.applyMatrix3(n).normalize(); return this.constant = -i.dot(r), this; } /** @@ -11962,13 +11942,13 @@ class Ku { * @return {Frustum} A reference to this frustum. */ setFromProjectionMatrix(e, t = ui, n = !1) { - const i = this.planes, r = e.elements, a = r[0], o = r[1], l = r[2], c = r[3], h = r[4], u = r[5], p = r[6], d = r[7], m = r[8], f = r[9], x = r[10], g = r[11], y = r[12], v = r[13], b = r[14], _ = r[15]; - if (i[0].setComponents(c - a, d - h, g - m, _ - y).normalize(), i[1].setComponents(c + a, d + h, g + m, _ + y).normalize(), i[2].setComponents(c + o, d + u, g + f, _ + v).normalize(), i[3].setComponents(c - o, d - u, g - f, _ - v).normalize(), n) - i[4].setComponents(l, p, x, b).normalize(), i[5].setComponents(c - l, d - p, g - x, _ - b).normalize(); - else if (i[4].setComponents(c - l, d - p, g - x, _ - b).normalize(), t === ui) - i[5].setComponents(c + l, d + p, g + x, _ + b).normalize(); + const i = this.planes, r = e.elements, a = r[0], o = r[1], l = r[2], c = r[3], h = r[4], u = r[5], p = r[6], d = r[7], m = r[8], f = r[9], x = r[10], g = r[11], b = r[12], v = r[13], y = r[14], _ = r[15]; + if (i[0].setComponents(c - a, d - h, g - m, _ - b).normalize(), i[1].setComponents(c + a, d + h, g + m, _ + b).normalize(), i[2].setComponents(c + o, d + u, g + f, _ + v).normalize(), i[3].setComponents(c - o, d - u, g - f, _ - v).normalize(), n) + i[4].setComponents(l, p, x, y).normalize(), i[5].setComponents(c - l, d - p, g - x, _ - y).normalize(); + else if (i[4].setComponents(c - l, d - p, g - x, _ - y).normalize(), t === ui) + i[5].setComponents(c + l, d + p, g + x, _ + y).normalize(); else if (t === Al) - i[5].setComponents(l, p, x, b).normalize(); + i[5].setComponents(l, p, x, y).normalize(); else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: " + t); return this; @@ -12068,7 +12048,7 @@ class Hs extends Dn { return super.copy(e), this.color.copy(e.color), this.map = e.map, this.linewidth = e.linewidth, this.linecap = e.linecap, this.linejoin = e.linejoin, this.fog = e.fog, this; } } -const Ll = /* @__PURE__ */ new P(), Dl = /* @__PURE__ */ new P(), up = /* @__PURE__ */ new De(), ia = /* @__PURE__ */ new cs(), vo = /* @__PURE__ */ new fi(), Cc = /* @__PURE__ */ new P(), dp = /* @__PURE__ */ new P(); +const Ll = /* @__PURE__ */ new P(), Dl = /* @__PURE__ */ new P(), up = /* @__PURE__ */ new De(), ia = /* @__PURE__ */ new cs(), vo = /* @__PURE__ */ new fi(), Tc = /* @__PURE__ */ new P(), dp = /* @__PURE__ */ new P(); class hs extends Et { /** * Constructs a new line. @@ -12114,21 +12094,21 @@ class hs extends Et { if (h !== null) { const d = Math.max(0, a.start), m = Math.min(h.count, a.start + a.count); for (let f = d, x = m - 1; f < x; f += c) { - const g = h.getX(f), y = h.getX(f + 1), v = yo(this, e, ia, l, g, y, f); + const g = h.getX(f), b = h.getX(f + 1), v = bo(this, e, ia, l, g, b, f); v && t.push(v); } if (this.isLineLoop) { - const f = h.getX(m - 1), x = h.getX(d), g = yo(this, e, ia, l, f, x, m - 1); + const f = h.getX(m - 1), x = h.getX(d), g = bo(this, e, ia, l, f, x, m - 1); g && t.push(g); } } else { const d = Math.max(0, a.start), m = Math.min(p.count, a.start + a.count); for (let f = d, x = m - 1; f < x; f += c) { - const g = yo(this, e, ia, l, f, f + 1, f); + const g = bo(this, e, ia, l, f, f + 1, f); g && t.push(g); } if (this.isLineLoop) { - const f = yo(this, e, ia, l, m - 1, d, m - 1); + const f = bo(this, e, ia, l, m - 1, d, m - 1); f && t.push(f); } } @@ -12151,11 +12131,11 @@ class hs extends Et { } } } -function yo(s, e, t, n, i, r, a) { +function bo(s, e, t, n, i, r, a) { const o = s.geometry.attributes.position; - if (Ll.fromBufferAttribute(o, i), Dl.fromBufferAttribute(o, r), t.distanceSqToSegment(Ll, Dl, Cc, dp) > n) return; - Cc.applyMatrix4(s.matrixWorld); - const c = e.ray.origin.distanceTo(Cc); + if (Ll.fromBufferAttribute(o, i), Dl.fromBufferAttribute(o, r), t.distanceSqToSegment(Ll, Dl, Tc, dp) > n) return; + Tc.applyMatrix4(s.matrixWorld); + const c = e.ray.origin.distanceTo(Tc); if (!(c < e.near || c > e.far)) return { distance: c, @@ -12220,7 +12200,7 @@ class Jm extends Dn { return super.copy(e), this.color.copy(e.color), this.map = e.map, this.alphaMap = e.alphaMap, this.size = e.size, this.sizeAttenuation = e.sizeAttenuation, this.fog = e.fog, this; } } -const mp = /* @__PURE__ */ new De(), cu = /* @__PURE__ */ new cs(), bo = /* @__PURE__ */ new fi(), _o = /* @__PURE__ */ new P(); +const mp = /* @__PURE__ */ new De(), cu = /* @__PURE__ */ new cs(), yo = /* @__PURE__ */ new fi(), _o = /* @__PURE__ */ new P(); class Qm extends Et { /** * Constructs a new point cloud. @@ -12242,7 +12222,7 @@ class Qm extends Et { */ raycast(e, t) { const n = this.geometry, i = this.matrixWorld, r = e.params.Points.threshold, a = n.drawRange; - if (n.boundingSphere === null && n.computeBoundingSphere(), bo.copy(n.boundingSphere), bo.applyMatrix4(i), bo.radius += r, e.ray.intersectsSphere(bo) === !1) return; + if (n.boundingSphere === null && n.computeBoundingSphere(), yo.copy(n.boundingSphere), yo.applyMatrix4(i), yo.radius += r, e.ray.intersectsSphere(yo) === !1) return; mp.copy(i).invert(), cu.copy(e.ray).applyMatrix4(mp); const o = r / ((this.scale.x + this.scale.y + this.scale.z) / 3), l = o * o, c = n.index, u = n.attributes.position; if (c !== null) { @@ -12965,7 +12945,7 @@ class i0 extends mi { return super.fromJSON(e), this.v0.fromArray(e.v0), this.v1.fromArray(e.v1), this.v2.fromArray(e.v2), this; } } -class y1 extends mi { +class b1 extends mi { /** * Constructs a new Quadratic Bezier curve. * @@ -13061,10 +13041,10 @@ var hu = /* @__PURE__ */ Object.freeze({ LineCurve: n0, LineCurve3: v1, QuadraticBezierCurve: i0, - QuadraticBezierCurve3: y1, + QuadraticBezierCurve3: b1, SplineCurve: s0 }); -class b1 extends mi { +class y1 extends mi { /** * Constructs a new curve path. */ @@ -13177,7 +13157,7 @@ class b1 extends mi { return this; } } -class vp extends b1 { +class vp extends y1 { /** * Constructs a new path. * @@ -13428,7 +13408,7 @@ function _1(s, e, t = 2) { const a = []; if (!r || r.next === r.prev) return a; let o, l, c; - if (n && (r = T1(s, e, r, t)), s.length > 80 * t) { + if (n && (r = C1(s, e, r, t)), s.length > 80 * t) { o = s[0], l = s[1]; let h = o, u = l; for (let p = t; p < i; p += t) { @@ -13442,9 +13422,9 @@ function _1(s, e, t = 2) { function a0(s, e, t, n, i) { let r; if (i === U1(s, e, t, n) > 0) - for (let a = e; a < t; a += n) r = yp(a / n | 0, s[a], s[a + 1], r); + for (let a = e; a < t; a += n) r = bp(a / n | 0, s[a], s[a + 1], r); else - for (let a = t - n; a >= e; a -= n) r = yp(a / n | 0, s[a], s[a + 1], r); + for (let a = t - n; a >= e; a -= n) r = bp(a / n | 0, s[a], s[a + 1], r); return r && Ur(r, r.next) && (Ua(r), r = r.next), r; } function Us(s, e) { @@ -13490,19 +13470,19 @@ function M1(s) { function w1(s, e, t, n) { const i = s.prev, r = s, a = s.next; if (At(i, r, a) >= 0) return !1; - const o = i.x, l = r.x, c = a.x, h = i.y, u = r.y, p = a.y, d = Math.min(o, l, c), m = Math.min(h, u, p), f = Math.max(o, l, c), x = Math.max(h, u, p), g = uu(d, m, e, t, n), y = uu(f, x, e, t, n); - let v = s.prevZ, b = s.nextZ; - for (; v && v.z >= g && b && b.z <= y; ) { - if (v.x >= d && v.x <= f && v.y >= m && v.y <= x && v !== i && v !== a && va(o, h, l, u, c, p, v.x, v.y) && At(v.prev, v, v.next) >= 0 || (v = v.prevZ, b.x >= d && b.x <= f && b.y >= m && b.y <= x && b !== i && b !== a && va(o, h, l, u, c, p, b.x, b.y) && At(b.prev, b, b.next) >= 0)) return !1; - b = b.nextZ; + const o = i.x, l = r.x, c = a.x, h = i.y, u = r.y, p = a.y, d = Math.min(o, l, c), m = Math.min(h, u, p), f = Math.max(o, l, c), x = Math.max(h, u, p), g = uu(d, m, e, t, n), b = uu(f, x, e, t, n); + let v = s.prevZ, y = s.nextZ; + for (; v && v.z >= g && y && y.z <= b; ) { + if (v.x >= d && v.x <= f && v.y >= m && v.y <= x && v !== i && v !== a && va(o, h, l, u, c, p, v.x, v.y) && At(v.prev, v, v.next) >= 0 || (v = v.prevZ, y.x >= d && y.x <= f && y.y >= m && y.y <= x && y !== i && y !== a && va(o, h, l, u, c, p, y.x, y.y) && At(y.prev, y, y.next) >= 0)) return !1; + y = y.nextZ; } for (; v && v.z >= g; ) { if (v.x >= d && v.x <= f && v.y >= m && v.y <= x && v !== i && v !== a && va(o, h, l, u, c, p, v.x, v.y) && At(v.prev, v, v.next) >= 0) return !1; v = v.prevZ; } - for (; b && b.z <= y; ) { - if (b.x >= d && b.x <= f && b.y >= m && b.y <= x && b !== i && b !== a && va(o, h, l, u, c, p, b.x, b.y) && At(b.prev, b, b.next) >= 0) return !1; - b = b.nextZ; + for (; y && y.z <= b; ) { + if (y.x >= d && y.x <= f && y.y >= m && y.y <= x && y !== i && y !== a && va(o, h, l, u, c, p, y.x, y.y) && At(y.prev, y, y.next) >= 0) return !1; + y = y.nextZ; } return !0; } @@ -13529,18 +13509,18 @@ function E1(s, e, t, n, i, r) { a = a.next; } while (a !== s); } -function T1(s, e, t, n) { +function C1(s, e, t, n) { const i = []; for (let r = 0, a = e.length; r < a; r++) { const o = e[r] * n, l = r < a - 1 ? e[r + 1] * n : s.length, c = a0(s, o, l, n, !1); c === c.next && (c.steiner = !0), i.push(I1(c)); } - i.sort(C1); + i.sort(T1); for (let r = 0; r < i.length; r++) t = A1(i[r], t); return t; } -function C1(s, e) { +function T1(s, e) { let t = s.x - e.x; if (t === 0 && (t = s.y - e.y, t === 0)) { const n = (s.next.y - s.y) / (s.next.x - s.x), i = (e.next.y - e.y) / (e.next.x - e.x); @@ -13673,7 +13653,7 @@ function c0(s, e) { const t = du(s.i, s.x, s.y), n = du(e.i, e.x, e.y), i = s.next, r = e.prev; return s.next = e, e.prev = s, t.next = i, i.prev = t, n.next = t, t.prev = n, r.next = n, n.prev = r, n; } -function yp(s, e, t, n) { +function bp(s, e, t, n) { const i = du(s, e, t); return n ? (i.next = n.next, i.prev = n, n.next.prev = i, n.next = i) : (i.prev = i, i.next = i), i; } @@ -13751,9 +13731,9 @@ class Sr { */ static triangulateShape(e, t) { const n = [], i = [], r = []; - bp(e), _p(n, e); + yp(e), _p(n, e); let a = e.length; - t.forEach(bp); + t.forEach(yp); for (let l = 0; l < t.length; l++) i.push(a), a += t[l].length, _p(n, t[l]); const o = O1.triangulate(n, i); @@ -13762,7 +13742,7 @@ class Sr { return r; } } -function bp(s) { +function yp(s) { const e = s.length; e > 2 && s[e - 1].equals(s[0]) && s.pop(); } @@ -13791,31 +13771,31 @@ class ed extends mt { function a(o) { const l = [], c = t.curveSegments !== void 0 ? t.curveSegments : 12, h = t.steps !== void 0 ? t.steps : 1, u = t.depth !== void 0 ? t.depth : 1; let p = t.bevelEnabled !== void 0 ? t.bevelEnabled : !0, d = t.bevelThickness !== void 0 ? t.bevelThickness : 0.2, m = t.bevelSize !== void 0 ? t.bevelSize : d - 0.1, f = t.bevelOffset !== void 0 ? t.bevelOffset : 0, x = t.bevelSegments !== void 0 ? t.bevelSegments : 3; - const g = t.extrudePath, y = t.UVGenerator !== void 0 ? t.UVGenerator : z1; - let v, b = !1, _, M, T, R; - g && (v = g.getSpacedPoints(h), b = !0, p = !1, _ = g.computeFrenetFrames(h, !1), M = new P(), T = new P(), R = new P()), p || (x = 0, d = 0, m = 0, f = 0); + const g = t.extrudePath, b = t.UVGenerator !== void 0 ? t.UVGenerator : z1; + let v, y = !1, _, M, C, R; + g && (v = g.getSpacedPoints(h), y = !0, p = !1, _ = g.computeFrenetFrames(h, !1), M = new P(), C = new P(), R = new P()), p || (x = 0, d = 0, m = 0, f = 0); const S = o.extractPoints(c); let E = S.shape; const L = S.holes; if (!Sr.isClockWise(E)) { E = E.reverse(); - for (let C = 0, N = L.length; C < N; C++) { - const V = L[C]; - Sr.isClockWise(V) && (L[C] = V.reverse()); + for (let T = 0, N = L.length; T < N; T++) { + const V = L[T]; + Sr.isClockWise(V) && (L[T] = V.reverse()); } } - function I(C) { + function I(T) { const V = 10000000000000001e-36; - let U = C[0]; - for (let k = 1; k <= C.length; k++) { - const F = k % C.length, ee = C[F], J = ee.x - U.x, X = ee.y - U.y, B = J * J + X * X, D = Math.max( + let U = T[0]; + for (let k = 1; k <= T.length; k++) { + const F = k % T.length, ee = T[F], J = ee.x - U.x, X = ee.y - U.y, B = J * J + X * X, D = Math.max( Math.abs(ee.x), Math.abs(ee.y), Math.abs(U.x), Math.abs(U.y) ), H = V * D * D; if (B <= H) { - C.splice(F, 1), k--; + T.splice(F, 1), k--; continue; } U = ee; @@ -13823,20 +13803,20 @@ class ed extends mt { } I(E), L.forEach(I); const w = L.length, z = E; - for (let C = 0; C < w; C++) { - const N = L[C]; + for (let T = 0; T < w; T++) { + const N = L[T]; E = E.concat(N); } - function G(C, N, V) { - return N || et("ExtrudeGeometry: vec does not exist"), C.clone().addScaledVector(N, V); + function G(T, N, V) { + return N || et("ExtrudeGeometry: vec does not exist"), T.clone().addScaledVector(N, V); } const j = E.length; - function Y(C, N, V) { + function Y(T, N, V) { let U, k, F; - const ee = C.x - N.x, J = C.y - N.y, X = V.x - C.x, B = V.y - C.y, D = ee * ee + J * J, H = ee * B - J * X; + const ee = T.x - N.x, J = T.y - N.y, X = V.x - T.x, B = V.y - T.y, D = ee * ee + J * J, H = ee * B - J * X; if (Math.abs(H) > Number.EPSILON) { - const K = Math.sqrt(D), le = Math.sqrt(X * X + B * B), te = N.x - J / K, Ce = N.y + ee / K, be = V.x - B / le, Re = V.y + X / le, Ie = ((be - te) * B - (Re - Ce) * X) / (ee * B - J * X); - U = te + ee * Ie - C.x, k = Ce + J * Ie - C.y; + const K = Math.sqrt(D), le = Math.sqrt(X * X + B * B), te = N.x - J / K, Te = N.y + ee / K, ye = V.x - B / le, Re = V.y + X / le, Ie = ((ye - te) * B - (Re - Te) * X) / (ee * B - J * X); + U = te + ee * Ie - T.x, k = Te + J * Ie - T.y; const ue = U * U + k * k; if (ue <= 2) return new he(U, k); @@ -13848,12 +13828,12 @@ class ed extends mt { return new he(U / F, k / F); } const q = []; - for (let C = 0, N = z.length, V = N - 1, U = C + 1; C < N; C++, V++, U++) - V === N && (V = 0), U === N && (U = 0), q[C] = Y(z[C], z[V], z[U]); + for (let T = 0, N = z.length, V = N - 1, U = T + 1; T < N; T++, V++, U++) + V === N && (V = 0), U === N && (U = 0), q[T] = Y(z[T], z[V], z[U]); const ie = []; let W, $ = q.concat(); - for (let C = 0, N = w; C < N; C++) { - const V = L[C]; + for (let T = 0, N = w; T < N; T++) { + const V = L[T]; W = []; for (let U = 0, k = V.length, F = k - 1, ee = U + 1; U < k; U++, F++, ee++) F === k && (F = 0), ee === k && (ee = 0), W[U] = Y(V[U], V[F], V[ee]); @@ -13863,12 +13843,12 @@ class ed extends mt { if (x === 0) fe = Sr.triangulateShape(z, L); else { - const C = [], N = []; + const T = [], N = []; for (let V = 0; V < x; V++) { const U = V / x, k = d * Math.cos(U * Math.PI / 2), F = m * Math.sin(U * Math.PI / 2) + f; for (let ee = 0, J = z.length; ee < J; ee++) { const X = G(z[ee], q[ee], F); - ye(X.x, X.y, -k), U === 0 && C.push(X); + be(X.x, X.y, -k), U === 0 && T.push(X); } for (let ee = 0, J = w; ee < J; ee++) { const X = L[ee]; @@ -13876,41 +13856,41 @@ class ed extends mt { const B = []; for (let D = 0, H = X.length; D < H; D++) { const K = G(X[D], W[D], F); - ye(K.x, K.y, -k), U === 0 && B.push(K); + be(K.x, K.y, -k), U === 0 && B.push(K); } U === 0 && N.push(B); } } - fe = Sr.triangulateShape(C, N); + fe = Sr.triangulateShape(T, N); } const me = fe.length, de = m + f; - for (let C = 0; C < j; C++) { - const N = p ? G(E[C], $[C], de) : E[C]; - b ? (T.copy(_.normals[0]).multiplyScalar(N.x), M.copy(_.binormals[0]).multiplyScalar(N.y), R.copy(v[0]).add(T).add(M), ye(R.x, R.y, R.z)) : ye(N.x, N.y, 0); + for (let T = 0; T < j; T++) { + const N = p ? G(E[T], $[T], de) : E[T]; + y ? (C.copy(_.normals[0]).multiplyScalar(N.x), M.copy(_.binormals[0]).multiplyScalar(N.y), R.copy(v[0]).add(C).add(M), be(R.x, R.y, R.z)) : be(N.x, N.y, 0); } - for (let C = 1; C <= h; C++) + for (let T = 1; T <= h; T++) for (let N = 0; N < j; N++) { const V = p ? G(E[N], $[N], de) : E[N]; - b ? (T.copy(_.normals[C]).multiplyScalar(V.x), M.copy(_.binormals[C]).multiplyScalar(V.y), R.copy(v[C]).add(T).add(M), ye(R.x, R.y, R.z)) : ye(V.x, V.y, u / h * C); + y ? (C.copy(_.normals[T]).multiplyScalar(V.x), M.copy(_.binormals[T]).multiplyScalar(V.y), R.copy(v[T]).add(C).add(M), be(R.x, R.y, R.z)) : be(V.x, V.y, u / h * T); } - for (let C = x - 1; C >= 0; C--) { - const N = C / x, V = d * Math.cos(N * Math.PI / 2), U = m * Math.sin(N * Math.PI / 2) + f; + for (let T = x - 1; T >= 0; T--) { + const N = T / x, V = d * Math.cos(N * Math.PI / 2), U = m * Math.sin(N * Math.PI / 2) + f; for (let k = 0, F = z.length; k < F; k++) { const ee = G(z[k], q[k], U); - ye(ee.x, ee.y, u + V); + be(ee.x, ee.y, u + V); } for (let k = 0, F = L.length; k < F; k++) { const ee = L[k]; W = ie[k]; for (let J = 0, X = ee.length; J < X; J++) { const B = G(ee[J], W[J], U); - b ? ye(B.x, B.y + v[h - 1].y, v[h - 1].x + V) : ye(B.x, B.y, u + V); + y ? be(B.x, B.y + v[h - 1].y, v[h - 1].x + V) : be(B.x, B.y, u + V); } } } se(), ce(); function se() { - const C = i.length / 3; + const T = i.length / 3; if (p) { let N = 0, V = j * N; for (let U = 0; U < me; U++) { @@ -13932,48 +13912,48 @@ class ed extends mt { Se(V[0] + j * h, V[1] + j * h, V[2] + j * h); } } - n.addGroup(C, i.length / 3 - C, 0); + n.addGroup(T, i.length / 3 - T, 0); } function ce() { - const C = i.length / 3; + const T = i.length / 3; let N = 0; pe(z, N), N += z.length; for (let V = 0, U = L.length; V < U; V++) { const k = L[V]; pe(k, N), N += k.length; } - n.addGroup(C, i.length / 3 - C, 1); + n.addGroup(T, i.length / 3 - T, 1); } - function pe(C, N) { - let V = C.length; + function pe(T, N) { + let V = T.length; for (; --V >= 0; ) { const U = V; let k = V - 1; - k < 0 && (k = C.length - 1); + k < 0 && (k = T.length - 1); for (let F = 0, ee = h + x * 2; F < ee; F++) { const J = j * F, X = j * (F + 1), B = N + U + J, D = N + k + J, H = N + k + X, K = N + U + X; Be(B, D, H, K); } } } - function ye(C, N, V) { - l.push(C), l.push(N), l.push(V); + function be(T, N, V) { + l.push(T), l.push(N), l.push(V); } - function Se(C, N, V) { - $e(C), $e(N), $e(V); - const U = i.length / 3, k = y.generateTopUV(n, i, U - 3, U - 2, U - 1); + function Se(T, N, V) { + $e(T), $e(N), $e(V); + const U = i.length / 3, k = b.generateTopUV(n, i, U - 3, U - 2, U - 1); ke(k[0]), ke(k[1]), ke(k[2]); } - function Be(C, N, V, U) { - $e(C), $e(N), $e(U), $e(N), $e(V), $e(U); - const k = i.length / 3, F = y.generateSideWallUV(n, i, k - 6, k - 3, k - 2, k - 1); + function Be(T, N, V, U) { + $e(T), $e(N), $e(U), $e(N), $e(V), $e(U); + const k = i.length / 3, F = b.generateSideWallUV(n, i, k - 6, k - 3, k - 2, k - 1); ke(F[0]), ke(F[1]), ke(F[3]), ke(F[1]), ke(F[2]), ke(F[3]); } - function $e(C) { - i.push(l[C * 3 + 0]), i.push(l[C * 3 + 1]), i.push(l[C * 3 + 2]); + function $e(T) { + i.push(l[T * 3 + 0]), i.push(l[T * 3 + 1]), i.push(l[T * 3 + 2]); } - function ke(C) { - r.push(C.x), r.push(C.y); + function ke(T) { + r.push(T.x), r.push(T.y); } } } @@ -14054,16 +14034,16 @@ class Vs extends mt { }; const r = e / 2, a = t / 2, o = Math.floor(n), l = Math.floor(i), c = o + 1, h = l + 1, u = e / o, p = t / l, d = [], m = [], f = [], x = []; for (let g = 0; g < h; g++) { - const y = g * p - a; + const b = g * p - a; for (let v = 0; v < c; v++) { - const b = v * u - r; - m.push(b, -y, 0), f.push(0, 0, 1), x.push(v / o), x.push(1 - g / l); + const y = v * u - r; + m.push(y, -b, 0), f.push(0, 0, 1), x.push(v / o), x.push(1 - g / l); } } for (let g = 0; g < l; g++) - for (let y = 0; y < o; y++) { - const v = y + c * g, b = y + c * (g + 1), _ = y + 1 + c * (g + 1), M = y + 1 + c * g; - d.push(v, b, M), d.push(b, _, M); + for (let b = 0; b < o; b++) { + const v = b + c * g, y = b + c * (g + 1), _ = b + 1 + c * (g + 1), M = b + 1 + c * g; + d.push(v, y, M), d.push(y, _, M); } this.setIndex(d), this.setAttribute("position", new qt(m, 3)), this.setAttribute("normal", new qt(f, 3)), this.setAttribute("uv", new qt(x, 2)); } @@ -14107,19 +14087,19 @@ class td extends mt { let c = 0; const h = [], u = new P(), p = new P(), d = [], m = [], f = [], x = []; for (let g = 0; g <= n; g++) { - const y = [], v = g / n; - let b = 0; - g === 0 && a === 0 ? b = 0.5 / t : g === n && l === Math.PI && (b = -0.5 / t); + const b = [], v = g / n; + let y = 0; + g === 0 && a === 0 ? y = 0.5 / t : g === n && l === Math.PI && (y = -0.5 / t); for (let _ = 0; _ <= t; _++) { const M = _ / t; - u.x = -e * Math.cos(i + M * r) * Math.sin(a + v * o), u.y = e * Math.cos(a + v * o), u.z = e * Math.sin(i + M * r) * Math.sin(a + v * o), m.push(u.x, u.y, u.z), p.copy(u).normalize(), f.push(p.x, p.y, p.z), x.push(M + b, 1 - v), y.push(c++); + u.x = -e * Math.cos(i + M * r) * Math.sin(a + v * o), u.y = e * Math.cos(a + v * o), u.z = e * Math.sin(i + M * r) * Math.sin(a + v * o), m.push(u.x, u.y, u.z), p.copy(u).normalize(), f.push(p.x, p.y, p.z), x.push(M + y, 1 - v), b.push(c++); } - h.push(y); + h.push(b); } for (let g = 0; g < n; g++) - for (let y = 0; y < t; y++) { - const v = h[g][y + 1], b = h[g][y], _ = h[g + 1][y], M = h[g + 1][y + 1]; - (g !== 0 || a > 0) && d.push(v, b, M), (g !== n - 1 || l < Math.PI) && d.push(b, _, M); + for (let b = 0; b < t; b++) { + const v = h[g][b + 1], y = h[g][b], _ = h[g + 1][b], M = h[g + 1][b + 1]; + (g !== 0 || a > 0) && d.push(v, y, M), (g !== n - 1 || l < Math.PI) && d.push(y, _, M); } this.setIndex(d), this.setAttribute("position", new qt(m, 3)), this.setAttribute("normal", new qt(f, 3)), this.setAttribute("uv", new qt(x, 2)); } @@ -14545,9 +14525,9 @@ class q1 extends Ha { this._weightPrev = c / (t - o), this._weightNext = c / (l - n), this._offsetPrev = r * h, this._offsetNext = a * h; } interpolate_(e, t, n, i) { - const r = this.resultBuffer, a = this.sampleValues, o = this.valueSize, l = e * o, c = l - o, h = this._offsetPrev, u = this._offsetNext, p = this._weightPrev, d = this._weightNext, m = (n - t) / (i - t), f = m * m, x = f * m, g = -p * x + 2 * p * f - p * m, y = (1 + p) * x + (-1.5 - 2 * p) * f + (-0.5 + p) * m + 1, v = (-1 - d) * x + (1.5 + d) * f + 0.5 * m, b = d * x - d * f; + const r = this.resultBuffer, a = this.sampleValues, o = this.valueSize, l = e * o, c = l - o, h = this._offsetPrev, u = this._offsetNext, p = this._weightPrev, d = this._weightNext, m = (n - t) / (i - t), f = m * m, x = f * m, g = -p * x + 2 * p * f - p * m, b = (1 + p) * x + (-1.5 - 2 * p) * f + (-0.5 + p) * m + 1, v = (-1 - d) * x + (1.5 + d) * f + 0.5 * m, y = d * x - d * f; for (let _ = 0; _ !== o; ++_) - r[_] = g * a[h + _] + y * a[c + _] + v * a[l + _] + b * a[u + _]; + r[_] = g * a[h + _] + b * a[c + _] + v * a[l + _] + y * a[u + _]; return r; } } @@ -15144,7 +15124,7 @@ class K1 { d[p[m].morphTargets[f]] = -1; for (const f in d) { const x = [], g = []; - for (let y = 0; y !== p[m].morphTargets.length; ++y) { + for (let b = 0; b !== p[m].morphTargets.length; ++b) { const v = p[m]; x.push(v.time), g.push(v.morphTarget === f ? 1 : 0); } @@ -15546,19 +15526,19 @@ class Oa extends us { let f = 0; const x = new ReadableStream({ start(g) { - y(); - function y() { - u.read().then(({ done: v, value: b }) => { + b(); + function b() { + u.read().then(({ done: v, value: y }) => { if (v) g.close(); else { - f += b.byteLength; + f += y.byteLength; const _ = new ProgressEvent("progress", { lengthComputable: m, loaded: f, total: d }); - for (let M = 0, T = h.length; M < T; M++) { + for (let M = 0, C = h.length; M < C; M++) { const R = h[M]; R.onProgress && R.onProgress(_); } - g.enqueue(b), y(); + g.enqueue(y), b(); } }, (v) => { g.error(v); @@ -16300,8 +16280,8 @@ class p0 { } const sd = "\\[\\]\\.:\\/", dv = new RegExp("[" + sd + "]", "g"), rd = "[^" + sd + "]", pv = "[^" + sd.replace("\\.", "") + "]", fv = /* @__PURE__ */ /((?:WC+[\/:])*)/.source.replace("WC", rd), mv = /* @__PURE__ */ /(WCOD+)?/.source.replace("WCOD", pv), gv = /* @__PURE__ */ /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC", rd), xv = /* @__PURE__ */ /\.(WC+)(?:\[(.+)\])?/.source.replace("WC", rd), vv = new RegExp( "^" + fv + mv + gv + xv + "$" -), yv = ["material", "materials", "bones", "map"]; -class bv { +), bv = ["material", "materials", "bones", "map"]; +class yv { constructor(e, t, n) { const i = n || ut.parseTrackName(t); this._targetGroup = e, this._bindings = e.subscribe_(t, i); @@ -16393,7 +16373,7 @@ class ut { }, i = n.nodeName && n.nodeName.lastIndexOf("."); if (i !== void 0 && i !== -1) { const r = n.nodeName.substring(i + 1); - yv.indexOf(r) !== -1 && (n.nodeName = n.nodeName.substring(0, i), n.objectName = r); + bv.indexOf(r) !== -1 && (n.nodeName = n.nodeName.substring(0, i), n.objectName = r); } if (n.propertyName === null || n.propertyName.length === 0) throw new Error("PropertyBinding: can not parse propertyName from trackName: " + e); @@ -16605,7 +16585,7 @@ class ut { this.node = null, this.getValue = this._getValue_unbound, this.setValue = this._setValue_unbound; } } -ut.Composite = bv; +ut.Composite = yv; ut.prototype.BindingType = { Direct: 0, EntireArray: 1, @@ -16649,7 +16629,7 @@ ut.prototype.SetterByBindingTypeAndVersioning = [ ut.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate ] ]; -const Tp = /* @__PURE__ */ new De(); +const Cp = /* @__PURE__ */ new De(); class os { /** * Constructs a new raycaster. @@ -16694,7 +16674,7 @@ class os { * @return {Raycaster} A reference to this raycaster. */ setFromXRController(e) { - return Tp.identity().extractRotation(e.matrixWorld), this.ray.origin.setFromMatrixPosition(e.matrixWorld), this.ray.direction.set(0, 0, -1).applyMatrix4(Tp), this; + return Cp.identity().extractRotation(e.matrixWorld), this.ray.origin.setFromMatrixPosition(e.matrixWorld), this.ray.direction.set(0, 0, -1).applyMatrix4(Cp), this; } /** * The intersection point of a raycaster intersection test. @@ -16732,7 +16712,7 @@ class os { * @return {Array} An array holding the intersection points. */ intersectObject(e, t = !0, n = []) { - return pu(e, this, n, t), n.sort(Cp), n; + return pu(e, this, n, t), n.sort(Tp), n; } /** * Checks all intersection between the ray and the objects with or without @@ -16747,10 +16727,10 @@ class os { intersectObjects(e, t = !0, n = []) { for (let i = 0, r = e.length; i < r; i++) pu(e[i], this, n, t); - return n.sort(Cp), n; + return n.sort(Tp), n; } } -function Cp(s, e) { +function Tp(s, e) { return s.distance - e.distance; } function pu(s, e, t, n) { @@ -16831,7 +16811,7 @@ class fu { return new this.constructor().copy(this); } } -const Ap = /* @__PURE__ */ new P(), To = /* @__PURE__ */ new P(), dr = /* @__PURE__ */ new P(), pr = /* @__PURE__ */ new P(), Nc = /* @__PURE__ */ new P(), _v = /* @__PURE__ */ new P(), Mv = /* @__PURE__ */ new P(); +const Ap = /* @__PURE__ */ new P(), Co = /* @__PURE__ */ new P(), dr = /* @__PURE__ */ new P(), pr = /* @__PURE__ */ new P(), Nc = /* @__PURE__ */ new P(), _v = /* @__PURE__ */ new P(), Mv = /* @__PURE__ */ new P(); class Zn { /** * Constructs a new line segment. @@ -16913,9 +16893,9 @@ class Zn { * @return {number} The point parameter. */ closestPointToPointParameter(e, t) { - Ap.subVectors(e, this.start), To.subVectors(this.end, this.start); - const n = To.dot(To); - let r = To.dot(Ap) / n; + Ap.subVectors(e, this.start), Co.subVectors(this.end, this.start); + const n = Co.dot(Co); + let r = Co.dot(Ap) / n; return t && (r = qe(r, 0, 1)), r; } /** @@ -17258,9 +17238,9 @@ function Ev(s) { update: a }; } -var Tv = `#ifdef USE_ALPHAHASH +var Cv = `#ifdef USE_ALPHAHASH if ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard; -#endif`, Cv = `#ifdef USE_ALPHAHASH +#endif`, Tv = `#ifdef USE_ALPHAHASH const float ALPHA_HASH_SCALE = 0.05; float hash2D( vec2 value ) { return fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) ); @@ -17738,15 +17718,15 @@ transformedNormal = normalMatrix * transformedNormal; uniform float displacementBias; #endif`, Qv = `#ifdef USE_DISPLACEMENTMAP transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias ); -#endif`, ey = `#ifdef USE_EMISSIVEMAP +#endif`, eb = `#ifdef USE_EMISSIVEMAP vec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv ); #ifdef DECODE_VIDEO_TEXTURE_EMISSIVE emissiveColor = sRGBTransferEOTF( emissiveColor ); #endif totalEmissiveRadiance *= emissiveColor.rgb; -#endif`, ty = `#ifdef USE_EMISSIVEMAP +#endif`, tb = `#ifdef USE_EMISSIVEMAP uniform sampler2D emissiveMap; -#endif`, ny = "gl_FragColor = linearToOutputTexel( gl_FragColor );", iy = `vec4 LinearTransferOETF( in vec4 value ) { +#endif`, nb = "gl_FragColor = linearToOutputTexel( gl_FragColor );", ib = `vec4 LinearTransferOETF( in vec4 value ) { return value; } vec4 sRGBTransferEOTF( in vec4 value ) { @@ -17754,7 +17734,7 @@ vec4 sRGBTransferEOTF( in vec4 value ) { } vec4 sRGBTransferOETF( in vec4 value ) { return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a ); -}`, sy = `#ifdef USE_ENVMAP +}`, sb = `#ifdef USE_ENVMAP #ifdef ENV_WORLDPOS vec3 cameraToFrag; if ( isOrthographic ) { @@ -17783,7 +17763,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { #elif defined( ENVMAP_BLENDING_ADD ) outgoingLight += envColor.xyz * specularStrength * reflectivity; #endif -#endif`, ry = `#ifdef USE_ENVMAP +#endif`, rb = `#ifdef USE_ENVMAP uniform float envMapIntensity; uniform float flipEnvMap; uniform mat3 envMapRotation; @@ -17792,7 +17772,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { #else uniform sampler2D envMap; #endif -#endif`, ay = `#ifdef USE_ENVMAP +#endif`, ab = `#ifdef USE_ENVMAP uniform float reflectivity; #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) #define ENV_WORLDPOS @@ -17803,7 +17783,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { #else varying vec3 vReflect; #endif -#endif`, oy = `#ifdef USE_ENVMAP +#endif`, ob = `#ifdef USE_ENVMAP #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) #define ENV_WORLDPOS #endif @@ -17814,7 +17794,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { varying vec3 vReflect; uniform float refractionRatio; #endif -#endif`, ly = `#ifdef USE_ENVMAP +#endif`, lb = `#ifdef USE_ENVMAP #ifdef ENV_WORLDPOS vWorldPosition = worldPosition.xyz; #else @@ -17831,18 +17811,18 @@ vec4 sRGBTransferOETF( in vec4 value ) { vReflect = refract( cameraToVertex, worldNormal, refractionRatio ); #endif #endif -#endif`, cy = `#ifdef USE_FOG +#endif`, cb = `#ifdef USE_FOG vFogDepth = - mvPosition.z; -#endif`, hy = `#ifdef USE_FOG +#endif`, hb = `#ifdef USE_FOG varying float vFogDepth; -#endif`, uy = `#ifdef USE_FOG +#endif`, ub = `#ifdef USE_FOG #ifdef FOG_EXP2 float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth ); #else float fogFactor = smoothstep( fogNear, fogFar, vFogDepth ); #endif gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); -#endif`, dy = `#ifdef USE_FOG +#endif`, db = `#ifdef USE_FOG uniform vec3 fogColor; varying float vFogDepth; #ifdef FOG_EXP2 @@ -17851,7 +17831,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { uniform float fogNear; uniform float fogFar; #endif -#endif`, py = `#ifdef USE_GRADIENTMAP +#endif`, pb = `#ifdef USE_GRADIENTMAP uniform sampler2D gradientMap; #endif vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { @@ -17863,12 +17843,12 @@ vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { vec2 fw = fwidth( coord ) * 0.5; return mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) ); #endif -}`, fy = `#ifdef USE_LIGHTMAP +}`, fb = `#ifdef USE_LIGHTMAP uniform sampler2D lightMap; uniform float lightMapIntensity; -#endif`, my = `LambertMaterial material; +#endif`, mb = `LambertMaterial material; material.diffuseColor = diffuseColor.rgb; -material.specularStrength = specularStrength;`, gy = `varying vec3 vViewPosition; +material.specularStrength = specularStrength;`, gb = `varying vec3 vViewPosition; struct LambertMaterial { vec3 diffuseColor; float specularStrength; @@ -17882,7 +17862,7 @@ void RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometr reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_Lambert -#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`, xy = `uniform bool receiveShadow; +#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`, xb = `uniform bool receiveShadow; uniform vec3 ambientLightColor; #if defined( USE_LIGHT_PROBES ) uniform vec3 lightProbe[ 9 ]; @@ -17998,7 +17978,7 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight ); return irradiance; } -#endif`, vy = `#ifdef USE_ENVMAP +#endif`, vb = `#ifdef USE_ENVMAP vec3 getIBLIrradiance( const in vec3 normal ) { #ifdef ENVMAP_TYPE_CUBE_UV vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); @@ -18031,8 +18011,8 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi #endif } #endif -#endif`, yy = `ToonMaterial material; -material.diffuseColor = diffuseColor.rgb;`, by = `varying vec3 vViewPosition; +#endif`, bb = `ToonMaterial material; +material.diffuseColor = diffuseColor.rgb;`, yb = `varying vec3 vViewPosition; struct ToonMaterial { vec3 diffuseColor; }; @@ -18044,11 +18024,11 @@ void RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPo reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_Toon -#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`, _y = `BlinnPhongMaterial material; +#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`, _b = `BlinnPhongMaterial material; material.diffuseColor = diffuseColor.rgb; material.specularColor = specular; material.specularShininess = shininess; -material.specularStrength = specularStrength;`, My = `varying vec3 vViewPosition; +material.specularStrength = specularStrength;`, Mb = `varying vec3 vViewPosition; struct BlinnPhongMaterial { vec3 diffuseColor; vec3 specularColor; @@ -18065,7 +18045,7 @@ void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geom reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_BlinnPhong -#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`, wy = `PhysicalMaterial material; +#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`, wb = `PhysicalMaterial material; material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor ); vec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) ); float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z ); @@ -18151,7 +18131,7 @@ material.roughness = min( material.roughness, 1.0 ); material.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) ); material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y; material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y; -#endif`, Sy = `uniform sampler2D dfgLUT; +#endif`, Sb = `uniform sampler2D dfgLUT; struct PhysicalMaterial { vec3 diffuseColor; float roughness; @@ -18467,7 +18447,7 @@ void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradia #define RE_IndirectSpecular RE_IndirectSpecular_Physical float computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) { return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion ); -}`, Ey = ` +}`, Eb = ` vec3 geometryPosition = - vViewPosition; vec3 geometryNormal = normal; vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition ); @@ -18582,7 +18562,7 @@ IncidentLight directLight; #if defined( RE_IndirectSpecular ) vec3 radiance = vec3( 0.0 ); vec3 clearcoatRadiance = vec3( 0.0 ); -#endif`, Ty = `#if defined( RE_IndirectDiffuse ) +#endif`, Cb = `#if defined( RE_IndirectDiffuse ) #ifdef USE_LIGHTMAP vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity; @@ -18601,32 +18581,32 @@ IncidentLight directLight; #ifdef USE_CLEARCOAT clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness ); #endif -#endif`, Cy = `#if defined( RE_IndirectDiffuse ) +#endif`, Tb = `#if defined( RE_IndirectDiffuse ) RE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); #endif #if defined( RE_IndirectSpecular ) RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); -#endif`, Ay = `#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) +#endif`, Ab = `#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; -#endif`, Py = `#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) +#endif`, Pb = `#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) uniform float logDepthBufFC; varying float vFragDepth; varying float vIsPerspective; -#endif`, Ry = `#ifdef USE_LOGARITHMIC_DEPTH_BUFFER +#endif`, Rb = `#ifdef USE_LOGARITHMIC_DEPTH_BUFFER varying float vFragDepth; varying float vIsPerspective; -#endif`, Ly = `#ifdef USE_LOGARITHMIC_DEPTH_BUFFER +#endif`, Lb = `#ifdef USE_LOGARITHMIC_DEPTH_BUFFER vFragDepth = 1.0 + gl_Position.w; vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) ); -#endif`, Dy = `#ifdef USE_MAP +#endif`, Db = `#ifdef USE_MAP vec4 sampledDiffuseColor = texture2D( map, vMapUv ); #ifdef DECODE_VIDEO_TEXTURE sampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor ); #endif diffuseColor *= sampledDiffuseColor; -#endif`, Iy = `#ifdef USE_MAP +#endif`, Ib = `#ifdef USE_MAP uniform sampler2D map; -#endif`, Ny = `#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) +#endif`, Nb = `#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) #if defined( USE_POINTS_UV ) vec2 uv = vUv; #else @@ -18638,7 +18618,7 @@ IncidentLight directLight; #endif #ifdef USE_ALPHAMAP diffuseColor.a *= texture2D( alphaMap, uv ).g; -#endif`, By = `#if defined( USE_POINTS_UV ) +#endif`, Bb = `#if defined( USE_POINTS_UV ) varying vec2 vUv; #else #if defined( USE_MAP ) || defined( USE_ALPHAMAP ) @@ -18650,19 +18630,19 @@ IncidentLight directLight; #endif #ifdef USE_ALPHAMAP uniform sampler2D alphaMap; -#endif`, ky = `float metalnessFactor = metalness; +#endif`, kb = `float metalnessFactor = metalness; #ifdef USE_METALNESSMAP vec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv ); metalnessFactor *= texelMetalness.b; -#endif`, Uy = `#ifdef USE_METALNESSMAP +#endif`, Ub = `#ifdef USE_METALNESSMAP uniform sampler2D metalnessMap; -#endif`, Oy = `#ifdef USE_INSTANCING_MORPH +#endif`, Ob = `#ifdef USE_INSTANCING_MORPH float morphTargetInfluences[ MORPHTARGETS_COUNT ]; float morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { morphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r; } -#endif`, zy = `#if defined( USE_MORPHCOLORS ) +#endif`, zb = `#if defined( USE_MORPHCOLORS ) vColor *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { #if defined( USE_COLOR_ALPHA ) @@ -18671,12 +18651,12 @@ IncidentLight directLight; if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ]; #endif } -#endif`, Fy = `#ifdef USE_MORPHNORMALS +#endif`, Fb = `#ifdef USE_MORPHNORMALS objectNormal *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ]; } -#endif`, Hy = `#ifdef USE_MORPHTARGETS +#endif`, Hb = `#ifdef USE_MORPHTARGETS #ifndef USE_INSTANCING_MORPH uniform float morphTargetBaseInfluence; uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ]; @@ -18690,12 +18670,12 @@ IncidentLight directLight; ivec3 morphUV = ivec3( x, y, morphTargetIndex ); return texelFetch( morphTargetsTexture, morphUV, 0 ); } -#endif`, Vy = `#ifdef USE_MORPHTARGETS +#endif`, Vb = `#ifdef USE_MORPHTARGETS transformed *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ]; } -#endif`, Gy = `float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; +#endif`, Gb = `float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; #ifdef FLAT_SHADED vec3 fdx = dFdx( vViewPosition ); vec3 fdy = dFdy( vViewPosition ); @@ -18736,7 +18716,7 @@ IncidentLight directLight; tbn2[1] *= faceDirection; #endif #endif -vec3 nonPerturbedNormal = normal;`, Wy = `#ifdef USE_NORMALMAP_OBJECTSPACE +vec3 nonPerturbedNormal = normal;`, Wb = `#ifdef USE_NORMALMAP_OBJECTSPACE normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; #ifdef FLIP_SIDED normal = - normal; @@ -18751,25 +18731,25 @@ vec3 nonPerturbedNormal = normal;`, Wy = `#ifdef USE_NORMALMAP_OBJECTSPACE normal = normalize( tbn * mapN ); #elif defined( USE_BUMPMAP ) normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection ); -#endif`, Xy = `#ifndef FLAT_SHADED +#endif`, Xb = `#ifndef FLAT_SHADED varying vec3 vNormal; #ifdef USE_TANGENT varying vec3 vTangent; varying vec3 vBitangent; #endif -#endif`, jy = `#ifndef FLAT_SHADED +#endif`, jb = `#ifndef FLAT_SHADED varying vec3 vNormal; #ifdef USE_TANGENT varying vec3 vTangent; varying vec3 vBitangent; #endif -#endif`, qy = `#ifndef FLAT_SHADED +#endif`, qb = `#ifndef FLAT_SHADED vNormal = normalize( transformedNormal ); #ifdef USE_TANGENT vTangent = normalize( transformedTangent ); vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w ); #endif -#endif`, Zy = `#ifdef USE_NORMALMAP +#endif`, Zb = `#ifdef USE_NORMALMAP uniform sampler2D normalMap; uniform vec2 normalScale; #endif @@ -18791,13 +18771,13 @@ vec3 nonPerturbedNormal = normal;`, Wy = `#ifdef USE_NORMALMAP_OBJECTSPACE float scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det ); return mat3( T * scale, B * scale, N ); } -#endif`, Yy = `#ifdef USE_CLEARCOAT +#endif`, Yb = `#ifdef USE_CLEARCOAT vec3 clearcoatNormal = nonPerturbedNormal; -#endif`, $y = `#ifdef USE_CLEARCOAT_NORMALMAP +#endif`, $b = `#ifdef USE_CLEARCOAT_NORMALMAP vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0; clearcoatMapN.xy *= clearcoatNormalScale; clearcoatNormal = normalize( tbn2 * clearcoatMapN ); -#endif`, Ky = `#ifdef USE_CLEARCOATMAP +#endif`, Kb = `#ifdef USE_CLEARCOATMAP uniform sampler2D clearcoatMap; #endif #ifdef USE_CLEARCOAT_NORMALMAP @@ -18806,18 +18786,18 @@ vec3 nonPerturbedNormal = normal;`, Wy = `#ifdef USE_NORMALMAP_OBJECTSPACE #endif #ifdef USE_CLEARCOAT_ROUGHNESSMAP uniform sampler2D clearcoatRoughnessMap; -#endif`, Jy = `#ifdef USE_IRIDESCENCEMAP +#endif`, Jb = `#ifdef USE_IRIDESCENCEMAP uniform sampler2D iridescenceMap; #endif #ifdef USE_IRIDESCENCE_THICKNESSMAP uniform sampler2D iridescenceThicknessMap; -#endif`, Qy = `#ifdef OPAQUE +#endif`, Qb = `#ifdef OPAQUE diffuseColor.a = 1.0; #endif #ifdef USE_TRANSMISSION diffuseColor.a *= material.transmissionAlpha; #endif -gl_FragColor = vec4( outgoingLight, diffuseColor.a );`, eb = `vec3 packNormalToRGB( const in vec3 normal ) { +gl_FragColor = vec4( outgoingLight, diffuseColor.a );`, ey = `vec3 packNormalToRGB( const in vec3 normal ) { return normalize( normal ) * 0.5 + 0.5; } vec3 unpackRGBToNormal( const in vec3 rgb ) { @@ -18886,9 +18866,9 @@ float viewZToPerspectiveDepth( const in float viewZ, const in float near, const } float perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) { return ( near * far ) / ( ( far - near ) * depth - far ); -}`, tb = `#ifdef PREMULTIPLIED_ALPHA +}`, ty = `#ifdef PREMULTIPLIED_ALPHA gl_FragColor.rgb *= gl_FragColor.a; -#endif`, nb = `vec4 mvPosition = vec4( transformed, 1.0 ); +#endif`, ny = `vec4 mvPosition = vec4( transformed, 1.0 ); #ifdef USE_BATCHING mvPosition = batchingMatrix * mvPosition; #endif @@ -18896,22 +18876,22 @@ float perspectiveDepthToViewZ( const in float depth, const in float near, const mvPosition = instanceMatrix * mvPosition; #endif mvPosition = modelViewMatrix * mvPosition; -gl_Position = projectionMatrix * mvPosition;`, ib = `#ifdef DITHERING +gl_Position = projectionMatrix * mvPosition;`, iy = `#ifdef DITHERING gl_FragColor.rgb = dithering( gl_FragColor.rgb ); -#endif`, sb = `#ifdef DITHERING +#endif`, sy = `#ifdef DITHERING vec3 dithering( vec3 color ) { float grid_position = rand( gl_FragCoord.xy ); vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); return color + dither_shift_RGB; } -#endif`, rb = `float roughnessFactor = roughness; +#endif`, ry = `float roughnessFactor = roughness; #ifdef USE_ROUGHNESSMAP vec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv ); roughnessFactor *= texelRoughness.g; -#endif`, ab = `#ifdef USE_ROUGHNESSMAP +#endif`, ay = `#ifdef USE_ROUGHNESSMAP uniform sampler2D roughnessMap; -#endif`, ob = `#if NUM_SPOT_LIGHT_COORDS > 0 +#endif`, oy = `#if NUM_SPOT_LIGHT_COORDS > 0 varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; #endif #if NUM_SPOT_LIGHT_MAPS > 0 @@ -19106,7 +19086,7 @@ gl_Position = projectionMatrix * mvPosition;`, ib = `#ifdef DITHERING } return mix( 1.0, shadow, shadowIntensity ); } -#endif`, lb = `#if NUM_SPOT_LIGHT_COORDS > 0 +#endif`, ly = `#if NUM_SPOT_LIGHT_COORDS > 0 uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ]; varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; #endif @@ -19147,7 +19127,7 @@ gl_Position = projectionMatrix * mvPosition;`, ib = `#ifdef DITHERING }; uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; #endif -#endif`, cb = `#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) +#endif`, cy = `#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); vec4 shadowWorldPosition; #endif @@ -19179,7 +19159,7 @@ gl_Position = projectionMatrix * mvPosition;`, ib = `#ifdef DITHERING vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition; } #pragma unroll_loop_end -#endif`, hb = `float getShadowMask() { +#endif`, hy = `float getShadowMask() { float shadow = 1.0; #ifdef USE_SHADOWMAP #if NUM_DIR_LIGHT_SHADOWS > 0 @@ -19211,12 +19191,12 @@ gl_Position = projectionMatrix * mvPosition;`, ib = `#ifdef DITHERING #endif #endif return shadow; -}`, ub = `#ifdef USE_SKINNING +}`, uy = `#ifdef USE_SKINNING mat4 boneMatX = getBoneMatrix( skinIndex.x ); mat4 boneMatY = getBoneMatrix( skinIndex.y ); mat4 boneMatZ = getBoneMatrix( skinIndex.z ); mat4 boneMatW = getBoneMatrix( skinIndex.w ); -#endif`, db = `#ifdef USE_SKINNING +#endif`, dy = `#ifdef USE_SKINNING uniform mat4 bindMatrix; uniform mat4 bindMatrixInverse; uniform highp sampler2D boneTexture; @@ -19231,7 +19211,7 @@ gl_Position = projectionMatrix * mvPosition;`, ib = `#ifdef DITHERING vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 ); return mat4( v1, v2, v3, v4 ); } -#endif`, pb = `#ifdef USE_SKINNING +#endif`, py = `#ifdef USE_SKINNING vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 ); vec4 skinned = vec4( 0.0 ); skinned += boneMatX * skinVertex * skinWeight.x; @@ -19239,7 +19219,7 @@ gl_Position = projectionMatrix * mvPosition;`, ib = `#ifdef DITHERING skinned += boneMatZ * skinVertex * skinWeight.z; skinned += boneMatW * skinVertex * skinWeight.w; transformed = ( bindMatrixInverse * skinned ).xyz; -#endif`, fb = `#ifdef USE_SKINNING +#endif`, fy = `#ifdef USE_SKINNING mat4 skinMatrix = mat4( 0.0 ); skinMatrix += skinWeight.x * boneMatX; skinMatrix += skinWeight.y * boneMatY; @@ -19250,17 +19230,17 @@ gl_Position = projectionMatrix * mvPosition;`, ib = `#ifdef DITHERING #ifdef USE_TANGENT objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz; #endif -#endif`, mb = `float specularStrength; +#endif`, my = `float specularStrength; #ifdef USE_SPECULARMAP vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv ); specularStrength = texelSpecular.r; #else specularStrength = 1.0; -#endif`, gb = `#ifdef USE_SPECULARMAP +#endif`, gy = `#ifdef USE_SPECULARMAP uniform sampler2D specularMap; -#endif`, xb = `#if defined( TONE_MAPPING ) +#endif`, xy = `#if defined( TONE_MAPPING ) gl_FragColor.rgb = toneMapping( gl_FragColor.rgb ); -#endif`, vb = `#ifndef saturate +#endif`, vy = `#ifndef saturate #define saturate( a ) clamp( a, 0.0, 1.0 ) #endif uniform float toneMappingExposure; @@ -19357,7 +19337,7 @@ vec3 NeutralToneMapping( vec3 color ) { float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. ); return mix( color, vec3( newPeak ), g ); } -vec3 CustomToneMapping( vec3 color ) { return color; }`, yb = `#ifdef USE_TRANSMISSION +vec3 CustomToneMapping( vec3 color ) { return color; }`, by = `#ifdef USE_TRANSMISSION material.transmission = transmission; material.transmissionAlpha = 1.0; material.thickness = thickness; @@ -19378,7 +19358,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`, yb = `#ifdef USE_TRANSM material.attenuationColor, material.attenuationDistance ); material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission ); totalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission ); -#endif`, bb = `#ifdef USE_TRANSMISSION +#endif`, yy = `#ifdef USE_TRANSMISSION uniform float transmission; uniform float thickness; uniform float attenuationDistance; @@ -19504,7 +19484,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`, yb = `#ifdef USE_TRANSM float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0; return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); } -#endif`, _b = `#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`, _y = `#if defined( USE_UV ) || defined( USE_ANISOTROPY ) varying vec2 vUv; #endif #ifdef USE_MAP @@ -19574,7 +19554,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`, yb = `#ifdef USE_TRANSM #ifdef USE_THICKNESSMAP uniform mat3 thicknessMapTransform; varying vec2 vThicknessMapUv; -#endif`, Mb = `#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`, My = `#if defined( USE_UV ) || defined( USE_ANISOTROPY ) varying vec2 vUv; #endif #ifdef USE_MAP @@ -19668,7 +19648,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`, yb = `#ifdef USE_TRANSM #ifdef USE_THICKNESSMAP uniform mat3 thicknessMapTransform; varying vec2 vThicknessMapUv; -#endif`, wb = `#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`, wy = `#if defined( USE_UV ) || defined( USE_ANISOTROPY ) vUv = vec3( uv, 1 ).xy; #endif #ifdef USE_MAP @@ -19739,7 +19719,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`, yb = `#ifdef USE_TRANSM #endif #ifdef USE_THICKNESSMAP vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy; -#endif`, Sb = `#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 +#endif`, Sy = `#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 vec4 worldPosition = vec4( transformed, 1.0 ); #ifdef USE_BATCHING worldPosition = batchingMatrix * worldPosition; @@ -19749,12 +19729,12 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`, yb = `#ifdef USE_TRANSM #endif worldPosition = modelMatrix * worldPosition; #endif`; -const Eb = `varying vec2 vUv; +const Ey = `varying vec2 vUv; uniform mat3 uvTransform; void main() { vUv = ( uvTransform * vec3( uv, 1 ) ).xy; gl_Position = vec4( position.xy, 1.0, 1.0 ); -}`, Tb = `uniform sampler2D t2D; +}`, Cy = `uniform sampler2D t2D; uniform float backgroundIntensity; varying vec2 vUv; void main() { @@ -19766,14 +19746,14 @@ void main() { gl_FragColor = texColor; #include #include -}`, Cb = `varying vec3 vWorldDirection; +}`, Ty = `varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include gl_Position.z = gl_Position.w; -}`, Ab = `#ifdef ENVMAP_TYPE_CUBE +}`, Ay = `#ifdef ENVMAP_TYPE_CUBE uniform samplerCube envMap; #elif defined( ENVMAP_TYPE_CUBE_UV ) uniform sampler2D envMap; @@ -19796,14 +19776,14 @@ void main() { gl_FragColor = texColor; #include #include -}`, Pb = `varying vec3 vWorldDirection; +}`, Py = `varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include gl_Position.z = gl_Position.w; -}`, Rb = `uniform samplerCube tCube; +}`, Ry = `uniform samplerCube tCube; uniform float tFlip; uniform float opacity; varying vec3 vWorldDirection; @@ -19813,7 +19793,7 @@ void main() { gl_FragColor.a *= opacity; #include #include -}`, Lb = `#include +}`, Ly = `#include #include #include #include @@ -19840,7 +19820,7 @@ void main() { #include #include vHighPrecisionZW = gl_Position.zw; -}`, Db = `#if DEPTH_PACKING == 3200 +}`, Dy = `#if DEPTH_PACKING == 3200 uniform float opacity; #endif #include @@ -19878,7 +19858,7 @@ void main() { #elif DEPTH_PACKING == 3203 gl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 ); #endif -}`, Ib = `#define DISTANCE +}`, Iy = `#define DISTANCE varying vec3 vWorldPosition; #include #include @@ -19905,7 +19885,7 @@ void main() { #include #include vWorldPosition = worldPosition.xyz; -}`, Nb = `#define DISTANCE +}`, Ny = `#define DISTANCE uniform vec3 referencePosition; uniform float nearDistance; uniform float farDistance; @@ -19929,13 +19909,13 @@ void main () { dist = ( dist - nearDistance ) / ( farDistance - nearDistance ); dist = saturate( dist ); gl_FragColor = packDepthToRGBA( dist ); -}`, Bb = `varying vec3 vWorldDirection; +}`, By = `varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include -}`, kb = `uniform sampler2D tEquirect; +}`, ky = `uniform sampler2D tEquirect; varying vec3 vWorldDirection; #include void main() { @@ -19944,7 +19924,7 @@ void main() { gl_FragColor = texture2D( tEquirect, sampleUV ); #include #include -}`, Ub = `uniform float scale; +}`, Uy = `uniform float scale; attribute float lineDistance; varying float vLineDistance; #include @@ -19966,7 +19946,7 @@ void main() { #include #include #include -}`, Ob = `uniform vec3 diffuse; +}`, Oy = `uniform vec3 diffuse; uniform float opacity; uniform float dashSize; uniform float totalSize; @@ -19994,7 +19974,7 @@ void main() { #include #include #include -}`, zb = `#include +}`, zy = `#include #include #include #include @@ -20026,7 +20006,7 @@ void main() { #include #include #include -}`, Fb = `uniform vec3 diffuse; +}`, Fy = `uniform vec3 diffuse; uniform float opacity; #ifndef FLAT_SHADED varying vec3 vNormal; @@ -20074,7 +20054,7 @@ void main() { #include #include #include -}`, Hb = `#define LAMBERT +}`, Hy = `#define LAMBERT varying vec3 vViewPosition; #include #include @@ -20113,7 +20093,7 @@ void main() { #include #include #include -}`, Vb = `#define LAMBERT +}`, Vy = `#define LAMBERT uniform vec3 diffuse; uniform vec3 emissive; uniform float opacity; @@ -20170,7 +20150,7 @@ void main() { #include #include #include -}`, Gb = `#define MATCAP +}`, Gy = `#define MATCAP varying vec3 vViewPosition; #include #include @@ -20204,7 +20184,7 @@ void main() { #include #include vViewPosition = - mvPosition.xyz; -}`, Wb = `#define MATCAP +}`, Wy = `#define MATCAP uniform vec3 diffuse; uniform float opacity; uniform sampler2D matcap; @@ -20250,7 +20230,7 @@ void main() { #include #include #include -}`, Xb = `#define NORMAL +}`, Xy = `#define NORMAL #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) varying vec3 vViewPosition; #endif @@ -20283,7 +20263,7 @@ void main() { #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) vViewPosition = - mvPosition.xyz; #endif -}`, jb = `#define NORMAL +}`, jy = `#define NORMAL uniform float opacity; #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) varying vec3 vViewPosition; @@ -20305,7 +20285,7 @@ void main() { #ifdef OPAQUE gl_FragColor.a = 1.0; #endif -}`, qb = `#define PHONG +}`, qy = `#define PHONG varying vec3 vViewPosition; #include #include @@ -20344,7 +20324,7 @@ void main() { #include #include #include -}`, Zb = `#define PHONG +}`, Zy = `#define PHONG uniform vec3 diffuse; uniform vec3 emissive; uniform vec3 specular; @@ -20403,7 +20383,7 @@ void main() { #include #include #include -}`, Yb = `#define STANDARD +}`, Yy = `#define STANDARD varying vec3 vViewPosition; #ifdef USE_TRANSMISSION varying vec3 vWorldPosition; @@ -20446,7 +20426,7 @@ void main() { #ifdef USE_TRANSMISSION vWorldPosition = worldPosition.xyz; #endif -}`, $b = `#define STANDARD +}`, $y = `#define STANDARD #ifdef PHYSICAL #define IOR #define USE_SPECULAR @@ -20571,7 +20551,7 @@ void main() { #include #include #include -}`, Kb = `#define TOON +}`, Ky = `#define TOON varying vec3 vViewPosition; #include #include @@ -20608,7 +20588,7 @@ void main() { #include #include #include -}`, Jb = `#define TOON +}`, Jy = `#define TOON uniform vec3 diffuse; uniform vec3 emissive; uniform float opacity; @@ -20661,7 +20641,7 @@ void main() { #include #include #include -}`, Qb = `uniform float size; +}`, Qy = `uniform float size; uniform float scale; #include #include @@ -20806,8 +20786,8 @@ void main() { #include #include }`, Qe = { - alphahash_fragment: Tv, - alphahash_pars_fragment: Cv, + alphahash_fragment: Cv, + alphahash_pars_fragment: Tv, alphamap_fragment: Av, alphamap_pars_fragment: Pv, alphatest_fragment: Rv, @@ -20834,114 +20814,114 @@ void main() { defaultnormal_vertex: Kv, displacementmap_pars_vertex: Jv, displacementmap_vertex: Qv, - emissivemap_fragment: ey, - emissivemap_pars_fragment: ty, - colorspace_fragment: ny, - colorspace_pars_fragment: iy, - envmap_fragment: sy, - envmap_common_pars_fragment: ry, - envmap_pars_fragment: ay, - envmap_pars_vertex: oy, - envmap_physical_pars_fragment: vy, - envmap_vertex: ly, - fog_vertex: cy, - fog_pars_vertex: hy, - fog_fragment: uy, - fog_pars_fragment: dy, - gradientmap_pars_fragment: py, - lightmap_pars_fragment: fy, - lights_lambert_fragment: my, - lights_lambert_pars_fragment: gy, - lights_pars_begin: xy, - lights_toon_fragment: yy, - lights_toon_pars_fragment: by, - lights_phong_fragment: _y, - lights_phong_pars_fragment: My, - lights_physical_fragment: wy, - lights_physical_pars_fragment: Sy, - lights_fragment_begin: Ey, - lights_fragment_maps: Ty, - lights_fragment_end: Cy, - logdepthbuf_fragment: Ay, - logdepthbuf_pars_fragment: Py, - logdepthbuf_pars_vertex: Ry, - logdepthbuf_vertex: Ly, - map_fragment: Dy, - map_pars_fragment: Iy, - map_particle_fragment: Ny, - map_particle_pars_fragment: By, - metalnessmap_fragment: ky, - metalnessmap_pars_fragment: Uy, - morphinstance_vertex: Oy, - morphcolor_vertex: zy, - morphnormal_vertex: Fy, - morphtarget_pars_vertex: Hy, - morphtarget_vertex: Vy, - normal_fragment_begin: Gy, - normal_fragment_maps: Wy, - normal_pars_fragment: Xy, - normal_pars_vertex: jy, - normal_vertex: qy, - normalmap_pars_fragment: Zy, - clearcoat_normal_fragment_begin: Yy, - clearcoat_normal_fragment_maps: $y, - clearcoat_pars_fragment: Ky, - iridescence_pars_fragment: Jy, - opaque_fragment: Qy, - packing: eb, - premultiplied_alpha_fragment: tb, - project_vertex: nb, - dithering_fragment: ib, - dithering_pars_fragment: sb, - roughnessmap_fragment: rb, - roughnessmap_pars_fragment: ab, - shadowmap_pars_fragment: ob, - shadowmap_pars_vertex: lb, - shadowmap_vertex: cb, - shadowmask_pars_fragment: hb, - skinbase_vertex: ub, - skinning_pars_vertex: db, - skinning_vertex: pb, - skinnormal_vertex: fb, - specularmap_fragment: mb, - specularmap_pars_fragment: gb, - tonemapping_fragment: xb, - tonemapping_pars_fragment: vb, - transmission_fragment: yb, - transmission_pars_fragment: bb, - uv_pars_fragment: _b, - uv_pars_vertex: Mb, - uv_vertex: wb, - worldpos_vertex: Sb, - background_vert: Eb, - background_frag: Tb, - backgroundCube_vert: Cb, - backgroundCube_frag: Ab, - cube_vert: Pb, - cube_frag: Rb, - depth_vert: Lb, - depth_frag: Db, - distanceRGBA_vert: Ib, - distanceRGBA_frag: Nb, - equirect_vert: Bb, - equirect_frag: kb, - linedashed_vert: Ub, - linedashed_frag: Ob, - meshbasic_vert: zb, - meshbasic_frag: Fb, - meshlambert_vert: Hb, - meshlambert_frag: Vb, - meshmatcap_vert: Gb, - meshmatcap_frag: Wb, - meshnormal_vert: Xb, - meshnormal_frag: jb, - meshphong_vert: qb, - meshphong_frag: Zb, - meshphysical_vert: Yb, - meshphysical_frag: $b, - meshtoon_vert: Kb, - meshtoon_frag: Jb, - points_vert: Qb, + emissivemap_fragment: eb, + emissivemap_pars_fragment: tb, + colorspace_fragment: nb, + colorspace_pars_fragment: ib, + envmap_fragment: sb, + envmap_common_pars_fragment: rb, + envmap_pars_fragment: ab, + envmap_pars_vertex: ob, + envmap_physical_pars_fragment: vb, + envmap_vertex: lb, + fog_vertex: cb, + fog_pars_vertex: hb, + fog_fragment: ub, + fog_pars_fragment: db, + gradientmap_pars_fragment: pb, + lightmap_pars_fragment: fb, + lights_lambert_fragment: mb, + lights_lambert_pars_fragment: gb, + lights_pars_begin: xb, + lights_toon_fragment: bb, + lights_toon_pars_fragment: yb, + lights_phong_fragment: _b, + lights_phong_pars_fragment: Mb, + lights_physical_fragment: wb, + lights_physical_pars_fragment: Sb, + lights_fragment_begin: Eb, + lights_fragment_maps: Cb, + lights_fragment_end: Tb, + logdepthbuf_fragment: Ab, + logdepthbuf_pars_fragment: Pb, + logdepthbuf_pars_vertex: Rb, + logdepthbuf_vertex: Lb, + map_fragment: Db, + map_pars_fragment: Ib, + map_particle_fragment: Nb, + map_particle_pars_fragment: Bb, + metalnessmap_fragment: kb, + metalnessmap_pars_fragment: Ub, + morphinstance_vertex: Ob, + morphcolor_vertex: zb, + morphnormal_vertex: Fb, + morphtarget_pars_vertex: Hb, + morphtarget_vertex: Vb, + normal_fragment_begin: Gb, + normal_fragment_maps: Wb, + normal_pars_fragment: Xb, + normal_pars_vertex: jb, + normal_vertex: qb, + normalmap_pars_fragment: Zb, + clearcoat_normal_fragment_begin: Yb, + clearcoat_normal_fragment_maps: $b, + clearcoat_pars_fragment: Kb, + iridescence_pars_fragment: Jb, + opaque_fragment: Qb, + packing: ey, + premultiplied_alpha_fragment: ty, + project_vertex: ny, + dithering_fragment: iy, + dithering_pars_fragment: sy, + roughnessmap_fragment: ry, + roughnessmap_pars_fragment: ay, + shadowmap_pars_fragment: oy, + shadowmap_pars_vertex: ly, + shadowmap_vertex: cy, + shadowmask_pars_fragment: hy, + skinbase_vertex: uy, + skinning_pars_vertex: dy, + skinning_vertex: py, + skinnormal_vertex: fy, + specularmap_fragment: my, + specularmap_pars_fragment: gy, + tonemapping_fragment: xy, + tonemapping_pars_fragment: vy, + transmission_fragment: by, + transmission_pars_fragment: yy, + uv_pars_fragment: _y, + uv_pars_vertex: My, + uv_vertex: wy, + worldpos_vertex: Sy, + background_vert: Ey, + background_frag: Cy, + backgroundCube_vert: Ty, + backgroundCube_frag: Ay, + cube_vert: Py, + cube_frag: Ry, + depth_vert: Ly, + depth_frag: Dy, + distanceRGBA_vert: Iy, + distanceRGBA_frag: Ny, + equirect_vert: By, + equirect_frag: ky, + linedashed_vert: Uy, + linedashed_frag: Oy, + meshbasic_vert: zy, + meshbasic_frag: Fy, + meshlambert_vert: Hy, + meshlambert_frag: Vy, + meshmatcap_vert: Gy, + meshmatcap_frag: Wy, + meshnormal_vert: Xy, + meshnormal_frag: jy, + meshphong_vert: qy, + meshphong_frag: Zy, + meshphysical_vert: Yy, + meshphysical_frag: $y, + meshtoon_vert: Ky, + meshtoon_frag: Jy, + points_vert: Qy, points_frag: e2, shadow_vert: t2, shadow_frag: n2, @@ -21387,23 +21367,23 @@ ci.physical = { vertexShader: Qe.meshphysical_vert, fragmentShader: Qe.meshphysical_frag }; -const Co = { r: 0, b: 0, g: 0 }, vs = /* @__PURE__ */ new Bn(), r2 = /* @__PURE__ */ new De(); +const To = { r: 0, b: 0, g: 0 }, vs = /* @__PURE__ */ new Bn(), r2 = /* @__PURE__ */ new De(); function a2(s, e, t, n, i, r, a) { const o = new Fe(0); let l = r === !0 ? 0 : 1, c, h, u = null, p = 0, d = null; function m(v) { - let b = v.isScene === !0 ? v.background : null; - return b && b.isTexture && (b = (v.backgroundBlurriness > 0 ? t : e).get(b)), b; + let y = v.isScene === !0 ? v.background : null; + return y && y.isTexture && (y = (v.backgroundBlurriness > 0 ? t : e).get(y)), y; } function f(v) { - let b = !1; + let y = !1; const _ = m(v); - _ === null ? g(o, l) : _ && _.isColor && (g(_, 1), b = !0); + _ === null ? g(o, l) : _ && _.isColor && (g(_, 1), y = !0); const M = s.xr.getEnvironmentBlendMode(); - M === "additive" ? n.buffers.color.setClear(0, 0, 0, 1, a) : M === "alpha-blend" && n.buffers.color.setClear(0, 0, 0, 0, a), (s.autoClear || b) && (n.buffers.depth.setTest(!0), n.buffers.depth.setMask(!0), n.buffers.color.setMask(!0), s.clear(s.autoClearColor, s.autoClearDepth, s.autoClearStencil)); + M === "additive" ? n.buffers.color.setClear(0, 0, 0, 1, a) : M === "alpha-blend" && n.buffers.color.setClear(0, 0, 0, 0, a), (s.autoClear || y) && (n.buffers.depth.setTest(!0), n.buffers.depth.setMask(!0), n.buffers.color.setMask(!0), s.clear(s.autoClearColor, s.autoClearDepth, s.autoClearStencil)); } - function x(v, b) { - const _ = m(b); + function x(v, y) { + const _ = m(y); _ && (_.isCubeTexture || _.mapping === zl) ? (h === void 0 && (h = new at( new rs(1, 1, 1), new Nt({ @@ -21417,13 +21397,13 @@ function a2(s, e, t, n, i, r, a) { fog: !1, allowOverride: !1 }) - ), h.geometry.deleteAttribute("normal"), h.geometry.deleteAttribute("uv"), h.onBeforeRender = function(M, T, R) { + ), h.geometry.deleteAttribute("normal"), h.geometry.deleteAttribute("uv"), h.onBeforeRender = function(M, C, R) { this.matrixWorld.copyPosition(R.matrixWorld); }, Object.defineProperty(h.material, "envMap", { get: function() { return this.uniforms.envMap.value; } - }), i.update(h)), vs.copy(b.backgroundRotation), vs.x *= -1, vs.y *= -1, vs.z *= -1, _.isCubeTexture && _.isRenderTargetTexture === !1 && (vs.y *= -1, vs.z *= -1), h.material.uniforms.envMap.value = _, h.material.uniforms.flipEnvMap.value = _.isCubeTexture && _.isRenderTargetTexture === !1 ? -1 : 1, h.material.uniforms.backgroundBlurriness.value = b.backgroundBlurriness, h.material.uniforms.backgroundIntensity.value = b.backgroundIntensity, h.material.uniforms.backgroundRotation.value.setFromMatrix4(r2.makeRotationFromEuler(vs)), h.material.toneMapped = st.getTransfer(_.colorSpace) !== ct, (u !== _ || p !== _.version || d !== s.toneMapping) && (h.material.needsUpdate = !0, u = _, p = _.version, d = s.toneMapping), h.layers.enableAll(), v.unshift(h, h.geometry, h.material, 0, 0, null)) : _ && _.isTexture && (c === void 0 && (c = new at( + }), i.update(h)), vs.copy(y.backgroundRotation), vs.x *= -1, vs.y *= -1, vs.z *= -1, _.isCubeTexture && _.isRenderTargetTexture === !1 && (vs.y *= -1, vs.z *= -1), h.material.uniforms.envMap.value = _, h.material.uniforms.flipEnvMap.value = _.isCubeTexture && _.isRenderTargetTexture === !1 ? -1 : 1, h.material.uniforms.backgroundBlurriness.value = y.backgroundBlurriness, h.material.uniforms.backgroundIntensity.value = y.backgroundIntensity, h.material.uniforms.backgroundRotation.value.setFromMatrix4(r2.makeRotationFromEuler(vs)), h.material.toneMapped = st.getTransfer(_.colorSpace) !== ct, (u !== _ || p !== _.version || d !== s.toneMapping) && (h.material.needsUpdate = !0, u = _, p = _.version, d = s.toneMapping), h.layers.enableAll(), v.unshift(h, h.geometry, h.material, 0, 0, null)) : _ && _.isTexture && (c === void 0 && (c = new at( new Vs(2, 2), new Nt({ name: "BackgroundMaterial", @@ -21440,20 +21420,20 @@ function a2(s, e, t, n, i, r, a) { get: function() { return this.uniforms.t2D.value; } - }), i.update(c)), c.material.uniforms.t2D.value = _, c.material.uniforms.backgroundIntensity.value = b.backgroundIntensity, c.material.toneMapped = st.getTransfer(_.colorSpace) !== ct, _.matrixAutoUpdate === !0 && _.updateMatrix(), c.material.uniforms.uvTransform.value.copy(_.matrix), (u !== _ || p !== _.version || d !== s.toneMapping) && (c.material.needsUpdate = !0, u = _, p = _.version, d = s.toneMapping), c.layers.enableAll(), v.unshift(c, c.geometry, c.material, 0, 0, null)); + }), i.update(c)), c.material.uniforms.t2D.value = _, c.material.uniforms.backgroundIntensity.value = y.backgroundIntensity, c.material.toneMapped = st.getTransfer(_.colorSpace) !== ct, _.matrixAutoUpdate === !0 && _.updateMatrix(), c.material.uniforms.uvTransform.value.copy(_.matrix), (u !== _ || p !== _.version || d !== s.toneMapping) && (c.material.needsUpdate = !0, u = _, p = _.version, d = s.toneMapping), c.layers.enableAll(), v.unshift(c, c.geometry, c.material, 0, 0, null)); } - function g(v, b) { - v.getRGB(Co, Wm(s)), n.buffers.color.setClear(Co.r, Co.g, Co.b, b, a); + function g(v, y) { + v.getRGB(To, Wm(s)), n.buffers.color.setClear(To.r, To.g, To.b, y, a); } - function y() { + function b() { h !== void 0 && (h.geometry.dispose(), h.material.dispose(), h = void 0), c !== void 0 && (c.geometry.dispose(), c.material.dispose(), c = void 0); } return { getClearColor: function() { return o; }, - setClearColor: function(v, b = 1) { - o.set(v), l = b, g(o, l); + setClearColor: function(v, y = 1) { + o.set(v), l = y, g(o, l); }, getClearAlpha: function() { return l; @@ -21463,7 +21443,7 @@ function a2(s, e, t, n, i, r, a) { }, render: f, addToRenderList: x, - dispose: y + dispose: b }; } function o2(s, e) { @@ -21472,7 +21452,7 @@ function o2(s, e) { function o(E, L, A, I, w) { let z = !1; const G = u(I, A, L); - r !== G && (r = G, c(r.object)), z = d(E, I, A, w), z && m(E, I, A, w), w !== null && e.update(w, s.ELEMENT_ARRAY_BUFFER), (z || a) && (a = !1, b(E, L, A, I), w !== null && s.bindBuffer(s.ELEMENT_ARRAY_BUFFER, e.get(w).buffer)); + r !== G && (r = G, c(r.object)), z = d(E, I, A, w), z && m(E, I, A, w), w !== null && e.update(w, s.ELEMENT_ARRAY_BUFFER), (z || a) && (a = !1, y(E, L, A, I), w !== null && s.bindBuffer(s.ELEMENT_ARRAY_BUFFER, e.get(w).buffer)); } function l() { return s.createVertexArray(); @@ -21547,7 +21527,7 @@ function o2(s, e) { const A = r.newAttributes, I = r.enabledAttributes, w = r.attributeDivisors; A[E] = 1, I[E] === 0 && (s.enableVertexAttribArray(E), I[E] = 1), w[E] !== L && (s.vertexAttribDivisor(E, L), w[E] = L); } - function y() { + function b() { const E = r.newAttributes, L = r.enabledAttributes; for (let A = 0, I = L.length; A < I; A++) L[A] !== E[A] && (s.disableVertexAttribArray(A), L[A] = 0); @@ -21555,7 +21535,7 @@ function o2(s, e) { function v(E, L, A, I, w, z, G) { G === !0 ? s.vertexAttribIPointer(E, L, A, w, z) : s.vertexAttribPointer(E, L, A, I, w, z); } - function b(E, L, A, I) { + function y(E, L, A, I) { f(); const w = I.attributes, z = A.getAttributes(), G = L.defaultAttributeValues; for (const j in z) { @@ -21567,7 +21547,7 @@ function o2(s, e) { if ($ === void 0) continue; const fe = $.buffer, me = $.type, de = $.bytesPerElement, se = me === s.INT || me === s.UNSIGNED_INT || q.gpuType === zu; if (q.isInterleavedBufferAttribute) { - const ce = q.data, pe = ce.stride, ye = q.offset; + const ce = q.data, pe = ce.stride, be = q.offset; if (ce.isInstancedInterleavedBuffer) { for (let Se = 0; Se < Y.locationSize; Se++) g(Y.location + Se, ce.meshPerAttribute); @@ -21583,7 +21563,7 @@ function o2(s, e) { me, ie, pe * de, - (ye + W / Y.locationSize * Se) * de, + (be + W / Y.locationSize * Se) * de, se ); } else { @@ -21625,7 +21605,7 @@ function o2(s, e) { } } } - y(); + b(); } function _() { R(); @@ -21651,7 +21631,7 @@ function o2(s, e) { } delete n[E.id]; } - function T(E) { + function C(E) { for (const L in n) { const A = n[L]; if (A[E.id] === void 0) continue; @@ -21673,10 +21653,10 @@ function o2(s, e) { resetDefaultState: S, dispose: _, releaseStatesOfGeometry: M, - releaseStatesOfProgram: T, + releaseStatesOfProgram: C, initAttributes: f, enableAttribute: x, - disableUnusedAttributes: y + disableUnusedAttributes: b }; } function l2(s, e, t) { @@ -21719,32 +21699,32 @@ function c2(s, e, t, n) { function r() { if (i !== void 0) return i; if (e.has("EXT_texture_filter_anisotropic") === !0) { - const T = e.get("EXT_texture_filter_anisotropic"); - i = s.getParameter(T.MAX_TEXTURE_MAX_ANISOTROPY_EXT); + const C = e.get("EXT_texture_filter_anisotropic"); + i = s.getParameter(C.MAX_TEXTURE_MAX_ANISOTROPY_EXT); } else i = 0; return i; } - function a(T) { - return !(T !== Mn && n.convert(T) !== s.getParameter(s.IMPLEMENTATION_COLOR_READ_FORMAT)); + function a(C) { + return !(C !== Mn && n.convert(C) !== s.getParameter(s.IMPLEMENTATION_COLOR_READ_FORMAT)); } - function o(T) { - const R = T === mn && (e.has("EXT_color_buffer_half_float") || e.has("EXT_color_buffer_float")); - return !(T !== ii && n.convert(T) !== s.getParameter(s.IMPLEMENTATION_COLOR_READ_TYPE) && // Edge and Chrome Mac < 52 (#9513) - T !== fn && !R); + function o(C) { + const R = C === mn && (e.has("EXT_color_buffer_half_float") || e.has("EXT_color_buffer_float")); + return !(C !== ii && n.convert(C) !== s.getParameter(s.IMPLEMENTATION_COLOR_READ_TYPE) && // Edge and Chrome Mac < 52 (#9513) + C !== fn && !R); } - function l(T) { - if (T === "highp") { + function l(C) { + if (C === "highp") { if (s.getShaderPrecisionFormat(s.VERTEX_SHADER, s.HIGH_FLOAT).precision > 0 && s.getShaderPrecisionFormat(s.FRAGMENT_SHADER, s.HIGH_FLOAT).precision > 0) return "highp"; - T = "mediump"; + C = "mediump"; } - return T === "mediump" && s.getShaderPrecisionFormat(s.VERTEX_SHADER, s.MEDIUM_FLOAT).precision > 0 && s.getShaderPrecisionFormat(s.FRAGMENT_SHADER, s.MEDIUM_FLOAT).precision > 0 ? "mediump" : "lowp"; + return C === "mediump" && s.getShaderPrecisionFormat(s.VERTEX_SHADER, s.MEDIUM_FLOAT).precision > 0 && s.getShaderPrecisionFormat(s.FRAGMENT_SHADER, s.MEDIUM_FLOAT).precision > 0 ? "mediump" : "lowp"; } let c = t.precision !== void 0 ? t.precision : "highp"; const h = l(c); h !== c && (He("WebGLRenderer:", c, "not supported, using", h, "instead."), c = h); - const u = t.logarithmicDepthBuffer === !0, p = t.reversedDepthBuffer === !0 && e.has("EXT_clip_control"), d = s.getParameter(s.MAX_TEXTURE_IMAGE_UNITS), m = s.getParameter(s.MAX_VERTEX_TEXTURE_IMAGE_UNITS), f = s.getParameter(s.MAX_TEXTURE_SIZE), x = s.getParameter(s.MAX_CUBE_MAP_TEXTURE_SIZE), g = s.getParameter(s.MAX_VERTEX_ATTRIBS), y = s.getParameter(s.MAX_VERTEX_UNIFORM_VECTORS), v = s.getParameter(s.MAX_VARYING_VECTORS), b = s.getParameter(s.MAX_FRAGMENT_UNIFORM_VECTORS), _ = m > 0, M = s.getParameter(s.MAX_SAMPLES); + const u = t.logarithmicDepthBuffer === !0, p = t.reversedDepthBuffer === !0 && e.has("EXT_clip_control"), d = s.getParameter(s.MAX_TEXTURE_IMAGE_UNITS), m = s.getParameter(s.MAX_VERTEX_TEXTURE_IMAGE_UNITS), f = s.getParameter(s.MAX_TEXTURE_SIZE), x = s.getParameter(s.MAX_CUBE_MAP_TEXTURE_SIZE), g = s.getParameter(s.MAX_VERTEX_ATTRIBS), b = s.getParameter(s.MAX_VERTEX_UNIFORM_VECTORS), v = s.getParameter(s.MAX_VARYING_VECTORS), y = s.getParameter(s.MAX_FRAGMENT_UNIFORM_VECTORS), _ = m > 0, M = s.getParameter(s.MAX_SAMPLES); return { isWebGL2: !0, // keeping this for backwards compatibility @@ -21760,9 +21740,9 @@ function c2(s, e, t, n) { maxTextureSize: f, maxCubemapSize: x, maxAttributes: g, - maxVertexUniforms: y, + maxVertexUniforms: b, maxVaryings: v, - maxFragmentUniforms: b, + maxFragmentUniforms: y, vertexTextures: _, maxSamples: M }; @@ -21787,12 +21767,12 @@ function h2(s) { if (!i || m === null || m.length === 0 || r && !x) r ? h(null) : c(); else { - const y = r ? 0 : n, v = y * 4; - let b = g.clippingState || null; - l.value = b, b = h(m, p, v, d); + const b = r ? 0 : n, v = b * 4; + let y = g.clippingState || null; + l.value = y, y = h(m, p, v, d); for (let _ = 0; _ !== v; ++_) - b[_] = t[_]; - g.clippingState = b, this.numIntersection = f ? this.numPlanes : 0, this.numPlanes += y; + y[_] = t[_]; + g.clippingState = y, this.numIntersection = f ? this.numPlanes : 0, this.numPlanes += b; } }; function c() { @@ -21803,10 +21783,10 @@ function h2(s) { let x = null; if (f !== 0) { if (x = l.value, m !== !0 || x === null) { - const g = d + f * 4, y = p.matrixWorldInverse; - o.getNormalMatrix(y), (x === null || x.length < g) && (x = new Float32Array(g)); - for (let v = 0, b = d; v !== f; ++v, b += 4) - a.copy(u[v]).applyMatrix4(y, o), a.normal.toArray(x, b), x[b + 3] = a.constant; + const g = d + f * 4, b = p.matrixWorldInverse; + o.getNormalMatrix(b), (x === null || x.length < g) && (x = new Float32Array(g)); + for (let v = 0, y = d; v !== f; ++v, y += 4) + a.copy(u[v]).applyMatrix4(b, o), a.normal.toArray(x, y), x[y + 3] = a.constant; } l.value = x, l.needsUpdate = !0; } @@ -21850,7 +21830,7 @@ function u2(s) { dispose: r }; } -const es = 4, Rp = [0.125, 0.215, 0.35, 0.446, 0.526, 0.582], Ts = 20, d2 = 256, ra = /* @__PURE__ */ new Oi(), Lp = /* @__PURE__ */ new Fe(); +const es = 4, Rp = [0.125, 0.215, 0.35, 0.446, 0.526, 0.582], Cs = 20, d2 = 256, ra = /* @__PURE__ */ new Oi(), Lp = /* @__PURE__ */ new Fe(); let Bc = null, kc = 0, Uc = 0, Oc = !1; const p2 = /* @__PURE__ */ new P(); class mu { @@ -21983,15 +21963,15 @@ class mu { )); const f = this._backgroundBox, x = f.material; let g = !1; - const y = e.background; - y ? y.isColor && (x.color.copy(y), e.background = null, g = !0) : (x.color.copy(Lp), g = !0); + const b = e.background; + b ? b.isColor && (x.color.copy(b), e.background = null, g = !0) : (x.color.copy(Lp), g = !0); for (let v = 0; v < 6; v++) { - const b = v % 3; - b === 0 ? (l.up.set(0, c[v], 0), l.position.set(r.x, r.y, r.z), l.lookAt(r.x + h[v], r.y, r.z)) : b === 1 ? (l.up.set(0, 0, c[v]), l.position.set(r.x, r.y, r.z), l.lookAt(r.x, r.y + h[v], r.z)) : (l.up.set(0, c[v], 0), l.position.set(r.x, r.y, r.z), l.lookAt(r.x, r.y, r.z + h[v])); + const y = v % 3; + y === 0 ? (l.up.set(0, c[v], 0), l.position.set(r.x, r.y, r.z), l.lookAt(r.x + h[v], r.y, r.z)) : y === 1 ? (l.up.set(0, 0, c[v]), l.position.set(r.x, r.y, r.z), l.lookAt(r.x, r.y + h[v], r.z)) : (l.up.set(0, c[v], 0), l.position.set(r.x, r.y, r.z), l.lookAt(r.x, r.y, r.z + h[v])); const _ = this._cubeSize; - fr(i, b * _, v > 2 ? _ : 0, _, _), u.setRenderTarget(i), g && u.render(f, l), u.render(e, l); + fr(i, y * _, v > 2 ? _ : 0, _, _), u.setRenderTarget(i), g && u.render(f, l), u.render(e, l); } - u.toneMapping = d, u.autoClear = p, e.background = y; + u.toneMapping = d, u.autoClear = p, e.background = b; } _textureToCubeUV(e, t) { const n = this._renderer, i = e.mapping === Dr || e.mapping === Ir; @@ -22071,21 +22051,21 @@ class mu { ); const h = 3, u = this._lodMeshes[i]; u.material = c; - const p = c.uniforms, d = this._sizeLods[n] - 1, m = isFinite(r) ? Math.PI / (2 * d) : 2 * Math.PI / (2 * Ts - 1), f = r / m, x = isFinite(r) ? 1 + Math.floor(h * f) : Ts; - x > Ts && He(`sigmaRadians, ${r}, is too large and will clip, as it requested ${x} samples when the maximum is set to ${Ts}`); + const p = c.uniforms, d = this._sizeLods[n] - 1, m = isFinite(r) ? Math.PI / (2 * d) : 2 * Math.PI / (2 * Cs - 1), f = r / m, x = isFinite(r) ? 1 + Math.floor(h * f) : Cs; + x > Cs && He(`sigmaRadians, ${r}, is too large and will clip, as it requested ${x} samples when the maximum is set to ${Cs}`); const g = []; - let y = 0; - for (let T = 0; T < Ts; ++T) { - const R = T / f, S = Math.exp(-R * R / 2); - g.push(S), T === 0 ? y += S : T < x && (y += 2 * S); + let b = 0; + for (let C = 0; C < Cs; ++C) { + const R = C / f, S = Math.exp(-R * R / 2); + g.push(S), C === 0 ? b += S : C < x && (b += 2 * S); } - for (let T = 0; T < g.length; T++) - g[T] = g[T] / y; + for (let C = 0; C < g.length; C++) + g[C] = g[C] / b; p.envMap.value = e.texture, p.samples.value = x, p.weights.value = g, p.latitudinal.value = a === "latitudinal", o && (p.poleAxis.value = o); const { _lodMax: v } = this; p.dTheta.value = m, p.mipInt.value = v - n; - const b = this._sizeLods[i], _ = 3 * b * (i > v - es ? i - v + es : 0), M = 4 * (this._cubeSize - b); - fr(t, _, M, 3 * b, 2 * b), l.setRenderTarget(t), l.render(u, ra); + const y = this._sizeLods[i], _ = 3 * y * (i > v - es ? i - v + es : 0), M = 4 * (this._cubeSize - y); + fr(t, _, M, 3 * y, 2 * y), l.setRenderTarget(t), l.render(u, ra); } } function f2(s) { @@ -22097,34 +22077,34 @@ function f2(s) { e.push(o); let l = 1 / o; a > s - es ? l = Rp[a - s + es - 1] : a === 0 && (l = 0), t.push(l); - const c = 1 / (o - 2), h = -c, u = 1 + c, p = [h, h, u, h, u, u, h, h, u, u, h, u], d = 6, m = 6, f = 3, x = 2, g = 1, y = new Float32Array(f * m * d), v = new Float32Array(x * m * d), b = new Float32Array(g * m * d); + const c = 1 / (o - 2), h = -c, u = 1 + c, p = [h, h, u, h, u, u, h, h, u, u, h, u], d = 6, m = 6, f = 3, x = 2, g = 1, b = new Float32Array(f * m * d), v = new Float32Array(x * m * d), y = new Float32Array(g * m * d); for (let M = 0; M < d; M++) { - const T = M % 3 * 2 / 3 - 1, R = M > 2 ? 0 : -1, S = [ - T, + const C = M % 3 * 2 / 3 - 1, R = M > 2 ? 0 : -1, S = [ + C, R, 0, - T + 2 / 3, + C + 2 / 3, R, 0, - T + 2 / 3, + C + 2 / 3, R + 1, 0, - T, + C, R, 0, - T + 2 / 3, + C + 2 / 3, R + 1, 0, - T, + C, R + 1, 0 ]; - y.set(S, f * m * M), v.set(p, x * m * M); + b.set(S, f * m * M), v.set(p, x * m * M); const E = [M, M, M, M, M, M]; - b.set(E, g * m * M); + y.set(E, g * m * M); } const _ = new mt(); - _.setAttribute("position", new yt(y, f)), _.setAttribute("uv", new yt(v, x)), _.setAttribute("faceIndex", new yt(b, g)), n.push(new at(_, null)), i > es && i--; + _.setAttribute("position", new bt(b, f)), _.setAttribute("uv", new bt(v, x)), _.setAttribute("faceIndex", new bt(y, g)), n.push(new at(_, null)), i > es && i--; } return { lodMeshes: n, sizeLods: e, sigmas: t }; } @@ -22268,11 +22248,11 @@ function m2(s, e, t) { }); } function g2(s, e, t) { - const n = new Float32Array(Ts), i = new P(0, 1, 0); + const n = new Float32Array(Cs), i = new P(0, 1, 0); return new Nt({ name: "SphericalGaussianBlur", defines: { - n: Ts, + n: Cs, CUBEUV_TEXEL_WIDTH: 1 / e, CUBEUV_TEXEL_HEIGHT: 1 / t, CUBEUV_MAX_MIP: `${s}.0` @@ -22547,7 +22527,7 @@ function v2(s) { } }; } -function y2(s, e, t, n) { +function b2(s, e, t, n) { const i = {}, r = /* @__PURE__ */ new WeakMap(); function a(u) { const p = u.target; @@ -22570,18 +22550,18 @@ function y2(s, e, t, n) { const p = [], d = u.index, m = u.attributes.position; let f = 0; if (d !== null) { - const y = d.array; + const b = d.array; f = d.version; - for (let v = 0, b = y.length; v < b; v += 3) { - const _ = y[v + 0], M = y[v + 1], T = y[v + 2]; - p.push(_, M, M, T, T, _); + for (let v = 0, y = b.length; v < y; v += 3) { + const _ = b[v + 0], M = b[v + 1], C = b[v + 2]; + p.push(_, M, M, C, C, _); } } else if (m !== void 0) { - const y = m.array; + const b = m.array; f = m.version; - for (let v = 0, b = y.length / 3 - 1; v < b; v += 3) { - const _ = v + 0, M = v + 1, T = v + 2; - p.push(_, M, M, T, T, _); + for (let v = 0, y = b.length / 3 - 1; v < y; v += 3) { + const _ = v + 0, M = v + 1, C = v + 2; + p.push(_, M, M, C, C, _); } } else return; @@ -22605,7 +22585,7 @@ function y2(s, e, t, n) { getWireframeAttribute: h }; } -function b2(s, e, t) { +function y2(s, e, t) { let n; function i(p) { n = p; @@ -22637,8 +22617,8 @@ function b2(s, e, t) { else { x.multiDrawElementsInstancedWEBGL(n, d, 0, r, p, 0, f, 0, m); let g = 0; - for (let y = 0; y < m; y++) - g += d[y] * f[y]; + for (let b = 0; b < m; b++) + g += d[b] * f[b]; t.update(g, n, 1); } } @@ -22696,19 +22676,19 @@ function M2(s, e, t) { let p = n.get(o); if (p === void 0 || p.count !== u) { let S = function() { - T.dispose(), n.delete(o), o.removeEventListener("dispose", S); + C.dispose(), n.delete(o), o.removeEventListener("dispose", S); }; p !== void 0 && p.texture.dispose(); - const d = o.morphAttributes.position !== void 0, m = o.morphAttributes.normal !== void 0, f = o.morphAttributes.color !== void 0, x = o.morphAttributes.position || [], g = o.morphAttributes.normal || [], y = o.morphAttributes.color || []; + const d = o.morphAttributes.position !== void 0, m = o.morphAttributes.normal !== void 0, f = o.morphAttributes.color !== void 0, x = o.morphAttributes.position || [], g = o.morphAttributes.normal || [], b = o.morphAttributes.color || []; let v = 0; d === !0 && (v = 1), m === !0 && (v = 2), f === !0 && (v = 3); - let b = o.attributes.position.count * v, _ = 1; - b > e.maxTextureSize && (_ = Math.ceil(b / e.maxTextureSize), b = e.maxTextureSize); - const M = new Float32Array(b * _ * 4 * u), T = new Fm(M, b, _, u); - T.type = fn, T.needsUpdate = !0; + let y = o.attributes.position.count * v, _ = 1; + y > e.maxTextureSize && (_ = Math.ceil(y / e.maxTextureSize), y = e.maxTextureSize); + const M = new Float32Array(y * _ * 4 * u), C = new Fm(M, y, _, u); + C.type = fn, C.needsUpdate = !0; const R = v * 4; for (let E = 0; E < u; E++) { - const L = x[E], A = g[E], I = y[E], w = b * _ * 4 * E; + const L = x[E], A = g[E], I = b[E], w = y * _ * 4 * E; for (let z = 0; z < L.count; z++) { const G = z * R; d === !0 && (i.fromBufferAttribute(L, z), M[w + G + 0] = i.x, M[w + G + 1] = i.y, M[w + G + 2] = i.z, M[w + G + 3] = 0), m === !0 && (i.fromBufferAttribute(A, z), M[w + G + 4] = i.x, M[w + G + 5] = i.y, M[w + G + 6] = i.z, M[w + G + 7] = 0), f === !0 && (i.fromBufferAttribute(I, z), M[w + G + 8] = i.x, M[w + G + 9] = i.y, M[w + G + 10] = i.z, M[w + G + 11] = I.itemSize === 4 ? i.w : 1); @@ -22716,8 +22696,8 @@ function M2(s, e, t) { } p = { count: u, - texture: T, - size: new he(b, _) + texture: C, + size: new he(y, _) }, n.set(o, p), o.addEventListener("dispose", S); } if (a.isInstancedMesh === !0 && a.morphTexture !== null) @@ -22800,7 +22780,7 @@ function E2(s, e) { s.uniform2fv(this.addr, e), Yt(t, e); } } -function T2(s, e) { +function C2(s, e) { const t = this.cache; if (e.x !== void 0) (t[0] !== e.x || t[1] !== e.y || t[2] !== e.z) && (s.uniform3f(this.addr, e.x, e.y, e.z), t[0] = e.x, t[1] = e.y, t[2] = e.z); @@ -22811,7 +22791,7 @@ function T2(s, e) { s.uniform3fv(this.addr, e), Yt(t, e); } } -function C2(s, e) { +function T2(s, e) { const t = this.cache; if (e.x !== void 0) (t[0] !== e.x || t[1] !== e.y || t[2] !== e.z || t[3] !== e.w) && (s.uniform4f(this.addr, e.x, e.y, e.z, e.w), t[0] = e.x, t[1] = e.y, t[2] = e.z, t[3] = e.w); @@ -22939,10 +22919,10 @@ function G2(s) { return E2; // _VEC2 case 35665: - return T2; + return C2; // _VEC3 case 35666: - return C2; + return T2; // _VEC4 case 35674: return A2; @@ -23269,7 +23249,7 @@ function x3(s) { st._getMatrix(Gp, st.workingColorSpace, s); const e = `mat3( ${Gp.elements.map((t) => t.toFixed(4))} )`; switch (st.getTransfer(s)) { - case Cl: + case Tl: return [e, "LinearTransferOETF"]; case ct: return [e, "sRGBTransferOETF"]; @@ -23300,7 +23280,7 @@ function v3(s, e) { ].join(` `); } -function y3(s, e) { +function b3(s, e) { let t; switch (e) { case Mm: @@ -23315,13 +23295,13 @@ function y3(s, e) { case Em: t = "ACESFilmic"; break; - case Cm: + case Tm: t = "AgX"; break; case Am: t = "Neutral"; break; - case Tm: + case Cm: t = "Custom"; break; default: @@ -23330,7 +23310,7 @@ function y3(s, e) { return "vec3 " + s + "( vec3 color ) { return " + t + "ToneMapping( color ); }"; } const Ao = /* @__PURE__ */ new P(); -function b3() { +function y3() { st.getLuminanceCoefficients(Ao); const s = Ao.x.toFixed(4), e = Ao.y.toFixed(4), t = Ao.z.toFixed(4); return [ @@ -23345,7 +23325,7 @@ function _3(s) { return [ s.extensionClipCullDistance ? "#extension GL_ANGLE_clip_cull_distance : require" : "", s.extensionMultiDraw ? "#extension GL_ANGLE_multi_draw : require" : "" - ].filter(ya).join(` + ].filter(ba).join(` `); } function M3(s) { @@ -23370,7 +23350,7 @@ function w3(s, e) { } return t; } -function ya(s) { +function ba(s) { return s !== ""; } function Xp(s, e) { @@ -23382,10 +23362,10 @@ function jp(s, e) { } const S3 = /^[ \t]*#include +<([\w\d./]+)>/gm; function gu(s) { - return s.replace(S3, T3); + return s.replace(S3, C3); } const E3 = /* @__PURE__ */ new Map(); -function T3(s, e) { +function C3(s, e) { let t = Qe[e]; if (t === void 0) { const n = E3.get(e); @@ -23396,9 +23376,9 @@ function T3(s, e) { } return gu(t); } -const C3 = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g; +const T3 = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g; function qp(s) { - return s.replace(C3, A3); + return s.replace(T3, A3); } function A3(s, e, t, n) { let i = ""; @@ -23432,7 +23412,7 @@ function Zp(s) { } function P3(s) { let e = "SHADOWMAP_TYPE_BASIC"; - return s.shadowMapType === bm ? e = "SHADOWMAP_TYPE_PCF" : s.shadowMapType === _m ? e = "SHADOWMAP_TYPE_PCF_SOFT" : s.shadowMapType === Ci && (e = "SHADOWMAP_TYPE_VSM"), e; + return s.shadowMapType === ym ? e = "SHADOWMAP_TYPE_PCF" : s.shadowMapType === _m ? e = "SHADOWMAP_TYPE_PCF_SOFT" : s.shadowMapType === Ti && (e = "SHADOWMAP_TYPE_VSM"), e; } function R3(s) { let e = "ENVMAP_TYPE_CUBE"; @@ -23484,19 +23464,19 @@ function N3(s, e, t, n) { const i = s.getContext(), r = t.defines; let a = t.vertexShader, o = t.fragmentShader; const l = P3(t), c = R3(t), h = L3(t), u = D3(t), p = I3(t), d = _3(t), m = M3(r), f = i.createProgram(); - let x, g, y = t.glslVersion ? "#version " + t.glslVersion + ` + let x, g, b = t.glslVersion ? "#version " + t.glslVersion + ` ` : ""; t.isRawShaderMaterial ? (x = [ "#define SHADER_TYPE " + t.shaderType, "#define SHADER_NAME " + t.shaderName, m - ].filter(ya).join(` + ].filter(ba).join(` `), x.length > 0 && (x += ` `), g = [ "#define SHADER_TYPE " + t.shaderType, "#define SHADER_NAME " + t.shaderName, m - ].filter(ya).join(` + ].filter(ba).join(` `), g.length > 0 && (g += ` `)) : (x = [ Zp(t), @@ -23630,7 +23610,7 @@ function N3(s, e, t, n) { "#endif", ` ` - ].filter(ya).join(` + ].filter(ba).join(` `), g = [ Zp(t), "#define SHADER_TYPE " + t.shaderType, @@ -23704,18 +23684,18 @@ function N3(s, e, t, n) { t.toneMapping !== is ? "#define TONE_MAPPING" : "", t.toneMapping !== is ? Qe.tonemapping_pars_fragment : "", // this code is required here because it is used by the toneMapping() function defined below - t.toneMapping !== is ? y3("toneMapping", t.toneMapping) : "", + t.toneMapping !== is ? b3("toneMapping", t.toneMapping) : "", t.dithering ? "#define DITHERING" : "", t.opaque ? "#define OPAQUE" : "", Qe.colorspace_pars_fragment, // this code is required here because it is used by the various encoding/decoding function defined below v3("linearToOutputTexel", t.outputColorSpace), - b3(), + y3(), t.useDepthPacking ? "#define DEPTH_PACKING " + t.depthPacking : "", ` ` - ].filter(ya).join(` -`)), a = gu(a), a = Xp(a, t), a = jp(a, t), o = gu(o), o = Xp(o, t), o = jp(o, t), a = qp(a), o = qp(o), t.isRawShaderMaterial !== !0 && (y = `#version 300 es + ].filter(ba).join(` +`)), a = gu(a), a = Xp(a, t), a = jp(a, t), o = gu(o), o = Xp(o, t), o = jp(o, t), a = qp(a), o = qp(o), t.isRawShaderMaterial !== !0 && (b = `#version 300 es `, x = [ d, "#define attribute in", @@ -23740,9 +23720,9 @@ function N3(s, e, t, n) { ].join(` `) + ` ` + g); - const v = y + x + a, b = y + g + o, _ = Vp(i, i.VERTEX_SHADER, v), M = Vp(i, i.FRAGMENT_SHADER, b); + const v = b + x + a, y = b + g + o, _ = Vp(i, i.VERTEX_SHADER, v), M = Vp(i, i.FRAGMENT_SHADER, y); i.attachShader(f, _), i.attachShader(f, M), t.index0AttributeName !== void 0 ? i.bindAttribLocation(f, 0, t.index0AttributeName) : t.morphTargets === !0 && i.bindAttribLocation(f, 0, "position"), i.linkProgram(f); - function T(L) { + function C(L) { if (s.debug.checkShaderErrors) { const A = i.getProgramInfoLog(f) || "", I = i.getShaderInfoLog(_) || "", w = i.getShaderInfoLog(M) || "", z = A.trim(), G = I.trim(), j = w.trim(); let Y = !0, q = !0; @@ -23780,11 +23760,11 @@ Program Info Log: ` + z + ` } let R; this.getUniforms = function() { - return R === void 0 && T(this), R; + return R === void 0 && C(this), R; }; let S; this.getAttributes = function() { - return S === void 0 && T(this), S; + return S === void 0 && C(this), S; }; let E = t.rendererExtensionParallelShaderCompile === !1; return this.isReady = function() { @@ -23868,10 +23848,10 @@ function O3(s, e, t, n, i, r, a) { fe = dt.vertexShader, me = dt.fragmentShader; } else fe = S.vertexShader, me = S.fragmentShader, l.update(S), de = l.getVertexShaderID(S), se = l.getFragmentShaderID(S); - const ce = s.getRenderTarget(), pe = s.state.buffers.depth.getReversed(), ye = I.isInstancedMesh === !0, Se = I.isBatchedMesh === !0, Be = !!S.map, $e = !!S.matcap, ke = !!j, C = !!S.aoMap, N = !!S.lightMap, V = !!S.bumpMap, U = !!S.normalMap, k = !!S.displacementMap, F = !!S.emissiveMap, ee = !!S.metalnessMap, J = !!S.roughnessMap, X = S.anisotropy > 0, B = S.clearcoat > 0, D = S.dispersion > 0, H = S.iridescence > 0, K = S.sheen > 0, le = S.transmission > 0, te = X && !!S.anisotropyMap, Ce = B && !!S.clearcoatMap, be = B && !!S.clearcoatNormalMap, Re = B && !!S.clearcoatRoughnessMap, Ie = H && !!S.iridescenceMap, ue = H && !!S.iridescenceThicknessMap, _e = K && !!S.sheenColorMap, Ve = K && !!S.sheenRoughnessMap, Ue = !!S.specularMap, Ae = !!S.specularColorMap, Ge = !!S.specularIntensityMap, Z = le && !!S.transmissionMap, Te = le && !!S.thicknessMap, Me = !!S.gradientMap, we = !!S.alphaMap, ve = S.alphaTest > 0, ge = !!S.alphaHash, Oe = !!S.extensions; + const ce = s.getRenderTarget(), pe = s.state.buffers.depth.getReversed(), be = I.isInstancedMesh === !0, Se = I.isBatchedMesh === !0, Be = !!S.map, $e = !!S.matcap, ke = !!j, T = !!S.aoMap, N = !!S.lightMap, V = !!S.bumpMap, U = !!S.normalMap, k = !!S.displacementMap, F = !!S.emissiveMap, ee = !!S.metalnessMap, J = !!S.roughnessMap, X = S.anisotropy > 0, B = S.clearcoat > 0, D = S.dispersion > 0, H = S.iridescence > 0, K = S.sheen > 0, le = S.transmission > 0, te = X && !!S.anisotropyMap, Te = B && !!S.clearcoatMap, ye = B && !!S.clearcoatNormalMap, Re = B && !!S.clearcoatRoughnessMap, Ie = H && !!S.iridescenceMap, ue = H && !!S.iridescenceThicknessMap, _e = K && !!S.sheenColorMap, Ve = K && !!S.sheenRoughnessMap, Ue = !!S.specularMap, Ae = !!S.specularColorMap, Ge = !!S.specularIntensityMap, Z = le && !!S.transmissionMap, Ce = le && !!S.thicknessMap, Me = !!S.gradientMap, we = !!S.alphaMap, ve = S.alphaTest > 0, ge = !!S.alphaHash, Oe = !!S.extensions; let Ye = is; S.toneMapped && (ce === null || ce.isXRRenderTarget === !0) && (Ye = s.toneMapping); - const bt = { + const yt = { shaderID: q, shaderType: S.type, shaderName: S.name, @@ -23885,9 +23865,9 @@ function O3(s, e, t, n, i, r, a) { precision: d, batching: Se, batchingColor: Se && I._colorsTexture !== null, - instancing: ye, - instancingColor: ye && I.instanceColor !== null, - instancingMorph: ye && I.morphTexture !== null, + instancing: be, + instancingColor: be && I.instanceColor !== null, + instancingMorph: be && I.morphTexture !== null, supportsVertexTextures: p, outputColorSpace: ce === null ? s.outputColorSpace : ce.isXRRenderTarget === !0 ? ce.texture.colorSpace : nn, alphaToCoverage: !!S.alphaToCoverage, @@ -23896,7 +23876,7 @@ function O3(s, e, t, n, i, r, a) { envMap: ke, envMapMode: ke && j.mapping, envMapCubeUVHeight: Y, - aoMap: C, + aoMap: T, lightMap: N, bumpMap: V, normalMap: U, @@ -23909,8 +23889,8 @@ function O3(s, e, t, n, i, r, a) { anisotropy: X, anisotropyMap: te, clearcoat: B, - clearcoatMap: Ce, - clearcoatNormalMap: be, + clearcoatMap: Te, + clearcoatNormalMap: ye, clearcoatRoughnessMap: Re, dispersion: D, iridescence: H, @@ -23924,16 +23904,16 @@ function O3(s, e, t, n, i, r, a) { specularIntensityMap: Ge, transmission: le, transmissionMap: Z, - thicknessMap: Te, + thicknessMap: Ce, gradientMap: Me, - opaque: S.transparent === !1 && S.blending === Cr && S.alphaToCoverage === !1, + opaque: S.transparent === !1 && S.blending === Tr && S.alphaToCoverage === !1, alphaMap: we, alphaTest: ve, alphaHash: ge, combine: S.combine, // mapUv: Be && f(S.map.channel), - aoMapUv: C && f(S.aoMap.channel), + aoMapUv: T && f(S.aoMap.channel), lightMapUv: N && f(S.lightMap.channel), bumpMapUv: V && f(S.bumpMap.channel), normalMapUv: U && f(S.normalMap.channel), @@ -23942,8 +23922,8 @@ function O3(s, e, t, n, i, r, a) { metalnessMapUv: ee && f(S.metalnessMap.channel), roughnessMapUv: J && f(S.roughnessMap.channel), anisotropyMapUv: te && f(S.anisotropyMap.channel), - clearcoatMapUv: Ce && f(S.clearcoatMap.channel), - clearcoatNormalMapUv: be && f(S.clearcoatNormalMap.channel), + clearcoatMapUv: Te && f(S.clearcoatMap.channel), + clearcoatNormalMapUv: ye && f(S.clearcoatNormalMap.channel), clearcoatRoughnessMapUv: Re && f(S.clearcoatRoughnessMap.channel), iridescenceMapUv: Ie && f(S.iridescenceMap.channel), iridescenceThicknessMapUv: ue && f(S.iridescenceThicknessMap.channel), @@ -23953,7 +23933,7 @@ function O3(s, e, t, n, i, r, a) { specularColorMapUv: Ae && f(S.specularColorMap.channel), specularIntensityMapUv: Ge && f(S.specularIntensityMap.channel), transmissionMapUv: Z && f(S.transmissionMap.channel), - thicknessMapUv: Te && f(S.thicknessMap.channel), + thicknessMapUv: Ce && f(S.thicknessMap.channel), alphaMapUv: we && f(S.alphaMap.channel), // vertexTangents: !!z.attributes.tangent && (U || X), @@ -24003,22 +23983,22 @@ function O3(s, e, t, n, i, r, a) { rendererExtensionParallelShaderCompile: n.has("KHR_parallel_shader_compile"), customProgramCacheKey: S.customProgramCacheKey() }; - return bt.vertexUv1s = c.has(1), bt.vertexUv2s = c.has(2), bt.vertexUv3s = c.has(3), c.clear(), bt; + return yt.vertexUv1s = c.has(1), yt.vertexUv2s = c.has(2), yt.vertexUv3s = c.has(3), c.clear(), yt; } function g(S) { const E = []; if (S.shaderID ? E.push(S.shaderID) : (E.push(S.customVertexShaderID), E.push(S.customFragmentShaderID)), S.defines !== void 0) for (const L in S.defines) E.push(L), E.push(S.defines[L]); - return S.isRawShaderMaterial === !1 && (y(E, S), v(E, S), E.push(s.outputColorSpace)), E.push(S.customProgramCacheKey), E.join(); + return S.isRawShaderMaterial === !1 && (b(E, S), v(E, S), E.push(s.outputColorSpace)), E.push(S.customProgramCacheKey), E.join(); } - function y(S, E) { + function b(S, E) { S.push(E.precision), S.push(E.outputColorSpace), S.push(E.envMapMode), S.push(E.envMapCubeUVHeight), S.push(E.mapUv), S.push(E.alphaMapUv), S.push(E.lightMapUv), S.push(E.aoMapUv), S.push(E.bumpMapUv), S.push(E.normalMapUv), S.push(E.displacementMapUv), S.push(E.emissiveMapUv), S.push(E.metalnessMapUv), S.push(E.roughnessMapUv), S.push(E.anisotropyMapUv), S.push(E.clearcoatMapUv), S.push(E.clearcoatNormalMapUv), S.push(E.clearcoatRoughnessMapUv), S.push(E.iridescenceMapUv), S.push(E.iridescenceThicknessMapUv), S.push(E.sheenColorMapUv), S.push(E.sheenRoughnessMapUv), S.push(E.specularMapUv), S.push(E.specularColorMapUv), S.push(E.specularIntensityMapUv), S.push(E.transmissionMapUv), S.push(E.thicknessMapUv), S.push(E.combine), S.push(E.fogExp2), S.push(E.sizeAttenuation), S.push(E.morphTargetsCount), S.push(E.morphAttributeCount), S.push(E.numDirLights), S.push(E.numPointLights), S.push(E.numSpotLights), S.push(E.numSpotLightMaps), S.push(E.numHemiLights), S.push(E.numRectAreaLights), S.push(E.numDirLightShadows), S.push(E.numPointLightShadows), S.push(E.numSpotLightShadows), S.push(E.numSpotLightShadowsWithMaps), S.push(E.numLightProbes), S.push(E.shadowMapType), S.push(E.toneMapping), S.push(E.numClippingPlanes), S.push(E.numClipIntersection), S.push(E.depthPacking); } function v(S, E) { o.disableAll(), E.supportsVertexTextures && o.enable(0), E.instancing && o.enable(1), E.instancingColor && o.enable(2), E.instancingMorph && o.enable(3), E.matcap && o.enable(4), E.envMap && o.enable(5), E.normalMapObjectSpace && o.enable(6), E.normalMapTangentSpace && o.enable(7), E.clearcoat && o.enable(8), E.iridescence && o.enable(9), E.alphaTest && o.enable(10), E.vertexColors && o.enable(11), E.vertexAlphas && o.enable(12), E.vertexUv1s && o.enable(13), E.vertexUv2s && o.enable(14), E.vertexUv3s && o.enable(15), E.vertexTangents && o.enable(16), E.anisotropy && o.enable(17), E.alphaHash && o.enable(18), E.batching && o.enable(19), E.dispersion && o.enable(20), E.batchingColor && o.enable(21), E.gradientMap && o.enable(22), S.push(o.mask), o.disableAll(), E.fog && o.enable(0), E.useFog && o.enable(1), E.flatShading && o.enable(2), E.logarithmicDepthBuffer && o.enable(3), E.reversedDepthBuffer && o.enable(4), E.skinning && o.enable(5), E.morphTargets && o.enable(6), E.morphNormals && o.enable(7), E.morphColors && o.enable(8), E.premultipliedAlpha && o.enable(9), E.shadowMapEnabled && o.enable(10), E.doubleSided && o.enable(11), E.flipSided && o.enable(12), E.useDepthPacking && o.enable(13), E.dithering && o.enable(14), E.transmission && o.enable(15), E.sheen && o.enable(16), E.opaque && o.enable(17), E.pointsUvs && o.enable(18), E.decodeVideoTexture && o.enable(19), E.decodeVideoTextureEmissive && o.enable(20), E.alphaToCoverage && o.enable(21), S.push(o.mask); } - function b(S) { + function y(S) { const E = m[S.type]; let L; if (E) { @@ -24045,7 +24025,7 @@ function O3(s, e, t, n, i, r, a) { h[E] = h[h.length - 1], h.pop(), S.destroy(); } } - function T(S) { + function C(S) { l.remove(S); } function R() { @@ -24054,10 +24034,10 @@ function O3(s, e, t, n, i, r, a) { return { getParameters: x, getProgramCacheKey: g, - getUniforms: b, + getUniforms: y, acquireProgram: _, releaseProgram: M, - releaseShaderCache: T, + releaseShaderCache: C, // Exposed for resource monitoring & error feedback via renderer.info: programs: h, dispose: R @@ -24300,7 +24280,7 @@ function j3(s) { function o(c) { let h = 0, u = 0, p = 0; for (let S = 0; S < 9; S++) n.probe[S].set(0, 0, 0); - let d = 0, m = 0, f = 0, x = 0, g = 0, y = 0, v = 0, b = 0, _ = 0, M = 0, T = 0; + let d = 0, m = 0, f = 0, x = 0, g = 0, b = 0, v = 0, y = 0, _ = 0, M = 0, C = 0; c.sort(X3); for (let S = 0, E = c.length; S < E; S++) { const L = c[S], A = L.color, I = L.intensity, w = L.distance, z = L.shadow && L.shadow.map ? L.shadow.map.texture : null; @@ -24309,12 +24289,12 @@ function j3(s) { else if (L.isLightProbe) { for (let G = 0; G < 9; G++) n.probe[G].addScaledVector(L.sh.coefficients[G], I); - T++; + C++; } else if (L.isDirectionalLight) { const G = e.get(L); if (G.color.copy(L.color).multiplyScalar(L.intensity), L.castShadow) { const j = L.shadow, Y = t.get(L); - Y.shadowIntensity = j.intensity, Y.shadowBias = j.bias, Y.shadowNormalBias = j.normalBias, Y.shadowRadius = j.radius, Y.shadowMapSize = j.mapSize, n.directionalShadow[d] = Y, n.directionalShadowMap[d] = z, n.directionalShadowMatrix[d] = L.shadow.matrix, y++; + Y.shadowIntensity = j.intensity, Y.shadowBias = j.bias, Y.shadowNormalBias = j.normalBias, Y.shadowRadius = j.radius, Y.shadowMapSize = j.mapSize, n.directionalShadow[d] = Y, n.directionalShadowMap[d] = z, n.directionalShadowMatrix[d] = L.shadow.matrix, b++; } n.directional[d] = G, d++; } else if (L.isSpotLight) { @@ -24323,7 +24303,7 @@ function j3(s) { const j = L.shadow; if (L.map && (n.spotLightMap[_] = L.map, _++, j.updateMatrices(L), L.castShadow && M++), n.spotLightMatrix[f] = j.matrix, L.castShadow) { const Y = t.get(L); - Y.shadowIntensity = j.intensity, Y.shadowBias = j.bias, Y.shadowNormalBias = j.normalBias, Y.shadowRadius = j.radius, Y.shadowMapSize = j.mapSize, n.spotShadow[f] = Y, n.spotShadowMap[f] = z, b++; + Y.shadowIntensity = j.intensity, Y.shadowBias = j.bias, Y.shadowNormalBias = j.normalBias, Y.shadowRadius = j.radius, Y.shadowMapSize = j.mapSize, n.spotShadow[f] = Y, n.spotShadowMap[f] = z, y++; } f++; } else if (L.isRectAreaLight) { @@ -24343,28 +24323,28 @@ function j3(s) { } x > 0 && (s.has("OES_texture_float_linear") === !0 ? (n.rectAreaLTC1 = Pe.LTC_FLOAT_1, n.rectAreaLTC2 = Pe.LTC_FLOAT_2) : (n.rectAreaLTC1 = Pe.LTC_HALF_1, n.rectAreaLTC2 = Pe.LTC_HALF_2)), n.ambient[0] = h, n.ambient[1] = u, n.ambient[2] = p; const R = n.hash; - (R.directionalLength !== d || R.pointLength !== m || R.spotLength !== f || R.rectAreaLength !== x || R.hemiLength !== g || R.numDirectionalShadows !== y || R.numPointShadows !== v || R.numSpotShadows !== b || R.numSpotMaps !== _ || R.numLightProbes !== T) && (n.directional.length = d, n.spot.length = f, n.rectArea.length = x, n.point.length = m, n.hemi.length = g, n.directionalShadow.length = y, n.directionalShadowMap.length = y, n.pointShadow.length = v, n.pointShadowMap.length = v, n.spotShadow.length = b, n.spotShadowMap.length = b, n.directionalShadowMatrix.length = y, n.pointShadowMatrix.length = v, n.spotLightMatrix.length = b + _ - M, n.spotLightMap.length = _, n.numSpotLightShadowsWithMaps = M, n.numLightProbes = T, R.directionalLength = d, R.pointLength = m, R.spotLength = f, R.rectAreaLength = x, R.hemiLength = g, R.numDirectionalShadows = y, R.numPointShadows = v, R.numSpotShadows = b, R.numSpotMaps = _, R.numLightProbes = T, n.version = W3++); + (R.directionalLength !== d || R.pointLength !== m || R.spotLength !== f || R.rectAreaLength !== x || R.hemiLength !== g || R.numDirectionalShadows !== b || R.numPointShadows !== v || R.numSpotShadows !== y || R.numSpotMaps !== _ || R.numLightProbes !== C) && (n.directional.length = d, n.spot.length = f, n.rectArea.length = x, n.point.length = m, n.hemi.length = g, n.directionalShadow.length = b, n.directionalShadowMap.length = b, n.pointShadow.length = v, n.pointShadowMap.length = v, n.spotShadow.length = y, n.spotShadowMap.length = y, n.directionalShadowMatrix.length = b, n.pointShadowMatrix.length = v, n.spotLightMatrix.length = y + _ - M, n.spotLightMap.length = _, n.numSpotLightShadowsWithMaps = M, n.numLightProbes = C, R.directionalLength = d, R.pointLength = m, R.spotLength = f, R.rectAreaLength = x, R.hemiLength = g, R.numDirectionalShadows = b, R.numPointShadows = v, R.numSpotShadows = y, R.numSpotMaps = _, R.numLightProbes = C, n.version = W3++); } function l(c, h) { let u = 0, p = 0, d = 0, m = 0, f = 0; const x = h.matrixWorldInverse; - for (let g = 0, y = c.length; g < y; g++) { + for (let g = 0, b = c.length; g < b; g++) { const v = c[g]; if (v.isDirectionalLight) { - const b = n.directional[u]; - b.direction.setFromMatrixPosition(v.matrixWorld), i.setFromMatrixPosition(v.target.matrixWorld), b.direction.sub(i), b.direction.transformDirection(x), u++; + const y = n.directional[u]; + y.direction.setFromMatrixPosition(v.matrixWorld), i.setFromMatrixPosition(v.target.matrixWorld), y.direction.sub(i), y.direction.transformDirection(x), u++; } else if (v.isSpotLight) { - const b = n.spot[d]; - b.position.setFromMatrixPosition(v.matrixWorld), b.position.applyMatrix4(x), b.direction.setFromMatrixPosition(v.matrixWorld), i.setFromMatrixPosition(v.target.matrixWorld), b.direction.sub(i), b.direction.transformDirection(x), d++; + const y = n.spot[d]; + y.position.setFromMatrixPosition(v.matrixWorld), y.position.applyMatrix4(x), y.direction.setFromMatrixPosition(v.matrixWorld), i.setFromMatrixPosition(v.target.matrixWorld), y.direction.sub(i), y.direction.transformDirection(x), d++; } else if (v.isRectAreaLight) { - const b = n.rectArea[m]; - b.position.setFromMatrixPosition(v.matrixWorld), b.position.applyMatrix4(x), a.identity(), r.copy(v.matrixWorld), r.premultiply(x), a.extractRotation(r), b.halfWidth.set(v.width * 0.5, 0, 0), b.halfHeight.set(0, v.height * 0.5, 0), b.halfWidth.applyMatrix4(a), b.halfHeight.applyMatrix4(a), m++; + const y = n.rectArea[m]; + y.position.setFromMatrixPosition(v.matrixWorld), y.position.applyMatrix4(x), a.identity(), r.copy(v.matrixWorld), r.premultiply(x), a.extractRotation(r), y.halfWidth.set(v.width * 0.5, 0, 0), y.halfHeight.set(0, v.height * 0.5, 0), y.halfWidth.applyMatrix4(a), y.halfHeight.applyMatrix4(a), m++; } else if (v.isPointLight) { - const b = n.point[p]; - b.position.setFromMatrixPosition(v.matrixWorld), b.position.applyMatrix4(x), p++; + const y = n.point[p]; + y.position.setFromMatrixPosition(v.matrixWorld), y.position.applyMatrix4(x), p++; } else if (v.isHemisphereLight) { - const b = n.hemi[f]; - b.direction.setFromMatrixPosition(v.matrixWorld), b.direction.transformDirection(x), f++; + const y = n.hemi[f]; + y.direction.setFromMatrixPosition(v.matrixWorld), y.direction.transformDirection(x), f++; } } } @@ -24469,19 +24449,19 @@ function $3(s, e, t) { const m = new mt(); m.setAttribute( "position", - new yt( + new bt( new Float32Array([-1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5]), 3 ) ); const f = new at(m, p), x = this; - this.enabled = !1, this.autoUpdate = !0, this.needsUpdate = !1, this.type = bm; + this.enabled = !1, this.autoUpdate = !0, this.needsUpdate = !1, this.type = ym; let g = this.type; - this.render = function(M, T, R) { + this.render = function(M, C, R) { if (x.enabled === !1 || x.autoUpdate === !1 && x.needsUpdate === !1 || M.length === 0) return; const S = s.getRenderTarget(), E = s.getActiveCubeFace(), L = s.getActiveMipmapLevel(), A = s.state; A.setBlending(St), A.buffers.depth.getReversed() === !0 ? A.buffers.color.setClear(0, 0, 0, 0) : A.buffers.color.setClear(1, 1, 1, 1), A.buffers.depth.setTest(!0), A.setScissorTest(!1); - const I = g !== Ci && this.type === Ci, w = g === Ci && this.type !== Ci; + const I = g !== Ti && this.type === Ti, w = g === Ti && this.type !== Ti; for (let z = 0, G = M.length; z < G; z++) { const j = M[z], Y = j.shadow; if (Y === void 0) { @@ -24492,7 +24472,7 @@ function $3(s, e, t) { i.copy(Y.mapSize); const q = Y.getFrameExtents(); if (i.multiply(q), r.copy(Y.mapSize), (i.x > h || i.y > h) && (i.x > h && (r.x = Math.floor(h / q.x), i.x = r.x * q.x, Y.mapSize.x = r.x), i.y > h && (r.y = Math.floor(h / q.y), i.y = r.y * q.y, Y.mapSize.y = r.y)), Y.map === null || I === !0 || w === !0) { - const W = this.type !== Ci ? { minFilter: jt, magFilter: jt } : {}; + const W = this.type !== Ti ? { minFilter: jt, magFilter: jt } : {}; Y.map !== null && Y.map.dispose(), Y.map = new Nn(i.x, i.y, W), Y.map.texture.name = j.name + ".shadowMap", Y.camera.updateProjectionMatrix(); } s.setRenderTarget(Y.map), s.clear(); @@ -24504,37 +24484,37 @@ function $3(s, e, t) { r.y * $.y, r.x * $.z, r.y * $.w - ), A.viewport(a), Y.updateMatrices(j, W), n = Y.getFrustum(), b(T, R, Y.camera, j, this.type); + ), A.viewport(a), Y.updateMatrices(j, W), n = Y.getFrustum(), y(C, R, Y.camera, j, this.type); } - Y.isPointLightShadow !== !0 && this.type === Ci && y(Y, R), Y.needsUpdate = !1; + Y.isPointLightShadow !== !0 && this.type === Ti && b(Y, R), Y.needsUpdate = !1; } g = this.type, x.needsUpdate = !1, s.setRenderTarget(S, E, L); }; - function y(M, T) { + function b(M, C) { const R = e.update(f); - p.defines.VSM_SAMPLES !== M.blurSamples && (p.defines.VSM_SAMPLES = M.blurSamples, d.defines.VSM_SAMPLES = M.blurSamples, p.needsUpdate = !0, d.needsUpdate = !0), M.mapPass === null && (M.mapPass = new Nn(i.x, i.y)), p.uniforms.shadow_pass.value = M.map.texture, p.uniforms.resolution.value = M.mapSize, p.uniforms.radius.value = M.radius, s.setRenderTarget(M.mapPass), s.clear(), s.renderBufferDirect(T, null, R, p, f, null), d.uniforms.shadow_pass.value = M.mapPass.texture, d.uniforms.resolution.value = M.mapSize, d.uniforms.radius.value = M.radius, s.setRenderTarget(M.map), s.clear(), s.renderBufferDirect(T, null, R, d, f, null); + p.defines.VSM_SAMPLES !== M.blurSamples && (p.defines.VSM_SAMPLES = M.blurSamples, d.defines.VSM_SAMPLES = M.blurSamples, p.needsUpdate = !0, d.needsUpdate = !0), M.mapPass === null && (M.mapPass = new Nn(i.x, i.y)), p.uniforms.shadow_pass.value = M.map.texture, p.uniforms.resolution.value = M.mapSize, p.uniforms.radius.value = M.radius, s.setRenderTarget(M.mapPass), s.clear(), s.renderBufferDirect(C, null, R, p, f, null), d.uniforms.shadow_pass.value = M.mapPass.texture, d.uniforms.resolution.value = M.mapSize, d.uniforms.radius.value = M.radius, s.setRenderTarget(M.map), s.clear(), s.renderBufferDirect(C, null, R, d, f, null); } - function v(M, T, R, S) { + function v(M, C, R, S) { let E = null; const L = R.isPointLight === !0 ? M.customDistanceMaterial : M.customDepthMaterial; if (L !== void 0) E = L; - else if (E = R.isPointLight === !0 ? l : o, s.localClippingEnabled && T.clipShadows === !0 && Array.isArray(T.clippingPlanes) && T.clippingPlanes.length !== 0 || T.displacementMap && T.displacementScale !== 0 || T.alphaMap && T.alphaTest > 0 || T.map && T.alphaTest > 0 || T.alphaToCoverage === !0) { - const A = E.uuid, I = T.uuid; + else if (E = R.isPointLight === !0 ? l : o, s.localClippingEnabled && C.clipShadows === !0 && Array.isArray(C.clippingPlanes) && C.clippingPlanes.length !== 0 || C.displacementMap && C.displacementScale !== 0 || C.alphaMap && C.alphaTest > 0 || C.map && C.alphaTest > 0 || C.alphaToCoverage === !0) { + const A = E.uuid, I = C.uuid; let w = c[A]; w === void 0 && (w = {}, c[A] = w); let z = w[I]; - z === void 0 && (z = E.clone(), w[I] = z, T.addEventListener("dispose", _)), E = z; + z === void 0 && (z = E.clone(), w[I] = z, C.addEventListener("dispose", _)), E = z; } - if (E.visible = T.visible, E.wireframe = T.wireframe, S === Ci ? E.side = T.shadowSide !== null ? T.shadowSide : T.side : E.side = T.shadowSide !== null ? T.shadowSide : u[T.side], E.alphaMap = T.alphaMap, E.alphaTest = T.alphaToCoverage === !0 ? 0.5 : T.alphaTest, E.map = T.map, E.clipShadows = T.clipShadows, E.clippingPlanes = T.clippingPlanes, E.clipIntersection = T.clipIntersection, E.displacementMap = T.displacementMap, E.displacementScale = T.displacementScale, E.displacementBias = T.displacementBias, E.wireframeLinewidth = T.wireframeLinewidth, E.linewidth = T.linewidth, R.isPointLight === !0 && E.isMeshDistanceMaterial === !0) { + if (E.visible = C.visible, E.wireframe = C.wireframe, S === Ti ? E.side = C.shadowSide !== null ? C.shadowSide : C.side : E.side = C.shadowSide !== null ? C.shadowSide : u[C.side], E.alphaMap = C.alphaMap, E.alphaTest = C.alphaToCoverage === !0 ? 0.5 : C.alphaTest, E.map = C.map, E.clipShadows = C.clipShadows, E.clippingPlanes = C.clippingPlanes, E.clipIntersection = C.clipIntersection, E.displacementMap = C.displacementMap, E.displacementScale = C.displacementScale, E.displacementBias = C.displacementBias, E.wireframeLinewidth = C.wireframeLinewidth, E.linewidth = C.linewidth, R.isPointLight === !0 && E.isMeshDistanceMaterial === !0) { const A = s.properties.get(E); A.light = R; } return E; } - function b(M, T, R, S, E) { + function y(M, C, R, S, E) { if (M.visible === !1) return; - if (M.layers.test(T.layers) && (M.isMesh || M.isLine || M.isPoints) && (M.castShadow || M.receiveShadow && E === Ci) && (!M.frustumCulled || n.intersectsObject(M))) { + if (M.layers.test(C.layers) && (M.isMesh || M.isLine || M.isPoints) && (M.castShadow || M.receiveShadow && E === Ti) && (!M.frustumCulled || n.intersectsObject(M))) { M.modelViewMatrix.multiplyMatrices(R.matrixWorldInverse, M.matrixWorld); const I = e.update(M), w = M.material; if (Array.isArray(w)) { @@ -24543,17 +24523,17 @@ function $3(s, e, t) { const Y = z[G], q = w[Y.materialIndex]; if (q && q.visible) { const ie = v(M, q, S, E); - M.onBeforeShadow(s, M, T, R, I, ie, Y), s.renderBufferDirect(R, null, I, ie, M, Y), M.onAfterShadow(s, M, T, R, I, ie, Y); + M.onBeforeShadow(s, M, C, R, I, ie, Y), s.renderBufferDirect(R, null, I, ie, M, Y), M.onAfterShadow(s, M, C, R, I, ie, Y); } } } else if (w.visible) { const z = v(M, w, S, E); - M.onBeforeShadow(s, M, T, R, I, z, null), s.renderBufferDirect(R, null, I, z, M, null), M.onAfterShadow(s, M, T, R, I, z, null); + M.onBeforeShadow(s, M, C, R, I, z, null), s.renderBufferDirect(R, null, I, z, M, null), M.onAfterShadow(s, M, C, R, I, z, null); } } const A = M.children; for (let I = 0, w = A.length; I < w; I++) - b(A[I], T, R, S, E); + y(A[I], C, R, S, E); } function _(M) { M.target.removeEventListener("dispose", _); @@ -24565,18 +24545,18 @@ function $3(s, e, t) { } const K3 = { [Sh]: Eh, - [Th]: Ph, - [Ch]: Rh, + [Ch]: Ph, + [Th]: Rh, [Lr]: Ah, [Eh]: Sh, - [Ph]: Th, - [Rh]: Ch, + [Ph]: Ch, + [Rh]: Th, [Ah]: Lr }; function J3(s, e) { function t() { let Z = !1; - const Te = new tt(); + const Ce = new tt(); let Me = null; const we = new tt(0, 0, 0, 0); return { @@ -24586,8 +24566,8 @@ function J3(s, e) { setLocked: function(ve) { Z = ve; }, - setClear: function(ve, ge, Oe, Ye, bt) { - bt === !0 && (ve *= Ye, ge *= Ye, Oe *= Ye), Te.set(ve, ge, Oe, Ye), we.equals(Te) === !1 && (s.clearColor(ve, ge, Oe, Ye), we.copy(Te)); + setClear: function(ve, ge, Oe, Ye, yt) { + yt === !0 && (ve *= Ye, ge *= Ye, Oe *= Ye), Ce.set(ve, ge, Oe, Ye), we.equals(Ce) === !1 && (s.clearColor(ve, ge, Oe, Ye), we.copy(Ce)); }, reset: function() { Z = !1, Me = null, we.set(-1, 0, 0, 0); @@ -24595,18 +24575,18 @@ function J3(s, e) { }; } function n() { - let Z = !1, Te = !1, Me = null, we = null, ve = null; + let Z = !1, Ce = !1, Me = null, we = null, ve = null; return { setReversed: function(ge) { - if (Te !== ge) { + if (Ce !== ge) { const Oe = e.get("EXT_clip_control"); - ge ? Oe.clipControlEXT(Oe.LOWER_LEFT_EXT, Oe.ZERO_TO_ONE_EXT) : Oe.clipControlEXT(Oe.LOWER_LEFT_EXT, Oe.NEGATIVE_ONE_TO_ONE_EXT), Te = ge; + ge ? Oe.clipControlEXT(Oe.LOWER_LEFT_EXT, Oe.ZERO_TO_ONE_EXT) : Oe.clipControlEXT(Oe.LOWER_LEFT_EXT, Oe.NEGATIVE_ONE_TO_ONE_EXT), Ce = ge; const Ye = ve; ve = null, this.setClear(Ye); } }, getReversed: function() { - return Te; + return Ce; }, setTest: function(ge) { ge ? ce(s.DEPTH_TEST) : pe(s.DEPTH_TEST); @@ -24615,7 +24595,7 @@ function J3(s, e) { Me !== ge && !Z && (s.depthMask(ge), Me = ge); }, setFunc: function(ge) { - if (Te && (ge = K3[ge]), we !== ge) { + if (Ce && (ge = K3[ge]), we !== ge) { switch (ge) { case Sh: s.depthFunc(s.NEVER); @@ -24623,13 +24603,13 @@ function J3(s, e) { case Eh: s.depthFunc(s.ALWAYS); break; - case Th: + case Ch: s.depthFunc(s.LESS); break; case Lr: s.depthFunc(s.LEQUAL); break; - case Ch: + case Th: s.depthFunc(s.EQUAL); break; case Ah: @@ -24651,21 +24631,21 @@ function J3(s, e) { Z = ge; }, setClear: function(ge) { - ve !== ge && (Te && (ge = 1 - ge), s.clearDepth(ge), ve = ge); + ve !== ge && (Ce && (ge = 1 - ge), s.clearDepth(ge), ve = ge); }, reset: function() { - Z = !1, Me = null, we = null, ve = null, Te = !1; + Z = !1, Me = null, we = null, ve = null, Ce = !1; } }; } function i() { - let Z = !1, Te = null, Me = null, we = null, ve = null, ge = null, Oe = null, Ye = null, bt = null; + let Z = !1, Ce = null, Me = null, we = null, ve = null, ge = null, Oe = null, Ye = null, yt = null; return { setTest: function(dt) { Z || (dt ? ce(s.STENCIL_TEST) : pe(s.STENCIL_TEST)); }, setMask: function(dt) { - Te !== dt && !Z && (s.stencilMask(dt), Te = dt); + Ce !== dt && !Z && (s.stencilMask(dt), Ce = dt); }, setFunc: function(dt, ai, $n) { (Me !== dt || we !== ai || ve !== $n) && (s.stencilFunc(dt, ai, $n), Me = dt, we = ai, ve = $n); @@ -24677,43 +24657,43 @@ function J3(s, e) { Z = dt; }, setClear: function(dt) { - bt !== dt && (s.clearStencil(dt), bt = dt); + yt !== dt && (s.clearStencil(dt), yt = dt); }, reset: function() { - Z = !1, Te = null, Me = null, we = null, ve = null, ge = null, Oe = null, Ye = null, bt = null; + Z = !1, Ce = null, Me = null, we = null, ve = null, ge = null, Oe = null, Ye = null, yt = null; } }; } const r = new t(), a = new n(), o = new i(), l = /* @__PURE__ */ new WeakMap(), c = /* @__PURE__ */ new WeakMap(); - let h = {}, u = {}, p = /* @__PURE__ */ new WeakMap(), d = [], m = null, f = !1, x = null, g = null, y = null, v = null, b = null, _ = null, M = null, T = new Fe(0, 0, 0), R = 0, S = !1, E = null, L = null, A = null, I = null, w = null; + let h = {}, u = {}, p = /* @__PURE__ */ new WeakMap(), d = [], m = null, f = !1, x = null, g = null, b = null, v = null, y = null, _ = null, M = null, C = new Fe(0, 0, 0), R = 0, S = !1, E = null, L = null, A = null, I = null, w = null; const z = s.getParameter(s.MAX_COMBINED_TEXTURE_IMAGE_UNITS); let G = !1, j = 0; const Y = s.getParameter(s.VERSION); Y.indexOf("WebGL") !== -1 ? (j = parseFloat(/^WebGL (\d)/.exec(Y)[1]), G = j >= 1) : Y.indexOf("OpenGL ES") !== -1 && (j = parseFloat(/^OpenGL ES (\d)/.exec(Y)[1]), G = j >= 2); let q = null, ie = {}; const W = s.getParameter(s.SCISSOR_BOX), $ = s.getParameter(s.VIEWPORT), fe = new tt().fromArray(W), me = new tt().fromArray($); - function de(Z, Te, Me, we) { + function de(Z, Ce, Me, we) { const ve = new Uint8Array(4), ge = s.createTexture(); s.bindTexture(Z, ge), s.texParameteri(Z, s.TEXTURE_MIN_FILTER, s.NEAREST), s.texParameteri(Z, s.TEXTURE_MAG_FILTER, s.NEAREST); for (let Oe = 0; Oe < Me; Oe++) - Z === s.TEXTURE_3D || Z === s.TEXTURE_2D_ARRAY ? s.texImage3D(Te, 0, s.RGBA, 1, 1, we, 0, s.RGBA, s.UNSIGNED_BYTE, ve) : s.texImage2D(Te + Oe, 0, s.RGBA, 1, 1, 0, s.RGBA, s.UNSIGNED_BYTE, ve); + Z === s.TEXTURE_3D || Z === s.TEXTURE_2D_ARRAY ? s.texImage3D(Ce, 0, s.RGBA, 1, 1, we, 0, s.RGBA, s.UNSIGNED_BYTE, ve) : s.texImage2D(Ce + Oe, 0, s.RGBA, 1, 1, 0, s.RGBA, s.UNSIGNED_BYTE, ve); return ge; } const se = {}; - se[s.TEXTURE_2D] = de(s.TEXTURE_2D, s.TEXTURE_2D, 1), se[s.TEXTURE_CUBE_MAP] = de(s.TEXTURE_CUBE_MAP, s.TEXTURE_CUBE_MAP_POSITIVE_X, 6), se[s.TEXTURE_2D_ARRAY] = de(s.TEXTURE_2D_ARRAY, s.TEXTURE_2D_ARRAY, 1, 1), se[s.TEXTURE_3D] = de(s.TEXTURE_3D, s.TEXTURE_3D, 1, 1), r.setClear(0, 0, 0, 1), a.setClear(1), o.setClear(0), ce(s.DEPTH_TEST), a.setFunc(Lr), V(!1), U(Ad), ce(s.CULL_FACE), C(St); + se[s.TEXTURE_2D] = de(s.TEXTURE_2D, s.TEXTURE_2D, 1), se[s.TEXTURE_CUBE_MAP] = de(s.TEXTURE_CUBE_MAP, s.TEXTURE_CUBE_MAP_POSITIVE_X, 6), se[s.TEXTURE_2D_ARRAY] = de(s.TEXTURE_2D_ARRAY, s.TEXTURE_2D_ARRAY, 1, 1), se[s.TEXTURE_3D] = de(s.TEXTURE_3D, s.TEXTURE_3D, 1, 1), r.setClear(0, 0, 0, 1), a.setClear(1), o.setClear(0), ce(s.DEPTH_TEST), a.setFunc(Lr), V(!1), U(Ad), ce(s.CULL_FACE), T(St); function ce(Z) { h[Z] !== !0 && (s.enable(Z), h[Z] = !0); } function pe(Z) { h[Z] !== !1 && (s.disable(Z), h[Z] = !1); } - function ye(Z, Te) { - return u[Z] !== Te ? (s.bindFramebuffer(Z, Te), u[Z] = Te, Z === s.DRAW_FRAMEBUFFER && (u[s.FRAMEBUFFER] = Te), Z === s.FRAMEBUFFER && (u[s.DRAW_FRAMEBUFFER] = Te), !0) : !1; + function be(Z, Ce) { + return u[Z] !== Ce ? (s.bindFramebuffer(Z, Ce), u[Z] = Ce, Z === s.DRAW_FRAMEBUFFER && (u[s.FRAMEBUFFER] = Ce), Z === s.FRAMEBUFFER && (u[s.DRAW_FRAMEBUFFER] = Ce), !0) : !1; } - function Se(Z, Te) { + function Se(Z, Ce) { let Me = d, we = !1; if (Z) { - Me = p.get(Te), Me === void 0 && (Me = [], p.set(Te, Me)); + Me = p.get(Ce), Me === void 0 && (Me = [], p.set(Ce, Me)); const ve = Z.textures; if (Me.length !== ve.length || Me[0] !== s.COLOR_ATTACHMENT0) { for (let ge = 0, Oe = ve.length; ge < Oe; ge++) @@ -24750,16 +24730,16 @@ function J3(s, e) { [jg]: s.CONSTANT_ALPHA, [qg]: s.ONE_MINUS_CONSTANT_ALPHA }; - function C(Z, Te, Me, we, ve, ge, Oe, Ye, bt, dt) { + function T(Z, Ce, Me, we, ve, ge, Oe, Ye, yt, dt) { if (Z === St) { f === !0 && (pe(s.BLEND), f = !1); return; } if (f === !1 && (ce(s.BLEND), f = !0), Z !== Uu) { if (Z !== x || dt !== S) { - if ((g !== Rn || b !== Rn) && (s.blendEquation(s.FUNC_ADD), g = Rn, b = Rn), dt) + if ((g !== Rn || y !== Rn) && (s.blendEquation(s.FUNC_ADD), g = Rn, y = Rn), dt) switch (Z) { - case Cr: + case Tr: s.blendFuncSeparate(s.ONE, s.ONE_MINUS_SRC_ALPHA, s.ONE, s.ONE_MINUS_SRC_ALPHA); break; case _h: @@ -24777,7 +24757,7 @@ function J3(s, e) { } else switch (Z) { - case Cr: + case Tr: s.blendFuncSeparate(s.SRC_ALPHA, s.ONE_MINUS_SRC_ALPHA, s.ONE, s.ONE_MINUS_SRC_ALPHA); break; case _h: @@ -24793,16 +24773,16 @@ function J3(s, e) { et("WebGLState: Invalid blending: ", Z); break; } - y = null, v = null, _ = null, M = null, T.set(0, 0, 0), R = 0, x = Z, S = dt; + b = null, v = null, _ = null, M = null, C.set(0, 0, 0), R = 0, x = Z, S = dt; } return; } - ve = ve || Te, ge = ge || Me, Oe = Oe || we, (Te !== g || ve !== b) && (s.blendEquationSeparate($e[Te], $e[ve]), g = Te, b = ve), (Me !== y || we !== v || ge !== _ || Oe !== M) && (s.blendFuncSeparate(ke[Me], ke[we], ke[ge], ke[Oe]), y = Me, v = we, _ = ge, M = Oe), (Ye.equals(T) === !1 || bt !== R) && (s.blendColor(Ye.r, Ye.g, Ye.b, bt), T.copy(Ye), R = bt), x = Z, S = !1; + ve = ve || Ce, ge = ge || Me, Oe = Oe || we, (Ce !== g || ve !== y) && (s.blendEquationSeparate($e[Ce], $e[ve]), g = Ce, y = ve), (Me !== b || we !== v || ge !== _ || Oe !== M) && (s.blendFuncSeparate(ke[Me], ke[we], ke[ge], ke[Oe]), b = Me, v = we, _ = ge, M = Oe), (Ye.equals(C) === !1 || yt !== R) && (s.blendColor(Ye.r, Ye.g, Ye.b, yt), C.copy(Ye), R = yt), x = Z, S = !1; } - function N(Z, Te) { + function N(Z, Ce) { Z.side === Mt ? pe(s.CULL_FACE) : ce(s.CULL_FACE); let Me = Z.side === cn; - Te && (Me = !Me), V(Me), Z.blending === Cr && Z.transparent === !1 ? C(St) : C(Z.blending, Z.blendEquation, Z.blendSrc, Z.blendDst, Z.blendEquationAlpha, Z.blendSrcAlpha, Z.blendDstAlpha, Z.blendColor, Z.blendAlpha, Z.premultipliedAlpha), a.setFunc(Z.depthFunc), a.setTest(Z.depthTest), a.setMask(Z.depthWrite), r.setMask(Z.colorWrite); + Ce && (Me = !Me), V(Me), Z.blending === Tr && Z.transparent === !1 ? T(St) : T(Z.blending, Z.blendEquation, Z.blendSrc, Z.blendDst, Z.blendEquationAlpha, Z.blendSrcAlpha, Z.blendDstAlpha, Z.blendColor, Z.blendAlpha, Z.premultipliedAlpha), a.setFunc(Z.depthFunc), a.setTest(Z.depthTest), a.setMask(Z.depthWrite), r.setMask(Z.colorWrite); const we = Z.stencilWrite; o.setTest(we), we && (o.setMask(Z.stencilWriteMask), o.setFunc(Z.stencilFunc, Z.stencilRef, Z.stencilFuncMask), o.setOp(Z.stencilFail, Z.stencilZFail, Z.stencilZPass)), F(Z.polygonOffset, Z.polygonOffsetFactor, Z.polygonOffsetUnits), Z.alphaToCoverage === !0 ? ce(s.SAMPLE_ALPHA_TO_COVERAGE) : pe(s.SAMPLE_ALPHA_TO_COVERAGE); } @@ -24815,8 +24795,8 @@ function J3(s, e) { function k(Z) { Z !== A && (G && s.lineWidth(Z), A = Z); } - function F(Z, Te, Me) { - Z ? (ce(s.POLYGON_OFFSET_FILL), (I !== Te || w !== Me) && (s.polygonOffset(Te, Me), I = Te, w = Me)) : pe(s.POLYGON_OFFSET_FILL); + function F(Z, Ce, Me) { + Z ? (ce(s.POLYGON_OFFSET_FILL), (I !== Ce || w !== Me) && (s.polygonOffset(Ce, Me), I = Ce, w = Me)) : pe(s.POLYGON_OFFSET_FILL); } function ee(Z) { Z ? ce(s.SCISSOR_TEST) : pe(s.SCISSOR_TEST); @@ -24824,10 +24804,10 @@ function J3(s, e) { function J(Z) { Z === void 0 && (Z = s.TEXTURE0 + z - 1), q !== Z && (s.activeTexture(Z), q = Z); } - function X(Z, Te, Me) { + function X(Z, Ce, Me) { Me === void 0 && (q === null ? Me = s.TEXTURE0 + z - 1 : Me = q); let we = ie[Me]; - we === void 0 && (we = { type: void 0, texture: void 0 }, ie[Me] = we), (we.type !== Z || we.texture !== Te) && (q !== Me && (s.activeTexture(Me), q = Me), s.bindTexture(Z, Te || se[Z]), we.type = Z, we.texture = Te); + we === void 0 && (we = { type: void 0, texture: void 0 }, ie[Me] = we), (we.type !== Z || we.texture !== Ce) && (q !== Me && (s.activeTexture(Me), q = Me), s.bindTexture(Z, Ce || se[Z]), we.type = Z, we.texture = Ce); } function B() { const Z = ie[q]; @@ -24868,14 +24848,14 @@ function J3(s, e) { Z("WebGLState:", Z); } } - function Ce() { + function Te() { try { s.compressedTexSubImage3D(...arguments); } catch (Z) { Z("WebGLState:", Z); } } - function be() { + function ye() { try { s.texStorage2D(...arguments); } catch (Z) { @@ -24909,18 +24889,18 @@ function J3(s, e) { function Ve(Z) { me.equals(Z) === !1 && (s.viewport(Z.x, Z.y, Z.z, Z.w), me.copy(Z)); } - function Ue(Z, Te) { - let Me = c.get(Te); - Me === void 0 && (Me = /* @__PURE__ */ new WeakMap(), c.set(Te, Me)); + function Ue(Z, Ce) { + let Me = c.get(Ce); + Me === void 0 && (Me = /* @__PURE__ */ new WeakMap(), c.set(Ce, Me)); let we = Me.get(Z); - we === void 0 && (we = s.getUniformBlockIndex(Te, Z.name), Me.set(Z, we)); + we === void 0 && (we = s.getUniformBlockIndex(Ce, Z.name), Me.set(Z, we)); } - function Ae(Z, Te) { - const we = c.get(Te).get(Z); - l.get(Te) !== we && (s.uniformBlockBinding(Te, we, Z.__bindingPointIndex), l.set(Te, we)); + function Ae(Z, Ce) { + const we = c.get(Ce).get(Z); + l.get(Ce) !== we && (s.uniformBlockBinding(Ce, we, Z.__bindingPointIndex), l.set(Ce, we)); } function Ge() { - s.disable(s.BLEND), s.disable(s.CULL_FACE), s.disable(s.DEPTH_TEST), s.disable(s.POLYGON_OFFSET_FILL), s.disable(s.SCISSOR_TEST), s.disable(s.STENCIL_TEST), s.disable(s.SAMPLE_ALPHA_TO_COVERAGE), s.blendEquation(s.FUNC_ADD), s.blendFunc(s.ONE, s.ZERO), s.blendFuncSeparate(s.ONE, s.ZERO, s.ONE, s.ZERO), s.blendColor(0, 0, 0, 0), s.colorMask(!0, !0, !0, !0), s.clearColor(0, 0, 0, 0), s.depthMask(!0), s.depthFunc(s.LESS), a.setReversed(!1), s.clearDepth(1), s.stencilMask(4294967295), s.stencilFunc(s.ALWAYS, 0, 4294967295), s.stencilOp(s.KEEP, s.KEEP, s.KEEP), s.clearStencil(0), s.cullFace(s.BACK), s.frontFace(s.CCW), s.polygonOffset(0, 0), s.activeTexture(s.TEXTURE0), s.bindFramebuffer(s.FRAMEBUFFER, null), s.bindFramebuffer(s.DRAW_FRAMEBUFFER, null), s.bindFramebuffer(s.READ_FRAMEBUFFER, null), s.useProgram(null), s.lineWidth(1), s.scissor(0, 0, s.canvas.width, s.canvas.height), s.viewport(0, 0, s.canvas.width, s.canvas.height), h = {}, q = null, ie = {}, u = {}, p = /* @__PURE__ */ new WeakMap(), d = [], m = null, f = !1, x = null, g = null, y = null, v = null, b = null, _ = null, M = null, T = new Fe(0, 0, 0), R = 0, S = !1, E = null, L = null, A = null, I = null, w = null, fe.set(0, 0, s.canvas.width, s.canvas.height), me.set(0, 0, s.canvas.width, s.canvas.height), r.reset(), a.reset(), o.reset(); + s.disable(s.BLEND), s.disable(s.CULL_FACE), s.disable(s.DEPTH_TEST), s.disable(s.POLYGON_OFFSET_FILL), s.disable(s.SCISSOR_TEST), s.disable(s.STENCIL_TEST), s.disable(s.SAMPLE_ALPHA_TO_COVERAGE), s.blendEquation(s.FUNC_ADD), s.blendFunc(s.ONE, s.ZERO), s.blendFuncSeparate(s.ONE, s.ZERO, s.ONE, s.ZERO), s.blendColor(0, 0, 0, 0), s.colorMask(!0, !0, !0, !0), s.clearColor(0, 0, 0, 0), s.depthMask(!0), s.depthFunc(s.LESS), a.setReversed(!1), s.clearDepth(1), s.stencilMask(4294967295), s.stencilFunc(s.ALWAYS, 0, 4294967295), s.stencilOp(s.KEEP, s.KEEP, s.KEEP), s.clearStencil(0), s.cullFace(s.BACK), s.frontFace(s.CCW), s.polygonOffset(0, 0), s.activeTexture(s.TEXTURE0), s.bindFramebuffer(s.FRAMEBUFFER, null), s.bindFramebuffer(s.DRAW_FRAMEBUFFER, null), s.bindFramebuffer(s.READ_FRAMEBUFFER, null), s.useProgram(null), s.lineWidth(1), s.scissor(0, 0, s.canvas.width, s.canvas.height), s.viewport(0, 0, s.canvas.width, s.canvas.height), h = {}, q = null, ie = {}, u = {}, p = /* @__PURE__ */ new WeakMap(), d = [], m = null, f = !1, x = null, g = null, b = null, v = null, y = null, _ = null, M = null, C = new Fe(0, 0, 0), R = 0, S = !1, E = null, L = null, A = null, I = null, w = null, fe.set(0, 0, s.canvas.width, s.canvas.height), me.set(0, 0, s.canvas.width, s.canvas.height), r.reset(), a.reset(), o.reset(); } return { buffers: { @@ -24930,10 +24910,10 @@ function J3(s, e) { }, enable: ce, disable: pe, - bindFramebuffer: ye, + bindFramebuffer: be, drawBuffers: Se, useProgram: Be, - setBlending: C, + setBlending: T, setMaterial: N, setFlipSided: V, setCullFace: U, @@ -24949,12 +24929,12 @@ function J3(s, e) { texImage3D: ue, updateUBOMapping: Ue, uniformBlockBinding: Ae, - texStorage2D: be, + texStorage2D: ye, texStorage3D: Re, texSubImage2D: K, texSubImage3D: le, compressedTexSubImage2D: te, - compressedTexSubImage3D: Ce, + compressedTexSubImage3D: Te, scissor: _e, viewport: Ve, reset: Ge @@ -24980,10 +24960,10 @@ function Q3(s, e, t, n, i, r, a) { const le = X(B); if ((le.width > H || le.height > H) && (K = H / Math.max(le.width, le.height)), K < 1) if (typeof HTMLImageElement < "u" && B instanceof HTMLImageElement || typeof HTMLCanvasElement < "u" && B instanceof HTMLCanvasElement || typeof ImageBitmap < "u" && B instanceof ImageBitmap || typeof VideoFrame < "u" && B instanceof VideoFrame) { - const te = Math.floor(K * le.width), Ce = Math.floor(K * le.height); - u === void 0 && (u = m(te, Ce)); - const be = D ? m(te, Ce) : u; - return be.width = te, be.height = Ce, be.getContext("2d").drawImage(B, 0, 0, te, Ce), He("WebGLRenderer: Texture has been resized from (" + le.width + "x" + le.height + ") to (" + te + "x" + Ce + ")."), be; + const te = Math.floor(K * le.width), Te = Math.floor(K * le.height); + u === void 0 && (u = m(te, Te)); + const ye = D ? m(te, Te) : u; + return ye.width = te, ye.height = Te, ye.getContext("2d").drawImage(B, 0, 0, te, Te), He("WebGLRenderer: Texture has been resized from (" + le.width + "x" + le.height + ") to (" + te + "x" + Te + ")."), ye; } else return "data" in B && He("WebGLRenderer: Image in DataTexture is too big (" + le.width + "x" + le.height + ")."), B; return B; @@ -24994,7 +24974,7 @@ function Q3(s, e, t, n, i, r, a) { function g(B) { s.generateMipmap(B); } - function y(B) { + function b(B) { return B.isWebGLCubeRenderTarget ? s.TEXTURE_CUBE_MAP : B.isWebGL3DRenderTarget ? s.TEXTURE_3D : B.isWebGLArrayRenderTarget || B.isCompressedArrayTexture ? s.TEXTURE_2D_ARRAY : s.TEXTURE_2D; } function v(B, D, H, K, le = !1) { @@ -25004,12 +24984,12 @@ function Q3(s, e, t, n, i, r, a) { } let te = D; if (D === s.RED && (H === s.FLOAT && (te = s.R32F), H === s.HALF_FLOAT && (te = s.R16F), H === s.UNSIGNED_BYTE && (te = s.R8)), D === s.RED_INTEGER && (H === s.UNSIGNED_BYTE && (te = s.R8UI), H === s.UNSIGNED_SHORT && (te = s.R16UI), H === s.UNSIGNED_INT && (te = s.R32UI), H === s.BYTE && (te = s.R8I), H === s.SHORT && (te = s.R16I), H === s.INT && (te = s.R32I)), D === s.RG && (H === s.FLOAT && (te = s.RG32F), H === s.HALF_FLOAT && (te = s.RG16F), H === s.UNSIGNED_BYTE && (te = s.RG8)), D === s.RG_INTEGER && (H === s.UNSIGNED_BYTE && (te = s.RG8UI), H === s.UNSIGNED_SHORT && (te = s.RG16UI), H === s.UNSIGNED_INT && (te = s.RG32UI), H === s.BYTE && (te = s.RG8I), H === s.SHORT && (te = s.RG16I), H === s.INT && (te = s.RG32I)), D === s.RGB_INTEGER && (H === s.UNSIGNED_BYTE && (te = s.RGB8UI), H === s.UNSIGNED_SHORT && (te = s.RGB16UI), H === s.UNSIGNED_INT && (te = s.RGB32UI), H === s.BYTE && (te = s.RGB8I), H === s.SHORT && (te = s.RGB16I), H === s.INT && (te = s.RGB32I)), D === s.RGBA_INTEGER && (H === s.UNSIGNED_BYTE && (te = s.RGBA8UI), H === s.UNSIGNED_SHORT && (te = s.RGBA16UI), H === s.UNSIGNED_INT && (te = s.RGBA32UI), H === s.BYTE && (te = s.RGBA8I), H === s.SHORT && (te = s.RGBA16I), H === s.INT && (te = s.RGBA32I)), D === s.RGB && (H === s.UNSIGNED_INT_5_9_9_9_REV && (te = s.RGB9_E5), H === s.UNSIGNED_INT_10F_11F_11F_REV && (te = s.R11F_G11F_B10F)), D === s.RGBA) { - const Ce = le ? Cl : st.getTransfer(K); - H === s.FLOAT && (te = s.RGBA32F), H === s.HALF_FLOAT && (te = s.RGBA16F), H === s.UNSIGNED_BYTE && (te = Ce === ct ? s.SRGB8_ALPHA8 : s.RGBA8), H === s.UNSIGNED_SHORT_4_4_4_4 && (te = s.RGBA4), H === s.UNSIGNED_SHORT_5_5_5_1 && (te = s.RGB5_A1); + const Te = le ? Tl : st.getTransfer(K); + H === s.FLOAT && (te = s.RGBA32F), H === s.HALF_FLOAT && (te = s.RGBA16F), H === s.UNSIGNED_BYTE && (te = Te === ct ? s.SRGB8_ALPHA8 : s.RGBA8), H === s.UNSIGNED_SHORT_4_4_4_4 && (te = s.RGBA4), H === s.UNSIGNED_SHORT_5_5_5_1 && (te = s.RGB5_A1); } return (te === s.R16F || te === s.R32F || te === s.RG16F || te === s.RG32F || te === s.RGBA16F || te === s.RGBA32F) && e.get("EXT_color_buffer_float"), te; } - function b(B, D) { + function y(B, D) { let H; return B ? D === null || D === Ns || D === Bs ? H = s.DEPTH24_STENCIL8 : D === fn ? H = s.DEPTH32F_STENCIL8 : D === Pa && (H = s.DEPTH24_STENCIL8, He("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")) : D === null || D === Ns || D === Bs ? H = s.DEPTH_COMPONENT24 : D === fn ? H = s.DEPTH_COMPONENT32F : D === Pa && (H = s.DEPTH_COMPONENT16), H; } @@ -25020,9 +25000,9 @@ function Q3(s, e, t, n, i, r, a) { const D = B.target; D.removeEventListener("dispose", M), R(D), D.isVideoTexture && h.delete(D); } - function T(B) { + function C(B) { const D = B.target; - D.removeEventListener("dispose", T), E(D); + D.removeEventListener("dispose", C), E(D); } function R(B) { const D = n.get(B); @@ -25121,7 +25101,7 @@ function Q3(s, e, t, n, i, r, a) { const q = { [In]: s.REPEAT, [Vn]: s.CLAMP_TO_EDGE, - [Tl]: s.MIRRORED_REPEAT + [Cl]: s.MIRRORED_REPEAT }, ie = { [jt]: s.NEAREST, [Rm]: s.NEAREST_MIPMAP_NEAREST, @@ -25160,8 +25140,8 @@ function Q3(s, e, t, n, i, r, a) { texture: s.createTexture(), usedTimes: 0 }, a.memory.textures++, H = !0), le[te].usedTimes++; - const Ce = le[B.__cacheKey]; - Ce !== void 0 && (le[B.__cacheKey].usedTimes--, Ce.usedTimes === 0 && S(D)), B.__cacheKey = te, B.__webglTexture = le[te].texture; + const Te = le[B.__cacheKey]; + Te !== void 0 && (le[B.__cacheKey].usedTimes--, Te.usedTimes === 0 && S(D)), B.__cacheKey = te, B.__webglTexture = le[te].texture; } return H; } @@ -25174,22 +25154,22 @@ function Q3(s, e, t, n, i, r, a) { t.texSubImage2D(s.TEXTURE_2D, 0, 0, 0, D.width, D.height, H, K, D.data); else { te.sort((ue, _e) => ue.start - _e.start); - let Ce = 0; + let Te = 0; for (let ue = 1; ue < te.length; ue++) { - const _e = te[Ce], Ve = te[ue], Ue = _e.start + _e.count, Ae = me(Ve.start, D.width, 4), Ge = me(_e.start, D.width, 4); + const _e = te[Te], Ve = te[ue], Ue = _e.start + _e.count, Ae = me(Ve.start, D.width, 4), Ge = me(_e.start, D.width, 4); Ve.start <= Ue + 1 && Ae === Ge && me(Ve.start + Ve.count - 1, D.width, 4) === Ae ? _e.count = Math.max( _e.count, Ve.start + Ve.count - _e.start - ) : (++Ce, te[Ce] = Ve); + ) : (++Te, te[Te] = Ve); } - te.length = Ce + 1; - const be = s.getParameter(s.UNPACK_ROW_LENGTH), Re = s.getParameter(s.UNPACK_SKIP_PIXELS), Ie = s.getParameter(s.UNPACK_SKIP_ROWS); + te.length = Te + 1; + const ye = s.getParameter(s.UNPACK_ROW_LENGTH), Re = s.getParameter(s.UNPACK_SKIP_PIXELS), Ie = s.getParameter(s.UNPACK_SKIP_ROWS); s.pixelStorei(s.UNPACK_ROW_LENGTH, D.width); for (let ue = 0, _e = te.length; ue < _e; ue++) { - const Ve = te[ue], Ue = Math.floor(Ve.start / 4), Ae = Math.ceil(Ve.count / 4), Ge = Ue % D.width, Z = Math.floor(Ue / D.width), Te = Ae, Me = 1; - s.pixelStorei(s.UNPACK_SKIP_PIXELS, Ge), s.pixelStorei(s.UNPACK_SKIP_ROWS, Z), t.texSubImage2D(s.TEXTURE_2D, 0, Ge, Z, Te, Me, H, K, D.data); + const Ve = te[ue], Ue = Math.floor(Ve.start / 4), Ae = Math.ceil(Ve.count / 4), Ge = Ue % D.width, Z = Math.floor(Ue / D.width), Ce = Ae, Me = 1; + s.pixelStorei(s.UNPACK_SKIP_PIXELS, Ge), s.pixelStorei(s.UNPACK_SKIP_ROWS, Z), t.texSubImage2D(s.TEXTURE_2D, 0, Ge, Z, Ce, Me, H, K, D.data); } - B.clearUpdateRanges(), s.pixelStorei(s.UNPACK_ROW_LENGTH, be), s.pixelStorei(s.UNPACK_SKIP_PIXELS, Re), s.pixelStorei(s.UNPACK_SKIP_ROWS, Ie); + B.clearUpdateRanges(), s.pixelStorei(s.UNPACK_ROW_LENGTH, ye), s.pixelStorei(s.UNPACK_SKIP_PIXELS, Re), s.pixelStorei(s.UNPACK_SKIP_ROWS, Ie); } } function se(B, D, H) { @@ -25197,10 +25177,10 @@ function Q3(s, e, t, n, i, r, a) { (D.isDataArrayTexture || D.isCompressedArrayTexture) && (K = s.TEXTURE_2D_ARRAY), D.isData3DTexture && (K = s.TEXTURE_3D); const le = fe(B, D), te = D.source; t.bindTexture(K, B.__webglTexture, s.TEXTURE0 + H); - const Ce = n.get(te); - if (te.version !== Ce.__version || le === !0) { + const Te = n.get(te); + if (te.version !== Te.__version || le === !0) { t.activeTexture(s.TEXTURE0 + H); - const be = st.getPrimaries(st.workingColorSpace), Re = D.colorSpace === Ji ? null : st.getPrimaries(D.colorSpace), Ie = D.colorSpace === Ji || be === Re ? s.NONE : s.BROWSER_DEFAULT_WEBGL; + const ye = st.getPrimaries(st.workingColorSpace), Re = D.colorSpace === Ji ? null : st.getPrimaries(D.colorSpace), Ie = D.colorSpace === Ji || ye === Re ? s.NONE : s.BROWSER_DEFAULT_WEBGL; s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL, D.flipY), s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL, D.premultiplyAlpha), s.pixelStorei(s.UNPACK_ALIGNMENT, D.unpackAlignment), s.pixelStorei(s.UNPACK_COLORSPACE_CONVERSION_WEBGL, Ie); let ue = f(D.image, !1, i.maxTextureSize); ue = J(D, ue); @@ -25208,20 +25188,20 @@ function Q3(s, e, t, n, i, r, a) { let Ue = v(D.internalFormat, _e, Ve, D.colorSpace, D.isVideoTexture); $(K, D); let Ae; - const Ge = D.mipmaps, Z = D.isVideoTexture !== !0, Te = Ce.__version === void 0 || le === !0, Me = te.dataReady, we = _(D, ue); + const Ge = D.mipmaps, Z = D.isVideoTexture !== !0, Ce = Te.__version === void 0 || le === !0, Me = te.dataReady, we = _(D, ue); if (D.isDepthTexture) - Ue = b(D.format === ks, D.type), Te && (Z ? t.texStorage2D(s.TEXTURE_2D, 1, Ue, ue.width, ue.height) : t.texImage2D(s.TEXTURE_2D, 0, Ue, ue.width, ue.height, 0, _e, Ve, null)); + Ue = y(D.format === ks, D.type), Ce && (Z ? t.texStorage2D(s.TEXTURE_2D, 1, Ue, ue.width, ue.height) : t.texImage2D(s.TEXTURE_2D, 0, Ue, ue.width, ue.height, 0, _e, Ve, null)); else if (D.isDataTexture) if (Ge.length > 0) { - Z && Te && t.texStorage2D(s.TEXTURE_2D, we, Ue, Ge[0].width, Ge[0].height); + Z && Ce && t.texStorage2D(s.TEXTURE_2D, we, Ue, Ge[0].width, Ge[0].height); for (let ve = 0, ge = Ge.length; ve < ge; ve++) Ae = Ge[ve], Z ? Me && t.texSubImage2D(s.TEXTURE_2D, ve, 0, 0, Ae.width, Ae.height, _e, Ve, Ae.data) : t.texImage2D(s.TEXTURE_2D, ve, Ue, Ae.width, Ae.height, 0, _e, Ve, Ae.data); D.generateMipmaps = !1; } else - Z ? (Te && t.texStorage2D(s.TEXTURE_2D, we, Ue, ue.width, ue.height), Me && de(D, ue, _e, Ve)) : t.texImage2D(s.TEXTURE_2D, 0, Ue, ue.width, ue.height, 0, _e, Ve, ue.data); + Z ? (Ce && t.texStorage2D(s.TEXTURE_2D, we, Ue, ue.width, ue.height), Me && de(D, ue, _e, Ve)) : t.texImage2D(s.TEXTURE_2D, 0, Ue, ue.width, ue.height, 0, _e, Ve, ue.data); else if (D.isCompressedTexture) if (D.isCompressedArrayTexture) { - Z && Te && t.texStorage3D(s.TEXTURE_2D_ARRAY, we, Ue, Ge[0].width, Ge[0].height, ue.depth); + Z && Ce && t.texStorage3D(s.TEXTURE_2D_ARRAY, we, Ue, Ge[0].width, Ge[0].height, ue.depth); for (let ve = 0, ge = Ge.length; ve < ge; ve++) if (Ae = Ge[ve], D.format !== Mn) if (_e !== null) @@ -25230,11 +25210,11 @@ function Q3(s, e, t, n, i, r, a) { if (D.layerUpdates.size > 0) { const Oe = Pp(Ae.width, Ae.height, D.format, D.type); for (const Ye of D.layerUpdates) { - const bt = Ae.data.subarray( + const yt = Ae.data.subarray( Ye * Oe / Ae.data.BYTES_PER_ELEMENT, (Ye + 1) * Oe / Ae.data.BYTES_PER_ELEMENT ); - t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY, ve, 0, 0, Ye, Ae.width, Ae.height, 1, _e, bt); + t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY, ve, 0, 0, Ye, Ae.width, Ae.height, 1, _e, yt); } D.clearLayerUpdates(); } else @@ -25246,13 +25226,13 @@ function Q3(s, e, t, n, i, r, a) { else Z ? Me && t.texSubImage3D(s.TEXTURE_2D_ARRAY, ve, 0, 0, 0, Ae.width, Ae.height, ue.depth, _e, Ve, Ae.data) : t.texImage3D(s.TEXTURE_2D_ARRAY, ve, Ue, Ae.width, Ae.height, ue.depth, 0, _e, Ve, Ae.data); } else { - Z && Te && t.texStorage2D(s.TEXTURE_2D, we, Ue, Ge[0].width, Ge[0].height); + Z && Ce && t.texStorage2D(s.TEXTURE_2D, we, Ue, Ge[0].width, Ge[0].height); for (let ve = 0, ge = Ge.length; ve < ge; ve++) Ae = Ge[ve], D.format !== Mn ? _e !== null ? Z ? Me && t.compressedTexSubImage2D(s.TEXTURE_2D, ve, 0, 0, Ae.width, Ae.height, _e, Ae.data) : t.compressedTexImage2D(s.TEXTURE_2D, ve, Ue, Ae.width, Ae.height, 0, Ae.data) : He("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()") : Z ? Me && t.texSubImage2D(s.TEXTURE_2D, ve, 0, 0, Ae.width, Ae.height, _e, Ve, Ae.data) : t.texImage2D(s.TEXTURE_2D, ve, Ue, Ae.width, Ae.height, 0, _e, Ve, Ae.data); } else if (D.isDataArrayTexture) if (Z) { - if (Te && t.texStorage3D(s.TEXTURE_2D_ARRAY, we, Ue, ue.width, ue.height, ue.depth), Me) + if (Ce && t.texStorage3D(s.TEXTURE_2D_ARRAY, we, Ue, ue.width, ue.height, ue.depth), Me) if (D.layerUpdates.size > 0) { const ve = Pp(ue.width, ue.height, D.format, D.type); for (const ge of D.layerUpdates) { @@ -25268,9 +25248,9 @@ function Q3(s, e, t, n, i, r, a) { } else t.texImage3D(s.TEXTURE_2D_ARRAY, 0, Ue, ue.width, ue.height, ue.depth, 0, _e, Ve, ue.data); else if (D.isData3DTexture) - Z ? (Te && t.texStorage3D(s.TEXTURE_3D, we, Ue, ue.width, ue.height, ue.depth), Me && t.texSubImage3D(s.TEXTURE_3D, 0, 0, 0, 0, ue.width, ue.height, ue.depth, _e, Ve, ue.data)) : t.texImage3D(s.TEXTURE_3D, 0, Ue, ue.width, ue.height, ue.depth, 0, _e, Ve, ue.data); + Z ? (Ce && t.texStorage3D(s.TEXTURE_3D, we, Ue, ue.width, ue.height, ue.depth), Me && t.texSubImage3D(s.TEXTURE_3D, 0, 0, 0, 0, ue.width, ue.height, ue.depth, _e, Ve, ue.data)) : t.texImage3D(s.TEXTURE_3D, 0, Ue, ue.width, ue.height, ue.depth, 0, _e, Ve, ue.data); else if (D.isFramebufferTexture) { - if (Te) + if (Ce) if (Z) t.texStorage2D(s.TEXTURE_2D, we, Ue, ue.width, ue.height); else { @@ -25279,7 +25259,7 @@ function Q3(s, e, t, n, i, r, a) { t.texImage2D(s.TEXTURE_2D, Oe, Ue, ve, ge, 0, _e, Ve, null), ve >>= 1, ge >>= 1; } } else if (Ge.length > 0) { - if (Z && Te) { + if (Z && Ce) { const ve = X(Ge[0]); t.texStorage2D(s.TEXTURE_2D, we, Ue, ve.width, ve.height); } @@ -25287,14 +25267,14 @@ function Q3(s, e, t, n, i, r, a) { Ae = Ge[ve], Z ? Me && t.texSubImage2D(s.TEXTURE_2D, ve, 0, 0, _e, Ve, Ae) : t.texImage2D(s.TEXTURE_2D, ve, Ue, _e, Ve, Ae); D.generateMipmaps = !1; } else if (Z) { - if (Te) { + if (Ce) { const ve = X(ue); t.texStorage2D(s.TEXTURE_2D, we, Ue, ve.width, ve.height); } Me && t.texSubImage2D(s.TEXTURE_2D, 0, 0, 0, _e, Ve, ue); } else t.texImage2D(s.TEXTURE_2D, 0, Ue, _e, Ve, ue); - x(D) && g(K), Ce.__version = te.version, D.onUpdate && D.onUpdate(D); + x(D) && g(K), Te.__version = te.version, D.onUpdate && D.onUpdate(D); } B.__version = D.version; } @@ -25305,17 +25285,17 @@ function Q3(s, e, t, n, i, r, a) { const te = n.get(le); if (le.version !== te.__version || K === !0) { t.activeTexture(s.TEXTURE0 + H); - const Ce = st.getPrimaries(st.workingColorSpace), be = D.colorSpace === Ji ? null : st.getPrimaries(D.colorSpace), Re = D.colorSpace === Ji || Ce === be ? s.NONE : s.BROWSER_DEFAULT_WEBGL; + const Te = st.getPrimaries(st.workingColorSpace), ye = D.colorSpace === Ji ? null : st.getPrimaries(D.colorSpace), Re = D.colorSpace === Ji || Te === ye ? s.NONE : s.BROWSER_DEFAULT_WEBGL; s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL, D.flipY), s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL, D.premultiplyAlpha), s.pixelStorei(s.UNPACK_ALIGNMENT, D.unpackAlignment), s.pixelStorei(s.UNPACK_COLORSPACE_CONVERSION_WEBGL, Re); const Ie = D.isCompressedTexture || D.image[0].isCompressedTexture, ue = D.image[0] && D.image[0].isDataTexture, _e = []; for (let ge = 0; ge < 6; ge++) !Ie && !ue ? _e[ge] = f(D.image[ge], !0, i.maxCubemapSize) : _e[ge] = ue ? D.image[ge].image : D.image[ge], _e[ge] = J(D, _e[ge]); - const Ve = _e[0], Ue = r.convert(D.format, D.colorSpace), Ae = r.convert(D.type), Ge = v(D.internalFormat, Ue, Ae, D.colorSpace), Z = D.isVideoTexture !== !0, Te = te.__version === void 0 || K === !0, Me = le.dataReady; + const Ve = _e[0], Ue = r.convert(D.format, D.colorSpace), Ae = r.convert(D.type), Ge = v(D.internalFormat, Ue, Ae, D.colorSpace), Z = D.isVideoTexture !== !0, Ce = te.__version === void 0 || K === !0, Me = le.dataReady; let we = _(D, Ve); $(s.TEXTURE_CUBE_MAP, D); let ve; if (Ie) { - Z && Te && t.texStorage2D(s.TEXTURE_CUBE_MAP, we, Ge, Ve.width, Ve.height); + Z && Ce && t.texStorage2D(s.TEXTURE_CUBE_MAP, we, Ge, Ve.width, Ve.height); for (let ge = 0; ge < 6; ge++) { ve = _e[ge].mipmaps; for (let Oe = 0; Oe < ve.length; Oe++) { @@ -25324,7 +25304,7 @@ function Q3(s, e, t, n, i, r, a) { } } } else { - if (ve = D.mipmaps, Z && Te) { + if (ve = D.mipmaps, Z && Ce) { ve.length > 0 && we++; const ge = X(_e[0]); t.texStorage2D(s.TEXTURE_CUBE_MAP, we, Ge, ge.width, ge.height); @@ -25333,8 +25313,8 @@ function Q3(s, e, t, n, i, r, a) { if (ue) { Z ? Me && t.texSubImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + ge, 0, 0, 0, _e[ge].width, _e[ge].height, Ue, Ae, _e[ge].data) : t.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + ge, 0, Ge, _e[ge].width, _e[ge].height, 0, Ue, Ae, _e[ge].data); for (let Oe = 0; Oe < ve.length; Oe++) { - const bt = ve[Oe].image[ge].image; - Z ? Me && t.texSubImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + ge, Oe + 1, 0, 0, bt.width, bt.height, Ue, Ae, bt.data) : t.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + ge, Oe + 1, Ge, bt.width, bt.height, 0, Ue, Ae, bt.data); + const yt = ve[Oe].image[ge].image; + Z ? Me && t.texSubImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + ge, Oe + 1, 0, 0, yt.width, yt.height, Ue, Ae, yt.data) : t.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + ge, Oe + 1, Ge, yt.width, yt.height, 0, Ue, Ae, yt.data); } } else { Z ? Me && t.texSubImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + ge, 0, 0, 0, Ue, Ae, _e[ge]) : t.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + ge, 0, Ge, Ue, Ae, _e[ge]); @@ -25349,21 +25329,21 @@ function Q3(s, e, t, n, i, r, a) { B.__version = D.version; } function pe(B, D, H, K, le, te) { - const Ce = r.convert(H.format, H.colorSpace), be = r.convert(H.type), Re = v(H.internalFormat, Ce, be, H.colorSpace), Ie = n.get(D), ue = n.get(H); + const Te = r.convert(H.format, H.colorSpace), ye = r.convert(H.type), Re = v(H.internalFormat, Te, ye, H.colorSpace), Ie = n.get(D), ue = n.get(H); if (ue.__renderTarget = D, !Ie.__hasExternalTextures) { const _e = Math.max(1, D.width >> te), Ve = Math.max(1, D.height >> te); - le === s.TEXTURE_3D || le === s.TEXTURE_2D_ARRAY ? t.texImage3D(le, te, Re, _e, Ve, D.depth, 0, Ce, be, null) : t.texImage2D(le, te, Re, _e, Ve, 0, Ce, be, null); + le === s.TEXTURE_3D || le === s.TEXTURE_2D_ARRAY ? t.texImage3D(le, te, Re, _e, Ve, D.depth, 0, Te, ye, null) : t.texImage2D(le, te, Re, _e, Ve, 0, Te, ye, null); } t.bindFramebuffer(s.FRAMEBUFFER, B), F(D) ? o.framebufferTexture2DMultisampleEXT(s.FRAMEBUFFER, K, le, ue.__webglTexture, 0, k(D)) : (le === s.TEXTURE_2D || le >= s.TEXTURE_CUBE_MAP_POSITIVE_X && le <= s.TEXTURE_CUBE_MAP_NEGATIVE_Z) && s.framebufferTexture2D(s.FRAMEBUFFER, K, le, ue.__webglTexture, te), t.bindFramebuffer(s.FRAMEBUFFER, null); } - function ye(B, D, H) { + function be(B, D, H) { if (s.bindRenderbuffer(s.RENDERBUFFER, B), D.depthBuffer) { - const K = D.depthTexture, le = K && K.isDepthTexture ? K.type : null, te = b(D.stencilBuffer, le), Ce = D.stencilBuffer ? s.DEPTH_STENCIL_ATTACHMENT : s.DEPTH_ATTACHMENT, be = k(D); - F(D) ? o.renderbufferStorageMultisampleEXT(s.RENDERBUFFER, be, te, D.width, D.height) : H ? s.renderbufferStorageMultisample(s.RENDERBUFFER, be, te, D.width, D.height) : s.renderbufferStorage(s.RENDERBUFFER, te, D.width, D.height), s.framebufferRenderbuffer(s.FRAMEBUFFER, Ce, s.RENDERBUFFER, B); + const K = D.depthTexture, le = K && K.isDepthTexture ? K.type : null, te = y(D.stencilBuffer, le), Te = D.stencilBuffer ? s.DEPTH_STENCIL_ATTACHMENT : s.DEPTH_ATTACHMENT, ye = k(D); + F(D) ? o.renderbufferStorageMultisampleEXT(s.RENDERBUFFER, ye, te, D.width, D.height) : H ? s.renderbufferStorageMultisample(s.RENDERBUFFER, ye, te, D.width, D.height) : s.renderbufferStorage(s.RENDERBUFFER, te, D.width, D.height), s.framebufferRenderbuffer(s.FRAMEBUFFER, Te, s.RENDERBUFFER, B); } else { const K = D.textures; for (let le = 0; le < K.length; le++) { - const te = K[le], Ce = r.convert(te.format, te.colorSpace), be = r.convert(te.type), Re = v(te.internalFormat, Ce, be, te.colorSpace), Ie = k(D); + const te = K[le], Te = r.convert(te.format, te.colorSpace), ye = r.convert(te.type), Re = v(te.internalFormat, Te, ye, te.colorSpace), Ie = k(D); H && F(D) === !1 ? s.renderbufferStorageMultisample(s.RENDERBUFFER, Ie, Re, D.width, D.height) : F(D) ? o.renderbufferStorageMultisampleEXT(s.RENDERBUFFER, Ie, Re, D.width, D.height) : s.renderbufferStorage(s.RENDERBUFFER, Re, D.width, D.height); } } @@ -25403,7 +25383,7 @@ function Q3(s, e, t, n, i, r, a) { D.__webglDepthbuffer = []; for (let K = 0; K < 6; K++) if (t.bindFramebuffer(s.FRAMEBUFFER, D.__webglFramebuffer[K]), D.__webglDepthbuffer[K] === void 0) - D.__webglDepthbuffer[K] = s.createRenderbuffer(), ye(D.__webglDepthbuffer[K], B, !1); + D.__webglDepthbuffer[K] = s.createRenderbuffer(), be(D.__webglDepthbuffer[K], B, !1); else { const le = B.stencilBuffer ? s.DEPTH_STENCIL_ATTACHMENT : s.DEPTH_ATTACHMENT, te = D.__webglDepthbuffer[K]; s.bindRenderbuffer(s.RENDERBUFFER, te), s.framebufferRenderbuffer(s.FRAMEBUFFER, le, s.RENDERBUFFER, te); @@ -25411,7 +25391,7 @@ function Q3(s, e, t, n, i, r, a) { } else { const K = B.texture.mipmaps; if (K && K.length > 0 ? t.bindFramebuffer(s.FRAMEBUFFER, D.__webglFramebuffer[0]) : t.bindFramebuffer(s.FRAMEBUFFER, D.__webglFramebuffer), D.__webglDepthbuffer === void 0) - D.__webglDepthbuffer = s.createRenderbuffer(), ye(D.__webglDepthbuffer, B, !1); + D.__webglDepthbuffer = s.createRenderbuffer(), be(D.__webglDepthbuffer, B, !1); else { const le = B.stencilBuffer ? s.DEPTH_STENCIL_ATTACHMENT : s.DEPTH_ATTACHMENT, te = D.__webglDepthbuffer; s.bindRenderbuffer(s.RENDERBUFFER, te), s.framebufferRenderbuffer(s.FRAMEBUFFER, le, s.RENDERBUFFER, te); @@ -25425,74 +25405,74 @@ function Q3(s, e, t, n, i, r, a) { } function ke(B) { const D = B.texture, H = n.get(B), K = n.get(D); - B.addEventListener("dispose", T); - const le = B.textures, te = B.isWebGLCubeRenderTarget === !0, Ce = le.length > 1; - if (Ce || (K.__webglTexture === void 0 && (K.__webglTexture = s.createTexture()), K.__version = D.version, a.memory.textures++), te) { + B.addEventListener("dispose", C); + const le = B.textures, te = B.isWebGLCubeRenderTarget === !0, Te = le.length > 1; + if (Te || (K.__webglTexture === void 0 && (K.__webglTexture = s.createTexture()), K.__version = D.version, a.memory.textures++), te) { H.__webglFramebuffer = []; - for (let be = 0; be < 6; be++) + for (let ye = 0; ye < 6; ye++) if (D.mipmaps && D.mipmaps.length > 0) { - H.__webglFramebuffer[be] = []; + H.__webglFramebuffer[ye] = []; for (let Re = 0; Re < D.mipmaps.length; Re++) - H.__webglFramebuffer[be][Re] = s.createFramebuffer(); + H.__webglFramebuffer[ye][Re] = s.createFramebuffer(); } else - H.__webglFramebuffer[be] = s.createFramebuffer(); + H.__webglFramebuffer[ye] = s.createFramebuffer(); } else { if (D.mipmaps && D.mipmaps.length > 0) { H.__webglFramebuffer = []; - for (let be = 0; be < D.mipmaps.length; be++) - H.__webglFramebuffer[be] = s.createFramebuffer(); + for (let ye = 0; ye < D.mipmaps.length; ye++) + H.__webglFramebuffer[ye] = s.createFramebuffer(); } else H.__webglFramebuffer = s.createFramebuffer(); - if (Ce) - for (let be = 0, Re = le.length; be < Re; be++) { - const Ie = n.get(le[be]); + if (Te) + for (let ye = 0, Re = le.length; ye < Re; ye++) { + const Ie = n.get(le[ye]); Ie.__webglTexture === void 0 && (Ie.__webglTexture = s.createTexture(), a.memory.textures++); } if (B.samples > 0 && F(B) === !1) { H.__webglMultisampledFramebuffer = s.createFramebuffer(), H.__webglColorRenderbuffer = [], t.bindFramebuffer(s.FRAMEBUFFER, H.__webglMultisampledFramebuffer); - for (let be = 0; be < le.length; be++) { - const Re = le[be]; - H.__webglColorRenderbuffer[be] = s.createRenderbuffer(), s.bindRenderbuffer(s.RENDERBUFFER, H.__webglColorRenderbuffer[be]); + for (let ye = 0; ye < le.length; ye++) { + const Re = le[ye]; + H.__webglColorRenderbuffer[ye] = s.createRenderbuffer(), s.bindRenderbuffer(s.RENDERBUFFER, H.__webglColorRenderbuffer[ye]); const Ie = r.convert(Re.format, Re.colorSpace), ue = r.convert(Re.type), _e = v(Re.internalFormat, Ie, ue, Re.colorSpace, B.isXRRenderTarget === !0), Ve = k(B); - s.renderbufferStorageMultisample(s.RENDERBUFFER, Ve, _e, B.width, B.height), s.framebufferRenderbuffer(s.FRAMEBUFFER, s.COLOR_ATTACHMENT0 + be, s.RENDERBUFFER, H.__webglColorRenderbuffer[be]); + s.renderbufferStorageMultisample(s.RENDERBUFFER, Ve, _e, B.width, B.height), s.framebufferRenderbuffer(s.FRAMEBUFFER, s.COLOR_ATTACHMENT0 + ye, s.RENDERBUFFER, H.__webglColorRenderbuffer[ye]); } - s.bindRenderbuffer(s.RENDERBUFFER, null), B.depthBuffer && (H.__webglDepthRenderbuffer = s.createRenderbuffer(), ye(H.__webglDepthRenderbuffer, B, !0)), t.bindFramebuffer(s.FRAMEBUFFER, null); + s.bindRenderbuffer(s.RENDERBUFFER, null), B.depthBuffer && (H.__webglDepthRenderbuffer = s.createRenderbuffer(), be(H.__webglDepthRenderbuffer, B, !0)), t.bindFramebuffer(s.FRAMEBUFFER, null); } } if (te) { t.bindTexture(s.TEXTURE_CUBE_MAP, K.__webglTexture), $(s.TEXTURE_CUBE_MAP, D); - for (let be = 0; be < 6; be++) + for (let ye = 0; ye < 6; ye++) if (D.mipmaps && D.mipmaps.length > 0) for (let Re = 0; Re < D.mipmaps.length; Re++) - pe(H.__webglFramebuffer[be][Re], B, D, s.COLOR_ATTACHMENT0, s.TEXTURE_CUBE_MAP_POSITIVE_X + be, Re); + pe(H.__webglFramebuffer[ye][Re], B, D, s.COLOR_ATTACHMENT0, s.TEXTURE_CUBE_MAP_POSITIVE_X + ye, Re); else - pe(H.__webglFramebuffer[be], B, D, s.COLOR_ATTACHMENT0, s.TEXTURE_CUBE_MAP_POSITIVE_X + be, 0); + pe(H.__webglFramebuffer[ye], B, D, s.COLOR_ATTACHMENT0, s.TEXTURE_CUBE_MAP_POSITIVE_X + ye, 0); x(D) && g(s.TEXTURE_CUBE_MAP), t.unbindTexture(); - } else if (Ce) { - for (let be = 0, Re = le.length; be < Re; be++) { - const Ie = le[be], ue = n.get(Ie); + } else if (Te) { + for (let ye = 0, Re = le.length; ye < Re; ye++) { + const Ie = le[ye], ue = n.get(Ie); let _e = s.TEXTURE_2D; - (B.isWebGL3DRenderTarget || B.isWebGLArrayRenderTarget) && (_e = B.isWebGL3DRenderTarget ? s.TEXTURE_3D : s.TEXTURE_2D_ARRAY), t.bindTexture(_e, ue.__webglTexture), $(_e, Ie), pe(H.__webglFramebuffer, B, Ie, s.COLOR_ATTACHMENT0 + be, _e, 0), x(Ie) && g(_e); + (B.isWebGL3DRenderTarget || B.isWebGLArrayRenderTarget) && (_e = B.isWebGL3DRenderTarget ? s.TEXTURE_3D : s.TEXTURE_2D_ARRAY), t.bindTexture(_e, ue.__webglTexture), $(_e, Ie), pe(H.__webglFramebuffer, B, Ie, s.COLOR_ATTACHMENT0 + ye, _e, 0), x(Ie) && g(_e); } t.unbindTexture(); } else { - let be = s.TEXTURE_2D; - if ((B.isWebGL3DRenderTarget || B.isWebGLArrayRenderTarget) && (be = B.isWebGL3DRenderTarget ? s.TEXTURE_3D : s.TEXTURE_2D_ARRAY), t.bindTexture(be, K.__webglTexture), $(be, D), D.mipmaps && D.mipmaps.length > 0) + let ye = s.TEXTURE_2D; + if ((B.isWebGL3DRenderTarget || B.isWebGLArrayRenderTarget) && (ye = B.isWebGL3DRenderTarget ? s.TEXTURE_3D : s.TEXTURE_2D_ARRAY), t.bindTexture(ye, K.__webglTexture), $(ye, D), D.mipmaps && D.mipmaps.length > 0) for (let Re = 0; Re < D.mipmaps.length; Re++) - pe(H.__webglFramebuffer[Re], B, D, s.COLOR_ATTACHMENT0, be, Re); + pe(H.__webglFramebuffer[Re], B, D, s.COLOR_ATTACHMENT0, ye, Re); else - pe(H.__webglFramebuffer, B, D, s.COLOR_ATTACHMENT0, be, 0); - x(D) && g(be), t.unbindTexture(); + pe(H.__webglFramebuffer, B, D, s.COLOR_ATTACHMENT0, ye, 0); + x(D) && g(ye), t.unbindTexture(); } B.depthBuffer && Be(B); } - function C(B) { + function T(B) { const D = B.textures; for (let H = 0, K = D.length; H < K; H++) { const le = D[H]; if (x(le)) { - const te = y(B), Ce = n.get(le).__webglTexture; - t.bindTexture(te, Ce), g(te), t.unbindTexture(); + const te = b(B), Te = n.get(le).__webglTexture; + t.bindTexture(te, Te), g(te), t.unbindTexture(); } } } @@ -25502,28 +25482,28 @@ function Q3(s, e, t, n, i, r, a) { if (F(B) === !1) { const D = B.textures, H = B.width, K = B.height; let le = s.COLOR_BUFFER_BIT; - const te = B.stencilBuffer ? s.DEPTH_STENCIL_ATTACHMENT : s.DEPTH_ATTACHMENT, Ce = n.get(B), be = D.length > 1; - if (be) + const te = B.stencilBuffer ? s.DEPTH_STENCIL_ATTACHMENT : s.DEPTH_ATTACHMENT, Te = n.get(B), ye = D.length > 1; + if (ye) for (let Ie = 0; Ie < D.length; Ie++) - t.bindFramebuffer(s.FRAMEBUFFER, Ce.__webglMultisampledFramebuffer), s.framebufferRenderbuffer(s.FRAMEBUFFER, s.COLOR_ATTACHMENT0 + Ie, s.RENDERBUFFER, null), t.bindFramebuffer(s.FRAMEBUFFER, Ce.__webglFramebuffer), s.framebufferTexture2D(s.DRAW_FRAMEBUFFER, s.COLOR_ATTACHMENT0 + Ie, s.TEXTURE_2D, null, 0); - t.bindFramebuffer(s.READ_FRAMEBUFFER, Ce.__webglMultisampledFramebuffer); + t.bindFramebuffer(s.FRAMEBUFFER, Te.__webglMultisampledFramebuffer), s.framebufferRenderbuffer(s.FRAMEBUFFER, s.COLOR_ATTACHMENT0 + Ie, s.RENDERBUFFER, null), t.bindFramebuffer(s.FRAMEBUFFER, Te.__webglFramebuffer), s.framebufferTexture2D(s.DRAW_FRAMEBUFFER, s.COLOR_ATTACHMENT0 + Ie, s.TEXTURE_2D, null, 0); + t.bindFramebuffer(s.READ_FRAMEBUFFER, Te.__webglMultisampledFramebuffer); const Re = B.texture.mipmaps; - Re && Re.length > 0 ? t.bindFramebuffer(s.DRAW_FRAMEBUFFER, Ce.__webglFramebuffer[0]) : t.bindFramebuffer(s.DRAW_FRAMEBUFFER, Ce.__webglFramebuffer); + Re && Re.length > 0 ? t.bindFramebuffer(s.DRAW_FRAMEBUFFER, Te.__webglFramebuffer[0]) : t.bindFramebuffer(s.DRAW_FRAMEBUFFER, Te.__webglFramebuffer); for (let Ie = 0; Ie < D.length; Ie++) { - if (B.resolveDepthBuffer && (B.depthBuffer && (le |= s.DEPTH_BUFFER_BIT), B.stencilBuffer && B.resolveStencilBuffer && (le |= s.STENCIL_BUFFER_BIT)), be) { - s.framebufferRenderbuffer(s.READ_FRAMEBUFFER, s.COLOR_ATTACHMENT0, s.RENDERBUFFER, Ce.__webglColorRenderbuffer[Ie]); + if (B.resolveDepthBuffer && (B.depthBuffer && (le |= s.DEPTH_BUFFER_BIT), B.stencilBuffer && B.resolveStencilBuffer && (le |= s.STENCIL_BUFFER_BIT)), ye) { + s.framebufferRenderbuffer(s.READ_FRAMEBUFFER, s.COLOR_ATTACHMENT0, s.RENDERBUFFER, Te.__webglColorRenderbuffer[Ie]); const ue = n.get(D[Ie]).__webglTexture; s.framebufferTexture2D(s.DRAW_FRAMEBUFFER, s.COLOR_ATTACHMENT0, s.TEXTURE_2D, ue, 0); } s.blitFramebuffer(0, 0, H, K, 0, 0, H, K, le, s.NEAREST), l === !0 && (N.length = 0, V.length = 0, N.push(s.COLOR_ATTACHMENT0 + Ie), B.depthBuffer && B.resolveDepthBuffer === !1 && (N.push(te), V.push(te), s.invalidateFramebuffer(s.DRAW_FRAMEBUFFER, V)), s.invalidateFramebuffer(s.READ_FRAMEBUFFER, N)); } - if (t.bindFramebuffer(s.READ_FRAMEBUFFER, null), t.bindFramebuffer(s.DRAW_FRAMEBUFFER, null), be) + if (t.bindFramebuffer(s.READ_FRAMEBUFFER, null), t.bindFramebuffer(s.DRAW_FRAMEBUFFER, null), ye) for (let Ie = 0; Ie < D.length; Ie++) { - t.bindFramebuffer(s.FRAMEBUFFER, Ce.__webglMultisampledFramebuffer), s.framebufferRenderbuffer(s.FRAMEBUFFER, s.COLOR_ATTACHMENT0 + Ie, s.RENDERBUFFER, Ce.__webglColorRenderbuffer[Ie]); + t.bindFramebuffer(s.FRAMEBUFFER, Te.__webglMultisampledFramebuffer), s.framebufferRenderbuffer(s.FRAMEBUFFER, s.COLOR_ATTACHMENT0 + Ie, s.RENDERBUFFER, Te.__webglColorRenderbuffer[Ie]); const ue = n.get(D[Ie]).__webglTexture; - t.bindFramebuffer(s.FRAMEBUFFER, Ce.__webglFramebuffer), s.framebufferTexture2D(s.DRAW_FRAMEBUFFER, s.COLOR_ATTACHMENT0 + Ie, s.TEXTURE_2D, ue, 0); + t.bindFramebuffer(s.FRAMEBUFFER, Te.__webglFramebuffer), s.framebufferTexture2D(s.DRAW_FRAMEBUFFER, s.COLOR_ATTACHMENT0 + Ie, s.TEXTURE_2D, ue, 0); } - t.bindFramebuffer(s.DRAW_FRAMEBUFFER, Ce.__webglMultisampledFramebuffer); + t.bindFramebuffer(s.DRAW_FRAMEBUFFER, Te.__webglMultisampledFramebuffer); } else if (B.depthBuffer && B.resolveDepthBuffer === !1 && l) { const D = B.stencilBuffer ? s.DEPTH_STENCIL_ATTACHMENT : s.DEPTH_ATTACHMENT; s.invalidateFramebuffer(s.DRAW_FRAMEBUFFER, [D]); @@ -25548,7 +25528,7 @@ function Q3(s, e, t, n, i, r, a) { function X(B) { return typeof HTMLImageElement < "u" && B instanceof HTMLImageElement ? (c.width = B.naturalWidth || B.width, c.height = B.naturalHeight || B.height) : typeof VideoFrame < "u" && B instanceof VideoFrame ? (c.width = B.displayWidth, c.height = B.displayHeight) : (c.width = B.width, c.height = B.height), c; } - this.allocateTextureUnit = I, this.resetTextureUnits = A, this.setTexture2D = z, this.setTexture2DArray = G, this.setTexture3D = j, this.setTextureCube = Y, this.rebindTextures = $e, this.setupRenderTarget = ke, this.updateRenderTargetMipmap = C, this.updateMultisampleRenderTarget = U, this.setupDepthRenderbuffer = Be, this.setupFrameBufferTexture = pe, this.useMultisampledRTT = F; + this.allocateTextureUnit = I, this.resetTextureUnits = A, this.setTexture2D = z, this.setTexture2DArray = G, this.setTexture3D = j, this.setTextureCube = Y, this.rebindTextures = $e, this.setupRenderTarget = ke, this.updateRenderTargetMipmap = T, this.updateMultisampleRenderTarget = U, this.setupDepthRenderbuffer = Be, this.setupFrameBufferTexture = pe, this.useMultisampledRTT = F; } function e_(s, e) { function t(n, i = Ji) { @@ -25734,9 +25714,9 @@ class s_ extends zs { super(); const n = this; let i = null, r = 1, a = null, o = "local-floor", l = 1, c = null, h = null, u = null, p = null, d = null, m = null; - const f = typeof XRWebGLBinding < "u", x = new i_(), g = {}, y = t.getContextAttributes(); - let v = null, b = null; - const _ = [], M = [], T = new he(); + const f = typeof XRWebGLBinding < "u", x = new i_(), g = {}, b = t.getContextAttributes(); + let v = null, y = null; + const _ = [], M = [], C = new he(); let R = null; const S = new an(); S.viewport = new tt(); @@ -25770,7 +25750,7 @@ class s_ extends zs { I = null, w = null, x.reset(); for (const se in g) delete g[se]; - e.setRenderTarget(v), d = null, p = null, u = null, i = null, b = null, de.stop(), n.isPresenting = !1, e.setPixelRatio(R), e.setSize(T.width, T.height, !1), n.dispatchEvent({ type: "sessionend" }); + e.setRenderTarget(v), d = null, p = null, u = null, i = null, y = null, de.stop(), n.isPresenting = !1, e.setPixelRatio(R), e.setSize(C.width, C.height, !1), n.dispatchEvent({ type: "sessionend" }); } this.setFramebufferScaleFactor = function(se) { r = se, n.isPresenting === !0 && He("WebXRManager: Cannot change framebuffer scale while presenting."); @@ -25790,50 +25770,50 @@ class s_ extends zs { return i; }, this.setSession = async function(se) { if (i = se, i !== null) { - if (v = e.getRenderTarget(), i.addEventListener("select", z), i.addEventListener("selectstart", z), i.addEventListener("selectend", z), i.addEventListener("squeeze", z), i.addEventListener("squeezestart", z), i.addEventListener("squeezeend", z), i.addEventListener("end", G), i.addEventListener("inputsourceschange", j), y.xrCompatible !== !0 && await t.makeXRCompatible(), R = e.getPixelRatio(), e.getSize(T), f && "createProjectionLayer" in XRWebGLBinding.prototype) { - let pe = null, ye = null, Se = null; - y.depth && (Se = y.stencil ? t.DEPTH24_STENCIL8 : t.DEPTH_COMPONENT24, pe = y.stencil ? ks : Ra, ye = y.stencil ? Bs : Ns); + if (v = e.getRenderTarget(), i.addEventListener("select", z), i.addEventListener("selectstart", z), i.addEventListener("selectend", z), i.addEventListener("squeeze", z), i.addEventListener("squeezestart", z), i.addEventListener("squeezeend", z), i.addEventListener("end", G), i.addEventListener("inputsourceschange", j), b.xrCompatible !== !0 && await t.makeXRCompatible(), R = e.getPixelRatio(), e.getSize(C), f && "createProjectionLayer" in XRWebGLBinding.prototype) { + let pe = null, be = null, Se = null; + b.depth && (Se = b.stencil ? t.DEPTH24_STENCIL8 : t.DEPTH_COMPONENT24, pe = b.stencil ? ks : Ra, be = b.stencil ? Bs : Ns); const Be = { colorFormat: t.RGBA8, depthFormat: Se, scaleFactor: r }; - u = this.getBinding(), p = u.createProjectionLayer(Be), i.updateRenderState({ layers: [p] }), e.setPixelRatio(1), e.setSize(p.textureWidth, p.textureHeight, !1), b = new Nn( + u = this.getBinding(), p = u.createProjectionLayer(Be), i.updateRenderState({ layers: [p] }), e.setPixelRatio(1), e.setSize(p.textureWidth, p.textureHeight, !1), y = new Nn( p.textureWidth, p.textureHeight, { format: Mn, type: ii, - depthTexture: new Vl(p.textureWidth, p.textureHeight, ye, void 0, void 0, void 0, void 0, void 0, void 0, pe), - stencilBuffer: y.stencil, + depthTexture: new Vl(p.textureWidth, p.textureHeight, be, void 0, void 0, void 0, void 0, void 0, void 0, pe), + stencilBuffer: b.stencil, colorSpace: e.outputColorSpace, - samples: y.antialias ? 4 : 0, + samples: b.antialias ? 4 : 0, resolveDepthBuffer: p.ignoreDepthValues === !1, resolveStencilBuffer: p.ignoreDepthValues === !1 } ); } else { const pe = { - antialias: y.antialias, + antialias: b.antialias, alpha: !0, - depth: y.depth, - stencil: y.stencil, + depth: b.depth, + stencil: b.stencil, framebufferScaleFactor: r }; - d = new XRWebGLLayer(i, t, pe), i.updateRenderState({ baseLayer: d }), e.setPixelRatio(1), e.setSize(d.framebufferWidth, d.framebufferHeight, !1), b = new Nn( + d = new XRWebGLLayer(i, t, pe), i.updateRenderState({ baseLayer: d }), e.setPixelRatio(1), e.setSize(d.framebufferWidth, d.framebufferHeight, !1), y = new Nn( d.framebufferWidth, d.framebufferHeight, { format: Mn, type: ii, colorSpace: e.outputColorSpace, - stencilBuffer: y.stencil, + stencilBuffer: b.stencil, resolveDepthBuffer: d.ignoreDepthValues === !1, resolveStencilBuffer: d.ignoreDepthValues === !1 } ); } - b.isXRRenderTarget = !0, this.setFoveation(l), c = null, a = await i.requestReferenceSpace(o), de.setContext(i), de.start(), n.isPresenting = !0, n.dispatchEvent({ type: "sessionstart" }); + y.isXRRenderTarget = !0, this.setFoveation(l), c = null, a = await i.requestReferenceSpace(o), de.setContext(i), de.start(), n.isPresenting = !0, n.dispatchEvent({ type: "sessionstart" }); } }, this.getEnvironmentBlendMode = function() { if (i !== null) @@ -25843,35 +25823,35 @@ class s_ extends zs { }; function j(se) { for (let ce = 0; ce < se.removed.length; ce++) { - const pe = se.removed[ce], ye = M.indexOf(pe); - ye >= 0 && (M[ye] = null, _[ye].disconnect(pe)); + const pe = se.removed[ce], be = M.indexOf(pe); + be >= 0 && (M[be] = null, _[be].disconnect(pe)); } for (let ce = 0; ce < se.added.length; ce++) { const pe = se.added[ce]; - let ye = M.indexOf(pe); - if (ye === -1) { + let be = M.indexOf(pe); + if (be === -1) { for (let Be = 0; Be < _.length; Be++) if (Be >= M.length) { - M.push(pe), ye = Be; + M.push(pe), be = Be; break; } else if (M[Be] === null) { - M[Be] = pe, ye = Be; + M[Be] = pe, be = Be; break; } - if (ye === -1) break; + if (be === -1) break; } - const Se = _[ye]; + const Se = _[be]; Se && Se.connect(pe); } } const Y = new P(), q = new P(); function ie(se, ce, pe) { Y.setFromMatrixPosition(ce.matrixWorld), q.setFromMatrixPosition(pe.matrixWorld); - const ye = Y.distanceTo(q), Se = ce.projectionMatrix.elements, Be = pe.projectionMatrix.elements, $e = Se[14] / (Se[10] - 1), ke = Se[14] / (Se[10] + 1), C = (Se[9] + 1) / Se[5], N = (Se[9] - 1) / Se[5], V = (Se[8] - 1) / Se[0], U = (Be[8] + 1) / Be[0], k = $e * V, F = $e * U, ee = ye / (-V + U), J = ee * -V; + const be = Y.distanceTo(q), Se = ce.projectionMatrix.elements, Be = pe.projectionMatrix.elements, $e = Se[14] / (Se[10] - 1), ke = Se[14] / (Se[10] + 1), T = (Se[9] + 1) / Se[5], N = (Se[9] - 1) / Se[5], V = (Se[8] - 1) / Se[0], U = (Be[8] + 1) / Be[0], k = $e * V, F = $e * U, ee = be / (-V + U), J = ee * -V; if (ce.matrixWorld.decompose(se.position, se.quaternion, se.scale), se.translateX(J), se.translateZ(ee), se.matrixWorld.compose(se.position, se.quaternion, se.scale), se.matrixWorldInverse.copy(se.matrixWorld).invert(), Se[10] === -1) se.projectionMatrix.copy(ce.projectionMatrix), se.projectionMatrixInverse.copy(ce.projectionMatrixInverse); else { - const X = $e + ee, B = ke + ee, D = k - J, H = F + (ye - J), K = C * ke / B * X, le = N * ke / B * X; + const X = $e + ee, B = ke + ee, D = k - J, H = F + (be - J), K = T * ke / B * X, le = N * ke / B * X; se.projectionMatrix.makePerspective(D, H, K, le, X, B), se.projectionMatrixInverse.copy(se.projectionMatrix).invert(); } } @@ -25885,11 +25865,11 @@ class s_ extends zs { depthNear: A.near, depthFar: A.far }), I = A.near, w = A.far), A.layers.mask = se.layers.mask | 6, S.layers.mask = A.layers.mask & 3, E.layers.mask = A.layers.mask & 5; - const ye = se.parent, Se = A.cameras; - W(A, ye); + const be = se.parent, Se = A.cameras; + W(A, be); for (let Be = 0; Be < Se.length; Be++) - W(Se[Be], ye); - Se.length === 2 ? ie(A, S, E) : A.projectionMatrix.copy(S.projectionMatrix), $(se, A, ye); + W(Se[Be], be); + Se.length === 2 ? ie(A, S, E) : A.projectionMatrix.copy(S.projectionMatrix), $(se, A, be); }; function $(se, ce, pe) { pe === null ? se.matrix.copy(ce.matrixWorld) : (se.matrix.copy(pe.matrixWorld), se.matrix.invert(), se.matrix.multiply(ce.matrixWorld)), se.matrix.decompose(se.position, se.quaternion, se.scale), se.updateMatrixWorld(!0), se.projectionMatrix.copy(ce.projectionMatrix), se.projectionMatrixInverse.copy(ce.projectionMatrixInverse), se.isPerspectiveCamera && (se.fov = Nr * 2 * Math.atan(1 / se.projectionMatrix.elements[5]), se.zoom = 1); @@ -25912,24 +25892,24 @@ class s_ extends zs { function me(se, ce) { if (h = ce.getViewerPose(c || a), m = ce, h !== null) { const pe = h.views; - d !== null && (e.setRenderTargetFramebuffer(b, d.framebuffer), e.setRenderTarget(b)); - let ye = !1; - pe.length !== A.cameras.length && (A.cameras.length = 0, ye = !0); + d !== null && (e.setRenderTargetFramebuffer(y, d.framebuffer), e.setRenderTarget(y)); + let be = !1; + pe.length !== A.cameras.length && (A.cameras.length = 0, be = !0); for (let ke = 0; ke < pe.length; ke++) { - const C = pe[ke]; + const T = pe[ke]; let N = null; if (d !== null) - N = d.getViewport(C); + N = d.getViewport(T); else { - const U = u.getViewSubImage(p, C); + const U = u.getViewSubImage(p, T); N = U.viewport, ke === 0 && (e.setRenderTargetTextures( - b, + y, U.colorTexture, U.depthStencilTexture - ), e.setRenderTarget(b)); + ), e.setRenderTarget(y)); } let V = L[ke]; - V === void 0 && (V = new an(), V.layers.enable(ke), V.viewport = new tt(), L[ke] = V), V.matrix.fromArray(C.transform.matrix), V.matrix.decompose(V.position, V.quaternion, V.scale), V.projectionMatrix.fromArray(C.projectionMatrix), V.projectionMatrixInverse.copy(V.projectionMatrix).invert(), V.viewport.set(N.x, N.y, N.width, N.height), ke === 0 && (A.matrix.copy(V.matrix), A.matrix.decompose(A.position, A.quaternion, A.scale)), ye === !0 && A.cameras.push(V); + V === void 0 && (V = new an(), V.layers.enable(ke), V.viewport = new tt(), L[ke] = V), V.matrix.fromArray(T.transform.matrix), V.matrix.decompose(V.position, V.quaternion, V.scale), V.projectionMatrix.fromArray(T.projectionMatrix), V.projectionMatrixInverse.copy(V.projectionMatrix).invert(), V.viewport.set(N.x, N.y, N.width, N.height), ke === 0 && (A.matrix.copy(V.matrix), A.matrix.decompose(A.position, A.quaternion, A.scale)), be === !0 && A.cameras.push(V); } const Se = i.enabledFeatures; if (Se && Se.includes("depth-sensing") && i.depthUsage == "gpu-optimized" && f) { @@ -25940,19 +25920,19 @@ class s_ extends zs { if (Se && Se.includes("camera-access") && f) { e.state.unbindTexture(), u = n.getBinding(); for (let ke = 0; ke < pe.length; ke++) { - const C = pe[ke].camera; - if (C) { - let N = g[C]; - N || (N = new e0(), g[C] = N); - const V = u.getCameraImage(C); + const T = pe[ke].camera; + if (T) { + let N = g[T]; + N || (N = new e0(), g[T] = N); + const V = u.getCameraImage(T); N.sourceTexture = V; } } } } for (let pe = 0; pe < _.length; pe++) { - const ye = M[pe], Se = _[pe]; - ye !== null && Se !== void 0 && Se.update(ye, ce, c || a); + const be = M[pe], Se = _[pe]; + be !== null && Se !== void 0 && Se.update(be, ce, c || a); } fe && fe(se, ce), ce.detectedPlanes && n.dispatchEvent({ type: "planesdetected", data: ce }), m = null; } @@ -25963,7 +25943,7 @@ class s_ extends zs { }; } } -const ys = /* @__PURE__ */ new Bn(), r_ = /* @__PURE__ */ new De(); +const bs = /* @__PURE__ */ new Bn(), r_ = /* @__PURE__ */ new De(); function a_(s, e) { function t(x, g) { x.matrixAutoUpdate === !0 && x.updateMatrix(), g.value.copy(x.matrix); @@ -25971,13 +25951,13 @@ function a_(s, e) { function n(x, g) { g.color.getRGB(x.fogColor.value, Wm(s)), g.isFog ? (x.fogNear.value = g.near, x.fogFar.value = g.far) : g.isFogExp2 && (x.fogDensity.value = g.density); } - function i(x, g, y, v, b) { - g.isMeshBasicMaterial || g.isMeshLambertMaterial ? r(x, g) : g.isMeshToonMaterial ? (r(x, g), u(x, g)) : g.isMeshPhongMaterial ? (r(x, g), h(x, g)) : g.isMeshStandardMaterial ? (r(x, g), p(x, g), g.isMeshPhysicalMaterial && d(x, g, b)) : g.isMeshMatcapMaterial ? (r(x, g), m(x, g)) : g.isMeshDepthMaterial ? r(x, g) : g.isMeshDistanceMaterial ? (r(x, g), f(x, g)) : g.isMeshNormalMaterial ? r(x, g) : g.isLineBasicMaterial ? (a(x, g), g.isLineDashedMaterial && o(x, g)) : g.isPointsMaterial ? l(x, g, y, v) : g.isSpriteMaterial ? c(x, g) : g.isShadowMaterial ? (x.color.value.copy(g.color), x.opacity.value = g.opacity) : g.isShaderMaterial && (g.uniformsNeedUpdate = !1); + function i(x, g, b, v, y) { + g.isMeshBasicMaterial || g.isMeshLambertMaterial ? r(x, g) : g.isMeshToonMaterial ? (r(x, g), u(x, g)) : g.isMeshPhongMaterial ? (r(x, g), h(x, g)) : g.isMeshStandardMaterial ? (r(x, g), p(x, g), g.isMeshPhysicalMaterial && d(x, g, y)) : g.isMeshMatcapMaterial ? (r(x, g), m(x, g)) : g.isMeshDepthMaterial ? r(x, g) : g.isMeshDistanceMaterial ? (r(x, g), f(x, g)) : g.isMeshNormalMaterial ? r(x, g) : g.isLineBasicMaterial ? (a(x, g), g.isLineDashedMaterial && o(x, g)) : g.isPointsMaterial ? l(x, g, b, v) : g.isSpriteMaterial ? c(x, g) : g.isShadowMaterial ? (x.color.value.copy(g.color), x.opacity.value = g.opacity) : g.isShaderMaterial && (g.uniformsNeedUpdate = !1); } function r(x, g) { x.opacity.value = g.opacity, g.color && x.diffuse.value.copy(g.color), g.emissive && x.emissive.value.copy(g.emissive).multiplyScalar(g.emissiveIntensity), g.map && (x.map.value = g.map, t(g.map, x.mapTransform)), g.alphaMap && (x.alphaMap.value = g.alphaMap, t(g.alphaMap, x.alphaMapTransform)), g.bumpMap && (x.bumpMap.value = g.bumpMap, t(g.bumpMap, x.bumpMapTransform), x.bumpScale.value = g.bumpScale, g.side === cn && (x.bumpScale.value *= -1)), g.normalMap && (x.normalMap.value = g.normalMap, t(g.normalMap, x.normalMapTransform), x.normalScale.value.copy(g.normalScale), g.side === cn && x.normalScale.value.negate()), g.displacementMap && (x.displacementMap.value = g.displacementMap, t(g.displacementMap, x.displacementMapTransform), x.displacementScale.value = g.displacementScale, x.displacementBias.value = g.displacementBias), g.emissiveMap && (x.emissiveMap.value = g.emissiveMap, t(g.emissiveMap, x.emissiveMapTransform)), g.specularMap && (x.specularMap.value = g.specularMap, t(g.specularMap, x.specularMapTransform)), g.alphaTest > 0 && (x.alphaTest.value = g.alphaTest); - const y = e.get(g), v = y.envMap, b = y.envMapRotation; - v && (x.envMap.value = v, ys.copy(b), ys.x *= -1, ys.y *= -1, ys.z *= -1, v.isCubeTexture && v.isRenderTargetTexture === !1 && (ys.y *= -1, ys.z *= -1), x.envMapRotation.value.setFromMatrix4(r_.makeRotationFromEuler(ys)), x.flipEnvMap.value = v.isCubeTexture && v.isRenderTargetTexture === !1 ? -1 : 1, x.reflectivity.value = g.reflectivity, x.ior.value = g.ior, x.refractionRatio.value = g.refractionRatio), g.lightMap && (x.lightMap.value = g.lightMap, x.lightMapIntensity.value = g.lightMapIntensity, t(g.lightMap, x.lightMapTransform)), g.aoMap && (x.aoMap.value = g.aoMap, x.aoMapIntensity.value = g.aoMapIntensity, t(g.aoMap, x.aoMapTransform)); + const b = e.get(g), v = b.envMap, y = b.envMapRotation; + v && (x.envMap.value = v, bs.copy(y), bs.x *= -1, bs.y *= -1, bs.z *= -1, v.isCubeTexture && v.isRenderTargetTexture === !1 && (bs.y *= -1, bs.z *= -1), x.envMapRotation.value.setFromMatrix4(r_.makeRotationFromEuler(bs)), x.flipEnvMap.value = v.isCubeTexture && v.isRenderTargetTexture === !1 ? -1 : 1, x.reflectivity.value = g.reflectivity, x.ior.value = g.ior, x.refractionRatio.value = g.refractionRatio), g.lightMap && (x.lightMap.value = g.lightMap, x.lightMapIntensity.value = g.lightMapIntensity, t(g.lightMap, x.lightMapTransform)), g.aoMap && (x.aoMap.value = g.aoMap, x.aoMapIntensity.value = g.aoMapIntensity, t(g.aoMap, x.aoMapTransform)); } function a(x, g) { x.diffuse.value.copy(g.color), x.opacity.value = g.opacity, g.map && (x.map.value = g.map, t(g.map, x.mapTransform)); @@ -25985,8 +25965,8 @@ function a_(s, e) { function o(x, g) { x.dashSize.value = g.dashSize, x.totalSize.value = g.dashSize + g.gapSize, x.scale.value = g.scale; } - function l(x, g, y, v) { - x.diffuse.value.copy(g.color), x.opacity.value = g.opacity, x.size.value = g.size * y, x.scale.value = v * 0.5, g.map && (x.map.value = g.map, t(g.map, x.uvTransform)), g.alphaMap && (x.alphaMap.value = g.alphaMap, t(g.alphaMap, x.alphaMapTransform)), g.alphaTest > 0 && (x.alphaTest.value = g.alphaTest); + function l(x, g, b, v) { + x.diffuse.value.copy(g.color), x.opacity.value = g.opacity, x.size.value = g.size * b, x.scale.value = v * 0.5, g.map && (x.map.value = g.map, t(g.map, x.uvTransform)), g.alphaMap && (x.alphaMap.value = g.alphaMap, t(g.alphaMap, x.alphaMapTransform)), g.alphaTest > 0 && (x.alphaTest.value = g.alphaTest); } function c(x, g) { x.diffuse.value.copy(g.color), x.opacity.value = g.opacity, x.rotation.value = g.rotation, g.map && (x.map.value = g.map, t(g.map, x.mapTransform)), g.alphaMap && (x.alphaMap.value = g.alphaMap, t(g.alphaMap, x.alphaMapTransform)), g.alphaTest > 0 && (x.alphaTest.value = g.alphaTest); @@ -26000,15 +25980,15 @@ function a_(s, e) { function p(x, g) { x.metalness.value = g.metalness, g.metalnessMap && (x.metalnessMap.value = g.metalnessMap, t(g.metalnessMap, x.metalnessMapTransform)), x.roughness.value = g.roughness, g.roughnessMap && (x.roughnessMap.value = g.roughnessMap, t(g.roughnessMap, x.roughnessMapTransform)), g.envMap && (x.envMapIntensity.value = g.envMapIntensity); } - function d(x, g, y) { - x.ior.value = g.ior, g.sheen > 0 && (x.sheenColor.value.copy(g.sheenColor).multiplyScalar(g.sheen), x.sheenRoughness.value = g.sheenRoughness, g.sheenColorMap && (x.sheenColorMap.value = g.sheenColorMap, t(g.sheenColorMap, x.sheenColorMapTransform)), g.sheenRoughnessMap && (x.sheenRoughnessMap.value = g.sheenRoughnessMap, t(g.sheenRoughnessMap, x.sheenRoughnessMapTransform))), g.clearcoat > 0 && (x.clearcoat.value = g.clearcoat, x.clearcoatRoughness.value = g.clearcoatRoughness, g.clearcoatMap && (x.clearcoatMap.value = g.clearcoatMap, t(g.clearcoatMap, x.clearcoatMapTransform)), g.clearcoatRoughnessMap && (x.clearcoatRoughnessMap.value = g.clearcoatRoughnessMap, t(g.clearcoatRoughnessMap, x.clearcoatRoughnessMapTransform)), g.clearcoatNormalMap && (x.clearcoatNormalMap.value = g.clearcoatNormalMap, t(g.clearcoatNormalMap, x.clearcoatNormalMapTransform), x.clearcoatNormalScale.value.copy(g.clearcoatNormalScale), g.side === cn && x.clearcoatNormalScale.value.negate())), g.dispersion > 0 && (x.dispersion.value = g.dispersion), g.iridescence > 0 && (x.iridescence.value = g.iridescence, x.iridescenceIOR.value = g.iridescenceIOR, x.iridescenceThicknessMinimum.value = g.iridescenceThicknessRange[0], x.iridescenceThicknessMaximum.value = g.iridescenceThicknessRange[1], g.iridescenceMap && (x.iridescenceMap.value = g.iridescenceMap, t(g.iridescenceMap, x.iridescenceMapTransform)), g.iridescenceThicknessMap && (x.iridescenceThicknessMap.value = g.iridescenceThicknessMap, t(g.iridescenceThicknessMap, x.iridescenceThicknessMapTransform))), g.transmission > 0 && (x.transmission.value = g.transmission, x.transmissionSamplerMap.value = y.texture, x.transmissionSamplerSize.value.set(y.width, y.height), g.transmissionMap && (x.transmissionMap.value = g.transmissionMap, t(g.transmissionMap, x.transmissionMapTransform)), x.thickness.value = g.thickness, g.thicknessMap && (x.thicknessMap.value = g.thicknessMap, t(g.thicknessMap, x.thicknessMapTransform)), x.attenuationDistance.value = g.attenuationDistance, x.attenuationColor.value.copy(g.attenuationColor)), g.anisotropy > 0 && (x.anisotropyVector.value.set(g.anisotropy * Math.cos(g.anisotropyRotation), g.anisotropy * Math.sin(g.anisotropyRotation)), g.anisotropyMap && (x.anisotropyMap.value = g.anisotropyMap, t(g.anisotropyMap, x.anisotropyMapTransform))), x.specularIntensity.value = g.specularIntensity, x.specularColor.value.copy(g.specularColor), g.specularColorMap && (x.specularColorMap.value = g.specularColorMap, t(g.specularColorMap, x.specularColorMapTransform)), g.specularIntensityMap && (x.specularIntensityMap.value = g.specularIntensityMap, t(g.specularIntensityMap, x.specularIntensityMapTransform)); + function d(x, g, b) { + x.ior.value = g.ior, g.sheen > 0 && (x.sheenColor.value.copy(g.sheenColor).multiplyScalar(g.sheen), x.sheenRoughness.value = g.sheenRoughness, g.sheenColorMap && (x.sheenColorMap.value = g.sheenColorMap, t(g.sheenColorMap, x.sheenColorMapTransform)), g.sheenRoughnessMap && (x.sheenRoughnessMap.value = g.sheenRoughnessMap, t(g.sheenRoughnessMap, x.sheenRoughnessMapTransform))), g.clearcoat > 0 && (x.clearcoat.value = g.clearcoat, x.clearcoatRoughness.value = g.clearcoatRoughness, g.clearcoatMap && (x.clearcoatMap.value = g.clearcoatMap, t(g.clearcoatMap, x.clearcoatMapTransform)), g.clearcoatRoughnessMap && (x.clearcoatRoughnessMap.value = g.clearcoatRoughnessMap, t(g.clearcoatRoughnessMap, x.clearcoatRoughnessMapTransform)), g.clearcoatNormalMap && (x.clearcoatNormalMap.value = g.clearcoatNormalMap, t(g.clearcoatNormalMap, x.clearcoatNormalMapTransform), x.clearcoatNormalScale.value.copy(g.clearcoatNormalScale), g.side === cn && x.clearcoatNormalScale.value.negate())), g.dispersion > 0 && (x.dispersion.value = g.dispersion), g.iridescence > 0 && (x.iridescence.value = g.iridescence, x.iridescenceIOR.value = g.iridescenceIOR, x.iridescenceThicknessMinimum.value = g.iridescenceThicknessRange[0], x.iridescenceThicknessMaximum.value = g.iridescenceThicknessRange[1], g.iridescenceMap && (x.iridescenceMap.value = g.iridescenceMap, t(g.iridescenceMap, x.iridescenceMapTransform)), g.iridescenceThicknessMap && (x.iridescenceThicknessMap.value = g.iridescenceThicknessMap, t(g.iridescenceThicknessMap, x.iridescenceThicknessMapTransform))), g.transmission > 0 && (x.transmission.value = g.transmission, x.transmissionSamplerMap.value = b.texture, x.transmissionSamplerSize.value.set(b.width, b.height), g.transmissionMap && (x.transmissionMap.value = g.transmissionMap, t(g.transmissionMap, x.transmissionMapTransform)), x.thickness.value = g.thickness, g.thicknessMap && (x.thicknessMap.value = g.thicknessMap, t(g.thicknessMap, x.thicknessMapTransform)), x.attenuationDistance.value = g.attenuationDistance, x.attenuationColor.value.copy(g.attenuationColor)), g.anisotropy > 0 && (x.anisotropyVector.value.set(g.anisotropy * Math.cos(g.anisotropyRotation), g.anisotropy * Math.sin(g.anisotropyRotation)), g.anisotropyMap && (x.anisotropyMap.value = g.anisotropyMap, t(g.anisotropyMap, x.anisotropyMapTransform))), x.specularIntensity.value = g.specularIntensity, x.specularColor.value.copy(g.specularColor), g.specularColorMap && (x.specularColorMap.value = g.specularColorMap, t(g.specularColorMap, x.specularColorMapTransform)), g.specularIntensityMap && (x.specularIntensityMap.value = g.specularIntensityMap, t(g.specularIntensityMap, x.specularIntensityMapTransform)); } function m(x, g) { g.matcap && (x.matcap.value = g.matcap); } function f(x, g) { - const y = e.get(g).light; - x.referencePosition.value.setFromMatrixPosition(y.matrixWorld), x.nearDistance.value = y.shadow.camera.near, x.farDistance.value = y.shadow.camera.far; + const b = e.get(g).light; + x.referencePosition.value.setFromMatrixPosition(b.matrixWorld), x.nearDistance.value = b.shadow.camera.near, x.farDistance.value = b.shadow.camera.far; } return { refreshFogUniforms: n, @@ -26018,35 +25998,35 @@ function a_(s, e) { function o_(s, e, t, n) { let i = {}, r = {}, a = []; const o = s.getParameter(s.MAX_UNIFORM_BUFFER_BINDINGS); - function l(y, v) { - const b = v.program; - n.uniformBlockBinding(y, b); + function l(b, v) { + const y = v.program; + n.uniformBlockBinding(b, y); } - function c(y, v) { - let b = i[y.id]; - b === void 0 && (m(y), b = h(y), i[y.id] = b, y.addEventListener("dispose", x)); + function c(b, v) { + let y = i[b.id]; + y === void 0 && (m(b), y = h(b), i[b.id] = y, b.addEventListener("dispose", x)); const _ = v.program; - n.updateUBOMapping(y, _); + n.updateUBOMapping(b, _); const M = e.render.frame; - r[y.id] !== M && (p(y), r[y.id] = M); + r[b.id] !== M && (p(b), r[b.id] = M); } - function h(y) { + function h(b) { const v = u(); - y.__bindingPointIndex = v; - const b = s.createBuffer(), _ = y.__size, M = y.usage; - return s.bindBuffer(s.UNIFORM_BUFFER, b), s.bufferData(s.UNIFORM_BUFFER, _, M), s.bindBuffer(s.UNIFORM_BUFFER, null), s.bindBufferBase(s.UNIFORM_BUFFER, v, b), b; + b.__bindingPointIndex = v; + const y = s.createBuffer(), _ = b.__size, M = b.usage; + return s.bindBuffer(s.UNIFORM_BUFFER, y), s.bufferData(s.UNIFORM_BUFFER, _, M), s.bindBuffer(s.UNIFORM_BUFFER, null), s.bindBufferBase(s.UNIFORM_BUFFER, v, y), y; } function u() { - for (let y = 0; y < o; y++) - if (a.indexOf(y) === -1) - return a.push(y), y; + for (let b = 0; b < o; b++) + if (a.indexOf(b) === -1) + return a.push(b), b; return et("WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached."), 0; } - function p(y) { - const v = i[y.id], b = y.uniforms, _ = y.__cache; + function p(b) { + const v = i[b.id], y = b.uniforms, _ = b.__cache; s.bindBuffer(s.UNIFORM_BUFFER, v); - for (let M = 0, T = b.length; M < T; M++) { - const R = Array.isArray(b[M]) ? b[M] : [b[M]]; + for (let M = 0, C = y.length; M < C; M++) { + const R = Array.isArray(y[M]) ? y[M] : [y[M]]; for (let S = 0, E = R.length; S < E; S++) { const L = R[S]; if (d(L, M, S, _) === !0) { @@ -26062,55 +26042,55 @@ function o_(s, e, t, n) { } s.bindBuffer(s.UNIFORM_BUFFER, null); } - function d(y, v, b, _) { - const M = y.value, T = v + "_" + b; - if (_[T] === void 0) - return typeof M == "number" || typeof M == "boolean" ? _[T] = M : _[T] = M.clone(), !0; + function d(b, v, y, _) { + const M = b.value, C = v + "_" + y; + if (_[C] === void 0) + return typeof M == "number" || typeof M == "boolean" ? _[C] = M : _[C] = M.clone(), !0; { - const R = _[T]; + const R = _[C]; if (typeof M == "number" || typeof M == "boolean") { if (R !== M) - return _[T] = M, !0; + return _[C] = M, !0; } else if (R.equals(M) === !1) return R.copy(M), !0; } return !1; } - function m(y) { - const v = y.uniforms; - let b = 0; + function m(b) { + const v = b.uniforms; + let y = 0; const _ = 16; - for (let T = 0, R = v.length; T < R; T++) { - const S = Array.isArray(v[T]) ? v[T] : [v[T]]; + for (let C = 0, R = v.length; C < R; C++) { + const S = Array.isArray(v[C]) ? v[C] : [v[C]]; for (let E = 0, L = S.length; E < L; E++) { const A = S[E], I = Array.isArray(A.value) ? A.value : [A.value]; for (let w = 0, z = I.length; w < z; w++) { - const G = I[w], j = f(G), Y = b % _, q = Y % j.boundary, ie = Y + q; - b += q, ie !== 0 && _ - ie < j.storage && (b += _ - ie), A.__data = new Float32Array(j.storage / Float32Array.BYTES_PER_ELEMENT), A.__offset = b, b += j.storage; + const G = I[w], j = f(G), Y = y % _, q = Y % j.boundary, ie = Y + q; + y += q, ie !== 0 && _ - ie < j.storage && (y += _ - ie), A.__data = new Float32Array(j.storage / Float32Array.BYTES_PER_ELEMENT), A.__offset = y, y += j.storage; } } } - const M = b % _; - return M > 0 && (b += _ - M), y.__size = b, y.__cache = {}, this; + const M = y % _; + return M > 0 && (y += _ - M), b.__size = y, b.__cache = {}, this; } - function f(y) { + function f(b) { const v = { boundary: 0, // bytes storage: 0 // bytes }; - return typeof y == "number" || typeof y == "boolean" ? (v.boundary = 4, v.storage = 4) : y.isVector2 ? (v.boundary = 8, v.storage = 8) : y.isVector3 || y.isColor ? (v.boundary = 16, v.storage = 12) : y.isVector4 ? (v.boundary = 16, v.storage = 16) : y.isMatrix3 ? (v.boundary = 48, v.storage = 48) : y.isMatrix4 ? (v.boundary = 64, v.storage = 64) : y.isTexture ? He("WebGLRenderer: Texture samplers can not be part of an uniforms group.") : He("WebGLRenderer: Unsupported uniform value type.", y), v; + return typeof b == "number" || typeof b == "boolean" ? (v.boundary = 4, v.storage = 4) : b.isVector2 ? (v.boundary = 8, v.storage = 8) : b.isVector3 || b.isColor ? (v.boundary = 16, v.storage = 12) : b.isVector4 ? (v.boundary = 16, v.storage = 16) : b.isMatrix3 ? (v.boundary = 48, v.storage = 48) : b.isMatrix4 ? (v.boundary = 64, v.storage = 64) : b.isTexture ? He("WebGLRenderer: Texture samplers can not be part of an uniforms group.") : He("WebGLRenderer: Unsupported uniform value type.", b), v; } - function x(y) { - const v = y.target; + function x(b) { + const v = b.target; v.removeEventListener("dispose", x); - const b = a.indexOf(v.__bindingPointIndex); - a.splice(b, 1), s.deleteBuffer(i[v.id]), delete i[v.id], delete r[v.id]; + const y = a.indexOf(v.__bindingPointIndex); + a.splice(y, 1), s.deleteBuffer(i[v.id]), delete i[v.id], delete r[v.id]; } function g() { - for (const y in i) - s.deleteBuffer(i[y]); + for (const b in i) + s.deleteBuffer(i[b]); a = [], i = {}, r = {}; } return { @@ -28213,8 +28193,8 @@ class ad { Fu, Hu ]), x = new Uint32Array(4), g = new Int32Array(4); - let y = null, v = null; - const b = [], _ = []; + let b = null, v = null; + const y = [], _ = []; this.domElement = t, this.debug = { /** * Enables error checking and reporting when shader programs are being compiled. @@ -28228,7 +28208,7 @@ class ad { onShaderError: null }, this.autoClear = !0, this.autoClearColor = !0, this.autoClearDepth = !0, this.autoClearStencil = !0, this.sortObjects = !0, this.clippingPlanes = [], this.localClippingEnabled = !1, this.toneMapping = is, this.toneMappingExposure = 1, this.transmissionResolutionScale = 1; const M = this; - let T = !1; + let C = !1; this._outputColorSpace = Dt; let R = 0, S = 0, E = null, L = -1, A = null; const I = new tt(), w = new tt(); @@ -28239,9 +28219,9 @@ class ad { let de = !1; const se = new Ku(); let ce = !1, pe = !1; - const ye = new De(), Se = new P(), Be = new tt(), $e = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: !0 }; + const be = new De(), Se = new P(), Be = new tt(), $e = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: !0 }; let ke = !1; - function C() { + function T() { return E === null ? ie : 1; } let N = n; @@ -28267,9 +28247,9 @@ class ad { } catch (O) { throw O("WebGLRenderer: " + O.message), O; } - let U, k, F, ee, J, X, B, D, H, K, le, te, Ce, be, Re, Ie, ue, _e, Ve, Ue, Ae, Ge, Z, Te; + let U, k, F, ee, J, X, B, D, H, K, le, te, Te, ye, Re, Ie, ue, _e, Ve, Ue, Ae, Ge, Z, Ce; function Me() { - U = new v2(N), U.init(), Ge = new e_(N, U), k = new c2(N, U, e, Ge), F = new J3(N, U), k.reversedDepthBuffer && p && F.buffers.depth.setReversed(!0), ee = new _2(N), J = new z3(), X = new Q3(N, U, F, J, k, Ge, ee), B = new u2(M), D = new x2(M), H = new Ev(N), Z = new o2(N, H), K = new y2(N, H, ee, Z), le = new w2(N, K, H, ee), Ve = new M2(N, k, X), Ie = new h2(J), te = new O3(M, B, D, U, k, Z, Ie), Ce = new a_(M, J), be = new H3(), Re = new q3(U), _e = new a2(M, B, D, F, le, d, l), ue = new $3(M, le, k), Te = new o_(N, ee, k, F), Ue = new l2(N, U, ee), Ae = new b2(N, U, ee), ee.programs = te.programs, M.capabilities = k, M.extensions = U, M.properties = J, M.renderLists = be, M.shadowMap = ue, M.state = F, M.info = ee; + U = new v2(N), U.init(), Ge = new e_(N, U), k = new c2(N, U, e, Ge), F = new J3(N, U), k.reversedDepthBuffer && p && F.buffers.depth.setReversed(!0), ee = new _2(N), J = new z3(), X = new Q3(N, U, F, J, k, Ge, ee), B = new u2(M), D = new x2(M), H = new Ev(N), Z = new o2(N, H), K = new b2(N, H, ee, Z), le = new w2(N, K, H, ee), Ve = new M2(N, k, X), Ie = new h2(J), te = new O3(M, B, D, U, k, Z, Ie), Te = new a_(M, J), ye = new H3(), Re = new q3(U), _e = new a2(M, B, D, F, le, d, l), ue = new $3(M, le, k), Ce = new o_(N, ee, k, F), Ue = new l2(N, U, ee), Ae = new y2(N, U, ee), ee.programs = te.programs, M.capabilities = k, M.extensions = U, M.properties = J, M.renderLists = ye, M.shadowMap = ue, M.state = F, M.info = ee; } Me(); const we = new s_(M, N); @@ -28347,13 +28327,13 @@ class ad { }, this.clearStencil = function() { this.clear(!1, !1, !0); }, this.dispose = function() { - t.removeEventListener("webglcontextlost", ve, !1), t.removeEventListener("webglcontextrestored", ge, !1), t.removeEventListener("webglcontextcreationerror", Oe, !1), _e.dispose(), be.dispose(), Re.dispose(), J.dispose(), B.dispose(), D.dispose(), le.dispose(), Z.dispose(), Te.dispose(), te.dispose(), we.dispose(), we.removeEventListener("sessionstart", bd), we.removeEventListener("sessionend", _d), ds.stop(); + t.removeEventListener("webglcontextlost", ve, !1), t.removeEventListener("webglcontextrestored", ge, !1), t.removeEventListener("webglcontextcreationerror", Oe, !1), _e.dispose(), ye.dispose(), Re.dispose(), J.dispose(), B.dispose(), D.dispose(), le.dispose(), Z.dispose(), Ce.dispose(), te.dispose(), we.dispose(), we.removeEventListener("sessionstart", yd), we.removeEventListener("sessionend", _d), ds.stop(); }; function ve(O) { - O.preventDefault(), Pl("WebGLRenderer: Context Lost."), T = !0; + O.preventDefault(), Pl("WebGLRenderer: Context Lost."), C = !0; } function ge() { - Pl("WebGLRenderer: Context Restored."), T = !1; + Pl("WebGLRenderer: Context Restored."), C = !1; const O = ee.autoReset, Q = ue.enabled, ae = ue.autoUpdate, oe = ue.needsUpdate, ne = ue.type; Me(), ee.autoReset = O, ue.enabled = Q, ue.autoUpdate = ae, ue.needsUpdate = oe, ue.type = ne; } @@ -28362,9 +28342,9 @@ class ad { } function Ye(O) { const Q = O.target; - Q.removeEventListener("dispose", Ye), bt(Q); + Q.removeEventListener("dispose", Ye), yt(Q); } - function bt(O) { + function yt(O) { dt(O), J.remove(O); } function dt(O) { @@ -28390,10 +28370,10 @@ class ad { Z.setup(ne, oe, ze, ae, Ne); let Rt, gt = Ue; if (Ne !== null && (Rt = H.get(Ne), gt = Ae, gt.setIndex(Rt)), ne.isMesh) - oe.wireframe === !0 ? (F.setLineWidth(oe.wireframeLinewidth * C()), gt.setMode(N.LINES)) : gt.setMode(N.TRIANGLES); + oe.wireframe === !0 ? (F.setLineWidth(oe.wireframeLinewidth * T()), gt.setMode(N.LINES)) : gt.setMode(N.TRIANGLES); else if (ne.isLine) { let Xe = oe.linewidth; - Xe === void 0 && (Xe = 1), F.setLineWidth(Xe * C()), ne.isLineSegments ? gt.setMode(N.LINES) : ne.isLineLoop ? gt.setMode(N.LINE_LOOP) : gt.setMode(N.LINE_STRIP); + Xe === void 0 && (Xe = 1), F.setLineWidth(Xe * T()), ne.isLineSegments ? gt.setMode(N.LINES) : ne.isLineLoop ? gt.setMode(N.LINE_LOOP) : gt.setMode(N.LINE_STRIP); } else ne.isPoints ? gt.setMode(N.POINTS) : ne.isSprite && gt.setMode(N.TRIANGLES); if (ne.isBatchedMesh) if (ne._multiDrawInstances !== null) @@ -28401,15 +28381,15 @@ class ad { else if (U.get("WEBGL_multi_draw")) gt.renderMultiDraw(ne._multiDrawStarts, ne._multiDrawCounts, ne._multiDrawCount); else { - const Xe = ne._multiDrawStarts, Tt = ne._multiDrawCounts, ot = ne._multiDrawCount, En = Ne ? H.get(Ne).bytesPerElement : 1, js = J.get(oe).currentProgram.getUniforms(); - for (let Tn = 0; Tn < ot; Tn++) - js.setValue(N, "_gl_DrawID", Tn), gt.render(Xe[Tn] / En, Tt[Tn]); + const Xe = ne._multiDrawStarts, Ct = ne._multiDrawCounts, ot = ne._multiDrawCount, En = Ne ? H.get(Ne).bytesPerElement : 1, js = J.get(oe).currentProgram.getUniforms(); + for (let Cn = 0; Cn < ot; Cn++) + js.setValue(N, "_gl_DrawID", Cn), gt.render(Xe[Cn] / En, Ct[Cn]); } else if (ne.isInstancedMesh) gt.renderInstances(it, Pt, ne.count); else if (ae.isInstancedBufferGeometry) { - const Xe = ae._maxInstanceCount !== void 0 ? ae._maxInstanceCount : 1 / 0, Tt = Math.min(ae.instanceCount, Xe); - gt.renderInstances(it, Pt, Tt); + const Xe = ae._maxInstanceCount !== void 0 ? ae._maxInstanceCount : 1 / 0, Ct = Math.min(ae.instanceCount, Xe); + gt.renderInstances(it, Pt, Ct); } else gt.render(it, Pt); }; @@ -28455,7 +28435,7 @@ class ad { function mg(O) { $n && $n(O); } - function bd() { + function yd() { ds.stop(); } function _d() { @@ -28464,20 +28444,20 @@ class ad { const ds = new f0(); ds.setAnimationLoop(mg), typeof self < "u" && ds.setContext(self), this.setAnimationLoop = function(O) { $n = O, we.setAnimationLoop(O), O === null ? ds.stop() : ds.start(); - }, we.addEventListener("sessionstart", bd), we.addEventListener("sessionend", _d), this.render = function(O, Q) { + }, we.addEventListener("sessionstart", yd), we.addEventListener("sessionend", _d), this.render = function(O, Q) { if (Q !== void 0 && Q.isCamera !== !0) { et("WebGLRenderer.render: camera is not an instance of THREE.Camera."); return; } - if (T === !0) return; - if (O.matrixWorldAutoUpdate === !0 && O.updateMatrixWorld(), Q.parent === null && Q.matrixWorldAutoUpdate === !0 && Q.updateMatrixWorld(), we.enabled === !0 && we.isPresenting === !0 && (we.cameraAutoUpdate === !0 && we.updateCamera(Q), Q = we.getCamera()), O.isScene === !0 && O.onBeforeRender(M, O, Q, E), v = Re.get(O, _.length), v.init(Q), _.push(v), ye.multiplyMatrices(Q.projectionMatrix, Q.matrixWorldInverse), se.setFromProjectionMatrix(ye, ui, Q.reversedDepth), pe = this.localClippingEnabled, ce = Ie.init(this.clippingPlanes, pe), y = be.get(O, b.length), y.init(), b.push(y), we.enabled === !0 && we.isPresenting === !0) { + if (C === !0) return; + if (O.matrixWorldAutoUpdate === !0 && O.updateMatrixWorld(), Q.parent === null && Q.matrixWorldAutoUpdate === !0 && Q.updateMatrixWorld(), we.enabled === !0 && we.isPresenting === !0 && (we.cameraAutoUpdate === !0 && we.updateCamera(Q), Q = we.getCamera()), O.isScene === !0 && O.onBeforeRender(M, O, Q, E), v = Re.get(O, _.length), v.init(Q), _.push(v), be.multiplyMatrices(Q.projectionMatrix, Q.matrixWorldInverse), se.setFromProjectionMatrix(be, ui, Q.reversedDepth), pe = this.localClippingEnabled, ce = Ie.init(this.clippingPlanes, pe), b = ye.get(O, y.length), b.init(), y.push(b), we.enabled === !0 && we.isPresenting === !0) { const Ee = M.xr.getDepthSensingMesh(); Ee !== null && Ql(Ee, Q, -1 / 0, M.sortObjects); } - Ql(O, Q, 0, M.sortObjects), y.finish(), M.sortObjects === !0 && y.sort(W, $), ke = we.enabled === !1 || we.isPresenting === !1 || we.hasDepthSensing() === !1, ke && _e.addToRenderList(y, O), this.info.render.frame++, ce === !0 && Ie.beginShadows(); + Ql(O, Q, 0, M.sortObjects), b.finish(), M.sortObjects === !0 && b.sort(W, $), ke = we.enabled === !1 || we.isPresenting === !1 || we.hasDepthSensing() === !1, ke && _e.addToRenderList(b, O), this.info.render.frame++, ce === !0 && Ie.beginShadows(); const ae = v.state.shadowsArray; ue.render(ae, O, Q), ce === !0 && Ie.endShadows(), this.info.autoReset === !0 && this.info.reset(); - const oe = y.opaque, ne = y.transmissive; + const oe = b.opaque, ne = b.transmissive; if (v.setupLights(), Q.isArrayCamera) { const Ee = Q.cameras; if (ne.length > 0) @@ -28488,11 +28468,11 @@ class ad { ke && _e.render(O); for (let Le = 0, ze = Ee.length; Le < ze; Le++) { const Ne = Ee[Le]; - Md(y, O, Ne, Ne.viewport); + Md(b, O, Ne, Ne.viewport); } } else - ne.length > 0 && wd(oe, ne, O, Q), ke && _e.render(O), Md(y, O, Q); - E !== null && S === 0 && (X.updateMultisampleRenderTarget(E), X.updateRenderTargetMipmap(E)), O.isScene === !0 && O.onAfterRender(M, O, Q), Z.resetDefaultState(), L = -1, A = null, _.pop(), _.length > 0 ? (v = _[_.length - 1], ce === !0 && Ie.setGlobalState(M.clippingPlanes, v.state.camera)) : v = null, b.pop(), b.length > 0 ? y = b[b.length - 1] : y = null; + ne.length > 0 && wd(oe, ne, O, Q), ke && _e.render(O), Md(b, O, Q); + E !== null && S === 0 && (X.updateMultisampleRenderTarget(E), X.updateRenderTargetMipmap(E)), O.isScene === !0 && O.onAfterRender(M, O, Q), Z.resetDefaultState(), L = -1, A = null, _.pop(), _.length > 0 ? (v = _[_.length - 1], ce === !0 && Ie.setGlobalState(M.clippingPlanes, v.state.camera)) : v = null, y.pop(), y.length > 0 ? b = y[y.length - 1] : b = null; }; function Ql(O, Q, ae, oe) { if (O.visible === !1) return; @@ -28505,19 +28485,19 @@ class ad { v.pushLight(O), O.castShadow && v.pushShadow(O); else if (O.isSprite) { if (!O.frustumCulled || se.intersectsSprite(O)) { - oe && Be.setFromMatrixPosition(O.matrixWorld).applyMatrix4(ye); + oe && Be.setFromMatrixPosition(O.matrixWorld).applyMatrix4(be); const Le = le.update(O), ze = O.material; - ze.visible && y.push(O, Le, ze, ae, Be.z, null); + ze.visible && b.push(O, Le, ze, ae, Be.z, null); } } else if ((O.isMesh || O.isLine || O.isPoints) && (!O.frustumCulled || se.intersectsObject(O))) { const Le = le.update(O), ze = O.material; - if (oe && (O.boundingSphere !== void 0 ? (O.boundingSphere === null && O.computeBoundingSphere(), Be.copy(O.boundingSphere.center)) : (Le.boundingSphere === null && Le.computeBoundingSphere(), Be.copy(Le.boundingSphere.center)), Be.applyMatrix4(O.matrixWorld).applyMatrix4(ye)), Array.isArray(ze)) { + if (oe && (O.boundingSphere !== void 0 ? (O.boundingSphere === null && O.computeBoundingSphere(), Be.copy(O.boundingSphere.center)) : (Le.boundingSphere === null && Le.computeBoundingSphere(), Be.copy(Le.boundingSphere.center)), Be.applyMatrix4(O.matrixWorld).applyMatrix4(be)), Array.isArray(ze)) { const Ne = Le.groups; for (let je = 0, Ze = Ne.length; je < Ze; je++) { const We = Ne[je], it = ze[We.materialIndex]; - it && it.visible && y.push(O, Le, it, ae, Be.z, We); + it && it.visible && b.push(O, Le, it, ae, Be.z, We); } - } else ze.visible && y.push(O, Le, ze, ae, Be.z, null); + } else ze.visible && b.push(O, Le, ze, ae, Be.z, null); } } const Ee = O.children; @@ -28551,10 +28531,10 @@ class ad { if (oe.viewport !== void 0 && (oe.viewport = void 0), v.setupLightsView(oe), ce === !0 && Ie.setGlobalState(M.clippingPlanes, oe), ja(O, ae, oe), X.updateMultisampleRenderTarget(Ee), X.updateRenderTargetMipmap(Ee), U.has("WEBGL_multisampled_render_to_texture") === !1) { let it = !1; for (let pt = 0, Pt = Q.length; pt < Pt; pt++) { - const Rt = Q[pt], { object: gt, geometry: Xe, material: Tt, group: ot } = Rt; - if (Tt.side === Mt && gt.layers.test(oe.layers)) { - const En = Tt.side; - Tt.side = cn, Tt.needsUpdate = !0, Sd(gt, ae, oe, Xe, Tt, ot), Tt.side = En, Tt.needsUpdate = !0, it = !0; + const Rt = Q[pt], { object: gt, geometry: Xe, material: Ct, group: ot } = Rt; + if (Ct.side === Mt && gt.layers.test(oe.layers)) { + const En = Ct.side; + Ct.side = cn, Ct.needsUpdate = !0, Sd(gt, ae, oe, Xe, Ct, ot), Ct.side = En, Ct.needsUpdate = !0, it = !0; } } it === !0 && (X.updateMultisampleRenderTarget(Ee), X.updateRenderTargetMipmap(Ee)); @@ -28580,11 +28560,11 @@ class ad { let Ze = je.get(Ne); if (Ze !== void 0) { if (oe.currentProgram === Ze && oe.lightsStateVersion === Le) - return Td(O, ze), Ze; + return Cd(O, ze), Ze; } else ze.uniforms = te.getUniforms(O), O.onBeforeCompile(ze, M), Ze = te.acquireProgram(ze, Ne), je.set(Ne, Ze), oe.uniforms = ze.uniforms; const We = oe.uniforms; - return (!O.isShaderMaterial && !O.isRawShaderMaterial || O.clipping === !0) && (We.clippingPlanes = Ie.uniform), Td(O, ze), oe.needsLights = vg(O), oe.lightsStateVersion = Le, oe.needsLights && (We.ambientLightColor.value = ne.state.ambient, We.lightProbe.value = ne.state.probe, We.directionalLights.value = ne.state.directional, We.directionalLightShadows.value = ne.state.directionalShadow, We.spotLights.value = ne.state.spot, We.spotLightShadows.value = ne.state.spotShadow, We.rectAreaLights.value = ne.state.rectArea, We.ltc_1.value = ne.state.rectAreaLTC1, We.ltc_2.value = ne.state.rectAreaLTC2, We.pointLights.value = ne.state.point, We.pointLightShadows.value = ne.state.pointShadow, We.hemisphereLights.value = ne.state.hemi, We.directionalShadowMap.value = ne.state.directionalShadowMap, We.directionalShadowMatrix.value = ne.state.directionalShadowMatrix, We.spotShadowMap.value = ne.state.spotShadowMap, We.spotLightMatrix.value = ne.state.spotLightMatrix, We.spotLightMap.value = ne.state.spotLightMap, We.pointShadowMap.value = ne.state.pointShadowMap, We.pointShadowMatrix.value = ne.state.pointShadowMatrix), oe.currentProgram = Ze, oe.uniformsList = null, Ze; + return (!O.isShaderMaterial && !O.isRawShaderMaterial || O.clipping === !0) && (We.clippingPlanes = Ie.uniform), Cd(O, ze), oe.needsLights = vg(O), oe.lightsStateVersion = Le, oe.needsLights && (We.ambientLightColor.value = ne.state.ambient, We.lightProbe.value = ne.state.probe, We.directionalLights.value = ne.state.directional, We.directionalLightShadows.value = ne.state.directionalShadow, We.spotLights.value = ne.state.spot, We.spotLightShadows.value = ne.state.spotShadow, We.rectAreaLights.value = ne.state.rectArea, We.ltc_1.value = ne.state.rectAreaLTC1, We.ltc_2.value = ne.state.rectAreaLTC2, We.pointLights.value = ne.state.point, We.pointLightShadows.value = ne.state.pointShadow, We.hemisphereLights.value = ne.state.hemi, We.directionalShadowMap.value = ne.state.directionalShadowMap, We.directionalShadowMatrix.value = ne.state.directionalShadowMatrix, We.spotShadowMap.value = ne.state.spotShadowMap, We.spotLightMatrix.value = ne.state.spotLightMatrix, We.spotLightMap.value = ne.state.spotLightMap, We.pointShadowMap.value = ne.state.pointShadowMap, We.pointShadowMatrix.value = ne.state.pointShadowMatrix), oe.currentProgram = Ze, oe.uniformsList = null, Ze; } function Ed(O) { if (O.uniformsList === null) { @@ -28593,7 +28573,7 @@ class ad { } return O.uniformsList; } - function Td(O, Q) { + function Cd(O, Q) { const ae = J.get(O); ae.outputColorSpace = Q.outputColorSpace, ae.batching = Q.batching, ae.batchingColor = Q.batchingColor, ae.instancing = Q.instancing, ae.instancingColor = Q.instancingColor, ae.instancingMorph = Q.instancingMorph, ae.skinning = Q.skinning, ae.morphTargets = Q.morphTargets, ae.morphNormals = Q.morphNormals, ae.morphColors = Q.morphColors, ae.morphTargetsCount = Q.morphTargetsCount, ae.numClippingPlanes = Q.numClippingPlanes, ae.numIntersection = Q.numClipIntersection, ae.vertexAlphas = Q.vertexAlphas, ae.vertexTangents = Q.vertexTangents, ae.toneMapping = Q.toneMapping; } @@ -28602,38 +28582,38 @@ class ad { const Ee = Q.fog, Le = oe.isMeshStandardMaterial ? Q.environment : null, ze = E === null ? M.outputColorSpace : E.isXRRenderTarget === !0 ? E.texture.colorSpace : nn, Ne = (oe.isMeshStandardMaterial ? D : B).get(oe.envMap || Le), je = oe.vertexColors === !0 && !!ae.attributes.color && ae.attributes.color.itemSize === 4, Ze = !!ae.attributes.tangent && (!!oe.normalMap || oe.anisotropy > 0), We = !!ae.morphAttributes.position, it = !!ae.morphAttributes.normal, pt = !!ae.morphAttributes.color; let Pt = is; oe.toneMapped && (E === null || E.isXRRenderTarget === !0) && (Pt = M.toneMapping); - const Rt = ae.morphAttributes.position || ae.morphAttributes.normal || ae.morphAttributes.color, gt = Rt !== void 0 ? Rt.length : 0, Xe = J.get(oe), Tt = v.state.lights; + const Rt = ae.morphAttributes.position || ae.morphAttributes.normal || ae.morphAttributes.color, gt = Rt !== void 0 ? Rt.length : 0, Xe = J.get(oe), Ct = v.state.lights; if (ce === !0 && (pe === !0 || O !== A)) { const hn = O === A && oe.id === L; Ie.setState(oe, O, hn); } let ot = !1; - oe.version === Xe.__version ? (Xe.needsLights && Xe.lightsStateVersion !== Tt.state.version || Xe.outputColorSpace !== ze || ne.isBatchedMesh && Xe.batching === !1 || !ne.isBatchedMesh && Xe.batching === !0 || ne.isBatchedMesh && Xe.batchingColor === !0 && ne.colorTexture === null || ne.isBatchedMesh && Xe.batchingColor === !1 && ne.colorTexture !== null || ne.isInstancedMesh && Xe.instancing === !1 || !ne.isInstancedMesh && Xe.instancing === !0 || ne.isSkinnedMesh && Xe.skinning === !1 || !ne.isSkinnedMesh && Xe.skinning === !0 || ne.isInstancedMesh && Xe.instancingColor === !0 && ne.instanceColor === null || ne.isInstancedMesh && Xe.instancingColor === !1 && ne.instanceColor !== null || ne.isInstancedMesh && Xe.instancingMorph === !0 && ne.morphTexture === null || ne.isInstancedMesh && Xe.instancingMorph === !1 && ne.morphTexture !== null || Xe.envMap !== Ne || oe.fog === !0 && Xe.fog !== Ee || Xe.numClippingPlanes !== void 0 && (Xe.numClippingPlanes !== Ie.numPlanes || Xe.numIntersection !== Ie.numIntersection) || Xe.vertexAlphas !== je || Xe.vertexTangents !== Ze || Xe.morphTargets !== We || Xe.morphNormals !== it || Xe.morphColors !== pt || Xe.toneMapping !== Pt || Xe.morphTargetsCount !== gt) && (ot = !0) : (ot = !0, Xe.__version = oe.version); + oe.version === Xe.__version ? (Xe.needsLights && Xe.lightsStateVersion !== Ct.state.version || Xe.outputColorSpace !== ze || ne.isBatchedMesh && Xe.batching === !1 || !ne.isBatchedMesh && Xe.batching === !0 || ne.isBatchedMesh && Xe.batchingColor === !0 && ne.colorTexture === null || ne.isBatchedMesh && Xe.batchingColor === !1 && ne.colorTexture !== null || ne.isInstancedMesh && Xe.instancing === !1 || !ne.isInstancedMesh && Xe.instancing === !0 || ne.isSkinnedMesh && Xe.skinning === !1 || !ne.isSkinnedMesh && Xe.skinning === !0 || ne.isInstancedMesh && Xe.instancingColor === !0 && ne.instanceColor === null || ne.isInstancedMesh && Xe.instancingColor === !1 && ne.instanceColor !== null || ne.isInstancedMesh && Xe.instancingMorph === !0 && ne.morphTexture === null || ne.isInstancedMesh && Xe.instancingMorph === !1 && ne.morphTexture !== null || Xe.envMap !== Ne || oe.fog === !0 && Xe.fog !== Ee || Xe.numClippingPlanes !== void 0 && (Xe.numClippingPlanes !== Ie.numPlanes || Xe.numIntersection !== Ie.numIntersection) || Xe.vertexAlphas !== je || Xe.vertexTangents !== Ze || Xe.morphTargets !== We || Xe.morphNormals !== it || Xe.morphColors !== pt || Xe.toneMapping !== Pt || Xe.morphTargetsCount !== gt) && (ot = !0) : (ot = !0, Xe.__version = oe.version); let En = Xe.currentProgram; ot === !0 && (En = qa(oe, Q, ne)); - let js = !1, Tn = !1, qr = !1; - const Ct = En.getUniforms(), vn = Xe.uniforms; - if (F.useProgram(En.program) && (js = !0, Tn = !0, qr = !0), oe.id !== L && (L = oe.id, Tn = !0), js || A !== O) { - F.buffers.depth.getReversed() && O.reversedDepth !== !0 && (O._reversedDepth = !0, O.updateProjectionMatrix()), Ct.setValue(N, "projectionMatrix", O.projectionMatrix), Ct.setValue(N, "viewMatrix", O.matrixWorldInverse); - const yn = Ct.map.cameraPosition; - yn !== void 0 && yn.setValue(N, Se.setFromMatrixPosition(O.matrixWorld)), k.logarithmicDepthBuffer && Ct.setValue( + let js = !1, Cn = !1, qr = !1; + const Tt = En.getUniforms(), vn = Xe.uniforms; + if (F.useProgram(En.program) && (js = !0, Cn = !0, qr = !0), oe.id !== L && (L = oe.id, Cn = !0), js || A !== O) { + F.buffers.depth.getReversed() && O.reversedDepth !== !0 && (O._reversedDepth = !0, O.updateProjectionMatrix()), Tt.setValue(N, "projectionMatrix", O.projectionMatrix), Tt.setValue(N, "viewMatrix", O.matrixWorldInverse); + const bn = Tt.map.cameraPosition; + bn !== void 0 && bn.setValue(N, Se.setFromMatrixPosition(O.matrixWorld)), k.logarithmicDepthBuffer && Tt.setValue( N, "logDepthBufFC", 2 / (Math.log(O.far + 1) / Math.LN2) - ), (oe.isMeshPhongMaterial || oe.isMeshToonMaterial || oe.isMeshLambertMaterial || oe.isMeshBasicMaterial || oe.isMeshStandardMaterial || oe.isShaderMaterial) && Ct.setValue(N, "isOrthographic", O.isOrthographicCamera === !0), A !== O && (A = O, Tn = !0, qr = !0); + ), (oe.isMeshPhongMaterial || oe.isMeshToonMaterial || oe.isMeshLambertMaterial || oe.isMeshBasicMaterial || oe.isMeshStandardMaterial || oe.isShaderMaterial) && Tt.setValue(N, "isOrthographic", O.isOrthographicCamera === !0), A !== O && (A = O, Cn = !0, qr = !0); } if (ne.isSkinnedMesh) { - Ct.setOptional(N, ne, "bindMatrix"), Ct.setOptional(N, ne, "bindMatrixInverse"); + Tt.setOptional(N, ne, "bindMatrix"), Tt.setOptional(N, ne, "bindMatrixInverse"); const hn = ne.skeleton; - hn && (hn.boneTexture === null && hn.computeBoneTexture(), Ct.setValue(N, "boneTexture", hn.boneTexture, X)); + hn && (hn.boneTexture === null && hn.computeBoneTexture(), Tt.setValue(N, "boneTexture", hn.boneTexture, X)); } - ne.isBatchedMesh && (Ct.setOptional(N, ne, "batchingTexture"), Ct.setValue(N, "batchingTexture", ne._matricesTexture, X), Ct.setOptional(N, ne, "batchingIdTexture"), Ct.setValue(N, "batchingIdTexture", ne._indirectTexture, X), Ct.setOptional(N, ne, "batchingColorTexture"), ne._colorsTexture !== null && Ct.setValue(N, "batchingColorTexture", ne._colorsTexture, X)); + ne.isBatchedMesh && (Tt.setOptional(N, ne, "batchingTexture"), Tt.setValue(N, "batchingTexture", ne._matricesTexture, X), Tt.setOptional(N, ne, "batchingIdTexture"), Tt.setValue(N, "batchingIdTexture", ne._indirectTexture, X), Tt.setOptional(N, ne, "batchingColorTexture"), ne._colorsTexture !== null && Tt.setValue(N, "batchingColorTexture", ne._colorsTexture, X)); const kn = ae.morphAttributes; - if ((kn.position !== void 0 || kn.normal !== void 0 || kn.color !== void 0) && Ve.update(ne, ae, En), (Tn || Xe.receiveShadow !== ne.receiveShadow) && (Xe.receiveShadow = ne.receiveShadow, Ct.setValue(N, "receiveShadow", ne.receiveShadow)), oe.isMeshGouraudMaterial && oe.envMap !== null && (vn.envMap.value = Ne, vn.flipEnvMap.value = Ne.isCubeTexture && Ne.isRenderTargetTexture === !1 ? -1 : 1), oe.isMeshStandardMaterial && oe.envMap === null && Q.environment !== null && (vn.envMapIntensity.value = Q.environmentIntensity), vn.dfgLUT !== void 0 && (vn.dfgLUT.value = c_()), Tn && (Ct.setValue(N, "toneMappingExposure", M.toneMappingExposure), Xe.needsLights && xg(vn, qr), Ee && oe.fog === !0 && Ce.refreshFogUniforms(vn, Ee), Ce.refreshMaterialUniforms(vn, oe, ie, q, v.state.transmissionRenderTarget[O.id]), fl.upload(N, Ed(Xe), vn, X)), oe.isShaderMaterial && oe.uniformsNeedUpdate === !0 && (fl.upload(N, Ed(Xe), vn, X), oe.uniformsNeedUpdate = !1), oe.isSpriteMaterial && Ct.setValue(N, "center", ne.center), Ct.setValue(N, "modelViewMatrix", ne.modelViewMatrix), Ct.setValue(N, "normalMatrix", ne.normalMatrix), Ct.setValue(N, "modelMatrix", ne.matrixWorld), oe.isShaderMaterial || oe.isRawShaderMaterial) { + if ((kn.position !== void 0 || kn.normal !== void 0 || kn.color !== void 0) && Ve.update(ne, ae, En), (Cn || Xe.receiveShadow !== ne.receiveShadow) && (Xe.receiveShadow = ne.receiveShadow, Tt.setValue(N, "receiveShadow", ne.receiveShadow)), oe.isMeshGouraudMaterial && oe.envMap !== null && (vn.envMap.value = Ne, vn.flipEnvMap.value = Ne.isCubeTexture && Ne.isRenderTargetTexture === !1 ? -1 : 1), oe.isMeshStandardMaterial && oe.envMap === null && Q.environment !== null && (vn.envMapIntensity.value = Q.environmentIntensity), vn.dfgLUT !== void 0 && (vn.dfgLUT.value = c_()), Cn && (Tt.setValue(N, "toneMappingExposure", M.toneMappingExposure), Xe.needsLights && xg(vn, qr), Ee && oe.fog === !0 && Te.refreshFogUniforms(vn, Ee), Te.refreshMaterialUniforms(vn, oe, ie, q, v.state.transmissionRenderTarget[O.id]), fl.upload(N, Ed(Xe), vn, X)), oe.isShaderMaterial && oe.uniformsNeedUpdate === !0 && (fl.upload(N, Ed(Xe), vn, X), oe.uniformsNeedUpdate = !1), oe.isSpriteMaterial && Tt.setValue(N, "center", ne.center), Tt.setValue(N, "modelViewMatrix", ne.modelViewMatrix), Tt.setValue(N, "normalMatrix", ne.normalMatrix), Tt.setValue(N, "modelMatrix", ne.matrixWorld), oe.isShaderMaterial || oe.isRawShaderMaterial) { const hn = oe.uniformsGroups; - for (let yn = 0, ec = hn.length; yn < ec; yn++) { - const ps = hn[yn]; - Te.update(ps, En), Te.bind(ps, En); + for (let bn = 0, ec = hn.length; bn < ec; bn++) { + const ps = hn[bn]; + Ce.update(ps, En), Ce.bind(ps, En); } } return En; @@ -28657,7 +28637,7 @@ class ad { const ae = J.get(O); ae.__webglFramebuffer = Q, ae.__useDefaultFramebuffer = Q === void 0; }; - const yg = N.createFramebuffer(); + const bg = N.createFramebuffer(); this.setRenderTarget = function(O, Q = 0, ae = 0) { E = O, R = Q, S = ae; let oe = !0, ne = null, Ee = !1, Le = !1; @@ -28683,7 +28663,7 @@ class ad { O.isWebGLCubeRenderTarget ? (Array.isArray(Ze[Q]) ? ne = Ze[Q][ae] : ne = Ze[Q], Ee = !0) : O.samples > 0 && X.useMultisampledRTT(O) === !1 ? ne = J.get(O).__webglMultisampledFramebuffer : Array.isArray(Ze) ? ne = Ze[ae] : ne = Ze, I.copy(O.viewport), w.copy(O.scissor), z = O.scissorTest; } else I.copy(fe).multiplyScalar(ie).floor(), w.copy(me).multiplyScalar(ie).floor(), z = de; - if (ae !== 0 && (ne = yg), F.bindFramebuffer(N.FRAMEBUFFER, ne) && oe && F.drawBuffers(O, ne), F.viewport(I), F.scissor(w), F.setScissorTest(z), Ee) { + if (ae !== 0 && (ne = bg), F.bindFramebuffer(N.FRAMEBUFFER, ne) && oe && F.drawBuffers(O, ne), F.viewport(I), F.scissor(w), F.setScissorTest(z), Ee) { const Ne = J.get(O.texture); N.framebufferTexture2D(N.FRAMEBUFFER, N.COLOR_ATTACHMENT0, N.TEXTURE_CUBE_MAP_POSITIVE_X + Q, Ne.__webglTexture, ae); } else if (Le) { @@ -28745,7 +28725,7 @@ class ad { const oe = Math.pow(2, -ae), ne = Math.floor(O.image.width * oe), Ee = Math.floor(O.image.height * oe), Le = Q !== null ? Q.x : 0, ze = Q !== null ? Q.y : 0; X.setTexture2D(O, 0), N.copyTexSubImage2D(N.TEXTURE_2D, ae, 0, 0, Le, ze, ne, Ee), F.unbindTexture(); }; - const bg = N.createFramebuffer(), _g = N.createFramebuffer(); + const yg = N.createFramebuffer(), _g = N.createFramebuffer(); this.copyTextureToTexture = function(O, Q, ae = null, oe = null, ne = 0, Ee = null) { Ee === null && (ne !== 0 ? (Na("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."), Ee = ne, ne = 0) : Ee = 0); let Le, ze, Ne, je, Ze, We, it, pt, Pt; @@ -28758,26 +28738,26 @@ class ad { } oe !== null ? (it = oe.x, pt = oe.y, Pt = oe.z) : (it = 0, pt = 0, Pt = 0); const gt = Ge.convert(Q.format), Xe = Ge.convert(Q.type); - let Tt; - Q.isData3DTexture ? (X.setTexture3D(Q, 0), Tt = N.TEXTURE_3D) : Q.isDataArrayTexture || Q.isCompressedArrayTexture ? (X.setTexture2DArray(Q, 0), Tt = N.TEXTURE_2D_ARRAY) : (X.setTexture2D(Q, 0), Tt = N.TEXTURE_2D), N.pixelStorei(N.UNPACK_FLIP_Y_WEBGL, Q.flipY), N.pixelStorei(N.UNPACK_PREMULTIPLY_ALPHA_WEBGL, Q.premultiplyAlpha), N.pixelStorei(N.UNPACK_ALIGNMENT, Q.unpackAlignment); - const ot = N.getParameter(N.UNPACK_ROW_LENGTH), En = N.getParameter(N.UNPACK_IMAGE_HEIGHT), js = N.getParameter(N.UNPACK_SKIP_PIXELS), Tn = N.getParameter(N.UNPACK_SKIP_ROWS), qr = N.getParameter(N.UNPACK_SKIP_IMAGES); + let Ct; + Q.isData3DTexture ? (X.setTexture3D(Q, 0), Ct = N.TEXTURE_3D) : Q.isDataArrayTexture || Q.isCompressedArrayTexture ? (X.setTexture2DArray(Q, 0), Ct = N.TEXTURE_2D_ARRAY) : (X.setTexture2D(Q, 0), Ct = N.TEXTURE_2D), N.pixelStorei(N.UNPACK_FLIP_Y_WEBGL, Q.flipY), N.pixelStorei(N.UNPACK_PREMULTIPLY_ALPHA_WEBGL, Q.premultiplyAlpha), N.pixelStorei(N.UNPACK_ALIGNMENT, Q.unpackAlignment); + const ot = N.getParameter(N.UNPACK_ROW_LENGTH), En = N.getParameter(N.UNPACK_IMAGE_HEIGHT), js = N.getParameter(N.UNPACK_SKIP_PIXELS), Cn = N.getParameter(N.UNPACK_SKIP_ROWS), qr = N.getParameter(N.UNPACK_SKIP_IMAGES); N.pixelStorei(N.UNPACK_ROW_LENGTH, Rt.width), N.pixelStorei(N.UNPACK_IMAGE_HEIGHT, Rt.height), N.pixelStorei(N.UNPACK_SKIP_PIXELS, je), N.pixelStorei(N.UNPACK_SKIP_ROWS, Ze), N.pixelStorei(N.UNPACK_SKIP_IMAGES, We); - const Ct = O.isDataArrayTexture || O.isData3DTexture, vn = Q.isDataArrayTexture || Q.isData3DTexture; + const Tt = O.isDataArrayTexture || O.isData3DTexture, vn = Q.isDataArrayTexture || Q.isData3DTexture; if (O.isDepthTexture) { - const kn = J.get(O), hn = J.get(Q), yn = J.get(kn.__renderTarget), ec = J.get(hn.__renderTarget); - F.bindFramebuffer(N.READ_FRAMEBUFFER, yn.__webglFramebuffer), F.bindFramebuffer(N.DRAW_FRAMEBUFFER, ec.__webglFramebuffer); + const kn = J.get(O), hn = J.get(Q), bn = J.get(kn.__renderTarget), ec = J.get(hn.__renderTarget); + F.bindFramebuffer(N.READ_FRAMEBUFFER, bn.__webglFramebuffer), F.bindFramebuffer(N.DRAW_FRAMEBUFFER, ec.__webglFramebuffer); for (let ps = 0; ps < Ne; ps++) - Ct && (N.framebufferTextureLayer(N.READ_FRAMEBUFFER, N.COLOR_ATTACHMENT0, J.get(O).__webglTexture, ne, We + ps), N.framebufferTextureLayer(N.DRAW_FRAMEBUFFER, N.COLOR_ATTACHMENT0, J.get(Q).__webglTexture, Ee, Pt + ps)), N.blitFramebuffer(je, Ze, Le, ze, it, pt, Le, ze, N.DEPTH_BUFFER_BIT, N.NEAREST); + Tt && (N.framebufferTextureLayer(N.READ_FRAMEBUFFER, N.COLOR_ATTACHMENT0, J.get(O).__webglTexture, ne, We + ps), N.framebufferTextureLayer(N.DRAW_FRAMEBUFFER, N.COLOR_ATTACHMENT0, J.get(Q).__webglTexture, Ee, Pt + ps)), N.blitFramebuffer(je, Ze, Le, ze, it, pt, Le, ze, N.DEPTH_BUFFER_BIT, N.NEAREST); F.bindFramebuffer(N.READ_FRAMEBUFFER, null), F.bindFramebuffer(N.DRAW_FRAMEBUFFER, null); } else if (ne !== 0 || O.isRenderTargetTexture || J.has(O)) { const kn = J.get(O), hn = J.get(Q); - F.bindFramebuffer(N.READ_FRAMEBUFFER, bg), F.bindFramebuffer(N.DRAW_FRAMEBUFFER, _g); - for (let yn = 0; yn < Ne; yn++) - Ct ? N.framebufferTextureLayer(N.READ_FRAMEBUFFER, N.COLOR_ATTACHMENT0, kn.__webglTexture, ne, We + yn) : N.framebufferTexture2D(N.READ_FRAMEBUFFER, N.COLOR_ATTACHMENT0, N.TEXTURE_2D, kn.__webglTexture, ne), vn ? N.framebufferTextureLayer(N.DRAW_FRAMEBUFFER, N.COLOR_ATTACHMENT0, hn.__webglTexture, Ee, Pt + yn) : N.framebufferTexture2D(N.DRAW_FRAMEBUFFER, N.COLOR_ATTACHMENT0, N.TEXTURE_2D, hn.__webglTexture, Ee), ne !== 0 ? N.blitFramebuffer(je, Ze, Le, ze, it, pt, Le, ze, N.COLOR_BUFFER_BIT, N.NEAREST) : vn ? N.copyTexSubImage3D(Tt, Ee, it, pt, Pt + yn, je, Ze, Le, ze) : N.copyTexSubImage2D(Tt, Ee, it, pt, je, Ze, Le, ze); + F.bindFramebuffer(N.READ_FRAMEBUFFER, yg), F.bindFramebuffer(N.DRAW_FRAMEBUFFER, _g); + for (let bn = 0; bn < Ne; bn++) + Tt ? N.framebufferTextureLayer(N.READ_FRAMEBUFFER, N.COLOR_ATTACHMENT0, kn.__webglTexture, ne, We + bn) : N.framebufferTexture2D(N.READ_FRAMEBUFFER, N.COLOR_ATTACHMENT0, N.TEXTURE_2D, kn.__webglTexture, ne), vn ? N.framebufferTextureLayer(N.DRAW_FRAMEBUFFER, N.COLOR_ATTACHMENT0, hn.__webglTexture, Ee, Pt + bn) : N.framebufferTexture2D(N.DRAW_FRAMEBUFFER, N.COLOR_ATTACHMENT0, N.TEXTURE_2D, hn.__webglTexture, Ee), ne !== 0 ? N.blitFramebuffer(je, Ze, Le, ze, it, pt, Le, ze, N.COLOR_BUFFER_BIT, N.NEAREST) : vn ? N.copyTexSubImage3D(Ct, Ee, it, pt, Pt + bn, je, Ze, Le, ze) : N.copyTexSubImage2D(Ct, Ee, it, pt, je, Ze, Le, ze); F.bindFramebuffer(N.READ_FRAMEBUFFER, null), F.bindFramebuffer(N.DRAW_FRAMEBUFFER, null); } else - vn ? O.isDataTexture || O.isData3DTexture ? N.texSubImage3D(Tt, Ee, it, pt, Pt, Le, ze, Ne, gt, Xe, Rt.data) : Q.isCompressedArrayTexture ? N.compressedTexSubImage3D(Tt, Ee, it, pt, Pt, Le, ze, Ne, gt, Rt.data) : N.texSubImage3D(Tt, Ee, it, pt, Pt, Le, ze, Ne, gt, Xe, Rt) : O.isDataTexture ? N.texSubImage2D(N.TEXTURE_2D, Ee, it, pt, Le, ze, gt, Xe, Rt.data) : O.isCompressedTexture ? N.compressedTexSubImage2D(N.TEXTURE_2D, Ee, it, pt, Rt.width, Rt.height, gt, Rt.data) : N.texSubImage2D(N.TEXTURE_2D, Ee, it, pt, Le, ze, gt, Xe, Rt); - N.pixelStorei(N.UNPACK_ROW_LENGTH, ot), N.pixelStorei(N.UNPACK_IMAGE_HEIGHT, En), N.pixelStorei(N.UNPACK_SKIP_PIXELS, js), N.pixelStorei(N.UNPACK_SKIP_ROWS, Tn), N.pixelStorei(N.UNPACK_SKIP_IMAGES, qr), Ee === 0 && Q.generateMipmaps && N.generateMipmap(Tt), F.unbindTexture(); + vn ? O.isDataTexture || O.isData3DTexture ? N.texSubImage3D(Ct, Ee, it, pt, Pt, Le, ze, Ne, gt, Xe, Rt.data) : Q.isCompressedArrayTexture ? N.compressedTexSubImage3D(Ct, Ee, it, pt, Pt, Le, ze, Ne, gt, Rt.data) : N.texSubImage3D(Ct, Ee, it, pt, Pt, Le, ze, Ne, gt, Xe, Rt) : O.isDataTexture ? N.texSubImage2D(N.TEXTURE_2D, Ee, it, pt, Le, ze, gt, Xe, Rt.data) : O.isCompressedTexture ? N.compressedTexSubImage2D(N.TEXTURE_2D, Ee, it, pt, Rt.width, Rt.height, gt, Rt.data) : N.texSubImage2D(N.TEXTURE_2D, Ee, it, pt, Le, ze, gt, Xe, Rt); + N.pixelStorei(N.UNPACK_ROW_LENGTH, ot), N.pixelStorei(N.UNPACK_IMAGE_HEIGHT, En), N.pixelStorei(N.UNPACK_SKIP_PIXELS, js), N.pixelStorei(N.UNPACK_SKIP_ROWS, Cn), N.pixelStorei(N.UNPACK_SKIP_IMAGES, qr), Ee === 0 && Q.generateMipmaps && N.generateMipmap(Ct), F.unbindTexture(); }, this.initRenderTarget = function(O) { J.get(O).__webglFramebuffer === void 0 && X.setupRenderTarget(O); }, this.initTexture = function(O) { @@ -28949,7 +28929,7 @@ class p_ { this.renderer?.dispose(); } } -const Jp = { type: "change" }, od = { type: "start" }, y0 = { type: "end" }, Po = new cs(), Qp = new It(), f_ = Math.cos(70 * Ht.DEG2RAD), Ft = new P(), bn = 2 * Math.PI, ft = { +const Jp = { type: "change" }, od = { type: "start" }, b0 = { type: "end" }, Po = new cs(), Qp = new It(), f_ = Math.cos(70 * Ht.DEG2RAD), Ft = new P(), yn = 2 * Math.PI, ft = { NONE: -1, ROTATE: 0, DOLLY: 1, @@ -28970,7 +28950,7 @@ class m_ extends wv { super(t, n), this.engine = e, this.state = ft.NONE, this.target = new P(), this.cursor = new P(), this.origin = new P(0, 0, 0), this.showOriginIcon = !0, this.originPosition = { x: 0, y: 0 - }, this.minDistance = 0, this.maxDistance = 1 / 0, this.minZoom = 0, this.maxZoom = 1 / 0, this.minTargetRadius = 0, this.maxTargetRadius = 1 / 0, this.minPolarAngle = 0, this.maxPolarAngle = Math.PI, this.minAzimuthAngle = -1 / 0, this.maxAzimuthAngle = 1 / 0, this.enableDamping = !1, this.dampingFactor = 0.05, this.enableZoom = !0, this.zoomSpeed = 1, this.enableRotate = !0, this.rotateSpeed = 1, this.keyRotateSpeed = 1, this.enablePan = !0, this.panSpeed = 1, this.screenSpacePanning = !0, this.keyPanSpeed = 7, this.zoomToCursor = !1, this.autoRotate = !1, this.autoRotateSpeed = 2, this.keys = { LEFT: "ArrowLeft", UP: "ArrowUp", RIGHT: "ArrowRight", BOTTOM: "ArrowDown" }, this.mouseButtons = { LEFT: Tr.ROTATE, MIDDLE: Tr.DOLLY, RIGHT: Tr.PAN }, this.touches = { ONE: wr.ROTATE, TWO: wr.DOLLY_PAN }, this.target0 = this.target.clone(), this.position0 = this.object.position.clone(), this.zoom0 = this.object.zoom, this._domElementKeyEvents = null, this._lastPosition = new P(), this._lastQuaternion = new qn(), this._lastTargetPosition = new P(), this._quat = new qn().setFromUnitVectors(t.up, new P(0, 1, 0)), this._quatInverse = this._quat.clone().invert(), this._spherical = new fu(), this._sphericalDelta = new fu(), this._scale = 1, this._panOffset = new P(), this._rotateStart = new he(), this._rotateEnd = new he(), this._rotateDelta = new he(), this._panStart = new he(), this._panEnd = new he(), this._panDelta = new he(), this._dollyStart = new he(), this._dollyEnd = new he(), this._dollyDelta = new he(), this._dollyDirection = new P(), this._mouse = new he(), this._performCursorZoom = !1, this._pointers = [], this._pointerPositions = {}, this._controlActive = !1, this._onPointerMove = x_.bind(this), this._onPointerDown = g_.bind(this), this._onPointerUp = v_.bind(this), this._onContextMenu = E_.bind(this), this._onMouseWheel = __.bind(this), this._onKeyDown = M_.bind(this), this._onTouchStart = w_.bind(this), this._onTouchMove = S_.bind(this), this._onMouseDown = y_.bind(this), this._onMouseMove = b_.bind(this), this._interceptControlDown = T_.bind(this), this._interceptControlUp = C_.bind(this), this.domElement !== null && this.connect(this.domElement), this.update(); + }, this.minDistance = 0, this.maxDistance = 1 / 0, this.minZoom = 0, this.maxZoom = 1 / 0, this.minTargetRadius = 0, this.maxTargetRadius = 1 / 0, this.minPolarAngle = 0, this.maxPolarAngle = Math.PI, this.minAzimuthAngle = -1 / 0, this.maxAzimuthAngle = 1 / 0, this.enableDamping = !1, this.dampingFactor = 0.05, this.enableZoom = !0, this.zoomSpeed = 1, this.enableRotate = !0, this.rotateSpeed = 1, this.keyRotateSpeed = 1, this.enablePan = !0, this.panSpeed = 1, this.screenSpacePanning = !0, this.keyPanSpeed = 7, this.zoomToCursor = !1, this.autoRotate = !1, this.autoRotateSpeed = 2, this.keys = { LEFT: "ArrowLeft", UP: "ArrowUp", RIGHT: "ArrowRight", BOTTOM: "ArrowDown" }, this.mouseButtons = { LEFT: Cr.ROTATE, MIDDLE: Cr.DOLLY, RIGHT: Cr.PAN }, this.touches = { ONE: wr.ROTATE, TWO: wr.DOLLY_PAN }, this.target0 = this.target.clone(), this.position0 = this.object.position.clone(), this.zoom0 = this.object.zoom, this._domElementKeyEvents = null, this._lastPosition = new P(), this._lastQuaternion = new qn(), this._lastTargetPosition = new P(), this._quat = new qn().setFromUnitVectors(t.up, new P(0, 1, 0)), this._quatInverse = this._quat.clone().invert(), this._spherical = new fu(), this._sphericalDelta = new fu(), this._scale = 1, this._panOffset = new P(), this._rotateStart = new he(), this._rotateEnd = new he(), this._rotateDelta = new he(), this._panStart = new he(), this._panEnd = new he(), this._panDelta = new he(), this._dollyStart = new he(), this._dollyEnd = new he(), this._dollyDelta = new he(), this._dollyDirection = new P(), this._mouse = new he(), this._performCursorZoom = !1, this._pointers = [], this._pointerPositions = {}, this._controlActive = !1, this._onPointerMove = x_.bind(this), this._onPointerDown = g_.bind(this), this._onPointerUp = v_.bind(this), this._onContextMenu = E_.bind(this), this._onMouseWheel = __.bind(this), this._onKeyDown = M_.bind(this), this._onTouchStart = w_.bind(this), this._onTouchMove = S_.bind(this), this._onMouseDown = b_.bind(this), this._onMouseMove = y_.bind(this), this._interceptControlDown = C_.bind(this), this._interceptControlUp = T_.bind(this), this.domElement !== null && this.connect(this.domElement), this.update(); } connect(e) { super.connect(e), this.domElement.addEventListener("pointerdown", this._onPointerDown), this.domElement.addEventListener("pointercancel", this._onPointerUp), this.domElement.addEventListener("contextmenu", this._onContextMenu), this.domElement.addEventListener("wheel", this._onMouseWheel, { passive: !1 }), this.domElement.getRootNode().addEventListener("keydown", this._interceptControlDown, { passive: !0, capture: !0 }), this.domElement.style.touchAction = "none"; @@ -29038,7 +29018,7 @@ class m_ extends wv { const t = this.object.position; Ft.copy(t).sub(this.target), Ft.applyQuaternion(this._quat), this._spherical.setFromVector3(Ft), this.autoRotate && this.state === ft.NONE && this._rotateLeft(this._getAutoRotationAngle(e)), this.enableDamping ? (this._spherical.theta += this._sphericalDelta.theta * this.dampingFactor, this._spherical.phi += this._sphericalDelta.phi * this.dampingFactor) : (this._spherical.theta += this._sphericalDelta.theta, this._spherical.phi += this._sphericalDelta.phi); let n = this.minAzimuthAngle, i = this.maxAzimuthAngle; - isFinite(n) && isFinite(i) && (n < -Math.PI ? n += bn : n > Math.PI && (n -= bn), i < -Math.PI ? i += bn : i > Math.PI && (i -= bn), n <= i ? this._spherical.theta = Math.max(n, Math.min(i, this._spherical.theta)) : this._spherical.theta = this._spherical.theta > (n + i) / 2 ? Math.max(n, this._spherical.theta) : Math.min(i, this._spherical.theta)), this._spherical.phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this._spherical.phi)), this._spherical.makeSafe(), this.enableDamping === !0 ? this.target.addScaledVector(this._panOffset, this.dampingFactor) : this.target.add(this._panOffset), this.target.sub(this.cursor), this.target.clampLength(this.minTargetRadius, this.maxTargetRadius), this.target.add(this.cursor); + isFinite(n) && isFinite(i) && (n < -Math.PI ? n += yn : n > Math.PI && (n -= yn), i < -Math.PI ? i += yn : i > Math.PI && (i -= yn), n <= i ? this._spherical.theta = Math.max(n, Math.min(i, this._spherical.theta)) : this._spherical.theta = this._spherical.theta > (n + i) / 2 ? Math.max(n, this._spherical.theta) : Math.min(i, this._spherical.theta)), this._spherical.phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this._spherical.phi)), this._spherical.makeSafe(), this.enableDamping === !0 ? this.target.addScaledVector(this._panOffset, this.dampingFactor) : this.target.add(this._panOffset), this.target.sub(this.cursor), this.target.clampLength(this.minTargetRadius, this.maxTargetRadius), this.target.add(this.cursor); let r = !1; if (this.zoomToCursor && this._performCursorZoom || this.object.isOrthographicCamera) this._spherical.radius = this._clampDistance(this._spherical.radius); @@ -29091,7 +29071,7 @@ class m_ extends wv { return this._scale = 1, this._performCursorZoom = !1, r || this._lastPosition.distanceToSquared(this.object.position) > Fc || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > Fc || this._lastTargetPosition.distanceToSquared(this.target) > Fc ? (this.dispatchEvent(Jp), this._lastPosition.copy(this.object.position), this._lastQuaternion.copy(this.object.quaternion), this._lastTargetPosition.copy(this.target), !0) : !1; } _getAutoRotationAngle(e) { - return e !== null ? bn / 60 * this.autoRotateSpeed * e : bn / 60 / 60 * this.autoRotateSpeed; + return e !== null ? yn / 60 * this.autoRotateSpeed * e : yn / 60 / 60 * this.autoRotateSpeed; } _getZoomScale(e) { const t = Math.abs(e * 0.01); @@ -29150,7 +29130,7 @@ class m_ extends wv { _handleMouseMoveRotate(e) { this._rotateEnd.set(e.clientX, e.clientY), this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed); const t = this.domElement; - this._rotateLeft(bn * this._rotateDelta.x / t.clientHeight), this._rotateUp(bn * this._rotateDelta.y / t.clientHeight), this._rotateStart.copy(this._rotateEnd), this.update(); + this._rotateLeft(yn * this._rotateDelta.x / t.clientHeight), this._rotateUp(yn * this._rotateDelta.y / t.clientHeight), this._rotateStart.copy(this._rotateEnd), this.update(); } _handleMouseMoveDolly(e) { this._dollyEnd.set(e.clientX, e.clientY), this._dollyDelta.subVectors(this._dollyEnd, this._dollyStart), this._dollyDelta.y > 0 ? this._dollyOut(this._getZoomScale(this._dollyDelta.y)) : this._dollyDelta.y < 0 && this._dollyIn(this._getZoomScale(this._dollyDelta.y)), this._dollyStart.copy(this._dollyEnd), this.update(); @@ -29173,16 +29153,16 @@ class m_ extends wv { let t = !1; switch (e.code) { case this.keys.UP: - e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateUp(bn * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, this.keyPanSpeed), t = !0; + e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateUp(yn * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, this.keyPanSpeed), t = !0; break; case this.keys.BOTTOM: - e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateUp(-bn * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, -this.keyPanSpeed), t = !0; + e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateUp(-yn * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, -this.keyPanSpeed), t = !0; break; case this.keys.LEFT: - e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateLeft(bn * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(this.keyPanSpeed, 0), t = !0; + e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateLeft(yn * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(this.keyPanSpeed, 0), t = !0; break; case this.keys.RIGHT: - e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateLeft(-bn * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(-this.keyPanSpeed, 0), t = !0; + e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateLeft(-yn * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(-this.keyPanSpeed, 0), t = !0; break; } t && (e.preventDefault(), this.update()); @@ -29222,7 +29202,7 @@ class m_ extends wv { } this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed); const t = this.domElement; - this._rotateLeft(bn * this._rotateDelta.x / t.clientHeight), this._rotateUp(bn * this._rotateDelta.y / t.clientHeight), this._rotateStart.copy(this._rotateEnd); + this._rotateLeft(yn * this._rotateDelta.x / t.clientHeight), this._rotateUp(yn * this._rotateDelta.y / t.clientHeight), this._rotateStart.copy(this._rotateEnd); } _handleTouchMovePan(e) { if (this._pointers.length === 1) @@ -29297,7 +29277,7 @@ function x_(s) { function v_(s) { switch (this._removePointer(s), this._pointers.length) { case 0: - this.domElement.releasePointerCapture(s.pointerId), this.domElement.removeEventListener("pointermove", this._onPointerMove), this.domElement.removeEventListener("pointerup", this._onPointerUp), this.dispatchEvent(y0), this.state = ft.NONE; + this.domElement.releasePointerCapture(s.pointerId), this.domElement.removeEventListener("pointermove", this._onPointerMove), this.domElement.removeEventListener("pointerup", this._onPointerUp), this.dispatchEvent(b0), this.state = ft.NONE; break; case 1: const e = this._pointers[0], t = this._pointerPositions[e]; @@ -29305,7 +29285,7 @@ function v_(s) { break; } } -function y_(s) { +function b_(s) { if (this.showOriginIcon && this.engine && this.engine.ToolUntils) { const t = this.engine.scene?.camera || this.object; this.originPosition = this.engine.ToolUntils.WorldPointToScreenPoint(this.origin.clone(), t), console.log("Origin position:", this.originPosition, "Origin:", this.origin); @@ -29325,11 +29305,11 @@ function y_(s) { e = -1; } switch (e) { - case Tr.DOLLY: + case Cr.DOLLY: if (this.enableZoom === !1) return; this._handleMouseDownDolly(s), this.state = ft.DOLLY; break; - case Tr.ROTATE: + case Cr.ROTATE: if (s.ctrlKey || s.metaKey || s.shiftKey) { if (this.enablePan === !1) return; this._handleMouseDownPan(s), this.state = ft.PAN; @@ -29338,7 +29318,7 @@ function y_(s) { this._handleMouseDownRotate(s), this.state = ft.ROTATE; } break; - case Tr.PAN: + case Cr.PAN: if (s.ctrlKey || s.metaKey || s.shiftKey) { if (this.enableRotate === !1) return; this._handleMouseDownRotate(s), this.state = ft.ROTATE; @@ -29352,7 +29332,7 @@ function y_(s) { } this.state !== ft.NONE && this.dispatchEvent(od); } -function b_(s) { +function y_(s) { switch (this.state) { case ft.ROTATE: if (this.enableRotate === !1) return; @@ -29369,7 +29349,7 @@ function b_(s) { } } function __(s) { - this.enabled === !1 || this.enableZoom === !1 || this.state !== ft.NONE || (s.preventDefault(), this.dispatchEvent(od), this._handleMouseWheel(this._customWheelEvent(s)), this.dispatchEvent(y0)); + this.enabled === !1 || this.enableZoom === !1 || this.state !== ft.NONE || (s.preventDefault(), this.dispatchEvent(od), this._handleMouseWheel(this._customWheelEvent(s)), this.dispatchEvent(b0)); } function M_(s) { this.enabled !== !1 && this._handleKeyDown(s); @@ -29434,10 +29414,10 @@ function S_(s) { function E_(s) { this.enabled !== !1 && s.preventDefault(); } -function T_(s) { +function C_(s) { s.key === "Control" && (this._controlActive = !0, this.domElement.getRootNode().addEventListener("keyup", this._interceptControlUp, { passive: !0, capture: !0 })); } -function C_(s) { +function T_(s) { s.key === "Control" && (this._controlActive = !1, this.domElement.getRootNode().removeEventListener("keyup", this._interceptControlUp, { passive: !0, capture: !0 })); } class ef { @@ -29774,28 +29754,28 @@ function ld(s) { return; let f = d[0].object.url, x = d[0].object.name, g = s.modelEdge.getModelEdge(f, x); g || (g = [0, 0, []]); - let y = []; + let b = []; g[2].forEach((L) => { - L[0] != null && L[1] != null && y.push({ + L[0] != null && L[1] != null && b.push({ X: L[0].X * 0.5 + L[1].X * 0.5, Y: L[0].Y * 0.5 + L[1].Y * 0.5, Z: L[0].Z * 0.5 + L[1].Z * 0.5 }); }); - let v = [...g[2].map((L) => L[0]), ...y], b = "face", _ = [], M = [], T = 10; + let v = [...g[2].map((L) => L[0]), ...b], y = "face", _ = [], M = [], C = 10; if (v.forEach((L) => { if (L != null) { let A = new P(L.X, L.Z, -L.Y), I = s.worldToScreen.worldToScreen(A), w = Math.sqrt(Math.pow(I.x - p.offsetX, 2) + Math.pow(I.y - p.offsetY, 2)); - w < T && (T = w, _.push({ + w < C && (C = w, _.push({ point: A, distance: w, pointxy: I })); } - }), _.length > 0 ? (_.sort((L, A) => L.distance - A.distance), b = "point") : (g[2].forEach((L) => { + }), _.length > 0 ? (_.sort((L, A) => L.distance - A.distance), y = "point") : (g[2].forEach((L) => { if (L[0] != null && L[1] != null) { let A = new P(L[0].X, L[0].Z, -L[0].Y), I = new P(L[1].X, L[1].Z, -L[1].Y), w = s.worldToScreen.worldToScreen(A), z = s.worldToScreen.worldToScreen(I), G = R(new he(p.offsetX, p.offsetY), w, z); - if (G < T) { + if (G < C) { let j = S(new he(p.offsetX, p.offsetY), w, z), Y = E(j, A, I); M.push({ distance: G, @@ -29806,18 +29786,18 @@ function ld(s) { }); } } - }), M.length > 0 && (M.sort((L, A) => L.distance - A.distance), b = "line")), b == "point" && e.options.showCatch) { + }), M.length > 0 && (M.sort((L, A) => L.distance - A.distance), y = "line")), y == "point" && e.options.showCatch) { const L = s.worldToScreen.worldToScreen(_[0].point); s.catchSvg.innerHTML = ""; const A = L.x + s.reactBoundingClientRect.left, I = L.y + s.reactBoundingClientRect.top, w = document.createElementNS("http://www.w3.org/2000/svg", "polygon"); w.setAttribute("class", "catchPoint"), w.setAttribute("points", `${A},${I - 8} ${A - 7},${I + 4} ${A + 7},${I + 4}`), s.catchSvg.appendChild(w), d[0].point = _[0].point; - } else if (b == "line" && e.options.showCatch) { + } else if (y == "line" && e.options.showCatch) { s.worldToScreen.worldToScreen(M[0].point); const L = M[0].start, A = M[0].end; s.catchSvg.innerHTML = ""; const I = document.createElementNS("http://www.w3.org/2000/svg", "line"); I.setAttribute("class", "catchLine"), I.setAttribute("x1", (L.x + s.reactBoundingClientRect.left).toString()), I.setAttribute("y1", (L.y + s.reactBoundingClientRect.top).toString()), I.setAttribute("x2", (A.x + s.reactBoundingClientRect.left).toString()), I.setAttribute("y2", (A.y + s.reactBoundingClientRect.top).toString()), I.setAttribute("stroke", "rgb(8, 223, 215)"), I.setAttribute("stroke-width", "2"), s.catchSvg.appendChild(I), d[0].point = M[0].point; - } else if (b == "face" && e.options.showCatch) { + } else if (y == "face" && e.options.showCatch) { let L = d[0].point.clone(), A = d[0].normal || (d[0].face ? d[0].face.normal : null); const I = (A ? A.clone() : new P(0, 0, 1)).normalize(), w = Math.abs(I.y) < 0.9 ? new P(0, 1, 0) : new P(1, 0, 0), z = new P().crossVectors(I, w).normalize(), G = new P().crossVectors(I, z).normalize(), j = 0.05, Y = [ new P().copy(z).add(G).multiplyScalar(j), @@ -30634,7 +30614,7 @@ function k_(s) { const Do = { defines: { SAMPLES: 16, - SAMPLE_VECTORS: b0(16, 2, 1), + SAMPLE_VECTORS: y0(16, 2, 1), NORMAL_VECTOR_TYPE: 1, DEPTH_VALUE_SOURCE: 0 }, @@ -30805,7 +30785,7 @@ const Do = { }` ) }; -function b0(s, e, t) { +function y0(s, e, t) { const n = U_( s, e, @@ -30965,13 +30945,13 @@ class _0 { const a = 0.5 * (Math.sqrt(3) - 1), o = (e + t) * a, l = Math.floor(e + o), c = Math.floor(t + o), h = (3 - Math.sqrt(3)) / 6, u = (l + c) * h, p = l - u, d = c - u, m = e - p, f = t - d; let x, g; m > f ? (x = 1, g = 0) : (x = 0, g = 1); - const y = m - x + h, v = f - g + h, b = m - 1 + 2 * h, _ = f - 1 + 2 * h, M = l & 255, T = c & 255, R = this.perm[M + this.perm[T]] % 12, S = this.perm[M + x + this.perm[T + g]] % 12, E = this.perm[M + 1 + this.perm[T + 1]] % 12; + const b = m - x + h, v = f - g + h, y = m - 1 + 2 * h, _ = f - 1 + 2 * h, M = l & 255, C = c & 255, R = this.perm[M + this.perm[C]] % 12, S = this.perm[M + x + this.perm[C + g]] % 12, E = this.perm[M + 1 + this.perm[C + 1]] % 12; let L = 0.5 - m * m - f * f; L < 0 ? n = 0 : (L *= L, n = L * L * this._dot(this.grad3[R], m, f)); - let A = 0.5 - y * y - v * v; - A < 0 ? i = 0 : (A *= A, i = A * A * this._dot(this.grad3[S], y, v)); - let I = 0.5 - b * b - _ * _; - return I < 0 ? r = 0 : (I *= I, r = I * I * this._dot(this.grad3[E], b, _)), 70 * (n + i + r); + let A = 0.5 - b * b - v * v; + A < 0 ? i = 0 : (A *= A, i = A * A * this._dot(this.grad3[S], b, v)); + let I = 0.5 - y * y - _ * _; + return I < 0 ? r = 0 : (I *= I, r = I * I * this._dot(this.grad3[E], y, _)), 70 * (n + i + r); } /** * A 3D simplex noise method. @@ -30983,18 +30963,18 @@ class _0 { */ noise3d(e, t, n) { let i, r, a, o; - const l = (e + t + n) * 0.3333333333333333, c = Math.floor(e + l), h = Math.floor(t + l), u = Math.floor(n + l), p = 1 / 6, d = (c + h + u) * p, m = c - d, f = h - d, x = u - d, g = e - m, y = t - f, v = n - x; - let b, _, M, T, R, S; - g >= y ? y >= v ? (b = 1, _ = 0, M = 0, T = 1, R = 1, S = 0) : g >= v ? (b = 1, _ = 0, M = 0, T = 1, R = 0, S = 1) : (b = 0, _ = 0, M = 1, T = 1, R = 0, S = 1) : y < v ? (b = 0, _ = 0, M = 1, T = 0, R = 1, S = 1) : g < v ? (b = 0, _ = 1, M = 0, T = 0, R = 1, S = 1) : (b = 0, _ = 1, M = 0, T = 1, R = 1, S = 0); - const E = g - b + p, L = y - _ + p, A = v - M + p, I = g - T + 2 * p, w = y - R + 2 * p, z = v - S + 2 * p, G = g - 1 + 3 * p, j = y - 1 + 3 * p, Y = v - 1 + 3 * p, q = c & 255, ie = h & 255, W = u & 255, $ = this.perm[q + this.perm[ie + this.perm[W]]] % 12, fe = this.perm[q + b + this.perm[ie + _ + this.perm[W + M]]] % 12, me = this.perm[q + T + this.perm[ie + R + this.perm[W + S]]] % 12, de = this.perm[q + 1 + this.perm[ie + 1 + this.perm[W + 1]]] % 12; - let se = 0.6 - g * g - y * y - v * v; - se < 0 ? i = 0 : (se *= se, i = se * se * this._dot3(this.grad3[$], g, y, v)); + const l = (e + t + n) * 0.3333333333333333, c = Math.floor(e + l), h = Math.floor(t + l), u = Math.floor(n + l), p = 1 / 6, d = (c + h + u) * p, m = c - d, f = h - d, x = u - d, g = e - m, b = t - f, v = n - x; + let y, _, M, C, R, S; + g >= b ? b >= v ? (y = 1, _ = 0, M = 0, C = 1, R = 1, S = 0) : g >= v ? (y = 1, _ = 0, M = 0, C = 1, R = 0, S = 1) : (y = 0, _ = 0, M = 1, C = 1, R = 0, S = 1) : b < v ? (y = 0, _ = 0, M = 1, C = 0, R = 1, S = 1) : g < v ? (y = 0, _ = 1, M = 0, C = 0, R = 1, S = 1) : (y = 0, _ = 1, M = 0, C = 1, R = 1, S = 0); + const E = g - y + p, L = b - _ + p, A = v - M + p, I = g - C + 2 * p, w = b - R + 2 * p, z = v - S + 2 * p, G = g - 1 + 3 * p, j = b - 1 + 3 * p, Y = v - 1 + 3 * p, q = c & 255, ie = h & 255, W = u & 255, $ = this.perm[q + this.perm[ie + this.perm[W]]] % 12, fe = this.perm[q + y + this.perm[ie + _ + this.perm[W + M]]] % 12, me = this.perm[q + C + this.perm[ie + R + this.perm[W + S]]] % 12, de = this.perm[q + 1 + this.perm[ie + 1 + this.perm[W + 1]]] % 12; + let se = 0.6 - g * g - b * b - v * v; + se < 0 ? i = 0 : (se *= se, i = se * se * this._dot3(this.grad3[$], g, b, v)); let ce = 0.6 - E * E - L * L - A * A; ce < 0 ? r = 0 : (ce *= ce, r = ce * ce * this._dot3(this.grad3[fe], E, L, A)); let pe = 0.6 - I * I - w * w - z * z; pe < 0 ? a = 0 : (pe *= pe, a = pe * pe * this._dot3(this.grad3[me], I, w, z)); - let ye = 0.6 - G * G - j * j - Y * Y; - return ye < 0 ? o = 0 : (ye *= ye, o = ye * ye * this._dot3(this.grad3[de], G, j, Y)), 32 * (i + r + a + o); + let be = 0.6 - G * G - j * j - Y * Y; + return be < 0 ? o = 0 : (be *= be, o = be * be * this._dot3(this.grad3[de], G, j, Y)), 32 * (i + r + a + o); } /** * A 4D simplex noise method. @@ -31008,15 +30988,15 @@ class _0 { noise4d(e, t, n, i) { const r = this.grad4, a = this.simplex, o = this.perm, l = (Math.sqrt(5) - 1) / 4, c = (5 - Math.sqrt(5)) / 20; let h, u, p, d, m; - const f = (e + t + n + i) * l, x = Math.floor(e + f), g = Math.floor(t + f), y = Math.floor(n + f), v = Math.floor(i + f), b = (x + g + y + v) * c, _ = x - b, M = g - b, T = y - b, R = v - b, S = e - _, E = t - M, L = n - T, A = i - R, I = S > E ? 32 : 0, w = S > L ? 16 : 0, z = E > L ? 8 : 0, G = S > A ? 4 : 0, j = E > A ? 2 : 0, Y = L > A ? 1 : 0, q = I + w + z + G + j + Y, ie = a[q][0] >= 3 ? 1 : 0, W = a[q][1] >= 3 ? 1 : 0, $ = a[q][2] >= 3 ? 1 : 0, fe = a[q][3] >= 3 ? 1 : 0, me = a[q][0] >= 2 ? 1 : 0, de = a[q][1] >= 2 ? 1 : 0, se = a[q][2] >= 2 ? 1 : 0, ce = a[q][3] >= 2 ? 1 : 0, pe = a[q][0] >= 1 ? 1 : 0, ye = a[q][1] >= 1 ? 1 : 0, Se = a[q][2] >= 1 ? 1 : 0, Be = a[q][3] >= 1 ? 1 : 0, $e = S - ie + c, ke = E - W + c, C = L - $ + c, N = A - fe + c, V = S - me + 2 * c, U = E - de + 2 * c, k = L - se + 2 * c, F = A - ce + 2 * c, ee = S - pe + 3 * c, J = E - ye + 3 * c, X = L - Se + 3 * c, B = A - Be + 3 * c, D = S - 1 + 4 * c, H = E - 1 + 4 * c, K = L - 1 + 4 * c, le = A - 1 + 4 * c, te = x & 255, Ce = g & 255, be = y & 255, Re = v & 255, Ie = o[te + o[Ce + o[be + o[Re]]]] % 32, ue = o[te + ie + o[Ce + W + o[be + $ + o[Re + fe]]]] % 32, _e = o[te + me + o[Ce + de + o[be + se + o[Re + ce]]]] % 32, Ve = o[te + pe + o[Ce + ye + o[be + Se + o[Re + Be]]]] % 32, Ue = o[te + 1 + o[Ce + 1 + o[be + 1 + o[Re + 1]]]] % 32; + const f = (e + t + n + i) * l, x = Math.floor(e + f), g = Math.floor(t + f), b = Math.floor(n + f), v = Math.floor(i + f), y = (x + g + b + v) * c, _ = x - y, M = g - y, C = b - y, R = v - y, S = e - _, E = t - M, L = n - C, A = i - R, I = S > E ? 32 : 0, w = S > L ? 16 : 0, z = E > L ? 8 : 0, G = S > A ? 4 : 0, j = E > A ? 2 : 0, Y = L > A ? 1 : 0, q = I + w + z + G + j + Y, ie = a[q][0] >= 3 ? 1 : 0, W = a[q][1] >= 3 ? 1 : 0, $ = a[q][2] >= 3 ? 1 : 0, fe = a[q][3] >= 3 ? 1 : 0, me = a[q][0] >= 2 ? 1 : 0, de = a[q][1] >= 2 ? 1 : 0, se = a[q][2] >= 2 ? 1 : 0, ce = a[q][3] >= 2 ? 1 : 0, pe = a[q][0] >= 1 ? 1 : 0, be = a[q][1] >= 1 ? 1 : 0, Se = a[q][2] >= 1 ? 1 : 0, Be = a[q][3] >= 1 ? 1 : 0, $e = S - ie + c, ke = E - W + c, T = L - $ + c, N = A - fe + c, V = S - me + 2 * c, U = E - de + 2 * c, k = L - se + 2 * c, F = A - ce + 2 * c, ee = S - pe + 3 * c, J = E - be + 3 * c, X = L - Se + 3 * c, B = A - Be + 3 * c, D = S - 1 + 4 * c, H = E - 1 + 4 * c, K = L - 1 + 4 * c, le = A - 1 + 4 * c, te = x & 255, Te = g & 255, ye = b & 255, Re = v & 255, Ie = o[te + o[Te + o[ye + o[Re]]]] % 32, ue = o[te + ie + o[Te + W + o[ye + $ + o[Re + fe]]]] % 32, _e = o[te + me + o[Te + de + o[ye + se + o[Re + ce]]]] % 32, Ve = o[te + pe + o[Te + be + o[ye + Se + o[Re + Be]]]] % 32, Ue = o[te + 1 + o[Te + 1 + o[ye + 1 + o[Re + 1]]]] % 32; let Ae = 0.6 - S * S - E * E - L * L - A * A; Ae < 0 ? h = 0 : (Ae *= Ae, h = Ae * Ae * this._dot4(r[Ie], S, E, L, A)); - let Ge = 0.6 - $e * $e - ke * ke - C * C - N * N; - Ge < 0 ? u = 0 : (Ge *= Ge, u = Ge * Ge * this._dot4(r[ue], $e, ke, C, N)); + let Ge = 0.6 - $e * $e - ke * ke - T * T - N * N; + Ge < 0 ? u = 0 : (Ge *= Ge, u = Ge * Ge * this._dot4(r[ue], $e, ke, T, N)); let Z = 0.6 - V * V - U * U - k * k - F * F; Z < 0 ? p = 0 : (Z *= Z, p = Z * Z * this._dot4(r[_e], V, U, k, F)); - let Te = 0.6 - ee * ee - J * J - X * X - B * B; - Te < 0 ? d = 0 : (Te *= Te, d = Te * Te * this._dot4(r[Ve], ee, J, X, B)); + let Ce = 0.6 - ee * ee - J * J - X * X - B * B; + Ce < 0 ? d = 0 : (Ce *= Ce, d = Ce * Ce * this._dot4(r[Ve], ee, J, X, B)); let Me = 0.6 - D * D - H * H - K * K - le * le; return Me < 0 ? m = 0 : (Me *= Me, m = Me * Me * this._dot4(r[Ue], D, H, K, le)), 27 * (h + u + p + d + m); } @@ -31161,7 +31141,7 @@ class _n extends Gs { */ updatePdMaterial(e) { let t = !1; - e.lumaPhi !== void 0 && (this.pdMaterial.uniforms.lumaPhi.value = e.lumaPhi), e.depthPhi !== void 0 && (this.pdMaterial.uniforms.depthPhi.value = e.depthPhi), e.normalPhi !== void 0 && (this.pdMaterial.uniforms.normalPhi.value = e.normalPhi), e.radius !== void 0 && e.radius !== this.radius && (this.pdMaterial.uniforms.radius.value = e.radius), e.radiusExponent !== void 0 && e.radiusExponent !== this.pdRadiusExponent && (this.pdRadiusExponent = e.radiusExponent, t = !0), e.rings !== void 0 && e.rings !== this.pdRings && (this.pdRings = e.rings, t = !0), e.samples !== void 0 && e.samples !== this.pdSamples && (this.pdSamples = e.samples, t = !0), t && (this.pdMaterial.defines.SAMPLES = this.pdSamples, this.pdMaterial.defines.SAMPLE_VECTORS = b0(this.pdSamples, this.pdRings, this.pdRadiusExponent), this.pdMaterial.needsUpdate = !0); + e.lumaPhi !== void 0 && (this.pdMaterial.uniforms.lumaPhi.value = e.lumaPhi), e.depthPhi !== void 0 && (this.pdMaterial.uniforms.depthPhi.value = e.depthPhi), e.normalPhi !== void 0 && (this.pdMaterial.uniforms.normalPhi.value = e.normalPhi), e.radius !== void 0 && e.radius !== this.radius && (this.pdMaterial.uniforms.radius.value = e.radius), e.radiusExponent !== void 0 && e.radiusExponent !== this.pdRadiusExponent && (this.pdRadiusExponent = e.radiusExponent, t = !0), e.rings !== void 0 && e.rings !== this.pdRings && (this.pdRings = e.rings, t = !0), e.samples !== void 0 && e.samples !== this.pdSamples && (this.pdSamples = e.samples, t = !0), t && (this.pdMaterial.defines.SAMPLES = this.pdSamples, this.pdMaterial.defines.SAMPLE_VECTORS = y0(this.pdSamples, this.pdRings, this.pdRadiusExponent), this.pdMaterial.needsUpdate = !0); } /** * Performs the GTAO pass. @@ -31753,7 +31733,7 @@ class O_ extends Gs { * @param {boolean} maskActive - Whether masking is active or not. */ render(e, t, n) { - this.uniforms.tDiffuse.value = n.texture, this.uniforms.toneMappingExposure.value = e.toneMappingExposure, (this._outputColorSpace !== e.outputColorSpace || this._toneMapping !== e.toneMapping) && (this._outputColorSpace = e.outputColorSpace, this._toneMapping = e.toneMapping, this.material.defines = {}, st.getTransfer(this._outputColorSpace) === ct && (this.material.defines.SRGB_TRANSFER = ""), this._toneMapping === Mm ? this.material.defines.LINEAR_TONE_MAPPING = "" : this._toneMapping === wm ? this.material.defines.REINHARD_TONE_MAPPING = "" : this._toneMapping === Sm ? this.material.defines.CINEON_TONE_MAPPING = "" : this._toneMapping === Em ? this.material.defines.ACES_FILMIC_TONE_MAPPING = "" : this._toneMapping === Cm ? this.material.defines.AGX_TONE_MAPPING = "" : this._toneMapping === Am ? this.material.defines.NEUTRAL_TONE_MAPPING = "" : this._toneMapping === Tm && (this.material.defines.CUSTOM_TONE_MAPPING = ""), this.material.needsUpdate = !0), this.renderToScreen === !0 ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(t), this.clear && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), this._fsQuad.render(e)); + this.uniforms.tDiffuse.value = n.texture, this.uniforms.toneMappingExposure.value = e.toneMappingExposure, (this._outputColorSpace !== e.outputColorSpace || this._toneMapping !== e.toneMapping) && (this._outputColorSpace = e.outputColorSpace, this._toneMapping = e.toneMapping, this.material.defines = {}, st.getTransfer(this._outputColorSpace) === ct && (this.material.defines.SRGB_TRANSFER = ""), this._toneMapping === Mm ? this.material.defines.LINEAR_TONE_MAPPING = "" : this._toneMapping === wm ? this.material.defines.REINHARD_TONE_MAPPING = "" : this._toneMapping === Sm ? this.material.defines.CINEON_TONE_MAPPING = "" : this._toneMapping === Em ? this.material.defines.ACES_FILMIC_TONE_MAPPING = "" : this._toneMapping === Tm ? this.material.defines.AGX_TONE_MAPPING = "" : this._toneMapping === Am ? this.material.defines.NEUTRAL_TONE_MAPPING = "" : this._toneMapping === Cm && (this.material.defines.CUSTOM_TONE_MAPPING = ""), this.material.needsUpdate = !0), this.renderToScreen === !0 ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(t), this.clear && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), this._fsQuad.render(e)); } /** * Frees the GPU-related resources allocated by this instance. Call this @@ -32154,15 +32134,15 @@ function V_() { })({ 1: [function(t, n, i) { var r = t("./utils"), a = t("./support"), o = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; i.encode = function(l) { - for (var c, h, u, p, d, m, f, x = [], g = 0, y = l.length, v = y, b = r.getTypeOf(l) !== "string"; g < l.length; ) v = y - g, u = b ? (c = l[g++], h = g < y ? l[g++] : 0, g < y ? l[g++] : 0) : (c = l.charCodeAt(g++), h = g < y ? l.charCodeAt(g++) : 0, g < y ? l.charCodeAt(g++) : 0), p = c >> 2, d = (3 & c) << 4 | h >> 4, m = 1 < v ? (15 & h) << 2 | u >> 6 : 64, f = 2 < v ? 63 & u : 64, x.push(o.charAt(p) + o.charAt(d) + o.charAt(m) + o.charAt(f)); + for (var c, h, u, p, d, m, f, x = [], g = 0, b = l.length, v = b, y = r.getTypeOf(l) !== "string"; g < l.length; ) v = b - g, u = y ? (c = l[g++], h = g < b ? l[g++] : 0, g < b ? l[g++] : 0) : (c = l.charCodeAt(g++), h = g < b ? l.charCodeAt(g++) : 0, g < b ? l.charCodeAt(g++) : 0), p = c >> 2, d = (3 & c) << 4 | h >> 4, m = 1 < v ? (15 & h) << 2 | u >> 6 : 64, f = 2 < v ? 63 & u : 64, x.push(o.charAt(p) + o.charAt(d) + o.charAt(m) + o.charAt(f)); return x.join(""); }, i.decode = function(l) { var c, h, u, p, d, m, f = 0, x = 0, g = "data:"; if (l.substr(0, g.length) === g) throw new Error("Invalid base64 input, it looks like a data url."); - var y, v = 3 * (l = l.replace(/[^A-Za-z0-9+/=]/g, "")).length / 4; + var b, v = 3 * (l = l.replace(/[^A-Za-z0-9+/=]/g, "")).length / 4; if (l.charAt(l.length - 1) === o.charAt(64) && v--, l.charAt(l.length - 2) === o.charAt(64) && v--, v % 1 != 0) throw new Error("Invalid base64 input, bad content length."); - for (y = a.uint8array ? new Uint8Array(0 | v) : new Array(0 | v); f < l.length; ) c = o.indexOf(l.charAt(f++)) << 2 | (p = o.indexOf(l.charAt(f++))) >> 4, h = (15 & p) << 4 | (d = o.indexOf(l.charAt(f++))) >> 2, u = (3 & d) << 6 | (m = o.indexOf(l.charAt(f++))), y[x++] = c, d !== 64 && (y[x++] = h), m !== 64 && (y[x++] = u); - return y; + for (b = a.uint8array ? new Uint8Array(0 | v) : new Array(0 | v); f < l.length; ) c = o.indexOf(l.charAt(f++)) << 2 | (p = o.indexOf(l.charAt(f++))) >> 4, h = (15 & p) << 4 | (d = o.indexOf(l.charAt(f++))) >> 2, u = (3 & d) << 6 | (m = o.indexOf(l.charAt(f++))), b[x++] = c, d !== 64 && (b[x++] = h), m !== 64 && (b[x++] = u); + return b; }; }, { "./support": 30, "./utils": 32 }], 2: [function(t, n, i) { var r = t("./external"), a = t("./stream/DataWorker"), o = t("./stream/Crc32Probe"), l = t("./stream/DataLengthProbe"); @@ -32241,21 +32221,21 @@ function V_() { for (f = 0; f < m; f++) x += String.fromCharCode(255 & d), d >>>= 8; return x; } - function a(d, m, f, x, g, y) { - var v, b, _ = d.file, M = d.compression, T = y !== c.utf8encode, R = o.transformTo("string", y(_.name)), S = o.transformTo("string", c.utf8encode(_.name)), E = _.comment, L = o.transformTo("string", y(E)), A = o.transformTo("string", c.utf8encode(E)), I = S.length !== _.name.length, w = A.length !== E.length, z = "", G = "", j = "", Y = _.dir, q = _.date, ie = { crc32: 0, compressedSize: 0, uncompressedSize: 0 }; + function a(d, m, f, x, g, b) { + var v, y, _ = d.file, M = d.compression, C = b !== c.utf8encode, R = o.transformTo("string", b(_.name)), S = o.transformTo("string", c.utf8encode(_.name)), E = _.comment, L = o.transformTo("string", b(E)), A = o.transformTo("string", c.utf8encode(E)), I = S.length !== _.name.length, w = A.length !== E.length, z = "", G = "", j = "", Y = _.dir, q = _.date, ie = { crc32: 0, compressedSize: 0, uncompressedSize: 0 }; m && !f || (ie.crc32 = d.crc32, ie.compressedSize = d.compressedSize, ie.uncompressedSize = d.uncompressedSize); var W = 0; - m && (W |= 8), T || !I && !w || (W |= 2048); + m && (W |= 8), C || !I && !w || (W |= 2048); var $ = 0, fe = 0; Y && ($ |= 16), g === "UNIX" ? (fe = 798, $ |= (function(de, se) { var ce = de; return de || (ce = se ? 16893 : 33204), (65535 & ce) << 16; })(_.unixPermissions, Y)) : (fe = 20, $ |= (function(de) { return 63 & (de || 0); - })(_.dosPermissions)), v = q.getUTCHours(), v <<= 6, v |= q.getUTCMinutes(), v <<= 5, v |= q.getUTCSeconds() / 2, b = q.getUTCFullYear() - 1980, b <<= 4, b |= q.getUTCMonth() + 1, b <<= 5, b |= q.getUTCDate(), I && (G = r(1, 1) + r(h(R), 4) + S, z += "up" + r(G.length, 2) + G), w && (j = r(1, 1) + r(h(L), 4) + A, z += "uc" + r(j.length, 2) + j); + })(_.dosPermissions)), v = q.getUTCHours(), v <<= 6, v |= q.getUTCMinutes(), v <<= 5, v |= q.getUTCSeconds() / 2, y = q.getUTCFullYear() - 1980, y <<= 4, y |= q.getUTCMonth() + 1, y <<= 5, y |= q.getUTCDate(), I && (G = r(1, 1) + r(h(R), 4) + S, z += "up" + r(G.length, 2) + G), w && (j = r(1, 1) + r(h(L), 4) + A, z += "uc" + r(j.length, 2) + j); var me = ""; return me += ` -\0`, me += r(W, 2), me += M.magic, me += r(v, 2), me += r(b, 2), me += r(ie.crc32, 4), me += r(ie.compressedSize, 4), me += r(ie.uncompressedSize, 4), me += r(R.length, 2), me += r(z.length, 2), { fileRecord: u.LOCAL_FILE_HEADER + me + R + z, dirRecord: u.CENTRAL_FILE_HEADER + r(fe, 2) + me + r(L.length, 2) + "\0\0\0\0" + r($, 4) + r(x, 4) + R + z + L }; +\0`, me += r(W, 2), me += M.magic, me += r(v, 2), me += r(y, 2), me += r(ie.crc32, 4), me += r(ie.compressedSize, 4), me += r(ie.uncompressedSize, 4), me += r(R.length, 2), me += r(z.length, 2), { fileRecord: u.LOCAL_FILE_HEADER + me + R + z, dirRecord: u.CENTRAL_FILE_HEADER + r(fe, 2) + me + r(L.length, 2) + "\0\0\0\0" + r($, 4) + r(x, 4) + R + z + L }; } var o = t("../utils"), l = t("../stream/GenericWorker"), c = t("../utf8"), h = t("../crc32"), u = t("../signature"); function p(d, m, f, x) { @@ -32281,9 +32261,9 @@ function V_() { this.currentFile = null; }, p.prototype.flush = function() { for (var d = this.bytesWritten, m = 0; m < this.dirRecords.length; m++) this.push({ data: this.dirRecords[m], meta: { percent: 100 } }); - var f = this.bytesWritten - d, x = (function(g, y, v, b, _) { - var M = o.transformTo("string", _(b)); - return u.CENTRAL_DIRECTORY_END + "\0\0\0\0" + r(g, 2) + r(g, 2) + r(y, 4) + r(v, 4) + r(M.length, 2) + M; + var f = this.bytesWritten - d, x = (function(g, b, v, y, _) { + var M = o.transformTo("string", _(y)); + return u.CENTRAL_DIRECTORY_END + "\0\0\0\0" + r(g, 2) + r(g, 2) + r(b, 4) + r(v, 4) + r(M.length, 2) + M; })(this.dirRecords.length, f, d, this.zipComment, this.encodeFileName); this.push({ data: x, meta: { percent: 100 } }); }, p.prototype.prepareNextSource = function() { @@ -32319,9 +32299,9 @@ function V_() { try { o.forEach(function(p, d) { u++; - var m = (function(y, v) { - var b = y || v, _ = r[b]; - if (!_) throw new Error(b + " is not a valid compression method !"); + var m = (function(b, v) { + var y = b || v, _ = r[y]; + if (!_) throw new Error(y + " is not a valid compression method !"); return _; })(d.options.compression, l.compression), f = d.options.compressionOptions || l.compressionOptions || {}, x = d.dir, g = d.date; d._compressWorker(m, f).withStreamInfo("file", { name: p, dir: x, date: g, comment: d.comment || "", unixPermissions: d.unixPermissions, dosPermissions: d.dosPermissions }).pipe(h); @@ -32363,12 +32343,12 @@ function V_() { return x.load(f), x; }).then(function(f) { var x = [a.Promise.resolve(f)], g = f.files; - if (d.checkCRC32) for (var y = 0; y < g.length; y++) x.push(u(g[y])); + if (d.checkCRC32) for (var b = 0; b < g.length; b++) x.push(u(g[b])); return a.Promise.all(x); }).then(function(f) { - for (var x = f.shift(), g = x.files, y = 0; y < g.length; y++) { - var v = g[y], b = v.fileNameStr, _ = r.resolve(v.fileNameStr); - m.file(_, v.decompressed, { binary: !0, optimizedBinaryString: !0, date: v.date, dir: v.dir, comment: v.fileCommentStr.length ? v.fileCommentStr : null, unixPermissions: v.unixPermissions, dosPermissions: v.dosPermissions, createFolders: d.createFolders }), v.dir || (m.file(_).unsafeOriginalName = b); + for (var x = f.shift(), g = x.files, b = 0; b < g.length; b++) { + var v = g[b], y = v.fileNameStr, _ = r.resolve(v.fileNameStr); + m.file(_, v.decompressed, { binary: !0, optimizedBinaryString: !0, date: v.date, dir: v.dir, comment: v.fileCommentStr.length ? v.fileCommentStr : null, unixPermissions: v.unixPermissions, dosPermissions: v.dosPermissions, createFolders: d.createFolders }), v.dir || (m.file(_).unsafeOriginalName = y); } return x.zipComment.length && (m.comment = x.zipComment), m; }); @@ -32423,11 +32403,11 @@ function V_() { return r && typeof r.on == "function" && typeof r.pause == "function" && typeof r.resume == "function"; } }; }, {}], 15: [function(t, n, i) { - function r(_, M, T) { - var R, S = o.getTypeOf(M), E = o.extend(T || {}, h); - E.date = E.date || /* @__PURE__ */ new Date(), E.compression !== null && (E.compression = E.compression.toUpperCase()), typeof E.unixPermissions == "string" && (E.unixPermissions = parseInt(E.unixPermissions, 8)), E.unixPermissions && 16384 & E.unixPermissions && (E.dir = !0), E.dosPermissions && 16 & E.dosPermissions && (E.dir = !0), E.dir && (_ = g(_)), E.createFolders && (R = x(_)) && y.call(this, R, !0); + function r(_, M, C) { + var R, S = o.getTypeOf(M), E = o.extend(C || {}, h); + E.date = E.date || /* @__PURE__ */ new Date(), E.compression !== null && (E.compression = E.compression.toUpperCase()), typeof E.unixPermissions == "string" && (E.unixPermissions = parseInt(E.unixPermissions, 8)), E.unixPermissions && 16384 & E.unixPermissions && (E.dir = !0), E.dosPermissions && 16 & E.dosPermissions && (E.dir = !0), E.dir && (_ = g(_)), E.createFolders && (R = x(_)) && b.call(this, R, !0); var L = S === "string" && E.binary === !1 && E.base64 === !1; - T && T.binary !== void 0 || (E.binary = !L), (M instanceof u && M.uncompressedSize === 0 || E.dir || !M || M.length === 0) && (E.base64 = !1, E.binary = !0, M = "", E.compression = "STORE", S = "string"); + C && C.binary !== void 0 || (E.binary = !L), (M instanceof u && M.uncompressedSize === 0 || E.dir || !M || M.length === 0) && (E.base64 = !1, E.binary = !0, M = "", E.compression = "STORE", S = "string"); var A = null; A = M instanceof u || M instanceof l ? M : m.isNode && m.isStream(M) ? new f(_, M) : o.prepareContent(_, M, E.binary, E.optimizedBinaryString, E.base64); var I = new p(_, A, E); @@ -32439,24 +32419,24 @@ function V_() { return 0 < M ? _.substring(0, M) : ""; }, g = function(_) { return _.slice(-1) !== "/" && (_ += "/"), _; - }, y = function(_, M) { + }, b = function(_, M) { return M = M !== void 0 ? M : h.createFolders, _ = g(_), this.files[_] || r.call(this, _, null, { dir: !0, createFolders: M }), this.files[_]; }; function v(_) { return Object.prototype.toString.call(_) === "[object RegExp]"; } - var b = { load: function() { + var y = { load: function() { throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide."); }, forEach: function(_) { - var M, T, R; - for (M in this.files) R = this.files[M], (T = M.slice(this.root.length, M.length)) && M.slice(0, this.root.length) === this.root && _(T, R); + var M, C, R; + for (M in this.files) R = this.files[M], (C = M.slice(this.root.length, M.length)) && M.slice(0, this.root.length) === this.root && _(C, R); }, filter: function(_) { var M = []; - return this.forEach(function(T, R) { - _(T, R) && M.push(R); + return this.forEach(function(C, R) { + _(C, R) && M.push(R); }), M; - }, file: function(_, M, T) { - if (arguments.length !== 1) return _ = this.root + _, r.call(this, _, M, T), this; + }, file: function(_, M, C) { + if (arguments.length !== 1) return _ = this.root + _, r.call(this, _, M, C), this; if (v(_)) { var R = _; return this.filter(function(E, L) { @@ -32470,35 +32450,35 @@ function V_() { if (v(_)) return this.filter(function(S, E) { return E.dir && _.test(S); }); - var M = this.root + _, T = y.call(this, M), R = this.clone(); - return R.root = T.name, R; + var M = this.root + _, C = b.call(this, M), R = this.clone(); + return R.root = C.name, R; }, remove: function(_) { _ = this.root + _; var M = this.files[_]; if (M || (_.slice(-1) !== "/" && (_ += "/"), M = this.files[_]), M && !M.dir) delete this.files[_]; - else for (var T = this.filter(function(S, E) { + else for (var C = this.filter(function(S, E) { return E.name.slice(0, _.length) === _; - }), R = 0; R < T.length; R++) delete this.files[T[R].name]; + }), R = 0; R < C.length; R++) delete this.files[C[R].name]; return this; }, generate: function() { throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide."); }, generateInternalStream: function(_) { - var M, T = {}; + var M, C = {}; try { - if ((T = o.extend(_ || {}, { streamFiles: !1, compression: "STORE", compressionOptions: null, type: "", platform: "DOS", comment: null, mimeType: "application/zip", encodeFileName: a.utf8encode })).type = T.type.toLowerCase(), T.compression = T.compression.toUpperCase(), T.type === "binarystring" && (T.type = "string"), !T.type) throw new Error("No output type specified."); - o.checkSupport(T.type), T.platform !== "darwin" && T.platform !== "freebsd" && T.platform !== "linux" && T.platform !== "sunos" || (T.platform = "UNIX"), T.platform === "win32" && (T.platform = "DOS"); - var R = T.comment || this.comment || ""; - M = d.generateWorker(this, T, R); + if ((C = o.extend(_ || {}, { streamFiles: !1, compression: "STORE", compressionOptions: null, type: "", platform: "DOS", comment: null, mimeType: "application/zip", encodeFileName: a.utf8encode })).type = C.type.toLowerCase(), C.compression = C.compression.toUpperCase(), C.type === "binarystring" && (C.type = "string"), !C.type) throw new Error("No output type specified."); + o.checkSupport(C.type), C.platform !== "darwin" && C.platform !== "freebsd" && C.platform !== "linux" && C.platform !== "sunos" || (C.platform = "UNIX"), C.platform === "win32" && (C.platform = "DOS"); + var R = C.comment || this.comment || ""; + M = d.generateWorker(this, C, R); } catch (S) { (M = new l("error")).error(S); } - return new c(M, T.type || "string", T.mimeType); + return new c(M, C.type || "string", C.mimeType); }, generateAsync: function(_, M) { return this.generateInternalStream(_).accumulate(M); }, generateNodeStream: function(_, M) { return (_ = _ || {}).type || (_.type = "nodebuffer"), this.generateInternalStream(_).toNodejsStream(M); } }; - n.exports = b; + n.exports = y; }, { "./compressedObject": 2, "./defaults": 5, "./generate": 9, "./nodejs/NodejsStreamInputAdapter": 12, "./nodejsUtils": 14, "./stream/GenericWorker": 28, "./stream/StreamHelper": 29, "./utf8": 31, "./utils": 32, "./zipObject": 35 }], 16: [function(t, n, i) { n.exports = t("stream"); }, { stream: void 0 }], 17: [function(t, n, i) { @@ -32717,26 +32697,26 @@ function V_() { } function p(m, f) { return new h.Promise(function(x, g) { - var y = [], v = m._internalType, b = m._outputType, _ = m._mimeType; - m.on("data", function(M, T) { - y.push(M), f && f(T); + var b = [], v = m._internalType, y = m._outputType, _ = m._mimeType; + m.on("data", function(M, C) { + b.push(M), f && f(C); }).on("error", function(M) { - y = [], g(M); + b = [], g(M); }).on("end", function() { try { - var M = (function(T, R, S) { - switch (T) { + var M = (function(C, R, S) { + switch (C) { case "blob": return r.newBlob(r.transformTo("arraybuffer", R), S); case "base64": return l.encode(R); default: - return r.transformTo(T, R); + return r.transformTo(C, R); } - })(b, (function(T, R) { + })(y, (function(C, R) { var S, E = 0, L = null, A = 0; for (S = 0; S < R.length; S++) A += R[S].length; - switch (T) { + switch (C) { case "string": return R.join(""); case "array": @@ -32747,14 +32727,14 @@ function V_() { case "nodebuffer": return Buffer.concat(R); default: - throw new Error("concat : unsupported type '" + T + "'"); + throw new Error("concat : unsupported type '" + C + "'"); } - })(v, y), _); + })(v, b), _); x(M); - } catch (T) { - g(T); + } catch (C) { + g(C); } - y = []; + b = []; }).resume(); }); } @@ -32770,8 +32750,8 @@ function V_() { } try { this._internalType = g, this._outputType = f, this._mimeType = x, r.checkSupport(g), this._worker = m.pipe(new a(g)), m.lock(); - } catch (y) { - this._worker = new o("error"), this._worker.error(y); + } catch (b) { + this._worker = new o("error"), this._worker.error(b); } } d.prototype = { accumulate: function(m) { @@ -32822,21 +32802,21 @@ function V_() { } i.utf8encode = function(d) { return a.nodebuffer ? o.newBufferFrom(d, "utf-8") : (function(m) { - var f, x, g, y, v, b = m.length, _ = 0; - for (y = 0; y < b; y++) (64512 & (x = m.charCodeAt(y))) == 55296 && y + 1 < b && (64512 & (g = m.charCodeAt(y + 1))) == 56320 && (x = 65536 + (x - 55296 << 10) + (g - 56320), y++), _ += x < 128 ? 1 : x < 2048 ? 2 : x < 65536 ? 3 : 4; - for (f = a.uint8array ? new Uint8Array(_) : new Array(_), y = v = 0; v < _; y++) (64512 & (x = m.charCodeAt(y))) == 55296 && y + 1 < b && (64512 & (g = m.charCodeAt(y + 1))) == 56320 && (x = 65536 + (x - 55296 << 10) + (g - 56320), y++), x < 128 ? f[v++] = x : (x < 2048 ? f[v++] = 192 | x >>> 6 : (x < 65536 ? f[v++] = 224 | x >>> 12 : (f[v++] = 240 | x >>> 18, f[v++] = 128 | x >>> 12 & 63), f[v++] = 128 | x >>> 6 & 63), f[v++] = 128 | 63 & x); + var f, x, g, b, v, y = m.length, _ = 0; + for (b = 0; b < y; b++) (64512 & (x = m.charCodeAt(b))) == 55296 && b + 1 < y && (64512 & (g = m.charCodeAt(b + 1))) == 56320 && (x = 65536 + (x - 55296 << 10) + (g - 56320), b++), _ += x < 128 ? 1 : x < 2048 ? 2 : x < 65536 ? 3 : 4; + for (f = a.uint8array ? new Uint8Array(_) : new Array(_), b = v = 0; v < _; b++) (64512 & (x = m.charCodeAt(b))) == 55296 && b + 1 < y && (64512 & (g = m.charCodeAt(b + 1))) == 56320 && (x = 65536 + (x - 55296 << 10) + (g - 56320), b++), x < 128 ? f[v++] = x : (x < 2048 ? f[v++] = 192 | x >>> 6 : (x < 65536 ? f[v++] = 224 | x >>> 12 : (f[v++] = 240 | x >>> 18, f[v++] = 128 | x >>> 12 & 63), f[v++] = 128 | x >>> 6 & 63), f[v++] = 128 | 63 & x); return f; })(d); }, i.utf8decode = function(d) { return a.nodebuffer ? r.transformTo("nodebuffer", d).toString("utf-8") : (function(m) { - var f, x, g, y, v = m.length, b = new Array(2 * v); - for (f = x = 0; f < v; ) if ((g = m[f++]) < 128) b[x++] = g; - else if (4 < (y = c[g])) b[x++] = 65533, f += y - 1; + var f, x, g, b, v = m.length, y = new Array(2 * v); + for (f = x = 0; f < v; ) if ((g = m[f++]) < 128) y[x++] = g; + else if (4 < (b = c[g])) y[x++] = 65533, f += b - 1; else { - for (g &= y === 2 ? 31 : y === 3 ? 15 : 7; 1 < y && f < v; ) g = g << 6 | 63 & m[f++], y--; - 1 < y ? b[x++] = 65533 : g < 65536 ? b[x++] = g : (g -= 65536, b[x++] = 55296 | g >> 10 & 1023, b[x++] = 56320 | 1023 & g); + for (g &= b === 2 ? 31 : b === 3 ? 15 : 7; 1 < b && f < v; ) g = g << 6 | 63 & m[f++], b--; + 1 < b ? y[x++] = 65533 : g < 65536 ? y[x++] = g : (g -= 65536, y[x++] = 55296 | g >> 10 & 1023, y[x++] = 56320 | 1023 & g); } - return b.length !== x && (b.subarray ? b = b.subarray(0, x) : b.length = x), r.applyFromCharCode(b); + return y.length !== x && (y.subarray ? y = y.subarray(0, x) : y.length = x), r.applyFromCharCode(y); })(d = r.transformTo(a.uint8array ? "uint8array" : "array", d)); }, r.inherits(u, l), u.prototype.processChunk = function(d) { var m = r.transformTo(a.uint8array ? "uint8array" : "array", d.data); @@ -32847,10 +32827,10 @@ function V_() { } else m = this.leftOver.concat(m); this.leftOver = null; } - var x = (function(y, v) { - var b; - for ((v = v || y.length) > y.length && (v = y.length), b = v - 1; 0 <= b && (192 & y[b]) == 128; ) b--; - return b < 0 || b === 0 ? v : b + c[y[b]] > v ? b : v; + var x = (function(b, v) { + var y; + for ((v = v || b.length) > b.length && (v = b.length), y = v - 1; 0 <= y && (192 & b[y]) == 128; ) y--; + return y < 0 || y === 0 ? v : y + c[b[y]] > v ? y : v; })(m), g = m; x !== m.length && (a.uint8array ? (g = m.subarray(0, x), this.leftOver = m.subarray(x, m.length)) : (g = m.slice(0, x), this.leftOver = m.slice(x, m.length))), this.push({ data: i.utf8decode(g), meta: d.meta }); }, u.prototype.flush = function() { @@ -32881,10 +32861,10 @@ function V_() { } }; var u = { stringifyByChunk: function(f, x, g) { - var y = [], v = 0, b = f.length; - if (b <= g) return String.fromCharCode.apply(null, f); - for (; v < b; ) x === "array" || x === "nodebuffer" ? y.push(String.fromCharCode.apply(null, f.slice(v, Math.min(v + g, b)))) : y.push(String.fromCharCode.apply(null, f.subarray(v, Math.min(v + g, b)))), v += g; - return y.join(""); + var b = [], v = 0, y = f.length; + if (y <= g) return String.fromCharCode.apply(null, f); + for (; v < y; ) x === "array" || x === "nodebuffer" ? b.push(String.fromCharCode.apply(null, f.slice(v, Math.min(v + g, y)))) : b.push(String.fromCharCode.apply(null, f.subarray(v, Math.min(v + g, y)))), v += g; + return b.join(""); }, stringifyByChar: function(f) { for (var x = "", g = 0; g < f.length; g++) x += String.fromCharCode(f[g]); return x; @@ -32902,8 +32882,8 @@ function V_() { } })() } }; function p(f) { - var x = 65536, g = i.getTypeOf(f), y = !0; - if (g === "uint8array" ? y = u.applyCanBeUsed.uint8array : g === "nodebuffer" && (y = u.applyCanBeUsed.nodebuffer), y) for (; 1 < x; ) try { + var x = 65536, g = i.getTypeOf(f), b = !0; + if (g === "uint8array" ? b = u.applyCanBeUsed.uint8array : g === "nodebuffer" && (b = u.applyCanBeUsed.nodebuffer), b) for (; 1 < x; ) try { return u.stringifyByChunk(f, g, x); } catch { x = Math.floor(x / 2); @@ -32956,9 +32936,9 @@ function V_() { var g = i.getTypeOf(x); return m[g][f](x); }, i.resolve = function(f) { - for (var x = f.split("/"), g = [], y = 0; y < x.length; y++) { - var v = x[y]; - v === "." || v === "" && y !== 0 && y !== x.length - 1 || (v === ".." ? g.pop() : g.push(v)); + for (var x = f.split("/"), g = [], b = 0; b < x.length; b++) { + var v = x[b]; + v === "." || v === "" && b !== 0 && b !== x.length - 1 || (v === ".." ? g.pop() : g.push(v)); } return g.join("/"); }, i.getTypeOf = function(f) { @@ -32966,9 +32946,9 @@ function V_() { }, i.checkSupport = function(f) { if (!r[f.toLowerCase()]) throw new Error(f + " is not supported by this platform"); }, i.MAX_VALUE_16BITS = 65535, i.MAX_VALUE_32BITS = -1, i.pretty = function(f) { - var x, g, y = ""; - for (g = 0; g < (f || "").length; g++) y += "\\x" + ((x = f.charCodeAt(g)) < 16 ? "0" : "") + x.toString(16).toUpperCase(); - return y; + var x, g, b = ""; + for (g = 0; g < (f || "").length; g++) b += "\\x" + ((x = f.charCodeAt(g)) < 16 ? "0" : "") + x.toString(16).toUpperCase(); + return b; }, i.delay = function(f, x, g) { setImmediate(function() { f.apply(g || null, x || []); @@ -32981,21 +32961,21 @@ function V_() { var f, x, g = {}; for (f = 0; f < arguments.length; f++) for (x in arguments[f]) Object.prototype.hasOwnProperty.call(arguments[f], x) && g[x] === void 0 && (g[x] = arguments[f][x]); return g; - }, i.prepareContent = function(f, x, g, y, v) { - return l.Promise.resolve(x).then(function(b) { - return r.blob && (b instanceof Blob || ["[object File]", "[object Blob]"].indexOf(Object.prototype.toString.call(b)) !== -1) && typeof FileReader < "u" ? new l.Promise(function(_, M) { - var T = new FileReader(); - T.onload = function(R) { + }, i.prepareContent = function(f, x, g, b, v) { + return l.Promise.resolve(x).then(function(y) { + return r.blob && (y instanceof Blob || ["[object File]", "[object Blob]"].indexOf(Object.prototype.toString.call(y)) !== -1) && typeof FileReader < "u" ? new l.Promise(function(_, M) { + var C = new FileReader(); + C.onload = function(R) { _(R.target.result); - }, T.onerror = function(R) { + }, C.onerror = function(R) { M(R.target.error); - }, T.readAsArrayBuffer(b); - }) : b; - }).then(function(b) { - var _ = i.getTypeOf(b); - return _ ? (_ === "arraybuffer" ? b = i.transformTo("uint8array", b) : _ === "string" && (v ? b = a.decode(b) : g && y !== !0 && (b = (function(M) { + }, C.readAsArrayBuffer(y); + }) : y; + }).then(function(y) { + var _ = i.getTypeOf(y); + return _ ? (_ === "arraybuffer" ? y = i.transformTo("uint8array", y) : _ === "string" && (v ? y = a.decode(y) : g && b !== !0 && (y = (function(M) { return h(M, r.uint8array ? new Uint8Array(M.length) : new Array(M.length)); - })(b))), b) : l.Promise.reject(new Error("Can't read the data of '" + f + "'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?")); + })(y))), y) : l.Promise.reject(new Error("Can't read the data of '" + f + "'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?")); }); }; }, { "./base64": 1, "./external": 6, "./nodejsUtils": 14, "./support": 30, setimmediate: 54 }], 33: [function(t, n, i) { @@ -33128,8 +33108,8 @@ function V_() { if (!m) throw new Error("No output type specified."); var g = (x = m.toLowerCase()) === "string" || x === "text"; x !== "binarystring" && x !== "text" || (x = "string"), f = this._decompressWorker(); - var y = !this._dataBinary; - y && !g && (f = f.pipe(new l.Utf8EncodeWorker())), !y && g && (f = f.pipe(new l.Utf8DecodeWorker())); + var b = !this._dataBinary; + b && !g && (f = f.pipe(new l.Utf8EncodeWorker())), !b && g && (f = f.pipe(new l.Utf8DecodeWorker())); } catch (v) { (f = new h("error")).error(v); } @@ -33194,66 +33174,66 @@ function V_() { if (typeof g != "function") throw new TypeError("resolver must be a function"); this.state = h, this.queue = [], this.outcome = void 0, g !== a && f(this, g); } - function p(g, y, v) { - this.promise = g, typeof y == "function" && (this.onFulfilled = y, this.callFulfilled = this.otherCallFulfilled), typeof v == "function" && (this.onRejected = v, this.callRejected = this.otherCallRejected); + function p(g, b, v) { + this.promise = g, typeof b == "function" && (this.onFulfilled = b, this.callFulfilled = this.otherCallFulfilled), typeof v == "function" && (this.onRejected = v, this.callRejected = this.otherCallRejected); } - function d(g, y, v) { + function d(g, b, v) { r(function() { - var b; + var y; try { - b = y(v); + y = b(v); } catch (_) { return o.reject(g, _); } - b === g ? o.reject(g, new TypeError("Cannot resolve promise with itself")) : o.resolve(g, b); + y === g ? o.reject(g, new TypeError("Cannot resolve promise with itself")) : o.resolve(g, y); }); } function m(g) { - var y = g && g.then; - if (g && (typeof g == "object" || typeof g == "function") && typeof y == "function") return function() { - y.apply(g, arguments); + var b = g && g.then; + if (g && (typeof g == "object" || typeof g == "function") && typeof b == "function") return function() { + b.apply(g, arguments); }; } - function f(g, y) { + function f(g, b) { var v = !1; - function b(T) { - v || (v = !0, o.reject(g, T)); + function y(C) { + v || (v = !0, o.reject(g, C)); } - function _(T) { - v || (v = !0, o.resolve(g, T)); + function _(C) { + v || (v = !0, o.resolve(g, C)); } var M = x(function() { - y(_, b); + b(_, y); }); - M.status === "error" && b(M.value); + M.status === "error" && y(M.value); } - function x(g, y) { + function x(g, b) { var v = {}; try { - v.value = g(y), v.status = "success"; - } catch (b) { - v.status = "error", v.value = b; + v.value = g(b), v.status = "success"; + } catch (y) { + v.status = "error", v.value = y; } return v; } (n.exports = u).prototype.finally = function(g) { if (typeof g != "function") return this; - var y = this.constructor; + var b = this.constructor; return this.then(function(v) { - return y.resolve(g()).then(function() { + return b.resolve(g()).then(function() { return v; }); }, function(v) { - return y.resolve(g()).then(function() { + return b.resolve(g()).then(function() { throw v; }); }); }, u.prototype.catch = function(g) { return this.then(null, g); - }, u.prototype.then = function(g, y) { - if (typeof g != "function" && this.state === c || typeof y != "function" && this.state === l) return this; + }, u.prototype.then = function(g, b) { + if (typeof g != "function" && this.state === c || typeof b != "function" && this.state === l) return this; var v = new this.constructor(a); - return this.state !== h ? d(v, this.state === c ? g : y, this.outcome) : this.queue.push(new p(v, g, y)), v; + return this.state !== h ? d(v, this.state === c ? g : b, this.outcome) : this.queue.push(new p(v, g, b)), v; }, p.prototype.callFulfilled = function(g) { o.resolve(this.promise, g); }, p.prototype.otherCallFulfilled = function(g) { @@ -33262,50 +33242,50 @@ function V_() { o.reject(this.promise, g); }, p.prototype.otherCallRejected = function(g) { d(this.promise, this.onRejected, g); - }, o.resolve = function(g, y) { - var v = x(m, y); + }, o.resolve = function(g, b) { + var v = x(m, b); if (v.status === "error") return o.reject(g, v.value); - var b = v.value; - if (b) f(g, b); + var y = v.value; + if (y) f(g, y); else { - g.state = c, g.outcome = y; - for (var _ = -1, M = g.queue.length; ++_ < M; ) g.queue[_].callFulfilled(y); + g.state = c, g.outcome = b; + for (var _ = -1, M = g.queue.length; ++_ < M; ) g.queue[_].callFulfilled(b); } return g; - }, o.reject = function(g, y) { - g.state = l, g.outcome = y; - for (var v = -1, b = g.queue.length; ++v < b; ) g.queue[v].callRejected(y); + }, o.reject = function(g, b) { + g.state = l, g.outcome = b; + for (var v = -1, y = g.queue.length; ++v < y; ) g.queue[v].callRejected(b); return g; }, u.resolve = function(g) { return g instanceof this ? g : o.resolve(new this(a), g); }, u.reject = function(g) { - var y = new this(a); - return o.reject(y, g); + var b = new this(a); + return o.reject(b, g); }, u.all = function(g) { - var y = this; + var b = this; if (Object.prototype.toString.call(g) !== "[object Array]") return this.reject(new TypeError("must be an array")); - var v = g.length, b = !1; + var v = g.length, y = !1; if (!v) return this.resolve([]); - for (var _ = new Array(v), M = 0, T = -1, R = new this(a); ++T < v; ) S(g[T], T); + for (var _ = new Array(v), M = 0, C = -1, R = new this(a); ++C < v; ) S(g[C], C); return R; function S(E, L) { - y.resolve(E).then(function(A) { - _[L] = A, ++M !== v || b || (b = !0, o.resolve(R, _)); + b.resolve(E).then(function(A) { + _[L] = A, ++M !== v || y || (y = !0, o.resolve(R, _)); }, function(A) { - b || (b = !0, o.reject(R, A)); + y || (y = !0, o.reject(R, A)); }); } }, u.race = function(g) { - var y = this; + var b = this; if (Object.prototype.toString.call(g) !== "[object Array]") return this.reject(new TypeError("must be an array")); - var v = g.length, b = !1; + var v = g.length, y = !1; if (!v) return this.resolve([]); - for (var _ = -1, M = new this(a); ++_ < v; ) T = g[_], y.resolve(T).then(function(R) { - b || (b = !0, o.resolve(M, R)); + for (var _ = -1, M = new this(a); ++_ < v; ) C = g[_], b.resolve(C).then(function(R) { + y || (y = !0, o.resolve(M, R)); }, function(R) { - b || (b = !0, o.reject(M, R)); + y || (y = !0, o.reject(M, R)); }); - var T; + var C; return M; }; }, { immediate: 36 }], 38: [function(t, n, i) { @@ -33316,38 +33296,38 @@ function V_() { function f(g) { if (!(this instanceof f)) return new f(g); this.options = a.assign({ level: p, method: m, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: d, to: "" }, g || {}); - var y = this.options; - y.raw && 0 < y.windowBits ? y.windowBits = -y.windowBits : y.gzip && 0 < y.windowBits && y.windowBits < 16 && (y.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new c(), this.strm.avail_out = 0; - var v = r.deflateInit2(this.strm, y.level, y.method, y.windowBits, y.memLevel, y.strategy); + var b = this.options; + b.raw && 0 < b.windowBits ? b.windowBits = -b.windowBits : b.gzip && 0 < b.windowBits && b.windowBits < 16 && (b.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new c(), this.strm.avail_out = 0; + var v = r.deflateInit2(this.strm, b.level, b.method, b.windowBits, b.memLevel, b.strategy); if (v !== u) throw new Error(l[v]); - if (y.header && r.deflateSetHeader(this.strm, y.header), y.dictionary) { - var b; - if (b = typeof y.dictionary == "string" ? o.string2buf(y.dictionary) : h.call(y.dictionary) === "[object ArrayBuffer]" ? new Uint8Array(y.dictionary) : y.dictionary, (v = r.deflateSetDictionary(this.strm, b)) !== u) throw new Error(l[v]); + if (b.header && r.deflateSetHeader(this.strm, b.header), b.dictionary) { + var y; + if (y = typeof b.dictionary == "string" ? o.string2buf(b.dictionary) : h.call(b.dictionary) === "[object ArrayBuffer]" ? new Uint8Array(b.dictionary) : b.dictionary, (v = r.deflateSetDictionary(this.strm, y)) !== u) throw new Error(l[v]); this._dict_set = !0; } } - function x(g, y) { - var v = new f(y); + function x(g, b) { + var v = new f(b); if (v.push(g, !0), v.err) throw v.msg || l[v.err]; return v.result; } - f.prototype.push = function(g, y) { - var v, b, _ = this.strm, M = this.options.chunkSize; + f.prototype.push = function(g, b) { + var v, y, _ = this.strm, M = this.options.chunkSize; if (this.ended) return !1; - b = y === ~~y ? y : y === !0 ? 4 : 0, typeof g == "string" ? _.input = o.string2buf(g) : h.call(g) === "[object ArrayBuffer]" ? _.input = new Uint8Array(g) : _.input = g, _.next_in = 0, _.avail_in = _.input.length; + y = b === ~~b ? b : b === !0 ? 4 : 0, typeof g == "string" ? _.input = o.string2buf(g) : h.call(g) === "[object ArrayBuffer]" ? _.input = new Uint8Array(g) : _.input = g, _.next_in = 0, _.avail_in = _.input.length; do { - if (_.avail_out === 0 && (_.output = new a.Buf8(M), _.next_out = 0, _.avail_out = M), (v = r.deflate(_, b)) !== 1 && v !== u) return this.onEnd(v), !(this.ended = !0); - _.avail_out !== 0 && (_.avail_in !== 0 || b !== 4 && b !== 2) || (this.options.to === "string" ? this.onData(o.buf2binstring(a.shrinkBuf(_.output, _.next_out))) : this.onData(a.shrinkBuf(_.output, _.next_out))); + if (_.avail_out === 0 && (_.output = new a.Buf8(M), _.next_out = 0, _.avail_out = M), (v = r.deflate(_, y)) !== 1 && v !== u) return this.onEnd(v), !(this.ended = !0); + _.avail_out !== 0 && (_.avail_in !== 0 || y !== 4 && y !== 2) || (this.options.to === "string" ? this.onData(o.buf2binstring(a.shrinkBuf(_.output, _.next_out))) : this.onData(a.shrinkBuf(_.output, _.next_out))); } while ((0 < _.avail_in || _.avail_out === 0) && v !== 1); - return b === 4 ? (v = r.deflateEnd(this.strm), this.onEnd(v), this.ended = !0, v === u) : b !== 2 || (this.onEnd(u), !(_.avail_out = 0)); + return y === 4 ? (v = r.deflateEnd(this.strm), this.onEnd(v), this.ended = !0, v === u) : y !== 2 || (this.onEnd(u), !(_.avail_out = 0)); }, f.prototype.onData = function(g) { this.chunks.push(g); }, f.prototype.onEnd = function(g) { g === u && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = a.flattenChunks(this.chunks)), this.chunks = [], this.err = g, this.msg = this.strm.msg; - }, i.Deflate = f, i.deflate = x, i.deflateRaw = function(g, y) { - return (y = y || {}).raw = !0, x(g, y); - }, i.gzip = function(g, y) { - return (y = y || {}).gzip = !0, x(g, y); + }, i.Deflate = f, i.deflate = x, i.deflateRaw = function(g, b) { + return (b = b || {}).raw = !0, x(g, b); + }, i.gzip = function(g, b) { + return (b = b || {}).gzip = !0, x(g, b); }; }, { "./utils/common": 41, "./utils/strings": 42, "./zlib/deflate": 46, "./zlib/messages": 51, "./zlib/zstream": 53 }], 40: [function(t, n, i) { var r = t("./zlib/inflate"), a = t("./utils/common"), o = t("./utils/strings"), l = t("./zlib/constants"), c = t("./zlib/messages"), h = t("./zlib/zstream"), u = t("./zlib/gzheader"), p = Object.prototype.toString; @@ -33366,14 +33346,14 @@ function V_() { return g.result; } d.prototype.push = function(f, x) { - var g, y, v, b, _, M, T = this.strm, R = this.options.chunkSize, S = this.options.dictionary, E = !1; + var g, b, v, y, _, M, C = this.strm, R = this.options.chunkSize, S = this.options.dictionary, E = !1; if (this.ended) return !1; - y = x === ~~x ? x : x === !0 ? l.Z_FINISH : l.Z_NO_FLUSH, typeof f == "string" ? T.input = o.binstring2buf(f) : p.call(f) === "[object ArrayBuffer]" ? T.input = new Uint8Array(f) : T.input = f, T.next_in = 0, T.avail_in = T.input.length; + b = x === ~~x ? x : x === !0 ? l.Z_FINISH : l.Z_NO_FLUSH, typeof f == "string" ? C.input = o.binstring2buf(f) : p.call(f) === "[object ArrayBuffer]" ? C.input = new Uint8Array(f) : C.input = f, C.next_in = 0, C.avail_in = C.input.length; do { - if (T.avail_out === 0 && (T.output = new a.Buf8(R), T.next_out = 0, T.avail_out = R), (g = r.inflate(T, l.Z_NO_FLUSH)) === l.Z_NEED_DICT && S && (M = typeof S == "string" ? o.string2buf(S) : p.call(S) === "[object ArrayBuffer]" ? new Uint8Array(S) : S, g = r.inflateSetDictionary(this.strm, M)), g === l.Z_BUF_ERROR && E === !0 && (g = l.Z_OK, E = !1), g !== l.Z_STREAM_END && g !== l.Z_OK) return this.onEnd(g), !(this.ended = !0); - T.next_out && (T.avail_out !== 0 && g !== l.Z_STREAM_END && (T.avail_in !== 0 || y !== l.Z_FINISH && y !== l.Z_SYNC_FLUSH) || (this.options.to === "string" ? (v = o.utf8border(T.output, T.next_out), b = T.next_out - v, _ = o.buf2string(T.output, v), T.next_out = b, T.avail_out = R - b, b && a.arraySet(T.output, T.output, v, b, 0), this.onData(_)) : this.onData(a.shrinkBuf(T.output, T.next_out)))), T.avail_in === 0 && T.avail_out === 0 && (E = !0); - } while ((0 < T.avail_in || T.avail_out === 0) && g !== l.Z_STREAM_END); - return g === l.Z_STREAM_END && (y = l.Z_FINISH), y === l.Z_FINISH ? (g = r.inflateEnd(this.strm), this.onEnd(g), this.ended = !0, g === l.Z_OK) : y !== l.Z_SYNC_FLUSH || (this.onEnd(l.Z_OK), !(T.avail_out = 0)); + if (C.avail_out === 0 && (C.output = new a.Buf8(R), C.next_out = 0, C.avail_out = R), (g = r.inflate(C, l.Z_NO_FLUSH)) === l.Z_NEED_DICT && S && (M = typeof S == "string" ? o.string2buf(S) : p.call(S) === "[object ArrayBuffer]" ? new Uint8Array(S) : S, g = r.inflateSetDictionary(this.strm, M)), g === l.Z_BUF_ERROR && E === !0 && (g = l.Z_OK, E = !1), g !== l.Z_STREAM_END && g !== l.Z_OK) return this.onEnd(g), !(this.ended = !0); + C.next_out && (C.avail_out !== 0 && g !== l.Z_STREAM_END && (C.avail_in !== 0 || b !== l.Z_FINISH && b !== l.Z_SYNC_FLUSH) || (this.options.to === "string" ? (v = o.utf8border(C.output, C.next_out), y = C.next_out - v, _ = o.buf2string(C.output, v), C.next_out = y, C.avail_out = R - y, y && a.arraySet(C.output, C.output, v, y, 0), this.onData(_)) : this.onData(a.shrinkBuf(C.output, C.next_out)))), C.avail_in === 0 && C.avail_out === 0 && (E = !0); + } while ((0 < C.avail_in || C.avail_out === 0) && g !== l.Z_STREAM_END); + return g === l.Z_STREAM_END && (b = l.Z_FINISH), b === l.Z_FINISH ? (g = r.inflateEnd(this.strm), this.onEnd(g), this.ended = !0, g === l.Z_OK) : b !== l.Z_SYNC_FLUSH || (this.onEnd(l.Z_OK), !(C.avail_out = 0)); }, d.prototype.onData = function(f) { this.chunks.push(f); }, d.prototype.onEnd = function(f) { @@ -33430,9 +33410,9 @@ function V_() { return d; } l[254] = l[254] = 1, i.string2buf = function(u) { - var p, d, m, f, x, g = u.length, y = 0; - for (f = 0; f < g; f++) (64512 & (d = u.charCodeAt(f))) == 55296 && f + 1 < g && (64512 & (m = u.charCodeAt(f + 1))) == 56320 && (d = 65536 + (d - 55296 << 10) + (m - 56320), f++), y += d < 128 ? 1 : d < 2048 ? 2 : d < 65536 ? 3 : 4; - for (p = new r.Buf8(y), f = x = 0; x < y; f++) (64512 & (d = u.charCodeAt(f))) == 55296 && f + 1 < g && (64512 & (m = u.charCodeAt(f + 1))) == 56320 && (d = 65536 + (d - 55296 << 10) + (m - 56320), f++), d < 128 ? p[x++] = d : (d < 2048 ? p[x++] = 192 | d >>> 6 : (d < 65536 ? p[x++] = 224 | d >>> 12 : (p[x++] = 240 | d >>> 18, p[x++] = 128 | d >>> 12 & 63), p[x++] = 128 | d >>> 6 & 63), p[x++] = 128 | 63 & d); + var p, d, m, f, x, g = u.length, b = 0; + for (f = 0; f < g; f++) (64512 & (d = u.charCodeAt(f))) == 55296 && f + 1 < g && (64512 & (m = u.charCodeAt(f + 1))) == 56320 && (d = 65536 + (d - 55296 << 10) + (m - 56320), f++), b += d < 128 ? 1 : d < 2048 ? 2 : d < 65536 ? 3 : 4; + for (p = new r.Buf8(b), f = x = 0; x < b; f++) (64512 & (d = u.charCodeAt(f))) == 55296 && f + 1 < g && (64512 & (m = u.charCodeAt(f + 1))) == 56320 && (d = 65536 + (d - 55296 << 10) + (m - 56320), f++), d < 128 ? p[x++] = d : (d < 2048 ? p[x++] = 192 | d >>> 6 : (d < 65536 ? p[x++] = 224 | d >>> 12 : (p[x++] = 240 | d >>> 18, p[x++] = 128 | d >>> 12 & 63), p[x++] = 128 | d >>> 6 & 63), p[x++] = 128 | 63 & d); return p; }, i.buf2binstring = function(u) { return h(u, u.length); @@ -33440,14 +33420,14 @@ function V_() { for (var p = new r.Buf8(u.length), d = 0, m = p.length; d < m; d++) p[d] = u.charCodeAt(d); return p; }, i.buf2string = function(u, p) { - var d, m, f, x, g = p || u.length, y = new Array(2 * g); - for (d = m = 0; d < g; ) if ((f = u[d++]) < 128) y[m++] = f; - else if (4 < (x = l[f])) y[m++] = 65533, d += x - 1; + var d, m, f, x, g = p || u.length, b = new Array(2 * g); + for (d = m = 0; d < g; ) if ((f = u[d++]) < 128) b[m++] = f; + else if (4 < (x = l[f])) b[m++] = 65533, d += x - 1; else { for (f &= x === 2 ? 31 : x === 3 ? 15 : 7; 1 < x && d < g; ) f = f << 6 | 63 & u[d++], x--; - 1 < x ? y[m++] = 65533 : f < 65536 ? y[m++] = f : (f -= 65536, y[m++] = 55296 | f >> 10 & 1023, y[m++] = 56320 | 1023 & f); + 1 < x ? b[m++] = 65533 : f < 65536 ? b[m++] = f : (f -= 65536, b[m++] = 55296 | f >> 10 & 1023, b[m++] = 56320 | 1023 & f); } - return h(y, m); + return h(b, m); }, i.utf8border = function(u, p) { var d; for ((p = p || u.length) > u.length && (p = u.length), d = p - 1; 0 <= d && (192 & u[d]) == 128; ) d--; @@ -33479,32 +33459,32 @@ function V_() { return -1 ^ a; }; }, {}], 46: [function(t, n, i) { - var r, a = t("../utils/common"), o = t("./trees"), l = t("./adler32"), c = t("./crc32"), h = t("./messages"), u = 0, p = 4, d = 0, m = -2, f = -1, x = 4, g = 2, y = 8, v = 9, b = 286, _ = 30, M = 19, T = 2 * b + 1, R = 15, S = 3, E = 258, L = E + S + 1, A = 42, I = 113, w = 1, z = 2, G = 3, j = 4; - function Y(C, N) { - return C.msg = h[N], N; + var r, a = t("../utils/common"), o = t("./trees"), l = t("./adler32"), c = t("./crc32"), h = t("./messages"), u = 0, p = 4, d = 0, m = -2, f = -1, x = 4, g = 2, b = 8, v = 9, y = 286, _ = 30, M = 19, C = 2 * y + 1, R = 15, S = 3, E = 258, L = E + S + 1, A = 42, I = 113, w = 1, z = 2, G = 3, j = 4; + function Y(T, N) { + return T.msg = h[N], N; } - function q(C) { - return (C << 1) - (4 < C ? 9 : 0); + function q(T) { + return (T << 1) - (4 < T ? 9 : 0); } - function ie(C) { - for (var N = C.length; 0 <= --N; ) C[N] = 0; + function ie(T) { + for (var N = T.length; 0 <= --N; ) T[N] = 0; } - function W(C) { - var N = C.state, V = N.pending; - V > C.avail_out && (V = C.avail_out), V !== 0 && (a.arraySet(C.output, N.pending_buf, N.pending_out, V, C.next_out), C.next_out += V, N.pending_out += V, C.total_out += V, C.avail_out -= V, N.pending -= V, N.pending === 0 && (N.pending_out = 0)); + function W(T) { + var N = T.state, V = N.pending; + V > T.avail_out && (V = T.avail_out), V !== 0 && (a.arraySet(T.output, N.pending_buf, N.pending_out, V, T.next_out), T.next_out += V, N.pending_out += V, T.total_out += V, T.avail_out -= V, N.pending -= V, N.pending === 0 && (N.pending_out = 0)); } - function $(C, N) { - o._tr_flush_block(C, 0 <= C.block_start ? C.block_start : -1, C.strstart - C.block_start, N), C.block_start = C.strstart, W(C.strm); + function $(T, N) { + o._tr_flush_block(T, 0 <= T.block_start ? T.block_start : -1, T.strstart - T.block_start, N), T.block_start = T.strstart, W(T.strm); } - function fe(C, N) { - C.pending_buf[C.pending++] = N; + function fe(T, N) { + T.pending_buf[T.pending++] = N; } - function me(C, N) { - C.pending_buf[C.pending++] = N >>> 8 & 255, C.pending_buf[C.pending++] = 255 & N; + function me(T, N) { + T.pending_buf[T.pending++] = N >>> 8 & 255, T.pending_buf[T.pending++] = 255 & N; } - function de(C, N) { - var V, U, k = C.max_chain_length, F = C.strstart, ee = C.prev_length, J = C.nice_match, X = C.strstart > C.w_size - L ? C.strstart - (C.w_size - L) : 0, B = C.window, D = C.w_mask, H = C.prev, K = C.strstart + E, le = B[F + ee - 1], te = B[F + ee]; - C.prev_length >= C.good_match && (k >>= 2), J > C.lookahead && (J = C.lookahead); + function de(T, N) { + var V, U, k = T.max_chain_length, F = T.strstart, ee = T.prev_length, J = T.nice_match, X = T.strstart > T.w_size - L ? T.strstart - (T.w_size - L) : 0, B = T.window, D = T.w_mask, H = T.prev, K = T.strstart + E, le = B[F + ee - 1], te = B[F + ee]; + T.prev_length >= T.good_match && (k >>= 2), J > T.lookahead && (J = T.lookahead); do if (B[(V = N) + ee] === te && B[V + ee - 1] === le && B[V] === B[F] && B[++V] === B[F + 1]) { F += 2, V++; @@ -33512,135 +33492,135 @@ function V_() { ; while (B[++F] === B[++V] && B[++F] === B[++V] && B[++F] === B[++V] && B[++F] === B[++V] && B[++F] === B[++V] && B[++F] === B[++V] && B[++F] === B[++V] && B[++F] === B[++V] && F < K); if (U = E - (K - F), F = K - E, ee < U) { - if (C.match_start = N, J <= (ee = U)) break; + if (T.match_start = N, J <= (ee = U)) break; le = B[F + ee - 1], te = B[F + ee]; } } while ((N = H[N & D]) > X && --k != 0); - return ee <= C.lookahead ? ee : C.lookahead; + return ee <= T.lookahead ? ee : T.lookahead; } - function se(C) { - var N, V, U, k, F, ee, J, X, B, D, H = C.w_size; + function se(T) { + var N, V, U, k, F, ee, J, X, B, D, H = T.w_size; do { - if (k = C.window_size - C.lookahead - C.strstart, C.strstart >= H + (H - L)) { - for (a.arraySet(C.window, C.window, H, H, 0), C.match_start -= H, C.strstart -= H, C.block_start -= H, N = V = C.hash_size; U = C.head[--N], C.head[N] = H <= U ? U - H : 0, --V; ) ; - for (N = V = H; U = C.prev[--N], C.prev[N] = H <= U ? U - H : 0, --V; ) ; + if (k = T.window_size - T.lookahead - T.strstart, T.strstart >= H + (H - L)) { + for (a.arraySet(T.window, T.window, H, H, 0), T.match_start -= H, T.strstart -= H, T.block_start -= H, N = V = T.hash_size; U = T.head[--N], T.head[N] = H <= U ? U - H : 0, --V; ) ; + for (N = V = H; U = T.prev[--N], T.prev[N] = H <= U ? U - H : 0, --V; ) ; k += H; } - if (C.strm.avail_in === 0) break; - if (ee = C.strm, J = C.window, X = C.strstart + C.lookahead, B = k, D = void 0, D = ee.avail_in, B < D && (D = B), V = D === 0 ? 0 : (ee.avail_in -= D, a.arraySet(J, ee.input, ee.next_in, D, X), ee.state.wrap === 1 ? ee.adler = l(ee.adler, J, D, X) : ee.state.wrap === 2 && (ee.adler = c(ee.adler, J, D, X)), ee.next_in += D, ee.total_in += D, D), C.lookahead += V, C.lookahead + C.insert >= S) for (F = C.strstart - C.insert, C.ins_h = C.window[F], C.ins_h = (C.ins_h << C.hash_shift ^ C.window[F + 1]) & C.hash_mask; C.insert && (C.ins_h = (C.ins_h << C.hash_shift ^ C.window[F + S - 1]) & C.hash_mask, C.prev[F & C.w_mask] = C.head[C.ins_h], C.head[C.ins_h] = F, F++, C.insert--, !(C.lookahead + C.insert < S)); ) ; - } while (C.lookahead < L && C.strm.avail_in !== 0); + if (T.strm.avail_in === 0) break; + if (ee = T.strm, J = T.window, X = T.strstart + T.lookahead, B = k, D = void 0, D = ee.avail_in, B < D && (D = B), V = D === 0 ? 0 : (ee.avail_in -= D, a.arraySet(J, ee.input, ee.next_in, D, X), ee.state.wrap === 1 ? ee.adler = l(ee.adler, J, D, X) : ee.state.wrap === 2 && (ee.adler = c(ee.adler, J, D, X)), ee.next_in += D, ee.total_in += D, D), T.lookahead += V, T.lookahead + T.insert >= S) for (F = T.strstart - T.insert, T.ins_h = T.window[F], T.ins_h = (T.ins_h << T.hash_shift ^ T.window[F + 1]) & T.hash_mask; T.insert && (T.ins_h = (T.ins_h << T.hash_shift ^ T.window[F + S - 1]) & T.hash_mask, T.prev[F & T.w_mask] = T.head[T.ins_h], T.head[T.ins_h] = F, F++, T.insert--, !(T.lookahead + T.insert < S)); ) ; + } while (T.lookahead < L && T.strm.avail_in !== 0); } - function ce(C, N) { + function ce(T, N) { for (var V, U; ; ) { - if (C.lookahead < L) { - if (se(C), C.lookahead < L && N === u) return w; - if (C.lookahead === 0) break; + if (T.lookahead < L) { + if (se(T), T.lookahead < L && N === u) return w; + if (T.lookahead === 0) break; } - if (V = 0, C.lookahead >= S && (C.ins_h = (C.ins_h << C.hash_shift ^ C.window[C.strstart + S - 1]) & C.hash_mask, V = C.prev[C.strstart & C.w_mask] = C.head[C.ins_h], C.head[C.ins_h] = C.strstart), V !== 0 && C.strstart - V <= C.w_size - L && (C.match_length = de(C, V)), C.match_length >= S) if (U = o._tr_tally(C, C.strstart - C.match_start, C.match_length - S), C.lookahead -= C.match_length, C.match_length <= C.max_lazy_match && C.lookahead >= S) { - for (C.match_length--; C.strstart++, C.ins_h = (C.ins_h << C.hash_shift ^ C.window[C.strstart + S - 1]) & C.hash_mask, V = C.prev[C.strstart & C.w_mask] = C.head[C.ins_h], C.head[C.ins_h] = C.strstart, --C.match_length != 0; ) ; - C.strstart++; - } else C.strstart += C.match_length, C.match_length = 0, C.ins_h = C.window[C.strstart], C.ins_h = (C.ins_h << C.hash_shift ^ C.window[C.strstart + 1]) & C.hash_mask; - else U = o._tr_tally(C, 0, C.window[C.strstart]), C.lookahead--, C.strstart++; - if (U && ($(C, !1), C.strm.avail_out === 0)) return w; + if (V = 0, T.lookahead >= S && (T.ins_h = (T.ins_h << T.hash_shift ^ T.window[T.strstart + S - 1]) & T.hash_mask, V = T.prev[T.strstart & T.w_mask] = T.head[T.ins_h], T.head[T.ins_h] = T.strstart), V !== 0 && T.strstart - V <= T.w_size - L && (T.match_length = de(T, V)), T.match_length >= S) if (U = o._tr_tally(T, T.strstart - T.match_start, T.match_length - S), T.lookahead -= T.match_length, T.match_length <= T.max_lazy_match && T.lookahead >= S) { + for (T.match_length--; T.strstart++, T.ins_h = (T.ins_h << T.hash_shift ^ T.window[T.strstart + S - 1]) & T.hash_mask, V = T.prev[T.strstart & T.w_mask] = T.head[T.ins_h], T.head[T.ins_h] = T.strstart, --T.match_length != 0; ) ; + T.strstart++; + } else T.strstart += T.match_length, T.match_length = 0, T.ins_h = T.window[T.strstart], T.ins_h = (T.ins_h << T.hash_shift ^ T.window[T.strstart + 1]) & T.hash_mask; + else U = o._tr_tally(T, 0, T.window[T.strstart]), T.lookahead--, T.strstart++; + if (U && ($(T, !1), T.strm.avail_out === 0)) return w; } - return C.insert = C.strstart < S - 1 ? C.strstart : S - 1, N === p ? ($(C, !0), C.strm.avail_out === 0 ? G : j) : C.last_lit && ($(C, !1), C.strm.avail_out === 0) ? w : z; + return T.insert = T.strstart < S - 1 ? T.strstart : S - 1, N === p ? ($(T, !0), T.strm.avail_out === 0 ? G : j) : T.last_lit && ($(T, !1), T.strm.avail_out === 0) ? w : z; } - function pe(C, N) { + function pe(T, N) { for (var V, U, k; ; ) { - if (C.lookahead < L) { - if (se(C), C.lookahead < L && N === u) return w; - if (C.lookahead === 0) break; + if (T.lookahead < L) { + if (se(T), T.lookahead < L && N === u) return w; + if (T.lookahead === 0) break; } - if (V = 0, C.lookahead >= S && (C.ins_h = (C.ins_h << C.hash_shift ^ C.window[C.strstart + S - 1]) & C.hash_mask, V = C.prev[C.strstart & C.w_mask] = C.head[C.ins_h], C.head[C.ins_h] = C.strstart), C.prev_length = C.match_length, C.prev_match = C.match_start, C.match_length = S - 1, V !== 0 && C.prev_length < C.max_lazy_match && C.strstart - V <= C.w_size - L && (C.match_length = de(C, V), C.match_length <= 5 && (C.strategy === 1 || C.match_length === S && 4096 < C.strstart - C.match_start) && (C.match_length = S - 1)), C.prev_length >= S && C.match_length <= C.prev_length) { - for (k = C.strstart + C.lookahead - S, U = o._tr_tally(C, C.strstart - 1 - C.prev_match, C.prev_length - S), C.lookahead -= C.prev_length - 1, C.prev_length -= 2; ++C.strstart <= k && (C.ins_h = (C.ins_h << C.hash_shift ^ C.window[C.strstart + S - 1]) & C.hash_mask, V = C.prev[C.strstart & C.w_mask] = C.head[C.ins_h], C.head[C.ins_h] = C.strstart), --C.prev_length != 0; ) ; - if (C.match_available = 0, C.match_length = S - 1, C.strstart++, U && ($(C, !1), C.strm.avail_out === 0)) return w; - } else if (C.match_available) { - if ((U = o._tr_tally(C, 0, C.window[C.strstart - 1])) && $(C, !1), C.strstart++, C.lookahead--, C.strm.avail_out === 0) return w; - } else C.match_available = 1, C.strstart++, C.lookahead--; + if (V = 0, T.lookahead >= S && (T.ins_h = (T.ins_h << T.hash_shift ^ T.window[T.strstart + S - 1]) & T.hash_mask, V = T.prev[T.strstart & T.w_mask] = T.head[T.ins_h], T.head[T.ins_h] = T.strstart), T.prev_length = T.match_length, T.prev_match = T.match_start, T.match_length = S - 1, V !== 0 && T.prev_length < T.max_lazy_match && T.strstart - V <= T.w_size - L && (T.match_length = de(T, V), T.match_length <= 5 && (T.strategy === 1 || T.match_length === S && 4096 < T.strstart - T.match_start) && (T.match_length = S - 1)), T.prev_length >= S && T.match_length <= T.prev_length) { + for (k = T.strstart + T.lookahead - S, U = o._tr_tally(T, T.strstart - 1 - T.prev_match, T.prev_length - S), T.lookahead -= T.prev_length - 1, T.prev_length -= 2; ++T.strstart <= k && (T.ins_h = (T.ins_h << T.hash_shift ^ T.window[T.strstart + S - 1]) & T.hash_mask, V = T.prev[T.strstart & T.w_mask] = T.head[T.ins_h], T.head[T.ins_h] = T.strstart), --T.prev_length != 0; ) ; + if (T.match_available = 0, T.match_length = S - 1, T.strstart++, U && ($(T, !1), T.strm.avail_out === 0)) return w; + } else if (T.match_available) { + if ((U = o._tr_tally(T, 0, T.window[T.strstart - 1])) && $(T, !1), T.strstart++, T.lookahead--, T.strm.avail_out === 0) return w; + } else T.match_available = 1, T.strstart++, T.lookahead--; } - return C.match_available && (U = o._tr_tally(C, 0, C.window[C.strstart - 1]), C.match_available = 0), C.insert = C.strstart < S - 1 ? C.strstart : S - 1, N === p ? ($(C, !0), C.strm.avail_out === 0 ? G : j) : C.last_lit && ($(C, !1), C.strm.avail_out === 0) ? w : z; + return T.match_available && (U = o._tr_tally(T, 0, T.window[T.strstart - 1]), T.match_available = 0), T.insert = T.strstart < S - 1 ? T.strstart : S - 1, N === p ? ($(T, !0), T.strm.avail_out === 0 ? G : j) : T.last_lit && ($(T, !1), T.strm.avail_out === 0) ? w : z; } - function ye(C, N, V, U, k) { - this.good_length = C, this.max_lazy = N, this.nice_length = V, this.max_chain = U, this.func = k; + function be(T, N, V, U, k) { + this.good_length = T, this.max_lazy = N, this.nice_length = V, this.max_chain = U, this.func = k; } function Se() { - this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = y, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new a.Buf16(2 * T), this.dyn_dtree = new a.Buf16(2 * (2 * _ + 1)), this.bl_tree = new a.Buf16(2 * (2 * M + 1)), ie(this.dyn_ltree), ie(this.dyn_dtree), ie(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new a.Buf16(R + 1), this.heap = new a.Buf16(2 * b + 1), ie(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new a.Buf16(2 * b + 1), ie(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0; + this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = b, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new a.Buf16(2 * C), this.dyn_dtree = new a.Buf16(2 * (2 * _ + 1)), this.bl_tree = new a.Buf16(2 * (2 * M + 1)), ie(this.dyn_ltree), ie(this.dyn_dtree), ie(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new a.Buf16(R + 1), this.heap = new a.Buf16(2 * y + 1), ie(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new a.Buf16(2 * y + 1), ie(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0; } - function Be(C) { + function Be(T) { var N; - return C && C.state ? (C.total_in = C.total_out = 0, C.data_type = g, (N = C.state).pending = 0, N.pending_out = 0, N.wrap < 0 && (N.wrap = -N.wrap), N.status = N.wrap ? A : I, C.adler = N.wrap === 2 ? 0 : 1, N.last_flush = u, o._tr_init(N), d) : Y(C, m); + return T && T.state ? (T.total_in = T.total_out = 0, T.data_type = g, (N = T.state).pending = 0, N.pending_out = 0, N.wrap < 0 && (N.wrap = -N.wrap), N.status = N.wrap ? A : I, T.adler = N.wrap === 2 ? 0 : 1, N.last_flush = u, o._tr_init(N), d) : Y(T, m); } - function $e(C) { - var N = Be(C); + function $e(T) { + var N = Be(T); return N === d && (function(V) { V.window_size = 2 * V.w_size, ie(V.head), V.max_lazy_match = r[V.level].max_lazy, V.good_match = r[V.level].good_length, V.nice_match = r[V.level].nice_length, V.max_chain_length = r[V.level].max_chain, V.strstart = 0, V.block_start = 0, V.lookahead = 0, V.insert = 0, V.match_length = V.prev_length = S - 1, V.match_available = 0, V.ins_h = 0; - })(C.state), N; + })(T.state), N; } - function ke(C, N, V, U, k, F) { - if (!C) return m; + function ke(T, N, V, U, k, F) { + if (!T) return m; var ee = 1; - if (N === f && (N = 6), U < 0 ? (ee = 0, U = -U) : 15 < U && (ee = 2, U -= 16), k < 1 || v < k || V !== y || U < 8 || 15 < U || N < 0 || 9 < N || F < 0 || x < F) return Y(C, m); + if (N === f && (N = 6), U < 0 ? (ee = 0, U = -U) : 15 < U && (ee = 2, U -= 16), k < 1 || v < k || V !== b || U < 8 || 15 < U || N < 0 || 9 < N || F < 0 || x < F) return Y(T, m); U === 8 && (U = 9); var J = new Se(); - return (C.state = J).strm = C, J.wrap = ee, J.gzhead = null, J.w_bits = U, J.w_size = 1 << J.w_bits, J.w_mask = J.w_size - 1, J.hash_bits = k + 7, J.hash_size = 1 << J.hash_bits, J.hash_mask = J.hash_size - 1, J.hash_shift = ~~((J.hash_bits + S - 1) / S), J.window = new a.Buf8(2 * J.w_size), J.head = new a.Buf16(J.hash_size), J.prev = new a.Buf16(J.w_size), J.lit_bufsize = 1 << k + 6, J.pending_buf_size = 4 * J.lit_bufsize, J.pending_buf = new a.Buf8(J.pending_buf_size), J.d_buf = 1 * J.lit_bufsize, J.l_buf = 3 * J.lit_bufsize, J.level = N, J.strategy = F, J.method = V, $e(C); + return (T.state = J).strm = T, J.wrap = ee, J.gzhead = null, J.w_bits = U, J.w_size = 1 << J.w_bits, J.w_mask = J.w_size - 1, J.hash_bits = k + 7, J.hash_size = 1 << J.hash_bits, J.hash_mask = J.hash_size - 1, J.hash_shift = ~~((J.hash_bits + S - 1) / S), J.window = new a.Buf8(2 * J.w_size), J.head = new a.Buf16(J.hash_size), J.prev = new a.Buf16(J.w_size), J.lit_bufsize = 1 << k + 6, J.pending_buf_size = 4 * J.lit_bufsize, J.pending_buf = new a.Buf8(J.pending_buf_size), J.d_buf = 1 * J.lit_bufsize, J.l_buf = 3 * J.lit_bufsize, J.level = N, J.strategy = F, J.method = V, $e(T); } - r = [new ye(0, 0, 0, 0, function(C, N) { + r = [new be(0, 0, 0, 0, function(T, N) { var V = 65535; - for (V > C.pending_buf_size - 5 && (V = C.pending_buf_size - 5); ; ) { - if (C.lookahead <= 1) { - if (se(C), C.lookahead === 0 && N === u) return w; - if (C.lookahead === 0) break; + for (V > T.pending_buf_size - 5 && (V = T.pending_buf_size - 5); ; ) { + if (T.lookahead <= 1) { + if (se(T), T.lookahead === 0 && N === u) return w; + if (T.lookahead === 0) break; } - C.strstart += C.lookahead, C.lookahead = 0; - var U = C.block_start + V; - if ((C.strstart === 0 || C.strstart >= U) && (C.lookahead = C.strstart - U, C.strstart = U, $(C, !1), C.strm.avail_out === 0) || C.strstart - C.block_start >= C.w_size - L && ($(C, !1), C.strm.avail_out === 0)) return w; + T.strstart += T.lookahead, T.lookahead = 0; + var U = T.block_start + V; + if ((T.strstart === 0 || T.strstart >= U) && (T.lookahead = T.strstart - U, T.strstart = U, $(T, !1), T.strm.avail_out === 0) || T.strstart - T.block_start >= T.w_size - L && ($(T, !1), T.strm.avail_out === 0)) return w; } - return C.insert = 0, N === p ? ($(C, !0), C.strm.avail_out === 0 ? G : j) : (C.strstart > C.block_start && ($(C, !1), C.strm.avail_out), w); - }), new ye(4, 4, 8, 4, ce), new ye(4, 5, 16, 8, ce), new ye(4, 6, 32, 32, ce), new ye(4, 4, 16, 16, pe), new ye(8, 16, 32, 32, pe), new ye(8, 16, 128, 128, pe), new ye(8, 32, 128, 256, pe), new ye(32, 128, 258, 1024, pe), new ye(32, 258, 258, 4096, pe)], i.deflateInit = function(C, N) { - return ke(C, N, y, 15, 8, 0); - }, i.deflateInit2 = ke, i.deflateReset = $e, i.deflateResetKeep = Be, i.deflateSetHeader = function(C, N) { - return C && C.state ? C.state.wrap !== 2 ? m : (C.state.gzhead = N, d) : m; - }, i.deflate = function(C, N) { + return T.insert = 0, N === p ? ($(T, !0), T.strm.avail_out === 0 ? G : j) : (T.strstart > T.block_start && ($(T, !1), T.strm.avail_out), w); + }), new be(4, 4, 8, 4, ce), new be(4, 5, 16, 8, ce), new be(4, 6, 32, 32, ce), new be(4, 4, 16, 16, pe), new be(8, 16, 32, 32, pe), new be(8, 16, 128, 128, pe), new be(8, 32, 128, 256, pe), new be(32, 128, 258, 1024, pe), new be(32, 258, 258, 4096, pe)], i.deflateInit = function(T, N) { + return ke(T, N, b, 15, 8, 0); + }, i.deflateInit2 = ke, i.deflateReset = $e, i.deflateResetKeep = Be, i.deflateSetHeader = function(T, N) { + return T && T.state ? T.state.wrap !== 2 ? m : (T.state.gzhead = N, d) : m; + }, i.deflate = function(T, N) { var V, U, k, F; - if (!C || !C.state || 5 < N || N < 0) return C ? Y(C, m) : m; - if (U = C.state, !C.output || !C.input && C.avail_in !== 0 || U.status === 666 && N !== p) return Y(C, C.avail_out === 0 ? -5 : m); - if (U.strm = C, V = U.last_flush, U.last_flush = N, U.status === A) if (U.wrap === 2) C.adler = 0, fe(U, 31), fe(U, 139), fe(U, 8), U.gzhead ? (fe(U, (U.gzhead.text ? 1 : 0) + (U.gzhead.hcrc ? 2 : 0) + (U.gzhead.extra ? 4 : 0) + (U.gzhead.name ? 8 : 0) + (U.gzhead.comment ? 16 : 0)), fe(U, 255 & U.gzhead.time), fe(U, U.gzhead.time >> 8 & 255), fe(U, U.gzhead.time >> 16 & 255), fe(U, U.gzhead.time >> 24 & 255), fe(U, U.level === 9 ? 2 : 2 <= U.strategy || U.level < 2 ? 4 : 0), fe(U, 255 & U.gzhead.os), U.gzhead.extra && U.gzhead.extra.length && (fe(U, 255 & U.gzhead.extra.length), fe(U, U.gzhead.extra.length >> 8 & 255)), U.gzhead.hcrc && (C.adler = c(C.adler, U.pending_buf, U.pending, 0)), U.gzindex = 0, U.status = 69) : (fe(U, 0), fe(U, 0), fe(U, 0), fe(U, 0), fe(U, 0), fe(U, U.level === 9 ? 2 : 2 <= U.strategy || U.level < 2 ? 4 : 0), fe(U, 3), U.status = I); + if (!T || !T.state || 5 < N || N < 0) return T ? Y(T, m) : m; + if (U = T.state, !T.output || !T.input && T.avail_in !== 0 || U.status === 666 && N !== p) return Y(T, T.avail_out === 0 ? -5 : m); + if (U.strm = T, V = U.last_flush, U.last_flush = N, U.status === A) if (U.wrap === 2) T.adler = 0, fe(U, 31), fe(U, 139), fe(U, 8), U.gzhead ? (fe(U, (U.gzhead.text ? 1 : 0) + (U.gzhead.hcrc ? 2 : 0) + (U.gzhead.extra ? 4 : 0) + (U.gzhead.name ? 8 : 0) + (U.gzhead.comment ? 16 : 0)), fe(U, 255 & U.gzhead.time), fe(U, U.gzhead.time >> 8 & 255), fe(U, U.gzhead.time >> 16 & 255), fe(U, U.gzhead.time >> 24 & 255), fe(U, U.level === 9 ? 2 : 2 <= U.strategy || U.level < 2 ? 4 : 0), fe(U, 255 & U.gzhead.os), U.gzhead.extra && U.gzhead.extra.length && (fe(U, 255 & U.gzhead.extra.length), fe(U, U.gzhead.extra.length >> 8 & 255)), U.gzhead.hcrc && (T.adler = c(T.adler, U.pending_buf, U.pending, 0)), U.gzindex = 0, U.status = 69) : (fe(U, 0), fe(U, 0), fe(U, 0), fe(U, 0), fe(U, 0), fe(U, U.level === 9 ? 2 : 2 <= U.strategy || U.level < 2 ? 4 : 0), fe(U, 3), U.status = I); else { - var ee = y + (U.w_bits - 8 << 4) << 8; - ee |= (2 <= U.strategy || U.level < 2 ? 0 : U.level < 6 ? 1 : U.level === 6 ? 2 : 3) << 6, U.strstart !== 0 && (ee |= 32), ee += 31 - ee % 31, U.status = I, me(U, ee), U.strstart !== 0 && (me(U, C.adler >>> 16), me(U, 65535 & C.adler)), C.adler = 1; + var ee = b + (U.w_bits - 8 << 4) << 8; + ee |= (2 <= U.strategy || U.level < 2 ? 0 : U.level < 6 ? 1 : U.level === 6 ? 2 : 3) << 6, U.strstart !== 0 && (ee |= 32), ee += 31 - ee % 31, U.status = I, me(U, ee), U.strstart !== 0 && (me(U, T.adler >>> 16), me(U, 65535 & T.adler)), T.adler = 1; } if (U.status === 69) if (U.gzhead.extra) { - for (k = U.pending; U.gzindex < (65535 & U.gzhead.extra.length) && (U.pending !== U.pending_buf_size || (U.gzhead.hcrc && U.pending > k && (C.adler = c(C.adler, U.pending_buf, U.pending - k, k)), W(C), k = U.pending, U.pending !== U.pending_buf_size)); ) fe(U, 255 & U.gzhead.extra[U.gzindex]), U.gzindex++; - U.gzhead.hcrc && U.pending > k && (C.adler = c(C.adler, U.pending_buf, U.pending - k, k)), U.gzindex === U.gzhead.extra.length && (U.gzindex = 0, U.status = 73); + for (k = U.pending; U.gzindex < (65535 & U.gzhead.extra.length) && (U.pending !== U.pending_buf_size || (U.gzhead.hcrc && U.pending > k && (T.adler = c(T.adler, U.pending_buf, U.pending - k, k)), W(T), k = U.pending, U.pending !== U.pending_buf_size)); ) fe(U, 255 & U.gzhead.extra[U.gzindex]), U.gzindex++; + U.gzhead.hcrc && U.pending > k && (T.adler = c(T.adler, U.pending_buf, U.pending - k, k)), U.gzindex === U.gzhead.extra.length && (U.gzindex = 0, U.status = 73); } else U.status = 73; if (U.status === 73) if (U.gzhead.name) { k = U.pending; do { - if (U.pending === U.pending_buf_size && (U.gzhead.hcrc && U.pending > k && (C.adler = c(C.adler, U.pending_buf, U.pending - k, k)), W(C), k = U.pending, U.pending === U.pending_buf_size)) { + if (U.pending === U.pending_buf_size && (U.gzhead.hcrc && U.pending > k && (T.adler = c(T.adler, U.pending_buf, U.pending - k, k)), W(T), k = U.pending, U.pending === U.pending_buf_size)) { F = 1; break; } F = U.gzindex < U.gzhead.name.length ? 255 & U.gzhead.name.charCodeAt(U.gzindex++) : 0, fe(U, F); } while (F !== 0); - U.gzhead.hcrc && U.pending > k && (C.adler = c(C.adler, U.pending_buf, U.pending - k, k)), F === 0 && (U.gzindex = 0, U.status = 91); + U.gzhead.hcrc && U.pending > k && (T.adler = c(T.adler, U.pending_buf, U.pending - k, k)), F === 0 && (U.gzindex = 0, U.status = 91); } else U.status = 91; if (U.status === 91) if (U.gzhead.comment) { k = U.pending; do { - if (U.pending === U.pending_buf_size && (U.gzhead.hcrc && U.pending > k && (C.adler = c(C.adler, U.pending_buf, U.pending - k, k)), W(C), k = U.pending, U.pending === U.pending_buf_size)) { + if (U.pending === U.pending_buf_size && (U.gzhead.hcrc && U.pending > k && (T.adler = c(T.adler, U.pending_buf, U.pending - k, k)), W(T), k = U.pending, U.pending === U.pending_buf_size)) { F = 1; break; } F = U.gzindex < U.gzhead.comment.length ? 255 & U.gzhead.comment.charCodeAt(U.gzindex++) : 0, fe(U, F); } while (F !== 0); - U.gzhead.hcrc && U.pending > k && (C.adler = c(C.adler, U.pending_buf, U.pending - k, k)), F === 0 && (U.status = 103); + U.gzhead.hcrc && U.pending > k && (T.adler = c(T.adler, U.pending_buf, U.pending - k, k)), F === 0 && (U.status = 103); } else U.status = 103; - if (U.status === 103 && (U.gzhead.hcrc ? (U.pending + 2 > U.pending_buf_size && W(C), U.pending + 2 <= U.pending_buf_size && (fe(U, 255 & C.adler), fe(U, C.adler >> 8 & 255), C.adler = 0, U.status = I)) : U.status = I), U.pending !== 0) { - if (W(C), C.avail_out === 0) return U.last_flush = -1, d; - } else if (C.avail_in === 0 && q(N) <= q(V) && N !== p) return Y(C, -5); - if (U.status === 666 && C.avail_in !== 0) return Y(C, -5); - if (C.avail_in !== 0 || U.lookahead !== 0 || N !== u && U.status !== 666) { + if (U.status === 103 && (U.gzhead.hcrc ? (U.pending + 2 > U.pending_buf_size && W(T), U.pending + 2 <= U.pending_buf_size && (fe(U, 255 & T.adler), fe(U, T.adler >> 8 & 255), T.adler = 0, U.status = I)) : U.status = I), U.pending !== 0) { + if (W(T), T.avail_out === 0) return U.last_flush = -1, d; + } else if (T.avail_in === 0 && q(N) <= q(V) && N !== p) return Y(T, -5); + if (U.status === 666 && T.avail_in !== 0) return Y(T, -5); + if (T.avail_in !== 0 || U.lookahead !== 0 || N !== u && U.status !== 666) { var J = U.strategy === 2 ? (function(X, B) { for (var D; ; ) { if (X.lookahead === 0 && (se(X), X.lookahead === 0)) { @@ -33667,21 +33647,21 @@ function V_() { } return X.insert = 0, B === p ? ($(X, !0), X.strm.avail_out === 0 ? G : j) : X.last_lit && ($(X, !1), X.strm.avail_out === 0) ? w : z; })(U, N) : r[U.level].func(U, N); - if (J !== G && J !== j || (U.status = 666), J === w || J === G) return C.avail_out === 0 && (U.last_flush = -1), d; - if (J === z && (N === 1 ? o._tr_align(U) : N !== 5 && (o._tr_stored_block(U, 0, 0, !1), N === 3 && (ie(U.head), U.lookahead === 0 && (U.strstart = 0, U.block_start = 0, U.insert = 0))), W(C), C.avail_out === 0)) return U.last_flush = -1, d; + if (J !== G && J !== j || (U.status = 666), J === w || J === G) return T.avail_out === 0 && (U.last_flush = -1), d; + if (J === z && (N === 1 ? o._tr_align(U) : N !== 5 && (o._tr_stored_block(U, 0, 0, !1), N === 3 && (ie(U.head), U.lookahead === 0 && (U.strstart = 0, U.block_start = 0, U.insert = 0))), W(T), T.avail_out === 0)) return U.last_flush = -1, d; } - return N !== p ? d : U.wrap <= 0 ? 1 : (U.wrap === 2 ? (fe(U, 255 & C.adler), fe(U, C.adler >> 8 & 255), fe(U, C.adler >> 16 & 255), fe(U, C.adler >> 24 & 255), fe(U, 255 & C.total_in), fe(U, C.total_in >> 8 & 255), fe(U, C.total_in >> 16 & 255), fe(U, C.total_in >> 24 & 255)) : (me(U, C.adler >>> 16), me(U, 65535 & C.adler)), W(C), 0 < U.wrap && (U.wrap = -U.wrap), U.pending !== 0 ? d : 1); - }, i.deflateEnd = function(C) { + return N !== p ? d : U.wrap <= 0 ? 1 : (U.wrap === 2 ? (fe(U, 255 & T.adler), fe(U, T.adler >> 8 & 255), fe(U, T.adler >> 16 & 255), fe(U, T.adler >> 24 & 255), fe(U, 255 & T.total_in), fe(U, T.total_in >> 8 & 255), fe(U, T.total_in >> 16 & 255), fe(U, T.total_in >> 24 & 255)) : (me(U, T.adler >>> 16), me(U, 65535 & T.adler)), W(T), 0 < U.wrap && (U.wrap = -U.wrap), U.pending !== 0 ? d : 1); + }, i.deflateEnd = function(T) { var N; - return C && C.state ? (N = C.state.status) !== A && N !== 69 && N !== 73 && N !== 91 && N !== 103 && N !== I && N !== 666 ? Y(C, m) : (C.state = null, N === I ? Y(C, -3) : d) : m; - }, i.deflateSetDictionary = function(C, N) { + return T && T.state ? (N = T.state.status) !== A && N !== 69 && N !== 73 && N !== 91 && N !== 103 && N !== I && N !== 666 ? Y(T, m) : (T.state = null, N === I ? Y(T, -3) : d) : m; + }, i.deflateSetDictionary = function(T, N) { var V, U, k, F, ee, J, X, B, D = N.length; - if (!C || !C.state || (F = (V = C.state).wrap) === 2 || F === 1 && V.status !== A || V.lookahead) return m; - for (F === 1 && (C.adler = l(C.adler, N, D, 0)), V.wrap = 0, D >= V.w_size && (F === 0 && (ie(V.head), V.strstart = 0, V.block_start = 0, V.insert = 0), B = new a.Buf8(V.w_size), a.arraySet(B, N, D - V.w_size, V.w_size, 0), N = B, D = V.w_size), ee = C.avail_in, J = C.next_in, X = C.input, C.avail_in = D, C.next_in = 0, C.input = N, se(V); V.lookahead >= S; ) { + if (!T || !T.state || (F = (V = T.state).wrap) === 2 || F === 1 && V.status !== A || V.lookahead) return m; + for (F === 1 && (T.adler = l(T.adler, N, D, 0)), V.wrap = 0, D >= V.w_size && (F === 0 && (ie(V.head), V.strstart = 0, V.block_start = 0, V.insert = 0), B = new a.Buf8(V.w_size), a.arraySet(B, N, D - V.w_size, V.w_size, 0), N = B, D = V.w_size), ee = T.avail_in, J = T.next_in, X = T.input, T.avail_in = D, T.next_in = 0, T.input = N, se(V); V.lookahead >= S; ) { for (U = V.strstart, k = V.lookahead - (S - 1); V.ins_h = (V.ins_h << V.hash_shift ^ V.window[U + S - 1]) & V.hash_mask, V.prev[U & V.w_mask] = V.head[V.ins_h], V.head[V.ins_h] = U, U++, --k; ) ; V.strstart = U, V.lookahead = S - 1, se(V); } - return V.strstart += V.lookahead, V.block_start = V.strstart, V.insert = V.lookahead, V.lookahead = 0, V.match_length = V.prev_length = S - 1, V.match_available = 0, C.next_in = J, C.input = X, C.avail_in = ee, V.wrap = F, d; + return V.strstart += V.lookahead, V.block_start = V.strstart, V.insert = V.lookahead, V.lookahead = 0, V.match_length = V.prev_length = S - 1, V.match_available = 0, T.next_in = J, T.input = X, T.avail_in = ee, V.wrap = F, d; }, i.deflateInfo = "pako deflate (from Nodeca project)"; }, { "../utils/common": 41, "./adler32": 43, "./crc32": 45, "./messages": 51, "./trees": 52 }], 47: [function(t, n, i) { n.exports = function() { @@ -33689,16 +33669,16 @@ function V_() { }; }, {}], 48: [function(t, n, i) { n.exports = function(r, a) { - var o, l, c, h, u, p, d, m, f, x, g, y, v, b, _, M, T, R, S, E, L, A, I, w, z; - o = r.state, l = r.next_in, w = r.input, c = l + (r.avail_in - 5), h = r.next_out, z = r.output, u = h - (a - r.avail_out), p = h + (r.avail_out - 257), d = o.dmax, m = o.wsize, f = o.whave, x = o.wnext, g = o.window, y = o.hold, v = o.bits, b = o.lencode, _ = o.distcode, M = (1 << o.lenbits) - 1, T = (1 << o.distbits) - 1; + var o, l, c, h, u, p, d, m, f, x, g, b, v, y, _, M, C, R, S, E, L, A, I, w, z; + o = r.state, l = r.next_in, w = r.input, c = l + (r.avail_in - 5), h = r.next_out, z = r.output, u = h - (a - r.avail_out), p = h + (r.avail_out - 257), d = o.dmax, m = o.wsize, f = o.whave, x = o.wnext, g = o.window, b = o.hold, v = o.bits, y = o.lencode, _ = o.distcode, M = (1 << o.lenbits) - 1, C = (1 << o.distbits) - 1; e: do { - v < 15 && (y += w[l++] << v, v += 8, y += w[l++] << v, v += 8), R = b[y & M]; + v < 15 && (b += w[l++] << v, v += 8, b += w[l++] << v, v += 8), R = y[b & M]; t: for (; ; ) { - if (y >>>= S = R >>> 24, v -= S, (S = R >>> 16 & 255) === 0) z[h++] = 65535 & R; + if (b >>>= S = R >>> 24, v -= S, (S = R >>> 16 & 255) === 0) z[h++] = 65535 & R; else { if (!(16 & S)) { if ((64 & S) == 0) { - R = b[(65535 & R) + (y & (1 << S) - 1)]; + R = y[(65535 & R) + (b & (1 << S) - 1)]; continue t; } if (32 & S) { @@ -33708,21 +33688,21 @@ function V_() { r.msg = "invalid literal/length code", o.mode = 30; break e; } - E = 65535 & R, (S &= 15) && (v < S && (y += w[l++] << v, v += 8), E += y & (1 << S) - 1, y >>>= S, v -= S), v < 15 && (y += w[l++] << v, v += 8, y += w[l++] << v, v += 8), R = _[y & T]; + E = 65535 & R, (S &= 15) && (v < S && (b += w[l++] << v, v += 8), E += b & (1 << S) - 1, b >>>= S, v -= S), v < 15 && (b += w[l++] << v, v += 8, b += w[l++] << v, v += 8), R = _[b & C]; n: for (; ; ) { - if (y >>>= S = R >>> 24, v -= S, !(16 & (S = R >>> 16 & 255))) { + if (b >>>= S = R >>> 24, v -= S, !(16 & (S = R >>> 16 & 255))) { if ((64 & S) == 0) { - R = _[(65535 & R) + (y & (1 << S) - 1)]; + R = _[(65535 & R) + (b & (1 << S) - 1)]; continue n; } r.msg = "invalid distance code", o.mode = 30; break e; } - if (L = 65535 & R, v < (S &= 15) && (y += w[l++] << v, (v += 8) < S && (y += w[l++] << v, v += 8)), d < (L += y & (1 << S) - 1)) { + if (L = 65535 & R, v < (S &= 15) && (b += w[l++] << v, (v += 8) < S && (b += w[l++] << v, v += 8)), d < (L += b & (1 << S) - 1)) { r.msg = "invalid distance too far back", o.mode = 30; break e; } - if (y >>>= S, v -= S, (S = h - u) < L) { + if (b >>>= S, v -= S, (S = h - u) < L) { if (f < (S = L - S) && o.sane) { r.msg = "invalid distance too far back", o.mode = 30; break e; @@ -33756,53 +33736,53 @@ function V_() { break; } } while (l < c && h < p); - l -= E = v >> 3, y &= (1 << (v -= E << 3)) - 1, r.next_in = l, r.next_out = h, r.avail_in = l < c ? c - l + 5 : 5 - (l - c), r.avail_out = h < p ? p - h + 257 : 257 - (h - p), o.hold = y, o.bits = v; + l -= E = v >> 3, b &= (1 << (v -= E << 3)) - 1, r.next_in = l, r.next_out = h, r.avail_in = l < c ? c - l + 5 : 5 - (l - c), r.avail_out = h < p ? p - h + 257 : 257 - (h - p), o.hold = b, o.bits = v; }; }, {}], 49: [function(t, n, i) { var r = t("../utils/common"), a = t("./adler32"), o = t("./crc32"), l = t("./inffast"), c = t("./inftrees"), h = 1, u = 2, p = 0, d = -2, m = 1, f = 852, x = 592; function g(A) { return (A >>> 24 & 255) + (A >>> 8 & 65280) + ((65280 & A) << 8) + ((255 & A) << 24); } - function y() { + function b() { this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new r.Buf16(320), this.work = new r.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0; } function v(A) { var I; return A && A.state ? (I = A.state, A.total_in = A.total_out = I.total = 0, A.msg = "", I.wrap && (A.adler = 1 & I.wrap), I.mode = m, I.last = 0, I.havedict = 0, I.dmax = 32768, I.head = null, I.hold = 0, I.bits = 0, I.lencode = I.lendyn = new r.Buf32(f), I.distcode = I.distdyn = new r.Buf32(x), I.sane = 1, I.back = -1, p) : d; } - function b(A) { + function y(A) { var I; return A && A.state ? ((I = A.state).wsize = 0, I.whave = 0, I.wnext = 0, v(A)) : d; } function _(A, I) { var w, z; - return A && A.state ? (z = A.state, I < 0 ? (w = 0, I = -I) : (w = 1 + (I >> 4), I < 48 && (I &= 15)), I && (I < 8 || 15 < I) ? d : (z.window !== null && z.wbits !== I && (z.window = null), z.wrap = w, z.wbits = I, b(A))) : d; + return A && A.state ? (z = A.state, I < 0 ? (w = 0, I = -I) : (w = 1 + (I >> 4), I < 48 && (I &= 15)), I && (I < 8 || 15 < I) ? d : (z.window !== null && z.wbits !== I && (z.window = null), z.wrap = w, z.wbits = I, y(A))) : d; } function M(A, I) { var w, z; - return A ? (z = new y(), (A.state = z).window = null, (w = _(A, I)) !== p && (A.state = null), w) : d; + return A ? (z = new b(), (A.state = z).window = null, (w = _(A, I)) !== p && (A.state = null), w) : d; } - var T, R, S = !0; + var C, R, S = !0; function E(A) { if (S) { var I; - for (T = new r.Buf32(512), R = new r.Buf32(32), I = 0; I < 144; ) A.lens[I++] = 8; + for (C = new r.Buf32(512), R = new r.Buf32(32), I = 0; I < 144; ) A.lens[I++] = 8; for (; I < 256; ) A.lens[I++] = 9; for (; I < 280; ) A.lens[I++] = 7; for (; I < 288; ) A.lens[I++] = 8; - for (c(h, A.lens, 0, 288, T, 0, A.work, { bits: 9 }), I = 0; I < 32; ) A.lens[I++] = 5; + for (c(h, A.lens, 0, 288, C, 0, A.work, { bits: 9 }), I = 0; I < 32; ) A.lens[I++] = 5; c(u, A.lens, 0, 32, R, 0, A.work, { bits: 5 }), S = !1; } - A.lencode = T, A.lenbits = 9, A.distcode = R, A.distbits = 5; + A.lencode = C, A.lenbits = 9, A.distcode = R, A.distbits = 5; } function L(A, I, w, z) { var G, j = A.state; return j.window === null && (j.wsize = 1 << j.wbits, j.wnext = 0, j.whave = 0, j.window = new r.Buf8(j.wsize)), z >= j.wsize ? (r.arraySet(j.window, I, w - j.wsize, j.wsize, 0), j.wnext = 0, j.whave = j.wsize) : (z < (G = j.wsize - j.wnext) && (G = z), r.arraySet(j.window, I, w - z, G, j.wnext), (z -= G) ? (r.arraySet(j.window, I, w - z, z, 0), j.wnext = z, j.whave = j.wsize) : (j.wnext += G, j.wnext === j.wsize && (j.wnext = 0), j.whave < j.wsize && (j.whave += G))), 0; } - i.inflateReset = b, i.inflateReset2 = _, i.inflateResetKeep = v, i.inflateInit = function(A) { + i.inflateReset = y, i.inflateReset2 = _, i.inflateResetKeep = v, i.inflateInit = function(A) { return M(A, 15); }, i.inflateInit2 = M, i.inflate = function(A, I) { - var w, z, G, j, Y, q, ie, W, $, fe, me, de, se, ce, pe, ye, Se, Be, $e, ke, C, N, V, U, k = 0, F = new r.Buf8(4), ee = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; + var w, z, G, j, Y, q, ie, W, $, fe, me, de, se, ce, pe, be, Se, Be, $e, ke, T, N, V, U, k = 0, F = new r.Buf8(4), ee = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; if (!A || !A.state || !A.output || !A.input && A.avail_in !== 0) return d; (w = A.state).mode === 12 && (w.mode = 13), Y = A.next_out, G = A.output, ie = A.avail_out, j = A.next_in, z = A.input, q = A.avail_in, W = w.hold, $ = w.bits, fe = q, me = ie, N = p; e: for (; ; ) switch (w.mode) { @@ -33827,12 +33807,12 @@ function V_() { A.msg = "unknown compression method", w.mode = 30; break; } - if ($ -= 4, C = 8 + (15 & (W >>>= 4)), w.wbits === 0) w.wbits = C; - else if (C > w.wbits) { + if ($ -= 4, T = 8 + (15 & (W >>>= 4)), w.wbits === 0) w.wbits = T; + else if (T > w.wbits) { A.msg = "invalid window size", w.mode = 30; break; } - w.dmax = 1 << C, A.adler = w.check = 1, w.mode = 512 & W ? 10 : 12, $ = W = 0; + w.dmax = 1 << T, A.adler = w.check = 1, w.mode = 512 & W ? 10 : 12, $ = W = 0; break; case 2: for (; $ < 16; ) { @@ -33870,20 +33850,20 @@ function V_() { } else w.head && (w.head.extra = null); w.mode = 6; case 6: - if (1024 & w.flags && (q < (de = w.length) && (de = q), de && (w.head && (C = w.head.extra_len - w.length, w.head.extra || (w.head.extra = new Array(w.head.extra_len)), r.arraySet(w.head.extra, z, j, de, C)), 512 & w.flags && (w.check = o(w.check, z, de, j)), q -= de, j += de, w.length -= de), w.length)) break e; + if (1024 & w.flags && (q < (de = w.length) && (de = q), de && (w.head && (T = w.head.extra_len - w.length, w.head.extra || (w.head.extra = new Array(w.head.extra_len)), r.arraySet(w.head.extra, z, j, de, T)), 512 & w.flags && (w.check = o(w.check, z, de, j)), q -= de, j += de, w.length -= de), w.length)) break e; w.length = 0, w.mode = 7; case 7: if (2048 & w.flags) { if (q === 0) break e; - for (de = 0; C = z[j + de++], w.head && C && w.length < 65536 && (w.head.name += String.fromCharCode(C)), C && de < q; ) ; - if (512 & w.flags && (w.check = o(w.check, z, de, j)), q -= de, j += de, C) break e; + for (de = 0; T = z[j + de++], w.head && T && w.length < 65536 && (w.head.name += String.fromCharCode(T)), T && de < q; ) ; + if (512 & w.flags && (w.check = o(w.check, z, de, j)), q -= de, j += de, T) break e; } else w.head && (w.head.name = null); w.length = 0, w.mode = 8; case 8: if (4096 & w.flags) { if (q === 0) break e; - for (de = 0; C = z[j + de++], w.head && C && w.length < 65536 && (w.head.comment += String.fromCharCode(C)), C && de < q; ) ; - if (512 & w.flags && (w.check = o(w.check, z, de, j)), q -= de, j += de, C) break e; + for (de = 0; T = z[j + de++], w.head && T && w.length < 65536 && (w.head.comment += String.fromCharCode(T)), T && de < q; ) ; + if (512 & w.flags && (w.check = o(w.check, z, de, j)), q -= de, j += de, T) break e; } else w.head && (w.head.comment = null); w.mode = 9; case 9: @@ -33982,7 +33962,7 @@ function V_() { w.have = 0, w.mode = 19; case 19: for (; w.have < w.nlen + w.ndist; ) { - for (; ye = (k = w.lencode[W & (1 << w.lenbits) - 1]) >>> 16 & 255, Se = 65535 & k, !((pe = k >>> 24) <= $); ) { + for (; be = (k = w.lencode[W & (1 << w.lenbits) - 1]) >>> 16 & 255, Se = 65535 & k, !((pe = k >>> 24) <= $); ) { if (q === 0) break e; q--, W += z[j++] << $, $ += 8; } @@ -33997,25 +33977,25 @@ function V_() { A.msg = "invalid bit length repeat", w.mode = 30; break; } - C = w.lens[w.have - 1], de = 3 + (3 & W), W >>>= 2, $ -= 2; + T = w.lens[w.have - 1], de = 3 + (3 & W), W >>>= 2, $ -= 2; } else if (Se === 17) { for (U = pe + 3; $ < U; ) { if (q === 0) break e; q--, W += z[j++] << $, $ += 8; } - $ -= pe, C = 0, de = 3 + (7 & (W >>>= pe)), W >>>= 3, $ -= 3; + $ -= pe, T = 0, de = 3 + (7 & (W >>>= pe)), W >>>= 3, $ -= 3; } else { for (U = pe + 7; $ < U; ) { if (q === 0) break e; q--, W += z[j++] << $, $ += 8; } - $ -= pe, C = 0, de = 11 + (127 & (W >>>= pe)), W >>>= 7, $ -= 7; + $ -= pe, T = 0, de = 11 + (127 & (W >>>= pe)), W >>>= 7, $ -= 7; } if (w.have + de > w.nlen + w.ndist) { A.msg = "invalid bit length repeat", w.mode = 30; break; } - for (; de--; ) w.lens[w.have++] = C; + for (; de--; ) w.lens[w.have++] = T; } } if (w.mode === 30) break; @@ -34039,30 +34019,30 @@ function V_() { A.next_out = Y, A.avail_out = ie, A.next_in = j, A.avail_in = q, w.hold = W, w.bits = $, l(A, me), Y = A.next_out, G = A.output, ie = A.avail_out, j = A.next_in, z = A.input, q = A.avail_in, W = w.hold, $ = w.bits, w.mode === 12 && (w.back = -1); break; } - for (w.back = 0; ye = (k = w.lencode[W & (1 << w.lenbits) - 1]) >>> 16 & 255, Se = 65535 & k, !((pe = k >>> 24) <= $); ) { + for (w.back = 0; be = (k = w.lencode[W & (1 << w.lenbits) - 1]) >>> 16 & 255, Se = 65535 & k, !((pe = k >>> 24) <= $); ) { if (q === 0) break e; q--, W += z[j++] << $, $ += 8; } - if (ye && (240 & ye) == 0) { - for (Be = pe, $e = ye, ke = Se; ye = (k = w.lencode[ke + ((W & (1 << Be + $e) - 1) >> Be)]) >>> 16 & 255, Se = 65535 & k, !(Be + (pe = k >>> 24) <= $); ) { + if (be && (240 & be) == 0) { + for (Be = pe, $e = be, ke = Se; be = (k = w.lencode[ke + ((W & (1 << Be + $e) - 1) >> Be)]) >>> 16 & 255, Se = 65535 & k, !(Be + (pe = k >>> 24) <= $); ) { if (q === 0) break e; q--, W += z[j++] << $, $ += 8; } W >>>= Be, $ -= Be, w.back += Be; } - if (W >>>= pe, $ -= pe, w.back += pe, w.length = Se, ye === 0) { + if (W >>>= pe, $ -= pe, w.back += pe, w.length = Se, be === 0) { w.mode = 26; break; } - if (32 & ye) { + if (32 & be) { w.back = -1, w.mode = 12; break; } - if (64 & ye) { + if (64 & be) { A.msg = "invalid literal/length code", w.mode = 30; break; } - w.extra = 15 & ye, w.mode = 22; + w.extra = 15 & be, w.mode = 22; case 22: if (w.extra) { for (U = w.extra; $ < U; ) { @@ -34073,22 +34053,22 @@ function V_() { } w.was = w.length, w.mode = 23; case 23: - for (; ye = (k = w.distcode[W & (1 << w.distbits) - 1]) >>> 16 & 255, Se = 65535 & k, !((pe = k >>> 24) <= $); ) { + for (; be = (k = w.distcode[W & (1 << w.distbits) - 1]) >>> 16 & 255, Se = 65535 & k, !((pe = k >>> 24) <= $); ) { if (q === 0) break e; q--, W += z[j++] << $, $ += 8; } - if ((240 & ye) == 0) { - for (Be = pe, $e = ye, ke = Se; ye = (k = w.distcode[ke + ((W & (1 << Be + $e) - 1) >> Be)]) >>> 16 & 255, Se = 65535 & k, !(Be + (pe = k >>> 24) <= $); ) { + if ((240 & be) == 0) { + for (Be = pe, $e = be, ke = Se; be = (k = w.distcode[ke + ((W & (1 << Be + $e) - 1) >> Be)]) >>> 16 & 255, Se = 65535 & k, !(Be + (pe = k >>> 24) <= $); ) { if (q === 0) break e; q--, W += z[j++] << $, $ += 8; } W >>>= Be, $ -= Be, w.back += Be; } - if (W >>>= pe, $ -= pe, w.back += pe, 64 & ye) { + if (W >>>= pe, $ -= pe, w.back += pe, 64 & be) { A.msg = "invalid distance code", w.mode = 30; break; } - w.offset = Se, w.extra = 15 & ye, w.mode = 24; + w.offset = Se, w.extra = 15 & be, w.mode = 24; case 24: if (w.extra) { for (U = w.extra; $ < U; ) { @@ -34171,7 +34151,7 @@ function V_() { }, { "../utils/common": 41, "./adler32": 43, "./crc32": 45, "./inffast": 48, "./inftrees": 50 }], 50: [function(t, n, i) { var r = t("../utils/common"), a = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], o = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], l = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], c = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64]; n.exports = function(h, u, p, d, m, f, x, g) { - var y, v, b, _, M, T, R, S, E, L = g.bits, A = 0, I = 0, w = 0, z = 0, G = 0, j = 0, Y = 0, q = 0, ie = 0, W = 0, $ = null, fe = 0, me = new r.Buf16(16), de = new r.Buf16(16), se = null, ce = 0; + var b, v, y, _, M, C, R, S, E, L = g.bits, A = 0, I = 0, w = 0, z = 0, G = 0, j = 0, Y = 0, q = 0, ie = 0, W = 0, $ = null, fe = 0, me = new r.Buf16(16), de = new r.Buf16(16), se = null, ce = 0; for (A = 0; A <= 15; A++) me[A] = 0; for (I = 0; I < d; I++) me[u[p + I]]++; for (G = L, z = 15; 1 <= z && me[z] === 0; z--) ; @@ -34181,18 +34161,18 @@ function V_() { if (0 < q && (h === 0 || z !== 1)) return -1; for (de[1] = 0, A = 1; A < 15; A++) de[A + 1] = de[A] + me[A]; for (I = 0; I < d; I++) u[p + I] !== 0 && (x[de[u[p + I]]++] = I); - if (T = h === 0 ? ($ = se = x, 19) : h === 1 ? ($ = a, fe -= 257, se = o, ce -= 257, 256) : ($ = l, se = c, -1), A = w, M = f, Y = I = W = 0, b = -1, _ = (ie = 1 << (j = G)) - 1, h === 1 && 852 < ie || h === 2 && 592 < ie) return 1; + if (C = h === 0 ? ($ = se = x, 19) : h === 1 ? ($ = a, fe -= 257, se = o, ce -= 257, 256) : ($ = l, se = c, -1), A = w, M = f, Y = I = W = 0, y = -1, _ = (ie = 1 << (j = G)) - 1, h === 1 && 852 < ie || h === 2 && 592 < ie) return 1; for (; ; ) { - for (R = A - Y, E = x[I] < T ? (S = 0, x[I]) : x[I] > T ? (S = se[ce + x[I]], $[fe + x[I]]) : (S = 96, 0), y = 1 << A - Y, w = v = 1 << j; m[M + (W >> Y) + (v -= y)] = R << 24 | S << 16 | E | 0, v !== 0; ) ; - for (y = 1 << A - 1; W & y; ) y >>= 1; - if (y !== 0 ? (W &= y - 1, W += y) : W = 0, I++, --me[A] == 0) { + for (R = A - Y, E = x[I] < C ? (S = 0, x[I]) : x[I] > C ? (S = se[ce + x[I]], $[fe + x[I]]) : (S = 96, 0), b = 1 << A - Y, w = v = 1 << j; m[M + (W >> Y) + (v -= b)] = R << 24 | S << 16 | E | 0, v !== 0; ) ; + for (b = 1 << A - 1; W & b; ) b >>= 1; + if (b !== 0 ? (W &= b - 1, W += b) : W = 0, I++, --me[A] == 0) { if (A === z) break; A = u[p + x[I]]; } - if (G < A && (W & _) !== b) { + if (G < A && (W & _) !== y) { for (Y === 0 && (Y = G), M += w, q = 1 << (j = A - Y); j + Y < z && !((q -= me[j + Y]) <= 0); ) j++, q <<= 1; if (ie += 1 << j, h === 1 && 852 < ie || h === 2 && 592 < ie) return 1; - m[b = W & _] = G << 24 | j << 16 | M - f | 0; + m[y = W & _] = G << 24 | j << 16 | M - f | 0; } } return W !== 0 && (m[M + W] = A - Y << 24 | 64 << 16 | 0), g.bits = G, 0; @@ -34204,7 +34184,7 @@ function V_() { function l(k) { for (var F = k.length; 0 <= --F; ) k[F] = 0; } - var c = 0, h = 29, u = 256, p = u + 1 + h, d = 30, m = 19, f = 2 * p + 1, x = 15, g = 16, y = 7, v = 256, b = 16, _ = 17, M = 18, T = [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], R = [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], S = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], E = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], L = new Array(2 * (p + 2)); + var c = 0, h = 29, u = 256, p = u + 1 + h, d = 30, m = 19, f = 2 * p + 1, x = 15, g = 16, b = 7, v = 256, y = 16, _ = 17, M = 18, C = [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], R = [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], S = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], E = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], L = new Array(2 * (p + 2)); l(L); var A = new Array(2 * d); l(A); @@ -34252,7 +34232,7 @@ function V_() { for (F = 0; F < m; F++) k.bl_tree[2 * F] = 0; k.dyn_ltree[2 * v] = 1, k.opt_len = k.static_len = 0, k.last_lit = k.matches = 0; } - function ye(k) { + function be(k) { 8 < k.bi_valid ? fe(k, k.bi_buf) : 0 < k.bi_valid && (k.pending_buf[k.pending++] = k.bi_buf), k.bi_buf = 0, k.bi_valid = 0; } function Se(k, F, ee, J) { @@ -34265,7 +34245,7 @@ function V_() { } function $e(k, F, ee) { var J, X, B, D, H = 0; - if (k.last_lit !== 0) for (; J = k.pending_buf[k.d_buf + 2 * H] << 8 | k.pending_buf[k.d_buf + 2 * H + 1], X = k.pending_buf[k.l_buf + H], H++, J === 0 ? de(k, X, F) : (de(k, (B = w[X]) + u + 1, F), (D = T[B]) !== 0 && me(k, X -= z[B], D), de(k, B = $(--J), ee), (D = R[B]) !== 0 && me(k, J -= q[B], D)), H < k.last_lit; ) ; + if (k.last_lit !== 0) for (; J = k.pending_buf[k.d_buf + 2 * H] << 8 | k.pending_buf[k.d_buf + 2 * H + 1], X = k.pending_buf[k.l_buf + H], H++, J === 0 ? de(k, X, F) : (de(k, (B = w[X]) + u + 1, F), (D = C[B]) !== 0 && me(k, X -= z[B], D), de(k, B = $(--J), ee), (D = R[B]) !== 0 && me(k, J -= q[B], D)), H < k.last_lit; ) ; de(k, v, F); } function ke(k, F) { @@ -34274,28 +34254,28 @@ function V_() { for (; k.heap_len < 2; ) B[2 * (X = k.heap[++k.heap_len] = le < 2 ? ++le : 0)] = 1, k.depth[X] = 0, k.opt_len--, H && (k.static_len -= D[2 * X + 1]); for (F.max_code = le, ee = k.heap_len >> 1; 1 <= ee; ee--) Be(k, B, ee); for (X = K; ee = k.heap[1], k.heap[1] = k.heap[k.heap_len--], Be(k, B, 1), J = k.heap[1], k.heap[--k.heap_max] = ee, k.heap[--k.heap_max] = J, B[2 * X] = B[2 * ee] + B[2 * J], k.depth[X] = (k.depth[ee] >= k.depth[J] ? k.depth[ee] : k.depth[J]) + 1, B[2 * ee + 1] = B[2 * J + 1] = X, k.heap[1] = X++, Be(k, B, 1), 2 <= k.heap_len; ) ; - k.heap[--k.heap_max] = k.heap[1], (function(te, Ce) { - var be, Re, Ie, ue, _e, Ve, Ue = Ce.dyn_tree, Ae = Ce.max_code, Ge = Ce.stat_desc.static_tree, Z = Ce.stat_desc.has_stree, Te = Ce.stat_desc.extra_bits, Me = Ce.stat_desc.extra_base, we = Ce.stat_desc.max_length, ve = 0; + k.heap[--k.heap_max] = k.heap[1], (function(te, Te) { + var ye, Re, Ie, ue, _e, Ve, Ue = Te.dyn_tree, Ae = Te.max_code, Ge = Te.stat_desc.static_tree, Z = Te.stat_desc.has_stree, Ce = Te.stat_desc.extra_bits, Me = Te.stat_desc.extra_base, we = Te.stat_desc.max_length, ve = 0; for (ue = 0; ue <= x; ue++) te.bl_count[ue] = 0; - for (Ue[2 * te.heap[te.heap_max] + 1] = 0, be = te.heap_max + 1; be < f; be++) we < (ue = Ue[2 * Ue[2 * (Re = te.heap[be]) + 1] + 1] + 1) && (ue = we, ve++), Ue[2 * Re + 1] = ue, Ae < Re || (te.bl_count[ue]++, _e = 0, Me <= Re && (_e = Te[Re - Me]), Ve = Ue[2 * Re], te.opt_len += Ve * (ue + _e), Z && (te.static_len += Ve * (Ge[2 * Re + 1] + _e))); + for (Ue[2 * te.heap[te.heap_max] + 1] = 0, ye = te.heap_max + 1; ye < f; ye++) we < (ue = Ue[2 * Ue[2 * (Re = te.heap[ye]) + 1] + 1] + 1) && (ue = we, ve++), Ue[2 * Re + 1] = ue, Ae < Re || (te.bl_count[ue]++, _e = 0, Me <= Re && (_e = Ce[Re - Me]), Ve = Ue[2 * Re], te.opt_len += Ve * (ue + _e), Z && (te.static_len += Ve * (Ge[2 * Re + 1] + _e))); if (ve !== 0) { do { for (ue = we - 1; te.bl_count[ue] === 0; ) ue--; te.bl_count[ue]--, te.bl_count[ue + 1] += 2, te.bl_count[we]--, ve -= 2; } while (0 < ve); - for (ue = we; ue !== 0; ue--) for (Re = te.bl_count[ue]; Re !== 0; ) Ae < (Ie = te.heap[--be]) || (Ue[2 * Ie + 1] !== ue && (te.opt_len += (ue - Ue[2 * Ie + 1]) * Ue[2 * Ie], Ue[2 * Ie + 1] = ue), Re--); + for (ue = we; ue !== 0; ue--) for (Re = te.bl_count[ue]; Re !== 0; ) Ae < (Ie = te.heap[--ye]) || (Ue[2 * Ie + 1] !== ue && (te.opt_len += (ue - Ue[2 * Ie + 1]) * Ue[2 * Ie], Ue[2 * Ie + 1] = ue), Re--); } })(k, F), ce(B, le, k.bl_count); } - function C(k, F, ee) { + function T(k, F, ee) { var J, X, B = -1, D = F[1], H = 0, K = 7, le = 4; - for (D === 0 && (K = 138, le = 3), F[2 * (ee + 1) + 1] = 65535, J = 0; J <= ee; J++) X = D, D = F[2 * (J + 1) + 1], ++H < K && X === D || (H < le ? k.bl_tree[2 * X] += H : X !== 0 ? (X !== B && k.bl_tree[2 * X]++, k.bl_tree[2 * b]++) : H <= 10 ? k.bl_tree[2 * _]++ : k.bl_tree[2 * M]++, B = X, le = (H = 0) === D ? (K = 138, 3) : X === D ? (K = 6, 3) : (K = 7, 4)); + for (D === 0 && (K = 138, le = 3), F[2 * (ee + 1) + 1] = 65535, J = 0; J <= ee; J++) X = D, D = F[2 * (J + 1) + 1], ++H < K && X === D || (H < le ? k.bl_tree[2 * X] += H : X !== 0 ? (X !== B && k.bl_tree[2 * X]++, k.bl_tree[2 * y]++) : H <= 10 ? k.bl_tree[2 * _]++ : k.bl_tree[2 * M]++, B = X, le = (H = 0) === D ? (K = 138, 3) : X === D ? (K = 6, 3) : (K = 7, 4)); } function N(k, F, ee) { var J, X, B = -1, D = F[1], H = 0, K = 7, le = 4; for (D === 0 && (K = 138, le = 3), J = 0; J <= ee; J++) if (X = D, D = F[2 * (J + 1) + 1], !(++H < K && X === D)) { if (H < le) for (; de(k, X, k.bl_tree), --H != 0; ) ; - else X !== 0 ? (X !== B && (de(k, X, k.bl_tree), H--), de(k, b, k.bl_tree), me(k, H - 3, 2)) : H <= 10 ? (de(k, _, k.bl_tree), me(k, H - 3, 3)) : (de(k, M, k.bl_tree), me(k, H - 11, 7)); + else X !== 0 ? (X !== B && (de(k, X, k.bl_tree), H--), de(k, y, k.bl_tree), me(k, H - 3, 2)) : H <= 10 ? (de(k, _, k.bl_tree), me(k, H - 3, 3)) : (de(k, M, k.bl_tree), me(k, H - 11, 7)); B = X, le = (H = 0) === D ? (K = 138, 3) : X === D ? (K = 6, 3) : (K = 7, 4); } } @@ -34303,13 +34283,13 @@ function V_() { var V = !1; function U(k, F, ee, J) { me(k, (c << 1) + (J ? 1 : 0), 3), (function(X, B, D, H) { - ye(X), fe(X, D), fe(X, ~D), r.arraySet(X.pending_buf, X.window, B, D, X.pending), X.pending += D; + be(X), fe(X, D), fe(X, ~D), r.arraySet(X.pending_buf, X.window, B, D, X.pending), X.pending += D; })(k, F, ee); } i._tr_init = function(k) { V || ((function() { var F, ee, J, X, B, D = new Array(x + 1); - for (X = J = 0; X < h - 1; X++) for (z[X] = J, F = 0; F < 1 << T[X]; F++) w[J++] = X; + for (X = J = 0; X < h - 1; X++) for (z[X] = J, F = 0; F < 1 << C[X]; F++) w[J++] = X; for (w[J - 1] = X, X = B = 0; X < 16; X++) for (q[X] = B, F = 0; F < 1 << R[X]; F++) I[B++] = X; for (B >>= 7; X < d; X++) for (q[X] = B << 7, F = 0; F < 1 << R[X] - 7; F++) I[256 + B++] = X; for (ee = 0; ee <= x; ee++) D[ee] = 0; @@ -34318,7 +34298,7 @@ function V_() { for (; F <= 279; ) L[2 * F + 1] = 7, F++, D[7]++; for (; F <= 287; ) L[2 * F + 1] = 8, F++, D[8]++; for (ce(L, p + 1, D), F = 0; F < d; F++) A[2 * F + 1] = 5, A[2 * F] = se(F, 5); - G = new ie(L, T, u + 1, p, x), j = new ie(A, R, 0, d, x), Y = new ie(new Array(0), S, 0, m, y); + G = new ie(L, C, u + 1, p, x), j = new ie(A, R, 0, d, x), Y = new ie(new Array(0), S, 0, m, b); })(), V = !0), k.l_desc = new W(k.dyn_ltree, G), k.d_desc = new W(k.dyn_dtree, j), k.bl_desc = new W(k.bl_tree, Y), k.bi_buf = 0, k.bi_valid = 0, pe(k); }, i._tr_stored_block = U, i._tr_flush_block = function(k, F, ee, J) { var X, B, D = 0; @@ -34330,13 +34310,13 @@ function V_() { return a; })(k)), ke(k, k.l_desc), ke(k, k.d_desc), D = (function(H) { var K; - for (C(H, H.dyn_ltree, H.l_desc.max_code), C(H, H.dyn_dtree, H.d_desc.max_code), ke(H, H.bl_desc), K = m - 1; 3 <= K && H.bl_tree[2 * E[K] + 1] === 0; K--) ; + for (T(H, H.dyn_ltree, H.l_desc.max_code), T(H, H.dyn_dtree, H.d_desc.max_code), ke(H, H.bl_desc), K = m - 1; 3 <= K && H.bl_tree[2 * E[K] + 1] === 0; K--) ; return H.opt_len += 3 * (K + 1) + 5 + 5 + 4, K; })(k), X = k.opt_len + 3 + 7 >>> 3, (B = k.static_len + 3 + 7 >>> 3) <= X && (X = B)) : X = B = ee + 5, ee + 4 <= X && F !== -1 ? U(k, F, ee, J) : k.strategy === 4 || B === X ? (me(k, 2 + (J ? 1 : 0), 3), $e(k, L, A)) : (me(k, 4 + (J ? 1 : 0), 3), (function(H, K, le, te) { - var Ce; - for (me(H, K - 257, 5), me(H, le - 1, 5), me(H, te - 4, 4), Ce = 0; Ce < te; Ce++) me(H, H.bl_tree[2 * E[Ce] + 1], 3); + var Te; + for (me(H, K - 257, 5), me(H, le - 1, 5), me(H, te - 4, 4), Te = 0; Te < te; Te++) me(H, H.bl_tree[2 * E[Te] + 1], 3); N(H, H.dyn_ltree, K - 1), N(H, H.dyn_dtree, le - 1); - })(k, k.l_desc.max_code + 1, k.d_desc.max_code + 1, D + 1), $e(k, k.dyn_ltree, k.dyn_dtree)), pe(k), J && ye(k); + })(k, k.l_desc.max_code + 1, k.d_desc.max_code + 1, D + 1), $e(k, k.dyn_ltree, k.dyn_dtree)), pe(k), J && be(k); }, i._tr_tally = function(k, F, ee) { return k.pending_buf[k.d_buf + 2 * k.last_lit] = F >>> 8 & 255, k.pending_buf[k.d_buf + 2 * k.last_lit + 1] = 255 & F, k.pending_buf[k.l_buf + k.last_lit] = 255 & ee, k.last_lit++, F === 0 ? k.dyn_ltree[2 * ee]++ : (k.matches++, F--, k.dyn_ltree[2 * (w[ee] + u + 1)]++, k.dyn_dtree[2 * $(F)]++), k.last_lit === k.lit_bufsize - 1; }, i._tr_align = function(k) { @@ -34353,74 +34333,74 @@ function V_() { (function(a, o) { if (!a.setImmediate) { var l, c, h, u, p = 1, d = {}, m = !1, f = a.document, x = Object.getPrototypeOf && Object.getPrototypeOf(a); - x = x && x.setTimeout ? x : a, l = {}.toString.call(a.process) === "[object process]" ? function(b) { + x = x && x.setTimeout ? x : a, l = {}.toString.call(a.process) === "[object process]" ? function(y) { process.nextTick(function() { - y(b); + b(y); }); } : (function() { if (a.postMessage && !a.importScripts) { - var b = !0, _ = a.onmessage; + var y = !0, _ = a.onmessage; return a.onmessage = function() { - b = !1; - }, a.postMessage("", "*"), a.onmessage = _, b; + y = !1; + }, a.postMessage("", "*"), a.onmessage = _, y; } - })() ? (u = "setImmediate$" + Math.random() + "$", a.addEventListener ? a.addEventListener("message", v, !1) : a.attachEvent("onmessage", v), function(b) { - a.postMessage(u + b, "*"); - }) : a.MessageChannel ? ((h = new MessageChannel()).port1.onmessage = function(b) { - y(b.data); - }, function(b) { - h.port2.postMessage(b); - }) : f && "onreadystatechange" in f.createElement("script") ? (c = f.documentElement, function(b) { + })() ? (u = "setImmediate$" + Math.random() + "$", a.addEventListener ? a.addEventListener("message", v, !1) : a.attachEvent("onmessage", v), function(y) { + a.postMessage(u + y, "*"); + }) : a.MessageChannel ? ((h = new MessageChannel()).port1.onmessage = function(y) { + b(y.data); + }, function(y) { + h.port2.postMessage(y); + }) : f && "onreadystatechange" in f.createElement("script") ? (c = f.documentElement, function(y) { var _ = f.createElement("script"); _.onreadystatechange = function() { - y(b), _.onreadystatechange = null, c.removeChild(_), _ = null; + b(y), _.onreadystatechange = null, c.removeChild(_), _ = null; }, c.appendChild(_); - }) : function(b) { - setTimeout(y, 0, b); - }, x.setImmediate = function(b) { - typeof b != "function" && (b = new Function("" + b)); + }) : function(y) { + setTimeout(b, 0, y); + }, x.setImmediate = function(y) { + typeof y != "function" && (y = new Function("" + y)); for (var _ = new Array(arguments.length - 1), M = 0; M < _.length; M++) _[M] = arguments[M + 1]; - var T = { callback: b, args: _ }; - return d[p] = T, l(p), p++; + var C = { callback: y, args: _ }; + return d[p] = C, l(p), p++; }, x.clearImmediate = g; } - function g(b) { - delete d[b]; + function g(y) { + delete d[y]; } - function y(b) { - if (m) setTimeout(y, 0, b); + function b(y) { + if (m) setTimeout(b, 0, y); else { - var _ = d[b]; + var _ = d[y]; if (_) { m = !0; try { (function(M) { - var T = M.callback, R = M.args; + var C = M.callback, R = M.args; switch (R.length) { case 0: - T(); + C(); break; case 1: - T(R[0]); + C(R[0]); break; case 2: - T(R[0], R[1]); + C(R[0], R[1]); break; case 3: - T(R[0], R[1], R[2]); + C(R[0], R[1], R[2]); break; default: - T.apply(o, R); + C.apply(o, R); } })(_); } finally { - g(b), m = !1; + g(y), m = !1; } } } } - function v(b) { - b.source === a && typeof b.data == "string" && b.data.indexOf(u) === 0 && y(+b.data.slice(u.length)); + function v(y) { + y.source === a && typeof y.data == "string" && y.data.indexOf(u) === 0 && b(+y.data.slice(u.length)); } })(typeof self > "u" ? r === void 0 ? this : r : self); }).call(this, typeof Uo < "u" ? Uo : typeof self < "u" ? self : typeof window < "u" ? window : {}); @@ -34442,12 +34422,12 @@ const { toString: W_ } = Object.prototype, { getPrototypeOf: cd } = Object, { it function Va(s) { return s !== null && !Hr(s) && s.constructor !== null && !Hr(s.constructor) && wn(s.constructor.isBuffer) && s.constructor.isBuffer(s); } -const T0 = ri("ArrayBuffer"); +const C0 = ri("ArrayBuffer"); function X_(s) { let e; - return typeof ArrayBuffer < "u" && ArrayBuffer.isView ? e = ArrayBuffer.isView(s) : e = s && s.buffer && T0(s.buffer), e; + return typeof ArrayBuffer < "u" && ArrayBuffer.isView ? e = ArrayBuffer.isView(s) : e = s && s.buffer && C0(s.buffer), e; } -const j_ = Yl("string"), wn = Yl("function"), C0 = Yl("number"), Ga = (s) => s !== null && typeof s == "object", q_ = (s) => s === !0 || s === !1, gl = (s) => { +const j_ = Yl("string"), wn = Yl("function"), T0 = Yl("number"), Ga = (s) => s !== null && typeof s == "object", q_ = (s) => s === !0 || s === !1, gl = (s) => { if (Zl(s) !== "object") return !1; const e = cd(s); @@ -34526,7 +34506,7 @@ const oM = (s, e, t, { allOwnKeys: n } = {}) => (Wa(e, (i, r) => { if (!s) return null; if (Xr(s)) return s; let e = s.length; - if (!C0(e)) return null; + if (!T0(e)) return null; const t = new Array(e); for (; e-- > 0; ) t[e] = s[e]; @@ -34555,7 +34535,7 @@ const oM = (s, e, t, { allOwnKeys: n } = {}) => (Wa(e, (i, r) => { let a; (a = e(i, r, s)) !== !1 && (n[r] = a || i); }), Object.defineProperties(s, n); -}, yM = (s) => { +}, bM = (s) => { R0(s, (e, t) => { if (wn(s) && ["arguments", "caller", "callee"].indexOf(t) !== -1) return !1; @@ -34570,7 +34550,7 @@ const oM = (s, e, t, { allOwnKeys: n } = {}) => (Wa(e, (i, r) => { }); } }); -}, bM = (s, e) => { +}, yM = (s, e) => { const t = {}, n = (i) => { i.forEach((r) => { t[r] = !0; @@ -34601,21 +34581,21 @@ const SM = (s) => { return n; }; return t(s, 0); -}, EM = ri("AsyncFunction"), TM = (s) => s && (Ga(s) || wn(s)) && wn(s.then) && wn(s.catch), L0 = ((s, e) => s ? setImmediate : e ? ((t, n) => (Rs.addEventListener("message", ({ source: i, data: r }) => { +}, EM = ri("AsyncFunction"), CM = (s) => s && (Ga(s) || wn(s)) && wn(s.then) && wn(s.catch), L0 = ((s, e) => s ? setImmediate : e ? ((t, n) => (Rs.addEventListener("message", ({ source: i, data: r }) => { i === Rs && r === t && n.length && n.shift()(); }, !1), (i) => { n.push(i), Rs.postMessage(t, "*"); }))(`axios@${Math.random()}`, []) : (t) => setTimeout(t))( typeof setImmediate == "function", wn(Rs.postMessage) -), CM = typeof queueMicrotask < "u" ? queueMicrotask.bind(Rs) : typeof process < "u" && process.nextTick || L0, AM = (s) => s != null && wn(s[ql]), re = { +), TM = typeof queueMicrotask < "u" ? queueMicrotask.bind(Rs) : typeof process < "u" && process.nextTick || L0, AM = (s) => s != null && wn(s[ql]), re = { isArray: Xr, - isArrayBuffer: T0, + isArrayBuffer: C0, isBuffer: Va, isFormData: eM, isArrayBufferView: X_, isString: j_, - isNumber: C0, + isNumber: T0, isBoolean: q_, isObject: Ga, isPlainObject: gl, @@ -34652,8 +34632,8 @@ const SM = (s) => { hasOwnProp: rf, // an alias to avoid ESLint no-prototype-builtins detection reduceDescriptors: R0, - freezeMethods: yM, - toObjectSet: bM, + freezeMethods: bM, + toObjectSet: yM, toCamelCase: xM, noop: _M, toFiniteNumber: MM, @@ -34663,9 +34643,9 @@ const SM = (s) => { isSpecCompliantForm: wM, toJSONObject: SM, isAsyncFn: EM, - isThenable: TM, + isThenable: CM, setImmediate: L0, - asap: CM, + asap: TM, isIterable: AM }; function Je(s, e, t, n, i) { @@ -34767,10 +34747,10 @@ function $l(s, e, t) { if (re.endsWith(m, "{}")) m = n ? m : m.slice(0, -2), d = JSON.stringify(d); else if (re.isArray(d) && RM(d) || (re.isFileList(d) || re.endsWith(m, "[]")) && (x = re.toArray(d))) - return m = N0(m), x.forEach(function(g, y) { + return m = N0(m), x.forEach(function(g, b) { !(re.isUndefined(g) || g === null) && e.append( // eslint-disable-next-line no-nested-ternary - a === !0 ? af([m], y, r) : a === null ? m : m + "[]", + a === !0 ? af([m], b, r) : a === null ? m : m + "[]", l(g) ); }), !1; @@ -34914,13 +34894,13 @@ const U0 = { Blob: BM }, protocols: ["http", "https", "file", "blob", "url", "data"] -}, ud = typeof window < "u" && typeof document < "u", yu = typeof navigator == "object" && navigator || void 0, UM = ud && (!yu || ["ReactNative", "NativeScript", "NS"].indexOf(yu.product) < 0), OM = typeof WorkerGlobalScope < "u" && // eslint-disable-next-line no-undef +}, ud = typeof window < "u" && typeof document < "u", bu = typeof navigator == "object" && navigator || void 0, UM = ud && (!bu || ["ReactNative", "NativeScript", "NS"].indexOf(bu.product) < 0), OM = typeof WorkerGlobalScope < "u" && // eslint-disable-next-line no-undef self instanceof WorkerGlobalScope && typeof self.importScripts == "function", zM = ud && window.location.href || "http://localhost", FM = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, hasBrowserEnv: ud, hasStandardBrowserEnv: UM, hasStandardBrowserWebWorkerEnv: OM, - navigator: yu, + navigator: bu, origin: zM }, Symbol.toStringTag, { value: "Module" })), on = { ...FM, @@ -35467,42 +35447,42 @@ const V0 = (s) => { function x() { if (!f) return; - const y = Sn.from( + const b = Sn.from( "getAllResponseHeaders" in f && f.getAllResponseHeaders() ), v = { data: !a || a === "text" || a === "json" ? f.responseText : f.response, status: f.status, statusText: f.statusText, - headers: y, + headers: b, config: s, request: f }; - F0(function(b) { - e(b), m(); - }, function(b) { - t(b), m(); + F0(function(y) { + e(y), m(); + }, function(y) { + t(y), m(); }, v), f = null; } "onloadend" in f ? f.onloadend = x : f.onreadystatechange = function() { !f || f.readyState !== 4 || f.status === 0 && !(f.responseURL && f.responseURL.indexOf("file:") === 0) || setTimeout(x); }, f.onabort = function() { f && (t(new Je("Request aborted", Je.ECONNABORTED, s, f)), f = null); - }, f.onerror = function(y) { - const v = y && y.message ? y.message : "Network Error", b = new Je(v, Je.ERR_NETWORK, s, f); - b.event = y || null, t(b), f = null; + }, f.onerror = function(b) { + const v = b && b.message ? b.message : "Network Error", y = new Je(v, Je.ERR_NETWORK, s, f); + y.event = b || null, t(y), f = null; }, f.ontimeout = function() { - let y = n.timeout ? "timeout of " + n.timeout + "ms exceeded" : "timeout exceeded"; + let b = n.timeout ? "timeout of " + n.timeout + "ms exceeded" : "timeout exceeded"; const v = n.transitional || U0; - n.timeoutErrorMessage && (y = n.timeoutErrorMessage), t(new Je( - y, + n.timeoutErrorMessage && (b = n.timeoutErrorMessage), t(new Je( + b, v.clarifyTimeoutError ? Je.ETIMEDOUT : Je.ECONNABORTED, s, f )), f = null; - }, i === void 0 && r.setContentType(null), "setRequestHeader" in f && re.forEach(r.toJSON(), function(y, v) { - f.setRequestHeader(v, y); - }), re.isUndefined(n.withCredentials) || (f.withCredentials = !!n.withCredentials), a && a !== "json" && (f.responseType = n.responseType), l && ([u, d] = Nl(l, !0), f.addEventListener("progress", u)), o && f.upload && ([h, p] = Nl(o), f.upload.addEventListener("progress", h), f.upload.addEventListener("loadend", p)), (n.cancelToken || n.signal) && (c = (y) => { - f && (t(!y || y.type ? new jr(null, s, f) : y), f.abort(), f = null); + }, i === void 0 && r.setContentType(null), "setRequestHeader" in f && re.forEach(r.toJSON(), function(b, v) { + f.setRequestHeader(v, b); + }), re.isUndefined(n.withCredentials) || (f.withCredentials = !!n.withCredentials), a && a !== "json" && (f.responseType = n.responseType), l && ([u, d] = Nl(l, !0), f.addEventListener("progress", u)), o && f.upload && ([h, p] = Nl(o), f.upload.addEventListener("progress", h), f.upload.addEventListener("loadend", p)), (n.cancelToken || n.signal) && (c = (b) => { + f && (t(!b || b.type ? new jr(null, s, f) : b), f.abort(), f = null); }, n.cancelToken && n.cancelToken.subscribe(c), n.signal && (n.signal.aborted ? c() : n.signal.addEventListener("abort", c))); const g = KM(n.url); if (g && on.protocols.indexOf(g) === -1) { @@ -35651,18 +35631,18 @@ const V0 = (s) => { url: f, method: x, data: g, - signal: y, + signal: b, cancelToken: v, - timeout: b, + timeout: y, onDownloadProgress: _, onUploadProgress: M, - responseType: T, + responseType: C, headers: R, withCredentials: S = "same-origin", fetchOptions: E } = V0(m), L = e || fetch; - T = T ? (T + "").toLowerCase() : "text"; - let A = aw([y, v && v.toAbortSignal()], b), I = null; + C = C ? (C + "").toLowerCase() : "text"; + let A = aw([b, v && v.toAbortSignal()], y), I = null; const w = A && A.unsubscribe && (() => { A.unsubscribe(); }); @@ -35694,7 +35674,7 @@ const V0 = (s) => { }; I = r && new t(f, j); let Y = await (r ? L(I, E) : L(f, j)); - const q = h && (T === "stream" || T === "response"); + const q = h && (C === "stream" || C === "response"); if (h && (_ || q && w)) { const W = {}; ["status", "statusText", "headers"].forEach((de) => { @@ -35711,8 +35691,8 @@ const V0 = (s) => { W ); } - T = T || "text"; - let ie = await u[re.findKey(u, T) || "text"](Y, m); + C = C || "text"; + let ie = await u[re.findKey(u, C) || "text"](Y, m); return !q && w && w(), await new Promise((W, $) => { F0(W, $, { data: ie, @@ -35806,7 +35786,7 @@ function Wc(s) { if (s.cancelToken && s.cancelToken.throwIfRequested(), s.signal && s.signal.aborted) throw new jr(null, s); } -function yf(s) { +function bf(s) { return Wc(s), s.headers = Sn.from(s.headers), s.data = Gc.call( s, s.transformRequest @@ -35830,7 +35810,7 @@ const X0 = "1.13.2", Kl = {}; return typeof t === s || "a" + (e < 1 ? "n " : " ") + s; }; }); -const bf = {}; +const yf = {}; Kl.transitional = function(s, e, t) { function n(i, r) { return "[Axios v" + X0 + "] Transitional option '" + i + "'" + r + (t ? ". " + t : ""); @@ -35841,7 +35821,7 @@ Kl.transitional = function(s, e, t) { n(r, " has been removed" + (e ? " in " + e : "")), Je.ERR_DEPRECATED ); - return e && !bf[r] && (bf[r] = !0, console.warn( + return e && !yf[r] && (yf[r] = !0, console.warn( n( r, " has been deprecated since v" + e + " and will be removed in the near future" @@ -35942,7 +35922,7 @@ let Ds = class { }); let c, h = 0, u; if (!o) { - const d = [yf.bind(this), void 0]; + const d = [bf.bind(this), void 0]; for (d.unshift(...a), d.push(...l), u = d.length, c = Promise.resolve(e); h < u; ) c = c.then(d[h++], d[h++]); return c; @@ -35959,7 +35939,7 @@ let Ds = class { } } try { - c = yf.call(this, p); + c = bf.call(this, p); } catch (d) { return Promise.reject(d); } @@ -36078,7 +36058,7 @@ function xw(s) { function vw(s) { return re.isObject(s) && s.isAxiosError === !0; } -const bu = { +const yu = { Continue: 100, SwitchingProtocols: 101, Processing: 102, @@ -36149,8 +36129,8 @@ const bu = { SslHandshakeFailed: 525, InvalidSslCertificate: 526 }; -Object.entries(bu).forEach(([s, e]) => { - bu[e] = s; +Object.entries(yu).forEach(([s, e]) => { + yu[e] = s; }); function q0(s) { const e = new Ds(s), t = S0(Ds.prototype.request, e); @@ -36176,22 +36156,22 @@ kt.mergeConfig = Os; kt.AxiosHeaders = Sn; kt.formToJSON = (s) => O0(re.isHTMLForm(s) ? new FormData(s) : s); kt.getAdapter = W0.getAdapter; -kt.HttpStatusCode = bu; +kt.HttpStatusCode = yu; kt.default = kt; const { Axios: m4, AxiosError: g4, CanceledError: x4, isCancel: v4, - CancelToken: y4, - VERSION: b4, + CancelToken: b4, + VERSION: y4, all: _4, Cancel: M4, isAxiosError: w4, spread: S4, toFormData: E4, - AxiosHeaders: T4, - HttpStatusCode: C4, + AxiosHeaders: C4, + HttpStatusCode: T4, formToJSON: A4, getAdapter: P4, mergeConfig: R4 @@ -36207,7 +36187,7 @@ function _f(s, e) { }; } } -function yw(s, e) { +function bw(s, e) { kt({ method: "get", responseType: "blob", @@ -36270,7 +36250,7 @@ function Z0(s, e) { } } const Xc = /* @__PURE__ */ new WeakMap(); -class bw extends us { +class yw extends us { /** * Constructs a new Draco loader. * @@ -36378,12 +36358,12 @@ class bw extends us { } _createGeometry(e) { const t = new mt(); - e.index && t.setIndex(new yt(e.index.array, 1)); + e.index && t.setIndex(new bt(e.index.array, 1)); for (let n = 0; n < e.attributes.length; n++) { const { name: i, array: r, itemSize: a, stride: o, vertexColorSpace: l } = e.attributes[n]; let c; if (a === o) - c = new yt(r, a); + c = new bt(r, a); else { const h = new Yu(r, o); c = new kr(h, a, 0); @@ -36504,15 +36484,15 @@ function _w() { const f = { index: null, attributes: [] }; for (const x in h) { const g = self[u[x]]; - let y, v; + let b, v; if (c.useUniqueIDs) - v = h[x], y = o.GetAttributeByUniqueId(p, v); + v = h[x], b = o.GetAttributeByUniqueId(p, v); else { if (v = o.GetAttributeId(p, a[h[x]]), v === -1) continue; - y = o.GetAttribute(p, v); + b = o.GetAttribute(p, v); } - const b = i(a, o, p, x, g, y); - x === "color" && (b.vertexColorSpace = c.vertexColorSpace), f.attributes.push(b); + const y = i(a, o, p, x, g, b); + x === "color" && (y.vertexColorSpace = c.vertexColorSpace), f.attributes.push(y); } return m === a.TRIANGULAR_MESH && (f.index = n(a, o, p)), a.destroy(p), f; } @@ -36523,22 +36503,22 @@ function _w() { return a._free(u), { array: p, itemSize: 1 }; } function i(a, o, l, c, h, u) { - const p = l.num_points(), d = u.num_components(), m = r(a, h), f = d * h.BYTES_PER_ELEMENT, x = Math.ceil(f / 4) * 4, g = x / h.BYTES_PER_ELEMENT, y = p * f, v = p * x, b = a._malloc(y); - o.GetAttributeDataArrayForAllPoints(l, u, m, y, b); - const _ = new h(a.HEAPF32.buffer, b, y / h.BYTES_PER_ELEMENT); + const p = l.num_points(), d = u.num_components(), m = r(a, h), f = d * h.BYTES_PER_ELEMENT, x = Math.ceil(f / 4) * 4, g = x / h.BYTES_PER_ELEMENT, b = p * f, v = p * x, y = a._malloc(b); + o.GetAttributeDataArrayForAllPoints(l, u, m, b, y); + const _ = new h(a.HEAPF32.buffer, y, b / h.BYTES_PER_ELEMENT); let M; if (f === x) M = _.slice(); else { M = new h(v / h.BYTES_PER_ELEMENT); - let T = 0; + let C = 0; for (let R = 0, S = _.length; R < S; R++) { for (let E = 0; E < d; E++) - M[T + E] = _[R * d + E]; - T += g; + M[C + E] = _[R * d + E]; + C += g; } } - return a._free(b), { + return a._free(y), { name: c, count: p, itemSize: d, @@ -36668,20 +36648,20 @@ function Fo(s, e, t, n, i) { a && (r = new Ot(a.geometry, a.material, t.length), r.url = n, e.add(r)); let l = [], c = []; for (var h = 0; h < t.length; h++) { - let d = t[h], m = new P(d.startPoint.X, 0, -d.startPoint.Y), f = new P(d.endPoint.X, 0, -d.endPoint.Y), x = new P(d.startPoint.X, d.startPoint.Z, -d.startPoint.Y), g = new P(d.endPoint.X, d.endPoint.Z, -d.endPoint.Y), y = 0, v = 0, b = 0; + let d = t[h], m = new P(d.startPoint.X, 0, -d.startPoint.Y), f = new P(d.endPoint.X, 0, -d.endPoint.Y), x = new P(d.startPoint.X, d.startPoint.Z, -d.startPoint.Y), g = new P(d.endPoint.X, d.endPoint.Z, -d.endPoint.Y), b = 0, v = 0, y = 0; if (Math.abs(f.clone().sub(m.clone()).z) < 0.01 && Math.abs(f.clone().sub(m.clone()).x) < 0.01) { - if (y = (d.startPoint.Z > d.endPoint.Z ? 1 : -1) * Math.PI * 0.5, d.base_x != null) { + if (b = (d.startPoint.Z > d.endPoint.Z ? 1 : -1) * Math.PI * 0.5, d.base_x != null) { var u = new P(d.base_x.X, 0, -d.base_x.Y); v = (u.clone().cross(new P(0, 0, 1)).y <= 0 ? 1 : -1) * u.angleTo(new P(0, 0, 1)) + Math.PI * 0.5; } } else - v = (f.clone().sub(m.clone()).cross(new P(0, 0, 1)).y > 0 ? -1 : 1) * f.clone().sub(m.clone()).angleTo(new P(0, 0, 1)), y = (d.startPoint.Z > d.endPoint.Z ? 1 : -1) * f.clone().sub(m.clone()).angleTo(g.clone().sub(x.clone())); + v = (f.clone().sub(m.clone()).cross(new P(0, 0, 1)).y > 0 ? -1 : 1) * f.clone().sub(m.clone()).angleTo(new P(0, 0, 1)), b = (d.startPoint.Z > d.endPoint.Z ? 1 : -1) * f.clone().sub(m.clone()).angleTo(g.clone().sub(x.clone())); let _ = new De(); - const M = new Bn(y, v, b, "YXZ"); - let T = _.clone().makeRotationFromEuler(M), R, S; + const M = new Bn(b, v, y, "YXZ"); + let C = _.clone().makeRotationFromEuler(M), R, S; s === "Circle" ? (R = d.diameter, S = d.diameter) : (R = d.width, S = d.height); let E = _.clone().makeScale(R, S, d.length); - _.multiplyMatrices(T, E), _.setPosition(d.position.x, d.position.y, d.position.z), r.setMatrixAt(h, _.clone()), r.setColorAt(h, d.color), r.geometry.computeBoundingBox(); + _.multiplyMatrices(C, E), _.setPosition(d.position.x, d.position.y, d.position.z), r.setMatrixAt(h, _.clone()), r.setColorAt(h, d.color), r.geometry.computeBoundingBox(); let L = r.geometry.boundingBox.min.clone().applyMatrix4(_.clone()), A = r.geometry.boundingBox.max.clone().applyMatrix4(_.clone()), I = new P(Math.min(L.x, A.x), Math.min(L.y, A.y), Math.min(L.z, A.z)), w = new P(Math.max(L.x, A.x), Math.max(L.y, A.y), Math.max(L.z, A.z)), z = I.clone().add(w.clone()).multiplyScalar(0.5), G = { name: d.name, min: I, @@ -36826,7 +36806,7 @@ function Mf(s) { return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes."), null; r += h.count * t; } - const a = new e(r), o = new yt(a, t, n); + const a = new e(r), o = new bt(a, t, n); let l = 0; for (let c = 0; c < s.length; ++c) { const h = s[c]; @@ -36896,7 +36876,7 @@ class ww extends us { }), this.register(function(t) { return new Nw(t); }), this.register(function(t) { - return new Cw(t); + return new Tw(t); }), this.register(function(t) { return new Bw(t); }), this.register(function(t) { @@ -37044,7 +37024,7 @@ class ww extends us { const u = r.extensionsUsed[h], p = r.extensionsRequired || []; switch (u) { case nt.KHR_MATERIALS_UNLIT: - a[u] = new Tw(); + a[u] = new Cw(); break; case nt.KHR_DRACO_MESH_COMPRESSION: a[u] = new Ww(r, this.dracoLoader); @@ -37163,7 +37143,7 @@ class Ew { }); } } -class Tw { +class Cw { constructor() { this.name = nt.KHR_MATERIALS_UNLIT; } @@ -37184,7 +37164,7 @@ class Tw { return Promise.all(i); } } -class Cw { +class Tw { constructor(e) { this.parser = e, this.name = nt.KHR_MATERIALS_EMISSIVE_STRENGTH; } @@ -37465,15 +37445,15 @@ class Vw { return a.length < 1 ? null : (a.push(this.parser.createNodeMesh(e)), Promise.all(a).then((l) => { const c = l.pop(), h = c.isGroup ? c.children : [c], u = l[0].count, p = []; for (const d of h) { - const m = new De(), f = new P(), x = new qn(), g = new P(1, 1, 1), y = new Ot(d.geometry, d.material, u); + const m = new De(), f = new P(), x = new qn(), g = new P(1, 1, 1), b = new Ot(d.geometry, d.material, u); for (let v = 0; v < u; v++) - o.TRANSLATION && f.fromBufferAttribute(o.TRANSLATION, v), o.ROTATION && x.fromBufferAttribute(o.ROTATION, v), o.SCALE && g.fromBufferAttribute(o.SCALE, v), y.setMatrixAt(v, m.compose(f, x, g)); + o.TRANSLATION && f.fromBufferAttribute(o.TRANSLATION, v), o.ROTATION && x.fromBufferAttribute(o.ROTATION, v), o.SCALE && g.fromBufferAttribute(o.SCALE, v), b.setMatrixAt(v, m.compose(f, x, g)); for (const v in o) if (v === "_COLOR_0") { - const b = o[v]; - y.instanceColor = new Rl(b.array, b.itemSize, b.normalized); + const y = o[v]; + b.instanceColor = new Rl(y.array, y.itemSize, y.normalized); } else v !== "TRANSLATION" && v !== "ROTATION" && v !== "SCALE" && d.geometry.setAttribute(v, o[v]); - Et.prototype.copy.call(y, d), this.parser.assignFinalMaterial(y), p.push(y); + Et.prototype.copy.call(b, d), this.parser.assignFinalMaterial(b), p.push(b); } return c.isGroup ? (c.clear(), c.add(...p), c) : p[0]; })); @@ -37567,10 +37547,10 @@ class K0 extends Ha { return t; } interpolate_(e, t, n, i) { - const r = this.resultBuffer, a = this.sampleValues, o = this.valueSize, l = o * 2, c = o * 3, h = i - t, u = (n - t) / h, p = u * u, d = p * u, m = e * c, f = m - c, x = -2 * d + 3 * p, g = d - p, y = 1 - x, v = g - p + u; - for (let b = 0; b !== o; b++) { - const _ = a[f + b + o], M = a[f + b + l] * h, T = a[m + b + o], R = a[m + b] * h; - r[b] = y * _ + v * M + x * T + g * R; + const r = this.resultBuffer, a = this.sampleValues, o = this.valueSize, l = o * 2, c = o * 3, h = i - t, u = (n - t) / h, p = u * u, d = p * u, m = e * c, f = m - c, x = -2 * d + 3 * p, g = d - p, b = 1 - x, v = g - p + u; + for (let y = 0; y !== o; y++) { + const _ = a[f + y + o], M = a[f + y + l] * h, C = a[m + y + o], R = a[m + y] * h; + r[y] = b * _ + v * M + x * C + g * R; } return r; } @@ -37604,9 +37584,9 @@ const zn = { 9985: cl, 9986: xa, 9987: hi -}, Tf = { +}, Cf = { 33071: Vn, - 33648: Tl, + 33648: Cl, 10497: In }, jc = { SCALAR: 1, @@ -37654,7 +37634,7 @@ function $w(s) { side: jn })), s.DefaultMaterial; } -function bs(s, e, t) { +function ys(s, e, t) { for (const n in t.extensions) s[n] === void 0 && (e.userData.gltfExtensions = e.userData.gltfExtensions || {}, e.userData.gltfExtensions[n] = t.extensions[n]); } @@ -37780,7 +37760,7 @@ class nS { parser: n, userData: {} }; - return bs(r, o, i), li(o, i), Promise.all(n._invokeAll(function(l) { + return ys(r, o, i), li(o, i), Promise.all(n._invokeAll(function(l) { return l.afterRoot && l.afterRoot(o); })).then(function() { for (const l of o.scenes) @@ -37991,24 +37971,24 @@ class nS { const t = this, n = this.json, i = this.json.accessors[e]; if (i.bufferView === void 0 && i.sparse === void 0) { const a = jc[i.type], o = Pr[i.componentType], l = i.normalized === !0, c = new o(i.count * a); - return Promise.resolve(new yt(c, a, l)); + return Promise.resolve(new bt(c, a, l)); } const r = []; return i.bufferView !== void 0 ? r.push(this.getDependency("bufferView", i.bufferView)) : r.push(null), i.sparse !== void 0 && (r.push(this.getDependency("bufferView", i.sparse.indices.bufferView)), r.push(this.getDependency("bufferView", i.sparse.values.bufferView))), Promise.all(r).then(function(a) { const o = a[0], l = jc[i.type], c = Pr[i.componentType], h = c.BYTES_PER_ELEMENT, u = h * l, p = i.byteOffset || 0, d = i.bufferView !== void 0 ? n.bufferViews[i.bufferView].byteStride : void 0, m = i.normalized === !0; let f, x; if (d && d !== u) { - const g = Math.floor(p / d), y = "InterleavedBuffer:" + i.bufferView + ":" + i.componentType + ":" + g + ":" + i.count; - let v = t.cache.get(y); - v || (f = new c(o, g * d, i.count * d / h), v = new Yu(f, d / h), t.cache.add(y, v)), x = new kr(v, l, p % d / h, m); + const g = Math.floor(p / d), b = "InterleavedBuffer:" + i.bufferView + ":" + i.componentType + ":" + g + ":" + i.count; + let v = t.cache.get(b); + v || (f = new c(o, g * d, i.count * d / h), v = new Yu(f, d / h), t.cache.add(b, v)), x = new kr(v, l, p % d / h, m); } else - o === null ? f = new c(i.count * l) : f = new c(o, p, i.count * l), x = new yt(f, l, m); + o === null ? f = new c(i.count * l) : f = new c(o, p, i.count * l), x = new bt(f, l, m); if (i.sparse !== void 0) { - const g = jc.SCALAR, y = Pr[i.sparse.indices.componentType], v = i.sparse.indices.byteOffset || 0, b = i.sparse.values.byteOffset || 0, _ = new y(a[1], v, i.sparse.count * g), M = new c(a[2], b, i.sparse.count * l); - o !== null && (x = new yt(x.array.slice(), x.itemSize, x.normalized)), x.normalized = !1; - for (let T = 0, R = _.length; T < R; T++) { - const S = _[T]; - if (x.setX(S, M[T * l]), l >= 2 && x.setY(S, M[T * l + 1]), l >= 3 && x.setZ(S, M[T * l + 2]), l >= 4 && x.setW(S, M[T * l + 3]), l >= 5) throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute."); + const g = jc.SCALAR, b = Pr[i.sparse.indices.componentType], v = i.sparse.indices.byteOffset || 0, y = i.sparse.values.byteOffset || 0, _ = new b(a[1], v, i.sparse.count * g), M = new c(a[2], y, i.sparse.count * l); + o !== null && (x = new bt(x.array.slice(), x.itemSize, x.normalized)), x.normalized = !1; + for (let C = 0, R = _.length; C < R; C++) { + const S = _[C]; + if (x.setX(S, M[C * l]), l >= 2 && x.setY(S, M[C * l + 1]), l >= 3 && x.setZ(S, M[C * l + 2]), l >= 4 && x.setW(S, M[C * l + 3]), l >= 5) throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute."); } x.normalized = m; } @@ -38038,7 +38018,7 @@ class nS { const c = this.loadImageSource(t, n).then(function(h) { h.flipY = !1, h.name = a.name || o.name || "", h.name === "" && typeof o.uri == "string" && o.uri.startsWith("data:image/") === !1 && (h.name = o.uri); const u = (r.samplers || {})[a.sampler] || {}; - return h.magFilter = Ef[u.magFilter] || Bt, h.minFilter = Ef[u.minFilter] || hi, h.wrapS = Tf[u.wrapS] || In, h.wrapT = Tf[u.wrapT] || In, h.generateMipmaps = !h.isCompressedTexture && h.minFilter !== jt && h.minFilter !== Bt, i.associations.set(h, { textures: e }), h; + return h.magFilter = Ef[u.magFilter] || Bt, h.minFilter = Ef[u.minFilter] || hi, h.wrapS = Cf[u.wrapS] || In, h.wrapT = Cf[u.wrapT] || In, h.generateMipmaps = !h.isCompressedTexture && h.minFilter !== jt && h.minFilter !== Bt, i.associations.set(h, { textures: e }), h; }).catch(function() { return null; }); @@ -38169,7 +38149,7 @@ class nS { } return r.emissiveTexture !== void 0 && a !== Vt && c.push(t.assignTexture(o, "emissiveMap", r.emissiveTexture, Dt)), Promise.all(c).then(function() { const u = new a(o); - return r.name && (u.name = r.name), li(u, r), t.associations.set(u, { materials: e }), r.extensions && bs(i, u, r), u; + return r.name && (u.name = r.name), li(u, r), t.associations.set(u, { materials: e }), r.extensions && ys(i, u, r), u; }); } /** @@ -38196,7 +38176,7 @@ class nS { const t = this, n = this.extensions, i = this.primitiveCache; function r(o) { return n[nt.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(o, t).then(function(l) { - return Cf(l, o, t); + return Tf(l, o, t); }); } const a = []; @@ -38206,7 +38186,7 @@ class nS { a.push(u.promise); else { let p; - c.extensions && c.extensions[nt.KHR_DRACO_MESH_COMPRESSION] ? p = r(c) : p = Cf(new mt(), c, t), i[h] = { primitive: c, promise: p }, a.push(p); + c.extensions && c.extensions[nt.KHR_DRACO_MESH_COMPRESSION] ? p = r(c) : p = Tf(new mt(), c, t), i[h] = { primitive: c, promise: p }, a.push(p); } } return Promise.all(a); @@ -38229,20 +38209,20 @@ class nS { for (let d = 0, m = h.length; d < m; d++) { const f = h[d], x = a[d]; let g; - const y = c[d]; + const b = c[d]; if (x.mode === zn.TRIANGLES || x.mode === zn.TRIANGLE_STRIP || x.mode === zn.TRIANGLE_FAN || x.mode === void 0) - g = r.isSkinnedMesh === !0 ? new e1(f, y) : new at(f, y), g.isSkinnedMesh === !0 && g.normalizeSkinWeights(), x.mode === zn.TRIANGLE_STRIP ? g.geometry = wf(g.geometry, Um) : x.mode === zn.TRIANGLE_FAN && (g.geometry = wf(g.geometry, au)); + g = r.isSkinnedMesh === !0 ? new e1(f, b) : new at(f, b), g.isSkinnedMesh === !0 && g.normalizeSkinWeights(), x.mode === zn.TRIANGLE_STRIP ? g.geometry = wf(g.geometry, Um) : x.mode === zn.TRIANGLE_FAN && (g.geometry = wf(g.geometry, au)); else if (x.mode === zn.LINES) - g = new Km(f, y); + g = new Km(f, b); else if (x.mode === zn.LINE_STRIP) - g = new hs(f, y); + g = new hs(f, b); else if (x.mode === zn.LINE_LOOP) - g = new a1(f, y); + g = new a1(f, b); else if (x.mode === zn.POINTS) - g = new Qm(f, y); + g = new Qm(f, b); else throw new Error("THREE.GLTFLoader: Primitive mode unsupported: " + x.mode); - Object.keys(g.geometry.morphAttributes).length > 0 && Jw(g, r), g.name = t.createUniqueName(r.name || "mesh_" + e), li(g, r), x.extensions && bs(i, g, x), t.assignFinalMaterial(g), u.push(g); + Object.keys(g.geometry.morphAttributes).length > 0 && Jw(g, r), g.name = t.createUniqueName(r.name || "mesh_" + e), li(g, r), x.extensions && ys(i, g, x), t.assignFinalMaterial(g), u.push(g); } for (let d = 0, m = u.length; d < m; d++) t.associations.set(u[d], { @@ -38250,9 +38230,9 @@ class nS { primitives: d }); if (u.length === 1) - return r.extensions && bs(i, u[0], r), u[0]; + return r.extensions && ys(i, u[0], r), u[0]; const p = new ln(); - r.extensions && bs(i, p, r), t.associations.set(p, { meshes: e }); + r.extensions && ys(i, p, r), t.associations.set(p, { meshes: e }); for (let d = 0, m = u.length; d < m; d++) p.add(u[d]); return p; @@ -38309,8 +38289,8 @@ class nS { loadAnimation(e) { const t = this.json, n = this, i = t.animations[e], r = i.name ? i.name : "animation_" + e, a = [], o = [], l = [], c = [], h = []; for (let u = 0, p = i.channels.length; u < p; u++) { - const d = i.channels[u], m = i.samplers[d.sampler], f = d.target, x = f.node, g = i.parameters !== void 0 ? i.parameters[m.input] : m.input, y = i.parameters !== void 0 ? i.parameters[m.output] : m.output; - f.node !== void 0 && (a.push(this.getDependency("node", x)), o.push(this.getDependency("accessor", g)), l.push(this.getDependency("accessor", y)), c.push(m), h.push(f)); + const d = i.channels[u], m = i.samplers[d.sampler], f = d.target, x = f.node, g = i.parameters !== void 0 ? i.parameters[m.input] : m.input, b = i.parameters !== void 0 ? i.parameters[m.output] : m.output; + f.node !== void 0 && (a.push(this.getDependency("node", x)), o.push(this.getDependency("accessor", g)), l.push(this.getDependency("accessor", b)), c.push(m), h.push(f)); } return Promise.all([ Promise.all(a), @@ -38320,17 +38300,17 @@ class nS { Promise.all(h) ]).then(function(u) { const p = u[0], d = u[1], m = u[2], f = u[3], x = u[4], g = []; - for (let v = 0, b = p.length; v < b; v++) { - const _ = p[v], M = d[v], T = m[v], R = f[v], S = x[v]; + for (let v = 0, y = p.length; v < y; v++) { + const _ = p[v], M = d[v], C = m[v], R = f[v], S = x[v]; if (_ === void 0) continue; _.updateMatrix && _.updateMatrix(); - const E = n._createAnimationTracks(_, M, T, R, S); + const E = n._createAnimationTracks(_, M, C, R, S); if (E) for (let L = 0; L < E.length; L++) g.push(E[L]); } - const y = new K1(r, void 0, g); - return li(y, i), y; + const b = new K1(r, void 0, g); + return li(b, i), b; }); } createNodeMesh(e) { @@ -38390,7 +38370,7 @@ class nS { if (r.isBone === !0 ? h = new $m() : c.length > 1 ? h = new ln() : c.length === 1 ? h = c[0] : h = new Et(), h !== c[0]) for (let u = 0, p = c.length; u < p; u++) h.add(c[u]); - if (r.name && (h.userData.name = r.name, h.name = a), li(h, r), r.extensions && bs(n, h, r), r.matrix !== void 0) { + if (r.name && (h.userData.name = r.name, h.name = a), li(h, r), r.extensions && ys(n, h, r), r.matrix !== void 0) { const u = new De(); u.fromArray(r.matrix), h.applyMatrix4(u); } else @@ -38413,7 +38393,7 @@ class nS { */ loadScene(e) { const t = this.extensions, n = this.json.scenes[e], i = this, r = new ln(); - n.name && (r.name = i.createUniqueName(n.name)), li(r, n), n.extensions && bs(t, r, n); + n.name && (r.name = i.createUniqueName(n.name)), li(r, n), n.extensions && ys(t, r, n); const a = n.nodes || [], o = []; for (let l = 0, c = a.length; l < c; l++) o.push(i.getDependency("node", a[l])); @@ -38532,7 +38512,7 @@ function iS(s, e, t) { const a = new fi(); i.getCenter(a.center), a.radius = i.min.distanceTo(i.max) / 2, s.boundingSphere = a; } -function Cf(s, e, t) { +function Tf(s, e, t) { const n = e.attributes, i = []; function r(a, o) { return t.getDependency("accessor", a).then(function(l) { @@ -38589,7 +38569,7 @@ function aS(s, e) { e.info.lods.forEach((n) => { if (n.status != !0) if (n.glbs == null) - console.log("加载GLB............."), n.glbs = {}, yw(e.url + n.path, (i) => { + console.log("加载GLB............."), n.glbs = {}, bw(e.url + n.path, (i) => { _f(i.get("/nodes.json"), (r) => { let a = JSON.parse(r); s.models.find((c) => c.url == e.url).nodesMap == null && (s.models.find((c) => c.url == e.url).nodesMap = /* @__PURE__ */ new Map()); @@ -38599,7 +38579,7 @@ function aS(s, e) { p.glb = c, o.has(p.id) == !1 ? o.set(p.id, { infos: [p] }) : o.get(p.id).infos.push(p); }); let h = new ww(); - const u = new bw(); + const u = new yw(); u.setDecoderPath("/draco/"), u.preload(), h.setDRACOLoader(u), h.load(i.get(c + ".glb"), (p) => { n.glbs[c] = p.scene.children, n.glbs[c].forEach((d) => { d.geometry.computeVertexNormals(); @@ -39312,7 +39292,7 @@ class Pn { this.scene = e; } } -class yS { +class bS { engine; currentMode = ""; // 是否为手动设置(手动设置时,自动适配不再生效) @@ -39573,12 +39553,12 @@ class Bl { this.removeOverlayMeshes(), this.overlayMaterial.dispose(), this.animState = "idle"; } } -var wu = { exports: {} }, bS = wu.exports, Rf; +var wu = { exports: {} }, yS = wu.exports, Rf; function _S() { return Rf || (Rf = 1, (function(s, e) { (function(t, n) { s.exports = n(); - })(bS, function() { + })(yS, function() { var t = function() { function n(d) { return a.appendChild(d.dom), d; @@ -39608,11 +39588,11 @@ function _S() { }, domElement: a, setMode: i }; }; return t.Panel = function(n, i, r) { - var a = 1 / 0, o = 0, l = Math.round, c = l(window.devicePixelRatio || 1), h = 80 * c, u = 48 * c, p = 3 * c, d = 2 * c, m = 3 * c, f = 15 * c, x = 74 * c, g = 30 * c, y = document.createElement("canvas"); - y.width = h, y.height = u, y.style.cssText = "width:80px;height:48px"; - var v = y.getContext("2d"); - return v.font = "bold " + 9 * c + "px Helvetica,Arial,sans-serif", v.textBaseline = "top", v.fillStyle = r, v.fillRect(0, 0, h, u), v.fillStyle = i, v.fillText(n, p, d), v.fillRect(m, f, x, g), v.fillStyle = r, v.globalAlpha = 0.9, v.fillRect(m, f, x, g), { dom: y, update: function(b, _) { - a = Math.min(a, b), o = Math.max(o, b), v.fillStyle = r, v.globalAlpha = 1, v.fillRect(0, 0, h, f), v.fillStyle = i, v.fillText(l(b) + " " + n + " (" + l(a) + "-" + l(o) + ")", p, d), v.drawImage(y, m + c, f, x - c, g, m, f, x - c, g), v.fillRect(m + x - c, f, c, g), v.fillStyle = r, v.globalAlpha = 0.9, v.fillRect(m + x - c, f, c, l((1 - b / _) * g)); + var a = 1 / 0, o = 0, l = Math.round, c = l(window.devicePixelRatio || 1), h = 80 * c, u = 48 * c, p = 3 * c, d = 2 * c, m = 3 * c, f = 15 * c, x = 74 * c, g = 30 * c, b = document.createElement("canvas"); + b.width = h, b.height = u, b.style.cssText = "width:80px;height:48px"; + var v = b.getContext("2d"); + return v.font = "bold " + 9 * c + "px Helvetica,Arial,sans-serif", v.textBaseline = "top", v.fillStyle = r, v.fillRect(0, 0, h, u), v.fillStyle = i, v.fillText(n, p, d), v.fillRect(m, f, x, g), v.fillStyle = r, v.globalAlpha = 0.9, v.fillRect(m, f, x, g), { dom: b, update: function(y, _) { + a = Math.min(a, y), o = Math.max(o, y), v.fillStyle = r, v.globalAlpha = 1, v.fillRect(0, 0, h, f), v.fillStyle = i, v.fillText(l(y) + " " + n + " (" + l(a) + "-" + l(o) + ")", p, d), v.drawImage(b, m + c, f, x - c, g, m, f, x - c, g), v.fillRect(m + x - c, f, c, g), v.fillStyle = r, v.globalAlpha = 0.9, v.fillRect(m + x - c, f, c, l((1 - y / _) * g)); } }; }, t; }); @@ -39761,7 +39741,7 @@ var Rr = Object.freeze({ } }; } -}), ba = function() { +}), ya = function() { return performance.now(); }, SS = ( /** @class */ @@ -39781,7 +39761,7 @@ var Rr = Object.freeze({ }, s.prototype.remove = function(e) { delete this._tweens[e.getId()], delete this._tweensAddedDuringUpdate[e.getId()]; }, s.prototype.update = function(e, t) { - e === void 0 && (e = ba()), t === void 0 && (t = !1); + e === void 0 && (e = ya()), t === void 0 && (t = !1); var n = Object.keys(this._tweens); if (n.length === 0) return !1; @@ -39838,7 +39818,7 @@ var Rr = Object.freeze({ }, s.prototype.dynamic = function(e) { return e === void 0 && (e = !1), this._isDynamic = e, this; }, s.prototype.start = function(e, t) { - if (e === void 0 && (e = ba()), t === void 0 && (t = !1), this._isPlaying) + if (e === void 0 && (e = ya()), t === void 0 && (t = !1), this._isPlaying) return this; if (this._group && this._group.add(this), this._repeat = this._initialRepeat, this._reversed) { this._reversed = !1; @@ -39883,10 +39863,10 @@ var Rr = Object.freeze({ i[a] = l ? [] : {}; var u = n[a]; if (!this._isDynamic) { - var y = {}; + var b = {}; for (var g in u) - y[g] = u[g]; - n[a] = u = y; + b[g] = u[g]; + n[a] = u = b; } this._setupProperties(x, t[a], u, i[a], r); } else @@ -39898,9 +39878,9 @@ var Rr = Object.freeze({ }, s.prototype.end = function() { return this._goToEnd = !0, this.update(1 / 0), this; }, s.prototype.pause = function(e) { - return e === void 0 && (e = ba()), this._isPaused || !this._isPlaying ? this : (this._isPaused = !0, this._pauseStart = e, this._group && this._group.remove(this), this); + return e === void 0 && (e = ya()), this._isPaused || !this._isPlaying ? this : (this._isPaused = !0, this._pauseStart = e, this._group && this._group.remove(this), this); }, s.prototype.resume = function(e) { - return e === void 0 && (e = ba()), !this._isPaused || !this._isPlaying ? this : (this._isPaused = !1, this._startTime += e - this._pauseStart, this._pauseStart = 0, this._group && this._group.add(this), this); + return e === void 0 && (e = ya()), !this._isPaused || !this._isPlaying ? this : (this._isPaused = !1, this._startTime += e - this._pauseStart, this._pauseStart = 0, this._group && this._group.add(this), this); }, s.prototype.stopChainedTweens = function() { for (var e = 0, t = this._chainedTweens.length; e < t; e++) this._chainedTweens[e].stop(); @@ -39937,7 +39917,7 @@ var Rr = Object.freeze({ return this._onStopCallback = e, this; }, s.prototype.update = function(e, t) { var n = this, i; - if (e === void 0 && (e = ba()), t === void 0 && (t = !0), this._isPaused) + if (e === void 0 && (e = ya()), t === void 0 && (t = !0), this._isPaused) return !0; var r, a = this._startTime + this._duration; if (!this._goToEnd && !this._isPlaying) { @@ -39951,8 +39931,8 @@ var Rr = Object.freeze({ var o = e - this._startTime, l = this._duration + ((i = this._repeatDelayTime) !== null && i !== void 0 ? i : this._delayTime), c = this._duration + this._repeat * l, h = function() { if (n._duration === 0 || o > c) return 1; - var x = Math.trunc(o / l), g = o - x * l, y = Math.min(g / n._duration, 1); - return y === 0 && o === n._duration ? 1 : y; + var x = Math.trunc(o / l), g = o - x * l, b = Math.min(g / n._duration, 1); + return b === 0 && o === n._duration ? 1 : b; }, u = h(), p = this._easingFunction(u); if (this._updateProperties(this._object, this._valuesStart, this._valuesEnd, p), this._onUpdateCallback && this._onUpdateCallback(this._object, u), this._duration === 0 || o >= this._duration) if (this._repeat > 0) { @@ -39995,7 +39975,7 @@ var la = { Easing: Rr, Tween: ES }; -class TS extends sv { +class CS extends sv { /** * Constructs a new RGBE/HDR loader. * @@ -40023,15 +40003,15 @@ class TS extends sv { case 4: throw new Error("THREE.HDRLoader: Memory Error: " + (g || "")); } - }, n = function(x, g, y) { + }, n = function(x, g, b) { g = g || 1024; - let v = x.pos, b = -1, _ = 0, M = "", T = String.fromCharCode.apply(null, new Uint16Array(x.subarray(v, v + 128))); - for (; 0 > (b = T.indexOf(` + let v = x.pos, y = -1, _ = 0, M = "", C = String.fromCharCode.apply(null, new Uint16Array(x.subarray(v, v + 128))); + for (; 0 > (y = C.indexOf(` `)) && _ < g && v < x.byteLength; ) - M += T, _ += T.length, v += 128, T += String.fromCharCode.apply(null, new Uint16Array(x.subarray(v, v + 128))); - return -1 < b ? (x.pos += _ + b + 1, M + T.slice(0, b)) : !1; + M += C, _ += C.length, v += 128, C += String.fromCharCode.apply(null, new Uint16Array(x.subarray(v, v + 128))); + return -1 < y ? (x.pos += _ + y + 1, M + C.slice(0, y)) : !1; }, i = function(x) { - const g = /^#\?(\S+)/, y = /^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/, v = /^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/, b = /^\s*FORMAT=(\S+)\s*$/, _ = /^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/, M = { + const g = /^#\?(\S+)/, b = /^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/, v = /^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/, y = /^\s*FORMAT=(\S+)\s*$/, _ = /^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/, M = { valid: 0, /* indicate which fields are valid */ string: "", @@ -40050,19 +40030,19 @@ class TS extends sv { height: 0 /* image dimensions, width/height */ }; - let T, R; - for ((x.pos >= x.byteLength || !(T = n(x))) && t(1, "no header found"), (R = T.match(g)) || t(3, "bad initial token"), M.valid |= 1, M.programtype = R[1], M.string += T + ` -`; T = n(x), T !== !1; ) { - if (M.string += T + ` -`, T.charAt(0) === "#") { - M.comments += T + ` + let C, R; + for ((x.pos >= x.byteLength || !(C = n(x))) && t(1, "no header found"), (R = C.match(g)) || t(3, "bad initial token"), M.valid |= 1, M.programtype = R[1], M.string += C + ` +`; C = n(x), C !== !1; ) { + if (M.string += C + ` +`, C.charAt(0) === "#") { + M.comments += C + ` `; continue; } - if ((R = T.match(y)) && (M.gamma = parseFloat(R[1])), (R = T.match(v)) && (M.exposure = parseFloat(R[1])), (R = T.match(b)) && (M.valid |= 2, M.format = R[1]), (R = T.match(_)) && (M.valid |= 4, M.height = parseInt(R[1], 10), M.width = parseInt(R[2], 10)), M.valid & 2 && M.valid & 4) break; + if ((R = C.match(b)) && (M.gamma = parseFloat(R[1])), (R = C.match(v)) && (M.exposure = parseFloat(R[1])), (R = C.match(y)) && (M.valid |= 2, M.format = R[1]), (R = C.match(_)) && (M.valid |= 4, M.height = parseInt(R[1], 10), M.width = parseInt(R[2], 10)), M.valid & 2 && M.valid & 4) break; } return M.valid & 2 || t(3, "missing format specifier"), M.valid & 4 || t(3, "missing image size specifier"), M; - }, r = function(x, g, y) { + }, r = function(x, g, b) { const v = g; if ( // run length encoding is not allowed so read flat @@ -40071,18 +40051,18 @@ class TS extends sv { ) return new Uint8Array(x); v !== (x[2] << 8 | x[3]) && t(3, "wrong scanline width"); - const b = new Uint8Array(4 * g * y); - b.length || t(4, "unable to allocate buffer space"); + const y = new Uint8Array(4 * g * b); + y.length || t(4, "unable to allocate buffer space"); let _ = 0, M = 0; - const T = 4 * v, R = new Uint8Array(4), S = new Uint8Array(T); - let E = y; + const C = 4 * v, R = new Uint8Array(4), S = new Uint8Array(C); + let E = b; for (; E > 0 && M < x.byteLength; ) { M + 4 > x.byteLength && t(1), R[0] = x[M++], R[1] = x[M++], R[2] = x[M++], R[3] = x[M++], (R[0] != 2 || R[1] != 2 || (R[2] << 8 | R[3]) != v) && t(3, "bad rgbe scanline format"); let L = 0, A; - for (; L < T && M < x.byteLength; ) { + for (; L < C && M < x.byteLength; ) { A = x[M++]; const w = A > 128; - if (w && (A -= 128), (A === 0 || L + A > T) && t(3, "bad scanline data"), w) { + if (w && (A -= 128), (A === 0 || L + A > C) && t(3, "bad scanline data"), w) { const z = x[M++]; for (let G = 0; G < A; G++) S[L++] = z; @@ -40092,17 +40072,17 @@ class TS extends sv { const I = v; for (let w = 0; w < I; w++) { let z = 0; - b[_] = S[w + z], z += v, b[_ + 1] = S[w + z], z += v, b[_ + 2] = S[w + z], z += v, b[_ + 3] = S[w + z], _ += 4; + y[_] = S[w + z], z += v, y[_ + 1] = S[w + z], z += v, y[_ + 2] = S[w + z], z += v, y[_ + 3] = S[w + z], _ += 4; } E--; } - return b; - }, a = function(x, g, y, v) { - const b = x[g + 3], _ = Math.pow(2, b - 128) / 255; - y[v + 0] = x[g + 0] * _, y[v + 1] = x[g + 1] * _, y[v + 2] = x[g + 2] * _, y[v + 3] = 1; - }, o = function(x, g, y, v) { - const b = x[g + 3], _ = Math.pow(2, b - 128) / 255; - y[v + 0] = no.toHalfFloat(Math.min(x[g + 0] * _, 65504)), y[v + 1] = no.toHalfFloat(Math.min(x[g + 1] * _, 65504)), y[v + 2] = no.toHalfFloat(Math.min(x[g + 2] * _, 65504)), y[v + 3] = no.toHalfFloat(1); + return y; + }, a = function(x, g, b, v) { + const y = x[g + 3], _ = Math.pow(2, y - 128) / 255; + b[v + 0] = x[g + 0] * _, b[v + 1] = x[g + 1] * _, b[v + 2] = x[g + 2] * _, b[v + 3] = 1; + }, o = function(x, g, b, v) { + const y = x[g + 3], _ = Math.pow(2, y - 128) / 255; + b[v + 0] = no.toHalfFloat(Math.min(x[g + 0] * _, 65504)), b[v + 1] = no.toHalfFloat(Math.min(x[g + 1] * _, 65504)), b[v + 2] = no.toHalfFloat(Math.min(x[g + 2] * _, 65504)), b[v + 3] = no.toHalfFloat(1); }, l = new Uint8Array(e); l.pos = 0; const c = i(l), h = c.width, u = c.height, p = r(l.subarray(l.pos), h, u); @@ -40111,15 +40091,15 @@ class TS extends sv { case fn: f = p.length / 4; const x = new Float32Array(f * 4); - for (let y = 0; y < f; y++) - a(p, y * 4, x, y * 4); + for (let b = 0; b < f; b++) + a(p, b * 4, x, b * 4); d = x, m = fn; break; case mn: f = p.length / 4; const g = new Uint16Array(f * 4); - for (let y = 0; y < f; y++) - o(p, y * 4, g, y * 4); + for (let b = 0; b < f; b++) + o(p, b * 4, g, b * 4); d = g, m = mn; break; default: @@ -40157,7 +40137,7 @@ class TS extends sv { return super.load(e, r, n, i); } } -function CS() { +function TS() { return new qm(); } function AS(s, e) { @@ -40180,8 +40160,8 @@ function PS(s, e, t) { }, n.ToggleDirectionView = function(m) { var f = new P(0, 0, 0); m == "top" ? f = new P(0, 1, 1e-5) : m == "down" ? f = new P(0, -1, 1e-5) : m == "front" ? f = new P(0, 0, 1) : m == "left" ? f = new P(-1, 0, 0) : m == "back" ? f = new P(0, 0, -1) : m == "right" ? f = new P(1, 0, 0) : m == "top_front" ? f = new P(1, 1, 0) : m == "top_left" ? f = new P(0, 1, -1) : m == "top_back" ? f = new P(-1, 1, 0) : m == "top_right" ? f = new P(0, 1, 1) : m == "down_front" ? f = new P(1, -1, 0) : m == "down_left" ? f = new P(0, -1, -1) : m == "down_back" ? f = new P(-1, -1, 0) : m == "down_right" ? f = new P(0, -1, 1) : m == "front_right" ? f = new P(1, 0, 1) : m == "right_back" ? f = new P(-1, 0, 1) : m == "back_left" ? f = new P(-1, 0, -1) : m == "left_front" ? f = new P(1, 0, -1) : m == "top_left_front" ? f = new P(1, 1, -1) : m == "top_front_right" ? f = new P(1, 1, 1) : m == "top_right_back" ? f = new P(-1, 1, 1) : m == "top_back_left" ? f = new P(-1, 1, -1) : m == "button_left_front" ? f = new P(1, -1, -1) : m == "button_front_right" ? f = new P(1, -1, 1) : m == "button_right_back" ? f = new P(-1, 1, 1) : m == "button_back_left" && (f = new P(-1, -1, -1)); - var x = s.octreeBox.getBoundingBox(), g = x.min, y = x.max, v = g.clone().add(y.clone()).multiplyScalar(0.5), b = v.clone().add(f.multiplyScalar(1 * y.distanceTo(g))); - l(e.camera.position, b, s.controls.target.clone(), v); + var x = s.octreeBox.getBoundingBox(), g = x.min, b = x.max, v = g.clone().add(b.clone()).multiplyScalar(0.5), y = v.clone().add(f.multiplyScalar(1 * b.distanceTo(g))); + l(e.camera.position, y, s.controls.target.clone(), v); }, n.GetCameraPose = function() { var m = e.camera.quaternion, f = e.camera.position, x = s.controls.target, g = { quaternion: m, @@ -40195,35 +40175,35 @@ function PS(s, e, t) { m.quaternion._y, m.quaternion._z, m.quaternion._w - ), y = new P(m.position.x, m.position.y, m.position.z), v = new P(m.target.x, m.target.y, m.target.z); - let b = !1; + ), b = new P(m.position.x, m.position.y, m.position.z), v = new P(m.target.x, m.target.y, m.target.z); + let y = !1; l( e.camera.position, - y, + b, s.controls.target.clone(), v, e.camera.quaternion, g, f, (_) => { - x && (b || (x(_), b = !0)); + x && (y || (x(_), y = !0)); } ), x && setTimeout(() => { - b || (x(!0), b = !0); + y || (x(!0), y = !0); }, f + 10); }, n.CameraGoHome = function() { var m = s.octreeBox.getBoundingBox(), f = m.min.clone().add(m.max.clone()).multiplyScalar(0.5); let x = new P(1, 1, 1); - var g = m.max.distanceTo(m.min), y = f.clone().add(x.multiplyScalar(g)); + var g = m.max.distanceTo(m.min), b = f.clone().add(x.multiplyScalar(g)); if (e.camera.isOrthographicCamera) { - var v = s.container.clientWidth / s.container.clientHeight, b = g * 0.6; - e.camera.left = -b * v, e.camera.right = b * v, e.camera.top = b, e.camera.bottom = -b, e.camera.zoom = 1, e.camera.updateProjectionMatrix(); + var v = s.container.clientWidth / s.container.clientHeight, y = g * 0.6; + e.camera.left = -y * v, e.camera.right = y * v, e.camera.top = y, e.camera.bottom = -y, e.camera.zoom = 1, e.camera.updateProjectionMatrix(); } - l(e.camera.position, y, s.controls.target.clone(), f); + l(e.camera.position, b, s.controls.target.clone(), f); }, n.zoomToBox = function(m) { - var f = m.min.clone().add(m.max.clone()).multiplyScalar(0.5), x = e.camera.position.clone().sub(s.controls.target.clone()).normalize(), g = e.camera.position.distanceTo(s.controls.target), y = f.clone().add(x.multiplyScalar(g)), v = e.camera.zoom; + var f = m.min.clone().add(m.max.clone()).multiplyScalar(0.5), x = e.camera.position.clone().sub(s.controls.target.clone()).normalize(), g = e.camera.position.distanceTo(s.controls.target), b = f.clone().add(x.multiplyScalar(g)), v = e.camera.zoom; if (e.camera.isOrthographicCamera) { - var b = new P(1, 0, 0).applyQuaternion(e.camera.quaternion), _ = new P(0, 1, 0).applyQuaternion(e.camera.quaternion), M = [ + var y = new P(1, 0, 0).applyQuaternion(e.camera.quaternion), _ = new P(0, 1, 0).applyQuaternion(e.camera.quaternion), M = [ new P(m.min.x, m.min.y, m.min.z), new P(m.max.x, m.min.y, m.min.z), new P(m.min.x, m.max.y, m.min.z), @@ -40232,12 +40212,12 @@ function PS(s, e, t) { new P(m.max.x, m.min.y, m.max.z), new P(m.min.x, m.max.y, m.max.z), new P(m.max.x, m.max.y, m.max.z) - ], T = 1 / 0, R = -1 / 0, S = 1 / 0, E = -1 / 0; + ], C = 1 / 0, R = -1 / 0, S = 1 / 0, E = -1 / 0; for (var L of M) { - var A = L.dot(b), I = L.dot(_); - T = Math.min(T, A), R = Math.max(R, A), S = Math.min(S, I), E = Math.max(E, I); + var A = L.dot(y), I = L.dot(_); + C = Math.min(C, A), R = Math.max(R, A), S = Math.min(S, I), E = Math.max(E, I); } - var w = (R - T) / 2, z = (E - S) / 2, G = (e.camera.right - e.camera.left) / 2, j = (e.camera.top - e.camera.bottom) / 2; + var w = (R - C) / 2, z = (E - S) / 2, G = (e.camera.right - e.camera.left) / 2, j = (e.camera.top - e.camera.bottom) / 2; v = Math.min(G / w, j / z) * 0.75; } var Y = e.camera.position.clone(), q = s.controls.target.clone(), ie = e.camera.zoom, W = new la.Tween({ @@ -40249,9 +40229,9 @@ function PS(s, e, t) { z2: q.z, zoom: ie }).to({ - x1: y.x, - y1: y.y, - z1: y.z, + x1: b.x, + y1: b.y, + z1: b.z, x2: f.x, y2: f.y, z2: f.z, @@ -40267,9 +40247,9 @@ function PS(s, e, t) { } $(); }; - function l(m, f, x, g, y, v, b = 1e3, _) { + function l(m, f, x, g, b, v, y = 1e3, _) { var M; - y && v ? (M = new la.Tween({ + b && v ? (M = new la.Tween({ x1: m.x, // 相机当前位置x y1: m.y, @@ -40282,13 +40262,13 @@ function PS(s, e, t) { // 控制当前的中心点y z2: x.z, // 控制当前的中心点z - _x: y._x, + _x: b._x, // 相机当前quaternion - _y: y._y, + _y: b._y, // 相机当前quaternion - _z: y._z, + _z: b._z, // 相机当前quaternion - _w: y._w + _w: b._w // 相机当前quaternion }), M.to( { @@ -40313,7 +40293,7 @@ function PS(s, e, t) { _w: v._w // 新的相机quaternion }, - b + y )) : (M = new la.Tween({ x1: m.x, // 相机当前位置x @@ -40342,16 +40322,16 @@ function PS(s, e, t) { z2: g.z // 新的控制中心点位置x }, - b + y )), M.onUpdate(function(R) { - s.controls && (y && v ? (e.camera.quaternion._x = R._x, e.camera.quaternion._y = R._y, e.camera.quaternion._z = R._z, e.camera.quaternion._w = R._w) : s.controls.auto = !0, e.camera.position.x = R.x1, e.camera.position.y = R.y1, e.camera.position.z = R.z1, s.controls.target.x = R.x2, s.controls.target.y = R.y2, s.controls.target.z = R.z2, s.controls.update(), n.RenderScene()); + s.controls && (b && v ? (e.camera.quaternion._x = R._x, e.camera.quaternion._y = R._y, e.camera.quaternion._z = R._z, e.camera.quaternion._w = R._w) : s.controls.auto = !0, e.camera.position.x = R.x1, e.camera.position.y = R.y1, e.camera.position.z = R.z1, s.controls.target.x = R.x2, s.controls.target.y = R.y2, s.controls.target.z = R.z2, s.controls.update(), n.RenderScene()); }), M.onComplete(function(R) { s.controls && (s.controls.auto = !1, n.RenderScene(), _ && _(!0), cancelAnimationFrame(i), i = null); }), M.easing(la.Easing.Cubic.InOut); - function T(R) { - i = requestAnimationFrame(T), M.update(); + function C(R) { + i = requestAnimationFrame(C), M.update(); } - M.start(), T(); + M.start(), C(); } function c() { r = document.createElement("div"), r.className = "ViewCube", t.appendChild(r), a = document.createElement("div"), a.className = "viewSettingWrapper", a.innerHTML = "...", r.appendChild(a); @@ -40360,20 +40340,20 @@ function PS(s, e, t) { console.log("归位"), n.CameraGoHome(); }), r.appendChild(m); const f = document.createElement("div"); - f.className = "cameraToggleWrapper", f.title = "切换正交/透视视图", f.innerHTML = "⊞", f.addEventListener("mousedown", function(b) { - b.stopPropagation(), console.log("切换视图"), n.ToggleCameraType(), y(); + f.className = "cameraToggleWrapper", f.title = "切换正交/透视视图", f.innerHTML = "⊞", f.addEventListener("mousedown", function(y) { + y.stopPropagation(), console.log("切换视图"), n.ToggleCameraType(), b(); }), r.appendChild(f); const x = document.createElement("div"); - x.className = "screenshotWrapper", x.title = "截图", x.innerHTML = "📷", x.addEventListener("mousedown", function(b) { - b.stopPropagation(), console.log("截图"), n.TakeScreenshot(), y(); + x.className = "screenshotWrapper", x.title = "截图", x.innerHTML = "📷", x.addEventListener("mousedown", function(y) { + y.stopPropagation(), console.log("截图"), n.TakeScreenshot(), b(); }), r.appendChild(x); const g = document.createElement("div"); - g.className = "fullscreenWrapper", g.title = "全屏", g.innerHTML = "⛶", g.addEventListener("mousedown", function(b) { - b.stopPropagation(), console.log("全屏"), n.ToggleFullscreen(), y(); - }), r.appendChild(g), a.addEventListener("mousedown", function(b) { - b.stopPropagation(), f.classList.contains("show") ? (y(), console.log("隐藏功能按钮")) : (v(), console.log("显示功能按钮")); + g.className = "fullscreenWrapper", g.title = "全屏", g.innerHTML = "⛶", g.addEventListener("mousedown", function(y) { + y.stopPropagation(), console.log("全屏"), n.ToggleFullscreen(), b(); + }), r.appendChild(g), a.addEventListener("mousedown", function(y) { + y.stopPropagation(), f.classList.contains("show") ? (b(), console.log("隐藏功能按钮")) : (v(), console.log("显示功能按钮")); }); - function y() { + function b() { f.classList.remove("show"), x.classList.remove("show"), g.classList.remove("show"); } function v() { @@ -40381,7 +40361,7 @@ function PS(s, e, t) { } } function h() { - n.sceneOrtho = CS(); + n.sceneOrtho = TS(); var x = t.clientWidth, g = t.clientWidth, m = x > g ? x / g : g / x, f = 300; n.camera = new Oi( f * m / -2, @@ -40391,12 +40371,12 @@ function PS(s, e, t) { 0.01, 1e4 ); - var x = r.clientWidth, g = r.clientHeight, y = new ad({ + var x = r.clientWidth, g = r.clientHeight, b = new ad({ alpha: !0 }); - y.setSize(x, g), y.setClearAlpha(0), n.sceneOrtho.renderer = y; + b.setSize(x, g), b.setClearAlpha(0), n.sceneOrtho.renderer = b; let v = new Il(16777215, 0.8); - n.sceneOrtho.add(v), AS(r, y); + n.sceneOrtho.add(v), AS(r, b); } function u() { const m = "/assets/viewcube/"; @@ -40427,30 +40407,30 @@ function PS(s, e, t) { } ]; var x = []; - for (const y of f) + for (const b of f) x.push( new Vt({ color: 16777215, - map: new nd().load(y.icon) + map: new nd().load(b.icon) }) ); new V1({ color: 255 }); var g = new at(new rs(110, 110, 110), x); - n.sceneOrtho.add(g), p(122), r.addEventListener("mousedown", (y) => { + n.sceneOrtho.add(g), p(122), r.addEventListener("mousedown", (b) => { var v = {}; - v.x = y.offsetX / r.clientWidth * 2 - 1, v.y = -(y.offsetY / r.clientHeight) * 2 + 1; - var b = new os(); - b.setFromCamera(v, n.camera); - const _ = b.intersectObjects(o, !1); + v.x = b.offsetX / r.clientWidth * 2 - 1, v.y = -(b.offsetY / r.clientHeight) * 2 + 1; + var y = new os(); + y.setFromCamera(v, n.camera); + const _ = y.intersectObjects(o, !1); _.length > 0 && n.ToggleDirectionView(_[0].object.name); - }), r.addEventListener("mousemove", (y) => { + }), r.addEventListener("mousemove", (b) => { var v = {}; - v.x = y.offsetX / r.clientWidth * 2 - 1, v.y = -(y.offsetY / r.clientHeight) * 2 + 1; - var b = new os(); - b.setFromCamera(v, n.camera); - const _ = b.intersectObjects(o, !1); + v.x = b.offsetX / r.clientWidth * 2 - 1, v.y = -(b.offsetY / r.clientHeight) * 2 + 1; + var y = new os(); + y.setFromCamera(v, n.camera); + const _ = y.intersectObjects(o, !1); for (var M of o) M.material.opacity = 0.01; _.length > 0 && (_[0].object.material.opacity = 0.2); @@ -40557,7 +40537,7 @@ function PS(s, e, t) { c: 30, point: new P(f, -f, -f) } - ], y = [ + ], b = [ { name: "top_front", a: 30, @@ -40646,8 +40626,8 @@ function PS(s, e, t) { o.push(d(x[v])); for (var v = 0; v < g.length; v++) o.push(d(g[v])); - for (var v = 0; v < y.length; v++) - o.push(d(y[v])); + for (var v = 0; v < b.length; v++) + o.push(d(b[v])); } function d(m) { const f = new rs(m.a, m.b, m.c), x = new Vt({ @@ -40655,7 +40635,7 @@ function PS(s, e, t) { transparent: !0, opacity: 0.01 }), g = new De().makeTranslation(m.point.x, m.point.y, m.point.z); - let y = f.applyMatrix4(g), v = new at(y, x); + let b = f.applyMatrix4(g), v = new at(b, x); return v.name = m.name, n.sceneOrtho.add(v), v; } return n.ToggleCameraType = function() { @@ -40727,15 +40707,15 @@ function LS(s) { if (a.children == null || a.children.length == 0) { if (a.elements != null) for (var m of a.elements) { - let f = s.engineStatus.hideModels.find((y) => y.url == o.url)?.ids; + let f = s.engineStatus.hideModels.find((b) => b.url == o.url)?.ids; if (f != null && f.includes(m)) continue; - let x = s.engineStatus.translucentModels.find((y) => y.url == o.url)?.ids; + let x = s.engineStatus.translucentModels.find((b) => b.url == o.url)?.ids; if (x != null && x.includes(m)) continue; - let g = s.models.find((y) => y.url == o.url).nodesMap.get(m); - g != null && !g.instance && g.infos.map((y) => y.mesh).forEach((y) => { - n.push(y); + let g = s.models.find((b) => b.url == o.url).nodesMap.get(m); + g != null && !g.instance && g.infos.map((b) => b.mesh).forEach((b) => { + n.push(b); }); } } else { @@ -40747,8 +40727,8 @@ function LS(s) { let g = s.engineStatus.translucentModels.find((v) => v.url == o.url)?.ids; if (g != null && g.includes(m)) continue; - let y = s.models.find((v) => v.url == o.url).nodesMap.get(m); - y != null && !y.instance && y.infos.map((v) => v.mesh).forEach((v) => { + let b = s.models.find((v) => v.url == o.url).nodesMap.get(m); + b != null && !b.instance && b.infos.map((v) => v.mesh).forEach((v) => { n.push(v); }); } @@ -41223,7 +41203,7 @@ class zi { } function n(l) { if (l.container == null) { - let y = [ + let b = [ '', '', // 填充区域 @@ -41233,19 +41213,19 @@ class zi { '' + e.getMeasureText(l.text, 2) + "", "" ].join(""); - l.container = document.createElement("div"), l.container.className = "area-annotation", l.container.id = l.id, l.container.innerHTML = y, e.engine.measure.annotationContainer.appendChild(l.container), l.container.getElementsByTagName("svg")[0].addEventListener("click", function() { + l.container = document.createElement("div"), l.container.className = "area-annotation", l.container.id = l.id, l.container.innerHTML = b, e.engine.measure.annotationContainer.appendChild(l.container), l.container.getElementsByTagName("svg")[0].addEventListener("click", function() { e.clearHighlight(), l.container.getElementsByTagName("svg")[0].classList.add("Hight"), l.highlight = !0, e.engine.events.trigger(Xt.MeasureClick, l); }); } if (!l.points || l.points.length < 3) return; let c = e.engine.reactBoundingClientRect.left, h = e.engine.reactBoundingClientRect.top, u = [], p = 0, d = 0; - for (let y = 0; y < l.points.length; y++) { - let v = new Pn(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(l.points[y]); + for (let b = 0; b < l.points.length; b++) { + let v = new Pn(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(l.points[b]); v.x += c, v.y += h, u.push(v), p += v.x, d += v.y; } p = p / u.length, d = d / u.length; - let m = u.map((y) => y.x + "," + y.y).join(" "), f = l.container; + let m = u.map((b) => b.x + "," + b.y).join(" "), f = l.container; f.getElementsByTagName("polygon")[0].setAttribute("points", m), f.getElementsByTagName("polyline")[0].setAttribute("points", m); let x = p, g = d; f.getElementsByTagName("rect")[0].setAttribute("x", x - 40), f.getElementsByTagName("rect")[0].setAttribute("y", g - 12.5), f.getElementsByTagName("text")[0].setAttribute("x", x), f.getElementsByTagName("text")[0].setAttribute("y", g + 4), f.getElementsByTagName("text")[0].innerHTML = e.getMeasureText(l.text, 2), f.style.top = "0px", f.style.left = "0px"; @@ -41949,7 +41929,7 @@ function qS(s, e = ArrayBuffer) { function ZS(s, e) { if (!s.index) { const t = s.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = qS(t, n); - s.setIndex(new yt(i, 1)); + s.setIndex(new bt(i, 1)); for (let r = 0; r < t; r++) i[r] = r; } @@ -41983,12 +41963,12 @@ function If(s, e) { function Kc(s, e, t, n, i) { let r = 1 / 0, a = 1 / 0, o = 1 / 0, l = -1 / 0, c = -1 / 0, h = -1 / 0, u = 1 / 0, p = 1 / 0, d = 1 / 0, m = -1 / 0, f = -1 / 0, x = -1 / 0; const g = s.offset || 0; - for (let y = (e - g) * 6, v = (e + t - g) * 6; y < v; y += 6) { - const b = s[y + 0], _ = s[y + 1], M = b - _, T = b + _; - M < r && (r = M), T > l && (l = T), b < u && (u = b), b > m && (m = b); - const R = s[y + 2], S = s[y + 3], E = R - S, L = R + S; + for (let b = (e - g) * 6, v = (e + t - g) * 6; b < v; b += 6) { + const y = s[b + 0], _ = s[b + 1], M = y - _, C = y + _; + M < r && (r = M), C > l && (l = C), y < u && (u = y), y > m && (m = y); + const R = s[b + 2], S = s[b + 3], E = R - S, L = R + S; E < a && (a = E), L > c && (c = L), R < p && (p = R), R > f && (f = R); - const A = s[y + 4], I = s[y + 5], w = A - I, z = A + I; + const A = s[b + 4], I = s[b + 5], w = A - I, z = A + I; w < o && (o = w), z > h && (h = z), A < d && (d = A), A > x && (x = A); } n[0] = r, n[1] = a, n[2] = o, n[3] = l, n[4] = c, n[5] = h, i[0] = u, i[1] = p, i[2] = d, i[3] = m, i[4] = f, i[5] = x; @@ -42005,16 +41985,16 @@ function Nf(s, e, t = null, n = null, i = null) { const u = ["getX", "getY", "getZ"], p = i.offset; for (let d = e, m = e + t; d < m; d++) { const f = (n ? n[d] : d) * 3, x = (d - p) * 6; - let g = f + 0, y = f + 1, v = f + 2; - a && (g = a[g], y = a[y], v = a[v]), o || (g = g * h + c, y = y * h + c, v = v * h + c); - for (let b = 0; b < 3; b++) { - let _, M, T; - o ? (_ = r[u[b]](g), M = r[u[b]](y), T = r[u[b]](v)) : (_ = l[g + b], M = l[y + b], T = l[v + b]); + let g = f + 0, b = f + 1, v = f + 2; + a && (g = a[g], b = a[b], v = a[v]), o || (g = g * h + c, b = b * h + c, v = v * h + c); + for (let y = 0; y < 3; y++) { + let _, M, C; + o ? (_ = r[u[y]](g), M = r[u[y]](b), C = r[u[y]](v)) : (_ = l[g + y], M = l[b + y], C = l[v + y]); let R = _; - M < R && (R = M), T < R && (R = T); + M < R && (R = M), C < R && (R = C); let S = _; - M > S && (S = M), T > S && (S = T); - const E = (S - R) / 2, L = b * 2; + M > S && (S = M), C > S && (S = C); + const E = (S - R) / 2, L = y * 2; i[x + L + 0] = R + E, i[x + L + 1] = E + (Math.abs(R) + E) * XS; } } @@ -42075,69 +42055,69 @@ function $S(s, e, t, n, i, r) { x.length = i; let g = 0; for (let v = u; v < p; v += 6, g++) { - const b = x[g]; - b.candidate = t[v + 2 * d], b.count = 0; + const y = x[g]; + y.candidate = t[v + 2 * d], y.count = 0; const { bounds: _, leftCacheBounds: M, - rightCacheBounds: T - } = b; + rightCacheBounds: C + } = y; for (let R = 0; R < 3; R++) - T[R] = 1 / 0, T[R + 3] = -1 / 0, M[R] = 1 / 0, M[R + 3] = -1 / 0, _[R] = 1 / 0, _[R + 3] = -1 / 0; + C[R] = 1 / 0, C[R + 3] = -1 / 0, M[R] = 1 / 0, M[R + 3] = -1 / 0, _[R] = 1 / 0, _[R + 3] = -1 / 0; Vo(v, t, _); } x.sort(YS); - let y = i; - for (let v = 0; v < y; v++) { - const b = x[v]; - for (; v + 1 < y && x[v + 1].candidate === b.candidate; ) - x.splice(v + 1, 1), y--; + let b = i; + for (let v = 0; v < b; v++) { + const y = x[v]; + for (; v + 1 < b && x[v + 1].candidate === y.candidate; ) + x.splice(v + 1, 1), b--; } for (let v = u; v < p; v += 6) { - const b = t[v + 2 * d]; - for (let _ = 0; _ < y; _++) { + const y = t[v + 2 * d]; + for (let _ = 0; _ < b; _++) { const M = x[_]; - b >= M.candidate ? Vo(v, t, M.rightCacheBounds) : (Vo(v, t, M.leftCacheBounds), M.count++); + y >= M.candidate ? Vo(v, t, M.rightCacheBounds) : (Vo(v, t, M.leftCacheBounds), M.count++); } } - for (let v = 0; v < y; v++) { - const b = x[v], _ = b.count, M = i - b.count, T = b.leftCacheBounds, R = b.rightCacheBounds; + for (let v = 0; v < b; v++) { + const y = x[v], _ = y.count, M = i - y.count, C = y.leftCacheBounds, R = y.rightCacheBounds; let S = 0; - _ !== 0 && (S = ca(T) / l); + _ !== 0 && (S = ca(C) / l); let E = 0; M !== 0 && (E = ca(R) / l); const L = Df + Yc * (S * _ + E * M); - L < c && (a = d, c = L, o = b.candidate); + L < c && (a = d, c = L, o = y.candidate); } } else { - for (let y = 0; y < Ai; y++) { - const v = qi[y]; - v.count = 0, v.candidate = m + f + y * f; - const b = v.bounds; + for (let b = 0; b < Ai; b++) { + const v = qi[b]; + v.count = 0, v.candidate = m + f + b * f; + const y = v.bounds; for (let _ = 0; _ < 3; _++) - b[_] = 1 / 0, b[_ + 3] = -1 / 0; + y[_] = 1 / 0, y[_ + 3] = -1 / 0; } - for (let y = u; y < p; y += 6) { - let v = ~~((t[y + 2 * d] - m) / f); + for (let b = u; b < p; b += 6) { + let v = ~~((t[b + 2 * d] - m) / f); v >= Ai && (v = Ai - 1); - const b = qi[v]; - b.count++, Vo(y, t, b.bounds); + const y = qi[v]; + y.count++, Vo(b, t, y.bounds); } const x = qi[Ai - 1]; kf(x.bounds, x.rightCacheBounds); - for (let y = Ai - 2; y >= 0; y--) { - const v = qi[y], b = qi[y + 1]; - Uf(v.bounds, b.rightCacheBounds, v.rightCacheBounds); + for (let b = Ai - 2; b >= 0; b--) { + const v = qi[b], y = qi[b + 1]; + Uf(v.bounds, y.rightCacheBounds, v.rightCacheBounds); } let g = 0; - for (let y = 0; y < Ai - 1; y++) { - const v = qi[y], b = v.count, _ = v.bounds, M = qi[y + 1].rightCacheBounds; - b !== 0 && (g === 0 ? kf(_, Go) : Uf(_, Go, Go)), g += b; - let T = 0, R = 0; - g !== 0 && (T = ca(Go) / l); + for (let b = 0; b < Ai - 1; b++) { + const v = qi[b], y = v.count, _ = v.bounds, M = qi[b + 1].rightCacheBounds; + y !== 0 && (g === 0 ? kf(_, Go) : Uf(_, Go, Go)), g += y; + let C = 0, R = 0; + g !== 0 && (C = ca(Go) / l); const S = i - g; S !== 0 && (R = ca(M) / l); - const E = Df + Yc * (T * g + R * S); + const E = Df + Yc * (C * g + R * S); E < c && (a = d, c = E, o = v.candidate); } } @@ -42200,27 +42180,27 @@ function QS(s, e, t, n, i, r) { return a; } } -let ng, yl, Tu, ig; +let ng, bl, Cu, ig; const eE = Math.pow(2, 32); -function Cu(s) { - return "count" in s ? 1 : 1 + Cu(s.left) + Cu(s.right); +function Tu(s) { + return "count" in s ? 1 : 1 + Tu(s.left) + Tu(s.right); } function tE(s, e, t) { - return ng = new Float32Array(t), yl = new Uint32Array(t), Tu = new Uint16Array(t), ig = new Uint8Array(t), Au(s, e); + return ng = new Float32Array(t), bl = new Uint32Array(t), Cu = new Uint16Array(t), ig = new Uint8Array(t), Au(s, e); } function Au(s, e) { const t = s / 4, n = s / 2, i = "count" in e, r = e.boundingData; for (let a = 0; a < 6; a++) ng[t + a] = r[a]; if (i) - return e.buffer ? (ig.set(new Uint8Array(e.buffer), s), s + e.buffer.byteLength) : (yl[t + 6] = e.offset, Tu[n + 14] = e.count, Tu[n + 15] = eg, s + gn); + return e.buffer ? (ig.set(new Uint8Array(e.buffer), s), s + e.buffer.byteLength) : (bl[t + 6] = e.offset, Cu[n + 14] = e.count, Cu[n + 15] = eg, s + gn); { const { left: a, right: o, splitAxis: l } = e, c = s + gn; let h = Au(c, a); const u = s / gn, p = h / gn - u; if (p > eE) throw new Error("MeshBVH: Cannot store relative child node offset greater than 32 bits."); - return yl[t + 6] = p, yl[t + 7] = l, Au(h, o); + return bl[t + 6] = p, bl[t + 7] = l, Au(h, o); } } function nE(s, e, t) { @@ -42244,26 +42224,26 @@ function iE(s, e, t, n, i) { indirect: h } = i, u = s._indirectBuffer, p = s.geometry, d = p.index ? p.index.array : null, m = h ? QS : JS, f = Ws(p), x = new Float32Array(6); let g = !1; - const y = new Jc(); - return Kc(e, t, n, y.boundingData, x), b(y, t, n, x), y; + const b = new Jc(); + return Kc(e, t, n, b.boundingData, x), y(b, t, n, x), b; function v(_) { c && c(_ / f); } - function b(_, M, T, R = null, S = 0) { - if (!g && S >= r && (g = !0, a && (console.warn(`MeshBVH: Max depth of ${r} reached when generating BVH. Consider increasing maxDepth.`), console.warn(p))), T <= o || S >= r) - return v(M + T), _.offset = M, _.count = T, _; - const E = $S(_.boundingData, R, e, M, T, l); + function y(_, M, C, R = null, S = 0) { + if (!g && S >= r && (g = !0, a && (console.warn(`MeshBVH: Max depth of ${r} reached when generating BVH. Consider increasing maxDepth.`), console.warn(p))), C <= o || S >= r) + return v(M + C), _.offset = M, _.count = C, _; + const E = $S(_.boundingData, R, e, M, C, l); if (E.axis === -1) - return v(M + T), _.offset = M, _.count = T, _; - const L = m(u, d, e, M, T, E); - if (L === M || L === M + T) - v(M + T), _.offset = M, _.count = T; + return v(M + C), _.offset = M, _.count = C, _; + const L = m(u, d, e, M, C, E); + if (L === M || L === M + C) + v(M + C), _.offset = M, _.count = C; else { _.splitAxis = E.axis; const A = new Jc(), I = M, w = L - M; - _.left = A, Kc(e, I, w, A.boundingData, x), b(A, I, w, x, S + 1); - const z = new Jc(), G = L, j = T - w; - _.right = z, Kc(e, G, j, z.boundingData, x), b(z, G, j, x, S + 1); + _.left = A, Kc(e, I, w, A.boundingData, x), y(A, I, w, x, S + 1); + const z = new Jc(), G = L, j = C - w; + _.right = z, Kc(e, G, j, z.boundingData, x), y(z, G, j, x, S + 1); } return _; } @@ -42280,7 +42260,7 @@ function sE(s, e) { i = Nf(n, a.offset, a.count), r = If(n, e.range); } s._roots = r.map((a) => { - const o = iE(s, i, a.offset, a.count, e), l = Cu(o), c = new t(gn * l); + const o = iE(s, i, a.offset, a.count, e), l = Tu(o), c = new t(gn * l); return tE(0, o, c), c; }); } @@ -42411,101 +42391,101 @@ Yn.prototype.closestPointToSegment = /* @__PURE__ */ (function() { })(); Yn.prototype.intersectsTriangle = /* @__PURE__ */ (function() { const s = /* @__PURE__ */ new Yn(), e = /* @__PURE__ */ new ki(), t = /* @__PURE__ */ new ki(), n = /* @__PURE__ */ new P(), i = /* @__PURE__ */ new P(), r = /* @__PURE__ */ new P(), a = /* @__PURE__ */ new P(), o = /* @__PURE__ */ new Zn(), l = /* @__PURE__ */ new Zn(), c = /* @__PURE__ */ new P(), h = /* @__PURE__ */ new he(), u = /* @__PURE__ */ new he(); - function p(v, b, _, M) { - const T = n; - !v.isDegenerateIntoPoint && !v.isDegenerateIntoSegment ? T.copy(v.plane.normal) : T.copy(b.plane.normal); + function p(v, y, _, M) { + const C = n; + !v.isDegenerateIntoPoint && !v.isDegenerateIntoSegment ? C.copy(v.plane.normal) : C.copy(y.plane.normal); const R = v.satBounds, S = v.satAxes; for (let A = 1; A < 4; A++) { const I = R[A], w = S[A]; - if (e.setFromPoints(w, b.points), I.isSeparated(e) || (a.copy(T).cross(w), e.setFromPoints(a, v.points), t.setFromPoints(a, b.points), e.isSeparated(t))) return !1; + if (e.setFromPoints(w, y.points), I.isSeparated(e) || (a.copy(C).cross(w), e.setFromPoints(a, v.points), t.setFromPoints(a, y.points), e.isSeparated(t))) return !1; } - const E = b.satBounds, L = b.satAxes; + const E = y.satBounds, L = y.satAxes; for (let A = 1; A < 4; A++) { const I = E[A], w = L[A]; - if (e.setFromPoints(w, v.points), I.isSeparated(e) || (a.crossVectors(T, w), e.setFromPoints(a, v.points), t.setFromPoints(a, b.points), e.isSeparated(t))) return !1; + if (e.setFromPoints(w, v.points), I.isSeparated(e) || (a.crossVectors(C, w), e.setFromPoints(a, v.points), t.setFromPoints(a, y.points), e.isSeparated(t))) return !1; } return _ && (M || console.warn("ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0."), _.start.set(0, 0, 0), _.end.set(0, 0, 0)), !0; } - function d(v, b, _, M, T, R, S, E, L, A, I) { + function d(v, y, _, M, C, R, S, E, L, A, I) { let w = S / (S - E); - A.x = M + (T - M) * w, I.start.subVectors(b, v).multiplyScalar(w).add(v), w = S / (S - L), A.y = M + (R - M) * w, I.end.subVectors(_, v).multiplyScalar(w).add(v); + A.x = M + (C - M) * w, I.start.subVectors(y, v).multiplyScalar(w).add(v), w = S / (S - L), A.y = M + (R - M) * w, I.end.subVectors(_, v).multiplyScalar(w).add(v); } - function m(v, b, _, M, T, R, S, E, L, A, I) { - if (T > 0) - d(v.c, v.a, v.b, M, b, _, L, S, E, A, I); + function m(v, y, _, M, C, R, S, E, L, A, I) { + if (C > 0) + d(v.c, v.a, v.b, M, y, _, L, S, E, A, I); else if (R > 0) - d(v.b, v.a, v.c, _, b, M, E, S, L, A, I); + d(v.b, v.a, v.c, _, y, M, E, S, L, A, I); else if (E * L > 0 || S != 0) - d(v.a, v.b, v.c, b, _, M, S, E, L, A, I); + d(v.a, v.b, v.c, y, _, M, S, E, L, A, I); else if (E != 0) - d(v.b, v.a, v.c, _, b, M, E, S, L, A, I); + d(v.b, v.a, v.c, _, y, M, E, S, L, A, I); else if (L != 0) - d(v.c, v.a, v.b, M, b, _, L, S, E, A, I); + d(v.c, v.a, v.b, M, y, _, L, S, E, A, I); else return !0; return !1; } - function f(v, b, _, M) { - const T = b.degenerateSegment, R = v.plane.distanceToPoint(T.start), S = v.plane.distanceToPoint(T.end); - return On(R) ? On(S) ? p(v, b, _, M) : (_ && (_.start.copy(T.start), _.end.copy(T.start)), v.containsPoint(T.start)) : On(S) ? (_ && (_.start.copy(T.end), _.end.copy(T.end)), v.containsPoint(T.end)) : v.plane.intersectLine(T, n) != null ? (_ && (_.start.copy(n), _.end.copy(n)), v.containsPoint(n)) : !1; + function f(v, y, _, M) { + const C = y.degenerateSegment, R = v.plane.distanceToPoint(C.start), S = v.plane.distanceToPoint(C.end); + return On(R) ? On(S) ? p(v, y, _, M) : (_ && (_.start.copy(C.start), _.end.copy(C.start)), v.containsPoint(C.start)) : On(S) ? (_ && (_.start.copy(C.end), _.end.copy(C.end)), v.containsPoint(C.end)) : v.plane.intersectLine(C, n) != null ? (_ && (_.start.copy(n), _.end.copy(n)), v.containsPoint(n)) : !1; } - function x(v, b, _) { - const M = b.a; + function x(v, y, _) { + const M = y.a; return On(v.plane.distanceToPoint(M)) && v.containsPoint(M) ? (_ && (_.start.copy(M), _.end.copy(M)), !0) : !1; } - function g(v, b, _) { - const M = v.degenerateSegment, T = b.a; - return M.closestPointToPoint(T, !0, n), T.distanceToSquared(n) < Of ? (_ && (_.start.copy(T), _.end.copy(T)), !0) : !1; + function g(v, y, _) { + const M = v.degenerateSegment, C = y.a; + return M.closestPointToPoint(C, !0, n), C.distanceToSquared(n) < Of ? (_ && (_.start.copy(C), _.end.copy(C)), !0) : !1; } - function y(v, b, _, M) { + function b(v, y, _, M) { if (v.isDegenerateIntoSegment) - if (b.isDegenerateIntoSegment) { - const T = v.degenerateSegment, R = b.degenerateSegment, S = i, E = r; - T.delta(S), R.delta(E); - const L = n.subVectors(R.start, T.start), A = S.x * E.y - S.y * E.x; + if (y.isDegenerateIntoSegment) { + const C = v.degenerateSegment, R = y.degenerateSegment, S = i, E = r; + C.delta(S), R.delta(E); + const L = n.subVectors(R.start, C.start), A = S.x * E.y - S.y * E.x; if (On(A)) return !1; const I = (L.x * E.y - L.y * E.x) / A, w = -(S.x * L.y - S.y * L.x) / A; if (I < 0 || I > 1 || w < 0 || w > 1) return !1; - const z = T.start.z + S.z * I, G = R.start.z + E.z * w; - return On(z - G) ? (_ && (_.start.copy(T.start).addScaledVector(S, I), _.end.copy(T.start).addScaledVector(S, I)), !0) : !1; - } else return b.isDegenerateIntoPoint ? g(v, b, _) : f(b, v, _, M); + const z = C.start.z + S.z * I, G = R.start.z + E.z * w; + return On(z - G) ? (_ && (_.start.copy(C.start).addScaledVector(S, I), _.end.copy(C.start).addScaledVector(S, I)), !0) : !1; + } else return y.isDegenerateIntoPoint ? g(v, y, _) : f(y, v, _, M); else { if (v.isDegenerateIntoPoint) - return b.isDegenerateIntoPoint ? b.a.distanceToSquared(v.a) < Of ? (_ && (_.start.copy(v.a), _.end.copy(v.a)), !0) : !1 : b.isDegenerateIntoSegment ? g(b, v, _) : x(b, v, _); - if (b.isDegenerateIntoPoint) - return x(v, b, _); - if (b.isDegenerateIntoSegment) - return f(v, b, _, M); + return y.isDegenerateIntoPoint ? y.a.distanceToSquared(v.a) < Of ? (_ && (_.start.copy(v.a), _.end.copy(v.a)), !0) : !1 : y.isDegenerateIntoSegment ? g(y, v, _) : x(y, v, _); + if (y.isDegenerateIntoPoint) + return x(v, y, _); + if (y.isDegenerateIntoSegment) + return f(v, y, _, M); } } - return function(v, b = null, _ = !1) { + return function(v, y = null, _ = !1) { this.needsUpdate && this.update(), v.isExtendedTriangle ? v.needsUpdate && v.update() : (s.copy(v), s.update(), v = s); - const M = y(this, v, b, _); + const M = b(this, v, y, _); if (M !== void 0) return M; - const T = this.plane, R = v.plane; + const C = this.plane, R = v.plane; let S = R.distanceToPoint(this.a), E = R.distanceToPoint(this.b), L = R.distanceToPoint(this.c); On(S) && (S = 0), On(E) && (E = 0), On(L) && (L = 0); const A = S * E, I = S * L; if (A > 0 && I > 0) return !1; - let w = T.distanceToPoint(v.a), z = T.distanceToPoint(v.b), G = T.distanceToPoint(v.c); + let w = C.distanceToPoint(v.a), z = C.distanceToPoint(v.b), G = C.distanceToPoint(v.c); On(w) && (w = 0), On(z) && (z = 0), On(G) && (G = 0); const j = w * z, Y = w * G; if (j > 0 && Y > 0) return !1; - i.copy(T.normal), r.copy(R.normal); + i.copy(C.normal), r.copy(R.normal); const q = i.cross(r); let ie = 0, W = Math.abs(q.x); const $ = Math.abs(q.y); $ > W && (W = $, ie = 1), Math.abs(q.z) > W && (ie = 2); - const fe = oE[ie], me = this.a[fe], de = this.b[fe], se = this.c[fe], ce = v.a[fe], pe = v.b[fe], ye = v.c[fe]; + const fe = oE[ie], me = this.a[fe], de = this.b[fe], se = this.c[fe], ce = v.a[fe], pe = v.b[fe], be = v.c[fe]; if (m(this, me, de, se, A, I, S, E, L, h, o)) - return p(this, v, b, _); - if (m(v, ce, pe, ye, j, Y, w, z, G, u, l)) - return p(this, v, b, _); + return p(this, v, y, _); + if (m(v, ce, pe, be, j, Y, w, z, G, u, l)) + return p(this, v, y, _); if (h.y < h.x) { const Se = h.y; h.y = h.x, h.x = Se, c.copy(o.start), o.start.copy(o.end), o.end.copy(c); @@ -42514,7 +42494,7 @@ Yn.prototype.intersectsTriangle = /* @__PURE__ */ (function() { const Se = u.y; u.y = u.x, u.x = Se, c.copy(l.start), l.start.copy(l.end), l.end.copy(c); } - return h.y < u.x || u.y < h.x ? !1 : (b && (u.x > h.x ? b.start.copy(l.start) : b.start.copy(o.start), u.y < h.y ? b.end.copy(l.end) : b.end.copy(o.end)), !0); + return h.y < u.x || u.y < h.x ? !1 : (y && (u.x > h.x ? y.start.copy(l.start) : y.start.copy(o.start), u.y < h.y ? y.end.copy(l.end) : y.end.copy(o.end)), !0); }; })(); Yn.prototype.distanceToPoint = /* @__PURE__ */ (function() { @@ -42646,24 +42626,24 @@ xn.prototype.distanceToBox = /* @__PURE__ */ (function() { for (let f = 0; f < 3; f++) for (let x = 0; x <= 1; x++) for (let g = 0; g <= 1; g++) { - const y = (f + 1) % 3, v = (f + 2) % 3, b = x << y | g << v, _ = 1 << f | x << y | g << v, M = p[b], T = p[_]; - e[m].set(M, T); - const R = s[f], S = s[y], E = s[v], L = t[m], A = L.start, I = L.end; + const b = (f + 1) % 3, v = (f + 2) % 3, y = x << b | g << v, _ = 1 << f | x << b | g << v, M = p[y], C = p[_]; + e[m].set(M, C); + const R = s[f], S = s[b], E = s[v], L = t[m], A = L.start, I = L.end; A[R] = h[R], A[S] = x ? h[S] : u[S], A[E] = g ? h[E] : u[S], I[R] = u[R], I[S] = x ? h[S] : u[S], I[E] = g ? h[E] : u[S], m++; } for (let f = 0; f <= 1; f++) for (let x = 0; x <= 1; x++) for (let g = 0; g <= 1; g++) { i.x = f ? u.x : h.x, i.y = x ? u.y : h.y, i.z = g ? u.z : h.z, this.closestPointToPoint(i, n); - const y = i.distanceToSquared(n); - if (y < d && (d = y, o && o.copy(n), l && l.copy(i), y < c)) - return Math.sqrt(y); + const b = i.distanceToSquared(n); + if (b < d && (d = b, o && o.copy(n), l && l.copy(i), b < c)) + return Math.sqrt(b); } for (let f = 0; f < 12; f++) { const x = e[f]; for (let g = 0; g < 12; g++) { - const y = t[g]; - pd(x, y, n, i); + const b = t[g]; + pd(x, b, n, i); const v = n.distanceToSquared(i); if (v < d && (d = v, o && o.copy(n), l && l.copy(i), v < c)) return Math.sqrt(v); @@ -42752,20 +42732,20 @@ function Pu(s, e, t, n, i = null, r = 0, a = 0) { return Ln(L, I) + Wn(w, A); }; const d = Qt(s), m = en(s, c); - let f = d, x = m, g, y, v, b; - if (i && (v = ts, b = Er, Lt(f, o, v), Lt(x, o, b), g = i(v), y = i(b), y < g)) { + let f = d, x = m, g, b, v, y; + if (i && (v = ts, y = Er, Lt(f, o, v), Lt(x, o, y), g = i(v), b = i(y), b < g)) { f = m, x = d; const L = g; - g = y, y = L, v = b; + g = b, b = L, v = y; } v || (v = ts, Lt(f, o, v)); const _ = Jt(f * 2, l), M = t(v, _, g, a + 1, r + f / Kt); - let T; + let C; if (M === Lf) { const L = u(f), A = p(f) - L; - T = n(L, A, !0, a + 1, r + f / Kt, v); + C = n(L, A, !0, a + 1, r + f / Kt, v); } else - T = M && Pu( + C = M && Pu( f, e, t, @@ -42774,13 +42754,13 @@ function Pu(s, e, t, n, i = null, r = 0, a = 0) { r, a + 1 ); - if (T) return !0; - b = Er, Lt(x, o, b); - const R = Jt(x * 2, l), S = t(b, R, y, a + 1, r + x / Kt); + if (C) return !0; + y = Er, Lt(x, o, y); + const R = Jt(x * 2, l), S = t(y, R, b, a + 1, r + x / Kt); let E; if (S === Lf) { const L = u(x), A = p(x) - L; - E = n(L, A, !0, a + 1, r + x / Kt, b); + E = n(L, A, !0, a + 1, r + x / Kt, y); } else E = S && Pu( x, @@ -42866,10 +42846,10 @@ function Jl(s, e, t, n, i, r, a) { const { position: d, normal: m, uv: f, uv1: x } = s.attributes; if (Array.isArray(e)) { const g = n * 3; - for (let y = 0, v = p.length; y < v; y++) { - const { start: b, count: _, materialIndex: M } = p[y]; - if (g >= b && g < b + _) { - const T = Gf(e[M]), R = Vf(t, d, m, f, x, l, c, h, T, r, a); + for (let b = 0, v = p.length; b < v; b++) { + const { start: y, count: _, materialIndex: M } = p[b]; + if (g >= y && g < y + _) { + const C = Gf(e[M]), R = Vf(t, d, m, f, x, l, c, h, C, r, a); if (R) if (R.faceIndex = n, R.face.materialIndex = M, i) i.push(R); @@ -42878,12 +42858,12 @@ function Jl(s, e, t, n, i, r, a) { } } } else { - const g = Gf(e), y = Vf(t, d, m, f, x, l, c, h, g, r, a); - if (y) - if (y.faceIndex = n, y.face.materialIndex = 0, i) - i.push(y); + const g = Gf(e), b = Vf(t, d, m, f, x, l, c, h, g, r, a); + if (b) + if (b.faceIndex = n, b.face.materialIndex = 0, i) + i.push(b); else - return y; + return b; } return null; } @@ -42926,29 +42906,29 @@ function xE(s, e = null) { const f = p * 2; if (Jt(f, o)) { const x = a[p + 6], g = o[f + 14]; - let y = 1 / 0, v = 1 / 0, b = 1 / 0, _ = -1 / 0, M = -1 / 0, T = -1 / 0; + let b = 1 / 0, v = 1 / 0, y = 1 / 0, _ = -1 / 0, M = -1 / 0, C = -1 / 0; for (let R = 3 * x, S = 3 * (x + g); R < S; R++) { let E = n[R]; const L = i.getX(E), A = i.getY(E), I = i.getZ(E); - L < y && (y = L), L > _ && (_ = L), A < v && (v = A), A > M && (M = A), I < b && (b = I), I > T && (T = I); + L < b && (b = L), L > _ && (_ = L), A < v && (v = A), A > M && (M = A), I < y && (y = I), I > C && (C = I); } - return l[p + 0] !== y || l[p + 1] !== v || l[p + 2] !== b || l[p + 3] !== _ || l[p + 4] !== M || l[p + 5] !== T ? (l[p + 0] = y, l[p + 1] = v, l[p + 2] = b, l[p + 3] = _, l[p + 4] = M, l[p + 5] = T, !0) : !1; + return l[p + 0] !== b || l[p + 1] !== v || l[p + 2] !== y || l[p + 3] !== _ || l[p + 4] !== M || l[p + 5] !== C ? (l[p + 0] = b, l[p + 1] = v, l[p + 2] = y, l[p + 3] = _, l[p + 4] = M, l[p + 5] = C, !0) : !1; } else { const x = Qt(p), g = en(p, a); - let y = m, v = !1, b = !1; + let b = m, v = !1, y = !1; if (e) { - if (!y) { + if (!b) { const E = x / Kt + d / gn, L = g / Kt + d / gn; - v = e.has(E), b = e.has(L), y = !v && !b; + v = e.has(E), y = e.has(L), b = !v && !y; } } else - v = !0, b = !0; - const _ = y || v, M = y || b; - let T = !1; - _ && (T = u(x, d, y)); + v = !0, y = !0; + const _ = b || v, M = b || y; + let C = !1; + _ && (C = u(x, d, b)); let R = !1; - M && (R = u(g, d, y)); - const S = T || R; + M && (R = u(g, d, b)); + const S = C || R; if (S) for (let E = 0; E < 3; E++) { const L = x + E, A = g + E, I = l[L], w = l[L + 3], z = l[A], G = l[A + 3]; @@ -42961,8 +42941,8 @@ function xE(s, e = null) { function ls(s, e, t, n, i) { let r, a, o, l, c, h; const u = 1 / t.direction.x, p = 1 / t.direction.y, d = 1 / t.direction.z, m = t.origin.x, f = t.origin.y, x = t.origin.z; - let g = e[s], y = e[s + 3], v = e[s + 1], b = e[s + 3 + 1], _ = e[s + 2], M = e[s + 3 + 2]; - return u >= 0 ? (r = (g - m) * u, a = (y - m) * u) : (r = (y - m) * u, a = (g - m) * u), p >= 0 ? (o = (v - f) * p, l = (b - f) * p) : (o = (b - f) * p, l = (v - f) * p), r > l || o > a || ((o > r || isNaN(r)) && (r = o), (l < a || isNaN(a)) && (a = l), d >= 0 ? (c = (_ - x) * d, h = (M - x) * d) : (c = (M - x) * d, h = (_ - x) * d), r > h || c > a) ? !1 : ((c > r || r !== r) && (r = c), (h < a || a !== a) && (a = h), r <= i && a >= n); + let g = e[s], b = e[s + 3], v = e[s + 1], y = e[s + 3 + 1], _ = e[s + 2], M = e[s + 3 + 2]; + return u >= 0 ? (r = (g - m) * u, a = (b - m) * u) : (r = (b - m) * u, a = (g - m) * u), p >= 0 ? (o = (v - f) * p, l = (y - f) * p) : (o = (y - f) * p, l = (v - f) * p), r > l || o > a || ((o > r || isNaN(r)) && (r = o), (l < a || isNaN(a)) && (a = l), d >= 0 ? (c = (_ - x) * d, h = (M - x) * d) : (c = (M - x) * d, h = (_ - x) * d), r > h || c > a) ? !1 : ((c > r || r !== r) && (r = c), (h < a || a !== a) && (a = h), r <= i && a >= n); } function vE(s, e, t, n, i, r, a, o) { const { geometry: l, _indirectBuffer: c } = s; @@ -42971,7 +42951,7 @@ function vE(s, e, t, n, i, r, a, o) { Jl(l, e, t, p, r, a, o); } } -function yE(s, e, t, n, i, r, a) { +function bE(s, e, t, n, i, r, a) { const { geometry: o, _indirectBuffer: l } = s; let c = 1 / 0, h = null; for (let u = n, p = n + i; u < p; u++) { @@ -42980,7 +42960,7 @@ function yE(s, e, t, n, i, r, a) { } return h; } -function bE(s, e, t, n, i, r, a) { +function yE(s, e, t, n, i, r, a) { const { geometry: o } = t, { index: l } = o, c = o.attributes.position; for (let h = s, u = e + s; h < u; h++) { let p; @@ -43049,7 +43029,7 @@ function Du(s, e, t, n, i = null) { intersectsBounds: (x) => $o.intersectsBox(x), intersectsTriangle: (x) => { x.a.applyMatrix4(n), x.b.applyMatrix4(n), x.c.applyMatrix4(n), x.needsUpdate = !0; - for (let g = m * 3, y = (f + m) * 3; g < y; g += 3) + for (let g = m * 3, b = (f + m) * 3; g < b; g += 3) if (Gt(xr, g, h, u), xr.needsUpdate = !0, x.intersectsTriangle(xr)) return !0; return !1; @@ -43057,9 +43037,9 @@ function Du(s, e, t, n, i = null) { }); { const x = Ws(t); - for (let g = m * 3, y = (f + m) * 3; g < y; g += 3) { + for (let g = m * 3, b = (f + m) * 3; g < b; g += 3) { Gt(gr, g, h, u), gr.a.applyMatrix4(da), gr.b.applyMatrix4(da), gr.c.applyMatrix4(da), gr.needsUpdate = !0; - for (let v = 0, b = x * 3; v < b; v += 3) + for (let v = 0, y = x * 3; v < y; v += 3) if (Gt(xr, v, p, d), xr.needsUpdate = !0, gr.intersectsTriangle(xr)) return !0; } @@ -43069,49 +43049,49 @@ function Du(s, e, t, n, i = null) { return Lt(c, r, Yo), !!(i.intersectsBox(Yo) && Du(c, e, t, n, i) || (Lt(h, r, Yo), i.intersectsBox(Yo) && Du(h, e, t, n, i))); } } -const Ko = /* @__PURE__ */ new De(), eh = /* @__PURE__ */ new xn(), pa = /* @__PURE__ */ new xn(), EE = /* @__PURE__ */ new P(), TE = /* @__PURE__ */ new P(), CE = /* @__PURE__ */ new P(), AE = /* @__PURE__ */ new P(); +const Ko = /* @__PURE__ */ new De(), eh = /* @__PURE__ */ new xn(), pa = /* @__PURE__ */ new xn(), EE = /* @__PURE__ */ new P(), CE = /* @__PURE__ */ new P(), TE = /* @__PURE__ */ new P(), AE = /* @__PURE__ */ new P(); function PE(s, e, t, n = {}, i = {}, r = 0, a = 1 / 0) { e.boundingBox || e.computeBoundingBox(), eh.set(e.boundingBox.min, e.boundingBox.max, t), eh.needsUpdate = !0; const o = s.geometry, l = o.attributes.position, c = o.index, h = e.attributes.position, u = e.index, p = Gn.getPrimitive(), d = Gn.getPrimitive(); - let m = EE, f = TE, x = null, g = null; - i && (x = CE, g = AE); - let y = 1 / 0, v = null, b = null; + let m = EE, f = CE, x = null, g = null; + i && (x = TE, g = AE); + let b = 1 / 0, v = null, y = null; return Ko.copy(t).invert(), pa.matrix.copy(Ko), s.shapecast( { boundsTraverseOrder: (_) => eh.distanceToBox(_), - intersectsBounds: (_, M, T) => T < y && T < a ? (M && (pa.min.copy(_.min), pa.max.copy(_.max), pa.needsUpdate = !0), !0) : !1, + intersectsBounds: (_, M, C) => C < b && C < a ? (M && (pa.min.copy(_.min), pa.max.copy(_.max), pa.needsUpdate = !0), !0) : !1, intersectsRange: (_, M) => { if (e.boundsTree) return e.boundsTree.shapecast({ - boundsTraverseOrder: (T) => pa.distanceToBox(T), - intersectsBounds: (T, R, S) => S < y && S < a, - intersectsRange: (T, R) => { - for (let S = T, E = T + R; S < E; S++) { + boundsTraverseOrder: (C) => pa.distanceToBox(C), + intersectsBounds: (C, R, S) => S < b && S < a, + intersectsRange: (C, R) => { + for (let S = C, E = C + R; S < E; S++) { Gt(d, 3 * S, u, h), d.a.applyMatrix4(t), d.b.applyMatrix4(t), d.c.applyMatrix4(t), d.needsUpdate = !0; for (let L = _, A = _ + M; L < A; L++) { Gt(p, 3 * L, c, l), p.needsUpdate = !0; const I = p.distanceToTriangle(d, m, x); - if (I < y && (f.copy(m), g && g.copy(x), y = I, v = L, b = S), I < r) + if (I < b && (f.copy(m), g && g.copy(x), b = I, v = L, y = S), I < r) return !0; } } } }); { - const T = Ws(e); - for (let R = 0, S = T; R < S; R++) { + const C = Ws(e); + for (let R = 0, S = C; R < S; R++) { Gt(d, 3 * R, u, h), d.a.applyMatrix4(t), d.b.applyMatrix4(t), d.c.applyMatrix4(t), d.needsUpdate = !0; for (let E = _, L = _ + M; E < L; E++) { Gt(p, 3 * E, c, l), p.needsUpdate = !0; const A = p.distanceToTriangle(d, m, x); - if (A < y && (f.copy(m), g && g.copy(x), y = A, v = E, b = R), A < r) + if (A < b && (f.copy(m), g && g.copy(x), b = A, v = E, y = R), A < r) return !0; } } } } } - ), Gn.releasePrimitive(p), Gn.releasePrimitive(d), y === 1 / 0 ? null : (n.point ? n.point.copy(f) : n.point = f.clone(), n.distance = y, n.faceIndex = v, i && (i.point ? i.point.copy(g) : i.point = g.clone(), i.point.applyMatrix4(Ko), f.applyMatrix4(Ko), i.distance = f.sub(i.point).length(), i.faceIndex = b), n); + ), Gn.releasePrimitive(p), Gn.releasePrimitive(d), b === 1 / 0 ? null : (n.point ? n.point.copy(f) : n.point = f.clone(), n.distance = b, n.faceIndex = v, i && (i.point ? i.point.copy(g) : i.point = g.clone(), i.point.applyMatrix4(Ko), f.applyMatrix4(Ko), i.distance = f.sub(i.point).length(), i.faceIndex = y), n); } function RE(s, e = null) { e && Array.isArray(e) && (e = new Set(e)); @@ -43124,33 +43104,33 @@ function RE(s, e = null) { const f = p * 2; if (Jt(f, o)) { const x = a[p + 6], g = o[f + 14]; - let y = 1 / 0, v = 1 / 0, b = 1 / 0, _ = -1 / 0, M = -1 / 0, T = -1 / 0; + let b = 1 / 0, v = 1 / 0, y = 1 / 0, _ = -1 / 0, M = -1 / 0, C = -1 / 0; for (let R = x, S = x + g; R < S; R++) { const E = 3 * s.resolveTriangleIndex(R); for (let L = 0; L < 3; L++) { let A = E + L; A = n ? n[A] : A; const I = i.getX(A), w = i.getY(A), z = i.getZ(A); - I < y && (y = I), I > _ && (_ = I), w < v && (v = w), w > M && (M = w), z < b && (b = z), z > T && (T = z); + I < b && (b = I), I > _ && (_ = I), w < v && (v = w), w > M && (M = w), z < y && (y = z), z > C && (C = z); } } - return l[p + 0] !== y || l[p + 1] !== v || l[p + 2] !== b || l[p + 3] !== _ || l[p + 4] !== M || l[p + 5] !== T ? (l[p + 0] = y, l[p + 1] = v, l[p + 2] = b, l[p + 3] = _, l[p + 4] = M, l[p + 5] = T, !0) : !1; + return l[p + 0] !== b || l[p + 1] !== v || l[p + 2] !== y || l[p + 3] !== _ || l[p + 4] !== M || l[p + 5] !== C ? (l[p + 0] = b, l[p + 1] = v, l[p + 2] = y, l[p + 3] = _, l[p + 4] = M, l[p + 5] = C, !0) : !1; } else { const x = Qt(p), g = en(p, a); - let y = m, v = !1, b = !1; + let b = m, v = !1, y = !1; if (e) { - if (!y) { + if (!b) { const E = x / Kt + d / gn, L = g / Kt + d / gn; - v = e.has(E), b = e.has(L), y = !v && !b; + v = e.has(E), y = e.has(L), b = !v && !y; } } else - v = !0, b = !0; - const _ = y || v, M = y || b; - let T = !1; - _ && (T = u(x, d, y)); + v = !0, y = !0; + const _ = b || v, M = b || y; + let C = !1; + _ && (C = u(x, d, b)); let R = !1; - M && (R = u(g, d, y)); - const S = T || R; + M && (R = u(g, d, b)); + const S = C || R; if (S) for (let E = 0; E < 3; E++) { const L = x + E, A = g + E, I = l[L], w = l[L + 3], z = l[A], G = l[A + 3]; @@ -43186,7 +43166,7 @@ function Nu(s, e, t, n, i, r) { let c = s * 2; if (Jt(c, o)) { const h = Ln(s, l), u = Wn(c, o); - return yE(e, t, n, h, u, i, r); + return bE(e, t, n, h, u, i, r); } else { const h = md(s, l), u = DE[h], p = n.direction[u] >= 0; let d, m; @@ -43204,7 +43184,7 @@ function Nu(s, e, t, n, i, r) { return f && x ? f.distance <= x.distance ? f : x : f || x || null; } } -const Jo = /* @__PURE__ */ new xt(), vr = /* @__PURE__ */ new Yn(), yr = /* @__PURE__ */ new Yn(), fa = /* @__PURE__ */ new De(), Xf = /* @__PURE__ */ new xn(), Qo = /* @__PURE__ */ new xn(); +const Jo = /* @__PURE__ */ new xt(), vr = /* @__PURE__ */ new Yn(), br = /* @__PURE__ */ new Yn(), fa = /* @__PURE__ */ new De(), Xf = /* @__PURE__ */ new xn(), Qo = /* @__PURE__ */ new xn(); function NE(s, e, t, n) { wt.setBuffer(s._roots[e]); const i = Bu(0, s, t, n); @@ -43220,19 +43200,19 @@ function Bu(s, e, t, n, i = null) { intersectsBounds: (x) => Qo.intersectsBox(x), intersectsTriangle: (x) => { x.a.applyMatrix4(n), x.b.applyMatrix4(n), x.c.applyMatrix4(n), x.needsUpdate = !0; - for (let g = m, y = f + m; g < y; g++) - if (Gt(yr, 3 * e.resolveTriangleIndex(g), h, u), yr.needsUpdate = !0, x.intersectsTriangle(yr)) + for (let g = m, b = f + m; g < b; g++) + if (Gt(br, 3 * e.resolveTriangleIndex(g), h, u), br.needsUpdate = !0, x.intersectsTriangle(br)) return !0; return !1; } }); { const x = Ws(t); - for (let g = m, y = f + m; g < y; g++) { + for (let g = m, b = f + m; g < b; g++) { const v = e.resolveTriangleIndex(g); Gt(vr, 3 * v, h, u), vr.a.applyMatrix4(fa), vr.b.applyMatrix4(fa), vr.c.applyMatrix4(fa), vr.needsUpdate = !0; - for (let b = 0, _ = x * 3; b < _; b += 3) - if (Gt(yr, b, p, d), yr.needsUpdate = !0, vr.intersectsTriangle(yr)) + for (let y = 0, _ = x * 3; y < _; y += 3) + if (Gt(br, y, p, d), br.needsUpdate = !0, vr.intersectsTriangle(br)) return !0; } } @@ -43247,52 +43227,52 @@ function zE(s, e, t, n = {}, i = {}, r = 0, a = 1 / 0) { const o = s.geometry, l = o.attributes.position, c = o.index, h = e.attributes.position, u = e.index, p = Gn.getPrimitive(), d = Gn.getPrimitive(); let m = BE, f = kE, x = null, g = null; i && (x = UE, g = OE); - let y = 1 / 0, v = null, b = null; + let b = 1 / 0, v = null, y = null; return el.copy(t).invert(), ma.matrix.copy(el), s.shapecast( { boundsTraverseOrder: (_) => th.distanceToBox(_), - intersectsBounds: (_, M, T) => T < y && T < a ? (M && (ma.min.copy(_.min), ma.max.copy(_.max), ma.needsUpdate = !0), !0) : !1, + intersectsBounds: (_, M, C) => C < b && C < a ? (M && (ma.min.copy(_.min), ma.max.copy(_.max), ma.needsUpdate = !0), !0) : !1, intersectsRange: (_, M) => { if (e.boundsTree) { - const T = e.boundsTree; - return T.shapecast({ + const C = e.boundsTree; + return C.shapecast({ boundsTraverseOrder: (R) => ma.distanceToBox(R), - intersectsBounds: (R, S, E) => E < y && E < a, + intersectsBounds: (R, S, E) => E < b && E < a, intersectsRange: (R, S) => { for (let E = R, L = R + S; E < L; E++) { - const A = T.resolveTriangleIndex(E); + const A = C.resolveTriangleIndex(E); Gt(d, 3 * A, u, h), d.a.applyMatrix4(t), d.b.applyMatrix4(t), d.c.applyMatrix4(t), d.needsUpdate = !0; for (let I = _, w = _ + M; I < w; I++) { const z = s.resolveTriangleIndex(I); Gt(p, 3 * z, c, l), p.needsUpdate = !0; const G = p.distanceToTriangle(d, m, x); - if (G < y && (f.copy(m), g && g.copy(x), y = G, v = I, b = E), G < r) + if (G < b && (f.copy(m), g && g.copy(x), b = G, v = I, y = E), G < r) return !0; } } } }); } else { - const T = Ws(e); - for (let R = 0, S = T; R < S; R++) { + const C = Ws(e); + for (let R = 0, S = C; R < S; R++) { Gt(d, 3 * R, u, h), d.a.applyMatrix4(t), d.b.applyMatrix4(t), d.c.applyMatrix4(t), d.needsUpdate = !0; for (let E = _, L = _ + M; E < L; E++) { const A = s.resolveTriangleIndex(E); Gt(p, 3 * A, c, l), p.needsUpdate = !0; const I = p.distanceToTriangle(d, m, x); - if (I < y && (f.copy(m), g && g.copy(x), y = I, v = E, b = R), I < r) + if (I < b && (f.copy(m), g && g.copy(x), b = I, v = E, y = R), I < r) return !0; } } } } } - ), Gn.releasePrimitive(p), Gn.releasePrimitive(d), y === 1 / 0 ? null : (n.point ? n.point.copy(f) : n.point = f.clone(), n.distance = y, n.faceIndex = v, i && (i.point ? i.point.copy(g) : i.point = g.clone(), i.point.applyMatrix4(el), f.applyMatrix4(el), i.distance = f.sub(i.point).length(), i.faceIndex = b), n); + ), Gn.releasePrimitive(p), Gn.releasePrimitive(d), b === 1 / 0 ? null : (n.point ? n.point.copy(f) : n.point = f.clone(), n.distance = b, n.faceIndex = v, i && (i.point ? i.point.copy(g) : i.point = g.clone(), i.point.applyMatrix4(el), f.applyMatrix4(el), i.distance = f.sub(i.point).length(), i.faceIndex = y), n); } function FE() { return typeof SharedArrayBuffer < "u"; } -const Ta = /* @__PURE__ */ new wt.constructor(), kl = /* @__PURE__ */ new wt.constructor(), $i = /* @__PURE__ */ new fd(() => new xt()), br = /* @__PURE__ */ new xt(), _r = /* @__PURE__ */ new xt(), nh = /* @__PURE__ */ new xt(), ih = /* @__PURE__ */ new xt(); +const Ca = /* @__PURE__ */ new wt.constructor(), kl = /* @__PURE__ */ new wt.constructor(), $i = /* @__PURE__ */ new fd(() => new xt()), yr = /* @__PURE__ */ new xt(), _r = /* @__PURE__ */ new xt(), nh = /* @__PURE__ */ new xt(), ih = /* @__PURE__ */ new xt(); let sh = !1; function HE(s, e, t, n) { if (sh) @@ -43302,9 +43282,9 @@ function HE(s, e, t, n) { let a, o = 0, l = 0; const c = new De().copy(t).invert(); for (let h = 0, u = i.length; h < u; h++) { - Ta.setBuffer(i[h]), l = 0; + Ca.setBuffer(i[h]), l = 0; const p = $i.getPrimitive(); - Lt(0, Ta.float32Array, p), p.applyMatrix4(c); + Lt(0, Ca.float32Array, p), p.applyMatrix4(c); for (let d = 0, m = r.length; d < m && (kl.setBuffer(r[d]), a = ei( 0, 0, @@ -43318,31 +43298,31 @@ function HE(s, e, t, n) { p ), kl.clearBuffer(), l += r[d].byteLength / gn, !a); d++) ; - if ($i.releasePrimitive(p), Ta.clearBuffer(), o += i[h].byteLength / gn, a) + if ($i.releasePrimitive(p), Ca.clearBuffer(), o += i[h].byteLength / gn, a) break; } return sh = !1, a; } function ei(s, e, t, n, i, r = 0, a = 0, o = 0, l = 0, c = null, h = !1) { let u, p; - h ? (u = kl, p = Ta) : (u = Ta, p = kl); - const d = u.float32Array, m = u.uint32Array, f = u.uint16Array, x = p.float32Array, g = p.uint32Array, y = p.uint16Array, v = s * 2, b = e * 2, _ = Jt(v, f), M = Jt(b, y); - let T = !1; + h ? (u = kl, p = Ca) : (u = Ca, p = kl); + const d = u.float32Array, m = u.uint32Array, f = u.uint16Array, x = p.float32Array, g = p.uint32Array, b = p.uint16Array, v = s * 2, y = e * 2, _ = Jt(v, f), M = Jt(y, b); + let C = !1; if (M && _) - h ? T = i( + h ? C = i( Ln(e, g), - Wn(e * 2, y), + Wn(e * 2, b), Ln(s, m), Wn(s * 2, f), l, a + e / Kt, o, r + s / Kt - ) : T = i( + ) : C = i( Ln(s, m), Wn(s * 2, f), Ln(e, g), - Wn(e * 2, y), + Wn(e * 2, b), o, r + s / Kt, l, @@ -43352,9 +43332,9 @@ function ei(s, e, t, n, i, r = 0, a = 0, o = 0, l = 0, c = null, h = !1) { const R = $i.getPrimitive(); Lt(e, x, R), R.applyMatrix4(t); const S = Qt(s), E = en(s, m); - Lt(S, d, br), Lt(E, d, _r); - const L = R.intersectsBox(br), A = R.intersectsBox(_r); - T = L && ei( + Lt(S, d, yr), Lt(E, d, _r); + const L = R.intersectsBox(yr), A = R.intersectsBox(_r); + C = L && ei( e, S, n, @@ -43384,7 +43364,7 @@ function ei(s, e, t, n, i, r = 0, a = 0, o = 0, l = 0, c = null, h = !1) { Lt(R, x, nh), Lt(S, x, ih); const E = c.intersectsBox(nh), L = c.intersectsBox(ih); if (E && L) - T = ei( + C = ei( s, R, t, @@ -43411,7 +43391,7 @@ function ei(s, e, t, n, i, r = 0, a = 0, o = 0, l = 0, c = null, h = !1) { ); else if (E) if (_) - T = ei( + C = ei( s, R, t, @@ -43428,9 +43408,9 @@ function ei(s, e, t, n, i, r = 0, a = 0, o = 0, l = 0, c = null, h = !1) { const A = $i.getPrimitive(); A.copy(nh).applyMatrix4(t); const I = Qt(s), w = en(s, m); - Lt(I, d, br), Lt(w, d, _r); - const z = A.intersectsBox(br), G = A.intersectsBox(_r); - T = z && ei( + Lt(I, d, yr), Lt(w, d, _r); + const z = A.intersectsBox(yr), G = A.intersectsBox(_r); + C = z && ei( R, I, n, @@ -43458,7 +43438,7 @@ function ei(s, e, t, n, i, r = 0, a = 0, o = 0, l = 0, c = null, h = !1) { } else if (L) if (_) - T = ei( + C = ei( s, S, t, @@ -43475,9 +43455,9 @@ function ei(s, e, t, n, i, r = 0, a = 0, o = 0, l = 0, c = null, h = !1) { const A = $i.getPrimitive(); A.copy(ih).applyMatrix4(t); const I = Qt(s), w = en(s, m); - Lt(I, d, br), Lt(w, d, _r); - const z = A.intersectsBox(br), G = A.intersectsBox(_r); - T = z && ei( + Lt(I, d, yr), Lt(w, d, _r); + const z = A.intersectsBox(yr), G = A.intersectsBox(_r); + C = z && ei( S, I, n, @@ -43504,7 +43484,7 @@ function ei(s, e, t, n, i, r = 0, a = 0, o = 0, l = 0, c = null, h = !1) { ), $i.releasePrimitive(A); } } - return T; + return C; } const tl = /* @__PURE__ */ new xn(), jf = /* @__PURE__ */ new xt(), VE = { strategy: Q0, @@ -43545,7 +43525,7 @@ class gd { if (o._roots = r, o._indirectBuffer = a || null, n.setIndex) { const c = t.getIndex(); if (c === null) { - const h = new yt(e.index, 1, !1); + const h = new bt(e.index, 1, !1); t.setIndex(h); } else c.array !== i && (c.array.set(i), c.needsUpdate = !0); } @@ -43635,7 +43615,7 @@ class gd { return n; } shapecast(e) { - const t = Gn.getPrimitive(), n = this.indirect ? bE : gE; + const t = Gn.getPrimitive(), n = this.indirect ? yE : gE; let { boundsTraverseOrder: i, intersectsBounds: r, @@ -43673,19 +43653,19 @@ class gd { Gt(h, m * 3, u, p); }; if (r) { - const m = (f, x, g, y, v, b, _, M) => { - for (let T = g, R = g + y; T < R; T++) { - d(T), h.a.applyMatrix4(t), h.b.applyMatrix4(t), h.c.applyMatrix4(t), h.needsUpdate = !0; + const m = (f, x, g, b, v, y, _, M) => { + for (let C = g, R = g + b; C < R; C++) { + d(C), h.a.applyMatrix4(t), h.b.applyMatrix4(t), h.c.applyMatrix4(t), h.needsUpdate = !0; for (let S = f, E = f + x; S < E; S++) - if (c(S), a.needsUpdate = !0, r(a, h, S, T, v, b, _, M)) + if (c(S), a.needsUpdate = !0, r(a, h, S, C, v, y, _, M)) return !0; } return !1; }; if (i) { const f = i; - i = function(x, g, y, v, b, _, M, T) { - return f(x, g, y, v, b, _, M, T) ? !0 : m(x, g, y, v, b, _, M, T); + i = function(x, g, b, v, y, _, M, C) { + return f(x, g, b, v, y, _, M, C) ? !0 : m(x, g, b, v, y, _, M, C); }; } else i = m; @@ -43768,7 +43748,7 @@ function YE(s, e = ArrayBuffer) { function $E(s, e) { if (!s.index) { const t = s.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = YE(t, n); - s.setIndex(new yt(i, 1)); + s.setIndex(new bt(i, 1)); for (let r = 0; r < t; r++) i[r] = r; } @@ -43780,10 +43760,10 @@ function xd(s) { return KE(s) / 3; } const JE = 1e-8, QE = new P(); -function eT(s) { +function eC(s) { return ~~(s / 3); } -function tT(s) { +function tC(s) { return s % 3; } function Zf(s, e) { @@ -43792,7 +43772,7 @@ function Zf(s, e) { function Yf(s, e) { return QE.subVectors(e, s.origin).dot(s.direction); } -function nT(s, e, t, n = JE) { +function nC(s, e, t, n = JE) { s.sort(Zf), e.sort(Zf); for (let o = 0; o < s.length; o++) { const l = s[o]; @@ -43841,7 +43821,7 @@ function nT(s, e, t, n = JE) { } } const $f = 1e-5, Kf = 1e-4; -class iT { +class iC { constructor() { this._rays = []; } @@ -43871,30 +43851,30 @@ class iT { } } const rh = new P(), ah = new P(), nl = new cs(); -function sT(s, e, t) { - const n = s.attributes, i = s.index, r = n.position, a = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), l = Array.from(e), c = new iT(); +function sC(s, e, t) { + const n = s.attributes, i = s.index, r = n.position, a = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), l = Array.from(e), c = new iC(); for (let h = 0, u = l.length; h < u; h++) { - const p = l[h], d = eT(p), m = tT(p); + const p = l[h], d = eC(p), m = tC(p); let f = 3 * d + m, x = 3 * d + (m + 1) % 3; i && (f = i.getX(f), x = i.getX(x)), rh.fromBufferAttribute(r, f), ah.fromBufferAttribute(r, x), qE(rh, ah, nl); - let g, y = c.findClosestRay(nl); - y === null && (y = nl.clone(), c.addRay(y)), o.has(y) || o.set(y, { + let g, b = c.findClosestRay(nl); + b === null && (b = nl.clone(), c.addRay(b)), o.has(b) || o.set(b, { forward: [], reverse: [], - ray: y - }), g = o.get(y); - let v = Yf(y, rh), b = Yf(y, ah); - v > b && ([v, b] = [b, v]), nl.direction.dot(y.direction) < 0 ? g.reverse.push({ start: v, end: b, index: p }) : g.forward.push({ start: v, end: b, index: p }); + ray: b + }), g = o.get(b); + let v = Yf(b, rh), y = Yf(b, ah); + v > y && ([v, y] = [y, v]), nl.direction.dot(b.direction) < 0 ? g.reverse.push({ start: v, end: y, index: p }) : g.forward.push({ start: v, end: y, index: p }); } return o.forEach(({ forward: h, reverse: u }, p) => { - nT(h, u, a, t), h.length === 0 && u.length === 0 && o.delete(p); + nC(h, u, a, t), h.length === 0 && u.length === 0 && o.delete(p); }), { disjointConnectivityMap: a, fragmentMap: o }; } -const rT = new he(), oh = new P(), aT = new tt(), lh = ["", "", ""]; -class oT { +const rC = new he(), oh = new P(), aC = new tt(), lh = ["", "", ""]; +class oC { constructor(e = null) { this.data = null, this.disjointConnections = null, this.unmatchedDisjointEdges = null, this.unmatchedEdges = -1, this.matchedEdges = -1, this.useDrawRange = !0, this.useAllAttributes = !1, this.matchDisjointEdges = !1, this.degenerateEpsilon = 1e-8, e && this.updateFrom(e); } @@ -43918,7 +43898,7 @@ class oT { return this.unmatchedEdges === 0; } updateFrom(e) { - const { useAllAttributes: t, useDrawRange: n, matchDisjointEdges: i, degenerateEpsilon: r } = this, a = t ? v : y, o = /* @__PURE__ */ new Map(), { attributes: l } = e, c = t ? Object.keys(l) : null, h = e.index, u = l.position; + const { useAllAttributes: t, useDrawRange: n, matchDisjointEdges: i, degenerateEpsilon: r } = this, a = t ? v : b, o = /* @__PURE__ */ new Map(), { attributes: l } = e, c = t ? Object.keys(l) : null, h = e.index, u = l.position; let p = xd(e); const d = p; let m = 0; @@ -43926,53 +43906,53 @@ class oT { let f = this.data; (!f || f.length < 3 * d) && (f = new Int32Array(3 * d)), f.fill(-1); let x = 0, g = /* @__PURE__ */ new Set(); - for (let b = m, _ = p * 3 + m; b < _; b += 3) { - const M = b; - for (let T = 0; T < 3; T++) { - let R = M + T; - h && (R = h.getX(R)), lh[T] = a(R); + for (let y = m, _ = p * 3 + m; y < _; y += 3) { + const M = y; + for (let C = 0; C < 3; C++) { + let R = M + C; + h && (R = h.getX(R)), lh[C] = a(R); } - for (let T = 0; T < 3; T++) { - const R = (T + 1) % 3, S = lh[T], E = lh[R], L = `${E}_${S}`; + for (let C = 0; C < 3; C++) { + const R = (C + 1) % 3, S = lh[C], E = lh[R], L = `${E}_${S}`; if (o.has(L)) { - const A = M + T, I = o.get(L); + const A = M + C, I = o.get(L); f[A] = I, f[I] = A, o.delete(L), x += 2, g.delete(I); } else { - const A = `${S}_${E}`, I = M + T; + const A = `${S}_${E}`, I = M + C; o.set(A, I), g.add(I); } } } if (i) { const { - fragmentMap: b, + fragmentMap: y, disjointConnectivityMap: _ - } = sT(e, g, r); - g.clear(), b.forEach(({ forward: M, reverse: T }) => { - M.forEach(({ index: R }) => g.add(R)), T.forEach(({ index: R }) => g.add(R)); - }), this.unmatchedDisjointEdges = b, this.disjointConnections = _, x = p * 3 - g.size; + } = sC(e, g, r); + g.clear(), y.forEach(({ forward: M, reverse: C }) => { + M.forEach(({ index: R }) => g.add(R)), C.forEach(({ index: R }) => g.add(R)); + }), this.unmatchedDisjointEdges = y, this.disjointConnections = _, x = p * 3 - g.size; } this.matchedEdges = x, this.unmatchedEdges = g.size, this.data = f; - function y(b) { - return oh.fromBufferAttribute(u, b), qf(oh); + function b(y) { + return oh.fromBufferAttribute(u, y), qf(oh); } - function v(b) { + function v(y) { let _ = ""; - for (let M = 0, T = c.length; M < T; M++) { + for (let M = 0, C = c.length; M < C; M++) { const R = l[c[M]]; let S; switch (R.itemSize) { case 1: - S = di(R.getX(b)); + S = di(R.getX(y)); break; case 2: - S = XE(rT.fromBufferAttribute(R, b)); + S = XE(rC.fromBufferAttribute(R, y)); break; case 3: - S = qf(oh.fromBufferAttribute(R, b)); + S = qf(oh.fromBufferAttribute(R, y)); break; case 4: - S = jE(aT.fromBufferAttribute(R, b)); + S = jE(aC.fromBufferAttribute(R, y)); break; } _ !== "" && (_ += "|"), _ += S; @@ -44004,7 +43984,7 @@ class Ul extends at { throw new Error("Brush: InterleavedBufferAttributes are not supported."); r.array = ZE(r.array); } - if (e.boundsTree || ($E(e, { useSharedArrayBuffer: n }), e.boundsTree = new gd(e, { maxLeafTris: 3, indirect: !0, useSharedArrayBuffer: n })), e.halfEdges || (e.halfEdges = new oT(e)), !e.groupIndices) { + if (e.boundsTree || ($E(e, { useSharedArrayBuffer: n }), e.boundsTree = new gd(e, { maxLeafTris: 3, indirect: !0, useSharedArrayBuffer: n })), e.halfEdges || (e.halfEdges = new oC(e)), !e.groupIndices) { const i = xd(e), r = new Uint16Array(i), a = e.groups; for (let o = 0, l = a.length; o < l; o++) { const { start: c, count: h } = a[o]; @@ -44019,14 +43999,14 @@ class Ul extends at { e.halfEdges = null, e.boundsTree = null, e.groupIndices = null; } } -const lT = 1e-14, ch = new P(), Jf = new P(), Qf = new P(); -function Qi(s, e = lT) { +const lC = 1e-14, ch = new P(), Jf = new P(), Qf = new P(); +function Qi(s, e = lC) { ch.subVectors(s.b, s.a), Jf.subVectors(s.c, s.a), Qf.subVectors(s.b, s.c); const t = ch.angleTo(Jf), n = ch.angleTo(Qf), i = Math.PI - t - n; return Math.abs(t) < e || Math.abs(n) < e || Math.abs(i) < e || s.a.distanceToSquared(s.b) < e || s.a.distanceToSquared(s.c) < e || s.b.distanceToSquared(s.c) < e; } -const hh = 1e-10, ga = 1e-10, cT = 1e-10, Si = new Zn(), Ut = new Zn(), Ei = new P(), uh = new P(), em = new P(), il = new It(), dh = new Yn(); -class hT { +const hh = 1e-10, ga = 1e-10, cC = 1e-10, Si = new Zn(), Ut = new Zn(), Ei = new P(), uh = new P(), em = new P(), il = new It(), dh = new Yn(); +class hC { constructor() { this._pool = [], this._index = 0; } @@ -44040,9 +44020,9 @@ class hT { this._pool.length = 0, this._index = 0; } } -class uT { +class uC { constructor() { - this.trianglePool = new hT(), this.triangles = [], this.normal = new P(), this.coplanarTriangleUsed = !1; + this.trianglePool = new hC(), this.triangles = [], this.normal = new P(), this.coplanarTriangleUsed = !1; } // initialize the class with a triangle initialize(e) { @@ -44068,7 +44048,7 @@ class uT { // coplanar it will attempt to split by the triangle edge planes splitByTriangle(e) { const { normal: t, triangles: n } = this; - if (e.getNormal(uh).normalize(), Math.abs(1 - Math.abs(uh.dot(t))) < cT) { + if (e.getNormal(uh).normalize(), Math.abs(1 - Math.abs(uh.dot(t))) < cC) { this.coplanarTriangleUsed = !0; for (let r = 0, a = n.length; r < a; r++) { const o = n[r]; @@ -44095,35 +44075,35 @@ class uT { let u = 0, p = -1, d = !1, m = [], f = []; const x = [l, c, h]; for (let g = 0; g < 3; g++) { - const y = (g + 1) % 3; - Si.start.copy(x[g]), Si.end.copy(x[y]); - const v = e.distanceToPoint(Si.start), b = e.distanceToPoint(Si.end); - if (Math.abs(v) < ga && Math.abs(b) < ga) { + const b = (g + 1) % 3; + Si.start.copy(x[g]), Si.end.copy(x[b]); + const v = e.distanceToPoint(Si.start), y = e.distanceToPoint(Si.end); + if (Math.abs(v) < ga && Math.abs(y) < ga) { d = !0; break; } if (v > 0 ? m.push(g) : f.push(g), Math.abs(v) < ga) continue; let _ = !!e.intersectLine(Si, Ei); - !_ && Math.abs(b) < ga && (Ei.copy(Si.end), _ = !0), _ && !(Ei.distanceTo(Si.start) < hh) && (Ei.distanceTo(Si.end) < hh && (p = g), u === 0 ? Ut.start.copy(Ei) : Ut.end.copy(Ei), u++); + !_ && Math.abs(y) < ga && (Ei.copy(Si.end), _ = !0), _ && !(Ei.distanceTo(Si.start) < hh) && (Ei.distanceTo(Si.end) < hh && (p = g), u === 0 ? Ut.start.copy(Ei) : Ut.end.copy(Ei), u++); } if (!d && u === 2 && Ut.distance() > ga) if (p !== -1) { p = (p + 1) % 3; let g = 0; g === p && (g = (g + 1) % 3); - let y = g + 1; - y === p && (y = (y + 1) % 3); + let b = g + 1; + b === p && (b = (b + 1) % 3); const v = i.getTriangle(); - v.a.copy(x[y]), v.b.copy(Ut.end), v.c.copy(Ut.start), Qi(v) || n.push(v), o.a.copy(x[g]), o.b.copy(Ut.start), o.c.copy(Ut.end), Qi(o) && (n.splice(r, 1), r--, a--); + v.a.copy(x[b]), v.b.copy(Ut.end), v.c.copy(Ut.start), Qi(v) || n.push(v), o.a.copy(x[g]), o.b.copy(Ut.start), o.c.copy(Ut.end), Qi(o) && (n.splice(r, 1), r--, a--); } else { const g = m.length >= 2 ? f[0] : m[0]; if (g === 0) { let M = Ut.start; Ut.start = Ut.end, Ut.end = M; } - const y = (g + 1) % 3, v = (g + 2) % 3, b = i.getTriangle(), _ = i.getTriangle(); - x[y].distanceToSquared(Ut.start) < x[v].distanceToSquared(Ut.end) ? (b.a.copy(x[y]), b.b.copy(Ut.start), b.c.copy(Ut.end), _.a.copy(x[y]), _.b.copy(x[v]), _.c.copy(Ut.start)) : (b.a.copy(x[v]), b.b.copy(Ut.start), b.c.copy(Ut.end), _.a.copy(x[y]), _.b.copy(x[v]), _.c.copy(Ut.end)), o.a.copy(x[g]), o.b.copy(Ut.end), o.c.copy(Ut.start), Qi(b) || n.push(b), Qi(_) || n.push(_), Qi(o) && (n.splice(r, 1), r--, a--); + const b = (g + 1) % 3, v = (g + 2) % 3, y = i.getTriangle(), _ = i.getTriangle(); + x[b].distanceToSquared(Ut.start) < x[v].distanceToSquared(Ut.end) ? (y.a.copy(x[b]), y.b.copy(Ut.start), y.c.copy(Ut.end), _.a.copy(x[b]), _.b.copy(x[v]), _.c.copy(Ut.start)) : (y.a.copy(x[v]), y.b.copy(Ut.start), y.c.copy(Ut.end), _.a.copy(x[b]), _.b.copy(x[v]), _.c.copy(Ut.end)), o.a.copy(x[g]), o.b.copy(Ut.end), o.c.copy(Ut.start), Qi(y) || n.push(y), Qi(_) || n.push(_), Qi(o) && (n.splice(r, 1), r--, a--); } else u === 3 && console.warn("TriangleClipper: Coplanar clip not handled"); } @@ -44132,7 +44112,7 @@ class uT { this.triangles.length = 0, this.trianglePool.clear(), this.coplanarTriangleUsed = !1; } } -function dT(s) { +function dC(s) { return s = ~~s, s + 4 - s % 4; } class tm { @@ -44148,7 +44128,7 @@ class tm { setSize(e) { if (this.array && e === this.array.length) return; - const t = this.type, n = ag() ? SharedArrayBuffer : ArrayBuffer, i = new t(new n(dT(e * t.BYTES_PER_ELEMENT))); + const t = this.type, n = ag() ? SharedArrayBuffer : ArrayBuffer, i = new t(new n(dC(e * t.BYTES_PER_ELEMENT))); this.array && i.set(this.array, 0), this.array = i; } expand() { @@ -44166,7 +44146,7 @@ class tm { this.length = 0; } } -class pT { +class pC { constructor() { this.groupAttributes = [{}], this.groupCount = 0; } @@ -44262,7 +44242,7 @@ class nm { n[e] || (n[e] = [], i.push(e)), n[e].push(t); } } -const fT = 0, mT = 1, gT = 2, og = 3, xT = 4, lg = 5, cg = 6, Fn = new cs(), im = new De(), dn = new vt(), Ti = new P(), sm = new tt(), rm = new tt(), am = new tt(), ph = new tt(), sl = new tt(), rl = new tt(), om = new Zn(), fh = new P(), mh = 1e-8, vT = 1e-15, Cs = -1, As = 1, bl = -2, _l = 2, Ca = 0, Ss = 1, vd = 2, yT = 1e-14; +const fC = 0, mC = 1, gC = 2, og = 3, xC = 4, lg = 5, cg = 6, Fn = new cs(), im = new De(), dn = new vt(), Ci = new P(), sm = new tt(), rm = new tt(), am = new tt(), ph = new tt(), sl = new tt(), rl = new tt(), om = new Zn(), fh = new P(), mh = 1e-8, vC = 1e-15, Ts = -1, As = 1, yl = -2, _l = 2, Ta = 0, Ss = 1, vd = 2, bC = 1e-14; let Ml = null; function lm(s) { Ml = s; @@ -44270,9 +44250,9 @@ function lm(s) { function hg(s, e) { s.getMidpoint(Fn.origin), s.getNormal(Fn.direction); const t = e.raycastFirst(Fn, Mt); - return t && Fn.direction.dot(t.face.normal) > 0 ? Cs : As; + return t && Fn.direction.dot(t.face.normal) > 0 ? Ts : As; } -function bT(s, e) { +function yC(s, e) { function t() { return Math.random() - 0.5; } @@ -44282,14 +44262,14 @@ function bT(s, e) { for (let a = 0; a < n; a++) { Fn.direction.x += t() * mh, Fn.direction.y += t() * mh, Fn.direction.z += t() * mh, Fn.direction.multiplyScalar(-1); const o = e.raycastFirst(Fn, Mt); - if (o && Fn.direction.dot(o.face.normal) > 0 && i++, o !== null && (r = Math.min(r, o.distance)), r <= vT) - return o.face.normal.dot(fh) > 0 ? _l : bl; + if (o && Fn.direction.dot(o.face.normal) > 0 && i++, o !== null && (r = Math.min(r, o.distance)), r <= vC) + return o.face.normal.dot(fh) > 0 ? _l : yl; if (i / n > 0.5 || (a - i + 1) / n > 0.5) break; } - return i / n > 0.5 ? Cs : As; + return i / n > 0.5 ? Ts : As; } -function _T(s, e) { +function _C(s, e) { const t = new nm(), n = new nm(); return im.copy(s.matrixWorld).invert().multiply(e.matrixWorld), s.geometry.boundsTree.bvhcast(e.geometry.boundsTree, im, { intersectsTriangles(i, r, a, o) { @@ -44297,7 +44277,7 @@ function _T(s, e) { let l = i.intersectsTriangle(r, om, !0); if (!l) { const c = i.plane, h = r.plane, u = c.normal, p = h.normal; - u.dot(p) === 1 && Math.abs(c.constant - h.constant) < yT && (l = !0); + u.dot(p) === 1 && Math.abs(c.constant - h.constant) < bC && (l = !0); } if (l) { let c = s.geometry.boundsTree.resolveTriangleIndex(a), h = e.geometry.boundsTree.resolveTriangleIndex(o); @@ -44308,7 +44288,7 @@ function _T(s, e) { } }), { aIntersections: t, bIntersections: n }; } -function MT(s, e, t, n, i, r, a = !1) { +function MC(s, e, t, n, i, r, a = !1) { const o = t.attributes, l = t.index, c = s * 3, h = l.getX(c + 0), u = l.getX(c + 1), p = l.getX(c + 2); for (const d in r) { const m = o[d], f = r[d]; @@ -44318,45 +44298,45 @@ function MT(s, e, t, n, i, r, a = !1) { d === "position" ? (dn.a.fromBufferAttribute(m, h).applyMatrix4(n), dn.b.fromBufferAttribute(m, u).applyMatrix4(n), dn.c.fromBufferAttribute(m, p).applyMatrix4(n), gh(dn.a, dn.b, dn.c, e, 3, f, a)) : d === "normal" ? (dn.a.fromBufferAttribute(m, h).applyNormalMatrix(i), dn.b.fromBufferAttribute(m, u).applyNormalMatrix(i), dn.c.fromBufferAttribute(m, p).applyNormalMatrix(i), a && (dn.a.multiplyScalar(-1), dn.b.multiplyScalar(-1), dn.c.multiplyScalar(-1)), gh(dn.a, dn.b, dn.c, e, 3, f, a, !0)) : (sm.fromBufferAttribute(m, h), rm.fromBufferAttribute(m, u), am.fromBufferAttribute(m, p), gh(sm, rm, am, e, x, f, a)); } } -function wT(s, e, t, n, i, r, a, o = !1) { +function wC(s, e, t, n, i, r, a, o = !1) { xh(s, n, i, r, a, o), xh(o ? t : e, n, i, r, a, o), xh(o ? e : t, n, i, r, a, o); } function ug(s, e, t = !1) { switch (s) { - case fT: + case fC: if (e === As || e === _l && !t) return Ss; break; - case mT: + case mC: if (t) { - if (e === Cs) - return Ca; - } else if (e === As || e === bl) + if (e === Ts) + return Ta; + } else if (e === As || e === yl) return Ss; break; - case gT: + case gC: if (t) { - if (e === As || e === bl) + if (e === As || e === yl) return Ss; - } else if (e === Cs) - return Ca; + } else if (e === Ts) + return Ta; break; - case xT: - if (e === Cs) - return Ca; + case xC: + if (e === Ts) + return Ta; if (e === As) return Ss; break; case og: - if (e === Cs || e === _l && !t) + if (e === Ts || e === _l && !t) return Ss; break; case lg: - if (!t && (e === As || e === bl)) + if (!t && (e === As || e === yl)) return Ss; break; case cg: - if (!t && (e === Cs || e === _l)) + if (!t && (e === Ts || e === _l)) return Ss; break; default: @@ -44376,10 +44356,10 @@ function xh(s, e, t, n, i, r = !1) { if (!(a in e)) throw new Error(`CSG Operations: Attribute ${a} no available on geometry.`); const c = o.itemSize; - a === "position" ? (Ti.fromBufferAttribute(o, s).applyMatrix4(t), l.push(Ti.x, Ti.y, Ti.z)) : a === "normal" ? (Ti.fromBufferAttribute(o, s).applyNormalMatrix(n), r && Ti.multiplyScalar(-1), l.push(Ti.x, Ti.y, Ti.z)) : (l.push(o.getX(s)), c > 1 && l.push(o.getY(s)), c > 2 && l.push(o.getZ(s)), c > 3 && l.push(o.getW(s))); + a === "position" ? (Ci.fromBufferAttribute(o, s).applyMatrix4(t), l.push(Ci.x, Ci.y, Ci.z)) : a === "normal" ? (Ci.fromBufferAttribute(o, s).applyNormalMatrix(n), r && Ci.multiplyScalar(-1), l.push(Ci.x, Ci.y, Ci.z)) : (l.push(o.getX(s)), c > 1 && l.push(o.getY(s)), c > 2 && l.push(o.getZ(s)), c > 3 && l.push(o.getW(s))); } } -class ST { +class SC { constructor(e) { this.triangle = new vt().copy(e), this.intersects = {}; } @@ -44399,7 +44379,7 @@ class cm { } addTriangleIntersection(e, t, n, i) { const { data: r } = this; - r[e] || (r[e] = new ST(t)), r[e].addTriangle(n, i); + r[e] || (r[e] = new SC(t)), r[e].addTriangle(n, i); } getTrianglesAsArray(e = null) { const { data: t } = this, n = []; @@ -44439,7 +44419,7 @@ class cm { this.data = {}; } } -class ET { +class EC { constructor() { this.enabled = !1, this.triangleIntersectsA = new cm(), this.triangleIntersectsB = new cm(), this.intersectionEdges = []; } @@ -44461,11 +44441,11 @@ class ET { } } const ns = new De(), Ol = new Ke(), Es = new vt(), al = new vt(), Zi = new vt(), ol = new vt(), ni = [], Is = []; -function TT(s) { +function CC(s) { for (const e of s) return e; } -function CT(s, e, t, n, i, r = {}) { - const { useGroups: a = !0 } = r, { aIntersections: o, bIntersections: l } = _T(s, e), c = []; +function TC(s, e, t, n, i, r = {}) { + const { useGroups: a = !0 } = r, { aIntersections: o, bIntersections: l } = _C(s, e), c = []; let h = null, u; return u = a ? 0 : -1, hm(s, e, o, t, !1, n, i, u), um(s, e, o, t, !1, i, u), t.findIndex((p) => p !== cg && p !== lg) !== -1 && (u = a ? s.geometry.groups.length || 1 : -1, hm(e, s, l, t, !0, n, i, u), um(e, s, l, t, !0, i, u)), ni.length = 0, Is.length = 0, { groups: c, @@ -44476,9 +44456,9 @@ function hm(s, e, t, n, i, r, a, o = 0) { const l = s.matrixWorld.determinant() < 0; ns.copy(e.matrixWorld).invert().multiply(s.matrixWorld), Ol.getNormalMatrix(s.matrixWorld).multiplyScalar(l ? -1 : 1); const c = s.geometry.groupIndices, h = s.geometry.index, u = s.geometry.attributes.position, p = e.geometry.boundsTree, d = e.geometry.index, m = e.geometry.attributes.position, f = t.ids, x = t.intersectionSet; - for (let g = 0, y = f.length; g < y; g++) { - const v = f[g], b = o === -1 ? 0 : c[v] + o, _ = 3 * v, M = h.getX(_ + 0), T = h.getX(_ + 1), R = h.getX(_ + 2); - Es.a.fromBufferAttribute(u, M).applyMatrix4(ns), Es.b.fromBufferAttribute(u, T).applyMatrix4(ns), Es.c.fromBufferAttribute(u, R).applyMatrix4(ns), r.reset(), r.initialize(Es); + for (let g = 0, b = f.length; g < b; g++) { + const v = f[g], y = o === -1 ? 0 : c[v] + o, _ = 3 * v, M = h.getX(_ + 0), C = h.getX(_ + 1), R = h.getX(_ + 2); + Es.a.fromBufferAttribute(u, M).applyMatrix4(ns), Es.b.fromBufferAttribute(u, C).applyMatrix4(ns), Es.c.fromBufferAttribute(u, R).applyMatrix4(ns), r.reset(), r.initialize(Es); const S = x[v]; for (let L = 0, A = S.length; L < A; L++) { const I = 3 * S[L], w = d.getX(I + 0), z = d.getX(I + 1), G = d.getX(I + 2); @@ -44486,17 +44466,17 @@ function hm(s, e, t, n, i, r, a, o = 0) { } const E = r.triangles; for (let L = 0, A = E.length; L < A; L++) { - const I = E[L], w = r.coplanarTriangleUsed ? bT(I, p) : hg(I, p); + const I = E[L], w = r.coplanarTriangleUsed ? yC(I, p) : hg(I, p); ni.length = 0, Is.length = 0; for (let z = 0, G = n.length; z < G; z++) { const j = ug(n[z], w, i); - j !== vd && (Is.push(j), ni.push(a[z].getGroupAttrSet(b))); + j !== vd && (Is.push(j), ni.push(a[z].getGroupAttrSet(y))); } if (ni.length !== 0) { Es.getBarycoord(I.a, ol.a), Es.getBarycoord(I.b, ol.b), Es.getBarycoord(I.c, ol.c); for (let z = 0, G = ni.length; z < G; z++) { - const j = ni[z], Y = Is[z] === Ca; - MT(v, ol, s.geometry, s.matrixWorld, Ol, j, l !== Y); + const j = ni[z], Y = Is[z] === Ta; + MC(v, ol, s.geometry, s.matrixWorld, Ol, j, l !== Y); } } } @@ -44507,37 +44487,37 @@ function um(s, e, t, n, i, r, a = 0) { const o = s.matrixWorld.determinant() < 0; ns.copy(e.matrixWorld).invert().multiply(s.matrixWorld), Ol.getNormalMatrix(s.matrixWorld).multiplyScalar(o ? -1 : 1); const l = e.geometry.boundsTree, c = s.geometry.groupIndices, h = s.geometry.index, u = s.geometry.attributes, p = u.position, d = [], m = s.geometry.halfEdges, f = /* @__PURE__ */ new Set(), x = xd(s.geometry); - for (let g = 0, y = x; g < y; g++) + for (let g = 0, b = x; g < b; g++) g in t.intersectionSet || f.add(g); for (; f.size > 0; ) { - const g = TT(f); + const g = CC(f); f.delete(g), d.push(g); - const y = 3 * g, v = h.getX(y + 0), b = h.getX(y + 1), _ = h.getX(y + 2); - Zi.a.fromBufferAttribute(p, v).applyMatrix4(ns), Zi.b.fromBufferAttribute(p, b).applyMatrix4(ns), Zi.c.fromBufferAttribute(p, _).applyMatrix4(ns); + const b = 3 * g, v = h.getX(b + 0), y = h.getX(b + 1), _ = h.getX(b + 2); + Zi.a.fromBufferAttribute(p, v).applyMatrix4(ns), Zi.b.fromBufferAttribute(p, y).applyMatrix4(ns), Zi.c.fromBufferAttribute(p, _).applyMatrix4(ns); const M = hg(Zi, l); Is.length = 0, ni.length = 0; - for (let T = 0, R = n.length; T < R; T++) { - const S = ug(n[T], M, i); - S !== vd && (Is.push(S), ni.push(r[T])); + for (let C = 0, R = n.length; C < R; C++) { + const S = ug(n[C], M, i); + S !== vd && (Is.push(S), ni.push(r[C])); } for (; d.length > 0; ) { - const T = d.pop(); + const C = d.pop(); for (let R = 0; R < 3; R++) { - const S = m.getSiblingTriangleIndex(T, R); + const S = m.getSiblingTriangleIndex(C, R); S !== -1 && f.has(S) && (d.push(S), f.delete(S)); } if (ni.length !== 0) { - const R = 3 * T, S = h.getX(R + 0), E = h.getX(R + 1), L = h.getX(R + 2), A = a === -1 ? 0 : c[T] + a; + const R = 3 * C, S = h.getX(R + 0), E = h.getX(R + 1), L = h.getX(R + 2), A = a === -1 ? 0 : c[C] + a; if (Zi.a.fromBufferAttribute(p, S), Zi.b.fromBufferAttribute(p, E), Zi.c.fromBufferAttribute(p, L), !Qi(Zi)) for (let I = 0, w = ni.length; I < w; I++) { - const z = Is[I], G = ni[I].getGroupAttrSet(A), j = z === Ca; - wT(S, E, L, u, s.matrixWorld, Ol, G, j !== o); + const z = Is[I], G = ni[I].getGroupAttrSet(A), j = z === Ta; + wC(S, E, L, u, s.matrixWorld, Ol, G, j !== o); } } } } } -function AT(s) { +function AC(s) { for (let e = 0; e < s.length - 1; e++) { const t = s[e], n = s[e + 1]; if (t.materialIndex === n.materialIndex) { @@ -44546,7 +44526,7 @@ function AT(s) { } } } -function PT(s, e, t, n) { +function PC(s, e, t, n) { t.clear(); const i = s.attributes; for (let r = 0, a = n.length; r < a; r++) { @@ -44558,16 +44538,16 @@ function PT(s, e, t, n) { for (const r in e.attributes) n.includes(r) || (e.deleteAttribute(r), e.dispose()); } -function RT(s, e, t) { +function RC(s, e, t) { let n = !1, i = -1; const r = s.attributes, a = e.groupAttributes[0]; for (const l in a) { const c = e.getTotalLength(l), h = e.getType(l), u = e.getItemSize(l), p = e.getNormalized(l); let d = r[l]; - (!d || d.array.length < c) && (d = new yt(new h(c), u, p), s.setAttribute(l, d), n = !0); + (!d || d.array.length < c) && (d = new bt(new h(c), u, p), s.setAttribute(l, d), n = !0); let m = 0; for (let f = 0, x = Math.min(t.length, e.groupCount); f < x; f++) { - const g = t[f].index, { array: y, type: v, length: b } = e.groupAttributes[g][l], _ = new v(y.buffer, 0, b); + const g = t[f].index, { array: b, type: v, length: y } = e.groupAttributes[g][l], _ = new v(b.buffer, 0, y); d.array.set(_, m), m += _.length; } d.needsUpdate = !0, i = c / d.itemSize; @@ -44594,9 +44574,9 @@ function dm(s, e) { t[n.materialIndex] = e; })), t; } -class LT { +class LC { constructor() { - this.triangleSplitter = new uT(), this.attributeData = [], this.attributes = ["position", "uv", "normal"], this.useGroups = !0, this.consolidateGroups = !0, this.debug = new ET(); + this.triangleSplitter = new uC(), this.attributeData = [], this.attributes = ["position", "uv", "normal"], this.useGroups = !0, this.consolidateGroups = !0, this.debug = new EC(); } getGroupRanges(e) { return !this.useGroups || e.groups.length === 0 ? [{ start: 0, count: 1 / 0, materialIndex: 0 }] : e.groups.map((t) => ({ ...t })); @@ -44615,38 +44595,38 @@ class LT { debug: u } = this; for (; o.length < i.length; ) - o.push(new pT()); - i.forEach((g, y) => { - PT(e.geometry, g.geometry, o[y], l); - }), u.init(), CT(e, t, n, a, o, { useGroups: c }), u.complete(); + o.push(new pC()); + i.forEach((g, b) => { + PC(e.geometry, g.geometry, o[b], l); + }), u.init(), TC(e, t, n, a, o, { useGroups: c }), u.complete(); const p = this.getGroupRanges(e.geometry), d = dm(p, e.material), m = this.getGroupRanges(t.geometry), f = dm(m, t.material); m.forEach((g) => g.materialIndex += d.length); - let x = [...p, ...m].map((g, y) => ({ ...g, index: y })); + let x = [...p, ...m].map((g, b) => ({ ...g, index: b })); if (c) { const g = [...d, ...f]; h && (x = x.map((v) => { - const b = g[v.materialIndex]; - return v.materialIndex = g.indexOf(b), v; - }).sort((v, b) => v.materialIndex - b.materialIndex)); - const y = []; - for (let v = 0, b = g.length; v < b; v++) { + const y = g[v.materialIndex]; + return v.materialIndex = g.indexOf(y), v; + }).sort((v, y) => v.materialIndex - y.materialIndex)); + const b = []; + for (let v = 0, y = g.length; v < y; v++) { let _ = !1; - for (let M = 0, T = x.length; M < T; M++) { + for (let M = 0, C = x.length; M < C; M++) { const R = x[M]; - R.materialIndex === v && (_ = !0, R.materialIndex = y.length); + R.materialIndex === v && (_ = !0, R.materialIndex = b.length); } - _ && y.push(g[v]); + _ && b.push(g[v]); } i.forEach((v) => { - v.material = y; + v.material = b; }); } else x = [{ start: 0, count: 1 / 0, index: 0, materialIndex: 0 }], i.forEach((g) => { g.material = d[0]; }); - return i.forEach((g, y) => { + return i.forEach((g, b) => { const v = g.geometry; - RT(v, o[y], x), h && AT(v.groups); + RC(v, o[b], x), h && AC(v.groups); }), r ? i : i[0]; } // TODO: fix @@ -44680,7 +44660,7 @@ class LT { this.triangleSplitter.reset(); } } -class DT { +class DC { engine; planeObjects = []; planes = []; @@ -44707,7 +44687,7 @@ class DT { // 平面变化检测 planeStates = /* @__PURE__ */ new Map(); constructor(e, t = {}) { - this.engine = e, this.evaluator = new LT(), this.planeGroup = new ln(), this.planeGroup.name = "CSG_ClippingPlanes_Optimized", t.updateThrottleTime !== void 0 && (this.updateThrottleTime = t.updateThrottleTime), t.cacheExpireTime !== void 0 && (this.cacheExpireTime = t.cacheExpireTime), t.planeThickness !== void 0 && (this.planeThickness = t.planeThickness), this.evaluator.attributes = ["position", "normal"], this.evaluator.useGroups = !1; + this.engine = e, this.evaluator = new LC(), this.planeGroup = new ln(), this.planeGroup.name = "CSG_ClippingPlanes_Optimized", t.updateThrottleTime !== void 0 && (this.updateThrottleTime = t.updateThrottleTime), t.cacheExpireTime !== void 0 && (this.cacheExpireTime = t.cacheExpireTime), t.planeThickness !== void 0 && (this.planeThickness = t.planeThickness), this.evaluator.attributes = ["position", "normal"], this.evaluator.useGroups = !1; } /** * 初始化剖切补面系统 @@ -45033,7 +45013,7 @@ class DT { return t ? (t.visible = !t.visible, t.visible) : !1; } } -class IT { +class IC { engine; isActive = !1; box; @@ -45056,7 +45036,7 @@ class IT { * 初始化 CSG 剖切补面 */ initCsgClipping() { - this.csgClipping = new DT(this.engine, { + this.csgClipping = new DC(this.engine, { updateThrottleTime: 150, cacheExpireTime: 45e3 }), this.csgClipping.planes = this.engine.sectionPlane, this.csgClipping.init(); @@ -45232,7 +45212,7 @@ class IT { 3 // 第二个三角形 ]; - d.setAttribute("position", new yt(m, 3)), d.setIndex(f); + d.setAttribute("position", new bt(m, 3)), d.setIndex(f); let x = t.engine.scene.children.find((M) => M.type == "Group" && M.name == "ClippingBox"); x == null && (x = new ln(), x.name = "ClippingBox", t.engine.scene.add(x)); let g = t.meshs.find((M) => M.name == p); @@ -45246,11 +45226,11 @@ class IT { // 双面渲染 }); M.polygonOffset = !0, M.polygonOffsetFactor = 1, M.polygonOffsetUnits = 4; - const T = new at(d, M); - T.normal = u, T.name = p, x.add(T), t.meshs.push(T); + const C = new at(d, M); + C.normal = u, C.name = p, x.add(C), t.meshs.push(C); } else g.geometry = d; - const y = new Float32Array([ + const b = new Float32Array([ h[0].x, h[0].y, h[0].z, @@ -45272,18 +45252,18 @@ class IT { h[0].z // 点1 ]); - let v = new Hs({ color: 255 }), b = new mt(); - b.setAttribute("position", new yt(y, 3)); + let v = new Hs({ color: 255 }), y = new mt(); + y.setAttribute("position", new bt(b, 3)); let _ = t.meshs.find((M) => M.name == p + "Line"); - _ == null && (_ = new hs(b, v), _.name = p + "Line", x.add(_), t.meshs.push(_)), _.geometry = b, _.material = v, p == "前" || p == "左" || p == "底" ? t.engine.sectionPlane.find((M) => M.name == p).setFromNormalAndCoplanarPoint(u.clone().setLength(-1), e.min) : t.engine.sectionPlane.find((M) => M.name == p).setFromNormalAndCoplanarPoint(u.clone().setLength(-1), e.max), t.engine.scene.children.filter((M) => M.type == "Mesh" && M.url).forEach((M) => { - M.material && Array.isArray(M.material) ? M.material.forEach((T) => { - T.clippingPlanes = t.engine.sectionPlane; + _ == null && (_ = new hs(y, v), _.name = p + "Line", x.add(_), t.meshs.push(_)), _.geometry = y, _.material = v, p == "前" || p == "左" || p == "底" ? t.engine.sectionPlane.find((M) => M.name == p).setFromNormalAndCoplanarPoint(u.clone().setLength(-1), e.min) : t.engine.sectionPlane.find((M) => M.name == p).setFromNormalAndCoplanarPoint(u.clone().setLength(-1), e.max), t.engine.scene.children.filter((M) => M.type == "Mesh" && M.url).forEach((M) => { + M.material && Array.isArray(M.material) ? M.material.forEach((C) => { + C.clippingPlanes = t.engine.sectionPlane; }) : M.material.clippingPlanes = t.engine.sectionPlane; }); } } } -class NT { +class NC { engine; isActive = !1; isDrag = !1; @@ -45387,13 +45367,13 @@ class NT { Math.abs(o.x) * m, Math.abs(o.y) * f, Math.abs(o.z) * x - ), y = Math.max( + ), b = Math.max( Math.abs(l.x) * m, Math.abs(l.y) * f, Math.abs(l.z) * x - ), v = d.clone().add(o.clone().multiplyScalar(-g / 2)).add(l.clone().multiplyScalar(-y / 2)), b = d.clone().add(o.clone().multiplyScalar(g / 2)).add(l.clone().multiplyScalar(-y / 2)), _ = d.clone().add(o.clone().multiplyScalar(g / 2)).add(l.clone().multiplyScalar(y / 2)), M = d.clone().add(o.clone().multiplyScalar(-g / 2)).add(l.clone().multiplyScalar(y / 2)); - v.add(c.clone().multiplyScalar(e)), b.add(c.clone().multiplyScalar(e)), _.add(c.clone().multiplyScalar(e)), M.add(c.clone().multiplyScalar(e)), this.current_center = d.clone().add(c.clone().multiplyScalar(e)), T([v, b, _, M], c, "face"); - function T(R, S, E) { + ), v = d.clone().add(o.clone().multiplyScalar(-g / 2)).add(l.clone().multiplyScalar(-b / 2)), y = d.clone().add(o.clone().multiplyScalar(g / 2)).add(l.clone().multiplyScalar(-b / 2)), _ = d.clone().add(o.clone().multiplyScalar(g / 2)).add(l.clone().multiplyScalar(b / 2)), M = d.clone().add(o.clone().multiplyScalar(-g / 2)).add(l.clone().multiplyScalar(b / 2)); + v.add(c.clone().multiplyScalar(e)), y.add(c.clone().multiplyScalar(e)), _.add(c.clone().multiplyScalar(e)), M.add(c.clone().multiplyScalar(e)), this.current_center = d.clone().add(c.clone().multiplyScalar(e)), C([v, y, _, M], c, "face"); + function C(R, S, E) { const L = new mt(), A = new Float32Array([ R[0].x, R[0].y, @@ -45421,7 +45401,7 @@ class NT { 3 // 第二个三角形 ]; - L.setAttribute("position", new yt(A, 3)), L.setIndex(I); + L.setAttribute("position", new bt(A, 3)), L.setIndex(I); let w = t.meshs.find((q) => q.name == E); if (w == null) { const q = new Vt({ @@ -45460,7 +45440,7 @@ class NT { // 点1 ]); let G = new Hs({ color: 255 }), j = new mt(); - j.setAttribute("position", new yt(z, 3)); + j.setAttribute("position", new bt(z, 3)); let Y = t.meshs.find((q) => q.name == E + "Line"); Y == null && (Y = new hs(j, G), Y.name = E + "Line", n.add(Y), t.meshs.push(Y)), Y.geometry = j, Y.material = G, t.engine.sectionPlane.find((q) => q.name == E).setFromNormalAndCoplanarPoint(S.clone().setLength(t.direction), R[0]); } @@ -45499,7 +45479,7 @@ class NT { } } } -class BT { +class BC { engine; callback_; constructor(e) { @@ -45524,7 +45504,7 @@ class BT { }); } } -class kT { +class kC { engine; sectionBox; sectionFace; @@ -45548,7 +45528,7 @@ class kT { l.name = "face", this.engine.sectionPlane = [t, n, i, r, a, o, l]; } init() { - this.sectionBox = new IT(this.engine), this.sectionFace = new NT(this.engine); + this.sectionBox = new IC(this.engine), this.sectionFace = new NC(this.engine); } // 自动缩放适用的视图比例 scaleBox() { @@ -45598,7 +45578,7 @@ class kT { else if (e == "box") this.sectionBox.init(), this.sectionBox.active(); else if (e == "face") { - let t = new BT(this.engine); + let t = new BC(this.engine); t.init(), t.catch_face((n) => { this.sectionFace.init(), this.sectionFace.active(); let i = this.engine.octreeBox.getBoundingBox(), r = n.position.clone().sub(i.min.clone().add(i.max.clone()).setLength(0.5)), a = new P(n.dir.x, n.dir.y, n.dir.z), o = r.dot(a); @@ -45623,7 +45603,7 @@ class kT { this.sectionFace.disActive(), this.sectionBox.disActive(), this.currentClippingMode = ""; } } -class UT { +class UC { engine; constructor(e) { this.engine = e; @@ -45662,7 +45642,7 @@ class UT { }), e; } } -class OT { +class OC { engine; constructor(e) { this.engine = e; @@ -45700,7 +45680,7 @@ class OT { }); } } -class zT { +class zC { engine; constructor(e) { this.engine = e; @@ -45736,7 +45716,7 @@ class zT { } } } -class FT { +class FC { engine; constructor(e) { this.engine = e; @@ -45829,7 +45809,7 @@ class FT { }), t && t(n), n; } } -class HT { +class HC { engine; isActive = !1; groupEdge; @@ -45937,7 +45917,7 @@ class HT { } } } -class VT { +class VC { config; constructor(e) { this.config = { @@ -46054,7 +46034,7 @@ class VT { return { ...this.config }; } } -class GT { +class GC { /** 引擎实例 */ engine; /** 步骤列表 */ @@ -46108,7 +46088,7 @@ class GT { } }; try { - this.config = i, this.llmApi = new VT(i.llmConfig); + this.config = i, this.llmApi = new VC(i.llmConfig); try { const r = await Promise.resolve().then(() => h4); this.prompts.main = r.default; @@ -46428,7 +46408,7 @@ ${JSON.stringify(l, null, 2)} return new Map(this.stepResults); } } -class WT { +class WC { engine; /** 点位列表 */ points = []; @@ -46664,7 +46644,7 @@ class WT { this.stop(), this.points = [], this.playOptions = {}; } } -class XT { +class XC { engine; miniMapCamera = null; miniMapRenderer = null; @@ -46823,13 +46803,13 @@ class XT { this.miniMapContainer && (this.miniMapContainer.removeEventListener("wheel", this.onWheel), this.miniMapContainer.removeEventListener("mousedown", this.onMouseDown), this.miniMapContainer.removeEventListener("mousemove", this.onMouseMove), this.miniMapContainer.removeEventListener("mouseup", this.onMouseUp), this.miniMapContainer.removeEventListener("mouseleave", this.onMouseUp)), this.miniMapRenderer && (this.miniMapRenderer.dispose(), this.miniMapRenderer = null), this.miniMapContainer && (this.miniMapContainer.remove(), this.miniMapContainer = null), this.miniMapCamera = null, this.overlayCtx = null, this.overlayCanvas = null; } } -const jT = [ +const jC = [ { Id: "100001", Name: "1", Points: [{ X: -2, Y: -5, Z: 0 }, { X: -2, Y: 5, Z: 0 }] }, { Id: "100002", Name: "2", Points: [{ X: 2, Y: -5, Z: 0 }, { X: 2, Y: 5, Z: 0 }] }, { Id: "100003", Name: "A", Points: [{ X: -5, Y: -2, Z: 0 }, { X: 5, Y: -2, Z: 0 }] }, { Id: "100004", Name: "B", Points: [{ X: -5, Y: 2, Z: 0 }, { X: 5, Y: 2, Z: 0 }] } ]; -class qT { +class qC { engine; rootGroup = null; isVisible = !1; @@ -46853,7 +46833,7 @@ class qT { } /** 使用内置模拟数据(调试用) */ setMockData() { - this.setData(jT); + this.setData(jC); } /** 显示轴网 */ show() { @@ -46932,12 +46912,12 @@ class qT { return h.position.copy(t), h.scale.set(0.5, 0.5, 1), h.renderOrder = 999, h; } } -const ZT = [ +const ZC = [ { Id: "339", Name: "站台", Elevation: -0.32808398950131235 }, { Id: "2787", Name: "站厅", Elevation: 16.896325459317584 }, { Id: "236633", Name: "顶板", Elevation: 36.745406824146976 } ]; -class YT { +class YC { engine; isVisible = !1; levels = []; @@ -46963,7 +46943,7 @@ class YT { } /** 使用内置模拟数据(调试用) */ setMockData() { - this.setData(ZT); + this.setData(ZC); } /** 显示标高 */ show() { @@ -47056,14 +47036,14 @@ class YT { return n.textContent = `${e} ▲${t.toFixed(3)}m`, n.setAttribute("text-anchor", "middle"), n.setAttribute("dominant-baseline", "central"), n.setAttribute("fill", this.COLOR), n.setAttribute("font-size", "12"), n.setAttribute("font-family", "Arial, sans-serif"), n.setAttribute("font-weight", "bold"), n.setAttribute("stroke", "white"), n.setAttribute("stroke-width", "2"), n.setAttribute("paint-order", "stroke"), n.style.pointerEvents = "none", n; } } -class $T { +class $C { engine; constructor(e) { } update() { } } -class KT { +class KC { engine; currentHdrId = "0"; isVisible = !0; @@ -47163,7 +47143,7 @@ class KT { // ——— 私有方法 ——— _loadHdr(e) { return new Promise((t, n) => { - new TS().load( + new CS().load( e, (i) => { i.mapping = El, t(i); @@ -47201,7 +47181,7 @@ class KT { this.currentTexture = null, this._removeSkybox(), this.engine.scene && (this.engine.scene.background = null, this.engine.scene.environment = null, this.engine.setting.setAmbientLightIntensity(1)); } } -class JT { +class JC { engine; currentId = "0"; groundGroup; @@ -47279,8 +47259,8 @@ class JT { uWaveSpeed: { value: e.waveSpeed ?? 1 }, uOpacity: { value: t?.opacity ?? 0.82 } }, - vertexShader: QT, - fragmentShader: eC, + vertexShader: QC, + fragmentShader: eT, transparent: !0, side: Mt }); @@ -47319,7 +47299,7 @@ class JT { Array.isArray(e) ? e.forEach((t) => t.dispose()) : e.dispose(), this.groundGroup.remove(this.groundMesh), this.groundMesh = null, this.waterMaterial = null; } } -const QT = ( +const QC = ( /* glsl */ ` uniform float uTime; @@ -47358,7 +47338,7 @@ void main() { gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0); } ` -), eC = ( +), eT = ( /* glsl */ ` uniform float uTime; @@ -47407,7 +47387,7 @@ void main() { } ` ); -class tC { +class tT { // 引擎参数 options; DeviceType; @@ -47493,7 +47473,7 @@ class tC { constructor(e) { if (this.options = e, this.container = document.getElementById(e.containerId), !this.container) throw new Error(`Container ${e.containerId} not found`); - this.engineModelModule = new yS(this), this.engineModelModule.init(), this.ai = new GT(this), this.deviceModule = new d_(this), this.DeviceType = this.deviceModule.getDeviceType(), this.cameraModule = new u_(this), this.sceneModule = new h_(this), this.scene = this.sceneModule.scene, this.renderModule = new p_(this), this.renderer = this.renderModule.createRenderer(), this.camera = this.cameraModule.orthographicCamera, this.scene.camera = this.camera, this.controlModule = new A_(this), this.controlModule.switchDefaultMode(), this.controls = this.controlModule.orbitControls, this.composerModule = new H_(this), this.composerModule.init(), this.events = new dS(), this.engineStatus = new uS(this), this.engineStatus.init(), this.loaderModule = new hS(this), this.lightModule = new pS(this), this.lightModule.init(), this.viewCube = new RS(this), this.viewCube.init(), this.options.showViewCube == !1 && this.viewCube.hide(), this.octreeBox = LS(this), this.rangeScale = new DS(this), this.rangeScale.init(), this.clipping = new kT(this), this.clipping.init(), this.setting = new IS(this), this.setting.init(), this.engineModelModule.init(), this.handelBehaved = ld(this), this.modelMapperBatch = new FT(this), this.measure = new VS(this), this.modelToolModule = new mS(this), this.modelProperties = new zT(this), this.interactionModule = new fS(this), this.interactionModule.init(), this.interactionModule.active(), this.hoverHighLight = new Bl(this), this.modelEdge = new HT(this), this.modelTree = new UT(this), this.engineInfo = new OT(this), this.pathRoaming = new WT(this), this.pathRoaming.init(), this.minMap = new XT(this), this.grid = new qT(this), this.level = new YT(this), this.text = new $T(this), this.hdr = new KT(this), this.ground = new JT(this), this.ground.init(), this.worldToScreen = new Pn(this.camera, this.renderer, this.scene), this.options.showStats && (this.stats = new wS(), this.stats.showPanel(0), this.stats.dom.style.position = "absolute", this.stats.dom.style.top = "0px", this.stats.dom.style.left = "0px", this.stats.dom.style.zIndex = "1000", this.container.appendChild(this.stats.dom)); + this.engineModelModule = new bS(this), this.engineModelModule.init(), this.ai = new GC(this), this.deviceModule = new d_(this), this.DeviceType = this.deviceModule.getDeviceType(), this.cameraModule = new u_(this), this.sceneModule = new h_(this), this.scene = this.sceneModule.scene, this.renderModule = new p_(this), this.renderer = this.renderModule.createRenderer(), this.camera = this.cameraModule.orthographicCamera, this.scene.camera = this.camera, this.controlModule = new A_(this), this.controlModule.switchDefaultMode(), this.controls = this.controlModule.orbitControls, this.composerModule = new H_(this), this.composerModule.init(), this.events = new dS(), this.engineStatus = new uS(this), this.engineStatus.init(), this.loaderModule = new hS(this), this.lightModule = new pS(this), this.lightModule.init(), this.viewCube = new RS(this), this.viewCube.init(), this.options.showViewCube == !1 && this.viewCube.hide(), this.octreeBox = LS(this), this.rangeScale = new DS(this), this.rangeScale.init(), this.clipping = new kC(this), this.clipping.init(), this.setting = new IS(this), this.setting.init(), this.engineModelModule.init(), this.handelBehaved = ld(this), this.modelMapperBatch = new FC(this), this.measure = new VS(this), this.modelToolModule = new mS(this), this.modelProperties = new zC(this), this.interactionModule = new fS(this), this.interactionModule.init(), this.interactionModule.active(), this.hoverHighLight = new Bl(this), this.modelEdge = new HC(this), this.modelTree = new UC(this), this.engineInfo = new OC(this), this.pathRoaming = new WC(this), this.pathRoaming.init(), this.minMap = new XC(this), this.grid = new qC(this), this.level = new YC(this), this.text = new $C(this), this.hdr = new KC(this), this.ground = new JC(this), this.ground.init(), this.worldToScreen = new Pn(this.camera, this.renderer, this.scene), this.options.showStats && (this.stats = new wS(), this.stats.showPanel(0), this.stats.dom.style.position = "absolute", this.stats.dom.style.top = "0px", this.stats.dom.style.left = "0px", this.stats.dom.style.zIndex = "1000", this.container.appendChild(this.stats.dom)); let t = document.createElement("div"); t.className = "versionText", this.versionEl = t, this.updateVersionDisplay(), this.container.appendChild(t); let n = document.createElementNS("http://www.w3.org/2000/svg", "svg"); @@ -47699,8 +47679,8 @@ class tC { }), e.dispose()); } } -function nC(s) { - return new tC(s); +function nT(s) { + return new tT(s); } class Ki { /** 第三方 3D 引擎实例 */ @@ -47766,7 +47746,7 @@ class Ki { showStats: this.options.showStats, showViewCube: this.options.showViewCube }; - if (console.log("引擎配置信息:", e), this.engine = nC(e), !this.engine) + if (console.log("引擎配置信息:", e), this.engine = nT(e), !this.engine) throw new Error("Failed to create engine instance"); this._isInitialized = !0, this.unsubscribeTheme = lt.subscribe((t) => { this.setTheme(t); @@ -47823,10 +47803,21 @@ class Ki { this.engine.viewCube.CameraGoHome(); } /** - * 获取原始 3D 引擎实例 + * 订阅原始引擎事件 + * 用于需要访问底层引擎事件的场景(如测量回调、剖切移动等) + * @param event 事件名称 + * @param handler 事件处理函数 */ - getEngine() { - return this.engine; + onRawEvent(e, t) { + this.engine?.events?.on(e, t); + } + /** + * 取消订阅原始引擎事件 + * @param event 事件名称 + * @param handler 事件处理函数 + */ + offRawEvent(e, t) { + this.engine?.events?.off(e, t); } /** * 暂停渲染 @@ -48150,6 +48141,143 @@ class Ki { } } // ==================== 结束:渲染模式 ==================== + // ==================== 设置功能 ==================== + // ---- 边线 ---- + /** 启用模型边线显示 */ + activeModelEdge() { + if (!this._isInitialized || !this.engine?.modelEdge) { + console.warn("[Engine] Cannot active model edge: engine not initialized."); + return; + } + this.engine.modelEdge.active(); + } + /** 关闭模型边线显示 */ + disActiveModelEdge() { + !this._isInitialized || !this.engine?.modelEdge || this.engine.modelEdge.disActive(); + } + /** 获取边线显示状态 */ + getModelEdgeActive() { + return !this._isInitialized || !this.engine?.modelEdge ? !1 : this.engine.modelEdge.getActive?.() ?? !1; + } + // ---- 光照强度 ---- + /** + * 设置环境光照强度 + * @param intensity 0-100 + */ + setAmbientLightIntensity(e) { + if (!this._isInitialized || !this.engine?.setting) { + console.warn("[Engine] Cannot set ambient light intensity: engine not initialized."); + return; + } + this.engine.setting.setAmbientLightIntensity(e); + } + /** 获取当前环境光照强度 */ + getAmbientLightIntensity() { + return !this._isInitialized || !this.engine?.setting ? 50 : this.engine.setting.getAmbientLightIntensity?.() ?? 50; + } + // ---- 对比度 ---- + /** + * 设置场景对比度 + * @param contrast 0-100 + */ + setSceneContrast(e) { + if (!this._isInitialized || !this.engine?.setting) { + console.warn("[Engine] Cannot set scene contrast: engine not initialized."); + return; + } + this.engine.setting.setSceneContrast(e); + } + /** 获取当前场景对比度 */ + getSceneContrast() { + return !this._isInitialized || !this.engine?.setting ? 50 : this.engine.setting.getSceneContrast?.() ?? 50; + } + // ---- 饾和度 ---- + /** + * 设置场景饾和度 + * @param saturation 0-100 + */ + setSceneSaturation(e) { + if (!this._isInitialized || !this.engine?.setting) { + console.warn("[Engine] Cannot set scene saturation: engine not initialized."); + return; + } + this.engine.setting.setSceneSaturation(e); + } + /** 获取当前场景饾和度 */ + getSceneSaturation() { + return !this._isInitialized || !this.engine?.setting ? 50 : this.engine.setting.getSceneSaturation?.() ?? 50; + } + // ---- 环境背景 ---- + /** 获取 HDR 背景列表 */ + getHDRBackgroundList() { + return !this._isInitialized || !this.engine?.setting ? [] : this.engine.setting.getHDRBackground?.() ?? []; + } + /** + * 设置当前 HDR 背景 + * @param id 背景 ID + */ + setHDRBackgroundId(e) { + if (!this._isInitialized || !this.engine?.setting) { + console.warn("[Engine] Cannot set HDR background: engine not initialized."); + return; + } + this.engine.setting.setHDRBackgroundId(e); + } + /** 获取当前 HDR 背景 ID */ + getHDRBackgroundId() { + return !this._isInitialized || !this.engine?.setting ? "" : this.engine.setting.getHDRBackgroundId?.() ?? ""; + } + /** + * 设置 HDR 背景可见性 + * @param visible 是否可见 + */ + setHDRBackgroundVisibility(e) { + if (!this._isInitialized || !this.engine?.setting) { + console.warn("[Engine] Cannot set HDR background visibility: engine not initialized."); + return; + } + this.engine.setting.setHDRBackgroundVisibility(e); + } + /** 获取 HDR 背景可见性 */ + getHDRBackgroundVisibility() { + return !this._isInitialized || !this.engine?.setting ? !0 : this.engine.setting.getHDRBackgroundVisibility?.() ?? !0; + } + // ---- 地面 ---- + /** 获取地面列表 */ + getGroundList() { + return !this._isInitialized || !this.engine?.setting ? [] : this.engine.setting.getGroundList?.() ?? []; + } + /** + * 设置当前地面类型 + * @param id 地面 ID + */ + setGroundId(e) { + if (!this._isInitialized || !this.engine?.setting) { + console.warn("[Engine] Cannot set ground: engine not initialized."); + return; + } + this.engine.setting.setGroundId(e); + } + /** 获取当前地面 ID */ + getGroundId() { + return !this._isInitialized || !this.engine?.setting ? "" : this.engine.setting.getGroundId?.() ?? ""; + } + /** + * 设置地面高度(单位:m) + * @param elevation 地面高度值 + */ + setGroundElevation(e) { + if (!this._isInitialized || !this.engine?.setting) { + console.warn("[Engine] Cannot set ground elevation: engine not initialized."); + return; + } + this.engine.setting.setGroundElevation(e); + } + /** 获取当前地面高度(单位:m) */ + getGroundElevation() { + return !this._isInitialized || !this.engine?.setting ? 0 : this.engine.setting.getGroundElevation?.() ?? 0; + } + // ==================== 结束:设置功能 ==================== // ==================== 漫游功能 ==================== /** 漫游模式是否激活 */ isWalkModeActive = !1; @@ -48588,7 +48716,7 @@ class Ki { this._isDestroyed || (this.deactivateMeasure(), this.unsubscribeTheme && (this.unsubscribeTheme(), this.unsubscribeTheme = null), this.engine && (this.engine.dispose(), this.engine = null), this.container.innerHTML = "", this.currentMeasureType = null, this.isMeasureActive = !1, this._isDestroyed = !0, this._isInitialized = !1); } } -class iC { +class iT { element; content = null; isVisible = !1; @@ -48674,7 +48802,7 @@ class iC { this.isVisible && (this.element.contains(e.target) || this.hide()); }; } -class yd { +class bd { element; options; unsubscribeLocale = null; @@ -48789,7 +48917,7 @@ class yd { i.style.position = "fixed", i.style.zIndex = "10001"; const r = t.getBoundingClientRect(); i.style.top = `${r.top}px`, i.style.left = `${r.right}px`, i.addEventListener("mousedown", (l) => l.stopPropagation()); - const a = new yd({ items: n }); + const a = new bd({ items: n }); a.init(), i.appendChild(a.element), document.body.appendChild(i), this.activeSubMenu = { menu: a, container: i }; const o = i.getBoundingClientRect(); o.right > window.innerWidth && (i.style.left = `${r.left - o.width}px`); @@ -48809,7 +48937,7 @@ class dg extends Ui { /** 上下文处理器列表 */ contextHandlers = []; constructor(e, t) { - super(t), this.container = e, this.rightKeyPanel = new iC({ + super(t), this.container = e, this.rightKeyPanel = new iT({ zIndex: 9e3, container: this.container, onContext: this.handleContextMenu @@ -48835,7 +48963,7 @@ class dg extends Ui { */ showMenu(e, t, n, i) { if (!n || n.length === 0) return; - const r = new yd({ items: n, groupOrder: i }); + const r = new bd({ items: n, groupOrder: i }); r.init(), this.rightKeyPanel.mount(r), this.rightKeyPanel.show(e, t); } /** 隐藏菜单 */ @@ -48852,16 +48980,24 @@ class dg extends Ui { t && t.length > 0 ? this.showMenu(e.clientX, e.clientY, t) : this.hide(); }; } -class sC extends Ui { +class sT extends Ui { /** 容器元素 */ container; - /** 引擎实例 */ + /** 引擎组件实例 */ engineInstance = null; /** 右键菜单管理器 */ rightKey = null; constructor(e, t) { super(t), this.container = e; } + /** + * 获取 Engine 组件实例 + * 内部管理器通过此方法直接访问 Engine 组件的全部能力 + * @returns Engine 组件实例,未初始化时返回 null + */ + getEngineComponent() { + return this.engineInstance; + } /** * 初始化 3D 引擎 * @param options 引擎配置选项 @@ -48874,7 +49010,7 @@ class sC extends Ui { container: this.container, ...e }, this.registry), this.engineInstance.init(), this.rightKey = new dg(this.container, this.registry), this.rightKey.registerHandler((t) => { - const n = this.getSelectedComponent(), i = []; + const n = this.engineInstance?.getSelectedComponent(), i = []; return n && (i.push({ id: "componentDetail", label: "menu.componentDetail", @@ -48890,8 +49026,8 @@ class sC extends Ui { group: "component", order: 2, onClick: () => { - const r = this.getHighlightModels(); - r && this.hideModels(r), this.rightKey?.hide(); + const r = this.engineInstance?.getHighlightModels(); + r && this.engineInstance?.hideModels(r), this.rightKey?.hide(); } }), i.push({ id: "transparentSelected", @@ -48899,8 +49035,8 @@ class sC extends Ui { group: "component", order: 3, onClick: () => { - const r = this.getHighlightModels(); - r && this.translucentModels(r), this.rightKey?.hide(); + const r = this.engineInstance?.getHighlightModels(); + r && this.engineInstance?.translucentModels(r), this.rightKey?.hide(); } }), i.push({ id: "cancelTranslucent", @@ -48908,7 +49044,7 @@ class sC extends Ui { group: "component", order: 4, onClick: () => { - this.unTranslucentModel(), this.rightKey?.hide(); + this.engineInstance?.unTranslucentModel(), this.rightKey?.hide(); } }), i.push({ id: "isolateSelected", @@ -48921,16 +49057,16 @@ class sC extends Ui { id: "hideOthers", label: "menu.hideOthers", onClick: () => { - const r = this.getHighlightModels(); - r && this.isolateModels(r), this.rightKey?.hide(); + const r = this.engineInstance?.getHighlightModels(); + r && this.engineInstance?.isolateModels(r), this.rightKey?.hide(); } }, { id: "transparentOthers", label: "menu.transparentOthers", onClick: () => { - const r = this.getHighlightModels(); - r && this.translucentOtherModels(r), this.rightKey?.hide(); + const r = this.engineInstance?.getHighlightModels(); + r && this.engineInstance?.translucentOtherModels(r), this.rightKey?.hide(); } } ] @@ -48944,24 +49080,24 @@ class sC extends Ui { id: "selectSameType", label: "menu.selectSameType", onClick: () => { - const r = this.getHighlightModels(); - r && this.batchSelectSameTypeModel(r), this.rightKey?.hide(); + const r = this.engineInstance?.getHighlightModels(); + r && this.engineInstance?.batchSelectSameTypeModel(r), this.rightKey?.hide(); } }, { id: "selectSameLevel", label: "menu.selectSameLevel", onClick: () => { - const r = this.getHighlightModels(); - r && this.batchSelectSameLevelModel(r), this.rightKey?.hide(); + const r = this.engineInstance?.getHighlightModels(); + r && this.engineInstance?.batchSelectSameLevelModel(r), this.rightKey?.hide(); } }, { id: "selectSameLevelType", label: "menu.selectSameLevelType", onClick: () => { - const r = this.getHighlightModels(); - r && this.batchSelectSameLevelTypeModel(r), this.rightKey?.hide(); + const r = this.engineInstance?.getHighlightModels(); + r && this.engineInstance?.batchSelectSameLevelTypeModel(r), this.rightKey?.hide(); } } ] @@ -48971,7 +49107,7 @@ class sC extends Ui { group: "component", order: 7, onClick: () => { - this.fitSectionBoxToModel(), this.rightKey?.hide(); + this.engineInstance?.fitSectionBoxToModel(), this.rightKey?.hide(); } })), i.push({ id: "showAll", @@ -48979,7 +49115,7 @@ class sC extends Ui { group: "component", order: 8, onClick: () => { - this.showAllModels(), this.emit("menu:show-all", {}), this.rightKey?.hide(); + this.engineInstance?.showAllModels(), this.emit("menu:show-all", {}), this.rightKey?.hide(); } }), i; }), this.engineInstance.isInitialized(); @@ -49006,21 +49142,6 @@ class sC extends Ui { } this.engineInstance.loadModel(e, t); } - /** - * 获取底层引擎实例 - * @returns 引擎实例 - */ - getEngine() { - return this.engineInstance ? this.engineInstance.getEngine() : (console.warn("[EngineManager] 3D Engine not initialized."), null); - } - /** 相机回到初始位置 */ - CameraGoHome() { - if (!this.engineInstance) { - console.warn("[EngineManager] 3D Engine not initialized."); - return; - } - this.engineInstance.CameraGoHome(); - } /** 暂停渲染 */ pauseRendering() { if (!this.engineInstance) { @@ -49037,348 +49158,13 @@ class sC extends Ui { } this.engineInstance.resumeRendering(); } - /** - * 激活测量模式 - * @param mode 测量模式 - */ - activateMeasure(e) { - if (!this.engineInstance) { - console.warn("[EngineManager] 3D Engine not initialized."); - return; - } - this.engineInstance.activateMeasure(e); - } - /** 停用测量模式 */ - deactivateMeasure() { - this.engineInstance && this.engineInstance.deactivateMeasure(); - } - /** - * 获取当前测量类型 - * @returns 当前测量模式 - */ - getCurrentMeasureType() { - return this.engineInstance ? this.engineInstance.getCurrentMeasureType() : null; - } - clearAllMeasures() { - this.engineInstance && this.engineInstance.clearAllMeasures(); - } - saveMeasureSetting(e) { - this.engineInstance && this.engineInstance.saveMeasureSetting(e); - } - /** - * 设置净高测量朝向 - * @param direction 0=朝下,1=朝上 - */ - setClearHeightDirection(e) { - this.engineInstance && this.engineInstance.setClearHeightDirection(e); - } - /** - * 设置净高测量选择对象类型 - * @param selectType 'point'=选择点,'element'=选择构件 - */ - setClearHeightSelectType(e) { - this.engineInstance && this.engineInstance.setClearHeightSelectType(e); - } - activeSection(e) { - if (!this.engineInstance) { - console.warn("[EngineManager] 3D Engine not initialized."); - return; - } - this.engineInstance.activeSection(e); - } - /** - * 获取当前激活的剖切模式 - * @returns 当前剖切模式,未激活时返回 null - */ - getCurrentSectionMode() { - return this.engineInstance ? this.engineInstance.getCurrentSectionMode() : null; - } - /** - * 停用所有剖切功能 - * @remarks 关闭剖切对话框时调用 - */ - deactivateSection() { - this.engineInstance && this.engineInstance.deactivateSection(); - } - /** - * 设置剖切盒范围 - * @param range 各轴的剖切范围 (百分比 0-100) - * @remarks 仅在 'box' 模式下有效 - */ - setSectionBoxRange(e) { - if (!this.engineInstance) { - console.warn("[EngineManager] 3D Engine not initialized."); - return; - } - this.engineInstance.setSectionBoxRange(e); - } - /** - * 隐藏剖切面(临时隐藏,可恢复) - * @remarks 配合 recoverSection() 使用 - */ - hideSection() { - this.engineInstance && this.engineInstance.hideSection(); - } - /** - * 恢复剖切面(从隐藏状态恢复) - * @remarks 恢复被 hideSection() 隐藏的剖切面 - */ - recoverSection() { - this.engineInstance && this.engineInstance.recoverSection(); - } - fitSectionBoxToModel() { - this.engineInstance && this.engineInstance.fitSectionBoxToModel(); - } - /** - * 剖切盒适应(缩放到场景整体包围盒) - * @remarks 对接底层 clipping.scaleBox() - */ - scaleSectionBox() { - this.engineInstance && this.engineInstance.scaleSectionBox(); - } - /** - * 反向剖切 - * @remarks 对接底层 clipping.reverse() - */ - reverseSection() { - this.engineInstance && this.engineInstance.reverseSection(); - } - /** 激活框选放大功能 */ - activateZoomBox() { - if (!this.engineInstance) { - console.warn("[EngineManager] 3D Engine not initialized."); - return; - } - this.engineInstance.activateZoomBox(); - } - // ==================== 漫游功能 ==================== - /** 激活第一人称漫游模式 */ - activateFirstPersonMode() { - if (!this.engineInstance) { - console.warn("[EngineManager] 3D Engine not initialized."); - return; - } - this.engineInstance.activateFirstPersonMode(); - } - /** 停用第一人称漫游模式 */ - deactivateFirstPersonMode() { - this.engineInstance && this.engineInstance.deactivateFirstPersonMode(); - } - setWalkSpeed(e) { - this.engineInstance?.setWalkSpeed(e); - } - setWalkGravity(e) { - this.engineInstance?.setWalkGravity(e); - } - setWalkCollision(e) { - this.engineInstance?.setWalkCollision(e); - } - toggleMiniMap() { - this.engineInstance?.toggleMiniMap(); - } - /** - * 获取小地图显示状态 - * @returns true=显示,false=隐藏 - */ - getMiniMapState() { - return this.engineInstance?.getMiniMapState() ?? !1; - } - isFirstPersonModeActive() { - return this.engineInstance?.isFirstPersonModeActive() ?? !1; - } - // ==================== 结束:漫游功能 ==================== - // ==================== 构件选中 ==================== - /** - * 获取当前选中的构件 - * @returns 选中构件的 URL 和 ID,未选中时返回 null - */ - getSelectedComponent() { - return this.engineInstance?.getSelectedComponent() ?? null; - } - /** - * 获取构件属性 - * @param url 模型 URL - * @param id 构件 ID - * @param callback 回调函数,接收属性数据 - */ - getComponentProperties(e, t, n) { - this.engineInstance?.getComponentProperties(e, t, n); - } - // ==================== 结束:构件选中 ==================== - // ==================== 模型树 ==================== - getTypeTreeData() { - return this.engineInstance?.getTypeTreeData() ?? []; - } - getLevelTreeData() { - return this.engineInstance?.getLevelTreeData() ?? []; - } - getMajorTreeData() { - return this.engineInstance?.getMajorTreeData() ?? []; - } - getEngineInfo() { - return this.engineInstance?.getEngineInfo() ?? null; - } - // ==================== 结束:模型树 ==================== - // ==================== 路径漫游 ==================== - /** - * 添加漫游点 - * 将当前相机位置添加为一个漫游点 - */ - pathRoamingAddPoint() { - this.engineInstance?.pathRoamingAddPoint(); - } - /** - * 删除指定索引的漫游点 - * @param index 要删除的漫游点索引 - */ - pathRoamingRemovePoint(e) { - this.engineInstance?.pathRoamingRemovePoint(e); - } - /** - * 清除所有漫游点 - */ - pathRoamingClearPoints() { - this.engineInstance?.pathRoamingClearPoints(); - } - /** - * 获取所有漫游点 - * @returns 漫游点数组 - */ - pathRoamingGetPoints() { - return this.engineInstance?.pathRoamingGetPoints() ?? []; - } - /** - * 跳转到指定漫游点 - * @param index 目标漫游点索引 - */ - pathRoamingJumpToPoint(e) { - this.engineInstance?.pathRoamingJumpToPoint(e); - } - /** - * 播放漫游 - * @param options 播放选项,包含时长、循环、回调等配置 - */ - pathRoamingPlay(e) { - this.engineInstance?.pathRoamingPlay(e); - } - /** - * 停止漫游 - */ - pathRoamingStop() { - this.engineInstance?.pathRoamingStop(); - } - // ==================== 结束:路径漫游 ==================== - // ==================== 构件操作 ==================== - /** - * 获取当前高亮(选中)的模型 - * @returns 高亮模型对象,未选中时返回 null - */ - getHighlightModels() { - return this.engineInstance?.getHighlightModels() ?? null; - } - /** - * 高亮指定模型构件 - * - * @param models - 要高亮的模型数组,格式: [{ url: string, ids: string[] }] - * - * @example - * manager.highlightModel([ - * { url: 'https://xxx/models/xxx/', ids: [350518, 350520] } - * ]); - */ - highlightModel(e) { - this.engineInstance?.highlightModel(e); - } - unhighlightAllModels() { - this.engineInstance?.unhighlightAllModels(); - } - viewScaleToModel(e) { - this.engineInstance?.viewScaleToModel(e); - } - hideModels(e) { - this.engineInstance?.hideModels(e); - } - showModel(e) { - this.engineInstance?.showModel(e); - } - /** - * 半透明指定模型 - * @param models 要半透明的模型对象 - */ - translucentModels(e) { - this.engineInstance?.translucentModels(e); - } - /** - * 取消半透明 - */ - unTranslucentModel() { - this.engineInstance?.unTranslucentModel(); - } - /** - * 隔离指定模型(隐藏其他) - * @param models 要隔离的模型对象 - */ - isolateModels(e) { - this.engineInstance?.isolateModels(e); - } - /** - * 半透明其他构件 - * @param models 基准模型对象 - */ - translucentOtherModels(e) { - this.engineInstance?.translucentOtherModels(e); - } - /** - * 显示所有模型 - */ - showAllModels() { - this.engineInstance?.showAllModels(); - } - /** - * 批量选择同类模型 - * @param models 基准模型对象 - */ - batchSelectSameTypeModel(e) { - this.engineInstance?.batchSelectSameTypeModel(e); - } - /** - * 批量选择同层模型 - * @param models 基准模型对象 - */ - batchSelectSameLevelModel(e) { - this.engineInstance?.batchSelectSameLevelModel(e); - } - /** - * 批量选择同层同类模型 - * @param models 基准模型对象 - */ - batchSelectSameLevelTypeModel(e) { - this.engineInstance?.batchSelectSameLevelTypeModel(e); - } - // ==================== 结束:构件操作 ==================== - // ==================== 渲染模式 ==================== - /** - * 获取当前渲染模式 - * @returns 'simple' | 'balance' | 'advanced' - */ - getRenderMode() { - return this.engineInstance?.getRenderMode() ?? "balance"; - } - /** - * 设置渲染模式 - * @param mode 'simple' | 'balance' | 'advanced' - */ - setRenderMode(e) { - this.engineInstance?.setRenderMode(e); - } - // ==================== 结束:渲染模式 ==================== /** 销毁引擎管理器 */ destroy() { this.engineInstance && (this.engineInstance.destroy(), this.engineInstance = null), this.rightKey && (this.rightKey.destroy(), this.rightKey = null), super.destroy(); } } var _t = /* @__PURE__ */ ((s) => (s[s.Unchecked = 0] = "Unchecked", s[s.Checked = 1] = "Checked", s[s.Indeterminate = 2] = "Indeterminate", s))(_t || {}); -class rC { +class rT { config; element; children = []; @@ -49479,7 +49265,7 @@ class rC { this.children.forEach((e) => e.destroy()), this.children = [], this.element.remove(), this.parent = null; } } -class aC { +class aT { element; contentElement; // 树内容容器 @@ -49641,7 +49427,7 @@ class aC { */ createNodeRecursively(e, t) { e.expanded === void 0 && (e.expanded = this.options.defaultExpandAll); - const n = new rC(e, this.options, { + const n = new rT(e, this.options, { onExpand: (i) => { this.onNodeExpand && this.onNodeExpand(i); }, @@ -49900,7 +49686,7 @@ function fm(s, e) { } return t >>> 0; } -async function oC(s) { +async function oT(s) { const e = JSON.stringify(s), t = fm(e, 2166136261), n = fm(e, 522970236); return `${t.toString(16).padStart(8, "0")}${n.toString(16).padStart(8, "0")}`; } @@ -49924,13 +49710,13 @@ function mm(s) { r.size > 0 && n.push({ url: i, ids: Array.from(r) }); return n; } -let lC = 0; -async function cC(s) { +let lT = 0; +async function cT(s) { if (!s || s.length === 0) return []; const e = async (t, n) => { const i = t.children && t.children.length > 0; let r; - return t.ids?.length ? r = await oC(t.ids) : t.id ? r = t.id : r = `node_${++lC}`, { + return t.ids?.length ? r = await oT(t.ids) : t.id ? r = t.id : r = `node_${++lT}`, { id: r, label: t.name || "未命名", expanded: !1, @@ -49956,7 +49742,7 @@ async function cC(s) { }; })); } -class hC extends Ui { +class hT extends Ui { /** 按钮组实例 - 用于渲染构件树按钮 */ toolbar = null; /** 按钮容器元素 */ @@ -50009,12 +49795,12 @@ class hC extends Ui { */ async openConstructTreeDialog() { this.setVisible(!1); - const e = this.registry.engine3d?.getLevelTreeData() ?? [], t = this.registry.engine3d?.getTypeTreeData() ?? [], n = this.registry.engine3d?.getMajorTreeData() ?? []; + const e = this.engineComponent?.getLevelTreeData() ?? [], t = this.engineComponent?.getTypeTreeData() ?? [], n = this.engineComponent?.getMajorTreeData() ?? []; console.log("[ConstructTree] 原始数据 (Level):", e), console.log("[ConstructTree] 原始数据 (Type):", t), console.log("[ConstructTree] 原始数据 (Major):", n); const i = async (f, x) => { - const g = await cC(f); + const g = await cT(f); console.log(`[ConstructTree] 转换后数据 (${x}):`, g); - const y = new aC({ + const b = new aT({ data: g, checkable: !0, indent: 0, @@ -50026,25 +49812,25 @@ class hC extends Ui { * 勾选 → showModel,取消勾选 → hideModels */ onNodeCheck: (v) => { - const b = mm(v); - b.length && (v.checkState === _t.Checked ? this.registry.engine3d?.showModel(b) : this.registry.engine3d?.hideModels(b)); + const y = mm(v); + y.length && (v.checkState === _t.Checked ? this.engineComponent?.showModel(y) : this.engineComponent?.hideModels(y)); }, /** * 节点选中回调 - 高亮并跳转到模型构件 */ onNodeSelect: (v) => { - const b = mm(v); - b.length && (this.registry.engine3d?.unhighlightAllModels(), this.registry.engine3d?.highlightModel(b), this.registry.engine3d?.viewScaleToModel(b)); + const y = mm(v); + y.length && (this.engineComponent?.unhighlightAllModels(), this.engineComponent?.highlightModel(y), this.engineComponent?.viewScaleToModel(y)); }, // 再次点击已选中节点时取消高亮 onNodeDeselect: () => { - this.registry.engine3d?.unhighlightAllModels(); + this.engineComponent?.unhighlightAllModels(); }, onNodeExpand: () => { this.dialog?.fitWidth(); } }); - return y.init(), y; + return b.init(), b; }, r = await i(e, "Level"), a = await i(t, "Type"), o = await i(n, "Major"), l = document.createElement("div"); l.className = "construct-tab__panel-content", l.appendChild(r.element); const c = document.createElement("div"); @@ -50054,7 +49840,7 @@ class hC extends Ui { const u = document.createElement("div"); u.className = "construct-tab__container", u.style.height = "100%", u.style.overflow = "hidden"; const p = () => { - this.registry.engine3d?.showAllModels(), r.checkAllNodes(!0), a.checkAllNodes(!0), o.checkAllNodes(!0); + this.engineComponent?.showAllModels(), r.checkAllNodes(!0), a.checkAllNodes(!0), o.checkAllNodes(!0); }, d = new pg({ container: u, tabs: [ @@ -50305,7 +50091,7 @@ function fg(s) { return "point"; } } -function uC(s) { +function uT(s) { return Object.values(za).find((e) => e.callBackType === s)?.key; } class Aa { @@ -50492,8 +50278,8 @@ class Aa { for (let m = 0; m < gm.length; m++) { const f = gm[m], x = za[f], g = document.createElement("button"); g.type = "button", g.className = "bim-measure-tool-btn", g.dataset.mode = f; - const y = document.createElement("span"); - y.className = "bim-measure-tool-icon", y.innerHTML = x.icon || i, g.appendChild(y), g.addEventListener("click", () => { + const b = document.createElement("span"); + b.className = "bim-measure-tool-icon", b.innerHTML = x.icon || i, g.appendChild(b), g.addEventListener("click", () => { this.setActiveMode(f); }), this.toolButtons.set(f, g), n.appendChild(g); } @@ -50521,10 +50307,10 @@ class Aa { const p = (m, f, x) => { const g = document.createElement("div"); g.className = "bim-measure-row"; - const y = document.createElement("span"); - y.className = "label", y.dataset.i18nKey = m; + const b = document.createElement("span"); + b.className = "label", b.dataset.i18nKey = m; const v = document.createElement("span"); - return v.className = `value ${f}`, x(v), g.appendChild(y), g.appendChild(v), g; + return v.className = `value ${f}`, x(v), g.appendChild(b), g.appendChild(v), g; }; u.appendChild(p("measure.labels.x", "bim-measure-xyz-x", (m) => this.xyzXEl = m)), u.appendChild(p("measure.labels.y", "bim-measure-xyz-y", (m) => this.xyzYEl = m)), u.appendChild(p("measure.labels.z", "bim-measure-xyz-z", (m) => this.xyzZEl = m)), o.appendChild(u), this.mainViewEl.appendChild(o); const d = document.createElement("div"); @@ -50805,7 +50591,7 @@ class Aa { } } } -class dC extends Xs { +class dT extends Xs { panel = null; config = null; unsubscribeMeasureChanged = null; @@ -50826,10 +50612,10 @@ class dC extends Xs { defaultMode: "distance", defaultExpanded: !1, onModeChange: (t) => { - console.log("[MeasureDialogManager] 当前测量方式已切换:", t), this.registry.engine3d?.activateMeasure(t); + console.log("[MeasureDialogManager] 当前测量方式已切换:", t), this.engineComponent?.activateMeasure(t); }, onClearAll: () => { - console.log("[MeasureDialogManager] 删除全部"), this.registry.engine3d?.clearAllMeasures(); + console.log("[MeasureDialogManager] 删除全部"), this.engineComponent?.clearAllMeasures(); }, onSettings: () => { console.log("[MeasureDialogManager] 打开设置"); @@ -50838,18 +50624,18 @@ class dC extends Xs { this.dialog?.fitHeight(!1); }, onConfigSave: (t) => { - console.log("[MeasureDialogManager] 保存设置:", t), this.registry.engine3d?.saveMeasureSetting({ + console.log("[MeasureDialogManager] 保存设置:", t), this.engineComponent?.saveMeasureSetting({ unit: t.unit, precision: t.precision }); }, onClearHeightDirectionChange: (t) => { - console.log("[MeasureDialogManager] 净高朝向切换:", t), this.registry.engine3d?.setClearHeightDirection(t); + console.log("[MeasureDialogManager] 净高朝向切换:", t), this.engineComponent?.setClearHeightDirection(t); }, onClearHeightSelectTypeChange: (t) => { - console.log("[MeasureDialogManager] 净高选择对象切换:", t), this.registry.engine3d?.setClearHeightSelectType(t); + console.log("[MeasureDialogManager] 净高选择对象切换:", t), this.engineComponent?.setClearHeightSelectType(t); } - }), this.panel.init(), this.config = this.panel.getConfig(), this.config && (console.log("[MeasureDialogManager] 同步缓存设置到引擎:", this.config), this.registry.engine3d?.saveMeasureSetting({ + }), this.panel.init(), this.config = this.panel.getConfig(), this.config && (console.log("[MeasureDialogManager] 同步缓存设置到引擎:", this.config), this.engineComponent?.saveMeasureSetting({ unit: this.config.unit, precision: this.config.precision })); @@ -50857,20 +50643,20 @@ class dC extends Xs { return e.style.padding = "12px", e.appendChild(this.panel.element), e; } onDialogCreated() { - this.dialog?.fitHeight(!1), this.registry.engine3d?.setClearHeightDirection(0), this.registry.engine3d?.setClearHeightSelectType("point"); - const e = this.registry.engine3d?.getEngine(); - if (e?.events) { + this.dialog?.fitHeight(!1), this.engineComponent?.setClearHeightDirection(0), this.engineComponent?.setClearHeightSelectType("point"); + const e = this.engineComponent; + if (e) { const t = (n) => { console.log("[MeasureDialogManager] 测量值回调:", n), n && this.panel && this.handleMeasureChanged(n); }; - e.events.on("measure-changed", t), e.events.on("measure-click", t), this.unsubscribeMeasureChanged = () => { - e.events.off("measure-changed", t), e.events.off("measure-click", t); + e.onRawEvent("measure-changed", t), e.onRawEvent("measure-click", t), this.unsubscribeMeasureChanged = () => { + e.offRawEvent("measure-changed", t), e.offRawEvent("measure-click", t); }; } } handleMeasureChanged(e) { if (!this.panel) return; - const t = uC(e.type); + const t = uT(e.type); if (!t) { console.warn("[MeasureDialogManager] 未知测量类型:", e.type); return; @@ -50887,7 +50673,7 @@ class dC extends Xs { this.unsubscribeMeasureChanged && (this.unsubscribeMeasureChanged(), this.unsubscribeMeasureChanged = null), this.registry.toolbar?.setBtnActive("measure", !1); } onBeforeDestroy() { - this.unsubscribeMeasureChanged && (this.unsubscribeMeasureChanged(), this.unsubscribeMeasureChanged = null), this.registry.engine3d && this.registry.engine3d.deactivateMeasure(), this.panel && (this.panel.destroy(), this.panel = null); + this.unsubscribeMeasureChanged && (this.unsubscribeMeasureChanged(), this.unsubscribeMeasureChanged = null), this.engineComponent?.deactivateMeasure(), this.panel && (this.panel.destroy(), this.panel = null); } getActiveMode() { return this.panel ? this.panel.getActiveMode() : null; @@ -50919,7 +50705,7 @@ class dC extends Xs { this.panel && this.panel.openSettings(); } } -class pC { +class pT { element; options; isHidden = !1; @@ -51011,7 +50797,7 @@ class pC { return a.className = "section-plane-btn-label", i.appendChild(a), e === "hide" ? this.hideLabelEl = a : e === "reverse" ? this.reverseLabelEl = a : this.resetLabelEl = a, i.addEventListener("click", n), i; } } -class fC extends Xs { +class fT extends Xs { /** 剖切面板实例 */ panel = null; constructor(e) { @@ -51051,10 +50837,10 @@ class fC extends Xs { } /** 创建对话框内容 */ createContent() { - return this.panel = new pC({ + return this.panel = new pT({ defaultHidden: !1, onHideToggle: (e) => { - console.log("[SectionPlaneDialogManager] 隐藏切换:", e), e ? this.registry.engine3d?.hideSection() : this.registry.engine3d?.recoverSection(); + console.log("[SectionPlaneDialogManager] 隐藏切换:", e), e ? this.engineComponent?.hideSection() : this.engineComponent?.recoverSection(); }, onReverse: () => { console.log("[SectionPlaneDialogManager] 反向 (not supported in new API)"); @@ -51066,7 +50852,7 @@ class fC extends Xs { } /** 对话框创建后的回调 */ onDialogCreated() { - this.registry.engine3d?.activeSection("face"), this.dialog?.fitHeight(!1); + this.engineComponent?.activeSection("face"), this.dialog?.fitHeight(!1); } /** 对话框关闭时的回调 */ onDialogClose() { @@ -51074,10 +50860,10 @@ class fC extends Xs { } /** 销毁前的清理 */ onBeforeDestroy() { - this.registry.engine3d?.deactivateSection(), this.panel && (this.panel.destroy(), this.panel = null); + this.engineComponent?.deactivateSection(), this.panel && (this.panel.destroy(), this.panel = null); } } -class mC { +class mT { element; options; // 状态 @@ -51221,7 +51007,7 @@ class mC { this.axisXBtn.classList.toggle("active", this.activeAxis === "x"), this.axisYBtn.classList.toggle("active", this.activeAxis === "y"), this.axisZBtn.classList.toggle("active", this.activeAxis === "z"); } } -class gC extends Xs { +class gT extends Xs { /** 轴向剖切面板实例 */ panel = null; constructor(e) { @@ -51257,27 +51043,27 @@ class gC extends Xs { * 初始化轴向剖切面板并设置回调 */ createContent() { - return this.panel = new mC({ + return this.panel = new mT({ defaultAxis: "x", defaultHidden: !1, onHideToggle: (e) => { - console.log("[SectionAxisDialogManager] 隐藏切换:", e), e ? this.registry.engine3d?.hideSection() : this.registry.engine3d?.recoverSection(); + console.log("[SectionAxisDialogManager] 隐藏切换:", e), e ? this.engineComponent?.hideSection() : this.engineComponent?.recoverSection(); }, onReverse: () => { console.log("[SectionAxisDialogManager] 反向剖切(暂不支持)"); }, onAxisChange: (e) => { - console.log("[SectionAxisDialogManager] 切换轴向:", e), this.registry.engine3d?.activeSection(e); + console.log("[SectionAxisDialogManager] 切换轴向:", e), this.engineComponent?.activeSection(e); } }), this.panel.init(), this.panel.element; } /** 对话框创建后的回调,自适应高度 */ onDialogCreated() { - if (this.dialog?.fitHeight(!1), !this.registry.engine3d) { + if (this.dialog?.fitHeight(!1), !this.engineComponent) { console.error("[SectionAxisDialogManager] Engine not initialized. Call initEngine() first."); return; } - this.registry.engine3d.activeSection("x"); + this.engineComponent.activeSection("x"); } /** 对话框关闭时的回调,取消工具栏按钮激活状态 */ onDialogClose() { @@ -51285,7 +51071,7 @@ class gC extends Xs { } /** 销毁前的清理,销毁面板实例 */ onBeforeDestroy() { - this.registry.engine3d?.deactivateSection(), this.panel && (this.panel.destroy(), this.panel = null); + this.engineComponent?.deactivateSection(), this.panel && (this.panel.destroy(), this.panel = null); } /** * 获取剖切面隐藏状态 @@ -51321,7 +51107,7 @@ const xm = { y: { min: 0, max: 100 }, z: { min: 0, max: 100 } }; -class xC { +class xT { element; options; isHidden = !1; @@ -51479,7 +51265,7 @@ class xC { this.unsubscribeLocale?.(), this.unsubscribeTheme?.(), this.element && this.element.parentElement && this.element.parentElement.removeChild(this.element); } } -class vC extends Xs { +class vT extends Xs { panel = null; unsubscribeSectionMove = null; constructor(e) { @@ -51515,41 +51301,41 @@ class vC extends Xs { * 初始化剖切盒面板并设置回调 */ createContent() { - return this.panel = new xC({ + return this.panel = new xT({ defaultHidden: !1, defaultReversed: !1, onHideToggle: (e) => { - console.log("[SectionBoxDialogManager] 隐藏切换:", e), e ? this.registry.engine3d?.hideSection() : this.registry.engine3d?.recoverSection(); + console.log("[SectionBoxDialogManager] 隐藏切换:", e), e ? this.engineComponent?.hideSection() : this.engineComponent?.recoverSection(); }, onReverseToggle: (e) => { - console.log("[SectionBoxDialogManager] 反向切换:", e), this.registry.engine3d?.reverseSection(); + console.log("[SectionBoxDialogManager] 反向切换:", e), this.engineComponent?.reverseSection(); }, onFitToModel: () => { - this.registry.engine3d?.scaleSectionBox(); + this.engineComponent?.scaleSectionBox(); }, onReset: () => { - this.registry.engine3d?.deactivateSection(), this.registry.engine3d?.activeSection("box"), this.registry.engine3d?.recoverSection(); + this.engineComponent?.deactivateSection(), this.engineComponent?.activeSection("box"), this.engineComponent?.recoverSection(); }, onRangeChange: (e) => { - this.registry.engine3d?.setSectionBoxRange(e); + this.engineComponent?.setSectionBoxRange(e); } }), this.panel.init(), this.panel.element; } onDialogCreated() { - this.registry.engine3d?.activeSection("box"), this.dialog?.fitHeight(!1); - const e = this.registry.engine3d?.getEngine(); - if (e?.events) { + this.engineComponent?.activeSection("box"), this.dialog?.fitHeight(!1); + const e = this.engineComponent; + if (e) { const t = (n) => { n && this.panel && this.panel.setRange(n); }; - e.events.on("section-move", t), this.unsubscribeSectionMove = () => e.events.off("section-move", t); + e.onRawEvent("section-move", t), this.unsubscribeSectionMove = () => e.offRawEvent("section-move", t); } } onDialogClose() { this.unsubscribeSectionMove && (this.unsubscribeSectionMove(), this.unsubscribeSectionMove = null), this.registry.toolbar?.setBtnActive("section-box", !1); } onBeforeDestroy() { - this.unsubscribeSectionMove && (this.unsubscribeSectionMove(), this.unsubscribeSectionMove = null), this.registry.engine3d?.deactivateSection(), this.panel && (this.panel.destroy(), this.panel = null); + this.unsubscribeSectionMove && (this.unsubscribeSectionMove(), this.unsubscribeSectionMove = null), this.engineComponent?.deactivateSection(), this.panel && (this.panel.destroy(), this.panel = null); } /** * 获取剖切盒隐藏状态 @@ -51594,7 +51380,7 @@ class vC extends Xs { this.panel?.setRange(e); } } -class yC { +class bT { element; options; // 状态 @@ -51756,7 +51542,7 @@ class yC { this.unsubscribeLocale?.(), this.unsubscribeTheme?.(), this.element && this.element.parentElement && this.element.parentElement.removeChild(this.element); } } -class bC { +class yT { element; /** 管理器注册表実例 */ registry; @@ -51790,7 +51576,7 @@ class bC { * 在面板打开时调用,获取底层引擎中已存在的漫游点 */ loadPointsFromEngine() { - const e = this.registry.engine3d?.pathRoamingGetPoints() ?? []; + const e = this.registry.engine3d?.getEngineComponent()?.pathRoamingGetPoints() ?? []; this.points = e.map((t, n) => ({ index: n })); @@ -51898,7 +51684,7 @@ class bC { * 将当前相机位置添加为新的漫游点 */ addPoint() { - this.registry.engine3d?.pathRoamingAddPoint(); + this.registry.engine3d?.getEngineComponent()?.pathRoamingAddPoint(); const e = this.points.length; this.points.push({ index: e }), this.render(); } @@ -51907,27 +51693,27 @@ class bC { * @param index 要删除的漫游点索引 */ deletePoint(e) { - this.registry.engine3d?.pathRoamingRemovePoint(e), this.points.splice(e, 1), this.points.forEach((t, n) => t.index = n), this.render(); + this.registry.engine3d?.getEngineComponent()?.pathRoamingRemovePoint(e), this.points.splice(e, 1), this.points.forEach((t, n) => t.index = n), this.render(); } /** * 删除所有漫游点 */ deleteAllPoints() { - this.registry.engine3d?.pathRoamingClearPoints(), this.points = [], this.render(); + this.registry.engine3d?.getEngineComponent()?.pathRoamingClearPoints(), this.points = [], this.render(); } /** * 跳转到指定漫游点 * @param index 目标漫游点索引 */ jumpToPoint(e) { - this.registry.engine3d?.pathRoamingJumpToPoint(e); + this.registry.engine3d?.getEngineComponent()?.pathRoamingJumpToPoint(e); } /** * 播放漫游 * 按顺序播放所有漫游点 */ playPath() { - this.points.length !== 0 && (this.isPlaying = !0, this.render(), console.log("[WalkPathPanel] 开始播放漫游", { duration: this.duration, loop: this.loop, pointsCount: this.points.length }), this.registry.engine3d?.pathRoamingPlay({ + this.points.length !== 0 && (this.isPlaying = !0, this.render(), console.log("[WalkPathPanel] 开始播放漫游", { duration: this.duration, loop: this.loop, pointsCount: this.points.length }), this.registry.engine3d?.getEngineComponent()?.pathRoamingPlay({ duration: this.duration, loop: this.loop, onPointComplete: (e) => { @@ -51942,7 +51728,7 @@ class bC { * 停止漫游 */ stopPath() { - console.log("[WalkPathPanel] 停止漫游"), this.registry.engine3d?.pathRoamingStop(), this.isPlaying = !1, this.playingPointIndex = -1, this.render(); + console.log("[WalkPathPanel] 停止漫游"), this.registry.engine3d?.getEngineComponent()?.pathRoamingStop(), this.isPlaying = !1, this.playingPointIndex = -1, this.render(); } // ==================== 生命周期 ==================== /** @@ -51967,7 +51753,7 @@ class bC { this.isPlaying && this.stopPath(), this.unsubscribeLocale?.(), this.unsubscribeTheme?.(), this.element?.parentElement && this.element.parentElement.removeChild(this.element); } } -class _C extends Xs { +class _T extends Xs { /** 漫游路径面板实例 */ panel = null; constructor(e) { @@ -52005,7 +51791,7 @@ class _C extends Xs { } /** 创建对话框内容 */ createContent() { - return this.panel = new bC(this.registry), this.panel.init(), this.panel.element; + return this.panel = new yT(this.registry), this.panel.init(), this.panel.element; } /** 对话框关闭时的回调 */ onDialogClose() { @@ -52016,7 +51802,7 @@ class _C extends Xs { this.panel && (this.panel.destroy(), this.panel = null); } } -class MC extends Ui { +class MT extends Ui { /** 漫游控制面板实例 */ panel = null; /** 路径漫游对话框管理器 */ @@ -52026,7 +51812,7 @@ class MC extends Ui { } /** 初始化管理器 */ init() { - this.pathManager = new _C(this.registry), this.pathManager.init(); + this.pathManager = new _T(this.registry), this.pathManager.init(); } /** 显示漫游控制面板 */ show() { @@ -52034,9 +51820,9 @@ class MC extends Ui { console.warn("Toolbar not initialized"); return; } - this.registry.toolbar.hide(), console.log("[WalkControl] 打开漫游面板,激活第一人称模式"), this.registry.engine3d?.activateFirstPersonMode(), this.panel = new yC({ + this.registry.toolbar.hide(), console.log("[WalkControl] 打开漫游面板,激活第一人称模式"), this.engineComponent?.activateFirstPersonMode(), this.panel = new bT({ onPlanViewToggle: (e) => { - console.log("[WalkControl] 小地图:", e), this.registry.engine3d?.toggleMiniMap(), this.emit("walk:plan-view-toggle", { isActive: e }); + console.log("[WalkControl] 小地图:", e), this.engineComponent?.toggleMiniMap(), this.emit("walk:plan-view-toggle", { isActive: e }); }, onPathModeToggle: (e) => { console.log("[WalkControl] 路径漫游:", e), e ? this.pathManager?.show() : this.pathManager?.hide(), this.emit("walk:path-mode-toggle", { isActive: e }); @@ -52047,13 +51833,13 @@ class MC extends Ui { onSpeedChange: (e) => { console.log("[WalkControl] 速度变化:", e); const t = e * 0.1; - this.registry.engine3d?.setWalkSpeed(t), this.emit("walk:speed-change", { speed: e }); + this.engineComponent?.setWalkSpeed(t), this.emit("walk:speed-change", { speed: e }); }, onGravityToggle: (e) => { - console.log("[WalkControl] 重力:", e), this.registry.engine3d?.setWalkGravity(e), this.emit("walk:gravity-toggle", { enabled: e }); + console.log("[WalkControl] 重力:", e), this.engineComponent?.setWalkGravity(e), this.emit("walk:gravity-toggle", { enabled: e }); }, onCollisionToggle: (e) => { - console.log("[WalkControl] 碰撞:", e), this.registry.engine3d?.setWalkCollision(e), this.emit("walk:collision-toggle", { enabled: e }); + console.log("[WalkControl] 碰撞:", e), this.engineComponent?.setWalkCollision(e), this.emit("walk:collision-toggle", { enabled: e }); }, onCharacterModelChange: (e) => { console.log("[WalkControl] 角色模型:", e); @@ -52068,14 +51854,14 @@ class MC extends Ui { } /** 隐藏漫游控制面板 */ hide() { - this.pathManager?.hide(), console.log("[WalkControl] 关闭漫游面板,退出第一人称模式"), this.registry.engine3d?.deactivateFirstPersonMode(), this.panel && (this.panel.destroy(), this.panel = null), this.registry.toolbar && this.registry.toolbar.show(); + this.pathManager?.hide(), console.log("[WalkControl] 关闭漫游面板,退出第一人称模式"), this.engineComponent?.deactivateFirstPersonMode(), this.panel && (this.panel.destroy(), this.panel = null), this.registry.toolbar && this.registry.toolbar.show(); } /** 销毁管理器 */ destroy() { this.hide(), this.pathManager?.destroy(), this.pathManager = null, super.destroy(); } } -class wC extends Xs { +class wT extends Xs { get dialogId() { return "engine-info-dialog"; } @@ -52100,7 +51886,7 @@ class wC extends Xs { }; } createContent() { - const e = this.registry.engine3d?.getEngineInfo() ?? null, t = document.createElement("div"); + const e = this.engineComponent?.getEngineInfo() ?? null, t = document.createElement("div"); t.className = "engine-info-content", t.style.cssText = "padding: 16px;"; const n = (i, r) => { const a = document.createElement("div"); @@ -52113,8 +51899,8 @@ class wC extends Xs { return t.appendChild(n(xe("info.meshCount"), e?.meshCount ?? "-")), t.appendChild(n(xe("info.totalTriangles"), e?.totalTriangles ?? "-")), t.appendChild(n(xe("info.totalVertices"), e?.totalVertices ?? "-")), t; } } -const vh = "font-size: 13px; color: var(--bim-text-secondary, #475569); margin-bottom: 8px;", SC = "height: 1px; background: var(--bim-divider, #e2e8f0); margin: 14px 0;", yh = "display: flex; align-items: center; justify-content: space-between; gap: 12px;", EC = "font-size: 12px; color: var(--bim-text-secondary, #475569); min-width: 32px; text-align: right;", Mr = "var(--bim-border-default, #e2e8f0)", vm = "var(--bim-bg-inset, #f1f5f9)", ll = "var(--bim-primary, #3b82f6)", bh = "var(--bim-text-primary, #0f172a)", TC = "var(--bim-text-inverse, #ffffff)", CC = "var(--bim-component-bg-hover, rgba(0,0,0,0.04))"; -class AC extends Xs { +const vh = "font-size: 13px; color: var(--bim-text-secondary, #475569); margin-bottom: 8px;", ST = "height: 1px; background: var(--bim-divider, #e2e8f0); margin: 14px 0;", bh = "display: flex; align-items: center; justify-content: space-between; gap: 12px;", ET = "font-size: 12px; color: var(--bim-text-secondary, #475569); min-width: 32px; text-align: right;", Mr = "var(--bim-border-default, #e2e8f0)", vm = "var(--bim-bg-inset, #f1f5f9)", ll = "var(--bim-primary, #3b82f6)", yh = "var(--bim-text-primary, #0f172a)", CT = "var(--bim-text-inverse, #ffffff)", TT = "var(--bim-component-bg-hover, rgba(0,0,0,0.04))"; +class AT extends Xs { get dialogId() { return "setting-dialog"; } @@ -52127,25 +51913,37 @@ class AC extends Xs { // ================ 本地 UI 状态(不持久化) ================ /** 边线开关状态 */ edgeLineEnabled = !1; - /** 当前选中的地面类型 */ - groundType = "none"; - /** 地面大小 */ - groundSize = 100; - /** 对比度(0-200,100为默认值) */ - contrastValue = 100; - /** 饱和度(0-200,100为默认值) */ - saturationValue = 100; - /** 光照强度(0-200,100为默认值) */ - lightIntensityValue = 100; - /** 当前选中的环境背景 */ - environmentType = "default"; + /** 对比度(0-100,50为默认值) */ + contrastValue = 50; + /** 饱和度(0-100,50为默认值) */ + saturationValue = 50; + /** 光照强度(0-100,50为默认值) */ + lightIntensityValue = 50; + /** 环境背景列表(从底层引擎动态获取) */ + environmentList = []; + /** 当前选中的环境背景 ID */ + environmentId = ""; + /** 是否显示背景 */ + backgroundVisible = !0; + /** 地面列表(从底层引擎动态获取) */ + groundList = []; + /** 当前选中的地面 ID */ + groundId = ""; + /** 地面高度(单位:m) */ + groundElevation = 0; + /** 保存的对话框位置(用于 hide/show 时保持位置不变) */ + savedPosition = null; constructor(e) { super(e); } init() { } - /** 对话框居中显示 */ + /** 对话框位置:若有保存的位置则恢复,否则居中 */ getDialogPosition() { + if (this.savedPosition) { + const i = this.savedPosition; + return this.savedPosition = null, i; + } const e = this.registry.container; if (!e) return { x: 100, y: 100 }; const t = e.clientWidth, n = e.clientHeight; @@ -52154,33 +51952,41 @@ class AC extends Xs { y: Math.max(20, (n - 520) / 2) }; } + /** + * 从底层引擎加载当前状态(回显) + * 在 createContent() 前调用,保证 UI 和引擎状态同步 + */ + loadEngineState() { + const e = this.engineComponent; + e && (this.edgeLineEnabled = e.getModelEdgeActive(), this.lightIntensityValue = e.getAmbientLightIntensity(), this.contrastValue = e.getSceneContrast(), this.saturationValue = e.getSceneSaturation(), this.environmentList = e.getHDRBackgroundList(), this.environmentId = e.getHDRBackgroundId(), this.backgroundVisible = e.getHDRBackgroundVisibility(), this.groundList = e.getGroundList(), this.groundId = e.getGroundId(), this.groundElevation = e.getGroundElevation()); + } // ======================== 主内容构建 ======================== createContent() { - this.ensureSliderStyle(); + this.loadEngineState(), this.ensureSliderStyle(); const e = document.createElement("div"); return e.style.cssText = "padding: 16px; max-height: 480px; overflow-y: auto;", e.appendChild(this.createRenderModeSection()), e.appendChild(this.createDivider()), e.appendChild(this.createEdgeLineSection()), e.appendChild(this.createDivider()), e.appendChild(this.createSliderSection( xe("setting.lightIntensity"), this.lightIntensityValue, 0, - 200, + 100, (t) => { - this.lightIntensityValue = t; + this.lightIntensityValue = t, this.engineComponent?.setAmbientLightIntensity(t); } )), e.appendChild(this.createSliderSection( xe("setting.contrast"), this.contrastValue, 0, - 200, + 100, (t) => { - this.contrastValue = t; + this.contrastValue = t, this.engineComponent?.setSceneContrast(t); } )), e.appendChild(this.createSliderSection( xe("setting.saturation"), this.saturationValue, 0, - 200, + 100, (t) => { - this.saturationValue = t; + this.saturationValue = t, this.engineComponent?.setSceneSaturation(t); } )), e.appendChild(this.createDivider()), e.appendChild(this.createEnvironmentSection()), e.appendChild(this.createDivider()), e.appendChild(this.createGroundSection()), e; } @@ -52188,12 +51994,12 @@ class AC extends Xs { /** 创建分隔线 */ createDivider() { const e = document.createElement("div"); - return e.style.cssText = SC, e; + return e.style.cssText = ST, e; } // ======================== 1. 渲染模式(按钮组) ======================== /** 创建渲染模式按钮组 */ createRenderModeSection() { - const e = this.registry.engine3d?.getRenderMode() ?? "balance", t = document.createElement("div"), n = document.createElement("div"); + const e = this.engineComponent?.getRenderMode() ?? "balance", t = document.createElement("div"), n = document.createElement("div"); n.style.cssText = vh, n.textContent = xe("setting.renderMode"), t.appendChild(n); const i = document.createElement("div"); i.style.cssText = ` @@ -52211,14 +52017,16 @@ class AC extends Xs { flex: 1; text-align: center; padding: 7px 0; cursor: pointer; font-size: 13px; font-weight: 500; transition: all 0.15s; background: ${l ? ll : "transparent"}; - color: ${l ? TC : bh}; + color: ${l ? CT : yh}; ${a < r.length - 1 ? `border-right: 1px solid ${Mr};` : ""} `, c.textContent = xe(o.labelKey), c.addEventListener("mouseenter", () => { - l || (c.style.background = CC); + l || (c.style.background = TT); }), c.addEventListener("mouseleave", () => { l || (c.style.background = "transparent"); }), c.addEventListener("click", () => { - this.registry.engine3d?.setRenderMode(o.key), this.hide(), this.show(); + this.engineComponent?.setRenderMode(o.key); + const h = document.getElementById(this.dialogId); + h && (this.savedPosition = { x: h.offsetLeft, y: h.offsetTop }), this.hide(), this.show(); }), i.appendChild(c); } return t.appendChild(i), t; @@ -52226,26 +52034,13 @@ class AC extends Xs { // ======================== 2. 边线开关 ======================== /** 创建边线开关行 */ createEdgeLineSection() { - const e = document.createElement("div"); - e.style.cssText = yh; - const t = document.createElement("span"); - t.style.cssText = "font-size: 13px; color: var(--bim-text-secondary, #475569);", t.textContent = xe("setting.edgeLine"), e.appendChild(t); - const n = "var(--bim-border-strong, #cbd5e1)", i = ll, r = document.createElement("div"); - r.style.cssText = ` - width: 40px; height: 22px; border-radius: 11px; cursor: pointer; - position: relative; transition: background 0.2s; - background: ${this.edgeLineEnabled ? i : n}; - `; - const a = document.createElement("div"); - return a.style.cssText = ` - width: 18px; height: 18px; border-radius: 50%; - background: #fff; position: absolute; top: 2px; - transition: left 0.2s; - box-shadow: 0 1px 3px rgba(0,0,0,0.2); - left: ${this.edgeLineEnabled ? "20px" : "2px"}; - `, r.appendChild(a), r.addEventListener("click", () => { - this.edgeLineEnabled = !this.edgeLineEnabled, r.style.background = this.edgeLineEnabled ? i : n, a.style.left = this.edgeLineEnabled ? "20px" : "2px"; - }), e.appendChild(r), e; + return this.createToggleRow( + xe("setting.edgeLine"), + this.edgeLineEnabled, + (e) => { + this.edgeLineEnabled = e, e ? this.engineComponent?.activeModelEdge() : this.engineComponent?.disActiveModelEdge(); + } + ); } // ======================== 3/4/5. 通用滑块 ======================== /** @@ -52260,11 +52055,11 @@ class AC extends Xs { const a = document.createElement("div"); a.style.cssText = "margin-bottom: 4px;"; const o = document.createElement("div"); - o.style.cssText = yh + " margin-bottom: 6px;"; + o.style.cssText = bh + " margin-bottom: 6px;"; const l = document.createElement("span"); l.style.cssText = "font-size: 13px; color: var(--bim-text-secondary, #475569);", l.textContent = e, o.appendChild(l); const c = document.createElement("span"); - c.style.cssText = EC, c.textContent = String(t), o.appendChild(c), a.appendChild(o); + c.style.cssText = ET, c.textContent = String(t), o.appendChild(c), a.appendChild(o); const h = document.createElement("input"); return h.type = "range", h.min = String(n), h.max = String(i), h.value = String(t), h.className = "bim-setting-slider", h.style.cssText = ` width: 100%; height: 4px; -webkit-appearance: none; appearance: none; @@ -52304,58 +52099,64 @@ class AC extends Xs { } `, document.head.appendChild(e); } - // ======================== 6. 环境背景(下拉) ======================== - /** 创建环境背景下拉选择区 */ + // ======================== 6. 环境背景(动态列表 + 显示开关) ======================== + /** 创建环境背景区 */ createEnvironmentSection() { const e = document.createElement("div"), t = document.createElement("div"); t.style.cssText = vh, t.textContent = xe("setting.environment"), e.appendChild(t); - const n = ["default", "outdoor", "indoor", "night", "overcast", "studio"], i = this.createSelect( - n.map((r) => ({ - value: r, - label: xe(`setting.environments.${r}`) - })), - this.environmentType, + const n = this.createSelect( + this.environmentList.map((r) => ({ value: r.id, label: r.name })), + this.environmentId, (r) => { - this.environmentType = r; + this.environmentId = r, this.engineComponent?.setHDRBackgroundId(r); } ); - return e.appendChild(i), e; + e.appendChild(n); + const i = this.createToggleRow( + xe("setting.backgroundVisible"), + this.backgroundVisible, + (r) => { + this.backgroundVisible = r, this.engineComponent?.setHDRBackgroundVisibility(r); + } + ); + return i.style.marginTop = "10px", e.appendChild(i), e; } - // ======================== 7. 显示地面(下拉 + 大小) ======================== + // ======================== 7. 地面(动态列表 + 地面高度) ======================== /** 创建地面设置区 */ createGroundSection() { const e = document.createElement("div"), t = document.createElement("div"); t.style.cssText = vh, t.textContent = xe("setting.ground"), e.appendChild(t); - const n = ["none", "concrete", "grass", "tile", "water", "wood"], i = this.createSelect( - n.map((l) => ({ - value: l, - label: xe(`setting.groundTypes.${l}`) - })), - this.groundType, - (l) => { - this.groundType = l, r.style.display = l === "none" ? "none" : "flex"; + const n = this.createSelect( + this.groundList.map((c) => ({ value: c.id, label: c.name })), + this.groundId, + (c) => { + this.groundId = c, this.engineComponent?.setGroundId(c); } ); - e.appendChild(i); - const r = document.createElement("div"); - r.style.cssText = yh + " margin-top: 10px;", r.style.display = this.groundType === "none" ? "none" : "flex"; - const a = document.createElement("span"); - a.style.cssText = "font-size: 13px; color: var(--bim-text-secondary, #475569);", a.textContent = xe("setting.groundSize"), r.appendChild(a); + e.appendChild(n); + const i = document.createElement("div"); + i.style.cssText = bh + " margin-top: 10px;"; + const r = document.createElement("span"); + r.style.cssText = "font-size: 13px; color: var(--bim-text-secondary, #475569);", r.textContent = xe("setting.groundElevation"), i.appendChild(r); + const a = document.createElement("div"); + a.style.cssText = "display: flex; align-items: center; gap: 4px;"; const o = document.createElement("input"); - return o.type = "number", o.value = String(this.groundSize), o.min = "1", o.max = "10000", o.style.cssText = ` - width: 80px; padding: 4px 8px; border-radius: 4px; + o.type = "number", o.value = String(this.groundElevation), o.style.cssText = ` + width: 72px; padding: 4px 8px; border-radius: 4px; border: 1px solid ${Mr}; background: ${vm}; - color: ${bh}; + color: ${yh}; font-size: 13px; outline: none; text-align: right; `, o.addEventListener("input", () => { - const l = Number(o.value); - !isNaN(l) && l > 0 && (this.groundSize = l); + const c = Number(o.value); + isNaN(c) || (this.groundElevation = c, this.engineComponent?.setGroundElevation(c)); }), o.addEventListener("focus", () => { o.style.borderColor = ll; }), o.addEventListener("blur", () => { o.style.borderColor = Mr; - }), r.appendChild(o), e.appendChild(r), e; + }); + const l = document.createElement("span"); + return l.style.cssText = "font-size: 13px; color: var(--bim-text-secondary, #475569);", l.textContent = xe("setting.groundElevationUnit"), a.appendChild(o), a.appendChild(l), i.appendChild(a), e.appendChild(i), e; } // ======================== 通用下拉框 ======================== /** @@ -52370,7 +52171,7 @@ class AC extends Xs { width: 100%; padding: 7px 10px; border-radius: 6px; border: 1px solid ${Mr}; background: ${vm}; - color: ${bh}; + color: ${yh}; font-size: 13px; outline: none; cursor: pointer; -webkit-appearance: none; appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); @@ -52393,8 +52194,39 @@ class AC extends Xs { i.style.borderColor = Mr; }), i; } + // ======================== 通用开关行 ======================== + /** + * 创建一个标签 + 开关的行 + * @param labelText 标签文本 + * @param enabled 当前开关状态 + * @param onChange 状态变化回调 + */ + createToggleRow(e, t, n) { + const i = document.createElement("div"); + i.style.cssText = bh; + const r = document.createElement("span"); + r.style.cssText = "font-size: 13px; color: var(--bim-text-secondary, #475569);", r.textContent = e, i.appendChild(r); + const a = "var(--bim-border-strong, #cbd5e1)", o = ll; + let l = t; + const c = document.createElement("div"); + c.style.cssText = ` + width: 40px; height: 22px; border-radius: 11px; cursor: pointer; + position: relative; transition: background 0.2s; + background: ${l ? o : a}; + `; + const h = document.createElement("div"); + return h.style.cssText = ` + width: 18px; height: 18px; border-radius: 50%; + background: #fff; position: absolute; top: 2px; + transition: left 0.2s; + box-shadow: 0 1px 3px rgba(0,0,0,0.2); + left: ${l ? "20px" : "2px"}; + `, c.appendChild(h), c.addEventListener("click", () => { + l = !l, c.style.background = l ? o : a, h.style.left = l ? "20px" : "2px", n(l); + }), i.appendChild(c), i; + } } -class PC { +class PT { element; headerEl; contentEl; @@ -52427,7 +52259,7 @@ class PC { e ? (this.element.classList.add("is-active"), this.contentEl.classList.remove("is-hidden")) : (this.element.classList.remove("is-active"), this.contentEl.classList.add("is-hidden")); } } -class ym { +class bm { element; options; items = /* @__PURE__ */ new Map(); @@ -52445,7 +52277,7 @@ class ym { } init() { this.options.items.forEach((e) => { - const t = new PC(e, this); + const t = new PT(e, this); this.items.set(e.id, t), this.element.appendChild(t.element), this.activeIds.has(e.id) && t.setActive(!0); }), this.unsubscribeLocale = tn.subscribe(() => { this.setLocales(); @@ -52473,7 +52305,7 @@ class ym { this.unsubscribeLocale && (this.unsubscribeLocale(), this.unsubscribeLocale = null), this.unsubscribeTheme && (this.unsubscribeTheme(), this.unsubscribeTheme = null), this.element.remove(), this.items.clear(); } } -class RC extends Ui { +class RT extends Ui { dialogId = "component-detail-dialog"; dialog = null; currentSelection = null; @@ -52512,7 +52344,7 @@ class RC extends Ui { }); } loadAndRenderContent() { - !this.dialog || !this.currentSelection || (this.showLoading(), this.registry.engine3d?.getComponentProperties( + !this.dialog || !this.currentSelection || (this.showLoading(), this.engineComponent?.getComponentProperties( this.currentSelection.url, this.currentSelection.id, (e) => { @@ -52563,7 +52395,7 @@ class RC extends Ui { title: r.name || `分类 ${a + 1}`, content: this.createCategoryContent(r.children || []) })); - new ym({ + new bm({ container: e, accordion: !1, ghost: !0, @@ -52591,7 +52423,7 @@ class RC extends Ui { title: r.name || `材质 ${a + 1}`, content: this.createCategoryContent(r.children || r.properties || []) })); - new ym({ + new bm({ container: e, accordion: !1, ghost: !0, @@ -52645,7 +52477,7 @@ class RC extends Ui { this.unsubscribeSelected && (this.unsubscribeSelected(), this.unsubscribeSelected = null), this.unsubscribeDeselected && (this.unsubscribeDeselected(), this.unsubscribeDeselected = null), this.hide(), super.destroy(); } } -class LC { +class LT { /** 组件根元素 */ element; /** 组件配置选项 */ @@ -52954,8 +52786,8 @@ class LC { d.preventDefault(), d.stopPropagation(), !this.rafId && (this.rafId = requestAnimationFrame(() => { const m = d.clientX - t, f = d.clientY - n; let x = i + m, g = r + f; - const y = a - l, v = o - c; - x = Math.max(0, Math.min(x, y)), g = Math.max(0, Math.min(g, v)), this.element.style.left = `${x}px`, this.element.style.top = `${g}px`, this.rafId = null; + const b = a - l, v = o - c; + x = Math.max(0, Math.min(x, b)), g = Math.max(0, Math.min(g, v)), this.element.style.left = `${x}px`, this.element.style.top = `${g}px`, this.rafId = null; })); }, p = () => { this.rafId && (cancelAnimationFrame(this.rafId), this.rafId = null), document.removeEventListener("mousemove", u, { capture: !0 }), document.removeEventListener("mouseup", p, { capture: !0 }); @@ -53165,7 +52997,7 @@ class LC { this._isDestroyed || (this.unsubscribeTheme && (this.unsubscribeTheme(), this.unsubscribeTheme = null), this.unsubscribeLocale && (this.unsubscribeLocale(), this.unsubscribeLocale = null), this.element.remove(), this._isDestroyed = !0); } } -class DC { +class DT { /** AI 聊天组件实例 */ aiChat = null; /** Manager 注册表 */ @@ -53186,7 +53018,7 @@ class DC { console.warn("[AiChatManager] wrapper 不存在,无法初始化"); return; } - this.aiChat = new LC({ + this.aiChat = new LT({ container: e, width: 440, title: "aiChat.title", @@ -53310,7 +53142,7 @@ class DC { this.aiChat && (this.aiChat.destroy(), this.aiChat = null), this.initialized = !1; } } -class IC { +class IT { /** 事件监听器映射表 */ events = /* @__PURE__ */ new Map(); /** @@ -53353,9 +53185,9 @@ class IC { this.events.clear(); } } -class NC { +class NT { /** 事件发射器 */ - eventEmitter = new IC(); + eventEmitter = new IT(); /** 主容器元素 */ container = null; /** 包装容器元素 */ @@ -53452,7 +53284,7 @@ class L4 { constructor(e, t) { const n = typeof e == "string" ? document.getElementById(e) : e; if (!n) throw new Error("Container not found"); - this.container = n, this.registry = new NC(), t?.locale && tn.setLocale(t.locale), t?.theme && (t.theme === "custom" ? console.warn("Custom theme should be set via setCustomTheme().") : lt.setTheme(t.theme)), this.init(); + this.container = n, this.registry = new NT(), t?.locale && tn.setLocale(t.locale), t?.theme && (t.theme === "custom" ? console.warn("Custom theme should be set via setCustomTheme().") : lt.setTheme(t.theme)), this.init(); } emit(e, t) { this.registry.emit(e, t); @@ -53475,7 +53307,7 @@ class L4 { init() { this.container.innerHTML = "", this.wrapper = document.createElement("div"), this.wrapper.className = "bim-engine-wrapper", this.container.appendChild(this.wrapper); const e = document.createElement("div"); - e.className = "bim-engine-version", e.textContent = "v1.3.2", this.wrapper.appendChild(e), this.registry.container = this.container, this.registry.wrapper = this.wrapper, this.engine = new sC(this.wrapper, this.registry), this.dialog = new Lg(this.wrapper, this.registry), this.toolbar = new Ag(this.wrapper, this.registry), this.buttonGroup = new Pg(this.wrapper, this.registry), this.rightKey = new dg(this.wrapper, this.registry), this.constructTreeBtn = new hC(this.wrapper, this.registry), this.measure = new dC(this.registry), this.sectionPlane = new fC(this.registry), this.sectionAxis = new gC(this.registry), this.sectionBox = new vC(this.registry), this.walkControl = new MC(this.registry), this.walkControl.init(), this.engineInfo = new wC(this.registry), this.engineInfo.init(), this.registry.engine3d = this.engine, this.registry.dialog = this.dialog, this.registry.toolbar = this.toolbar, this.registry.buttonGroup = this.buttonGroup, this.registry.rightKey = this.rightKey, this.registry.constructTree = this.constructTreeBtn, this.registry.measure = this.measure, this.registry.sectionPlane = this.sectionPlane, this.registry.sectionAxis = this.sectionAxis, this.registry.sectionBox = this.sectionBox, this.registry.walkControl = this.walkControl, this.registry.engineInfo = this.engineInfo, this.componentDetail = new RC(this.registry), this.registry.componentDetail = this.componentDetail, this.componentDetail.init(), this.aiChat = new DC(this.registry), this.registry.aiChat = this.aiChat, this.aiChat.init(), this.setting = new AC(this.registry), this.registry.setting = this.setting, this.setting.init(), this.updateTheme(lt.getTheme()), lt.subscribe((t) => { + e.className = "bim-engine-version", e.textContent = "v1.3.2", this.wrapper.appendChild(e), this.registry.container = this.container, this.registry.wrapper = this.wrapper, this.engine = new sT(this.wrapper, this.registry), this.dialog = new Lg(this.wrapper, this.registry), this.toolbar = new Ag(this.wrapper, this.registry), this.buttonGroup = new Pg(this.wrapper, this.registry), this.rightKey = new dg(this.wrapper, this.registry), this.constructTreeBtn = new hT(this.wrapper, this.registry), this.measure = new dT(this.registry), this.sectionPlane = new fT(this.registry), this.sectionAxis = new gT(this.registry), this.sectionBox = new vT(this.registry), this.walkControl = new MT(this.registry), this.walkControl.init(), this.engineInfo = new wT(this.registry), this.engineInfo.init(), this.registry.engine3d = this.engine, this.registry.dialog = this.dialog, this.registry.toolbar = this.toolbar, this.registry.buttonGroup = this.buttonGroup, this.registry.rightKey = this.rightKey, this.registry.constructTree = this.constructTreeBtn, this.registry.measure = this.measure, this.registry.sectionPlane = this.sectionPlane, this.registry.sectionAxis = this.sectionAxis, this.registry.sectionBox = this.sectionBox, this.registry.walkControl = this.walkControl, this.registry.engineInfo = this.engineInfo, this.componentDetail = new RT(this.registry), this.registry.componentDetail = this.componentDetail, this.componentDetail.init(), this.aiChat = new DT(this.registry), this.registry.aiChat = this.aiChat, this.aiChat.init(), this.setting = new AT(this.registry), this.registry.setting = this.setting, this.setting.init(), this.updateTheme(lt.getTheme()), lt.subscribe((t) => { this.updateTheme(t); }); } @@ -53486,7 +53318,7 @@ class L4 { this.toolbar?.destroy(), this.buttonGroup?.destroy(), this.engine?.destroy(), this.dialog?.destroy(), this.rightKey?.destroy(), this.measure?.destroy(), this.sectionPlane?.destroy(), this.sectionAxis?.destroy(), this.sectionBox?.destroy(), this.walkControl?.destroy(), this.aiChat?.destroy(), this.setting?.destroy(), this.container.innerHTML = "", this.registry.reset(); } } -const BC = (s) => ({ +const BT = (s) => ({ id: "home", groupId: "group-1", type: "button", @@ -53494,12 +53326,12 @@ const BC = (s) => ({ icon: rt("主视角"), keepActive: !1, onClick: (e) => { - console.log("首页按钮被点击:", e.id), s.engine3d?.CameraGoHome(); + console.log("首页按钮被点击:", e.id), s.engine3d?.getEngineComponent()?.CameraGoHome(); } -}), kC = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), kT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createHomeButton: BC -}, Symbol.toStringTag, { value: "Module" })), UC = (s) => ({ + createHomeButton: BT +}, Symbol.toStringTag, { value: "Module" })), UT = (s) => ({ id: "zoom-box", groupId: "group-1", keepActive: !1, @@ -53507,12 +53339,12 @@ const BC = (s) => ({ label: "toolbar.zoomBox", icon: rt("框选放大"), onClick: () => { - s.engine3d?.activateZoomBox(); + s.engine3d?.getEngineComponent()?.activateZoomBox(); } -}), OC = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), OT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createZoomBoxButton: UC -}, Symbol.toStringTag, { value: "Module" })), zC = (s) => ({ + createZoomBoxButton: UT +}, Symbol.toStringTag, { value: "Module" })), zT = (s) => ({ id: "walk", groupId: "group-1", type: "button", @@ -53522,10 +53354,10 @@ const BC = (s) => ({ onClick: () => { console.log("漫游按钮被点击"), s.walkControl?.show(); } -}), FC = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), FT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createWalkMenuButton: zC -}, Symbol.toStringTag, { value: "Module" })), HC = (s) => ({ + createWalkMenuButton: zT +}, Symbol.toStringTag, { value: "Module" })), HT = (s) => ({ id: "map", groupId: "group-1", type: "button", @@ -53534,12 +53366,12 @@ const BC = (s) => ({ keepActive: !0, icon: rt("地图"), onClick: () => { - s.engine3d?.toggleMiniMap(); + s.engine3d?.getEngineComponent()?.toggleMiniMap(); } -}), VC = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), VT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createMapButton: HC -}, Symbol.toStringTag, { value: "Module" })), GC = (s) => ({ + createMapButton: HT +}, Symbol.toStringTag, { value: "Module" })), GT = (s) => ({ id: "property", groupId: "group-1", type: "button", @@ -53549,10 +53381,10 @@ const BC = (s) => ({ onClick: () => { console.log("构件详情按钮被点击"), s.componentDetail?.show(); } -}), WC = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), WT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createPropertyButton: GC -}, Symbol.toStringTag, { value: "Module" })), XC = (s) => ({ + createPropertyButton: GT +}, Symbol.toStringTag, { value: "Module" })), XT = (s) => ({ id: "setting", groupId: "group-2", type: "button", @@ -53562,10 +53394,10 @@ const BC = (s) => ({ onClick: (e) => { s?.setting?.toggle(); } -}), jC = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), jT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createSettingButton: XC -}, Symbol.toStringTag, { value: "Module" })), qC = (s) => ({ + createSettingButton: XT +}, Symbol.toStringTag, { value: "Module" })), qT = (s) => ({ id: "info", groupId: "group-2", type: "button", @@ -53575,10 +53407,10 @@ const BC = (s) => ({ onClick: () => { s.engineInfo?.show(); } -}), ZC = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), ZT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createInfoButton: qC -}, Symbol.toStringTag, { value: "Module" })), YC = (s) => ({ + createInfoButton: qT +}, Symbol.toStringTag, { value: "Module" })), YT = (s) => ({ id: "fullscreen", groupId: "group-2", type: "button", @@ -53604,10 +53436,10 @@ const BC = (s) => ({ console.error("全屏操作失败:", t), t && t.message && t.message.includes("denied") && console.error('全屏请求被拒绝。如果是 Iframe,请检查 allow="fullscreen"。如果是自动触发,请确保由用户点击触发。'); } } -}), $C = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), $T = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createFullscreenButton: YC -}, Symbol.toStringTag, { value: "Module" })), KC = (s) => ({ + createFullscreenButton: YT +}, Symbol.toStringTag, { value: "Module" })), KT = (s) => ({ id: "measure", groupId: "group-1", type: "button", @@ -53617,10 +53449,10 @@ const BC = (s) => ({ onClick: (e) => { e.isActive ? s.measure?.show() : s.measure?.destroy(); } -}), JC = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), JT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createMeasureButton: KC -}, Symbol.toStringTag, { value: "Module" })), QC = (s) => ({ + createMeasureButton: KT +}, Symbol.toStringTag, { value: "Module" })), QT = (s) => ({ id: "section", groupId: "group-1", type: "menu", @@ -53633,7 +53465,7 @@ const BC = (s) => ({ } }), e4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createSectionMenuButton: QC + createSectionMenuButton: QT }, Symbol.toStringTag, { value: "Module" })), t4 = (s) => ({ id: "section-plane", groupId: "group-1", diff --git a/demo/lib/iflow-engine.umd.js b/demo/lib/iflow-engine.umd.js index 57c1683..e310a62 100644 --- a/demo/lib/iflow-engine.umd.js +++ b/demo/lib/iflow-engine.umd.js @@ -1,9 +1,9 @@ (function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode('.bim-engine-wrapper{position:relative;width:100%;height:100%;font-family:sans-serif;box-sizing:border-box;overflow:hidden;background:linear-gradient(to bottom,#d6e0eb,#f6faff)}.bim-engine-opt-btn-container{z-index:100}.bim-construct-tree-btn{position:absolute;top:20px;left:20px!important;z-index:100}.bim-engine-version{position:absolute;bottom:6px;left:10px;font-size:11px;color:#00000040;pointer-events:none;-webkit-user-select:none;user-select:none;z-index:1;font-family:system-ui,-apple-system,sans-serif;letter-spacing:.3px}.bim-btn-group-root{display:flex;gap:8px;z-index:1000;position:absolute;pointer-events:auto;background:transparent}.bim-btn-group-root.static{position:relative;inset:auto;transform:none}.bim-btn-group-root.dir-row{flex-direction:row;align-items:center}.bim-btn-group-root.dir-column{flex-direction:column;align-items:stretch}.bim-btn-group-section{display:flex;gap:4px;background-color:var(--bim-btn-group-section-bg, rgba(17, 17, 17, .88));border-radius:6px;padding:4px;box-shadow:0 2px 8px #0000004d,0 1px 3px #0003}.bim-btn-group-root.dir-row .bim-btn-group-section{flex-direction:row;align-items:center}.bim-btn-group-root.dir-column .bim-btn-group-section{flex-direction:column}.opt-btn-wrapper{position:relative}.opt-btn{display:flex;cursor:pointer;border-radius:4px;transition:background-color .2s,color .2s,border-color .2s;color:var(--bim-btn-text-color, #ccc);background-color:var(--bim-btn-bg, transparent);padding:6px;align-items:center;position:relative;justify-content:center;border:1px solid transparent;outline:none}.opt-btn:hover{background-color:var(--bim-btn-hover-bg, #444)}.opt-btn.active{background-color:var(--bim-btn-active-bg, rgba(255, 255, 255, .15));color:var(--bim-btn-text-active-color, #fff)}.opt-btn.disabled{opacity:.5;cursor:not-allowed}.opt-btn-icon{width:var(--bim-icon-size, 24px);height:var(--bim-icon-size, 24px);display:flex;align-items:center;justify-content:center;color:var(--bim-icon-color, #ccc);flex-shrink:0}.opt-btn-icon svg{width:100%;height:100%;fill:currentColor}.opt-btn-arrow{font-size:10px;opacity:.6;transition:transform .2s;display:inline-block;margin-left:4px}.opt-btn-arrow.rotated{transform:rotate(180deg)}.opt-btn-text-wrapper{display:flex;align-items:center;justify-content:center;pointer-events:none}.opt-btn-label{display:inline}.opt-btn.no-label .opt-btn-label{display:none}.opt-btn.align-vertical:not(.no-label){flex-direction:column;text-align:center}.opt-btn.align-vertical:not(.no-label) .opt-btn-text-wrapper{margin-top:4px}.opt-btn.align-vertical:not(.no-label) .opt-btn-label{font-size:12px;line-height:1.2}.opt-btn.align-horizontal:not(.no-label){flex-direction:row}.opt-btn.align-horizontal:not(.no-label) .opt-btn-text-wrapper{margin-left:8px}.opt-btn.align-horizontal:not(.no-label) .opt-btn-label{font-size:14px}.opt-btn.no-label .opt-btn-text-wrapper{width:0;height:0;margin:0;padding:0;overflow:visible;position:absolute;top:0;right:0}.opt-btn.no-label .opt-btn-arrow{position:absolute;top:2px;right:2px;margin:0;font-size:8px}.opt-btn-dropdown{position:absolute;background-color:var(--bim-toolbar-bg, rgba(17, 17, 17, .95));border-radius:4px;padding:4px;box-shadow:0 4px 12px #0003;z-index:1001;display:flex;flex-direction:column;border:1px solid rgba(255,255,255,.1);opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .2s ease,transform .2s cubic-bezier(.2,0,.2,1),visibility .2s}@keyframes dropdown-fade-in{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.opt-btn-dropdown{animation:dropdown-fade-in .2s cubic-bezier(.2,0,.2,1) forwards;opacity:1;visibility:visible;transform:none}.opt-btn-dropdown-item{display:flex;align-items:center;padding:8px 12px;cursor:pointer;border-radius:4px;color:var(--bim-btn-text-color, #ccc);transition:background .2s,border-color .2s,color .2s;box-sizing:border-box;border:1px solid transparent;outline:none}.opt-btn-dropdown-item .opt-btn-icon{color:var(--bim-icon-color, #ccc)}.opt-btn-dropdown-item:hover{background-color:var(--bim-btn-hover-bg, #444)}.opt-btn-dropdown-item.active{background-color:var(--bim-btn-active-bg, rgba(255, 255, 255, .15));color:var(--bim-btn-text-active-color, #fff)}.opt-btn-dropdown-item.align-horizontal{flex-direction:row}.opt-btn-dropdown-item.align-horizontal .opt-btn-icon{width:18px;height:18px;margin-right:8px}.opt-btn-dropdown-item.align-vertical{flex-direction:column;text-align:center}.opt-btn-dropdown-item.align-vertical .opt-btn-icon{width:24px;height:24px;margin-bottom:4px}.opt-btn-dropdown-item.align-vertical .opt-btn-dropdown-label{font-size:12px}.bim-btn-group-root.is-bottom-toolbar .opt-btn-icon{width:32px;height:32px}.bim-btn-group-root.is-bottom-toolbar .opt-btn{padding:8px}.bim-btn-group-root.is-bottom-toolbar.dir-row{max-width:calc(100% - 40px);overflow-x:auto;overflow-y:visible;scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.2) transparent}.bim-btn-group-root.is-bottom-toolbar.dir-row .bim-btn-group-section{flex-shrink:0}.bim-btn-group-root.is-bottom-toolbar.dir-row::-webkit-scrollbar{height:4px}.bim-btn-group-root.is-bottom-toolbar.dir-row::-webkit-scrollbar-track{background:transparent}.bim-btn-group-root.is-bottom-toolbar.dir-row::-webkit-scrollbar-thumb{background:#fff3;border-radius:2px}.bim-btn-group-root.is-bottom-toolbar.dir-row::-webkit-scrollbar-thumb:hover{background:#fff6}.bim-btn-group-root.type-glass-pill .bim-btn-group-section{background:var(--bim-floating-bg);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--bim-floating-border);border-radius:9999px;box-shadow:none;padding:8px;gap:10px}.bim-btn-group-root.type-glass-pill .opt-btn{width:48px;height:48px;min-width:48px;border-radius:9999px;background:var(--bim-floating-btn-bg);border:1px solid var(--bim-floating-btn-border);box-shadow:var(--bim-floating-btn-shadow);color:var(--bim-text-primary);padding:0;transition:all .2s ease-out}.bim-btn-group-root.type-glass-pill .opt-btn:hover{background:var(--bim-floating-btn-bg-hover);transform:scale(1.05);box-shadow:var(--bim-floating-btn-shadow-hover)}.bim-btn-group-root.type-glass-pill .opt-btn:active{transform:scale(.98)}.bim-btn-group-root.type-glass-pill .opt-btn.active{background:var(--bim-primary);border:1px solid var(--bim-primary-active);color:var(--bim-text-inverse);box-shadow:var(--bim-shadow-glow)}.bim-btn-group-root.type-glass-pill .opt-btn.active:hover{background:var(--bim-primary-hover);transform:scale(1.05)}.bim-btn-group-root.type-glass-pill .opt-btn.active:active{transform:scale(.98)}.bim-btn-group-root.type-glass-pill .opt-btn.active .opt-btn-icon{color:var(--bim-icon-inverse)}.bim-btn-group-root.type-glass-pill .opt-btn.disabled{opacity:.3;cursor:not-allowed;transform:none;box-shadow:none}.bim-btn-group-root.type-glass-pill .opt-btn-icon{width:18px;height:18px;color:var(--bim-floating-icon-color);transition:color .2s ease-out}.bim-btn-group-root.type-glass-pill .opt-btn-icon svg{width:18px;height:18px}.bim-btn-group-root.type-glass-pill .opt-btn:hover .opt-btn-icon{color:var(--bim-floating-icon-color-hover)}.bim-btn-group-root.type-glass-pill .opt-btn-label{display:none!important}.bim-btn-group-root.type-glass-pill .opt-btn-text-wrapper{position:absolute;top:2px;right:2px;width:0;height:0;margin:0;padding:0}.bim-btn-group-root.type-glass-pill .opt-btn-arrow{font-size:8px;position:absolute;top:0;right:0;color:var(--bim-text-tertiary)}.opt-btn-dropdown.type-glass-pill{background:#fffffff2;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid rgba(226,232,240,.6);border-radius:12px;box-shadow:0 8px 24px #0000001f;padding:6px}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item{display:flex;flex-direction:row;align-items:center;gap:10px;border-radius:8px;color:#334155;padding:8px 12px;font-size:13px;font-weight:400;transition:all .1s ease-out}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item:hover{background:#f1f5f9}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item:active{background:#e2e8f0}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active{background:#3b82f6;color:#fff}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active .opt-btn-icon,.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active .opt-btn-dropdown-label{color:#fff}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-icon{width:18px;height:18px;color:#334155;flex-shrink:0}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-icon svg{width:18px;height:18px}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-dropdown-label{white-space:nowrap;color:#334155}.opt-btn-dropdown.type-glass-pill.theme-dark{background:var(--bim-bg-overlay);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid var(--bim-border-default);box-shadow:var(--bim-shadow-lg)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item{color:var(--bim-text-primary)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item:hover{background:var(--bim-floating-btn-bg)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item:active{background:var(--bim-floating-btn-bg-hover)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item.active{background:var(--bim-primary);color:var(--bim-text-inverse)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item .opt-btn-icon{color:var(--bim-floating-icon-color)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item .opt-btn-dropdown-label{color:var(--bim-text-primary)}.bim-dialog{position:absolute;background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:var(--bim-panel-radius, 12px);box-shadow:var(--bim-shadow-lg);display:flex;flex-direction:column;z-index:10001;color:var(--bim-dialog-title-color, var(--bim-text-primary));overflow:hidden;min-width:200px;min-height:100px;pointer-events:auto}.bim-dialog-header{height:40px;background-color:var(--bim-bg-inset);display:flex;align-items:center;justify-content:space-between;padding:0 12px;cursor:default;-webkit-user-select:none;user-select:none;border-bottom:1px solid var(--bim-border-default);flex-shrink:0}.bim-dialog-header.draggable{cursor:move}.bim-dialog-title{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--bim-dialog-title-color)}.bim-dialog-close{cursor:pointer;font-size:18px;color:var(--bim-text-tertiary);line-height:1;margin-left:8px}.bim-dialog-close:hover{color:var(--bim-text-primary)}.bim-dialog-content{flex:1;overflow:auto;font-size:14px;color:var(--bim-dialog-text-color, var(--bim-text-secondary))}.bim-dialog-resize-handle{position:absolute;width:10px;height:10px;bottom:0;right:0;cursor:se-resize;z-index:10}.bim-dialog-resize-handle:after{content:"";position:absolute;bottom:3px;right:3px;width:6px;height:6px;border-right:2px solid var(--bim-text-tertiary);border-bottom:2px solid var(--bim-text-tertiary)}.bim-dialog-resize-handle:hover:after{border-color:var(--bim-text-primary)}.originRotate{width:10px;height:10px;background-color:red}.versionText{position:absolute;right:10px;color:#86d9ff;z-index:1000;bottom:0;font-size:10px;background:transparent;pointer-events:none}.originDiv{position:absolute;top:100px;left:100px;width:30px;height:30px;border-radius:50%;z-index:1000;pointer-events:none}.catchPoint{pointer-events:none;stroke:#08dfd7;fill:transparent;stroke-width:2}.catchLine{position:absolute;width:10px;height:10px;pointer-events:none;background-color:green}.catchPlane{position:absolute;width:10px;height:10px;pointer-events:none;background-color:#ff0}.ViewCube{position:absolute;width:120px;height:120px;top:0;right:0;z-index:999}.homeViewWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-image:url(/assets/viewcube/home.png);background-size:100% 100%;background-repeat:no-repeat;background-color:#fff0;color:#fff;top:10px;right:100;width:20px;height:20px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.viewSettingWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-size:100% 100%;background-repeat:no-repeat;font-weight:800;background-color:#fff0;color:#fff;top:30px;right:100;width:20px;height:20px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.cameraToggleWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-color:#ffffffe6;color:#333;font-size:26px;font-weight:700;display:none;align-items:center;justify-content:center;border-radius:4px;box-shadow:0 2px 4px #0003;transition:all .3s ease;top:70px;right:90px;width:44px;height:44px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.cameraToggleWrapper.show{display:flex}.cameraToggleWrapper:hover{background-color:#fff;box-shadow:0 3px 6px #0000004d;transform:scale(1.1)}.screenshotWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-color:#ffffffe6;color:#333;font-size:20px;display:none;align-items:center;justify-content:center;border-radius:4px;box-shadow:0 2px 4px #0003;transition:all .3s ease;top:120px;right:90px;width:44px;height:44px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.screenshotWrapper.show{display:flex}.screenshotWrapper:hover{background-color:#fff;box-shadow:0 3px 6px #0000004d;transform:scale(1.1)}.fullscreenWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-color:#ffffffe6;color:#333;font-size:26px;font-weight:700;display:none;align-items:center;justify-content:center;border-radius:4px;box-shadow:0 2px 4px #0003;transition:all .3s ease;top:170px;right:90px;width:44px;height:44px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.fullscreenWrapper.show{display:flex}.fullscreenWrapper:hover{background-color:#fff;box-shadow:0 3px 6px #0000004d;transform:scale(1.1)}.measure-elevation{position:absolute;pointer-events:none}.measureSvg{position:absolute;width:1920px;height:1080px}.catch-point{position:absolute;width:10px;height:10px;background-color:red;border-radius:50%;pointer-events:none}.annotation-container{position:absolute;pointer-events:none;top:0;left:0}.measureLine{position:absolute;pointer-events:none}.measureBack{cursor:pointer;pointer-events:auto;fill:orange;top:-50px;rx:5;ry:5}.measureLabel{position:absolute;fill:#fff;font-size:14px;font-family:Arial,sans-serif;pointer-events:none}.measurePointer{fill:orange}.Hight{stroke:#fff;stroke-width:2}.allow-select{pointer-events:auto}.disallow-select{pointer-events:none}.angle-annotation{position:absolute;pointer-events:auto}.bim-right-key{position:fixed;z-index:10000;display:none;background:transparent}.bim-right-key.visible{display:block}.bim-menu{display:flex;flex-direction:column;background:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:8px;padding:6px;margin:0;list-style:none;box-shadow:var(--bim-shadow-lg);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-user-select:none;user-select:none;color:var(--bim-text-primary)}.bim-menu-group{display:flex;flex-direction:column}.bim-menu-divider{height:1px;background-color:var(--bim-divider);margin:4px 0}.bim-menu-item{display:flex;align-items:center;padding:8px 12px;cursor:pointer;transition:all .2s ease;font-size:13px;position:relative;color:var(--bim-text-primary);border-radius:6px}.bim-menu-item:hover{background-color:var(--bim-component-bg-hover)}.bim-menu-item.disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.bim-menu-item-icon{display:none}.bim-menu.has-icons .bim-menu-item-icon{width:16px;height:16px;margin-right:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.bim-menu-item-icon svg{width:100%;height:100%;fill:currentColor}.bim-menu-item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bim-menu-item-arrow{width:12px;height:12px;margin-left:8px;display:flex;align-items:center;justify-content:center;opacity:.7}.bim-menu-item-arrow svg{width:100%;height:100%;fill:currentColor}.bim-tree{width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden;font-size:14px;color:var(--bim-text-primary);-webkit-user-select:none;user-select:none;position:relative;background:transparent}.bim-tree-search{padding:6px;background-color:transparent;flex-shrink:0;position:relative}.bim-tree-search-wrapper{position:relative;width:100%;display:flex;align-items:center}.bim-tree-search-icon{position:absolute;left:8px;width:16px;height:16px;color:var(--bim-text-secondary);pointer-events:none;display:flex;align-items:center;justify-content:center}.bim-tree-search-icon svg{width:100%;height:100%}.bim-tree-search-input{width:100%;height:30px;padding:4px 8px 4px 30px;border:1px solid var(--bim-border-default);border-radius:4px;outline:none;font-size:13px;color:inherit;background-color:var(--bim-bg-elevated);transition:all .2s;box-sizing:border-box}.bim-tree-search-input:focus{border-color:var(--bim-primary);box-shadow:var(--bim-focus-ring)}.bim-tree-search-results{position:absolute;top:100%;left:8px;right:8px;background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);box-shadow:var(--bim-shadow-md);border-radius:4px;max-height:200px;overflow-y:auto;z-index:10;display:none}.bim-tree-search-results.is-visible{display:block}.bim-tree-search-item{padding:8px 12px;cursor:pointer;border-bottom:1px solid rgba(0,0,0,.03)}.bim-tree-search-item:last-child{border-bottom:none}.bim-tree-search-item:hover{background-color:var(--bim-component-bg-hover)}.bim-tree-search-item-title{font-weight:500;display:block}.bim-tree-search-item-path{font-size:12px;color:var(--bim-text-secondary);margin-top:2px;display:block}.bim-tree-node-content:hover{background-color:var(--bim-component-bg-hover)}.bim-tree-switcher{width:24px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--bim-text-secondary);transition:transform .2s;flex-shrink:0}.bim-tree-switcher svg{width:12px;height:12px;fill:currentColor;transition:transform .2s}.bim-tree-switcher.is-expanded svg{transform:rotate(90deg)}.bim-tree-switcher.is-hidden{visibility:hidden}.bim-tree-checkbox{width:16px;height:16px;border:1px solid var(--bim-border-default);border-radius:2px;margin-right:8px;background-color:var(--bim-bg-elevated);position:relative;cursor:pointer;flex-shrink:0;transition:all .2s}.bim-tree-checkbox:hover{border-color:var(--bim-primary)}.bim-tree-checkbox.is-checked{background-color:var(--bim-primary);border-color:var(--bim-primary)}.bim-tree-checkbox.is-checked:after{content:"";position:absolute;top:1px;left:4px;width:5px;height:9px;border:2px solid var(--bim-text-inverse);border-top:0;border-left:0;transform:rotate(45deg)}.bim-tree-checkbox.is-indeterminate{background-color:var(--bim-bg-elevated);border-color:var(--bim-primary)}.bim-tree-checkbox.is-indeterminate:after{content:"";position:absolute;top:6px;left:3px;width:8px;height:2px;background-color:var(--bim-primary)}.bim-tree-node.is-disabled .bim-tree-checkbox{background-color:var(--bim-component-bg-disabled);border-color:var(--bim-border-disabled);cursor:not-allowed}.bim-tree-node.is-disabled .bim-tree-checkbox.is-checked{background-color:var(--bim-text-disabled)}.bim-tree-node.is-disabled .bim-tree-node-content{color:var(--bim-text-disabled);cursor:not-allowed}.bim-tree-icon{width:16px;height:16px;margin-right:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.bim-tree-icon img,.bim-tree-icon svg{width:100%;height:100%}.bim-tree-title{flex:1;white-space:nowrap}.bim-tree-children{display:none;overflow:visible}.bim-tree-children.is-visible{display:block}.bim-tree-node-content.is-selected{background-color:var(--bim-component-bg-selected);color:var(--bim-primary)}.bim-tree-node-actions{display:none;align-items:center;margin-left:8px;flex-shrink:0}.bim-tree-node-content.is-selected .bim-tree-node-actions{display:flex}.bim-tree-content{flex:1;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;scroll-behavior:auto;padding:2px 0;min-height:0}.bim-tree-node{display:flex;flex-direction:column;width:100%}.bim-tree-node-content{display:flex;align-items:center;height:32px;cursor:pointer;transition:background-color .2s;border-radius:4px;padding-right:8px;width:100%;box-sizing:border-box}.bim-tab{display:flex;flex-direction:column;width:100%;height:100%;background:transparent;color:var(--bim-text-secondary)}.bim-tab__nav{display:flex;align-items:center;gap:4px;padding:4px;margin:8px 12px;background:var(--bim-bg-inset);border-radius:8px;border:1px solid var(--bim-border-subtle)}.bim-tab__item{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 12px;border:none;border-radius:6px;background:transparent;color:var(--bim-text-secondary);cursor:pointer;transition:all .2s ease;font-size:13px;font-weight:500}.bim-tab__item:hover{color:var(--bim-text-primary);background-color:var(--bim-component-bg-hover)}.bim-tab__item.is-active{color:var(--bim-primary);background-color:var(--bim-bg-elevated);box-shadow:0 1px 3px #0000001a}.bim-tab__item.is-disabled{opacity:.5;cursor:not-allowed}.bim-tab__icon{width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-tab-icon, currentColor)}.bim-tab__icon svg{width:100%;height:100%;fill:currentColor}.bim-tab__title{white-space:nowrap}.bim-tab__content{flex:1;display:flex;position:relative;min-height:0;overflow:hidden}.bim-tab__panel{display:none;width:100%;height:100%;flex:1}.bim-tab__panel.is-active{display:flex;flex-direction:column;height:100%}.construct-tab__container{height:100%;display:flex;flex-direction:column}.construct-tab__panel-content{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}.construct-tab__panel-content .bim-tree{flex:1}.bim-measure-panel{width:100%;display:flex;flex-direction:column;box-sizing:border-box;color:var(--bim-text-secondary)}.bim-measure-settings{display:none;box-sizing:border-box;color:var(--bim-text-secondary)}.bim-measure-settings-title{font-size:14px;font-weight:600;margin-bottom:10px}.bim-measure-settings-row{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.bim-measure-settings-row .label{color:var(--bim-text-secondary);font-size:13px;flex:0 0 auto}.bim-measure-settings-select{flex:0 0 auto;width:120px;height:28px;border-radius:6px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);color:var(--bim-text-primary);padding:0 8px;box-sizing:border-box;outline:none}.bim-measure-settings-hint{font-size:12px;line-height:1.4;color:var(--bim-text-tertiary);margin-top:-4px;margin-bottom:8px}.bim-measure-settings-actions{margin-top:14px;display:flex;justify-content:flex-start;gap:10px}.bim-measure-settings-save,.bim-measure-settings-cancel{flex:0 0 auto!important;width:auto;min-width:0;height:30px;padding:0 12px;border-radius:4px;cursor:pointer;box-sizing:border-box}.bim-measure-settings-save{border:none;background:var(--bim-primary);color:var(--bim-text-inverse)}.bim-measure-settings-cancel{border:1px solid var(--bim-border-default);background:transparent;color:var(--bim-text-secondary)}.bim-measure-settings-save:hover,.bim-measure-settings-save:active,.bim-measure-settings-save:focus,.bim-measure-settings-cancel:hover,.bim-measure-settings-cancel:active,.bim-measure-settings-cancel:focus{background:inherit;outline:none}.bim-measure-settings-save:hover{background:var(--bim-primary-hover)}.bim-measure-tools{display:flex;flex-direction:column;gap:8px}.bim-measure-tool-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.bim-measure-tool-btn{width:100%;height:42px;border-radius:6px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;padding:0;box-sizing:border-box}.bim-measure-tool-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.bim-measure-tool-btn.is-active{border-color:var(--bim-primary);background:var(--bim-primary-subtle)}.bim-measure-tool-btn.is-active .bim-measure-tool-icon{color:var(--bim-primary)}.bim-measure-tool-icon{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.bim-measure-tool-icon svg{width:100%;height:100%;fill:currentColor}.bim-measure-toggle{display:flex;justify-content:flex-end}.bim-measure-toggle-btn{height:22px;border-radius:4px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:all .2s ease;padding:0 6px;gap:4px;font-size:12px;line-height:1}.bim-measure-toggle-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.bim-measure-toggle-text{color:var(--bim-text-secondary)}.bim-measure-toggle-icon svg{width:14px;height:14px;fill:currentColor;color:var(--bim-icon-default);transition:transform .15s ease}.bim-measure-toggle-btn.is-expanded .bim-measure-toggle-icon svg{transform:rotate(180deg)}.bim-measure-mode-options{display:none;flex-direction:column;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--bim-divider)}.bim-measure-mode-options.is-visible{display:flex}.bim-measure-radio-group{display:flex;align-items:center;gap:8px;font-size:13px;line-height:1.4}.bim-measure-radio-group .bim-measure-radio-label{color:var(--bim-text-secondary);min-width:58px;flex:0 0 auto}.bim-measure-radio-group .bim-measure-radio-items{display:flex;gap:4px}.bim-measure-radio-item{display:inline-flex;align-items:center;justify-content:center;height:26px;padding:0 10px;border-radius:4px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);color:var(--bim-text-secondary);font-size:12px;cursor:pointer;transition:all .15s ease;-webkit-user-select:none;user-select:none}.bim-measure-radio-item:hover{border-color:var(--bim-border-strong);color:var(--bim-text-primary)}.bim-measure-radio-item.is-active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.bim-measure-result{margin-top:12px;padding-top:12px;border-top:1px solid var(--bim-divider);display:flex;flex-direction:column;gap:10px}.bim-measure-row{display:flex;align-items:baseline;gap:8px;font-size:13px;line-height:1.4}.bim-measure-row .label{color:var(--bim-text-secondary);min-width:84px}.bim-measure-row .value{color:var(--bim-text-primary);flex:1;word-break:break-word}.bim-measure-main-number{color:#ffd24a}.bim-measure-main-number.is-laser-text,.bim-measure-main-unit{color:var(--bim-text-primary)}.bim-measure-xyz{display:flex;flex-direction:column;gap:6px}.bim-measure-xyz .value{font-variant-numeric:tabular-nums}.bim-measure-xyz-x{color:#ff4d4f!important}.bim-measure-xyz-y{color:#52c41a!important}.bim-measure-xyz-z{color:#1677ff!important}.bim-measure-footer{margin-top:12px;padding-top:10px;border-top:1px solid var(--bim-divider);display:flex;align-items:center;justify-content:flex-start;gap:10px}.bim-measure-clear-btn{background:transparent;border:none;color:var(--bim-danger);cursor:pointer;padding:0;font-size:13px;flex:0 0 auto!important;width:auto;min-width:0}.bim-measure-clear-btn:hover,.bim-measure-clear-btn:active,.bim-measure-clear-btn:focus{background:transparent;border:none;outline:none;text-decoration:none}.bim-measure-settings-btn{width:24px;height:24px;border-radius:4px;border:none;background:transparent;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;margin-left:auto;flex:0 0 auto!important}.bim-measure-settings-btn:hover,.bim-measure-settings-btn:active,.bim-measure-settings-btn:focus{background:transparent;border:none;outline:none}.bim-measure-settings-btn svg{width:18px;height:18px;fill:currentColor;color:var(--bim-icon-default)}.section-plane-panel{display:flex;gap:8px;padding:12px 12px 16px;box-sizing:border-box}.section-plane-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:10px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);border-radius:8px;cursor:pointer;transition:all .2s ease;min-width:60px;outline:none;color:var(--bim-text-primary)}.section-plane-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-plane-btn:active{background:var(--bim-primary-subtle);border-color:var(--bim-primary)}.section-plane-btn.is-active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-plane-btn.is-active .section-plane-btn-icon{color:var(--bim-primary)}.section-plane-btn-icon{width:24px;height:24px;display:flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.section-plane-btn-icon svg{width:100%;height:100%;fill:currentColor}.section-plane-btn-label{font-size:12px;color:inherit;text-align:center;line-height:1.2}.section-axis-panel{display:flex;flex-direction:column;gap:8px;padding:12px 12px 16px;box-sizing:border-box}.section-axis-row-1{display:flex;gap:8px;padding-bottom:8px;border-bottom:1px solid var(--bim-divider)}.section-axis-row-2{display:flex;gap:8px;padding-top:8px}.section-axis-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:8px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;transition:all .2s ease;outline:none;color:var(--bim-text-primary);min-height:48px}.section-axis-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-axis-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-axis-btn.active .section-axis-btn-icon{color:var(--bim-primary)}.section-axis-btn-icon{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.section-axis-btn-icon svg{width:100%;height:100%}.section-axis-btn-label{font-size:12px;color:inherit;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.section-axis-btn-text{min-height:40px}.section-axis-btn-text .section-axis-btn-label{font-size:18px;font-weight:600}.section-box-panel{display:flex;flex-direction:column;padding:12px;box-sizing:border-box;-webkit-user-select:none;user-select:none}.section-box-row-buttons{display:flex;gap:6px;padding-bottom:12px;border-bottom:1px solid var(--bim-divider)}.section-box-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:6px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;color:var(--bim-text-primary);min-height:44px;transition:all .2s ease}.section-box-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-box-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-box-btn.active .section-box-btn-icon{color:var(--bim-primary)}.section-box-btn-icon{width:24px;height:24px;color:var(--bim-icon-default)}.section-box-btn-icon svg{width:100%;height:100%}.section-box-btn-label{font-size:11px;white-space:nowrap}.section-box-sliders{display:flex;flex-direction:column;gap:16px;padding-top:16px}.section-box-slider{display:flex;align-items:center;gap:12px;position:relative;z-index:1}.section-box-slider:hover{z-index:10}.section-box-slider-label{font-size:13px;font-weight:700;color:var(--bim-text-primary);min-width:14px}.section-box-slider-track{position:relative;flex:1;height:4px;background:var(--bim-border-default);border-radius:2px}.section-box-slider-range{position:absolute;top:0;height:100%;background:var(--bim-primary);border-radius:2px;pointer-events:none}.section-box-slider-handle{position:absolute;top:50%;width:14px;height:14px;background:var(--bim-bg-elevated);border:2px solid var(--bim-primary);border-radius:50%;transform:translate(-50%,-50%);cursor:grab;z-index:5;touch-action:none;transition:transform .2s,box-shadow .2s}.section-box-slider-handle:hover{transform:translate(-50%,-50%) scale(1.2);box-shadow:0 0 0 4px var(--bim-primary-subtle)}.section-box-slider-handle.dragging{cursor:grabbing;transform:translate(-50%,-50%) scale(1.2);background:var(--bim-primary)}.walk-control-panel{display:flex;align-items:center;gap:20px;padding:12px 20px;background-color:var(--bim-bg-base, #152232);border:1px solid var(--bim-border-strong, #475569);border-radius:12px;box-shadow:var(--bim-shadow-xl, 0 20px 40px rgba(0, 0, 0, .3));-webkit-user-select:none;user-select:none}.walk-divider{width:1px;height:40px;background:var(--bim-divider);flex-shrink:0}.walk-control-left{display:flex;gap:8px}.walk-icon-btn{width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;transition:all .2s ease;color:var(--bim-icon-default);padding:8px}.walk-icon-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.walk-icon-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.walk-icon-btn.active svg{fill:var(--bim-primary)}.walk-icon-btn svg{width:32px;height:32px}.walk-control-settings{display:flex;align-items:center;gap:16px;flex:1}.walk-speed-control{display:flex;align-items:center;gap:12px}.walk-speed-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-speed-group{display:flex;align-items:center;gap:8px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-subtle);border-radius:6px;padding:4px}.walk-speed-btn{width:32px;height:32px;background:var(--bim-bg-elevated);border:1px solid var(--bim-border-subtle);border-radius:4px;color:var(--bim-text-primary);font-size:18px;cursor:pointer;transition:all .2s ease}.walk-speed-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.walk-speed-btn:disabled{opacity:.5;cursor:not-allowed}.walk-speed-display{min-width:40px;text-align:center;color:var(--bim-text-primary);font-size:14px;font-weight:700}.walk-checkbox-wrapper{display:flex;align-items:center;gap:8px;cursor:pointer}.walk-checkbox{width:18px;height:18px;cursor:pointer}.walk-checkbox:disabled{opacity:.5;cursor:not-allowed}.walk-checkbox-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-checkbox-wrapper input:disabled+.walk-checkbox-label{opacity:.5}.walk-select-wrapper{display:flex;align-items:center;gap:8px}.walk-select-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-select{padding:6px 12px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:6px;color:var(--bim-text-primary);font-size:14px;cursor:pointer;min-width:120px}.walk-select option{background:var(--bim-bg-elevated);color:var(--bim-text-primary)}.walk-exit-btn{padding:10px 24px;background:var(--bim-primary);border:none;border-radius:8px;color:var(--bim-text-inverse);font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;white-space:nowrap}.walk-exit-btn:hover{background:var(--bim-primary-hover);transform:scale(1.02)}.walk-path-panel{padding:16px;box-sizing:border-box}.walk-path-btn{border:none;border-radius:6px;cursor:pointer;font-size:14px;transition:all .2s;box-sizing:border-box}.walk-path-btn-group{display:flex;gap:8px;margin-top:16px}.walk-path-btn-play{flex:1;height:32px;padding:0 16px;background:var(--bim-primary, #3b82f6);color:#fff}.walk-path-btn-play:hover:not(:disabled){opacity:.9}.walk-path-btn-play:disabled{opacity:.5;cursor:not-allowed}.walk-path-btn-stop{flex:1;height:32px;padding:0 16px;background:#ef4444;color:#fff}.walk-path-btn-stop:hover:not(:disabled){opacity:.9}.walk-path-btn-stop:disabled{opacity:.5;cursor:not-allowed}.walk-path-btn-small{height:28px;padding:0 12px;font-size:12px;background:var(--bim-bg-elevated, #1f2d3e);color:var(--bim-text-primary, #fff);border:1px solid var(--bim-border-default, #334155)}.walk-path-btn-small:hover{background:var(--bim-border-default, #334155)}.walk-path-btn-danger{color:#ef4444}.walk-path-settings{display:flex;flex-direction:column;gap:12px;margin-bottom:16px}.walk-path-form-group{display:flex;flex-direction:column;gap:6px}.walk-path-form-group label{font-size:12px;color:var(--bim-text-secondary, #94a3b8)}.walk-path-form-group-inline{flex-direction:row;align-items:center}.walk-path-input{padding:8px 12px;border:1px solid var(--bim-border-default, #334155);border-radius:4px;background:var(--bim-bg-elevated, #1f2d3e);color:var(--bim-text-primary, #fff);font-size:14px;width:100%;box-sizing:border-box}.walk-path-input:focus{outline:none;border-color:var(--bim-primary, #3b82f6)}.walk-path-input-wrapper{display:flex;align-items:center;gap:8px}.walk-path-input-wrapper .walk-path-input{flex:1}.walk-path-unit{color:var(--bim-text-secondary, #94a3b8);font-size:14px}.walk-path-checkbox{width:16px;height:16px;margin-right:8px}.walk-path-points-section{margin-bottom:16px}.walk-path-points-toolbar{display:flex;gap:8px;margin-bottom:12px}.walk-path-points-list{height:200px;overflow-y:auto;display:flex;flex-direction:column;gap:8px}.walk-path-empty{text-align:center;padding:32px 16px;color:var(--bim-text-secondary, #94a3b8);font-size:14px}.walk-path-point-item{display:flex;justify-content:space-between;align-items:center;padding:6px 12px;background:var(--bim-bg-elevated, #1f2d3e);border-radius:4px;transition:all .2s}.walk-path-point-item:hover{background:var(--bim-border-default, #334155)}.walk-path-point-item:hover .walk-path-point-actions{opacity:1}.walk-path-point-item-active{background:var(--bim-primary, #3b82f6)}.walk-path-point-item-active .walk-path-point-name{color:#fff}.walk-path-point-item-active .walk-path-point-actions{opacity:1}.walk-path-point-name{font-size:14px;color:var(--bim-text-primary, #fff)}.walk-path-point-actions{display:flex;gap:8px;opacity:0;transition:opacity .2s}.walk-path-btn-icon{width:28px;height:28px;border:none;border-radius:4px;background:transparent;color:var(--bim-text-primary, #fff);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px}.walk-path-btn-icon:hover{background:#ffffff1a}.walk-path-btn-icon-danger:hover{background:#ef444433;color:#ef4444}.bim-collapse{background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:8px;font-size:14px;color:var(--bim-text-primary)}.bim-collapse.is-ghost{background-color:transparent;border:none}.bim-collapse.is-ghost .bim-collapse-item{border-bottom:none}.bim-collapse.is-ghost .bim-collapse-header{background-color:var(--bim-component-bg);padding-left:12px;padding-right:0;border-bottom:1px solid var(--bim-border-default)}.bim-collapse.is-ghost .bim-collapse-header:hover{background-color:var(--bim-component-bg-hover)}.bim-collapse.is-ghost .bim-collapse-content{background-color:transparent;border-top:none}.bim-collapse-item{border-bottom:1px solid var(--bim-border-subtle)}.bim-collapse-item:last-child{border-bottom:none}.bim-collapse-item.is-disabled .bim-collapse-header{color:var(--bim-text-disabled);cursor:not-allowed}.bim-collapse-header{display:flex;align-items:center;padding:12px 16px;background-color:var(--bim-component-bg);cursor:pointer;transition:all .2s ease;position:relative}.bim-collapse-header:hover{background-color:var(--bim-component-bg-hover)}.bim-collapse-arrow{margin-right:12px;font-size:12px;width:12px;height:12px;transition:transform .24s;display:inline-flex;align-items:center;justify-content:center}.bim-collapse-arrow svg{width:100%;height:100%;fill:currentColor}.bim-collapse-item.is-active .bim-collapse-arrow{transform:rotate(90deg)}.bim-collapse-icon{margin-right:8px;display:inline-flex;align-items:center}.bim-collapse-icon svg{width:16px;height:16px;fill:currentColor}.bim-collapse-title{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.bim-collapse-extra{margin-left:auto}.bim-collapse-content{overflow:hidden;background-color:var(--bim-bg-elevated);border-top:1px solid var(--bim-border-subtle);transition:height .2s ease-in-out,opacity .2s ease-in-out}.bim-collapse-content.is-hidden{display:none}.bim-ai-chat{position:absolute;width:440px;height:600px;display:flex;flex-direction:column;background:var(--bim-ai-panel, rgba(11, 18, 32, .95));border:1px solid var(--bim-ai-border, rgba(255, 255, 255, .1));border-radius:16px;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);box-shadow:0 12px 32px var(--bim-ai-shadow, rgba(0, 0, 0, .4));z-index:1000;font-family:Public Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;overflow:hidden;resize:both;min-width:360px;min-height:400px;max-width:90vw;max-height:90vh}.bim-ai-chat-header{display:flex;align-items:center;justify-content:space-between;height:56px;padding:12px 16px;border-bottom:1px solid var(--bim-ai-border, rgba(255, 255, 255, .1));flex-shrink:0;cursor:move;-webkit-user-select:none;user-select:none;border-radius:16px 16px 0 0}.bim-ai-chat-title{font-size:18px;font-weight:600;color:var(--bim-ai-text, #E5E7EB)}.bim-ai-chat-actions{display:flex;gap:8px}.bim-ai-chat-action-btn{width:32px;height:32px;border-radius:999px;border:1px solid var(--bim-ai-border, rgba(255, 255, 255, .1));background:transparent;color:var(--bim-ai-text, #E5E7EB);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.bim-ai-chat-action-btn:hover{background:var(--bim-ai-subtle-fill, rgba(255, 255, 255, .05))}.bim-ai-chat-action-btn svg{width:18px;height:18px}.bim-ai-chat-messages{flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:10px}.bim-ai-msg-ai{max-width:320px}.bim-ai-msg-ai .bim-ai-bubble{background:var(--bim-ai-panel2, rgba(15, 23, 42, .95));border:1px solid var(--bim-ai-border, rgba(255, 255, 255, .1));border-radius:16px;padding:10px}.bim-ai-msg-ai .bim-ai-bubble-content{font-size:13px;line-height:1.4;color:var(--bim-ai-text, #E5E7EB)}.bim-ai-msg-user{display:flex;justify-content:flex-end}.bim-ai-msg-user .bim-ai-bubble{max-width:300px;background:var(--bim-ai-user-bubble, rgba(29, 78, 216, .8));border-radius:16px;padding:10px;box-shadow:0 10px 26px #0003}.bim-ai-msg-user .bim-ai-bubble-content{font-size:13px;line-height:1.4;color:var(--bim-ai-user-text, #EEF2FF)}.bim-ai-step{display:flex;align-items:center;gap:10px;padding:10px;border-radius:14px;max-width:380px}.bim-ai-step-running{background:var(--bim-ai-info-soft, rgba(56, 189, 248, .1));border:1px solid rgba(56,189,248,.33)}.bim-ai-step-done{background:var(--bim-ai-success-soft, rgba(52, 211, 153, .1));border:1px solid rgba(52,211,153,.33)}.bim-ai-step-error{background:var(--bim-ai-danger-soft, rgba(239, 68, 68, .1));border:1px solid var(--bim-ai-danger-stroke, rgba(239, 68, 68, .33))}.bim-ai-step-icon{width:16px;height:16px;flex-shrink:0}.bim-ai-step-running .bim-ai-step-icon{color:var(--bim-ai-info, #38BDF8)}.bim-ai-step-done .bim-ai-step-icon{color:var(--bim-ai-success, #34D399)}.bim-ai-step-error .bim-ai-step-icon{color:var(--bim-ai-danger, #EF4444)}.bim-ai-step-text{font-size:12px;line-height:1.4;color:var(--bim-ai-text, #E5E7EB)}.bim-ai-thinking{display:flex;align-items:center;gap:10px;padding:10px;border-radius:14px;background:var(--bim-ai-panel2, rgba(15, 23, 42, .95));border:1px solid var(--bim-ai-border, rgba(255, 255, 255, .1));max-width:380px}.bim-ai-thinking-icon{width:16px;height:16px;color:var(--bim-ai-muted, #94A3B8);animation:bim-ai-spin 1s linear infinite}.bim-ai-thinking-text{font-size:12px;font-weight:600;color:var(--bim-ai-muted, #94A3B8)}@keyframes bim-ai-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.bim-ai-question-active{width:360px;border-radius:14px;background:var(--bim-ai-panel2, rgba(15, 23, 42, .95));border:1px solid var(--bim-ai-accent-stroke, rgba(59, 130, 246, .33));box-shadow:0 4px 16px var(--bim-ai-shadow, rgba(0, 0, 0, .4));overflow:hidden}.bim-ai-question-header{display:flex;align-items:center;gap:8px;padding:12px;border-bottom:1px solid var(--bim-ai-border, rgba(255, 255, 255, .1))}.bim-ai-question-icon{width:24px;height:24px;border-radius:6px;background:var(--bim-ai-accent-soft, rgba(59, 130, 246, .1));display:flex;align-items:center;justify-content:center;color:var(--bim-ai-accent, #3B82F6)}.bim-ai-question-icon svg{width:14px;height:14px}.bim-ai-question-title{font-size:13px;font-weight:600;color:var(--bim-ai-text, #E5E7EB)}.bim-ai-question-content{padding:12px;display:flex;flex-direction:column;gap:10px}.bim-ai-question-text{font-size:13px;line-height:1.4;color:var(--bim-ai-text, #E5E7EB)}.bim-ai-question-options{display:flex;flex-direction:column;gap:6px}.bim-ai-option{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:8px;background:var(--bim-ai-subtle-fill, rgba(255, 255, 255, .05));border:1px solid var(--bim-ai-border, rgba(255, 255, 255, .1));cursor:pointer;transition:all .2s ease}.bim-ai-option:hover{background:var(--bim-ai-subtle-fill-hover, rgba(255, 255, 255, .08))}.bim-ai-option.selected{background:var(--bim-ai-accent-soft, rgba(59, 130, 246, .1));border-color:var(--bim-ai-accent-stroke, rgba(59, 130, 246, .33))}.bim-ai-option-radio{width:16px;height:16px;border-radius:50%;border:1.5px solid var(--bim-ai-muted, #94A3B8);flex-shrink:0;display:flex;align-items:center;justify-content:center}.bim-ai-option.selected .bim-ai-option-radio{background:var(--bim-ai-accent, #3B82F6);border-color:var(--bim-ai-accent, #3B82F6)}.bim-ai-option-radio-dot{width:6px;height:6px;border-radius:50%;background:var(--bim-ai-accent-ink, #FFFFFF);display:none}.bim-ai-option.selected .bim-ai-option-radio-dot{display:block}.bim-ai-option-text{font-size:12px;color:var(--bim-ai-text, #E5E7EB)}.bim-ai-option-input{flex:1;background:var(--bim-ai-textbox-fill, rgba(15, 23, 42, .6));border:1px solid var(--bim-ai-border, rgba(255, 255, 255, .1));border-radius:6px;padding:6px 8px;font-size:12px;color:var(--bim-ai-text, #E5E7EB);outline:none;margin-top:8px;width:100%}.bim-ai-option-input:focus{border-color:var(--bim-ai-accent-stroke, rgba(59, 130, 246, .33))}.bim-ai-question-footer{display:flex;justify-content:flex-end;padding:12px;border-top:1px solid var(--bim-ai-border, rgba(255, 255, 255, .1))}.bim-ai-question-submit{display:flex;align-items:center;gap:4px;padding:8px 12px;border-radius:8px;background:var(--bim-ai-accent, #3B82F6);color:var(--bim-ai-accent-ink, #FFFFFF);border:none;cursor:pointer;font-size:12px;font-weight:600;transition:all .2s ease}.bim-ai-question-submit:hover{filter:brightness(1.1)}.bim-ai-question-submit svg{width:12px;height:12px}.bim-ai-question-answered{max-width:340px;padding:10px;border-radius:12px;background:var(--bim-ai-panel2, rgba(15, 23, 42, .95));border:1px solid var(--bim-ai-border, rgba(255, 255, 255, .1));display:flex;flex-direction:column;gap:8px}.bim-ai-qa-row{display:flex;gap:8px;align-items:flex-start}.bim-ai-qa-badge{width:18px;height:18px;border-radius:5px;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;flex-shrink:0}.bim-ai-qa-badge-q{background:var(--bim-ai-accent-soft, rgba(59, 130, 246, .1));color:var(--bim-ai-accent, #3B82F6)}.bim-ai-qa-badge-a{background:var(--bim-ai-success-soft, rgba(52, 211, 153, .1));color:var(--bim-ai-success, #34D399)}.bim-ai-qa-question{font-size:12px;line-height:1.4;color:var(--bim-ai-muted, #94A3B8)}.bim-ai-qa-answer{font-size:12px;line-height:1.4;color:var(--bim-ai-text, #E5E7EB)}.bim-ai-chat-composer{padding:12px;border-top:1px solid var(--bim-ai-border, rgba(255, 255, 255, .1));display:flex;flex-direction:column;gap:8px;flex-shrink:0}.bim-ai-quick-prompts{display:flex;gap:8px;flex-wrap:wrap}.bim-ai-quick-prompt{padding:5px 8px;border-radius:999px;background:var(--bim-ai-subtle-fill, rgba(255, 255, 255, .05));border:1px solid var(--bim-ai-border, rgba(255, 255, 255, .1));color:var(--bim-ai-text, #E5E7EB);font-size:12px;font-weight:600;cursor:pointer;transition:all .2s ease}.bim-ai-quick-prompt:hover{background:var(--bim-ai-subtle-fill-hover, rgba(255, 255, 255, .08))}.bim-ai-input-row{display:flex;gap:8px;align-items:flex-end}.bim-ai-textbox{flex:1;display:flex;flex-direction:column;gap:6px;padding:10px;border-radius:16px;background:var(--bim-ai-textbox-fill, rgba(15, 23, 42, .6));border:1px solid var(--bim-ai-border, rgba(255, 255, 255, .1))}.bim-ai-textbox:focus-within{border-color:var(--bim-ai-accent-stroke, rgba(59, 130, 246, .33))}.bim-ai-textarea{background:transparent;border:none;outline:none;resize:none;font-size:13px;line-height:1.4;color:var(--bim-ai-text, #E5E7EB);min-height:20px;max-height:100px}.bim-ai-textarea::placeholder{color:var(--bim-ai-muted, #94A3B8)}.bim-ai-helper{display:flex;justify-content:space-between;font-size:11px;color:var(--bim-ai-muted, #94A3B8)}.bim-ai-send-btn{width:40px;height:40px;border-radius:14px;background:var(--bim-ai-accent, #3B82F6);border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--bim-ai-accent-ink, #FFFFFF);transition:background .2s ease;flex-shrink:0}.bim-ai-send-btn:hover{background:var(--bim-ai-accent-hover, #2563EB)}.bim-ai-send-btn svg{width:18px;height:18px}.bim-ai-chat.light{--bim-ai-panel: rgba(255, 255, 255, .95);--bim-ai-panel2: #FFFFFF;--bim-ai-border: rgba(15, 23, 42, .1);--bim-ai-text: #0F172A;--bim-ai-muted: #475569;--bim-ai-shadow: rgba(11, 18, 32, .1);--bim-ai-subtle-fill: rgba(15, 23, 42, .05);--bim-ai-subtle-fill-hover: rgba(15, 23, 42, .08);--bim-ai-textbox-fill: #F1F5F9;--bim-ai-user-bubble: #2563EB;--bim-ai-user-text: #FFFFFF;--bim-ai-accent: #2563EB;--bim-ai-accent-soft: rgba(37, 99, 235, .08);--bim-ai-accent-stroke: rgba(37, 99, 235, .2);--bim-ai-success: #059669;--bim-ai-success-soft: rgba(5, 150, 105, .08);--bim-ai-danger: #DC2626;--bim-ai-danger-soft: rgba(220, 38, 38, .08);--bim-ai-danger-stroke: rgba(220, 38, 38, .2);--bim-ai-info: #0284C7;--bim-ai-info-soft: rgba(2, 132, 199, .08)}')),document.head.appendChild(e)}}catch(i){console.error("vite-plugin-css-injected-by-js",i)}})(); -(function(js,Zr){typeof exports=="object"&&typeof module<"u"?Zr(exports):typeof define=="function"&&define.amd?define(["exports"],Zr):(js=typeof globalThis<"u"?globalThis:js||self,Zr(js.IflowEngine={}))})(this,(function(js){"use strict";const Zr={common:{title:"BimEngine",description:"这是一个使用 BIM-ENGINE。",openTestDialog:"打开测试弹窗",openInfoDialog:"打开信息弹窗 (封装版)"},toolbar:{home:"首页",measure:"测量",zoomBox:"选框放大",info:"信息",location:"定位",setting:"设置",walk:"漫游",map:"地图",property:"构件详情",fullscreen:"全屏",walkMenu:"漫游菜单",walkPerson:"第一人称",walkBird:"第三人称",tree:"模型树",section:"剖切",sectionPlane:"拾取面剖切",sectionAxis:"轴向剖切",sectionBox:"剖切盒"},dialog:{testTitle:"测试弹窗",testContent:'
这是一个 可拖拽可缩放 的弹窗。

你可以尝试拖动标题栏,或者拖动右下角改变大小。
'},menu:{info:"信息",home:"首页",componentDetail:"构件详情",hideSelected:"隐藏选中构件",transparentSelected:"半透明选中构件",cancelTranslucent:"取消半透明",isolateSelected:"隔离选中构件",hideOthers:"其他构件隐藏",transparentOthers:"其他构件半透明",fitSectionBox:"剖切盒适应",showAll:"显示全部",quickSelect:"快速选择",selectSameType:"选择同类模型",selectSameLevel:"选择同层模型",selectSameLevelType:"选择同层同类模型"},tree:{searchPlaceholder:"请输入要搜索的内容"},constructTree:{title:"目录树"},tab:{component:"构件",system:"系统",space:"空间",type:"类型",major:"专业"},panel:{property:{title:"构件详情",base:"基本属性",material:"材质信息",advanced:"高级设置",tab:{props:"属性",material:"材质"}},componentDetail:{title:"构件详情",noSelection:"请先选中构件"}},measure:{btnName:"测量",dialogTitle:"测量",modes:{clearHeight:"净高",clearDistance:"净距",distance:"距离",elevation:"标高",point:"坐标",angle:"角度",area:"面积",slope:"坡度"},actions:{expand:"展开",collapse:"收起",clearAll:"删除全部",settings:"设置"},labels:{currentMode:"当前测量方式:",x:"X:",y:"Y:",z:"Z:",value:{clearHeight:"净高:",clearDistance:"净距:",distance:"距离:",elevation:"标高:",point:"坐标:",angle:"角度:",area:"面积:",slope:"坡度:"}},settings:{title:"设置",unit:"单位:",precision:"精度:",hint:"距离、净距、净高和标高默认使用该单位;角度和面积有各自默认单位。",save:"保存设置",cancel:"取消"},clearHeight:{direction:"朝向:",directionDown:"朝下",directionUp:"朝上",selectType:"选择对象:",selectPoint:"选择点",selectElement:"选择构件"}},sectionPlane:{dialogTitle:"拾取面剖切",actions:{hide:"隐藏",reverse:"反向",reset:"重置"}},sectionAxis:{dialogTitle:"轴向剖切",actions:{hide:"隐藏",reverse:"反向",axisX:"X",axisY:"Y",axisZ:"Z"}},sectionBox:{dialogTitle:"剖切盒",actions:{hide:"隐藏",reverse:"反向",fitToModel:"适应",reset:"重置"},axes:{x:"X",y:"Y",z:"Z"}},walkControl:{speed:"移动速度:",gravity:"重力",collision:"碰撞",characterModel:{label:"建筑工人",constructionWorker:"建筑工人",officeMale:"办公室男性"},walkMode:{label:"行走模式",walk:"行走模式",run:"奔跑模式"},exit:"退出",path:{dialogTitle:"路径漫游",duration:"漫游时间",durationUnit:"秒",loop:"循环播放",addPoint:"添加漫游点",deleteAll:"删除全部",point:"漫游点",play:"播放漫游",stop:"停止漫游",noPoints:"暂无漫游点,请添加"}},info:{dialogTitle:"基本信息",meshCount:"构件数量",totalTriangles:"三角面数量",totalVertices:"顶点数量"},aiChat:{title:"AI 助手",placeholder:"输入你的问题...",quickPrompt:{summarize:"总结这个模型",explain:"解释选中的构件",generate:"生成报告"},action:{new:"新建对话",history:"历史记录",settings:"设置",close:"关闭"},helper:{newline:"Shift + Enter 换行",send:"Enter 发送"},thinking:"正在思考...",other:"其他",otherPlaceholder:"请输入自定义答案",submit:"提交"},setting:{dialogTitle:"设置",renderMode:"渲染模式",modes:{simple:"性能模式",balance:"平衡模式",advanced:"效果模式"},edgeLine:"边线",ground:"显示地面",groundSize:"大小",groundTypes:{none:"无",concrete:"混凝土",grass:"草地",tile:"瓷砖",water:"水面",wood:"木地板"},contrast:"对比度",saturation:"饱和度",lightIntensity:"光照强度",environment:"环境背景",environments:{default:"默认",outdoor:"室外",indoor:"室内",night:"夜晚",overcast:"阴天",studio:"工作室"}}},xg={common:{title:"BimEngine",description:"This is a BIM-ENGINE demo.",openTestDialog:"Open Test Dialog",openInfoDialog:"Open Info Dialog (Wrapped)"},toolbar:{home:"Home",measure:"Measure",zoomBox:"Zoom Box",info:"Info",location:"Location",setting:"Settings",walk:"Walk",map:"Map",property:"Property",fullscreen:"Fullscreen",walkPerson:"Person",walkBird:"Bird Eye",walkMenu:"Menu",tree:"Tree",section:"Section",sectionPlane:"Plane Section",sectionAxis:"Axis Section",sectionBox:"Section Box"},dialog:{testTitle:"Test Dialog",testContent:'
This is a draggable and resizable dialog.

Try dragging the title bar or resizing from the bottom-right corner.
'},menu:{info:"Info",home:"Home",componentDetail:"Component Detail",hideSelected:"Hide Selected",transparentSelected:"Transparent Selected",cancelTranslucent:"Cancel Translucent",isolateSelected:"Isolate Selected",hideOthers:"Hide Others",transparentOthers:"Transparent Others",fitSectionBox:"Fit Section Box",showAll:"Show All",quickSelect:"Quick Select",selectSameType:"Select Same Type",selectSameLevel:"Select Same Level",selectSameLevelType:"Select Same Level & Type"},tree:{searchPlaceholder:"Please enter content to search"},constructTree:{title:"Construct Tree"},tab:{component:"Component",system:"System",space:"Space",type:"Type",major:"Major"},panel:{property:{title:"Component Details",base:"Basic Info",material:"Material",advanced:"Advanced",tab:{props:"Properties",material:"Material"}},componentDetail:{title:"Component Detail",noSelection:"Please select a component first"}},measure:{btnName:"Measure",dialogTitle:"Measure",modes:{clearHeight:"Clear Height",clearDistance:"Clear Distance",distance:"Distance",elevation:"Elevation",point:"Point",angle:"Angle",area:"Area",slope:"Slope"},actions:{expand:"Expand",collapse:"Collapse",clearAll:"Clear All",settings:"Settings"},labels:{currentMode:"Mode:",x:"X:",y:"Y:",z:"Z:",value:{clearHeight:"Clear Height:",clearDistance:"Clear Distance:",distance:"Distance:",elevation:"Elevation:",point:"Point:",angle:"Angle:",area:"Area:",slope:"Slope:"}},settings:{title:"Settings",unit:"Unit:",precision:"Precision:",hint:"Distance, clear distance, clear height and elevation use this unit by default; angle and area use their own units.",save:"Save",cancel:"Cancel"},clearHeight:{direction:"Direction:",directionDown:"Down",directionUp:"Up",selectType:"Select:",selectPoint:"Point",selectElement:"Element"}},sectionPlane:{dialogTitle:"Plane Section",actions:{hide:"Hide",reverse:"Reverse",reset:"Reset"}},sectionAxis:{dialogTitle:"Axis Section",actions:{hide:"Hide",reverse:"Reverse",axisX:"X",axisY:"Y",axisZ:"Z"}},sectionBox:{dialogTitle:"Section Box",actions:{hide:"Hide",reverse:"Reverse",fitToModel:"Fit",reset:"Reset"},axes:{x:"X",y:"Y",z:"Z"}},walkControl:{speed:"Speed:",gravity:"Gravity",collision:"Collision",characterModel:{label:"Construction Worker",constructionWorker:"Construction Worker",officeMale:"Office Male"},walkMode:{label:"Walk Mode",walk:"Walk",run:"Run"},exit:"Exit",path:{dialogTitle:"Path Roaming",duration:"Duration",durationUnit:"s",loop:"Loop",addPoint:"Add Point",deleteAll:"Delete All",point:"Point",play:"Play",stop:"Stop",noPoints:"No points yet"}},info:{dialogTitle:"Basic Info",meshCount:"Mesh Count",totalTriangles:"Total Triangles",totalVertices:"Total Vertices"},aiChat:{title:"AI Assistant",placeholder:"Ask a question...",quickPrompt:{summarize:"Summarize this model",explain:"Explain selected component",generate:"Generate report"},action:{new:"New Chat",history:"History",settings:"Settings",close:"Close"},helper:{newline:"Shift + Enter for new line",send:"Enter to send"},thinking:"Thinking...",other:"Other",otherPlaceholder:"Enter custom answer",submit:"Submit"},setting:{dialogTitle:"Settings",renderMode:"Render Mode",modes:{simple:"Performance",balance:"Balanced",advanced:"Quality"},edgeLine:"Edge Lines",ground:"Ground",groundSize:"Size",groundTypes:{none:"None",concrete:"Concrete",grass:"Grass",tile:"Tile",water:"Water",wood:"Wood"},contrast:"Contrast",saturation:"Saturation",lightIntensity:"Light Intensity",environment:"Environment",environments:{default:"Default",outdoor:"Outdoor",indoor:"Indoor",night:"Night",overcast:"Overcast",studio:"Studio"}}};class vg{currentLocale="zh-CN";messages={"zh-CN":Zr,"en-US":xg};listeners=[];constructor(){}getLocale(){return this.currentLocale}setLocale(e){this.currentLocale!==e&&(this.currentLocale=e,this.notifyListeners())}t(e){if(!e)return"";const t=e.split(".");let n=this.messages[this.currentLocale];for(const i of t)if(n&&typeof n=="object"&&i in n)n=n[i];else return e;return n}subscribe(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}notifyListeners(){this.listeners.forEach(e=>e(this.currentLocale))}}const Qt=new vg,xe=s=>Qt.t(s),Md={name:"light",primary:"#2563eb",primaryHover:"#1d4ed8",primaryActive:"#1e40af",primarySubtle:"rgba(37, 99, 235, 0.1)",success:"#16a34a",successHover:"#15803d",successSubtle:"rgba(22, 163, 74, 0.1)",warning:"#d97706",warningHover:"#b45309",warningSubtle:"rgba(217, 119, 6, 0.1)",danger:"#dc2626",dangerHover:"#b91c1c",dangerSubtle:"rgba(220, 38, 38, 0.1)",info:"#0891b2",infoHover:"#0e7490",infoSubtle:"rgba(8, 145, 178, 0.1)",bgBase:"#f8fafc",bgElevated:"#ffffff",bgOverlay:"rgba(255, 255, 255, 0.98)",bgInset:"#f1f5f9",bgGlass:"rgba(255, 255, 255, 0.8)",bgGlassBlur:"24px",textPrimary:"#0f172a",textSecondary:"#475569",textTertiary:"#94a3b8",textDisabled:"#cbd5e1",textInverse:"#ffffff",textLink:"#2563eb",textLinkHover:"#1d4ed8",iconDefault:"#64748b",iconHover:"#334155",iconActive:"#2563eb",iconDisabled:"#cbd5e1",iconInverse:"#ffffff",borderDefault:"#e2e8f0",borderSubtle:"#f1f5f9",borderStrong:"#cbd5e1",borderDisabled:"#f1f5f9",divider:"#e2e8f0",componentBg:"transparent",componentBgHover:"rgba(15, 23, 42, 0.04)",componentBgActive:"rgba(15, 23, 42, 0.08)",componentBgSelected:"rgba(37, 99, 235, 0.08)",componentBgDisabled:"#f8fafc",focusRing:"rgba(37, 99, 235, 0.5)",focusRingOffset:"#ffffff",selectionBg:"rgba(37, 99, 235, 0.15)",selectionText:"#0f172a",shadowSm:"0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)",shadowMd:"0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)",shadowLg:"0 10px 25px rgba(0, 0, 0, 0.15), 0 6px 10px rgba(0, 0, 0, 0.1)",shadowXl:"0 20px 40px rgba(0, 0, 0, 0.2), 0 10px 15px rgba(0, 0, 0, 0.1)",shadowGlow:"0 2px 8px rgba(59, 130, 246, 0.3), 0 4px 16px rgba(59, 130, 246, 0.2)",scrollbarTrack:"#f1f5f9",scrollbarThumb:"#cbd5e1",scrollbarThumbHover:"#94a3b8",floatingBg:"rgba(255, 255, 255, 0.8)",floatingBorder:"rgba(226, 232, 240, 0.5)",floatingShadow:"0 4px 24px rgba(0, 0, 0, 0.06)",floatingBtnBg:"rgba(255, 255, 255, 0.9)",floatingBtnBorder:"rgba(203, 213, 225, 0.6)",floatingBtnShadow:"0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)",floatingBtnBgHover:"#ffffff",floatingBtnShadowHover:"0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)",floatingIconColor:"#334155",floatingIconColorHover:"#1e293b",panelBg:"rgba(255, 255, 255, 0.95)",panelBorder:"rgba(226, 232, 240, 0.6)",panelHeaderBg:"rgba(248, 250, 252, 0.9)",panelRadius:"12px",tabBg:"#f1f5f9",tabItemBg:"transparent",tabItemBgHover:"rgba(255, 255, 255, 0.6)",tabItemBgActive:"#ffffff",tabItemTextActive:"#2563eb",overrides:{dialog:{headerBg:"#f8fafc"},toolbar:{bg:"rgba(255, 255, 255, 0.9)",buttonBg:"rgba(255, 255, 255, 0.95)",buttonBgHover:"#ffffff",buttonBgActive:"#2563eb"},input:{bg:"#ffffff",bgFocus:"#ffffff",placeholder:"#94a3b8"}}},yg={name:"dark",primary:"#3b82f6",primaryHover:"#60a5fa",primaryActive:"#2563eb",primarySubtle:"rgba(59, 130, 246, 0.15)",success:"#22c55e",successHover:"#4ade80",successSubtle:"rgba(34, 197, 94, 0.15)",warning:"#f59e0b",warningHover:"#fbbf24",warningSubtle:"rgba(245, 158, 11, 0.15)",danger:"#ef4444",dangerHover:"#f87171",dangerSubtle:"rgba(239, 68, 68, 0.15)",info:"#06b6d4",infoHover:"#22d3ee",infoSubtle:"rgba(6, 182, 212, 0.15)",bgBase:"#152232",bgElevated:"#1f2d3e",bgOverlay:"rgba(21, 34, 50, 0.98)",bgInset:"#152232",bgGlass:"rgba(21, 34, 50, 0.85)",bgGlassBlur:"24px",textPrimary:"#ffffff",textSecondary:"#94a3b8",textTertiary:"#64748b",textDisabled:"#475569",textInverse:"#152232",textLink:"#60a5fa",textLinkHover:"#93c5fd",iconDefault:"#ffffff",iconHover:"#ffffff",iconActive:"#3b82f6",iconDisabled:"#475569",iconInverse:"#152232",borderDefault:"rgba(51, 65, 85, 0.5)",borderSubtle:"rgba(51, 65, 85, 0.5)",borderStrong:"#475569",borderDisabled:"#1e293b",divider:"#334155",componentBg:"transparent",componentBgHover:"rgba(248, 250, 252, 0.06)",componentBgActive:"rgba(248, 250, 252, 0.1)",componentBgSelected:"rgba(59, 130, 246, 0.2)",componentBgDisabled:"#1e293b",focusRing:"rgba(59, 130, 246, 0.5)",focusRingOffset:"#1e293b",selectionBg:"rgba(59, 130, 246, 0.3)",selectionText:"#f8fafc",shadowSm:"0 2px 8px rgba(0, 0, 0, 0.4), 0 4px 12px rgba(0, 0, 0, 0.3)",shadowMd:"0 4px 12px rgba(0, 0, 0, 0.5), 0 6px 20px rgba(0, 0, 0, 0.4)",shadowLg:"0 10px 25px rgba(0, 0, 0, 0.6), 0 6px 10px rgba(0, 0, 0, 0.4)",shadowXl:"0 20px 40px rgba(0, 0, 0, 0.7), 0 10px 15px rgba(0, 0, 0, 0.5)",shadowGlow:"0 2px 8px rgba(59, 130, 246, 0.4), 0 4px 16px rgba(59, 130, 246, 0.25)",scrollbarTrack:"#1e293b",scrollbarThumb:"#475569",scrollbarThumbHover:"#64748b",floatingBg:"rgba(15, 23, 42, 0.85)",floatingBorder:"rgba(51, 65, 85, 0.4)",floatingShadow:"0 4px 24px rgba(0, 0, 0, 0.25)",floatingBtnBg:"rgba(51, 65, 85, 0.6)",floatingBtnBorder:"rgba(100, 116, 139, 0.5)",floatingBtnShadow:"0 2px 8px rgba(0, 0, 0, 0.3), 0 4px 12px rgba(0, 0, 0, 0.25)",floatingBtnBgHover:"rgba(71, 85, 105, 0.7)",floatingBtnShadowHover:"0 4px 12px rgba(0, 0, 0, 0.35), 0 6px 20px rgba(0, 0, 0, 0.3)",floatingIconColor:"#e2e8f0",floatingIconColorHover:"#f8fafc",panelBg:"rgba(15, 23, 42, 0.95)",panelBorder:"rgba(51, 65, 85, 0.5)",panelHeaderBg:"rgba(15, 23, 42, 0.9)",panelRadius:"12px",tabBg:"rgba(30, 41, 59, 0.6)",tabItemBg:"transparent",tabItemBgHover:"rgba(51, 65, 85, 0.5)",tabItemBgActive:"rgba(51, 65, 85, 0.8)",tabItemTextActive:"#60a5fa",overrides:{dialog:{headerBg:"#0f172a"},toolbar:{bg:"rgba(30, 41, 59, 0.9)",buttonBg:"rgba(51, 65, 85, 0.6)",buttonBgHover:"rgba(71, 85, 105, 0.7)",buttonBgActive:"#3b82f6"},input:{bg:"#0f172a",bgFocus:"#1e293b",placeholder:"#64748b"}}};class bg{currentTheme=Md;listeners=[];constructor(){}getTheme(){return this.currentTheme}setTheme(e){e==="light"?this.applyTheme(Md):this.applyTheme(yg)}setCustomTheme(e){this.applyTheme(e)}applyTheme(e){this.currentTheme=e,this.notifyListeners()}subscribe(e){return this.listeners.push(e),e(this.currentTheme),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}notifyListeners(){this.listeners.forEach(e=>e(this.currentTheme))}}const ot=new bg;class tc{container;options;groups=[];activeBtnIds=new Set;btnRefs=new Map;dropdownElement=null;hoverTimeout=null;customColors=new Set;unsubscribeLocale=null;unsubscribeTheme=null;DEFAULT_ICON='';constructor(e){const t=typeof e.container=="string"?document.getElementById(e.container):e.container;if(!t)throw new Error("Container not found");this.container=t,this.options={showLabel:!0,visibility:{},direction:"row",position:"static",align:"vertical",expand:"down",...e},["backgroundColor","btnBackgroundColor","btnHoverColor","btnActiveColor","iconColor","iconActiveColor","textColor","textActiveColor"].forEach(i=>{e[i]&&this.customColors.add(i)}),this.initContainer(),this.applyStyles()}emit(e,t){this.options.registry?.emit(e,t)}initContainer(){this.container.innerHTML="",this.container.classList.add("bim-btn-group-root"),this.options.direction==="column"?this.container.classList.add("dir-column"):this.container.classList.add("dir-row"),this.options.className&&this.container.classList.add(this.options.className),this.options.type&&this.options.type!=="default"&&this.container.classList.add(`type-${this.options.type}`),this.updatePosition(),this.setupEventInterception(this.container)}setupEventInterception(e){const t=i=>{i.stopPropagation()};["click","dblclick","contextmenu","wheel","mousedown","mouseup","mousemove","touchstart","touchend","touchmove","pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointerover","pointerout"].forEach(i=>{e.addEventListener(i,t,{passive:!1})})}updatePosition(){const e=this.options.position,t=this.container.style;if(t.top="",t.bottom="",t.left="",t.right="",t.transform="",e==="static"){this.container.classList.add("static");return}if(this.container.classList.remove("static"),this.container.style.position="absolute",typeof e=="object"&&"x"in e)t.left=`${e.x}px`,t.top=`${e.y}px`;else{const n="20px";switch(e){case"top-left":t.top=n,t.left=n;break;case"top-center":t.top=n,t.left="50%",t.transform="translateX(-50%)";break;case"top-right":t.top=n,t.right=n;break;case"bottom-left":t.bottom=n,t.left=n;break;case"bottom-center":t.bottom=n,t.left="50%",t.transform="translateX(-50%)";break;case"bottom-right":t.bottom=n,t.right=n;break;case"left-center":t.left=n,t.top="50%",t.transform="translateY(-50%)";break;case"right-center":t.right=n,t.top="50%",t.transform="translateY(-50%)";break;case"center":t.top="50%",t.left="50%",t.transform="translate(-50%, -50%)";break}}}applyStyles(){const e=this.container.style;this.options.backgroundColor&&e.setProperty("--bim-btn-group-section-bg",this.options.backgroundColor),this.options.btnBackgroundColor&&e.setProperty("--bim-btn-bg",this.options.btnBackgroundColor),this.options.btnHoverColor&&e.setProperty("--bim-btn-hover-bg",this.options.btnHoverColor),this.options.btnActiveColor&&e.setProperty("--bim-btn-active-bg",this.options.btnActiveColor),this.options.iconColor&&e.setProperty("--bim-icon-color",this.options.iconColor),this.options.iconActiveColor&&e.setProperty("--bim-icon-active-color",this.options.iconActiveColor),this.options.textColor&&e.setProperty("--bim-btn-text-color",this.options.textColor),this.options.textActiveColor&&e.setProperty("--bim-btn-text-active-color",this.options.textActiveColor),document.querySelectorAll(".opt-btn-dropdown").forEach(n=>{const i=n.style;this.options.iconColor&&i.setProperty("--bim-icon-color",this.options.iconColor),this.options.iconActiveColor&&i.setProperty("--bim-icon-active-color",this.options.iconActiveColor),this.options.textColor&&i.setProperty("--bim-btn-text-color",this.options.textColor),this.options.textActiveColor&&i.setProperty("--bim-btn-text-active-color",this.options.textActiveColor),this.options.btnBackgroundColor&&i.setProperty("--bim-btn-bg",this.options.btnBackgroundColor),this.options.btnHoverColor&&i.setProperty("--bim-btn-hover-bg",this.options.btnHoverColor),this.options.btnActiveColor&&i.setProperty("--bim-btn-active-bg",this.options.btnActiveColor)})}setPrimaryColor(e){this.container.style.setProperty("--bim-primary-color",e),document.querySelectorAll(".opt-btn-dropdown").forEach(n=>{n.style.setProperty("--bim-primary-color",e)})}setTheme(e){const t={backgroundColor:e.bgElevated,btnBackgroundColor:e.componentBg,btnHoverColor:e.componentBgHover,btnActiveColor:e.componentBgActive,iconColor:e.iconDefault,iconActiveColor:e.iconActive,textColor:e.textSecondary,textActiveColor:e.textPrimary};Object.entries(t).forEach(([n,i])=>{const r=n;this.customColors.has(r)||(this.options[r]=i)}),this.container.classList.remove("theme-dark","theme-light"),this.container.classList.add(`theme-${e.name}`),this.applyStyles(),this.setPrimaryColor(e.primary),this.applyThemeCssVars(e)}applyThemeCssVars(e){const t=this.container.style;t.setProperty("--bim-primary",e.primary),t.setProperty("--bim-primary-hover",e.primaryHover),t.setProperty("--bim-primary-active",e.primaryActive),t.setProperty("--bim-bg-glass",e.bgGlass),t.setProperty("--bim-bg-glass-blur",e.bgGlassBlur),t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-bg-overlay",e.bgOverlay),t.setProperty("--bim-bg-inset",e.bgInset),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-secondary",e.textSecondary),t.setProperty("--bim-text-tertiary",e.textTertiary),t.setProperty("--bim-text-inverse",e.textInverse),t.setProperty("--bim-icon-default",e.iconDefault),t.setProperty("--bim-icon-hover",e.iconHover),t.setProperty("--bim-icon-active",e.iconActive),t.setProperty("--bim-icon-inverse",e.iconInverse),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-border-subtle",e.borderSubtle),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-component-bg-active",e.componentBgActive),t.setProperty("--bim-shadow-sm",e.shadowSm),t.setProperty("--bim-shadow-md",e.shadowMd),t.setProperty("--bim-shadow-lg",e.shadowLg),t.setProperty("--bim-shadow-glow",e.shadowGlow),t.setProperty("--bim-floating-bg",e.floatingBg),t.setProperty("--bim-floating-border",e.floatingBorder),t.setProperty("--bim-floating-shadow",e.floatingShadow),t.setProperty("--bim-floating-btn-bg",e.floatingBtnBg),t.setProperty("--bim-floating-btn-border",e.floatingBtnBorder),t.setProperty("--bim-floating-btn-shadow",e.floatingBtnShadow),t.setProperty("--bim-floating-btn-bg-hover",e.floatingBtnBgHover),t.setProperty("--bim-floating-btn-shadow-hover",e.floatingBtnShadowHover),t.setProperty("--bim-floating-icon-color",e.floatingIconColor),t.setProperty("--bim-floating-icon-color-hover",e.floatingIconColorHover),this.syncDropdownCssVars(e)}syncDropdownCssVars(e){document.querySelectorAll(".opt-btn-dropdown").forEach(n=>{const i=n.style;i.setProperty("--bim-primary",e.primary),i.setProperty("--bim-bg-overlay",e.bgOverlay),i.setProperty("--bim-border-default",e.borderDefault),i.setProperty("--bim-text-primary",e.textPrimary),i.setProperty("--bim-text-inverse",e.textInverse),i.setProperty("--bim-shadow-lg",e.shadowLg),i.setProperty("--bim-floating-btn-bg",e.floatingBtnBg),i.setProperty("--bim-floating-btn-bg-hover",e.floatingBtnBgHover),i.setProperty("--bim-floating-icon-color",e.floatingIconColor)})}setColors(e){this.options={...this.options,...e},Object.keys(e).forEach(t=>{this.customColors.add(t)}),this.applyStyles()}async init(){this.render(),this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)})}setLocales(){this.render()}addGroup(e,t){if(this.groups.some(i=>i.id===e))return;const n={id:e,buttons:[]};if(t){const i=this.groups.findIndex(r=>r.id===t);i!==-1?this.groups.splice(i,0,n):this.groups.push(n)}else this.groups.push(n)}addButton(e){const{groupId:t,parentId:n}=e,i=this.groups.find(a=>a.id===t);if(!i)return;const r={...e,children:e.children||[]};if(n){const a=this.findButton(i.buttons,n);a&&(a.children||(a.children=[]),a.children.push(r))}else i.buttons.push(r)}findButton(e,t){for(const n of e){if(n.id===t)return n;if(n.children){const i=this.findButton(n.children,t);if(i)return i}}}render(){this.container.innerHTML="",this.btnRefs.clear(),this.groups.forEach((e,t)=>{const n=this.renderGroup(e,t,this.groups.length);this.container.appendChild(n)})}renderGroup(e,t,n){const i=document.createElement("div");return i.className="bim-btn-group-section",t{if(this.isVisible(r.id)){const a=this.renderButton(r);i.appendChild(a)}}),i}renderButton(e){const t=document.createElement("div");t.className="opt-btn-wrapper";const n=document.createElement("div");n.className="opt-btn",e.isActive&&this.activeBtnIds.add(e.id),(e.align||this.options.align||"vertical")==="horizontal"?n.classList.add("align-horizontal"):n.classList.add("align-vertical"),this.activeBtnIds.has(e.id)&&n.classList.add("active"),e.disabled&&n.classList.add("disabled"),this.options.showLabel&&e.label||(n.classList.add("no-label"),e.label&&(n.title=xe(e.label)));const a=e.iconSize||32,o=e.minWidth||50;n.style.minWidth=`${o}px`;const l=document.createElement("div");l.className="opt-btn-icon",l.style.width=`${a}px`,l.style.height=`${a}px`,l.innerHTML=this.getIcon(e.icon),n.appendChild(l);const c=document.createElement("div");if(c.className="opt-btn-text-wrapper",this.options.showLabel&&e.label){const h=document.createElement("span");h.className="opt-btn-label",h.textContent=xe(e.label),c.appendChild(h)}return c.hasChildNodes()&&n.appendChild(c),n.addEventListener("click",()=>this.handleClick(e)),n.addEventListener("mouseenter",()=>this.handleMouseEnter(e,n)),n.addEventListener("mouseleave",()=>this.handleMouseLeave()),this.btnRefs.set(e.id,n),t.appendChild(n),t}setBtnActive(e,t){const n=this.findButtonById(e);if(!n)return;const i=t!==void 0?t:!this.activeBtnIds.has(e);i?this.activeBtnIds.add(e):this.activeBtnIds.delete(e),n.isActive=i,this.updateButtonState(e)}handleClick(e){if(!e.disabled&&(!e.children||e.children.length===0)){if(e.keepActive){const n=!this.activeBtnIds.has(e.id);this.setBtnActive(e.id,n),n&&e.exclusive&&e.groupId&&this.deactivateExclusiveSiblings(e)}this.closeDropdown(),e.onClick&&e.onClick(e)}}deactivateExclusiveSiblings(e){const t=this.groups.find(n=>n.id===e.groupId);if(t){if(e.parentId){const i=this.findButton(t.buttons,e.parentId)?.children||[];for(const r of i)r&&r.id!==e.id&&r.parentId===e.parentId&&r.groupId===e.groupId&&this.activeBtnIds.has(r.id)&&(this.setBtnActive(r.id,!1),r.onClick&&r.onClick(r));return}for(const n of t.buttons)n.id!==e.id&&n.groupId===e.groupId&&(n.parentId||this.activeBtnIds.has(n.id)&&(this.setBtnActive(n.id,!1),n.onClick&&n.onClick(n)))}}handleMouseEnter(e,t){this.hoverTimeout&&clearTimeout(this.hoverTimeout),e.children&&e.children.length>0?this.showDropdown(e,t):this.closeDropdown()}handleMouseLeave(){this.hoverTimeout=window.setTimeout(()=>this.closeDropdown(),200)}showDropdown(e,t){if(this.closeDropdown(),!e.children)return;const n=document.createElement("div");n.className="opt-btn-dropdown",this.options.backgroundColor&&n.style.setProperty("--bim-toolbar-bg",this.options.backgroundColor);const i=n.style;this.options.iconColor&&i.setProperty("--bim-icon-color",this.options.iconColor),this.options.iconActiveColor&&i.setProperty("--bim-icon-active-color",this.options.iconActiveColor),this.options.textColor&&i.setProperty("--bim-btn-text-color",this.options.textColor),this.options.textActiveColor&&i.setProperty("--bim-btn-text-active-color",this.options.textActiveColor),this.options.btnBackgroundColor&&i.setProperty("--bim-btn-bg",this.options.btnBackgroundColor),this.options.btnHoverColor&&i.setProperty("--bim-btn-hover-bg",this.options.btnHoverColor),this.options.btnActiveColor&&i.setProperty("--bim-btn-active-bg",this.options.btnActiveColor);const r=t.getBoundingClientRect(),a=this.options.expand||"down";this.options.direction==="row"?n.style.flexDirection="column":n.style.flexDirection="row",this.options.type&&this.options.type!=="default"&&n.classList.add(`type-${this.options.type}`);const o=ot.getTheme();n.classList.add(`theme-${o.name}`),i.setProperty("--bim-primary",o.primary),i.setProperty("--bim-bg-overlay",o.bgOverlay),i.setProperty("--bim-border-default",o.borderDefault),i.setProperty("--bim-text-primary",o.textPrimary),i.setProperty("--bim-text-inverse",o.textInverse),i.setProperty("--bim-shadow-lg",o.shadowLg),i.setProperty("--bim-floating-btn-bg",o.floatingBtnBg),i.setProperty("--bim-floating-btn-bg-hover",o.floatingBtnBgHover),i.setProperty("--bim-floating-icon-color",o.floatingIconColor),document.body.appendChild(n),this.setupEventInterception(n),e.children.forEach(c=>{if(this.isVisible(c.id)){const h=this.renderDropdownItem(c);n.appendChild(h)}});const l=n.getBoundingClientRect();a==="up"?(n.style.bottom=window.innerHeight-r.top+8+"px",n.style.left=r.left+(r.width-l.width)/2+"px"):a==="down"?(n.style.top=r.bottom+8+"px",n.style.left=r.left+(r.width-l.width)/2+"px"):a==="right"?(n.style.top=r.top+(r.height-l.height)/2+"px",n.style.left=r.right+8+"px"):a==="left"&&(n.style.top=r.top+(r.height-l.height)/2+"px",n.style.right=window.innerWidth-r.left+8+"px"),n.addEventListener("mouseenter",()=>{this.hoverTimeout&&clearTimeout(this.hoverTimeout)}),n.addEventListener("mouseleave",()=>this.handleMouseLeave()),this.dropdownElement=n}renderDropdownItem(e){const t=document.createElement("div");t.className="opt-btn-dropdown-item",(e.align||"horizontal")==="horizontal"?t.classList.add("align-horizontal"):t.classList.add("align-vertical"),(this.activeBtnIds.has(e.id)||e.isActive)&&t.classList.add("active");const i=e.iconSize||32,r=e.minWidth;r&&(t.style.minWidth=`${r}px`);const a=document.createElement("div");if(a.className="opt-btn-icon",a.style.width=`${i}px`,a.style.height=`${i}px`,a.innerHTML=this.getIcon(e.icon),t.appendChild(a),this.options.showLabel&&e.label){const o=document.createElement("span");o.className="opt-btn-dropdown-label",o.textContent=xe(e.label),t.appendChild(o)}else e.label&&(t.title=xe(e.label));return t.addEventListener("click",o=>{o.stopPropagation(),this.handleClick(e)}),t}closeDropdown(){this.dropdownElement&&(this.dropdownElement.remove(),this.dropdownElement=null),this.btnRefs.forEach(e=>{const t=e.querySelector(".opt-btn-arrow");t&&t.classList.remove("rotated")})}updateButtonState(e){const t=this.btnRefs.get(e);t&&(this.activeBtnIds.has(e)?t.classList.add("active"):t.classList.remove("active"))}getIcon(e){return e||this.DEFAULT_ICON}updateButtonVisibility(e,t){this.options.visibility||(this.options.visibility={}),this.options.visibility[e]=t,this.render()}setShowLabel(e){this.options.showLabel=e,this.updateLabelsVisibility()}updateLabelsVisibility(){this.btnRefs.forEach((e,t)=>{const n=this.findButtonById(t);if(!n)return;this.options.showLabel&&n.label?(e.classList.remove("no-label"),e.removeAttribute("title")):(e.classList.add("no-label"),n.label&&(e.title=xe(n.label)))})}findButtonById(e){for(const t of this.groups){const n=this.findButton(t.buttons,e);if(n)return n}}setBackgroundColor(e){this.setColors({backgroundColor:e})}isVisible(e){return this.options.visibility?.[e]!==!1}setType(e){this.container.classList.remove("type-default","type-glass-pill"),this.options.type=e,e&&e!=="default"&&this.container.classList.add(`type-${e}`),this.render()}getType(){return this.options.type||"default"}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.closeDropdown(),this.container.innerHTML="",this.btnRefs.clear()}}class _g extends tc{async init(){await super.init();const e=this.options.registry,{createHomeButton:t}=await Promise.resolve().then(()=>$T),{createZoomBoxButton:n}=await Promise.resolve().then(()=>KT),{createWalkMenuButton:i}=await Promise.resolve().then(()=>JT),{createMapButton:r}=await Promise.resolve().then(()=>QT),{createPropertyButton:a}=await Promise.resolve().then(()=>eC),{createSettingButton:o}=await Promise.resolve().then(()=>tC),{createInfoButton:l}=await Promise.resolve().then(()=>nC),{createFullscreenButton:c}=await Promise.resolve().then(()=>iC),{createMeasureButton:h}=await Promise.resolve().then(()=>sC),{createSectionMenuButton:u}=await Promise.resolve().then(()=>rC),{createSectionPlaneButton:p}=await Promise.resolve().then(()=>aC),{createSectionAxisButton:d}=await Promise.resolve().then(()=>oC),{createSectionBoxButton:m}=await Promise.resolve().then(()=>lC),{createAiChatButton:f}=await Promise.resolve().then(()=>cC);this.addGroup("group-1"),this.addButton(t(e)),this.addButton(n(e)),this.addButton(h(e)),this.addButton(u(e)),this.addButton(p(e)),this.addButton(d(e)),this.addButton(m(e)),this.addButton(i(e)),this.addButton(r(e)),this.addButton(a(e)),this.addGroup("group-2"),this.addButton(f(e)),this.addButton(o(e)),this.addButton(l(e)),this.addButton(c(e)),this.render()}}class xi{registry;subscriptions=[];constructor(e){this.registry=e}subscribe(e,t){const n=this.registry.on(e,t);this.subscriptions.push(n)}emit(e,t){this.registry.emit(e,t)}destroy(){this.subscriptions.forEach(e=>e()),this.subscriptions=[]}}class Mg extends xi{toolbar=null;toolbarContainer=null;container;constructor(e,t){super(t),this.container=e,this.init()}init(){this.toolbarContainer=document.createElement("div"),this.toolbarContainer.id="opt-btn-groups",this.toolbarContainer.className="bim-engine-opt-btn-container is-bottom-toolbar",this.container.appendChild(this.toolbarContainer),this.toolbar=new _g({container:this.toolbarContainer,type:"glass-pill",showLabel:!0,direction:"row",position:"bottom-right",align:"vertical",expand:"up",registry:this.registry}),this.toolbar.init()}updateTheme(e){this.toolbar?.setTheme(e)}refresh(){this.toolbar?.render()}destroy(){this.toolbar?.destroy(),this.toolbar=null,super.destroy()}addGroup(e,t){this.toolbar?.addGroup(e,t),this.toolbar?.render()}addButton(e){this.toolbar?.addButton(e),this.toolbar?.render()}setButtonVisibility(e,t){this.toolbar?.updateButtonVisibility(e,t)}setShowLabel(e){this.toolbar?.setShowLabel(e)}setBtnActive(e,t){this.toolbar?.setBtnActive(e,t)}setVisible(e){this.toolbarContainer&&(this.toolbarContainer.style.visibility=e?"visible":"hidden")}setBackgroundColor(e){this.toolbar?.setBackgroundColor(e)}setColors(e){this.toolbar?.setColors(e)}hide(){this.toolbarContainer&&(this.toolbarContainer.style.display="none")}show(){this.toolbarContainer&&(this.toolbarContainer.style.display="")}getContainer(){return this.toolbarContainer}setType(e){this.toolbar?.setType(e)}getType(){return this.toolbar?.getType()||"default"}}class wg extends xi{groups=new Map;container;constructor(e,t){super(t),this.container=e}create(e,t){const n=new tc({container:this.container,registry:this.registry,...t});return n.init(),this.groups.set(e,n),n}get(e){return this.groups.get(e)}updateTheme(e){this.groups.forEach(t=>t.setTheme(e))}destroy(){this.groups.forEach(e=>e.destroy()),this.groups.clear(),super.destroy()}}class Sg{element;options;container;header;contentArea;_isDestroyed=!1;_isInitialized=!1;unsubscribeTheme=null;unsubscribeLocale=null;rafId=null;constructor(e){this.options={title:"Dialog",width:300,height:"auto",position:"center",draggable:!0,resizable:!1,minWidth:200,minHeight:100,...e},this.container=e.container,this.element=this.createDom(),this.header=this.element.querySelector(".bim-dialog-header"),this.contentArea=this.element.querySelector(".bim-dialog-content"),this.init()}setTheme(e){const t=this.element.style;this.options.backgroundColor||t.setProperty("--bim-dialog-bg",e.bgElevated),this.options.headerBackgroundColor||t.setProperty("--bim-dialog-header-bg",e.bgInset),this.options.titleColor||t.setProperty("--bim-dialog-title-color",e.textPrimary),this.options.textColor||t.setProperty("--bim-dialog-text-color",e.textSecondary),this.options.borderColor||t.setProperty("--bim-dialog-border-color",e.borderDefault),t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-bg-inset",e.bgInset),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-secondary",e.textSecondary),t.setProperty("--bim-text-tertiary",e.textTertiary),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-shadow-lg",e.shadowLg)}init(){this._isInitialized||(this.container.appendChild(this.element),this.initPosition(),this.options.draggable&&this.initDrag(),this.options.resizable&&this.initResize(),this._isInitialized=!0,this.options.onOpen&&this.options.onOpen(),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)}),this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}))}setLocales(){if(this.options.title){const e=this.header.querySelector(".bim-dialog-title");e&&(e.textContent=xe(this.options.title))}}createDom(){const e=document.createElement("div");e.className="bim-dialog",this.options.id&&(e.id=this.options.id);const t=e.style;this.options.backgroundColor&&t.setProperty("--bim-dialog-bg",this.options.backgroundColor),this.options.headerBackgroundColor&&t.setProperty("--bim-dialog-header-bg",this.options.headerBackgroundColor),this.options.titleColor&&t.setProperty("--bim-dialog-title-color",this.options.titleColor),this.options.textColor&&t.setProperty("--bim-dialog-text-color",this.options.textColor),this.options.borderColor&&t.setProperty("--bim-dialog-border-color",this.options.borderColor),this.setSize(e,this.options.width,this.options.height),this.options.minWidth&&(e.style.minWidth=`${this.options.minWidth}px`);const n=document.createElement("div");n.className="bim-dialog-header",this.options.draggable&&n.classList.add("draggable");const i=document.createElement("span");i.className="bim-dialog-title",i.textContent=this.options.title?xe(this.options.title):"";const r=document.createElement("span");r.className="bim-dialog-close",r.innerHTML="×",r.onclick=()=>{this.close()},n.appendChild(i),n.appendChild(r);const a=document.createElement("div");if(a.className="bim-dialog-content",typeof this.options.content=="string"?a.innerHTML=this.options.content:this.options.content instanceof HTMLElement&&a.appendChild(this.options.content),e.appendChild(n),e.appendChild(a),this.options.resizable){const c=document.createElement("div");c.className="bim-dialog-resize-handle",e.appendChild(c)}const o=c=>{c.stopPropagation()};return["click","dblclick","contextmenu","wheel","mousedown","mouseup","mousemove","touchstart","touchend","touchmove","pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointerover","pointerout"].forEach(c=>{e.addEventListener(c,o,{passive:!1})}),e}setSize(e,t,n){t!==void 0&&(t==="auto"||t==="fit-content"?e.style.width=t:e.style.width=typeof t=="number"?`${t}px`:t),n!==void 0&&(n==="auto"||n==="fit-content"?e.style.height=n:e.style.height=typeof n=="number"?`${n}px`:n)}fitWidth(e=!1){this.element.style.width="fit-content",e&&this.initPosition()}fitHeight(e=!1){this.element.style.height="auto";const t=this.element.getBoundingClientRect().height,n=this.options.minHeight??100,i=this.container.clientHeight||0;let r=Math.max(n,t);i>0&&(r=Math.min(r,i)),this.element.style.height=`${r}px`,e?this.initPosition():this.clampToContainer()}clampToContainer(){const e=this.container.clientWidth,t=this.container.clientHeight,n=this.element.offsetWidth,i=this.element.offsetHeight,r=this.options.bottomOffset??70,a=this.element.offsetLeft,o=this.element.offsetTop,l=Math.max(0,e-n),c=Math.max(0,t-i-r),h=Math.max(0,Math.min(a,l)),u=Math.max(0,Math.min(o,c));this.element.style.left=`${h}px`,this.element.style.top=`${u}px`}initPosition(){const e=this.options.position,t=this.element.getBoundingClientRect(),n=this.options.bottomOffset??70;let i=0,r=0;const a=this.container.clientWidth,o=this.container.clientHeight,l=t.width,c=t.height;if(typeof e=="object"&&"x"in e)i=e.x,r=e.y;else switch(e){case"center":i=(a-l)/2,r=(o-c)/2;break;case"top-left":i=0,r=0;break;case"top-center":i=(a-l)/2,r=0;break;case"top-right":i=a-l,r=0;break;case"left-center":i=0,r=(o-c)/2;break;case"right-center":i=a-l,r=(o-c)/2;break;case"bottom-left":i=0,r=o-c-n;break;case"bottom-center":i=(a-l)/2,r=o-c-n;break;case"bottom-right":i=a-l,r=o-c-n;break;default:i=(a-l)/2,r=(o-c)/2}i=Math.max(0,Math.min(i,a-l)),r=Math.max(0,Math.min(r,o-c-n)),this.element.style.left=`${i}px`,this.element.style.top=`${r}px`}initDrag(){let e=0,t=0,n=0,i=0,r=0,a=0,o=0,l=0,c=0;const h=d=>{d.preventDefault(),d.stopPropagation(),e=d.clientX,t=d.clientY,n=this.element.offsetLeft,i=this.element.offsetTop,r=this.container.clientWidth,a=this.container.clientHeight,o=this.element.offsetWidth,l=this.element.offsetHeight,c=this.options.bottomOffset??70,document.addEventListener("mousemove",u,{capture:!0}),document.addEventListener("mouseup",p,{capture:!0})},u=d=>{d.preventDefault(),d.stopPropagation(),!this.rafId&&(this.rafId=requestAnimationFrame(()=>{const m=d.clientX-e,f=d.clientY-t;let x=n+m,g=i+f;const y=r-o,v=a-l-c;x=Math.max(0,Math.min(x,y)),g=Math.max(0,Math.min(g,v)),this.element.style.left=`${x}px`,this.element.style.top=`${g}px`,this.rafId=null}))},p=()=>{this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),document.removeEventListener("mousemove",u,{capture:!0}),document.removeEventListener("mouseup",p,{capture:!0})};this.header.addEventListener("mousedown",h)}initResize(){const e=this.element.querySelector(".bim-dialog-resize-handle");if(!e)return;let t=0,n=0,i=0,r=0;const a=c=>{c.preventDefault(),c.stopPropagation(),t=c.clientX,n=c.clientY,i=this.element.offsetWidth,r=this.element.offsetHeight,document.addEventListener("mousemove",o,{capture:!0}),document.addEventListener("mouseup",l,{capture:!0})},o=c=>{c.preventDefault(),c.stopPropagation(),!this.rafId&&(this.rafId=requestAnimationFrame(()=>{const h=c.clientX-t,u=c.clientY-n,p=Math.max(this.options.minWidth||100,i+h),d=Math.max(this.options.minHeight||50,r+u);this.element.style.width=`${p}px`,this.element.style.height=`${d}px`,this.rafId=null}))},l=()=>{this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),document.removeEventListener("mousemove",o,{capture:!0}),document.removeEventListener("mouseup",l,{capture:!0})};e.addEventListener("mousedown",a)}setContent(e){this.contentArea.innerHTML="",typeof e=="string"?this.contentArea.innerHTML=e:this.contentArea.appendChild(e)}close(){this._isDestroyed||(this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.element.remove(),this._isDestroyed=!0,this.options.onClose&&this.options.onClose())}destroy(){this.close()}}class Eg extends xi{container;activeDialogs=[];constructor(e,t){super(t),this.container=e}create(e){const t=new Sg({container:this.container,...e,onClose:()=>{this.activeDialogs=this.activeDialogs.filter(n=>n!==t),e.onClose&&e.onClose()}});return t.setTheme(ot.getTheme()),this.activeDialogs.push(t),t}updateTheme(e){this.activeDialogs.forEach(t=>{t.setTheme&&t.setTheme(e)})}destroy(){this.activeDialogs.forEach(e=>e.destroy()),this.activeDialogs=[],super.destroy()}}const Yr="181",qs={ROTATE:0,DOLLY:1,PAN:2},Zs={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},Tg=0,wd=1,Cg=2,Sd=1,Ed=2,vi=3,kn=0,sn=1,bt=2,St=0,Ys=1,nc=2,Td=3,Cd=4,ic=5,En=100,Ag=101,Pg=102,Rg=103,Lg=104,ds=200,Dg=201,Ig=202,Ng=203,sc=204,rc=205,Za=206,Bg=207,Ya=208,kg=209,Ug=210,Og=211,zg=212,Fg=213,Hg=214,ac=0,oc=1,lc=2,$s=3,cc=4,hc=5,uc=6,dc=7,pc=0,Vg=1,Gg=2,Fi=0,Ad=1,Pd=2,Rd=3,Ld=4,Dd=5,Id=6,Nd=7,Bd="attached",Wg="detached",kd=300,Ks=301,Js=302,$a=303,fc=304,Ka=306,Tn=1e3,Un=1001,Ja=1002,Xt=1003,Ud=1004,$r=1005,Pt=1006,Qa=1007,ai=1008,$n=1009,Od=1010,zd=1011,Kr=1012,mc=1013,ps=1014,hn=1015,un=1016,gc=1017,xc=1018,fs=1020,Fd=35902,Hd=35899,Vd=1021,Gd=1022,vn=1023,Jr=1026,ms=1027,eo=1028,vc=1029,yc=1030,bc=1031,_c=1033,to=33776,no=33777,io=33778,so=33779,Mc=35840,wc=35841,Sc=35842,Ec=35843,Tc=36196,Cc=37492,Ac=37496,Pc=37808,Rc=37809,Lc=37810,Dc=37811,Ic=37812,Nc=37813,Bc=37814,kc=37815,Uc=37816,Oc=37817,zc=37818,Fc=37819,Hc=37820,Vc=37821,Gc=36492,Wc=36494,Xc=36495,jc=36283,qc=36284,Zc=36285,Yc=36286,Qr=2300,ea=2301,$c=2302,Wd=2400,Xd=2401,jd=2402,Xg=2500,jg=0,qd=1,Kc=2,qg=3200,Zg=3201,ro=0,Yg=1,Hi="",Rt="srgb",en="srgb-linear",ao="linear",ct="srgb",Qs=7680,Zd=519,$g=512,Kg=513,Jg=514,Yd=515,Qg=516,ex=517,tx=518,nx=519,Jc=35044,$d="300 es",oi=2e3,oo=2001;function Kd(s){for(let e=s.length-1;e>=0;--e)if(s[e]>=65535)return!0;return!1}function ta(s){return document.createElementNS("http://www.w3.org/1999/xhtml",s)}function ix(){const s=ta("canvas");return s.style.display="block",s}const Jd={};function lo(...s){const e="THREE."+s.shift();console.log(e,...s)}function He(...s){const e="THREE."+s.shift();console.warn(e,...s)}function Qe(...s){const e="THREE."+s.shift();console.error(e,...s)}function na(...s){const e=s.join(" ");e in Jd||(Jd[e]=!0,He(...s))}function sx(s,e,t){return new Promise(function(n,i){function r(){switch(s.clientWaitSync(e,s.SYNC_FLUSH_COMMANDS_BIT,0)){case s.WAIT_FAILED:i();break;case s.TIMEOUT_EXPIRED:setTimeout(r,t);break;default:n()}}setTimeout(r,t)})}class gs{addEventListener(e,t){this._listeners===void 0&&(this._listeners={});const n=this._listeners;n[e]===void 0&&(n[e]=[]),n[e].indexOf(t)===-1&&n[e].push(t)}hasEventListener(e,t){const n=this._listeners;return n===void 0?!1:n[e]!==void 0&&n[e].indexOf(t)!==-1}removeEventListener(e,t){const n=this._listeners;if(n===void 0)return;const i=n[e];if(i!==void 0){const r=i.indexOf(t);r!==-1&&i.splice(r,1)}}dispatchEvent(e){const t=this._listeners;if(t===void 0)return;const n=t[e.type];if(n!==void 0){e.target=this;const i=n.slice(0);for(let r=0,a=i.length;r>8&255]+rn[s>>16&255]+rn[s>>24&255]+"-"+rn[e&255]+rn[e>>8&255]+"-"+rn[e>>16&15|64]+rn[e>>24&255]+"-"+rn[t&63|128]+rn[t>>8&255]+"-"+rn[t>>16&255]+rn[t>>24&255]+rn[n&255]+rn[n>>8&255]+rn[n>>16&255]+rn[n>>24&255]).toLowerCase()}function qe(s,e,t){return Math.max(e,Math.min(t,s))}function Qc(s,e){return(s%e+e)%e}function rx(s,e,t,n,i){return n+(s-e)*(i-n)/(t-e)}function ax(s,e,t){return s!==e?(t-s)/(e-s):0}function sa(s,e,t){return(1-t)*s+t*e}function ox(s,e,t,n){return sa(s,e,1-Math.exp(-t*n))}function lx(s,e=1){return e-Math.abs(Qc(s,e*2)-e)}function cx(s,e,t){return s<=e?0:s>=t?1:(s=(s-e)/(t-e),s*s*(3-2*s))}function hx(s,e,t){return s<=e?0:s>=t?1:(s=(s-e)/(t-e),s*s*s*(s*(s*6-15)+10))}function ux(s,e){return s+Math.floor(Math.random()*(e-s+1))}function dx(s,e){return s+Math.random()*(e-s)}function px(s){return s*(.5-Math.random())}function fx(s){s!==void 0&&(Qd=s);let e=Qd+=1831565813;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}function mx(s){return s*ia}function gx(s){return s*er}function xx(s){return(s&s-1)===0&&s!==0}function vx(s){return Math.pow(2,Math.ceil(Math.log(s)/Math.LN2))}function yx(s){return Math.pow(2,Math.floor(Math.log(s)/Math.LN2))}function bx(s,e,t,n,i){const r=Math.cos,a=Math.sin,o=r(t/2),l=a(t/2),c=r((e+n)/2),h=a((e+n)/2),u=r((e-n)/2),p=a((e-n)/2),d=r((n-e)/2),m=a((n-e)/2);switch(i){case"XYX":s.set(o*h,l*u,l*p,o*c);break;case"YZY":s.set(l*p,o*h,l*u,o*c);break;case"ZXZ":s.set(l*u,l*p,o*h,o*c);break;case"XZX":s.set(o*h,l*m,l*d,o*c);break;case"YXY":s.set(l*d,o*h,l*m,o*c);break;case"ZYZ":s.set(l*m,l*d,o*h,o*c);break;default:He("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+i)}}function Kn(s,e){switch(e.constructor){case Float32Array:return s;case Uint32Array:return s/4294967295;case Uint16Array:return s/65535;case Uint8Array:return s/255;case Int32Array:return Math.max(s/2147483647,-1);case Int16Array:return Math.max(s/32767,-1);case Int8Array:return Math.max(s/127,-1);default:throw new Error("Invalid component type.")}}function ht(s,e){switch(e.constructor){case Float32Array:return s;case Uint32Array:return Math.round(s*4294967295);case Uint16Array:return Math.round(s*65535);case Uint8Array:return Math.round(s*255);case Int32Array:return Math.round(s*2147483647);case Int16Array:return Math.round(s*32767);case Int8Array:return Math.round(s*127);default:throw new Error("Invalid component type.")}}const zt={DEG2RAD:ia,RAD2DEG:er,generateUUID:On,clamp:qe,euclideanModulo:Qc,mapLinear:rx,inverseLerp:ax,lerp:sa,damp:ox,pingpong:lx,smoothstep:cx,smootherstep:hx,randInt:ux,randFloat:dx,randFloatSpread:px,seededRandom:fx,degToRad:mx,radToDeg:gx,isPowerOfTwo:xx,ceilPowerOfTwo:vx,floorPowerOfTwo:yx,setQuaternionFromProperEuler:bx,normalize:ht,denormalize:Kn};class he{constructor(e=0,t=0){he.prototype.isVector2=!0,this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const t=this.x,n=this.y,i=e.elements;return this.x=i[0]*t+i[3]*n+i[6],this.y=i[1]*t+i[4]*n+i[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=qe(this.x,e.x,t.x),this.y=qe(this.y,e.y,t.y),this}clampScalar(e,t){return this.x=qe(this.x,e,t),this.y=qe(this.y,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const n=this.dot(e)/t;return Math.acos(qe(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y;return t*t+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){const n=Math.cos(t),i=Math.sin(t),r=this.x-e.x,a=this.y-e.y;return this.x=r*n-a*i+e.x,this.y=r*i+a*n+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class zn{constructor(e=0,t=0,n=0,i=1){this.isQuaternion=!0,this._x=e,this._y=t,this._z=n,this._w=i}static slerpFlat(e,t,n,i,r,a,o){let l=n[i+0],c=n[i+1],h=n[i+2],u=n[i+3],p=r[a+0],d=r[a+1],m=r[a+2],f=r[a+3];if(o<=0){e[t+0]=l,e[t+1]=c,e[t+2]=h,e[t+3]=u;return}if(o>=1){e[t+0]=p,e[t+1]=d,e[t+2]=m,e[t+3]=f;return}if(u!==f||l!==p||c!==d||h!==m){let x=l*p+c*d+h*m+u*f;x<0&&(p=-p,d=-d,m=-m,f=-f,x=-x);let g=1-o;if(x<.9995){const y=Math.acos(x),v=Math.sin(y);g=Math.sin(g*y)/v,o=Math.sin(o*y)/v,l=l*g+p*o,c=c*g+d*o,h=h*g+m*o,u=u*g+f*o}else{l=l*g+p*o,c=c*g+d*o,h=h*g+m*o,u=u*g+f*o;const y=1/Math.sqrt(l*l+c*c+h*h+u*u);l*=y,c*=y,h*=y,u*=y}}e[t]=l,e[t+1]=c,e[t+2]=h,e[t+3]=u}static multiplyQuaternionsFlat(e,t,n,i,r,a){const o=n[i],l=n[i+1],c=n[i+2],h=n[i+3],u=r[a],p=r[a+1],d=r[a+2],m=r[a+3];return e[t]=o*m+h*u+l*d-c*p,e[t+1]=l*m+h*p+c*u-o*d,e[t+2]=c*m+h*d+o*p-l*u,e[t+3]=h*m-o*u-l*p-c*d,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,n,i){return this._x=e,this._y=t,this._z=n,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t=!0){const n=e._x,i=e._y,r=e._z,a=e._order,o=Math.cos,l=Math.sin,c=o(n/2),h=o(i/2),u=o(r/2),p=l(n/2),d=l(i/2),m=l(r/2);switch(a){case"XYZ":this._x=p*h*u+c*d*m,this._y=c*d*u-p*h*m,this._z=c*h*m+p*d*u,this._w=c*h*u-p*d*m;break;case"YXZ":this._x=p*h*u+c*d*m,this._y=c*d*u-p*h*m,this._z=c*h*m-p*d*u,this._w=c*h*u+p*d*m;break;case"ZXY":this._x=p*h*u-c*d*m,this._y=c*d*u+p*h*m,this._z=c*h*m+p*d*u,this._w=c*h*u-p*d*m;break;case"ZYX":this._x=p*h*u-c*d*m,this._y=c*d*u+p*h*m,this._z=c*h*m-p*d*u,this._w=c*h*u+p*d*m;break;case"YZX":this._x=p*h*u+c*d*m,this._y=c*d*u+p*h*m,this._z=c*h*m-p*d*u,this._w=c*h*u-p*d*m;break;case"XZY":this._x=p*h*u-c*d*m,this._y=c*d*u-p*h*m,this._z=c*h*m+p*d*u,this._w=c*h*u+p*d*m;break;default:He("Quaternion: .setFromEuler() encountered an unknown order: "+a)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,t){const n=t/2,i=Math.sin(n);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(e){const t=e.elements,n=t[0],i=t[4],r=t[8],a=t[1],o=t[5],l=t[9],c=t[2],h=t[6],u=t[10],p=n+o+u;if(p>0){const d=.5/Math.sqrt(p+1);this._w=.25/d,this._x=(h-l)*d,this._y=(r-c)*d,this._z=(a-i)*d}else if(n>o&&n>u){const d=2*Math.sqrt(1+n-o-u);this._w=(h-l)/d,this._x=.25*d,this._y=(i+a)/d,this._z=(r+c)/d}else if(o>u){const d=2*Math.sqrt(1+o-n-u);this._w=(r-c)/d,this._x=(i+a)/d,this._y=.25*d,this._z=(l+h)/d}else{const d=2*Math.sqrt(1+u-n-o);this._w=(a-i)/d,this._x=(r+c)/d,this._y=(l+h)/d,this._z=.25*d}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let n=e.dot(t)+1;return n<1e-8?(n=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=n),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(qe(this.dot(e),-1,1)))}rotateTowards(e,t){const n=this.angleTo(e);if(n===0)return this;const i=Math.min(1,t/n);return this.slerp(e,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){const n=e._x,i=e._y,r=e._z,a=e._w,o=t._x,l=t._y,c=t._z,h=t._w;return this._x=n*h+a*o+i*c-r*l,this._y=i*h+a*l+r*o-n*c,this._z=r*h+a*c+n*l-i*o,this._w=a*h-n*o-i*l-r*c,this._onChangeCallback(),this}slerp(e,t){if(t<=0)return this;if(t>=1)return this.copy(e);let n=e._x,i=e._y,r=e._z,a=e._w,o=this.dot(e);o<0&&(n=-n,i=-i,r=-r,a=-a,o=-o);let l=1-t;if(o<.9995){const c=Math.acos(o),h=Math.sin(c);l=Math.sin(l*c)/h,t=Math.sin(t*c)/h,this._x=this._x*l+n*t,this._y=this._y*l+i*t,this._z=this._z*l+r*t,this._w=this._w*l+a*t,this._onChangeCallback()}else this._x=this._x*l+n*t,this._y=this._y*l+i*t,this._z=this._z*l+r*t,this._w=this._w*l+a*t,this.normalize();return this}slerpQuaternions(e,t,n){return this.copy(e).slerp(t,n)}random(){const e=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),n=Math.random(),i=Math.sqrt(1-n),r=Math.sqrt(n);return this.set(i*Math.sin(e),i*Math.cos(e),r*Math.sin(t),r*Math.cos(t))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class P{constructor(e=0,t=0,n=0){P.prototype.isVector3=!0,this.x=e,this.y=t,this.z=n}set(e,t,n){return n===void 0&&(n=this.z),this.x=e,this.y=t,this.z=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return this.applyQuaternion(ep.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(ep.setFromAxisAngle(e,t))}applyMatrix3(e){const t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6]*i,this.y=r[1]*t+r[4]*n+r[7]*i,this.z=r[2]*t+r[5]*n+r[8]*i,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,r=e.elements,a=1/(r[3]*t+r[7]*n+r[11]*i+r[15]);return this.x=(r[0]*t+r[4]*n+r[8]*i+r[12])*a,this.y=(r[1]*t+r[5]*n+r[9]*i+r[13])*a,this.z=(r[2]*t+r[6]*n+r[10]*i+r[14])*a,this}applyQuaternion(e){const t=this.x,n=this.y,i=this.z,r=e.x,a=e.y,o=e.z,l=e.w,c=2*(a*i-o*n),h=2*(o*t-r*i),u=2*(r*n-a*t);return this.x=t+l*c+a*u-o*h,this.y=n+l*h+o*c-r*u,this.z=i+l*u+r*h-a*c,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[4]*n+r[8]*i,this.y=r[1]*t+r[5]*n+r[9]*i,this.z=r[2]*t+r[6]*n+r[10]*i,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=qe(this.x,e.x,t.x),this.y=qe(this.y,e.y,t.y),this.z=qe(this.z,e.z,t.z),this}clampScalar(e,t){return this.x=qe(this.x,e,t),this.y=qe(this.y,e,t),this.z=qe(this.z,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,t){const n=e.x,i=e.y,r=e.z,a=t.x,o=t.y,l=t.z;return this.x=i*l-r*o,this.y=r*a-n*l,this.z=n*o-i*a,this}projectOnVector(e){const t=e.lengthSq();if(t===0)return this.set(0,0,0);const n=e.dot(this)/t;return this.copy(e).multiplyScalar(n)}projectOnPlane(e){return eh.copy(this).projectOnVector(e),this.sub(eh)}reflect(e){return this.sub(eh.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const n=this.dot(e)/t;return Math.acos(qe(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y,i=this.z-e.z;return t*t+n*n+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,n){const i=Math.sin(t)*e;return this.x=i*Math.sin(n),this.y=Math.cos(t)*e,this.z=i*Math.cos(n),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,n){return this.x=e*Math.sin(t),this.y=n,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){const t=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=n,this.z=i,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,t*4)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,t*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=Math.random()*Math.PI*2,t=Math.random()*2-1,n=Math.sqrt(1-t*t);return this.x=n*Math.cos(e),this.y=t,this.z=n*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const eh=new P,ep=new zn;class $e{constructor(e,t,n,i,r,a,o,l,c){$e.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,t,n,i,r,a,o,l,c)}set(e,t,n,i,r,a,o,l,c){const h=this.elements;return h[0]=e,h[1]=i,h[2]=o,h[3]=t,h[4]=r,h[5]=l,h[6]=n,h[7]=a,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}extractBasis(e,t,n){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,r=this.elements,a=n[0],o=n[3],l=n[6],c=n[1],h=n[4],u=n[7],p=n[2],d=n[5],m=n[8],f=i[0],x=i[3],g=i[6],y=i[1],v=i[4],b=i[7],_=i[2],M=i[5],T=i[8];return r[0]=a*f+o*y+l*_,r[3]=a*x+o*v+l*M,r[6]=a*g+o*b+l*T,r[1]=c*f+h*y+u*_,r[4]=c*x+h*v+u*M,r[7]=c*g+h*b+u*T,r[2]=p*f+d*y+m*_,r[5]=p*x+d*v+m*M,r[8]=p*g+d*b+m*T,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],a=e[4],o=e[5],l=e[6],c=e[7],h=e[8];return t*a*h-t*o*c-n*r*h+n*o*l+i*r*c-i*a*l}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],a=e[4],o=e[5],l=e[6],c=e[7],h=e[8],u=h*a-o*c,p=o*l-h*r,d=c*r-a*l,m=t*u+n*p+i*d;if(m===0)return this.set(0,0,0,0,0,0,0,0,0);const f=1/m;return e[0]=u*f,e[1]=(i*c-h*n)*f,e[2]=(o*n-i*a)*f,e[3]=p*f,e[4]=(h*t-i*l)*f,e[5]=(i*r-o*t)*f,e[6]=d*f,e[7]=(n*l-c*t)*f,e[8]=(a*t-n*r)*f,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,n,i,r,a,o){const l=Math.cos(r),c=Math.sin(r);return this.set(n*l,n*c,-n*(l*a+c*o)+a+e,-i*c,i*l,-i*(-c*a+l*o)+o+t,0,0,1),this}scale(e,t){return this.premultiply(th.makeScale(e,t)),this}rotate(e){return this.premultiply(th.makeRotation(-e)),this}translate(e,t){return this.premultiply(th.makeTranslation(e,t)),this}makeTranslation(e,t){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}equals(e){const t=this.elements,n=e.elements;for(let i=0;i<9;i++)if(t[i]!==n[i])return!1;return!0}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e}clone(){return new this.constructor().fromArray(this.elements)}}const th=new $e,tp=new $e().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),np=new $e().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function _x(){const s={enabled:!0,workingColorSpace:en,spaces:{},convert:function(i,r,a){return this.enabled===!1||r===a||!r||!a||(this.spaces[r].transfer===ct&&(i.r=yi(i.r),i.g=yi(i.g),i.b=yi(i.b)),this.spaces[r].primaries!==this.spaces[a].primaries&&(i.applyMatrix3(this.spaces[r].toXYZ),i.applyMatrix3(this.spaces[a].fromXYZ)),this.spaces[a].transfer===ct&&(i.r=tr(i.r),i.g=tr(i.g),i.b=tr(i.b))),i},workingToColorSpace:function(i,r){return this.convert(i,this.workingColorSpace,r)},colorSpaceToWorking:function(i,r){return this.convert(i,r,this.workingColorSpace)},getPrimaries:function(i){return this.spaces[i].primaries},getTransfer:function(i){return i===Hi?ao:this.spaces[i].transfer},getToneMappingMode:function(i){return this.spaces[i].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(i,r=this.workingColorSpace){return i.fromArray(this.spaces[r].luminanceCoefficients)},define:function(i){Object.assign(this.spaces,i)},_getMatrix:function(i,r,a){return i.copy(this.spaces[r].toXYZ).multiply(this.spaces[a].fromXYZ)},_getDrawingBufferColorSpace:function(i){return this.spaces[i].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(i=this.workingColorSpace){return this.spaces[i].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(i,r){return na("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),s.workingToColorSpace(i,r)},toWorkingColorSpace:function(i,r){return na("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),s.colorSpaceToWorking(i,r)}},e=[.64,.33,.3,.6,.15,.06],t=[.2126,.7152,.0722],n=[.3127,.329];return s.define({[en]:{primaries:e,whitePoint:n,transfer:ao,toXYZ:tp,fromXYZ:np,luminanceCoefficients:t,workingColorSpaceConfig:{unpackColorSpace:Rt},outputColorSpaceConfig:{drawingBufferColorSpace:Rt}},[Rt]:{primaries:e,whitePoint:n,transfer:ct,toXYZ:tp,fromXYZ:np,luminanceCoefficients:t,outputColorSpaceConfig:{drawingBufferColorSpace:Rt}}}),s}const it=_x();function yi(s){return s<.04045?s*.0773993808:Math.pow(s*.9478672986+.0521327014,2.4)}function tr(s){return s<.0031308?s*12.92:1.055*Math.pow(s,.41666)-.055}let nr;class Mx{static getDataURL(e,t="image/png"){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement>"u")return e.src;let n;if(e instanceof HTMLCanvasElement)n=e;else{nr===void 0&&(nr=ta("canvas")),nr.width=e.width,nr.height=e.height;const i=nr.getContext("2d");e instanceof ImageData?i.putImageData(e,0,0):i.drawImage(e,0,0,e.width,e.height),n=nr}return n.toDataURL(t)}static sRGBToLinear(e){if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap){const t=ta("canvas");t.width=e.width,t.height=e.height;const n=t.getContext("2d");n.drawImage(e,0,0,e.width,e.height);const i=n.getImageData(0,0,e.width,e.height),r=i.data;for(let a=0;a1),this.pmremVersion=0}get width(){return this.source.getSize(sh).x}get height(){return this.source.getSize(sh).y}get depth(){return this.source.getSize(sh).z}get image(){return this.source.data}set image(e=null){this.source.data=e}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return new this.constructor().copy(this)}copy(e){return this.name=e.name,this.source=e.source,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.channel=e.channel,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.colorSpace=e.colorSpace,this.renderTarget=e.renderTarget,this.isRenderTargetTexture=e.isRenderTargetTexture,this.isArrayTexture=e.isArrayTexture,this.userData=JSON.parse(JSON.stringify(e.userData)),this.needsUpdate=!0,this}setValues(e){for(const t in e){const n=e[t];if(n===void 0){He(`Texture.setValues(): parameter '${t}' has value of undefined.`);continue}const i=this[t];if(i===void 0){He(`Texture.setValues(): property '${t}' does not exist.`);continue}i&&n&&i.isVector2&&n.isVector2||i&&n&&i.isVector3&&n.isVector3||i&&n&&i.isMatrix3&&n.isMatrix3?i.copy(n):this[t]=n}}toJSON(e){const t=e===void 0||typeof e=="string";if(!t&&e.textures[this.uuid]!==void 0)return e.textures[this.uuid];const n={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(e).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),t||(e.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(this.mapping!==kd)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case Tn:e.x=e.x-Math.floor(e.x);break;case Un:e.x=e.x<0?0:1;break;case Ja:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case Tn:e.y=e.y-Math.floor(e.y);break;case Un:e.y=e.y<0?0:1;break;case Ja:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){e===!0&&this.pmremVersion++}}Ft.DEFAULT_IMAGE=null,Ft.DEFAULT_MAPPING=kd,Ft.DEFAULT_ANISOTROPY=1;class tt{constructor(e=0,t=0,n=0,i=1){tt.prototype.isVector4=!0,this.x=e,this.y=t,this.z=n,this.w=i}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,n,i){return this.x=e,this.y=t,this.z=n,this.w=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w!==void 0?e.w:1,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,r=this.w,a=e.elements;return this.x=a[0]*t+a[4]*n+a[8]*i+a[12]*r,this.y=a[1]*t+a[5]*n+a[9]*i+a[13]*r,this.z=a[2]*t+a[6]*n+a[10]*i+a[14]*r,this.w=a[3]*t+a[7]*n+a[11]*i+a[15]*r,this}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this.w/=e.w,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,n,i,r;const l=e.elements,c=l[0],h=l[4],u=l[8],p=l[1],d=l[5],m=l[9],f=l[2],x=l[6],g=l[10];if(Math.abs(h-p)<.01&&Math.abs(u-f)<.01&&Math.abs(m-x)<.01){if(Math.abs(h+p)<.1&&Math.abs(u+f)<.1&&Math.abs(m+x)<.1&&Math.abs(c+d+g-3)<.1)return this.set(1,0,0,0),this;t=Math.PI;const v=(c+1)/2,b=(d+1)/2,_=(g+1)/2,M=(h+p)/4,T=(u+f)/4,R=(m+x)/4;return v>b&&v>_?v<.01?(n=0,i=.707106781,r=.707106781):(n=Math.sqrt(v),i=M/n,r=T/n):b>_?b<.01?(n=.707106781,i=0,r=.707106781):(i=Math.sqrt(b),n=M/i,r=R/i):_<.01?(n=.707106781,i=.707106781,r=0):(r=Math.sqrt(_),n=T/r,i=R/r),this.set(n,i,r,t),this}let y=Math.sqrt((x-m)*(x-m)+(u-f)*(u-f)+(p-h)*(p-h));return Math.abs(y)<.001&&(y=1),this.x=(x-m)/y,this.y=(u-f)/y,this.z=(p-h)/y,this.w=Math.acos((c+d+g-1)/2),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this.w=t[15],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,t){return this.x=qe(this.x,e.x,t.x),this.y=qe(this.y,e.y,t.y),this.z=qe(this.z,e.z,t.z),this.w=qe(this.w,e.w,t.w),this}clampScalar(e,t){return this.x=qe(this.x,e,t),this.y=qe(this.y,e,t),this.z=qe(this.z,e,t),this.w=qe(this.w,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this.w=e.w+(t.w-e.w)*n,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class Ex extends gs{constructor(e=1,t=1,n={}){super(),n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:Pt,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1,depth:1,multiview:!1},n),this.isRenderTarget=!0,this.width=e,this.height=t,this.depth=n.depth,this.scissor=new tt(0,0,e,t),this.scissorTest=!1,this.viewport=new tt(0,0,e,t);const i={width:e,height:t,depth:n.depth},r=new Ft(i);this.textures=[];const a=n.count;for(let o=0;o1);this.dispose()}this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.scissor.copy(e.scissor),this.scissorTest=e.scissorTest,this.viewport.copy(e.viewport),this.textures.length=0;for(let t=0,n=e.textures.length;t=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,Jn),Jn.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,n;return e.normal.x>0?(t=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),t<=-e.constant&&n>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(ra),ho.subVectors(this.max,ra),ir.subVectors(e.a,ra),sr.subVectors(e.b,ra),rr.subVectors(e.c,ra),Vi.subVectors(sr,ir),Gi.subVectors(rr,sr),xs.subVectors(ir,rr);let t=[0,-Vi.z,Vi.y,0,-Gi.z,Gi.y,0,-xs.z,xs.y,Vi.z,0,-Vi.x,Gi.z,0,-Gi.x,xs.z,0,-xs.x,-Vi.y,Vi.x,0,-Gi.y,Gi.x,0,-xs.y,xs.x,0];return!rh(t,ir,sr,rr,ho)||(t=[1,0,0,0,1,0,0,0,1],!rh(t,ir,sr,rr,ho))?!1:(uo.crossVectors(Vi,Gi),t=[uo.x,uo.y,uo.z],rh(t,ir,sr,rr,ho))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,Jn).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(Jn).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(bi[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),bi[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),bi[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),bi[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),bi[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),bi[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),bi[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),bi[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(bi),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(e){return this.min.fromArray(e.min),this.max.fromArray(e.max),this}}const bi=[new P,new P,new P,new P,new P,new P,new P,new P],Jn=new P,co=new gt,ir=new P,sr=new P,rr=new P,Vi=new P,Gi=new P,xs=new P,ra=new P,ho=new P,uo=new P,vs=new P;function rh(s,e,t,n,i){for(let r=0,a=s.length-3;r<=a;r+=3){vs.fromArray(s,r);const o=i.x*Math.abs(vs.x)+i.y*Math.abs(vs.y)+i.z*Math.abs(vs.z),l=e.dot(vs),c=t.dot(vs),h=n.dot(vs);if(Math.max(-Math.max(l,c,h),Math.min(l,c,h))>o)return!1}return!0}const Cx=new gt,aa=new P,ah=new P;class li{constructor(e=new P,t=-1){this.isSphere=!0,this.center=e,this.radius=t}set(e,t){return this.center.copy(e),this.radius=t,this}setFromPoints(e,t){const n=this.center;t!==void 0?n.copy(t):Cx.setFromPoints(e).getCenter(n);let i=0;for(let r=0,a=e.length;rthis.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;aa.subVectors(e,this.center);const t=aa.lengthSq();if(t>this.radius*this.radius){const n=Math.sqrt(t),i=(n-this.radius)*.5;this.center.addScaledVector(aa,i/n),this.radius+=i}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(ah.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(aa.copy(e.center).add(ah)),this.expandByPoint(aa.copy(e.center).sub(ah))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(e){return this.radius=e.radius,this.center.fromArray(e.center),this}}const _i=new P,oh=new P,po=new P,Wi=new P,lh=new P,fo=new P,ch=new P;class Xi{constructor(e=new P,t=new P(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,_i)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);const n=t.dot(this.direction);return n<0?t.copy(this.origin):t.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const t=_i.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(_i.copy(this.origin).addScaledVector(this.direction,t),_i.distanceToSquared(e))}distanceSqToSegment(e,t,n,i){oh.copy(e).add(t).multiplyScalar(.5),po.copy(t).sub(e).normalize(),Wi.copy(this.origin).sub(oh);const r=e.distanceTo(t)*.5,a=-this.direction.dot(po),o=Wi.dot(this.direction),l=-Wi.dot(po),c=Wi.lengthSq(),h=Math.abs(1-a*a);let u,p,d,m;if(h>0)if(u=a*l-o,p=a*o-l,m=r*h,u>=0)if(p>=-m)if(p<=m){const f=1/h;u*=f,p*=f,d=u*(u+a*p+2*o)+p*(a*u+p+2*l)+c}else p=r,u=Math.max(0,-(a*p+o)),d=-u*u+p*(p+2*l)+c;else p=-r,u=Math.max(0,-(a*p+o)),d=-u*u+p*(p+2*l)+c;else p<=-m?(u=Math.max(0,-(-a*r+o)),p=u>0?-r:Math.min(Math.max(-r,-l),r),d=-u*u+p*(p+2*l)+c):p<=m?(u=0,p=Math.min(Math.max(-r,-l),r),d=p*(p+2*l)+c):(u=Math.max(0,-(a*r+o)),p=u>0?r:Math.min(Math.max(-r,-l),r),d=-u*u+p*(p+2*l)+c);else p=a>0?-r:r,u=Math.max(0,-(a*p+o)),d=-u*u+p*(p+2*l)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,u),i&&i.copy(oh).addScaledVector(po,p),d}intersectSphere(e,t){_i.subVectors(e.center,this.origin);const n=_i.dot(this.direction),i=_i.dot(_i)-n*n,r=e.radius*e.radius;if(i>r)return null;const a=Math.sqrt(r-i),o=n-a,l=n+a;return l<0?null:o<0?this.at(l,t):this.at(o,t)}intersectsSphere(e){return e.radius<0?!1:this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const t=e.normal.dot(this.direction);if(t===0)return e.distanceToPoint(this.origin)===0?0:null;const n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null}intersectPlane(e,t){const n=this.distanceToPlane(e);return n===null?null:this.at(n,t)}intersectsPlane(e){const t=e.distanceToPoint(this.origin);return t===0||e.normal.dot(this.direction)*t<0}intersectBox(e,t){let n,i,r,a,o,l;const c=1/this.direction.x,h=1/this.direction.y,u=1/this.direction.z,p=this.origin;return c>=0?(n=(e.min.x-p.x)*c,i=(e.max.x-p.x)*c):(n=(e.max.x-p.x)*c,i=(e.min.x-p.x)*c),h>=0?(r=(e.min.y-p.y)*h,a=(e.max.y-p.y)*h):(r=(e.max.y-p.y)*h,a=(e.min.y-p.y)*h),n>a||r>i||((r>n||isNaN(n))&&(n=r),(a=0?(o=(e.min.z-p.z)*u,l=(e.max.z-p.z)*u):(o=(e.max.z-p.z)*u,l=(e.min.z-p.z)*u),n>l||o>i)||((o>n||n!==n)&&(n=o),(l=0?n:i,t)}intersectsBox(e){return this.intersectBox(e,_i)!==null}intersectTriangle(e,t,n,i,r){lh.subVectors(t,e),fo.subVectors(n,e),ch.crossVectors(lh,fo);let a=this.direction.dot(ch),o;if(a>0){if(i)return null;o=1}else if(a<0)o=-1,a=-a;else return null;Wi.subVectors(this.origin,e);const l=o*this.direction.dot(fo.crossVectors(Wi,fo));if(l<0)return null;const c=o*this.direction.dot(lh.cross(Wi));if(c<0||l+c>a)return null;const h=-o*Wi.dot(ch);return h<0?null:this.at(h/a,r)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class De{constructor(e,t,n,i,r,a,o,l,c,h,u,p,d,m,f,x){De.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],e!==void 0&&this.set(e,t,n,i,r,a,o,l,c,h,u,p,d,m,f,x)}set(e,t,n,i,r,a,o,l,c,h,u,p,d,m,f,x){const g=this.elements;return g[0]=e,g[4]=t,g[8]=n,g[12]=i,g[1]=r,g[5]=a,g[9]=o,g[13]=l,g[2]=c,g[6]=h,g[10]=u,g[14]=p,g[3]=d,g[7]=m,g[11]=f,g[15]=x,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new De().fromArray(this.elements)}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],this}copyPosition(e){const t=this.elements,n=e.elements;return t[12]=n[12],t[13]=n[13],t[14]=n[14],this}setFromMatrix3(e){const t=e.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(e,t,n){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(e,t,n){return this.set(e.x,t.x,n.x,0,e.y,t.y,n.y,0,e.z,t.z,n.z,0,0,0,0,1),this}extractRotation(e){const t=this.elements,n=e.elements,i=1/ar.setFromMatrixColumn(e,0).length(),r=1/ar.setFromMatrixColumn(e,1).length(),a=1/ar.setFromMatrixColumn(e,2).length();return t[0]=n[0]*i,t[1]=n[1]*i,t[2]=n[2]*i,t[3]=0,t[4]=n[4]*r,t[5]=n[5]*r,t[6]=n[6]*r,t[7]=0,t[8]=n[8]*a,t[9]=n[9]*a,t[10]=n[10]*a,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(e){const t=this.elements,n=e.x,i=e.y,r=e.z,a=Math.cos(n),o=Math.sin(n),l=Math.cos(i),c=Math.sin(i),h=Math.cos(r),u=Math.sin(r);if(e.order==="XYZ"){const p=a*h,d=a*u,m=o*h,f=o*u;t[0]=l*h,t[4]=-l*u,t[8]=c,t[1]=d+m*c,t[5]=p-f*c,t[9]=-o*l,t[2]=f-p*c,t[6]=m+d*c,t[10]=a*l}else if(e.order==="YXZ"){const p=l*h,d=l*u,m=c*h,f=c*u;t[0]=p+f*o,t[4]=m*o-d,t[8]=a*c,t[1]=a*u,t[5]=a*h,t[9]=-o,t[2]=d*o-m,t[6]=f+p*o,t[10]=a*l}else if(e.order==="ZXY"){const p=l*h,d=l*u,m=c*h,f=c*u;t[0]=p-f*o,t[4]=-a*u,t[8]=m+d*o,t[1]=d+m*o,t[5]=a*h,t[9]=f-p*o,t[2]=-a*c,t[6]=o,t[10]=a*l}else if(e.order==="ZYX"){const p=a*h,d=a*u,m=o*h,f=o*u;t[0]=l*h,t[4]=m*c-d,t[8]=p*c+f,t[1]=l*u,t[5]=f*c+p,t[9]=d*c-m,t[2]=-c,t[6]=o*l,t[10]=a*l}else if(e.order==="YZX"){const p=a*l,d=a*c,m=o*l,f=o*c;t[0]=l*h,t[4]=f-p*u,t[8]=m*u+d,t[1]=u,t[5]=a*h,t[9]=-o*h,t[2]=-c*h,t[6]=d*u+m,t[10]=p-f*u}else if(e.order==="XZY"){const p=a*l,d=a*c,m=o*l,f=o*c;t[0]=l*h,t[4]=-u,t[8]=c*h,t[1]=p*u+f,t[5]=a*h,t[9]=d*u-m,t[2]=m*u-d,t[6]=o*h,t[10]=f*u+p}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(e){return this.compose(Ax,e,Px)}lookAt(e,t,n){const i=this.elements;return An.subVectors(e,t),An.lengthSq()===0&&(An.z=1),An.normalize(),ji.crossVectors(n,An),ji.lengthSq()===0&&(Math.abs(n.z)===1?An.x+=1e-4:An.z+=1e-4,An.normalize(),ji.crossVectors(n,An)),ji.normalize(),mo.crossVectors(An,ji),i[0]=ji.x,i[4]=mo.x,i[8]=An.x,i[1]=ji.y,i[5]=mo.y,i[9]=An.y,i[2]=ji.z,i[6]=mo.z,i[10]=An.z,this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,r=this.elements,a=n[0],o=n[4],l=n[8],c=n[12],h=n[1],u=n[5],p=n[9],d=n[13],m=n[2],f=n[6],x=n[10],g=n[14],y=n[3],v=n[7],b=n[11],_=n[15],M=i[0],T=i[4],R=i[8],S=i[12],E=i[1],L=i[5],A=i[9],I=i[13],w=i[2],z=i[6],G=i[10],j=i[14],Y=i[3],q=i[7],ie=i[11],W=i[15];return r[0]=a*M+o*E+l*w+c*Y,r[4]=a*T+o*L+l*z+c*q,r[8]=a*R+o*A+l*G+c*ie,r[12]=a*S+o*I+l*j+c*W,r[1]=h*M+u*E+p*w+d*Y,r[5]=h*T+u*L+p*z+d*q,r[9]=h*R+u*A+p*G+d*ie,r[13]=h*S+u*I+p*j+d*W,r[2]=m*M+f*E+x*w+g*Y,r[6]=m*T+f*L+x*z+g*q,r[10]=m*R+f*A+x*G+g*ie,r[14]=m*S+f*I+x*j+g*W,r[3]=y*M+v*E+b*w+_*Y,r[7]=y*T+v*L+b*z+_*q,r[11]=y*R+v*A+b*G+_*ie,r[15]=y*S+v*I+b*j+_*W,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[4],i=e[8],r=e[12],a=e[1],o=e[5],l=e[9],c=e[13],h=e[2],u=e[6],p=e[10],d=e[14],m=e[3],f=e[7],x=e[11],g=e[15];return m*(+r*l*u-i*c*u-r*o*p+n*c*p+i*o*d-n*l*d)+f*(+t*l*d-t*c*p+r*a*p-i*a*d+i*c*h-r*l*h)+x*(+t*c*u-t*o*d-r*a*u+n*a*d+r*o*h-n*c*h)+g*(-i*o*h-t*l*u+t*o*p+i*a*u-n*a*p+n*l*h)}transpose(){const e=this.elements;let t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e,t,n){const i=this.elements;return e.isVector3?(i[12]=e.x,i[13]=e.y,i[14]=e.z):(i[12]=e,i[13]=t,i[14]=n),this}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],a=e[4],o=e[5],l=e[6],c=e[7],h=e[8],u=e[9],p=e[10],d=e[11],m=e[12],f=e[13],x=e[14],g=e[15],y=u*x*c-f*p*c+f*l*d-o*x*d-u*l*g+o*p*g,v=m*p*c-h*x*c-m*l*d+a*x*d+h*l*g-a*p*g,b=h*f*c-m*u*c+m*o*d-a*f*d-h*o*g+a*u*g,_=m*u*l-h*f*l-m*o*p+a*f*p+h*o*x-a*u*x,M=t*y+n*v+i*b+r*_;if(M===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const T=1/M;return e[0]=y*T,e[1]=(f*p*r-u*x*r-f*i*d+n*x*d+u*i*g-n*p*g)*T,e[2]=(o*x*r-f*l*r+f*i*c-n*x*c-o*i*g+n*l*g)*T,e[3]=(u*l*r-o*p*r-u*i*c+n*p*c+o*i*d-n*l*d)*T,e[4]=v*T,e[5]=(h*x*r-m*p*r+m*i*d-t*x*d-h*i*g+t*p*g)*T,e[6]=(m*l*r-a*x*r-m*i*c+t*x*c+a*i*g-t*l*g)*T,e[7]=(a*p*r-h*l*r+h*i*c-t*p*c-a*i*d+t*l*d)*T,e[8]=b*T,e[9]=(m*u*r-h*f*r-m*n*d+t*f*d+h*n*g-t*u*g)*T,e[10]=(a*f*r-m*o*r+m*n*c-t*f*c-a*n*g+t*o*g)*T,e[11]=(h*o*r-a*u*r-h*n*c+t*u*c+a*n*d-t*o*d)*T,e[12]=_*T,e[13]=(h*f*i-m*u*i+m*n*p-t*f*p-h*n*x+t*u*x)*T,e[14]=(m*o*i-a*f*i-m*n*l+t*f*l+a*n*x-t*o*x)*T,e[15]=(a*u*i-h*o*i+h*n*l-t*u*l-a*n*p+t*o*p)*T,this}scale(e){const t=this.elements,n=e.x,i=e.y,r=e.z;return t[0]*=n,t[4]*=i,t[8]*=r,t[1]*=n,t[5]*=i,t[9]*=r,t[2]*=n,t[6]*=i,t[10]*=r,t[3]*=n,t[7]*=i,t[11]*=r,this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],n=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],i=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,n,i))}makeTranslation(e,t,n){return e.isVector3?this.set(1,0,0,e.x,0,1,0,e.y,0,0,1,e.z,0,0,0,1):this.set(1,0,0,e,0,1,0,t,0,0,1,n,0,0,0,1),this}makeRotationX(e){const t=Math.cos(e),n=Math.sin(e);return this.set(1,0,0,0,0,t,-n,0,0,n,t,0,0,0,0,1),this}makeRotationY(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,0,n,0,0,1,0,0,-n,0,t,0,0,0,0,1),this}makeRotationZ(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,0,n,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,t){const n=Math.cos(t),i=Math.sin(t),r=1-n,a=e.x,o=e.y,l=e.z,c=r*a,h=r*o;return this.set(c*a+n,c*o-i*l,c*l+i*o,0,c*o+i*l,h*o+n,h*l-i*a,0,c*l-i*o,h*l+i*a,r*l*l+n,0,0,0,0,1),this}makeScale(e,t,n){return this.set(e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1),this}makeShear(e,t,n,i,r,a){return this.set(1,n,r,0,e,1,a,0,t,i,1,0,0,0,0,1),this}compose(e,t,n){const i=this.elements,r=t._x,a=t._y,o=t._z,l=t._w,c=r+r,h=a+a,u=o+o,p=r*c,d=r*h,m=r*u,f=a*h,x=a*u,g=o*u,y=l*c,v=l*h,b=l*u,_=n.x,M=n.y,T=n.z;return i[0]=(1-(f+g))*_,i[1]=(d+b)*_,i[2]=(m-v)*_,i[3]=0,i[4]=(d-b)*M,i[5]=(1-(p+g))*M,i[6]=(x+y)*M,i[7]=0,i[8]=(m+v)*T,i[9]=(x-y)*T,i[10]=(1-(p+f))*T,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this}decompose(e,t,n){const i=this.elements;let r=ar.set(i[0],i[1],i[2]).length();const a=ar.set(i[4],i[5],i[6]).length(),o=ar.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),e.x=i[12],e.y=i[13],e.z=i[14],Qn.copy(this);const c=1/r,h=1/a,u=1/o;return Qn.elements[0]*=c,Qn.elements[1]*=c,Qn.elements[2]*=c,Qn.elements[4]*=h,Qn.elements[5]*=h,Qn.elements[6]*=h,Qn.elements[8]*=u,Qn.elements[9]*=u,Qn.elements[10]*=u,t.setFromRotationMatrix(Qn),n.x=r,n.y=a,n.z=o,this}makePerspective(e,t,n,i,r,a,o=oi,l=!1){const c=this.elements,h=2*r/(t-e),u=2*r/(n-i),p=(t+e)/(t-e),d=(n+i)/(n-i);let m,f;if(l)m=r/(a-r),f=a*r/(a-r);else if(o===oi)m=-(a+r)/(a-r),f=-2*a*r/(a-r);else if(o===oo)m=-a/(a-r),f=-a*r/(a-r);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+o);return c[0]=h,c[4]=0,c[8]=p,c[12]=0,c[1]=0,c[5]=u,c[9]=d,c[13]=0,c[2]=0,c[6]=0,c[10]=m,c[14]=f,c[3]=0,c[7]=0,c[11]=-1,c[15]=0,this}makeOrthographic(e,t,n,i,r,a,o=oi,l=!1){const c=this.elements,h=2/(t-e),u=2/(n-i),p=-(t+e)/(t-e),d=-(n+i)/(n-i);let m,f;if(l)m=1/(a-r),f=a/(a-r);else if(o===oi)m=-2/(a-r),f=-(a+r)/(a-r);else if(o===oo)m=-1/(a-r),f=-r/(a-r);else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);return c[0]=h,c[4]=0,c[8]=0,c[12]=p,c[1]=0,c[5]=u,c[9]=0,c[13]=d,c[2]=0,c[6]=0,c[10]=m,c[14]=f,c[3]=0,c[7]=0,c[11]=0,c[15]=1,this}equals(e){const t=this.elements,n=e.elements;for(let i=0;i<16;i++)if(t[i]!==n[i])return!1;return!0}fromArray(e,t=0){for(let n=0;n<16;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e[t+9]=n[9],e[t+10]=n[10],e[t+11]=n[11],e[t+12]=n[12],e[t+13]=n[13],e[t+14]=n[14],e[t+15]=n[15],e}}const ar=new P,Qn=new De,Ax=new P(0,0,0),Px=new P(1,1,1),ji=new P,mo=new P,An=new P,sp=new De,rp=new zn;class Pn{constructor(e=0,t=0,n=0,i=Pn.DEFAULT_ORDER){this.isEuler=!0,this._x=e,this._y=t,this._z=n,this._order=i}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,t,n,i=this._order){return this._x=e,this._y=t,this._z=n,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,t=this._order,n=!0){const i=e.elements,r=i[0],a=i[4],o=i[8],l=i[1],c=i[5],h=i[9],u=i[2],p=i[6],d=i[10];switch(t){case"XYZ":this._y=Math.asin(qe(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-h,d),this._z=Math.atan2(-a,r)):(this._x=Math.atan2(p,c),this._z=0);break;case"YXZ":this._x=Math.asin(-qe(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(o,d),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-u,r),this._z=0);break;case"ZXY":this._x=Math.asin(qe(p,-1,1)),Math.abs(p)<.9999999?(this._y=Math.atan2(-u,d),this._z=Math.atan2(-a,c)):(this._y=0,this._z=Math.atan2(l,r));break;case"ZYX":this._y=Math.asin(-qe(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(p,d),this._z=Math.atan2(l,r)):(this._x=0,this._z=Math.atan2(-a,c));break;case"YZX":this._z=Math.asin(qe(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-h,c),this._y=Math.atan2(-u,r)):(this._x=0,this._y=Math.atan2(o,d));break;case"XZY":this._z=Math.asin(-qe(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(p,c),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-h,d),this._y=0);break;default:He("Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,n===!0&&this._onChangeCallback(),this}setFromQuaternion(e,t,n){return sp.makeRotationFromQuaternion(e),this.setFromRotationMatrix(sp,t,n)}setFromVector3(e,t=this._order){return this.set(e.x,e.y,e.z,t)}reorder(e){return rp.setFromEuler(this),this.setFromQuaternion(rp,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],e[3]!==void 0&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}Pn.DEFAULT_ORDER="XYZ";class hh{constructor(){this.mask=1}set(e){this.mask=(1<>>0}enable(e){this.mask|=1<1){for(let t=0;t1){for(let n=0;n0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type="BatchedMesh",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.geometryInfo=this._geometryInfo.map(o=>({...o,boundingBox:o.boundingBox?o.boundingBox.toJSON():void 0,boundingSphere:o.boundingSphere?o.boundingSphere.toJSON():void 0})),i.instanceInfo=this._instanceInfo.map(o=>({...o})),i.availableInstanceIds=this._availableInstanceIds.slice(),i.availableGeometryIds=this._availableGeometryIds.slice(),i.nextIndexStart=this._nextIndexStart,i.nextVertexStart=this._nextVertexStart,i.geometryCount=this._geometryCount,i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.matricesTexture=this._matricesTexture.toJSON(e),i.indirectTexture=this._indirectTexture.toJSON(e),this._colorsTexture!==null&&(i.colorsTexture=this._colorsTexture.toJSON(e)),this.boundingSphere!==null&&(i.boundingSphere=this.boundingSphere.toJSON()),this.boundingBox!==null&&(i.boundingBox=this.boundingBox.toJSON()));function r(o,l){return o[l.uuid]===void 0&&(o[l.uuid]=l.toJSON(e)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(i.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=r(e.geometries,this.geometry);const o=this.geometry.parameters;if(o!==void 0&&o.shapes!==void 0){const l=o.shapes;if(Array.isArray(l))for(let c=0,h=l.length;c0){i.children=[];for(let o=0;o0){i.animations=[];for(let o=0;o0&&(n.geometries=o),l.length>0&&(n.materials=l),c.length>0&&(n.textures=c),h.length>0&&(n.images=h),u.length>0&&(n.shapes=u),p.length>0&&(n.skeletons=p),d.length>0&&(n.animations=d),m.length>0&&(n.nodes=m)}return n.object=i,n;function a(o){const l=[];for(const c in o){const h=o[c];delete h.metadata,l.push(h)}return l}}clone(e){return new this.constructor().copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),t===!0)for(let n=0;n0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(e,t,n,i,r){ei.subVectors(i,t),wi.subVectors(n,t),dh.subVectors(e,t);const a=ei.dot(ei),o=ei.dot(wi),l=ei.dot(dh),c=wi.dot(wi),h=wi.dot(dh),u=a*c-o*o;if(u===0)return r.set(0,0,0),null;const p=1/u,d=(c*l-o*h)*p,m=(a*h-o*l)*p;return r.set(1-d-m,m,d)}static containsPoint(e,t,n,i){return this.getBarycoord(e,t,n,i,Si)===null?!1:Si.x>=0&&Si.y>=0&&Si.x+Si.y<=1}static getInterpolation(e,t,n,i,r,a,o,l){return this.getBarycoord(e,t,n,i,Si)===null?(l.x=0,l.y=0,"z"in l&&(l.z=0),"w"in l&&(l.w=0),null):(l.setScalar(0),l.addScaledVector(r,Si.x),l.addScaledVector(a,Si.y),l.addScaledVector(o,Si.z),l)}static getInterpolatedAttribute(e,t,n,i,r,a){return gh.setScalar(0),xh.setScalar(0),vh.setScalar(0),gh.fromBufferAttribute(e,t),xh.fromBufferAttribute(e,n),vh.fromBufferAttribute(e,i),a.setScalar(0),a.addScaledVector(gh,r.x),a.addScaledVector(xh,r.y),a.addScaledVector(vh,r.z),a}static isFrontFacing(e,t,n,i){return ei.subVectors(n,t),wi.subVectors(e,t),ei.cross(wi).dot(i)<0}set(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this}setFromPointsAndIndices(e,t,n,i){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[i]),this}setFromAttributeAndIndices(e,t,n,i){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,n),this.c.fromBufferAttribute(e,i),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return ei.subVectors(this.c,this.b),wi.subVectors(this.a,this.b),ei.cross(wi).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return vt.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,t){return vt.getBarycoord(e,this.a,this.b,this.c,t)}getInterpolation(e,t,n,i,r){return vt.getInterpolation(e,this.a,this.b,this.c,t,n,i,r)}containsPoint(e){return vt.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return vt.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){const n=this.a,i=this.b,r=this.c;let a,o;cr.subVectors(i,n),hr.subVectors(r,n),ph.subVectors(e,n);const l=cr.dot(ph),c=hr.dot(ph);if(l<=0&&c<=0)return t.copy(n);fh.subVectors(e,i);const h=cr.dot(fh),u=hr.dot(fh);if(h>=0&&u<=h)return t.copy(i);const p=l*u-h*c;if(p<=0&&l>=0&&h<=0)return a=l/(l-h),t.copy(n).addScaledVector(cr,a);mh.subVectors(e,r);const d=cr.dot(mh),m=hr.dot(mh);if(m>=0&&d<=m)return t.copy(r);const f=d*c-l*m;if(f<=0&&c>=0&&m<=0)return o=c/(c-m),t.copy(n).addScaledVector(hr,o);const x=h*m-d*u;if(x<=0&&u-h>=0&&d-m>=0)return up.subVectors(r,i),o=(u-h)/(u-h+(d-m)),t.copy(i).addScaledVector(up,o);const g=1/(x+f+p);return a=f*g,o=p*g,t.copy(n).addScaledVector(cr,a).addScaledVector(hr,o)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}const dp={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},qi={h:0,s:0,l:0},xo={h:0,s:0,l:0};function yh(s,e,t){return t<0&&(t+=1),t>1&&(t-=1),t<1/6?s+(e-s)*6*t:t<1/2?e:t<2/3?s+(e-s)*6*(2/3-t):s}class Fe{constructor(e,t,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,t,n)}set(e,t,n){if(t===void 0&&n===void 0){const i=e;i&&i.isColor?this.copy(i):typeof i=="number"?this.setHex(i):typeof i=="string"&&this.setStyle(i)}else this.setRGB(e,t,n);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,t=Rt){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,it.colorSpaceToWorking(this,t),this}setRGB(e,t,n,i=it.workingColorSpace){return this.r=e,this.g=t,this.b=n,it.colorSpaceToWorking(this,i),this}setHSL(e,t,n,i=it.workingColorSpace){if(e=Qc(e,1),t=qe(t,0,1),n=qe(n,0,1),t===0)this.r=this.g=this.b=n;else{const r=n<=.5?n*(1+t):n+t-n*t,a=2*n-r;this.r=yh(a,r,e+1/3),this.g=yh(a,r,e),this.b=yh(a,r,e-1/3)}return it.colorSpaceToWorking(this,i),this}setStyle(e,t=Rt){function n(r){r!==void 0&&parseFloat(r)<1&&He("Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^(\w+)\(([^\)]*)\)/.exec(e)){let r;const a=i[1],o=i[2];switch(a){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,t);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,t);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,t);break;default:He("Color: Unknown color model "+e)}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){const r=i[1],a=r.length;if(a===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,t);if(a===6)return this.setHex(parseInt(r,16),t);He("Color: Invalid hex color "+e)}else if(e&&e.length>0)return this.setColorName(e,t);return this}setColorName(e,t=Rt){const n=dp[e.toLowerCase()];return n!==void 0?this.setHex(n,t):He("Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=yi(e.r),this.g=yi(e.g),this.b=yi(e.b),this}copyLinearToSRGB(e){return this.r=tr(e.r),this.g=tr(e.g),this.b=tr(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=Rt){return it.workingToColorSpace(an.copy(this),e),Math.round(qe(an.r*255,0,255))*65536+Math.round(qe(an.g*255,0,255))*256+Math.round(qe(an.b*255,0,255))}getHexString(e=Rt){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,t=it.workingColorSpace){it.workingToColorSpace(an.copy(this),t);const n=an.r,i=an.g,r=an.b,a=Math.max(n,i,r),o=Math.min(n,i,r);let l,c;const h=(o+a)/2;if(o===a)l=0,c=0;else{const u=a-o;switch(c=h<=.5?u/(a+o):u/(2-a-o),a){case n:l=(i-r)/u+(i0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(const t in e){const n=e[t];if(n===void 0){He(`Material: parameter '${t}' has value of undefined.`);continue}const i=this[t];if(i===void 0){He(`Material: '${t}' is not a property of THREE.${this.type}.`);continue}i&&i.isColor?i.set(n):i&&i.isVector3&&n&&n.isVector3?i.copy(n):this[t]=n}}toJSON(e){const t=e===void 0||typeof e=="string";t&&(e={textures:{},images:{}});const n={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};n.uuid=this.uuid,n.type=this.type,this.name!==""&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(n.sheenColorMap=this.sheenColorMap.toJSON(e).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(n.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(e).uuid),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==Ys&&(n.blending=this.blending),this.side!==kn&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==sc&&(n.blendSrc=this.blendSrc),this.blendDst!==rc&&(n.blendDst=this.blendDst),this.blendEquation!==En&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==$s&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==Zd&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==Qs&&(n.stencilFail=this.stencilFail),this.stencilZFail!==Qs&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==Qs&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function i(r){const a=[];for(const o in r){const l=r[o];delete l.metadata,a.push(l)}return a}if(t){const r=i(e.textures),a=i(e.images);r.length>0&&(n.textures=r),a.length>0&&(n.images=a)}return n}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const t=e.clippingPlanes;let n=null;if(t!==null){const i=t.length;n=new Array(i);for(let r=0;r!==i;++r)n[r]=t[r].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){e===!0&&this.version++}}class Ht extends Rn{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Fe(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Pn,this.combine=pc,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}const Ei=Bx();function Bx(){const s=new ArrayBuffer(4),e=new Float32Array(s),t=new Uint32Array(s),n=new Uint32Array(512),i=new Uint32Array(512);for(let l=0;l<256;++l){const c=l-127;c<-27?(n[l]=0,n[l|256]=32768,i[l]=24,i[l|256]=24):c<-14?(n[l]=1024>>-c-14,n[l|256]=1024>>-c-14|32768,i[l]=-c-1,i[l|256]=-c-1):c<=15?(n[l]=c+15<<10,n[l|256]=c+15<<10|32768,i[l]=13,i[l|256]=13):c<128?(n[l]=31744,n[l|256]=64512,i[l]=24,i[l|256]=24):(n[l]=31744,n[l|256]=64512,i[l]=13,i[l|256]=13)}const r=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let l=1;l<1024;++l){let c=l<<13,h=0;for(;(c&8388608)===0;)c<<=1,h-=8388608;c&=-8388609,h+=947912704,r[l]=c|h}for(let l=1024;l<2048;++l)r[l]=939524096+(l-1024<<13);for(let l=1;l<31;++l)a[l]=l<<23;a[31]=1199570944,a[32]=2147483648;for(let l=33;l<63;++l)a[l]=2147483648+(l-32<<23);a[63]=3347054592;for(let l=1;l<64;++l)l!==32&&(o[l]=1024);return{floatView:e,uint32View:t,baseTable:n,shiftTable:i,mantissaTable:r,exponentTable:a,offsetTable:o}}function kx(s){Math.abs(s)>65504&&He("DataUtils.toHalfFloat(): Value out of range."),s=qe(s,-65504,65504),Ei.floatView[0]=s;const e=Ei.uint32View[0],t=e>>23&511;return Ei.baseTable[t]+((e&8388607)>>Ei.shiftTable[t])}function Ux(s){const e=s>>10;return Ei.uint32View[0]=Ei.mantissaTable[Ei.offsetTable[e]+(s&1023)]+Ei.exponentTable[e],Ei.floatView[0]}class vo{static toHalfFloat(e){return kx(e)}static fromHalfFloat(e){return Ux(e)}}const Vt=new P,yo=new he;let Ox=0;class yt{constructor(e,t,n=!1){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:Ox++}),this.name="",this.array=e,this.itemSize=t,this.count=e!==void 0?e.length/t:0,this.normalized=n,this.usage=Jc,this.updateRanges=[],this.gpuType=hn,this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,t,n){e*=this.itemSize,n*=t.itemSize;for(let i=0,r=this.itemSize;it.count&&He("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),t.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new gt);const e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.isGLBufferAttribute){Qe("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new P(-1/0,-1/0,-1/0),new P(1/0,1/0,1/0));return}if(e!==void 0){if(this.boundingBox.setFromBufferAttribute(e),t)for(let n=0,i=t.length;n0&&(e.userData=this.userData),this.parameters!==void 0){const l=this.parameters;for(const c in l)l[c]!==void 0&&(e[c]=l[c]);return e}e.data={attributes:{}};const t=this.index;t!==null&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});const n=this.attributes;for(const l in n){const c=n[l];e.data.attributes[l]=c.toJSON(e.data)}const i={};let r=!1;for(const l in this.morphAttributes){const c=this.morphAttributes[l],h=[];for(let u=0,p=c.length;u0&&(i[l]=h,r=!0)}r&&(e.data.morphAttributes=i,e.data.morphTargetsRelative=this.morphTargetsRelative);const a=this.groups;a.length>0&&(e.data.groups=JSON.parse(JSON.stringify(a)));const o=this.boundingSphere;return o!==null&&(e.data.boundingSphere=o.toJSON()),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const t={};this.name=e.name;const n=e.index;n!==null&&this.setIndex(n.clone());const i=e.attributes;for(const c in i){const h=i[c];this.setAttribute(c,h.clone(t))}const r=e.morphAttributes;for(const c in r){const h=[],u=r[c];for(let p=0,d=u.length;p0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=i.length;r(e.far-e.near)**2))&&(mp.copy(r).invert(),ys.copy(e.ray).applyMatrix4(mp),!(n.boundingBox!==null&&ys.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(e,t,ys)))}_computeIntersections(e,t,n){let i;const r=this.geometry,a=this.material,o=r.index,l=r.attributes.position,c=r.attributes.uv,h=r.attributes.uv1,u=r.attributes.normal,p=r.groups,d=r.drawRange;if(o!==null)if(Array.isArray(a))for(let m=0,f=p.length;mt.far?null:{distance:c,point:Eo.clone(),object:s}}function To(s,e,t,n,i,r,a,o,l,c){s.getVertexPosition(o,_o),s.getVertexPosition(l,Mo),s.getVertexPosition(c,wo);const h=Fx(s,e,t,n,_o,Mo,wo,xp);if(h){const u=new P;vt.getBarycoord(xp,_o,Mo,wo,u),i&&(h.uv=vt.getInterpolatedAttribute(i,o,l,c,u,new he)),r&&(h.uv1=vt.getInterpolatedAttribute(r,o,l,c,u,new he)),a&&(h.normal=vt.getInterpolatedAttribute(a,o,l,c,u,new P),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));const p={a:o,b:l,c,normal:new P,materialIndex:0};vt.getNormal(_o,Mo,wo,p.normal),h.face=p,h.barycoord=u}return h}class Zi extends dt{constructor(e=1,t=1,n=1,i=1,r=1,a=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:n,widthSegments:i,heightSegments:r,depthSegments:a};const o=this;i=Math.floor(i),r=Math.floor(r),a=Math.floor(a);const l=[],c=[],h=[],u=[];let p=0,d=0;m("z","y","x",-1,-1,n,t,e,a,r,0),m("z","y","x",1,-1,n,t,-e,a,r,1),m("x","z","y",1,1,e,n,t,i,a,2),m("x","z","y",1,-1,e,n,-t,i,a,3),m("x","y","z",1,-1,e,t,n,i,r,4),m("x","y","z",-1,-1,e,t,-n,i,r,5),this.setIndex(l),this.setAttribute("position",new jt(c,3)),this.setAttribute("normal",new jt(h,3)),this.setAttribute("uv",new jt(u,2));function m(f,x,g,y,v,b,_,M,T,R,S){const E=b/T,L=_/R,A=b/2,I=_/2,w=M/2,z=T+1,G=R+1;let j=0,Y=0;const q=new P;for(let ie=0;ie0?1:-1,h.push(q.x,q.y,q.z),u.push($/T),u.push(1-ie/R),j+=1}}for(let ie=0;ie这是一个 可拖拽可缩放 的弹窗。

你可以尝试拖动标题栏,或者拖动右下角改变大小。'},menu:{info:"信息",home:"首页",componentDetail:"构件详情",hideSelected:"隐藏选中构件",transparentSelected:"半透明选中构件",cancelTranslucent:"取消半透明",isolateSelected:"隔离选中构件",hideOthers:"其他构件隐藏",transparentOthers:"其他构件半透明",fitSectionBox:"剖切盒适应",showAll:"显示全部",quickSelect:"快速选择",selectSameType:"选择同类模型",selectSameLevel:"选择同层模型",selectSameLevelType:"选择同层同类模型"},tree:{searchPlaceholder:"请输入要搜索的内容"},constructTree:{title:"目录树"},tab:{component:"构件",system:"系统",space:"空间",type:"类型",major:"专业"},panel:{property:{title:"构件详情",base:"基本属性",material:"材质信息",advanced:"高级设置",tab:{props:"属性",material:"材质"}},componentDetail:{title:"构件详情",noSelection:"请先选中构件"}},measure:{btnName:"测量",dialogTitle:"测量",modes:{clearHeight:"净高",clearDistance:"净距",distance:"距离",elevation:"标高",point:"坐标",angle:"角度",area:"面积",slope:"坡度"},actions:{expand:"展开",collapse:"收起",clearAll:"删除全部",settings:"设置"},labels:{currentMode:"当前测量方式:",x:"X:",y:"Y:",z:"Z:",value:{clearHeight:"净高:",clearDistance:"净距:",distance:"距离:",elevation:"标高:",point:"坐标:",angle:"角度:",area:"面积:",slope:"坡度:"}},settings:{title:"设置",unit:"单位:",precision:"精度:",hint:"距离、净距、净高和标高默认使用该单位;角度和面积有各自默认单位。",save:"保存设置",cancel:"取消"},clearHeight:{direction:"朝向:",directionDown:"朝下",directionUp:"朝上",selectType:"选择对象:",selectPoint:"选择点",selectElement:"选择构件"}},sectionPlane:{dialogTitle:"拾取面剖切",actions:{hide:"隐藏",reverse:"反向",reset:"重置"}},sectionAxis:{dialogTitle:"轴向剖切",actions:{hide:"隐藏",reverse:"反向",axisX:"X",axisY:"Y",axisZ:"Z"}},sectionBox:{dialogTitle:"剖切盒",actions:{hide:"隐藏",reverse:"反向",fitToModel:"适应",reset:"重置"},axes:{x:"X",y:"Y",z:"Z"}},walkControl:{speed:"移动速度:",gravity:"重力",collision:"碰撞",characterModel:{label:"建筑工人",constructionWorker:"建筑工人",officeMale:"办公室男性"},walkMode:{label:"行走模式",walk:"行走模式",run:"奔跑模式"},exit:"退出",path:{dialogTitle:"路径漫游",duration:"漫游时间",durationUnit:"秒",loop:"循环播放",addPoint:"添加漫游点",deleteAll:"删除全部",point:"漫游点",play:"播放漫游",stop:"停止漫游",noPoints:"暂无漫游点,请添加"}},info:{dialogTitle:"基本信息",meshCount:"构件数量",totalTriangles:"三角面数量",totalVertices:"顶点数量"},aiChat:{title:"AI 助手",placeholder:"输入你的问题...",quickPrompt:{summarize:"总结这个模型",explain:"解释选中的构件",generate:"生成报告"},action:{new:"新建对话",history:"历史记录",settings:"设置",close:"关闭"},helper:{newline:"Shift + Enter 换行",send:"Enter 发送"},thinking:"正在思考...",other:"其他",otherPlaceholder:"请输入自定义答案",submit:"提交"},setting:{dialogTitle:"设置",renderMode:"渲染模式",modes:{simple:"性能模式",balance:"平衡模式",advanced:"效果模式"},edgeLine:"边线",contrast:"对比度",saturation:"饱和度",lightIntensity:"光照强度",environment:"环境背景",backgroundVisible:"显示背景",ground:"显示地面",groundElevation:"地面高度",groundElevationUnit:"m"}},xg={common:{title:"BimEngine",description:"This is a BIM-ENGINE demo.",openTestDialog:"Open Test Dialog",openInfoDialog:"Open Info Dialog (Wrapped)"},toolbar:{home:"Home",measure:"Measure",zoomBox:"Zoom Box",info:"Info",location:"Location",setting:"Settings",walk:"Walk",map:"Map",property:"Property",fullscreen:"Fullscreen",walkPerson:"Person",walkBird:"Bird Eye",walkMenu:"Menu",tree:"Tree",section:"Section",sectionPlane:"Plane Section",sectionAxis:"Axis Section",sectionBox:"Section Box"},dialog:{testTitle:"Test Dialog",testContent:'
This is a draggable and resizable dialog.

Try dragging the title bar or resizing from the bottom-right corner.
'},menu:{info:"Info",home:"Home",componentDetail:"Component Detail",hideSelected:"Hide Selected",transparentSelected:"Transparent Selected",cancelTranslucent:"Cancel Translucent",isolateSelected:"Isolate Selected",hideOthers:"Hide Others",transparentOthers:"Transparent Others",fitSectionBox:"Fit Section Box",showAll:"Show All",quickSelect:"Quick Select",selectSameType:"Select Same Type",selectSameLevel:"Select Same Level",selectSameLevelType:"Select Same Level & Type"},tree:{searchPlaceholder:"Please enter content to search"},constructTree:{title:"Construct Tree"},tab:{component:"Component",system:"System",space:"Space",type:"Type",major:"Major"},panel:{property:{title:"Component Details",base:"Basic Info",material:"Material",advanced:"Advanced",tab:{props:"Properties",material:"Material"}},componentDetail:{title:"Component Detail",noSelection:"Please select a component first"}},measure:{btnName:"Measure",dialogTitle:"Measure",modes:{clearHeight:"Clear Height",clearDistance:"Clear Distance",distance:"Distance",elevation:"Elevation",point:"Point",angle:"Angle",area:"Area",slope:"Slope"},actions:{expand:"Expand",collapse:"Collapse",clearAll:"Clear All",settings:"Settings"},labels:{currentMode:"Mode:",x:"X:",y:"Y:",z:"Z:",value:{clearHeight:"Clear Height:",clearDistance:"Clear Distance:",distance:"Distance:",elevation:"Elevation:",point:"Point:",angle:"Angle:",area:"Area:",slope:"Slope:"}},settings:{title:"Settings",unit:"Unit:",precision:"Precision:",hint:"Distance, clear distance, clear height and elevation use this unit by default; angle and area use their own units.",save:"Save",cancel:"Cancel"},clearHeight:{direction:"Direction:",directionDown:"Down",directionUp:"Up",selectType:"Select:",selectPoint:"Point",selectElement:"Element"}},sectionPlane:{dialogTitle:"Plane Section",actions:{hide:"Hide",reverse:"Reverse",reset:"Reset"}},sectionAxis:{dialogTitle:"Axis Section",actions:{hide:"Hide",reverse:"Reverse",axisX:"X",axisY:"Y",axisZ:"Z"}},sectionBox:{dialogTitle:"Section Box",actions:{hide:"Hide",reverse:"Reverse",fitToModel:"Fit",reset:"Reset"},axes:{x:"X",y:"Y",z:"Z"}},walkControl:{speed:"Speed:",gravity:"Gravity",collision:"Collision",characterModel:{label:"Construction Worker",constructionWorker:"Construction Worker",officeMale:"Office Male"},walkMode:{label:"Walk Mode",walk:"Walk",run:"Run"},exit:"Exit",path:{dialogTitle:"Path Roaming",duration:"Duration",durationUnit:"s",loop:"Loop",addPoint:"Add Point",deleteAll:"Delete All",point:"Point",play:"Play",stop:"Stop",noPoints:"No points yet"}},info:{dialogTitle:"Basic Info",meshCount:"Mesh Count",totalTriangles:"Total Triangles",totalVertices:"Total Vertices"},aiChat:{title:"AI Assistant",placeholder:"Ask a question...",quickPrompt:{summarize:"Summarize this model",explain:"Explain selected component",generate:"Generate report"},action:{new:"New Chat",history:"History",settings:"Settings",close:"Close"},helper:{newline:"Shift + Enter for new line",send:"Enter to send"},thinking:"Thinking...",other:"Other",otherPlaceholder:"Enter custom answer",submit:"Submit"},setting:{dialogTitle:"Settings",renderMode:"Render Mode",modes:{simple:"Performance",balance:"Balanced",advanced:"Quality"},edgeLine:"Edge Lines",contrast:"Contrast",saturation:"Saturation",lightIntensity:"Light Intensity",environment:"Environment",backgroundVisible:"Show Background",ground:"Ground",groundElevation:"Ground Elevation",groundElevationUnit:"m"}};class vg{currentLocale="zh-CN";messages={"zh-CN":Zr,"en-US":xg};listeners=[];constructor(){}getLocale(){return this.currentLocale}setLocale(e){this.currentLocale!==e&&(this.currentLocale=e,this.notifyListeners())}t(e){if(!e)return"";const t=e.split(".");let n=this.messages[this.currentLocale];for(const i of t)if(n&&typeof n=="object"&&i in n)n=n[i];else return e;return n}subscribe(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}notifyListeners(){this.listeners.forEach(e=>e(this.currentLocale))}}const Qt=new vg,xe=s=>Qt.t(s),Md={name:"light",primary:"#2563eb",primaryHover:"#1d4ed8",primaryActive:"#1e40af",primarySubtle:"rgba(37, 99, 235, 0.1)",success:"#16a34a",successHover:"#15803d",successSubtle:"rgba(22, 163, 74, 0.1)",warning:"#d97706",warningHover:"#b45309",warningSubtle:"rgba(217, 119, 6, 0.1)",danger:"#dc2626",dangerHover:"#b91c1c",dangerSubtle:"rgba(220, 38, 38, 0.1)",info:"#0891b2",infoHover:"#0e7490",infoSubtle:"rgba(8, 145, 178, 0.1)",bgBase:"#f8fafc",bgElevated:"#ffffff",bgOverlay:"rgba(255, 255, 255, 0.98)",bgInset:"#f1f5f9",bgGlass:"rgba(255, 255, 255, 0.8)",bgGlassBlur:"24px",textPrimary:"#0f172a",textSecondary:"#475569",textTertiary:"#94a3b8",textDisabled:"#cbd5e1",textInverse:"#ffffff",textLink:"#2563eb",textLinkHover:"#1d4ed8",iconDefault:"#64748b",iconHover:"#334155",iconActive:"#2563eb",iconDisabled:"#cbd5e1",iconInverse:"#ffffff",borderDefault:"#e2e8f0",borderSubtle:"#f1f5f9",borderStrong:"#cbd5e1",borderDisabled:"#f1f5f9",divider:"#e2e8f0",componentBg:"transparent",componentBgHover:"rgba(15, 23, 42, 0.04)",componentBgActive:"rgba(15, 23, 42, 0.08)",componentBgSelected:"rgba(37, 99, 235, 0.08)",componentBgDisabled:"#f8fafc",focusRing:"rgba(37, 99, 235, 0.5)",focusRingOffset:"#ffffff",selectionBg:"rgba(37, 99, 235, 0.15)",selectionText:"#0f172a",shadowSm:"0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)",shadowMd:"0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)",shadowLg:"0 10px 25px rgba(0, 0, 0, 0.15), 0 6px 10px rgba(0, 0, 0, 0.1)",shadowXl:"0 20px 40px rgba(0, 0, 0, 0.2), 0 10px 15px rgba(0, 0, 0, 0.1)",shadowGlow:"0 2px 8px rgba(59, 130, 246, 0.3), 0 4px 16px rgba(59, 130, 246, 0.2)",scrollbarTrack:"#f1f5f9",scrollbarThumb:"#cbd5e1",scrollbarThumbHover:"#94a3b8",floatingBg:"rgba(255, 255, 255, 0.8)",floatingBorder:"rgba(226, 232, 240, 0.5)",floatingShadow:"0 4px 24px rgba(0, 0, 0, 0.06)",floatingBtnBg:"rgba(255, 255, 255, 0.9)",floatingBtnBorder:"rgba(203, 213, 225, 0.6)",floatingBtnShadow:"0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)",floatingBtnBgHover:"#ffffff",floatingBtnShadowHover:"0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)",floatingIconColor:"#334155",floatingIconColorHover:"#1e293b",panelBg:"rgba(255, 255, 255, 0.95)",panelBorder:"rgba(226, 232, 240, 0.6)",panelHeaderBg:"rgba(248, 250, 252, 0.9)",panelRadius:"12px",tabBg:"#f1f5f9",tabItemBg:"transparent",tabItemBgHover:"rgba(255, 255, 255, 0.6)",tabItemBgActive:"#ffffff",tabItemTextActive:"#2563eb",overrides:{dialog:{headerBg:"#f8fafc"},toolbar:{bg:"rgba(255, 255, 255, 0.9)",buttonBg:"rgba(255, 255, 255, 0.95)",buttonBgHover:"#ffffff",buttonBgActive:"#2563eb"},input:{bg:"#ffffff",bgFocus:"#ffffff",placeholder:"#94a3b8"}}},bg={name:"dark",primary:"#3b82f6",primaryHover:"#60a5fa",primaryActive:"#2563eb",primarySubtle:"rgba(59, 130, 246, 0.15)",success:"#22c55e",successHover:"#4ade80",successSubtle:"rgba(34, 197, 94, 0.15)",warning:"#f59e0b",warningHover:"#fbbf24",warningSubtle:"rgba(245, 158, 11, 0.15)",danger:"#ef4444",dangerHover:"#f87171",dangerSubtle:"rgba(239, 68, 68, 0.15)",info:"#06b6d4",infoHover:"#22d3ee",infoSubtle:"rgba(6, 182, 212, 0.15)",bgBase:"#152232",bgElevated:"#1f2d3e",bgOverlay:"rgba(21, 34, 50, 0.98)",bgInset:"#152232",bgGlass:"rgba(21, 34, 50, 0.85)",bgGlassBlur:"24px",textPrimary:"#ffffff",textSecondary:"#94a3b8",textTertiary:"#64748b",textDisabled:"#475569",textInverse:"#152232",textLink:"#60a5fa",textLinkHover:"#93c5fd",iconDefault:"#ffffff",iconHover:"#ffffff",iconActive:"#3b82f6",iconDisabled:"#475569",iconInverse:"#152232",borderDefault:"rgba(51, 65, 85, 0.5)",borderSubtle:"rgba(51, 65, 85, 0.5)",borderStrong:"#475569",borderDisabled:"#1e293b",divider:"#334155",componentBg:"transparent",componentBgHover:"rgba(248, 250, 252, 0.06)",componentBgActive:"rgba(248, 250, 252, 0.1)",componentBgSelected:"rgba(59, 130, 246, 0.2)",componentBgDisabled:"#1e293b",focusRing:"rgba(59, 130, 246, 0.5)",focusRingOffset:"#1e293b",selectionBg:"rgba(59, 130, 246, 0.3)",selectionText:"#f8fafc",shadowSm:"0 2px 8px rgba(0, 0, 0, 0.4), 0 4px 12px rgba(0, 0, 0, 0.3)",shadowMd:"0 4px 12px rgba(0, 0, 0, 0.5), 0 6px 20px rgba(0, 0, 0, 0.4)",shadowLg:"0 10px 25px rgba(0, 0, 0, 0.6), 0 6px 10px rgba(0, 0, 0, 0.4)",shadowXl:"0 20px 40px rgba(0, 0, 0, 0.7), 0 10px 15px rgba(0, 0, 0, 0.5)",shadowGlow:"0 2px 8px rgba(59, 130, 246, 0.4), 0 4px 16px rgba(59, 130, 246, 0.25)",scrollbarTrack:"#1e293b",scrollbarThumb:"#475569",scrollbarThumbHover:"#64748b",floatingBg:"rgba(15, 23, 42, 0.85)",floatingBorder:"rgba(51, 65, 85, 0.4)",floatingShadow:"0 4px 24px rgba(0, 0, 0, 0.25)",floatingBtnBg:"rgba(51, 65, 85, 0.6)",floatingBtnBorder:"rgba(100, 116, 139, 0.5)",floatingBtnShadow:"0 2px 8px rgba(0, 0, 0, 0.3), 0 4px 12px rgba(0, 0, 0, 0.25)",floatingBtnBgHover:"rgba(71, 85, 105, 0.7)",floatingBtnShadowHover:"0 4px 12px rgba(0, 0, 0, 0.35), 0 6px 20px rgba(0, 0, 0, 0.3)",floatingIconColor:"#e2e8f0",floatingIconColorHover:"#f8fafc",panelBg:"rgba(15, 23, 42, 0.95)",panelBorder:"rgba(51, 65, 85, 0.5)",panelHeaderBg:"rgba(15, 23, 42, 0.9)",panelRadius:"12px",tabBg:"rgba(30, 41, 59, 0.6)",tabItemBg:"transparent",tabItemBgHover:"rgba(51, 65, 85, 0.5)",tabItemBgActive:"rgba(51, 65, 85, 0.8)",tabItemTextActive:"#60a5fa",overrides:{dialog:{headerBg:"#0f172a"},toolbar:{bg:"rgba(30, 41, 59, 0.9)",buttonBg:"rgba(51, 65, 85, 0.6)",buttonBgHover:"rgba(71, 85, 105, 0.7)",buttonBgActive:"#3b82f6"},input:{bg:"#0f172a",bgFocus:"#1e293b",placeholder:"#64748b"}}};class yg{currentTheme=Md;listeners=[];constructor(){}getTheme(){return this.currentTheme}setTheme(e){e==="light"?this.applyTheme(Md):this.applyTheme(bg)}setCustomTheme(e){this.applyTheme(e)}applyTheme(e){this.currentTheme=e,this.notifyListeners()}subscribe(e){return this.listeners.push(e),e(this.currentTheme),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}notifyListeners(){this.listeners.forEach(e=>e(this.currentTheme))}}const ot=new yg;class tc{container;options;groups=[];activeBtnIds=new Set;btnRefs=new Map;dropdownElement=null;hoverTimeout=null;customColors=new Set;unsubscribeLocale=null;unsubscribeTheme=null;DEFAULT_ICON='';constructor(e){const t=typeof e.container=="string"?document.getElementById(e.container):e.container;if(!t)throw new Error("Container not found");this.container=t,this.options={showLabel:!0,visibility:{},direction:"row",position:"static",align:"vertical",expand:"down",...e},["backgroundColor","btnBackgroundColor","btnHoverColor","btnActiveColor","iconColor","iconActiveColor","textColor","textActiveColor"].forEach(i=>{e[i]&&this.customColors.add(i)}),this.initContainer(),this.applyStyles()}emit(e,t){this.options.registry?.emit(e,t)}initContainer(){this.container.innerHTML="",this.container.classList.add("bim-btn-group-root"),this.options.direction==="column"?this.container.classList.add("dir-column"):this.container.classList.add("dir-row"),this.options.className&&this.container.classList.add(this.options.className),this.options.type&&this.options.type!=="default"&&this.container.classList.add(`type-${this.options.type}`),this.updatePosition(),this.setupEventInterception(this.container)}setupEventInterception(e){const t=i=>{i.stopPropagation()};["click","dblclick","contextmenu","wheel","mousedown","mouseup","mousemove","touchstart","touchend","touchmove","pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointerover","pointerout"].forEach(i=>{e.addEventListener(i,t,{passive:!1})})}updatePosition(){const e=this.options.position,t=this.container.style;if(t.top="",t.bottom="",t.left="",t.right="",t.transform="",e==="static"){this.container.classList.add("static");return}if(this.container.classList.remove("static"),this.container.style.position="absolute",typeof e=="object"&&"x"in e)t.left=`${e.x}px`,t.top=`${e.y}px`;else{const n="20px";switch(e){case"top-left":t.top=n,t.left=n;break;case"top-center":t.top=n,t.left="50%",t.transform="translateX(-50%)";break;case"top-right":t.top=n,t.right=n;break;case"bottom-left":t.bottom=n,t.left=n;break;case"bottom-center":t.bottom=n,t.left="50%",t.transform="translateX(-50%)";break;case"bottom-right":t.bottom=n,t.right=n;break;case"left-center":t.left=n,t.top="50%",t.transform="translateY(-50%)";break;case"right-center":t.right=n,t.top="50%",t.transform="translateY(-50%)";break;case"center":t.top="50%",t.left="50%",t.transform="translate(-50%, -50%)";break}}}applyStyles(){const e=this.container.style;this.options.backgroundColor&&e.setProperty("--bim-btn-group-section-bg",this.options.backgroundColor),this.options.btnBackgroundColor&&e.setProperty("--bim-btn-bg",this.options.btnBackgroundColor),this.options.btnHoverColor&&e.setProperty("--bim-btn-hover-bg",this.options.btnHoverColor),this.options.btnActiveColor&&e.setProperty("--bim-btn-active-bg",this.options.btnActiveColor),this.options.iconColor&&e.setProperty("--bim-icon-color",this.options.iconColor),this.options.iconActiveColor&&e.setProperty("--bim-icon-active-color",this.options.iconActiveColor),this.options.textColor&&e.setProperty("--bim-btn-text-color",this.options.textColor),this.options.textActiveColor&&e.setProperty("--bim-btn-text-active-color",this.options.textActiveColor),document.querySelectorAll(".opt-btn-dropdown").forEach(n=>{const i=n.style;this.options.iconColor&&i.setProperty("--bim-icon-color",this.options.iconColor),this.options.iconActiveColor&&i.setProperty("--bim-icon-active-color",this.options.iconActiveColor),this.options.textColor&&i.setProperty("--bim-btn-text-color",this.options.textColor),this.options.textActiveColor&&i.setProperty("--bim-btn-text-active-color",this.options.textActiveColor),this.options.btnBackgroundColor&&i.setProperty("--bim-btn-bg",this.options.btnBackgroundColor),this.options.btnHoverColor&&i.setProperty("--bim-btn-hover-bg",this.options.btnHoverColor),this.options.btnActiveColor&&i.setProperty("--bim-btn-active-bg",this.options.btnActiveColor)})}setPrimaryColor(e){this.container.style.setProperty("--bim-primary-color",e),document.querySelectorAll(".opt-btn-dropdown").forEach(n=>{n.style.setProperty("--bim-primary-color",e)})}setTheme(e){const t={backgroundColor:e.bgElevated,btnBackgroundColor:e.componentBg,btnHoverColor:e.componentBgHover,btnActiveColor:e.componentBgActive,iconColor:e.iconDefault,iconActiveColor:e.iconActive,textColor:e.textSecondary,textActiveColor:e.textPrimary};Object.entries(t).forEach(([n,i])=>{const r=n;this.customColors.has(r)||(this.options[r]=i)}),this.container.classList.remove("theme-dark","theme-light"),this.container.classList.add(`theme-${e.name}`),this.applyStyles(),this.setPrimaryColor(e.primary),this.applyThemeCssVars(e)}applyThemeCssVars(e){const t=this.container.style;t.setProperty("--bim-primary",e.primary),t.setProperty("--bim-primary-hover",e.primaryHover),t.setProperty("--bim-primary-active",e.primaryActive),t.setProperty("--bim-bg-glass",e.bgGlass),t.setProperty("--bim-bg-glass-blur",e.bgGlassBlur),t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-bg-overlay",e.bgOverlay),t.setProperty("--bim-bg-inset",e.bgInset),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-secondary",e.textSecondary),t.setProperty("--bim-text-tertiary",e.textTertiary),t.setProperty("--bim-text-inverse",e.textInverse),t.setProperty("--bim-icon-default",e.iconDefault),t.setProperty("--bim-icon-hover",e.iconHover),t.setProperty("--bim-icon-active",e.iconActive),t.setProperty("--bim-icon-inverse",e.iconInverse),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-border-subtle",e.borderSubtle),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-component-bg-active",e.componentBgActive),t.setProperty("--bim-shadow-sm",e.shadowSm),t.setProperty("--bim-shadow-md",e.shadowMd),t.setProperty("--bim-shadow-lg",e.shadowLg),t.setProperty("--bim-shadow-glow",e.shadowGlow),t.setProperty("--bim-floating-bg",e.floatingBg),t.setProperty("--bim-floating-border",e.floatingBorder),t.setProperty("--bim-floating-shadow",e.floatingShadow),t.setProperty("--bim-floating-btn-bg",e.floatingBtnBg),t.setProperty("--bim-floating-btn-border",e.floatingBtnBorder),t.setProperty("--bim-floating-btn-shadow",e.floatingBtnShadow),t.setProperty("--bim-floating-btn-bg-hover",e.floatingBtnBgHover),t.setProperty("--bim-floating-btn-shadow-hover",e.floatingBtnShadowHover),t.setProperty("--bim-floating-icon-color",e.floatingIconColor),t.setProperty("--bim-floating-icon-color-hover",e.floatingIconColorHover),this.syncDropdownCssVars(e)}syncDropdownCssVars(e){document.querySelectorAll(".opt-btn-dropdown").forEach(n=>{const i=n.style;i.setProperty("--bim-primary",e.primary),i.setProperty("--bim-bg-overlay",e.bgOverlay),i.setProperty("--bim-border-default",e.borderDefault),i.setProperty("--bim-text-primary",e.textPrimary),i.setProperty("--bim-text-inverse",e.textInverse),i.setProperty("--bim-shadow-lg",e.shadowLg),i.setProperty("--bim-floating-btn-bg",e.floatingBtnBg),i.setProperty("--bim-floating-btn-bg-hover",e.floatingBtnBgHover),i.setProperty("--bim-floating-icon-color",e.floatingIconColor)})}setColors(e){this.options={...this.options,...e},Object.keys(e).forEach(t=>{this.customColors.add(t)}),this.applyStyles()}async init(){this.render(),this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)})}setLocales(){this.render()}addGroup(e,t){if(this.groups.some(i=>i.id===e))return;const n={id:e,buttons:[]};if(t){const i=this.groups.findIndex(r=>r.id===t);i!==-1?this.groups.splice(i,0,n):this.groups.push(n)}else this.groups.push(n)}addButton(e){const{groupId:t,parentId:n}=e,i=this.groups.find(a=>a.id===t);if(!i)return;const r={...e,children:e.children||[]};if(n){const a=this.findButton(i.buttons,n);a&&(a.children||(a.children=[]),a.children.push(r))}else i.buttons.push(r)}findButton(e,t){for(const n of e){if(n.id===t)return n;if(n.children){const i=this.findButton(n.children,t);if(i)return i}}}render(){this.container.innerHTML="",this.btnRefs.clear(),this.groups.forEach((e,t)=>{const n=this.renderGroup(e,t,this.groups.length);this.container.appendChild(n)})}renderGroup(e,t,n){const i=document.createElement("div");return i.className="bim-btn-group-section",t{if(this.isVisible(r.id)){const a=this.renderButton(r);i.appendChild(a)}}),i}renderButton(e){const t=document.createElement("div");t.className="opt-btn-wrapper";const n=document.createElement("div");n.className="opt-btn",e.isActive&&this.activeBtnIds.add(e.id),(e.align||this.options.align||"vertical")==="horizontal"?n.classList.add("align-horizontal"):n.classList.add("align-vertical"),this.activeBtnIds.has(e.id)&&n.classList.add("active"),e.disabled&&n.classList.add("disabled"),this.options.showLabel&&e.label||(n.classList.add("no-label"),e.label&&(n.title=xe(e.label)));const a=e.iconSize||32,o=e.minWidth||50;n.style.minWidth=`${o}px`;const l=document.createElement("div");l.className="opt-btn-icon",l.style.width=`${a}px`,l.style.height=`${a}px`,l.innerHTML=this.getIcon(e.icon),n.appendChild(l);const c=document.createElement("div");if(c.className="opt-btn-text-wrapper",this.options.showLabel&&e.label){const h=document.createElement("span");h.className="opt-btn-label",h.textContent=xe(e.label),c.appendChild(h)}return c.hasChildNodes()&&n.appendChild(c),n.addEventListener("click",()=>this.handleClick(e)),n.addEventListener("mouseenter",()=>this.handleMouseEnter(e,n)),n.addEventListener("mouseleave",()=>this.handleMouseLeave()),this.btnRefs.set(e.id,n),t.appendChild(n),t}setBtnActive(e,t){const n=this.findButtonById(e);if(!n)return;const i=t!==void 0?t:!this.activeBtnIds.has(e);i?this.activeBtnIds.add(e):this.activeBtnIds.delete(e),n.isActive=i,this.updateButtonState(e)}handleClick(e){if(!e.disabled&&(!e.children||e.children.length===0)){if(e.keepActive){const n=!this.activeBtnIds.has(e.id);this.setBtnActive(e.id,n),n&&e.exclusive&&e.groupId&&this.deactivateExclusiveSiblings(e)}this.closeDropdown(),e.onClick&&e.onClick(e)}}deactivateExclusiveSiblings(e){const t=this.groups.find(n=>n.id===e.groupId);if(t){if(e.parentId){const i=this.findButton(t.buttons,e.parentId)?.children||[];for(const r of i)r&&r.id!==e.id&&r.parentId===e.parentId&&r.groupId===e.groupId&&this.activeBtnIds.has(r.id)&&(this.setBtnActive(r.id,!1),r.onClick&&r.onClick(r));return}for(const n of t.buttons)n.id!==e.id&&n.groupId===e.groupId&&(n.parentId||this.activeBtnIds.has(n.id)&&(this.setBtnActive(n.id,!1),n.onClick&&n.onClick(n)))}}handleMouseEnter(e,t){this.hoverTimeout&&clearTimeout(this.hoverTimeout),e.children&&e.children.length>0?this.showDropdown(e,t):this.closeDropdown()}handleMouseLeave(){this.hoverTimeout=window.setTimeout(()=>this.closeDropdown(),200)}showDropdown(e,t){if(this.closeDropdown(),!e.children)return;const n=document.createElement("div");n.className="opt-btn-dropdown",this.options.backgroundColor&&n.style.setProperty("--bim-toolbar-bg",this.options.backgroundColor);const i=n.style;this.options.iconColor&&i.setProperty("--bim-icon-color",this.options.iconColor),this.options.iconActiveColor&&i.setProperty("--bim-icon-active-color",this.options.iconActiveColor),this.options.textColor&&i.setProperty("--bim-btn-text-color",this.options.textColor),this.options.textActiveColor&&i.setProperty("--bim-btn-text-active-color",this.options.textActiveColor),this.options.btnBackgroundColor&&i.setProperty("--bim-btn-bg",this.options.btnBackgroundColor),this.options.btnHoverColor&&i.setProperty("--bim-btn-hover-bg",this.options.btnHoverColor),this.options.btnActiveColor&&i.setProperty("--bim-btn-active-bg",this.options.btnActiveColor);const r=t.getBoundingClientRect(),a=this.options.expand||"down";this.options.direction==="row"?n.style.flexDirection="column":n.style.flexDirection="row",this.options.type&&this.options.type!=="default"&&n.classList.add(`type-${this.options.type}`);const o=ot.getTheme();n.classList.add(`theme-${o.name}`),i.setProperty("--bim-primary",o.primary),i.setProperty("--bim-bg-overlay",o.bgOverlay),i.setProperty("--bim-border-default",o.borderDefault),i.setProperty("--bim-text-primary",o.textPrimary),i.setProperty("--bim-text-inverse",o.textInverse),i.setProperty("--bim-shadow-lg",o.shadowLg),i.setProperty("--bim-floating-btn-bg",o.floatingBtnBg),i.setProperty("--bim-floating-btn-bg-hover",o.floatingBtnBgHover),i.setProperty("--bim-floating-icon-color",o.floatingIconColor),document.body.appendChild(n),this.setupEventInterception(n),e.children.forEach(c=>{if(this.isVisible(c.id)){const h=this.renderDropdownItem(c);n.appendChild(h)}});const l=n.getBoundingClientRect();a==="up"?(n.style.bottom=window.innerHeight-r.top+8+"px",n.style.left=r.left+(r.width-l.width)/2+"px"):a==="down"?(n.style.top=r.bottom+8+"px",n.style.left=r.left+(r.width-l.width)/2+"px"):a==="right"?(n.style.top=r.top+(r.height-l.height)/2+"px",n.style.left=r.right+8+"px"):a==="left"&&(n.style.top=r.top+(r.height-l.height)/2+"px",n.style.right=window.innerWidth-r.left+8+"px"),n.addEventListener("mouseenter",()=>{this.hoverTimeout&&clearTimeout(this.hoverTimeout)}),n.addEventListener("mouseleave",()=>this.handleMouseLeave()),this.dropdownElement=n}renderDropdownItem(e){const t=document.createElement("div");t.className="opt-btn-dropdown-item",(e.align||"horizontal")==="horizontal"?t.classList.add("align-horizontal"):t.classList.add("align-vertical"),(this.activeBtnIds.has(e.id)||e.isActive)&&t.classList.add("active");const i=e.iconSize||32,r=e.minWidth;r&&(t.style.minWidth=`${r}px`);const a=document.createElement("div");if(a.className="opt-btn-icon",a.style.width=`${i}px`,a.style.height=`${i}px`,a.innerHTML=this.getIcon(e.icon),t.appendChild(a),this.options.showLabel&&e.label){const o=document.createElement("span");o.className="opt-btn-dropdown-label",o.textContent=xe(e.label),t.appendChild(o)}else e.label&&(t.title=xe(e.label));return t.addEventListener("click",o=>{o.stopPropagation(),this.handleClick(e)}),t}closeDropdown(){this.dropdownElement&&(this.dropdownElement.remove(),this.dropdownElement=null),this.btnRefs.forEach(e=>{const t=e.querySelector(".opt-btn-arrow");t&&t.classList.remove("rotated")})}updateButtonState(e){const t=this.btnRefs.get(e);t&&(this.activeBtnIds.has(e)?t.classList.add("active"):t.classList.remove("active"))}getIcon(e){return e||this.DEFAULT_ICON}updateButtonVisibility(e,t){this.options.visibility||(this.options.visibility={}),this.options.visibility[e]=t,this.render()}setShowLabel(e){this.options.showLabel=e,this.updateLabelsVisibility()}updateLabelsVisibility(){this.btnRefs.forEach((e,t)=>{const n=this.findButtonById(t);if(!n)return;this.options.showLabel&&n.label?(e.classList.remove("no-label"),e.removeAttribute("title")):(e.classList.add("no-label"),n.label&&(e.title=xe(n.label)))})}findButtonById(e){for(const t of this.groups){const n=this.findButton(t.buttons,e);if(n)return n}}setBackgroundColor(e){this.setColors({backgroundColor:e})}isVisible(e){return this.options.visibility?.[e]!==!1}setType(e){this.container.classList.remove("type-default","type-glass-pill"),this.options.type=e,e&&e!=="default"&&this.container.classList.add(`type-${e}`),this.render()}getType(){return this.options.type||"default"}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.closeDropdown(),this.container.innerHTML="",this.btnRefs.clear()}}class _g extends tc{async init(){await super.init();const e=this.options.registry,{createHomeButton:t}=await Promise.resolve().then(()=>$C),{createZoomBoxButton:n}=await Promise.resolve().then(()=>KC),{createWalkMenuButton:i}=await Promise.resolve().then(()=>JC),{createMapButton:r}=await Promise.resolve().then(()=>QC),{createPropertyButton:a}=await Promise.resolve().then(()=>eT),{createSettingButton:o}=await Promise.resolve().then(()=>tT),{createInfoButton:l}=await Promise.resolve().then(()=>nT),{createFullscreenButton:c}=await Promise.resolve().then(()=>iT),{createMeasureButton:h}=await Promise.resolve().then(()=>sT),{createSectionMenuButton:u}=await Promise.resolve().then(()=>rT),{createSectionPlaneButton:p}=await Promise.resolve().then(()=>aT),{createSectionAxisButton:d}=await Promise.resolve().then(()=>oT),{createSectionBoxButton:m}=await Promise.resolve().then(()=>lT),{createAiChatButton:f}=await Promise.resolve().then(()=>cT);this.addGroup("group-1"),this.addButton(t(e)),this.addButton(n(e)),this.addButton(h(e)),this.addButton(u(e)),this.addButton(p(e)),this.addButton(d(e)),this.addButton(m(e)),this.addButton(i(e)),this.addButton(r(e)),this.addButton(a(e)),this.addGroup("group-2"),this.addButton(f(e)),this.addButton(o(e)),this.addButton(l(e)),this.addButton(c(e)),this.render()}}class xi{registry;subscriptions=[];constructor(e){this.registry=e}get engineComponent(){return this.registry.engine3d?.getEngineComponent?.()??null}subscribe(e,t){const n=this.registry.on(e,t);this.subscriptions.push(n)}emit(e,t){this.registry.emit(e,t)}destroy(){this.subscriptions.forEach(e=>e()),this.subscriptions=[]}}class Mg extends xi{toolbar=null;toolbarContainer=null;container;constructor(e,t){super(t),this.container=e,this.init()}init(){this.toolbarContainer=document.createElement("div"),this.toolbarContainer.id="opt-btn-groups",this.toolbarContainer.className="bim-engine-opt-btn-container is-bottom-toolbar",this.container.appendChild(this.toolbarContainer),this.toolbar=new _g({container:this.toolbarContainer,type:"glass-pill",showLabel:!0,direction:"row",position:"bottom-right",align:"vertical",expand:"up",registry:this.registry}),this.toolbar.init()}updateTheme(e){this.toolbar?.setTheme(e)}refresh(){this.toolbar?.render()}destroy(){this.toolbar?.destroy(),this.toolbar=null,super.destroy()}addGroup(e,t){this.toolbar?.addGroup(e,t),this.toolbar?.render()}addButton(e){this.toolbar?.addButton(e),this.toolbar?.render()}setButtonVisibility(e,t){this.toolbar?.updateButtonVisibility(e,t)}setShowLabel(e){this.toolbar?.setShowLabel(e)}setBtnActive(e,t){this.toolbar?.setBtnActive(e,t)}setVisible(e){this.toolbarContainer&&(this.toolbarContainer.style.visibility=e?"visible":"hidden")}setBackgroundColor(e){this.toolbar?.setBackgroundColor(e)}setColors(e){this.toolbar?.setColors(e)}hide(){this.toolbarContainer&&(this.toolbarContainer.style.display="none")}show(){this.toolbarContainer&&(this.toolbarContainer.style.display="")}getContainer(){return this.toolbarContainer}setType(e){this.toolbar?.setType(e)}getType(){return this.toolbar?.getType()||"default"}}class wg extends xi{groups=new Map;container;constructor(e,t){super(t),this.container=e}create(e,t){const n=new tc({container:this.container,registry:this.registry,...t});return n.init(),this.groups.set(e,n),n}get(e){return this.groups.get(e)}updateTheme(e){this.groups.forEach(t=>t.setTheme(e))}destroy(){this.groups.forEach(e=>e.destroy()),this.groups.clear(),super.destroy()}}class Sg{element;options;container;header;contentArea;_isDestroyed=!1;_isInitialized=!1;unsubscribeTheme=null;unsubscribeLocale=null;rafId=null;constructor(e){this.options={title:"Dialog",width:300,height:"auto",position:"center",draggable:!0,resizable:!1,minWidth:200,minHeight:100,...e},this.container=e.container,this.element=this.createDom(),this.header=this.element.querySelector(".bim-dialog-header"),this.contentArea=this.element.querySelector(".bim-dialog-content"),this.init()}setTheme(e){const t=this.element.style;this.options.backgroundColor||t.setProperty("--bim-dialog-bg",e.bgElevated),this.options.headerBackgroundColor||t.setProperty("--bim-dialog-header-bg",e.bgInset),this.options.titleColor||t.setProperty("--bim-dialog-title-color",e.textPrimary),this.options.textColor||t.setProperty("--bim-dialog-text-color",e.textSecondary),this.options.borderColor||t.setProperty("--bim-dialog-border-color",e.borderDefault),t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-bg-inset",e.bgInset),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-secondary",e.textSecondary),t.setProperty("--bim-text-tertiary",e.textTertiary),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-shadow-lg",e.shadowLg)}init(){this._isInitialized||(this.container.appendChild(this.element),this.initPosition(),this.options.draggable&&this.initDrag(),this.options.resizable&&this.initResize(),this._isInitialized=!0,this.options.onOpen&&this.options.onOpen(),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)}),this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}))}setLocales(){if(this.options.title){const e=this.header.querySelector(".bim-dialog-title");e&&(e.textContent=xe(this.options.title))}}createDom(){const e=document.createElement("div");e.className="bim-dialog",this.options.id&&(e.id=this.options.id);const t=e.style;this.options.backgroundColor&&t.setProperty("--bim-dialog-bg",this.options.backgroundColor),this.options.headerBackgroundColor&&t.setProperty("--bim-dialog-header-bg",this.options.headerBackgroundColor),this.options.titleColor&&t.setProperty("--bim-dialog-title-color",this.options.titleColor),this.options.textColor&&t.setProperty("--bim-dialog-text-color",this.options.textColor),this.options.borderColor&&t.setProperty("--bim-dialog-border-color",this.options.borderColor),this.setSize(e,this.options.width,this.options.height),this.options.minWidth&&(e.style.minWidth=`${this.options.minWidth}px`);const n=document.createElement("div");n.className="bim-dialog-header",this.options.draggable&&n.classList.add("draggable");const i=document.createElement("span");i.className="bim-dialog-title",i.textContent=this.options.title?xe(this.options.title):"";const r=document.createElement("span");r.className="bim-dialog-close",r.innerHTML="×",r.onclick=()=>{this.close()},n.appendChild(i),n.appendChild(r);const a=document.createElement("div");if(a.className="bim-dialog-content",typeof this.options.content=="string"?a.innerHTML=this.options.content:this.options.content instanceof HTMLElement&&a.appendChild(this.options.content),e.appendChild(n),e.appendChild(a),this.options.resizable){const c=document.createElement("div");c.className="bim-dialog-resize-handle",e.appendChild(c)}const o=c=>{c.stopPropagation()};return["click","dblclick","contextmenu","wheel","mousedown","mouseup","mousemove","touchstart","touchend","touchmove","pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointerover","pointerout"].forEach(c=>{e.addEventListener(c,o,{passive:!1})}),e}setSize(e,t,n){t!==void 0&&(t==="auto"||t==="fit-content"?e.style.width=t:e.style.width=typeof t=="number"?`${t}px`:t),n!==void 0&&(n==="auto"||n==="fit-content"?e.style.height=n:e.style.height=typeof n=="number"?`${n}px`:n)}fitWidth(e=!1){this.element.style.width="fit-content",e&&this.initPosition()}fitHeight(e=!1){this.element.style.height="auto";const t=this.element.getBoundingClientRect().height,n=this.options.minHeight??100,i=this.container.clientHeight||0;let r=Math.max(n,t);i>0&&(r=Math.min(r,i)),this.element.style.height=`${r}px`,e?this.initPosition():this.clampToContainer()}clampToContainer(){const e=this.container.clientWidth,t=this.container.clientHeight,n=this.element.offsetWidth,i=this.element.offsetHeight,r=this.options.bottomOffset??70,a=this.element.offsetLeft,o=this.element.offsetTop,l=Math.max(0,e-n),c=Math.max(0,t-i-r),h=Math.max(0,Math.min(a,l)),u=Math.max(0,Math.min(o,c));this.element.style.left=`${h}px`,this.element.style.top=`${u}px`}initPosition(){const e=this.options.position,t=this.element.getBoundingClientRect(),n=this.options.bottomOffset??70;let i=0,r=0;const a=this.container.clientWidth,o=this.container.clientHeight,l=t.width,c=t.height;if(typeof e=="object"&&"x"in e)i=e.x,r=e.y;else switch(e){case"center":i=(a-l)/2,r=(o-c)/2;break;case"top-left":i=0,r=0;break;case"top-center":i=(a-l)/2,r=0;break;case"top-right":i=a-l,r=0;break;case"left-center":i=0,r=(o-c)/2;break;case"right-center":i=a-l,r=(o-c)/2;break;case"bottom-left":i=0,r=o-c-n;break;case"bottom-center":i=(a-l)/2,r=o-c-n;break;case"bottom-right":i=a-l,r=o-c-n;break;default:i=(a-l)/2,r=(o-c)/2}i=Math.max(0,Math.min(i,a-l)),r=Math.max(0,Math.min(r,o-c-n)),this.element.style.left=`${i}px`,this.element.style.top=`${r}px`}initDrag(){let e=0,t=0,n=0,i=0,r=0,a=0,o=0,l=0,c=0;const h=d=>{d.preventDefault(),d.stopPropagation(),e=d.clientX,t=d.clientY,n=this.element.offsetLeft,i=this.element.offsetTop,r=this.container.clientWidth,a=this.container.clientHeight,o=this.element.offsetWidth,l=this.element.offsetHeight,c=this.options.bottomOffset??70,document.addEventListener("mousemove",u,{capture:!0}),document.addEventListener("mouseup",p,{capture:!0})},u=d=>{d.preventDefault(),d.stopPropagation(),!this.rafId&&(this.rafId=requestAnimationFrame(()=>{const m=d.clientX-e,f=d.clientY-t;let x=n+m,g=i+f;const b=r-o,v=a-l-c;x=Math.max(0,Math.min(x,b)),g=Math.max(0,Math.min(g,v)),this.element.style.left=`${x}px`,this.element.style.top=`${g}px`,this.rafId=null}))},p=()=>{this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),document.removeEventListener("mousemove",u,{capture:!0}),document.removeEventListener("mouseup",p,{capture:!0})};this.header.addEventListener("mousedown",h)}initResize(){const e=this.element.querySelector(".bim-dialog-resize-handle");if(!e)return;let t=0,n=0,i=0,r=0;const a=c=>{c.preventDefault(),c.stopPropagation(),t=c.clientX,n=c.clientY,i=this.element.offsetWidth,r=this.element.offsetHeight,document.addEventListener("mousemove",o,{capture:!0}),document.addEventListener("mouseup",l,{capture:!0})},o=c=>{c.preventDefault(),c.stopPropagation(),!this.rafId&&(this.rafId=requestAnimationFrame(()=>{const h=c.clientX-t,u=c.clientY-n,p=Math.max(this.options.minWidth||100,i+h),d=Math.max(this.options.minHeight||50,r+u);this.element.style.width=`${p}px`,this.element.style.height=`${d}px`,this.rafId=null}))},l=()=>{this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),document.removeEventListener("mousemove",o,{capture:!0}),document.removeEventListener("mouseup",l,{capture:!0})};e.addEventListener("mousedown",a)}setContent(e){this.contentArea.innerHTML="",typeof e=="string"?this.contentArea.innerHTML=e:this.contentArea.appendChild(e)}close(){this._isDestroyed||(this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.element.remove(),this._isDestroyed=!0,this.options.onClose&&this.options.onClose())}destroy(){this.close()}}class Eg extends xi{container;activeDialogs=[];constructor(e,t){super(t),this.container=e}create(e){const t=new Sg({container:this.container,...e,onClose:()=>{this.activeDialogs=this.activeDialogs.filter(n=>n!==t),e.onClose&&e.onClose()}});return t.setTheme(ot.getTheme()),this.activeDialogs.push(t),t}updateTheme(e){this.activeDialogs.forEach(t=>{t.setTheme&&t.setTheme(e)})}destroy(){this.activeDialogs.forEach(e=>e.destroy()),this.activeDialogs=[],super.destroy()}}const Yr="181",qs={ROTATE:0,DOLLY:1,PAN:2},Zs={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},Cg=0,wd=1,Tg=2,Sd=1,Ed=2,vi=3,kn=0,sn=1,yt=2,St=0,Ys=1,nc=2,Cd=3,Td=4,ic=5,En=100,Ag=101,Pg=102,Rg=103,Lg=104,ds=200,Dg=201,Ig=202,Ng=203,sc=204,rc=205,Za=206,Bg=207,Ya=208,kg=209,Ug=210,Og=211,zg=212,Fg=213,Hg=214,ac=0,oc=1,lc=2,$s=3,cc=4,hc=5,uc=6,dc=7,pc=0,Vg=1,Gg=2,Fi=0,Ad=1,Pd=2,Rd=3,Ld=4,Dd=5,Id=6,Nd=7,Bd="attached",Wg="detached",kd=300,Ks=301,Js=302,$a=303,fc=304,Ka=306,Cn=1e3,Un=1001,Ja=1002,Xt=1003,Ud=1004,$r=1005,Pt=1006,Qa=1007,ai=1008,$n=1009,Od=1010,zd=1011,Kr=1012,mc=1013,ps=1014,hn=1015,un=1016,gc=1017,xc=1018,fs=1020,Fd=35902,Hd=35899,Vd=1021,Gd=1022,vn=1023,Jr=1026,ms=1027,eo=1028,vc=1029,bc=1030,yc=1031,_c=1033,to=33776,no=33777,io=33778,so=33779,Mc=35840,wc=35841,Sc=35842,Ec=35843,Cc=36196,Tc=37492,Ac=37496,Pc=37808,Rc=37809,Lc=37810,Dc=37811,Ic=37812,Nc=37813,Bc=37814,kc=37815,Uc=37816,Oc=37817,zc=37818,Fc=37819,Hc=37820,Vc=37821,Gc=36492,Wc=36494,Xc=36495,jc=36283,qc=36284,Zc=36285,Yc=36286,Qr=2300,ea=2301,$c=2302,Wd=2400,Xd=2401,jd=2402,Xg=2500,jg=0,qd=1,Kc=2,qg=3200,Zg=3201,ro=0,Yg=1,Hi="",Rt="srgb",en="srgb-linear",ao="linear",ct="srgb",Qs=7680,Zd=519,$g=512,Kg=513,Jg=514,Yd=515,Qg=516,ex=517,tx=518,nx=519,Jc=35044,$d="300 es",oi=2e3,oo=2001;function Kd(s){for(let e=s.length-1;e>=0;--e)if(s[e]>=65535)return!0;return!1}function ta(s){return document.createElementNS("http://www.w3.org/1999/xhtml",s)}function ix(){const s=ta("canvas");return s.style.display="block",s}const Jd={};function lo(...s){const e="THREE."+s.shift();console.log(e,...s)}function He(...s){const e="THREE."+s.shift();console.warn(e,...s)}function Qe(...s){const e="THREE."+s.shift();console.error(e,...s)}function na(...s){const e=s.join(" ");e in Jd||(Jd[e]=!0,He(...s))}function sx(s,e,t){return new Promise(function(n,i){function r(){switch(s.clientWaitSync(e,s.SYNC_FLUSH_COMMANDS_BIT,0)){case s.WAIT_FAILED:i();break;case s.TIMEOUT_EXPIRED:setTimeout(r,t);break;default:n()}}setTimeout(r,t)})}class gs{addEventListener(e,t){this._listeners===void 0&&(this._listeners={});const n=this._listeners;n[e]===void 0&&(n[e]=[]),n[e].indexOf(t)===-1&&n[e].push(t)}hasEventListener(e,t){const n=this._listeners;return n===void 0?!1:n[e]!==void 0&&n[e].indexOf(t)!==-1}removeEventListener(e,t){const n=this._listeners;if(n===void 0)return;const i=n[e];if(i!==void 0){const r=i.indexOf(t);r!==-1&&i.splice(r,1)}}dispatchEvent(e){const t=this._listeners;if(t===void 0)return;const n=t[e.type];if(n!==void 0){e.target=this;const i=n.slice(0);for(let r=0,a=i.length;r>8&255]+rn[s>>16&255]+rn[s>>24&255]+"-"+rn[e&255]+rn[e>>8&255]+"-"+rn[e>>16&15|64]+rn[e>>24&255]+"-"+rn[t&63|128]+rn[t>>8&255]+"-"+rn[t>>16&255]+rn[t>>24&255]+rn[n&255]+rn[n>>8&255]+rn[n>>16&255]+rn[n>>24&255]).toLowerCase()}function qe(s,e,t){return Math.max(e,Math.min(t,s))}function Qc(s,e){return(s%e+e)%e}function rx(s,e,t,n,i){return n+(s-e)*(i-n)/(t-e)}function ax(s,e,t){return s!==e?(t-s)/(e-s):0}function sa(s,e,t){return(1-t)*s+t*e}function ox(s,e,t,n){return sa(s,e,1-Math.exp(-t*n))}function lx(s,e=1){return e-Math.abs(Qc(s,e*2)-e)}function cx(s,e,t){return s<=e?0:s>=t?1:(s=(s-e)/(t-e),s*s*(3-2*s))}function hx(s,e,t){return s<=e?0:s>=t?1:(s=(s-e)/(t-e),s*s*s*(s*(s*6-15)+10))}function ux(s,e){return s+Math.floor(Math.random()*(e-s+1))}function dx(s,e){return s+Math.random()*(e-s)}function px(s){return s*(.5-Math.random())}function fx(s){s!==void 0&&(Qd=s);let e=Qd+=1831565813;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}function mx(s){return s*ia}function gx(s){return s*er}function xx(s){return(s&s-1)===0&&s!==0}function vx(s){return Math.pow(2,Math.ceil(Math.log(s)/Math.LN2))}function bx(s){return Math.pow(2,Math.floor(Math.log(s)/Math.LN2))}function yx(s,e,t,n,i){const r=Math.cos,a=Math.sin,o=r(t/2),l=a(t/2),c=r((e+n)/2),h=a((e+n)/2),u=r((e-n)/2),p=a((e-n)/2),d=r((n-e)/2),m=a((n-e)/2);switch(i){case"XYX":s.set(o*h,l*u,l*p,o*c);break;case"YZY":s.set(l*p,o*h,l*u,o*c);break;case"ZXZ":s.set(l*u,l*p,o*h,o*c);break;case"XZX":s.set(o*h,l*m,l*d,o*c);break;case"YXY":s.set(l*d,o*h,l*m,o*c);break;case"ZYZ":s.set(l*m,l*d,o*h,o*c);break;default:He("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+i)}}function Kn(s,e){switch(e.constructor){case Float32Array:return s;case Uint32Array:return s/4294967295;case Uint16Array:return s/65535;case Uint8Array:return s/255;case Int32Array:return Math.max(s/2147483647,-1);case Int16Array:return Math.max(s/32767,-1);case Int8Array:return Math.max(s/127,-1);default:throw new Error("Invalid component type.")}}function ht(s,e){switch(e.constructor){case Float32Array:return s;case Uint32Array:return Math.round(s*4294967295);case Uint16Array:return Math.round(s*65535);case Uint8Array:return Math.round(s*255);case Int32Array:return Math.round(s*2147483647);case Int16Array:return Math.round(s*32767);case Int8Array:return Math.round(s*127);default:throw new Error("Invalid component type.")}}const zt={DEG2RAD:ia,RAD2DEG:er,generateUUID:On,clamp:qe,euclideanModulo:Qc,mapLinear:rx,inverseLerp:ax,lerp:sa,damp:ox,pingpong:lx,smoothstep:cx,smootherstep:hx,randInt:ux,randFloat:dx,randFloatSpread:px,seededRandom:fx,degToRad:mx,radToDeg:gx,isPowerOfTwo:xx,ceilPowerOfTwo:vx,floorPowerOfTwo:bx,setQuaternionFromProperEuler:yx,normalize:ht,denormalize:Kn};class he{constructor(e=0,t=0){he.prototype.isVector2=!0,this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const t=this.x,n=this.y,i=e.elements;return this.x=i[0]*t+i[3]*n+i[6],this.y=i[1]*t+i[4]*n+i[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=qe(this.x,e.x,t.x),this.y=qe(this.y,e.y,t.y),this}clampScalar(e,t){return this.x=qe(this.x,e,t),this.y=qe(this.y,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const n=this.dot(e)/t;return Math.acos(qe(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y;return t*t+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){const n=Math.cos(t),i=Math.sin(t),r=this.x-e.x,a=this.y-e.y;return this.x=r*n-a*i+e.x,this.y=r*i+a*n+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class zn{constructor(e=0,t=0,n=0,i=1){this.isQuaternion=!0,this._x=e,this._y=t,this._z=n,this._w=i}static slerpFlat(e,t,n,i,r,a,o){let l=n[i+0],c=n[i+1],h=n[i+2],u=n[i+3],p=r[a+0],d=r[a+1],m=r[a+2],f=r[a+3];if(o<=0){e[t+0]=l,e[t+1]=c,e[t+2]=h,e[t+3]=u;return}if(o>=1){e[t+0]=p,e[t+1]=d,e[t+2]=m,e[t+3]=f;return}if(u!==f||l!==p||c!==d||h!==m){let x=l*p+c*d+h*m+u*f;x<0&&(p=-p,d=-d,m=-m,f=-f,x=-x);let g=1-o;if(x<.9995){const b=Math.acos(x),v=Math.sin(b);g=Math.sin(g*b)/v,o=Math.sin(o*b)/v,l=l*g+p*o,c=c*g+d*o,h=h*g+m*o,u=u*g+f*o}else{l=l*g+p*o,c=c*g+d*o,h=h*g+m*o,u=u*g+f*o;const b=1/Math.sqrt(l*l+c*c+h*h+u*u);l*=b,c*=b,h*=b,u*=b}}e[t]=l,e[t+1]=c,e[t+2]=h,e[t+3]=u}static multiplyQuaternionsFlat(e,t,n,i,r,a){const o=n[i],l=n[i+1],c=n[i+2],h=n[i+3],u=r[a],p=r[a+1],d=r[a+2],m=r[a+3];return e[t]=o*m+h*u+l*d-c*p,e[t+1]=l*m+h*p+c*u-o*d,e[t+2]=c*m+h*d+o*p-l*u,e[t+3]=h*m-o*u-l*p-c*d,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,n,i){return this._x=e,this._y=t,this._z=n,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t=!0){const n=e._x,i=e._y,r=e._z,a=e._order,o=Math.cos,l=Math.sin,c=o(n/2),h=o(i/2),u=o(r/2),p=l(n/2),d=l(i/2),m=l(r/2);switch(a){case"XYZ":this._x=p*h*u+c*d*m,this._y=c*d*u-p*h*m,this._z=c*h*m+p*d*u,this._w=c*h*u-p*d*m;break;case"YXZ":this._x=p*h*u+c*d*m,this._y=c*d*u-p*h*m,this._z=c*h*m-p*d*u,this._w=c*h*u+p*d*m;break;case"ZXY":this._x=p*h*u-c*d*m,this._y=c*d*u+p*h*m,this._z=c*h*m+p*d*u,this._w=c*h*u-p*d*m;break;case"ZYX":this._x=p*h*u-c*d*m,this._y=c*d*u+p*h*m,this._z=c*h*m-p*d*u,this._w=c*h*u+p*d*m;break;case"YZX":this._x=p*h*u+c*d*m,this._y=c*d*u+p*h*m,this._z=c*h*m-p*d*u,this._w=c*h*u-p*d*m;break;case"XZY":this._x=p*h*u-c*d*m,this._y=c*d*u-p*h*m,this._z=c*h*m+p*d*u,this._w=c*h*u+p*d*m;break;default:He("Quaternion: .setFromEuler() encountered an unknown order: "+a)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,t){const n=t/2,i=Math.sin(n);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(e){const t=e.elements,n=t[0],i=t[4],r=t[8],a=t[1],o=t[5],l=t[9],c=t[2],h=t[6],u=t[10],p=n+o+u;if(p>0){const d=.5/Math.sqrt(p+1);this._w=.25/d,this._x=(h-l)*d,this._y=(r-c)*d,this._z=(a-i)*d}else if(n>o&&n>u){const d=2*Math.sqrt(1+n-o-u);this._w=(h-l)/d,this._x=.25*d,this._y=(i+a)/d,this._z=(r+c)/d}else if(o>u){const d=2*Math.sqrt(1+o-n-u);this._w=(r-c)/d,this._x=(i+a)/d,this._y=.25*d,this._z=(l+h)/d}else{const d=2*Math.sqrt(1+u-n-o);this._w=(a-i)/d,this._x=(r+c)/d,this._y=(l+h)/d,this._z=.25*d}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let n=e.dot(t)+1;return n<1e-8?(n=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=n),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(qe(this.dot(e),-1,1)))}rotateTowards(e,t){const n=this.angleTo(e);if(n===0)return this;const i=Math.min(1,t/n);return this.slerp(e,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){const n=e._x,i=e._y,r=e._z,a=e._w,o=t._x,l=t._y,c=t._z,h=t._w;return this._x=n*h+a*o+i*c-r*l,this._y=i*h+a*l+r*o-n*c,this._z=r*h+a*c+n*l-i*o,this._w=a*h-n*o-i*l-r*c,this._onChangeCallback(),this}slerp(e,t){if(t<=0)return this;if(t>=1)return this.copy(e);let n=e._x,i=e._y,r=e._z,a=e._w,o=this.dot(e);o<0&&(n=-n,i=-i,r=-r,a=-a,o=-o);let l=1-t;if(o<.9995){const c=Math.acos(o),h=Math.sin(c);l=Math.sin(l*c)/h,t=Math.sin(t*c)/h,this._x=this._x*l+n*t,this._y=this._y*l+i*t,this._z=this._z*l+r*t,this._w=this._w*l+a*t,this._onChangeCallback()}else this._x=this._x*l+n*t,this._y=this._y*l+i*t,this._z=this._z*l+r*t,this._w=this._w*l+a*t,this.normalize();return this}slerpQuaternions(e,t,n){return this.copy(e).slerp(t,n)}random(){const e=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),n=Math.random(),i=Math.sqrt(1-n),r=Math.sqrt(n);return this.set(i*Math.sin(e),i*Math.cos(e),r*Math.sin(t),r*Math.cos(t))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class P{constructor(e=0,t=0,n=0){P.prototype.isVector3=!0,this.x=e,this.y=t,this.z=n}set(e,t,n){return n===void 0&&(n=this.z),this.x=e,this.y=t,this.z=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return this.applyQuaternion(ep.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(ep.setFromAxisAngle(e,t))}applyMatrix3(e){const t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6]*i,this.y=r[1]*t+r[4]*n+r[7]*i,this.z=r[2]*t+r[5]*n+r[8]*i,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,r=e.elements,a=1/(r[3]*t+r[7]*n+r[11]*i+r[15]);return this.x=(r[0]*t+r[4]*n+r[8]*i+r[12])*a,this.y=(r[1]*t+r[5]*n+r[9]*i+r[13])*a,this.z=(r[2]*t+r[6]*n+r[10]*i+r[14])*a,this}applyQuaternion(e){const t=this.x,n=this.y,i=this.z,r=e.x,a=e.y,o=e.z,l=e.w,c=2*(a*i-o*n),h=2*(o*t-r*i),u=2*(r*n-a*t);return this.x=t+l*c+a*u-o*h,this.y=n+l*h+o*c-r*u,this.z=i+l*u+r*h-a*c,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[4]*n+r[8]*i,this.y=r[1]*t+r[5]*n+r[9]*i,this.z=r[2]*t+r[6]*n+r[10]*i,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=qe(this.x,e.x,t.x),this.y=qe(this.y,e.y,t.y),this.z=qe(this.z,e.z,t.z),this}clampScalar(e,t){return this.x=qe(this.x,e,t),this.y=qe(this.y,e,t),this.z=qe(this.z,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,t){const n=e.x,i=e.y,r=e.z,a=t.x,o=t.y,l=t.z;return this.x=i*l-r*o,this.y=r*a-n*l,this.z=n*o-i*a,this}projectOnVector(e){const t=e.lengthSq();if(t===0)return this.set(0,0,0);const n=e.dot(this)/t;return this.copy(e).multiplyScalar(n)}projectOnPlane(e){return eh.copy(this).projectOnVector(e),this.sub(eh)}reflect(e){return this.sub(eh.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const n=this.dot(e)/t;return Math.acos(qe(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y,i=this.z-e.z;return t*t+n*n+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,n){const i=Math.sin(t)*e;return this.x=i*Math.sin(n),this.y=Math.cos(t)*e,this.z=i*Math.cos(n),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,n){return this.x=e*Math.sin(t),this.y=n,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){const t=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=n,this.z=i,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,t*4)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,t*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=Math.random()*Math.PI*2,t=Math.random()*2-1,n=Math.sqrt(1-t*t);return this.x=n*Math.cos(e),this.y=t,this.z=n*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const eh=new P,ep=new zn;class $e{constructor(e,t,n,i,r,a,o,l,c){$e.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,t,n,i,r,a,o,l,c)}set(e,t,n,i,r,a,o,l,c){const h=this.elements;return h[0]=e,h[1]=i,h[2]=o,h[3]=t,h[4]=r,h[5]=l,h[6]=n,h[7]=a,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}extractBasis(e,t,n){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,r=this.elements,a=n[0],o=n[3],l=n[6],c=n[1],h=n[4],u=n[7],p=n[2],d=n[5],m=n[8],f=i[0],x=i[3],g=i[6],b=i[1],v=i[4],y=i[7],_=i[2],M=i[5],C=i[8];return r[0]=a*f+o*b+l*_,r[3]=a*x+o*v+l*M,r[6]=a*g+o*y+l*C,r[1]=c*f+h*b+u*_,r[4]=c*x+h*v+u*M,r[7]=c*g+h*y+u*C,r[2]=p*f+d*b+m*_,r[5]=p*x+d*v+m*M,r[8]=p*g+d*y+m*C,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],a=e[4],o=e[5],l=e[6],c=e[7],h=e[8];return t*a*h-t*o*c-n*r*h+n*o*l+i*r*c-i*a*l}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],a=e[4],o=e[5],l=e[6],c=e[7],h=e[8],u=h*a-o*c,p=o*l-h*r,d=c*r-a*l,m=t*u+n*p+i*d;if(m===0)return this.set(0,0,0,0,0,0,0,0,0);const f=1/m;return e[0]=u*f,e[1]=(i*c-h*n)*f,e[2]=(o*n-i*a)*f,e[3]=p*f,e[4]=(h*t-i*l)*f,e[5]=(i*r-o*t)*f,e[6]=d*f,e[7]=(n*l-c*t)*f,e[8]=(a*t-n*r)*f,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,n,i,r,a,o){const l=Math.cos(r),c=Math.sin(r);return this.set(n*l,n*c,-n*(l*a+c*o)+a+e,-i*c,i*l,-i*(-c*a+l*o)+o+t,0,0,1),this}scale(e,t){return this.premultiply(th.makeScale(e,t)),this}rotate(e){return this.premultiply(th.makeRotation(-e)),this}translate(e,t){return this.premultiply(th.makeTranslation(e,t)),this}makeTranslation(e,t){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}equals(e){const t=this.elements,n=e.elements;for(let i=0;i<9;i++)if(t[i]!==n[i])return!1;return!0}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e}clone(){return new this.constructor().fromArray(this.elements)}}const th=new $e,tp=new $e().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),np=new $e().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function _x(){const s={enabled:!0,workingColorSpace:en,spaces:{},convert:function(i,r,a){return this.enabled===!1||r===a||!r||!a||(this.spaces[r].transfer===ct&&(i.r=bi(i.r),i.g=bi(i.g),i.b=bi(i.b)),this.spaces[r].primaries!==this.spaces[a].primaries&&(i.applyMatrix3(this.spaces[r].toXYZ),i.applyMatrix3(this.spaces[a].fromXYZ)),this.spaces[a].transfer===ct&&(i.r=tr(i.r),i.g=tr(i.g),i.b=tr(i.b))),i},workingToColorSpace:function(i,r){return this.convert(i,this.workingColorSpace,r)},colorSpaceToWorking:function(i,r){return this.convert(i,r,this.workingColorSpace)},getPrimaries:function(i){return this.spaces[i].primaries},getTransfer:function(i){return i===Hi?ao:this.spaces[i].transfer},getToneMappingMode:function(i){return this.spaces[i].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(i,r=this.workingColorSpace){return i.fromArray(this.spaces[r].luminanceCoefficients)},define:function(i){Object.assign(this.spaces,i)},_getMatrix:function(i,r,a){return i.copy(this.spaces[r].toXYZ).multiply(this.spaces[a].fromXYZ)},_getDrawingBufferColorSpace:function(i){return this.spaces[i].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(i=this.workingColorSpace){return this.spaces[i].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(i,r){return na("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),s.workingToColorSpace(i,r)},toWorkingColorSpace:function(i,r){return na("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),s.colorSpaceToWorking(i,r)}},e=[.64,.33,.3,.6,.15,.06],t=[.2126,.7152,.0722],n=[.3127,.329];return s.define({[en]:{primaries:e,whitePoint:n,transfer:ao,toXYZ:tp,fromXYZ:np,luminanceCoefficients:t,workingColorSpaceConfig:{unpackColorSpace:Rt},outputColorSpaceConfig:{drawingBufferColorSpace:Rt}},[Rt]:{primaries:e,whitePoint:n,transfer:ct,toXYZ:tp,fromXYZ:np,luminanceCoefficients:t,outputColorSpaceConfig:{drawingBufferColorSpace:Rt}}}),s}const it=_x();function bi(s){return s<.04045?s*.0773993808:Math.pow(s*.9478672986+.0521327014,2.4)}function tr(s){return s<.0031308?s*12.92:1.055*Math.pow(s,.41666)-.055}let nr;class Mx{static getDataURL(e,t="image/png"){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement>"u")return e.src;let n;if(e instanceof HTMLCanvasElement)n=e;else{nr===void 0&&(nr=ta("canvas")),nr.width=e.width,nr.height=e.height;const i=nr.getContext("2d");e instanceof ImageData?i.putImageData(e,0,0):i.drawImage(e,0,0,e.width,e.height),n=nr}return n.toDataURL(t)}static sRGBToLinear(e){if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap){const t=ta("canvas");t.width=e.width,t.height=e.height;const n=t.getContext("2d");n.drawImage(e,0,0,e.width,e.height);const i=n.getImageData(0,0,e.width,e.height),r=i.data;for(let a=0;a1),this.pmremVersion=0}get width(){return this.source.getSize(sh).x}get height(){return this.source.getSize(sh).y}get depth(){return this.source.getSize(sh).z}get image(){return this.source.data}set image(e=null){this.source.data=e}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return new this.constructor().copy(this)}copy(e){return this.name=e.name,this.source=e.source,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.channel=e.channel,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.colorSpace=e.colorSpace,this.renderTarget=e.renderTarget,this.isRenderTargetTexture=e.isRenderTargetTexture,this.isArrayTexture=e.isArrayTexture,this.userData=JSON.parse(JSON.stringify(e.userData)),this.needsUpdate=!0,this}setValues(e){for(const t in e){const n=e[t];if(n===void 0){He(`Texture.setValues(): parameter '${t}' has value of undefined.`);continue}const i=this[t];if(i===void 0){He(`Texture.setValues(): property '${t}' does not exist.`);continue}i&&n&&i.isVector2&&n.isVector2||i&&n&&i.isVector3&&n.isVector3||i&&n&&i.isMatrix3&&n.isMatrix3?i.copy(n):this[t]=n}}toJSON(e){const t=e===void 0||typeof e=="string";if(!t&&e.textures[this.uuid]!==void 0)return e.textures[this.uuid];const n={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(e).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),t||(e.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(this.mapping!==kd)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case Cn:e.x=e.x-Math.floor(e.x);break;case Un:e.x=e.x<0?0:1;break;case Ja:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case Cn:e.y=e.y-Math.floor(e.y);break;case Un:e.y=e.y<0?0:1;break;case Ja:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){e===!0&&this.pmremVersion++}}Ft.DEFAULT_IMAGE=null,Ft.DEFAULT_MAPPING=kd,Ft.DEFAULT_ANISOTROPY=1;class tt{constructor(e=0,t=0,n=0,i=1){tt.prototype.isVector4=!0,this.x=e,this.y=t,this.z=n,this.w=i}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,n,i){return this.x=e,this.y=t,this.z=n,this.w=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w!==void 0?e.w:1,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,r=this.w,a=e.elements;return this.x=a[0]*t+a[4]*n+a[8]*i+a[12]*r,this.y=a[1]*t+a[5]*n+a[9]*i+a[13]*r,this.z=a[2]*t+a[6]*n+a[10]*i+a[14]*r,this.w=a[3]*t+a[7]*n+a[11]*i+a[15]*r,this}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this.w/=e.w,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,n,i,r;const l=e.elements,c=l[0],h=l[4],u=l[8],p=l[1],d=l[5],m=l[9],f=l[2],x=l[6],g=l[10];if(Math.abs(h-p)<.01&&Math.abs(u-f)<.01&&Math.abs(m-x)<.01){if(Math.abs(h+p)<.1&&Math.abs(u+f)<.1&&Math.abs(m+x)<.1&&Math.abs(c+d+g-3)<.1)return this.set(1,0,0,0),this;t=Math.PI;const v=(c+1)/2,y=(d+1)/2,_=(g+1)/2,M=(h+p)/4,C=(u+f)/4,R=(m+x)/4;return v>y&&v>_?v<.01?(n=0,i=.707106781,r=.707106781):(n=Math.sqrt(v),i=M/n,r=C/n):y>_?y<.01?(n=.707106781,i=0,r=.707106781):(i=Math.sqrt(y),n=M/i,r=R/i):_<.01?(n=.707106781,i=.707106781,r=0):(r=Math.sqrt(_),n=C/r,i=R/r),this.set(n,i,r,t),this}let b=Math.sqrt((x-m)*(x-m)+(u-f)*(u-f)+(p-h)*(p-h));return Math.abs(b)<.001&&(b=1),this.x=(x-m)/b,this.y=(u-f)/b,this.z=(p-h)/b,this.w=Math.acos((c+d+g-1)/2),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this.w=t[15],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,t){return this.x=qe(this.x,e.x,t.x),this.y=qe(this.y,e.y,t.y),this.z=qe(this.z,e.z,t.z),this.w=qe(this.w,e.w,t.w),this}clampScalar(e,t){return this.x=qe(this.x,e,t),this.y=qe(this.y,e,t),this.z=qe(this.z,e,t),this.w=qe(this.w,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this.w=e.w+(t.w-e.w)*n,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class Ex extends gs{constructor(e=1,t=1,n={}){super(),n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:Pt,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1,depth:1,multiview:!1},n),this.isRenderTarget=!0,this.width=e,this.height=t,this.depth=n.depth,this.scissor=new tt(0,0,e,t),this.scissorTest=!1,this.viewport=new tt(0,0,e,t);const i={width:e,height:t,depth:n.depth},r=new Ft(i);this.textures=[];const a=n.count;for(let o=0;o1);this.dispose()}this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.scissor.copy(e.scissor),this.scissorTest=e.scissorTest,this.viewport.copy(e.viewport),this.textures.length=0;for(let t=0,n=e.textures.length;t=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,Jn),Jn.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,n;return e.normal.x>0?(t=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),t<=-e.constant&&n>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(ra),ho.subVectors(this.max,ra),ir.subVectors(e.a,ra),sr.subVectors(e.b,ra),rr.subVectors(e.c,ra),Vi.subVectors(sr,ir),Gi.subVectors(rr,sr),xs.subVectors(ir,rr);let t=[0,-Vi.z,Vi.y,0,-Gi.z,Gi.y,0,-xs.z,xs.y,Vi.z,0,-Vi.x,Gi.z,0,-Gi.x,xs.z,0,-xs.x,-Vi.y,Vi.x,0,-Gi.y,Gi.x,0,-xs.y,xs.x,0];return!rh(t,ir,sr,rr,ho)||(t=[1,0,0,0,1,0,0,0,1],!rh(t,ir,sr,rr,ho))?!1:(uo.crossVectors(Vi,Gi),t=[uo.x,uo.y,uo.z],rh(t,ir,sr,rr,ho))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,Jn).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(Jn).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(yi[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),yi[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),yi[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),yi[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),yi[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),yi[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),yi[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),yi[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(yi),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(e){return this.min.fromArray(e.min),this.max.fromArray(e.max),this}}const yi=[new P,new P,new P,new P,new P,new P,new P,new P],Jn=new P,co=new gt,ir=new P,sr=new P,rr=new P,Vi=new P,Gi=new P,xs=new P,ra=new P,ho=new P,uo=new P,vs=new P;function rh(s,e,t,n,i){for(let r=0,a=s.length-3;r<=a;r+=3){vs.fromArray(s,r);const o=i.x*Math.abs(vs.x)+i.y*Math.abs(vs.y)+i.z*Math.abs(vs.z),l=e.dot(vs),c=t.dot(vs),h=n.dot(vs);if(Math.max(-Math.max(l,c,h),Math.min(l,c,h))>o)return!1}return!0}const Tx=new gt,aa=new P,ah=new P;class li{constructor(e=new P,t=-1){this.isSphere=!0,this.center=e,this.radius=t}set(e,t){return this.center.copy(e),this.radius=t,this}setFromPoints(e,t){const n=this.center;t!==void 0?n.copy(t):Tx.setFromPoints(e).getCenter(n);let i=0;for(let r=0,a=e.length;rthis.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;aa.subVectors(e,this.center);const t=aa.lengthSq();if(t>this.radius*this.radius){const n=Math.sqrt(t),i=(n-this.radius)*.5;this.center.addScaledVector(aa,i/n),this.radius+=i}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(ah.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(aa.copy(e.center).add(ah)),this.expandByPoint(aa.copy(e.center).sub(ah))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(e){return this.radius=e.radius,this.center.fromArray(e.center),this}}const _i=new P,oh=new P,po=new P,Wi=new P,lh=new P,fo=new P,ch=new P;class Xi{constructor(e=new P,t=new P(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,_i)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);const n=t.dot(this.direction);return n<0?t.copy(this.origin):t.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const t=_i.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(_i.copy(this.origin).addScaledVector(this.direction,t),_i.distanceToSquared(e))}distanceSqToSegment(e,t,n,i){oh.copy(e).add(t).multiplyScalar(.5),po.copy(t).sub(e).normalize(),Wi.copy(this.origin).sub(oh);const r=e.distanceTo(t)*.5,a=-this.direction.dot(po),o=Wi.dot(this.direction),l=-Wi.dot(po),c=Wi.lengthSq(),h=Math.abs(1-a*a);let u,p,d,m;if(h>0)if(u=a*l-o,p=a*o-l,m=r*h,u>=0)if(p>=-m)if(p<=m){const f=1/h;u*=f,p*=f,d=u*(u+a*p+2*o)+p*(a*u+p+2*l)+c}else p=r,u=Math.max(0,-(a*p+o)),d=-u*u+p*(p+2*l)+c;else p=-r,u=Math.max(0,-(a*p+o)),d=-u*u+p*(p+2*l)+c;else p<=-m?(u=Math.max(0,-(-a*r+o)),p=u>0?-r:Math.min(Math.max(-r,-l),r),d=-u*u+p*(p+2*l)+c):p<=m?(u=0,p=Math.min(Math.max(-r,-l),r),d=p*(p+2*l)+c):(u=Math.max(0,-(a*r+o)),p=u>0?r:Math.min(Math.max(-r,-l),r),d=-u*u+p*(p+2*l)+c);else p=a>0?-r:r,u=Math.max(0,-(a*p+o)),d=-u*u+p*(p+2*l)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,u),i&&i.copy(oh).addScaledVector(po,p),d}intersectSphere(e,t){_i.subVectors(e.center,this.origin);const n=_i.dot(this.direction),i=_i.dot(_i)-n*n,r=e.radius*e.radius;if(i>r)return null;const a=Math.sqrt(r-i),o=n-a,l=n+a;return l<0?null:o<0?this.at(l,t):this.at(o,t)}intersectsSphere(e){return e.radius<0?!1:this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const t=e.normal.dot(this.direction);if(t===0)return e.distanceToPoint(this.origin)===0?0:null;const n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null}intersectPlane(e,t){const n=this.distanceToPlane(e);return n===null?null:this.at(n,t)}intersectsPlane(e){const t=e.distanceToPoint(this.origin);return t===0||e.normal.dot(this.direction)*t<0}intersectBox(e,t){let n,i,r,a,o,l;const c=1/this.direction.x,h=1/this.direction.y,u=1/this.direction.z,p=this.origin;return c>=0?(n=(e.min.x-p.x)*c,i=(e.max.x-p.x)*c):(n=(e.max.x-p.x)*c,i=(e.min.x-p.x)*c),h>=0?(r=(e.min.y-p.y)*h,a=(e.max.y-p.y)*h):(r=(e.max.y-p.y)*h,a=(e.min.y-p.y)*h),n>a||r>i||((r>n||isNaN(n))&&(n=r),(a=0?(o=(e.min.z-p.z)*u,l=(e.max.z-p.z)*u):(o=(e.max.z-p.z)*u,l=(e.min.z-p.z)*u),n>l||o>i)||((o>n||n!==n)&&(n=o),(l=0?n:i,t)}intersectsBox(e){return this.intersectBox(e,_i)!==null}intersectTriangle(e,t,n,i,r){lh.subVectors(t,e),fo.subVectors(n,e),ch.crossVectors(lh,fo);let a=this.direction.dot(ch),o;if(a>0){if(i)return null;o=1}else if(a<0)o=-1,a=-a;else return null;Wi.subVectors(this.origin,e);const l=o*this.direction.dot(fo.crossVectors(Wi,fo));if(l<0)return null;const c=o*this.direction.dot(lh.cross(Wi));if(c<0||l+c>a)return null;const h=-o*Wi.dot(ch);return h<0?null:this.at(h/a,r)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class De{constructor(e,t,n,i,r,a,o,l,c,h,u,p,d,m,f,x){De.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],e!==void 0&&this.set(e,t,n,i,r,a,o,l,c,h,u,p,d,m,f,x)}set(e,t,n,i,r,a,o,l,c,h,u,p,d,m,f,x){const g=this.elements;return g[0]=e,g[4]=t,g[8]=n,g[12]=i,g[1]=r,g[5]=a,g[9]=o,g[13]=l,g[2]=c,g[6]=h,g[10]=u,g[14]=p,g[3]=d,g[7]=m,g[11]=f,g[15]=x,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new De().fromArray(this.elements)}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],this}copyPosition(e){const t=this.elements,n=e.elements;return t[12]=n[12],t[13]=n[13],t[14]=n[14],this}setFromMatrix3(e){const t=e.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(e,t,n){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(e,t,n){return this.set(e.x,t.x,n.x,0,e.y,t.y,n.y,0,e.z,t.z,n.z,0,0,0,0,1),this}extractRotation(e){const t=this.elements,n=e.elements,i=1/ar.setFromMatrixColumn(e,0).length(),r=1/ar.setFromMatrixColumn(e,1).length(),a=1/ar.setFromMatrixColumn(e,2).length();return t[0]=n[0]*i,t[1]=n[1]*i,t[2]=n[2]*i,t[3]=0,t[4]=n[4]*r,t[5]=n[5]*r,t[6]=n[6]*r,t[7]=0,t[8]=n[8]*a,t[9]=n[9]*a,t[10]=n[10]*a,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(e){const t=this.elements,n=e.x,i=e.y,r=e.z,a=Math.cos(n),o=Math.sin(n),l=Math.cos(i),c=Math.sin(i),h=Math.cos(r),u=Math.sin(r);if(e.order==="XYZ"){const p=a*h,d=a*u,m=o*h,f=o*u;t[0]=l*h,t[4]=-l*u,t[8]=c,t[1]=d+m*c,t[5]=p-f*c,t[9]=-o*l,t[2]=f-p*c,t[6]=m+d*c,t[10]=a*l}else if(e.order==="YXZ"){const p=l*h,d=l*u,m=c*h,f=c*u;t[0]=p+f*o,t[4]=m*o-d,t[8]=a*c,t[1]=a*u,t[5]=a*h,t[9]=-o,t[2]=d*o-m,t[6]=f+p*o,t[10]=a*l}else if(e.order==="ZXY"){const p=l*h,d=l*u,m=c*h,f=c*u;t[0]=p-f*o,t[4]=-a*u,t[8]=m+d*o,t[1]=d+m*o,t[5]=a*h,t[9]=f-p*o,t[2]=-a*c,t[6]=o,t[10]=a*l}else if(e.order==="ZYX"){const p=a*h,d=a*u,m=o*h,f=o*u;t[0]=l*h,t[4]=m*c-d,t[8]=p*c+f,t[1]=l*u,t[5]=f*c+p,t[9]=d*c-m,t[2]=-c,t[6]=o*l,t[10]=a*l}else if(e.order==="YZX"){const p=a*l,d=a*c,m=o*l,f=o*c;t[0]=l*h,t[4]=f-p*u,t[8]=m*u+d,t[1]=u,t[5]=a*h,t[9]=-o*h,t[2]=-c*h,t[6]=d*u+m,t[10]=p-f*u}else if(e.order==="XZY"){const p=a*l,d=a*c,m=o*l,f=o*c;t[0]=l*h,t[4]=-u,t[8]=c*h,t[1]=p*u+f,t[5]=a*h,t[9]=d*u-m,t[2]=m*u-d,t[6]=o*h,t[10]=f*u+p}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(e){return this.compose(Ax,e,Px)}lookAt(e,t,n){const i=this.elements;return An.subVectors(e,t),An.lengthSq()===0&&(An.z=1),An.normalize(),ji.crossVectors(n,An),ji.lengthSq()===0&&(Math.abs(n.z)===1?An.x+=1e-4:An.z+=1e-4,An.normalize(),ji.crossVectors(n,An)),ji.normalize(),mo.crossVectors(An,ji),i[0]=ji.x,i[4]=mo.x,i[8]=An.x,i[1]=ji.y,i[5]=mo.y,i[9]=An.y,i[2]=ji.z,i[6]=mo.z,i[10]=An.z,this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,r=this.elements,a=n[0],o=n[4],l=n[8],c=n[12],h=n[1],u=n[5],p=n[9],d=n[13],m=n[2],f=n[6],x=n[10],g=n[14],b=n[3],v=n[7],y=n[11],_=n[15],M=i[0],C=i[4],R=i[8],S=i[12],E=i[1],L=i[5],A=i[9],I=i[13],w=i[2],z=i[6],G=i[10],j=i[14],Y=i[3],q=i[7],ie=i[11],W=i[15];return r[0]=a*M+o*E+l*w+c*Y,r[4]=a*C+o*L+l*z+c*q,r[8]=a*R+o*A+l*G+c*ie,r[12]=a*S+o*I+l*j+c*W,r[1]=h*M+u*E+p*w+d*Y,r[5]=h*C+u*L+p*z+d*q,r[9]=h*R+u*A+p*G+d*ie,r[13]=h*S+u*I+p*j+d*W,r[2]=m*M+f*E+x*w+g*Y,r[6]=m*C+f*L+x*z+g*q,r[10]=m*R+f*A+x*G+g*ie,r[14]=m*S+f*I+x*j+g*W,r[3]=b*M+v*E+y*w+_*Y,r[7]=b*C+v*L+y*z+_*q,r[11]=b*R+v*A+y*G+_*ie,r[15]=b*S+v*I+y*j+_*W,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[4],i=e[8],r=e[12],a=e[1],o=e[5],l=e[9],c=e[13],h=e[2],u=e[6],p=e[10],d=e[14],m=e[3],f=e[7],x=e[11],g=e[15];return m*(+r*l*u-i*c*u-r*o*p+n*c*p+i*o*d-n*l*d)+f*(+t*l*d-t*c*p+r*a*p-i*a*d+i*c*h-r*l*h)+x*(+t*c*u-t*o*d-r*a*u+n*a*d+r*o*h-n*c*h)+g*(-i*o*h-t*l*u+t*o*p+i*a*u-n*a*p+n*l*h)}transpose(){const e=this.elements;let t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e,t,n){const i=this.elements;return e.isVector3?(i[12]=e.x,i[13]=e.y,i[14]=e.z):(i[12]=e,i[13]=t,i[14]=n),this}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],a=e[4],o=e[5],l=e[6],c=e[7],h=e[8],u=e[9],p=e[10],d=e[11],m=e[12],f=e[13],x=e[14],g=e[15],b=u*x*c-f*p*c+f*l*d-o*x*d-u*l*g+o*p*g,v=m*p*c-h*x*c-m*l*d+a*x*d+h*l*g-a*p*g,y=h*f*c-m*u*c+m*o*d-a*f*d-h*o*g+a*u*g,_=m*u*l-h*f*l-m*o*p+a*f*p+h*o*x-a*u*x,M=t*b+n*v+i*y+r*_;if(M===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const C=1/M;return e[0]=b*C,e[1]=(f*p*r-u*x*r-f*i*d+n*x*d+u*i*g-n*p*g)*C,e[2]=(o*x*r-f*l*r+f*i*c-n*x*c-o*i*g+n*l*g)*C,e[3]=(u*l*r-o*p*r-u*i*c+n*p*c+o*i*d-n*l*d)*C,e[4]=v*C,e[5]=(h*x*r-m*p*r+m*i*d-t*x*d-h*i*g+t*p*g)*C,e[6]=(m*l*r-a*x*r-m*i*c+t*x*c+a*i*g-t*l*g)*C,e[7]=(a*p*r-h*l*r+h*i*c-t*p*c-a*i*d+t*l*d)*C,e[8]=y*C,e[9]=(m*u*r-h*f*r-m*n*d+t*f*d+h*n*g-t*u*g)*C,e[10]=(a*f*r-m*o*r+m*n*c-t*f*c-a*n*g+t*o*g)*C,e[11]=(h*o*r-a*u*r-h*n*c+t*u*c+a*n*d-t*o*d)*C,e[12]=_*C,e[13]=(h*f*i-m*u*i+m*n*p-t*f*p-h*n*x+t*u*x)*C,e[14]=(m*o*i-a*f*i-m*n*l+t*f*l+a*n*x-t*o*x)*C,e[15]=(a*u*i-h*o*i+h*n*l-t*u*l-a*n*p+t*o*p)*C,this}scale(e){const t=this.elements,n=e.x,i=e.y,r=e.z;return t[0]*=n,t[4]*=i,t[8]*=r,t[1]*=n,t[5]*=i,t[9]*=r,t[2]*=n,t[6]*=i,t[10]*=r,t[3]*=n,t[7]*=i,t[11]*=r,this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],n=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],i=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,n,i))}makeTranslation(e,t,n){return e.isVector3?this.set(1,0,0,e.x,0,1,0,e.y,0,0,1,e.z,0,0,0,1):this.set(1,0,0,e,0,1,0,t,0,0,1,n,0,0,0,1),this}makeRotationX(e){const t=Math.cos(e),n=Math.sin(e);return this.set(1,0,0,0,0,t,-n,0,0,n,t,0,0,0,0,1),this}makeRotationY(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,0,n,0,0,1,0,0,-n,0,t,0,0,0,0,1),this}makeRotationZ(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,0,n,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,t){const n=Math.cos(t),i=Math.sin(t),r=1-n,a=e.x,o=e.y,l=e.z,c=r*a,h=r*o;return this.set(c*a+n,c*o-i*l,c*l+i*o,0,c*o+i*l,h*o+n,h*l-i*a,0,c*l-i*o,h*l+i*a,r*l*l+n,0,0,0,0,1),this}makeScale(e,t,n){return this.set(e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1),this}makeShear(e,t,n,i,r,a){return this.set(1,n,r,0,e,1,a,0,t,i,1,0,0,0,0,1),this}compose(e,t,n){const i=this.elements,r=t._x,a=t._y,o=t._z,l=t._w,c=r+r,h=a+a,u=o+o,p=r*c,d=r*h,m=r*u,f=a*h,x=a*u,g=o*u,b=l*c,v=l*h,y=l*u,_=n.x,M=n.y,C=n.z;return i[0]=(1-(f+g))*_,i[1]=(d+y)*_,i[2]=(m-v)*_,i[3]=0,i[4]=(d-y)*M,i[5]=(1-(p+g))*M,i[6]=(x+b)*M,i[7]=0,i[8]=(m+v)*C,i[9]=(x-b)*C,i[10]=(1-(p+f))*C,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this}decompose(e,t,n){const i=this.elements;let r=ar.set(i[0],i[1],i[2]).length();const a=ar.set(i[4],i[5],i[6]).length(),o=ar.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),e.x=i[12],e.y=i[13],e.z=i[14],Qn.copy(this);const c=1/r,h=1/a,u=1/o;return Qn.elements[0]*=c,Qn.elements[1]*=c,Qn.elements[2]*=c,Qn.elements[4]*=h,Qn.elements[5]*=h,Qn.elements[6]*=h,Qn.elements[8]*=u,Qn.elements[9]*=u,Qn.elements[10]*=u,t.setFromRotationMatrix(Qn),n.x=r,n.y=a,n.z=o,this}makePerspective(e,t,n,i,r,a,o=oi,l=!1){const c=this.elements,h=2*r/(t-e),u=2*r/(n-i),p=(t+e)/(t-e),d=(n+i)/(n-i);let m,f;if(l)m=r/(a-r),f=a*r/(a-r);else if(o===oi)m=-(a+r)/(a-r),f=-2*a*r/(a-r);else if(o===oo)m=-a/(a-r),f=-a*r/(a-r);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+o);return c[0]=h,c[4]=0,c[8]=p,c[12]=0,c[1]=0,c[5]=u,c[9]=d,c[13]=0,c[2]=0,c[6]=0,c[10]=m,c[14]=f,c[3]=0,c[7]=0,c[11]=-1,c[15]=0,this}makeOrthographic(e,t,n,i,r,a,o=oi,l=!1){const c=this.elements,h=2/(t-e),u=2/(n-i),p=-(t+e)/(t-e),d=-(n+i)/(n-i);let m,f;if(l)m=1/(a-r),f=a/(a-r);else if(o===oi)m=-2/(a-r),f=-(a+r)/(a-r);else if(o===oo)m=-1/(a-r),f=-r/(a-r);else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);return c[0]=h,c[4]=0,c[8]=0,c[12]=p,c[1]=0,c[5]=u,c[9]=0,c[13]=d,c[2]=0,c[6]=0,c[10]=m,c[14]=f,c[3]=0,c[7]=0,c[11]=0,c[15]=1,this}equals(e){const t=this.elements,n=e.elements;for(let i=0;i<16;i++)if(t[i]!==n[i])return!1;return!0}fromArray(e,t=0){for(let n=0;n<16;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e[t+9]=n[9],e[t+10]=n[10],e[t+11]=n[11],e[t+12]=n[12],e[t+13]=n[13],e[t+14]=n[14],e[t+15]=n[15],e}}const ar=new P,Qn=new De,Ax=new P(0,0,0),Px=new P(1,1,1),ji=new P,mo=new P,An=new P,sp=new De,rp=new zn;class Pn{constructor(e=0,t=0,n=0,i=Pn.DEFAULT_ORDER){this.isEuler=!0,this._x=e,this._y=t,this._z=n,this._order=i}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,t,n,i=this._order){return this._x=e,this._y=t,this._z=n,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,t=this._order,n=!0){const i=e.elements,r=i[0],a=i[4],o=i[8],l=i[1],c=i[5],h=i[9],u=i[2],p=i[6],d=i[10];switch(t){case"XYZ":this._y=Math.asin(qe(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-h,d),this._z=Math.atan2(-a,r)):(this._x=Math.atan2(p,c),this._z=0);break;case"YXZ":this._x=Math.asin(-qe(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(o,d),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-u,r),this._z=0);break;case"ZXY":this._x=Math.asin(qe(p,-1,1)),Math.abs(p)<.9999999?(this._y=Math.atan2(-u,d),this._z=Math.atan2(-a,c)):(this._y=0,this._z=Math.atan2(l,r));break;case"ZYX":this._y=Math.asin(-qe(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(p,d),this._z=Math.atan2(l,r)):(this._x=0,this._z=Math.atan2(-a,c));break;case"YZX":this._z=Math.asin(qe(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-h,c),this._y=Math.atan2(-u,r)):(this._x=0,this._y=Math.atan2(o,d));break;case"XZY":this._z=Math.asin(-qe(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(p,c),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-h,d),this._y=0);break;default:He("Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,n===!0&&this._onChangeCallback(),this}setFromQuaternion(e,t,n){return sp.makeRotationFromQuaternion(e),this.setFromRotationMatrix(sp,t,n)}setFromVector3(e,t=this._order){return this.set(e.x,e.y,e.z,t)}reorder(e){return rp.setFromEuler(this),this.setFromQuaternion(rp,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],e[3]!==void 0&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}Pn.DEFAULT_ORDER="XYZ";class hh{constructor(){this.mask=1}set(e){this.mask=(1<>>0}enable(e){this.mask|=1<1){for(let t=0;t1){for(let n=0;n0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type="BatchedMesh",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.geometryInfo=this._geometryInfo.map(o=>({...o,boundingBox:o.boundingBox?o.boundingBox.toJSON():void 0,boundingSphere:o.boundingSphere?o.boundingSphere.toJSON():void 0})),i.instanceInfo=this._instanceInfo.map(o=>({...o})),i.availableInstanceIds=this._availableInstanceIds.slice(),i.availableGeometryIds=this._availableGeometryIds.slice(),i.nextIndexStart=this._nextIndexStart,i.nextVertexStart=this._nextVertexStart,i.geometryCount=this._geometryCount,i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.matricesTexture=this._matricesTexture.toJSON(e),i.indirectTexture=this._indirectTexture.toJSON(e),this._colorsTexture!==null&&(i.colorsTexture=this._colorsTexture.toJSON(e)),this.boundingSphere!==null&&(i.boundingSphere=this.boundingSphere.toJSON()),this.boundingBox!==null&&(i.boundingBox=this.boundingBox.toJSON()));function r(o,l){return o[l.uuid]===void 0&&(o[l.uuid]=l.toJSON(e)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(i.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=r(e.geometries,this.geometry);const o=this.geometry.parameters;if(o!==void 0&&o.shapes!==void 0){const l=o.shapes;if(Array.isArray(l))for(let c=0,h=l.length;c0){i.children=[];for(let o=0;o0){i.animations=[];for(let o=0;o0&&(n.geometries=o),l.length>0&&(n.materials=l),c.length>0&&(n.textures=c),h.length>0&&(n.images=h),u.length>0&&(n.shapes=u),p.length>0&&(n.skeletons=p),d.length>0&&(n.animations=d),m.length>0&&(n.nodes=m)}return n.object=i,n;function a(o){const l=[];for(const c in o){const h=o[c];delete h.metadata,l.push(h)}return l}}clone(e){return new this.constructor().copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),t===!0)for(let n=0;n0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(e,t,n,i,r){ei.subVectors(i,t),wi.subVectors(n,t),dh.subVectors(e,t);const a=ei.dot(ei),o=ei.dot(wi),l=ei.dot(dh),c=wi.dot(wi),h=wi.dot(dh),u=a*c-o*o;if(u===0)return r.set(0,0,0),null;const p=1/u,d=(c*l-o*h)*p,m=(a*h-o*l)*p;return r.set(1-d-m,m,d)}static containsPoint(e,t,n,i){return this.getBarycoord(e,t,n,i,Si)===null?!1:Si.x>=0&&Si.y>=0&&Si.x+Si.y<=1}static getInterpolation(e,t,n,i,r,a,o,l){return this.getBarycoord(e,t,n,i,Si)===null?(l.x=0,l.y=0,"z"in l&&(l.z=0),"w"in l&&(l.w=0),null):(l.setScalar(0),l.addScaledVector(r,Si.x),l.addScaledVector(a,Si.y),l.addScaledVector(o,Si.z),l)}static getInterpolatedAttribute(e,t,n,i,r,a){return gh.setScalar(0),xh.setScalar(0),vh.setScalar(0),gh.fromBufferAttribute(e,t),xh.fromBufferAttribute(e,n),vh.fromBufferAttribute(e,i),a.setScalar(0),a.addScaledVector(gh,r.x),a.addScaledVector(xh,r.y),a.addScaledVector(vh,r.z),a}static isFrontFacing(e,t,n,i){return ei.subVectors(n,t),wi.subVectors(e,t),ei.cross(wi).dot(i)<0}set(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this}setFromPointsAndIndices(e,t,n,i){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[i]),this}setFromAttributeAndIndices(e,t,n,i){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,n),this.c.fromBufferAttribute(e,i),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return ei.subVectors(this.c,this.b),wi.subVectors(this.a,this.b),ei.cross(wi).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return vt.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,t){return vt.getBarycoord(e,this.a,this.b,this.c,t)}getInterpolation(e,t,n,i,r){return vt.getInterpolation(e,this.a,this.b,this.c,t,n,i,r)}containsPoint(e){return vt.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return vt.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){const n=this.a,i=this.b,r=this.c;let a,o;cr.subVectors(i,n),hr.subVectors(r,n),ph.subVectors(e,n);const l=cr.dot(ph),c=hr.dot(ph);if(l<=0&&c<=0)return t.copy(n);fh.subVectors(e,i);const h=cr.dot(fh),u=hr.dot(fh);if(h>=0&&u<=h)return t.copy(i);const p=l*u-h*c;if(p<=0&&l>=0&&h<=0)return a=l/(l-h),t.copy(n).addScaledVector(cr,a);mh.subVectors(e,r);const d=cr.dot(mh),m=hr.dot(mh);if(m>=0&&d<=m)return t.copy(r);const f=d*c-l*m;if(f<=0&&c>=0&&m<=0)return o=c/(c-m),t.copy(n).addScaledVector(hr,o);const x=h*m-d*u;if(x<=0&&u-h>=0&&d-m>=0)return up.subVectors(r,i),o=(u-h)/(u-h+(d-m)),t.copy(i).addScaledVector(up,o);const g=1/(x+f+p);return a=f*g,o=p*g,t.copy(n).addScaledVector(cr,a).addScaledVector(hr,o)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}const dp={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},qi={h:0,s:0,l:0},xo={h:0,s:0,l:0};function bh(s,e,t){return t<0&&(t+=1),t>1&&(t-=1),t<1/6?s+(e-s)*6*t:t<1/2?e:t<2/3?s+(e-s)*6*(2/3-t):s}class Fe{constructor(e,t,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,t,n)}set(e,t,n){if(t===void 0&&n===void 0){const i=e;i&&i.isColor?this.copy(i):typeof i=="number"?this.setHex(i):typeof i=="string"&&this.setStyle(i)}else this.setRGB(e,t,n);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,t=Rt){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,it.colorSpaceToWorking(this,t),this}setRGB(e,t,n,i=it.workingColorSpace){return this.r=e,this.g=t,this.b=n,it.colorSpaceToWorking(this,i),this}setHSL(e,t,n,i=it.workingColorSpace){if(e=Qc(e,1),t=qe(t,0,1),n=qe(n,0,1),t===0)this.r=this.g=this.b=n;else{const r=n<=.5?n*(1+t):n+t-n*t,a=2*n-r;this.r=bh(a,r,e+1/3),this.g=bh(a,r,e),this.b=bh(a,r,e-1/3)}return it.colorSpaceToWorking(this,i),this}setStyle(e,t=Rt){function n(r){r!==void 0&&parseFloat(r)<1&&He("Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^(\w+)\(([^\)]*)\)/.exec(e)){let r;const a=i[1],o=i[2];switch(a){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,t);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,t);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,t);break;default:He("Color: Unknown color model "+e)}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){const r=i[1],a=r.length;if(a===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,t);if(a===6)return this.setHex(parseInt(r,16),t);He("Color: Invalid hex color "+e)}else if(e&&e.length>0)return this.setColorName(e,t);return this}setColorName(e,t=Rt){const n=dp[e.toLowerCase()];return n!==void 0?this.setHex(n,t):He("Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=bi(e.r),this.g=bi(e.g),this.b=bi(e.b),this}copyLinearToSRGB(e){return this.r=tr(e.r),this.g=tr(e.g),this.b=tr(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=Rt){return it.workingToColorSpace(an.copy(this),e),Math.round(qe(an.r*255,0,255))*65536+Math.round(qe(an.g*255,0,255))*256+Math.round(qe(an.b*255,0,255))}getHexString(e=Rt){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,t=it.workingColorSpace){it.workingToColorSpace(an.copy(this),t);const n=an.r,i=an.g,r=an.b,a=Math.max(n,i,r),o=Math.min(n,i,r);let l,c;const h=(o+a)/2;if(o===a)l=0,c=0;else{const u=a-o;switch(c=h<=.5?u/(a+o):u/(2-a-o),a){case n:l=(i-r)/u+(i0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(const t in e){const n=e[t];if(n===void 0){He(`Material: parameter '${t}' has value of undefined.`);continue}const i=this[t];if(i===void 0){He(`Material: '${t}' is not a property of THREE.${this.type}.`);continue}i&&i.isColor?i.set(n):i&&i.isVector3&&n&&n.isVector3?i.copy(n):this[t]=n}}toJSON(e){const t=e===void 0||typeof e=="string";t&&(e={textures:{},images:{}});const n={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};n.uuid=this.uuid,n.type=this.type,this.name!==""&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(n.sheenColorMap=this.sheenColorMap.toJSON(e).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(n.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(e).uuid),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==Ys&&(n.blending=this.blending),this.side!==kn&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==sc&&(n.blendSrc=this.blendSrc),this.blendDst!==rc&&(n.blendDst=this.blendDst),this.blendEquation!==En&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==$s&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==Zd&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==Qs&&(n.stencilFail=this.stencilFail),this.stencilZFail!==Qs&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==Qs&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function i(r){const a=[];for(const o in r){const l=r[o];delete l.metadata,a.push(l)}return a}if(t){const r=i(e.textures),a=i(e.images);r.length>0&&(n.textures=r),a.length>0&&(n.images=a)}return n}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const t=e.clippingPlanes;let n=null;if(t!==null){const i=t.length;n=new Array(i);for(let r=0;r!==i;++r)n[r]=t[r].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){e===!0&&this.version++}}class Ht extends Rn{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Fe(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Pn,this.combine=pc,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}const Ei=Bx();function Bx(){const s=new ArrayBuffer(4),e=new Float32Array(s),t=new Uint32Array(s),n=new Uint32Array(512),i=new Uint32Array(512);for(let l=0;l<256;++l){const c=l-127;c<-27?(n[l]=0,n[l|256]=32768,i[l]=24,i[l|256]=24):c<-14?(n[l]=1024>>-c-14,n[l|256]=1024>>-c-14|32768,i[l]=-c-1,i[l|256]=-c-1):c<=15?(n[l]=c+15<<10,n[l|256]=c+15<<10|32768,i[l]=13,i[l|256]=13):c<128?(n[l]=31744,n[l|256]=64512,i[l]=24,i[l|256]=24):(n[l]=31744,n[l|256]=64512,i[l]=13,i[l|256]=13)}const r=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let l=1;l<1024;++l){let c=l<<13,h=0;for(;(c&8388608)===0;)c<<=1,h-=8388608;c&=-8388609,h+=947912704,r[l]=c|h}for(let l=1024;l<2048;++l)r[l]=939524096+(l-1024<<13);for(let l=1;l<31;++l)a[l]=l<<23;a[31]=1199570944,a[32]=2147483648;for(let l=33;l<63;++l)a[l]=2147483648+(l-32<<23);a[63]=3347054592;for(let l=1;l<64;++l)l!==32&&(o[l]=1024);return{floatView:e,uint32View:t,baseTable:n,shiftTable:i,mantissaTable:r,exponentTable:a,offsetTable:o}}function kx(s){Math.abs(s)>65504&&He("DataUtils.toHalfFloat(): Value out of range."),s=qe(s,-65504,65504),Ei.floatView[0]=s;const e=Ei.uint32View[0],t=e>>23&511;return Ei.baseTable[t]+((e&8388607)>>Ei.shiftTable[t])}function Ux(s){const e=s>>10;return Ei.uint32View[0]=Ei.mantissaTable[Ei.offsetTable[e]+(s&1023)]+Ei.exponentTable[e],Ei.floatView[0]}class vo{static toHalfFloat(e){return kx(e)}static fromHalfFloat(e){return Ux(e)}}const Vt=new P,bo=new he;let Ox=0;class bt{constructor(e,t,n=!1){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:Ox++}),this.name="",this.array=e,this.itemSize=t,this.count=e!==void 0?e.length/t:0,this.normalized=n,this.usage=Jc,this.updateRanges=[],this.gpuType=hn,this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,t,n){e*=this.itemSize,n*=t.itemSize;for(let i=0,r=this.itemSize;it.count&&He("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),t.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new gt);const e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.isGLBufferAttribute){Qe("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new P(-1/0,-1/0,-1/0),new P(1/0,1/0,1/0));return}if(e!==void 0){if(this.boundingBox.setFromBufferAttribute(e),t)for(let n=0,i=t.length;n0&&(e.userData=this.userData),this.parameters!==void 0){const l=this.parameters;for(const c in l)l[c]!==void 0&&(e[c]=l[c]);return e}e.data={attributes:{}};const t=this.index;t!==null&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});const n=this.attributes;for(const l in n){const c=n[l];e.data.attributes[l]=c.toJSON(e.data)}const i={};let r=!1;for(const l in this.morphAttributes){const c=this.morphAttributes[l],h=[];for(let u=0,p=c.length;u0&&(i[l]=h,r=!0)}r&&(e.data.morphAttributes=i,e.data.morphTargetsRelative=this.morphTargetsRelative);const a=this.groups;a.length>0&&(e.data.groups=JSON.parse(JSON.stringify(a)));const o=this.boundingSphere;return o!==null&&(e.data.boundingSphere=o.toJSON()),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const t={};this.name=e.name;const n=e.index;n!==null&&this.setIndex(n.clone());const i=e.attributes;for(const c in i){const h=i[c];this.setAttribute(c,h.clone(t))}const r=e.morphAttributes;for(const c in r){const h=[],u=r[c];for(let p=0,d=u.length;p0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=i.length;r(e.far-e.near)**2))&&(mp.copy(r).invert(),bs.copy(e.ray).applyMatrix4(mp),!(n.boundingBox!==null&&bs.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(e,t,bs)))}_computeIntersections(e,t,n){let i;const r=this.geometry,a=this.material,o=r.index,l=r.attributes.position,c=r.attributes.uv,h=r.attributes.uv1,u=r.attributes.normal,p=r.groups,d=r.drawRange;if(o!==null)if(Array.isArray(a))for(let m=0,f=p.length;mt.far?null:{distance:c,point:Eo.clone(),object:s}}function Co(s,e,t,n,i,r,a,o,l,c){s.getVertexPosition(o,_o),s.getVertexPosition(l,Mo),s.getVertexPosition(c,wo);const h=Fx(s,e,t,n,_o,Mo,wo,xp);if(h){const u=new P;vt.getBarycoord(xp,_o,Mo,wo,u),i&&(h.uv=vt.getInterpolatedAttribute(i,o,l,c,u,new he)),r&&(h.uv1=vt.getInterpolatedAttribute(r,o,l,c,u,new he)),a&&(h.normal=vt.getInterpolatedAttribute(a,o,l,c,u,new P),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));const p={a:o,b:l,c,normal:new P,materialIndex:0};vt.getNormal(_o,Mo,wo,p.normal),h.face=p,h.barycoord=u}return h}class Zi extends dt{constructor(e=1,t=1,n=1,i=1,r=1,a=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:n,widthSegments:i,heightSegments:r,depthSegments:a};const o=this;i=Math.floor(i),r=Math.floor(r),a=Math.floor(a);const l=[],c=[],h=[],u=[];let p=0,d=0;m("z","y","x",-1,-1,n,t,e,a,r,0),m("z","y","x",1,-1,n,t,-e,a,r,1),m("x","z","y",1,1,e,n,t,i,a,2),m("x","z","y",1,-1,e,n,-t,i,a,3),m("x","y","z",1,-1,e,t,n,i,r,4),m("x","y","z",-1,-1,e,t,-n,i,r,5),this.setIndex(l),this.setAttribute("position",new jt(c,3)),this.setAttribute("normal",new jt(h,3)),this.setAttribute("uv",new jt(u,2));function m(f,x,g,b,v,y,_,M,C,R,S){const E=y/C,L=_/R,A=y/2,I=_/2,w=M/2,z=C+1,G=R+1;let j=0,Y=0;const q=new P;for(let ie=0;ie0?1:-1,h.push(q.x,q.y,q.z),u.push($/C),u.push(1-ie/R),j+=1}}for(let ie=0;ie0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader,t.lights=this.lights,t.clipping=this.clipping;const n={};for(const i in this.extensions)this.extensions[i]===!0&&(n[i]=!0);return Object.keys(n).length>0&&(t.extensions=n),t}}class yp extends Et{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new De,this.projectionMatrix=new De,this.projectionMatrixInverse=new De,this.coordinateSystem=oi,this._reversedDepth=!1}get reversedDepth(){return this._reversedDepth}copy(e,t){return super.copy(e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this.coordinateSystem=e.coordinateSystem,this}getWorldDirection(e){return super.getWorldDirection(e).negate()}updateMatrixWorld(e){super.updateMatrixWorld(e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(e,t){super.updateWorldMatrix(e,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}const Yi=new P,bp=new he,_p=new he;class on extends yp{constructor(e=50,t=1,n=.1,i=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=e,this.zoom=1,this.near=n,this.far=i,this.focus=10,this.aspect=t,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=e.view===null?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this}setFocalLength(e){const t=.5*this.getFilmHeight()/e;this.fov=er*2*Math.atan(t),this.updateProjectionMatrix()}getFocalLength(){const e=Math.tan(ia*.5*this.fov);return .5*this.getFilmHeight()/e}getEffectiveFOV(){return er*2*Math.atan(Math.tan(ia*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(e,t,n){Yi.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),t.set(Yi.x,Yi.y).multiplyScalar(-e/Yi.z),Yi.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),n.set(Yi.x,Yi.y).multiplyScalar(-e/Yi.z)}getViewSize(e,t){return this.getViewBounds(e,bp,_p),t.subVectors(_p,bp)}setViewOffset(e,t,n,i,r,a){this.aspect=e/t,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=this.near;let t=e*Math.tan(ia*.5*this.fov)/this.zoom,n=2*t,i=this.aspect*n,r=-.5*i;const a=this.view;if(this.view!==null&&this.view.enabled){const l=a.fullWidth,c=a.fullHeight;r+=a.offsetX*i/l,t-=a.offsetY*n/c,i*=a.width/l,n*=a.height/c}const o=this.filmOffset;o!==0&&(r+=e*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,t,t-n,e,this.far,this.coordinateSystem,this.reversedDepth),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.fov=this.fov,t.object.zoom=this.zoom,t.object.near=this.near,t.object.far=this.far,t.object.focus=this.focus,t.object.aspect=this.aspect,this.view!==null&&(t.object.view=Object.assign({},this.view)),t.object.filmGauge=this.filmGauge,t.object.filmOffset=this.filmOffset,t}}const pr=-90,fr=1;class Wx extends Et{constructor(e,t,n){super(),this.type="CubeCamera",this.renderTarget=n,this.coordinateSystem=null,this.activeMipmapLevel=0;const i=new on(pr,fr,e,t);i.layers=this.layers,this.add(i);const r=new on(pr,fr,e,t);r.layers=this.layers,this.add(r);const a=new on(pr,fr,e,t);a.layers=this.layers,this.add(a);const o=new on(pr,fr,e,t);o.layers=this.layers,this.add(o);const l=new on(pr,fr,e,t);l.layers=this.layers,this.add(l);const c=new on(pr,fr,e,t);c.layers=this.layers,this.add(c)}updateCoordinateSystem(){const e=this.coordinateSystem,t=this.children.concat(),[n,i,r,a,o,l]=t;for(const c of t)this.remove(c);if(e===oi)n.up.set(0,1,0),n.lookAt(1,0,0),i.up.set(0,1,0),i.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),a.up.set(0,0,1),a.lookAt(0,-1,0),o.up.set(0,1,0),o.lookAt(0,0,1),l.up.set(0,1,0),l.lookAt(0,0,-1);else if(e===oo)n.up.set(0,-1,0),n.lookAt(-1,0,0),i.up.set(0,-1,0),i.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),a.up.set(0,0,-1),a.lookAt(0,-1,0),o.up.set(0,-1,0),o.lookAt(0,0,1),l.up.set(0,-1,0),l.lookAt(0,0,-1);else throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+e);for(const c of t)this.add(c),c.updateMatrixWorld()}update(e,t){this.parent===null&&this.updateMatrixWorld();const{renderTarget:n,activeMipmapLevel:i}=this;this.coordinateSystem!==e.coordinateSystem&&(this.coordinateSystem=e.coordinateSystem,this.updateCoordinateSystem());const[r,a,o,l,c,h]=this.children,u=e.getRenderTarget(),p=e.getActiveCubeFace(),d=e.getActiveMipmapLevel(),m=e.xr.enabled;e.xr.enabled=!1;const f=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,e.setRenderTarget(n,0,i),e.render(t,r),e.setRenderTarget(n,1,i),e.render(t,a),e.setRenderTarget(n,2,i),e.render(t,o),e.setRenderTarget(n,3,i),e.render(t,l),e.setRenderTarget(n,4,i),e.render(t,c),n.texture.generateMipmaps=f,e.setRenderTarget(n,5,i),e.render(t,h),e.setRenderTarget(u,p,d),e.xr.enabled=m,n.texture.needsPMREMUpdate=!0}}class Mp extends Ft{constructor(e=[],t=Ks,n,i,r,a,o,l,c,h){super(e,t,n,i,r,a,o,l,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}class Xx extends Cn{constructor(e=1,t={}){super(e,e,t),this.isWebGLCubeRenderTarget=!0;const n={width:e,height:e,depth:1},i=[n,n,n,n,n,n];this.texture=new Mp(i),this._setTextureOptions(t),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(e,t){this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:` +}`;class Lt extends Rn{constructor(e){super(),this.isShaderMaterial=!0,this.type="ShaderMaterial",this.defines={},this.uniforms={},this.uniformsGroups=[],this.vertexShader=Vx,this.fragmentShader=Gx,this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.forceSinglePass=!0,this.extensions={clipCullDistance:!1,multiDraw:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv1:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,e!==void 0&&this.setValues(e)}copy(e){return super.copy(e),this.fragmentShader=e.fragmentShader,this.vertexShader=e.vertexShader,this.uniforms=dr(e.uniforms),this.uniformsGroups=Hx(e.uniformsGroups),this.defines=Object.assign({},e.defines),this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.fog=e.fog,this.lights=e.lights,this.clipping=e.clipping,this.extensions=Object.assign({},e.extensions),this.glslVersion=e.glslVersion,this}toJSON(e){const t=super.toJSON(e);t.glslVersion=this.glslVersion,t.uniforms={};for(const i in this.uniforms){const a=this.uniforms[i].value;a&&a.isTexture?t.uniforms[i]={type:"t",value:a.toJSON(e).uuid}:a&&a.isColor?t.uniforms[i]={type:"c",value:a.getHex()}:a&&a.isVector2?t.uniforms[i]={type:"v2",value:a.toArray()}:a&&a.isVector3?t.uniforms[i]={type:"v3",value:a.toArray()}:a&&a.isVector4?t.uniforms[i]={type:"v4",value:a.toArray()}:a&&a.isMatrix3?t.uniforms[i]={type:"m3",value:a.toArray()}:a&&a.isMatrix4?t.uniforms[i]={type:"m4",value:a.toArray()}:t.uniforms[i]={value:a}}Object.keys(this.defines).length>0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader,t.lights=this.lights,t.clipping=this.clipping;const n={};for(const i in this.extensions)this.extensions[i]===!0&&(n[i]=!0);return Object.keys(n).length>0&&(t.extensions=n),t}}class bp extends Et{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new De,this.projectionMatrix=new De,this.projectionMatrixInverse=new De,this.coordinateSystem=oi,this._reversedDepth=!1}get reversedDepth(){return this._reversedDepth}copy(e,t){return super.copy(e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this.coordinateSystem=e.coordinateSystem,this}getWorldDirection(e){return super.getWorldDirection(e).negate()}updateMatrixWorld(e){super.updateMatrixWorld(e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(e,t){super.updateWorldMatrix(e,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}const Yi=new P,yp=new he,_p=new he;class on extends bp{constructor(e=50,t=1,n=.1,i=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=e,this.zoom=1,this.near=n,this.far=i,this.focus=10,this.aspect=t,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=e.view===null?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this}setFocalLength(e){const t=.5*this.getFilmHeight()/e;this.fov=er*2*Math.atan(t),this.updateProjectionMatrix()}getFocalLength(){const e=Math.tan(ia*.5*this.fov);return .5*this.getFilmHeight()/e}getEffectiveFOV(){return er*2*Math.atan(Math.tan(ia*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(e,t,n){Yi.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),t.set(Yi.x,Yi.y).multiplyScalar(-e/Yi.z),Yi.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),n.set(Yi.x,Yi.y).multiplyScalar(-e/Yi.z)}getViewSize(e,t){return this.getViewBounds(e,yp,_p),t.subVectors(_p,yp)}setViewOffset(e,t,n,i,r,a){this.aspect=e/t,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=this.near;let t=e*Math.tan(ia*.5*this.fov)/this.zoom,n=2*t,i=this.aspect*n,r=-.5*i;const a=this.view;if(this.view!==null&&this.view.enabled){const l=a.fullWidth,c=a.fullHeight;r+=a.offsetX*i/l,t-=a.offsetY*n/c,i*=a.width/l,n*=a.height/c}const o=this.filmOffset;o!==0&&(r+=e*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,t,t-n,e,this.far,this.coordinateSystem,this.reversedDepth),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.fov=this.fov,t.object.zoom=this.zoom,t.object.near=this.near,t.object.far=this.far,t.object.focus=this.focus,t.object.aspect=this.aspect,this.view!==null&&(t.object.view=Object.assign({},this.view)),t.object.filmGauge=this.filmGauge,t.object.filmOffset=this.filmOffset,t}}const pr=-90,fr=1;class Wx extends Et{constructor(e,t,n){super(),this.type="CubeCamera",this.renderTarget=n,this.coordinateSystem=null,this.activeMipmapLevel=0;const i=new on(pr,fr,e,t);i.layers=this.layers,this.add(i);const r=new on(pr,fr,e,t);r.layers=this.layers,this.add(r);const a=new on(pr,fr,e,t);a.layers=this.layers,this.add(a);const o=new on(pr,fr,e,t);o.layers=this.layers,this.add(o);const l=new on(pr,fr,e,t);l.layers=this.layers,this.add(l);const c=new on(pr,fr,e,t);c.layers=this.layers,this.add(c)}updateCoordinateSystem(){const e=this.coordinateSystem,t=this.children.concat(),[n,i,r,a,o,l]=t;for(const c of t)this.remove(c);if(e===oi)n.up.set(0,1,0),n.lookAt(1,0,0),i.up.set(0,1,0),i.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),a.up.set(0,0,1),a.lookAt(0,-1,0),o.up.set(0,1,0),o.lookAt(0,0,1),l.up.set(0,1,0),l.lookAt(0,0,-1);else if(e===oo)n.up.set(0,-1,0),n.lookAt(-1,0,0),i.up.set(0,-1,0),i.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),a.up.set(0,0,-1),a.lookAt(0,-1,0),o.up.set(0,-1,0),o.lookAt(0,0,1),l.up.set(0,-1,0),l.lookAt(0,0,-1);else throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+e);for(const c of t)this.add(c),c.updateMatrixWorld()}update(e,t){this.parent===null&&this.updateMatrixWorld();const{renderTarget:n,activeMipmapLevel:i}=this;this.coordinateSystem!==e.coordinateSystem&&(this.coordinateSystem=e.coordinateSystem,this.updateCoordinateSystem());const[r,a,o,l,c,h]=this.children,u=e.getRenderTarget(),p=e.getActiveCubeFace(),d=e.getActiveMipmapLevel(),m=e.xr.enabled;e.xr.enabled=!1;const f=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,e.setRenderTarget(n,0,i),e.render(t,r),e.setRenderTarget(n,1,i),e.render(t,a),e.setRenderTarget(n,2,i),e.render(t,o),e.setRenderTarget(n,3,i),e.render(t,l),e.setRenderTarget(n,4,i),e.render(t,c),n.texture.generateMipmaps=f,e.setRenderTarget(n,5,i),e.render(t,h),e.setRenderTarget(u,p,d),e.xr.enabled=m,n.texture.needsPMREMUpdate=!0}}class Mp extends Ft{constructor(e=[],t=Ks,n,i,r,a,o,l,c,h){super(e,t,n,i,r,a,o,l,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}class Xx extends Tn{constructor(e=1,t={}){super(e,e,t),this.isWebGLCubeRenderTarget=!0;const n={width:e,height:e,depth:1},i=[n,n,n,n,n,n];this.texture=new Mp(i),this._setTextureOptions(t),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(e,t){this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:` varying vec3 vWorldDirection; @@ -38,7 +38,7 @@ gl_FragColor = texture2D( tEquirect, sampleUV ); } - `},i=new Zi(5,5,5),r=new Lt({name:"CubemapFromEquirect",uniforms:dr(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:sn,blending:St});r.uniforms.tEquirect.value=t;const a=new rt(i,r),o=t.minFilter;return t.minFilter===ai&&(t.minFilter=Pt),new Wx(1,10,this).update(e,a),t.minFilter=o,a.geometry.dispose(),a.material.dispose(),this}clear(e,t=!0,n=!0,i=!0){const r=e.getRenderTarget();for(let a=0;a<6;a++)e.setRenderTarget(this,a),e.clear(t,n,i);e.setRenderTarget(r)}}class ln extends Et{constructor(){super(),this.isGroup=!0,this.type="Group"}}const jx={type:"move"};class Mh{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new ln,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new ln,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new P,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new P),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new ln,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new P,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new P),this._grip}dispatchEvent(e){return this._targetRay!==null&&this._targetRay.dispatchEvent(e),this._grip!==null&&this._grip.dispatchEvent(e),this._hand!==null&&this._hand.dispatchEvent(e),this}connect(e){if(e&&e.hand){const t=this._hand;if(t)for(const n of e.hand.values())this._getHandJoint(t,n)}return this.dispatchEvent({type:"connected",data:e}),this}disconnect(e){return this.dispatchEvent({type:"disconnected",data:e}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(e,t,n){let i=null,r=null,a=null;const o=this._targetRay,l=this._grip,c=this._hand;if(e&&t.session.visibilityState!=="visible-blurred"){if(c&&e.hand){a=!0;for(const f of e.hand.values()){const x=t.getJointPose(f,n),g=this._getHandJoint(c,f);x!==null&&(g.matrix.fromArray(x.transform.matrix),g.matrix.decompose(g.position,g.rotation,g.scale),g.matrixWorldNeedsUpdate=!0,g.jointRadius=x.radius),g.visible=x!==null}const h=c.joints["index-finger-tip"],u=c.joints["thumb-tip"],p=h.position.distanceTo(u.position),d=.02,m=.005;c.inputState.pinching&&p>d+m?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!c.inputState.pinching&&p<=d-m&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else l!==null&&e.gripSpace&&(r=t.getPose(e.gripSpace,n),r!==null&&(l.matrix.fromArray(r.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),l.matrixWorldNeedsUpdate=!0,r.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(r.linearVelocity)):l.hasLinearVelocity=!1,r.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(r.angularVelocity)):l.hasAngularVelocity=!1));o!==null&&(i=t.getPose(e.targetRaySpace,n),i===null&&r!==null&&(i=r),i!==null&&(o.matrix.fromArray(i.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,i.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(i.linearVelocity)):o.hasLinearVelocity=!1,i.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(i.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(jx)))}return o!==null&&(o.visible=i!==null),l!==null&&(l.visible=r!==null),c!==null&&(c.visible=a!==null),this}_getHandJoint(e,t){if(e.joints[t.jointName]===void 0){const n=new ln;n.matrixAutoUpdate=!1,n.visible=!1,e.joints[t.jointName]=n,e.add(n)}return e.joints[t.jointName]}}class wp extends Et{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new Pn,this.environmentIntensity=1,this.environmentRotation=new Pn,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(e,t){return super.copy(e,t),e.background!==null&&(this.background=e.background.clone()),e.environment!==null&&(this.environment=e.environment.clone()),e.fog!==null&&(this.fog=e.fog.clone()),this.backgroundBlurriness=e.backgroundBlurriness,this.backgroundIntensity=e.backgroundIntensity,this.backgroundRotation.copy(e.backgroundRotation),this.environmentIntensity=e.environmentIntensity,this.environmentRotation.copy(e.environmentRotation),e.overrideMaterial!==null&&(this.overrideMaterial=e.overrideMaterial.clone()),this.matrixAutoUpdate=e.matrixAutoUpdate,this}toJSON(e){const t=super.toJSON(e);return this.fog!==null&&(t.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(t.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(t.object.backgroundIntensity=this.backgroundIntensity),t.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(t.object.environmentIntensity=this.environmentIntensity),t.object.environmentRotation=this.environmentRotation.toArray(),t}}class wh{constructor(e,t){this.isInterleavedBuffer=!0,this.array=e,this.stride=t,this.count=e!==void 0?e.length/t:0,this.usage=Jc,this.updateRanges=[],this.version=0,this.uuid=On()}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.usage=e.usage,this}copyAt(e,t,n){e*=this.stride,n*=t.stride;for(let i=0,r=this.stride;ie.far||t.push({distance:l,point:ca.clone(),uv:vt.getInterpolation(ca,Co,ua,Ao,Tp,Sh,Cp,new he),face:null,object:this})}copy(e,t){return super.copy(e,t),e.center!==void 0&&this.center.copy(e.center),this.material=e.material,this}}function Po(s,e,t,n,i,r){yr.subVectors(s,t).addScalar(.5).multiply(n),i!==void 0?(ha.x=r*yr.x-i*yr.y,ha.y=i*yr.x+r*yr.y):ha.copy(yr),s.copy(e),s.x+=ha.x,s.y+=ha.y,s.applyMatrix4(Ep)}const Ap=new P,Pp=new tt,Rp=new tt,qx=new P,Lp=new De,Ro=new P,Th=new li,Dp=new De,Ch=new Xi;class Zx extends rt{constructor(e,t){super(e,t),this.isSkinnedMesh=!0,this.type="SkinnedMesh",this.bindMode=Bd,this.bindMatrix=new De,this.bindMatrixInverse=new De,this.boundingBox=null,this.boundingSphere=null}computeBoundingBox(){const e=this.geometry;this.boundingBox===null&&(this.boundingBox=new gt),this.boundingBox.makeEmpty();const t=e.getAttribute("position");for(let n=0;n1?null:t.copy(e.start).addScaledVector(n,r)}intersectsLine(e){const t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){const n=t||Jx.getNormalMatrix(e),i=this.coplanarPoint(Ph).applyMatrix4(e),r=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(r),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}}const _s=new li,Qx=new he(.5,.5),Io=new P;class Rh{constructor(e=new Dt,t=new Dt,n=new Dt,i=new Dt,r=new Dt,a=new Dt){this.planes=[e,t,n,i,r,a]}set(e,t,n,i,r,a){const o=this.planes;return o[0].copy(e),o[1].copy(t),o[2].copy(n),o[3].copy(i),o[4].copy(r),o[5].copy(a),this}copy(e){const t=this.planes;for(let n=0;n<6;n++)t[n].copy(e.planes[n]);return this}setFromProjectionMatrix(e,t=oi,n=!1){const i=this.planes,r=e.elements,a=r[0],o=r[1],l=r[2],c=r[3],h=r[4],u=r[5],p=r[6],d=r[7],m=r[8],f=r[9],x=r[10],g=r[11],y=r[12],v=r[13],b=r[14],_=r[15];if(i[0].setComponents(c-a,d-h,g-m,_-y).normalize(),i[1].setComponents(c+a,d+h,g+m,_+y).normalize(),i[2].setComponents(c+o,d+u,g+f,_+v).normalize(),i[3].setComponents(c-o,d-u,g-f,_-v).normalize(),n)i[4].setComponents(l,p,x,b).normalize(),i[5].setComponents(c-l,d-p,g-x,_-b).normalize();else if(i[4].setComponents(c-l,d-p,g-x,_-b).normalize(),t===oi)i[5].setComponents(c+l,d+p,g+x,_+b).normalize();else if(t===oo)i[5].setComponents(l,p,x,b).normalize();else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+t);return this}intersectsObject(e){if(e.boundingSphere!==void 0)e.boundingSphere===null&&e.computeBoundingSphere(),_s.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{const t=e.geometry;t.boundingSphere===null&&t.computeBoundingSphere(),_s.copy(t.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(_s)}intersectsSprite(e){_s.center.set(0,0,0);const t=Qx.distanceTo(e.center);return _s.radius=.7071067811865476+t,_s.applyMatrix4(e.matrixWorld),this.intersectsSphere(_s)}intersectsSphere(e){const t=this.planes,n=e.center,i=-e.radius;for(let r=0;r<6;r++)if(t[r].distanceToPoint(n)0?e.max.x:e.min.x,Io.y=i.normal.y>0?e.max.y:e.min.y,Io.z=i.normal.z>0?e.max.z:e.min.z,i.distanceToPoint(Io)<0)return!1}return!0}containsPoint(e){const t=this.planes;for(let n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}class Ms extends Rn{constructor(e){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new Fe(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this.fog=e.fog,this}}const No=new P,Bo=new P,Up=new De,fa=new Xi,ko=new li,Lh=new P,Op=new P;class $i extends Et{constructor(e=new dt,t=new Ms){super(),this.isLine=!0,this.type="Line",this.geometry=e,this.material=t,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}computeLineDistances(){const e=this.geometry;if(e.index===null){const t=e.attributes.position,n=[0];for(let i=1,r=t.count;i0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=i.length;rn)return;Lh.applyMatrix4(s.matrixWorld);const c=e.ray.origin.distanceTo(Lh);if(!(ce.far))return{distance:c,point:Op.clone().applyMatrix4(s.matrixWorld),index:a,face:null,faceIndex:null,barycoord:null,object:s}}const zp=new P,Fp=new P;class Hp extends $i{constructor(e,t){super(e,t),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const e=this.geometry;if(e.index===null){const t=e.attributes.position,n=[];for(let i=0,r=t.count;i0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=i.length;ri.far)return;r.push({distance:c,distanceToRay:Math.sqrt(o),point:l,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}class t1 extends Ft{constructor(e,t,n,i,r,a,o,l,c){super(e,t,n,i,r,a,o,l,c),this.isCanvasTexture=!0,this.needsUpdate=!0}}class Fo extends Ft{constructor(e,t,n=ps,i,r,a,o=Xt,l=Xt,c,h=Jr,u=1){if(h!==Jr&&h!==ms)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");const p={width:e,height:t,depth:u};super(p,i,r,a,o,l,h,n,c),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(e){return super.copy(e),this.source=new nh(Object.assign({},e.image)),this.compareFunction=e.compareFunction,this}toJSON(e){const t=super.toJSON(e);return this.compareFunction!==null&&(t.compareFunction=this.compareFunction),t}}class jp extends Ft{constructor(e=null){super(),this.sourceTexture=e,this.isExternalTexture=!0}copy(e){return super.copy(e),this.sourceTexture=e.sourceTexture,this}}class ci{constructor(){this.type="Curve",this.arcLengthDivisions=200,this.needsUpdate=!1,this.cacheArcLengths=null}getPoint(){He("Curve: .getPoint() not implemented.")}getPointAt(e,t){const n=this.getUtoTmapping(e);return this.getPoint(n,t)}getPoints(e=5){const t=[];for(let n=0;n<=e;n++)t.push(this.getPoint(n/e));return t}getSpacedPoints(e=5){const t=[];for(let n=0;n<=e;n++)t.push(this.getPointAt(n/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const t=[];let n,i=this.getPoint(0),r=0;t.push(0);for(let a=1;a<=e;a++)n=this.getPoint(a/e),r+=n.distanceTo(i),t.push(r),i=n;return this.cacheArcLengths=t,t}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t=null){const n=this.getLengths();let i=0;const r=n.length;let a;t?a=t:a=e*n[r-1];let o=0,l=r-1,c;for(;o<=l;)if(i=Math.floor(o+(l-o)/2),c=n[i]-a,c<0)o=i+1;else if(c>0)l=i-1;else{l=i;break}if(i=l,n[i]===a)return i/(r-1);const h=n[i],p=n[i+1]-h,d=(a-h)/p;return(i+d)/(r-1)}getTangent(e,t){let i=e-1e-4,r=e+1e-4;i<0&&(i=0),r>1&&(r=1);const a=this.getPoint(i),o=this.getPoint(r),l=t||(a.isVector2?new he:new P);return l.copy(o).sub(a).normalize(),l}getTangentAt(e,t){const n=this.getUtoTmapping(e);return this.getTangent(n,t)}computeFrenetFrames(e,t=!1){const n=new P,i=[],r=[],a=[],o=new P,l=new De;for(let d=0;d<=e;d++){const m=d/e;i[d]=this.getTangentAt(m,new P)}r[0]=new P,a[0]=new P;let c=Number.MAX_VALUE;const h=Math.abs(i[0].x),u=Math.abs(i[0].y),p=Math.abs(i[0].z);h<=c&&(c=h,n.set(1,0,0)),u<=c&&(c=u,n.set(0,1,0)),p<=c&&n.set(0,0,1),o.crossVectors(i[0],n).normalize(),r[0].crossVectors(i[0],o),a[0].crossVectors(i[0],r[0]);for(let d=1;d<=e;d++){if(r[d]=r[d-1].clone(),a[d]=a[d-1].clone(),o.crossVectors(i[d-1],i[d]),o.length()>Number.EPSILON){o.normalize();const m=Math.acos(qe(i[d-1].dot(i[d]),-1,1));r[d].applyMatrix4(l.makeRotationAxis(o,m))}a[d].crossVectors(i[d],r[d])}if(t===!0){let d=Math.acos(qe(r[0].dot(r[e]),-1,1));d/=e,i[0].dot(o.crossVectors(r[0],r[e]))>0&&(d=-d);for(let m=1;m<=e;m++)r[m].applyMatrix4(l.makeRotationAxis(i[m],d*m)),a[m].crossVectors(i[m],r[m])}return{tangents:i,normals:r,binormals:a}}clone(){return new this.constructor().copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}toJSON(){const e={metadata:{version:4.7,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e}fromJSON(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}class Ih extends ci{constructor(e=0,t=0,n=1,i=1,r=0,a=Math.PI*2,o=!1,l=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=e,this.aY=t,this.xRadius=n,this.yRadius=i,this.aStartAngle=r,this.aEndAngle=a,this.aClockwise=o,this.aRotation=l}getPoint(e,t=new he){const n=t,i=Math.PI*2;let r=this.aEndAngle-this.aStartAngle;const a=Math.abs(r)i;)r-=i;r0?0:(Math.floor(Math.abs(o)/r)+1)*r:l===0&&o===r-1&&(o=r-2,l=1);let c,h;this.closed||o>0?c=i[(o-1)%r]:(Ho.subVectors(i[0],i[1]).add(i[0]),c=Ho);const u=i[o%r],p=i[(o+1)%r];if(this.closed||o+2i.length-2?i.length-1:a+1],u=i[a>i.length-3?i.length-1:a+2];return n.set(qp(o,l.x,c.x,h.x,u.x),qp(o,l.y,c.y,h.y,u.y)),n}copy(e){super.copy(e),this.points=[];for(let t=0,n=e.points.length;t=n){const a=i[r]-n,o=this.curves[r],l=o.getLength(),c=l===0?0:1-a/l;return o.getPointAt(c,t)}r++}return null}getLength(){const e=this.getCurveLengths();return e[e.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const e=[];let t=0;for(let n=0,i=this.curves.length;n1&&!t[t.length-1].equals(t[0])&&t.push(t[0]),t}copy(e){super.copy(e),this.curves=[];for(let t=0,n=e.curves.length;t0){const u=c.getPoint(0);u.equals(this.currentPoint)||this.lineTo(u.x,u.y)}this.curves.push(c);const h=c.getPoint(1);return this.currentPoint.copy(h),this}copy(e){return super.copy(e),this.currentPoint.copy(e.currentPoint),this}toJSON(){const e=super.toJSON();return e.currentPoint=this.currentPoint.toArray(),e}fromJSON(e){return super.fromJSON(e),this.currentPoint.fromArray(e.currentPoint),this}}class Qp extends Jp{constructor(e){super(e),this.uuid=On(),this.type="Shape",this.holes=[]}getPointsHoles(e){const t=[];for(let n=0,i=this.holes.length;n80*t){o=s[0],l=s[1];let h=o,u=l;for(let p=t;ph&&(h=d),m>u&&(u=m)}c=Math.max(h-o,u-l),c=c!==0?32767/c:0}return xa(r,a,t,o,l,c,0),a}function ef(s,e,t,n,i){let r;if(i===L1(s,e,t,n)>0)for(let a=e;a=e;a-=n)r=rf(a/n|0,s[a],s[a+1],r);return r&&_r(r,r.next)&&(ba(r),r=r.next),r}function ws(s,e){if(!s)return s;e||(e=s);let t=s,n;do if(n=!1,!t.steiner&&(_r(t,t.next)||Tt(t.prev,t,t.next)===0)){if(ba(t),t=e=t.prev,t===t.next)break;n=!0}else t=t.next;while(n||t!==e);return e}function xa(s,e,t,n,i,r,a){if(!s)return;!a&&r&&E1(s,n,i,r);let o=s;for(;s.prev!==s.next;){const l=s.prev,c=s.next;if(r?x1(s,n,i,r):g1(s)){e.push(l.i,s.i,c.i),ba(s),s=c.next,o=c.next;continue}if(s=c,s===o){a?a===1?(s=v1(ws(s),e),xa(s,e,t,n,i,r,2)):a===2&&y1(s,e,t,n,i,r):xa(ws(s),e,t,n,i,r,1);break}}}function g1(s){const e=s.prev,t=s,n=s.next;if(Tt(e,t,n)>=0)return!1;const i=e.x,r=t.x,a=n.x,o=e.y,l=t.y,c=n.y,h=Math.min(i,r,a),u=Math.min(o,l,c),p=Math.max(i,r,a),d=Math.max(o,l,c);let m=n.next;for(;m!==e;){if(m.x>=h&&m.x<=p&&m.y>=u&&m.y<=d&&va(i,o,r,l,a,c,m.x,m.y)&&Tt(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function x1(s,e,t,n){const i=s.prev,r=s,a=s.next;if(Tt(i,r,a)>=0)return!1;const o=i.x,l=r.x,c=a.x,h=i.y,u=r.y,p=a.y,d=Math.min(o,l,c),m=Math.min(h,u,p),f=Math.max(o,l,c),x=Math.max(h,u,p),g=zh(d,m,e,t,n),y=zh(f,x,e,t,n);let v=s.prevZ,b=s.nextZ;for(;v&&v.z>=g&&b&&b.z<=y;){if(v.x>=d&&v.x<=f&&v.y>=m&&v.y<=x&&v!==i&&v!==a&&va(o,h,l,u,c,p,v.x,v.y)&&Tt(v.prev,v,v.next)>=0||(v=v.prevZ,b.x>=d&&b.x<=f&&b.y>=m&&b.y<=x&&b!==i&&b!==a&&va(o,h,l,u,c,p,b.x,b.y)&&Tt(b.prev,b,b.next)>=0))return!1;b=b.nextZ}for(;v&&v.z>=g;){if(v.x>=d&&v.x<=f&&v.y>=m&&v.y<=x&&v!==i&&v!==a&&va(o,h,l,u,c,p,v.x,v.y)&&Tt(v.prev,v,v.next)>=0)return!1;v=v.prevZ}for(;b&&b.z<=y;){if(b.x>=d&&b.x<=f&&b.y>=m&&b.y<=x&&b!==i&&b!==a&&va(o,h,l,u,c,p,b.x,b.y)&&Tt(b.prev,b,b.next)>=0)return!1;b=b.nextZ}return!0}function v1(s,e){let t=s;do{const n=t.prev,i=t.next.next;!_r(n,i)&&nf(n,t,t.next,i)&&ya(n,i)&&ya(i,n)&&(e.push(n.i,t.i,i.i),ba(t),ba(t.next),t=s=i),t=t.next}while(t!==s);return ws(t)}function y1(s,e,t,n,i,r){let a=s;do{let o=a.next.next;for(;o!==a.prev;){if(a.i!==o.i&&A1(a,o)){let l=sf(a,o);a=ws(a,a.next),l=ws(l,l.next),xa(a,e,t,n,i,r,0),xa(l,e,t,n,i,r,0);return}o=o.next}a=a.next}while(a!==s)}function b1(s,e,t,n){const i=[];for(let r=0,a=e.length;r=t.next.y&&t.next.y!==t.y){const u=t.x+(i-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(u<=n&&u>r&&(r=u,a=t.x=t.x&&t.x>=l&&n!==t.x&&tf(ia.x||t.x===a.x&&S1(a,t)))&&(a=t,h=u)}t=t.next}while(t!==o);return a}function S1(s,e){return Tt(s.prev,s,e.prev)<0&&Tt(e.next,s,s.next)<0}function E1(s,e,t,n){let i=s;do i.z===0&&(i.z=zh(i.x,i.y,e,t,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==s);i.prevZ.nextZ=null,i.prevZ=null,T1(i)}function T1(s){let e,t=1;do{let n=s,i;s=null;let r=null;for(e=0;n;){e++;let a=n,o=0;for(let c=0;c0||l>0&&a;)o!==0&&(l===0||!a||n.z<=a.z)?(i=n,n=n.nextZ,o--):(i=a,a=a.nextZ,l--),r?r.nextZ=i:s=i,i.prevZ=r,r=i;n=a}r.nextZ=null,t*=2}while(e>1);return s}function zh(s,e,t,n,i){return s=(s-t)*i|0,e=(e-n)*i|0,s=(s|s<<8)&16711935,s=(s|s<<4)&252645135,s=(s|s<<2)&858993459,s=(s|s<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,s|e<<1}function C1(s){let e=s,t=s;do(e.x=(s-a)*(r-o)&&(s-a)*(n-o)>=(t-a)*(e-o)&&(t-a)*(r-o)>=(i-a)*(n-o)}function va(s,e,t,n,i,r,a,o){return!(s===a&&e===o)&&tf(s,e,t,n,i,r,a,o)}function A1(s,e){return s.next.i!==e.i&&s.prev.i!==e.i&&!P1(s,e)&&(ya(s,e)&&ya(e,s)&&R1(s,e)&&(Tt(s.prev,s,e.prev)||Tt(s,e.prev,e))||_r(s,e)&&Tt(s.prev,s,s.next)>0&&Tt(e.prev,e,e.next)>0)}function Tt(s,e,t){return(e.y-s.y)*(t.x-e.x)-(e.x-s.x)*(t.y-e.y)}function _r(s,e){return s.x===e.x&&s.y===e.y}function nf(s,e,t,n){const i=Go(Tt(s,e,t)),r=Go(Tt(s,e,n)),a=Go(Tt(t,n,s)),o=Go(Tt(t,n,e));return!!(i!==r&&a!==o||i===0&&Vo(s,t,e)||r===0&&Vo(s,n,e)||a===0&&Vo(t,s,n)||o===0&&Vo(t,e,n))}function Vo(s,e,t){return e.x<=Math.max(s.x,t.x)&&e.x>=Math.min(s.x,t.x)&&e.y<=Math.max(s.y,t.y)&&e.y>=Math.min(s.y,t.y)}function Go(s){return s>0?1:s<0?-1:0}function P1(s,e){let t=s;do{if(t.i!==s.i&&t.next.i!==s.i&&t.i!==e.i&&t.next.i!==e.i&&nf(t,t.next,s,e))return!0;t=t.next}while(t!==s);return!1}function ya(s,e){return Tt(s.prev,s,s.next)<0?Tt(s,e,s.next)>=0&&Tt(s,s.prev,e)>=0:Tt(s,e,s.prev)<0||Tt(s,s.next,e)<0}function R1(s,e){let t=s,n=!1;const i=(s.x+e.x)/2,r=(s.y+e.y)/2;do t.y>r!=t.next.y>r&&t.next.y!==t.y&&i<(t.next.x-t.x)*(r-t.y)/(t.next.y-t.y)+t.x&&(n=!n),t=t.next;while(t!==s);return n}function sf(s,e){const t=Fh(s.i,s.x,s.y),n=Fh(e.i,e.x,e.y),i=s.next,r=e.prev;return s.next=e,e.prev=s,t.next=i,i.prev=t,n.next=t,t.prev=n,r.next=n,n.prev=r,n}function rf(s,e,t,n){const i=Fh(s,e,t);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function ba(s){s.next.prev=s.prev,s.prev.next=s.next,s.prevZ&&(s.prevZ.nextZ=s.nextZ),s.nextZ&&(s.nextZ.prevZ=s.prevZ)}function Fh(s,e,t){return{i:s,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function L1(s,e,t,n){let i=0;for(let r=e,a=t-n;r2&&s[e-1].equals(s[0])&&s.pop()}function of(s,e){for(let t=0;tNumber.EPSILON){const K=Math.sqrt(D),le=Math.sqrt(X*X+B*B),te=N.x-J/K,Ce=N.y+ee/K,be=V.x-B/le,Re=V.y+X/le,Ie=((be-te)*B-(Re-Ce)*X)/(ee*B-J*X);U=te+ee*Ie-C.x,k=Ce+J*Ie-C.y;const ue=U*U+k*k;if(ue<=2)return new he(U,k);F=Math.sqrt(ue/2)}else{let K=!1;ee>Number.EPSILON?X>Number.EPSILON&&(K=!0):ee<-Number.EPSILON?X<-Number.EPSILON&&(K=!0):Math.sign(J)===Math.sign(B)&&(K=!0),K?(U=-J,k=ee,F=Math.sqrt(D)):(U=ee,k=J,F=Math.sqrt(D/2))}return new he(U/F,k/F)}const q=[];for(let C=0,N=z.length,V=N-1,U=C+1;C=0;C--){const N=C/x,V=d*Math.cos(N*Math.PI/2),U=m*Math.sin(N*Math.PI/2)+f;for(let k=0,F=z.length;k=0;){const U=V;let k=V-1;k<0&&(k=C.length-1);for(let F=0,ee=h+x*2;F0)&&d.push(v,b,M),(g!==n-1||l0!=e>0&&this.version++,this._anisotropy=e}get clearcoat(){return this._clearcoat}set clearcoat(e){this._clearcoat>0!=e>0&&this.version++,this._clearcoat=e}get iridescence(){return this._iridescence}set iridescence(e){this._iridescence>0!=e>0&&this.version++,this._iridescence=e}get dispersion(){return this._dispersion}set dispersion(e){this._dispersion>0!=e>0&&this.version++,this._dispersion=e}get sheen(){return this._sheen}set sheen(e){this._sheen>0!=e>0&&this.version++,this._sheen=e}get transmission(){return this._transmission}set transmission(e){this._transmission>0!=e>0&&this.version++,this._transmission=e}copy(e){return super.copy(e),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=e.anisotropy,this.anisotropyRotation=e.anisotropyRotation,this.anisotropyMap=e.anisotropyMap,this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.dispersion=e.dispersion,this.ior=e.ior,this.iridescence=e.iridescence,this.iridescenceMap=e.iridescenceMap,this.iridescenceIOR=e.iridescenceIOR,this.iridescenceThicknessRange=[...e.iridescenceThicknessRange],this.iridescenceThicknessMap=e.iridescenceThicknessMap,this.sheen=e.sheen,this.sheenColor.copy(e.sheenColor),this.sheenColorMap=e.sheenColorMap,this.sheenRoughness=e.sheenRoughness,this.sheenRoughnessMap=e.sheenRoughnessMap,this.transmission=e.transmission,this.transmissionMap=e.transmissionMap,this.thickness=e.thickness,this.thicknessMap=e.thicknessMap,this.attenuationDistance=e.attenuationDistance,this.attenuationColor.copy(e.attenuationColor),this.specularIntensity=e.specularIntensity,this.specularIntensityMap=e.specularIntensityMap,this.specularColor.copy(e.specularColor),this.specularColorMap=e.specularColorMap,this}}class lf extends Rn{constructor(e){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ro,this.normalScale=new he(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.flatShading=e.flatShading,this}}class k1 extends Rn{constructor(e){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new Fe(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Fe(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ro,this.normalScale=new he(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Pn,this.combine=pc,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class U1 extends Rn{constructor(e){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=qg,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}class O1 extends Rn{constructor(e){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(e)}copy(e){return super.copy(e),this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}function Wo(s,e){return!s||s.constructor===e?s:typeof e.BYTES_PER_ELEMENT=="number"?new e(s):Array.prototype.slice.call(s)}function z1(s){return ArrayBuffer.isView(s)&&!(s instanceof DataView)}function F1(s){function e(i,r){return s[i]-s[r]}const t=s.length,n=new Array(t);for(let i=0;i!==t;++i)n[i]=i;return n.sort(e),n}function cf(s,e,t){const n=s.length,i=new s.constructor(n);for(let r=0,a=0;a!==n;++r){const o=t[r]*e;for(let l=0;l!==e;++l)i[a++]=s[o+l]}return i}function hf(s,e,t,n){let i=1,r=s[0];for(;r!==void 0&&r[n]===void 0;)r=s[i++];if(r===void 0)return;let a=r[n];if(a!==void 0)if(Array.isArray(a))do a=r[n],a!==void 0&&(e.push(r.time),t.push(...a)),r=s[i++];while(r!==void 0);else if(a.toArray!==void 0)do a=r[n],a!==void 0&&(e.push(r.time),a.toArray(t,t.length)),r=s[i++];while(r!==void 0);else do a=r[n],a!==void 0&&(e.push(r.time),t.push(a)),r=s[i++];while(r!==void 0)}class _a{constructor(e,t,n,i){this.parameterPositions=e,this._cachedIndex=0,this.resultBuffer=i!==void 0?i:new t.constructor(n),this.sampleValues=t,this.valueSize=n,this.settings=null,this.DefaultSettings_={}}evaluate(e){const t=this.parameterPositions;let n=this._cachedIndex,i=t[n],r=t[n-1];e:{t:{let a;n:{i:if(!(e=r)){const o=t[1];e=r)break t}a=n,n=0;break n}break e}for(;n>>1;et;)--a;if(++a,r!==0||a!==i){r>=a&&(a=Math.max(a,1),r=a-1);const o=this.getValueSize();this.times=n.slice(r,a),this.values=this.values.slice(r*o,a*o)}return this}validate(){let e=!0;const t=this.getValueSize();t-Math.floor(t)!==0&&(Qe("KeyframeTrack: Invalid value size in track.",this),e=!1);const n=this.times,i=this.values,r=n.length;r===0&&(Qe("KeyframeTrack: Track is empty.",this),e=!1);let a=null;for(let o=0;o!==r;o++){const l=n[o];if(typeof l=="number"&&isNaN(l)){Qe("KeyframeTrack: Time is not a valid number.",this,o,l),e=!1;break}if(a!==null&&a>l){Qe("KeyframeTrack: Out of order keys.",this,o,l,a),e=!1;break}a=l}if(i!==void 0&&z1(i))for(let o=0,l=i.length;o!==l;++o){const c=i[o];if(isNaN(c)){Qe("KeyframeTrack: Value is not a valid number.",this,o,c),e=!1;break}}return e}optimize(){const e=this.times.slice(),t=this.values.slice(),n=this.getValueSize(),i=this.getInterpolation()===$c,r=e.length-1;let a=1;for(let o=1;o0){e[a]=e[r];for(let o=r*n,l=a*n,c=0;c!==n;++c)t[l+c]=t[o+c];++a}return a!==e.length?(this.times=e.slice(0,a),this.values=t.slice(0,a*n)):(this.times=e,this.values=t),this}clone(){const e=this.times.slice(),t=this.values.slice(),n=this.constructor,i=new n(this.name,e,t);return i.createInterpolant=this.createInterpolant,i}}ti.prototype.ValueTypeName="",ti.prototype.TimeBufferType=Float32Array,ti.prototype.ValueBufferType=Float32Array,ti.prototype.DefaultInterpolation=ea;class wr extends ti{constructor(e,t,n){super(e,t,n)}}wr.prototype.ValueTypeName="bool",wr.prototype.ValueBufferType=Array,wr.prototype.DefaultInterpolation=Qr,wr.prototype.InterpolantFactoryMethodLinear=void 0,wr.prototype.InterpolantFactoryMethodSmooth=void 0;class uf extends ti{constructor(e,t,n,i){super(e,t,n,i)}}uf.prototype.ValueTypeName="color";class Sr extends ti{constructor(e,t,n,i){super(e,t,n,i)}}Sr.prototype.ValueTypeName="number";class W1 extends _a{constructor(e,t,n,i){super(e,t,n,i)}interpolate_(e,t,n,i){const r=this.resultBuffer,a=this.sampleValues,o=this.valueSize,l=(n-t)/(i-t);let c=e*o;for(let h=c+o;c!==h;c+=4)zn.slerpFlat(r,0,a,c-o,a,c,l);return r}}class Er extends ti{constructor(e,t,n,i){super(e,t,n,i)}InterpolantFactoryMethodLinear(e){return new W1(this.times,this.values,this.getValueSize(),e)}}Er.prototype.ValueTypeName="quaternion",Er.prototype.InterpolantFactoryMethodSmooth=void 0;class Tr extends ti{constructor(e,t,n){super(e,t,n)}}Tr.prototype.ValueTypeName="string",Tr.prototype.ValueBufferType=Array,Tr.prototype.DefaultInterpolation=Qr,Tr.prototype.InterpolantFactoryMethodLinear=void 0,Tr.prototype.InterpolantFactoryMethodSmooth=void 0;class Cr extends ti{constructor(e,t,n,i){super(e,t,n,i)}}Cr.prototype.ValueTypeName="vector";class X1{constructor(e="",t=-1,n=[],i=Xg){this.name=e,this.tracks=n,this.duration=t,this.blendMode=i,this.uuid=On(),this.userData={},this.duration<0&&this.resetDuration()}static parse(e){const t=[],n=e.tracks,i=1/(e.fps||1);for(let a=0,o=n.length;a!==o;++a)t.push(q1(n[a]).scale(i));const r=new this(e.name,e.duration,t,e.blendMode);return r.uuid=e.uuid,r.userData=JSON.parse(e.userData||"{}"),r}static toJSON(e){const t=[],n=e.tracks,i={name:e.name,duration:e.duration,tracks:t,uuid:e.uuid,blendMode:e.blendMode,userData:JSON.stringify(e.userData)};for(let r=0,a=n.length;r!==a;++r)t.push(ti.toJSON(n[r]));return i}static CreateFromMorphTargetSequence(e,t,n,i){const r=t.length,a=[];for(let o=0;o1){const u=h[1];let p=i[u];p||(i[u]=p=[]),p.push(c)}}const a=[];for(const o in i)a.push(this.CreateFromMorphTargetSequence(o,i[o],t,n));return a}static parseAnimation(e,t){if(He("AnimationClip: parseAnimation() is deprecated and will be removed with r185"),!e)return Qe("AnimationClip: No animation in JSONLoader data."),null;const n=function(u,p,d,m,f){if(d.length!==0){const x=[],g=[];hf(d,x,g,m),x.length!==0&&f.push(new u(p,x,g))}},i=[],r=e.name||"default",a=e.fps||30,o=e.blendMode;let l=e.length||-1;const c=e.hierarchy||[];for(let u=0;u{t&&t(r),this.manager.itemEnd(e)},0),r;if(Ci[e]!==void 0){Ci[e].push({onLoad:t,onProgress:n,onError:i});return}Ci[e]=[],Ci[e].push({onLoad:t,onProgress:n,onError:i});const a=new Request(e,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin",signal:typeof AbortSignal.any=="function"?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal}),o=this.mimeType,l=this.responseType;fetch(a).then(c=>{if(c.status===200||c.status===0){if(c.status===0&&He("FileLoader: HTTP Status 0 received."),typeof ReadableStream>"u"||c.body===void 0||c.body.getReader===void 0)return c;const h=Ci[e],u=c.body.getReader(),p=c.headers.get("X-File-Size")||c.headers.get("Content-Length"),d=p?parseInt(p):0,m=d!==0;let f=0;const x=new ReadableStream({start(g){y();function y(){u.read().then(({done:v,value:b})=>{if(v)g.close();else{f+=b.byteLength;const _=new ProgressEvent("progress",{lengthComputable:m,loaded:f,total:d});for(let M=0,T=h.length;M{g.error(v)})}}});return new Response(x)}else throw new $1(`fetch for "${c.url}" responded with ${c.status}: ${c.statusText}`,c)}).then(c=>{switch(l){case"arraybuffer":return c.arrayBuffer();case"blob":return c.blob();case"document":return c.text().then(h=>new DOMParser().parseFromString(h,o));case"json":return c.json();default:if(o==="")return c.text();{const u=/charset="?([^;"\s]*)"?/i.exec(o),p=u&&u[1]?u[1].toLowerCase():void 0,d=new TextDecoder(p);return c.arrayBuffer().then(m=>d.decode(m))}}}).then(c=>{Ti.add(`file:${e}`,c);const h=Ci[e];delete Ci[e];for(let u=0,p=h.length;u{const h=Ci[e];if(h===void 0)throw this.manager.itemError(e),c;delete Ci[e];for(let u=0,p=h.length;u{this.manager.itemEnd(e)}),this.manager.itemStart(e)}setResponseType(e){return this.responseType=e,this}setMimeType(e){return this.mimeType=e,this}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}const Ar=new WeakMap;class K1 extends Ji{constructor(e){super(e)}load(e,t,n,i){this.path!==void 0&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,a=Ti.get(`image:${e}`);if(a!==void 0){if(a.complete===!0)r.manager.itemStart(e),setTimeout(function(){t&&t(a),r.manager.itemEnd(e)},0);else{let u=Ar.get(a);u===void 0&&(u=[],Ar.set(a,u)),u.push({onLoad:t,onError:i})}return a}const o=ta("img");function l(){h(),t&&t(this);const u=Ar.get(this)||[];for(let p=0;p"u"&&He("ImageBitmapLoader: createImageBitmap() not supported."),typeof fetch>"u"&&He("ImageBitmapLoader: fetch() not supported."),this.options={premultiplyAlpha:"none"},this._abortController=new AbortController}setOptions(e){return this.options=e,this}load(e,t,n,i){e===void 0&&(e=""),this.path!==void 0&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,a=Ti.get(`image-bitmap:${e}`);if(a!==void 0){if(r.manager.itemStart(e),a.then){a.then(c=>{if(qh.has(a)===!0)i&&i(qh.get(a)),r.manager.itemError(e),r.manager.itemEnd(e);else return t&&t(c),r.manager.itemEnd(e),c});return}return setTimeout(function(){t&&t(a),r.manager.itemEnd(e)},0),a}const o={};o.credentials=this.crossOrigin==="anonymous"?"same-origin":"include",o.headers=this.requestHeader,o.signal=typeof AbortSignal.any=="function"?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal;const l=fetch(e,o).then(function(c){return c.blob()}).then(function(c){return createImageBitmap(c,Object.assign(r.options,{colorSpaceConversion:"none"}))}).then(function(c){return Ti.add(`image-bitmap:${e}`,c),t&&t(c),r.manager.itemEnd(e),c}).catch(function(c){i&&i(c),qh.set(l,c),Ti.remove(`image-bitmap:${e}`),r.manager.itemError(e),r.manager.itemEnd(e)});Ti.add(`image-bitmap:${e}`,l),r.manager.itemStart(e)}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}class rv extends on{constructor(e=[]){super(),this.isArrayCamera=!0,this.isMultiViewCamera=!1,this.cameras=e}}class mf{constructor(e=!0){this.autoStart=e,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=performance.now(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let e=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const t=performance.now();e=(t-this.oldTime)/1e3,this.oldTime=t,this.elapsedTime+=e}return e}}const Zh="\\[\\]\\.:\\/",av=new RegExp("["+Zh+"]","g"),Yh="[^"+Zh+"]",ov="[^"+Zh.replace("\\.","")+"]",lv=/((?:WC+[\/:])*)/.source.replace("WC",Yh),cv=/(WCOD+)?/.source.replace("WCOD",ov),hv=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Yh),uv=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Yh),dv=new RegExp("^"+lv+cv+hv+uv+"$"),pv=["material","materials","bones","map"];class fv{constructor(e,t,n){const i=n||ut.parseTrackName(t);this._targetGroup=e,this._bindings=e.subscribe_(t,i)}getValue(e,t){this.bind();const n=this._targetGroup.nCachedObjects_,i=this._bindings[n];i!==void 0&&i.getValue(e,t)}setValue(e,t){const n=this._bindings;for(let i=this._targetGroup.nCachedObjects_,r=n.length;i!==r;++i)n[i].setValue(e,t)}bind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].bind()}unbind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].unbind()}}class ut{constructor(e,t,n){this.path=t,this.parsedPath=n||ut.parseTrackName(t),this.node=ut.findNode(e,this.parsedPath.nodeName),this.rootNode=e,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(e,t,n){return e&&e.isAnimationObjectGroup?new ut.Composite(e,t,n):new ut(e,t,n)}static sanitizeNodeName(e){return e.replace(/\s/g,"_").replace(av,"")}static parseTrackName(e){const t=dv.exec(e);if(t===null)throw new Error("PropertyBinding: Cannot parse trackName: "+e);const n={nodeName:t[2],objectName:t[3],objectIndex:t[4],propertyName:t[5],propertyIndex:t[6]},i=n.nodeName&&n.nodeName.lastIndexOf(".");if(i!==void 0&&i!==-1){const r=n.nodeName.substring(i+1);pv.indexOf(r)!==-1&&(n.nodeName=n.nodeName.substring(0,i),n.objectName=r)}if(n.propertyName===null||n.propertyName.length===0)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+e);return n}static findNode(e,t){if(t===void 0||t===""||t==="."||t===-1||t===e.name||t===e.uuid)return e;if(e.skeleton){const n=e.skeleton.getBoneByName(t);if(n!==void 0)return n}if(e.children){const n=function(r){for(let a=0;a1&&(a=1,r=qe((f-m)/u,0,1))}}return t.copy(o).add(Pr.multiplyScalar(r)),n.copy(l).add(Rr.multiplyScalar(a)),t.sub(n),t.dot(t)}applyMatrix4(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this}equals(e){return e.start.equals(this.start)&&e.end.equals(this.end)}clone(){return new this.constructor().copy(this)}}class xv extends gs{constructor(e,t=null){super(),this.object=e,this.domElement=t,this.enabled=!0,this.state=-1,this.keys={},this.mouseButtons={LEFT:null,MIDDLE:null,RIGHT:null},this.touches={ONE:null,TWO:null}}connect(e){if(e===void 0){He("Controls: connect() now requires an element.");return}this.domElement!==null&&this.disconnect(),this.domElement=e}disconnect(){}dispose(){}update(){}}function yf(s,e,t,n){const i=vv(n);switch(t){case Vd:return s*e;case eo:return s*e/i.components*i.byteLength;case vc:return s*e/i.components*i.byteLength;case yc:return s*e*2/i.components*i.byteLength;case bc:return s*e*2/i.components*i.byteLength;case Gd:return s*e*3/i.components*i.byteLength;case vn:return s*e*4/i.components*i.byteLength;case _c:return s*e*4/i.components*i.byteLength;case to:case no:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*8;case io:case so:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*16;case wc:case Ec:return Math.max(s,16)*Math.max(e,8)/4;case Mc:case Sc:return Math.max(s,8)*Math.max(e,8)/2;case Tc:case Cc:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*8;case Ac:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*16;case Pc:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*16;case Rc:return Math.floor((s+4)/5)*Math.floor((e+3)/4)*16;case Lc:return Math.floor((s+4)/5)*Math.floor((e+4)/5)*16;case Dc:return Math.floor((s+5)/6)*Math.floor((e+4)/5)*16;case Ic:return Math.floor((s+5)/6)*Math.floor((e+5)/6)*16;case Nc:return Math.floor((s+7)/8)*Math.floor((e+4)/5)*16;case Bc:return Math.floor((s+7)/8)*Math.floor((e+5)/6)*16;case kc:return Math.floor((s+7)/8)*Math.floor((e+7)/8)*16;case Uc:return Math.floor((s+9)/10)*Math.floor((e+4)/5)*16;case Oc:return Math.floor((s+9)/10)*Math.floor((e+5)/6)*16;case zc:return Math.floor((s+9)/10)*Math.floor((e+7)/8)*16;case Fc:return Math.floor((s+9)/10)*Math.floor((e+9)/10)*16;case Hc:return Math.floor((s+11)/12)*Math.floor((e+9)/10)*16;case Vc:return Math.floor((s+11)/12)*Math.floor((e+11)/12)*16;case Gc:case Wc:case Xc:return Math.ceil(s/4)*Math.ceil(e/4)*16;case jc:case qc:return Math.ceil(s/4)*Math.ceil(e/4)*8;case Zc:case Yc:return Math.ceil(s/4)*Math.ceil(e/4)*16}throw new Error(`Unable to determine texture byte length for ${t} format.`)}function vv(s){switch(s){case $n:case Od:return{byteLength:1,components:1};case Kr:case zd:case un:return{byteLength:2,components:1};case gc:case xc:return{byteLength:2,components:4};case ps:case mc:case hn:return{byteLength:4,components:1};case Fd:case Hd:return{byteLength:4,components:3}}throw new Error(`Unknown texture type ${s}.`)}typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:Yr}})),typeof window<"u"&&(window.__THREE__?He("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=Yr);function bf(){let s=null,e=!1,t=null,n=null;function i(r,a){t(r,a),n=s.requestAnimationFrame(i)}return{start:function(){e!==!0&&t!==null&&(n=s.requestAnimationFrame(i),e=!0)},stop:function(){s.cancelAnimationFrame(n),e=!1},setAnimationLoop:function(r){t=r},setContext:function(r){s=r}}}function yv(s){const e=new WeakMap;function t(o,l){const c=o.array,h=o.usage,u=c.byteLength,p=s.createBuffer();s.bindBuffer(l,p),s.bufferData(l,c,h),o.onUploadCallback();let d;if(c instanceof Float32Array)d=s.FLOAT;else if(typeof Float16Array<"u"&&c instanceof Float16Array)d=s.HALF_FLOAT;else if(c instanceof Uint16Array)o.isFloat16BufferAttribute?d=s.HALF_FLOAT:d=s.UNSIGNED_SHORT;else if(c instanceof Int16Array)d=s.SHORT;else if(c instanceof Uint32Array)d=s.UNSIGNED_INT;else if(c instanceof Int32Array)d=s.INT;else if(c instanceof Int8Array)d=s.BYTE;else if(c instanceof Uint8Array)d=s.UNSIGNED_BYTE;else if(c instanceof Uint8ClampedArray)d=s.UNSIGNED_BYTE;else throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: "+c);return{buffer:p,type:d,bytesPerElement:c.BYTES_PER_ELEMENT,version:o.version,size:u}}function n(o,l,c){const h=l.array,u=l.updateRanges;if(s.bindBuffer(c,o),u.length===0)s.bufferSubData(c,0,h);else{u.sort((d,m)=>d.start-m.start);let p=0;for(let d=1;dd+m?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!c.inputState.pinching&&p<=d-m&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else l!==null&&e.gripSpace&&(r=t.getPose(e.gripSpace,n),r!==null&&(l.matrix.fromArray(r.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),l.matrixWorldNeedsUpdate=!0,r.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(r.linearVelocity)):l.hasLinearVelocity=!1,r.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(r.angularVelocity)):l.hasAngularVelocity=!1));o!==null&&(i=t.getPose(e.targetRaySpace,n),i===null&&r!==null&&(i=r),i!==null&&(o.matrix.fromArray(i.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,i.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(i.linearVelocity)):o.hasLinearVelocity=!1,i.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(i.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(jx)))}return o!==null&&(o.visible=i!==null),l!==null&&(l.visible=r!==null),c!==null&&(c.visible=a!==null),this}_getHandJoint(e,t){if(e.joints[t.jointName]===void 0){const n=new ln;n.matrixAutoUpdate=!1,n.visible=!1,e.joints[t.jointName]=n,e.add(n)}return e.joints[t.jointName]}}class wp extends Et{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new Pn,this.environmentIntensity=1,this.environmentRotation=new Pn,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(e,t){return super.copy(e,t),e.background!==null&&(this.background=e.background.clone()),e.environment!==null&&(this.environment=e.environment.clone()),e.fog!==null&&(this.fog=e.fog.clone()),this.backgroundBlurriness=e.backgroundBlurriness,this.backgroundIntensity=e.backgroundIntensity,this.backgroundRotation.copy(e.backgroundRotation),this.environmentIntensity=e.environmentIntensity,this.environmentRotation.copy(e.environmentRotation),e.overrideMaterial!==null&&(this.overrideMaterial=e.overrideMaterial.clone()),this.matrixAutoUpdate=e.matrixAutoUpdate,this}toJSON(e){const t=super.toJSON(e);return this.fog!==null&&(t.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(t.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(t.object.backgroundIntensity=this.backgroundIntensity),t.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(t.object.environmentIntensity=this.environmentIntensity),t.object.environmentRotation=this.environmentRotation.toArray(),t}}class wh{constructor(e,t){this.isInterleavedBuffer=!0,this.array=e,this.stride=t,this.count=e!==void 0?e.length/t:0,this.usage=Jc,this.updateRanges=[],this.version=0,this.uuid=On()}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.usage=e.usage,this}copyAt(e,t,n){e*=this.stride,n*=t.stride;for(let i=0,r=this.stride;ie.far||t.push({distance:l,point:ca.clone(),uv:vt.getInterpolation(ca,To,ua,Ao,Cp,Sh,Tp,new he),face:null,object:this})}copy(e,t){return super.copy(e,t),e.center!==void 0&&this.center.copy(e.center),this.material=e.material,this}}function Po(s,e,t,n,i,r){br.subVectors(s,t).addScalar(.5).multiply(n),i!==void 0?(ha.x=r*br.x-i*br.y,ha.y=i*br.x+r*br.y):ha.copy(br),s.copy(e),s.x+=ha.x,s.y+=ha.y,s.applyMatrix4(Ep)}const Ap=new P,Pp=new tt,Rp=new tt,qx=new P,Lp=new De,Ro=new P,Ch=new li,Dp=new De,Th=new Xi;class Zx extends rt{constructor(e,t){super(e,t),this.isSkinnedMesh=!0,this.type="SkinnedMesh",this.bindMode=Bd,this.bindMatrix=new De,this.bindMatrixInverse=new De,this.boundingBox=null,this.boundingSphere=null}computeBoundingBox(){const e=this.geometry;this.boundingBox===null&&(this.boundingBox=new gt),this.boundingBox.makeEmpty();const t=e.getAttribute("position");for(let n=0;n1?null:t.copy(e.start).addScaledVector(n,r)}intersectsLine(e){const t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){const n=t||Jx.getNormalMatrix(e),i=this.coplanarPoint(Ph).applyMatrix4(e),r=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(r),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}}const _s=new li,Qx=new he(.5,.5),Io=new P;class Rh{constructor(e=new Dt,t=new Dt,n=new Dt,i=new Dt,r=new Dt,a=new Dt){this.planes=[e,t,n,i,r,a]}set(e,t,n,i,r,a){const o=this.planes;return o[0].copy(e),o[1].copy(t),o[2].copy(n),o[3].copy(i),o[4].copy(r),o[5].copy(a),this}copy(e){const t=this.planes;for(let n=0;n<6;n++)t[n].copy(e.planes[n]);return this}setFromProjectionMatrix(e,t=oi,n=!1){const i=this.planes,r=e.elements,a=r[0],o=r[1],l=r[2],c=r[3],h=r[4],u=r[5],p=r[6],d=r[7],m=r[8],f=r[9],x=r[10],g=r[11],b=r[12],v=r[13],y=r[14],_=r[15];if(i[0].setComponents(c-a,d-h,g-m,_-b).normalize(),i[1].setComponents(c+a,d+h,g+m,_+b).normalize(),i[2].setComponents(c+o,d+u,g+f,_+v).normalize(),i[3].setComponents(c-o,d-u,g-f,_-v).normalize(),n)i[4].setComponents(l,p,x,y).normalize(),i[5].setComponents(c-l,d-p,g-x,_-y).normalize();else if(i[4].setComponents(c-l,d-p,g-x,_-y).normalize(),t===oi)i[5].setComponents(c+l,d+p,g+x,_+y).normalize();else if(t===oo)i[5].setComponents(l,p,x,y).normalize();else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+t);return this}intersectsObject(e){if(e.boundingSphere!==void 0)e.boundingSphere===null&&e.computeBoundingSphere(),_s.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{const t=e.geometry;t.boundingSphere===null&&t.computeBoundingSphere(),_s.copy(t.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(_s)}intersectsSprite(e){_s.center.set(0,0,0);const t=Qx.distanceTo(e.center);return _s.radius=.7071067811865476+t,_s.applyMatrix4(e.matrixWorld),this.intersectsSphere(_s)}intersectsSphere(e){const t=this.planes,n=e.center,i=-e.radius;for(let r=0;r<6;r++)if(t[r].distanceToPoint(n)0?e.max.x:e.min.x,Io.y=i.normal.y>0?e.max.y:e.min.y,Io.z=i.normal.z>0?e.max.z:e.min.z,i.distanceToPoint(Io)<0)return!1}return!0}containsPoint(e){const t=this.planes;for(let n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}class Ms extends Rn{constructor(e){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new Fe(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this.fog=e.fog,this}}const No=new P,Bo=new P,Up=new De,fa=new Xi,ko=new li,Lh=new P,Op=new P;class $i extends Et{constructor(e=new dt,t=new Ms){super(),this.isLine=!0,this.type="Line",this.geometry=e,this.material=t,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}computeLineDistances(){const e=this.geometry;if(e.index===null){const t=e.attributes.position,n=[0];for(let i=1,r=t.count;i0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=i.length;rn)return;Lh.applyMatrix4(s.matrixWorld);const c=e.ray.origin.distanceTo(Lh);if(!(ce.far))return{distance:c,point:Op.clone().applyMatrix4(s.matrixWorld),index:a,face:null,faceIndex:null,barycoord:null,object:s}}const zp=new P,Fp=new P;class Hp extends $i{constructor(e,t){super(e,t),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const e=this.geometry;if(e.index===null){const t=e.attributes.position,n=[];for(let i=0,r=t.count;i0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=i.length;ri.far)return;r.push({distance:c,distanceToRay:Math.sqrt(o),point:l,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}class t1 extends Ft{constructor(e,t,n,i,r,a,o,l,c){super(e,t,n,i,r,a,o,l,c),this.isCanvasTexture=!0,this.needsUpdate=!0}}class Fo extends Ft{constructor(e,t,n=ps,i,r,a,o=Xt,l=Xt,c,h=Jr,u=1){if(h!==Jr&&h!==ms)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");const p={width:e,height:t,depth:u};super(p,i,r,a,o,l,h,n,c),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(e){return super.copy(e),this.source=new nh(Object.assign({},e.image)),this.compareFunction=e.compareFunction,this}toJSON(e){const t=super.toJSON(e);return this.compareFunction!==null&&(t.compareFunction=this.compareFunction),t}}class jp extends Ft{constructor(e=null){super(),this.sourceTexture=e,this.isExternalTexture=!0}copy(e){return super.copy(e),this.sourceTexture=e.sourceTexture,this}}class ci{constructor(){this.type="Curve",this.arcLengthDivisions=200,this.needsUpdate=!1,this.cacheArcLengths=null}getPoint(){He("Curve: .getPoint() not implemented.")}getPointAt(e,t){const n=this.getUtoTmapping(e);return this.getPoint(n,t)}getPoints(e=5){const t=[];for(let n=0;n<=e;n++)t.push(this.getPoint(n/e));return t}getSpacedPoints(e=5){const t=[];for(let n=0;n<=e;n++)t.push(this.getPointAt(n/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const t=[];let n,i=this.getPoint(0),r=0;t.push(0);for(let a=1;a<=e;a++)n=this.getPoint(a/e),r+=n.distanceTo(i),t.push(r),i=n;return this.cacheArcLengths=t,t}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t=null){const n=this.getLengths();let i=0;const r=n.length;let a;t?a=t:a=e*n[r-1];let o=0,l=r-1,c;for(;o<=l;)if(i=Math.floor(o+(l-o)/2),c=n[i]-a,c<0)o=i+1;else if(c>0)l=i-1;else{l=i;break}if(i=l,n[i]===a)return i/(r-1);const h=n[i],p=n[i+1]-h,d=(a-h)/p;return(i+d)/(r-1)}getTangent(e,t){let i=e-1e-4,r=e+1e-4;i<0&&(i=0),r>1&&(r=1);const a=this.getPoint(i),o=this.getPoint(r),l=t||(a.isVector2?new he:new P);return l.copy(o).sub(a).normalize(),l}getTangentAt(e,t){const n=this.getUtoTmapping(e);return this.getTangent(n,t)}computeFrenetFrames(e,t=!1){const n=new P,i=[],r=[],a=[],o=new P,l=new De;for(let d=0;d<=e;d++){const m=d/e;i[d]=this.getTangentAt(m,new P)}r[0]=new P,a[0]=new P;let c=Number.MAX_VALUE;const h=Math.abs(i[0].x),u=Math.abs(i[0].y),p=Math.abs(i[0].z);h<=c&&(c=h,n.set(1,0,0)),u<=c&&(c=u,n.set(0,1,0)),p<=c&&n.set(0,0,1),o.crossVectors(i[0],n).normalize(),r[0].crossVectors(i[0],o),a[0].crossVectors(i[0],r[0]);for(let d=1;d<=e;d++){if(r[d]=r[d-1].clone(),a[d]=a[d-1].clone(),o.crossVectors(i[d-1],i[d]),o.length()>Number.EPSILON){o.normalize();const m=Math.acos(qe(i[d-1].dot(i[d]),-1,1));r[d].applyMatrix4(l.makeRotationAxis(o,m))}a[d].crossVectors(i[d],r[d])}if(t===!0){let d=Math.acos(qe(r[0].dot(r[e]),-1,1));d/=e,i[0].dot(o.crossVectors(r[0],r[e]))>0&&(d=-d);for(let m=1;m<=e;m++)r[m].applyMatrix4(l.makeRotationAxis(i[m],d*m)),a[m].crossVectors(i[m],r[m])}return{tangents:i,normals:r,binormals:a}}clone(){return new this.constructor().copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}toJSON(){const e={metadata:{version:4.7,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e}fromJSON(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}class Ih extends ci{constructor(e=0,t=0,n=1,i=1,r=0,a=Math.PI*2,o=!1,l=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=e,this.aY=t,this.xRadius=n,this.yRadius=i,this.aStartAngle=r,this.aEndAngle=a,this.aClockwise=o,this.aRotation=l}getPoint(e,t=new he){const n=t,i=Math.PI*2;let r=this.aEndAngle-this.aStartAngle;const a=Math.abs(r)i;)r-=i;r0?0:(Math.floor(Math.abs(o)/r)+1)*r:l===0&&o===r-1&&(o=r-2,l=1);let c,h;this.closed||o>0?c=i[(o-1)%r]:(Ho.subVectors(i[0],i[1]).add(i[0]),c=Ho);const u=i[o%r],p=i[(o+1)%r];if(this.closed||o+2i.length-2?i.length-1:a+1],u=i[a>i.length-3?i.length-1:a+2];return n.set(qp(o,l.x,c.x,h.x,u.x),qp(o,l.y,c.y,h.y,u.y)),n}copy(e){super.copy(e),this.points=[];for(let t=0,n=e.points.length;t=n){const a=i[r]-n,o=this.curves[r],l=o.getLength(),c=l===0?0:1-a/l;return o.getPointAt(c,t)}r++}return null}getLength(){const e=this.getCurveLengths();return e[e.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const e=[];let t=0;for(let n=0,i=this.curves.length;n1&&!t[t.length-1].equals(t[0])&&t.push(t[0]),t}copy(e){super.copy(e),this.curves=[];for(let t=0,n=e.curves.length;t0){const u=c.getPoint(0);u.equals(this.currentPoint)||this.lineTo(u.x,u.y)}this.curves.push(c);const h=c.getPoint(1);return this.currentPoint.copy(h),this}copy(e){return super.copy(e),this.currentPoint.copy(e.currentPoint),this}toJSON(){const e=super.toJSON();return e.currentPoint=this.currentPoint.toArray(),e}fromJSON(e){return super.fromJSON(e),this.currentPoint.fromArray(e.currentPoint),this}}class Qp extends Jp{constructor(e){super(e),this.uuid=On(),this.type="Shape",this.holes=[]}getPointsHoles(e){const t=[];for(let n=0,i=this.holes.length;n80*t){o=s[0],l=s[1];let h=o,u=l;for(let p=t;ph&&(h=d),m>u&&(u=m)}c=Math.max(h-o,u-l),c=c!==0?32767/c:0}return xa(r,a,t,o,l,c,0),a}function ef(s,e,t,n,i){let r;if(i===L1(s,e,t,n)>0)for(let a=e;a=e;a-=n)r=rf(a/n|0,s[a],s[a+1],r);return r&&_r(r,r.next)&&(ya(r),r=r.next),r}function ws(s,e){if(!s)return s;e||(e=s);let t=s,n;do if(n=!1,!t.steiner&&(_r(t,t.next)||Ct(t.prev,t,t.next)===0)){if(ya(t),t=e=t.prev,t===t.next)break;n=!0}else t=t.next;while(n||t!==e);return e}function xa(s,e,t,n,i,r,a){if(!s)return;!a&&r&&E1(s,n,i,r);let o=s;for(;s.prev!==s.next;){const l=s.prev,c=s.next;if(r?x1(s,n,i,r):g1(s)){e.push(l.i,s.i,c.i),ya(s),s=c.next,o=c.next;continue}if(s=c,s===o){a?a===1?(s=v1(ws(s),e),xa(s,e,t,n,i,r,2)):a===2&&b1(s,e,t,n,i,r):xa(ws(s),e,t,n,i,r,1);break}}}function g1(s){const e=s.prev,t=s,n=s.next;if(Ct(e,t,n)>=0)return!1;const i=e.x,r=t.x,a=n.x,o=e.y,l=t.y,c=n.y,h=Math.min(i,r,a),u=Math.min(o,l,c),p=Math.max(i,r,a),d=Math.max(o,l,c);let m=n.next;for(;m!==e;){if(m.x>=h&&m.x<=p&&m.y>=u&&m.y<=d&&va(i,o,r,l,a,c,m.x,m.y)&&Ct(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function x1(s,e,t,n){const i=s.prev,r=s,a=s.next;if(Ct(i,r,a)>=0)return!1;const o=i.x,l=r.x,c=a.x,h=i.y,u=r.y,p=a.y,d=Math.min(o,l,c),m=Math.min(h,u,p),f=Math.max(o,l,c),x=Math.max(h,u,p),g=zh(d,m,e,t,n),b=zh(f,x,e,t,n);let v=s.prevZ,y=s.nextZ;for(;v&&v.z>=g&&y&&y.z<=b;){if(v.x>=d&&v.x<=f&&v.y>=m&&v.y<=x&&v!==i&&v!==a&&va(o,h,l,u,c,p,v.x,v.y)&&Ct(v.prev,v,v.next)>=0||(v=v.prevZ,y.x>=d&&y.x<=f&&y.y>=m&&y.y<=x&&y!==i&&y!==a&&va(o,h,l,u,c,p,y.x,y.y)&&Ct(y.prev,y,y.next)>=0))return!1;y=y.nextZ}for(;v&&v.z>=g;){if(v.x>=d&&v.x<=f&&v.y>=m&&v.y<=x&&v!==i&&v!==a&&va(o,h,l,u,c,p,v.x,v.y)&&Ct(v.prev,v,v.next)>=0)return!1;v=v.prevZ}for(;y&&y.z<=b;){if(y.x>=d&&y.x<=f&&y.y>=m&&y.y<=x&&y!==i&&y!==a&&va(o,h,l,u,c,p,y.x,y.y)&&Ct(y.prev,y,y.next)>=0)return!1;y=y.nextZ}return!0}function v1(s,e){let t=s;do{const n=t.prev,i=t.next.next;!_r(n,i)&&nf(n,t,t.next,i)&&ba(n,i)&&ba(i,n)&&(e.push(n.i,t.i,i.i),ya(t),ya(t.next),t=s=i),t=t.next}while(t!==s);return ws(t)}function b1(s,e,t,n,i,r){let a=s;do{let o=a.next.next;for(;o!==a.prev;){if(a.i!==o.i&&A1(a,o)){let l=sf(a,o);a=ws(a,a.next),l=ws(l,l.next),xa(a,e,t,n,i,r,0),xa(l,e,t,n,i,r,0);return}o=o.next}a=a.next}while(a!==s)}function y1(s,e,t,n){const i=[];for(let r=0,a=e.length;r=t.next.y&&t.next.y!==t.y){const u=t.x+(i-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(u<=n&&u>r&&(r=u,a=t.x=t.x&&t.x>=l&&n!==t.x&&tf(ia.x||t.x===a.x&&S1(a,t)))&&(a=t,h=u)}t=t.next}while(t!==o);return a}function S1(s,e){return Ct(s.prev,s,e.prev)<0&&Ct(e.next,s,s.next)<0}function E1(s,e,t,n){let i=s;do i.z===0&&(i.z=zh(i.x,i.y,e,t,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==s);i.prevZ.nextZ=null,i.prevZ=null,C1(i)}function C1(s){let e,t=1;do{let n=s,i;s=null;let r=null;for(e=0;n;){e++;let a=n,o=0;for(let c=0;c0||l>0&&a;)o!==0&&(l===0||!a||n.z<=a.z)?(i=n,n=n.nextZ,o--):(i=a,a=a.nextZ,l--),r?r.nextZ=i:s=i,i.prevZ=r,r=i;n=a}r.nextZ=null,t*=2}while(e>1);return s}function zh(s,e,t,n,i){return s=(s-t)*i|0,e=(e-n)*i|0,s=(s|s<<8)&16711935,s=(s|s<<4)&252645135,s=(s|s<<2)&858993459,s=(s|s<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,s|e<<1}function T1(s){let e=s,t=s;do(e.x=(s-a)*(r-o)&&(s-a)*(n-o)>=(t-a)*(e-o)&&(t-a)*(r-o)>=(i-a)*(n-o)}function va(s,e,t,n,i,r,a,o){return!(s===a&&e===o)&&tf(s,e,t,n,i,r,a,o)}function A1(s,e){return s.next.i!==e.i&&s.prev.i!==e.i&&!P1(s,e)&&(ba(s,e)&&ba(e,s)&&R1(s,e)&&(Ct(s.prev,s,e.prev)||Ct(s,e.prev,e))||_r(s,e)&&Ct(s.prev,s,s.next)>0&&Ct(e.prev,e,e.next)>0)}function Ct(s,e,t){return(e.y-s.y)*(t.x-e.x)-(e.x-s.x)*(t.y-e.y)}function _r(s,e){return s.x===e.x&&s.y===e.y}function nf(s,e,t,n){const i=Go(Ct(s,e,t)),r=Go(Ct(s,e,n)),a=Go(Ct(t,n,s)),o=Go(Ct(t,n,e));return!!(i!==r&&a!==o||i===0&&Vo(s,t,e)||r===0&&Vo(s,n,e)||a===0&&Vo(t,s,n)||o===0&&Vo(t,e,n))}function Vo(s,e,t){return e.x<=Math.max(s.x,t.x)&&e.x>=Math.min(s.x,t.x)&&e.y<=Math.max(s.y,t.y)&&e.y>=Math.min(s.y,t.y)}function Go(s){return s>0?1:s<0?-1:0}function P1(s,e){let t=s;do{if(t.i!==s.i&&t.next.i!==s.i&&t.i!==e.i&&t.next.i!==e.i&&nf(t,t.next,s,e))return!0;t=t.next}while(t!==s);return!1}function ba(s,e){return Ct(s.prev,s,s.next)<0?Ct(s,e,s.next)>=0&&Ct(s,s.prev,e)>=0:Ct(s,e,s.prev)<0||Ct(s,s.next,e)<0}function R1(s,e){let t=s,n=!1;const i=(s.x+e.x)/2,r=(s.y+e.y)/2;do t.y>r!=t.next.y>r&&t.next.y!==t.y&&i<(t.next.x-t.x)*(r-t.y)/(t.next.y-t.y)+t.x&&(n=!n),t=t.next;while(t!==s);return n}function sf(s,e){const t=Fh(s.i,s.x,s.y),n=Fh(e.i,e.x,e.y),i=s.next,r=e.prev;return s.next=e,e.prev=s,t.next=i,i.prev=t,n.next=t,t.prev=n,r.next=n,n.prev=r,n}function rf(s,e,t,n){const i=Fh(s,e,t);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function ya(s){s.next.prev=s.prev,s.prev.next=s.next,s.prevZ&&(s.prevZ.nextZ=s.nextZ),s.nextZ&&(s.nextZ.prevZ=s.prevZ)}function Fh(s,e,t){return{i:s,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function L1(s,e,t,n){let i=0;for(let r=e,a=t-n;r2&&s[e-1].equals(s[0])&&s.pop()}function of(s,e){for(let t=0;tNumber.EPSILON){const K=Math.sqrt(D),le=Math.sqrt(X*X+B*B),te=N.x-J/K,Te=N.y+ee/K,ye=V.x-B/le,Re=V.y+X/le,Ie=((ye-te)*B-(Re-Te)*X)/(ee*B-J*X);U=te+ee*Ie-T.x,k=Te+J*Ie-T.y;const ue=U*U+k*k;if(ue<=2)return new he(U,k);F=Math.sqrt(ue/2)}else{let K=!1;ee>Number.EPSILON?X>Number.EPSILON&&(K=!0):ee<-Number.EPSILON?X<-Number.EPSILON&&(K=!0):Math.sign(J)===Math.sign(B)&&(K=!0),K?(U=-J,k=ee,F=Math.sqrt(D)):(U=ee,k=J,F=Math.sqrt(D/2))}return new he(U/F,k/F)}const q=[];for(let T=0,N=z.length,V=N-1,U=T+1;T=0;T--){const N=T/x,V=d*Math.cos(N*Math.PI/2),U=m*Math.sin(N*Math.PI/2)+f;for(let k=0,F=z.length;k=0;){const U=V;let k=V-1;k<0&&(k=T.length-1);for(let F=0,ee=h+x*2;F0)&&d.push(v,y,M),(g!==n-1||l0!=e>0&&this.version++,this._anisotropy=e}get clearcoat(){return this._clearcoat}set clearcoat(e){this._clearcoat>0!=e>0&&this.version++,this._clearcoat=e}get iridescence(){return this._iridescence}set iridescence(e){this._iridescence>0!=e>0&&this.version++,this._iridescence=e}get dispersion(){return this._dispersion}set dispersion(e){this._dispersion>0!=e>0&&this.version++,this._dispersion=e}get sheen(){return this._sheen}set sheen(e){this._sheen>0!=e>0&&this.version++,this._sheen=e}get transmission(){return this._transmission}set transmission(e){this._transmission>0!=e>0&&this.version++,this._transmission=e}copy(e){return super.copy(e),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=e.anisotropy,this.anisotropyRotation=e.anisotropyRotation,this.anisotropyMap=e.anisotropyMap,this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.dispersion=e.dispersion,this.ior=e.ior,this.iridescence=e.iridescence,this.iridescenceMap=e.iridescenceMap,this.iridescenceIOR=e.iridescenceIOR,this.iridescenceThicknessRange=[...e.iridescenceThicknessRange],this.iridescenceThicknessMap=e.iridescenceThicknessMap,this.sheen=e.sheen,this.sheenColor.copy(e.sheenColor),this.sheenColorMap=e.sheenColorMap,this.sheenRoughness=e.sheenRoughness,this.sheenRoughnessMap=e.sheenRoughnessMap,this.transmission=e.transmission,this.transmissionMap=e.transmissionMap,this.thickness=e.thickness,this.thicknessMap=e.thicknessMap,this.attenuationDistance=e.attenuationDistance,this.attenuationColor.copy(e.attenuationColor),this.specularIntensity=e.specularIntensity,this.specularIntensityMap=e.specularIntensityMap,this.specularColor.copy(e.specularColor),this.specularColorMap=e.specularColorMap,this}}class lf extends Rn{constructor(e){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ro,this.normalScale=new he(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.flatShading=e.flatShading,this}}class k1 extends Rn{constructor(e){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new Fe(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Fe(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=ro,this.normalScale=new he(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Pn,this.combine=pc,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class U1 extends Rn{constructor(e){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=qg,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}class O1 extends Rn{constructor(e){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(e)}copy(e){return super.copy(e),this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}function Wo(s,e){return!s||s.constructor===e?s:typeof e.BYTES_PER_ELEMENT=="number"?new e(s):Array.prototype.slice.call(s)}function z1(s){return ArrayBuffer.isView(s)&&!(s instanceof DataView)}function F1(s){function e(i,r){return s[i]-s[r]}const t=s.length,n=new Array(t);for(let i=0;i!==t;++i)n[i]=i;return n.sort(e),n}function cf(s,e,t){const n=s.length,i=new s.constructor(n);for(let r=0,a=0;a!==n;++r){const o=t[r]*e;for(let l=0;l!==e;++l)i[a++]=s[o+l]}return i}function hf(s,e,t,n){let i=1,r=s[0];for(;r!==void 0&&r[n]===void 0;)r=s[i++];if(r===void 0)return;let a=r[n];if(a!==void 0)if(Array.isArray(a))do a=r[n],a!==void 0&&(e.push(r.time),t.push(...a)),r=s[i++];while(r!==void 0);else if(a.toArray!==void 0)do a=r[n],a!==void 0&&(e.push(r.time),a.toArray(t,t.length)),r=s[i++];while(r!==void 0);else do a=r[n],a!==void 0&&(e.push(r.time),t.push(a)),r=s[i++];while(r!==void 0)}class _a{constructor(e,t,n,i){this.parameterPositions=e,this._cachedIndex=0,this.resultBuffer=i!==void 0?i:new t.constructor(n),this.sampleValues=t,this.valueSize=n,this.settings=null,this.DefaultSettings_={}}evaluate(e){const t=this.parameterPositions;let n=this._cachedIndex,i=t[n],r=t[n-1];e:{t:{let a;n:{i:if(!(e=r)){const o=t[1];e=r)break t}a=n,n=0;break n}break e}for(;n>>1;et;)--a;if(++a,r!==0||a!==i){r>=a&&(a=Math.max(a,1),r=a-1);const o=this.getValueSize();this.times=n.slice(r,a),this.values=this.values.slice(r*o,a*o)}return this}validate(){let e=!0;const t=this.getValueSize();t-Math.floor(t)!==0&&(Qe("KeyframeTrack: Invalid value size in track.",this),e=!1);const n=this.times,i=this.values,r=n.length;r===0&&(Qe("KeyframeTrack: Track is empty.",this),e=!1);let a=null;for(let o=0;o!==r;o++){const l=n[o];if(typeof l=="number"&&isNaN(l)){Qe("KeyframeTrack: Time is not a valid number.",this,o,l),e=!1;break}if(a!==null&&a>l){Qe("KeyframeTrack: Out of order keys.",this,o,l,a),e=!1;break}a=l}if(i!==void 0&&z1(i))for(let o=0,l=i.length;o!==l;++o){const c=i[o];if(isNaN(c)){Qe("KeyframeTrack: Value is not a valid number.",this,o,c),e=!1;break}}return e}optimize(){const e=this.times.slice(),t=this.values.slice(),n=this.getValueSize(),i=this.getInterpolation()===$c,r=e.length-1;let a=1;for(let o=1;o0){e[a]=e[r];for(let o=r*n,l=a*n,c=0;c!==n;++c)t[l+c]=t[o+c];++a}return a!==e.length?(this.times=e.slice(0,a),this.values=t.slice(0,a*n)):(this.times=e,this.values=t),this}clone(){const e=this.times.slice(),t=this.values.slice(),n=this.constructor,i=new n(this.name,e,t);return i.createInterpolant=this.createInterpolant,i}}ti.prototype.ValueTypeName="",ti.prototype.TimeBufferType=Float32Array,ti.prototype.ValueBufferType=Float32Array,ti.prototype.DefaultInterpolation=ea;class wr extends ti{constructor(e,t,n){super(e,t,n)}}wr.prototype.ValueTypeName="bool",wr.prototype.ValueBufferType=Array,wr.prototype.DefaultInterpolation=Qr,wr.prototype.InterpolantFactoryMethodLinear=void 0,wr.prototype.InterpolantFactoryMethodSmooth=void 0;class uf extends ti{constructor(e,t,n,i){super(e,t,n,i)}}uf.prototype.ValueTypeName="color";class Sr extends ti{constructor(e,t,n,i){super(e,t,n,i)}}Sr.prototype.ValueTypeName="number";class W1 extends _a{constructor(e,t,n,i){super(e,t,n,i)}interpolate_(e,t,n,i){const r=this.resultBuffer,a=this.sampleValues,o=this.valueSize,l=(n-t)/(i-t);let c=e*o;for(let h=c+o;c!==h;c+=4)zn.slerpFlat(r,0,a,c-o,a,c,l);return r}}class Er extends ti{constructor(e,t,n,i){super(e,t,n,i)}InterpolantFactoryMethodLinear(e){return new W1(this.times,this.values,this.getValueSize(),e)}}Er.prototype.ValueTypeName="quaternion",Er.prototype.InterpolantFactoryMethodSmooth=void 0;class Cr extends ti{constructor(e,t,n){super(e,t,n)}}Cr.prototype.ValueTypeName="string",Cr.prototype.ValueBufferType=Array,Cr.prototype.DefaultInterpolation=Qr,Cr.prototype.InterpolantFactoryMethodLinear=void 0,Cr.prototype.InterpolantFactoryMethodSmooth=void 0;class Tr extends ti{constructor(e,t,n,i){super(e,t,n,i)}}Tr.prototype.ValueTypeName="vector";class X1{constructor(e="",t=-1,n=[],i=Xg){this.name=e,this.tracks=n,this.duration=t,this.blendMode=i,this.uuid=On(),this.userData={},this.duration<0&&this.resetDuration()}static parse(e){const t=[],n=e.tracks,i=1/(e.fps||1);for(let a=0,o=n.length;a!==o;++a)t.push(q1(n[a]).scale(i));const r=new this(e.name,e.duration,t,e.blendMode);return r.uuid=e.uuid,r.userData=JSON.parse(e.userData||"{}"),r}static toJSON(e){const t=[],n=e.tracks,i={name:e.name,duration:e.duration,tracks:t,uuid:e.uuid,blendMode:e.blendMode,userData:JSON.stringify(e.userData)};for(let r=0,a=n.length;r!==a;++r)t.push(ti.toJSON(n[r]));return i}static CreateFromMorphTargetSequence(e,t,n,i){const r=t.length,a=[];for(let o=0;o1){const u=h[1];let p=i[u];p||(i[u]=p=[]),p.push(c)}}const a=[];for(const o in i)a.push(this.CreateFromMorphTargetSequence(o,i[o],t,n));return a}static parseAnimation(e,t){if(He("AnimationClip: parseAnimation() is deprecated and will be removed with r185"),!e)return Qe("AnimationClip: No animation in JSONLoader data."),null;const n=function(u,p,d,m,f){if(d.length!==0){const x=[],g=[];hf(d,x,g,m),x.length!==0&&f.push(new u(p,x,g))}},i=[],r=e.name||"default",a=e.fps||30,o=e.blendMode;let l=e.length||-1;const c=e.hierarchy||[];for(let u=0;u{t&&t(r),this.manager.itemEnd(e)},0),r;if(Ti[e]!==void 0){Ti[e].push({onLoad:t,onProgress:n,onError:i});return}Ti[e]=[],Ti[e].push({onLoad:t,onProgress:n,onError:i});const a=new Request(e,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin",signal:typeof AbortSignal.any=="function"?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal}),o=this.mimeType,l=this.responseType;fetch(a).then(c=>{if(c.status===200||c.status===0){if(c.status===0&&He("FileLoader: HTTP Status 0 received."),typeof ReadableStream>"u"||c.body===void 0||c.body.getReader===void 0)return c;const h=Ti[e],u=c.body.getReader(),p=c.headers.get("X-File-Size")||c.headers.get("Content-Length"),d=p?parseInt(p):0,m=d!==0;let f=0;const x=new ReadableStream({start(g){b();function b(){u.read().then(({done:v,value:y})=>{if(v)g.close();else{f+=y.byteLength;const _=new ProgressEvent("progress",{lengthComputable:m,loaded:f,total:d});for(let M=0,C=h.length;M{g.error(v)})}}});return new Response(x)}else throw new $1(`fetch for "${c.url}" responded with ${c.status}: ${c.statusText}`,c)}).then(c=>{switch(l){case"arraybuffer":return c.arrayBuffer();case"blob":return c.blob();case"document":return c.text().then(h=>new DOMParser().parseFromString(h,o));case"json":return c.json();default:if(o==="")return c.text();{const u=/charset="?([^;"\s]*)"?/i.exec(o),p=u&&u[1]?u[1].toLowerCase():void 0,d=new TextDecoder(p);return c.arrayBuffer().then(m=>d.decode(m))}}}).then(c=>{Ci.add(`file:${e}`,c);const h=Ti[e];delete Ti[e];for(let u=0,p=h.length;u{const h=Ti[e];if(h===void 0)throw this.manager.itemError(e),c;delete Ti[e];for(let u=0,p=h.length;u{this.manager.itemEnd(e)}),this.manager.itemStart(e)}setResponseType(e){return this.responseType=e,this}setMimeType(e){return this.mimeType=e,this}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}const Ar=new WeakMap;class K1 extends Ji{constructor(e){super(e)}load(e,t,n,i){this.path!==void 0&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,a=Ci.get(`image:${e}`);if(a!==void 0){if(a.complete===!0)r.manager.itemStart(e),setTimeout(function(){t&&t(a),r.manager.itemEnd(e)},0);else{let u=Ar.get(a);u===void 0&&(u=[],Ar.set(a,u)),u.push({onLoad:t,onError:i})}return a}const o=ta("img");function l(){h(),t&&t(this);const u=Ar.get(this)||[];for(let p=0;p"u"&&He("ImageBitmapLoader: createImageBitmap() not supported."),typeof fetch>"u"&&He("ImageBitmapLoader: fetch() not supported."),this.options={premultiplyAlpha:"none"},this._abortController=new AbortController}setOptions(e){return this.options=e,this}load(e,t,n,i){e===void 0&&(e=""),this.path!==void 0&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,a=Ci.get(`image-bitmap:${e}`);if(a!==void 0){if(r.manager.itemStart(e),a.then){a.then(c=>{if(qh.has(a)===!0)i&&i(qh.get(a)),r.manager.itemError(e),r.manager.itemEnd(e);else return t&&t(c),r.manager.itemEnd(e),c});return}return setTimeout(function(){t&&t(a),r.manager.itemEnd(e)},0),a}const o={};o.credentials=this.crossOrigin==="anonymous"?"same-origin":"include",o.headers=this.requestHeader,o.signal=typeof AbortSignal.any=="function"?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal;const l=fetch(e,o).then(function(c){return c.blob()}).then(function(c){return createImageBitmap(c,Object.assign(r.options,{colorSpaceConversion:"none"}))}).then(function(c){return Ci.add(`image-bitmap:${e}`,c),t&&t(c),r.manager.itemEnd(e),c}).catch(function(c){i&&i(c),qh.set(l,c),Ci.remove(`image-bitmap:${e}`),r.manager.itemError(e),r.manager.itemEnd(e)});Ci.add(`image-bitmap:${e}`,l),r.manager.itemStart(e)}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}class rv extends on{constructor(e=[]){super(),this.isArrayCamera=!0,this.isMultiViewCamera=!1,this.cameras=e}}class mf{constructor(e=!0){this.autoStart=e,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=performance.now(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let e=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const t=performance.now();e=(t-this.oldTime)/1e3,this.oldTime=t,this.elapsedTime+=e}return e}}const Zh="\\[\\]\\.:\\/",av=new RegExp("["+Zh+"]","g"),Yh="[^"+Zh+"]",ov="[^"+Zh.replace("\\.","")+"]",lv=/((?:WC+[\/:])*)/.source.replace("WC",Yh),cv=/(WCOD+)?/.source.replace("WCOD",ov),hv=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Yh),uv=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Yh),dv=new RegExp("^"+lv+cv+hv+uv+"$"),pv=["material","materials","bones","map"];class fv{constructor(e,t,n){const i=n||ut.parseTrackName(t);this._targetGroup=e,this._bindings=e.subscribe_(t,i)}getValue(e,t){this.bind();const n=this._targetGroup.nCachedObjects_,i=this._bindings[n];i!==void 0&&i.getValue(e,t)}setValue(e,t){const n=this._bindings;for(let i=this._targetGroup.nCachedObjects_,r=n.length;i!==r;++i)n[i].setValue(e,t)}bind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].bind()}unbind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].unbind()}}class ut{constructor(e,t,n){this.path=t,this.parsedPath=n||ut.parseTrackName(t),this.node=ut.findNode(e,this.parsedPath.nodeName),this.rootNode=e,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(e,t,n){return e&&e.isAnimationObjectGroup?new ut.Composite(e,t,n):new ut(e,t,n)}static sanitizeNodeName(e){return e.replace(/\s/g,"_").replace(av,"")}static parseTrackName(e){const t=dv.exec(e);if(t===null)throw new Error("PropertyBinding: Cannot parse trackName: "+e);const n={nodeName:t[2],objectName:t[3],objectIndex:t[4],propertyName:t[5],propertyIndex:t[6]},i=n.nodeName&&n.nodeName.lastIndexOf(".");if(i!==void 0&&i!==-1){const r=n.nodeName.substring(i+1);pv.indexOf(r)!==-1&&(n.nodeName=n.nodeName.substring(0,i),n.objectName=r)}if(n.propertyName===null||n.propertyName.length===0)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+e);return n}static findNode(e,t){if(t===void 0||t===""||t==="."||t===-1||t===e.name||t===e.uuid)return e;if(e.skeleton){const n=e.skeleton.getBoneByName(t);if(n!==void 0)return n}if(e.children){const n=function(r){for(let a=0;a1&&(a=1,r=qe((f-m)/u,0,1))}}return t.copy(o).add(Pr.multiplyScalar(r)),n.copy(l).add(Rr.multiplyScalar(a)),t.sub(n),t.dot(t)}applyMatrix4(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this}equals(e){return e.start.equals(this.start)&&e.end.equals(this.end)}clone(){return new this.constructor().copy(this)}}class xv extends gs{constructor(e,t=null){super(),this.object=e,this.domElement=t,this.enabled=!0,this.state=-1,this.keys={},this.mouseButtons={LEFT:null,MIDDLE:null,RIGHT:null},this.touches={ONE:null,TWO:null}}connect(e){if(e===void 0){He("Controls: connect() now requires an element.");return}this.domElement!==null&&this.disconnect(),this.domElement=e}disconnect(){}dispose(){}update(){}}function bf(s,e,t,n){const i=vv(n);switch(t){case Vd:return s*e;case eo:return s*e/i.components*i.byteLength;case vc:return s*e/i.components*i.byteLength;case bc:return s*e*2/i.components*i.byteLength;case yc:return s*e*2/i.components*i.byteLength;case Gd:return s*e*3/i.components*i.byteLength;case vn:return s*e*4/i.components*i.byteLength;case _c:return s*e*4/i.components*i.byteLength;case to:case no:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*8;case io:case so:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*16;case wc:case Ec:return Math.max(s,16)*Math.max(e,8)/4;case Mc:case Sc:return Math.max(s,8)*Math.max(e,8)/2;case Cc:case Tc:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*8;case Ac:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*16;case Pc:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*16;case Rc:return Math.floor((s+4)/5)*Math.floor((e+3)/4)*16;case Lc:return Math.floor((s+4)/5)*Math.floor((e+4)/5)*16;case Dc:return Math.floor((s+5)/6)*Math.floor((e+4)/5)*16;case Ic:return Math.floor((s+5)/6)*Math.floor((e+5)/6)*16;case Nc:return Math.floor((s+7)/8)*Math.floor((e+4)/5)*16;case Bc:return Math.floor((s+7)/8)*Math.floor((e+5)/6)*16;case kc:return Math.floor((s+7)/8)*Math.floor((e+7)/8)*16;case Uc:return Math.floor((s+9)/10)*Math.floor((e+4)/5)*16;case Oc:return Math.floor((s+9)/10)*Math.floor((e+5)/6)*16;case zc:return Math.floor((s+9)/10)*Math.floor((e+7)/8)*16;case Fc:return Math.floor((s+9)/10)*Math.floor((e+9)/10)*16;case Hc:return Math.floor((s+11)/12)*Math.floor((e+9)/10)*16;case Vc:return Math.floor((s+11)/12)*Math.floor((e+11)/12)*16;case Gc:case Wc:case Xc:return Math.ceil(s/4)*Math.ceil(e/4)*16;case jc:case qc:return Math.ceil(s/4)*Math.ceil(e/4)*8;case Zc:case Yc:return Math.ceil(s/4)*Math.ceil(e/4)*16}throw new Error(`Unable to determine texture byte length for ${t} format.`)}function vv(s){switch(s){case $n:case Od:return{byteLength:1,components:1};case Kr:case zd:case un:return{byteLength:2,components:1};case gc:case xc:return{byteLength:2,components:4};case ps:case mc:case hn:return{byteLength:4,components:1};case Fd:case Hd:return{byteLength:4,components:3}}throw new Error(`Unknown texture type ${s}.`)}typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:Yr}})),typeof window<"u"&&(window.__THREE__?He("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=Yr);function yf(){let s=null,e=!1,t=null,n=null;function i(r,a){t(r,a),n=s.requestAnimationFrame(i)}return{start:function(){e!==!0&&t!==null&&(n=s.requestAnimationFrame(i),e=!0)},stop:function(){s.cancelAnimationFrame(n),e=!1},setAnimationLoop:function(r){t=r},setContext:function(r){s=r}}}function bv(s){const e=new WeakMap;function t(o,l){const c=o.array,h=o.usage,u=c.byteLength,p=s.createBuffer();s.bindBuffer(l,p),s.bufferData(l,c,h),o.onUploadCallback();let d;if(c instanceof Float32Array)d=s.FLOAT;else if(typeof Float16Array<"u"&&c instanceof Float16Array)d=s.HALF_FLOAT;else if(c instanceof Uint16Array)o.isFloat16BufferAttribute?d=s.HALF_FLOAT:d=s.UNSIGNED_SHORT;else if(c instanceof Int16Array)d=s.SHORT;else if(c instanceof Uint32Array)d=s.UNSIGNED_INT;else if(c instanceof Int32Array)d=s.INT;else if(c instanceof Int8Array)d=s.BYTE;else if(c instanceof Uint8Array)d=s.UNSIGNED_BYTE;else if(c instanceof Uint8ClampedArray)d=s.UNSIGNED_BYTE;else throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: "+c);return{buffer:p,type:d,bytesPerElement:c.BYTES_PER_ELEMENT,version:o.version,size:u}}function n(o,l,c){const h=l.array,u=l.updateRanges;if(s.bindBuffer(c,o),u.length===0)s.bufferSubData(c,0,h);else{u.sort((d,m)=>d.start-m.start);let p=0;for(let d=1;d 0 +#endif`,ty=`#if NUM_SPOT_LIGHT_COORDS > 0 varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; #endif #if NUM_SPOT_LIGHT_MAPS > 0 @@ -1886,7 +1886,7 @@ gl_Position = projectionMatrix * mvPosition;`,Ky=`#ifdef DITHERING } return mix( 1.0, shadow, shadowIntensity ); } -#endif`,nb=`#if NUM_SPOT_LIGHT_COORDS > 0 +#endif`,ny=`#if NUM_SPOT_LIGHT_COORDS > 0 uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ]; varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; #endif @@ -1927,7 +1927,7 @@ gl_Position = projectionMatrix * mvPosition;`,Ky=`#ifdef DITHERING }; uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; #endif -#endif`,ib=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) +#endif`,iy=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); vec4 shadowWorldPosition; #endif @@ -1959,7 +1959,7 @@ gl_Position = projectionMatrix * mvPosition;`,Ky=`#ifdef DITHERING vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition; } #pragma unroll_loop_end -#endif`,sb=`float getShadowMask() { +#endif`,sy=`float getShadowMask() { float shadow = 1.0; #ifdef USE_SHADOWMAP #if NUM_DIR_LIGHT_SHADOWS > 0 @@ -1991,12 +1991,12 @@ gl_Position = projectionMatrix * mvPosition;`,Ky=`#ifdef DITHERING #endif #endif return shadow; -}`,rb=`#ifdef USE_SKINNING +}`,ry=`#ifdef USE_SKINNING mat4 boneMatX = getBoneMatrix( skinIndex.x ); mat4 boneMatY = getBoneMatrix( skinIndex.y ); mat4 boneMatZ = getBoneMatrix( skinIndex.z ); mat4 boneMatW = getBoneMatrix( skinIndex.w ); -#endif`,ab=`#ifdef USE_SKINNING +#endif`,ay=`#ifdef USE_SKINNING uniform mat4 bindMatrix; uniform mat4 bindMatrixInverse; uniform highp sampler2D boneTexture; @@ -2011,7 +2011,7 @@ gl_Position = projectionMatrix * mvPosition;`,Ky=`#ifdef DITHERING vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 ); return mat4( v1, v2, v3, v4 ); } -#endif`,ob=`#ifdef USE_SKINNING +#endif`,oy=`#ifdef USE_SKINNING vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 ); vec4 skinned = vec4( 0.0 ); skinned += boneMatX * skinVertex * skinWeight.x; @@ -2019,7 +2019,7 @@ gl_Position = projectionMatrix * mvPosition;`,Ky=`#ifdef DITHERING skinned += boneMatZ * skinVertex * skinWeight.z; skinned += boneMatW * skinVertex * skinWeight.w; transformed = ( bindMatrixInverse * skinned ).xyz; -#endif`,lb=`#ifdef USE_SKINNING +#endif`,ly=`#ifdef USE_SKINNING mat4 skinMatrix = mat4( 0.0 ); skinMatrix += skinWeight.x * boneMatX; skinMatrix += skinWeight.y * boneMatY; @@ -2030,17 +2030,17 @@ gl_Position = projectionMatrix * mvPosition;`,Ky=`#ifdef DITHERING #ifdef USE_TANGENT objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz; #endif -#endif`,cb=`float specularStrength; +#endif`,cy=`float specularStrength; #ifdef USE_SPECULARMAP vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv ); specularStrength = texelSpecular.r; #else specularStrength = 1.0; -#endif`,hb=`#ifdef USE_SPECULARMAP +#endif`,hy=`#ifdef USE_SPECULARMAP uniform sampler2D specularMap; -#endif`,ub=`#if defined( TONE_MAPPING ) +#endif`,uy=`#if defined( TONE_MAPPING ) gl_FragColor.rgb = toneMapping( gl_FragColor.rgb ); -#endif`,db=`#ifndef saturate +#endif`,dy=`#ifndef saturate #define saturate( a ) clamp( a, 0.0, 1.0 ) #endif uniform float toneMappingExposure; @@ -2137,7 +2137,7 @@ vec3 NeutralToneMapping( vec3 color ) { float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. ); return mix( color, vec3( newPeak ), g ); } -vec3 CustomToneMapping( vec3 color ) { return color; }`,pb=`#ifdef USE_TRANSMISSION +vec3 CustomToneMapping( vec3 color ) { return color; }`,py=`#ifdef USE_TRANSMISSION material.transmission = transmission; material.transmissionAlpha = 1.0; material.thickness = thickness; @@ -2158,7 +2158,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,pb=`#ifdef USE_TRANSMISS material.attenuationColor, material.attenuationDistance ); material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission ); totalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission ); -#endif`,fb=`#ifdef USE_TRANSMISSION +#endif`,fy=`#ifdef USE_TRANSMISSION uniform float transmission; uniform float thickness; uniform float attenuationDistance; @@ -2284,7 +2284,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,pb=`#ifdef USE_TRANSMISS float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0; return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); } -#endif`,mb=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`,my=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) varying vec2 vUv; #endif #ifdef USE_MAP @@ -2354,7 +2354,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,pb=`#ifdef USE_TRANSMISS #ifdef USE_THICKNESSMAP uniform mat3 thicknessMapTransform; varying vec2 vThicknessMapUv; -#endif`,gb=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`,gy=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) varying vec2 vUv; #endif #ifdef USE_MAP @@ -2448,7 +2448,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,pb=`#ifdef USE_TRANSMISS #ifdef USE_THICKNESSMAP uniform mat3 thicknessMapTransform; varying vec2 vThicknessMapUv; -#endif`,xb=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`,xy=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) vUv = vec3( uv, 1 ).xy; #endif #ifdef USE_MAP @@ -2519,7 +2519,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,pb=`#ifdef USE_TRANSMISS #endif #ifdef USE_THICKNESSMAP vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy; -#endif`,vb=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 +#endif`,vy=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 vec4 worldPosition = vec4( transformed, 1.0 ); #ifdef USE_BATCHING worldPosition = batchingMatrix * worldPosition; @@ -2528,7 +2528,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,pb=`#ifdef USE_TRANSMISS worldPosition = instanceMatrix * worldPosition; #endif worldPosition = modelMatrix * worldPosition; -#endif`;const et={alphahash_fragment:bv,alphahash_pars_fragment:_v,alphamap_fragment:Mv,alphamap_pars_fragment:wv,alphatest_fragment:Sv,alphatest_pars_fragment:Ev,aomap_fragment:Tv,aomap_pars_fragment:Cv,batching_pars_vertex:Av,batching_vertex:Pv,begin_vertex:Rv,beginnormal_vertex:Lv,bsdfs:Dv,iridescence_fragment:Iv,bumpmap_pars_fragment:Nv,clipping_planes_fragment:Bv,clipping_planes_pars_fragment:kv,clipping_planes_pars_vertex:Uv,clipping_planes_vertex:Ov,color_fragment:zv,color_pars_fragment:Fv,color_pars_vertex:Hv,color_vertex:Vv,common:Gv,cube_uv_reflection_fragment:Wv,defaultnormal_vertex:Xv,displacementmap_pars_vertex:jv,displacementmap_vertex:qv,emissivemap_fragment:Zv,emissivemap_pars_fragment:Yv,colorspace_fragment:$v,colorspace_pars_fragment:Kv,envmap_fragment:Jv,envmap_common_pars_fragment:Qv,envmap_pars_fragment:ey,envmap_pars_vertex:ty,envmap_physical_pars_fragment:dy,envmap_vertex:ny,fog_vertex:iy,fog_pars_vertex:sy,fog_fragment:ry,fog_pars_fragment:ay,gradientmap_pars_fragment:oy,lightmap_pars_fragment:ly,lights_lambert_fragment:cy,lights_lambert_pars_fragment:hy,lights_pars_begin:uy,lights_toon_fragment:py,lights_toon_pars_fragment:fy,lights_phong_fragment:my,lights_phong_pars_fragment:gy,lights_physical_fragment:xy,lights_physical_pars_fragment:vy,lights_fragment_begin:yy,lights_fragment_maps:by,lights_fragment_end:_y,logdepthbuf_fragment:My,logdepthbuf_pars_fragment:wy,logdepthbuf_pars_vertex:Sy,logdepthbuf_vertex:Ey,map_fragment:Ty,map_pars_fragment:Cy,map_particle_fragment:Ay,map_particle_pars_fragment:Py,metalnessmap_fragment:Ry,metalnessmap_pars_fragment:Ly,morphinstance_vertex:Dy,morphcolor_vertex:Iy,morphnormal_vertex:Ny,morphtarget_pars_vertex:By,morphtarget_vertex:ky,normal_fragment_begin:Uy,normal_fragment_maps:Oy,normal_pars_fragment:zy,normal_pars_vertex:Fy,normal_vertex:Hy,normalmap_pars_fragment:Vy,clearcoat_normal_fragment_begin:Gy,clearcoat_normal_fragment_maps:Wy,clearcoat_pars_fragment:Xy,iridescence_pars_fragment:jy,opaque_fragment:qy,packing:Zy,premultiplied_alpha_fragment:Yy,project_vertex:$y,dithering_fragment:Ky,dithering_pars_fragment:Jy,roughnessmap_fragment:Qy,roughnessmap_pars_fragment:eb,shadowmap_pars_fragment:tb,shadowmap_pars_vertex:nb,shadowmap_vertex:ib,shadowmask_pars_fragment:sb,skinbase_vertex:rb,skinning_pars_vertex:ab,skinning_vertex:ob,skinnormal_vertex:lb,specularmap_fragment:cb,specularmap_pars_fragment:hb,tonemapping_fragment:ub,tonemapping_pars_fragment:db,transmission_fragment:pb,transmission_pars_fragment:fb,uv_pars_fragment:mb,uv_pars_vertex:gb,uv_vertex:xb,worldpos_vertex:vb,background_vert:`varying vec2 vUv; +#endif`;const et={alphahash_fragment:yv,alphahash_pars_fragment:_v,alphamap_fragment:Mv,alphamap_pars_fragment:wv,alphatest_fragment:Sv,alphatest_pars_fragment:Ev,aomap_fragment:Cv,aomap_pars_fragment:Tv,batching_pars_vertex:Av,batching_vertex:Pv,begin_vertex:Rv,beginnormal_vertex:Lv,bsdfs:Dv,iridescence_fragment:Iv,bumpmap_pars_fragment:Nv,clipping_planes_fragment:Bv,clipping_planes_pars_fragment:kv,clipping_planes_pars_vertex:Uv,clipping_planes_vertex:Ov,color_fragment:zv,color_pars_fragment:Fv,color_pars_vertex:Hv,color_vertex:Vv,common:Gv,cube_uv_reflection_fragment:Wv,defaultnormal_vertex:Xv,displacementmap_pars_vertex:jv,displacementmap_vertex:qv,emissivemap_fragment:Zv,emissivemap_pars_fragment:Yv,colorspace_fragment:$v,colorspace_pars_fragment:Kv,envmap_fragment:Jv,envmap_common_pars_fragment:Qv,envmap_pars_fragment:eb,envmap_pars_vertex:tb,envmap_physical_pars_fragment:db,envmap_vertex:nb,fog_vertex:ib,fog_pars_vertex:sb,fog_fragment:rb,fog_pars_fragment:ab,gradientmap_pars_fragment:ob,lightmap_pars_fragment:lb,lights_lambert_fragment:cb,lights_lambert_pars_fragment:hb,lights_pars_begin:ub,lights_toon_fragment:pb,lights_toon_pars_fragment:fb,lights_phong_fragment:mb,lights_phong_pars_fragment:gb,lights_physical_fragment:xb,lights_physical_pars_fragment:vb,lights_fragment_begin:bb,lights_fragment_maps:yb,lights_fragment_end:_b,logdepthbuf_fragment:Mb,logdepthbuf_pars_fragment:wb,logdepthbuf_pars_vertex:Sb,logdepthbuf_vertex:Eb,map_fragment:Cb,map_pars_fragment:Tb,map_particle_fragment:Ab,map_particle_pars_fragment:Pb,metalnessmap_fragment:Rb,metalnessmap_pars_fragment:Lb,morphinstance_vertex:Db,morphcolor_vertex:Ib,morphnormal_vertex:Nb,morphtarget_pars_vertex:Bb,morphtarget_vertex:kb,normal_fragment_begin:Ub,normal_fragment_maps:Ob,normal_pars_fragment:zb,normal_pars_vertex:Fb,normal_vertex:Hb,normalmap_pars_fragment:Vb,clearcoat_normal_fragment_begin:Gb,clearcoat_normal_fragment_maps:Wb,clearcoat_pars_fragment:Xb,iridescence_pars_fragment:jb,opaque_fragment:qb,packing:Zb,premultiplied_alpha_fragment:Yb,project_vertex:$b,dithering_fragment:Kb,dithering_pars_fragment:Jb,roughnessmap_fragment:Qb,roughnessmap_pars_fragment:ey,shadowmap_pars_fragment:ty,shadowmap_pars_vertex:ny,shadowmap_vertex:iy,shadowmask_pars_fragment:sy,skinbase_vertex:ry,skinning_pars_vertex:ay,skinning_vertex:oy,skinnormal_vertex:ly,specularmap_fragment:cy,specularmap_pars_fragment:hy,tonemapping_fragment:uy,tonemapping_pars_fragment:dy,transmission_fragment:py,transmission_pars_fragment:fy,uv_pars_fragment:my,uv_pars_vertex:gy,uv_vertex:xy,worldpos_vertex:vy,background_vert:`varying vec2 vUv; uniform mat3 uvTransform; void main() { vUv = ( uvTransform * vec3( uv, 1 ) ).xy; @@ -3584,7 +3584,7 @@ void main() { #include #include #include -}`},Pe={common:{diffuse:{value:new Fe(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new $e},alphaMap:{value:null},alphaMapTransform:{value:new $e},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new $e}},envmap:{envMap:{value:null},envMapRotation:{value:new $e},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new $e}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new $e}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new $e},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new $e},normalScale:{value:new he(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new $e},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new $e}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new $e}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new $e}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Fe(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new Fe(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new $e},alphaTest:{value:0},uvTransform:{value:new $e}},sprite:{diffuse:{value:new Fe(16777215)},opacity:{value:1},center:{value:new he(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new $e},alphaMap:{value:null},alphaMapTransform:{value:new $e},alphaTest:{value:0}}},ui={basic:{uniforms:dn([Pe.common,Pe.specularmap,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.fog]),vertexShader:et.meshbasic_vert,fragmentShader:et.meshbasic_frag},lambert:{uniforms:dn([Pe.common,Pe.specularmap,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.fog,Pe.lights,{emissive:{value:new Fe(0)}}]),vertexShader:et.meshlambert_vert,fragmentShader:et.meshlambert_frag},phong:{uniforms:dn([Pe.common,Pe.specularmap,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.fog,Pe.lights,{emissive:{value:new Fe(0)},specular:{value:new Fe(1118481)},shininess:{value:30}}]),vertexShader:et.meshphong_vert,fragmentShader:et.meshphong_frag},standard:{uniforms:dn([Pe.common,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.roughnessmap,Pe.metalnessmap,Pe.fog,Pe.lights,{emissive:{value:new Fe(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:et.meshphysical_vert,fragmentShader:et.meshphysical_frag},toon:{uniforms:dn([Pe.common,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.gradientmap,Pe.fog,Pe.lights,{emissive:{value:new Fe(0)}}]),vertexShader:et.meshtoon_vert,fragmentShader:et.meshtoon_frag},matcap:{uniforms:dn([Pe.common,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.fog,{matcap:{value:null}}]),vertexShader:et.meshmatcap_vert,fragmentShader:et.meshmatcap_frag},points:{uniforms:dn([Pe.points,Pe.fog]),vertexShader:et.points_vert,fragmentShader:et.points_frag},dashed:{uniforms:dn([Pe.common,Pe.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:et.linedashed_vert,fragmentShader:et.linedashed_frag},depth:{uniforms:dn([Pe.common,Pe.displacementmap]),vertexShader:et.depth_vert,fragmentShader:et.depth_frag},normal:{uniforms:dn([Pe.common,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,{opacity:{value:1}}]),vertexShader:et.meshnormal_vert,fragmentShader:et.meshnormal_frag},sprite:{uniforms:dn([Pe.sprite,Pe.fog]),vertexShader:et.sprite_vert,fragmentShader:et.sprite_frag},background:{uniforms:{uvTransform:{value:new $e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:et.background_vert,fragmentShader:et.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new $e}},vertexShader:et.backgroundCube_vert,fragmentShader:et.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:et.cube_vert,fragmentShader:et.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:et.equirect_vert,fragmentShader:et.equirect_frag},distanceRGBA:{uniforms:dn([Pe.common,Pe.displacementmap,{referencePosition:{value:new P},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:et.distanceRGBA_vert,fragmentShader:et.distanceRGBA_frag},shadow:{uniforms:dn([Pe.lights,Pe.fog,{color:{value:new Fe(0)},opacity:{value:1}}]),vertexShader:et.shadow_vert,fragmentShader:et.shadow_frag}};ui.physical={uniforms:dn([ui.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new $e},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new $e},clearcoatNormalScale:{value:new he(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new $e},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new $e},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new $e},sheen:{value:0},sheenColor:{value:new Fe(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new $e},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new $e},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new $e},transmissionSamplerSize:{value:new he},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new $e},attenuationDistance:{value:0},attenuationColor:{value:new Fe(0)},specularColor:{value:new Fe(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new $e},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new $e},anisotropyVector:{value:new he},anisotropyMap:{value:null},anisotropyMapTransform:{value:new $e}}]),vertexShader:et.meshphysical_vert,fragmentShader:et.meshphysical_frag};const Zo={r:0,b:0,g:0},Es=new Pn,yb=new De;function bb(s,e,t,n,i,r,a){const o=new Fe(0);let l=r===!0?0:1,c,h,u=null,p=0,d=null;function m(v){let b=v.isScene===!0?v.background:null;return b&&b.isTexture&&(b=(v.backgroundBlurriness>0?t:e).get(b)),b}function f(v){let b=!1;const _=m(v);_===null?g(o,l):_&&_.isColor&&(g(_,1),b=!0);const M=s.xr.getEnvironmentBlendMode();M==="additive"?n.buffers.color.setClear(0,0,0,1,a):M==="alpha-blend"&&n.buffers.color.setClear(0,0,0,0,a),(s.autoClear||b)&&(n.buffers.depth.setTest(!0),n.buffers.depth.setMask(!0),n.buffers.color.setMask(!0),s.clear(s.autoClearColor,s.autoClearDepth,s.autoClearStencil))}function x(v,b){const _=m(b);_&&(_.isCubeTexture||_.mapping===Ka)?(h===void 0&&(h=new rt(new Zi(1,1,1),new Lt({name:"BackgroundCubeMaterial",uniforms:dr(ui.backgroundCube.uniforms),vertexShader:ui.backgroundCube.vertexShader,fragmentShader:ui.backgroundCube.fragmentShader,side:sn,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),h.geometry.deleteAttribute("normal"),h.geometry.deleteAttribute("uv"),h.onBeforeRender=function(M,T,R){this.matrixWorld.copyPosition(R.matrixWorld)},Object.defineProperty(h.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),i.update(h)),Es.copy(b.backgroundRotation),Es.x*=-1,Es.y*=-1,Es.z*=-1,_.isCubeTexture&&_.isRenderTargetTexture===!1&&(Es.y*=-1,Es.z*=-1),h.material.uniforms.envMap.value=_,h.material.uniforms.flipEnvMap.value=_.isCubeTexture&&_.isRenderTargetTexture===!1?-1:1,h.material.uniforms.backgroundBlurriness.value=b.backgroundBlurriness,h.material.uniforms.backgroundIntensity.value=b.backgroundIntensity,h.material.uniforms.backgroundRotation.value.setFromMatrix4(yb.makeRotationFromEuler(Es)),h.material.toneMapped=it.getTransfer(_.colorSpace)!==ct,(u!==_||p!==_.version||d!==s.toneMapping)&&(h.material.needsUpdate=!0,u=_,p=_.version,d=s.toneMapping),h.layers.enableAll(),v.unshift(h,h.geometry,h.material,0,0,null)):_&&_.isTexture&&(c===void 0&&(c=new rt(new Ss(2,2),new Lt({name:"BackgroundMaterial",uniforms:dr(ui.background.uniforms),vertexShader:ui.background.vertexShader,fragmentShader:ui.background.fragmentShader,side:kn,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),c.geometry.deleteAttribute("normal"),Object.defineProperty(c.material,"map",{get:function(){return this.uniforms.t2D.value}}),i.update(c)),c.material.uniforms.t2D.value=_,c.material.uniforms.backgroundIntensity.value=b.backgroundIntensity,c.material.toneMapped=it.getTransfer(_.colorSpace)!==ct,_.matrixAutoUpdate===!0&&_.updateMatrix(),c.material.uniforms.uvTransform.value.copy(_.matrix),(u!==_||p!==_.version||d!==s.toneMapping)&&(c.material.needsUpdate=!0,u=_,p=_.version,d=s.toneMapping),c.layers.enableAll(),v.unshift(c,c.geometry,c.material,0,0,null))}function g(v,b){v.getRGB(Zo,vp(s)),n.buffers.color.setClear(Zo.r,Zo.g,Zo.b,b,a)}function y(){h!==void 0&&(h.geometry.dispose(),h.material.dispose(),h=void 0),c!==void 0&&(c.geometry.dispose(),c.material.dispose(),c=void 0)}return{getClearColor:function(){return o},setClearColor:function(v,b=1){o.set(v),l=b,g(o,l)},getClearAlpha:function(){return l},setClearAlpha:function(v){l=v,g(o,l)},render:f,addToRenderList:x,dispose:y}}function _b(s,e){const t=s.getParameter(s.MAX_VERTEX_ATTRIBS),n={},i=p(null);let r=i,a=!1;function o(E,L,A,I,w){let z=!1;const G=u(I,A,L);r!==G&&(r=G,c(r.object)),z=d(E,I,A,w),z&&m(E,I,A,w),w!==null&&e.update(w,s.ELEMENT_ARRAY_BUFFER),(z||a)&&(a=!1,b(E,L,A,I),w!==null&&s.bindBuffer(s.ELEMENT_ARRAY_BUFFER,e.get(w).buffer))}function l(){return s.createVertexArray()}function c(E){return s.bindVertexArray(E)}function h(E){return s.deleteVertexArray(E)}function u(E,L,A){const I=A.wireframe===!0;let w=n[E.id];w===void 0&&(w={},n[E.id]=w);let z=w[L.id];z===void 0&&(z={},w[L.id]=z);let G=z[I];return G===void 0&&(G=p(l()),z[I]=G),G}function p(E){const L=[],A=[],I=[];for(let w=0;w=0){const ie=w[Y];let W=z[Y];if(W===void 0&&(Y==="instanceMatrix"&&E.instanceMatrix&&(W=E.instanceMatrix),Y==="instanceColor"&&E.instanceColor&&(W=E.instanceColor)),ie===void 0||ie.attribute!==W||W&&ie.data!==W.data)return!0;G++}return r.attributesNum!==G||r.index!==I}function m(E,L,A,I){const w={},z=L.attributes;let G=0;const j=A.getAttributes();for(const Y in j)if(j[Y].location>=0){let ie=z[Y];ie===void 0&&(Y==="instanceMatrix"&&E.instanceMatrix&&(ie=E.instanceMatrix),Y==="instanceColor"&&E.instanceColor&&(ie=E.instanceColor));const W={};W.attribute=ie,ie&&ie.data&&(W.data=ie.data),w[Y]=W,G++}r.attributes=w,r.attributesNum=G,r.index=I}function f(){const E=r.newAttributes;for(let L=0,A=E.length;L=0){let q=w[j];if(q===void 0&&(j==="instanceMatrix"&&E.instanceMatrix&&(q=E.instanceMatrix),j==="instanceColor"&&E.instanceColor&&(q=E.instanceColor)),q!==void 0){const ie=q.normalized,W=q.itemSize,$=e.get(q);if($===void 0)continue;const fe=$.buffer,me=$.type,de=$.bytesPerElement,se=me===s.INT||me===s.UNSIGNED_INT||q.gpuType===mc;if(q.isInterleavedBufferAttribute){const ce=q.data,pe=ce.stride,ye=q.offset;if(ce.isInstancedInterleavedBuffer){for(let Se=0;Se0&&s.getShaderPrecisionFormat(s.FRAGMENT_SHADER,s.HIGH_FLOAT).precision>0)return"highp";T="mediump"}return T==="mediump"&&s.getShaderPrecisionFormat(s.VERTEX_SHADER,s.MEDIUM_FLOAT).precision>0&&s.getShaderPrecisionFormat(s.FRAGMENT_SHADER,s.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let c=t.precision!==void 0?t.precision:"highp";const h=l(c);h!==c&&(He("WebGLRenderer:",c,"not supported, using",h,"instead."),c=h);const u=t.logarithmicDepthBuffer===!0,p=t.reversedDepthBuffer===!0&&e.has("EXT_clip_control"),d=s.getParameter(s.MAX_TEXTURE_IMAGE_UNITS),m=s.getParameter(s.MAX_VERTEX_TEXTURE_IMAGE_UNITS),f=s.getParameter(s.MAX_TEXTURE_SIZE),x=s.getParameter(s.MAX_CUBE_MAP_TEXTURE_SIZE),g=s.getParameter(s.MAX_VERTEX_ATTRIBS),y=s.getParameter(s.MAX_VERTEX_UNIFORM_VECTORS),v=s.getParameter(s.MAX_VARYING_VECTORS),b=s.getParameter(s.MAX_FRAGMENT_UNIFORM_VECTORS),_=m>0,M=s.getParameter(s.MAX_SAMPLES);return{isWebGL2:!0,getMaxAnisotropy:r,getMaxPrecision:l,textureFormatReadable:a,textureTypeReadable:o,precision:c,logarithmicDepthBuffer:u,reversedDepthBuffer:p,maxTextures:d,maxVertexTextures:m,maxTextureSize:f,maxCubemapSize:x,maxAttributes:g,maxVertexUniforms:y,maxVaryings:v,maxFragmentUniforms:b,vertexTextures:_,maxSamples:M}}function Sb(s){const e=this;let t=null,n=0,i=!1,r=!1;const a=new Dt,o=new $e,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(u,p){const d=u.length!==0||p||n!==0||i;return i=p,n=u.length,d},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(u,p){t=h(u,p,0)},this.setState=function(u,p,d){const m=u.clippingPlanes,f=u.clipIntersection,x=u.clipShadows,g=s.get(u);if(!i||m===null||m.length===0||r&&!x)r?h(null):c();else{const y=r?0:n,v=y*4;let b=g.clippingState||null;l.value=b,b=h(m,p,v,d);for(let _=0;_!==v;++_)b[_]=t[_];g.clippingState=b,this.numIntersection=f?this.numPlanes:0,this.numPlanes+=y}};function c(){l.value!==t&&(l.value=t,l.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function h(u,p,d,m){const f=u!==null?u.length:0;let x=null;if(f!==0){if(x=l.value,m!==!0||x===null){const g=d+f*4,y=p.matrixWorldInverse;o.getNormalMatrix(y),(x===null||x.length0){const c=new Xx(l.height);return c.fromEquirectangularTexture(s,a),e.set(a,c),a.addEventListener("dispose",i),t(c.texture,a.mapping)}else return null}}return a}function i(a){const o=a.target;o.removeEventListener("dispose",i);const l=e.get(o);l!==void 0&&(e.delete(o),l.dispose())}function r(){e=new WeakMap}return{get:n,dispose:r}}const es=4,_f=[.125,.215,.35,.446,.526,.582],Ts=20,Tb=256,Ea=new Ai,Mf=new Fe;let Qh=null,eu=0,tu=0,nu=!1;const Cb=new P;class iu{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._backgroundBox=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._blurMaterial=null,this._ggxMaterial=null}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=Cb}=r;Qh=this._renderer.getRenderTarget(),eu=this._renderer.getActiveCubeFace(),tu=this._renderer.getActiveMipmapLevel(),nu=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const l=this._allocateTargets();return l.depthBuffer=!0,this._sceneToCubeUV(e,n,i,l,o),t>0&&this._blur(l,0,0,t),this._applyPMREM(l),this._cleanup(l),l}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=Ef(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=Sf(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose(),this._backgroundBox!==null&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._ggxMaterial!==null&&this._ggxMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let e=0;e2?_:0,_,_),u.setRenderTarget(i),g&&u.render(f,l),u.render(e,l)}u.toneMapping=d,u.autoClear=p,e.background=y}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===Ks||e.mapping===Js;i?(this._cubemapMaterial===null&&(this._cubemapMaterial=Ef()),this._cubemapMaterial.uniforms.flipEnvMap.value=e.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=Sf());const r=i?this._cubemapMaterial:this._equirectMaterial,a=this._lodMeshes[0];a.material=r;const o=r.uniforms;o.envMap.value=e;const l=this._cubeSize;Lr(t,0,0,3*l,2*l),n.setRenderTarget(t),n.render(a,Ea)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodMeshes.length;for(let r=1;rm-es?n-m+es:0),g=4*(this._cubeSize-f);l.envMap.value=e.texture,l.roughness.value=d,l.mipInt.value=m-t,Lr(r,x,g,3*f,2*f),i.setRenderTarget(r),i.render(o,Ea),l.envMap.value=r.texture,l.roughness.value=0,l.mipInt.value=m-n,Lr(e,x,g,3*f,2*f),i.setRenderTarget(e),i.render(o,Ea)}_blur(e,t,n,i,r){const a=this._pingPongRenderTarget;this._halfBlur(e,a,t,n,i,"latitudinal",r),this._halfBlur(a,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,a,o){const l=this._renderer,c=this._blurMaterial;a!=="latitudinal"&&a!=="longitudinal"&&Qe("blur direction must be either latitudinal or longitudinal!");const h=3,u=this._lodMeshes[i];u.material=c;const p=c.uniforms,d=this._sizeLods[n]-1,m=isFinite(r)?Math.PI/(2*d):2*Math.PI/(2*Ts-1),f=r/m,x=isFinite(r)?1+Math.floor(h*f):Ts;x>Ts&&He(`sigmaRadians, ${r}, is too large and will clip, as it requested ${x} samples when the maximum is set to ${Ts}`);const g=[];let y=0;for(let T=0;Tv-es?i-v+es:0),M=4*(this._cubeSize-b);Lr(t,_,M,3*b,2*b),l.setRenderTarget(t),l.render(u,Ea)}}function Ab(s){const e=[],t=[],n=[];let i=s;const r=s-es+1+_f.length;for(let a=0;as-es?l=_f[a-s+es-1]:a===0&&(l=0),t.push(l);const c=1/(o-2),h=-c,u=1+c,p=[h,h,u,h,u,u,h,h,u,u,h,u],d=6,m=6,f=3,x=2,g=1,y=new Float32Array(f*m*d),v=new Float32Array(x*m*d),b=new Float32Array(g*m*d);for(let M=0;M2?0:-1,S=[T,R,0,T+2/3,R,0,T+2/3,R+1,0,T,R,0,T+2/3,R+1,0,T,R+1,0];y.set(S,f*m*M),v.set(p,x*m*M);const E=[M,M,M,M,M,M];b.set(E,g*m*M)}const _=new dt;_.setAttribute("position",new yt(y,f)),_.setAttribute("uv",new yt(v,x)),_.setAttribute("faceIndex",new yt(b,g)),n.push(new rt(_,null)),i>es&&i--}return{lodMeshes:n,sizeLods:e,sigmas:t}}function wf(s,e,t){const n=new Cn(s,e,t);return n.texture.mapping=Ka,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function Lr(s,e,t,n,i){s.viewport.set(e,t,n,i),s.scissor.set(e,t,n,i)}function Pb(s,e,t){return new Lt({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:Tb,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/t,CUBEUV_MAX_MIP:`${s}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:Yo(),fragmentShader:` +}`},Pe={common:{diffuse:{value:new Fe(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new $e},alphaMap:{value:null},alphaMapTransform:{value:new $e},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new $e}},envmap:{envMap:{value:null},envMapRotation:{value:new $e},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new $e}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new $e}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new $e},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new $e},normalScale:{value:new he(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new $e},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new $e}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new $e}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new $e}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Fe(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new Fe(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new $e},alphaTest:{value:0},uvTransform:{value:new $e}},sprite:{diffuse:{value:new Fe(16777215)},opacity:{value:1},center:{value:new he(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new $e},alphaMap:{value:null},alphaMapTransform:{value:new $e},alphaTest:{value:0}}},ui={basic:{uniforms:dn([Pe.common,Pe.specularmap,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.fog]),vertexShader:et.meshbasic_vert,fragmentShader:et.meshbasic_frag},lambert:{uniforms:dn([Pe.common,Pe.specularmap,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.fog,Pe.lights,{emissive:{value:new Fe(0)}}]),vertexShader:et.meshlambert_vert,fragmentShader:et.meshlambert_frag},phong:{uniforms:dn([Pe.common,Pe.specularmap,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.fog,Pe.lights,{emissive:{value:new Fe(0)},specular:{value:new Fe(1118481)},shininess:{value:30}}]),vertexShader:et.meshphong_vert,fragmentShader:et.meshphong_frag},standard:{uniforms:dn([Pe.common,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.roughnessmap,Pe.metalnessmap,Pe.fog,Pe.lights,{emissive:{value:new Fe(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:et.meshphysical_vert,fragmentShader:et.meshphysical_frag},toon:{uniforms:dn([Pe.common,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.gradientmap,Pe.fog,Pe.lights,{emissive:{value:new Fe(0)}}]),vertexShader:et.meshtoon_vert,fragmentShader:et.meshtoon_frag},matcap:{uniforms:dn([Pe.common,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.fog,{matcap:{value:null}}]),vertexShader:et.meshmatcap_vert,fragmentShader:et.meshmatcap_frag},points:{uniforms:dn([Pe.points,Pe.fog]),vertexShader:et.points_vert,fragmentShader:et.points_frag},dashed:{uniforms:dn([Pe.common,Pe.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:et.linedashed_vert,fragmentShader:et.linedashed_frag},depth:{uniforms:dn([Pe.common,Pe.displacementmap]),vertexShader:et.depth_vert,fragmentShader:et.depth_frag},normal:{uniforms:dn([Pe.common,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,{opacity:{value:1}}]),vertexShader:et.meshnormal_vert,fragmentShader:et.meshnormal_frag},sprite:{uniforms:dn([Pe.sprite,Pe.fog]),vertexShader:et.sprite_vert,fragmentShader:et.sprite_frag},background:{uniforms:{uvTransform:{value:new $e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:et.background_vert,fragmentShader:et.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new $e}},vertexShader:et.backgroundCube_vert,fragmentShader:et.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:et.cube_vert,fragmentShader:et.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:et.equirect_vert,fragmentShader:et.equirect_frag},distanceRGBA:{uniforms:dn([Pe.common,Pe.displacementmap,{referencePosition:{value:new P},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:et.distanceRGBA_vert,fragmentShader:et.distanceRGBA_frag},shadow:{uniforms:dn([Pe.lights,Pe.fog,{color:{value:new Fe(0)},opacity:{value:1}}]),vertexShader:et.shadow_vert,fragmentShader:et.shadow_frag}};ui.physical={uniforms:dn([ui.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new $e},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new $e},clearcoatNormalScale:{value:new he(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new $e},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new $e},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new $e},sheen:{value:0},sheenColor:{value:new Fe(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new $e},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new $e},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new $e},transmissionSamplerSize:{value:new he},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new $e},attenuationDistance:{value:0},attenuationColor:{value:new Fe(0)},specularColor:{value:new Fe(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new $e},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new $e},anisotropyVector:{value:new he},anisotropyMap:{value:null},anisotropyMapTransform:{value:new $e}}]),vertexShader:et.meshphysical_vert,fragmentShader:et.meshphysical_frag};const Zo={r:0,b:0,g:0},Es=new Pn,by=new De;function yy(s,e,t,n,i,r,a){const o=new Fe(0);let l=r===!0?0:1,c,h,u=null,p=0,d=null;function m(v){let y=v.isScene===!0?v.background:null;return y&&y.isTexture&&(y=(v.backgroundBlurriness>0?t:e).get(y)),y}function f(v){let y=!1;const _=m(v);_===null?g(o,l):_&&_.isColor&&(g(_,1),y=!0);const M=s.xr.getEnvironmentBlendMode();M==="additive"?n.buffers.color.setClear(0,0,0,1,a):M==="alpha-blend"&&n.buffers.color.setClear(0,0,0,0,a),(s.autoClear||y)&&(n.buffers.depth.setTest(!0),n.buffers.depth.setMask(!0),n.buffers.color.setMask(!0),s.clear(s.autoClearColor,s.autoClearDepth,s.autoClearStencil))}function x(v,y){const _=m(y);_&&(_.isCubeTexture||_.mapping===Ka)?(h===void 0&&(h=new rt(new Zi(1,1,1),new Lt({name:"BackgroundCubeMaterial",uniforms:dr(ui.backgroundCube.uniforms),vertexShader:ui.backgroundCube.vertexShader,fragmentShader:ui.backgroundCube.fragmentShader,side:sn,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),h.geometry.deleteAttribute("normal"),h.geometry.deleteAttribute("uv"),h.onBeforeRender=function(M,C,R){this.matrixWorld.copyPosition(R.matrixWorld)},Object.defineProperty(h.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),i.update(h)),Es.copy(y.backgroundRotation),Es.x*=-1,Es.y*=-1,Es.z*=-1,_.isCubeTexture&&_.isRenderTargetTexture===!1&&(Es.y*=-1,Es.z*=-1),h.material.uniforms.envMap.value=_,h.material.uniforms.flipEnvMap.value=_.isCubeTexture&&_.isRenderTargetTexture===!1?-1:1,h.material.uniforms.backgroundBlurriness.value=y.backgroundBlurriness,h.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,h.material.uniforms.backgroundRotation.value.setFromMatrix4(by.makeRotationFromEuler(Es)),h.material.toneMapped=it.getTransfer(_.colorSpace)!==ct,(u!==_||p!==_.version||d!==s.toneMapping)&&(h.material.needsUpdate=!0,u=_,p=_.version,d=s.toneMapping),h.layers.enableAll(),v.unshift(h,h.geometry,h.material,0,0,null)):_&&_.isTexture&&(c===void 0&&(c=new rt(new Ss(2,2),new Lt({name:"BackgroundMaterial",uniforms:dr(ui.background.uniforms),vertexShader:ui.background.vertexShader,fragmentShader:ui.background.fragmentShader,side:kn,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),c.geometry.deleteAttribute("normal"),Object.defineProperty(c.material,"map",{get:function(){return this.uniforms.t2D.value}}),i.update(c)),c.material.uniforms.t2D.value=_,c.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,c.material.toneMapped=it.getTransfer(_.colorSpace)!==ct,_.matrixAutoUpdate===!0&&_.updateMatrix(),c.material.uniforms.uvTransform.value.copy(_.matrix),(u!==_||p!==_.version||d!==s.toneMapping)&&(c.material.needsUpdate=!0,u=_,p=_.version,d=s.toneMapping),c.layers.enableAll(),v.unshift(c,c.geometry,c.material,0,0,null))}function g(v,y){v.getRGB(Zo,vp(s)),n.buffers.color.setClear(Zo.r,Zo.g,Zo.b,y,a)}function b(){h!==void 0&&(h.geometry.dispose(),h.material.dispose(),h=void 0),c!==void 0&&(c.geometry.dispose(),c.material.dispose(),c=void 0)}return{getClearColor:function(){return o},setClearColor:function(v,y=1){o.set(v),l=y,g(o,l)},getClearAlpha:function(){return l},setClearAlpha:function(v){l=v,g(o,l)},render:f,addToRenderList:x,dispose:b}}function _y(s,e){const t=s.getParameter(s.MAX_VERTEX_ATTRIBS),n={},i=p(null);let r=i,a=!1;function o(E,L,A,I,w){let z=!1;const G=u(I,A,L);r!==G&&(r=G,c(r.object)),z=d(E,I,A,w),z&&m(E,I,A,w),w!==null&&e.update(w,s.ELEMENT_ARRAY_BUFFER),(z||a)&&(a=!1,y(E,L,A,I),w!==null&&s.bindBuffer(s.ELEMENT_ARRAY_BUFFER,e.get(w).buffer))}function l(){return s.createVertexArray()}function c(E){return s.bindVertexArray(E)}function h(E){return s.deleteVertexArray(E)}function u(E,L,A){const I=A.wireframe===!0;let w=n[E.id];w===void 0&&(w={},n[E.id]=w);let z=w[L.id];z===void 0&&(z={},w[L.id]=z);let G=z[I];return G===void 0&&(G=p(l()),z[I]=G),G}function p(E){const L=[],A=[],I=[];for(let w=0;w=0){const ie=w[Y];let W=z[Y];if(W===void 0&&(Y==="instanceMatrix"&&E.instanceMatrix&&(W=E.instanceMatrix),Y==="instanceColor"&&E.instanceColor&&(W=E.instanceColor)),ie===void 0||ie.attribute!==W||W&&ie.data!==W.data)return!0;G++}return r.attributesNum!==G||r.index!==I}function m(E,L,A,I){const w={},z=L.attributes;let G=0;const j=A.getAttributes();for(const Y in j)if(j[Y].location>=0){let ie=z[Y];ie===void 0&&(Y==="instanceMatrix"&&E.instanceMatrix&&(ie=E.instanceMatrix),Y==="instanceColor"&&E.instanceColor&&(ie=E.instanceColor));const W={};W.attribute=ie,ie&&ie.data&&(W.data=ie.data),w[Y]=W,G++}r.attributes=w,r.attributesNum=G,r.index=I}function f(){const E=r.newAttributes;for(let L=0,A=E.length;L=0){let q=w[j];if(q===void 0&&(j==="instanceMatrix"&&E.instanceMatrix&&(q=E.instanceMatrix),j==="instanceColor"&&E.instanceColor&&(q=E.instanceColor)),q!==void 0){const ie=q.normalized,W=q.itemSize,$=e.get(q);if($===void 0)continue;const fe=$.buffer,me=$.type,de=$.bytesPerElement,se=me===s.INT||me===s.UNSIGNED_INT||q.gpuType===mc;if(q.isInterleavedBufferAttribute){const ce=q.data,pe=ce.stride,be=q.offset;if(ce.isInstancedInterleavedBuffer){for(let Se=0;Se0&&s.getShaderPrecisionFormat(s.FRAGMENT_SHADER,s.HIGH_FLOAT).precision>0)return"highp";C="mediump"}return C==="mediump"&&s.getShaderPrecisionFormat(s.VERTEX_SHADER,s.MEDIUM_FLOAT).precision>0&&s.getShaderPrecisionFormat(s.FRAGMENT_SHADER,s.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let c=t.precision!==void 0?t.precision:"highp";const h=l(c);h!==c&&(He("WebGLRenderer:",c,"not supported, using",h,"instead."),c=h);const u=t.logarithmicDepthBuffer===!0,p=t.reversedDepthBuffer===!0&&e.has("EXT_clip_control"),d=s.getParameter(s.MAX_TEXTURE_IMAGE_UNITS),m=s.getParameter(s.MAX_VERTEX_TEXTURE_IMAGE_UNITS),f=s.getParameter(s.MAX_TEXTURE_SIZE),x=s.getParameter(s.MAX_CUBE_MAP_TEXTURE_SIZE),g=s.getParameter(s.MAX_VERTEX_ATTRIBS),b=s.getParameter(s.MAX_VERTEX_UNIFORM_VECTORS),v=s.getParameter(s.MAX_VARYING_VECTORS),y=s.getParameter(s.MAX_FRAGMENT_UNIFORM_VECTORS),_=m>0,M=s.getParameter(s.MAX_SAMPLES);return{isWebGL2:!0,getMaxAnisotropy:r,getMaxPrecision:l,textureFormatReadable:a,textureTypeReadable:o,precision:c,logarithmicDepthBuffer:u,reversedDepthBuffer:p,maxTextures:d,maxVertexTextures:m,maxTextureSize:f,maxCubemapSize:x,maxAttributes:g,maxVertexUniforms:b,maxVaryings:v,maxFragmentUniforms:y,vertexTextures:_,maxSamples:M}}function Sy(s){const e=this;let t=null,n=0,i=!1,r=!1;const a=new Dt,o=new $e,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(u,p){const d=u.length!==0||p||n!==0||i;return i=p,n=u.length,d},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(u,p){t=h(u,p,0)},this.setState=function(u,p,d){const m=u.clippingPlanes,f=u.clipIntersection,x=u.clipShadows,g=s.get(u);if(!i||m===null||m.length===0||r&&!x)r?h(null):c();else{const b=r?0:n,v=b*4;let y=g.clippingState||null;l.value=y,y=h(m,p,v,d);for(let _=0;_!==v;++_)y[_]=t[_];g.clippingState=y,this.numIntersection=f?this.numPlanes:0,this.numPlanes+=b}};function c(){l.value!==t&&(l.value=t,l.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function h(u,p,d,m){const f=u!==null?u.length:0;let x=null;if(f!==0){if(x=l.value,m!==!0||x===null){const g=d+f*4,b=p.matrixWorldInverse;o.getNormalMatrix(b),(x===null||x.length0){const c=new Xx(l.height);return c.fromEquirectangularTexture(s,a),e.set(a,c),a.addEventListener("dispose",i),t(c.texture,a.mapping)}else return null}}return a}function i(a){const o=a.target;o.removeEventListener("dispose",i);const l=e.get(o);l!==void 0&&(e.delete(o),l.dispose())}function r(){e=new WeakMap}return{get:n,dispose:r}}const es=4,_f=[.125,.215,.35,.446,.526,.582],Cs=20,Cy=256,Ea=new Ai,Mf=new Fe;let Qh=null,eu=0,tu=0,nu=!1;const Ty=new P;class iu{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._backgroundBox=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._blurMaterial=null,this._ggxMaterial=null}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=Ty}=r;Qh=this._renderer.getRenderTarget(),eu=this._renderer.getActiveCubeFace(),tu=this._renderer.getActiveMipmapLevel(),nu=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const l=this._allocateTargets();return l.depthBuffer=!0,this._sceneToCubeUV(e,n,i,l,o),t>0&&this._blur(l,0,0,t),this._applyPMREM(l),this._cleanup(l),l}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=Ef(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=Sf(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose(),this._backgroundBox!==null&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._ggxMaterial!==null&&this._ggxMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let e=0;e2?_:0,_,_),u.setRenderTarget(i),g&&u.render(f,l),u.render(e,l)}u.toneMapping=d,u.autoClear=p,e.background=b}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===Ks||e.mapping===Js;i?(this._cubemapMaterial===null&&(this._cubemapMaterial=Ef()),this._cubemapMaterial.uniforms.flipEnvMap.value=e.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=Sf());const r=i?this._cubemapMaterial:this._equirectMaterial,a=this._lodMeshes[0];a.material=r;const o=r.uniforms;o.envMap.value=e;const l=this._cubeSize;Lr(t,0,0,3*l,2*l),n.setRenderTarget(t),n.render(a,Ea)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodMeshes.length;for(let r=1;rm-es?n-m+es:0),g=4*(this._cubeSize-f);l.envMap.value=e.texture,l.roughness.value=d,l.mipInt.value=m-t,Lr(r,x,g,3*f,2*f),i.setRenderTarget(r),i.render(o,Ea),l.envMap.value=r.texture,l.roughness.value=0,l.mipInt.value=m-n,Lr(e,x,g,3*f,2*f),i.setRenderTarget(e),i.render(o,Ea)}_blur(e,t,n,i,r){const a=this._pingPongRenderTarget;this._halfBlur(e,a,t,n,i,"latitudinal",r),this._halfBlur(a,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,a,o){const l=this._renderer,c=this._blurMaterial;a!=="latitudinal"&&a!=="longitudinal"&&Qe("blur direction must be either latitudinal or longitudinal!");const h=3,u=this._lodMeshes[i];u.material=c;const p=c.uniforms,d=this._sizeLods[n]-1,m=isFinite(r)?Math.PI/(2*d):2*Math.PI/(2*Cs-1),f=r/m,x=isFinite(r)?1+Math.floor(h*f):Cs;x>Cs&&He(`sigmaRadians, ${r}, is too large and will clip, as it requested ${x} samples when the maximum is set to ${Cs}`);const g=[];let b=0;for(let C=0;Cv-es?i-v+es:0),M=4*(this._cubeSize-y);Lr(t,_,M,3*y,2*y),l.setRenderTarget(t),l.render(u,Ea)}}function Ay(s){const e=[],t=[],n=[];let i=s;const r=s-es+1+_f.length;for(let a=0;as-es?l=_f[a-s+es-1]:a===0&&(l=0),t.push(l);const c=1/(o-2),h=-c,u=1+c,p=[h,h,u,h,u,u,h,h,u,u,h,u],d=6,m=6,f=3,x=2,g=1,b=new Float32Array(f*m*d),v=new Float32Array(x*m*d),y=new Float32Array(g*m*d);for(let M=0;M2?0:-1,S=[C,R,0,C+2/3,R,0,C+2/3,R+1,0,C,R,0,C+2/3,R+1,0,C,R+1,0];b.set(S,f*m*M),v.set(p,x*m*M);const E=[M,M,M,M,M,M];y.set(E,g*m*M)}const _=new dt;_.setAttribute("position",new bt(b,f)),_.setAttribute("uv",new bt(v,x)),_.setAttribute("faceIndex",new bt(y,g)),n.push(new rt(_,null)),i>es&&i--}return{lodMeshes:n,sizeLods:e,sigmas:t}}function wf(s,e,t){const n=new Tn(s,e,t);return n.texture.mapping=Ka,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function Lr(s,e,t,n,i){s.viewport.set(e,t,n,i),s.scissor.set(e,t,n,i)}function Py(s,e,t){return new Lt({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:Cy,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/t,CUBEUV_MAX_MIP:`${s}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:Yo(),fragmentShader:` precision highp float; precision highp int; @@ -3692,7 +3692,7 @@ void main() { gl_FragColor = vec4(prefilteredColor, 1.0); } - `,blending:St,depthTest:!1,depthWrite:!1})}function Rb(s,e,t){const n=new Float32Array(Ts),i=new P(0,1,0);return new Lt({name:"SphericalGaussianBlur",defines:{n:Ts,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/t,CUBEUV_MAX_MIP:`${s}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i}},vertexShader:Yo(),fragmentShader:` + `,blending:St,depthTest:!1,depthWrite:!1})}function Ry(s,e,t){const n=new Float32Array(Cs),i=new P(0,1,0);return new Lt({name:"SphericalGaussianBlur",defines:{n:Cs,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/t,CUBEUV_MAX_MIP:`${s}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i}},vertexShader:Yo(),fragmentShader:` precision mediump float; precision mediump int; @@ -3842,7 +3842,7 @@ void main() { gl_Position = vec4( position, 1.0 ); } - `}function Lb(s){let e=new WeakMap,t=null;function n(o){if(o&&o.isTexture){const l=o.mapping,c=l===$a||l===fc,h=l===Ks||l===Js;if(c||h){let u=e.get(o);const p=u!==void 0?u.texture.pmremVersion:0;if(o.isRenderTargetTexture&&o.pmremVersion!==p)return t===null&&(t=new iu(s)),u=c?t.fromEquirectangular(o,u):t.fromCubemap(o,u),u.texture.pmremVersion=o.pmremVersion,e.set(o,u),u.texture;if(u!==void 0)return u.texture;{const d=o.image;return c&&d&&d.height>0||h&&d&&i(d)?(t===null&&(t=new iu(s)),u=c?t.fromEquirectangular(o):t.fromCubemap(o),u.texture.pmremVersion=o.pmremVersion,e.set(o,u),o.addEventListener("dispose",r),u.texture):null}}}return o}function i(o){let l=0;const c=6;for(let h=0;he.maxTextureSize&&(_=Math.ceil(b/e.maxTextureSize),b=e.maxTextureSize);const M=new Float32Array(b*_*4*u),T=new ip(M,b,_,u);T.type=hn,T.needsUpdate=!0;const R=v*4;for(let E=0;E0)return s;const i=e*t;let r=Lf[i];if(r===void 0&&(r=new Float32Array(i),Lf[i]=r),e!==0){n.toArray(r,0);for(let a=1,o=0;a!==e;++a)o+=t,s[a].toArray(r,o)}return r}function qt(s,e){if(s.length!==e.length)return!1;for(let t=0,n=s.length;t0||h&&d&&i(d)?(t===null&&(t=new iu(s)),u=c?t.fromEquirectangular(o):t.fromCubemap(o),u.texture.pmremVersion=o.pmremVersion,e.set(o,u),o.addEventListener("dispose",r),u.texture):null}}}return o}function i(o){let l=0;const c=6;for(let h=0;he.maxTextureSize&&(_=Math.ceil(y/e.maxTextureSize),y=e.maxTextureSize);const M=new Float32Array(y*_*4*u),C=new ip(M,y,_,u);C.type=hn,C.needsUpdate=!0;const R=v*4;for(let E=0;E0)return s;const i=e*t;let r=Lf[i];if(r===void 0&&(r=new Float32Array(i),Lf[i]=r),e!==0){n.toArray(r,0);for(let a=1,o=0;a!==e;++a)o+=t,s[a].toArray(r,o)}return r}function qt(s,e){if(s.length!==e.length)return!1;for(let t=0,n=s.length;t":" "} ${o}: ${t[a]}`)}return n.join(` `)}const Of=new $e;function L2(s){it._getMatrix(Of,it.workingColorSpace,s);const e=`mat3( ${Of.elements.map(t=>t.toFixed(4))} )`;switch(it.getTransfer(s)){case ao:return[e,"LinearTransferOETF"];case ct:return[e,"sRGBTransferOETF"];default:return He("WebGLProgram: Unsupported color space: ",s),[e,"LinearTransferOETF"]}}function zf(s,e,t){const n=s.getShaderParameter(e,s.COMPILE_STATUS),r=(s.getShaderInfoLog(e)||"").trim();if(n&&r==="")return"";const a=/ERROR: 0:(\d+)/.exec(r);if(a){const o=parseInt(a[1]);return t.toUpperCase()+` @@ -3850,9 +3850,9 @@ void main() { `+R2(s.getShaderSource(e),o)}else return r}function D2(s,e){const t=L2(e);return[`vec4 ${s}( vec4 value ) {`,` return ${t[1]}( vec4( value.rgb * ${t[0]}, value.a ) );`,"}"].join(` `)}function I2(s,e){let t;switch(e){case Ad:t="Linear";break;case Pd:t="Reinhard";break;case Rd:t="Cineon";break;case Ld:t="ACESFilmic";break;case Id:t="AgX";break;case Nd:t="Neutral";break;case Dd:t="Custom";break;default:He("WebGLProgram: Unsupported toneMapping:",e),t="Linear"}return"vec3 "+s+"( vec3 color ) { return "+t+"ToneMapping( color ); }"}const Jo=new P;function N2(){it.getLuminanceCoefficients(Jo);const s=Jo.x.toFixed(4),e=Jo.y.toFixed(4),t=Jo.z.toFixed(4);return["float luminance( const in vec3 rgb ) {",` const vec3 weights = vec3( ${s}, ${e}, ${t} );`," return dot( weights, rgb );","}"].join(` -`)}function B2(s){return[s.extensionClipCullDistance?"#extension GL_ANGLE_clip_cull_distance : require":"",s.extensionMultiDraw?"#extension GL_ANGLE_multi_draw : require":""].filter(Ta).join(` +`)}function B2(s){return[s.extensionClipCullDistance?"#extension GL_ANGLE_clip_cull_distance : require":"",s.extensionMultiDraw?"#extension GL_ANGLE_multi_draw : require":""].filter(Ca).join(` `)}function k2(s){const e=[];for(const t in s){const n=s[t];n!==!1&&e.push("#define "+t+" "+n)}return e.join(` -`)}function U2(s,e){const t={},n=s.getProgramParameter(e,s.ACTIVE_ATTRIBUTES);for(let i=0;i/gm;function ru(s){return s.replace(O2,F2)}const z2=new Map;function F2(s,e){let t=et[e];if(t===void 0){const n=z2.get(e);if(n!==void 0)t=et[n],He('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',e,n);else throw new Error("Can not resolve #include <"+e+">")}return ru(t)}const H2=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Vf(s){return s.replace(H2,V2)}function V2(s,e,t,n){let i="";for(let r=parseInt(e);r/gm;function ru(s){return s.replace(O2,F2)}const z2=new Map;function F2(s,e){let t=et[e];if(t===void 0){const n=z2.get(e);if(n!==void 0)t=et[n],He('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',e,n);else throw new Error("Can not resolve #include <"+e+">")}return ru(t)}const H2=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Vf(s){return s.replace(H2,V2)}function V2(s,e,t,n){let i="";for(let r=parseInt(e);r0&&(x+=` -`),g=["#define SHADER_TYPE "+t.shaderType,"#define SHADER_NAME "+t.shaderName,m].filter(Ta).join(` +`),g=["#define SHADER_TYPE "+t.shaderType,"#define SHADER_NAME "+t.shaderName,m].filter(Ca).join(` `),g.length>0&&(g+=` `)):(x=[Gf(t),"#define SHADER_TYPE "+t.shaderType,"#define SHADER_NAME "+t.shaderName,m,t.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",t.batching?"#define USE_BATCHING":"",t.batchingColor?"#define USE_BATCHING_COLOR":"",t.instancing?"#define USE_INSTANCING":"",t.instancingColor?"#define USE_INSTANCING_COLOR":"",t.instancingMorph?"#define USE_INSTANCING_MORPH":"",t.useFog&&t.fog?"#define USE_FOG":"",t.useFog&&t.fogExp2?"#define FOG_EXP2":"",t.map?"#define USE_MAP":"",t.envMap?"#define USE_ENVMAP":"",t.envMap?"#define "+h:"",t.lightMap?"#define USE_LIGHTMAP":"",t.aoMap?"#define USE_AOMAP":"",t.bumpMap?"#define USE_BUMPMAP":"",t.normalMap?"#define USE_NORMALMAP":"",t.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",t.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",t.displacementMap?"#define USE_DISPLACEMENTMAP":"",t.emissiveMap?"#define USE_EMISSIVEMAP":"",t.anisotropy?"#define USE_ANISOTROPY":"",t.anisotropyMap?"#define USE_ANISOTROPYMAP":"",t.clearcoatMap?"#define USE_CLEARCOATMAP":"",t.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",t.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",t.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",t.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",t.specularMap?"#define USE_SPECULARMAP":"",t.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",t.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",t.roughnessMap?"#define USE_ROUGHNESSMAP":"",t.metalnessMap?"#define USE_METALNESSMAP":"",t.alphaMap?"#define USE_ALPHAMAP":"",t.alphaHash?"#define USE_ALPHAHASH":"",t.transmission?"#define USE_TRANSMISSION":"",t.transmissionMap?"#define USE_TRANSMISSIONMAP":"",t.thicknessMap?"#define USE_THICKNESSMAP":"",t.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",t.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",t.mapUv?"#define MAP_UV "+t.mapUv:"",t.alphaMapUv?"#define ALPHAMAP_UV "+t.alphaMapUv:"",t.lightMapUv?"#define LIGHTMAP_UV "+t.lightMapUv:"",t.aoMapUv?"#define AOMAP_UV "+t.aoMapUv:"",t.emissiveMapUv?"#define EMISSIVEMAP_UV "+t.emissiveMapUv:"",t.bumpMapUv?"#define BUMPMAP_UV "+t.bumpMapUv:"",t.normalMapUv?"#define NORMALMAP_UV "+t.normalMapUv:"",t.displacementMapUv?"#define DISPLACEMENTMAP_UV "+t.displacementMapUv:"",t.metalnessMapUv?"#define METALNESSMAP_UV "+t.metalnessMapUv:"",t.roughnessMapUv?"#define ROUGHNESSMAP_UV "+t.roughnessMapUv:"",t.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+t.anisotropyMapUv:"",t.clearcoatMapUv?"#define CLEARCOATMAP_UV "+t.clearcoatMapUv:"",t.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+t.clearcoatNormalMapUv:"",t.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+t.clearcoatRoughnessMapUv:"",t.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+t.iridescenceMapUv:"",t.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+t.iridescenceThicknessMapUv:"",t.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+t.sheenColorMapUv:"",t.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+t.sheenRoughnessMapUv:"",t.specularMapUv?"#define SPECULARMAP_UV "+t.specularMapUv:"",t.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+t.specularColorMapUv:"",t.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+t.specularIntensityMapUv:"",t.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+t.transmissionMapUv:"",t.thicknessMapUv?"#define THICKNESSMAP_UV "+t.thicknessMapUv:"",t.vertexTangents&&t.flatShading===!1?"#define USE_TANGENT":"",t.vertexColors?"#define USE_COLOR":"",t.vertexAlphas?"#define USE_COLOR_ALPHA":"",t.vertexUv1s?"#define USE_UV1":"",t.vertexUv2s?"#define USE_UV2":"",t.vertexUv3s?"#define USE_UV3":"",t.pointsUvs?"#define USE_POINTS_UV":"",t.flatShading?"#define FLAT_SHADED":"",t.skinning?"#define USE_SKINNING":"",t.morphTargets?"#define USE_MORPHTARGETS":"",t.morphNormals&&t.flatShading===!1?"#define USE_MORPHNORMALS":"",t.morphColors?"#define USE_MORPHCOLORS":"",t.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+t.morphTextureStride:"",t.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+t.morphTargetsCount:"",t.doubleSided?"#define DOUBLE_SIDED":"",t.flipSided?"#define FLIP_SIDED":"",t.shadowMapEnabled?"#define USE_SHADOWMAP":"",t.shadowMapEnabled?"#define "+l:"",t.sizeAttenuation?"#define USE_SIZEATTENUATION":"",t.numLightProbes>0?"#define USE_LIGHT_PROBES":"",t.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",t.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR"," attribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH"," uniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1"," attribute vec2 uv1;","#endif","#ifdef USE_UV2"," attribute vec2 uv2;","#endif","#ifdef USE_UV3"," attribute vec2 uv3;","#endif","#ifdef USE_TANGENT"," attribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )"," attribute vec4 color;","#elif defined( USE_COLOR )"," attribute vec3 color;","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif",` -`].filter(Ta).join(` +`].filter(Ca).join(` `),g=[Gf(t),"#define SHADER_TYPE "+t.shaderType,"#define SHADER_NAME "+t.shaderName,m,t.useFog&&t.fog?"#define USE_FOG":"",t.useFog&&t.fogExp2?"#define FOG_EXP2":"",t.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",t.map?"#define USE_MAP":"",t.matcap?"#define USE_MATCAP":"",t.envMap?"#define USE_ENVMAP":"",t.envMap?"#define "+c:"",t.envMap?"#define "+h:"",t.envMap?"#define "+u:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.maxMip+".0":"",t.lightMap?"#define USE_LIGHTMAP":"",t.aoMap?"#define USE_AOMAP":"",t.bumpMap?"#define USE_BUMPMAP":"",t.normalMap?"#define USE_NORMALMAP":"",t.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",t.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",t.emissiveMap?"#define USE_EMISSIVEMAP":"",t.anisotropy?"#define USE_ANISOTROPY":"",t.anisotropyMap?"#define USE_ANISOTROPYMAP":"",t.clearcoat?"#define USE_CLEARCOAT":"",t.clearcoatMap?"#define USE_CLEARCOATMAP":"",t.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",t.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",t.dispersion?"#define USE_DISPERSION":"",t.iridescence?"#define USE_IRIDESCENCE":"",t.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",t.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",t.specularMap?"#define USE_SPECULARMAP":"",t.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",t.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",t.roughnessMap?"#define USE_ROUGHNESSMAP":"",t.metalnessMap?"#define USE_METALNESSMAP":"",t.alphaMap?"#define USE_ALPHAMAP":"",t.alphaTest?"#define USE_ALPHATEST":"",t.alphaHash?"#define USE_ALPHAHASH":"",t.sheen?"#define USE_SHEEN":"",t.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",t.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",t.transmission?"#define USE_TRANSMISSION":"",t.transmissionMap?"#define USE_TRANSMISSIONMAP":"",t.thicknessMap?"#define USE_THICKNESSMAP":"",t.vertexTangents&&t.flatShading===!1?"#define USE_TANGENT":"",t.vertexColors||t.instancingColor||t.batchingColor?"#define USE_COLOR":"",t.vertexAlphas?"#define USE_COLOR_ALPHA":"",t.vertexUv1s?"#define USE_UV1":"",t.vertexUv2s?"#define USE_UV2":"",t.vertexUv3s?"#define USE_UV3":"",t.pointsUvs?"#define USE_POINTS_UV":"",t.gradientMap?"#define USE_GRADIENTMAP":"",t.flatShading?"#define FLAT_SHADED":"",t.doubleSided?"#define DOUBLE_SIDED":"",t.flipSided?"#define FLIP_SIDED":"",t.shadowMapEnabled?"#define USE_SHADOWMAP":"",t.shadowMapEnabled?"#define "+l:"",t.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",t.numLightProbes>0?"#define USE_LIGHT_PROBES":"",t.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",t.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",t.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",t.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",t.toneMapping!==Fi?"#define TONE_MAPPING":"",t.toneMapping!==Fi?et.tonemapping_pars_fragment:"",t.toneMapping!==Fi?I2("toneMapping",t.toneMapping):"",t.dithering?"#define DITHERING":"",t.opaque?"#define OPAQUE":"",et.colorspace_pars_fragment,D2("linearToOutputTexel",t.outputColorSpace),N2(),t.useDepthPacking?"#define DEPTH_PACKING "+t.depthPacking:"",` -`].filter(Ta).join(` -`)),a=ru(a),a=Ff(a,t),a=Hf(a,t),o=ru(o),o=Ff(o,t),o=Hf(o,t),a=Vf(a),o=Vf(o),t.isRawShaderMaterial!==!0&&(y=`#version 300 es +`].filter(Ca).join(` +`)),a=ru(a),a=Ff(a,t),a=Hf(a,t),o=ru(o),o=Ff(o,t),o=Hf(o,t),a=Vf(a),o=Vf(o),t.isRawShaderMaterial!==!0&&(b=`#version 300 es `,x=[d,"#define attribute in","#define varying out","#define texture2D texture"].join(` `)+` `+x,g=["#define varying in",t.glslVersion===$d?"":"layout(location = 0) out highp vec4 pc_fragColor;",t.glslVersion===$d?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join(` `)+` -`+g);const v=y+x+a,b=y+g+o,_=Uf(i,i.VERTEX_SHADER,v),M=Uf(i,i.FRAGMENT_SHADER,b);i.attachShader(f,_),i.attachShader(f,M),t.index0AttributeName!==void 0?i.bindAttribLocation(f,0,t.index0AttributeName):t.morphTargets===!0&&i.bindAttribLocation(f,0,"position"),i.linkProgram(f);function T(L){if(s.debug.checkShaderErrors){const A=i.getProgramInfoLog(f)||"",I=i.getShaderInfoLog(_)||"",w=i.getShaderInfoLog(M)||"",z=A.trim(),G=I.trim(),j=w.trim();let Y=!0,q=!0;if(i.getProgramParameter(f,i.LINK_STATUS)===!1)if(Y=!1,typeof s.debug.onShaderError=="function")s.debug.onShaderError(i,f,_,M);else{const ie=zf(i,_,"vertex"),W=zf(i,M,"fragment");Qe("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(f,i.VALIDATE_STATUS)+` +`+g);const v=b+x+a,y=b+g+o,_=Uf(i,i.VERTEX_SHADER,v),M=Uf(i,i.FRAGMENT_SHADER,y);i.attachShader(f,_),i.attachShader(f,M),t.index0AttributeName!==void 0?i.bindAttribLocation(f,0,t.index0AttributeName):t.morphTargets===!0&&i.bindAttribLocation(f,0,"position"),i.linkProgram(f);function C(L){if(s.debug.checkShaderErrors){const A=i.getProgramInfoLog(f)||"",I=i.getShaderInfoLog(_)||"",w=i.getShaderInfoLog(M)||"",z=A.trim(),G=I.trim(),j=w.trim();let Y=!0,q=!0;if(i.getProgramParameter(f,i.LINK_STATUS)===!1)if(Y=!1,typeof s.debug.onShaderError=="function")s.debug.onShaderError(i,f,_,M);else{const ie=zf(i,_,"vertex"),W=zf(i,M,"fragment");Qe("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(f,i.VALIDATE_STATUS)+` Material Name: `+L.name+` Material Type: `+L.type+` Program Info Log: `+z+` `+ie+` -`+W)}else z!==""?He("WebGLProgram: Program Info Log:",z):(G===""||j==="")&&(q=!1);q&&(L.diagnostics={runnable:Y,programLog:z,vertexShader:{log:G,prefix:x},fragmentShader:{log:j,prefix:g}})}i.deleteShader(_),i.deleteShader(M),R=new Ko(i,f),S=U2(i,f)}let R;this.getUniforms=function(){return R===void 0&&T(this),R};let S;this.getAttributes=function(){return S===void 0&&T(this),S};let E=t.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return E===!1&&(E=i.getProgramParameter(f,A2)),E},this.destroy=function(){n.releaseStatesOfProgram(this),i.deleteProgram(f),this.program=void 0},this.type=t.shaderType,this.name=t.shaderName,this.id=P2++,this.cacheKey=e,this.usedTimes=1,this.program=f,this.vertexShader=_,this.fragmentShader=M,this}let Y2=0;class $2{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(e){const t=e.vertexShader,n=e.fragmentShader,i=this._getShaderStage(t),r=this._getShaderStage(n),a=this._getShaderCacheForMaterial(e);return a.has(i)===!1&&(a.add(i),i.usedTimes++),a.has(r)===!1&&(a.add(r),r.usedTimes++),this}remove(e){const t=this.materialCache.get(e);for(const n of t)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(e),this}getVertexShaderID(e){return this._getShaderStage(e.vertexShader).id}getFragmentShaderID(e){return this._getShaderStage(e.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(e){const t=this.materialCache;let n=t.get(e);return n===void 0&&(n=new Set,t.set(e,n)),n}_getShaderStage(e){const t=this.shaderCache;let n=t.get(e);return n===void 0&&(n=new K2(e),t.set(e,n)),n}}class K2{constructor(e){this.id=Y2++,this.code=e,this.usedTimes=0}}function J2(s,e,t,n,i,r,a){const o=new hh,l=new $2,c=new Set,h=[],u=i.logarithmicDepthBuffer,p=i.vertexTextures;let d=i.precision;const m={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function f(S){return c.add(S),S===0?"uv":`uv${S}`}function x(S,E,L,A,I){const w=A.fog,z=I.geometry,G=S.isMeshStandardMaterial?A.environment:null,j=(S.isMeshStandardMaterial?t:e).get(S.envMap||G),Y=j&&j.mapping===Ka?j.image.height:null,q=m[S.type];S.precision!==null&&(d=i.getMaxPrecision(S.precision),d!==S.precision&&He("WebGLProgram.getParameters:",S.precision,"not supported, using",d,"instead."));const ie=z.morphAttributes.position||z.morphAttributes.normal||z.morphAttributes.color,W=ie!==void 0?ie.length:0;let $=0;z.morphAttributes.position!==void 0&&($=1),z.morphAttributes.normal!==void 0&&($=2),z.morphAttributes.color!==void 0&&($=3);let fe,me,de,se;if(q){const ft=ui[q];fe=ft.vertexShader,me=ft.fragmentShader}else fe=S.vertexShader,me=S.fragmentShader,l.update(S),de=l.getVertexShaderID(S),se=l.getFragmentShaderID(S);const ce=s.getRenderTarget(),pe=s.state.buffers.depth.getReversed(),ye=I.isInstancedMesh===!0,Se=I.isBatchedMesh===!0,Be=!!S.map,Je=!!S.matcap,ke=!!j,C=!!S.aoMap,N=!!S.lightMap,V=!!S.bumpMap,U=!!S.normalMap,k=!!S.displacementMap,F=!!S.emissiveMap,ee=!!S.metalnessMap,J=!!S.roughnessMap,X=S.anisotropy>0,B=S.clearcoat>0,D=S.dispersion>0,H=S.iridescence>0,K=S.sheen>0,le=S.transmission>0,te=X&&!!S.anisotropyMap,Ce=B&&!!S.clearcoatMap,be=B&&!!S.clearcoatNormalMap,Re=B&&!!S.clearcoatRoughnessMap,Ie=H&&!!S.iridescenceMap,ue=H&&!!S.iridescenceThicknessMap,_e=K&&!!S.sheenColorMap,Ve=K&&!!S.sheenRoughnessMap,Ue=!!S.specularMap,Ae=!!S.specularColorMap,Ge=!!S.specularIntensityMap,Z=le&&!!S.transmissionMap,Te=le&&!!S.thicknessMap,Me=!!S.gradientMap,we=!!S.alphaMap,ve=S.alphaTest>0,ge=!!S.alphaHash,Oe=!!S.extensions;let Ye=Fi;S.toneMapped&&(ce===null||ce.isXRRenderTarget===!0)&&(Ye=s.toneMapping);const wt={shaderID:q,shaderType:S.type,shaderName:S.name,vertexShader:fe,fragmentShader:me,defines:S.defines,customVertexShaderID:de,customFragmentShaderID:se,isRawShaderMaterial:S.isRawShaderMaterial===!0,glslVersion:S.glslVersion,precision:d,batching:Se,batchingColor:Se&&I._colorsTexture!==null,instancing:ye,instancingColor:ye&&I.instanceColor!==null,instancingMorph:ye&&I.morphTexture!==null,supportsVertexTextures:p,outputColorSpace:ce===null?s.outputColorSpace:ce.isXRRenderTarget===!0?ce.texture.colorSpace:en,alphaToCoverage:!!S.alphaToCoverage,map:Be,matcap:Je,envMap:ke,envMapMode:ke&&j.mapping,envMapCubeUVHeight:Y,aoMap:C,lightMap:N,bumpMap:V,normalMap:U,displacementMap:p&&k,emissiveMap:F,normalMapObjectSpace:U&&S.normalMapType===Yg,normalMapTangentSpace:U&&S.normalMapType===ro,metalnessMap:ee,roughnessMap:J,anisotropy:X,anisotropyMap:te,clearcoat:B,clearcoatMap:Ce,clearcoatNormalMap:be,clearcoatRoughnessMap:Re,dispersion:D,iridescence:H,iridescenceMap:Ie,iridescenceThicknessMap:ue,sheen:K,sheenColorMap:_e,sheenRoughnessMap:Ve,specularMap:Ue,specularColorMap:Ae,specularIntensityMap:Ge,transmission:le,transmissionMap:Z,thicknessMap:Te,gradientMap:Me,opaque:S.transparent===!1&&S.blending===Ys&&S.alphaToCoverage===!1,alphaMap:we,alphaTest:ve,alphaHash:ge,combine:S.combine,mapUv:Be&&f(S.map.channel),aoMapUv:C&&f(S.aoMap.channel),lightMapUv:N&&f(S.lightMap.channel),bumpMapUv:V&&f(S.bumpMap.channel),normalMapUv:U&&f(S.normalMap.channel),displacementMapUv:k&&f(S.displacementMap.channel),emissiveMapUv:F&&f(S.emissiveMap.channel),metalnessMapUv:ee&&f(S.metalnessMap.channel),roughnessMapUv:J&&f(S.roughnessMap.channel),anisotropyMapUv:te&&f(S.anisotropyMap.channel),clearcoatMapUv:Ce&&f(S.clearcoatMap.channel),clearcoatNormalMapUv:be&&f(S.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:Re&&f(S.clearcoatRoughnessMap.channel),iridescenceMapUv:Ie&&f(S.iridescenceMap.channel),iridescenceThicknessMapUv:ue&&f(S.iridescenceThicknessMap.channel),sheenColorMapUv:_e&&f(S.sheenColorMap.channel),sheenRoughnessMapUv:Ve&&f(S.sheenRoughnessMap.channel),specularMapUv:Ue&&f(S.specularMap.channel),specularColorMapUv:Ae&&f(S.specularColorMap.channel),specularIntensityMapUv:Ge&&f(S.specularIntensityMap.channel),transmissionMapUv:Z&&f(S.transmissionMap.channel),thicknessMapUv:Te&&f(S.thicknessMap.channel),alphaMapUv:we&&f(S.alphaMap.channel),vertexTangents:!!z.attributes.tangent&&(U||X),vertexColors:S.vertexColors,vertexAlphas:S.vertexColors===!0&&!!z.attributes.color&&z.attributes.color.itemSize===4,pointsUvs:I.isPoints===!0&&!!z.attributes.uv&&(Be||we),fog:!!w,useFog:S.fog===!0,fogExp2:!!w&&w.isFogExp2,flatShading:S.flatShading===!0&&S.wireframe===!1,sizeAttenuation:S.sizeAttenuation===!0,logarithmicDepthBuffer:u,reversedDepthBuffer:pe,skinning:I.isSkinnedMesh===!0,morphTargets:z.morphAttributes.position!==void 0,morphNormals:z.morphAttributes.normal!==void 0,morphColors:z.morphAttributes.color!==void 0,morphTargetsCount:W,morphTextureStride:$,numDirLights:E.directional.length,numPointLights:E.point.length,numSpotLights:E.spot.length,numSpotLightMaps:E.spotLightMap.length,numRectAreaLights:E.rectArea.length,numHemiLights:E.hemi.length,numDirLightShadows:E.directionalShadowMap.length,numPointLightShadows:E.pointShadowMap.length,numSpotLightShadows:E.spotShadowMap.length,numSpotLightShadowsWithMaps:E.numSpotLightShadowsWithMaps,numLightProbes:E.numLightProbes,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:S.dithering,shadowMapEnabled:s.shadowMap.enabled&&L.length>0,shadowMapType:s.shadowMap.type,toneMapping:Ye,decodeVideoTexture:Be&&S.map.isVideoTexture===!0&&it.getTransfer(S.map.colorSpace)===ct,decodeVideoTextureEmissive:F&&S.emissiveMap.isVideoTexture===!0&&it.getTransfer(S.emissiveMap.colorSpace)===ct,premultipliedAlpha:S.premultipliedAlpha,doubleSided:S.side===bt,flipSided:S.side===sn,useDepthPacking:S.depthPacking>=0,depthPacking:S.depthPacking||0,index0AttributeName:S.index0AttributeName,extensionClipCullDistance:Oe&&S.extensions.clipCullDistance===!0&&n.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Oe&&S.extensions.multiDraw===!0||Se)&&n.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:S.customProgramCacheKey()};return wt.vertexUv1s=c.has(1),wt.vertexUv2s=c.has(2),wt.vertexUv3s=c.has(3),c.clear(),wt}function g(S){const E=[];if(S.shaderID?E.push(S.shaderID):(E.push(S.customVertexShaderID),E.push(S.customFragmentShaderID)),S.defines!==void 0)for(const L in S.defines)E.push(L),E.push(S.defines[L]);return S.isRawShaderMaterial===!1&&(y(E,S),v(E,S),E.push(s.outputColorSpace)),E.push(S.customProgramCacheKey),E.join()}function y(S,E){S.push(E.precision),S.push(E.outputColorSpace),S.push(E.envMapMode),S.push(E.envMapCubeUVHeight),S.push(E.mapUv),S.push(E.alphaMapUv),S.push(E.lightMapUv),S.push(E.aoMapUv),S.push(E.bumpMapUv),S.push(E.normalMapUv),S.push(E.displacementMapUv),S.push(E.emissiveMapUv),S.push(E.metalnessMapUv),S.push(E.roughnessMapUv),S.push(E.anisotropyMapUv),S.push(E.clearcoatMapUv),S.push(E.clearcoatNormalMapUv),S.push(E.clearcoatRoughnessMapUv),S.push(E.iridescenceMapUv),S.push(E.iridescenceThicknessMapUv),S.push(E.sheenColorMapUv),S.push(E.sheenRoughnessMapUv),S.push(E.specularMapUv),S.push(E.specularColorMapUv),S.push(E.specularIntensityMapUv),S.push(E.transmissionMapUv),S.push(E.thicknessMapUv),S.push(E.combine),S.push(E.fogExp2),S.push(E.sizeAttenuation),S.push(E.morphTargetsCount),S.push(E.morphAttributeCount),S.push(E.numDirLights),S.push(E.numPointLights),S.push(E.numSpotLights),S.push(E.numSpotLightMaps),S.push(E.numHemiLights),S.push(E.numRectAreaLights),S.push(E.numDirLightShadows),S.push(E.numPointLightShadows),S.push(E.numSpotLightShadows),S.push(E.numSpotLightShadowsWithMaps),S.push(E.numLightProbes),S.push(E.shadowMapType),S.push(E.toneMapping),S.push(E.numClippingPlanes),S.push(E.numClipIntersection),S.push(E.depthPacking)}function v(S,E){o.disableAll(),E.supportsVertexTextures&&o.enable(0),E.instancing&&o.enable(1),E.instancingColor&&o.enable(2),E.instancingMorph&&o.enable(3),E.matcap&&o.enable(4),E.envMap&&o.enable(5),E.normalMapObjectSpace&&o.enable(6),E.normalMapTangentSpace&&o.enable(7),E.clearcoat&&o.enable(8),E.iridescence&&o.enable(9),E.alphaTest&&o.enable(10),E.vertexColors&&o.enable(11),E.vertexAlphas&&o.enable(12),E.vertexUv1s&&o.enable(13),E.vertexUv2s&&o.enable(14),E.vertexUv3s&&o.enable(15),E.vertexTangents&&o.enable(16),E.anisotropy&&o.enable(17),E.alphaHash&&o.enable(18),E.batching&&o.enable(19),E.dispersion&&o.enable(20),E.batchingColor&&o.enable(21),E.gradientMap&&o.enable(22),S.push(o.mask),o.disableAll(),E.fog&&o.enable(0),E.useFog&&o.enable(1),E.flatShading&&o.enable(2),E.logarithmicDepthBuffer&&o.enable(3),E.reversedDepthBuffer&&o.enable(4),E.skinning&&o.enable(5),E.morphTargets&&o.enable(6),E.morphNormals&&o.enable(7),E.morphColors&&o.enable(8),E.premultipliedAlpha&&o.enable(9),E.shadowMapEnabled&&o.enable(10),E.doubleSided&&o.enable(11),E.flipSided&&o.enable(12),E.useDepthPacking&&o.enable(13),E.dithering&&o.enable(14),E.transmission&&o.enable(15),E.sheen&&o.enable(16),E.opaque&&o.enable(17),E.pointsUvs&&o.enable(18),E.decodeVideoTexture&&o.enable(19),E.decodeVideoTextureEmissive&&o.enable(20),E.alphaToCoverage&&o.enable(21),S.push(o.mask)}function b(S){const E=m[S.type];let L;if(E){const A=ui[E];L=Hn.clone(A.uniforms)}else L=S.uniforms;return L}function _(S,E){let L;for(let A=0,I=h.length;A0?n.push(g):d.transparent===!0?i.push(g):t.push(g)}function l(u,p,d,m,f,x){const g=a(u,p,d,m,f,x);d.transmission>0?n.unshift(g):d.transparent===!0?i.unshift(g):t.unshift(g)}function c(u,p){t.length>1&&t.sort(u||e3),n.length>1&&n.sort(p||Wf),i.length>1&&i.sort(p||Wf)}function h(){for(let u=e,p=s.length;u=r.length?(a=new Xf,r.push(a)):a=r[i],a}function t(){s=new WeakMap}return{get:e,dispose:t}}function n3(){const s={};return{get:function(e){if(s[e.id]!==void 0)return s[e.id];let t;switch(e.type){case"DirectionalLight":t={direction:new P,color:new Fe};break;case"SpotLight":t={position:new P,direction:new P,color:new Fe,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":t={position:new P,color:new Fe,distance:0,decay:0};break;case"HemisphereLight":t={direction:new P,skyColor:new Fe,groundColor:new Fe};break;case"RectAreaLight":t={color:new Fe,position:new P,halfWidth:new P,halfHeight:new P};break}return s[e.id]=t,t}}}function i3(){const s={};return{get:function(e){if(s[e.id]!==void 0)return s[e.id];let t;switch(e.type){case"DirectionalLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new he};break;case"SpotLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new he};break;case"PointLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new he,shadowCameraNear:1,shadowCameraFar:1e3};break}return s[e.id]=t,t}}}let s3=0;function r3(s,e){return(e.castShadow?2:0)-(s.castShadow?2:0)+(e.map?1:0)-(s.map?1:0)}function a3(s){const e=new n3,t=i3(),n={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let c=0;c<9;c++)n.probe.push(new P);const i=new P,r=new De,a=new De;function o(c){let h=0,u=0,p=0;for(let S=0;S<9;S++)n.probe[S].set(0,0,0);let d=0,m=0,f=0,x=0,g=0,y=0,v=0,b=0,_=0,M=0,T=0;c.sort(r3);for(let S=0,E=c.length;S0&&(s.has("OES_texture_float_linear")===!0?(n.rectAreaLTC1=Pe.LTC_FLOAT_1,n.rectAreaLTC2=Pe.LTC_FLOAT_2):(n.rectAreaLTC1=Pe.LTC_HALF_1,n.rectAreaLTC2=Pe.LTC_HALF_2)),n.ambient[0]=h,n.ambient[1]=u,n.ambient[2]=p;const R=n.hash;(R.directionalLength!==d||R.pointLength!==m||R.spotLength!==f||R.rectAreaLength!==x||R.hemiLength!==g||R.numDirectionalShadows!==y||R.numPointShadows!==v||R.numSpotShadows!==b||R.numSpotMaps!==_||R.numLightProbes!==T)&&(n.directional.length=d,n.spot.length=f,n.rectArea.length=x,n.point.length=m,n.hemi.length=g,n.directionalShadow.length=y,n.directionalShadowMap.length=y,n.pointShadow.length=v,n.pointShadowMap.length=v,n.spotShadow.length=b,n.spotShadowMap.length=b,n.directionalShadowMatrix.length=y,n.pointShadowMatrix.length=v,n.spotLightMatrix.length=b+_-M,n.spotLightMap.length=_,n.numSpotLightShadowsWithMaps=M,n.numLightProbes=T,R.directionalLength=d,R.pointLength=m,R.spotLength=f,R.rectAreaLength=x,R.hemiLength=g,R.numDirectionalShadows=y,R.numPointShadows=v,R.numSpotShadows=b,R.numSpotMaps=_,R.numLightProbes=T,n.version=s3++)}function l(c,h){let u=0,p=0,d=0,m=0,f=0;const x=h.matrixWorldInverse;for(let g=0,y=c.length;g=a.length?(o=new jf(s),a.push(o)):o=a[r],o}function n(){e=new WeakMap}return{get:t,dispose:n}}const l3=`void main() { +`+W)}else z!==""?He("WebGLProgram: Program Info Log:",z):(G===""||j==="")&&(q=!1);q&&(L.diagnostics={runnable:Y,programLog:z,vertexShader:{log:G,prefix:x},fragmentShader:{log:j,prefix:g}})}i.deleteShader(_),i.deleteShader(M),R=new Ko(i,f),S=U2(i,f)}let R;this.getUniforms=function(){return R===void 0&&C(this),R};let S;this.getAttributes=function(){return S===void 0&&C(this),S};let E=t.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return E===!1&&(E=i.getProgramParameter(f,A2)),E},this.destroy=function(){n.releaseStatesOfProgram(this),i.deleteProgram(f),this.program=void 0},this.type=t.shaderType,this.name=t.shaderName,this.id=P2++,this.cacheKey=e,this.usedTimes=1,this.program=f,this.vertexShader=_,this.fragmentShader=M,this}let Y2=0;class $2{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(e){const t=e.vertexShader,n=e.fragmentShader,i=this._getShaderStage(t),r=this._getShaderStage(n),a=this._getShaderCacheForMaterial(e);return a.has(i)===!1&&(a.add(i),i.usedTimes++),a.has(r)===!1&&(a.add(r),r.usedTimes++),this}remove(e){const t=this.materialCache.get(e);for(const n of t)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(e),this}getVertexShaderID(e){return this._getShaderStage(e.vertexShader).id}getFragmentShaderID(e){return this._getShaderStage(e.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(e){const t=this.materialCache;let n=t.get(e);return n===void 0&&(n=new Set,t.set(e,n)),n}_getShaderStage(e){const t=this.shaderCache;let n=t.get(e);return n===void 0&&(n=new K2(e),t.set(e,n)),n}}class K2{constructor(e){this.id=Y2++,this.code=e,this.usedTimes=0}}function J2(s,e,t,n,i,r,a){const o=new hh,l=new $2,c=new Set,h=[],u=i.logarithmicDepthBuffer,p=i.vertexTextures;let d=i.precision;const m={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function f(S){return c.add(S),S===0?"uv":`uv${S}`}function x(S,E,L,A,I){const w=A.fog,z=I.geometry,G=S.isMeshStandardMaterial?A.environment:null,j=(S.isMeshStandardMaterial?t:e).get(S.envMap||G),Y=j&&j.mapping===Ka?j.image.height:null,q=m[S.type];S.precision!==null&&(d=i.getMaxPrecision(S.precision),d!==S.precision&&He("WebGLProgram.getParameters:",S.precision,"not supported, using",d,"instead."));const ie=z.morphAttributes.position||z.morphAttributes.normal||z.morphAttributes.color,W=ie!==void 0?ie.length:0;let $=0;z.morphAttributes.position!==void 0&&($=1),z.morphAttributes.normal!==void 0&&($=2),z.morphAttributes.color!==void 0&&($=3);let fe,me,de,se;if(q){const ft=ui[q];fe=ft.vertexShader,me=ft.fragmentShader}else fe=S.vertexShader,me=S.fragmentShader,l.update(S),de=l.getVertexShaderID(S),se=l.getFragmentShaderID(S);const ce=s.getRenderTarget(),pe=s.state.buffers.depth.getReversed(),be=I.isInstancedMesh===!0,Se=I.isBatchedMesh===!0,Be=!!S.map,Je=!!S.matcap,ke=!!j,T=!!S.aoMap,N=!!S.lightMap,V=!!S.bumpMap,U=!!S.normalMap,k=!!S.displacementMap,F=!!S.emissiveMap,ee=!!S.metalnessMap,J=!!S.roughnessMap,X=S.anisotropy>0,B=S.clearcoat>0,D=S.dispersion>0,H=S.iridescence>0,K=S.sheen>0,le=S.transmission>0,te=X&&!!S.anisotropyMap,Te=B&&!!S.clearcoatMap,ye=B&&!!S.clearcoatNormalMap,Re=B&&!!S.clearcoatRoughnessMap,Ie=H&&!!S.iridescenceMap,ue=H&&!!S.iridescenceThicknessMap,_e=K&&!!S.sheenColorMap,Ve=K&&!!S.sheenRoughnessMap,Ue=!!S.specularMap,Ae=!!S.specularColorMap,Ge=!!S.specularIntensityMap,Z=le&&!!S.transmissionMap,Ce=le&&!!S.thicknessMap,Me=!!S.gradientMap,we=!!S.alphaMap,ve=S.alphaTest>0,ge=!!S.alphaHash,Oe=!!S.extensions;let Ye=Fi;S.toneMapped&&(ce===null||ce.isXRRenderTarget===!0)&&(Ye=s.toneMapping);const wt={shaderID:q,shaderType:S.type,shaderName:S.name,vertexShader:fe,fragmentShader:me,defines:S.defines,customVertexShaderID:de,customFragmentShaderID:se,isRawShaderMaterial:S.isRawShaderMaterial===!0,glslVersion:S.glslVersion,precision:d,batching:Se,batchingColor:Se&&I._colorsTexture!==null,instancing:be,instancingColor:be&&I.instanceColor!==null,instancingMorph:be&&I.morphTexture!==null,supportsVertexTextures:p,outputColorSpace:ce===null?s.outputColorSpace:ce.isXRRenderTarget===!0?ce.texture.colorSpace:en,alphaToCoverage:!!S.alphaToCoverage,map:Be,matcap:Je,envMap:ke,envMapMode:ke&&j.mapping,envMapCubeUVHeight:Y,aoMap:T,lightMap:N,bumpMap:V,normalMap:U,displacementMap:p&&k,emissiveMap:F,normalMapObjectSpace:U&&S.normalMapType===Yg,normalMapTangentSpace:U&&S.normalMapType===ro,metalnessMap:ee,roughnessMap:J,anisotropy:X,anisotropyMap:te,clearcoat:B,clearcoatMap:Te,clearcoatNormalMap:ye,clearcoatRoughnessMap:Re,dispersion:D,iridescence:H,iridescenceMap:Ie,iridescenceThicknessMap:ue,sheen:K,sheenColorMap:_e,sheenRoughnessMap:Ve,specularMap:Ue,specularColorMap:Ae,specularIntensityMap:Ge,transmission:le,transmissionMap:Z,thicknessMap:Ce,gradientMap:Me,opaque:S.transparent===!1&&S.blending===Ys&&S.alphaToCoverage===!1,alphaMap:we,alphaTest:ve,alphaHash:ge,combine:S.combine,mapUv:Be&&f(S.map.channel),aoMapUv:T&&f(S.aoMap.channel),lightMapUv:N&&f(S.lightMap.channel),bumpMapUv:V&&f(S.bumpMap.channel),normalMapUv:U&&f(S.normalMap.channel),displacementMapUv:k&&f(S.displacementMap.channel),emissiveMapUv:F&&f(S.emissiveMap.channel),metalnessMapUv:ee&&f(S.metalnessMap.channel),roughnessMapUv:J&&f(S.roughnessMap.channel),anisotropyMapUv:te&&f(S.anisotropyMap.channel),clearcoatMapUv:Te&&f(S.clearcoatMap.channel),clearcoatNormalMapUv:ye&&f(S.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:Re&&f(S.clearcoatRoughnessMap.channel),iridescenceMapUv:Ie&&f(S.iridescenceMap.channel),iridescenceThicknessMapUv:ue&&f(S.iridescenceThicknessMap.channel),sheenColorMapUv:_e&&f(S.sheenColorMap.channel),sheenRoughnessMapUv:Ve&&f(S.sheenRoughnessMap.channel),specularMapUv:Ue&&f(S.specularMap.channel),specularColorMapUv:Ae&&f(S.specularColorMap.channel),specularIntensityMapUv:Ge&&f(S.specularIntensityMap.channel),transmissionMapUv:Z&&f(S.transmissionMap.channel),thicknessMapUv:Ce&&f(S.thicknessMap.channel),alphaMapUv:we&&f(S.alphaMap.channel),vertexTangents:!!z.attributes.tangent&&(U||X),vertexColors:S.vertexColors,vertexAlphas:S.vertexColors===!0&&!!z.attributes.color&&z.attributes.color.itemSize===4,pointsUvs:I.isPoints===!0&&!!z.attributes.uv&&(Be||we),fog:!!w,useFog:S.fog===!0,fogExp2:!!w&&w.isFogExp2,flatShading:S.flatShading===!0&&S.wireframe===!1,sizeAttenuation:S.sizeAttenuation===!0,logarithmicDepthBuffer:u,reversedDepthBuffer:pe,skinning:I.isSkinnedMesh===!0,morphTargets:z.morphAttributes.position!==void 0,morphNormals:z.morphAttributes.normal!==void 0,morphColors:z.morphAttributes.color!==void 0,morphTargetsCount:W,morphTextureStride:$,numDirLights:E.directional.length,numPointLights:E.point.length,numSpotLights:E.spot.length,numSpotLightMaps:E.spotLightMap.length,numRectAreaLights:E.rectArea.length,numHemiLights:E.hemi.length,numDirLightShadows:E.directionalShadowMap.length,numPointLightShadows:E.pointShadowMap.length,numSpotLightShadows:E.spotShadowMap.length,numSpotLightShadowsWithMaps:E.numSpotLightShadowsWithMaps,numLightProbes:E.numLightProbes,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:S.dithering,shadowMapEnabled:s.shadowMap.enabled&&L.length>0,shadowMapType:s.shadowMap.type,toneMapping:Ye,decodeVideoTexture:Be&&S.map.isVideoTexture===!0&&it.getTransfer(S.map.colorSpace)===ct,decodeVideoTextureEmissive:F&&S.emissiveMap.isVideoTexture===!0&&it.getTransfer(S.emissiveMap.colorSpace)===ct,premultipliedAlpha:S.premultipliedAlpha,doubleSided:S.side===yt,flipSided:S.side===sn,useDepthPacking:S.depthPacking>=0,depthPacking:S.depthPacking||0,index0AttributeName:S.index0AttributeName,extensionClipCullDistance:Oe&&S.extensions.clipCullDistance===!0&&n.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Oe&&S.extensions.multiDraw===!0||Se)&&n.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:S.customProgramCacheKey()};return wt.vertexUv1s=c.has(1),wt.vertexUv2s=c.has(2),wt.vertexUv3s=c.has(3),c.clear(),wt}function g(S){const E=[];if(S.shaderID?E.push(S.shaderID):(E.push(S.customVertexShaderID),E.push(S.customFragmentShaderID)),S.defines!==void 0)for(const L in S.defines)E.push(L),E.push(S.defines[L]);return S.isRawShaderMaterial===!1&&(b(E,S),v(E,S),E.push(s.outputColorSpace)),E.push(S.customProgramCacheKey),E.join()}function b(S,E){S.push(E.precision),S.push(E.outputColorSpace),S.push(E.envMapMode),S.push(E.envMapCubeUVHeight),S.push(E.mapUv),S.push(E.alphaMapUv),S.push(E.lightMapUv),S.push(E.aoMapUv),S.push(E.bumpMapUv),S.push(E.normalMapUv),S.push(E.displacementMapUv),S.push(E.emissiveMapUv),S.push(E.metalnessMapUv),S.push(E.roughnessMapUv),S.push(E.anisotropyMapUv),S.push(E.clearcoatMapUv),S.push(E.clearcoatNormalMapUv),S.push(E.clearcoatRoughnessMapUv),S.push(E.iridescenceMapUv),S.push(E.iridescenceThicknessMapUv),S.push(E.sheenColorMapUv),S.push(E.sheenRoughnessMapUv),S.push(E.specularMapUv),S.push(E.specularColorMapUv),S.push(E.specularIntensityMapUv),S.push(E.transmissionMapUv),S.push(E.thicknessMapUv),S.push(E.combine),S.push(E.fogExp2),S.push(E.sizeAttenuation),S.push(E.morphTargetsCount),S.push(E.morphAttributeCount),S.push(E.numDirLights),S.push(E.numPointLights),S.push(E.numSpotLights),S.push(E.numSpotLightMaps),S.push(E.numHemiLights),S.push(E.numRectAreaLights),S.push(E.numDirLightShadows),S.push(E.numPointLightShadows),S.push(E.numSpotLightShadows),S.push(E.numSpotLightShadowsWithMaps),S.push(E.numLightProbes),S.push(E.shadowMapType),S.push(E.toneMapping),S.push(E.numClippingPlanes),S.push(E.numClipIntersection),S.push(E.depthPacking)}function v(S,E){o.disableAll(),E.supportsVertexTextures&&o.enable(0),E.instancing&&o.enable(1),E.instancingColor&&o.enable(2),E.instancingMorph&&o.enable(3),E.matcap&&o.enable(4),E.envMap&&o.enable(5),E.normalMapObjectSpace&&o.enable(6),E.normalMapTangentSpace&&o.enable(7),E.clearcoat&&o.enable(8),E.iridescence&&o.enable(9),E.alphaTest&&o.enable(10),E.vertexColors&&o.enable(11),E.vertexAlphas&&o.enable(12),E.vertexUv1s&&o.enable(13),E.vertexUv2s&&o.enable(14),E.vertexUv3s&&o.enable(15),E.vertexTangents&&o.enable(16),E.anisotropy&&o.enable(17),E.alphaHash&&o.enable(18),E.batching&&o.enable(19),E.dispersion&&o.enable(20),E.batchingColor&&o.enable(21),E.gradientMap&&o.enable(22),S.push(o.mask),o.disableAll(),E.fog&&o.enable(0),E.useFog&&o.enable(1),E.flatShading&&o.enable(2),E.logarithmicDepthBuffer&&o.enable(3),E.reversedDepthBuffer&&o.enable(4),E.skinning&&o.enable(5),E.morphTargets&&o.enable(6),E.morphNormals&&o.enable(7),E.morphColors&&o.enable(8),E.premultipliedAlpha&&o.enable(9),E.shadowMapEnabled&&o.enable(10),E.doubleSided&&o.enable(11),E.flipSided&&o.enable(12),E.useDepthPacking&&o.enable(13),E.dithering&&o.enable(14),E.transmission&&o.enable(15),E.sheen&&o.enable(16),E.opaque&&o.enable(17),E.pointsUvs&&o.enable(18),E.decodeVideoTexture&&o.enable(19),E.decodeVideoTextureEmissive&&o.enable(20),E.alphaToCoverage&&o.enable(21),S.push(o.mask)}function y(S){const E=m[S.type];let L;if(E){const A=ui[E];L=Hn.clone(A.uniforms)}else L=S.uniforms;return L}function _(S,E){let L;for(let A=0,I=h.length;A0?n.push(g):d.transparent===!0?i.push(g):t.push(g)}function l(u,p,d,m,f,x){const g=a(u,p,d,m,f,x);d.transmission>0?n.unshift(g):d.transparent===!0?i.unshift(g):t.unshift(g)}function c(u,p){t.length>1&&t.sort(u||e3),n.length>1&&n.sort(p||Wf),i.length>1&&i.sort(p||Wf)}function h(){for(let u=e,p=s.length;u=r.length?(a=new Xf,r.push(a)):a=r[i],a}function t(){s=new WeakMap}return{get:e,dispose:t}}function n3(){const s={};return{get:function(e){if(s[e.id]!==void 0)return s[e.id];let t;switch(e.type){case"DirectionalLight":t={direction:new P,color:new Fe};break;case"SpotLight":t={position:new P,direction:new P,color:new Fe,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":t={position:new P,color:new Fe,distance:0,decay:0};break;case"HemisphereLight":t={direction:new P,skyColor:new Fe,groundColor:new Fe};break;case"RectAreaLight":t={color:new Fe,position:new P,halfWidth:new P,halfHeight:new P};break}return s[e.id]=t,t}}}function i3(){const s={};return{get:function(e){if(s[e.id]!==void 0)return s[e.id];let t;switch(e.type){case"DirectionalLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new he};break;case"SpotLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new he};break;case"PointLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new he,shadowCameraNear:1,shadowCameraFar:1e3};break}return s[e.id]=t,t}}}let s3=0;function r3(s,e){return(e.castShadow?2:0)-(s.castShadow?2:0)+(e.map?1:0)-(s.map?1:0)}function a3(s){const e=new n3,t=i3(),n={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let c=0;c<9;c++)n.probe.push(new P);const i=new P,r=new De,a=new De;function o(c){let h=0,u=0,p=0;for(let S=0;S<9;S++)n.probe[S].set(0,0,0);let d=0,m=0,f=0,x=0,g=0,b=0,v=0,y=0,_=0,M=0,C=0;c.sort(r3);for(let S=0,E=c.length;S0&&(s.has("OES_texture_float_linear")===!0?(n.rectAreaLTC1=Pe.LTC_FLOAT_1,n.rectAreaLTC2=Pe.LTC_FLOAT_2):(n.rectAreaLTC1=Pe.LTC_HALF_1,n.rectAreaLTC2=Pe.LTC_HALF_2)),n.ambient[0]=h,n.ambient[1]=u,n.ambient[2]=p;const R=n.hash;(R.directionalLength!==d||R.pointLength!==m||R.spotLength!==f||R.rectAreaLength!==x||R.hemiLength!==g||R.numDirectionalShadows!==b||R.numPointShadows!==v||R.numSpotShadows!==y||R.numSpotMaps!==_||R.numLightProbes!==C)&&(n.directional.length=d,n.spot.length=f,n.rectArea.length=x,n.point.length=m,n.hemi.length=g,n.directionalShadow.length=b,n.directionalShadowMap.length=b,n.pointShadow.length=v,n.pointShadowMap.length=v,n.spotShadow.length=y,n.spotShadowMap.length=y,n.directionalShadowMatrix.length=b,n.pointShadowMatrix.length=v,n.spotLightMatrix.length=y+_-M,n.spotLightMap.length=_,n.numSpotLightShadowsWithMaps=M,n.numLightProbes=C,R.directionalLength=d,R.pointLength=m,R.spotLength=f,R.rectAreaLength=x,R.hemiLength=g,R.numDirectionalShadows=b,R.numPointShadows=v,R.numSpotShadows=y,R.numSpotMaps=_,R.numLightProbes=C,n.version=s3++)}function l(c,h){let u=0,p=0,d=0,m=0,f=0;const x=h.matrixWorldInverse;for(let g=0,b=c.length;g=a.length?(o=new jf(s),a.push(o)):o=a[r],o}function n(){e=new WeakMap}return{get:t,dispose:n}}const l3=`void main() { gl_Position = vec4( position, 1.0 ); }`,c3=`uniform sampler2D shadow_pass; uniform vec2 resolution; @@ -3921,7 +3921,7 @@ void main() { squared_mean = squared_mean / samples; float std_dev = sqrt( squared_mean - mean * mean ); gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) ); -}`;function h3(s,e,t){let n=new Rh;const i=new he,r=new he,a=new tt,o=new U1({depthPacking:Zg}),l=new O1,c={},h=t.maxTextureSize,u={[kn]:sn,[sn]:kn,[bt]:bt},p=new Lt({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new he},radius:{value:4}},vertexShader:l3,fragmentShader:c3}),d=p.clone();d.defines.HORIZONTAL_PASS=1;const m=new dt;m.setAttribute("position",new yt(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const f=new rt(m,p),x=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=Sd;let g=this.type;this.render=function(M,T,R){if(x.enabled===!1||x.autoUpdate===!1&&x.needsUpdate===!1||M.length===0)return;const S=s.getRenderTarget(),E=s.getActiveCubeFace(),L=s.getActiveMipmapLevel(),A=s.state;A.setBlending(St),A.buffers.depth.getReversed()===!0?A.buffers.color.setClear(0,0,0,0):A.buffers.color.setClear(1,1,1,1),A.buffers.depth.setTest(!0),A.setScissorTest(!1);const I=g!==vi&&this.type===vi,w=g===vi&&this.type!==vi;for(let z=0,G=M.length;zh||i.y>h)&&(i.x>h&&(r.x=Math.floor(h/q.x),i.x=r.x*q.x,Y.mapSize.x=r.x),i.y>h&&(r.y=Math.floor(h/q.y),i.y=r.y*q.y,Y.mapSize.y=r.y)),Y.map===null||I===!0||w===!0){const W=this.type!==vi?{minFilter:Xt,magFilter:Xt}:{};Y.map!==null&&Y.map.dispose(),Y.map=new Cn(i.x,i.y,W),Y.map.texture.name=j.name+".shadowMap",Y.camera.updateProjectionMatrix()}s.setRenderTarget(Y.map),s.clear();const ie=Y.getViewportCount();for(let W=0;W0||T.map&&T.alphaTest>0||T.alphaToCoverage===!0){const A=E.uuid,I=T.uuid;let w=c[A];w===void 0&&(w={},c[A]=w);let z=w[I];z===void 0&&(z=E.clone(),w[I]=z,T.addEventListener("dispose",_)),E=z}if(E.visible=T.visible,E.wireframe=T.wireframe,S===vi?E.side=T.shadowSide!==null?T.shadowSide:T.side:E.side=T.shadowSide!==null?T.shadowSide:u[T.side],E.alphaMap=T.alphaMap,E.alphaTest=T.alphaToCoverage===!0?.5:T.alphaTest,E.map=T.map,E.clipShadows=T.clipShadows,E.clippingPlanes=T.clippingPlanes,E.clipIntersection=T.clipIntersection,E.displacementMap=T.displacementMap,E.displacementScale=T.displacementScale,E.displacementBias=T.displacementBias,E.wireframeLinewidth=T.wireframeLinewidth,E.linewidth=T.linewidth,R.isPointLight===!0&&E.isMeshDistanceMaterial===!0){const A=s.properties.get(E);A.light=R}return E}function b(M,T,R,S,E){if(M.visible===!1)return;if(M.layers.test(T.layers)&&(M.isMesh||M.isLine||M.isPoints)&&(M.castShadow||M.receiveShadow&&E===vi)&&(!M.frustumCulled||n.intersectsObject(M))){M.modelViewMatrix.multiplyMatrices(R.matrixWorldInverse,M.matrixWorld);const I=e.update(M),w=M.material;if(Array.isArray(w)){const z=I.groups;for(let G=0,j=z.length;G=1):Y.indexOf("OpenGL ES")!==-1&&(j=parseFloat(/^OpenGL ES (\d)/.exec(Y)[1]),G=j>=2);let q=null,ie={};const W=s.getParameter(s.SCISSOR_BOX),$=s.getParameter(s.VIEWPORT),fe=new tt().fromArray(W),me=new tt().fromArray($);function de(Z,Te,Me,we){const ve=new Uint8Array(4),ge=s.createTexture();s.bindTexture(Z,ge),s.texParameteri(Z,s.TEXTURE_MIN_FILTER,s.NEAREST),s.texParameteri(Z,s.TEXTURE_MAG_FILTER,s.NEAREST);for(let Oe=0;Oe"u"?!1:/OculusBrowser/g.test(navigator.userAgent),c=new he,h=new WeakMap;let u;const p=new WeakMap;let d=!1;try{d=typeof OffscreenCanvas<"u"&&new OffscreenCanvas(1,1).getContext("2d")!==null}catch{}function m(B,D){return d?new OffscreenCanvas(B,D):ta("canvas")}function f(B,D,H){let K=1;const le=X(B);if((le.width>H||le.height>H)&&(K=H/Math.max(le.width,le.height)),K<1)if(typeof HTMLImageElement<"u"&&B instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&B instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&B instanceof ImageBitmap||typeof VideoFrame<"u"&&B instanceof VideoFrame){const te=Math.floor(K*le.width),Ce=Math.floor(K*le.height);u===void 0&&(u=m(te,Ce));const be=D?m(te,Ce):u;return be.width=te,be.height=Ce,be.getContext("2d").drawImage(B,0,0,te,Ce),He("WebGLRenderer: Texture has been resized from ("+le.width+"x"+le.height+") to ("+te+"x"+Ce+")."),be}else return"data"in B&&He("WebGLRenderer: Image in DataTexture is too big ("+le.width+"x"+le.height+")."),B;return B}function x(B){return B.generateMipmaps}function g(B){s.generateMipmap(B)}function y(B){return B.isWebGLCubeRenderTarget?s.TEXTURE_CUBE_MAP:B.isWebGL3DRenderTarget?s.TEXTURE_3D:B.isWebGLArrayRenderTarget||B.isCompressedArrayTexture?s.TEXTURE_2D_ARRAY:s.TEXTURE_2D}function v(B,D,H,K,le=!1){if(B!==null){if(s[B]!==void 0)return s[B];He("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+B+"'")}let te=D;if(D===s.RED&&(H===s.FLOAT&&(te=s.R32F),H===s.HALF_FLOAT&&(te=s.R16F),H===s.UNSIGNED_BYTE&&(te=s.R8)),D===s.RED_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.R8UI),H===s.UNSIGNED_SHORT&&(te=s.R16UI),H===s.UNSIGNED_INT&&(te=s.R32UI),H===s.BYTE&&(te=s.R8I),H===s.SHORT&&(te=s.R16I),H===s.INT&&(te=s.R32I)),D===s.RG&&(H===s.FLOAT&&(te=s.RG32F),H===s.HALF_FLOAT&&(te=s.RG16F),H===s.UNSIGNED_BYTE&&(te=s.RG8)),D===s.RG_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.RG8UI),H===s.UNSIGNED_SHORT&&(te=s.RG16UI),H===s.UNSIGNED_INT&&(te=s.RG32UI),H===s.BYTE&&(te=s.RG8I),H===s.SHORT&&(te=s.RG16I),H===s.INT&&(te=s.RG32I)),D===s.RGB_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.RGB8UI),H===s.UNSIGNED_SHORT&&(te=s.RGB16UI),H===s.UNSIGNED_INT&&(te=s.RGB32UI),H===s.BYTE&&(te=s.RGB8I),H===s.SHORT&&(te=s.RGB16I),H===s.INT&&(te=s.RGB32I)),D===s.RGBA_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.RGBA8UI),H===s.UNSIGNED_SHORT&&(te=s.RGBA16UI),H===s.UNSIGNED_INT&&(te=s.RGBA32UI),H===s.BYTE&&(te=s.RGBA8I),H===s.SHORT&&(te=s.RGBA16I),H===s.INT&&(te=s.RGBA32I)),D===s.RGB&&(H===s.UNSIGNED_INT_5_9_9_9_REV&&(te=s.RGB9_E5),H===s.UNSIGNED_INT_10F_11F_11F_REV&&(te=s.R11F_G11F_B10F)),D===s.RGBA){const Ce=le?ao:it.getTransfer(K);H===s.FLOAT&&(te=s.RGBA32F),H===s.HALF_FLOAT&&(te=s.RGBA16F),H===s.UNSIGNED_BYTE&&(te=Ce===ct?s.SRGB8_ALPHA8:s.RGBA8),H===s.UNSIGNED_SHORT_4_4_4_4&&(te=s.RGBA4),H===s.UNSIGNED_SHORT_5_5_5_1&&(te=s.RGB5_A1)}return(te===s.R16F||te===s.R32F||te===s.RG16F||te===s.RG32F||te===s.RGBA16F||te===s.RGBA32F)&&e.get("EXT_color_buffer_float"),te}function b(B,D){let H;return B?D===null||D===ps||D===fs?H=s.DEPTH24_STENCIL8:D===hn?H=s.DEPTH32F_STENCIL8:D===Kr&&(H=s.DEPTH24_STENCIL8,He("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):D===null||D===ps||D===fs?H=s.DEPTH_COMPONENT24:D===hn?H=s.DEPTH_COMPONENT32F:D===Kr&&(H=s.DEPTH_COMPONENT16),H}function _(B,D){return x(B)===!0||B.isFramebufferTexture&&B.minFilter!==Xt&&B.minFilter!==Pt?Math.log2(Math.max(D.width,D.height))+1:B.mipmaps!==void 0&&B.mipmaps.length>0?B.mipmaps.length:B.isCompressedTexture&&Array.isArray(B.image)?D.mipmaps.length:1}function M(B){const D=B.target;D.removeEventListener("dispose",M),R(D),D.isVideoTexture&&h.delete(D)}function T(B){const D=B.target;D.removeEventListener("dispose",T),E(D)}function R(B){const D=n.get(B);if(D.__webglInit===void 0)return;const H=B.source,K=p.get(H);if(K){const le=K[D.__cacheKey];le.usedTimes--,le.usedTimes===0&&S(B),Object.keys(K).length===0&&p.delete(H)}n.remove(B)}function S(B){const D=n.get(B);s.deleteTexture(D.__webglTexture);const H=B.source,K=p.get(H);delete K[D.__cacheKey],a.memory.textures--}function E(B){const D=n.get(B);if(B.depthTexture&&(B.depthTexture.dispose(),n.remove(B.depthTexture)),B.isWebGLCubeRenderTarget)for(let K=0;K<6;K++){if(Array.isArray(D.__webglFramebuffer[K]))for(let le=0;le=i.maxTextures&&He("WebGLTextures: Trying to use "+B+" texture units while this GPU supports only "+i.maxTextures),L+=1,B}function w(B){const D=[];return D.push(B.wrapS),D.push(B.wrapT),D.push(B.wrapR||0),D.push(B.magFilter),D.push(B.minFilter),D.push(B.anisotropy),D.push(B.internalFormat),D.push(B.format),D.push(B.type),D.push(B.generateMipmaps),D.push(B.premultiplyAlpha),D.push(B.flipY),D.push(B.unpackAlignment),D.push(B.colorSpace),D.join()}function z(B,D){const H=n.get(B);if(B.isVideoTexture&&ee(B),B.isRenderTargetTexture===!1&&B.isExternalTexture!==!0&&B.version>0&&H.__version!==B.version){const K=B.image;if(K===null)He("WebGLRenderer: Texture marked for update but no image data found.");else if(K.complete===!1)He("WebGLRenderer: Texture marked for update but image is incomplete");else{se(H,B,D);return}}else B.isExternalTexture&&(H.__webglTexture=B.sourceTexture?B.sourceTexture:null);t.bindTexture(s.TEXTURE_2D,H.__webglTexture,s.TEXTURE0+D)}function G(B,D){const H=n.get(B);if(B.isRenderTargetTexture===!1&&B.version>0&&H.__version!==B.version){se(H,B,D);return}else B.isExternalTexture&&(H.__webglTexture=B.sourceTexture?B.sourceTexture:null);t.bindTexture(s.TEXTURE_2D_ARRAY,H.__webglTexture,s.TEXTURE0+D)}function j(B,D){const H=n.get(B);if(B.isRenderTargetTexture===!1&&B.version>0&&H.__version!==B.version){se(H,B,D);return}t.bindTexture(s.TEXTURE_3D,H.__webglTexture,s.TEXTURE0+D)}function Y(B,D){const H=n.get(B);if(B.version>0&&H.__version!==B.version){ce(H,B,D);return}t.bindTexture(s.TEXTURE_CUBE_MAP,H.__webglTexture,s.TEXTURE0+D)}const q={[Tn]:s.REPEAT,[Un]:s.CLAMP_TO_EDGE,[Ja]:s.MIRRORED_REPEAT},ie={[Xt]:s.NEAREST,[Ud]:s.NEAREST_MIPMAP_NEAREST,[$r]:s.NEAREST_MIPMAP_LINEAR,[Pt]:s.LINEAR,[Qa]:s.LINEAR_MIPMAP_NEAREST,[ai]:s.LINEAR_MIPMAP_LINEAR},W={[$g]:s.NEVER,[nx]:s.ALWAYS,[Kg]:s.LESS,[Yd]:s.LEQUAL,[Jg]:s.EQUAL,[tx]:s.GEQUAL,[Qg]:s.GREATER,[ex]:s.NOTEQUAL};function $(B,D){if(D.type===hn&&e.has("OES_texture_float_linear")===!1&&(D.magFilter===Pt||D.magFilter===Qa||D.magFilter===$r||D.magFilter===ai||D.minFilter===Pt||D.minFilter===Qa||D.minFilter===$r||D.minFilter===ai)&&He("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),s.texParameteri(B,s.TEXTURE_WRAP_S,q[D.wrapS]),s.texParameteri(B,s.TEXTURE_WRAP_T,q[D.wrapT]),(B===s.TEXTURE_3D||B===s.TEXTURE_2D_ARRAY)&&s.texParameteri(B,s.TEXTURE_WRAP_R,q[D.wrapR]),s.texParameteri(B,s.TEXTURE_MAG_FILTER,ie[D.magFilter]),s.texParameteri(B,s.TEXTURE_MIN_FILTER,ie[D.minFilter]),D.compareFunction&&(s.texParameteri(B,s.TEXTURE_COMPARE_MODE,s.COMPARE_REF_TO_TEXTURE),s.texParameteri(B,s.TEXTURE_COMPARE_FUNC,W[D.compareFunction])),e.has("EXT_texture_filter_anisotropic")===!0){if(D.magFilter===Xt||D.minFilter!==$r&&D.minFilter!==ai||D.type===hn&&e.has("OES_texture_float_linear")===!1)return;if(D.anisotropy>1||n.get(D).__currentAnisotropy){const H=e.get("EXT_texture_filter_anisotropic");s.texParameterf(B,H.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(D.anisotropy,i.getMaxAnisotropy())),n.get(D).__currentAnisotropy=D.anisotropy}}}function fe(B,D){let H=!1;B.__webglInit===void 0&&(B.__webglInit=!0,D.addEventListener("dispose",M));const K=D.source;let le=p.get(K);le===void 0&&(le={},p.set(K,le));const te=w(D);if(te!==B.__cacheKey){le[te]===void 0&&(le[te]={texture:s.createTexture(),usedTimes:0},a.memory.textures++,H=!0),le[te].usedTimes++;const Ce=le[B.__cacheKey];Ce!==void 0&&(le[B.__cacheKey].usedTimes--,Ce.usedTimes===0&&S(D)),B.__cacheKey=te,B.__webglTexture=le[te].texture}return H}function me(B,D,H){return Math.floor(Math.floor(B/H)/D)}function de(B,D,H,K){const te=B.updateRanges;if(te.length===0)t.texSubImage2D(s.TEXTURE_2D,0,0,0,D.width,D.height,H,K,D.data);else{te.sort((ue,_e)=>ue.start-_e.start);let Ce=0;for(let ue=1;ue0){Z&&Te&&t.texStorage2D(s.TEXTURE_2D,we,Ue,Ge[0].width,Ge[0].height);for(let ve=0,ge=Ge.length;ve0){const Oe=yf(Ae.width,Ae.height,D.format,D.type);for(const Ye of D.layerUpdates){const wt=Ae.data.subarray(Ye*Oe/Ae.data.BYTES_PER_ELEMENT,(Ye+1)*Oe/Ae.data.BYTES_PER_ELEMENT);t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY,ve,0,0,Ye,Ae.width,Ae.height,1,_e,wt)}D.clearLayerUpdates()}else t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY,ve,0,0,0,Ae.width,Ae.height,ue.depth,_e,Ae.data)}else t.compressedTexImage3D(s.TEXTURE_2D_ARRAY,ve,Ue,Ae.width,Ae.height,ue.depth,0,Ae.data,0,0);else He("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else Z?Me&&t.texSubImage3D(s.TEXTURE_2D_ARRAY,ve,0,0,0,Ae.width,Ae.height,ue.depth,_e,Ve,Ae.data):t.texImage3D(s.TEXTURE_2D_ARRAY,ve,Ue,Ae.width,Ae.height,ue.depth,0,_e,Ve,Ae.data)}else{Z&&Te&&t.texStorage2D(s.TEXTURE_2D,we,Ue,Ge[0].width,Ge[0].height);for(let ve=0,ge=Ge.length;ve0){const ve=yf(ue.width,ue.height,D.format,D.type);for(const ge of D.layerUpdates){const Oe=ue.data.subarray(ge*ve/ue.data.BYTES_PER_ELEMENT,(ge+1)*ve/ue.data.BYTES_PER_ELEMENT);t.texSubImage3D(s.TEXTURE_2D_ARRAY,0,0,0,ge,ue.width,ue.height,1,_e,Ve,Oe)}D.clearLayerUpdates()}else t.texSubImage3D(s.TEXTURE_2D_ARRAY,0,0,0,0,ue.width,ue.height,ue.depth,_e,Ve,ue.data)}else t.texImage3D(s.TEXTURE_2D_ARRAY,0,Ue,ue.width,ue.height,ue.depth,0,_e,Ve,ue.data);else if(D.isData3DTexture)Z?(Te&&t.texStorage3D(s.TEXTURE_3D,we,Ue,ue.width,ue.height,ue.depth),Me&&t.texSubImage3D(s.TEXTURE_3D,0,0,0,0,ue.width,ue.height,ue.depth,_e,Ve,ue.data)):t.texImage3D(s.TEXTURE_3D,0,Ue,ue.width,ue.height,ue.depth,0,_e,Ve,ue.data);else if(D.isFramebufferTexture){if(Te)if(Z)t.texStorage2D(s.TEXTURE_2D,we,Ue,ue.width,ue.height);else{let ve=ue.width,ge=ue.height;for(let Oe=0;Oe>=1,ge>>=1}}else if(Ge.length>0){if(Z&&Te){const ve=X(Ge[0]);t.texStorage2D(s.TEXTURE_2D,we,Ue,ve.width,ve.height)}for(let ve=0,ge=Ge.length;ve0&&we++;const ge=X(_e[0]);t.texStorage2D(s.TEXTURE_CUBE_MAP,we,Ge,ge.width,ge.height)}for(let ge=0;ge<6;ge++)if(ue){Z?Me&&t.texSubImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X+ge,0,0,0,_e[ge].width,_e[ge].height,Ue,Ae,_e[ge].data):t.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X+ge,0,Ge,_e[ge].width,_e[ge].height,0,Ue,Ae,_e[ge].data);for(let Oe=0;Oe>te),Ve=Math.max(1,D.height>>te);le===s.TEXTURE_3D||le===s.TEXTURE_2D_ARRAY?t.texImage3D(le,te,Re,_e,Ve,D.depth,0,Ce,be,null):t.texImage2D(le,te,Re,_e,Ve,0,Ce,be,null)}t.bindFramebuffer(s.FRAMEBUFFER,B),F(D)?o.framebufferTexture2DMultisampleEXT(s.FRAMEBUFFER,K,le,ue.__webglTexture,0,k(D)):(le===s.TEXTURE_2D||le>=s.TEXTURE_CUBE_MAP_POSITIVE_X&&le<=s.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&s.framebufferTexture2D(s.FRAMEBUFFER,K,le,ue.__webglTexture,te),t.bindFramebuffer(s.FRAMEBUFFER,null)}function ye(B,D,H){if(s.bindRenderbuffer(s.RENDERBUFFER,B),D.depthBuffer){const K=D.depthTexture,le=K&&K.isDepthTexture?K.type:null,te=b(D.stencilBuffer,le),Ce=D.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,be=k(D);F(D)?o.renderbufferStorageMultisampleEXT(s.RENDERBUFFER,be,te,D.width,D.height):H?s.renderbufferStorageMultisample(s.RENDERBUFFER,be,te,D.width,D.height):s.renderbufferStorage(s.RENDERBUFFER,te,D.width,D.height),s.framebufferRenderbuffer(s.FRAMEBUFFER,Ce,s.RENDERBUFFER,B)}else{const K=D.textures;for(let le=0;le{delete D.__boundDepthTexture,delete D.__depthDisposeCallback,K.removeEventListener("dispose",le)};K.addEventListener("dispose",le),D.__depthDisposeCallback=le}D.__boundDepthTexture=K}if(B.depthTexture&&!D.__autoAllocateDepthBuffer){if(H)throw new Error("target.depthTexture not supported in Cube render targets");const K=B.texture.mipmaps;K&&K.length>0?Se(D.__webglFramebuffer[0],B):Se(D.__webglFramebuffer,B)}else if(H){D.__webglDepthbuffer=[];for(let K=0;K<6;K++)if(t.bindFramebuffer(s.FRAMEBUFFER,D.__webglFramebuffer[K]),D.__webglDepthbuffer[K]===void 0)D.__webglDepthbuffer[K]=s.createRenderbuffer(),ye(D.__webglDepthbuffer[K],B,!1);else{const le=B.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,te=D.__webglDepthbuffer[K];s.bindRenderbuffer(s.RENDERBUFFER,te),s.framebufferRenderbuffer(s.FRAMEBUFFER,le,s.RENDERBUFFER,te)}}else{const K=B.texture.mipmaps;if(K&&K.length>0?t.bindFramebuffer(s.FRAMEBUFFER,D.__webglFramebuffer[0]):t.bindFramebuffer(s.FRAMEBUFFER,D.__webglFramebuffer),D.__webglDepthbuffer===void 0)D.__webglDepthbuffer=s.createRenderbuffer(),ye(D.__webglDepthbuffer,B,!1);else{const le=B.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,te=D.__webglDepthbuffer;s.bindRenderbuffer(s.RENDERBUFFER,te),s.framebufferRenderbuffer(s.FRAMEBUFFER,le,s.RENDERBUFFER,te)}}t.bindFramebuffer(s.FRAMEBUFFER,null)}function Je(B,D,H){const K=n.get(B);D!==void 0&&pe(K.__webglFramebuffer,B,B.texture,s.COLOR_ATTACHMENT0,s.TEXTURE_2D,0),H!==void 0&&Be(B)}function ke(B){const D=B.texture,H=n.get(B),K=n.get(D);B.addEventListener("dispose",T);const le=B.textures,te=B.isWebGLCubeRenderTarget===!0,Ce=le.length>1;if(Ce||(K.__webglTexture===void 0&&(K.__webglTexture=s.createTexture()),K.__version=D.version,a.memory.textures++),te){H.__webglFramebuffer=[];for(let be=0;be<6;be++)if(D.mipmaps&&D.mipmaps.length>0){H.__webglFramebuffer[be]=[];for(let Re=0;Re0){H.__webglFramebuffer=[];for(let be=0;be0&&F(B)===!1){H.__webglMultisampledFramebuffer=s.createFramebuffer(),H.__webglColorRenderbuffer=[],t.bindFramebuffer(s.FRAMEBUFFER,H.__webglMultisampledFramebuffer);for(let be=0;be0)for(let Re=0;Re0)for(let Re=0;Re0){if(F(B)===!1){const D=B.textures,H=B.width,K=B.height;let le=s.COLOR_BUFFER_BIT;const te=B.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,Ce=n.get(B),be=D.length>1;if(be)for(let Ie=0;Ie0?t.bindFramebuffer(s.DRAW_FRAMEBUFFER,Ce.__webglFramebuffer[0]):t.bindFramebuffer(s.DRAW_FRAMEBUFFER,Ce.__webglFramebuffer);for(let Ie=0;Ie0&&e.has("WEBGL_multisampled_render_to_texture")===!0&&D.__useRenderToTexture!==!1}function ee(B){const D=a.render.frame;h.get(B)!==D&&(h.set(B,D),B.update())}function J(B,D){const H=B.colorSpace,K=B.format,le=B.type;return B.isCompressedTexture===!0||B.isVideoTexture===!0||H!==en&&H!==Hi&&(it.getTransfer(H)===ct?(K!==vn||le!==$n)&&He("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):Qe("WebGLTextures: Unsupported texture color space:",H)),D}function X(B){return typeof HTMLImageElement<"u"&&B instanceof HTMLImageElement?(c.width=B.naturalWidth||B.width,c.height=B.naturalHeight||B.height):typeof VideoFrame<"u"&&B instanceof VideoFrame?(c.width=B.displayWidth,c.height=B.displayHeight):(c.width=B.width,c.height=B.height),c}this.allocateTextureUnit=I,this.resetTextureUnits=A,this.setTexture2D=z,this.setTexture2DArray=G,this.setTexture3D=j,this.setTextureCube=Y,this.rebindTextures=Je,this.setupRenderTarget=ke,this.updateRenderTargetMipmap=C,this.updateMultisampleRenderTarget=U,this.setupDepthRenderbuffer=Be,this.setupFrameBufferTexture=pe,this.useMultisampledRTT=F}function f3(s,e){function t(n,i=Hi){let r;const a=it.getTransfer(i);if(n===$n)return s.UNSIGNED_BYTE;if(n===gc)return s.UNSIGNED_SHORT_4_4_4_4;if(n===xc)return s.UNSIGNED_SHORT_5_5_5_1;if(n===Fd)return s.UNSIGNED_INT_5_9_9_9_REV;if(n===Hd)return s.UNSIGNED_INT_10F_11F_11F_REV;if(n===Od)return s.BYTE;if(n===zd)return s.SHORT;if(n===Kr)return s.UNSIGNED_SHORT;if(n===mc)return s.INT;if(n===ps)return s.UNSIGNED_INT;if(n===hn)return s.FLOAT;if(n===un)return s.HALF_FLOAT;if(n===Vd)return s.ALPHA;if(n===Gd)return s.RGB;if(n===vn)return s.RGBA;if(n===Jr)return s.DEPTH_COMPONENT;if(n===ms)return s.DEPTH_STENCIL;if(n===eo)return s.RED;if(n===vc)return s.RED_INTEGER;if(n===yc)return s.RG;if(n===bc)return s.RG_INTEGER;if(n===_c)return s.RGBA_INTEGER;if(n===to||n===no||n===io||n===so)if(a===ct)if(r=e.get("WEBGL_compressed_texture_s3tc_srgb"),r!==null){if(n===to)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===no)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===io)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===so)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(r=e.get("WEBGL_compressed_texture_s3tc"),r!==null){if(n===to)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===no)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===io)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===so)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(n===Mc||n===wc||n===Sc||n===Ec)if(r=e.get("WEBGL_compressed_texture_pvrtc"),r!==null){if(n===Mc)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===wc)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===Sc)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===Ec)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(n===Tc||n===Cc||n===Ac)if(r=e.get("WEBGL_compressed_texture_etc"),r!==null){if(n===Tc||n===Cc)return a===ct?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===Ac)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(n===Pc||n===Rc||n===Lc||n===Dc||n===Ic||n===Nc||n===Bc||n===kc||n===Uc||n===Oc||n===zc||n===Fc||n===Hc||n===Vc)if(r=e.get("WEBGL_compressed_texture_astc"),r!==null){if(n===Pc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===Rc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===Lc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===Dc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===Ic)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===Nc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===Bc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===kc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===Uc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===Oc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===zc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===Fc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===Hc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===Vc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(n===Gc||n===Wc||n===Xc)if(r=e.get("EXT_texture_compression_bptc"),r!==null){if(n===Gc)return a===ct?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===Wc)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===Xc)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(n===jc||n===qc||n===Zc||n===Yc)if(r=e.get("EXT_texture_compression_rgtc"),r!==null){if(n===jc)return r.COMPRESSED_RED_RGTC1_EXT;if(n===qc)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===Zc)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===Yc)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return n===fs?s.UNSIGNED_INT_24_8:s[n]!==void 0?s[n]:null}return{convert:t}}const m3=` +}`;function h3(s,e,t){let n=new Rh;const i=new he,r=new he,a=new tt,o=new U1({depthPacking:Zg}),l=new O1,c={},h=t.maxTextureSize,u={[kn]:sn,[sn]:kn,[yt]:yt},p=new Lt({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new he},radius:{value:4}},vertexShader:l3,fragmentShader:c3}),d=p.clone();d.defines.HORIZONTAL_PASS=1;const m=new dt;m.setAttribute("position",new bt(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const f=new rt(m,p),x=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=Sd;let g=this.type;this.render=function(M,C,R){if(x.enabled===!1||x.autoUpdate===!1&&x.needsUpdate===!1||M.length===0)return;const S=s.getRenderTarget(),E=s.getActiveCubeFace(),L=s.getActiveMipmapLevel(),A=s.state;A.setBlending(St),A.buffers.depth.getReversed()===!0?A.buffers.color.setClear(0,0,0,0):A.buffers.color.setClear(1,1,1,1),A.buffers.depth.setTest(!0),A.setScissorTest(!1);const I=g!==vi&&this.type===vi,w=g===vi&&this.type!==vi;for(let z=0,G=M.length;zh||i.y>h)&&(i.x>h&&(r.x=Math.floor(h/q.x),i.x=r.x*q.x,Y.mapSize.x=r.x),i.y>h&&(r.y=Math.floor(h/q.y),i.y=r.y*q.y,Y.mapSize.y=r.y)),Y.map===null||I===!0||w===!0){const W=this.type!==vi?{minFilter:Xt,magFilter:Xt}:{};Y.map!==null&&Y.map.dispose(),Y.map=new Tn(i.x,i.y,W),Y.map.texture.name=j.name+".shadowMap",Y.camera.updateProjectionMatrix()}s.setRenderTarget(Y.map),s.clear();const ie=Y.getViewportCount();for(let W=0;W0||C.map&&C.alphaTest>0||C.alphaToCoverage===!0){const A=E.uuid,I=C.uuid;let w=c[A];w===void 0&&(w={},c[A]=w);let z=w[I];z===void 0&&(z=E.clone(),w[I]=z,C.addEventListener("dispose",_)),E=z}if(E.visible=C.visible,E.wireframe=C.wireframe,S===vi?E.side=C.shadowSide!==null?C.shadowSide:C.side:E.side=C.shadowSide!==null?C.shadowSide:u[C.side],E.alphaMap=C.alphaMap,E.alphaTest=C.alphaToCoverage===!0?.5:C.alphaTest,E.map=C.map,E.clipShadows=C.clipShadows,E.clippingPlanes=C.clippingPlanes,E.clipIntersection=C.clipIntersection,E.displacementMap=C.displacementMap,E.displacementScale=C.displacementScale,E.displacementBias=C.displacementBias,E.wireframeLinewidth=C.wireframeLinewidth,E.linewidth=C.linewidth,R.isPointLight===!0&&E.isMeshDistanceMaterial===!0){const A=s.properties.get(E);A.light=R}return E}function y(M,C,R,S,E){if(M.visible===!1)return;if(M.layers.test(C.layers)&&(M.isMesh||M.isLine||M.isPoints)&&(M.castShadow||M.receiveShadow&&E===vi)&&(!M.frustumCulled||n.intersectsObject(M))){M.modelViewMatrix.multiplyMatrices(R.matrixWorldInverse,M.matrixWorld);const I=e.update(M),w=M.material;if(Array.isArray(w)){const z=I.groups;for(let G=0,j=z.length;G=1):Y.indexOf("OpenGL ES")!==-1&&(j=parseFloat(/^OpenGL ES (\d)/.exec(Y)[1]),G=j>=2);let q=null,ie={};const W=s.getParameter(s.SCISSOR_BOX),$=s.getParameter(s.VIEWPORT),fe=new tt().fromArray(W),me=new tt().fromArray($);function de(Z,Ce,Me,we){const ve=new Uint8Array(4),ge=s.createTexture();s.bindTexture(Z,ge),s.texParameteri(Z,s.TEXTURE_MIN_FILTER,s.NEAREST),s.texParameteri(Z,s.TEXTURE_MAG_FILTER,s.NEAREST);for(let Oe=0;Oe"u"?!1:/OculusBrowser/g.test(navigator.userAgent),c=new he,h=new WeakMap;let u;const p=new WeakMap;let d=!1;try{d=typeof OffscreenCanvas<"u"&&new OffscreenCanvas(1,1).getContext("2d")!==null}catch{}function m(B,D){return d?new OffscreenCanvas(B,D):ta("canvas")}function f(B,D,H){let K=1;const le=X(B);if((le.width>H||le.height>H)&&(K=H/Math.max(le.width,le.height)),K<1)if(typeof HTMLImageElement<"u"&&B instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&B instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&B instanceof ImageBitmap||typeof VideoFrame<"u"&&B instanceof VideoFrame){const te=Math.floor(K*le.width),Te=Math.floor(K*le.height);u===void 0&&(u=m(te,Te));const ye=D?m(te,Te):u;return ye.width=te,ye.height=Te,ye.getContext("2d").drawImage(B,0,0,te,Te),He("WebGLRenderer: Texture has been resized from ("+le.width+"x"+le.height+") to ("+te+"x"+Te+")."),ye}else return"data"in B&&He("WebGLRenderer: Image in DataTexture is too big ("+le.width+"x"+le.height+")."),B;return B}function x(B){return B.generateMipmaps}function g(B){s.generateMipmap(B)}function b(B){return B.isWebGLCubeRenderTarget?s.TEXTURE_CUBE_MAP:B.isWebGL3DRenderTarget?s.TEXTURE_3D:B.isWebGLArrayRenderTarget||B.isCompressedArrayTexture?s.TEXTURE_2D_ARRAY:s.TEXTURE_2D}function v(B,D,H,K,le=!1){if(B!==null){if(s[B]!==void 0)return s[B];He("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+B+"'")}let te=D;if(D===s.RED&&(H===s.FLOAT&&(te=s.R32F),H===s.HALF_FLOAT&&(te=s.R16F),H===s.UNSIGNED_BYTE&&(te=s.R8)),D===s.RED_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.R8UI),H===s.UNSIGNED_SHORT&&(te=s.R16UI),H===s.UNSIGNED_INT&&(te=s.R32UI),H===s.BYTE&&(te=s.R8I),H===s.SHORT&&(te=s.R16I),H===s.INT&&(te=s.R32I)),D===s.RG&&(H===s.FLOAT&&(te=s.RG32F),H===s.HALF_FLOAT&&(te=s.RG16F),H===s.UNSIGNED_BYTE&&(te=s.RG8)),D===s.RG_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.RG8UI),H===s.UNSIGNED_SHORT&&(te=s.RG16UI),H===s.UNSIGNED_INT&&(te=s.RG32UI),H===s.BYTE&&(te=s.RG8I),H===s.SHORT&&(te=s.RG16I),H===s.INT&&(te=s.RG32I)),D===s.RGB_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.RGB8UI),H===s.UNSIGNED_SHORT&&(te=s.RGB16UI),H===s.UNSIGNED_INT&&(te=s.RGB32UI),H===s.BYTE&&(te=s.RGB8I),H===s.SHORT&&(te=s.RGB16I),H===s.INT&&(te=s.RGB32I)),D===s.RGBA_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.RGBA8UI),H===s.UNSIGNED_SHORT&&(te=s.RGBA16UI),H===s.UNSIGNED_INT&&(te=s.RGBA32UI),H===s.BYTE&&(te=s.RGBA8I),H===s.SHORT&&(te=s.RGBA16I),H===s.INT&&(te=s.RGBA32I)),D===s.RGB&&(H===s.UNSIGNED_INT_5_9_9_9_REV&&(te=s.RGB9_E5),H===s.UNSIGNED_INT_10F_11F_11F_REV&&(te=s.R11F_G11F_B10F)),D===s.RGBA){const Te=le?ao:it.getTransfer(K);H===s.FLOAT&&(te=s.RGBA32F),H===s.HALF_FLOAT&&(te=s.RGBA16F),H===s.UNSIGNED_BYTE&&(te=Te===ct?s.SRGB8_ALPHA8:s.RGBA8),H===s.UNSIGNED_SHORT_4_4_4_4&&(te=s.RGBA4),H===s.UNSIGNED_SHORT_5_5_5_1&&(te=s.RGB5_A1)}return(te===s.R16F||te===s.R32F||te===s.RG16F||te===s.RG32F||te===s.RGBA16F||te===s.RGBA32F)&&e.get("EXT_color_buffer_float"),te}function y(B,D){let H;return B?D===null||D===ps||D===fs?H=s.DEPTH24_STENCIL8:D===hn?H=s.DEPTH32F_STENCIL8:D===Kr&&(H=s.DEPTH24_STENCIL8,He("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):D===null||D===ps||D===fs?H=s.DEPTH_COMPONENT24:D===hn?H=s.DEPTH_COMPONENT32F:D===Kr&&(H=s.DEPTH_COMPONENT16),H}function _(B,D){return x(B)===!0||B.isFramebufferTexture&&B.minFilter!==Xt&&B.minFilter!==Pt?Math.log2(Math.max(D.width,D.height))+1:B.mipmaps!==void 0&&B.mipmaps.length>0?B.mipmaps.length:B.isCompressedTexture&&Array.isArray(B.image)?D.mipmaps.length:1}function M(B){const D=B.target;D.removeEventListener("dispose",M),R(D),D.isVideoTexture&&h.delete(D)}function C(B){const D=B.target;D.removeEventListener("dispose",C),E(D)}function R(B){const D=n.get(B);if(D.__webglInit===void 0)return;const H=B.source,K=p.get(H);if(K){const le=K[D.__cacheKey];le.usedTimes--,le.usedTimes===0&&S(B),Object.keys(K).length===0&&p.delete(H)}n.remove(B)}function S(B){const D=n.get(B);s.deleteTexture(D.__webglTexture);const H=B.source,K=p.get(H);delete K[D.__cacheKey],a.memory.textures--}function E(B){const D=n.get(B);if(B.depthTexture&&(B.depthTexture.dispose(),n.remove(B.depthTexture)),B.isWebGLCubeRenderTarget)for(let K=0;K<6;K++){if(Array.isArray(D.__webglFramebuffer[K]))for(let le=0;le=i.maxTextures&&He("WebGLTextures: Trying to use "+B+" texture units while this GPU supports only "+i.maxTextures),L+=1,B}function w(B){const D=[];return D.push(B.wrapS),D.push(B.wrapT),D.push(B.wrapR||0),D.push(B.magFilter),D.push(B.minFilter),D.push(B.anisotropy),D.push(B.internalFormat),D.push(B.format),D.push(B.type),D.push(B.generateMipmaps),D.push(B.premultiplyAlpha),D.push(B.flipY),D.push(B.unpackAlignment),D.push(B.colorSpace),D.join()}function z(B,D){const H=n.get(B);if(B.isVideoTexture&&ee(B),B.isRenderTargetTexture===!1&&B.isExternalTexture!==!0&&B.version>0&&H.__version!==B.version){const K=B.image;if(K===null)He("WebGLRenderer: Texture marked for update but no image data found.");else if(K.complete===!1)He("WebGLRenderer: Texture marked for update but image is incomplete");else{se(H,B,D);return}}else B.isExternalTexture&&(H.__webglTexture=B.sourceTexture?B.sourceTexture:null);t.bindTexture(s.TEXTURE_2D,H.__webglTexture,s.TEXTURE0+D)}function G(B,D){const H=n.get(B);if(B.isRenderTargetTexture===!1&&B.version>0&&H.__version!==B.version){se(H,B,D);return}else B.isExternalTexture&&(H.__webglTexture=B.sourceTexture?B.sourceTexture:null);t.bindTexture(s.TEXTURE_2D_ARRAY,H.__webglTexture,s.TEXTURE0+D)}function j(B,D){const H=n.get(B);if(B.isRenderTargetTexture===!1&&B.version>0&&H.__version!==B.version){se(H,B,D);return}t.bindTexture(s.TEXTURE_3D,H.__webglTexture,s.TEXTURE0+D)}function Y(B,D){const H=n.get(B);if(B.version>0&&H.__version!==B.version){ce(H,B,D);return}t.bindTexture(s.TEXTURE_CUBE_MAP,H.__webglTexture,s.TEXTURE0+D)}const q={[Cn]:s.REPEAT,[Un]:s.CLAMP_TO_EDGE,[Ja]:s.MIRRORED_REPEAT},ie={[Xt]:s.NEAREST,[Ud]:s.NEAREST_MIPMAP_NEAREST,[$r]:s.NEAREST_MIPMAP_LINEAR,[Pt]:s.LINEAR,[Qa]:s.LINEAR_MIPMAP_NEAREST,[ai]:s.LINEAR_MIPMAP_LINEAR},W={[$g]:s.NEVER,[nx]:s.ALWAYS,[Kg]:s.LESS,[Yd]:s.LEQUAL,[Jg]:s.EQUAL,[tx]:s.GEQUAL,[Qg]:s.GREATER,[ex]:s.NOTEQUAL};function $(B,D){if(D.type===hn&&e.has("OES_texture_float_linear")===!1&&(D.magFilter===Pt||D.magFilter===Qa||D.magFilter===$r||D.magFilter===ai||D.minFilter===Pt||D.minFilter===Qa||D.minFilter===$r||D.minFilter===ai)&&He("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),s.texParameteri(B,s.TEXTURE_WRAP_S,q[D.wrapS]),s.texParameteri(B,s.TEXTURE_WRAP_T,q[D.wrapT]),(B===s.TEXTURE_3D||B===s.TEXTURE_2D_ARRAY)&&s.texParameteri(B,s.TEXTURE_WRAP_R,q[D.wrapR]),s.texParameteri(B,s.TEXTURE_MAG_FILTER,ie[D.magFilter]),s.texParameteri(B,s.TEXTURE_MIN_FILTER,ie[D.minFilter]),D.compareFunction&&(s.texParameteri(B,s.TEXTURE_COMPARE_MODE,s.COMPARE_REF_TO_TEXTURE),s.texParameteri(B,s.TEXTURE_COMPARE_FUNC,W[D.compareFunction])),e.has("EXT_texture_filter_anisotropic")===!0){if(D.magFilter===Xt||D.minFilter!==$r&&D.minFilter!==ai||D.type===hn&&e.has("OES_texture_float_linear")===!1)return;if(D.anisotropy>1||n.get(D).__currentAnisotropy){const H=e.get("EXT_texture_filter_anisotropic");s.texParameterf(B,H.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(D.anisotropy,i.getMaxAnisotropy())),n.get(D).__currentAnisotropy=D.anisotropy}}}function fe(B,D){let H=!1;B.__webglInit===void 0&&(B.__webglInit=!0,D.addEventListener("dispose",M));const K=D.source;let le=p.get(K);le===void 0&&(le={},p.set(K,le));const te=w(D);if(te!==B.__cacheKey){le[te]===void 0&&(le[te]={texture:s.createTexture(),usedTimes:0},a.memory.textures++,H=!0),le[te].usedTimes++;const Te=le[B.__cacheKey];Te!==void 0&&(le[B.__cacheKey].usedTimes--,Te.usedTimes===0&&S(D)),B.__cacheKey=te,B.__webglTexture=le[te].texture}return H}function me(B,D,H){return Math.floor(Math.floor(B/H)/D)}function de(B,D,H,K){const te=B.updateRanges;if(te.length===0)t.texSubImage2D(s.TEXTURE_2D,0,0,0,D.width,D.height,H,K,D.data);else{te.sort((ue,_e)=>ue.start-_e.start);let Te=0;for(let ue=1;ue0){Z&&Ce&&t.texStorage2D(s.TEXTURE_2D,we,Ue,Ge[0].width,Ge[0].height);for(let ve=0,ge=Ge.length;ve0){const Oe=bf(Ae.width,Ae.height,D.format,D.type);for(const Ye of D.layerUpdates){const wt=Ae.data.subarray(Ye*Oe/Ae.data.BYTES_PER_ELEMENT,(Ye+1)*Oe/Ae.data.BYTES_PER_ELEMENT);t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY,ve,0,0,Ye,Ae.width,Ae.height,1,_e,wt)}D.clearLayerUpdates()}else t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY,ve,0,0,0,Ae.width,Ae.height,ue.depth,_e,Ae.data)}else t.compressedTexImage3D(s.TEXTURE_2D_ARRAY,ve,Ue,Ae.width,Ae.height,ue.depth,0,Ae.data,0,0);else He("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else Z?Me&&t.texSubImage3D(s.TEXTURE_2D_ARRAY,ve,0,0,0,Ae.width,Ae.height,ue.depth,_e,Ve,Ae.data):t.texImage3D(s.TEXTURE_2D_ARRAY,ve,Ue,Ae.width,Ae.height,ue.depth,0,_e,Ve,Ae.data)}else{Z&&Ce&&t.texStorage2D(s.TEXTURE_2D,we,Ue,Ge[0].width,Ge[0].height);for(let ve=0,ge=Ge.length;ve0){const ve=bf(ue.width,ue.height,D.format,D.type);for(const ge of D.layerUpdates){const Oe=ue.data.subarray(ge*ve/ue.data.BYTES_PER_ELEMENT,(ge+1)*ve/ue.data.BYTES_PER_ELEMENT);t.texSubImage3D(s.TEXTURE_2D_ARRAY,0,0,0,ge,ue.width,ue.height,1,_e,Ve,Oe)}D.clearLayerUpdates()}else t.texSubImage3D(s.TEXTURE_2D_ARRAY,0,0,0,0,ue.width,ue.height,ue.depth,_e,Ve,ue.data)}else t.texImage3D(s.TEXTURE_2D_ARRAY,0,Ue,ue.width,ue.height,ue.depth,0,_e,Ve,ue.data);else if(D.isData3DTexture)Z?(Ce&&t.texStorage3D(s.TEXTURE_3D,we,Ue,ue.width,ue.height,ue.depth),Me&&t.texSubImage3D(s.TEXTURE_3D,0,0,0,0,ue.width,ue.height,ue.depth,_e,Ve,ue.data)):t.texImage3D(s.TEXTURE_3D,0,Ue,ue.width,ue.height,ue.depth,0,_e,Ve,ue.data);else if(D.isFramebufferTexture){if(Ce)if(Z)t.texStorage2D(s.TEXTURE_2D,we,Ue,ue.width,ue.height);else{let ve=ue.width,ge=ue.height;for(let Oe=0;Oe>=1,ge>>=1}}else if(Ge.length>0){if(Z&&Ce){const ve=X(Ge[0]);t.texStorage2D(s.TEXTURE_2D,we,Ue,ve.width,ve.height)}for(let ve=0,ge=Ge.length;ve0&&we++;const ge=X(_e[0]);t.texStorage2D(s.TEXTURE_CUBE_MAP,we,Ge,ge.width,ge.height)}for(let ge=0;ge<6;ge++)if(ue){Z?Me&&t.texSubImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X+ge,0,0,0,_e[ge].width,_e[ge].height,Ue,Ae,_e[ge].data):t.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X+ge,0,Ge,_e[ge].width,_e[ge].height,0,Ue,Ae,_e[ge].data);for(let Oe=0;Oe>te),Ve=Math.max(1,D.height>>te);le===s.TEXTURE_3D||le===s.TEXTURE_2D_ARRAY?t.texImage3D(le,te,Re,_e,Ve,D.depth,0,Te,ye,null):t.texImage2D(le,te,Re,_e,Ve,0,Te,ye,null)}t.bindFramebuffer(s.FRAMEBUFFER,B),F(D)?o.framebufferTexture2DMultisampleEXT(s.FRAMEBUFFER,K,le,ue.__webglTexture,0,k(D)):(le===s.TEXTURE_2D||le>=s.TEXTURE_CUBE_MAP_POSITIVE_X&&le<=s.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&s.framebufferTexture2D(s.FRAMEBUFFER,K,le,ue.__webglTexture,te),t.bindFramebuffer(s.FRAMEBUFFER,null)}function be(B,D,H){if(s.bindRenderbuffer(s.RENDERBUFFER,B),D.depthBuffer){const K=D.depthTexture,le=K&&K.isDepthTexture?K.type:null,te=y(D.stencilBuffer,le),Te=D.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,ye=k(D);F(D)?o.renderbufferStorageMultisampleEXT(s.RENDERBUFFER,ye,te,D.width,D.height):H?s.renderbufferStorageMultisample(s.RENDERBUFFER,ye,te,D.width,D.height):s.renderbufferStorage(s.RENDERBUFFER,te,D.width,D.height),s.framebufferRenderbuffer(s.FRAMEBUFFER,Te,s.RENDERBUFFER,B)}else{const K=D.textures;for(let le=0;le{delete D.__boundDepthTexture,delete D.__depthDisposeCallback,K.removeEventListener("dispose",le)};K.addEventListener("dispose",le),D.__depthDisposeCallback=le}D.__boundDepthTexture=K}if(B.depthTexture&&!D.__autoAllocateDepthBuffer){if(H)throw new Error("target.depthTexture not supported in Cube render targets");const K=B.texture.mipmaps;K&&K.length>0?Se(D.__webglFramebuffer[0],B):Se(D.__webglFramebuffer,B)}else if(H){D.__webglDepthbuffer=[];for(let K=0;K<6;K++)if(t.bindFramebuffer(s.FRAMEBUFFER,D.__webglFramebuffer[K]),D.__webglDepthbuffer[K]===void 0)D.__webglDepthbuffer[K]=s.createRenderbuffer(),be(D.__webglDepthbuffer[K],B,!1);else{const le=B.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,te=D.__webglDepthbuffer[K];s.bindRenderbuffer(s.RENDERBUFFER,te),s.framebufferRenderbuffer(s.FRAMEBUFFER,le,s.RENDERBUFFER,te)}}else{const K=B.texture.mipmaps;if(K&&K.length>0?t.bindFramebuffer(s.FRAMEBUFFER,D.__webglFramebuffer[0]):t.bindFramebuffer(s.FRAMEBUFFER,D.__webglFramebuffer),D.__webglDepthbuffer===void 0)D.__webglDepthbuffer=s.createRenderbuffer(),be(D.__webglDepthbuffer,B,!1);else{const le=B.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,te=D.__webglDepthbuffer;s.bindRenderbuffer(s.RENDERBUFFER,te),s.framebufferRenderbuffer(s.FRAMEBUFFER,le,s.RENDERBUFFER,te)}}t.bindFramebuffer(s.FRAMEBUFFER,null)}function Je(B,D,H){const K=n.get(B);D!==void 0&&pe(K.__webglFramebuffer,B,B.texture,s.COLOR_ATTACHMENT0,s.TEXTURE_2D,0),H!==void 0&&Be(B)}function ke(B){const D=B.texture,H=n.get(B),K=n.get(D);B.addEventListener("dispose",C);const le=B.textures,te=B.isWebGLCubeRenderTarget===!0,Te=le.length>1;if(Te||(K.__webglTexture===void 0&&(K.__webglTexture=s.createTexture()),K.__version=D.version,a.memory.textures++),te){H.__webglFramebuffer=[];for(let ye=0;ye<6;ye++)if(D.mipmaps&&D.mipmaps.length>0){H.__webglFramebuffer[ye]=[];for(let Re=0;Re0){H.__webglFramebuffer=[];for(let ye=0;ye0&&F(B)===!1){H.__webglMultisampledFramebuffer=s.createFramebuffer(),H.__webglColorRenderbuffer=[],t.bindFramebuffer(s.FRAMEBUFFER,H.__webglMultisampledFramebuffer);for(let ye=0;ye0)for(let Re=0;Re0)for(let Re=0;Re0){if(F(B)===!1){const D=B.textures,H=B.width,K=B.height;let le=s.COLOR_BUFFER_BIT;const te=B.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,Te=n.get(B),ye=D.length>1;if(ye)for(let Ie=0;Ie0?t.bindFramebuffer(s.DRAW_FRAMEBUFFER,Te.__webglFramebuffer[0]):t.bindFramebuffer(s.DRAW_FRAMEBUFFER,Te.__webglFramebuffer);for(let Ie=0;Ie0&&e.has("WEBGL_multisampled_render_to_texture")===!0&&D.__useRenderToTexture!==!1}function ee(B){const D=a.render.frame;h.get(B)!==D&&(h.set(B,D),B.update())}function J(B,D){const H=B.colorSpace,K=B.format,le=B.type;return B.isCompressedTexture===!0||B.isVideoTexture===!0||H!==en&&H!==Hi&&(it.getTransfer(H)===ct?(K!==vn||le!==$n)&&He("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):Qe("WebGLTextures: Unsupported texture color space:",H)),D}function X(B){return typeof HTMLImageElement<"u"&&B instanceof HTMLImageElement?(c.width=B.naturalWidth||B.width,c.height=B.naturalHeight||B.height):typeof VideoFrame<"u"&&B instanceof VideoFrame?(c.width=B.displayWidth,c.height=B.displayHeight):(c.width=B.width,c.height=B.height),c}this.allocateTextureUnit=I,this.resetTextureUnits=A,this.setTexture2D=z,this.setTexture2DArray=G,this.setTexture3D=j,this.setTextureCube=Y,this.rebindTextures=Je,this.setupRenderTarget=ke,this.updateRenderTargetMipmap=T,this.updateMultisampleRenderTarget=U,this.setupDepthRenderbuffer=Be,this.setupFrameBufferTexture=pe,this.useMultisampledRTT=F}function f3(s,e){function t(n,i=Hi){let r;const a=it.getTransfer(i);if(n===$n)return s.UNSIGNED_BYTE;if(n===gc)return s.UNSIGNED_SHORT_4_4_4_4;if(n===xc)return s.UNSIGNED_SHORT_5_5_5_1;if(n===Fd)return s.UNSIGNED_INT_5_9_9_9_REV;if(n===Hd)return s.UNSIGNED_INT_10F_11F_11F_REV;if(n===Od)return s.BYTE;if(n===zd)return s.SHORT;if(n===Kr)return s.UNSIGNED_SHORT;if(n===mc)return s.INT;if(n===ps)return s.UNSIGNED_INT;if(n===hn)return s.FLOAT;if(n===un)return s.HALF_FLOAT;if(n===Vd)return s.ALPHA;if(n===Gd)return s.RGB;if(n===vn)return s.RGBA;if(n===Jr)return s.DEPTH_COMPONENT;if(n===ms)return s.DEPTH_STENCIL;if(n===eo)return s.RED;if(n===vc)return s.RED_INTEGER;if(n===bc)return s.RG;if(n===yc)return s.RG_INTEGER;if(n===_c)return s.RGBA_INTEGER;if(n===to||n===no||n===io||n===so)if(a===ct)if(r=e.get("WEBGL_compressed_texture_s3tc_srgb"),r!==null){if(n===to)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===no)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===io)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===so)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(r=e.get("WEBGL_compressed_texture_s3tc"),r!==null){if(n===to)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===no)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===io)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===so)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(n===Mc||n===wc||n===Sc||n===Ec)if(r=e.get("WEBGL_compressed_texture_pvrtc"),r!==null){if(n===Mc)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===wc)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===Sc)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===Ec)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(n===Cc||n===Tc||n===Ac)if(r=e.get("WEBGL_compressed_texture_etc"),r!==null){if(n===Cc||n===Tc)return a===ct?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===Ac)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(n===Pc||n===Rc||n===Lc||n===Dc||n===Ic||n===Nc||n===Bc||n===kc||n===Uc||n===Oc||n===zc||n===Fc||n===Hc||n===Vc)if(r=e.get("WEBGL_compressed_texture_astc"),r!==null){if(n===Pc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===Rc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===Lc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===Dc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===Ic)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===Nc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===Bc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===kc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===Uc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===Oc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===zc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===Fc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===Hc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===Vc)return a===ct?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(n===Gc||n===Wc||n===Xc)if(r=e.get("EXT_texture_compression_bptc"),r!==null){if(n===Gc)return a===ct?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===Wc)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===Xc)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(n===jc||n===qc||n===Zc||n===Yc)if(r=e.get("EXT_texture_compression_rgtc"),r!==null){if(n===jc)return r.COMPRESSED_RED_RGTC1_EXT;if(n===qc)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===Zc)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===Yc)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return n===fs?s.UNSIGNED_INT_24_8:s[n]!==void 0?s[n]:null}return{convert:t}}const m3=` void main() { gl_Position = vec4( position, 1.0 ); @@ -3945,7 +3945,7 @@ void main() { } -}`;class x3{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(e,t){if(this.texture===null){const n=new jp(e.texture);(e.depthNear!==t.depthNear||e.depthFar!==t.depthFar)&&(this.depthNear=e.depthNear,this.depthFar=e.depthFar),this.texture=n}}getMesh(e){if(this.texture!==null&&this.mesh===null){const t=e.cameras[0].viewport,n=new Lt({vertexShader:m3,fragmentShader:g3,uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new rt(new Ss(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class v3 extends gs{constructor(e,t){super();const n=this;let i=null,r=1,a=null,o="local-floor",l=1,c=null,h=null,u=null,p=null,d=null,m=null;const f=typeof XRWebGLBinding<"u",x=new x3,g={},y=t.getContextAttributes();let v=null,b=null;const _=[],M=[],T=new he;let R=null;const S=new on;S.viewport=new tt;const E=new on;E.viewport=new tt;const L=[S,E],A=new rv;let I=null,w=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(se){let ce=_[se];return ce===void 0&&(ce=new Mh,_[se]=ce),ce.getTargetRaySpace()},this.getControllerGrip=function(se){let ce=_[se];return ce===void 0&&(ce=new Mh,_[se]=ce),ce.getGripSpace()},this.getHand=function(se){let ce=_[se];return ce===void 0&&(ce=new Mh,_[se]=ce),ce.getHandSpace()};function z(se){const ce=M.indexOf(se.inputSource);if(ce===-1)return;const pe=_[ce];pe!==void 0&&(pe.update(se.inputSource,se.frame,c||a),pe.dispatchEvent({type:se.type,data:se.inputSource}))}function G(){i.removeEventListener("select",z),i.removeEventListener("selectstart",z),i.removeEventListener("selectend",z),i.removeEventListener("squeeze",z),i.removeEventListener("squeezestart",z),i.removeEventListener("squeezeend",z),i.removeEventListener("end",G),i.removeEventListener("inputsourceschange",j);for(let se=0;se<_.length;se++){const ce=M[se];ce!==null&&(M[se]=null,_[se].disconnect(ce))}I=null,w=null,x.reset();for(const se in g)delete g[se];e.setRenderTarget(v),d=null,p=null,u=null,i=null,b=null,de.stop(),n.isPresenting=!1,e.setPixelRatio(R),e.setSize(T.width,T.height,!1),n.dispatchEvent({type:"sessionend"})}this.setFramebufferScaleFactor=function(se){r=se,n.isPresenting===!0&&He("WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(se){o=se,n.isPresenting===!0&&He("WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return c||a},this.setReferenceSpace=function(se){c=se},this.getBaseLayer=function(){return p!==null?p:d},this.getBinding=function(){return u===null&&f&&(u=new XRWebGLBinding(i,t)),u},this.getFrame=function(){return m},this.getSession=function(){return i},this.setSession=async function(se){if(i=se,i!==null){if(v=e.getRenderTarget(),i.addEventListener("select",z),i.addEventListener("selectstart",z),i.addEventListener("selectend",z),i.addEventListener("squeeze",z),i.addEventListener("squeezestart",z),i.addEventListener("squeezeend",z),i.addEventListener("end",G),i.addEventListener("inputsourceschange",j),y.xrCompatible!==!0&&await t.makeXRCompatible(),R=e.getPixelRatio(),e.getSize(T),f&&"createProjectionLayer"in XRWebGLBinding.prototype){let pe=null,ye=null,Se=null;y.depth&&(Se=y.stencil?t.DEPTH24_STENCIL8:t.DEPTH_COMPONENT24,pe=y.stencil?ms:Jr,ye=y.stencil?fs:ps);const Be={colorFormat:t.RGBA8,depthFormat:Se,scaleFactor:r};u=this.getBinding(),p=u.createProjectionLayer(Be),i.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),b=new Cn(p.textureWidth,p.textureHeight,{format:vn,type:$n,depthTexture:new Fo(p.textureWidth,p.textureHeight,ye,void 0,void 0,void 0,void 0,void 0,void 0,pe),stencilBuffer:y.stencil,colorSpace:e.outputColorSpace,samples:y.antialias?4:0,resolveDepthBuffer:p.ignoreDepthValues===!1,resolveStencilBuffer:p.ignoreDepthValues===!1})}else{const pe={antialias:y.antialias,alpha:!0,depth:y.depth,stencil:y.stencil,framebufferScaleFactor:r};d=new XRWebGLLayer(i,t,pe),i.updateRenderState({baseLayer:d}),e.setPixelRatio(1),e.setSize(d.framebufferWidth,d.framebufferHeight,!1),b=new Cn(d.framebufferWidth,d.framebufferHeight,{format:vn,type:$n,colorSpace:e.outputColorSpace,stencilBuffer:y.stencil,resolveDepthBuffer:d.ignoreDepthValues===!1,resolveStencilBuffer:d.ignoreDepthValues===!1})}b.isXRRenderTarget=!0,this.setFoveation(l),c=null,a=await i.requestReferenceSpace(o),de.setContext(i),de.start(),n.isPresenting=!0,n.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(i!==null)return i.environmentBlendMode},this.getDepthTexture=function(){return x.getDepthTexture()};function j(se){for(let ce=0;ce=0&&(M[ye]=null,_[ye].disconnect(pe))}for(let ce=0;ce=M.length){M.push(pe),ye=Be;break}else if(M[Be]===null){M[Be]=pe,ye=Be;break}if(ye===-1)break}const Se=_[ye];Se&&Se.connect(pe)}}const Y=new P,q=new P;function ie(se,ce,pe){Y.setFromMatrixPosition(ce.matrixWorld),q.setFromMatrixPosition(pe.matrixWorld);const ye=Y.distanceTo(q),Se=ce.projectionMatrix.elements,Be=pe.projectionMatrix.elements,Je=Se[14]/(Se[10]-1),ke=Se[14]/(Se[10]+1),C=(Se[9]+1)/Se[5],N=(Se[9]-1)/Se[5],V=(Se[8]-1)/Se[0],U=(Be[8]+1)/Be[0],k=Je*V,F=Je*U,ee=ye/(-V+U),J=ee*-V;if(ce.matrixWorld.decompose(se.position,se.quaternion,se.scale),se.translateX(J),se.translateZ(ee),se.matrixWorld.compose(se.position,se.quaternion,se.scale),se.matrixWorldInverse.copy(se.matrixWorld).invert(),Se[10]===-1)se.projectionMatrix.copy(ce.projectionMatrix),se.projectionMatrixInverse.copy(ce.projectionMatrixInverse);else{const X=Je+ee,B=ke+ee,D=k-J,H=F+(ye-J),K=C*ke/B*X,le=N*ke/B*X;se.projectionMatrix.makePerspective(D,H,K,le,X,B),se.projectionMatrixInverse.copy(se.projectionMatrix).invert()}}function W(se,ce){ce===null?se.matrixWorld.copy(se.matrix):se.matrixWorld.multiplyMatrices(ce.matrixWorld,se.matrix),se.matrixWorldInverse.copy(se.matrixWorld).invert()}this.updateCamera=function(se){if(i===null)return;let ce=se.near,pe=se.far;x.texture!==null&&(x.depthNear>0&&(ce=x.depthNear),x.depthFar>0&&(pe=x.depthFar)),A.near=E.near=S.near=ce,A.far=E.far=S.far=pe,(I!==A.near||w!==A.far)&&(i.updateRenderState({depthNear:A.near,depthFar:A.far}),I=A.near,w=A.far),A.layers.mask=se.layers.mask|6,S.layers.mask=A.layers.mask&3,E.layers.mask=A.layers.mask&5;const ye=se.parent,Se=A.cameras;W(A,ye);for(let Be=0;Be0&&(x.alphaTest.value=g.alphaTest);const y=e.get(g),v=y.envMap,b=y.envMapRotation;v&&(x.envMap.value=v,Cs.copy(b),Cs.x*=-1,Cs.y*=-1,Cs.z*=-1,v.isCubeTexture&&v.isRenderTargetTexture===!1&&(Cs.y*=-1,Cs.z*=-1),x.envMapRotation.value.setFromMatrix4(y3.makeRotationFromEuler(Cs)),x.flipEnvMap.value=v.isCubeTexture&&v.isRenderTargetTexture===!1?-1:1,x.reflectivity.value=g.reflectivity,x.ior.value=g.ior,x.refractionRatio.value=g.refractionRatio),g.lightMap&&(x.lightMap.value=g.lightMap,x.lightMapIntensity.value=g.lightMapIntensity,t(g.lightMap,x.lightMapTransform)),g.aoMap&&(x.aoMap.value=g.aoMap,x.aoMapIntensity.value=g.aoMapIntensity,t(g.aoMap,x.aoMapTransform))}function a(x,g){x.diffuse.value.copy(g.color),x.opacity.value=g.opacity,g.map&&(x.map.value=g.map,t(g.map,x.mapTransform))}function o(x,g){x.dashSize.value=g.dashSize,x.totalSize.value=g.dashSize+g.gapSize,x.scale.value=g.scale}function l(x,g,y,v){x.diffuse.value.copy(g.color),x.opacity.value=g.opacity,x.size.value=g.size*y,x.scale.value=v*.5,g.map&&(x.map.value=g.map,t(g.map,x.uvTransform)),g.alphaMap&&(x.alphaMap.value=g.alphaMap,t(g.alphaMap,x.alphaMapTransform)),g.alphaTest>0&&(x.alphaTest.value=g.alphaTest)}function c(x,g){x.diffuse.value.copy(g.color),x.opacity.value=g.opacity,x.rotation.value=g.rotation,g.map&&(x.map.value=g.map,t(g.map,x.mapTransform)),g.alphaMap&&(x.alphaMap.value=g.alphaMap,t(g.alphaMap,x.alphaMapTransform)),g.alphaTest>0&&(x.alphaTest.value=g.alphaTest)}function h(x,g){x.specular.value.copy(g.specular),x.shininess.value=Math.max(g.shininess,1e-4)}function u(x,g){g.gradientMap&&(x.gradientMap.value=g.gradientMap)}function p(x,g){x.metalness.value=g.metalness,g.metalnessMap&&(x.metalnessMap.value=g.metalnessMap,t(g.metalnessMap,x.metalnessMapTransform)),x.roughness.value=g.roughness,g.roughnessMap&&(x.roughnessMap.value=g.roughnessMap,t(g.roughnessMap,x.roughnessMapTransform)),g.envMap&&(x.envMapIntensity.value=g.envMapIntensity)}function d(x,g,y){x.ior.value=g.ior,g.sheen>0&&(x.sheenColor.value.copy(g.sheenColor).multiplyScalar(g.sheen),x.sheenRoughness.value=g.sheenRoughness,g.sheenColorMap&&(x.sheenColorMap.value=g.sheenColorMap,t(g.sheenColorMap,x.sheenColorMapTransform)),g.sheenRoughnessMap&&(x.sheenRoughnessMap.value=g.sheenRoughnessMap,t(g.sheenRoughnessMap,x.sheenRoughnessMapTransform))),g.clearcoat>0&&(x.clearcoat.value=g.clearcoat,x.clearcoatRoughness.value=g.clearcoatRoughness,g.clearcoatMap&&(x.clearcoatMap.value=g.clearcoatMap,t(g.clearcoatMap,x.clearcoatMapTransform)),g.clearcoatRoughnessMap&&(x.clearcoatRoughnessMap.value=g.clearcoatRoughnessMap,t(g.clearcoatRoughnessMap,x.clearcoatRoughnessMapTransform)),g.clearcoatNormalMap&&(x.clearcoatNormalMap.value=g.clearcoatNormalMap,t(g.clearcoatNormalMap,x.clearcoatNormalMapTransform),x.clearcoatNormalScale.value.copy(g.clearcoatNormalScale),g.side===sn&&x.clearcoatNormalScale.value.negate())),g.dispersion>0&&(x.dispersion.value=g.dispersion),g.iridescence>0&&(x.iridescence.value=g.iridescence,x.iridescenceIOR.value=g.iridescenceIOR,x.iridescenceThicknessMinimum.value=g.iridescenceThicknessRange[0],x.iridescenceThicknessMaximum.value=g.iridescenceThicknessRange[1],g.iridescenceMap&&(x.iridescenceMap.value=g.iridescenceMap,t(g.iridescenceMap,x.iridescenceMapTransform)),g.iridescenceThicknessMap&&(x.iridescenceThicknessMap.value=g.iridescenceThicknessMap,t(g.iridescenceThicknessMap,x.iridescenceThicknessMapTransform))),g.transmission>0&&(x.transmission.value=g.transmission,x.transmissionSamplerMap.value=y.texture,x.transmissionSamplerSize.value.set(y.width,y.height),g.transmissionMap&&(x.transmissionMap.value=g.transmissionMap,t(g.transmissionMap,x.transmissionMapTransform)),x.thickness.value=g.thickness,g.thicknessMap&&(x.thicknessMap.value=g.thicknessMap,t(g.thicknessMap,x.thicknessMapTransform)),x.attenuationDistance.value=g.attenuationDistance,x.attenuationColor.value.copy(g.attenuationColor)),g.anisotropy>0&&(x.anisotropyVector.value.set(g.anisotropy*Math.cos(g.anisotropyRotation),g.anisotropy*Math.sin(g.anisotropyRotation)),g.anisotropyMap&&(x.anisotropyMap.value=g.anisotropyMap,t(g.anisotropyMap,x.anisotropyMapTransform))),x.specularIntensity.value=g.specularIntensity,x.specularColor.value.copy(g.specularColor),g.specularColorMap&&(x.specularColorMap.value=g.specularColorMap,t(g.specularColorMap,x.specularColorMapTransform)),g.specularIntensityMap&&(x.specularIntensityMap.value=g.specularIntensityMap,t(g.specularIntensityMap,x.specularIntensityMapTransform))}function m(x,g){g.matcap&&(x.matcap.value=g.matcap)}function f(x,g){const y=e.get(g).light;x.referencePosition.value.setFromMatrixPosition(y.matrixWorld),x.nearDistance.value=y.shadow.camera.near,x.farDistance.value=y.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:i}}function _3(s,e,t,n){let i={},r={},a=[];const o=s.getParameter(s.MAX_UNIFORM_BUFFER_BINDINGS);function l(y,v){const b=v.program;n.uniformBlockBinding(y,b)}function c(y,v){let b=i[y.id];b===void 0&&(m(y),b=h(y),i[y.id]=b,y.addEventListener("dispose",x));const _=v.program;n.updateUBOMapping(y,_);const M=e.render.frame;r[y.id]!==M&&(p(y),r[y.id]=M)}function h(y){const v=u();y.__bindingPointIndex=v;const b=s.createBuffer(),_=y.__size,M=y.usage;return s.bindBuffer(s.UNIFORM_BUFFER,b),s.bufferData(s.UNIFORM_BUFFER,_,M),s.bindBuffer(s.UNIFORM_BUFFER,null),s.bindBufferBase(s.UNIFORM_BUFFER,v,b),b}function u(){for(let y=0;y0&&(b+=_-M),y.__size=b,y.__cache={},this}function f(y){const v={boundary:0,storage:0};return typeof y=="number"||typeof y=="boolean"?(v.boundary=4,v.storage=4):y.isVector2?(v.boundary=8,v.storage=8):y.isVector3||y.isColor?(v.boundary=16,v.storage=12):y.isVector4?(v.boundary=16,v.storage=16):y.isMatrix3?(v.boundary=48,v.storage=48):y.isMatrix4?(v.boundary=64,v.storage=64):y.isTexture?He("WebGLRenderer: Texture samplers can not be part of an uniforms group."):He("WebGLRenderer: Unsupported uniform value type.",y),v}function x(y){const v=y.target;v.removeEventListener("dispose",x);const b=a.indexOf(v.__bindingPointIndex);a.splice(b,1),s.deleteBuffer(i[v.id]),delete i[v.id],delete r[v.id]}function g(){for(const y in i)s.deleteBuffer(i[y]);a=[],i={},r={}}return{bind:l,update:c,dispose:g}}const M3=new Uint16Array([11481,15204,11534,15171,11808,15015,12385,14843,12894,14716,13396,14600,13693,14483,13976,14366,14237,14171,14405,13961,14511,13770,14605,13598,14687,13444,14760,13305,14822,13066,14876,12857,14923,12675,14963,12517,14997,12379,15025,12230,15049,12023,15070,11843,15086,11687,15100,11551,15111,11433,15120,11330,15127,11217,15132,11060,15135,10922,15138,10801,15139,10695,15139,10600,13012,14923,13020,14917,13064,14886,13176,14800,13349,14666,13513,14526,13724,14398,13960,14230,14200,14020,14383,13827,14488,13651,14583,13491,14667,13348,14740,13132,14803,12908,14856,12713,14901,12542,14938,12394,14968,12241,14992,12017,15010,11822,15024,11654,15034,11507,15041,11380,15044,11269,15044,11081,15042,10913,15037,10764,15031,10635,15023,10520,15014,10419,15003,10330,13657,14676,13658,14673,13670,14660,13698,14622,13750,14547,13834,14442,13956,14317,14112,14093,14291,13889,14407,13704,14499,13538,14586,13389,14664,13201,14733,12966,14792,12758,14842,12577,14882,12418,14915,12272,14940,12033,14959,11826,14972,11646,14980,11490,14983,11355,14983,11212,14979,11008,14971,10830,14961,10675,14950,10540,14936,10420,14923,10315,14909,10204,14894,10041,14089,14460,14090,14459,14096,14452,14112,14431,14141,14388,14186,14305,14252,14130,14341,13941,14399,13756,14467,13585,14539,13430,14610,13272,14677,13026,14737,12808,14790,12617,14833,12449,14869,12303,14896,12065,14916,11845,14929,11655,14937,11490,14939,11347,14936,11184,14930,10970,14921,10783,14912,10621,14900,10480,14885,10356,14867,10247,14848,10062,14827,9894,14805,9745,14400,14208,14400,14206,14402,14198,14406,14174,14415,14122,14427,14035,14444,13913,14469,13767,14504,13613,14548,13463,14598,13324,14651,13082,14704,12858,14752,12658,14795,12483,14831,12330,14860,12106,14881,11875,14895,11675,14903,11501,14905,11351,14903,11178,14900,10953,14892,10757,14880,10589,14865,10442,14847,10313,14827,10162,14805,9965,14782,9792,14757,9642,14731,9507,14562,13883,14562,13883,14563,13877,14566,13862,14570,13830,14576,13773,14584,13689,14595,13582,14613,13461,14637,13336,14668,13120,14704,12897,14741,12695,14776,12516,14808,12358,14835,12150,14856,11910,14870,11701,14878,11519,14882,11361,14884,11187,14880,10951,14871,10748,14858,10572,14842,10418,14823,10286,14801,10099,14777,9897,14751,9722,14725,9567,14696,9430,14666,9309,14702,13604,14702,13604,14702,13600,14703,13591,14705,13570,14707,13533,14709,13477,14712,13400,14718,13305,14727,13106,14743,12907,14762,12716,14784,12539,14807,12380,14827,12190,14844,11943,14855,11727,14863,11539,14870,11376,14871,11204,14868,10960,14858,10748,14845,10565,14829,10406,14809,10269,14786,10058,14761,9852,14734,9671,14705,9512,14674,9374,14641,9253,14608,9076,14821,13366,14821,13365,14821,13364,14821,13358,14821,13344,14821,13320,14819,13252,14817,13145,14815,13011,14814,12858,14817,12698,14823,12539,14832,12389,14841,12214,14850,11968,14856,11750,14861,11558,14866,11390,14867,11226,14862,10972,14853,10754,14840,10565,14823,10401,14803,10259,14780,10032,14754,9820,14725,9635,14694,9473,14661,9333,14627,9203,14593,8988,14557,8798,14923,13014,14922,13014,14922,13012,14922,13004,14920,12987,14919,12957,14915,12907,14909,12834,14902,12738,14894,12623,14888,12498,14883,12370,14880,12203,14878,11970,14875,11759,14873,11569,14874,11401,14872,11243,14865,10986,14855,10762,14842,10568,14825,10401,14804,10255,14781,10017,14754,9799,14725,9611,14692,9445,14658,9301,14623,9139,14587,8920,14548,8729,14509,8562,15008,12672,15008,12672,15008,12671,15007,12667,15005,12656,15001,12637,14997,12605,14989,12556,14978,12490,14966,12407,14953,12313,14940,12136,14927,11934,14914,11742,14903,11563,14896,11401,14889,11247,14879,10992,14866,10767,14851,10570,14833,10400,14812,10252,14789,10007,14761,9784,14731,9592,14698,9424,14663,9279,14627,9088,14588,8868,14548,8676,14508,8508,14467,8360,15080,12386,15080,12386,15079,12385,15078,12383,15076,12378,15072,12367,15066,12347,15057,12315,15045,12253,15030,12138,15012,11998,14993,11845,14972,11685,14951,11530,14935,11383,14920,11228,14904,10981,14887,10762,14870,10567,14850,10397,14827,10248,14803,9997,14774,9771,14743,9578,14710,9407,14674,9259,14637,9048,14596,8826,14555,8632,14514,8464,14471,8317,14427,8182,15139,12008,15139,12008,15138,12008,15137,12007,15135,12003,15130,11990,15124,11969,15115,11929,15102,11872,15086,11794,15064,11693,15041,11581,15013,11459,14987,11336,14966,11170,14944,10944,14921,10738,14898,10552,14875,10387,14850,10239,14824,9983,14794,9758,14762,9563,14728,9392,14692,9244,14653,9014,14611,8791,14569,8597,14526,8427,14481,8281,14436,8110,14391,7885,15188,11617,15188,11617,15187,11617,15186,11618,15183,11617,15179,11612,15173,11601,15163,11581,15150,11546,15133,11495,15110,11427,15083,11346,15051,11246,15024,11057,14996,10868,14967,10687,14938,10517,14911,10362,14882,10206,14853,9956,14821,9737,14787,9543,14752,9375,14715,9228,14675,8980,14632,8760,14589,8565,14544,8395,14498,8248,14451,8049,14404,7824,14357,7630,15228,11298,15228,11298,15227,11299,15226,11301,15223,11303,15219,11302,15213,11299,15204,11290,15191,11271,15174,11217,15150,11129,15119,11015,15087,10886,15057,10744,15024,10599,14990,10455,14957,10318,14924,10143,14891,9911,14856,9701,14820,9516,14782,9352,14744,9200,14703,8946,14659,8725,14615,8533,14568,8366,14521,8220,14472,7992,14423,7770,14374,7578,14315,7408,15260,10819,15260,10819,15259,10822,15258,10826,15256,10832,15251,10836,15246,10841,15237,10838,15225,10821,15207,10788,15183,10734,15151,10660,15120,10571,15087,10469,15049,10359,15012,10249,14974,10041,14937,9837,14900,9647,14860,9475,14820,9320,14779,9147,14736,8902,14691,8688,14646,8499,14598,8335,14549,8189,14499,7940,14448,7720,14397,7529,14347,7363,14256,7218,15285,10410,15285,10411,15285,10413,15284,10418,15282,10425,15278,10434,15272,10442,15264,10449,15252,10445,15235,10433,15210,10403,15179,10358,15149,10301,15113,10218,15073,10059,15033,9894,14991,9726,14951,9565,14909,9413,14865,9273,14822,9073,14777,8845,14730,8641,14682,8459,14633,8300,14583,8129,14531,7883,14479,7670,14426,7482,14373,7321,14305,7176,14201,6939,15305,9939,15305,9940,15305,9945,15304,9955,15302,9967,15298,9989,15293,10010,15286,10033,15274,10044,15258,10045,15233,10022,15205,9975,15174,9903,15136,9808,15095,9697,15053,9578,15009,9451,14965,9327,14918,9198,14871,8973,14825,8766,14775,8579,14725,8408,14675,8259,14622,8058,14569,7821,14515,7615,14460,7435,14405,7276,14350,7108,14256,6866,14149,6653,15321,9444,15321,9445,15321,9448,15320,9458,15317,9470,15314,9490,15310,9515,15302,9540,15292,9562,15276,9579,15251,9577,15226,9559,15195,9519,15156,9463,15116,9389,15071,9304,15025,9208,14978,9023,14927,8838,14878,8661,14827,8496,14774,8344,14722,8206,14667,7973,14612,7749,14556,7555,14499,7382,14443,7229,14385,7025,14322,6791,14210,6588,14100,6409,15333,8920,15333,8921,15332,8927,15332,8943,15329,8965,15326,9002,15322,9048,15316,9106,15307,9162,15291,9204,15267,9221,15244,9221,15212,9196,15175,9134,15133,9043,15088,8930,15040,8801,14990,8665,14938,8526,14886,8391,14830,8261,14775,8087,14719,7866,14661,7664,14603,7482,14544,7322,14485,7178,14426,6936,14367,6713,14281,6517,14166,6348,14054,6198,15341,8360,15341,8361,15341,8366,15341,8379,15339,8399,15336,8431,15332,8473,15326,8527,15318,8585,15302,8632,15281,8670,15258,8690,15227,8690,15191,8664,15149,8612,15104,8543,15055,8456,15001,8360,14948,8259,14892,8122,14834,7923,14776,7734,14716,7558,14656,7397,14595,7250,14534,7070,14472,6835,14410,6628,14350,6443,14243,6283,14125,6135,14010,5889,15348,7715,15348,7717,15348,7725,15347,7745,15345,7780,15343,7836,15339,7905,15334,8e3,15326,8103,15310,8193,15293,8239,15270,8270,15240,8287,15204,8283,15163,8260,15118,8223,15067,8143,15014,8014,14958,7873,14899,7723,14839,7573,14778,7430,14715,7293,14652,7164,14588,6931,14524,6720,14460,6531,14396,6362,14330,6210,14207,6015,14086,5781,13969,5576,15352,7114,15352,7116,15352,7128,15352,7159,15350,7195,15348,7237,15345,7299,15340,7374,15332,7457,15317,7544,15301,7633,15280,7703,15251,7754,15216,7775,15176,7767,15131,7733,15079,7670,15026,7588,14967,7492,14906,7387,14844,7278,14779,7171,14714,6965,14648,6770,14581,6587,14515,6420,14448,6269,14382,6123,14299,5881,14172,5665,14049,5477,13929,5310,15355,6329,15355,6330,15355,6339,15355,6362,15353,6410,15351,6472,15349,6572,15344,6688,15337,6835,15323,6985,15309,7142,15287,7220,15260,7277,15226,7310,15188,7326,15142,7318,15090,7285,15036,7239,14976,7177,14914,7045,14849,6892,14782,6736,14714,6581,14645,6433,14576,6293,14506,6164,14438,5946,14369,5733,14270,5540,14140,5369,14014,5216,13892,5043,15357,5483,15357,5484,15357,5496,15357,5528,15356,5597,15354,5692,15351,5835,15347,6011,15339,6195,15328,6317,15314,6446,15293,6566,15268,6668,15235,6746,15197,6796,15152,6811,15101,6790,15046,6748,14985,6673,14921,6583,14854,6479,14785,6371,14714,6259,14643,6149,14571,5946,14499,5750,14428,5567,14358,5401,14242,5250,14109,5111,13980,4870,13856,4657,15359,4555,15359,4557,15358,4573,15358,4633,15357,4715,15355,4841,15353,5061,15349,5216,15342,5391,15331,5577,15318,5770,15299,5967,15274,6150,15243,6223,15206,6280,15161,6310,15111,6317,15055,6300,14994,6262,14928,6208,14860,6141,14788,5994,14715,5838,14641,5684,14566,5529,14492,5384,14418,5247,14346,5121,14216,4892,14079,4682,13948,4496,13822,4330,15359,3498,15359,3501,15359,3520,15359,3598,15358,3719,15356,3860,15355,4137,15351,4305,15344,4563,15334,4809,15321,5116,15303,5273,15280,5418,15250,5547,15214,5653,15170,5722,15120,5761,15064,5763,15002,5733,14935,5673,14865,5597,14792,5504,14716,5400,14640,5294,14563,5185,14486,5041,14410,4841,14335,4655,14191,4482,14051,4325,13918,4183,13790,4012,15360,2282,15360,2285,15360,2306,15360,2401,15359,2547,15357,2748,15355,3103,15352,3349,15345,3675,15336,4020,15324,4272,15307,4496,15285,4716,15255,4908,15220,5086,15178,5170,15128,5214,15072,5234,15010,5231,14943,5206,14871,5166,14796,5102,14718,4971,14639,4833,14559,4687,14480,4541,14402,4401,14315,4268,14167,4142,14025,3958,13888,3747,13759,3556,15360,923,15360,925,15360,946,15360,1052,15359,1214,15357,1494,15356,1892,15352,2274,15346,2663,15338,3099,15326,3393,15309,3679,15288,3980,15260,4183,15226,4325,15185,4437,15136,4517,15080,4570,15018,4591,14950,4581,14877,4545,14800,4485,14720,4411,14638,4325,14556,4231,14475,4136,14395,3988,14297,3803,14145,3628,13999,3465,13861,3314,13729,3177,15360,263,15360,264,15360,272,15360,325,15359,407,15358,548,15356,780,15352,1144,15347,1580,15339,2099,15328,2425,15312,2795,15292,3133,15264,3329,15232,3517,15191,3689,15143,3819,15088,3923,15025,3978,14956,3999,14882,3979,14804,3931,14722,3855,14639,3756,14554,3645,14470,3529,14388,3409,14279,3289,14124,3173,13975,3055,13834,2848,13701,2658,15360,49,15360,49,15360,52,15360,75,15359,111,15358,201,15356,283,15353,519,15348,726,15340,1045,15329,1415,15314,1795,15295,2173,15269,2410,15237,2649,15197,2866,15150,3054,15095,3140,15032,3196,14963,3228,14888,3236,14808,3224,14725,3191,14639,3146,14553,3088,14466,2976,14382,2836,14262,2692,14103,2549,13952,2409,13808,2278,13674,2154,15360,4,15360,4,15360,4,15360,13,15359,33,15358,59,15357,112,15353,199,15348,302,15341,456,15331,628,15316,827,15297,1082,15272,1332,15241,1601,15202,1851,15156,2069,15101,2172,15039,2256,14970,2314,14894,2348,14813,2358,14728,2344,14640,2311,14551,2263,14463,2203,14376,2133,14247,2059,14084,1915,13930,1761,13784,1609,13648,1464,15360,0,15360,0,15360,0,15360,3,15359,18,15358,26,15357,53,15354,80,15348,97,15341,165,15332,238,15318,326,15299,427,15275,529,15245,654,15207,771,15161,885,15108,994,15046,1089,14976,1170,14900,1229,14817,1266,14731,1284,14641,1282,14550,1260,14460,1223,14370,1174,14232,1116,14066,1050,13909,981,13761,910,13623,839]);let Ri=null;function w3(){return Ri===null&&(Ri=new bs(M3,32,32,yc,un),Ri.minFilter=Pt,Ri.magFilter=Pt,Ri.wrapS=Un,Ri.wrapT=Un,Ri.generateMipmaps=!1,Ri.needsUpdate=!0),Ri}class au{constructor(e={}){const{canvas:t=ix(),context:n=null,depth:i=!0,stencil:r=!1,alpha:a=!1,antialias:o=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:h="default",failIfMajorPerformanceCaveat:u=!1,reversedDepthBuffer:p=!1}=e;this.isWebGLRenderer=!0;let d;if(n!==null){if(typeof WebGLRenderingContext<"u"&&n instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");d=n.getContextAttributes().alpha}else d=a;const m=new Set([_c,bc,vc]),f=new Set([$n,ps,Kr,fs,gc,xc]),x=new Uint32Array(4),g=new Int32Array(4);let y=null,v=null;const b=[],_=[];this.domElement=t,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.toneMapping=Fi,this.toneMappingExposure=1,this.transmissionResolutionScale=1;const M=this;let T=!1;this._outputColorSpace=Rt;let R=0,S=0,E=null,L=-1,A=null;const I=new tt,w=new tt;let z=null;const G=new Fe(0);let j=0,Y=t.width,q=t.height,ie=1,W=null,$=null;const fe=new tt(0,0,Y,q),me=new tt(0,0,Y,q);let de=!1;const se=new Rh;let ce=!1,pe=!1;const ye=new De,Se=new P,Be=new tt,Je={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let ke=!1;function C(){return E===null?ie:1}let N=n;function V(O,Q){return t.getContext(O,Q)}try{const O={alpha:!0,depth:i,stencil:r,antialias:o,premultipliedAlpha:l,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:u};if("setAttribute"in t&&t.setAttribute("data-engine",`three.js r${Yr}`),t.addEventListener("webglcontextlost",ve,!1),t.addEventListener("webglcontextrestored",ge,!1),t.addEventListener("webglcontextcreationerror",Oe,!1),N===null){const Q="webgl2";if(N=V(Q,O),N===null)throw V(Q)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(O){throw O("WebGLRenderer: "+O.message),O}let U,k,F,ee,J,X,B,D,H,K,le,te,Ce,be,Re,Ie,ue,_e,Ve,Ue,Ae,Ge,Z,Te;function Me(){U=new Db(N),U.init(),Ge=new f3(N,U),k=new wb(N,U,e,Ge),F=new d3(N,U),k.reversedDepthBuffer&&p&&F.buffers.depth.setReversed(!0),ee=new Bb(N),J=new Q2,X=new p3(N,U,F,J,k,Ge,ee),B=new Eb(M),D=new Lb(M),H=new yv(N),Z=new _b(N,H),K=new Ib(N,H,ee,Z),le=new Ub(N,K,H,ee),Ve=new kb(N,k,X),Ie=new Sb(J),te=new J2(M,B,D,U,k,Z,Ie),Ce=new b3(M,J),be=new t3,Re=new o3(U),_e=new bb(M,B,D,F,le,d,l),ue=new h3(M,le,k),Te=new _3(N,ee,k,F),Ue=new Mb(N,U,ee),Ae=new Nb(N,U,ee),ee.programs=te.programs,M.capabilities=k,M.extensions=U,M.properties=J,M.renderLists=be,M.shadowMap=ue,M.state=F,M.info=ee}Me();const we=new v3(M,N);this.xr=we,this.getContext=function(){return N},this.getContextAttributes=function(){return N.getContextAttributes()},this.forceContextLoss=function(){const O=U.get("WEBGL_lose_context");O&&O.loseContext()},this.forceContextRestore=function(){const O=U.get("WEBGL_lose_context");O&&O.restoreContext()},this.getPixelRatio=function(){return ie},this.setPixelRatio=function(O){O!==void 0&&(ie=O,this.setSize(Y,q,!1))},this.getSize=function(O){return O.set(Y,q)},this.setSize=function(O,Q,ae=!0){if(we.isPresenting){He("WebGLRenderer: Can't change size while VR device is presenting.");return}Y=O,q=Q,t.width=Math.floor(O*ie),t.height=Math.floor(Q*ie),ae===!0&&(t.style.width=O+"px",t.style.height=Q+"px"),this.setViewport(0,0,O,Q)},this.getDrawingBufferSize=function(O){return O.set(Y*ie,q*ie).floor()},this.setDrawingBufferSize=function(O,Q,ae){Y=O,q=Q,ie=ae,t.width=Math.floor(O*ae),t.height=Math.floor(Q*ae),this.setViewport(0,0,O,Q)},this.getCurrentViewport=function(O){return O.copy(I)},this.getViewport=function(O){return O.copy(fe)},this.setViewport=function(O,Q,ae,oe){O.isVector4?fe.set(O.x,O.y,O.z,O.w):fe.set(O,Q,ae,oe),F.viewport(I.copy(fe).multiplyScalar(ie).round())},this.getScissor=function(O){return O.copy(me)},this.setScissor=function(O,Q,ae,oe){O.isVector4?me.set(O.x,O.y,O.z,O.w):me.set(O,Q,ae,oe),F.scissor(w.copy(me).multiplyScalar(ie).round())},this.getScissorTest=function(){return de},this.setScissorTest=function(O){F.setScissorTest(de=O)},this.setOpaqueSort=function(O){W=O},this.setTransparentSort=function(O){$=O},this.getClearColor=function(O){return O.copy(_e.getClearColor())},this.setClearColor=function(){_e.setClearColor(...arguments)},this.getClearAlpha=function(){return _e.getClearAlpha()},this.setClearAlpha=function(){_e.setClearAlpha(...arguments)},this.clear=function(O=!0,Q=!0,ae=!0){let oe=0;if(O){let ne=!1;if(E!==null){const Ee=E.texture.format;ne=m.has(Ee)}if(ne){const Ee=E.texture.type,Le=f.has(Ee),ze=_e.getClearColor(),Ne=_e.getClearAlpha(),je=ze.r,Ze=ze.g,We=ze.b;Le?(x[0]=je,x[1]=Ze,x[2]=We,x[3]=Ne,N.clearBufferuiv(N.COLOR,0,x)):(g[0]=je,g[1]=Ze,g[2]=We,g[3]=Ne,N.clearBufferiv(N.COLOR,0,g))}else oe|=N.COLOR_BUFFER_BIT}Q&&(oe|=N.DEPTH_BUFFER_BIT),ae&&(oe|=N.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),N.clear(oe)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){t.removeEventListener("webglcontextlost",ve,!1),t.removeEventListener("webglcontextrestored",ge,!1),t.removeEventListener("webglcontextcreationerror",Oe,!1),_e.dispose(),be.dispose(),Re.dispose(),J.dispose(),B.dispose(),D.dispose(),le.dispose(),Z.dispose(),Te.dispose(),te.dispose(),we.dispose(),we.removeEventListener("sessionstart",cg),we.removeEventListener("sessionend",hg),Ws.stop()};function ve(O){O.preventDefault(),lo("WebGLRenderer: Context Lost."),T=!0}function ge(){lo("WebGLRenderer: Context Restored."),T=!1;const O=ee.autoReset,Q=ue.enabled,ae=ue.autoUpdate,oe=ue.needsUpdate,ne=ue.type;Me(),ee.autoReset=O,ue.enabled=Q,ue.autoUpdate=ae,ue.needsUpdate=oe,ue.type=ne}function Oe(O){Qe("WebGLRenderer: A WebGL context could not be created. Reason: ",O.statusMessage)}function Ye(O){const Q=O.target;Q.removeEventListener("dispose",Ye),wt(Q)}function wt(O){ft(O),J.remove(O)}function ft(O){const Q=J.get(O).programs;Q!==void 0&&(Q.forEach(function(ae){te.releaseProgram(ae)}),O.isShaderMaterial&&te.releaseShaderCache(O))}this.renderBufferDirect=function(O,Q,ae,oe,ne,Ee){Q===null&&(Q=Je);const Le=ne.isMesh&&ne.matrixWorld.determinant()<0,ze=fC(O,Q,ae,oe,ne);F.setMaterial(oe,Le);let Ne=ae.index,je=1;if(oe.wireframe===!0){if(Ne=K.getWireframeAttribute(ae),Ne===void 0)return;je=2}const Ze=ae.drawRange,We=ae.attributes.position;let st=Ze.start*je,mt=(Ze.start+Ze.count)*je;Ee!==null&&(st=Math.max(st,Ee.start*je),mt=Math.min(mt,(Ee.start+Ee.count)*je)),Ne!==null?(st=Math.max(st,0),mt=Math.min(mt,Ne.count)):We!=null&&(st=Math.max(st,0),mt=Math.min(mt,We.count));const Bt=mt-st;if(Bt<0||Bt===1/0)return;Z.setup(ne,oe,ze,ae,Ne);let kt,xt=Ue;if(Ne!==null&&(kt=H.get(Ne),xt=Ae,xt.setIndex(kt)),ne.isMesh)oe.wireframe===!0?(F.setLineWidth(oe.wireframeLinewidth*C()),xt.setMode(N.LINES)):xt.setMode(N.TRIANGLES);else if(ne.isLine){let Xe=oe.linewidth;Xe===void 0&&(Xe=1),F.setLineWidth(Xe*C()),ne.isLineSegments?xt.setMode(N.LINES):ne.isLineLoop?xt.setMode(N.LINE_LOOP):xt.setMode(N.LINE_STRIP)}else ne.isPoints?xt.setMode(N.POINTS):ne.isSprite&&xt.setMode(N.TRIANGLES);if(ne.isBatchedMesh)if(ne._multiDrawInstances!==null)na("WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),xt.renderMultiDrawInstances(ne._multiDrawStarts,ne._multiDrawCounts,ne._multiDrawCount,ne._multiDrawInstances);else if(U.get("WEBGL_multi_draw"))xt.renderMultiDraw(ne._multiDrawStarts,ne._multiDrawCounts,ne._multiDrawCount);else{const Xe=ne._multiDrawStarts,Ct=ne._multiDrawCounts,lt=ne._multiDrawCount,Nn=Ne?H.get(Ne).bytesPerElement:1,qr=J.get(oe).currentProgram.getUniforms();for(let Bn=0;Bn{function Ee(){if(oe.forEach(function(Le){J.get(Le).currentProgram.isReady()&&oe.delete(Le)}),oe.size===0){ne(O);return}setTimeout(Ee,10)}U.get("KHR_parallel_shader_compile")!==null?Ee():setTimeout(Ee,10)})};let ri=null;function pC(O){ri&&ri(O)}function cg(){Ws.stop()}function hg(){Ws.start()}const Ws=new bf;Ws.setAnimationLoop(pC),typeof self<"u"&&Ws.setContext(self),this.setAnimationLoop=function(O){ri=O,we.setAnimationLoop(O),O===null?Ws.stop():Ws.start()},we.addEventListener("sessionstart",cg),we.addEventListener("sessionend",hg),this.render=function(O,Q){if(Q!==void 0&&Q.isCamera!==!0){Qe("WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(T===!0)return;if(O.matrixWorldAutoUpdate===!0&&O.updateMatrixWorld(),Q.parent===null&&Q.matrixWorldAutoUpdate===!0&&Q.updateMatrixWorld(),we.enabled===!0&&we.isPresenting===!0&&(we.cameraAutoUpdate===!0&&we.updateCamera(Q),Q=we.getCamera()),O.isScene===!0&&O.onBeforeRender(M,O,Q,E),v=Re.get(O,_.length),v.init(Q),_.push(v),ye.multiplyMatrices(Q.projectionMatrix,Q.matrixWorldInverse),se.setFromProjectionMatrix(ye,oi,Q.reversedDepth),pe=this.localClippingEnabled,ce=Ie.init(this.clippingPlanes,pe),y=be.get(O,b.length),y.init(),b.push(y),we.enabled===!0&&we.isPresenting===!0){const Ee=M.xr.getDepthSensingMesh();Ee!==null&&bd(Ee,Q,-1/0,M.sortObjects)}bd(O,Q,0,M.sortObjects),y.finish(),M.sortObjects===!0&&y.sort(W,$),ke=we.enabled===!1||we.isPresenting===!1||we.hasDepthSensing()===!1,ke&&_e.addToRenderList(y,O),this.info.render.frame++,ce===!0&&Ie.beginShadows();const ae=v.state.shadowsArray;ue.render(ae,O,Q),ce===!0&&Ie.endShadows(),this.info.autoReset===!0&&this.info.reset();const oe=y.opaque,ne=y.transmissive;if(v.setupLights(),Q.isArrayCamera){const Ee=Q.cameras;if(ne.length>0)for(let Le=0,ze=Ee.length;Le0&&dg(oe,ne,O,Q),ke&&_e.render(O),ug(y,O,Q);E!==null&&S===0&&(X.updateMultisampleRenderTarget(E),X.updateRenderTargetMipmap(E)),O.isScene===!0&&O.onAfterRender(M,O,Q),Z.resetDefaultState(),L=-1,A=null,_.pop(),_.length>0?(v=_[_.length-1],ce===!0&&Ie.setGlobalState(M.clippingPlanes,v.state.camera)):v=null,b.pop(),b.length>0?y=b[b.length-1]:y=null};function bd(O,Q,ae,oe){if(O.visible===!1)return;if(O.layers.test(Q.layers)){if(O.isGroup)ae=O.renderOrder;else if(O.isLOD)O.autoUpdate===!0&&O.update(Q);else if(O.isLight)v.pushLight(O),O.castShadow&&v.pushShadow(O);else if(O.isSprite){if(!O.frustumCulled||se.intersectsSprite(O)){oe&&Be.setFromMatrixPosition(O.matrixWorld).applyMatrix4(ye);const Le=le.update(O),ze=O.material;ze.visible&&y.push(O,Le,ze,ae,Be.z,null)}}else if((O.isMesh||O.isLine||O.isPoints)&&(!O.frustumCulled||se.intersectsObject(O))){const Le=le.update(O),ze=O.material;if(oe&&(O.boundingSphere!==void 0?(O.boundingSphere===null&&O.computeBoundingSphere(),Be.copy(O.boundingSphere.center)):(Le.boundingSphere===null&&Le.computeBoundingSphere(),Be.copy(Le.boundingSphere.center)),Be.applyMatrix4(O.matrixWorld).applyMatrix4(ye)),Array.isArray(ze)){const Ne=Le.groups;for(let je=0,Ze=Ne.length;je0&&Ql(ne,Q,ae),Ee.length>0&&Ql(Ee,Q,ae),Le.length>0&&Ql(Le,Q,ae),F.buffers.depth.setTest(!0),F.buffers.depth.setMask(!0),F.buffers.color.setMask(!0),F.setPolygonOffset(!1)}function dg(O,Q,ae,oe){if((ae.isScene===!0?ae.overrideMaterial:null)!==null)return;v.state.transmissionRenderTarget[oe.id]===void 0&&(v.state.transmissionRenderTarget[oe.id]=new Cn(1,1,{generateMipmaps:!0,type:U.has("EXT_color_buffer_half_float")||U.has("EXT_color_buffer_float")?un:$n,minFilter:ai,samples:4,stencilBuffer:r,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:it.workingColorSpace}));const Ee=v.state.transmissionRenderTarget[oe.id],Le=oe.viewport||I;Ee.setSize(Le.z*M.transmissionResolutionScale,Le.w*M.transmissionResolutionScale);const ze=M.getRenderTarget(),Ne=M.getActiveCubeFace(),je=M.getActiveMipmapLevel();M.setRenderTarget(Ee),M.getClearColor(G),j=M.getClearAlpha(),j<1&&M.setClearColor(16777215,.5),M.clear(),ke&&_e.render(ae);const Ze=M.toneMapping;M.toneMapping=Fi;const We=oe.viewport;if(oe.viewport!==void 0&&(oe.viewport=void 0),v.setupLightsView(oe),ce===!0&&Ie.setGlobalState(M.clippingPlanes,oe),Ql(O,ae,oe),X.updateMultisampleRenderTarget(Ee),X.updateRenderTargetMipmap(Ee),U.has("WEBGL_multisampled_render_to_texture")===!1){let st=!1;for(let mt=0,Bt=Q.length;mt0),We=!!ae.morphAttributes.position,st=!!ae.morphAttributes.normal,mt=!!ae.morphAttributes.color;let Bt=Fi;oe.toneMapped&&(E===null||E.isXRRenderTarget===!0)&&(Bt=M.toneMapping);const kt=ae.morphAttributes.position||ae.morphAttributes.normal||ae.morphAttributes.color,xt=kt!==void 0?kt.length:0,Xe=J.get(oe),Ct=v.state.lights;if(ce===!0&&(pe===!0||O!==A)){const xn=O===A&&oe.id===L;Ie.setState(oe,O,xn)}let lt=!1;oe.version===Xe.__version?(Xe.needsLights&&Xe.lightsStateVersion!==Ct.state.version||Xe.outputColorSpace!==ze||ne.isBatchedMesh&&Xe.batching===!1||!ne.isBatchedMesh&&Xe.batching===!0||ne.isBatchedMesh&&Xe.batchingColor===!0&&ne.colorTexture===null||ne.isBatchedMesh&&Xe.batchingColor===!1&&ne.colorTexture!==null||ne.isInstancedMesh&&Xe.instancing===!1||!ne.isInstancedMesh&&Xe.instancing===!0||ne.isSkinnedMesh&&Xe.skinning===!1||!ne.isSkinnedMesh&&Xe.skinning===!0||ne.isInstancedMesh&&Xe.instancingColor===!0&&ne.instanceColor===null||ne.isInstancedMesh&&Xe.instancingColor===!1&&ne.instanceColor!==null||ne.isInstancedMesh&&Xe.instancingMorph===!0&&ne.morphTexture===null||ne.isInstancedMesh&&Xe.instancingMorph===!1&&ne.morphTexture!==null||Xe.envMap!==Ne||oe.fog===!0&&Xe.fog!==Ee||Xe.numClippingPlanes!==void 0&&(Xe.numClippingPlanes!==Ie.numPlanes||Xe.numIntersection!==Ie.numIntersection)||Xe.vertexAlphas!==je||Xe.vertexTangents!==Ze||Xe.morphTargets!==We||Xe.morphNormals!==st||Xe.morphColors!==mt||Xe.toneMapping!==Bt||Xe.morphTargetsCount!==xt)&&(lt=!0):(lt=!0,Xe.__version=oe.version);let Nn=Xe.currentProgram;lt===!0&&(Nn=ec(oe,Q,ne));let qr=!1,Bn=!1,qa=!1;const At=Nn.getUniforms(),wn=Xe.uniforms;if(F.useProgram(Nn.program)&&(qr=!0,Bn=!0,qa=!0),oe.id!==L&&(L=oe.id,Bn=!0),qr||A!==O){F.buffers.depth.getReversed()&&O.reversedDepth!==!0&&(O._reversedDepth=!0,O.updateProjectionMatrix()),At.setValue(N,"projectionMatrix",O.projectionMatrix),At.setValue(N,"viewMatrix",O.matrixWorldInverse);const Sn=At.map.cameraPosition;Sn!==void 0&&Sn.setValue(N,Se.setFromMatrixPosition(O.matrixWorld)),k.logarithmicDepthBuffer&&At.setValue(N,"logDepthBufFC",2/(Math.log(O.far+1)/Math.LN2)),(oe.isMeshPhongMaterial||oe.isMeshToonMaterial||oe.isMeshLambertMaterial||oe.isMeshBasicMaterial||oe.isMeshStandardMaterial||oe.isShaderMaterial)&&At.setValue(N,"isOrthographic",O.isOrthographicCamera===!0),A!==O&&(A=O,Bn=!0,qa=!0)}if(ne.isSkinnedMesh){At.setOptional(N,ne,"bindMatrix"),At.setOptional(N,ne,"bindMatrixInverse");const xn=ne.skeleton;xn&&(xn.boneTexture===null&&xn.computeBoneTexture(),At.setValue(N,"boneTexture",xn.boneTexture,X))}ne.isBatchedMesh&&(At.setOptional(N,ne,"batchingTexture"),At.setValue(N,"batchingTexture",ne._matricesTexture,X),At.setOptional(N,ne,"batchingIdTexture"),At.setValue(N,"batchingIdTexture",ne._indirectTexture,X),At.setOptional(N,ne,"batchingColorTexture"),ne._colorsTexture!==null&&At.setValue(N,"batchingColorTexture",ne._colorsTexture,X));const Yn=ae.morphAttributes;if((Yn.position!==void 0||Yn.normal!==void 0||Yn.color!==void 0)&&Ve.update(ne,ae,Nn),(Bn||Xe.receiveShadow!==ne.receiveShadow)&&(Xe.receiveShadow=ne.receiveShadow,At.setValue(N,"receiveShadow",ne.receiveShadow)),oe.isMeshGouraudMaterial&&oe.envMap!==null&&(wn.envMap.value=Ne,wn.flipEnvMap.value=Ne.isCubeTexture&&Ne.isRenderTargetTexture===!1?-1:1),oe.isMeshStandardMaterial&&oe.envMap===null&&Q.environment!==null&&(wn.envMapIntensity.value=Q.environmentIntensity),wn.dfgLUT!==void 0&&(wn.dfgLUT.value=w3()),Bn&&(At.setValue(N,"toneMappingExposure",M.toneMappingExposure),Xe.needsLights&&mC(wn,qa),Ee&&oe.fog===!0&&Ce.refreshFogUniforms(wn,Ee),Ce.refreshMaterialUniforms(wn,oe,ie,q,v.state.transmissionRenderTarget[O.id]),Ko.upload(N,fg(Xe),wn,X)),oe.isShaderMaterial&&oe.uniformsNeedUpdate===!0&&(Ko.upload(N,fg(Xe),wn,X),oe.uniformsNeedUpdate=!1),oe.isSpriteMaterial&&At.setValue(N,"center",ne.center),At.setValue(N,"modelViewMatrix",ne.modelViewMatrix),At.setValue(N,"normalMatrix",ne.normalMatrix),At.setValue(N,"modelMatrix",ne.matrixWorld),oe.isShaderMaterial||oe.isRawShaderMaterial){const xn=oe.uniformsGroups;for(let Sn=0,_d=xn.length;Sn<_d;Sn++){const Xs=xn[Sn];Te.update(Xs,Nn),Te.bind(Xs,Nn)}}return Nn}function mC(O,Q){O.ambientLightColor.needsUpdate=Q,O.lightProbe.needsUpdate=Q,O.directionalLights.needsUpdate=Q,O.directionalLightShadows.needsUpdate=Q,O.pointLights.needsUpdate=Q,O.pointLightShadows.needsUpdate=Q,O.spotLights.needsUpdate=Q,O.spotLightShadows.needsUpdate=Q,O.rectAreaLights.needsUpdate=Q,O.hemisphereLights.needsUpdate=Q}function gC(O){return O.isMeshLambertMaterial||O.isMeshToonMaterial||O.isMeshPhongMaterial||O.isMeshStandardMaterial||O.isShadowMaterial||O.isShaderMaterial&&O.lights===!0}this.getActiveCubeFace=function(){return R},this.getActiveMipmapLevel=function(){return S},this.getRenderTarget=function(){return E},this.setRenderTargetTextures=function(O,Q,ae){const oe=J.get(O);oe.__autoAllocateDepthBuffer=O.resolveDepthBuffer===!1,oe.__autoAllocateDepthBuffer===!1&&(oe.__useRenderToTexture=!1),J.get(O.texture).__webglTexture=Q,J.get(O.depthTexture).__webglTexture=oe.__autoAllocateDepthBuffer?void 0:ae,oe.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(O,Q){const ae=J.get(O);ae.__webglFramebuffer=Q,ae.__useDefaultFramebuffer=Q===void 0};const xC=N.createFramebuffer();this.setRenderTarget=function(O,Q=0,ae=0){E=O,R=Q,S=ae;let oe=!0,ne=null,Ee=!1,Le=!1;if(O){const Ne=J.get(O);if(Ne.__useDefaultFramebuffer!==void 0)F.bindFramebuffer(N.FRAMEBUFFER,null),oe=!1;else if(Ne.__webglFramebuffer===void 0)X.setupRenderTarget(O);else if(Ne.__hasExternalTextures)X.rebindTextures(O,J.get(O.texture).__webglTexture,J.get(O.depthTexture).__webglTexture);else if(O.depthBuffer){const We=O.depthTexture;if(Ne.__boundDepthTexture!==We){if(We!==null&&J.has(We)&&(O.width!==We.image.width||O.height!==We.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");X.setupDepthRenderbuffer(O)}}const je=O.texture;(je.isData3DTexture||je.isDataArrayTexture||je.isCompressedArrayTexture)&&(Le=!0);const Ze=J.get(O).__webglFramebuffer;O.isWebGLCubeRenderTarget?(Array.isArray(Ze[Q])?ne=Ze[Q][ae]:ne=Ze[Q],Ee=!0):O.samples>0&&X.useMultisampledRTT(O)===!1?ne=J.get(O).__webglMultisampledFramebuffer:Array.isArray(Ze)?ne=Ze[ae]:ne=Ze,I.copy(O.viewport),w.copy(O.scissor),z=O.scissorTest}else I.copy(fe).multiplyScalar(ie).floor(),w.copy(me).multiplyScalar(ie).floor(),z=de;if(ae!==0&&(ne=xC),F.bindFramebuffer(N.FRAMEBUFFER,ne)&&oe&&F.drawBuffers(O,ne),F.viewport(I),F.scissor(w),F.setScissorTest(z),Ee){const Ne=J.get(O.texture);N.framebufferTexture2D(N.FRAMEBUFFER,N.COLOR_ATTACHMENT0,N.TEXTURE_CUBE_MAP_POSITIVE_X+Q,Ne.__webglTexture,ae)}else if(Le){const Ne=Q;for(let je=0;je=0&&Q<=O.width-oe&&ae>=0&&ae<=O.height-ne&&(O.textures.length>1&&N.readBuffer(N.COLOR_ATTACHMENT0+ze),N.readPixels(Q,ae,oe,ne,Ge.convert(Ze),Ge.convert(We),Ee))}finally{const je=E!==null?J.get(E).__webglFramebuffer:null;F.bindFramebuffer(N.FRAMEBUFFER,je)}}},this.readRenderTargetPixelsAsync=async function(O,Q,ae,oe,ne,Ee,Le,ze=0){if(!(O&&O.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let Ne=J.get(O).__webglFramebuffer;if(O.isWebGLCubeRenderTarget&&Le!==void 0&&(Ne=Ne[Le]),Ne)if(Q>=0&&Q<=O.width-oe&&ae>=0&&ae<=O.height-ne){F.bindFramebuffer(N.FRAMEBUFFER,Ne);const je=O.textures[ze],Ze=je.format,We=je.type;if(!k.textureFormatReadable(Ze))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!k.textureTypeReadable(We))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const st=N.createBuffer();N.bindBuffer(N.PIXEL_PACK_BUFFER,st),N.bufferData(N.PIXEL_PACK_BUFFER,Ee.byteLength,N.STREAM_READ),O.textures.length>1&&N.readBuffer(N.COLOR_ATTACHMENT0+ze),N.readPixels(Q,ae,oe,ne,Ge.convert(Ze),Ge.convert(We),0);const mt=E!==null?J.get(E).__webglFramebuffer:null;F.bindFramebuffer(N.FRAMEBUFFER,mt);const Bt=N.fenceSync(N.SYNC_GPU_COMMANDS_COMPLETE,0);return N.flush(),await sx(N,Bt,4),N.bindBuffer(N.PIXEL_PACK_BUFFER,st),N.getBufferSubData(N.PIXEL_PACK_BUFFER,0,Ee),N.deleteBuffer(st),N.deleteSync(Bt),Ee}else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")},this.copyFramebufferToTexture=function(O,Q=null,ae=0){const oe=Math.pow(2,-ae),ne=Math.floor(O.image.width*oe),Ee=Math.floor(O.image.height*oe),Le=Q!==null?Q.x:0,ze=Q!==null?Q.y:0;X.setTexture2D(O,0),N.copyTexSubImage2D(N.TEXTURE_2D,ae,0,0,Le,ze,ne,Ee),F.unbindTexture()};const vC=N.createFramebuffer(),yC=N.createFramebuffer();this.copyTextureToTexture=function(O,Q,ae=null,oe=null,ne=0,Ee=null){Ee===null&&(ne!==0?(na("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),Ee=ne,ne=0):Ee=0);let Le,ze,Ne,je,Ze,We,st,mt,Bt;const kt=O.isCompressedTexture?O.mipmaps[Ee]:O.image;if(ae!==null)Le=ae.max.x-ae.min.x,ze=ae.max.y-ae.min.y,Ne=ae.isBox3?ae.max.z-ae.min.z:1,je=ae.min.x,Ze=ae.min.y,We=ae.isBox3?ae.min.z:0;else{const Yn=Math.pow(2,-ne);Le=Math.floor(kt.width*Yn),ze=Math.floor(kt.height*Yn),O.isDataArrayTexture?Ne=kt.depth:O.isData3DTexture?Ne=Math.floor(kt.depth*Yn):Ne=1,je=0,Ze=0,We=0}oe!==null?(st=oe.x,mt=oe.y,Bt=oe.z):(st=0,mt=0,Bt=0);const xt=Ge.convert(Q.format),Xe=Ge.convert(Q.type);let Ct;Q.isData3DTexture?(X.setTexture3D(Q,0),Ct=N.TEXTURE_3D):Q.isDataArrayTexture||Q.isCompressedArrayTexture?(X.setTexture2DArray(Q,0),Ct=N.TEXTURE_2D_ARRAY):(X.setTexture2D(Q,0),Ct=N.TEXTURE_2D),N.pixelStorei(N.UNPACK_FLIP_Y_WEBGL,Q.flipY),N.pixelStorei(N.UNPACK_PREMULTIPLY_ALPHA_WEBGL,Q.premultiplyAlpha),N.pixelStorei(N.UNPACK_ALIGNMENT,Q.unpackAlignment);const lt=N.getParameter(N.UNPACK_ROW_LENGTH),Nn=N.getParameter(N.UNPACK_IMAGE_HEIGHT),qr=N.getParameter(N.UNPACK_SKIP_PIXELS),Bn=N.getParameter(N.UNPACK_SKIP_ROWS),qa=N.getParameter(N.UNPACK_SKIP_IMAGES);N.pixelStorei(N.UNPACK_ROW_LENGTH,kt.width),N.pixelStorei(N.UNPACK_IMAGE_HEIGHT,kt.height),N.pixelStorei(N.UNPACK_SKIP_PIXELS,je),N.pixelStorei(N.UNPACK_SKIP_ROWS,Ze),N.pixelStorei(N.UNPACK_SKIP_IMAGES,We);const At=O.isDataArrayTexture||O.isData3DTexture,wn=Q.isDataArrayTexture||Q.isData3DTexture;if(O.isDepthTexture){const Yn=J.get(O),xn=J.get(Q),Sn=J.get(Yn.__renderTarget),_d=J.get(xn.__renderTarget);F.bindFramebuffer(N.READ_FRAMEBUFFER,Sn.__webglFramebuffer),F.bindFramebuffer(N.DRAW_FRAMEBUFFER,_d.__webglFramebuffer);for(let Xs=0;XsMath.PI&&(n-=yn),i<-Math.PI?i+=yn:i>Math.PI&&(i-=yn),n<=i?this._spherical.theta=Math.max(n,Math.min(i,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(n+i)/2?Math.max(n,this._spherical.theta):Math.min(i,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let r=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const a=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),r=a!=this._spherical.radius}if(Gt.setFromSpherical(this._spherical),Gt.applyQuaternion(this._quatInverse),this.engine&&this.engine.DeviceType==="PC"){const a=new P;if(a.copy(this.origin).sub(this.target),a.lengthSq()>1e-4&&(this._sphericalDelta.theta!==0||this._sphericalDelta.phi!==0)){const o=this.enableDamping?this.dampingFactor*3:1,l=new P(0,1,0),c=new P;this.object.getWorldDirection(c);const h=c.clone().cross(l).normalize(),u=new P().copy(this.object.position).sub(this.origin);u.applyAxisAngle(l,Math.PI*this._sphericalDelta.theta*o),u.applyAxisAngle(h,Math.PI*this._sphericalDelta.phi*o),t.copy(this.origin).add(u);const p=new P().copy(this.target).sub(this.origin);p.applyAxisAngle(l,Math.PI*this._sphericalDelta.theta*o),p.applyAxisAngle(h,Math.PI*this._sphericalDelta.phi*o),this.target.copy(this.origin).add(p)}else if(this._panOffset.lengthSq()===0&&this._sphericalDelta.phi===0&&this._sphericalDelta.theta===0){if(this._scale!==1){const o=new P;this.object.getWorldDirection(o);const l=this._spherical.radius*.05*(this._scale-1);t.add(o.multiplyScalar(l))}}else t.copy(this.target).add(Gt);this.object.lookAt(this.target)}else t.copy(this.target).add(Gt),this.object.lookAt(this.target);if(this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let a=null;if(this.object.isPerspectiveCamera){const o=Gt.length();a=this._clampDistance(o*this._scale);const l=o-a;this.object.position.addScaledVector(this._dollyDirection,l),this.object.updateMatrixWorld(),r=!!l}else if(this.object.isOrthographicCamera){const o=new P(this._mouse.x,this._mouse.y,0);o.unproject(this.object);const l=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),r=l!==this.object.zoom;const c=new P(this._mouse.x,this._mouse.y,0);c.unproject(this.object),this.object.position.sub(c).add(o),this.object.updateMatrixWorld(),a=Gt.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;a!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(a).add(this.object.position):(Qo.origin.copy(this.object.position),Qo.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(Qo.direction))lu||8*(1-this._lastQuaternion.dot(this.object.quaternion))>lu||this._lastTargetPosition.distanceToSquared(this.target)>lu?(this.dispatchEvent(qf),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?yn/60*this.autoRotateSpeed*e:yn/60/60*this.autoRotateSpeed}_getZoomScale(e){const t=Math.abs(e*.01);return Math.pow(.95,this.zoomSpeed*t)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,t){Gt.setFromMatrixColumn(t,0),Gt.multiplyScalar(-e),this._panOffset.add(Gt)}_panUp(e,t){this.screenSpacePanning===!0?Gt.setFromMatrixColumn(t,1):(Gt.setFromMatrixColumn(t,0),Gt.crossVectors(this.object.up,Gt)),Gt.multiplyScalar(e),this._panOffset.add(Gt)}_pan(e,t){const n=this.domElement;if(this.object.isPerspectiveCamera){const i=this.object.position;Gt.copy(i).sub(this.target);let r=Gt.length();r*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*r/n.clientHeight,this.object.matrix),this._panUp(2*t*r/n.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/n.clientWidth,this.object.matrix),this._panUp(t*(this.object.top-this.object.bottom)/this.object.zoom/n.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(e,t){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const n=this.domElement.getBoundingClientRect(),i=e-n.left,r=t-n.top,a=n.width,o=n.height;this._mouse.x=i/a*2-1,this._mouse.y=-(r/o)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(yn*this._rotateDelta.x/t.clientHeight),this._rotateUp(yn*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY);let t;if(this.object.isOrthographicCamera)e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY!==0&&this._dollyOut(this._getZoomScale(e.deltaY));else{const n=Math.abs(e.deltaY*.01);t=Math.pow(1.15,this.zoomSpeed*n),e.deltaY>0?this._scale/=t:e.deltaY!==0&&(this._scale*=t)}this.update()}_handleKeyDown(e){let t=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(yn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),t=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(-yn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),t=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(yn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),t=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(-yn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),t=!0;break}t&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._rotateStart.set(n,i)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._panStart.set(n,i)}}_handleTouchStartDolly(e){const t=this._getSecondPointerPosition(e),n=e.pageX-t.x,i=e.pageY-t.y,r=Math.sqrt(n*n+i*i);this._dollyStart.set(0,r)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{const n=this._getSecondPointerPosition(e),i=.5*(e.pageX+n.x),r=.5*(e.pageY+n.y);this._rotateEnd.set(i,r)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(yn*this._rotateDelta.x/t.clientHeight),this._rotateUp(yn*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._panEnd.set(n,i)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){const t=this._getSecondPointerPosition(e),n=e.pageX-t.x,i=e.pageY-t.y,r=Math.sqrt(n*n+i*i);this._dollyEnd.set(0,r),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const a=(e.pageX+t.x)*.5,o=(e.pageY+t.y)*.5;this._updateZoomParameters(a,o)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let t=0;te}set colliders(e){this._rayCastObjects=e}set enabled(e){this._isEnabled!==e&&(this._isEnabled=e,this._euler.setFromQuaternion(this.camera.quaternion),e?this.addEvents():this.removeEvents())}get enabled(){return this._isEnabled}addEvents(){const e=this._Engine?.DeviceType,t=e==="PC"||!e;console.log("[FirstPersonCameraControl] addEvents - DeviceType:",e,"isPC:",t),t?(console.log("[FirstPersonCameraControl] 添加鼠标事件监听器 - mousedown, mouseup"),this.domElement.addEventListener("mousedown",this.bindmousedown,!1),this.domElement.addEventListener("mouseup",this.bindmouseup,!1)):(console.log("[FirstPersonCameraControl] 添加触摸事件监听器"),this.domElement.addEventListener("touchstart",this.bindmousedown,!1),this.domElement.addEventListener("touchend",this.bindmouseup,!1)),window.addEventListener("keydown",this.bindonKeyDown,!1),window.addEventListener("keyup",this.bindonKeyUp,!1),this.needMousewheel&&(document.addEventListener&&document.addEventListener("DOMMouseScroll",this.bindMousewheel,!1),window.addEventListener("mousewheel",this.bindMousewheel,!1))}removeEvents(){this._Engine&&this._Engine.DeviceType!=="PC"?(this.domElement.removeEventListener("touchstart",this.bindmousedown),this.domElement.removeEventListener("touchend",this.bindmouseup),this.domElement.removeEventListener("touchmove",this.bindmousemove)):(this.domElement.removeEventListener("mousedown",this.bindmousedown),this.domElement.removeEventListener("mouseup",this.bindmouseup),this.domElement.removeEventListener("mousemove",this.bindmousemove)),window.removeEventListener("keydown",this.bindonKeyDown),window.removeEventListener("keyup",this.bindonKeyUp),this.needMousewheel&&(document.addEventListener&&document.removeEventListener("DOMMouseScroll",this.bindMousewheel),window.removeEventListener("mousewheel",this.bindMousewheel))}onMousewheel(e){debugger;let t;switch(e.wheelDelta?(e.wheelDelta>0&&(t="up"),e.wheelDelta<0&&(t="down")):e.detail&&(e.detail<0&&(t="up"),e.detail>0&&(t="down")),t){case"up":this._camerLocalDirection.z=1;break;case"down":this._camerLocalDirection.z=-1;break}this.moveWheelRun==!0?(this.moveWheelRun=!1,this.moveWheelStop=!0,this.wheelClock=setTimeout(()=>{this.moveWheelStop==!0&&(this.moveWheelStop=!1,this.moveWheelRun=!0,this._camerLocalDirection.z=0)},200)):(clearTimeout(this.wheelClock),this.wheelClock=setTimeout(()=>{this.moveWheelStop==!0&&(this.moveWheelStop=!1,this.moveWheelRun=!0,this._camerLocalDirection.z=0)},150))}onMouseDown(e){console.log("[FirstPersonCameraControl] onMouseDown 被调用",e),this.domElement.addEventListener("mousemove",this.bindmousemove,!1),this._prevMouseX=e.screenX,this._prevMouseY=e.screenY}onMouseMove(e){if(this._isEnabled==!1)return;let t=this._prevMouseX?e.screenX-this._prevMouseX:0,n=this._prevMouseY?e.screenY-this._prevMouseY:0,i=this._euler.x-n*this.lookflag*this.lookSpeed;i>=0?i-this.maxRotateX?this._euler.x=i:this._euler.x=-this.maxRotateX,this._euler.y-=t*this.lookSpeed,this.camera.quaternion.setFromEuler(this._euler),this._prevMouseX=e.screenX,this._prevMouseY=e.screenY;let r=this.GetEngine();r.movefirst=!0;var a=new CustomEvent("bimengine:camerachange",{detail:""});window.dispatchEvent(a)}onMouseUp(e){let t=this.GetEngine();t.movefirst=!1,this.domElement.removeEventListener("mousemove",this.bindmousemove)}onTouchStart(e){this.domElement.addEventListener("touchmove",this.bindmousemove,!1),this._prevMouseX=e.targetTouches[0].clientX,this._prevMouseY=e.targetTouches[0].clientY}onTouchMove(e){if(this._isEnabled==!1)return;let t=this._prevMouseX?e.targetTouches[0].clientX-this._prevMouseX:0,n=this._prevMouseY?e.targetTouches[0].clientY-this._prevMouseY:0,i=this._euler.x-n*this.lookflag*this.lookSpeed;i>=0?i-this.maxRotateX?this._euler.x=i:this._euler.x=-this.maxRotateX,this._euler.y-=t*this.lookSpeed,this.camera.quaternion.setFromEuler(this._euler),this._prevMouseX=e.targetTouches[0].clientX,this._prevMouseY=e.targetTouches[0].clientY;let r=this.GetEngine();r.movefirst=!0;var a=new CustomEvent("bimengine:camerachange",{detail:""});window.dispatchEvent(a)}onTouchEnd(e){let t=this.GetEngine();t.movefirst=!1,this.domElement.removeEventListener("touchmove",this.bindmousemove)}onKeyDown(e){var t=new CustomEvent("bimengine:camerachange",{detail:""});let n=this.GetEngine();switch(n.movefirst=!0,window.dispatchEvent(t),e.keyCode){case 38:this.rotateY(-1);break;case 81:this.keydown=!0,this._camerLocalDirection.y=1;break;case 69:this._camerLocalDirection.y=-1;break;case 87:this._camerLocalDirection.z=1;break;case 37:this.rotateX(-1);break;case 65:this._camerLocalDirection.x=-1;break;case 40:this.rotateY(1);break;case 83:this._camerLocalDirection.z=-1;break;case 39:this.rotateX(1);break;case 68:this._camerLocalDirection.x=1;break}}onKeyUp(e){let t=this.GetEngine();switch(t.movefirst=!1,e.keyCode){case 38:case 87:this._camerLocalDirection.z=0;break;case 37:case 65:this._camerLocalDirection.x=0;break;case 40:case 83:this._camerLocalDirection.z=0;break;case 39:case 68:this._camerLocalDirection.x=0;break;case 81:case 69:this.keydown=!1,this._camerLocalDirection.y=0;break}}rotateX(e){this._euler.y-=e*this.lookSpeed,this.camera.quaternion.setFromEuler(this._euler)}rotateY(e){let t=this._euler.x-e*this.lookflag*.5*this.lookSpeed;t>=0?t-this.maxRotateX?this._euler.x=t:this._euler.x=-this.maxRotateX,this.camera.quaternion.setFromEuler(this._euler)}update(){this.keydown||this.gravityTest(),this.collisionTest()}gravityTest(){if(this.applyGravity){let e=!0;this._fallingTime+=.01,this._tmpVector.set(0,-1,0);const t=this.hitTest();if(t){const n=t.point.add(new P(0,this.playerHeight,0));if(this.positionEasing){if(n.y>=this.camera.position.y||n.y-this.camera.position.y<.2){this.setCameraHeight(this.camera.position.y+(n.y-this.camera.position.y)*.08),this._fallingTime=0,e=!1;return}}else t.distanceL instanceof Ut),!0);if(m.length>0&&(d.length==0||m[0].distance{L[0]!=null&&L[1]!=null&&y.push({X:L[0].X*.5+L[1].X*.5,Y:L[0].Y*.5+L[1].Y*.5,Z:L[0].Z*.5+L[1].Z*.5})});let v=[...g[2].map(L=>L[0]),...y],b="face",_=[],M=[],T=10;if(v.forEach(L=>{if(L!=null){let A=new P(L.X,L.Z,-L.Y),I=s.worldToScreen.worldToScreen(A),w=Math.sqrt(Math.pow(I.x-p.offsetX,2)+Math.pow(I.y-p.offsetY,2));w0?(_.sort((L,A)=>L.distance-A.distance),b="point"):(g[2].forEach(L=>{if(L[0]!=null&&L[1]!=null){let A=new P(L[0].X,L[0].Z,-L[0].Y),I=new P(L[1].X,L[1].Z,-L[1].Y),w=s.worldToScreen.worldToScreen(A),z=s.worldToScreen.worldToScreen(I),G=R(new he(p.offsetX,p.offsetY),w,z);if(G0&&(M.sort((L,A)=>L.distance-A.distance),b="line")),b=="point"&&e.options.showCatch){const L=s.worldToScreen.worldToScreen(_[0].point);s.catchSvg.innerHTML="";const A=L.x+s.reactBoundingClientRect.left,I=L.y+s.reactBoundingClientRect.top,w=document.createElementNS("http://www.w3.org/2000/svg","polygon");w.setAttribute("class","catchPoint"),w.setAttribute("points",`${A},${I-8} ${A-7},${I+4} ${A+7},${I+4}`),s.catchSvg.appendChild(w),d[0].point=_[0].point}else if(b=="line"&&e.options.showCatch){s.worldToScreen.worldToScreen(M[0].point);const L=M[0].start,A=M[0].end;s.catchSvg.innerHTML="";const I=document.createElementNS("http://www.w3.org/2000/svg","line");I.setAttribute("class","catchLine"),I.setAttribute("x1",(L.x+s.reactBoundingClientRect.left).toString()),I.setAttribute("y1",(L.y+s.reactBoundingClientRect.top).toString()),I.setAttribute("x2",(A.x+s.reactBoundingClientRect.left).toString()),I.setAttribute("y2",(A.y+s.reactBoundingClientRect.top).toString()),I.setAttribute("stroke","rgb(8, 223, 215)"),I.setAttribute("stroke-width","2"),s.catchSvg.appendChild(I),d[0].point=M[0].point}else if(b=="face"&&e.options.showCatch){let L=d[0].point.clone(),A=d[0].normal||(d[0].face?d[0].face.normal:null);const I=(A?A.clone():new P(0,0,1)).normalize(),w=Math.abs(I.y)<.9?new P(0,1,0):new P(1,0,0),z=new P().crossVectors(I,w).normalize(),G=new P().crossVectors(I,z).normalize(),j=.05,Y=[new P().copy(z).add(G).multiplyScalar(j),new P().copy(z).sub(G).multiplyScalar(j),new P().copy(z).multiplyScalar(-1).sub(G).multiplyScalar(j),new P().copy(z).multiplyScalar(-1).add(G).multiplyScalar(j)].map(ie=>new P().copy(L).add(ie)).map(ie=>s.worldToScreen.worldToScreen(ie));s.catchSvg.innerHTML="";const q=document.createElementNS("http://www.w3.org/2000/svg","polygon");q.setAttribute("class","catchFace"),q.setAttribute("points",Y.map(ie=>`${ie.x+s.reactBoundingClientRect.left},${ie.y+s.reactBoundingClientRect.top}`).join(" ")),q.setAttribute("fill","rgba(1, 238, 255, 0.2)"),q.setAttribute("stroke","rgb(0, 255, 247)"),q.setAttribute("stroke-width","1"),s.catchSvg.appendChild(q)}return d[0];function R(L,A,I){const w=new he().subVectors(I,A),z=w.lengthSq();if(z<1e-10)return L.distanceTo(A);const G=new he().subVectors(L,A),j=zt.clamp(G.dot(w)/z,0,1),Y=new he().copy(w).multiplyScalar(j).add(A);return L.distanceTo(Y)}function S(L,A,I){const w=new he().subVectors(I,A),z=w.lengthSq();if(z<1e-10)return 0;const G=new he().subVectors(L,A);return zt.clamp(G.dot(w)/z,0,1)}function E(L,A,I){const w=zt.clamp(L,0,1);return new P().lerpVectors(A,I,w)}}return e}class V3{engine;orbitControls;firstPersonControls;isActive=!0;originDiv=null;handelBehaved;isDragging=!1;isDown=!1;containerOffset={left:0,top:0};constructor(e){this.engine=e,this.init(),this.handelBehaved=cu(this.engine),this.handelBehaved.init(this,null),this.handelBehaved.active()}init(){this.orbitControls=new P3(this.engine,this.engine.camera,this.engine.renderer.domElement),this.orbitControls.showOriginIcon=!0,this.firstPersonControls=new $f(this.engine,this.engine.camera,this.engine.renderer.domElement);const e=document.createElement("div");this.originDiv=e,e.className="originDiv",e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.width="30px",e.style.height="30px",e.style.borderRadius="50%",e.style.pointerEvents="none",e.style.backgroundImage="url(/assets/svg/rotate-orbit.svg)",this.engine.container.appendChild(this.originDiv)}active(){this.isActive=!0,this.orbitControls.enabled=!0}disActive(){this.isActive=!1,this.orbitControls.enabled=!1}setMoveSpeed(e){this.firstPersonControls.moveSpeed=e}getMoveSpeed(){return this.firstPersonControls.moveSpeed}setApplyCollision(e){this.firstPersonControls.applyCollision=e}getApplyCollision(){return this.firstPersonControls.applyCollision}setApplyGravity(e){this.firstPersonControls.applyGravity=e}getApplyGravity(){return this.firstPersonControls.applyGravity}toggleMinMap(){this.engine.minMap.toggle()}switchFirstPersonMode(){this.engine.cameraModule.switchToPerspectiveCamera(),this.firstPersonControls=new $f(this.engine,this.engine.camera,this.engine.renderer.domElement,[]),this.orbitControls.enabled=!1,this.firstPersonControls.enabled=!0,this.firstPersonControls.isActive=!0}switchDefaultMode(){this.firstPersonControls&&(this.firstPersonControls.enabled=!1,this.engine.cameraModule.switchToOrthographicCamera()),this.orbitControls.enabled=!0}handleMouseUp(e){this.isDragging=!1,this.isDown=!1}handleMouseMove(e){this.isDown?this.isDragging=!0:this.isDragging=!1}handleMouseDown(e){this.isDown=!0}handleMouseClick(e){this.isDragging=!1,this.isDown=!1}update(){if(this.firstPersonControls.enabled&&this.firstPersonControls.update(),this.orbitControls.enabled){const e=this.engine.controlModule.orbitControls.origin,t=this.engine.worldToScreen.worldToScreen(e);this.originDiv&&this.isDragging?(this.originDiv.style.left=t.x-15+this.engine.reactBoundingClientRect.left+"px",this.originDiv.style.top=t.y-15+this.engine.reactBoundingClientRect.top+"px",this.originDiv.style.display="block"):this.originDiv&&(this.originDiv.style.display="none")}}}const As={name:"CopyShader",uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:` +}`;class x3{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(e,t){if(this.texture===null){const n=new jp(e.texture);(e.depthNear!==t.depthNear||e.depthFar!==t.depthFar)&&(this.depthNear=e.depthNear,this.depthFar=e.depthFar),this.texture=n}}getMesh(e){if(this.texture!==null&&this.mesh===null){const t=e.cameras[0].viewport,n=new Lt({vertexShader:m3,fragmentShader:g3,uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new rt(new Ss(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class v3 extends gs{constructor(e,t){super();const n=this;let i=null,r=1,a=null,o="local-floor",l=1,c=null,h=null,u=null,p=null,d=null,m=null;const f=typeof XRWebGLBinding<"u",x=new x3,g={},b=t.getContextAttributes();let v=null,y=null;const _=[],M=[],C=new he;let R=null;const S=new on;S.viewport=new tt;const E=new on;E.viewport=new tt;const L=[S,E],A=new rv;let I=null,w=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(se){let ce=_[se];return ce===void 0&&(ce=new Mh,_[se]=ce),ce.getTargetRaySpace()},this.getControllerGrip=function(se){let ce=_[se];return ce===void 0&&(ce=new Mh,_[se]=ce),ce.getGripSpace()},this.getHand=function(se){let ce=_[se];return ce===void 0&&(ce=new Mh,_[se]=ce),ce.getHandSpace()};function z(se){const ce=M.indexOf(se.inputSource);if(ce===-1)return;const pe=_[ce];pe!==void 0&&(pe.update(se.inputSource,se.frame,c||a),pe.dispatchEvent({type:se.type,data:se.inputSource}))}function G(){i.removeEventListener("select",z),i.removeEventListener("selectstart",z),i.removeEventListener("selectend",z),i.removeEventListener("squeeze",z),i.removeEventListener("squeezestart",z),i.removeEventListener("squeezeend",z),i.removeEventListener("end",G),i.removeEventListener("inputsourceschange",j);for(let se=0;se<_.length;se++){const ce=M[se];ce!==null&&(M[se]=null,_[se].disconnect(ce))}I=null,w=null,x.reset();for(const se in g)delete g[se];e.setRenderTarget(v),d=null,p=null,u=null,i=null,y=null,de.stop(),n.isPresenting=!1,e.setPixelRatio(R),e.setSize(C.width,C.height,!1),n.dispatchEvent({type:"sessionend"})}this.setFramebufferScaleFactor=function(se){r=se,n.isPresenting===!0&&He("WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(se){o=se,n.isPresenting===!0&&He("WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return c||a},this.setReferenceSpace=function(se){c=se},this.getBaseLayer=function(){return p!==null?p:d},this.getBinding=function(){return u===null&&f&&(u=new XRWebGLBinding(i,t)),u},this.getFrame=function(){return m},this.getSession=function(){return i},this.setSession=async function(se){if(i=se,i!==null){if(v=e.getRenderTarget(),i.addEventListener("select",z),i.addEventListener("selectstart",z),i.addEventListener("selectend",z),i.addEventListener("squeeze",z),i.addEventListener("squeezestart",z),i.addEventListener("squeezeend",z),i.addEventListener("end",G),i.addEventListener("inputsourceschange",j),b.xrCompatible!==!0&&await t.makeXRCompatible(),R=e.getPixelRatio(),e.getSize(C),f&&"createProjectionLayer"in XRWebGLBinding.prototype){let pe=null,be=null,Se=null;b.depth&&(Se=b.stencil?t.DEPTH24_STENCIL8:t.DEPTH_COMPONENT24,pe=b.stencil?ms:Jr,be=b.stencil?fs:ps);const Be={colorFormat:t.RGBA8,depthFormat:Se,scaleFactor:r};u=this.getBinding(),p=u.createProjectionLayer(Be),i.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),y=new Tn(p.textureWidth,p.textureHeight,{format:vn,type:$n,depthTexture:new Fo(p.textureWidth,p.textureHeight,be,void 0,void 0,void 0,void 0,void 0,void 0,pe),stencilBuffer:b.stencil,colorSpace:e.outputColorSpace,samples:b.antialias?4:0,resolveDepthBuffer:p.ignoreDepthValues===!1,resolveStencilBuffer:p.ignoreDepthValues===!1})}else{const pe={antialias:b.antialias,alpha:!0,depth:b.depth,stencil:b.stencil,framebufferScaleFactor:r};d=new XRWebGLLayer(i,t,pe),i.updateRenderState({baseLayer:d}),e.setPixelRatio(1),e.setSize(d.framebufferWidth,d.framebufferHeight,!1),y=new Tn(d.framebufferWidth,d.framebufferHeight,{format:vn,type:$n,colorSpace:e.outputColorSpace,stencilBuffer:b.stencil,resolveDepthBuffer:d.ignoreDepthValues===!1,resolveStencilBuffer:d.ignoreDepthValues===!1})}y.isXRRenderTarget=!0,this.setFoveation(l),c=null,a=await i.requestReferenceSpace(o),de.setContext(i),de.start(),n.isPresenting=!0,n.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(i!==null)return i.environmentBlendMode},this.getDepthTexture=function(){return x.getDepthTexture()};function j(se){for(let ce=0;ce=0&&(M[be]=null,_[be].disconnect(pe))}for(let ce=0;ce=M.length){M.push(pe),be=Be;break}else if(M[Be]===null){M[Be]=pe,be=Be;break}if(be===-1)break}const Se=_[be];Se&&Se.connect(pe)}}const Y=new P,q=new P;function ie(se,ce,pe){Y.setFromMatrixPosition(ce.matrixWorld),q.setFromMatrixPosition(pe.matrixWorld);const be=Y.distanceTo(q),Se=ce.projectionMatrix.elements,Be=pe.projectionMatrix.elements,Je=Se[14]/(Se[10]-1),ke=Se[14]/(Se[10]+1),T=(Se[9]+1)/Se[5],N=(Se[9]-1)/Se[5],V=(Se[8]-1)/Se[0],U=(Be[8]+1)/Be[0],k=Je*V,F=Je*U,ee=be/(-V+U),J=ee*-V;if(ce.matrixWorld.decompose(se.position,se.quaternion,se.scale),se.translateX(J),se.translateZ(ee),se.matrixWorld.compose(se.position,se.quaternion,se.scale),se.matrixWorldInverse.copy(se.matrixWorld).invert(),Se[10]===-1)se.projectionMatrix.copy(ce.projectionMatrix),se.projectionMatrixInverse.copy(ce.projectionMatrixInverse);else{const X=Je+ee,B=ke+ee,D=k-J,H=F+(be-J),K=T*ke/B*X,le=N*ke/B*X;se.projectionMatrix.makePerspective(D,H,K,le,X,B),se.projectionMatrixInverse.copy(se.projectionMatrix).invert()}}function W(se,ce){ce===null?se.matrixWorld.copy(se.matrix):se.matrixWorld.multiplyMatrices(ce.matrixWorld,se.matrix),se.matrixWorldInverse.copy(se.matrixWorld).invert()}this.updateCamera=function(se){if(i===null)return;let ce=se.near,pe=se.far;x.texture!==null&&(x.depthNear>0&&(ce=x.depthNear),x.depthFar>0&&(pe=x.depthFar)),A.near=E.near=S.near=ce,A.far=E.far=S.far=pe,(I!==A.near||w!==A.far)&&(i.updateRenderState({depthNear:A.near,depthFar:A.far}),I=A.near,w=A.far),A.layers.mask=se.layers.mask|6,S.layers.mask=A.layers.mask&3,E.layers.mask=A.layers.mask&5;const be=se.parent,Se=A.cameras;W(A,be);for(let Be=0;Be0&&(x.alphaTest.value=g.alphaTest);const b=e.get(g),v=b.envMap,y=b.envMapRotation;v&&(x.envMap.value=v,Ts.copy(y),Ts.x*=-1,Ts.y*=-1,Ts.z*=-1,v.isCubeTexture&&v.isRenderTargetTexture===!1&&(Ts.y*=-1,Ts.z*=-1),x.envMapRotation.value.setFromMatrix4(b3.makeRotationFromEuler(Ts)),x.flipEnvMap.value=v.isCubeTexture&&v.isRenderTargetTexture===!1?-1:1,x.reflectivity.value=g.reflectivity,x.ior.value=g.ior,x.refractionRatio.value=g.refractionRatio),g.lightMap&&(x.lightMap.value=g.lightMap,x.lightMapIntensity.value=g.lightMapIntensity,t(g.lightMap,x.lightMapTransform)),g.aoMap&&(x.aoMap.value=g.aoMap,x.aoMapIntensity.value=g.aoMapIntensity,t(g.aoMap,x.aoMapTransform))}function a(x,g){x.diffuse.value.copy(g.color),x.opacity.value=g.opacity,g.map&&(x.map.value=g.map,t(g.map,x.mapTransform))}function o(x,g){x.dashSize.value=g.dashSize,x.totalSize.value=g.dashSize+g.gapSize,x.scale.value=g.scale}function l(x,g,b,v){x.diffuse.value.copy(g.color),x.opacity.value=g.opacity,x.size.value=g.size*b,x.scale.value=v*.5,g.map&&(x.map.value=g.map,t(g.map,x.uvTransform)),g.alphaMap&&(x.alphaMap.value=g.alphaMap,t(g.alphaMap,x.alphaMapTransform)),g.alphaTest>0&&(x.alphaTest.value=g.alphaTest)}function c(x,g){x.diffuse.value.copy(g.color),x.opacity.value=g.opacity,x.rotation.value=g.rotation,g.map&&(x.map.value=g.map,t(g.map,x.mapTransform)),g.alphaMap&&(x.alphaMap.value=g.alphaMap,t(g.alphaMap,x.alphaMapTransform)),g.alphaTest>0&&(x.alphaTest.value=g.alphaTest)}function h(x,g){x.specular.value.copy(g.specular),x.shininess.value=Math.max(g.shininess,1e-4)}function u(x,g){g.gradientMap&&(x.gradientMap.value=g.gradientMap)}function p(x,g){x.metalness.value=g.metalness,g.metalnessMap&&(x.metalnessMap.value=g.metalnessMap,t(g.metalnessMap,x.metalnessMapTransform)),x.roughness.value=g.roughness,g.roughnessMap&&(x.roughnessMap.value=g.roughnessMap,t(g.roughnessMap,x.roughnessMapTransform)),g.envMap&&(x.envMapIntensity.value=g.envMapIntensity)}function d(x,g,b){x.ior.value=g.ior,g.sheen>0&&(x.sheenColor.value.copy(g.sheenColor).multiplyScalar(g.sheen),x.sheenRoughness.value=g.sheenRoughness,g.sheenColorMap&&(x.sheenColorMap.value=g.sheenColorMap,t(g.sheenColorMap,x.sheenColorMapTransform)),g.sheenRoughnessMap&&(x.sheenRoughnessMap.value=g.sheenRoughnessMap,t(g.sheenRoughnessMap,x.sheenRoughnessMapTransform))),g.clearcoat>0&&(x.clearcoat.value=g.clearcoat,x.clearcoatRoughness.value=g.clearcoatRoughness,g.clearcoatMap&&(x.clearcoatMap.value=g.clearcoatMap,t(g.clearcoatMap,x.clearcoatMapTransform)),g.clearcoatRoughnessMap&&(x.clearcoatRoughnessMap.value=g.clearcoatRoughnessMap,t(g.clearcoatRoughnessMap,x.clearcoatRoughnessMapTransform)),g.clearcoatNormalMap&&(x.clearcoatNormalMap.value=g.clearcoatNormalMap,t(g.clearcoatNormalMap,x.clearcoatNormalMapTransform),x.clearcoatNormalScale.value.copy(g.clearcoatNormalScale),g.side===sn&&x.clearcoatNormalScale.value.negate())),g.dispersion>0&&(x.dispersion.value=g.dispersion),g.iridescence>0&&(x.iridescence.value=g.iridescence,x.iridescenceIOR.value=g.iridescenceIOR,x.iridescenceThicknessMinimum.value=g.iridescenceThicknessRange[0],x.iridescenceThicknessMaximum.value=g.iridescenceThicknessRange[1],g.iridescenceMap&&(x.iridescenceMap.value=g.iridescenceMap,t(g.iridescenceMap,x.iridescenceMapTransform)),g.iridescenceThicknessMap&&(x.iridescenceThicknessMap.value=g.iridescenceThicknessMap,t(g.iridescenceThicknessMap,x.iridescenceThicknessMapTransform))),g.transmission>0&&(x.transmission.value=g.transmission,x.transmissionSamplerMap.value=b.texture,x.transmissionSamplerSize.value.set(b.width,b.height),g.transmissionMap&&(x.transmissionMap.value=g.transmissionMap,t(g.transmissionMap,x.transmissionMapTransform)),x.thickness.value=g.thickness,g.thicknessMap&&(x.thicknessMap.value=g.thicknessMap,t(g.thicknessMap,x.thicknessMapTransform)),x.attenuationDistance.value=g.attenuationDistance,x.attenuationColor.value.copy(g.attenuationColor)),g.anisotropy>0&&(x.anisotropyVector.value.set(g.anisotropy*Math.cos(g.anisotropyRotation),g.anisotropy*Math.sin(g.anisotropyRotation)),g.anisotropyMap&&(x.anisotropyMap.value=g.anisotropyMap,t(g.anisotropyMap,x.anisotropyMapTransform))),x.specularIntensity.value=g.specularIntensity,x.specularColor.value.copy(g.specularColor),g.specularColorMap&&(x.specularColorMap.value=g.specularColorMap,t(g.specularColorMap,x.specularColorMapTransform)),g.specularIntensityMap&&(x.specularIntensityMap.value=g.specularIntensityMap,t(g.specularIntensityMap,x.specularIntensityMapTransform))}function m(x,g){g.matcap&&(x.matcap.value=g.matcap)}function f(x,g){const b=e.get(g).light;x.referencePosition.value.setFromMatrixPosition(b.matrixWorld),x.nearDistance.value=b.shadow.camera.near,x.farDistance.value=b.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:i}}function _3(s,e,t,n){let i={},r={},a=[];const o=s.getParameter(s.MAX_UNIFORM_BUFFER_BINDINGS);function l(b,v){const y=v.program;n.uniformBlockBinding(b,y)}function c(b,v){let y=i[b.id];y===void 0&&(m(b),y=h(b),i[b.id]=y,b.addEventListener("dispose",x));const _=v.program;n.updateUBOMapping(b,_);const M=e.render.frame;r[b.id]!==M&&(p(b),r[b.id]=M)}function h(b){const v=u();b.__bindingPointIndex=v;const y=s.createBuffer(),_=b.__size,M=b.usage;return s.bindBuffer(s.UNIFORM_BUFFER,y),s.bufferData(s.UNIFORM_BUFFER,_,M),s.bindBuffer(s.UNIFORM_BUFFER,null),s.bindBufferBase(s.UNIFORM_BUFFER,v,y),y}function u(){for(let b=0;b0&&(y+=_-M),b.__size=y,b.__cache={},this}function f(b){const v={boundary:0,storage:0};return typeof b=="number"||typeof b=="boolean"?(v.boundary=4,v.storage=4):b.isVector2?(v.boundary=8,v.storage=8):b.isVector3||b.isColor?(v.boundary=16,v.storage=12):b.isVector4?(v.boundary=16,v.storage=16):b.isMatrix3?(v.boundary=48,v.storage=48):b.isMatrix4?(v.boundary=64,v.storage=64):b.isTexture?He("WebGLRenderer: Texture samplers can not be part of an uniforms group."):He("WebGLRenderer: Unsupported uniform value type.",b),v}function x(b){const v=b.target;v.removeEventListener("dispose",x);const y=a.indexOf(v.__bindingPointIndex);a.splice(y,1),s.deleteBuffer(i[v.id]),delete i[v.id],delete r[v.id]}function g(){for(const b in i)s.deleteBuffer(i[b]);a=[],i={},r={}}return{bind:l,update:c,dispose:g}}const M3=new Uint16Array([11481,15204,11534,15171,11808,15015,12385,14843,12894,14716,13396,14600,13693,14483,13976,14366,14237,14171,14405,13961,14511,13770,14605,13598,14687,13444,14760,13305,14822,13066,14876,12857,14923,12675,14963,12517,14997,12379,15025,12230,15049,12023,15070,11843,15086,11687,15100,11551,15111,11433,15120,11330,15127,11217,15132,11060,15135,10922,15138,10801,15139,10695,15139,10600,13012,14923,13020,14917,13064,14886,13176,14800,13349,14666,13513,14526,13724,14398,13960,14230,14200,14020,14383,13827,14488,13651,14583,13491,14667,13348,14740,13132,14803,12908,14856,12713,14901,12542,14938,12394,14968,12241,14992,12017,15010,11822,15024,11654,15034,11507,15041,11380,15044,11269,15044,11081,15042,10913,15037,10764,15031,10635,15023,10520,15014,10419,15003,10330,13657,14676,13658,14673,13670,14660,13698,14622,13750,14547,13834,14442,13956,14317,14112,14093,14291,13889,14407,13704,14499,13538,14586,13389,14664,13201,14733,12966,14792,12758,14842,12577,14882,12418,14915,12272,14940,12033,14959,11826,14972,11646,14980,11490,14983,11355,14983,11212,14979,11008,14971,10830,14961,10675,14950,10540,14936,10420,14923,10315,14909,10204,14894,10041,14089,14460,14090,14459,14096,14452,14112,14431,14141,14388,14186,14305,14252,14130,14341,13941,14399,13756,14467,13585,14539,13430,14610,13272,14677,13026,14737,12808,14790,12617,14833,12449,14869,12303,14896,12065,14916,11845,14929,11655,14937,11490,14939,11347,14936,11184,14930,10970,14921,10783,14912,10621,14900,10480,14885,10356,14867,10247,14848,10062,14827,9894,14805,9745,14400,14208,14400,14206,14402,14198,14406,14174,14415,14122,14427,14035,14444,13913,14469,13767,14504,13613,14548,13463,14598,13324,14651,13082,14704,12858,14752,12658,14795,12483,14831,12330,14860,12106,14881,11875,14895,11675,14903,11501,14905,11351,14903,11178,14900,10953,14892,10757,14880,10589,14865,10442,14847,10313,14827,10162,14805,9965,14782,9792,14757,9642,14731,9507,14562,13883,14562,13883,14563,13877,14566,13862,14570,13830,14576,13773,14584,13689,14595,13582,14613,13461,14637,13336,14668,13120,14704,12897,14741,12695,14776,12516,14808,12358,14835,12150,14856,11910,14870,11701,14878,11519,14882,11361,14884,11187,14880,10951,14871,10748,14858,10572,14842,10418,14823,10286,14801,10099,14777,9897,14751,9722,14725,9567,14696,9430,14666,9309,14702,13604,14702,13604,14702,13600,14703,13591,14705,13570,14707,13533,14709,13477,14712,13400,14718,13305,14727,13106,14743,12907,14762,12716,14784,12539,14807,12380,14827,12190,14844,11943,14855,11727,14863,11539,14870,11376,14871,11204,14868,10960,14858,10748,14845,10565,14829,10406,14809,10269,14786,10058,14761,9852,14734,9671,14705,9512,14674,9374,14641,9253,14608,9076,14821,13366,14821,13365,14821,13364,14821,13358,14821,13344,14821,13320,14819,13252,14817,13145,14815,13011,14814,12858,14817,12698,14823,12539,14832,12389,14841,12214,14850,11968,14856,11750,14861,11558,14866,11390,14867,11226,14862,10972,14853,10754,14840,10565,14823,10401,14803,10259,14780,10032,14754,9820,14725,9635,14694,9473,14661,9333,14627,9203,14593,8988,14557,8798,14923,13014,14922,13014,14922,13012,14922,13004,14920,12987,14919,12957,14915,12907,14909,12834,14902,12738,14894,12623,14888,12498,14883,12370,14880,12203,14878,11970,14875,11759,14873,11569,14874,11401,14872,11243,14865,10986,14855,10762,14842,10568,14825,10401,14804,10255,14781,10017,14754,9799,14725,9611,14692,9445,14658,9301,14623,9139,14587,8920,14548,8729,14509,8562,15008,12672,15008,12672,15008,12671,15007,12667,15005,12656,15001,12637,14997,12605,14989,12556,14978,12490,14966,12407,14953,12313,14940,12136,14927,11934,14914,11742,14903,11563,14896,11401,14889,11247,14879,10992,14866,10767,14851,10570,14833,10400,14812,10252,14789,10007,14761,9784,14731,9592,14698,9424,14663,9279,14627,9088,14588,8868,14548,8676,14508,8508,14467,8360,15080,12386,15080,12386,15079,12385,15078,12383,15076,12378,15072,12367,15066,12347,15057,12315,15045,12253,15030,12138,15012,11998,14993,11845,14972,11685,14951,11530,14935,11383,14920,11228,14904,10981,14887,10762,14870,10567,14850,10397,14827,10248,14803,9997,14774,9771,14743,9578,14710,9407,14674,9259,14637,9048,14596,8826,14555,8632,14514,8464,14471,8317,14427,8182,15139,12008,15139,12008,15138,12008,15137,12007,15135,12003,15130,11990,15124,11969,15115,11929,15102,11872,15086,11794,15064,11693,15041,11581,15013,11459,14987,11336,14966,11170,14944,10944,14921,10738,14898,10552,14875,10387,14850,10239,14824,9983,14794,9758,14762,9563,14728,9392,14692,9244,14653,9014,14611,8791,14569,8597,14526,8427,14481,8281,14436,8110,14391,7885,15188,11617,15188,11617,15187,11617,15186,11618,15183,11617,15179,11612,15173,11601,15163,11581,15150,11546,15133,11495,15110,11427,15083,11346,15051,11246,15024,11057,14996,10868,14967,10687,14938,10517,14911,10362,14882,10206,14853,9956,14821,9737,14787,9543,14752,9375,14715,9228,14675,8980,14632,8760,14589,8565,14544,8395,14498,8248,14451,8049,14404,7824,14357,7630,15228,11298,15228,11298,15227,11299,15226,11301,15223,11303,15219,11302,15213,11299,15204,11290,15191,11271,15174,11217,15150,11129,15119,11015,15087,10886,15057,10744,15024,10599,14990,10455,14957,10318,14924,10143,14891,9911,14856,9701,14820,9516,14782,9352,14744,9200,14703,8946,14659,8725,14615,8533,14568,8366,14521,8220,14472,7992,14423,7770,14374,7578,14315,7408,15260,10819,15260,10819,15259,10822,15258,10826,15256,10832,15251,10836,15246,10841,15237,10838,15225,10821,15207,10788,15183,10734,15151,10660,15120,10571,15087,10469,15049,10359,15012,10249,14974,10041,14937,9837,14900,9647,14860,9475,14820,9320,14779,9147,14736,8902,14691,8688,14646,8499,14598,8335,14549,8189,14499,7940,14448,7720,14397,7529,14347,7363,14256,7218,15285,10410,15285,10411,15285,10413,15284,10418,15282,10425,15278,10434,15272,10442,15264,10449,15252,10445,15235,10433,15210,10403,15179,10358,15149,10301,15113,10218,15073,10059,15033,9894,14991,9726,14951,9565,14909,9413,14865,9273,14822,9073,14777,8845,14730,8641,14682,8459,14633,8300,14583,8129,14531,7883,14479,7670,14426,7482,14373,7321,14305,7176,14201,6939,15305,9939,15305,9940,15305,9945,15304,9955,15302,9967,15298,9989,15293,10010,15286,10033,15274,10044,15258,10045,15233,10022,15205,9975,15174,9903,15136,9808,15095,9697,15053,9578,15009,9451,14965,9327,14918,9198,14871,8973,14825,8766,14775,8579,14725,8408,14675,8259,14622,8058,14569,7821,14515,7615,14460,7435,14405,7276,14350,7108,14256,6866,14149,6653,15321,9444,15321,9445,15321,9448,15320,9458,15317,9470,15314,9490,15310,9515,15302,9540,15292,9562,15276,9579,15251,9577,15226,9559,15195,9519,15156,9463,15116,9389,15071,9304,15025,9208,14978,9023,14927,8838,14878,8661,14827,8496,14774,8344,14722,8206,14667,7973,14612,7749,14556,7555,14499,7382,14443,7229,14385,7025,14322,6791,14210,6588,14100,6409,15333,8920,15333,8921,15332,8927,15332,8943,15329,8965,15326,9002,15322,9048,15316,9106,15307,9162,15291,9204,15267,9221,15244,9221,15212,9196,15175,9134,15133,9043,15088,8930,15040,8801,14990,8665,14938,8526,14886,8391,14830,8261,14775,8087,14719,7866,14661,7664,14603,7482,14544,7322,14485,7178,14426,6936,14367,6713,14281,6517,14166,6348,14054,6198,15341,8360,15341,8361,15341,8366,15341,8379,15339,8399,15336,8431,15332,8473,15326,8527,15318,8585,15302,8632,15281,8670,15258,8690,15227,8690,15191,8664,15149,8612,15104,8543,15055,8456,15001,8360,14948,8259,14892,8122,14834,7923,14776,7734,14716,7558,14656,7397,14595,7250,14534,7070,14472,6835,14410,6628,14350,6443,14243,6283,14125,6135,14010,5889,15348,7715,15348,7717,15348,7725,15347,7745,15345,7780,15343,7836,15339,7905,15334,8e3,15326,8103,15310,8193,15293,8239,15270,8270,15240,8287,15204,8283,15163,8260,15118,8223,15067,8143,15014,8014,14958,7873,14899,7723,14839,7573,14778,7430,14715,7293,14652,7164,14588,6931,14524,6720,14460,6531,14396,6362,14330,6210,14207,6015,14086,5781,13969,5576,15352,7114,15352,7116,15352,7128,15352,7159,15350,7195,15348,7237,15345,7299,15340,7374,15332,7457,15317,7544,15301,7633,15280,7703,15251,7754,15216,7775,15176,7767,15131,7733,15079,7670,15026,7588,14967,7492,14906,7387,14844,7278,14779,7171,14714,6965,14648,6770,14581,6587,14515,6420,14448,6269,14382,6123,14299,5881,14172,5665,14049,5477,13929,5310,15355,6329,15355,6330,15355,6339,15355,6362,15353,6410,15351,6472,15349,6572,15344,6688,15337,6835,15323,6985,15309,7142,15287,7220,15260,7277,15226,7310,15188,7326,15142,7318,15090,7285,15036,7239,14976,7177,14914,7045,14849,6892,14782,6736,14714,6581,14645,6433,14576,6293,14506,6164,14438,5946,14369,5733,14270,5540,14140,5369,14014,5216,13892,5043,15357,5483,15357,5484,15357,5496,15357,5528,15356,5597,15354,5692,15351,5835,15347,6011,15339,6195,15328,6317,15314,6446,15293,6566,15268,6668,15235,6746,15197,6796,15152,6811,15101,6790,15046,6748,14985,6673,14921,6583,14854,6479,14785,6371,14714,6259,14643,6149,14571,5946,14499,5750,14428,5567,14358,5401,14242,5250,14109,5111,13980,4870,13856,4657,15359,4555,15359,4557,15358,4573,15358,4633,15357,4715,15355,4841,15353,5061,15349,5216,15342,5391,15331,5577,15318,5770,15299,5967,15274,6150,15243,6223,15206,6280,15161,6310,15111,6317,15055,6300,14994,6262,14928,6208,14860,6141,14788,5994,14715,5838,14641,5684,14566,5529,14492,5384,14418,5247,14346,5121,14216,4892,14079,4682,13948,4496,13822,4330,15359,3498,15359,3501,15359,3520,15359,3598,15358,3719,15356,3860,15355,4137,15351,4305,15344,4563,15334,4809,15321,5116,15303,5273,15280,5418,15250,5547,15214,5653,15170,5722,15120,5761,15064,5763,15002,5733,14935,5673,14865,5597,14792,5504,14716,5400,14640,5294,14563,5185,14486,5041,14410,4841,14335,4655,14191,4482,14051,4325,13918,4183,13790,4012,15360,2282,15360,2285,15360,2306,15360,2401,15359,2547,15357,2748,15355,3103,15352,3349,15345,3675,15336,4020,15324,4272,15307,4496,15285,4716,15255,4908,15220,5086,15178,5170,15128,5214,15072,5234,15010,5231,14943,5206,14871,5166,14796,5102,14718,4971,14639,4833,14559,4687,14480,4541,14402,4401,14315,4268,14167,4142,14025,3958,13888,3747,13759,3556,15360,923,15360,925,15360,946,15360,1052,15359,1214,15357,1494,15356,1892,15352,2274,15346,2663,15338,3099,15326,3393,15309,3679,15288,3980,15260,4183,15226,4325,15185,4437,15136,4517,15080,4570,15018,4591,14950,4581,14877,4545,14800,4485,14720,4411,14638,4325,14556,4231,14475,4136,14395,3988,14297,3803,14145,3628,13999,3465,13861,3314,13729,3177,15360,263,15360,264,15360,272,15360,325,15359,407,15358,548,15356,780,15352,1144,15347,1580,15339,2099,15328,2425,15312,2795,15292,3133,15264,3329,15232,3517,15191,3689,15143,3819,15088,3923,15025,3978,14956,3999,14882,3979,14804,3931,14722,3855,14639,3756,14554,3645,14470,3529,14388,3409,14279,3289,14124,3173,13975,3055,13834,2848,13701,2658,15360,49,15360,49,15360,52,15360,75,15359,111,15358,201,15356,283,15353,519,15348,726,15340,1045,15329,1415,15314,1795,15295,2173,15269,2410,15237,2649,15197,2866,15150,3054,15095,3140,15032,3196,14963,3228,14888,3236,14808,3224,14725,3191,14639,3146,14553,3088,14466,2976,14382,2836,14262,2692,14103,2549,13952,2409,13808,2278,13674,2154,15360,4,15360,4,15360,4,15360,13,15359,33,15358,59,15357,112,15353,199,15348,302,15341,456,15331,628,15316,827,15297,1082,15272,1332,15241,1601,15202,1851,15156,2069,15101,2172,15039,2256,14970,2314,14894,2348,14813,2358,14728,2344,14640,2311,14551,2263,14463,2203,14376,2133,14247,2059,14084,1915,13930,1761,13784,1609,13648,1464,15360,0,15360,0,15360,0,15360,3,15359,18,15358,26,15357,53,15354,80,15348,97,15341,165,15332,238,15318,326,15299,427,15275,529,15245,654,15207,771,15161,885,15108,994,15046,1089,14976,1170,14900,1229,14817,1266,14731,1284,14641,1282,14550,1260,14460,1223,14370,1174,14232,1116,14066,1050,13909,981,13761,910,13623,839]);let Ri=null;function w3(){return Ri===null&&(Ri=new ys(M3,32,32,bc,un),Ri.minFilter=Pt,Ri.magFilter=Pt,Ri.wrapS=Un,Ri.wrapT=Un,Ri.generateMipmaps=!1,Ri.needsUpdate=!0),Ri}class au{constructor(e={}){const{canvas:t=ix(),context:n=null,depth:i=!0,stencil:r=!1,alpha:a=!1,antialias:o=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:h="default",failIfMajorPerformanceCaveat:u=!1,reversedDepthBuffer:p=!1}=e;this.isWebGLRenderer=!0;let d;if(n!==null){if(typeof WebGLRenderingContext<"u"&&n instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");d=n.getContextAttributes().alpha}else d=a;const m=new Set([_c,yc,vc]),f=new Set([$n,ps,Kr,fs,gc,xc]),x=new Uint32Array(4),g=new Int32Array(4);let b=null,v=null;const y=[],_=[];this.domElement=t,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.toneMapping=Fi,this.toneMappingExposure=1,this.transmissionResolutionScale=1;const M=this;let C=!1;this._outputColorSpace=Rt;let R=0,S=0,E=null,L=-1,A=null;const I=new tt,w=new tt;let z=null;const G=new Fe(0);let j=0,Y=t.width,q=t.height,ie=1,W=null,$=null;const fe=new tt(0,0,Y,q),me=new tt(0,0,Y,q);let de=!1;const se=new Rh;let ce=!1,pe=!1;const be=new De,Se=new P,Be=new tt,Je={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let ke=!1;function T(){return E===null?ie:1}let N=n;function V(O,Q){return t.getContext(O,Q)}try{const O={alpha:!0,depth:i,stencil:r,antialias:o,premultipliedAlpha:l,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:u};if("setAttribute"in t&&t.setAttribute("data-engine",`three.js r${Yr}`),t.addEventListener("webglcontextlost",ve,!1),t.addEventListener("webglcontextrestored",ge,!1),t.addEventListener("webglcontextcreationerror",Oe,!1),N===null){const Q="webgl2";if(N=V(Q,O),N===null)throw V(Q)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(O){throw O("WebGLRenderer: "+O.message),O}let U,k,F,ee,J,X,B,D,H,K,le,te,Te,ye,Re,Ie,ue,_e,Ve,Ue,Ae,Ge,Z,Ce;function Me(){U=new Dy(N),U.init(),Ge=new f3(N,U),k=new wy(N,U,e,Ge),F=new d3(N,U),k.reversedDepthBuffer&&p&&F.buffers.depth.setReversed(!0),ee=new By(N),J=new Q2,X=new p3(N,U,F,J,k,Ge,ee),B=new Ey(M),D=new Ly(M),H=new bv(N),Z=new _y(N,H),K=new Iy(N,H,ee,Z),le=new Uy(N,K,H,ee),Ve=new ky(N,k,X),Ie=new Sy(J),te=new J2(M,B,D,U,k,Z,Ie),Te=new y3(M,J),ye=new t3,Re=new o3(U),_e=new yy(M,B,D,F,le,d,l),ue=new h3(M,le,k),Ce=new _3(N,ee,k,F),Ue=new My(N,U,ee),Ae=new Ny(N,U,ee),ee.programs=te.programs,M.capabilities=k,M.extensions=U,M.properties=J,M.renderLists=ye,M.shadowMap=ue,M.state=F,M.info=ee}Me();const we=new v3(M,N);this.xr=we,this.getContext=function(){return N},this.getContextAttributes=function(){return N.getContextAttributes()},this.forceContextLoss=function(){const O=U.get("WEBGL_lose_context");O&&O.loseContext()},this.forceContextRestore=function(){const O=U.get("WEBGL_lose_context");O&&O.restoreContext()},this.getPixelRatio=function(){return ie},this.setPixelRatio=function(O){O!==void 0&&(ie=O,this.setSize(Y,q,!1))},this.getSize=function(O){return O.set(Y,q)},this.setSize=function(O,Q,ae=!0){if(we.isPresenting){He("WebGLRenderer: Can't change size while VR device is presenting.");return}Y=O,q=Q,t.width=Math.floor(O*ie),t.height=Math.floor(Q*ie),ae===!0&&(t.style.width=O+"px",t.style.height=Q+"px"),this.setViewport(0,0,O,Q)},this.getDrawingBufferSize=function(O){return O.set(Y*ie,q*ie).floor()},this.setDrawingBufferSize=function(O,Q,ae){Y=O,q=Q,ie=ae,t.width=Math.floor(O*ae),t.height=Math.floor(Q*ae),this.setViewport(0,0,O,Q)},this.getCurrentViewport=function(O){return O.copy(I)},this.getViewport=function(O){return O.copy(fe)},this.setViewport=function(O,Q,ae,oe){O.isVector4?fe.set(O.x,O.y,O.z,O.w):fe.set(O,Q,ae,oe),F.viewport(I.copy(fe).multiplyScalar(ie).round())},this.getScissor=function(O){return O.copy(me)},this.setScissor=function(O,Q,ae,oe){O.isVector4?me.set(O.x,O.y,O.z,O.w):me.set(O,Q,ae,oe),F.scissor(w.copy(me).multiplyScalar(ie).round())},this.getScissorTest=function(){return de},this.setScissorTest=function(O){F.setScissorTest(de=O)},this.setOpaqueSort=function(O){W=O},this.setTransparentSort=function(O){$=O},this.getClearColor=function(O){return O.copy(_e.getClearColor())},this.setClearColor=function(){_e.setClearColor(...arguments)},this.getClearAlpha=function(){return _e.getClearAlpha()},this.setClearAlpha=function(){_e.setClearAlpha(...arguments)},this.clear=function(O=!0,Q=!0,ae=!0){let oe=0;if(O){let ne=!1;if(E!==null){const Ee=E.texture.format;ne=m.has(Ee)}if(ne){const Ee=E.texture.type,Le=f.has(Ee),ze=_e.getClearColor(),Ne=_e.getClearAlpha(),je=ze.r,Ze=ze.g,We=ze.b;Le?(x[0]=je,x[1]=Ze,x[2]=We,x[3]=Ne,N.clearBufferuiv(N.COLOR,0,x)):(g[0]=je,g[1]=Ze,g[2]=We,g[3]=Ne,N.clearBufferiv(N.COLOR,0,g))}else oe|=N.COLOR_BUFFER_BIT}Q&&(oe|=N.DEPTH_BUFFER_BIT),ae&&(oe|=N.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),N.clear(oe)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){t.removeEventListener("webglcontextlost",ve,!1),t.removeEventListener("webglcontextrestored",ge,!1),t.removeEventListener("webglcontextcreationerror",Oe,!1),_e.dispose(),ye.dispose(),Re.dispose(),J.dispose(),B.dispose(),D.dispose(),le.dispose(),Z.dispose(),Ce.dispose(),te.dispose(),we.dispose(),we.removeEventListener("sessionstart",cg),we.removeEventListener("sessionend",hg),Ws.stop()};function ve(O){O.preventDefault(),lo("WebGLRenderer: Context Lost."),C=!0}function ge(){lo("WebGLRenderer: Context Restored."),C=!1;const O=ee.autoReset,Q=ue.enabled,ae=ue.autoUpdate,oe=ue.needsUpdate,ne=ue.type;Me(),ee.autoReset=O,ue.enabled=Q,ue.autoUpdate=ae,ue.needsUpdate=oe,ue.type=ne}function Oe(O){Qe("WebGLRenderer: A WebGL context could not be created. Reason: ",O.statusMessage)}function Ye(O){const Q=O.target;Q.removeEventListener("dispose",Ye),wt(Q)}function wt(O){ft(O),J.remove(O)}function ft(O){const Q=J.get(O).programs;Q!==void 0&&(Q.forEach(function(ae){te.releaseProgram(ae)}),O.isShaderMaterial&&te.releaseShaderCache(O))}this.renderBufferDirect=function(O,Q,ae,oe,ne,Ee){Q===null&&(Q=Je);const Le=ne.isMesh&&ne.matrixWorld.determinant()<0,ze=fT(O,Q,ae,oe,ne);F.setMaterial(oe,Le);let Ne=ae.index,je=1;if(oe.wireframe===!0){if(Ne=K.getWireframeAttribute(ae),Ne===void 0)return;je=2}const Ze=ae.drawRange,We=ae.attributes.position;let st=Ze.start*je,mt=(Ze.start+Ze.count)*je;Ee!==null&&(st=Math.max(st,Ee.start*je),mt=Math.min(mt,(Ee.start+Ee.count)*je)),Ne!==null?(st=Math.max(st,0),mt=Math.min(mt,Ne.count)):We!=null&&(st=Math.max(st,0),mt=Math.min(mt,We.count));const Bt=mt-st;if(Bt<0||Bt===1/0)return;Z.setup(ne,oe,ze,ae,Ne);let kt,xt=Ue;if(Ne!==null&&(kt=H.get(Ne),xt=Ae,xt.setIndex(kt)),ne.isMesh)oe.wireframe===!0?(F.setLineWidth(oe.wireframeLinewidth*T()),xt.setMode(N.LINES)):xt.setMode(N.TRIANGLES);else if(ne.isLine){let Xe=oe.linewidth;Xe===void 0&&(Xe=1),F.setLineWidth(Xe*T()),ne.isLineSegments?xt.setMode(N.LINES):ne.isLineLoop?xt.setMode(N.LINE_LOOP):xt.setMode(N.LINE_STRIP)}else ne.isPoints?xt.setMode(N.POINTS):ne.isSprite&&xt.setMode(N.TRIANGLES);if(ne.isBatchedMesh)if(ne._multiDrawInstances!==null)na("WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),xt.renderMultiDrawInstances(ne._multiDrawStarts,ne._multiDrawCounts,ne._multiDrawCount,ne._multiDrawInstances);else if(U.get("WEBGL_multi_draw"))xt.renderMultiDraw(ne._multiDrawStarts,ne._multiDrawCounts,ne._multiDrawCount);else{const Xe=ne._multiDrawStarts,Tt=ne._multiDrawCounts,lt=ne._multiDrawCount,Nn=Ne?H.get(Ne).bytesPerElement:1,qr=J.get(oe).currentProgram.getUniforms();for(let Bn=0;Bn{function Ee(){if(oe.forEach(function(Le){J.get(Le).currentProgram.isReady()&&oe.delete(Le)}),oe.size===0){ne(O);return}setTimeout(Ee,10)}U.get("KHR_parallel_shader_compile")!==null?Ee():setTimeout(Ee,10)})};let ri=null;function pT(O){ri&&ri(O)}function cg(){Ws.stop()}function hg(){Ws.start()}const Ws=new yf;Ws.setAnimationLoop(pT),typeof self<"u"&&Ws.setContext(self),this.setAnimationLoop=function(O){ri=O,we.setAnimationLoop(O),O===null?Ws.stop():Ws.start()},we.addEventListener("sessionstart",cg),we.addEventListener("sessionend",hg),this.render=function(O,Q){if(Q!==void 0&&Q.isCamera!==!0){Qe("WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(C===!0)return;if(O.matrixWorldAutoUpdate===!0&&O.updateMatrixWorld(),Q.parent===null&&Q.matrixWorldAutoUpdate===!0&&Q.updateMatrixWorld(),we.enabled===!0&&we.isPresenting===!0&&(we.cameraAutoUpdate===!0&&we.updateCamera(Q),Q=we.getCamera()),O.isScene===!0&&O.onBeforeRender(M,O,Q,E),v=Re.get(O,_.length),v.init(Q),_.push(v),be.multiplyMatrices(Q.projectionMatrix,Q.matrixWorldInverse),se.setFromProjectionMatrix(be,oi,Q.reversedDepth),pe=this.localClippingEnabled,ce=Ie.init(this.clippingPlanes,pe),b=ye.get(O,y.length),b.init(),y.push(b),we.enabled===!0&&we.isPresenting===!0){const Ee=M.xr.getDepthSensingMesh();Ee!==null&&yd(Ee,Q,-1/0,M.sortObjects)}yd(O,Q,0,M.sortObjects),b.finish(),M.sortObjects===!0&&b.sort(W,$),ke=we.enabled===!1||we.isPresenting===!1||we.hasDepthSensing()===!1,ke&&_e.addToRenderList(b,O),this.info.render.frame++,ce===!0&&Ie.beginShadows();const ae=v.state.shadowsArray;ue.render(ae,O,Q),ce===!0&&Ie.endShadows(),this.info.autoReset===!0&&this.info.reset();const oe=b.opaque,ne=b.transmissive;if(v.setupLights(),Q.isArrayCamera){const Ee=Q.cameras;if(ne.length>0)for(let Le=0,ze=Ee.length;Le0&&dg(oe,ne,O,Q),ke&&_e.render(O),ug(b,O,Q);E!==null&&S===0&&(X.updateMultisampleRenderTarget(E),X.updateRenderTargetMipmap(E)),O.isScene===!0&&O.onAfterRender(M,O,Q),Z.resetDefaultState(),L=-1,A=null,_.pop(),_.length>0?(v=_[_.length-1],ce===!0&&Ie.setGlobalState(M.clippingPlanes,v.state.camera)):v=null,y.pop(),y.length>0?b=y[y.length-1]:b=null};function yd(O,Q,ae,oe){if(O.visible===!1)return;if(O.layers.test(Q.layers)){if(O.isGroup)ae=O.renderOrder;else if(O.isLOD)O.autoUpdate===!0&&O.update(Q);else if(O.isLight)v.pushLight(O),O.castShadow&&v.pushShadow(O);else if(O.isSprite){if(!O.frustumCulled||se.intersectsSprite(O)){oe&&Be.setFromMatrixPosition(O.matrixWorld).applyMatrix4(be);const Le=le.update(O),ze=O.material;ze.visible&&b.push(O,Le,ze,ae,Be.z,null)}}else if((O.isMesh||O.isLine||O.isPoints)&&(!O.frustumCulled||se.intersectsObject(O))){const Le=le.update(O),ze=O.material;if(oe&&(O.boundingSphere!==void 0?(O.boundingSphere===null&&O.computeBoundingSphere(),Be.copy(O.boundingSphere.center)):(Le.boundingSphere===null&&Le.computeBoundingSphere(),Be.copy(Le.boundingSphere.center)),Be.applyMatrix4(O.matrixWorld).applyMatrix4(be)),Array.isArray(ze)){const Ne=Le.groups;for(let je=0,Ze=Ne.length;je0&&Ql(ne,Q,ae),Ee.length>0&&Ql(Ee,Q,ae),Le.length>0&&Ql(Le,Q,ae),F.buffers.depth.setTest(!0),F.buffers.depth.setMask(!0),F.buffers.color.setMask(!0),F.setPolygonOffset(!1)}function dg(O,Q,ae,oe){if((ae.isScene===!0?ae.overrideMaterial:null)!==null)return;v.state.transmissionRenderTarget[oe.id]===void 0&&(v.state.transmissionRenderTarget[oe.id]=new Tn(1,1,{generateMipmaps:!0,type:U.has("EXT_color_buffer_half_float")||U.has("EXT_color_buffer_float")?un:$n,minFilter:ai,samples:4,stencilBuffer:r,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:it.workingColorSpace}));const Ee=v.state.transmissionRenderTarget[oe.id],Le=oe.viewport||I;Ee.setSize(Le.z*M.transmissionResolutionScale,Le.w*M.transmissionResolutionScale);const ze=M.getRenderTarget(),Ne=M.getActiveCubeFace(),je=M.getActiveMipmapLevel();M.setRenderTarget(Ee),M.getClearColor(G),j=M.getClearAlpha(),j<1&&M.setClearColor(16777215,.5),M.clear(),ke&&_e.render(ae);const Ze=M.toneMapping;M.toneMapping=Fi;const We=oe.viewport;if(oe.viewport!==void 0&&(oe.viewport=void 0),v.setupLightsView(oe),ce===!0&&Ie.setGlobalState(M.clippingPlanes,oe),Ql(O,ae,oe),X.updateMultisampleRenderTarget(Ee),X.updateRenderTargetMipmap(Ee),U.has("WEBGL_multisampled_render_to_texture")===!1){let st=!1;for(let mt=0,Bt=Q.length;mt0),We=!!ae.morphAttributes.position,st=!!ae.morphAttributes.normal,mt=!!ae.morphAttributes.color;let Bt=Fi;oe.toneMapped&&(E===null||E.isXRRenderTarget===!0)&&(Bt=M.toneMapping);const kt=ae.morphAttributes.position||ae.morphAttributes.normal||ae.morphAttributes.color,xt=kt!==void 0?kt.length:0,Xe=J.get(oe),Tt=v.state.lights;if(ce===!0&&(pe===!0||O!==A)){const xn=O===A&&oe.id===L;Ie.setState(oe,O,xn)}let lt=!1;oe.version===Xe.__version?(Xe.needsLights&&Xe.lightsStateVersion!==Tt.state.version||Xe.outputColorSpace!==ze||ne.isBatchedMesh&&Xe.batching===!1||!ne.isBatchedMesh&&Xe.batching===!0||ne.isBatchedMesh&&Xe.batchingColor===!0&&ne.colorTexture===null||ne.isBatchedMesh&&Xe.batchingColor===!1&&ne.colorTexture!==null||ne.isInstancedMesh&&Xe.instancing===!1||!ne.isInstancedMesh&&Xe.instancing===!0||ne.isSkinnedMesh&&Xe.skinning===!1||!ne.isSkinnedMesh&&Xe.skinning===!0||ne.isInstancedMesh&&Xe.instancingColor===!0&&ne.instanceColor===null||ne.isInstancedMesh&&Xe.instancingColor===!1&&ne.instanceColor!==null||ne.isInstancedMesh&&Xe.instancingMorph===!0&&ne.morphTexture===null||ne.isInstancedMesh&&Xe.instancingMorph===!1&&ne.morphTexture!==null||Xe.envMap!==Ne||oe.fog===!0&&Xe.fog!==Ee||Xe.numClippingPlanes!==void 0&&(Xe.numClippingPlanes!==Ie.numPlanes||Xe.numIntersection!==Ie.numIntersection)||Xe.vertexAlphas!==je||Xe.vertexTangents!==Ze||Xe.morphTargets!==We||Xe.morphNormals!==st||Xe.morphColors!==mt||Xe.toneMapping!==Bt||Xe.morphTargetsCount!==xt)&&(lt=!0):(lt=!0,Xe.__version=oe.version);let Nn=Xe.currentProgram;lt===!0&&(Nn=ec(oe,Q,ne));let qr=!1,Bn=!1,qa=!1;const At=Nn.getUniforms(),wn=Xe.uniforms;if(F.useProgram(Nn.program)&&(qr=!0,Bn=!0,qa=!0),oe.id!==L&&(L=oe.id,Bn=!0),qr||A!==O){F.buffers.depth.getReversed()&&O.reversedDepth!==!0&&(O._reversedDepth=!0,O.updateProjectionMatrix()),At.setValue(N,"projectionMatrix",O.projectionMatrix),At.setValue(N,"viewMatrix",O.matrixWorldInverse);const Sn=At.map.cameraPosition;Sn!==void 0&&Sn.setValue(N,Se.setFromMatrixPosition(O.matrixWorld)),k.logarithmicDepthBuffer&&At.setValue(N,"logDepthBufFC",2/(Math.log(O.far+1)/Math.LN2)),(oe.isMeshPhongMaterial||oe.isMeshToonMaterial||oe.isMeshLambertMaterial||oe.isMeshBasicMaterial||oe.isMeshStandardMaterial||oe.isShaderMaterial)&&At.setValue(N,"isOrthographic",O.isOrthographicCamera===!0),A!==O&&(A=O,Bn=!0,qa=!0)}if(ne.isSkinnedMesh){At.setOptional(N,ne,"bindMatrix"),At.setOptional(N,ne,"bindMatrixInverse");const xn=ne.skeleton;xn&&(xn.boneTexture===null&&xn.computeBoneTexture(),At.setValue(N,"boneTexture",xn.boneTexture,X))}ne.isBatchedMesh&&(At.setOptional(N,ne,"batchingTexture"),At.setValue(N,"batchingTexture",ne._matricesTexture,X),At.setOptional(N,ne,"batchingIdTexture"),At.setValue(N,"batchingIdTexture",ne._indirectTexture,X),At.setOptional(N,ne,"batchingColorTexture"),ne._colorsTexture!==null&&At.setValue(N,"batchingColorTexture",ne._colorsTexture,X));const Yn=ae.morphAttributes;if((Yn.position!==void 0||Yn.normal!==void 0||Yn.color!==void 0)&&Ve.update(ne,ae,Nn),(Bn||Xe.receiveShadow!==ne.receiveShadow)&&(Xe.receiveShadow=ne.receiveShadow,At.setValue(N,"receiveShadow",ne.receiveShadow)),oe.isMeshGouraudMaterial&&oe.envMap!==null&&(wn.envMap.value=Ne,wn.flipEnvMap.value=Ne.isCubeTexture&&Ne.isRenderTargetTexture===!1?-1:1),oe.isMeshStandardMaterial&&oe.envMap===null&&Q.environment!==null&&(wn.envMapIntensity.value=Q.environmentIntensity),wn.dfgLUT!==void 0&&(wn.dfgLUT.value=w3()),Bn&&(At.setValue(N,"toneMappingExposure",M.toneMappingExposure),Xe.needsLights&&mT(wn,qa),Ee&&oe.fog===!0&&Te.refreshFogUniforms(wn,Ee),Te.refreshMaterialUniforms(wn,oe,ie,q,v.state.transmissionRenderTarget[O.id]),Ko.upload(N,fg(Xe),wn,X)),oe.isShaderMaterial&&oe.uniformsNeedUpdate===!0&&(Ko.upload(N,fg(Xe),wn,X),oe.uniformsNeedUpdate=!1),oe.isSpriteMaterial&&At.setValue(N,"center",ne.center),At.setValue(N,"modelViewMatrix",ne.modelViewMatrix),At.setValue(N,"normalMatrix",ne.normalMatrix),At.setValue(N,"modelMatrix",ne.matrixWorld),oe.isShaderMaterial||oe.isRawShaderMaterial){const xn=oe.uniformsGroups;for(let Sn=0,_d=xn.length;Sn<_d;Sn++){const Xs=xn[Sn];Ce.update(Xs,Nn),Ce.bind(Xs,Nn)}}return Nn}function mT(O,Q){O.ambientLightColor.needsUpdate=Q,O.lightProbe.needsUpdate=Q,O.directionalLights.needsUpdate=Q,O.directionalLightShadows.needsUpdate=Q,O.pointLights.needsUpdate=Q,O.pointLightShadows.needsUpdate=Q,O.spotLights.needsUpdate=Q,O.spotLightShadows.needsUpdate=Q,O.rectAreaLights.needsUpdate=Q,O.hemisphereLights.needsUpdate=Q}function gT(O){return O.isMeshLambertMaterial||O.isMeshToonMaterial||O.isMeshPhongMaterial||O.isMeshStandardMaterial||O.isShadowMaterial||O.isShaderMaterial&&O.lights===!0}this.getActiveCubeFace=function(){return R},this.getActiveMipmapLevel=function(){return S},this.getRenderTarget=function(){return E},this.setRenderTargetTextures=function(O,Q,ae){const oe=J.get(O);oe.__autoAllocateDepthBuffer=O.resolveDepthBuffer===!1,oe.__autoAllocateDepthBuffer===!1&&(oe.__useRenderToTexture=!1),J.get(O.texture).__webglTexture=Q,J.get(O.depthTexture).__webglTexture=oe.__autoAllocateDepthBuffer?void 0:ae,oe.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(O,Q){const ae=J.get(O);ae.__webglFramebuffer=Q,ae.__useDefaultFramebuffer=Q===void 0};const xT=N.createFramebuffer();this.setRenderTarget=function(O,Q=0,ae=0){E=O,R=Q,S=ae;let oe=!0,ne=null,Ee=!1,Le=!1;if(O){const Ne=J.get(O);if(Ne.__useDefaultFramebuffer!==void 0)F.bindFramebuffer(N.FRAMEBUFFER,null),oe=!1;else if(Ne.__webglFramebuffer===void 0)X.setupRenderTarget(O);else if(Ne.__hasExternalTextures)X.rebindTextures(O,J.get(O.texture).__webglTexture,J.get(O.depthTexture).__webglTexture);else if(O.depthBuffer){const We=O.depthTexture;if(Ne.__boundDepthTexture!==We){if(We!==null&&J.has(We)&&(O.width!==We.image.width||O.height!==We.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");X.setupDepthRenderbuffer(O)}}const je=O.texture;(je.isData3DTexture||je.isDataArrayTexture||je.isCompressedArrayTexture)&&(Le=!0);const Ze=J.get(O).__webglFramebuffer;O.isWebGLCubeRenderTarget?(Array.isArray(Ze[Q])?ne=Ze[Q][ae]:ne=Ze[Q],Ee=!0):O.samples>0&&X.useMultisampledRTT(O)===!1?ne=J.get(O).__webglMultisampledFramebuffer:Array.isArray(Ze)?ne=Ze[ae]:ne=Ze,I.copy(O.viewport),w.copy(O.scissor),z=O.scissorTest}else I.copy(fe).multiplyScalar(ie).floor(),w.copy(me).multiplyScalar(ie).floor(),z=de;if(ae!==0&&(ne=xT),F.bindFramebuffer(N.FRAMEBUFFER,ne)&&oe&&F.drawBuffers(O,ne),F.viewport(I),F.scissor(w),F.setScissorTest(z),Ee){const Ne=J.get(O.texture);N.framebufferTexture2D(N.FRAMEBUFFER,N.COLOR_ATTACHMENT0,N.TEXTURE_CUBE_MAP_POSITIVE_X+Q,Ne.__webglTexture,ae)}else if(Le){const Ne=Q;for(let je=0;je=0&&Q<=O.width-oe&&ae>=0&&ae<=O.height-ne&&(O.textures.length>1&&N.readBuffer(N.COLOR_ATTACHMENT0+ze),N.readPixels(Q,ae,oe,ne,Ge.convert(Ze),Ge.convert(We),Ee))}finally{const je=E!==null?J.get(E).__webglFramebuffer:null;F.bindFramebuffer(N.FRAMEBUFFER,je)}}},this.readRenderTargetPixelsAsync=async function(O,Q,ae,oe,ne,Ee,Le,ze=0){if(!(O&&O.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let Ne=J.get(O).__webglFramebuffer;if(O.isWebGLCubeRenderTarget&&Le!==void 0&&(Ne=Ne[Le]),Ne)if(Q>=0&&Q<=O.width-oe&&ae>=0&&ae<=O.height-ne){F.bindFramebuffer(N.FRAMEBUFFER,Ne);const je=O.textures[ze],Ze=je.format,We=je.type;if(!k.textureFormatReadable(Ze))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!k.textureTypeReadable(We))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const st=N.createBuffer();N.bindBuffer(N.PIXEL_PACK_BUFFER,st),N.bufferData(N.PIXEL_PACK_BUFFER,Ee.byteLength,N.STREAM_READ),O.textures.length>1&&N.readBuffer(N.COLOR_ATTACHMENT0+ze),N.readPixels(Q,ae,oe,ne,Ge.convert(Ze),Ge.convert(We),0);const mt=E!==null?J.get(E).__webglFramebuffer:null;F.bindFramebuffer(N.FRAMEBUFFER,mt);const Bt=N.fenceSync(N.SYNC_GPU_COMMANDS_COMPLETE,0);return N.flush(),await sx(N,Bt,4),N.bindBuffer(N.PIXEL_PACK_BUFFER,st),N.getBufferSubData(N.PIXEL_PACK_BUFFER,0,Ee),N.deleteBuffer(st),N.deleteSync(Bt),Ee}else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")},this.copyFramebufferToTexture=function(O,Q=null,ae=0){const oe=Math.pow(2,-ae),ne=Math.floor(O.image.width*oe),Ee=Math.floor(O.image.height*oe),Le=Q!==null?Q.x:0,ze=Q!==null?Q.y:0;X.setTexture2D(O,0),N.copyTexSubImage2D(N.TEXTURE_2D,ae,0,0,Le,ze,ne,Ee),F.unbindTexture()};const vT=N.createFramebuffer(),bT=N.createFramebuffer();this.copyTextureToTexture=function(O,Q,ae=null,oe=null,ne=0,Ee=null){Ee===null&&(ne!==0?(na("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),Ee=ne,ne=0):Ee=0);let Le,ze,Ne,je,Ze,We,st,mt,Bt;const kt=O.isCompressedTexture?O.mipmaps[Ee]:O.image;if(ae!==null)Le=ae.max.x-ae.min.x,ze=ae.max.y-ae.min.y,Ne=ae.isBox3?ae.max.z-ae.min.z:1,je=ae.min.x,Ze=ae.min.y,We=ae.isBox3?ae.min.z:0;else{const Yn=Math.pow(2,-ne);Le=Math.floor(kt.width*Yn),ze=Math.floor(kt.height*Yn),O.isDataArrayTexture?Ne=kt.depth:O.isData3DTexture?Ne=Math.floor(kt.depth*Yn):Ne=1,je=0,Ze=0,We=0}oe!==null?(st=oe.x,mt=oe.y,Bt=oe.z):(st=0,mt=0,Bt=0);const xt=Ge.convert(Q.format),Xe=Ge.convert(Q.type);let Tt;Q.isData3DTexture?(X.setTexture3D(Q,0),Tt=N.TEXTURE_3D):Q.isDataArrayTexture||Q.isCompressedArrayTexture?(X.setTexture2DArray(Q,0),Tt=N.TEXTURE_2D_ARRAY):(X.setTexture2D(Q,0),Tt=N.TEXTURE_2D),N.pixelStorei(N.UNPACK_FLIP_Y_WEBGL,Q.flipY),N.pixelStorei(N.UNPACK_PREMULTIPLY_ALPHA_WEBGL,Q.premultiplyAlpha),N.pixelStorei(N.UNPACK_ALIGNMENT,Q.unpackAlignment);const lt=N.getParameter(N.UNPACK_ROW_LENGTH),Nn=N.getParameter(N.UNPACK_IMAGE_HEIGHT),qr=N.getParameter(N.UNPACK_SKIP_PIXELS),Bn=N.getParameter(N.UNPACK_SKIP_ROWS),qa=N.getParameter(N.UNPACK_SKIP_IMAGES);N.pixelStorei(N.UNPACK_ROW_LENGTH,kt.width),N.pixelStorei(N.UNPACK_IMAGE_HEIGHT,kt.height),N.pixelStorei(N.UNPACK_SKIP_PIXELS,je),N.pixelStorei(N.UNPACK_SKIP_ROWS,Ze),N.pixelStorei(N.UNPACK_SKIP_IMAGES,We);const At=O.isDataArrayTexture||O.isData3DTexture,wn=Q.isDataArrayTexture||Q.isData3DTexture;if(O.isDepthTexture){const Yn=J.get(O),xn=J.get(Q),Sn=J.get(Yn.__renderTarget),_d=J.get(xn.__renderTarget);F.bindFramebuffer(N.READ_FRAMEBUFFER,Sn.__webglFramebuffer),F.bindFramebuffer(N.DRAW_FRAMEBUFFER,_d.__webglFramebuffer);for(let Xs=0;XsMath.PI&&(n-=bn),i<-Math.PI?i+=bn:i>Math.PI&&(i-=bn),n<=i?this._spherical.theta=Math.max(n,Math.min(i,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(n+i)/2?Math.max(n,this._spherical.theta):Math.min(i,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let r=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const a=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),r=a!=this._spherical.radius}if(Gt.setFromSpherical(this._spherical),Gt.applyQuaternion(this._quatInverse),this.engine&&this.engine.DeviceType==="PC"){const a=new P;if(a.copy(this.origin).sub(this.target),a.lengthSq()>1e-4&&(this._sphericalDelta.theta!==0||this._sphericalDelta.phi!==0)){const o=this.enableDamping?this.dampingFactor*3:1,l=new P(0,1,0),c=new P;this.object.getWorldDirection(c);const h=c.clone().cross(l).normalize(),u=new P().copy(this.object.position).sub(this.origin);u.applyAxisAngle(l,Math.PI*this._sphericalDelta.theta*o),u.applyAxisAngle(h,Math.PI*this._sphericalDelta.phi*o),t.copy(this.origin).add(u);const p=new P().copy(this.target).sub(this.origin);p.applyAxisAngle(l,Math.PI*this._sphericalDelta.theta*o),p.applyAxisAngle(h,Math.PI*this._sphericalDelta.phi*o),this.target.copy(this.origin).add(p)}else if(this._panOffset.lengthSq()===0&&this._sphericalDelta.phi===0&&this._sphericalDelta.theta===0){if(this._scale!==1){const o=new P;this.object.getWorldDirection(o);const l=this._spherical.radius*.05*(this._scale-1);t.add(o.multiplyScalar(l))}}else t.copy(this.target).add(Gt);this.object.lookAt(this.target)}else t.copy(this.target).add(Gt),this.object.lookAt(this.target);if(this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let a=null;if(this.object.isPerspectiveCamera){const o=Gt.length();a=this._clampDistance(o*this._scale);const l=o-a;this.object.position.addScaledVector(this._dollyDirection,l),this.object.updateMatrixWorld(),r=!!l}else if(this.object.isOrthographicCamera){const o=new P(this._mouse.x,this._mouse.y,0);o.unproject(this.object);const l=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),r=l!==this.object.zoom;const c=new P(this._mouse.x,this._mouse.y,0);c.unproject(this.object),this.object.position.sub(c).add(o),this.object.updateMatrixWorld(),a=Gt.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;a!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(a).add(this.object.position):(Qo.origin.copy(this.object.position),Qo.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(Qo.direction))lu||8*(1-this._lastQuaternion.dot(this.object.quaternion))>lu||this._lastTargetPosition.distanceToSquared(this.target)>lu?(this.dispatchEvent(qf),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?bn/60*this.autoRotateSpeed*e:bn/60/60*this.autoRotateSpeed}_getZoomScale(e){const t=Math.abs(e*.01);return Math.pow(.95,this.zoomSpeed*t)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,t){Gt.setFromMatrixColumn(t,0),Gt.multiplyScalar(-e),this._panOffset.add(Gt)}_panUp(e,t){this.screenSpacePanning===!0?Gt.setFromMatrixColumn(t,1):(Gt.setFromMatrixColumn(t,0),Gt.crossVectors(this.object.up,Gt)),Gt.multiplyScalar(e),this._panOffset.add(Gt)}_pan(e,t){const n=this.domElement;if(this.object.isPerspectiveCamera){const i=this.object.position;Gt.copy(i).sub(this.target);let r=Gt.length();r*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*r/n.clientHeight,this.object.matrix),this._panUp(2*t*r/n.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/n.clientWidth,this.object.matrix),this._panUp(t*(this.object.top-this.object.bottom)/this.object.zoom/n.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(e,t){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const n=this.domElement.getBoundingClientRect(),i=e-n.left,r=t-n.top,a=n.width,o=n.height;this._mouse.x=i/a*2-1,this._mouse.y=-(r/o)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(bn*this._rotateDelta.x/t.clientHeight),this._rotateUp(bn*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY);let t;if(this.object.isOrthographicCamera)e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY!==0&&this._dollyOut(this._getZoomScale(e.deltaY));else{const n=Math.abs(e.deltaY*.01);t=Math.pow(1.15,this.zoomSpeed*n),e.deltaY>0?this._scale/=t:e.deltaY!==0&&(this._scale*=t)}this.update()}_handleKeyDown(e){let t=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(bn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),t=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(-bn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),t=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(bn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),t=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(-bn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),t=!0;break}t&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._rotateStart.set(n,i)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._panStart.set(n,i)}}_handleTouchStartDolly(e){const t=this._getSecondPointerPosition(e),n=e.pageX-t.x,i=e.pageY-t.y,r=Math.sqrt(n*n+i*i);this._dollyStart.set(0,r)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{const n=this._getSecondPointerPosition(e),i=.5*(e.pageX+n.x),r=.5*(e.pageY+n.y);this._rotateEnd.set(i,r)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(bn*this._rotateDelta.x/t.clientHeight),this._rotateUp(bn*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._panEnd.set(n,i)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){const t=this._getSecondPointerPosition(e),n=e.pageX-t.x,i=e.pageY-t.y,r=Math.sqrt(n*n+i*i);this._dollyEnd.set(0,r),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const a=(e.pageX+t.x)*.5,o=(e.pageY+t.y)*.5;this._updateZoomParameters(a,o)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let t=0;te}set colliders(e){this._rayCastObjects=e}set enabled(e){this._isEnabled!==e&&(this._isEnabled=e,this._euler.setFromQuaternion(this.camera.quaternion),e?this.addEvents():this.removeEvents())}get enabled(){return this._isEnabled}addEvents(){const e=this._Engine?.DeviceType,t=e==="PC"||!e;console.log("[FirstPersonCameraControl] addEvents - DeviceType:",e,"isPC:",t),t?(console.log("[FirstPersonCameraControl] 添加鼠标事件监听器 - mousedown, mouseup"),this.domElement.addEventListener("mousedown",this.bindmousedown,!1),this.domElement.addEventListener("mouseup",this.bindmouseup,!1)):(console.log("[FirstPersonCameraControl] 添加触摸事件监听器"),this.domElement.addEventListener("touchstart",this.bindmousedown,!1),this.domElement.addEventListener("touchend",this.bindmouseup,!1)),window.addEventListener("keydown",this.bindonKeyDown,!1),window.addEventListener("keyup",this.bindonKeyUp,!1),this.needMousewheel&&(document.addEventListener&&document.addEventListener("DOMMouseScroll",this.bindMousewheel,!1),window.addEventListener("mousewheel",this.bindMousewheel,!1))}removeEvents(){this._Engine&&this._Engine.DeviceType!=="PC"?(this.domElement.removeEventListener("touchstart",this.bindmousedown),this.domElement.removeEventListener("touchend",this.bindmouseup),this.domElement.removeEventListener("touchmove",this.bindmousemove)):(this.domElement.removeEventListener("mousedown",this.bindmousedown),this.domElement.removeEventListener("mouseup",this.bindmouseup),this.domElement.removeEventListener("mousemove",this.bindmousemove)),window.removeEventListener("keydown",this.bindonKeyDown),window.removeEventListener("keyup",this.bindonKeyUp),this.needMousewheel&&(document.addEventListener&&document.removeEventListener("DOMMouseScroll",this.bindMousewheel),window.removeEventListener("mousewheel",this.bindMousewheel))}onMousewheel(e){debugger;let t;switch(e.wheelDelta?(e.wheelDelta>0&&(t="up"),e.wheelDelta<0&&(t="down")):e.detail&&(e.detail<0&&(t="up"),e.detail>0&&(t="down")),t){case"up":this._camerLocalDirection.z=1;break;case"down":this._camerLocalDirection.z=-1;break}this.moveWheelRun==!0?(this.moveWheelRun=!1,this.moveWheelStop=!0,this.wheelClock=setTimeout(()=>{this.moveWheelStop==!0&&(this.moveWheelStop=!1,this.moveWheelRun=!0,this._camerLocalDirection.z=0)},200)):(clearTimeout(this.wheelClock),this.wheelClock=setTimeout(()=>{this.moveWheelStop==!0&&(this.moveWheelStop=!1,this.moveWheelRun=!0,this._camerLocalDirection.z=0)},150))}onMouseDown(e){console.log("[FirstPersonCameraControl] onMouseDown 被调用",e),this.domElement.addEventListener("mousemove",this.bindmousemove,!1),this._prevMouseX=e.screenX,this._prevMouseY=e.screenY}onMouseMove(e){if(this._isEnabled==!1)return;let t=this._prevMouseX?e.screenX-this._prevMouseX:0,n=this._prevMouseY?e.screenY-this._prevMouseY:0,i=this._euler.x-n*this.lookflag*this.lookSpeed;i>=0?i-this.maxRotateX?this._euler.x=i:this._euler.x=-this.maxRotateX,this._euler.y-=t*this.lookSpeed,this.camera.quaternion.setFromEuler(this._euler),this._prevMouseX=e.screenX,this._prevMouseY=e.screenY;let r=this.GetEngine();r.movefirst=!0;var a=new CustomEvent("bimengine:camerachange",{detail:""});window.dispatchEvent(a)}onMouseUp(e){let t=this.GetEngine();t.movefirst=!1,this.domElement.removeEventListener("mousemove",this.bindmousemove)}onTouchStart(e){this.domElement.addEventListener("touchmove",this.bindmousemove,!1),this._prevMouseX=e.targetTouches[0].clientX,this._prevMouseY=e.targetTouches[0].clientY}onTouchMove(e){if(this._isEnabled==!1)return;let t=this._prevMouseX?e.targetTouches[0].clientX-this._prevMouseX:0,n=this._prevMouseY?e.targetTouches[0].clientY-this._prevMouseY:0,i=this._euler.x-n*this.lookflag*this.lookSpeed;i>=0?i-this.maxRotateX?this._euler.x=i:this._euler.x=-this.maxRotateX,this._euler.y-=t*this.lookSpeed,this.camera.quaternion.setFromEuler(this._euler),this._prevMouseX=e.targetTouches[0].clientX,this._prevMouseY=e.targetTouches[0].clientY;let r=this.GetEngine();r.movefirst=!0;var a=new CustomEvent("bimengine:camerachange",{detail:""});window.dispatchEvent(a)}onTouchEnd(e){let t=this.GetEngine();t.movefirst=!1,this.domElement.removeEventListener("touchmove",this.bindmousemove)}onKeyDown(e){var t=new CustomEvent("bimengine:camerachange",{detail:""});let n=this.GetEngine();switch(n.movefirst=!0,window.dispatchEvent(t),e.keyCode){case 38:this.rotateY(-1);break;case 81:this.keydown=!0,this._camerLocalDirection.y=1;break;case 69:this._camerLocalDirection.y=-1;break;case 87:this._camerLocalDirection.z=1;break;case 37:this.rotateX(-1);break;case 65:this._camerLocalDirection.x=-1;break;case 40:this.rotateY(1);break;case 83:this._camerLocalDirection.z=-1;break;case 39:this.rotateX(1);break;case 68:this._camerLocalDirection.x=1;break}}onKeyUp(e){let t=this.GetEngine();switch(t.movefirst=!1,e.keyCode){case 38:case 87:this._camerLocalDirection.z=0;break;case 37:case 65:this._camerLocalDirection.x=0;break;case 40:case 83:this._camerLocalDirection.z=0;break;case 39:case 68:this._camerLocalDirection.x=0;break;case 81:case 69:this.keydown=!1,this._camerLocalDirection.y=0;break}}rotateX(e){this._euler.y-=e*this.lookSpeed,this.camera.quaternion.setFromEuler(this._euler)}rotateY(e){let t=this._euler.x-e*this.lookflag*.5*this.lookSpeed;t>=0?t-this.maxRotateX?this._euler.x=t:this._euler.x=-this.maxRotateX,this.camera.quaternion.setFromEuler(this._euler)}update(){this.keydown||this.gravityTest(),this.collisionTest()}gravityTest(){if(this.applyGravity){let e=!0;this._fallingTime+=.01,this._tmpVector.set(0,-1,0);const t=this.hitTest();if(t){const n=t.point.add(new P(0,this.playerHeight,0));if(this.positionEasing){if(n.y>=this.camera.position.y||n.y-this.camera.position.y<.2){this.setCameraHeight(this.camera.position.y+(n.y-this.camera.position.y)*.08),this._fallingTime=0,e=!1;return}}else t.distanceL instanceof Ut),!0);if(m.length>0&&(d.length==0||m[0].distance{L[0]!=null&&L[1]!=null&&b.push({X:L[0].X*.5+L[1].X*.5,Y:L[0].Y*.5+L[1].Y*.5,Z:L[0].Z*.5+L[1].Z*.5})});let v=[...g[2].map(L=>L[0]),...b],y="face",_=[],M=[],C=10;if(v.forEach(L=>{if(L!=null){let A=new P(L.X,L.Z,-L.Y),I=s.worldToScreen.worldToScreen(A),w=Math.sqrt(Math.pow(I.x-p.offsetX,2)+Math.pow(I.y-p.offsetY,2));w0?(_.sort((L,A)=>L.distance-A.distance),y="point"):(g[2].forEach(L=>{if(L[0]!=null&&L[1]!=null){let A=new P(L[0].X,L[0].Z,-L[0].Y),I=new P(L[1].X,L[1].Z,-L[1].Y),w=s.worldToScreen.worldToScreen(A),z=s.worldToScreen.worldToScreen(I),G=R(new he(p.offsetX,p.offsetY),w,z);if(G0&&(M.sort((L,A)=>L.distance-A.distance),y="line")),y=="point"&&e.options.showCatch){const L=s.worldToScreen.worldToScreen(_[0].point);s.catchSvg.innerHTML="";const A=L.x+s.reactBoundingClientRect.left,I=L.y+s.reactBoundingClientRect.top,w=document.createElementNS("http://www.w3.org/2000/svg","polygon");w.setAttribute("class","catchPoint"),w.setAttribute("points",`${A},${I-8} ${A-7},${I+4} ${A+7},${I+4}`),s.catchSvg.appendChild(w),d[0].point=_[0].point}else if(y=="line"&&e.options.showCatch){s.worldToScreen.worldToScreen(M[0].point);const L=M[0].start,A=M[0].end;s.catchSvg.innerHTML="";const I=document.createElementNS("http://www.w3.org/2000/svg","line");I.setAttribute("class","catchLine"),I.setAttribute("x1",(L.x+s.reactBoundingClientRect.left).toString()),I.setAttribute("y1",(L.y+s.reactBoundingClientRect.top).toString()),I.setAttribute("x2",(A.x+s.reactBoundingClientRect.left).toString()),I.setAttribute("y2",(A.y+s.reactBoundingClientRect.top).toString()),I.setAttribute("stroke","rgb(8, 223, 215)"),I.setAttribute("stroke-width","2"),s.catchSvg.appendChild(I),d[0].point=M[0].point}else if(y=="face"&&e.options.showCatch){let L=d[0].point.clone(),A=d[0].normal||(d[0].face?d[0].face.normal:null);const I=(A?A.clone():new P(0,0,1)).normalize(),w=Math.abs(I.y)<.9?new P(0,1,0):new P(1,0,0),z=new P().crossVectors(I,w).normalize(),G=new P().crossVectors(I,z).normalize(),j=.05,Y=[new P().copy(z).add(G).multiplyScalar(j),new P().copy(z).sub(G).multiplyScalar(j),new P().copy(z).multiplyScalar(-1).sub(G).multiplyScalar(j),new P().copy(z).multiplyScalar(-1).add(G).multiplyScalar(j)].map(ie=>new P().copy(L).add(ie)).map(ie=>s.worldToScreen.worldToScreen(ie));s.catchSvg.innerHTML="";const q=document.createElementNS("http://www.w3.org/2000/svg","polygon");q.setAttribute("class","catchFace"),q.setAttribute("points",Y.map(ie=>`${ie.x+s.reactBoundingClientRect.left},${ie.y+s.reactBoundingClientRect.top}`).join(" ")),q.setAttribute("fill","rgba(1, 238, 255, 0.2)"),q.setAttribute("stroke","rgb(0, 255, 247)"),q.setAttribute("stroke-width","1"),s.catchSvg.appendChild(q)}return d[0];function R(L,A,I){const w=new he().subVectors(I,A),z=w.lengthSq();if(z<1e-10)return L.distanceTo(A);const G=new he().subVectors(L,A),j=zt.clamp(G.dot(w)/z,0,1),Y=new he().copy(w).multiplyScalar(j).add(A);return L.distanceTo(Y)}function S(L,A,I){const w=new he().subVectors(I,A),z=w.lengthSq();if(z<1e-10)return 0;const G=new he().subVectors(L,A);return zt.clamp(G.dot(w)/z,0,1)}function E(L,A,I){const w=zt.clamp(L,0,1);return new P().lerpVectors(A,I,w)}}return e}class V3{engine;orbitControls;firstPersonControls;isActive=!0;originDiv=null;handelBehaved;isDragging=!1;isDown=!1;containerOffset={left:0,top:0};constructor(e){this.engine=e,this.init(),this.handelBehaved=cu(this.engine),this.handelBehaved.init(this,null),this.handelBehaved.active()}init(){this.orbitControls=new P3(this.engine,this.engine.camera,this.engine.renderer.domElement),this.orbitControls.showOriginIcon=!0,this.firstPersonControls=new $f(this.engine,this.engine.camera,this.engine.renderer.domElement);const e=document.createElement("div");this.originDiv=e,e.className="originDiv",e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.width="30px",e.style.height="30px",e.style.borderRadius="50%",e.style.pointerEvents="none",e.style.backgroundImage="url(/assets/svg/rotate-orbit.svg)",this.engine.container.appendChild(this.originDiv)}active(){this.isActive=!0,this.orbitControls.enabled=!0}disActive(){this.isActive=!1,this.orbitControls.enabled=!1}setMoveSpeed(e){this.firstPersonControls.moveSpeed=e}getMoveSpeed(){return this.firstPersonControls.moveSpeed}setApplyCollision(e){this.firstPersonControls.applyCollision=e}getApplyCollision(){return this.firstPersonControls.applyCollision}setApplyGravity(e){this.firstPersonControls.applyGravity=e}getApplyGravity(){return this.firstPersonControls.applyGravity}toggleMinMap(){this.engine.minMap.toggle()}switchFirstPersonMode(){this.engine.cameraModule.switchToPerspectiveCamera(),this.firstPersonControls=new $f(this.engine,this.engine.camera,this.engine.renderer.domElement,[]),this.orbitControls.enabled=!1,this.firstPersonControls.enabled=!0,this.firstPersonControls.isActive=!0}switchDefaultMode(){this.firstPersonControls&&(this.firstPersonControls.enabled=!1,this.engine.cameraModule.switchToOrthographicCamera()),this.orbitControls.enabled=!0}handleMouseUp(e){this.isDragging=!1,this.isDown=!1}handleMouseMove(e){this.isDown?this.isDragging=!0:this.isDragging=!1}handleMouseDown(e){this.isDown=!0}handleMouseClick(e){this.isDragging=!1,this.isDown=!1}update(){if(this.firstPersonControls.enabled&&this.firstPersonControls.update(),this.orbitControls.enabled){const e=this.engine.controlModule.orbitControls.origin,t=this.engine.worldToScreen.worldToScreen(e);this.originDiv&&this.isDragging?(this.originDiv.style.left=t.x-15+this.engine.reactBoundingClientRect.left+"px",this.originDiv.style.top=t.y-15+this.engine.reactBoundingClientRect.top+"px",this.originDiv.style.display="block"):this.originDiv&&(this.originDiv.style.display="none")}}}const As={name:"CopyShader",uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:` varying vec2 vUv; @@ -3968,7 +3968,7 @@ void main() { gl_FragColor = opacity * texel; - }`};class Ps{constructor(){this.isPass=!0,this.enabled=!0,this.needsSwap=!0,this.clear=!1,this.renderToScreen=!1}setSize(){}render(){console.error("THREE.Pass: .render() must be implemented in derived pass.")}dispose(){}}const G3=new Ai(-1,1,1,-1,0,1);class W3 extends dt{constructor(){super(),this.setAttribute("position",new jt([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new jt([0,2,0,0,2,0],2))}}const X3=new W3;class el{constructor(e){this._mesh=new rt(X3,e)}dispose(){this._mesh.geometry.dispose()}render(e){e.render(this._mesh,G3)}get material(){return this._mesh.material}set material(e){this._mesh.material=e}}class tl extends Ps{constructor(e,t="tDiffuse"){super(),this.textureID=t,this.uniforms=null,this.material=null,e instanceof Lt?(this.uniforms=e.uniforms,this.material=e):e&&(this.uniforms=Hn.clone(e.uniforms),this.material=new Lt({name:e.name!==void 0?e.name:"unspecified",defines:Object.assign({},e.defines),uniforms:this.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader})),this._fsQuad=new el(this.material)}render(e,t,n){this.uniforms[this.textureID]&&(this.uniforms[this.textureID].value=n.texture),this._fsQuad.material=this.material,this.renderToScreen?(e.setRenderTarget(null),this._fsQuad.render(e)):(e.setRenderTarget(t),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),this._fsQuad.render(e))}dispose(){this.material.dispose(),this._fsQuad.dispose()}}class Kf extends Ps{constructor(e,t){super(),this.scene=e,this.camera=t,this.clear=!0,this.needsSwap=!1,this.inverse=!1}render(e,t,n){const i=e.getContext(),r=e.state;r.buffers.color.setMask(!1),r.buffers.depth.setMask(!1),r.buffers.color.setLocked(!0),r.buffers.depth.setLocked(!0);let a,o;this.inverse?(a=0,o=1):(a=1,o=0),r.buffers.stencil.setTest(!0),r.buffers.stencil.setOp(i.REPLACE,i.REPLACE,i.REPLACE),r.buffers.stencil.setFunc(i.ALWAYS,a,4294967295),r.buffers.stencil.setClear(o),r.buffers.stencil.setLocked(!0),e.setRenderTarget(n),this.clear&&e.clear(),e.render(this.scene,this.camera),e.setRenderTarget(t),this.clear&&e.clear(),e.render(this.scene,this.camera),r.buffers.color.setLocked(!1),r.buffers.depth.setLocked(!1),r.buffers.color.setMask(!0),r.buffers.depth.setMask(!0),r.buffers.stencil.setLocked(!1),r.buffers.stencil.setFunc(i.EQUAL,1,4294967295),r.buffers.stencil.setOp(i.KEEP,i.KEEP,i.KEEP),r.buffers.stencil.setLocked(!0)}}class j3 extends Ps{constructor(){super(),this.needsSwap=!1}render(e){e.state.buffers.stencil.setLocked(!1),e.state.buffers.stencil.setTest(!1)}}class q3{constructor(e,t){if(this.renderer=e,this._pixelRatio=e.getPixelRatio(),t===void 0){const n=e.getSize(new he);this._width=n.width,this._height=n.height,t=new Cn(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:un}),t.texture.name="EffectComposer.rt1"}else this._width=t.width,this._height=t.height;this.renderTarget1=t,this.renderTarget2=t.clone(),this.renderTarget2.texture.name="EffectComposer.rt2",this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2,this.renderToScreen=!0,this.passes=[],this.copyPass=new tl(As),this.copyPass.material.blending=St,this.clock=new mf}swapBuffers(){const e=this.readBuffer;this.readBuffer=this.writeBuffer,this.writeBuffer=e}addPass(e){this.passes.push(e),e.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}insertPass(e,t){this.passes.splice(t,0,e),e.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}removePass(e){const t=this.passes.indexOf(e);t!==-1&&this.passes.splice(t,1)}isLastEnabledPass(e){for(let t=e+1;tf?(x=1,g=0):(x=0,g=1);const y=m-x+h,v=f-g+h,b=m-1+2*h,_=f-1+2*h,M=l&255,T=c&255,R=this.perm[M+this.perm[T]]%12,S=this.perm[M+x+this.perm[T+g]]%12,E=this.perm[M+1+this.perm[T+1]]%12;let L=.5-m*m-f*f;L<0?n=0:(L*=L,n=L*L*this._dot(this.grad3[R],m,f));let A=.5-y*y-v*v;A<0?i=0:(A*=A,i=A*A*this._dot(this.grad3[S],y,v));let I=.5-b*b-_*_;return I<0?r=0:(I*=I,r=I*I*this._dot(this.grad3[E],b,_)),70*(n+i+r)}noise3d(e,t,n){let i,r,a,o;const l=(e+t+n)*.3333333333333333,c=Math.floor(e+l),h=Math.floor(t+l),u=Math.floor(n+l),p=1/6,d=(c+h+u)*p,m=c-d,f=h-d,x=u-d,g=e-m,y=t-f,v=n-x;let b,_,M,T,R,S;g>=y?y>=v?(b=1,_=0,M=0,T=1,R=1,S=0):g>=v?(b=1,_=0,M=0,T=1,R=0,S=1):(b=0,_=0,M=1,T=1,R=0,S=1):yE?32:0,w=S>L?16:0,z=E>L?8:0,G=S>A?4:0,j=E>A?2:0,Y=L>A?1:0,q=I+w+z+G+j+Y,ie=a[q][0]>=3?1:0,W=a[q][1]>=3?1:0,$=a[q][2]>=3?1:0,fe=a[q][3]>=3?1:0,me=a[q][0]>=2?1:0,de=a[q][1]>=2?1:0,se=a[q][2]>=2?1:0,ce=a[q][3]>=2?1:0,pe=a[q][0]>=1?1:0,ye=a[q][1]>=1?1:0,Se=a[q][2]>=1?1:0,Be=a[q][3]>=1?1:0,Je=S-ie+c,ke=E-W+c,C=L-$+c,N=A-fe+c,V=S-me+2*c,U=E-de+2*c,k=L-se+2*c,F=A-ce+2*c,ee=S-pe+3*c,J=E-ye+3*c,X=L-Se+3*c,B=A-Be+3*c,D=S-1+4*c,H=E-1+4*c,K=L-1+4*c,le=A-1+4*c,te=x&255,Ce=g&255,be=y&255,Re=v&255,Ie=o[te+o[Ce+o[be+o[Re]]]]%32,ue=o[te+ie+o[Ce+W+o[be+$+o[Re+fe]]]]%32,_e=o[te+me+o[Ce+de+o[be+se+o[Re+ce]]]]%32,Ve=o[te+pe+o[Ce+ye+o[be+Se+o[Re+Be]]]]%32,Ue=o[te+1+o[Ce+1+o[be+1+o[Re+1]]]]%32;let Ae=.6-S*S-E*E-L*L-A*A;Ae<0?h=0:(Ae*=Ae,h=Ae*Ae*this._dot4(r[Ie],S,E,L,A));let Ge=.6-Je*Je-ke*ke-C*C-N*N;Ge<0?u=0:(Ge*=Ge,u=Ge*Ge*this._dot4(r[ue],Je,ke,C,N));let Z=.6-V*V-U*U-k*k-F*F;Z<0?p=0:(Z*=Z,p=Z*Z*this._dot4(r[_e],V,U,k,F));let Te=.6-ee*ee-J*J-X*X-B*B;Te<0?d=0:(Te*=Te,d=Te*Te*this._dot4(r[Ve],ee,J,X,B));let Me=.6-D*D-H*H-K*K-le*le;return Me<0?m=0:(Me*=Me,m=Me*Me*this._dot4(r[Ue],D,H,K,le)),27*(h+u+p+d+m)}_dot(e,t,n){return e[0]*t+e[1]*n}_dot3(e,t,n,i){return e[0]*t+e[1]*n+e[2]*i}_dot4(e,t,n,i,r){return e[0]*t+e[1]*n+e[2]*i+e[3]*r}}class bn extends Ps{constructor(e,t,n=512,i=512,r,a,o){super(),this.width=n,this.height=i,this.clear=!0,this.camera=t,this.scene=e,this.output=0,this._renderGBuffer=!0,this._visibilityCache=[],this.blendIntensity=1,this.pdRings=2,this.pdRadiusExponent=2,this.pdSamples=16,this.gtaoNoiseTexture=Y3(),this.pdNoiseTexture=this._generateNoise(),this.gtaoRenderTarget=new Cn(this.width,this.height,{type:un}),this.pdRenderTarget=this.gtaoRenderTarget.clone(),this.gtaoMaterial=new Lt({defines:Object.assign({},nl.defines),uniforms:Hn.clone(nl.uniforms),vertexShader:nl.vertexShader,fragmentShader:nl.fragmentShader,blending:St,depthTest:!1,depthWrite:!1}),this.gtaoMaterial.defines.PERSPECTIVE_CAMERA=this.camera.isPerspectiveCamera?1:0,this.gtaoMaterial.uniforms.tNoise.value=this.gtaoNoiseTexture,this.gtaoMaterial.uniforms.resolution.value.set(this.width,this.height),this.gtaoMaterial.uniforms.cameraNear.value=this.camera.near,this.gtaoMaterial.uniforms.cameraFar.value=this.camera.far,this.normalMaterial=new lf,this.normalMaterial.blending=St,this.pdMaterial=new Lt({defines:Object.assign({},sl.defines),uniforms:Hn.clone(sl.uniforms),vertexShader:sl.vertexShader,fragmentShader:sl.fragmentShader,depthTest:!1,depthWrite:!1}),this.pdMaterial.uniforms.tDiffuse.value=this.gtaoRenderTarget.texture,this.pdMaterial.uniforms.tNoise.value=this.pdNoiseTexture,this.pdMaterial.uniforms.resolution.value.set(this.width,this.height),this.pdMaterial.uniforms.lumaPhi.value=10,this.pdMaterial.uniforms.depthPhi.value=2,this.pdMaterial.uniforms.normalPhi.value=3,this.pdMaterial.uniforms.radius.value=8,this.depthRenderMaterial=new Lt({defines:Object.assign({},il.defines),uniforms:Hn.clone(il.uniforms),vertexShader:il.vertexShader,fragmentShader:il.fragmentShader,blending:St}),this.depthRenderMaterial.uniforms.cameraNear.value=this.camera.near,this.depthRenderMaterial.uniforms.cameraFar.value=this.camera.far,this.copyMaterial=new Lt({uniforms:Hn.clone(As.uniforms),vertexShader:As.vertexShader,fragmentShader:As.fragmentShader,transparent:!0,depthTest:!1,depthWrite:!1,blendSrc:Ya,blendDst:ds,blendEquation:En,blendSrcAlpha:Za,blendDstAlpha:ds,blendEquationAlpha:En}),this.blendMaterial=new Lt({uniforms:Hn.clone(hu.uniforms),vertexShader:hu.vertexShader,fragmentShader:hu.fragmentShader,transparent:!0,depthTest:!1,depthWrite:!1,blending:ic,blendSrc:Ya,blendDst:ds,blendEquation:En,blendSrcAlpha:Za,blendDstAlpha:ds,blendEquationAlpha:En}),this._fsQuad=new el(null),this._originalClearColor=new Fe,this.setGBuffer(r?r.depthTexture:void 0,r?r.normalTexture:void 0),a!==void 0&&this.updateGtaoMaterial(a),o!==void 0&&this.updatePdMaterial(o)}setSize(e,t){this.width=e,this.height=t,this.gtaoRenderTarget.setSize(e,t),this.normalRenderTarget.setSize(e,t),this.pdRenderTarget.setSize(e,t),this.gtaoMaterial.uniforms.resolution.value.set(e,t),this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix),this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this.pdMaterial.uniforms.resolution.value.set(e,t),this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse)}dispose(){this.gtaoNoiseTexture.dispose(),this.pdNoiseTexture.dispose(),this.normalRenderTarget.dispose(),this.gtaoRenderTarget.dispose(),this.pdRenderTarget.dispose(),this.normalMaterial.dispose(),this.pdMaterial.dispose(),this.copyMaterial.dispose(),this.depthRenderMaterial.dispose(),this._fsQuad.dispose()}get gtaoMap(){return this.pdRenderTarget.texture}setGBuffer(e,t){e!==void 0?(this.depthTexture=e,this.normalTexture=t,this._renderGBuffer=!1):(this.depthTexture=new Fo,this.depthTexture.format=ms,this.depthTexture.type=fs,this.normalRenderTarget=new Cn(this.width,this.height,{minFilter:Xt,magFilter:Xt,type:un,depthTexture:this.depthTexture}),this.normalTexture=this.normalRenderTarget.texture,this._renderGBuffer=!0);const n=this.normalTexture?1:0,i=this.depthTexture===this.normalTexture?"w":"x";this.gtaoMaterial.defines.NORMAL_VECTOR_TYPE=n,this.gtaoMaterial.defines.DEPTH_SWIZZLING=i,this.gtaoMaterial.uniforms.tNormal.value=this.normalTexture,this.gtaoMaterial.uniforms.tDepth.value=this.depthTexture,this.pdMaterial.defines.NORMAL_VECTOR_TYPE=n,this.pdMaterial.defines.DEPTH_SWIZZLING=i,this.pdMaterial.uniforms.tNormal.value=this.normalTexture,this.pdMaterial.uniforms.tDepth.value=this.depthTexture,this.depthRenderMaterial.uniforms.tDepth.value=this.normalRenderTarget.depthTexture}setSceneClipBox(e){e?(this.gtaoMaterial.needsUpdate=this.gtaoMaterial.defines.SCENE_CLIP_BOX!==1,this.gtaoMaterial.defines.SCENE_CLIP_BOX=1,this.gtaoMaterial.uniforms.sceneBoxMin.value.copy(e.min),this.gtaoMaterial.uniforms.sceneBoxMax.value.copy(e.max)):(this.gtaoMaterial.needsUpdate=this.gtaoMaterial.defines.SCENE_CLIP_BOX===0,this.gtaoMaterial.defines.SCENE_CLIP_BOX=0)}updateGtaoMaterial(e){e.radius!==void 0&&(this.gtaoMaterial.uniforms.radius.value=e.radius),e.distanceExponent!==void 0&&(this.gtaoMaterial.uniforms.distanceExponent.value=e.distanceExponent),e.thickness!==void 0&&(this.gtaoMaterial.uniforms.thickness.value=e.thickness),e.distanceFallOff!==void 0&&(this.gtaoMaterial.uniforms.distanceFallOff.value=e.distanceFallOff,this.gtaoMaterial.needsUpdate=!0),e.scale!==void 0&&(this.gtaoMaterial.uniforms.scale.value=e.scale),e.samples!==void 0&&e.samples!==this.gtaoMaterial.defines.SAMPLES&&(this.gtaoMaterial.defines.SAMPLES=e.samples,this.gtaoMaterial.needsUpdate=!0),e.screenSpaceRadius!==void 0&&(e.screenSpaceRadius?1:0)!==this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS&&(this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS=e.screenSpaceRadius?1:0,this.gtaoMaterial.needsUpdate=!0)}updatePdMaterial(e){let t=!1;e.lumaPhi!==void 0&&(this.pdMaterial.uniforms.lumaPhi.value=e.lumaPhi),e.depthPhi!==void 0&&(this.pdMaterial.uniforms.depthPhi.value=e.depthPhi),e.normalPhi!==void 0&&(this.pdMaterial.uniforms.normalPhi.value=e.normalPhi),e.radius!==void 0&&e.radius!==this.radius&&(this.pdMaterial.uniforms.radius.value=e.radius),e.radiusExponent!==void 0&&e.radiusExponent!==this.pdRadiusExponent&&(this.pdRadiusExponent=e.radiusExponent,t=!0),e.rings!==void 0&&e.rings!==this.pdRings&&(this.pdRings=e.rings,t=!0),e.samples!==void 0&&e.samples!==this.pdSamples&&(this.pdSamples=e.samples,t=!0),t&&(this.pdMaterial.defines.SAMPLES=this.pdSamples,this.pdMaterial.defines.SAMPLE_VECTORS=Jf(this.pdSamples,this.pdRings,this.pdRadiusExponent),this.pdMaterial.needsUpdate=!0)}render(e,t,n){switch(this._renderGBuffer&&(this._overrideVisibility(),this._renderOverride(e,this.normalMaterial,this.normalRenderTarget,7829503,1),this._restoreVisibility()),this.gtaoMaterial.uniforms.cameraNear.value=this.camera.near,this.gtaoMaterial.uniforms.cameraFar.value=this.camera.far,this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix),this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this.gtaoMaterial.uniforms.cameraWorldMatrix.value.copy(this.camera.matrixWorld),this._renderPass(e,this.gtaoMaterial,this.gtaoRenderTarget,16777215,1),this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this._renderPass(e,this.pdMaterial,this.pdRenderTarget,16777215,1),this.output){case bn.OUTPUT.Off:break;case bn.OUTPUT.Diffuse:this.copyMaterial.uniforms.tDiffuse.value=n.texture,this.copyMaterial.blending=St,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.AO:this.copyMaterial.uniforms.tDiffuse.value=this.gtaoRenderTarget.texture,this.copyMaterial.blending=St,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.Denoise:this.copyMaterial.uniforms.tDiffuse.value=this.pdRenderTarget.texture,this.copyMaterial.blending=St,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.Depth:this.depthRenderMaterial.uniforms.cameraNear.value=this.camera.near,this.depthRenderMaterial.uniforms.cameraFar.value=this.camera.far,this._renderPass(e,this.depthRenderMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.Normal:this.copyMaterial.uniforms.tDiffuse.value=this.normalRenderTarget.texture,this.copyMaterial.blending=St,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.Default:this.copyMaterial.uniforms.tDiffuse.value=n.texture,this.copyMaterial.blending=St,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t),this.blendMaterial.uniforms.intensity.value=this.blendIntensity,this.blendMaterial.uniforms.tDiffuse.value=this.pdRenderTarget.texture,this._renderPass(e,this.blendMaterial,this.renderToScreen?null:t);break;default:console.warn("THREE.GTAOPass: Unknown output type.")}}_renderPass(e,t,n,i,r){e.getClearColor(this._originalClearColor);const a=e.getClearAlpha(),o=e.autoClear;e.setRenderTarget(n),e.autoClear=!1,i!=null&&(e.setClearColor(i),e.setClearAlpha(r||0),e.clear()),this._fsQuad.material=t,this._fsQuad.render(e),e.autoClear=o,e.setClearColor(this._originalClearColor),e.setClearAlpha(a)}_renderOverride(e,t,n,i,r){e.getClearColor(this._originalClearColor);const a=e.getClearAlpha(),o=e.autoClear;e.setRenderTarget(n),e.autoClear=!1,i=t.clearColor||i,r=t.clearAlpha||r,i!=null&&(e.setClearColor(i),e.setClearAlpha(r||0),e.clear()),this.scene.overrideMaterial=t,e.render(this.scene,this.camera),this.scene.overrideMaterial=null,e.autoClear=o,e.setClearColor(this._originalClearColor),e.setClearAlpha(a)}_overrideVisibility(){const e=this.scene,t=this._visibilityCache;e.traverse(function(n){(n.isPoints||n.isLine||n.isLine2)&&n.visible&&(n.visible=!1,t.push(n))})}_restoreVisibility(){const e=this._visibilityCache;for(let t=0;tf?(x=1,g=0):(x=0,g=1);const b=m-x+h,v=f-g+h,y=m-1+2*h,_=f-1+2*h,M=l&255,C=c&255,R=this.perm[M+this.perm[C]]%12,S=this.perm[M+x+this.perm[C+g]]%12,E=this.perm[M+1+this.perm[C+1]]%12;let L=.5-m*m-f*f;L<0?n=0:(L*=L,n=L*L*this._dot(this.grad3[R],m,f));let A=.5-b*b-v*v;A<0?i=0:(A*=A,i=A*A*this._dot(this.grad3[S],b,v));let I=.5-y*y-_*_;return I<0?r=0:(I*=I,r=I*I*this._dot(this.grad3[E],y,_)),70*(n+i+r)}noise3d(e,t,n){let i,r,a,o;const l=(e+t+n)*.3333333333333333,c=Math.floor(e+l),h=Math.floor(t+l),u=Math.floor(n+l),p=1/6,d=(c+h+u)*p,m=c-d,f=h-d,x=u-d,g=e-m,b=t-f,v=n-x;let y,_,M,C,R,S;g>=b?b>=v?(y=1,_=0,M=0,C=1,R=1,S=0):g>=v?(y=1,_=0,M=0,C=1,R=0,S=1):(y=0,_=0,M=1,C=1,R=0,S=1):bE?32:0,w=S>L?16:0,z=E>L?8:0,G=S>A?4:0,j=E>A?2:0,Y=L>A?1:0,q=I+w+z+G+j+Y,ie=a[q][0]>=3?1:0,W=a[q][1]>=3?1:0,$=a[q][2]>=3?1:0,fe=a[q][3]>=3?1:0,me=a[q][0]>=2?1:0,de=a[q][1]>=2?1:0,se=a[q][2]>=2?1:0,ce=a[q][3]>=2?1:0,pe=a[q][0]>=1?1:0,be=a[q][1]>=1?1:0,Se=a[q][2]>=1?1:0,Be=a[q][3]>=1?1:0,Je=S-ie+c,ke=E-W+c,T=L-$+c,N=A-fe+c,V=S-me+2*c,U=E-de+2*c,k=L-se+2*c,F=A-ce+2*c,ee=S-pe+3*c,J=E-be+3*c,X=L-Se+3*c,B=A-Be+3*c,D=S-1+4*c,H=E-1+4*c,K=L-1+4*c,le=A-1+4*c,te=x&255,Te=g&255,ye=b&255,Re=v&255,Ie=o[te+o[Te+o[ye+o[Re]]]]%32,ue=o[te+ie+o[Te+W+o[ye+$+o[Re+fe]]]]%32,_e=o[te+me+o[Te+de+o[ye+se+o[Re+ce]]]]%32,Ve=o[te+pe+o[Te+be+o[ye+Se+o[Re+Be]]]]%32,Ue=o[te+1+o[Te+1+o[ye+1+o[Re+1]]]]%32;let Ae=.6-S*S-E*E-L*L-A*A;Ae<0?h=0:(Ae*=Ae,h=Ae*Ae*this._dot4(r[Ie],S,E,L,A));let Ge=.6-Je*Je-ke*ke-T*T-N*N;Ge<0?u=0:(Ge*=Ge,u=Ge*Ge*this._dot4(r[ue],Je,ke,T,N));let Z=.6-V*V-U*U-k*k-F*F;Z<0?p=0:(Z*=Z,p=Z*Z*this._dot4(r[_e],V,U,k,F));let Ce=.6-ee*ee-J*J-X*X-B*B;Ce<0?d=0:(Ce*=Ce,d=Ce*Ce*this._dot4(r[Ve],ee,J,X,B));let Me=.6-D*D-H*H-K*K-le*le;return Me<0?m=0:(Me*=Me,m=Me*Me*this._dot4(r[Ue],D,H,K,le)),27*(h+u+p+d+m)}_dot(e,t,n){return e[0]*t+e[1]*n}_dot3(e,t,n,i){return e[0]*t+e[1]*n+e[2]*i}_dot4(e,t,n,i,r){return e[0]*t+e[1]*n+e[2]*i+e[3]*r}}class yn extends Ps{constructor(e,t,n=512,i=512,r,a,o){super(),this.width=n,this.height=i,this.clear=!0,this.camera=t,this.scene=e,this.output=0,this._renderGBuffer=!0,this._visibilityCache=[],this.blendIntensity=1,this.pdRings=2,this.pdRadiusExponent=2,this.pdSamples=16,this.gtaoNoiseTexture=Y3(),this.pdNoiseTexture=this._generateNoise(),this.gtaoRenderTarget=new Tn(this.width,this.height,{type:un}),this.pdRenderTarget=this.gtaoRenderTarget.clone(),this.gtaoMaterial=new Lt({defines:Object.assign({},nl.defines),uniforms:Hn.clone(nl.uniforms),vertexShader:nl.vertexShader,fragmentShader:nl.fragmentShader,blending:St,depthTest:!1,depthWrite:!1}),this.gtaoMaterial.defines.PERSPECTIVE_CAMERA=this.camera.isPerspectiveCamera?1:0,this.gtaoMaterial.uniforms.tNoise.value=this.gtaoNoiseTexture,this.gtaoMaterial.uniforms.resolution.value.set(this.width,this.height),this.gtaoMaterial.uniforms.cameraNear.value=this.camera.near,this.gtaoMaterial.uniforms.cameraFar.value=this.camera.far,this.normalMaterial=new lf,this.normalMaterial.blending=St,this.pdMaterial=new Lt({defines:Object.assign({},sl.defines),uniforms:Hn.clone(sl.uniforms),vertexShader:sl.vertexShader,fragmentShader:sl.fragmentShader,depthTest:!1,depthWrite:!1}),this.pdMaterial.uniforms.tDiffuse.value=this.gtaoRenderTarget.texture,this.pdMaterial.uniforms.tNoise.value=this.pdNoiseTexture,this.pdMaterial.uniforms.resolution.value.set(this.width,this.height),this.pdMaterial.uniforms.lumaPhi.value=10,this.pdMaterial.uniforms.depthPhi.value=2,this.pdMaterial.uniforms.normalPhi.value=3,this.pdMaterial.uniforms.radius.value=8,this.depthRenderMaterial=new Lt({defines:Object.assign({},il.defines),uniforms:Hn.clone(il.uniforms),vertexShader:il.vertexShader,fragmentShader:il.fragmentShader,blending:St}),this.depthRenderMaterial.uniforms.cameraNear.value=this.camera.near,this.depthRenderMaterial.uniforms.cameraFar.value=this.camera.far,this.copyMaterial=new Lt({uniforms:Hn.clone(As.uniforms),vertexShader:As.vertexShader,fragmentShader:As.fragmentShader,transparent:!0,depthTest:!1,depthWrite:!1,blendSrc:Ya,blendDst:ds,blendEquation:En,blendSrcAlpha:Za,blendDstAlpha:ds,blendEquationAlpha:En}),this.blendMaterial=new Lt({uniforms:Hn.clone(hu.uniforms),vertexShader:hu.vertexShader,fragmentShader:hu.fragmentShader,transparent:!0,depthTest:!1,depthWrite:!1,blending:ic,blendSrc:Ya,blendDst:ds,blendEquation:En,blendSrcAlpha:Za,blendDstAlpha:ds,blendEquationAlpha:En}),this._fsQuad=new el(null),this._originalClearColor=new Fe,this.setGBuffer(r?r.depthTexture:void 0,r?r.normalTexture:void 0),a!==void 0&&this.updateGtaoMaterial(a),o!==void 0&&this.updatePdMaterial(o)}setSize(e,t){this.width=e,this.height=t,this.gtaoRenderTarget.setSize(e,t),this.normalRenderTarget.setSize(e,t),this.pdRenderTarget.setSize(e,t),this.gtaoMaterial.uniforms.resolution.value.set(e,t),this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix),this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this.pdMaterial.uniforms.resolution.value.set(e,t),this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse)}dispose(){this.gtaoNoiseTexture.dispose(),this.pdNoiseTexture.dispose(),this.normalRenderTarget.dispose(),this.gtaoRenderTarget.dispose(),this.pdRenderTarget.dispose(),this.normalMaterial.dispose(),this.pdMaterial.dispose(),this.copyMaterial.dispose(),this.depthRenderMaterial.dispose(),this._fsQuad.dispose()}get gtaoMap(){return this.pdRenderTarget.texture}setGBuffer(e,t){e!==void 0?(this.depthTexture=e,this.normalTexture=t,this._renderGBuffer=!1):(this.depthTexture=new Fo,this.depthTexture.format=ms,this.depthTexture.type=fs,this.normalRenderTarget=new Tn(this.width,this.height,{minFilter:Xt,magFilter:Xt,type:un,depthTexture:this.depthTexture}),this.normalTexture=this.normalRenderTarget.texture,this._renderGBuffer=!0);const n=this.normalTexture?1:0,i=this.depthTexture===this.normalTexture?"w":"x";this.gtaoMaterial.defines.NORMAL_VECTOR_TYPE=n,this.gtaoMaterial.defines.DEPTH_SWIZZLING=i,this.gtaoMaterial.uniforms.tNormal.value=this.normalTexture,this.gtaoMaterial.uniforms.tDepth.value=this.depthTexture,this.pdMaterial.defines.NORMAL_VECTOR_TYPE=n,this.pdMaterial.defines.DEPTH_SWIZZLING=i,this.pdMaterial.uniforms.tNormal.value=this.normalTexture,this.pdMaterial.uniforms.tDepth.value=this.depthTexture,this.depthRenderMaterial.uniforms.tDepth.value=this.normalRenderTarget.depthTexture}setSceneClipBox(e){e?(this.gtaoMaterial.needsUpdate=this.gtaoMaterial.defines.SCENE_CLIP_BOX!==1,this.gtaoMaterial.defines.SCENE_CLIP_BOX=1,this.gtaoMaterial.uniforms.sceneBoxMin.value.copy(e.min),this.gtaoMaterial.uniforms.sceneBoxMax.value.copy(e.max)):(this.gtaoMaterial.needsUpdate=this.gtaoMaterial.defines.SCENE_CLIP_BOX===0,this.gtaoMaterial.defines.SCENE_CLIP_BOX=0)}updateGtaoMaterial(e){e.radius!==void 0&&(this.gtaoMaterial.uniforms.radius.value=e.radius),e.distanceExponent!==void 0&&(this.gtaoMaterial.uniforms.distanceExponent.value=e.distanceExponent),e.thickness!==void 0&&(this.gtaoMaterial.uniforms.thickness.value=e.thickness),e.distanceFallOff!==void 0&&(this.gtaoMaterial.uniforms.distanceFallOff.value=e.distanceFallOff,this.gtaoMaterial.needsUpdate=!0),e.scale!==void 0&&(this.gtaoMaterial.uniforms.scale.value=e.scale),e.samples!==void 0&&e.samples!==this.gtaoMaterial.defines.SAMPLES&&(this.gtaoMaterial.defines.SAMPLES=e.samples,this.gtaoMaterial.needsUpdate=!0),e.screenSpaceRadius!==void 0&&(e.screenSpaceRadius?1:0)!==this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS&&(this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS=e.screenSpaceRadius?1:0,this.gtaoMaterial.needsUpdate=!0)}updatePdMaterial(e){let t=!1;e.lumaPhi!==void 0&&(this.pdMaterial.uniforms.lumaPhi.value=e.lumaPhi),e.depthPhi!==void 0&&(this.pdMaterial.uniforms.depthPhi.value=e.depthPhi),e.normalPhi!==void 0&&(this.pdMaterial.uniforms.normalPhi.value=e.normalPhi),e.radius!==void 0&&e.radius!==this.radius&&(this.pdMaterial.uniforms.radius.value=e.radius),e.radiusExponent!==void 0&&e.radiusExponent!==this.pdRadiusExponent&&(this.pdRadiusExponent=e.radiusExponent,t=!0),e.rings!==void 0&&e.rings!==this.pdRings&&(this.pdRings=e.rings,t=!0),e.samples!==void 0&&e.samples!==this.pdSamples&&(this.pdSamples=e.samples,t=!0),t&&(this.pdMaterial.defines.SAMPLES=this.pdSamples,this.pdMaterial.defines.SAMPLE_VECTORS=Jf(this.pdSamples,this.pdRings,this.pdRadiusExponent),this.pdMaterial.needsUpdate=!0)}render(e,t,n){switch(this._renderGBuffer&&(this._overrideVisibility(),this._renderOverride(e,this.normalMaterial,this.normalRenderTarget,7829503,1),this._restoreVisibility()),this.gtaoMaterial.uniforms.cameraNear.value=this.camera.near,this.gtaoMaterial.uniforms.cameraFar.value=this.camera.far,this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix),this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this.gtaoMaterial.uniforms.cameraWorldMatrix.value.copy(this.camera.matrixWorld),this._renderPass(e,this.gtaoMaterial,this.gtaoRenderTarget,16777215,1),this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this._renderPass(e,this.pdMaterial,this.pdRenderTarget,16777215,1),this.output){case yn.OUTPUT.Off:break;case yn.OUTPUT.Diffuse:this.copyMaterial.uniforms.tDiffuse.value=n.texture,this.copyMaterial.blending=St,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case yn.OUTPUT.AO:this.copyMaterial.uniforms.tDiffuse.value=this.gtaoRenderTarget.texture,this.copyMaterial.blending=St,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case yn.OUTPUT.Denoise:this.copyMaterial.uniforms.tDiffuse.value=this.pdRenderTarget.texture,this.copyMaterial.blending=St,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case yn.OUTPUT.Depth:this.depthRenderMaterial.uniforms.cameraNear.value=this.camera.near,this.depthRenderMaterial.uniforms.cameraFar.value=this.camera.far,this._renderPass(e,this.depthRenderMaterial,this.renderToScreen?null:t);break;case yn.OUTPUT.Normal:this.copyMaterial.uniforms.tDiffuse.value=this.normalRenderTarget.texture,this.copyMaterial.blending=St,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case yn.OUTPUT.Default:this.copyMaterial.uniforms.tDiffuse.value=n.texture,this.copyMaterial.blending=St,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t),this.blendMaterial.uniforms.intensity.value=this.blendIntensity,this.blendMaterial.uniforms.tDiffuse.value=this.pdRenderTarget.texture,this._renderPass(e,this.blendMaterial,this.renderToScreen?null:t);break;default:console.warn("THREE.GTAOPass: Unknown output type.")}}_renderPass(e,t,n,i,r){e.getClearColor(this._originalClearColor);const a=e.getClearAlpha(),o=e.autoClear;e.setRenderTarget(n),e.autoClear=!1,i!=null&&(e.setClearColor(i),e.setClearAlpha(r||0),e.clear()),this._fsQuad.material=t,this._fsQuad.render(e),e.autoClear=o,e.setClearColor(this._originalClearColor),e.setClearAlpha(a)}_renderOverride(e,t,n,i,r){e.getClearColor(this._originalClearColor);const a=e.getClearAlpha(),o=e.autoClear;e.setRenderTarget(n),e.autoClear=!1,i=t.clearColor||i,r=t.clearAlpha||r,i!=null&&(e.setClearColor(i),e.setClearAlpha(r||0),e.clear()),this.scene.overrideMaterial=t,e.render(this.scene,this.camera),this.scene.overrideMaterial=null,e.autoClear=o,e.setClearColor(this._originalClearColor),e.setClearAlpha(a)}_overrideVisibility(){const e=this.scene,t=this._visibilityCache;e.traverse(function(n){(n.isPoints||n.isLine||n.isLine2)&&n.visible&&(n.visible=!1,t.push(n))})}_restoreVisibility(){const e=this._visibilityCache;for(let t=0;tr instanceof tl&&r.material.uniforms.resolution);i&&(i.material.uniforms.resolution.value.x=1/(e*n),i.material.uniforms.resolution.value.y=1/(t*n))}init(){const{width:e,height:t}=this.engine.deviceModule.getContainerSize(),n=this.engine.scene,i=this.engine.camera,r=this.engine.renderer,a=this.engine.renderer?.getPixelRatio?.()??window.devicePixelRatio??1,o=new Cn(e,t,{minFilter:Pt,magFilter:Pt,format:vn,samples:4});this.composer=new q3(r,o),this.composer.setPixelRatio(a),this.composer.setSize(e,t);const l=new Z3(n,i);this.composer.addPass(l),this.gtaoPass=new bn(n,i,e,t),this.gtaoPass.output=bn.OUTPUT.Default,this.gtaoPass.blendIntensity=.3,this.gtaoPass.enabled=!1,this.gtaoPass.updateGtaoMaterial&&this.gtaoPass.updateGtaoMaterial({radius:1,distanceExponent:1,thickness:1,scale:1,distanceFallOff:1,screenSpaceRadius:!0}),this.composer.addPass(this.gtaoPass),this.ssaoPass=new Li(n,i,e,t),this.ssaoPass.kernelRadius=8,this.ssaoPass.minDistance=.005,this.ssaoPass.maxDistance=.1,this.ssaoPass.output=Li.OUTPUT.Default,this.ssaoPass.enabled=!1,this.composer.addPass(this.ssaoPass),this.saturationPass=new tl(e_),this.saturationPass.uniforms.saturation.value=1.3,this.saturationPass.uniforms.contrast.value=1.1,this.saturationPass.enabled=!1,this.composer.addPass(this.saturationPass),this.outputPass=new J3,this.outputPass.enabled=!1,this.composer.addPass(this.outputPass),this.fxaaPass=new tl(Q3),this.fxaaPass.material.uniforms.resolution.value.x=1/(e*a),this.fxaaPass.material.uniforms.resolution.value.y=1/(t*a),this.fxaaPass.enabled=!1,this.composer.addPass(this.fxaaPass)}}var cl=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function em(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}function hl(s){throw new Error('Could not dynamically require "'+s+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var tm={exports:{}},nm;function n_(){return nm||(nm=1,(function(s,e){(function(t){s.exports=t()})(function(){return(function t(n,i,r){function a(c,h){if(!i[c]){if(!n[c]){var u=typeof hl=="function"&&hl;if(!h&&u)return u(c,!0);if(o)return o(c,!0);var p=new Error("Cannot find module '"+c+"'");throw p.code="MODULE_NOT_FOUND",p}var d=i[c]={exports:{}};n[c][0].call(d.exports,function(m){var f=n[c][1][m];return a(f||m)},d,d.exports,t,n,i,r)}return i[c].exports}for(var o=typeof hl=="function"&&hl,l=0;l>2,d=(3&c)<<4|h>>4,m=1>6:64,f=2>4,h=(15&p)<<4|(d=o.indexOf(l.charAt(f++)))>>2,u=(3&d)<<6|(m=o.indexOf(l.charAt(f++))),y[x++]=c,d!==64&&(y[x++]=h),m!==64&&(y[x++]=u);return y}},{"./support":30,"./utils":32}],2:[function(t,n,i){var r=t("./external"),a=t("./stream/DataWorker"),o=t("./stream/Crc32Probe"),l=t("./stream/DataLengthProbe");function c(h,u,p,d,m){this.compressedSize=h,this.uncompressedSize=u,this.crc32=p,this.compression=d,this.compressedContent=m}c.prototype={getContentWorker:function(){var h=new a(r.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new l("data_length")),u=this;return h.on("end",function(){if(this.streamInfo.data_length!==u.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),h},getCompressedWorker:function(){return new a(r.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},c.createWorkerFrom=function(h,u,p){return h.pipe(new o).pipe(new l("uncompressedSize")).pipe(u.compressWorker(p)).pipe(new l("compressedSize")).withStreamInfo("compression",u)},n.exports=c},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(t,n,i){var r=t("./stream/GenericWorker");i.STORE={magic:"\0\0",compressWorker:function(){return new r("STORE compression")},uncompressWorker:function(){return new r("STORE decompression")}},i.DEFLATE=t("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(t,n,i){var r=t("./utils"),a=(function(){for(var o,l=[],c=0;c<256;c++){o=c;for(var h=0;h<8;h++)o=1&o?3988292384^o>>>1:o>>>1;l[c]=o}return l})();n.exports=function(o,l){return o!==void 0&&o.length?r.getTypeOf(o)!=="string"?(function(c,h,u,p){var d=a,m=p+u;c^=-1;for(var f=p;f>>8^d[255&(c^h[f])];return-1^c})(0|l,o,o.length,0):(function(c,h,u,p){var d=a,m=p+u;c^=-1;for(var f=p;f>>8^d[255&(c^h.charCodeAt(f))];return-1^c})(0|l,o,o.length,0):0}},{"./utils":32}],5:[function(t,n,i){i.base64=!1,i.binary=!1,i.dir=!1,i.createFolders=!0,i.date=null,i.compression=null,i.compressionOptions=null,i.comment=null,i.unixPermissions=null,i.dosPermissions=null},{}],6:[function(t,n,i){var r=null;r=typeof Promise<"u"?Promise:t("lie"),n.exports={Promise:r}},{lie:37}],7:[function(t,n,i){var r=typeof Uint8Array<"u"&&typeof Uint16Array<"u"&&typeof Uint32Array<"u",a=t("pako"),o=t("./utils"),l=t("./stream/GenericWorker"),c=r?"uint8array":"array";function h(u,p){l.call(this,"FlateWorker/"+u),this._pako=null,this._pakoAction=u,this._pakoOptions=p,this.meta={}}i.magic="\b\0",o.inherits(h,l),h.prototype.processChunk=function(u){this.meta=u.meta,this._pako===null&&this._createPako(),this._pako.push(o.transformTo(c,u.data),!1)},h.prototype.flush=function(){l.prototype.flush.call(this),this._pako===null&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){l.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new a[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var u=this;this._pako.onData=function(p){u.push({data:p,meta:u.meta})}},i.compressWorker=function(u){return new h("Deflate",u)},i.uncompressWorker=function(){return new h("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(t,n,i){function r(d,m){var f,x="";for(f=0;f>>=8;return x}function a(d,m,f,x,g,y){var v,b,_=d.file,M=d.compression,T=y!==c.utf8encode,R=o.transformTo("string",y(_.name)),S=o.transformTo("string",c.utf8encode(_.name)),E=_.comment,L=o.transformTo("string",y(E)),A=o.transformTo("string",c.utf8encode(E)),I=S.length!==_.name.length,w=A.length!==E.length,z="",G="",j="",Y=_.dir,q=_.date,ie={crc32:0,compressedSize:0,uncompressedSize:0};m&&!f||(ie.crc32=d.crc32,ie.compressedSize=d.compressedSize,ie.uncompressedSize=d.uncompressedSize);var W=0;m&&(W|=8),T||!I&&!w||(W|=2048);var $=0,fe=0;Y&&($|=16),g==="UNIX"?(fe=798,$|=(function(de,se){var ce=de;return de||(ce=se?16893:33204),(65535&ce)<<16})(_.unixPermissions,Y)):(fe=20,$|=(function(de){return 63&(de||0)})(_.dosPermissions)),v=q.getUTCHours(),v<<=6,v|=q.getUTCMinutes(),v<<=5,v|=q.getUTCSeconds()/2,b=q.getUTCFullYear()-1980,b<<=4,b|=q.getUTCMonth()+1,b<<=5,b|=q.getUTCDate(),I&&(G=r(1,1)+r(h(R),4)+S,z+="up"+r(G.length,2)+G),w&&(j=r(1,1)+r(h(L),4)+A,z+="uc"+r(j.length,2)+j);var me="";return me+=` -\0`,me+=r(W,2),me+=M.magic,me+=r(v,2),me+=r(b,2),me+=r(ie.crc32,4),me+=r(ie.compressedSize,4),me+=r(ie.uncompressedSize,4),me+=r(R.length,2),me+=r(z.length,2),{fileRecord:u.LOCAL_FILE_HEADER+me+R+z,dirRecord:u.CENTRAL_FILE_HEADER+r(fe,2)+me+r(L.length,2)+"\0\0\0\0"+r($,4)+r(x,4)+R+z+L}}var o=t("../utils"),l=t("../stream/GenericWorker"),c=t("../utf8"),h=t("../crc32"),u=t("../signature");function p(d,m,f,x){l.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=m,this.zipPlatform=f,this.encodeFileName=x,this.streamFiles=d,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}o.inherits(p,l),p.prototype.push=function(d){var m=d.meta.percent||0,f=this.entriesCount,x=this._sources.length;this.accumulate?this.contentBuffer.push(d):(this.bytesWritten+=d.data.length,l.prototype.push.call(this,{data:d.data,meta:{currentFile:this.currentFile,percent:f?(m+100*(f-x-1))/f:100}}))},p.prototype.openedSource=function(d){this.currentSourceOffset=this.bytesWritten,this.currentFile=d.file.name;var m=this.streamFiles&&!d.file.dir;if(m){var f=a(d,m,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:f.fileRecord,meta:{percent:0}})}else this.accumulate=!0},p.prototype.closedSource=function(d){this.accumulate=!1;var m=this.streamFiles&&!d.file.dir,f=a(d,m,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(f.dirRecord),m)this.push({data:(function(x){return u.DATA_DESCRIPTOR+r(x.crc32,4)+r(x.compressedSize,4)+r(x.uncompressedSize,4)})(d),meta:{percent:100}});else for(this.push({data:f.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},p.prototype.flush=function(){for(var d=this.bytesWritten,m=0;m=this.index;l--)c=(c<<8)+this.byteAt(l);return this.index+=o,c},readString:function(o){return r.transformTo("string",this.readData(o))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var o=this.readInt(4);return new Date(Date.UTC(1980+(o>>25&127),(o>>21&15)-1,o>>16&31,o>>11&31,o>>5&63,(31&o)<<1))}},n.exports=a},{"../utils":32}],19:[function(t,n,i){var r=t("./Uint8ArrayReader");function a(o){r.call(this,o)}t("../utils").inherits(a,r),a.prototype.readData=function(o){this.checkOffset(o);var l=this.data.slice(this.zero+this.index,this.zero+this.index+o);return this.index+=o,l},n.exports=a},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(t,n,i){var r=t("./DataReader");function a(o){r.call(this,o)}t("../utils").inherits(a,r),a.prototype.byteAt=function(o){return this.data.charCodeAt(this.zero+o)},a.prototype.lastIndexOfSignature=function(o){return this.data.lastIndexOf(o)-this.zero},a.prototype.readAndCheckSignature=function(o){return o===this.readData(4)},a.prototype.readData=function(o){this.checkOffset(o);var l=this.data.slice(this.zero+this.index,this.zero+this.index+o);return this.index+=o,l},n.exports=a},{"../utils":32,"./DataReader":18}],21:[function(t,n,i){var r=t("./ArrayReader");function a(o){r.call(this,o)}t("../utils").inherits(a,r),a.prototype.readData=function(o){if(this.checkOffset(o),o===0)return new Uint8Array(0);var l=this.data.subarray(this.zero+this.index,this.zero+this.index+o);return this.index+=o,l},n.exports=a},{"../utils":32,"./ArrayReader":17}],22:[function(t,n,i){var r=t("../utils"),a=t("../support"),o=t("./ArrayReader"),l=t("./StringReader"),c=t("./NodeBufferReader"),h=t("./Uint8ArrayReader");n.exports=function(u){var p=r.getTypeOf(u);return r.checkSupport(p),p!=="string"||a.uint8array?p==="nodebuffer"?new c(u):a.uint8array?new h(r.transformTo("uint8array",u)):new o(r.transformTo("array",u)):new l(u)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(t,n,i){i.LOCAL_FILE_HEADER="PK",i.CENTRAL_FILE_HEADER="PK",i.CENTRAL_DIRECTORY_END="PK",i.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK\x07",i.ZIP64_CENTRAL_DIRECTORY_END="PK",i.DATA_DESCRIPTOR="PK\x07\b"},{}],24:[function(t,n,i){var r=t("./GenericWorker"),a=t("../utils");function o(l){r.call(this,"ConvertWorker to "+l),this.destType=l}a.inherits(o,r),o.prototype.processChunk=function(l){this.push({data:a.transformTo(this.destType,l.data),meta:l.meta})},n.exports=o},{"../utils":32,"./GenericWorker":28}],25:[function(t,n,i){var r=t("./GenericWorker"),a=t("../crc32");function o(){r.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}t("../utils").inherits(o,r),o.prototype.processChunk=function(l){this.streamInfo.crc32=a(l.data,this.streamInfo.crc32||0),this.push(l)},n.exports=o},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(t,n,i){var r=t("../utils"),a=t("./GenericWorker");function o(l){a.call(this,"DataLengthProbe for "+l),this.propName=l,this.withStreamInfo(l,0)}r.inherits(o,a),o.prototype.processChunk=function(l){if(l){var c=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=c+l.data.length}a.prototype.processChunk.call(this,l)},n.exports=o},{"../utils":32,"./GenericWorker":28}],27:[function(t,n,i){var r=t("../utils"),a=t("./GenericWorker");function o(l){a.call(this,"DataWorker");var c=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,l.then(function(h){c.dataIsReady=!0,c.data=h,c.max=h&&h.length||0,c.type=r.getTypeOf(h),c.isPaused||c._tickAndRepeat()},function(h){c.error(h)})}r.inherits(o,a),o.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this.data=null},o.prototype.resume=function(){return!!a.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,r.delay(this._tickAndRepeat,[],this)),!0)},o.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(r.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},o.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var l=null,c=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":l=this.data.substring(this.index,c);break;case"uint8array":l=this.data.subarray(this.index,c);break;case"array":case"nodebuffer":l=this.data.slice(this.index,c)}return this.index=c,this.push({data:l,meta:{percent:this.max?this.index/this.max*100:0}})},n.exports=o},{"../utils":32,"./GenericWorker":28}],28:[function(t,n,i){function r(a){this.name=a||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}r.prototype={push:function(a){this.emit("data",a)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(a){this.emit("error",a)}return!0},error:function(a){return!this.isFinished&&(this.isPaused?this.generatedError=a:(this.isFinished=!0,this.emit("error",a),this.previous&&this.previous.error(a),this.cleanUp()),!0)},on:function(a,o){return this._listeners[a].push(o),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(a,o){if(this._listeners[a])for(var l=0;l "+a:a}},n.exports=r},{}],29:[function(t,n,i){var r=t("../utils"),a=t("./ConvertWorker"),o=t("./GenericWorker"),l=t("../base64"),c=t("../support"),h=t("../external"),u=null;if(c.nodestream)try{u=t("../nodejs/NodejsStreamOutputAdapter")}catch{}function p(m,f){return new h.Promise(function(x,g){var y=[],v=m._internalType,b=m._outputType,_=m._mimeType;m.on("data",function(M,T){y.push(M),f&&f(T)}).on("error",function(M){y=[],g(M)}).on("end",function(){try{var M=(function(T,R,S){switch(T){case"blob":return r.newBlob(r.transformTo("arraybuffer",R),S);case"base64":return l.encode(R);default:return r.transformTo(T,R)}})(b,(function(T,R){var S,E=0,L=null,A=0;for(S=0;S"u")i.blob=!1;else{var r=new ArrayBuffer(0);try{i.blob=new Blob([r],{type:"application/zip"}).size===0}catch{try{var a=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);a.append(r),i.blob=a.getBlob("application/zip").size===0}catch{i.blob=!1}}}try{i.nodestream=!!t("readable-stream").Readable}catch{i.nodestream=!1}},{"readable-stream":16}],31:[function(t,n,i){for(var r=t("./utils"),a=t("./support"),o=t("./nodejsUtils"),l=t("./stream/GenericWorker"),c=new Array(256),h=0;h<256;h++)c[h]=252<=h?6:248<=h?5:240<=h?4:224<=h?3:192<=h?2:1;c[254]=c[254]=1;function u(){l.call(this,"utf-8 decode"),this.leftOver=null}function p(){l.call(this,"utf-8 encode")}i.utf8encode=function(d){return a.nodebuffer?o.newBufferFrom(d,"utf-8"):(function(m){var f,x,g,y,v,b=m.length,_=0;for(y=0;y>>6:(x<65536?f[v++]=224|x>>>12:(f[v++]=240|x>>>18,f[v++]=128|x>>>12&63),f[v++]=128|x>>>6&63),f[v++]=128|63&x);return f})(d)},i.utf8decode=function(d){return a.nodebuffer?r.transformTo("nodebuffer",d).toString("utf-8"):(function(m){var f,x,g,y,v=m.length,b=new Array(2*v);for(f=x=0;f>10&1023,b[x++]=56320|1023&g)}return b.length!==x&&(b.subarray?b=b.subarray(0,x):b.length=x),r.applyFromCharCode(b)})(d=r.transformTo(a.uint8array?"uint8array":"array",d))},r.inherits(u,l),u.prototype.processChunk=function(d){var m=r.transformTo(a.uint8array?"uint8array":"array",d.data);if(this.leftOver&&this.leftOver.length){if(a.uint8array){var f=m;(m=new Uint8Array(f.length+this.leftOver.length)).set(this.leftOver,0),m.set(f,this.leftOver.length)}else m=this.leftOver.concat(m);this.leftOver=null}var x=(function(y,v){var b;for((v=v||y.length)>y.length&&(v=y.length),b=v-1;0<=b&&(192&y[b])==128;)b--;return b<0||b===0?v:b+c[y[b]]>v?b:v})(m),g=m;x!==m.length&&(a.uint8array?(g=m.subarray(0,x),this.leftOver=m.subarray(x,m.length)):(g=m.slice(0,x),this.leftOver=m.slice(x,m.length))),this.push({data:i.utf8decode(g),meta:d.meta})},u.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:i.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},i.Utf8DecodeWorker=u,r.inherits(p,l),p.prototype.processChunk=function(d){this.push({data:i.utf8encode(d.data),meta:d.meta})},i.Utf8EncodeWorker=p},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(t,n,i){var r=t("./support"),a=t("./base64"),o=t("./nodejsUtils"),l=t("./external");function c(f){return f}function h(f,x){for(var g=0;g>8;this.dir=!!(16&this.externalFileAttributes),d==0&&(this.dosPermissions=63&this.externalFileAttributes),d==3&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||this.fileNameStr.slice(-1)!=="/"||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var d=r(this.extraFields[1].value);this.uncompressedSize===a.MAX_VALUE_32BITS&&(this.uncompressedSize=d.readInt(8)),this.compressedSize===a.MAX_VALUE_32BITS&&(this.compressedSize=d.readInt(8)),this.localHeaderOffset===a.MAX_VALUE_32BITS&&(this.localHeaderOffset=d.readInt(8)),this.diskNumberStart===a.MAX_VALUE_32BITS&&(this.diskNumberStart=d.readInt(4))}},readExtraFields:function(d){var m,f,x,g=d.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});d.index+4>>6:(d<65536?p[x++]=224|d>>>12:(p[x++]=240|d>>>18,p[x++]=128|d>>>12&63),p[x++]=128|d>>>6&63),p[x++]=128|63&d);return p},i.buf2binstring=function(u){return h(u,u.length)},i.binstring2buf=function(u){for(var p=new r.Buf8(u.length),d=0,m=p.length;d>10&1023,y[m++]=56320|1023&f)}return h(y,m)},i.utf8border=function(u,p){var d;for((p=p||u.length)>u.length&&(p=u.length),d=p-1;0<=d&&(192&u[d])==128;)d--;return d<0||d===0?p:d+l[u[d]]>p?d:p}},{"./common":41}],43:[function(t,n,i){n.exports=function(r,a,o,l){for(var c=65535&r|0,h=r>>>16&65535|0,u=0;o!==0;){for(o-=u=2e3>>1:a>>>1;o[l]=a}return o})();n.exports=function(a,o,l,c){var h=r,u=c+l;a^=-1;for(var p=c;p>>8^h[255&(a^o[p])];return-1^a}},{}],46:[function(t,n,i){var r,a=t("../utils/common"),o=t("./trees"),l=t("./adler32"),c=t("./crc32"),h=t("./messages"),u=0,p=4,d=0,m=-2,f=-1,x=4,g=2,y=8,v=9,b=286,_=30,M=19,T=2*b+1,R=15,S=3,E=258,L=E+S+1,A=42,I=113,w=1,z=2,G=3,j=4;function Y(C,N){return C.msg=h[N],N}function q(C){return(C<<1)-(4C.avail_out&&(V=C.avail_out),V!==0&&(a.arraySet(C.output,N.pending_buf,N.pending_out,V,C.next_out),C.next_out+=V,N.pending_out+=V,C.total_out+=V,C.avail_out-=V,N.pending-=V,N.pending===0&&(N.pending_out=0))}function $(C,N){o._tr_flush_block(C,0<=C.block_start?C.block_start:-1,C.strstart-C.block_start,N),C.block_start=C.strstart,W(C.strm)}function fe(C,N){C.pending_buf[C.pending++]=N}function me(C,N){C.pending_buf[C.pending++]=N>>>8&255,C.pending_buf[C.pending++]=255&N}function de(C,N){var V,U,k=C.max_chain_length,F=C.strstart,ee=C.prev_length,J=C.nice_match,X=C.strstart>C.w_size-L?C.strstart-(C.w_size-L):0,B=C.window,D=C.w_mask,H=C.prev,K=C.strstart+E,le=B[F+ee-1],te=B[F+ee];C.prev_length>=C.good_match&&(k>>=2),J>C.lookahead&&(J=C.lookahead);do if(B[(V=N)+ee]===te&&B[V+ee-1]===le&&B[V]===B[F]&&B[++V]===B[F+1]){F+=2,V++;do;while(B[++F]===B[++V]&&B[++F]===B[++V]&&B[++F]===B[++V]&&B[++F]===B[++V]&&B[++F]===B[++V]&&B[++F]===B[++V]&&B[++F]===B[++V]&&B[++F]===B[++V]&&FX&&--k!=0);return ee<=C.lookahead?ee:C.lookahead}function se(C){var N,V,U,k,F,ee,J,X,B,D,H=C.w_size;do{if(k=C.window_size-C.lookahead-C.strstart,C.strstart>=H+(H-L)){for(a.arraySet(C.window,C.window,H,H,0),C.match_start-=H,C.strstart-=H,C.block_start-=H,N=V=C.hash_size;U=C.head[--N],C.head[N]=H<=U?U-H:0,--V;);for(N=V=H;U=C.prev[--N],C.prev[N]=H<=U?U-H:0,--V;);k+=H}if(C.strm.avail_in===0)break;if(ee=C.strm,J=C.window,X=C.strstart+C.lookahead,B=k,D=void 0,D=ee.avail_in,B=S)for(F=C.strstart-C.insert,C.ins_h=C.window[F],C.ins_h=(C.ins_h<=S&&(C.ins_h=(C.ins_h<=S)if(U=o._tr_tally(C,C.strstart-C.match_start,C.match_length-S),C.lookahead-=C.match_length,C.match_length<=C.max_lazy_match&&C.lookahead>=S){for(C.match_length--;C.strstart++,C.ins_h=(C.ins_h<=S&&(C.ins_h=(C.ins_h<=S&&C.match_length<=C.prev_length){for(k=C.strstart+C.lookahead-S,U=o._tr_tally(C,C.strstart-1-C.prev_match,C.prev_length-S),C.lookahead-=C.prev_length-1,C.prev_length-=2;++C.strstart<=k&&(C.ins_h=(C.ins_h<C.pending_buf_size-5&&(V=C.pending_buf_size-5);;){if(C.lookahead<=1){if(se(C),C.lookahead===0&&N===u)return w;if(C.lookahead===0)break}C.strstart+=C.lookahead,C.lookahead=0;var U=C.block_start+V;if((C.strstart===0||C.strstart>=U)&&(C.lookahead=C.strstart-U,C.strstart=U,$(C,!1),C.strm.avail_out===0)||C.strstart-C.block_start>=C.w_size-L&&($(C,!1),C.strm.avail_out===0))return w}return C.insert=0,N===p?($(C,!0),C.strm.avail_out===0?G:j):(C.strstart>C.block_start&&($(C,!1),C.strm.avail_out),w)}),new ye(4,4,8,4,ce),new ye(4,5,16,8,ce),new ye(4,6,32,32,ce),new ye(4,4,16,16,pe),new ye(8,16,32,32,pe),new ye(8,16,128,128,pe),new ye(8,32,128,256,pe),new ye(32,128,258,1024,pe),new ye(32,258,258,4096,pe)],i.deflateInit=function(C,N){return ke(C,N,y,15,8,0)},i.deflateInit2=ke,i.deflateReset=Je,i.deflateResetKeep=Be,i.deflateSetHeader=function(C,N){return C&&C.state?C.state.wrap!==2?m:(C.state.gzhead=N,d):m},i.deflate=function(C,N){var V,U,k,F;if(!C||!C.state||5>8&255),fe(U,U.gzhead.time>>16&255),fe(U,U.gzhead.time>>24&255),fe(U,U.level===9?2:2<=U.strategy||U.level<2?4:0),fe(U,255&U.gzhead.os),U.gzhead.extra&&U.gzhead.extra.length&&(fe(U,255&U.gzhead.extra.length),fe(U,U.gzhead.extra.length>>8&255)),U.gzhead.hcrc&&(C.adler=c(C.adler,U.pending_buf,U.pending,0)),U.gzindex=0,U.status=69):(fe(U,0),fe(U,0),fe(U,0),fe(U,0),fe(U,0),fe(U,U.level===9?2:2<=U.strategy||U.level<2?4:0),fe(U,3),U.status=I);else{var ee=y+(U.w_bits-8<<4)<<8;ee|=(2<=U.strategy||U.level<2?0:U.level<6?1:U.level===6?2:3)<<6,U.strstart!==0&&(ee|=32),ee+=31-ee%31,U.status=I,me(U,ee),U.strstart!==0&&(me(U,C.adler>>>16),me(U,65535&C.adler)),C.adler=1}if(U.status===69)if(U.gzhead.extra){for(k=U.pending;U.gzindex<(65535&U.gzhead.extra.length)&&(U.pending!==U.pending_buf_size||(U.gzhead.hcrc&&U.pending>k&&(C.adler=c(C.adler,U.pending_buf,U.pending-k,k)),W(C),k=U.pending,U.pending!==U.pending_buf_size));)fe(U,255&U.gzhead.extra[U.gzindex]),U.gzindex++;U.gzhead.hcrc&&U.pending>k&&(C.adler=c(C.adler,U.pending_buf,U.pending-k,k)),U.gzindex===U.gzhead.extra.length&&(U.gzindex=0,U.status=73)}else U.status=73;if(U.status===73)if(U.gzhead.name){k=U.pending;do{if(U.pending===U.pending_buf_size&&(U.gzhead.hcrc&&U.pending>k&&(C.adler=c(C.adler,U.pending_buf,U.pending-k,k)),W(C),k=U.pending,U.pending===U.pending_buf_size)){F=1;break}F=U.gzindexk&&(C.adler=c(C.adler,U.pending_buf,U.pending-k,k)),F===0&&(U.gzindex=0,U.status=91)}else U.status=91;if(U.status===91)if(U.gzhead.comment){k=U.pending;do{if(U.pending===U.pending_buf_size&&(U.gzhead.hcrc&&U.pending>k&&(C.adler=c(C.adler,U.pending_buf,U.pending-k,k)),W(C),k=U.pending,U.pending===U.pending_buf_size)){F=1;break}F=U.gzindexk&&(C.adler=c(C.adler,U.pending_buf,U.pending-k,k)),F===0&&(U.status=103)}else U.status=103;if(U.status===103&&(U.gzhead.hcrc?(U.pending+2>U.pending_buf_size&&W(C),U.pending+2<=U.pending_buf_size&&(fe(U,255&C.adler),fe(U,C.adler>>8&255),C.adler=0,U.status=I)):U.status=I),U.pending!==0){if(W(C),C.avail_out===0)return U.last_flush=-1,d}else if(C.avail_in===0&&q(N)<=q(V)&&N!==p)return Y(C,-5);if(U.status===666&&C.avail_in!==0)return Y(C,-5);if(C.avail_in!==0||U.lookahead!==0||N!==u&&U.status!==666){var J=U.strategy===2?(function(X,B){for(var D;;){if(X.lookahead===0&&(se(X),X.lookahead===0)){if(B===u)return w;break}if(X.match_length=0,D=o._tr_tally(X,0,X.window[X.strstart]),X.lookahead--,X.strstart++,D&&($(X,!1),X.strm.avail_out===0))return w}return X.insert=0,B===p?($(X,!0),X.strm.avail_out===0?G:j):X.last_lit&&($(X,!1),X.strm.avail_out===0)?w:z})(U,N):U.strategy===3?(function(X,B){for(var D,H,K,le,te=X.window;;){if(X.lookahead<=E){if(se(X),X.lookahead<=E&&B===u)return w;if(X.lookahead===0)break}if(X.match_length=0,X.lookahead>=S&&0X.lookahead&&(X.match_length=X.lookahead)}if(X.match_length>=S?(D=o._tr_tally(X,1,X.match_length-S),X.lookahead-=X.match_length,X.strstart+=X.match_length,X.match_length=0):(D=o._tr_tally(X,0,X.window[X.strstart]),X.lookahead--,X.strstart++),D&&($(X,!1),X.strm.avail_out===0))return w}return X.insert=0,B===p?($(X,!0),X.strm.avail_out===0?G:j):X.last_lit&&($(X,!1),X.strm.avail_out===0)?w:z})(U,N):r[U.level].func(U,N);if(J!==G&&J!==j||(U.status=666),J===w||J===G)return C.avail_out===0&&(U.last_flush=-1),d;if(J===z&&(N===1?o._tr_align(U):N!==5&&(o._tr_stored_block(U,0,0,!1),N===3&&(ie(U.head),U.lookahead===0&&(U.strstart=0,U.block_start=0,U.insert=0))),W(C),C.avail_out===0))return U.last_flush=-1,d}return N!==p?d:U.wrap<=0?1:(U.wrap===2?(fe(U,255&C.adler),fe(U,C.adler>>8&255),fe(U,C.adler>>16&255),fe(U,C.adler>>24&255),fe(U,255&C.total_in),fe(U,C.total_in>>8&255),fe(U,C.total_in>>16&255),fe(U,C.total_in>>24&255)):(me(U,C.adler>>>16),me(U,65535&C.adler)),W(C),0=V.w_size&&(F===0&&(ie(V.head),V.strstart=0,V.block_start=0,V.insert=0),B=new a.Buf8(V.w_size),a.arraySet(B,N,D-V.w_size,V.w_size,0),N=B,D=V.w_size),ee=C.avail_in,J=C.next_in,X=C.input,C.avail_in=D,C.next_in=0,C.input=N,se(V);V.lookahead>=S;){for(U=V.strstart,k=V.lookahead-(S-1);V.ins_h=(V.ins_h<>>=S=R>>>24,v-=S,(S=R>>>16&255)===0)z[h++]=65535&R;else{if(!(16&S)){if((64&S)==0){R=b[(65535&R)+(y&(1<>>=S,v-=S),v<15&&(y+=w[l++]<>>=S=R>>>24,v-=S,!(16&(S=R>>>16&255))){if((64&S)==0){R=_[(65535&R)+(y&(1<>>=S,v-=S,(S=h-u)>3,y&=(1<<(v-=E<<3))-1,r.next_in=l,r.next_out=h,r.avail_in=l>>24&255)+(A>>>8&65280)+((65280&A)<<8)+((255&A)<<24)}function y(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new r.Buf16(320),this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function v(A){var I;return A&&A.state?(I=A.state,A.total_in=A.total_out=I.total=0,A.msg="",I.wrap&&(A.adler=1&I.wrap),I.mode=m,I.last=0,I.havedict=0,I.dmax=32768,I.head=null,I.hold=0,I.bits=0,I.lencode=I.lendyn=new r.Buf32(f),I.distcode=I.distdyn=new r.Buf32(x),I.sane=1,I.back=-1,p):d}function b(A){var I;return A&&A.state?((I=A.state).wsize=0,I.whave=0,I.wnext=0,v(A)):d}function _(A,I){var w,z;return A&&A.state?(z=A.state,I<0?(w=0,I=-I):(w=1+(I>>4),I<48&&(I&=15)),I&&(I<8||15=j.wsize?(r.arraySet(j.window,I,w-j.wsize,j.wsize,0),j.wnext=0,j.whave=j.wsize):(z<(G=j.wsize-j.wnext)&&(G=z),r.arraySet(j.window,I,w-z,G,j.wnext),(z-=G)?(r.arraySet(j.window,I,w-z,z,0),j.wnext=z,j.whave=j.wsize):(j.wnext+=G,j.wnext===j.wsize&&(j.wnext=0),j.whave>>8&255,w.check=o(w.check,F,2,0),$=W=0,w.mode=2;break}if(w.flags=0,w.head&&(w.head.done=!1),!(1&w.wrap)||(((255&W)<<8)+(W>>8))%31){A.msg="incorrect header check",w.mode=30;break}if((15&W)!=8){A.msg="unknown compression method",w.mode=30;break}if($-=4,C=8+(15&(W>>>=4)),w.wbits===0)w.wbits=C;else if(C>w.wbits){A.msg="invalid window size",w.mode=30;break}w.dmax=1<>8&1),512&w.flags&&(F[0]=255&W,F[1]=W>>>8&255,w.check=o(w.check,F,2,0)),$=W=0,w.mode=3;case 3:for(;$<32;){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}w.head&&(w.head.time=W),512&w.flags&&(F[0]=255&W,F[1]=W>>>8&255,F[2]=W>>>16&255,F[3]=W>>>24&255,w.check=o(w.check,F,4,0)),$=W=0,w.mode=4;case 4:for(;$<16;){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}w.head&&(w.head.xflags=255&W,w.head.os=W>>8),512&w.flags&&(F[0]=255&W,F[1]=W>>>8&255,w.check=o(w.check,F,2,0)),$=W=0,w.mode=5;case 5:if(1024&w.flags){for(;$<16;){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}w.length=W,w.head&&(w.head.extra_len=W),512&w.flags&&(F[0]=255&W,F[1]=W>>>8&255,w.check=o(w.check,F,2,0)),$=W=0}else w.head&&(w.head.extra=null);w.mode=6;case 6:if(1024&w.flags&&(q<(de=w.length)&&(de=q),de&&(w.head&&(C=w.head.extra_len-w.length,w.head.extra||(w.head.extra=new Array(w.head.extra_len)),r.arraySet(w.head.extra,z,j,de,C)),512&w.flags&&(w.check=o(w.check,z,de,j)),q-=de,j+=de,w.length-=de),w.length))break e;w.length=0,w.mode=7;case 7:if(2048&w.flags){if(q===0)break e;for(de=0;C=z[j+de++],w.head&&C&&w.length<65536&&(w.head.name+=String.fromCharCode(C)),C&&de>9&1,w.head.done=!0),A.adler=w.check=0,w.mode=12;break;case 10:for(;$<32;){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}A.adler=w.check=g(W),$=W=0,w.mode=11;case 11:if(w.havedict===0)return A.next_out=Y,A.avail_out=ie,A.next_in=j,A.avail_in=q,w.hold=W,w.bits=$,2;A.adler=w.check=1,w.mode=12;case 12:if(I===5||I===6)break e;case 13:if(w.last){W>>>=7&$,$-=7&$,w.mode=27;break}for(;$<3;){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}switch(w.last=1&W,$-=1,3&(W>>>=1)){case 0:w.mode=14;break;case 1:if(E(w),w.mode=20,I!==6)break;W>>>=2,$-=2;break e;case 2:w.mode=17;break;case 3:A.msg="invalid block type",w.mode=30}W>>>=2,$-=2;break;case 14:for(W>>>=7&$,$-=7&$;$<32;){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}if((65535&W)!=(W>>>16^65535)){A.msg="invalid stored block lengths",w.mode=30;break}if(w.length=65535&W,$=W=0,w.mode=15,I===6)break e;case 15:w.mode=16;case 16:if(de=w.length){if(q>>=5,$-=5,w.ndist=1+(31&W),W>>>=5,$-=5,w.ncode=4+(15&W),W>>>=4,$-=4,286>>=3,$-=3}for(;w.have<19;)w.lens[ee[w.have++]]=0;if(w.lencode=w.lendyn,w.lenbits=7,V={bits:w.lenbits},N=c(0,w.lens,0,19,w.lencode,0,w.work,V),w.lenbits=V.bits,N){A.msg="invalid code lengths set",w.mode=30;break}w.have=0,w.mode=19;case 19:for(;w.have>>16&255,Se=65535&k,!((pe=k>>>24)<=$);){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}if(Se<16)W>>>=pe,$-=pe,w.lens[w.have++]=Se;else{if(Se===16){for(U=pe+2;$>>=pe,$-=pe,w.have===0){A.msg="invalid bit length repeat",w.mode=30;break}C=w.lens[w.have-1],de=3+(3&W),W>>>=2,$-=2}else if(Se===17){for(U=pe+3;$>>=pe)),W>>>=3,$-=3}else{for(U=pe+7;$>>=pe)),W>>>=7,$-=7}if(w.have+de>w.nlen+w.ndist){A.msg="invalid bit length repeat",w.mode=30;break}for(;de--;)w.lens[w.have++]=C}}if(w.mode===30)break;if(w.lens[256]===0){A.msg="invalid code -- missing end-of-block",w.mode=30;break}if(w.lenbits=9,V={bits:w.lenbits},N=c(h,w.lens,0,w.nlen,w.lencode,0,w.work,V),w.lenbits=V.bits,N){A.msg="invalid literal/lengths set",w.mode=30;break}if(w.distbits=6,w.distcode=w.distdyn,V={bits:w.distbits},N=c(u,w.lens,w.nlen,w.ndist,w.distcode,0,w.work,V),w.distbits=V.bits,N){A.msg="invalid distances set",w.mode=30;break}if(w.mode=20,I===6)break e;case 20:w.mode=21;case 21:if(6<=q&&258<=ie){A.next_out=Y,A.avail_out=ie,A.next_in=j,A.avail_in=q,w.hold=W,w.bits=$,l(A,me),Y=A.next_out,G=A.output,ie=A.avail_out,j=A.next_in,z=A.input,q=A.avail_in,W=w.hold,$=w.bits,w.mode===12&&(w.back=-1);break}for(w.back=0;ye=(k=w.lencode[W&(1<>>16&255,Se=65535&k,!((pe=k>>>24)<=$);){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}if(ye&&(240&ye)==0){for(Be=pe,Je=ye,ke=Se;ye=(k=w.lencode[ke+((W&(1<>Be)])>>>16&255,Se=65535&k,!(Be+(pe=k>>>24)<=$);){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}W>>>=Be,$-=Be,w.back+=Be}if(W>>>=pe,$-=pe,w.back+=pe,w.length=Se,ye===0){w.mode=26;break}if(32&ye){w.back=-1,w.mode=12;break}if(64&ye){A.msg="invalid literal/length code",w.mode=30;break}w.extra=15&ye,w.mode=22;case 22:if(w.extra){for(U=w.extra;$>>=w.extra,$-=w.extra,w.back+=w.extra}w.was=w.length,w.mode=23;case 23:for(;ye=(k=w.distcode[W&(1<>>16&255,Se=65535&k,!((pe=k>>>24)<=$);){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}if((240&ye)==0){for(Be=pe,Je=ye,ke=Se;ye=(k=w.distcode[ke+((W&(1<>Be)])>>>16&255,Se=65535&k,!(Be+(pe=k>>>24)<=$);){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}W>>>=Be,$-=Be,w.back+=Be}if(W>>>=pe,$-=pe,w.back+=pe,64&ye){A.msg="invalid distance code",w.mode=30;break}w.offset=Se,w.extra=15&ye,w.mode=24;case 24:if(w.extra){for(U=w.extra;$>>=w.extra,$-=w.extra,w.back+=w.extra}if(w.offset>w.dmax){A.msg="invalid distance too far back",w.mode=30;break}w.mode=25;case 25:if(ie===0)break e;if(de=me-ie,w.offset>de){if((de=w.offset-de)>w.whave&&w.sane){A.msg="invalid distance too far back",w.mode=30;break}se=de>w.wnext?(de-=w.wnext,w.wsize-de):w.wnext-de,de>w.length&&(de=w.length),ce=w.window}else ce=G,se=Y-w.offset,de=w.length;for(ieT?(S=se[ce+x[I]],$[fe+x[I]]):(S=96,0),y=1<>Y)+(v-=y)]=R<<24|S<<16|E|0,v!==0;);for(y=1<>=1;if(y!==0?(W&=y-1,W+=y):W=0,I++,--me[A]==0){if(A===z)break;A=u[p+x[I]]}if(G>>7)]}function fe(k,F){k.pending_buf[k.pending++]=255&F,k.pending_buf[k.pending++]=F>>>8&255}function me(k,F,ee){k.bi_valid>g-ee?(k.bi_buf|=F<>g-k.bi_valid,k.bi_valid+=ee-g):(k.bi_buf|=F<>>=1,ee<<=1,0<--F;);return ee>>>1}function ce(k,F,ee){var J,X,B=new Array(x+1),D=0;for(J=1;J<=x;J++)B[J]=D=D+ee[J-1]<<1;for(X=0;X<=F;X++){var H=k[2*X+1];H!==0&&(k[2*X]=se(B[H]++,H))}}function pe(k){var F;for(F=0;F>1;1<=ee;ee--)Be(k,B,ee);for(X=K;ee=k.heap[1],k.heap[1]=k.heap[k.heap_len--],Be(k,B,1),J=k.heap[1],k.heap[--k.heap_max]=ee,k.heap[--k.heap_max]=J,B[2*X]=B[2*ee]+B[2*J],k.depth[X]=(k.depth[ee]>=k.depth[J]?k.depth[ee]:k.depth[J])+1,B[2*ee+1]=B[2*J+1]=X,k.heap[1]=X++,Be(k,B,1),2<=k.heap_len;);k.heap[--k.heap_max]=k.heap[1],(function(te,Ce){var be,Re,Ie,ue,_e,Ve,Ue=Ce.dyn_tree,Ae=Ce.max_code,Ge=Ce.stat_desc.static_tree,Z=Ce.stat_desc.has_stree,Te=Ce.stat_desc.extra_bits,Me=Ce.stat_desc.extra_base,we=Ce.stat_desc.max_length,ve=0;for(ue=0;ue<=x;ue++)te.bl_count[ue]=0;for(Ue[2*te.heap[te.heap_max]+1]=0,be=te.heap_max+1;be>=7;X>>=1)if(1&le&&H.dyn_ltree[2*K]!==0)return a;if(H.dyn_ltree[18]!==0||H.dyn_ltree[20]!==0||H.dyn_ltree[26]!==0)return o;for(K=32;K>>3,(B=k.static_len+3+7>>>3)<=X&&(X=B)):X=B=ee+5,ee+4<=X&&F!==-1?U(k,F,ee,J):k.strategy===4||B===X?(me(k,2+(J?1:0),3),Je(k,L,A)):(me(k,4+(J?1:0),3),(function(H,K,le,te){var Ce;for(me(H,K-257,5),me(H,le-1,5),me(H,te-4,4),Ce=0;Ce>>8&255,k.pending_buf[k.d_buf+2*k.last_lit+1]=255&F,k.pending_buf[k.l_buf+k.last_lit]=255&ee,k.last_lit++,F===0?k.dyn_ltree[2*ee]++:(k.matches++,F--,k.dyn_ltree[2*(w[ee]+u+1)]++,k.dyn_dtree[2*$(F)]++),k.last_lit===k.lit_bufsize-1},i._tr_align=function(k){me(k,2,3),de(k,v,L),(function(F){F.bi_valid===16?(fe(F,F.bi_buf),F.bi_buf=0,F.bi_valid=0):8<=F.bi_valid&&(F.pending_buf[F.pending++]=255&F.bi_buf,F.bi_buf>>=8,F.bi_valid-=8)})(k)}},{"../utils/common":41}],53:[function(t,n,i){n.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(t,n,i){(function(r){(function(a,o){if(!a.setImmediate){var l,c,h,u,p=1,d={},m=!1,f=a.document,x=Object.getPrototypeOf&&Object.getPrototypeOf(a);x=x&&x.setTimeout?x:a,l={}.toString.call(a.process)==="[object process]"?function(b){process.nextTick(function(){y(b)})}:(function(){if(a.postMessage&&!a.importScripts){var b=!0,_=a.onmessage;return a.onmessage=function(){b=!1},a.postMessage("","*"),a.onmessage=_,b}})()?(u="setImmediate$"+Math.random()+"$",a.addEventListener?a.addEventListener("message",v,!1):a.attachEvent("onmessage",v),function(b){a.postMessage(u+b,"*")}):a.MessageChannel?((h=new MessageChannel).port1.onmessage=function(b){y(b.data)},function(b){h.port2.postMessage(b)}):f&&"onreadystatechange"in f.createElement("script")?(c=f.documentElement,function(b){var _=f.createElement("script");_.onreadystatechange=function(){y(b),_.onreadystatechange=null,c.removeChild(_),_=null},c.appendChild(_)}):function(b){setTimeout(y,0,b)},x.setImmediate=function(b){typeof b!="function"&&(b=new Function(""+b));for(var _=new Array(arguments.length-1),M=0;M<_.length;M++)_[M]=arguments[M+1];var T={callback:b,args:_};return d[p]=T,l(p),p++},x.clearImmediate=g}function g(b){delete d[b]}function y(b){if(m)setTimeout(y,0,b);else{var _=d[b];if(_){m=!0;try{(function(M){var T=M.callback,R=M.args;switch(R.length){case 0:T();break;case 1:T(R[0]);break;case 2:T(R[0],R[1]);break;case 3:T(R[0],R[1],R[2]);break;default:T.apply(o,R)}})(_)}finally{g(b),m=!1}}}}function v(b){b.source===a&&typeof b.data=="string"&&b.data.indexOf(u)===0&&y(+b.data.slice(u.length))}})(typeof self>"u"?r===void 0?this:r:self)}).call(this,typeof cl<"u"?cl:typeof self<"u"?self:typeof window<"u"?window:{})},{}]},{},[10])(10)})})(tm)),tm.exports}var i_=n_();const im=em(i_);function sm(s,e){return function(){return s.apply(e,arguments)}}const{toString:s_}=Object.prototype,{getPrototypeOf:uu}=Object,{iterator:ul,toStringTag:rm}=Symbol,dl=(s=>e=>{const t=s_.call(e);return s[t]||(s[t]=t.slice(8,-1).toLowerCase())})(Object.create(null)),ni=s=>(s=s.toLowerCase(),e=>dl(e)===s),pl=s=>e=>typeof e===s,{isArray:Ir}=Array,Nr=pl("undefined");function Ca(s){return s!==null&&!Nr(s)&&s.constructor!==null&&!Nr(s.constructor)&&_n(s.constructor.isBuffer)&&s.constructor.isBuffer(s)}const am=ni("ArrayBuffer");function r_(s){let e;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?e=ArrayBuffer.isView(s):e=s&&s.buffer&&am(s.buffer),e}const a_=pl("string"),_n=pl("function"),om=pl("number"),Aa=s=>s!==null&&typeof s=="object",o_=s=>s===!0||s===!1,fl=s=>{if(dl(s)!=="object")return!1;const e=uu(s);return(e===null||e===Object.prototype||Object.getPrototypeOf(e)===null)&&!(rm in s)&&!(ul in s)},l_=s=>{if(!Aa(s)||Ca(s))return!1;try{return Object.keys(s).length===0&&Object.getPrototypeOf(s)===Object.prototype}catch{return!1}},c_=ni("Date"),h_=ni("File"),u_=ni("Blob"),d_=ni("FileList"),p_=s=>Aa(s)&&_n(s.pipe),f_=s=>{let e;return s&&(typeof FormData=="function"&&s instanceof FormData||_n(s.append)&&((e=dl(s))==="formdata"||e==="object"&&_n(s.toString)&&s.toString()==="[object FormData]"))},m_=ni("URLSearchParams"),[g_,x_,v_,y_]=["ReadableStream","Request","Response","Headers"].map(ni),b_=s=>s.trim?s.trim():s.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Pa(s,e,{allOwnKeys:t=!1}={}){if(s===null||typeof s>"u")return;let n,i;if(typeof s!="object"&&(s=[s]),Ir(s))for(n=0,i=s.length;n0;)if(i=t[n],e===i.toLowerCase())return i;return null}const Rs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,cm=s=>!Nr(s)&&s!==Rs;function du(){const{caseless:s,skipUndefined:e}=cm(this)&&this||{},t={},n=(i,r)=>{const a=s&&lm(t,r)||r;fl(t[a])&&fl(i)?t[a]=du(t[a],i):fl(i)?t[a]=du({},i):Ir(i)?t[a]=i.slice():(!e||!Nr(i))&&(t[a]=i)};for(let i=0,r=arguments.length;i(Pa(e,(i,r)=>{t&&_n(i)?s[r]=sm(i,t):s[r]=i},{allOwnKeys:n}),s),M_=s=>(s.charCodeAt(0)===65279&&(s=s.slice(1)),s),w_=(s,e,t,n)=>{s.prototype=Object.create(e.prototype,n),s.prototype.constructor=s,Object.defineProperty(s,"super",{value:e.prototype}),t&&Object.assign(s.prototype,t)},S_=(s,e,t,n)=>{let i,r,a;const o={};if(e=e||{},s==null)return e;do{for(i=Object.getOwnPropertyNames(s),r=i.length;r-- >0;)a=i[r],(!n||n(a,s,e))&&!o[a]&&(e[a]=s[a],o[a]=!0);s=t!==!1&&uu(s)}while(s&&(!t||t(s,e))&&s!==Object.prototype);return e},E_=(s,e,t)=>{s=String(s),(t===void 0||t>s.length)&&(t=s.length),t-=e.length;const n=s.indexOf(e,t);return n!==-1&&n===t},T_=s=>{if(!s)return null;if(Ir(s))return s;let e=s.length;if(!om(e))return null;const t=new Array(e);for(;e-- >0;)t[e]=s[e];return t},C_=(s=>e=>s&&e instanceof s)(typeof Uint8Array<"u"&&uu(Uint8Array)),A_=(s,e)=>{const t=(s&&s[ul]).call(s);let n;for(;(n=t.next())&&!n.done;){const i=n.value;e.call(s,i[0],i[1])}},P_=(s,e)=>{let t;const n=[];for(;(t=s.exec(e))!==null;)n.push(t);return n},R_=ni("HTMLFormElement"),L_=s=>s.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(e,t,n){return t.toUpperCase()+n}),hm=(({hasOwnProperty:s})=>(e,t)=>s.call(e,t))(Object.prototype),D_=ni("RegExp"),um=(s,e)=>{const t=Object.getOwnPropertyDescriptors(s),n={};Pa(t,(i,r)=>{let a;(a=e(i,r,s))!==!1&&(n[r]=a||i)}),Object.defineProperties(s,n)},I_=s=>{um(s,(e,t)=>{if(_n(s)&&["arguments","caller","callee"].indexOf(t)!==-1)return!1;const n=s[t];if(_n(n)){if(e.enumerable=!1,"writable"in e){e.writable=!1;return}e.set||(e.set=()=>{throw Error("Can not rewrite read-only method '"+t+"'")})}})},N_=(s,e)=>{const t={},n=i=>{i.forEach(r=>{t[r]=!0})};return Ir(s)?n(s):n(String(s).split(e)),t},B_=()=>{},k_=(s,e)=>s!=null&&Number.isFinite(s=+s)?s:e;function U_(s){return!!(s&&_n(s.append)&&s[rm]==="FormData"&&s[ul])}const O_=s=>{const e=new Array(10),t=(n,i)=>{if(Aa(n)){if(e.indexOf(n)>=0)return;if(Ca(n))return n;if(!("toJSON"in n)){e[i]=n;const r=Ir(n)?[]:{};return Pa(n,(a,o)=>{const l=t(a,i+1);!Nr(l)&&(r[o]=l)}),e[i]=void 0,r}}return n};return t(s,0)},z_=ni("AsyncFunction"),F_=s=>s&&(Aa(s)||_n(s))&&_n(s.then)&&_n(s.catch),dm=((s,e)=>s?setImmediate:e?((t,n)=>(Rs.addEventListener("message",({source:i,data:r})=>{i===Rs&&r===t&&n.length&&n.shift()()},!1),i=>{n.push(i),Rs.postMessage(t,"*")}))(`axios@${Math.random()}`,[]):t=>setTimeout(t))(typeof setImmediate=="function",_n(Rs.postMessage)),H_=typeof queueMicrotask<"u"?queueMicrotask.bind(Rs):typeof process<"u"&&process.nextTick||dm,V_=s=>s!=null&&_n(s[ul]),re={isArray:Ir,isArrayBuffer:am,isBuffer:Ca,isFormData:f_,isArrayBufferView:r_,isString:a_,isNumber:om,isBoolean:o_,isObject:Aa,isPlainObject:fl,isEmptyObject:l_,isReadableStream:g_,isRequest:x_,isResponse:v_,isHeaders:y_,isUndefined:Nr,isDate:c_,isFile:h_,isBlob:u_,isRegExp:D_,isFunction:_n,isStream:p_,isURLSearchParams:m_,isTypedArray:C_,isFileList:d_,forEach:Pa,merge:du,extend:__,trim:b_,stripBOM:M_,inherits:w_,toFlatObject:S_,kindOf:dl,kindOfTest:ni,endsWith:E_,toArray:T_,forEachEntry:A_,matchAll:P_,isHTMLForm:R_,hasOwnProperty:hm,hasOwnProp:hm,reduceDescriptors:um,freezeMethods:I_,toObjectSet:N_,toCamelCase:L_,noop:B_,toFiniteNumber:k_,findKey:lm,global:Rs,isContextDefined:cm,isSpecCompliantForm:U_,toJSONObject:O_,isAsyncFn:z_,isThenable:F_,setImmediate:dm,asap:H_,isIterable:V_};function Ke(s,e,t,n,i){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=s,this.name="AxiosError",e&&(this.code=e),t&&(this.config=t),n&&(this.request=n),i&&(this.response=i,this.status=i.status?i.status:null)}re.inherits(Ke,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:re.toJSONObject(this.config),code:this.code,status:this.status}}});const pm=Ke.prototype,fm={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(s=>{fm[s]={value:s}}),Object.defineProperties(Ke,fm),Object.defineProperty(pm,"isAxiosError",{value:!0}),Ke.from=(s,e,t,n,i,r)=>{const a=Object.create(pm);re.toFlatObject(s,a,function(c){return c!==Error.prototype},c=>c!=="isAxiosError");const o=s&&s.message?s.message:"Error",l=e==null&&s?s.code:e;return Ke.call(a,o,l,t,n,i),s&&a.cause==null&&Object.defineProperty(a,"cause",{value:s,configurable:!0}),a.name=s&&s.name||"Error",r&&Object.assign(a,r),a};const G_=null;function pu(s){return re.isPlainObject(s)||re.isArray(s)}function mm(s){return re.endsWith(s,"[]")?s.slice(0,-2):s}function gm(s,e,t){return s?s.concat(e).map(function(n,i){return n=mm(n),!t&&i?"["+n+"]":n}).join(t?".":""):e}function W_(s){return re.isArray(s)&&!s.some(pu)}const X_=re.toFlatObject(re,{},null,function(s){return/^is[A-Z]/.test(s)});function ml(s,e,t){if(!re.isObject(s))throw new TypeError("target must be an object");e=e||new FormData,t=re.toFlatObject(t,{metaTokens:!0,dots:!1,indexes:!1},!1,function(d,m){return!re.isUndefined(m[d])});const n=t.metaTokens,i=t.visitor||c,r=t.dots,a=t.indexes,o=(t.Blob||typeof Blob<"u"&&Blob)&&re.isSpecCompliantForm(e);if(!re.isFunction(i))throw new TypeError("visitor must be a function");function l(d){if(d===null)return"";if(re.isDate(d))return d.toISOString();if(re.isBoolean(d))return d.toString();if(!o&&re.isBlob(d))throw new Ke("Blob is not supported. Use a Buffer instead.");return re.isArrayBuffer(d)||re.isTypedArray(d)?o&&typeof Blob=="function"?new Blob([d]):Buffer.from(d):d}function c(d,m,f){let x=d;if(d&&!f&&typeof d=="object"){if(re.endsWith(m,"{}"))m=n?m:m.slice(0,-2),d=JSON.stringify(d);else if(re.isArray(d)&&W_(d)||(re.isFileList(d)||re.endsWith(m,"[]"))&&(x=re.toArray(d)))return m=mm(m),x.forEach(function(g,y){!(re.isUndefined(g)||g===null)&&e.append(a===!0?gm([m],y,r):a===null?m:m+"[]",l(g))}),!1}return pu(d)?!0:(e.append(gm(f,m,r),l(d)),!1)}const h=[],u=Object.assign(X_,{defaultVisitor:c,convertValue:l,isVisitable:pu});function p(d,m){if(!re.isUndefined(d)){if(h.indexOf(d)!==-1)throw Error("Circular reference detected in "+m.join("."));h.push(d),re.forEach(d,function(f,x){(!(re.isUndefined(f)||f===null)&&i.call(e,f,re.isString(x)?x.trim():x,m,u))===!0&&p(f,m?m.concat(x):[x])}),h.pop()}}if(!re.isObject(s))throw new TypeError("data must be an object");return p(s),e}function xm(s){const e={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(s).replace(/[!'()~]|%20|%00/g,function(t){return e[t]})}function fu(s,e){this._pairs=[],s&&ml(s,this,e)}const vm=fu.prototype;vm.append=function(s,e){this._pairs.push([s,e])},vm.toString=function(s){const e=s?function(t){return s.call(this,t,xm)}:xm;return this._pairs.map(function(t){return e(t[0])+"="+e(t[1])},"").join("&")};function j_(s){return encodeURIComponent(s).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function ym(s,e,t){if(!e)return s;const n=t&&t.encode||j_;re.isFunction(t)&&(t={serialize:t});const i=t&&t.serialize;let r;if(i?r=i(e,t):r=re.isURLSearchParams(e)?e.toString():new fu(e,t).toString(n),r){const a=s.indexOf("#");a!==-1&&(s=s.slice(0,a)),s+=(s.indexOf("?")===-1?"?":"&")+r}return s}class bm{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:n?n.synchronous:!1,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){re.forEach(this.handlers,function(t){t!==null&&e(t)})}}const _m={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},q_=typeof URLSearchParams<"u"?URLSearchParams:fu,Z_=typeof FormData<"u"?FormData:null,Y_=typeof Blob<"u"?Blob:null,$_={isBrowser:!0,classes:{URLSearchParams:q_,FormData:Z_,Blob:Y_},protocols:["http","https","file","blob","url","data"]},mu=typeof window<"u"&&typeof document<"u",gu=typeof navigator=="object"&&navigator||void 0,K_=mu&&(!gu||["ReactNative","NativeScript","NS"].indexOf(gu.product)<0),J_=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",Q_=mu&&window.location.href||"http://localhost",eM=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:mu,hasStandardBrowserEnv:K_,hasStandardBrowserWebWorkerEnv:J_,navigator:gu,origin:Q_},Symbol.toStringTag,{value:"Module"})),cn={...eM,...$_};function tM(s,e){return ml(s,new cn.classes.URLSearchParams,{visitor:function(t,n,i,r){return cn.isNode&&re.isBuffer(t)?(this.append(n,t.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)},...e})}function nM(s){return re.matchAll(/\w+|\[(\w*)]/g,s).map(e=>e[0]==="[]"?"":e[1]||e[0])}function iM(s){const e={},t=Object.keys(s);let n;const i=t.length;let r;for(n=0;n=t.length;return a=!a&&re.isArray(i)?i.length:a,l?(re.hasOwnProp(i,a)?i[a]=[i[a],n]:i[a]=n,!o):((!i[a]||!re.isObject(i[a]))&&(i[a]=[]),e(t,n,i[a],r)&&re.isArray(i[a])&&(i[a]=iM(i[a])),!o)}if(re.isFormData(s)&&re.isFunction(s.entries)){const t={};return re.forEachEntry(s,(n,i)=>{e(nM(n),i,t,0)}),t}return null}function sM(s,e,t){if(re.isString(s))try{return(e||JSON.parse)(s),re.trim(s)}catch(n){if(n.name!=="SyntaxError")throw n}return(t||JSON.stringify)(s)}const Ra={transitional:_m,adapter:["xhr","http","fetch"],transformRequest:[function(s,e){const t=e.getContentType()||"",n=t.indexOf("application/json")>-1,i=re.isObject(s);if(i&&re.isHTMLForm(s)&&(s=new FormData(s)),re.isFormData(s))return n?JSON.stringify(Mm(s)):s;if(re.isArrayBuffer(s)||re.isBuffer(s)||re.isStream(s)||re.isFile(s)||re.isBlob(s)||re.isReadableStream(s))return s;if(re.isArrayBufferView(s))return s.buffer;if(re.isURLSearchParams(s))return e.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),s.toString();let r;if(i){if(t.indexOf("application/x-www-form-urlencoded")>-1)return tM(s,this.formSerializer).toString();if((r=re.isFileList(s))||t.indexOf("multipart/form-data")>-1){const a=this.env&&this.env.FormData;return ml(r?{"files[]":s}:s,a&&new a,this.formSerializer)}}return i||n?(e.setContentType("application/json",!1),sM(s)):s}],transformResponse:[function(s){const e=this.transitional||Ra.transitional,t=e&&e.forcedJSONParsing,n=this.responseType==="json";if(re.isResponse(s)||re.isReadableStream(s))return s;if(s&&re.isString(s)&&(t&&!this.responseType||n)){const i=!(e&&e.silentJSONParsing)&&n;try{return JSON.parse(s,this.parseReviver)}catch(r){if(i)throw r.name==="SyntaxError"?Ke.from(r,Ke.ERR_BAD_RESPONSE,this,null,this.response):r}}return s}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:cn.classes.FormData,Blob:cn.classes.Blob},validateStatus:function(s){return s>=200&&s<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};re.forEach(["delete","get","head","post","put","patch"],s=>{Ra.headers[s]={}});const rM=re.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),aM=s=>{const e={};let t,n,i;return s&&s.split(` + `};class t_{engine;composer;saturationPass;ssaoPass;gtaoPass;outputPass;fxaaPass;constructor(e){this.engine=e}resize(e,t){if(e===void 0||t===void 0){const r=this.engine.deviceModule.getContainerSize();e=e??r.width,t=t??r.height}if(!e||!t||!this.composer)return;const n=this.engine.renderer?.getPixelRatio?.()??window.devicePixelRatio??1;this.composer.setPixelRatio(n),this.composer.setSize(e,t);const i=this.composer.passes.find(r=>r instanceof tl&&r.material.uniforms.resolution);i&&(i.material.uniforms.resolution.value.x=1/(e*n),i.material.uniforms.resolution.value.y=1/(t*n))}init(){const{width:e,height:t}=this.engine.deviceModule.getContainerSize(),n=this.engine.scene,i=this.engine.camera,r=this.engine.renderer,a=this.engine.renderer?.getPixelRatio?.()??window.devicePixelRatio??1,o=new Tn(e,t,{minFilter:Pt,magFilter:Pt,format:vn,samples:4});this.composer=new q3(r,o),this.composer.setPixelRatio(a),this.composer.setSize(e,t);const l=new Z3(n,i);this.composer.addPass(l),this.gtaoPass=new yn(n,i,e,t),this.gtaoPass.output=yn.OUTPUT.Default,this.gtaoPass.blendIntensity=.3,this.gtaoPass.enabled=!1,this.gtaoPass.updateGtaoMaterial&&this.gtaoPass.updateGtaoMaterial({radius:1,distanceExponent:1,thickness:1,scale:1,distanceFallOff:1,screenSpaceRadius:!0}),this.composer.addPass(this.gtaoPass),this.ssaoPass=new Li(n,i,e,t),this.ssaoPass.kernelRadius=8,this.ssaoPass.minDistance=.005,this.ssaoPass.maxDistance=.1,this.ssaoPass.output=Li.OUTPUT.Default,this.ssaoPass.enabled=!1,this.composer.addPass(this.ssaoPass),this.saturationPass=new tl(e_),this.saturationPass.uniforms.saturation.value=1.3,this.saturationPass.uniforms.contrast.value=1.1,this.saturationPass.enabled=!1,this.composer.addPass(this.saturationPass),this.outputPass=new J3,this.outputPass.enabled=!1,this.composer.addPass(this.outputPass),this.fxaaPass=new tl(Q3),this.fxaaPass.material.uniforms.resolution.value.x=1/(e*a),this.fxaaPass.material.uniforms.resolution.value.y=1/(t*a),this.fxaaPass.enabled=!1,this.composer.addPass(this.fxaaPass)}}var cl=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function em(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}function hl(s){throw new Error('Could not dynamically require "'+s+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var tm={exports:{}},nm;function n_(){return nm||(nm=1,(function(s,e){(function(t){s.exports=t()})(function(){return(function t(n,i,r){function a(c,h){if(!i[c]){if(!n[c]){var u=typeof hl=="function"&&hl;if(!h&&u)return u(c,!0);if(o)return o(c,!0);var p=new Error("Cannot find module '"+c+"'");throw p.code="MODULE_NOT_FOUND",p}var d=i[c]={exports:{}};n[c][0].call(d.exports,function(m){var f=n[c][1][m];return a(f||m)},d,d.exports,t,n,i,r)}return i[c].exports}for(var o=typeof hl=="function"&&hl,l=0;l>2,d=(3&c)<<4|h>>4,m=1>6:64,f=2>4,h=(15&p)<<4|(d=o.indexOf(l.charAt(f++)))>>2,u=(3&d)<<6|(m=o.indexOf(l.charAt(f++))),b[x++]=c,d!==64&&(b[x++]=h),m!==64&&(b[x++]=u);return b}},{"./support":30,"./utils":32}],2:[function(t,n,i){var r=t("./external"),a=t("./stream/DataWorker"),o=t("./stream/Crc32Probe"),l=t("./stream/DataLengthProbe");function c(h,u,p,d,m){this.compressedSize=h,this.uncompressedSize=u,this.crc32=p,this.compression=d,this.compressedContent=m}c.prototype={getContentWorker:function(){var h=new a(r.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new l("data_length")),u=this;return h.on("end",function(){if(this.streamInfo.data_length!==u.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),h},getCompressedWorker:function(){return new a(r.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},c.createWorkerFrom=function(h,u,p){return h.pipe(new o).pipe(new l("uncompressedSize")).pipe(u.compressWorker(p)).pipe(new l("compressedSize")).withStreamInfo("compression",u)},n.exports=c},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(t,n,i){var r=t("./stream/GenericWorker");i.STORE={magic:"\0\0",compressWorker:function(){return new r("STORE compression")},uncompressWorker:function(){return new r("STORE decompression")}},i.DEFLATE=t("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(t,n,i){var r=t("./utils"),a=(function(){for(var o,l=[],c=0;c<256;c++){o=c;for(var h=0;h<8;h++)o=1&o?3988292384^o>>>1:o>>>1;l[c]=o}return l})();n.exports=function(o,l){return o!==void 0&&o.length?r.getTypeOf(o)!=="string"?(function(c,h,u,p){var d=a,m=p+u;c^=-1;for(var f=p;f>>8^d[255&(c^h[f])];return-1^c})(0|l,o,o.length,0):(function(c,h,u,p){var d=a,m=p+u;c^=-1;for(var f=p;f>>8^d[255&(c^h.charCodeAt(f))];return-1^c})(0|l,o,o.length,0):0}},{"./utils":32}],5:[function(t,n,i){i.base64=!1,i.binary=!1,i.dir=!1,i.createFolders=!0,i.date=null,i.compression=null,i.compressionOptions=null,i.comment=null,i.unixPermissions=null,i.dosPermissions=null},{}],6:[function(t,n,i){var r=null;r=typeof Promise<"u"?Promise:t("lie"),n.exports={Promise:r}},{lie:37}],7:[function(t,n,i){var r=typeof Uint8Array<"u"&&typeof Uint16Array<"u"&&typeof Uint32Array<"u",a=t("pako"),o=t("./utils"),l=t("./stream/GenericWorker"),c=r?"uint8array":"array";function h(u,p){l.call(this,"FlateWorker/"+u),this._pako=null,this._pakoAction=u,this._pakoOptions=p,this.meta={}}i.magic="\b\0",o.inherits(h,l),h.prototype.processChunk=function(u){this.meta=u.meta,this._pako===null&&this._createPako(),this._pako.push(o.transformTo(c,u.data),!1)},h.prototype.flush=function(){l.prototype.flush.call(this),this._pako===null&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){l.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new a[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var u=this;this._pako.onData=function(p){u.push({data:p,meta:u.meta})}},i.compressWorker=function(u){return new h("Deflate",u)},i.uncompressWorker=function(){return new h("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(t,n,i){function r(d,m){var f,x="";for(f=0;f>>=8;return x}function a(d,m,f,x,g,b){var v,y,_=d.file,M=d.compression,C=b!==c.utf8encode,R=o.transformTo("string",b(_.name)),S=o.transformTo("string",c.utf8encode(_.name)),E=_.comment,L=o.transformTo("string",b(E)),A=o.transformTo("string",c.utf8encode(E)),I=S.length!==_.name.length,w=A.length!==E.length,z="",G="",j="",Y=_.dir,q=_.date,ie={crc32:0,compressedSize:0,uncompressedSize:0};m&&!f||(ie.crc32=d.crc32,ie.compressedSize=d.compressedSize,ie.uncompressedSize=d.uncompressedSize);var W=0;m&&(W|=8),C||!I&&!w||(W|=2048);var $=0,fe=0;Y&&($|=16),g==="UNIX"?(fe=798,$|=(function(de,se){var ce=de;return de||(ce=se?16893:33204),(65535&ce)<<16})(_.unixPermissions,Y)):(fe=20,$|=(function(de){return 63&(de||0)})(_.dosPermissions)),v=q.getUTCHours(),v<<=6,v|=q.getUTCMinutes(),v<<=5,v|=q.getUTCSeconds()/2,y=q.getUTCFullYear()-1980,y<<=4,y|=q.getUTCMonth()+1,y<<=5,y|=q.getUTCDate(),I&&(G=r(1,1)+r(h(R),4)+S,z+="up"+r(G.length,2)+G),w&&(j=r(1,1)+r(h(L),4)+A,z+="uc"+r(j.length,2)+j);var me="";return me+=` +\0`,me+=r(W,2),me+=M.magic,me+=r(v,2),me+=r(y,2),me+=r(ie.crc32,4),me+=r(ie.compressedSize,4),me+=r(ie.uncompressedSize,4),me+=r(R.length,2),me+=r(z.length,2),{fileRecord:u.LOCAL_FILE_HEADER+me+R+z,dirRecord:u.CENTRAL_FILE_HEADER+r(fe,2)+me+r(L.length,2)+"\0\0\0\0"+r($,4)+r(x,4)+R+z+L}}var o=t("../utils"),l=t("../stream/GenericWorker"),c=t("../utf8"),h=t("../crc32"),u=t("../signature");function p(d,m,f,x){l.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=m,this.zipPlatform=f,this.encodeFileName=x,this.streamFiles=d,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}o.inherits(p,l),p.prototype.push=function(d){var m=d.meta.percent||0,f=this.entriesCount,x=this._sources.length;this.accumulate?this.contentBuffer.push(d):(this.bytesWritten+=d.data.length,l.prototype.push.call(this,{data:d.data,meta:{currentFile:this.currentFile,percent:f?(m+100*(f-x-1))/f:100}}))},p.prototype.openedSource=function(d){this.currentSourceOffset=this.bytesWritten,this.currentFile=d.file.name;var m=this.streamFiles&&!d.file.dir;if(m){var f=a(d,m,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:f.fileRecord,meta:{percent:0}})}else this.accumulate=!0},p.prototype.closedSource=function(d){this.accumulate=!1;var m=this.streamFiles&&!d.file.dir,f=a(d,m,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(f.dirRecord),m)this.push({data:(function(x){return u.DATA_DESCRIPTOR+r(x.crc32,4)+r(x.compressedSize,4)+r(x.uncompressedSize,4)})(d),meta:{percent:100}});else for(this.push({data:f.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},p.prototype.flush=function(){for(var d=this.bytesWritten,m=0;m=this.index;l--)c=(c<<8)+this.byteAt(l);return this.index+=o,c},readString:function(o){return r.transformTo("string",this.readData(o))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var o=this.readInt(4);return new Date(Date.UTC(1980+(o>>25&127),(o>>21&15)-1,o>>16&31,o>>11&31,o>>5&63,(31&o)<<1))}},n.exports=a},{"../utils":32}],19:[function(t,n,i){var r=t("./Uint8ArrayReader");function a(o){r.call(this,o)}t("../utils").inherits(a,r),a.prototype.readData=function(o){this.checkOffset(o);var l=this.data.slice(this.zero+this.index,this.zero+this.index+o);return this.index+=o,l},n.exports=a},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(t,n,i){var r=t("./DataReader");function a(o){r.call(this,o)}t("../utils").inherits(a,r),a.prototype.byteAt=function(o){return this.data.charCodeAt(this.zero+o)},a.prototype.lastIndexOfSignature=function(o){return this.data.lastIndexOf(o)-this.zero},a.prototype.readAndCheckSignature=function(o){return o===this.readData(4)},a.prototype.readData=function(o){this.checkOffset(o);var l=this.data.slice(this.zero+this.index,this.zero+this.index+o);return this.index+=o,l},n.exports=a},{"../utils":32,"./DataReader":18}],21:[function(t,n,i){var r=t("./ArrayReader");function a(o){r.call(this,o)}t("../utils").inherits(a,r),a.prototype.readData=function(o){if(this.checkOffset(o),o===0)return new Uint8Array(0);var l=this.data.subarray(this.zero+this.index,this.zero+this.index+o);return this.index+=o,l},n.exports=a},{"../utils":32,"./ArrayReader":17}],22:[function(t,n,i){var r=t("../utils"),a=t("../support"),o=t("./ArrayReader"),l=t("./StringReader"),c=t("./NodeBufferReader"),h=t("./Uint8ArrayReader");n.exports=function(u){var p=r.getTypeOf(u);return r.checkSupport(p),p!=="string"||a.uint8array?p==="nodebuffer"?new c(u):a.uint8array?new h(r.transformTo("uint8array",u)):new o(r.transformTo("array",u)):new l(u)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(t,n,i){i.LOCAL_FILE_HEADER="PK",i.CENTRAL_FILE_HEADER="PK",i.CENTRAL_DIRECTORY_END="PK",i.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK\x07",i.ZIP64_CENTRAL_DIRECTORY_END="PK",i.DATA_DESCRIPTOR="PK\x07\b"},{}],24:[function(t,n,i){var r=t("./GenericWorker"),a=t("../utils");function o(l){r.call(this,"ConvertWorker to "+l),this.destType=l}a.inherits(o,r),o.prototype.processChunk=function(l){this.push({data:a.transformTo(this.destType,l.data),meta:l.meta})},n.exports=o},{"../utils":32,"./GenericWorker":28}],25:[function(t,n,i){var r=t("./GenericWorker"),a=t("../crc32");function o(){r.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}t("../utils").inherits(o,r),o.prototype.processChunk=function(l){this.streamInfo.crc32=a(l.data,this.streamInfo.crc32||0),this.push(l)},n.exports=o},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(t,n,i){var r=t("../utils"),a=t("./GenericWorker");function o(l){a.call(this,"DataLengthProbe for "+l),this.propName=l,this.withStreamInfo(l,0)}r.inherits(o,a),o.prototype.processChunk=function(l){if(l){var c=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=c+l.data.length}a.prototype.processChunk.call(this,l)},n.exports=o},{"../utils":32,"./GenericWorker":28}],27:[function(t,n,i){var r=t("../utils"),a=t("./GenericWorker");function o(l){a.call(this,"DataWorker");var c=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,l.then(function(h){c.dataIsReady=!0,c.data=h,c.max=h&&h.length||0,c.type=r.getTypeOf(h),c.isPaused||c._tickAndRepeat()},function(h){c.error(h)})}r.inherits(o,a),o.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this.data=null},o.prototype.resume=function(){return!!a.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,r.delay(this._tickAndRepeat,[],this)),!0)},o.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(r.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},o.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var l=null,c=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":l=this.data.substring(this.index,c);break;case"uint8array":l=this.data.subarray(this.index,c);break;case"array":case"nodebuffer":l=this.data.slice(this.index,c)}return this.index=c,this.push({data:l,meta:{percent:this.max?this.index/this.max*100:0}})},n.exports=o},{"../utils":32,"./GenericWorker":28}],28:[function(t,n,i){function r(a){this.name=a||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}r.prototype={push:function(a){this.emit("data",a)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(a){this.emit("error",a)}return!0},error:function(a){return!this.isFinished&&(this.isPaused?this.generatedError=a:(this.isFinished=!0,this.emit("error",a),this.previous&&this.previous.error(a),this.cleanUp()),!0)},on:function(a,o){return this._listeners[a].push(o),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(a,o){if(this._listeners[a])for(var l=0;l "+a:a}},n.exports=r},{}],29:[function(t,n,i){var r=t("../utils"),a=t("./ConvertWorker"),o=t("./GenericWorker"),l=t("../base64"),c=t("../support"),h=t("../external"),u=null;if(c.nodestream)try{u=t("../nodejs/NodejsStreamOutputAdapter")}catch{}function p(m,f){return new h.Promise(function(x,g){var b=[],v=m._internalType,y=m._outputType,_=m._mimeType;m.on("data",function(M,C){b.push(M),f&&f(C)}).on("error",function(M){b=[],g(M)}).on("end",function(){try{var M=(function(C,R,S){switch(C){case"blob":return r.newBlob(r.transformTo("arraybuffer",R),S);case"base64":return l.encode(R);default:return r.transformTo(C,R)}})(y,(function(C,R){var S,E=0,L=null,A=0;for(S=0;S"u")i.blob=!1;else{var r=new ArrayBuffer(0);try{i.blob=new Blob([r],{type:"application/zip"}).size===0}catch{try{var a=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);a.append(r),i.blob=a.getBlob("application/zip").size===0}catch{i.blob=!1}}}try{i.nodestream=!!t("readable-stream").Readable}catch{i.nodestream=!1}},{"readable-stream":16}],31:[function(t,n,i){for(var r=t("./utils"),a=t("./support"),o=t("./nodejsUtils"),l=t("./stream/GenericWorker"),c=new Array(256),h=0;h<256;h++)c[h]=252<=h?6:248<=h?5:240<=h?4:224<=h?3:192<=h?2:1;c[254]=c[254]=1;function u(){l.call(this,"utf-8 decode"),this.leftOver=null}function p(){l.call(this,"utf-8 encode")}i.utf8encode=function(d){return a.nodebuffer?o.newBufferFrom(d,"utf-8"):(function(m){var f,x,g,b,v,y=m.length,_=0;for(b=0;b>>6:(x<65536?f[v++]=224|x>>>12:(f[v++]=240|x>>>18,f[v++]=128|x>>>12&63),f[v++]=128|x>>>6&63),f[v++]=128|63&x);return f})(d)},i.utf8decode=function(d){return a.nodebuffer?r.transformTo("nodebuffer",d).toString("utf-8"):(function(m){var f,x,g,b,v=m.length,y=new Array(2*v);for(f=x=0;f>10&1023,y[x++]=56320|1023&g)}return y.length!==x&&(y.subarray?y=y.subarray(0,x):y.length=x),r.applyFromCharCode(y)})(d=r.transformTo(a.uint8array?"uint8array":"array",d))},r.inherits(u,l),u.prototype.processChunk=function(d){var m=r.transformTo(a.uint8array?"uint8array":"array",d.data);if(this.leftOver&&this.leftOver.length){if(a.uint8array){var f=m;(m=new Uint8Array(f.length+this.leftOver.length)).set(this.leftOver,0),m.set(f,this.leftOver.length)}else m=this.leftOver.concat(m);this.leftOver=null}var x=(function(b,v){var y;for((v=v||b.length)>b.length&&(v=b.length),y=v-1;0<=y&&(192&b[y])==128;)y--;return y<0||y===0?v:y+c[b[y]]>v?y:v})(m),g=m;x!==m.length&&(a.uint8array?(g=m.subarray(0,x),this.leftOver=m.subarray(x,m.length)):(g=m.slice(0,x),this.leftOver=m.slice(x,m.length))),this.push({data:i.utf8decode(g),meta:d.meta})},u.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:i.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},i.Utf8DecodeWorker=u,r.inherits(p,l),p.prototype.processChunk=function(d){this.push({data:i.utf8encode(d.data),meta:d.meta})},i.Utf8EncodeWorker=p},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(t,n,i){var r=t("./support"),a=t("./base64"),o=t("./nodejsUtils"),l=t("./external");function c(f){return f}function h(f,x){for(var g=0;g>8;this.dir=!!(16&this.externalFileAttributes),d==0&&(this.dosPermissions=63&this.externalFileAttributes),d==3&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||this.fileNameStr.slice(-1)!=="/"||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var d=r(this.extraFields[1].value);this.uncompressedSize===a.MAX_VALUE_32BITS&&(this.uncompressedSize=d.readInt(8)),this.compressedSize===a.MAX_VALUE_32BITS&&(this.compressedSize=d.readInt(8)),this.localHeaderOffset===a.MAX_VALUE_32BITS&&(this.localHeaderOffset=d.readInt(8)),this.diskNumberStart===a.MAX_VALUE_32BITS&&(this.diskNumberStart=d.readInt(4))}},readExtraFields:function(d){var m,f,x,g=d.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});d.index+4>>6:(d<65536?p[x++]=224|d>>>12:(p[x++]=240|d>>>18,p[x++]=128|d>>>12&63),p[x++]=128|d>>>6&63),p[x++]=128|63&d);return p},i.buf2binstring=function(u){return h(u,u.length)},i.binstring2buf=function(u){for(var p=new r.Buf8(u.length),d=0,m=p.length;d>10&1023,b[m++]=56320|1023&f)}return h(b,m)},i.utf8border=function(u,p){var d;for((p=p||u.length)>u.length&&(p=u.length),d=p-1;0<=d&&(192&u[d])==128;)d--;return d<0||d===0?p:d+l[u[d]]>p?d:p}},{"./common":41}],43:[function(t,n,i){n.exports=function(r,a,o,l){for(var c=65535&r|0,h=r>>>16&65535|0,u=0;o!==0;){for(o-=u=2e3>>1:a>>>1;o[l]=a}return o})();n.exports=function(a,o,l,c){var h=r,u=c+l;a^=-1;for(var p=c;p>>8^h[255&(a^o[p])];return-1^a}},{}],46:[function(t,n,i){var r,a=t("../utils/common"),o=t("./trees"),l=t("./adler32"),c=t("./crc32"),h=t("./messages"),u=0,p=4,d=0,m=-2,f=-1,x=4,g=2,b=8,v=9,y=286,_=30,M=19,C=2*y+1,R=15,S=3,E=258,L=E+S+1,A=42,I=113,w=1,z=2,G=3,j=4;function Y(T,N){return T.msg=h[N],N}function q(T){return(T<<1)-(4T.avail_out&&(V=T.avail_out),V!==0&&(a.arraySet(T.output,N.pending_buf,N.pending_out,V,T.next_out),T.next_out+=V,N.pending_out+=V,T.total_out+=V,T.avail_out-=V,N.pending-=V,N.pending===0&&(N.pending_out=0))}function $(T,N){o._tr_flush_block(T,0<=T.block_start?T.block_start:-1,T.strstart-T.block_start,N),T.block_start=T.strstart,W(T.strm)}function fe(T,N){T.pending_buf[T.pending++]=N}function me(T,N){T.pending_buf[T.pending++]=N>>>8&255,T.pending_buf[T.pending++]=255&N}function de(T,N){var V,U,k=T.max_chain_length,F=T.strstart,ee=T.prev_length,J=T.nice_match,X=T.strstart>T.w_size-L?T.strstart-(T.w_size-L):0,B=T.window,D=T.w_mask,H=T.prev,K=T.strstart+E,le=B[F+ee-1],te=B[F+ee];T.prev_length>=T.good_match&&(k>>=2),J>T.lookahead&&(J=T.lookahead);do if(B[(V=N)+ee]===te&&B[V+ee-1]===le&&B[V]===B[F]&&B[++V]===B[F+1]){F+=2,V++;do;while(B[++F]===B[++V]&&B[++F]===B[++V]&&B[++F]===B[++V]&&B[++F]===B[++V]&&B[++F]===B[++V]&&B[++F]===B[++V]&&B[++F]===B[++V]&&B[++F]===B[++V]&&FX&&--k!=0);return ee<=T.lookahead?ee:T.lookahead}function se(T){var N,V,U,k,F,ee,J,X,B,D,H=T.w_size;do{if(k=T.window_size-T.lookahead-T.strstart,T.strstart>=H+(H-L)){for(a.arraySet(T.window,T.window,H,H,0),T.match_start-=H,T.strstart-=H,T.block_start-=H,N=V=T.hash_size;U=T.head[--N],T.head[N]=H<=U?U-H:0,--V;);for(N=V=H;U=T.prev[--N],T.prev[N]=H<=U?U-H:0,--V;);k+=H}if(T.strm.avail_in===0)break;if(ee=T.strm,J=T.window,X=T.strstart+T.lookahead,B=k,D=void 0,D=ee.avail_in,B=S)for(F=T.strstart-T.insert,T.ins_h=T.window[F],T.ins_h=(T.ins_h<=S&&(T.ins_h=(T.ins_h<=S)if(U=o._tr_tally(T,T.strstart-T.match_start,T.match_length-S),T.lookahead-=T.match_length,T.match_length<=T.max_lazy_match&&T.lookahead>=S){for(T.match_length--;T.strstart++,T.ins_h=(T.ins_h<=S&&(T.ins_h=(T.ins_h<=S&&T.match_length<=T.prev_length){for(k=T.strstart+T.lookahead-S,U=o._tr_tally(T,T.strstart-1-T.prev_match,T.prev_length-S),T.lookahead-=T.prev_length-1,T.prev_length-=2;++T.strstart<=k&&(T.ins_h=(T.ins_h<T.pending_buf_size-5&&(V=T.pending_buf_size-5);;){if(T.lookahead<=1){if(se(T),T.lookahead===0&&N===u)return w;if(T.lookahead===0)break}T.strstart+=T.lookahead,T.lookahead=0;var U=T.block_start+V;if((T.strstart===0||T.strstart>=U)&&(T.lookahead=T.strstart-U,T.strstart=U,$(T,!1),T.strm.avail_out===0)||T.strstart-T.block_start>=T.w_size-L&&($(T,!1),T.strm.avail_out===0))return w}return T.insert=0,N===p?($(T,!0),T.strm.avail_out===0?G:j):(T.strstart>T.block_start&&($(T,!1),T.strm.avail_out),w)}),new be(4,4,8,4,ce),new be(4,5,16,8,ce),new be(4,6,32,32,ce),new be(4,4,16,16,pe),new be(8,16,32,32,pe),new be(8,16,128,128,pe),new be(8,32,128,256,pe),new be(32,128,258,1024,pe),new be(32,258,258,4096,pe)],i.deflateInit=function(T,N){return ke(T,N,b,15,8,0)},i.deflateInit2=ke,i.deflateReset=Je,i.deflateResetKeep=Be,i.deflateSetHeader=function(T,N){return T&&T.state?T.state.wrap!==2?m:(T.state.gzhead=N,d):m},i.deflate=function(T,N){var V,U,k,F;if(!T||!T.state||5>8&255),fe(U,U.gzhead.time>>16&255),fe(U,U.gzhead.time>>24&255),fe(U,U.level===9?2:2<=U.strategy||U.level<2?4:0),fe(U,255&U.gzhead.os),U.gzhead.extra&&U.gzhead.extra.length&&(fe(U,255&U.gzhead.extra.length),fe(U,U.gzhead.extra.length>>8&255)),U.gzhead.hcrc&&(T.adler=c(T.adler,U.pending_buf,U.pending,0)),U.gzindex=0,U.status=69):(fe(U,0),fe(U,0),fe(U,0),fe(U,0),fe(U,0),fe(U,U.level===9?2:2<=U.strategy||U.level<2?4:0),fe(U,3),U.status=I);else{var ee=b+(U.w_bits-8<<4)<<8;ee|=(2<=U.strategy||U.level<2?0:U.level<6?1:U.level===6?2:3)<<6,U.strstart!==0&&(ee|=32),ee+=31-ee%31,U.status=I,me(U,ee),U.strstart!==0&&(me(U,T.adler>>>16),me(U,65535&T.adler)),T.adler=1}if(U.status===69)if(U.gzhead.extra){for(k=U.pending;U.gzindex<(65535&U.gzhead.extra.length)&&(U.pending!==U.pending_buf_size||(U.gzhead.hcrc&&U.pending>k&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),W(T),k=U.pending,U.pending!==U.pending_buf_size));)fe(U,255&U.gzhead.extra[U.gzindex]),U.gzindex++;U.gzhead.hcrc&&U.pending>k&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),U.gzindex===U.gzhead.extra.length&&(U.gzindex=0,U.status=73)}else U.status=73;if(U.status===73)if(U.gzhead.name){k=U.pending;do{if(U.pending===U.pending_buf_size&&(U.gzhead.hcrc&&U.pending>k&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),W(T),k=U.pending,U.pending===U.pending_buf_size)){F=1;break}F=U.gzindexk&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),F===0&&(U.gzindex=0,U.status=91)}else U.status=91;if(U.status===91)if(U.gzhead.comment){k=U.pending;do{if(U.pending===U.pending_buf_size&&(U.gzhead.hcrc&&U.pending>k&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),W(T),k=U.pending,U.pending===U.pending_buf_size)){F=1;break}F=U.gzindexk&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),F===0&&(U.status=103)}else U.status=103;if(U.status===103&&(U.gzhead.hcrc?(U.pending+2>U.pending_buf_size&&W(T),U.pending+2<=U.pending_buf_size&&(fe(U,255&T.adler),fe(U,T.adler>>8&255),T.adler=0,U.status=I)):U.status=I),U.pending!==0){if(W(T),T.avail_out===0)return U.last_flush=-1,d}else if(T.avail_in===0&&q(N)<=q(V)&&N!==p)return Y(T,-5);if(U.status===666&&T.avail_in!==0)return Y(T,-5);if(T.avail_in!==0||U.lookahead!==0||N!==u&&U.status!==666){var J=U.strategy===2?(function(X,B){for(var D;;){if(X.lookahead===0&&(se(X),X.lookahead===0)){if(B===u)return w;break}if(X.match_length=0,D=o._tr_tally(X,0,X.window[X.strstart]),X.lookahead--,X.strstart++,D&&($(X,!1),X.strm.avail_out===0))return w}return X.insert=0,B===p?($(X,!0),X.strm.avail_out===0?G:j):X.last_lit&&($(X,!1),X.strm.avail_out===0)?w:z})(U,N):U.strategy===3?(function(X,B){for(var D,H,K,le,te=X.window;;){if(X.lookahead<=E){if(se(X),X.lookahead<=E&&B===u)return w;if(X.lookahead===0)break}if(X.match_length=0,X.lookahead>=S&&0X.lookahead&&(X.match_length=X.lookahead)}if(X.match_length>=S?(D=o._tr_tally(X,1,X.match_length-S),X.lookahead-=X.match_length,X.strstart+=X.match_length,X.match_length=0):(D=o._tr_tally(X,0,X.window[X.strstart]),X.lookahead--,X.strstart++),D&&($(X,!1),X.strm.avail_out===0))return w}return X.insert=0,B===p?($(X,!0),X.strm.avail_out===0?G:j):X.last_lit&&($(X,!1),X.strm.avail_out===0)?w:z})(U,N):r[U.level].func(U,N);if(J!==G&&J!==j||(U.status=666),J===w||J===G)return T.avail_out===0&&(U.last_flush=-1),d;if(J===z&&(N===1?o._tr_align(U):N!==5&&(o._tr_stored_block(U,0,0,!1),N===3&&(ie(U.head),U.lookahead===0&&(U.strstart=0,U.block_start=0,U.insert=0))),W(T),T.avail_out===0))return U.last_flush=-1,d}return N!==p?d:U.wrap<=0?1:(U.wrap===2?(fe(U,255&T.adler),fe(U,T.adler>>8&255),fe(U,T.adler>>16&255),fe(U,T.adler>>24&255),fe(U,255&T.total_in),fe(U,T.total_in>>8&255),fe(U,T.total_in>>16&255),fe(U,T.total_in>>24&255)):(me(U,T.adler>>>16),me(U,65535&T.adler)),W(T),0=V.w_size&&(F===0&&(ie(V.head),V.strstart=0,V.block_start=0,V.insert=0),B=new a.Buf8(V.w_size),a.arraySet(B,N,D-V.w_size,V.w_size,0),N=B,D=V.w_size),ee=T.avail_in,J=T.next_in,X=T.input,T.avail_in=D,T.next_in=0,T.input=N,se(V);V.lookahead>=S;){for(U=V.strstart,k=V.lookahead-(S-1);V.ins_h=(V.ins_h<>>=S=R>>>24,v-=S,(S=R>>>16&255)===0)z[h++]=65535&R;else{if(!(16&S)){if((64&S)==0){R=y[(65535&R)+(b&(1<>>=S,v-=S),v<15&&(b+=w[l++]<>>=S=R>>>24,v-=S,!(16&(S=R>>>16&255))){if((64&S)==0){R=_[(65535&R)+(b&(1<>>=S,v-=S,(S=h-u)>3,b&=(1<<(v-=E<<3))-1,r.next_in=l,r.next_out=h,r.avail_in=l>>24&255)+(A>>>8&65280)+((65280&A)<<8)+((255&A)<<24)}function b(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new r.Buf16(320),this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function v(A){var I;return A&&A.state?(I=A.state,A.total_in=A.total_out=I.total=0,A.msg="",I.wrap&&(A.adler=1&I.wrap),I.mode=m,I.last=0,I.havedict=0,I.dmax=32768,I.head=null,I.hold=0,I.bits=0,I.lencode=I.lendyn=new r.Buf32(f),I.distcode=I.distdyn=new r.Buf32(x),I.sane=1,I.back=-1,p):d}function y(A){var I;return A&&A.state?((I=A.state).wsize=0,I.whave=0,I.wnext=0,v(A)):d}function _(A,I){var w,z;return A&&A.state?(z=A.state,I<0?(w=0,I=-I):(w=1+(I>>4),I<48&&(I&=15)),I&&(I<8||15=j.wsize?(r.arraySet(j.window,I,w-j.wsize,j.wsize,0),j.wnext=0,j.whave=j.wsize):(z<(G=j.wsize-j.wnext)&&(G=z),r.arraySet(j.window,I,w-z,G,j.wnext),(z-=G)?(r.arraySet(j.window,I,w-z,z,0),j.wnext=z,j.whave=j.wsize):(j.wnext+=G,j.wnext===j.wsize&&(j.wnext=0),j.whave>>8&255,w.check=o(w.check,F,2,0),$=W=0,w.mode=2;break}if(w.flags=0,w.head&&(w.head.done=!1),!(1&w.wrap)||(((255&W)<<8)+(W>>8))%31){A.msg="incorrect header check",w.mode=30;break}if((15&W)!=8){A.msg="unknown compression method",w.mode=30;break}if($-=4,T=8+(15&(W>>>=4)),w.wbits===0)w.wbits=T;else if(T>w.wbits){A.msg="invalid window size",w.mode=30;break}w.dmax=1<>8&1),512&w.flags&&(F[0]=255&W,F[1]=W>>>8&255,w.check=o(w.check,F,2,0)),$=W=0,w.mode=3;case 3:for(;$<32;){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}w.head&&(w.head.time=W),512&w.flags&&(F[0]=255&W,F[1]=W>>>8&255,F[2]=W>>>16&255,F[3]=W>>>24&255,w.check=o(w.check,F,4,0)),$=W=0,w.mode=4;case 4:for(;$<16;){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}w.head&&(w.head.xflags=255&W,w.head.os=W>>8),512&w.flags&&(F[0]=255&W,F[1]=W>>>8&255,w.check=o(w.check,F,2,0)),$=W=0,w.mode=5;case 5:if(1024&w.flags){for(;$<16;){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}w.length=W,w.head&&(w.head.extra_len=W),512&w.flags&&(F[0]=255&W,F[1]=W>>>8&255,w.check=o(w.check,F,2,0)),$=W=0}else w.head&&(w.head.extra=null);w.mode=6;case 6:if(1024&w.flags&&(q<(de=w.length)&&(de=q),de&&(w.head&&(T=w.head.extra_len-w.length,w.head.extra||(w.head.extra=new Array(w.head.extra_len)),r.arraySet(w.head.extra,z,j,de,T)),512&w.flags&&(w.check=o(w.check,z,de,j)),q-=de,j+=de,w.length-=de),w.length))break e;w.length=0,w.mode=7;case 7:if(2048&w.flags){if(q===0)break e;for(de=0;T=z[j+de++],w.head&&T&&w.length<65536&&(w.head.name+=String.fromCharCode(T)),T&&de>9&1,w.head.done=!0),A.adler=w.check=0,w.mode=12;break;case 10:for(;$<32;){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}A.adler=w.check=g(W),$=W=0,w.mode=11;case 11:if(w.havedict===0)return A.next_out=Y,A.avail_out=ie,A.next_in=j,A.avail_in=q,w.hold=W,w.bits=$,2;A.adler=w.check=1,w.mode=12;case 12:if(I===5||I===6)break e;case 13:if(w.last){W>>>=7&$,$-=7&$,w.mode=27;break}for(;$<3;){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}switch(w.last=1&W,$-=1,3&(W>>>=1)){case 0:w.mode=14;break;case 1:if(E(w),w.mode=20,I!==6)break;W>>>=2,$-=2;break e;case 2:w.mode=17;break;case 3:A.msg="invalid block type",w.mode=30}W>>>=2,$-=2;break;case 14:for(W>>>=7&$,$-=7&$;$<32;){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}if((65535&W)!=(W>>>16^65535)){A.msg="invalid stored block lengths",w.mode=30;break}if(w.length=65535&W,$=W=0,w.mode=15,I===6)break e;case 15:w.mode=16;case 16:if(de=w.length){if(q>>=5,$-=5,w.ndist=1+(31&W),W>>>=5,$-=5,w.ncode=4+(15&W),W>>>=4,$-=4,286>>=3,$-=3}for(;w.have<19;)w.lens[ee[w.have++]]=0;if(w.lencode=w.lendyn,w.lenbits=7,V={bits:w.lenbits},N=c(0,w.lens,0,19,w.lencode,0,w.work,V),w.lenbits=V.bits,N){A.msg="invalid code lengths set",w.mode=30;break}w.have=0,w.mode=19;case 19:for(;w.have>>16&255,Se=65535&k,!((pe=k>>>24)<=$);){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}if(Se<16)W>>>=pe,$-=pe,w.lens[w.have++]=Se;else{if(Se===16){for(U=pe+2;$>>=pe,$-=pe,w.have===0){A.msg="invalid bit length repeat",w.mode=30;break}T=w.lens[w.have-1],de=3+(3&W),W>>>=2,$-=2}else if(Se===17){for(U=pe+3;$>>=pe)),W>>>=3,$-=3}else{for(U=pe+7;$>>=pe)),W>>>=7,$-=7}if(w.have+de>w.nlen+w.ndist){A.msg="invalid bit length repeat",w.mode=30;break}for(;de--;)w.lens[w.have++]=T}}if(w.mode===30)break;if(w.lens[256]===0){A.msg="invalid code -- missing end-of-block",w.mode=30;break}if(w.lenbits=9,V={bits:w.lenbits},N=c(h,w.lens,0,w.nlen,w.lencode,0,w.work,V),w.lenbits=V.bits,N){A.msg="invalid literal/lengths set",w.mode=30;break}if(w.distbits=6,w.distcode=w.distdyn,V={bits:w.distbits},N=c(u,w.lens,w.nlen,w.ndist,w.distcode,0,w.work,V),w.distbits=V.bits,N){A.msg="invalid distances set",w.mode=30;break}if(w.mode=20,I===6)break e;case 20:w.mode=21;case 21:if(6<=q&&258<=ie){A.next_out=Y,A.avail_out=ie,A.next_in=j,A.avail_in=q,w.hold=W,w.bits=$,l(A,me),Y=A.next_out,G=A.output,ie=A.avail_out,j=A.next_in,z=A.input,q=A.avail_in,W=w.hold,$=w.bits,w.mode===12&&(w.back=-1);break}for(w.back=0;be=(k=w.lencode[W&(1<>>16&255,Se=65535&k,!((pe=k>>>24)<=$);){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}if(be&&(240&be)==0){for(Be=pe,Je=be,ke=Se;be=(k=w.lencode[ke+((W&(1<>Be)])>>>16&255,Se=65535&k,!(Be+(pe=k>>>24)<=$);){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}W>>>=Be,$-=Be,w.back+=Be}if(W>>>=pe,$-=pe,w.back+=pe,w.length=Se,be===0){w.mode=26;break}if(32&be){w.back=-1,w.mode=12;break}if(64&be){A.msg="invalid literal/length code",w.mode=30;break}w.extra=15&be,w.mode=22;case 22:if(w.extra){for(U=w.extra;$>>=w.extra,$-=w.extra,w.back+=w.extra}w.was=w.length,w.mode=23;case 23:for(;be=(k=w.distcode[W&(1<>>16&255,Se=65535&k,!((pe=k>>>24)<=$);){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}if((240&be)==0){for(Be=pe,Je=be,ke=Se;be=(k=w.distcode[ke+((W&(1<>Be)])>>>16&255,Se=65535&k,!(Be+(pe=k>>>24)<=$);){if(q===0)break e;q--,W+=z[j++]<<$,$+=8}W>>>=Be,$-=Be,w.back+=Be}if(W>>>=pe,$-=pe,w.back+=pe,64&be){A.msg="invalid distance code",w.mode=30;break}w.offset=Se,w.extra=15&be,w.mode=24;case 24:if(w.extra){for(U=w.extra;$>>=w.extra,$-=w.extra,w.back+=w.extra}if(w.offset>w.dmax){A.msg="invalid distance too far back",w.mode=30;break}w.mode=25;case 25:if(ie===0)break e;if(de=me-ie,w.offset>de){if((de=w.offset-de)>w.whave&&w.sane){A.msg="invalid distance too far back",w.mode=30;break}se=de>w.wnext?(de-=w.wnext,w.wsize-de):w.wnext-de,de>w.length&&(de=w.length),ce=w.window}else ce=G,se=Y-w.offset,de=w.length;for(ieC?(S=se[ce+x[I]],$[fe+x[I]]):(S=96,0),b=1<>Y)+(v-=b)]=R<<24|S<<16|E|0,v!==0;);for(b=1<>=1;if(b!==0?(W&=b-1,W+=b):W=0,I++,--me[A]==0){if(A===z)break;A=u[p+x[I]]}if(G>>7)]}function fe(k,F){k.pending_buf[k.pending++]=255&F,k.pending_buf[k.pending++]=F>>>8&255}function me(k,F,ee){k.bi_valid>g-ee?(k.bi_buf|=F<>g-k.bi_valid,k.bi_valid+=ee-g):(k.bi_buf|=F<>>=1,ee<<=1,0<--F;);return ee>>>1}function ce(k,F,ee){var J,X,B=new Array(x+1),D=0;for(J=1;J<=x;J++)B[J]=D=D+ee[J-1]<<1;for(X=0;X<=F;X++){var H=k[2*X+1];H!==0&&(k[2*X]=se(B[H]++,H))}}function pe(k){var F;for(F=0;F>1;1<=ee;ee--)Be(k,B,ee);for(X=K;ee=k.heap[1],k.heap[1]=k.heap[k.heap_len--],Be(k,B,1),J=k.heap[1],k.heap[--k.heap_max]=ee,k.heap[--k.heap_max]=J,B[2*X]=B[2*ee]+B[2*J],k.depth[X]=(k.depth[ee]>=k.depth[J]?k.depth[ee]:k.depth[J])+1,B[2*ee+1]=B[2*J+1]=X,k.heap[1]=X++,Be(k,B,1),2<=k.heap_len;);k.heap[--k.heap_max]=k.heap[1],(function(te,Te){var ye,Re,Ie,ue,_e,Ve,Ue=Te.dyn_tree,Ae=Te.max_code,Ge=Te.stat_desc.static_tree,Z=Te.stat_desc.has_stree,Ce=Te.stat_desc.extra_bits,Me=Te.stat_desc.extra_base,we=Te.stat_desc.max_length,ve=0;for(ue=0;ue<=x;ue++)te.bl_count[ue]=0;for(Ue[2*te.heap[te.heap_max]+1]=0,ye=te.heap_max+1;ye>=7;X>>=1)if(1&le&&H.dyn_ltree[2*K]!==0)return a;if(H.dyn_ltree[18]!==0||H.dyn_ltree[20]!==0||H.dyn_ltree[26]!==0)return o;for(K=32;K>>3,(B=k.static_len+3+7>>>3)<=X&&(X=B)):X=B=ee+5,ee+4<=X&&F!==-1?U(k,F,ee,J):k.strategy===4||B===X?(me(k,2+(J?1:0),3),Je(k,L,A)):(me(k,4+(J?1:0),3),(function(H,K,le,te){var Te;for(me(H,K-257,5),me(H,le-1,5),me(H,te-4,4),Te=0;Te>>8&255,k.pending_buf[k.d_buf+2*k.last_lit+1]=255&F,k.pending_buf[k.l_buf+k.last_lit]=255&ee,k.last_lit++,F===0?k.dyn_ltree[2*ee]++:(k.matches++,F--,k.dyn_ltree[2*(w[ee]+u+1)]++,k.dyn_dtree[2*$(F)]++),k.last_lit===k.lit_bufsize-1},i._tr_align=function(k){me(k,2,3),de(k,v,L),(function(F){F.bi_valid===16?(fe(F,F.bi_buf),F.bi_buf=0,F.bi_valid=0):8<=F.bi_valid&&(F.pending_buf[F.pending++]=255&F.bi_buf,F.bi_buf>>=8,F.bi_valid-=8)})(k)}},{"../utils/common":41}],53:[function(t,n,i){n.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(t,n,i){(function(r){(function(a,o){if(!a.setImmediate){var l,c,h,u,p=1,d={},m=!1,f=a.document,x=Object.getPrototypeOf&&Object.getPrototypeOf(a);x=x&&x.setTimeout?x:a,l={}.toString.call(a.process)==="[object process]"?function(y){process.nextTick(function(){b(y)})}:(function(){if(a.postMessage&&!a.importScripts){var y=!0,_=a.onmessage;return a.onmessage=function(){y=!1},a.postMessage("","*"),a.onmessage=_,y}})()?(u="setImmediate$"+Math.random()+"$",a.addEventListener?a.addEventListener("message",v,!1):a.attachEvent("onmessage",v),function(y){a.postMessage(u+y,"*")}):a.MessageChannel?((h=new MessageChannel).port1.onmessage=function(y){b(y.data)},function(y){h.port2.postMessage(y)}):f&&"onreadystatechange"in f.createElement("script")?(c=f.documentElement,function(y){var _=f.createElement("script");_.onreadystatechange=function(){b(y),_.onreadystatechange=null,c.removeChild(_),_=null},c.appendChild(_)}):function(y){setTimeout(b,0,y)},x.setImmediate=function(y){typeof y!="function"&&(y=new Function(""+y));for(var _=new Array(arguments.length-1),M=0;M<_.length;M++)_[M]=arguments[M+1];var C={callback:y,args:_};return d[p]=C,l(p),p++},x.clearImmediate=g}function g(y){delete d[y]}function b(y){if(m)setTimeout(b,0,y);else{var _=d[y];if(_){m=!0;try{(function(M){var C=M.callback,R=M.args;switch(R.length){case 0:C();break;case 1:C(R[0]);break;case 2:C(R[0],R[1]);break;case 3:C(R[0],R[1],R[2]);break;default:C.apply(o,R)}})(_)}finally{g(y),m=!1}}}}function v(y){y.source===a&&typeof y.data=="string"&&y.data.indexOf(u)===0&&b(+y.data.slice(u.length))}})(typeof self>"u"?r===void 0?this:r:self)}).call(this,typeof cl<"u"?cl:typeof self<"u"?self:typeof window<"u"?window:{})},{}]},{},[10])(10)})})(tm)),tm.exports}var i_=n_();const im=em(i_);function sm(s,e){return function(){return s.apply(e,arguments)}}const{toString:s_}=Object.prototype,{getPrototypeOf:uu}=Object,{iterator:ul,toStringTag:rm}=Symbol,dl=(s=>e=>{const t=s_.call(e);return s[t]||(s[t]=t.slice(8,-1).toLowerCase())})(Object.create(null)),ni=s=>(s=s.toLowerCase(),e=>dl(e)===s),pl=s=>e=>typeof e===s,{isArray:Ir}=Array,Nr=pl("undefined");function Ta(s){return s!==null&&!Nr(s)&&s.constructor!==null&&!Nr(s.constructor)&&_n(s.constructor.isBuffer)&&s.constructor.isBuffer(s)}const am=ni("ArrayBuffer");function r_(s){let e;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?e=ArrayBuffer.isView(s):e=s&&s.buffer&&am(s.buffer),e}const a_=pl("string"),_n=pl("function"),om=pl("number"),Aa=s=>s!==null&&typeof s=="object",o_=s=>s===!0||s===!1,fl=s=>{if(dl(s)!=="object")return!1;const e=uu(s);return(e===null||e===Object.prototype||Object.getPrototypeOf(e)===null)&&!(rm in s)&&!(ul in s)},l_=s=>{if(!Aa(s)||Ta(s))return!1;try{return Object.keys(s).length===0&&Object.getPrototypeOf(s)===Object.prototype}catch{return!1}},c_=ni("Date"),h_=ni("File"),u_=ni("Blob"),d_=ni("FileList"),p_=s=>Aa(s)&&_n(s.pipe),f_=s=>{let e;return s&&(typeof FormData=="function"&&s instanceof FormData||_n(s.append)&&((e=dl(s))==="formdata"||e==="object"&&_n(s.toString)&&s.toString()==="[object FormData]"))},m_=ni("URLSearchParams"),[g_,x_,v_,b_]=["ReadableStream","Request","Response","Headers"].map(ni),y_=s=>s.trim?s.trim():s.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Pa(s,e,{allOwnKeys:t=!1}={}){if(s===null||typeof s>"u")return;let n,i;if(typeof s!="object"&&(s=[s]),Ir(s))for(n=0,i=s.length;n0;)if(i=t[n],e===i.toLowerCase())return i;return null}const Rs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,cm=s=>!Nr(s)&&s!==Rs;function du(){const{caseless:s,skipUndefined:e}=cm(this)&&this||{},t={},n=(i,r)=>{const a=s&&lm(t,r)||r;fl(t[a])&&fl(i)?t[a]=du(t[a],i):fl(i)?t[a]=du({},i):Ir(i)?t[a]=i.slice():(!e||!Nr(i))&&(t[a]=i)};for(let i=0,r=arguments.length;i(Pa(e,(i,r)=>{t&&_n(i)?s[r]=sm(i,t):s[r]=i},{allOwnKeys:n}),s),M_=s=>(s.charCodeAt(0)===65279&&(s=s.slice(1)),s),w_=(s,e,t,n)=>{s.prototype=Object.create(e.prototype,n),s.prototype.constructor=s,Object.defineProperty(s,"super",{value:e.prototype}),t&&Object.assign(s.prototype,t)},S_=(s,e,t,n)=>{let i,r,a;const o={};if(e=e||{},s==null)return e;do{for(i=Object.getOwnPropertyNames(s),r=i.length;r-- >0;)a=i[r],(!n||n(a,s,e))&&!o[a]&&(e[a]=s[a],o[a]=!0);s=t!==!1&&uu(s)}while(s&&(!t||t(s,e))&&s!==Object.prototype);return e},E_=(s,e,t)=>{s=String(s),(t===void 0||t>s.length)&&(t=s.length),t-=e.length;const n=s.indexOf(e,t);return n!==-1&&n===t},C_=s=>{if(!s)return null;if(Ir(s))return s;let e=s.length;if(!om(e))return null;const t=new Array(e);for(;e-- >0;)t[e]=s[e];return t},T_=(s=>e=>s&&e instanceof s)(typeof Uint8Array<"u"&&uu(Uint8Array)),A_=(s,e)=>{const t=(s&&s[ul]).call(s);let n;for(;(n=t.next())&&!n.done;){const i=n.value;e.call(s,i[0],i[1])}},P_=(s,e)=>{let t;const n=[];for(;(t=s.exec(e))!==null;)n.push(t);return n},R_=ni("HTMLFormElement"),L_=s=>s.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(e,t,n){return t.toUpperCase()+n}),hm=(({hasOwnProperty:s})=>(e,t)=>s.call(e,t))(Object.prototype),D_=ni("RegExp"),um=(s,e)=>{const t=Object.getOwnPropertyDescriptors(s),n={};Pa(t,(i,r)=>{let a;(a=e(i,r,s))!==!1&&(n[r]=a||i)}),Object.defineProperties(s,n)},I_=s=>{um(s,(e,t)=>{if(_n(s)&&["arguments","caller","callee"].indexOf(t)!==-1)return!1;const n=s[t];if(_n(n)){if(e.enumerable=!1,"writable"in e){e.writable=!1;return}e.set||(e.set=()=>{throw Error("Can not rewrite read-only method '"+t+"'")})}})},N_=(s,e)=>{const t={},n=i=>{i.forEach(r=>{t[r]=!0})};return Ir(s)?n(s):n(String(s).split(e)),t},B_=()=>{},k_=(s,e)=>s!=null&&Number.isFinite(s=+s)?s:e;function U_(s){return!!(s&&_n(s.append)&&s[rm]==="FormData"&&s[ul])}const O_=s=>{const e=new Array(10),t=(n,i)=>{if(Aa(n)){if(e.indexOf(n)>=0)return;if(Ta(n))return n;if(!("toJSON"in n)){e[i]=n;const r=Ir(n)?[]:{};return Pa(n,(a,o)=>{const l=t(a,i+1);!Nr(l)&&(r[o]=l)}),e[i]=void 0,r}}return n};return t(s,0)},z_=ni("AsyncFunction"),F_=s=>s&&(Aa(s)||_n(s))&&_n(s.then)&&_n(s.catch),dm=((s,e)=>s?setImmediate:e?((t,n)=>(Rs.addEventListener("message",({source:i,data:r})=>{i===Rs&&r===t&&n.length&&n.shift()()},!1),i=>{n.push(i),Rs.postMessage(t,"*")}))(`axios@${Math.random()}`,[]):t=>setTimeout(t))(typeof setImmediate=="function",_n(Rs.postMessage)),H_=typeof queueMicrotask<"u"?queueMicrotask.bind(Rs):typeof process<"u"&&process.nextTick||dm,V_=s=>s!=null&&_n(s[ul]),re={isArray:Ir,isArrayBuffer:am,isBuffer:Ta,isFormData:f_,isArrayBufferView:r_,isString:a_,isNumber:om,isBoolean:o_,isObject:Aa,isPlainObject:fl,isEmptyObject:l_,isReadableStream:g_,isRequest:x_,isResponse:v_,isHeaders:b_,isUndefined:Nr,isDate:c_,isFile:h_,isBlob:u_,isRegExp:D_,isFunction:_n,isStream:p_,isURLSearchParams:m_,isTypedArray:T_,isFileList:d_,forEach:Pa,merge:du,extend:__,trim:y_,stripBOM:M_,inherits:w_,toFlatObject:S_,kindOf:dl,kindOfTest:ni,endsWith:E_,toArray:C_,forEachEntry:A_,matchAll:P_,isHTMLForm:R_,hasOwnProperty:hm,hasOwnProp:hm,reduceDescriptors:um,freezeMethods:I_,toObjectSet:N_,toCamelCase:L_,noop:B_,toFiniteNumber:k_,findKey:lm,global:Rs,isContextDefined:cm,isSpecCompliantForm:U_,toJSONObject:O_,isAsyncFn:z_,isThenable:F_,setImmediate:dm,asap:H_,isIterable:V_};function Ke(s,e,t,n,i){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=s,this.name="AxiosError",e&&(this.code=e),t&&(this.config=t),n&&(this.request=n),i&&(this.response=i,this.status=i.status?i.status:null)}re.inherits(Ke,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:re.toJSONObject(this.config),code:this.code,status:this.status}}});const pm=Ke.prototype,fm={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(s=>{fm[s]={value:s}}),Object.defineProperties(Ke,fm),Object.defineProperty(pm,"isAxiosError",{value:!0}),Ke.from=(s,e,t,n,i,r)=>{const a=Object.create(pm);re.toFlatObject(s,a,function(c){return c!==Error.prototype},c=>c!=="isAxiosError");const o=s&&s.message?s.message:"Error",l=e==null&&s?s.code:e;return Ke.call(a,o,l,t,n,i),s&&a.cause==null&&Object.defineProperty(a,"cause",{value:s,configurable:!0}),a.name=s&&s.name||"Error",r&&Object.assign(a,r),a};const G_=null;function pu(s){return re.isPlainObject(s)||re.isArray(s)}function mm(s){return re.endsWith(s,"[]")?s.slice(0,-2):s}function gm(s,e,t){return s?s.concat(e).map(function(n,i){return n=mm(n),!t&&i?"["+n+"]":n}).join(t?".":""):e}function W_(s){return re.isArray(s)&&!s.some(pu)}const X_=re.toFlatObject(re,{},null,function(s){return/^is[A-Z]/.test(s)});function ml(s,e,t){if(!re.isObject(s))throw new TypeError("target must be an object");e=e||new FormData,t=re.toFlatObject(t,{metaTokens:!0,dots:!1,indexes:!1},!1,function(d,m){return!re.isUndefined(m[d])});const n=t.metaTokens,i=t.visitor||c,r=t.dots,a=t.indexes,o=(t.Blob||typeof Blob<"u"&&Blob)&&re.isSpecCompliantForm(e);if(!re.isFunction(i))throw new TypeError("visitor must be a function");function l(d){if(d===null)return"";if(re.isDate(d))return d.toISOString();if(re.isBoolean(d))return d.toString();if(!o&&re.isBlob(d))throw new Ke("Blob is not supported. Use a Buffer instead.");return re.isArrayBuffer(d)||re.isTypedArray(d)?o&&typeof Blob=="function"?new Blob([d]):Buffer.from(d):d}function c(d,m,f){let x=d;if(d&&!f&&typeof d=="object"){if(re.endsWith(m,"{}"))m=n?m:m.slice(0,-2),d=JSON.stringify(d);else if(re.isArray(d)&&W_(d)||(re.isFileList(d)||re.endsWith(m,"[]"))&&(x=re.toArray(d)))return m=mm(m),x.forEach(function(g,b){!(re.isUndefined(g)||g===null)&&e.append(a===!0?gm([m],b,r):a===null?m:m+"[]",l(g))}),!1}return pu(d)?!0:(e.append(gm(f,m,r),l(d)),!1)}const h=[],u=Object.assign(X_,{defaultVisitor:c,convertValue:l,isVisitable:pu});function p(d,m){if(!re.isUndefined(d)){if(h.indexOf(d)!==-1)throw Error("Circular reference detected in "+m.join("."));h.push(d),re.forEach(d,function(f,x){(!(re.isUndefined(f)||f===null)&&i.call(e,f,re.isString(x)?x.trim():x,m,u))===!0&&p(f,m?m.concat(x):[x])}),h.pop()}}if(!re.isObject(s))throw new TypeError("data must be an object");return p(s),e}function xm(s){const e={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(s).replace(/[!'()~]|%20|%00/g,function(t){return e[t]})}function fu(s,e){this._pairs=[],s&&ml(s,this,e)}const vm=fu.prototype;vm.append=function(s,e){this._pairs.push([s,e])},vm.toString=function(s){const e=s?function(t){return s.call(this,t,xm)}:xm;return this._pairs.map(function(t){return e(t[0])+"="+e(t[1])},"").join("&")};function j_(s){return encodeURIComponent(s).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function bm(s,e,t){if(!e)return s;const n=t&&t.encode||j_;re.isFunction(t)&&(t={serialize:t});const i=t&&t.serialize;let r;if(i?r=i(e,t):r=re.isURLSearchParams(e)?e.toString():new fu(e,t).toString(n),r){const a=s.indexOf("#");a!==-1&&(s=s.slice(0,a)),s+=(s.indexOf("?")===-1?"?":"&")+r}return s}class ym{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:n?n.synchronous:!1,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){re.forEach(this.handlers,function(t){t!==null&&e(t)})}}const _m={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},q_=typeof URLSearchParams<"u"?URLSearchParams:fu,Z_=typeof FormData<"u"?FormData:null,Y_=typeof Blob<"u"?Blob:null,$_={isBrowser:!0,classes:{URLSearchParams:q_,FormData:Z_,Blob:Y_},protocols:["http","https","file","blob","url","data"]},mu=typeof window<"u"&&typeof document<"u",gu=typeof navigator=="object"&&navigator||void 0,K_=mu&&(!gu||["ReactNative","NativeScript","NS"].indexOf(gu.product)<0),J_=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",Q_=mu&&window.location.href||"http://localhost",eM=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:mu,hasStandardBrowserEnv:K_,hasStandardBrowserWebWorkerEnv:J_,navigator:gu,origin:Q_},Symbol.toStringTag,{value:"Module"})),cn={...eM,...$_};function tM(s,e){return ml(s,new cn.classes.URLSearchParams,{visitor:function(t,n,i,r){return cn.isNode&&re.isBuffer(t)?(this.append(n,t.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)},...e})}function nM(s){return re.matchAll(/\w+|\[(\w*)]/g,s).map(e=>e[0]==="[]"?"":e[1]||e[0])}function iM(s){const e={},t=Object.keys(s);let n;const i=t.length;let r;for(n=0;n=t.length;return a=!a&&re.isArray(i)?i.length:a,l?(re.hasOwnProp(i,a)?i[a]=[i[a],n]:i[a]=n,!o):((!i[a]||!re.isObject(i[a]))&&(i[a]=[]),e(t,n,i[a],r)&&re.isArray(i[a])&&(i[a]=iM(i[a])),!o)}if(re.isFormData(s)&&re.isFunction(s.entries)){const t={};return re.forEachEntry(s,(n,i)=>{e(nM(n),i,t,0)}),t}return null}function sM(s,e,t){if(re.isString(s))try{return(e||JSON.parse)(s),re.trim(s)}catch(n){if(n.name!=="SyntaxError")throw n}return(t||JSON.stringify)(s)}const Ra={transitional:_m,adapter:["xhr","http","fetch"],transformRequest:[function(s,e){const t=e.getContentType()||"",n=t.indexOf("application/json")>-1,i=re.isObject(s);if(i&&re.isHTMLForm(s)&&(s=new FormData(s)),re.isFormData(s))return n?JSON.stringify(Mm(s)):s;if(re.isArrayBuffer(s)||re.isBuffer(s)||re.isStream(s)||re.isFile(s)||re.isBlob(s)||re.isReadableStream(s))return s;if(re.isArrayBufferView(s))return s.buffer;if(re.isURLSearchParams(s))return e.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),s.toString();let r;if(i){if(t.indexOf("application/x-www-form-urlencoded")>-1)return tM(s,this.formSerializer).toString();if((r=re.isFileList(s))||t.indexOf("multipart/form-data")>-1){const a=this.env&&this.env.FormData;return ml(r?{"files[]":s}:s,a&&new a,this.formSerializer)}}return i||n?(e.setContentType("application/json",!1),sM(s)):s}],transformResponse:[function(s){const e=this.transitional||Ra.transitional,t=e&&e.forcedJSONParsing,n=this.responseType==="json";if(re.isResponse(s)||re.isReadableStream(s))return s;if(s&&re.isString(s)&&(t&&!this.responseType||n)){const i=!(e&&e.silentJSONParsing)&&n;try{return JSON.parse(s,this.parseReviver)}catch(r){if(i)throw r.name==="SyntaxError"?Ke.from(r,Ke.ERR_BAD_RESPONSE,this,null,this.response):r}}return s}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:cn.classes.FormData,Blob:cn.classes.Blob},validateStatus:function(s){return s>=200&&s<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};re.forEach(["delete","get","head","post","put","patch"],s=>{Ra.headers[s]={}});const rM=re.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),aM=s=>{const e={};let t,n,i;return s&&s.split(` `).forEach(function(r){i=r.indexOf(":"),t=r.substring(0,i).trim().toLowerCase(),n=r.substring(i+1).trim(),!(!t||e[t]&&rM[t])&&(t==="set-cookie"?e[t]?e[t].push(n):e[t]=[n]:e[t]=e[t]?e[t]+", "+n:n)}),e},wm=Symbol("internals");function La(s){return s&&String(s).trim().toLowerCase()}function gl(s){return s===!1||s==null?s:re.isArray(s)?s.map(gl):String(s)}function oM(s){const e=Object.create(null),t=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let n;for(;n=t.exec(s);)e[n[1]]=n[2];return e}const lM=s=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(s.trim());function xu(s,e,t,n,i){if(re.isFunction(n))return n.call(this,e,t);if(i&&(e=t),!!re.isString(e)){if(re.isString(n))return e.indexOf(n)!==-1;if(re.isRegExp(n))return n.test(e)}}function cM(s){return s.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,t,n)=>t.toUpperCase()+n)}function hM(s,e){const t=re.toCamelCase(" "+e);["get","set","has"].forEach(n=>{Object.defineProperty(s,n+t,{value:function(i,r,a){return this[n].call(this,e,i,r,a)},configurable:!0})})}let Mn=class{constructor(s){s&&this.set(s)}set(s,e,t){const n=this;function i(a,o,l){const c=La(o);if(!c)throw new Error("header name must be a non-empty string");const h=re.findKey(n,c);(!h||n[h]===void 0||l===!0||l===void 0&&n[h]!==!1)&&(n[h||o]=gl(a))}const r=(a,o)=>re.forEach(a,(l,c)=>i(l,c,o));if(re.isPlainObject(s)||s instanceof this.constructor)r(s,e);else if(re.isString(s)&&(s=s.trim())&&!lM(s))r(aM(s),e);else if(re.isObject(s)&&re.isIterable(s)){let a={},o,l;for(const c of s){if(!re.isArray(c))throw TypeError("Object iterator must return a key-value pair");a[l=c[0]]=(o=a[l])?re.isArray(o)?[...o,c[1]]:[o,c[1]]:c[1]}r(a,e)}else s!=null&&i(e,s,t);return this}get(s,e){if(s=La(s),s){const t=re.findKey(this,s);if(t){const n=this[t];if(!e)return n;if(e===!0)return oM(n);if(re.isFunction(e))return e.call(this,n,t);if(re.isRegExp(e))return e.exec(n);throw new TypeError("parser must be boolean|regexp|function")}}}has(s,e){if(s=La(s),s){const t=re.findKey(this,s);return!!(t&&this[t]!==void 0&&(!e||xu(this,this[t],t,e)))}return!1}delete(s,e){const t=this;let n=!1;function i(r){if(r=La(r),r){const a=re.findKey(t,r);a&&(!e||xu(t,t[a],a,e))&&(delete t[a],n=!0)}}return re.isArray(s)?s.forEach(i):i(s),n}clear(s){const e=Object.keys(this);let t=e.length,n=!1;for(;t--;){const i=e[t];(!s||xu(this,this[i],i,s,!0))&&(delete this[i],n=!0)}return n}normalize(s){const e=this,t={};return re.forEach(this,(n,i)=>{const r=re.findKey(t,i);if(r){e[r]=gl(n),delete e[i];return}const a=s?cM(i):String(i).trim();a!==i&&delete e[i],e[a]=gl(n),t[a]=!0}),this}concat(...s){return this.constructor.concat(this,...s)}toJSON(s){const e=Object.create(null);return re.forEach(this,(t,n)=>{t!=null&&t!==!1&&(e[n]=s&&re.isArray(t)?t.join(", "):t)}),e}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([s,e])=>s+": "+e).join(` -`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(s){return s instanceof this?s:new this(s)}static concat(s,...e){const t=new this(s);return e.forEach(n=>t.set(n)),t}static accessor(s){const e=(this[wm]=this[wm]={accessors:{}}).accessors,t=this.prototype;function n(i){const r=La(i);e[r]||(hM(t,i),e[r]=!0)}return re.isArray(s)?s.forEach(n):n(s),this}};Mn.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),re.reduceDescriptors(Mn.prototype,({value:s},e)=>{let t=e[0].toUpperCase()+e.slice(1);return{get:()=>s,set(n){this[t]=n}}}),re.freezeMethods(Mn);function vu(s,e){const t=this||Ra,n=e||t,i=Mn.from(n.headers);let r=n.data;return re.forEach(s,function(a){r=a.call(t,r,i.normalize(),e?e.status:void 0)}),i.normalize(),r}function Sm(s){return!!(s&&s.__CANCEL__)}function Br(s,e,t){Ke.call(this,s??"canceled",Ke.ERR_CANCELED,e,t),this.name="CanceledError"}re.inherits(Br,Ke,{__CANCEL__:!0});function Em(s,e,t){const n=t.config.validateStatus;!t.status||!n||n(t.status)?s(t):e(new Ke("Request failed with status code "+t.status,[Ke.ERR_BAD_REQUEST,Ke.ERR_BAD_RESPONSE][Math.floor(t.status/100)-4],t.config,t.request,t))}function uM(s){const e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(s);return e&&e[1]||""}function dM(s,e){s=s||10;const t=new Array(s),n=new Array(s);let i=0,r=0,a;return e=e!==void 0?e:1e3,function(o){const l=Date.now(),c=n[r];a||(a=l),t[i]=o,n[i]=l;let h=r,u=0;for(;h!==i;)u+=t[h++],h=h%s;if(i=(i+1)%s,i===r&&(r=(r+1)%s),l-a{t=l,i=null,r&&(clearTimeout(r),r=null),s(...o)};return[(...o)=>{const l=Date.now(),c=l-t;c>=n?a(o,l):(i=o,r||(r=setTimeout(()=>{r=null,a(i)},n-c)))},()=>i&&a(i)]}const xl=(s,e,t=3)=>{let n=0;const i=dM(50,250);return pM(r=>{const a=r.loaded,o=r.lengthComputable?r.total:void 0,l=a-n,c=i(l),h=a<=o;n=a;const u={loaded:a,total:o,progress:o?a/o:void 0,bytes:l,rate:c||void 0,estimated:c&&o&&h?(o-a)/c:void 0,event:r,lengthComputable:o!=null,[e?"download":"upload"]:!0};s(u)},t)},Tm=(s,e)=>{const t=s!=null;return[n=>e[0]({lengthComputable:t,total:s,loaded:n}),e[1]]},Cm=s=>(...e)=>re.asap(()=>s(...e)),fM=cn.hasStandardBrowserEnv?((s,e)=>t=>(t=new URL(t,cn.origin),s.protocol===t.protocol&&s.host===t.host&&(e||s.port===t.port)))(new URL(cn.origin),cn.navigator&&/(msie|trident)/i.test(cn.navigator.userAgent)):()=>!0,mM=cn.hasStandardBrowserEnv?{write(s,e,t,n,i,r,a){if(typeof document>"u")return;const o=[`${s}=${encodeURIComponent(e)}`];re.isNumber(t)&&o.push(`expires=${new Date(t).toUTCString()}`),re.isString(n)&&o.push(`path=${n}`),re.isString(i)&&o.push(`domain=${i}`),r===!0&&o.push("secure"),re.isString(a)&&o.push(`SameSite=${a}`),document.cookie=o.join("; ")},read(s){if(typeof document>"u")return null;const e=document.cookie.match(new RegExp("(?:^|; )"+s+"=([^;]*)"));return e?decodeURIComponent(e[1]):null},remove(s){this.write(s,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function gM(s){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(s)}function xM(s,e){return e?s.replace(/\/?\/$/,"")+"/"+e.replace(/^\/+/,""):s}function Am(s,e,t){let n=!gM(e);return s&&(n||t==!1)?xM(s,e):e}const Pm=s=>s instanceof Mn?{...s}:s;function Ls(s,e){e=e||{};const t={};function n(c,h,u,p){return re.isPlainObject(c)&&re.isPlainObject(h)?re.merge.call({caseless:p},c,h):re.isPlainObject(h)?re.merge({},h):re.isArray(h)?h.slice():h}function i(c,h,u,p){if(re.isUndefined(h)){if(!re.isUndefined(c))return n(void 0,c,u,p)}else return n(c,h,u,p)}function r(c,h){if(!re.isUndefined(h))return n(void 0,h)}function a(c,h){if(re.isUndefined(h)){if(!re.isUndefined(c))return n(void 0,c)}else return n(void 0,h)}function o(c,h,u){if(u in e)return n(c,h);if(u in s)return n(void 0,c)}const l={url:r,method:r,data:r,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,withXSRFToken:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:o,headers:(c,h,u)=>i(Pm(c),Pm(h),u,!0)};return re.forEach(Object.keys({...s,...e}),function(c){const h=l[c]||i,u=h(s[c],e[c],c);re.isUndefined(u)&&h!==o||(t[c]=u)}),t}const Rm=s=>{const e=Ls({},s);let{data:t,withXSRFToken:n,xsrfHeaderName:i,xsrfCookieName:r,headers:a,auth:o}=e;if(e.headers=a=Mn.from(a),e.url=ym(Am(e.baseURL,e.url,e.allowAbsoluteUrls),s.params,s.paramsSerializer),o&&a.set("Authorization","Basic "+btoa((o.username||"")+":"+(o.password?unescape(encodeURIComponent(o.password)):""))),re.isFormData(t)){if(cn.hasStandardBrowserEnv||cn.hasStandardBrowserWebWorkerEnv)a.setContentType(void 0);else if(re.isFunction(t.getHeaders)){const l=t.getHeaders(),c=["content-type","content-length"];Object.entries(l).forEach(([h,u])=>{c.includes(h.toLowerCase())&&a.set(h,u)})}}if(cn.hasStandardBrowserEnv&&(n&&re.isFunction(n)&&(n=n(e)),n||n!==!1&&fM(e.url))){const l=i&&r&&mM.read(r);l&&a.set(i,l)}return e},vM=typeof XMLHttpRequest<"u",yM=vM&&function(s){return new Promise(function(e,t){const n=Rm(s);let i=n.data;const r=Mn.from(n.headers).normalize();let{responseType:a,onUploadProgress:o,onDownloadProgress:l}=n,c,h,u,p,d;function m(){p&&p(),d&&d(),n.cancelToken&&n.cancelToken.unsubscribe(c),n.signal&&n.signal.removeEventListener("abort",c)}let f=new XMLHttpRequest;f.open(n.method.toUpperCase(),n.url,!0),f.timeout=n.timeout;function x(){if(!f)return;const y=Mn.from("getAllResponseHeaders"in f&&f.getAllResponseHeaders()),v={data:!a||a==="text"||a==="json"?f.responseText:f.response,status:f.status,statusText:f.statusText,headers:y,config:s,request:f};Em(function(b){e(b),m()},function(b){t(b),m()},v),f=null}"onloadend"in f?f.onloadend=x:f.onreadystatechange=function(){!f||f.readyState!==4||f.status===0&&!(f.responseURL&&f.responseURL.indexOf("file:")===0)||setTimeout(x)},f.onabort=function(){f&&(t(new Ke("Request aborted",Ke.ECONNABORTED,s,f)),f=null)},f.onerror=function(y){const v=y&&y.message?y.message:"Network Error",b=new Ke(v,Ke.ERR_NETWORK,s,f);b.event=y||null,t(b),f=null},f.ontimeout=function(){let y=n.timeout?"timeout of "+n.timeout+"ms exceeded":"timeout exceeded";const v=n.transitional||_m;n.timeoutErrorMessage&&(y=n.timeoutErrorMessage),t(new Ke(y,v.clarifyTimeoutError?Ke.ETIMEDOUT:Ke.ECONNABORTED,s,f)),f=null},i===void 0&&r.setContentType(null),"setRequestHeader"in f&&re.forEach(r.toJSON(),function(y,v){f.setRequestHeader(v,y)}),re.isUndefined(n.withCredentials)||(f.withCredentials=!!n.withCredentials),a&&a!=="json"&&(f.responseType=n.responseType),l&&([u,d]=xl(l,!0),f.addEventListener("progress",u)),o&&f.upload&&([h,p]=xl(o),f.upload.addEventListener("progress",h),f.upload.addEventListener("loadend",p)),(n.cancelToken||n.signal)&&(c=y=>{f&&(t(!y||y.type?new Br(null,s,f):y),f.abort(),f=null)},n.cancelToken&&n.cancelToken.subscribe(c),n.signal&&(n.signal.aborted?c():n.signal.addEventListener("abort",c)));const g=uM(n.url);if(g&&cn.protocols.indexOf(g)===-1){t(new Ke("Unsupported protocol "+g+":",Ke.ERR_BAD_REQUEST,s));return}f.send(i||null)})},bM=(s,e)=>{const{length:t}=s=s?s.filter(Boolean):[];if(e||t){let n=new AbortController,i;const r=function(c){if(!i){i=!0,o();const h=c instanceof Error?c:this.reason;n.abort(h instanceof Ke?h:new Br(h instanceof Error?h.message:h))}};let a=e&&setTimeout(()=>{a=null,r(new Ke(`timeout ${e} of ms exceeded`,Ke.ETIMEDOUT))},e);const o=()=>{s&&(a&&clearTimeout(a),a=null,s.forEach(c=>{c.unsubscribe?c.unsubscribe(r):c.removeEventListener("abort",r)}),s=null)};s.forEach(c=>c.addEventListener("abort",r));const{signal:l}=n;return l.unsubscribe=()=>re.asap(o),l}},_M=function*(s,e){let t=s.byteLength;if(t{const i=MM(s,e);let r=0,a,o=l=>{a||(a=!0,n&&n(l))};return new ReadableStream({async pull(l){try{const{done:c,value:h}=await i.next();if(c){o(),l.close();return}let u=h.byteLength;if(t){let p=r+=u;t(p)}l.enqueue(new Uint8Array(h))}catch(c){throw o(c),c}},cancel(l){return o(l),i.return()}},{highWaterMark:2})},Dm=64*1024,{isFunction:vl}=re,SM=(({Request:s,Response:e})=>({Request:s,Response:e}))(re.global),{ReadableStream:Im,TextEncoder:Nm}=re.global,Bm=(s,...e)=>{try{return!!s(...e)}catch{return!1}},EM=s=>{s=re.merge.call({skipUndefined:!0},SM,s);const{fetch:e,Request:t,Response:n}=s,i=e?vl(e):typeof fetch=="function",r=vl(t),a=vl(n);if(!i)return!1;const o=i&&vl(Im),l=i&&(typeof Nm=="function"?(m=>f=>m.encode(f))(new Nm):async m=>new Uint8Array(await new t(m).arrayBuffer())),c=r&&o&&Bm(()=>{let m=!1;const f=new t(cn.origin,{body:new Im,method:"POST",get duplex(){return m=!0,"half"}}).headers.has("Content-Type");return m&&!f}),h=a&&o&&Bm(()=>re.isReadableStream(new n("").body)),u={stream:h&&(m=>m.body)};i&&["text","arrayBuffer","blob","formData","stream"].forEach(m=>{!u[m]&&(u[m]=(f,x)=>{let g=f&&f[m];if(g)return g.call(f);throw new Ke(`Response type '${m}' is not supported`,Ke.ERR_NOT_SUPPORT,x)})});const p=async m=>{if(m==null)return 0;if(re.isBlob(m))return m.size;if(re.isSpecCompliantForm(m))return(await new t(cn.origin,{method:"POST",body:m}).arrayBuffer()).byteLength;if(re.isArrayBufferView(m)||re.isArrayBuffer(m))return m.byteLength;if(re.isURLSearchParams(m)&&(m=m+""),re.isString(m))return(await l(m)).byteLength},d=async(m,f)=>re.toFiniteNumber(m.getContentLength())??p(f);return async m=>{let{url:f,method:x,data:g,signal:y,cancelToken:v,timeout:b,onDownloadProgress:_,onUploadProgress:M,responseType:T,headers:R,withCredentials:S="same-origin",fetchOptions:E}=Rm(m),L=e||fetch;T=T?(T+"").toLowerCase():"text";let A=bM([y,v&&v.toAbortSignal()],b),I=null;const w=A&&A.unsubscribe&&(()=>{A.unsubscribe()});let z;try{if(M&&c&&x!=="get"&&x!=="head"&&(z=await d(R,g))!==0){let W=new t(f,{method:"POST",body:g,duplex:"half"}),$;if(re.isFormData(g)&&($=W.headers.get("content-type"))&&R.setContentType($),W.body){const[fe,me]=Tm(z,xl(Cm(M)));g=Lm(W.body,Dm,fe,me)}}re.isString(S)||(S=S?"include":"omit");const G=r&&"credentials"in t.prototype,j={...E,signal:A,method:x.toUpperCase(),headers:R.normalize().toJSON(),body:g,duplex:"half",credentials:G?S:void 0};I=r&&new t(f,j);let Y=await(r?L(I,E):L(f,j));const q=h&&(T==="stream"||T==="response");if(h&&(_||q&&w)){const W={};["status","statusText","headers"].forEach(de=>{W[de]=Y[de]});const $=re.toFiniteNumber(Y.headers.get("content-length")),[fe,me]=_&&Tm($,xl(Cm(_),!0))||[];Y=new n(Lm(Y.body,Dm,fe,()=>{me&&me(),w&&w()}),W)}T=T||"text";let ie=await u[re.findKey(u,T)||"text"](Y,m);return!q&&w&&w(),await new Promise((W,$)=>{Em(W,$,{data:ie,headers:Mn.from(Y.headers),status:Y.status,statusText:Y.statusText,config:m,request:I})})}catch(G){throw w&&w(),G&&G.name==="TypeError"&&/Load failed|fetch/i.test(G.message)?Object.assign(new Ke("Network Error",Ke.ERR_NETWORK,m,I),{cause:G.cause||G}):Ke.from(G,G&&G.code,m,I)}}},TM=new Map,km=s=>{let e=s&&s.env||{};const{fetch:t,Request:n,Response:i}=e,r=[n,i,t];let a=r.length,o=a,l,c,h=TM;for(;o--;)l=r[o],c=h.get(l),c===void 0&&h.set(l,c=o?new Map:EM(e)),h=c;return c};km();const yu={http:G_,xhr:yM,fetch:{get:km}};re.forEach(yu,(s,e)=>{if(s){try{Object.defineProperty(s,"name",{value:e})}catch{}Object.defineProperty(s,"adapterName",{value:e})}});const Um=s=>`- ${s}`,CM=s=>re.isFunction(s)||s===null||s===!1;function AM(s,e){s=re.isArray(s)?s:[s];const{length:t}=s;let n,i;const r={};for(let a=0;a`adapter ${l} `+(c===!1?"is not supported by the environment":"is not available in the build"));let o=t?a.length>1?`since : +`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(s){return s instanceof this?s:new this(s)}static concat(s,...e){const t=new this(s);return e.forEach(n=>t.set(n)),t}static accessor(s){const e=(this[wm]=this[wm]={accessors:{}}).accessors,t=this.prototype;function n(i){const r=La(i);e[r]||(hM(t,i),e[r]=!0)}return re.isArray(s)?s.forEach(n):n(s),this}};Mn.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),re.reduceDescriptors(Mn.prototype,({value:s},e)=>{let t=e[0].toUpperCase()+e.slice(1);return{get:()=>s,set(n){this[t]=n}}}),re.freezeMethods(Mn);function vu(s,e){const t=this||Ra,n=e||t,i=Mn.from(n.headers);let r=n.data;return re.forEach(s,function(a){r=a.call(t,r,i.normalize(),e?e.status:void 0)}),i.normalize(),r}function Sm(s){return!!(s&&s.__CANCEL__)}function Br(s,e,t){Ke.call(this,s??"canceled",Ke.ERR_CANCELED,e,t),this.name="CanceledError"}re.inherits(Br,Ke,{__CANCEL__:!0});function Em(s,e,t){const n=t.config.validateStatus;!t.status||!n||n(t.status)?s(t):e(new Ke("Request failed with status code "+t.status,[Ke.ERR_BAD_REQUEST,Ke.ERR_BAD_RESPONSE][Math.floor(t.status/100)-4],t.config,t.request,t))}function uM(s){const e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(s);return e&&e[1]||""}function dM(s,e){s=s||10;const t=new Array(s),n=new Array(s);let i=0,r=0,a;return e=e!==void 0?e:1e3,function(o){const l=Date.now(),c=n[r];a||(a=l),t[i]=o,n[i]=l;let h=r,u=0;for(;h!==i;)u+=t[h++],h=h%s;if(i=(i+1)%s,i===r&&(r=(r+1)%s),l-a{t=l,i=null,r&&(clearTimeout(r),r=null),s(...o)};return[(...o)=>{const l=Date.now(),c=l-t;c>=n?a(o,l):(i=o,r||(r=setTimeout(()=>{r=null,a(i)},n-c)))},()=>i&&a(i)]}const xl=(s,e,t=3)=>{let n=0;const i=dM(50,250);return pM(r=>{const a=r.loaded,o=r.lengthComputable?r.total:void 0,l=a-n,c=i(l),h=a<=o;n=a;const u={loaded:a,total:o,progress:o?a/o:void 0,bytes:l,rate:c||void 0,estimated:c&&o&&h?(o-a)/c:void 0,event:r,lengthComputable:o!=null,[e?"download":"upload"]:!0};s(u)},t)},Cm=(s,e)=>{const t=s!=null;return[n=>e[0]({lengthComputable:t,total:s,loaded:n}),e[1]]},Tm=s=>(...e)=>re.asap(()=>s(...e)),fM=cn.hasStandardBrowserEnv?((s,e)=>t=>(t=new URL(t,cn.origin),s.protocol===t.protocol&&s.host===t.host&&(e||s.port===t.port)))(new URL(cn.origin),cn.navigator&&/(msie|trident)/i.test(cn.navigator.userAgent)):()=>!0,mM=cn.hasStandardBrowserEnv?{write(s,e,t,n,i,r,a){if(typeof document>"u")return;const o=[`${s}=${encodeURIComponent(e)}`];re.isNumber(t)&&o.push(`expires=${new Date(t).toUTCString()}`),re.isString(n)&&o.push(`path=${n}`),re.isString(i)&&o.push(`domain=${i}`),r===!0&&o.push("secure"),re.isString(a)&&o.push(`SameSite=${a}`),document.cookie=o.join("; ")},read(s){if(typeof document>"u")return null;const e=document.cookie.match(new RegExp("(?:^|; )"+s+"=([^;]*)"));return e?decodeURIComponent(e[1]):null},remove(s){this.write(s,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function gM(s){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(s)}function xM(s,e){return e?s.replace(/\/?\/$/,"")+"/"+e.replace(/^\/+/,""):s}function Am(s,e,t){let n=!gM(e);return s&&(n||t==!1)?xM(s,e):e}const Pm=s=>s instanceof Mn?{...s}:s;function Ls(s,e){e=e||{};const t={};function n(c,h,u,p){return re.isPlainObject(c)&&re.isPlainObject(h)?re.merge.call({caseless:p},c,h):re.isPlainObject(h)?re.merge({},h):re.isArray(h)?h.slice():h}function i(c,h,u,p){if(re.isUndefined(h)){if(!re.isUndefined(c))return n(void 0,c,u,p)}else return n(c,h,u,p)}function r(c,h){if(!re.isUndefined(h))return n(void 0,h)}function a(c,h){if(re.isUndefined(h)){if(!re.isUndefined(c))return n(void 0,c)}else return n(void 0,h)}function o(c,h,u){if(u in e)return n(c,h);if(u in s)return n(void 0,c)}const l={url:r,method:r,data:r,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,withXSRFToken:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:o,headers:(c,h,u)=>i(Pm(c),Pm(h),u,!0)};return re.forEach(Object.keys({...s,...e}),function(c){const h=l[c]||i,u=h(s[c],e[c],c);re.isUndefined(u)&&h!==o||(t[c]=u)}),t}const Rm=s=>{const e=Ls({},s);let{data:t,withXSRFToken:n,xsrfHeaderName:i,xsrfCookieName:r,headers:a,auth:o}=e;if(e.headers=a=Mn.from(a),e.url=bm(Am(e.baseURL,e.url,e.allowAbsoluteUrls),s.params,s.paramsSerializer),o&&a.set("Authorization","Basic "+btoa((o.username||"")+":"+(o.password?unescape(encodeURIComponent(o.password)):""))),re.isFormData(t)){if(cn.hasStandardBrowserEnv||cn.hasStandardBrowserWebWorkerEnv)a.setContentType(void 0);else if(re.isFunction(t.getHeaders)){const l=t.getHeaders(),c=["content-type","content-length"];Object.entries(l).forEach(([h,u])=>{c.includes(h.toLowerCase())&&a.set(h,u)})}}if(cn.hasStandardBrowserEnv&&(n&&re.isFunction(n)&&(n=n(e)),n||n!==!1&&fM(e.url))){const l=i&&r&&mM.read(r);l&&a.set(i,l)}return e},vM=typeof XMLHttpRequest<"u",bM=vM&&function(s){return new Promise(function(e,t){const n=Rm(s);let i=n.data;const r=Mn.from(n.headers).normalize();let{responseType:a,onUploadProgress:o,onDownloadProgress:l}=n,c,h,u,p,d;function m(){p&&p(),d&&d(),n.cancelToken&&n.cancelToken.unsubscribe(c),n.signal&&n.signal.removeEventListener("abort",c)}let f=new XMLHttpRequest;f.open(n.method.toUpperCase(),n.url,!0),f.timeout=n.timeout;function x(){if(!f)return;const b=Mn.from("getAllResponseHeaders"in f&&f.getAllResponseHeaders()),v={data:!a||a==="text"||a==="json"?f.responseText:f.response,status:f.status,statusText:f.statusText,headers:b,config:s,request:f};Em(function(y){e(y),m()},function(y){t(y),m()},v),f=null}"onloadend"in f?f.onloadend=x:f.onreadystatechange=function(){!f||f.readyState!==4||f.status===0&&!(f.responseURL&&f.responseURL.indexOf("file:")===0)||setTimeout(x)},f.onabort=function(){f&&(t(new Ke("Request aborted",Ke.ECONNABORTED,s,f)),f=null)},f.onerror=function(b){const v=b&&b.message?b.message:"Network Error",y=new Ke(v,Ke.ERR_NETWORK,s,f);y.event=b||null,t(y),f=null},f.ontimeout=function(){let b=n.timeout?"timeout of "+n.timeout+"ms exceeded":"timeout exceeded";const v=n.transitional||_m;n.timeoutErrorMessage&&(b=n.timeoutErrorMessage),t(new Ke(b,v.clarifyTimeoutError?Ke.ETIMEDOUT:Ke.ECONNABORTED,s,f)),f=null},i===void 0&&r.setContentType(null),"setRequestHeader"in f&&re.forEach(r.toJSON(),function(b,v){f.setRequestHeader(v,b)}),re.isUndefined(n.withCredentials)||(f.withCredentials=!!n.withCredentials),a&&a!=="json"&&(f.responseType=n.responseType),l&&([u,d]=xl(l,!0),f.addEventListener("progress",u)),o&&f.upload&&([h,p]=xl(o),f.upload.addEventListener("progress",h),f.upload.addEventListener("loadend",p)),(n.cancelToken||n.signal)&&(c=b=>{f&&(t(!b||b.type?new Br(null,s,f):b),f.abort(),f=null)},n.cancelToken&&n.cancelToken.subscribe(c),n.signal&&(n.signal.aborted?c():n.signal.addEventListener("abort",c)));const g=uM(n.url);if(g&&cn.protocols.indexOf(g)===-1){t(new Ke("Unsupported protocol "+g+":",Ke.ERR_BAD_REQUEST,s));return}f.send(i||null)})},yM=(s,e)=>{const{length:t}=s=s?s.filter(Boolean):[];if(e||t){let n=new AbortController,i;const r=function(c){if(!i){i=!0,o();const h=c instanceof Error?c:this.reason;n.abort(h instanceof Ke?h:new Br(h instanceof Error?h.message:h))}};let a=e&&setTimeout(()=>{a=null,r(new Ke(`timeout ${e} of ms exceeded`,Ke.ETIMEDOUT))},e);const o=()=>{s&&(a&&clearTimeout(a),a=null,s.forEach(c=>{c.unsubscribe?c.unsubscribe(r):c.removeEventListener("abort",r)}),s=null)};s.forEach(c=>c.addEventListener("abort",r));const{signal:l}=n;return l.unsubscribe=()=>re.asap(o),l}},_M=function*(s,e){let t=s.byteLength;if(t{const i=MM(s,e);let r=0,a,o=l=>{a||(a=!0,n&&n(l))};return new ReadableStream({async pull(l){try{const{done:c,value:h}=await i.next();if(c){o(),l.close();return}let u=h.byteLength;if(t){let p=r+=u;t(p)}l.enqueue(new Uint8Array(h))}catch(c){throw o(c),c}},cancel(l){return o(l),i.return()}},{highWaterMark:2})},Dm=64*1024,{isFunction:vl}=re,SM=(({Request:s,Response:e})=>({Request:s,Response:e}))(re.global),{ReadableStream:Im,TextEncoder:Nm}=re.global,Bm=(s,...e)=>{try{return!!s(...e)}catch{return!1}},EM=s=>{s=re.merge.call({skipUndefined:!0},SM,s);const{fetch:e,Request:t,Response:n}=s,i=e?vl(e):typeof fetch=="function",r=vl(t),a=vl(n);if(!i)return!1;const o=i&&vl(Im),l=i&&(typeof Nm=="function"?(m=>f=>m.encode(f))(new Nm):async m=>new Uint8Array(await new t(m).arrayBuffer())),c=r&&o&&Bm(()=>{let m=!1;const f=new t(cn.origin,{body:new Im,method:"POST",get duplex(){return m=!0,"half"}}).headers.has("Content-Type");return m&&!f}),h=a&&o&&Bm(()=>re.isReadableStream(new n("").body)),u={stream:h&&(m=>m.body)};i&&["text","arrayBuffer","blob","formData","stream"].forEach(m=>{!u[m]&&(u[m]=(f,x)=>{let g=f&&f[m];if(g)return g.call(f);throw new Ke(`Response type '${m}' is not supported`,Ke.ERR_NOT_SUPPORT,x)})});const p=async m=>{if(m==null)return 0;if(re.isBlob(m))return m.size;if(re.isSpecCompliantForm(m))return(await new t(cn.origin,{method:"POST",body:m}).arrayBuffer()).byteLength;if(re.isArrayBufferView(m)||re.isArrayBuffer(m))return m.byteLength;if(re.isURLSearchParams(m)&&(m=m+""),re.isString(m))return(await l(m)).byteLength},d=async(m,f)=>re.toFiniteNumber(m.getContentLength())??p(f);return async m=>{let{url:f,method:x,data:g,signal:b,cancelToken:v,timeout:y,onDownloadProgress:_,onUploadProgress:M,responseType:C,headers:R,withCredentials:S="same-origin",fetchOptions:E}=Rm(m),L=e||fetch;C=C?(C+"").toLowerCase():"text";let A=yM([b,v&&v.toAbortSignal()],y),I=null;const w=A&&A.unsubscribe&&(()=>{A.unsubscribe()});let z;try{if(M&&c&&x!=="get"&&x!=="head"&&(z=await d(R,g))!==0){let W=new t(f,{method:"POST",body:g,duplex:"half"}),$;if(re.isFormData(g)&&($=W.headers.get("content-type"))&&R.setContentType($),W.body){const[fe,me]=Cm(z,xl(Tm(M)));g=Lm(W.body,Dm,fe,me)}}re.isString(S)||(S=S?"include":"omit");const G=r&&"credentials"in t.prototype,j={...E,signal:A,method:x.toUpperCase(),headers:R.normalize().toJSON(),body:g,duplex:"half",credentials:G?S:void 0};I=r&&new t(f,j);let Y=await(r?L(I,E):L(f,j));const q=h&&(C==="stream"||C==="response");if(h&&(_||q&&w)){const W={};["status","statusText","headers"].forEach(de=>{W[de]=Y[de]});const $=re.toFiniteNumber(Y.headers.get("content-length")),[fe,me]=_&&Cm($,xl(Tm(_),!0))||[];Y=new n(Lm(Y.body,Dm,fe,()=>{me&&me(),w&&w()}),W)}C=C||"text";let ie=await u[re.findKey(u,C)||"text"](Y,m);return!q&&w&&w(),await new Promise((W,$)=>{Em(W,$,{data:ie,headers:Mn.from(Y.headers),status:Y.status,statusText:Y.statusText,config:m,request:I})})}catch(G){throw w&&w(),G&&G.name==="TypeError"&&/Load failed|fetch/i.test(G.message)?Object.assign(new Ke("Network Error",Ke.ERR_NETWORK,m,I),{cause:G.cause||G}):Ke.from(G,G&&G.code,m,I)}}},CM=new Map,km=s=>{let e=s&&s.env||{};const{fetch:t,Request:n,Response:i}=e,r=[n,i,t];let a=r.length,o=a,l,c,h=CM;for(;o--;)l=r[o],c=h.get(l),c===void 0&&h.set(l,c=o?new Map:EM(e)),h=c;return c};km();const bu={http:G_,xhr:bM,fetch:{get:km}};re.forEach(bu,(s,e)=>{if(s){try{Object.defineProperty(s,"name",{value:e})}catch{}Object.defineProperty(s,"adapterName",{value:e})}});const Um=s=>`- ${s}`,TM=s=>re.isFunction(s)||s===null||s===!1;function AM(s,e){s=re.isArray(s)?s:[s];const{length:t}=s;let n,i;const r={};for(let a=0;a`adapter ${l} `+(c===!1?"is not supported by the environment":"is not available in the build"));let o=t?a.length>1?`since : `+a.map(Um).join(` -`):" "+Um(a[0]):"as no adapter specified";throw new Ke("There is no suitable adapter to dispatch the request "+o,"ERR_NOT_SUPPORT")}return i}const Om={getAdapter:AM,adapters:yu};function bu(s){if(s.cancelToken&&s.cancelToken.throwIfRequested(),s.signal&&s.signal.aborted)throw new Br(null,s)}function zm(s){return bu(s),s.headers=Mn.from(s.headers),s.data=vu.call(s,s.transformRequest),["post","put","patch"].indexOf(s.method)!==-1&&s.headers.setContentType("application/x-www-form-urlencoded",!1),Om.getAdapter(s.adapter||Ra.adapter,s)(s).then(function(e){return bu(s),e.data=vu.call(s,s.transformResponse,e),e.headers=Mn.from(e.headers),e},function(e){return Sm(e)||(bu(s),e&&e.response&&(e.response.data=vu.call(s,s.transformResponse,e.response),e.response.headers=Mn.from(e.response.headers))),Promise.reject(e)})}const Fm="1.13.2",yl={};["object","boolean","number","function","string","symbol"].forEach((s,e)=>{yl[s]=function(t){return typeof t===s||"a"+(e<1?"n ":" ")+s}});const Hm={};yl.transitional=function(s,e,t){function n(i,r){return"[Axios v"+Fm+"] Transitional option '"+i+"'"+r+(t?". "+t:"")}return(i,r,a)=>{if(s===!1)throw new Ke(n(r," has been removed"+(e?" in "+e:"")),Ke.ERR_DEPRECATED);return e&&!Hm[r]&&(Hm[r]=!0,console.warn(n(r," has been deprecated since v"+e+" and will be removed in the near future"))),s?s(i,r,a):!0}},yl.spelling=function(s){return(e,t)=>(console.warn(`${t} is likely a misspelling of ${s}`),!0)};function PM(s,e,t){if(typeof s!="object")throw new Ke("options must be an object",Ke.ERR_BAD_OPTION_VALUE);const n=Object.keys(s);let i=n.length;for(;i-- >0;){const r=n[i],a=e[r];if(a){const o=s[r],l=o===void 0||a(o,r,s);if(l!==!0)throw new Ke("option "+r+" must be "+l,Ke.ERR_BAD_OPTION_VALUE);continue}if(t!==!0)throw new Ke("Unknown option "+r,Ke.ERR_BAD_OPTION)}}const bl={assertOptions:PM,validators:yl},di=bl.validators;let Ds=class{constructor(s){this.defaults=s||{},this.interceptors={request:new bm,response:new bm}}async request(s,e){try{return await this._request(s,e)}catch(t){if(t instanceof Error){let n={};Error.captureStackTrace?Error.captureStackTrace(n):n=new Error;const i=n.stack?n.stack.replace(/^.+\n/,""):"";try{t.stack?i&&!String(t.stack).endsWith(i.replace(/^.+\n.+\n/,""))&&(t.stack+=` -`+i):t.stack=i}catch{}}throw t}}_request(s,e){typeof s=="string"?(e=e||{},e.url=s):e=s||{},e=Ls(this.defaults,e);const{transitional:t,paramsSerializer:n,headers:i}=e;t!==void 0&&bl.assertOptions(t,{silentJSONParsing:di.transitional(di.boolean),forcedJSONParsing:di.transitional(di.boolean),clarifyTimeoutError:di.transitional(di.boolean)},!1),n!=null&&(re.isFunction(n)?e.paramsSerializer={serialize:n}:bl.assertOptions(n,{encode:di.function,serialize:di.function},!0)),e.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?e.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:e.allowAbsoluteUrls=!0),bl.assertOptions(e,{baseUrl:di.spelling("baseURL"),withXsrfToken:di.spelling("withXSRFToken")},!0),e.method=(e.method||this.defaults.method||"get").toLowerCase();let r=i&&re.merge(i.common,i[e.method]);i&&re.forEach(["delete","get","head","post","put","patch","common"],d=>{delete i[d]}),e.headers=Mn.concat(r,i);const a=[];let o=!0;this.interceptors.request.forEach(function(d){typeof d.runWhen=="function"&&d.runWhen(e)===!1||(o=o&&d.synchronous,a.unshift(d.fulfilled,d.rejected))});const l=[];this.interceptors.response.forEach(function(d){l.push(d.fulfilled,d.rejected)});let c,h=0,u;if(!o){const d=[zm.bind(this),void 0];for(d.unshift(...a),d.push(...l),u=d.length,c=Promise.resolve(e);h{if(!n._listeners)return;let r=n._listeners.length;for(;r-- >0;)n._listeners[r](i);n._listeners=null}),this.promise.then=i=>{let r;const a=new Promise(o=>{n.subscribe(o),r=o}).then(i);return a.cancel=function(){n.unsubscribe(r)},a},e(function(i,r,a){n.reason||(n.reason=new Br(i,r,a),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=n=>{e.abort(n)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;return{token:new gg(function(t){e=t}),cancel:e}}};function LM(s){return function(e){return s.apply(null,e)}}function DM(s){return re.isObject(s)&&s.isAxiosError===!0}const _u={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(_u).forEach(([s,e])=>{_u[e]=s});function Vm(s){const e=new Ds(s),t=sm(Ds.prototype.request,e);return re.extend(t,Ds.prototype,e,{allOwnKeys:!0}),re.extend(t,e,null,{allOwnKeys:!0}),t.create=function(n){return Vm(Ls(s,n))},t}const It=Vm(Ra);It.Axios=Ds,It.CanceledError=Br,It.CancelToken=RM,It.isCancel=Sm,It.VERSION=Fm,It.toFormData=ml,It.AxiosError=Ke,It.Cancel=It.CanceledError,It.all=function(s){return Promise.all(s)},It.spread=LM,It.isAxiosError=DM,It.mergeConfig=Ls,It.AxiosHeaders=Mn,It.formToJSON=s=>Mm(re.isHTMLForm(s)?new FormData(s):s),It.getAdapter=Om.getAdapter,It.HttpStatusCode=_u,It.default=It;const{Axios:e4,AxiosError:t4,CanceledError:n4,isCancel:i4,CancelToken:s4,VERSION:r4,all:a4,Cancel:o4,isAxiosError:l4,spread:c4,toFormData:h4,AxiosHeaders:u4,HttpStatusCode:d4,formToJSON:p4,getAdapter:f4,mergeConfig:m4}=It;function Gm(s,e){var t;if(window.XMLHttpRequest?t=new XMLHttpRequest:window.ActiveXObject?t=new window.ActiveXObject:alert("请升级至最新版本的浏览器"),t!=null){let n=s;t.open("GET",n,!0),t.send(null),t.onreadystatechange=function(){t.readyState==4&&t.status==200&&(t.responseText.includes("",0)&&t.responseText.includes("",0)&&t.responseText.includes("",0)?e(null):e(t.responseText))},t.onloadend=function(){t.readyState==4&&t.status==404&&t.status==502&&e(null)}}}function IM(s,e){It({method:"get",responseType:"blob",url:s}).then(t=>{let n=new window.File([t.data],"zipFolder",{type:"zip"});im.loadAsync(n).then(i=>{const r=new Map,a=[];for(let o in i.files){if(i.files[o].dir)continue;const l=i.file(i.files[o].name);if(l){const c=l.async("blob").then(h=>{const u=URL.createObjectURL(h);r.set("/"+i.files[o].name.replace("\\","/"),u)});a.push(c)}}Promise.all(a).then(()=>{e(r)}).catch(o=>{console.error("解压zip文件失败:",o),e(new Map)})}).catch(i=>{console.error("加载zip文件失败:",i),e(new Map)})}).catch(t=>{console.error("下载zip文件失败:",t),e(new Map)})}function Wm(s,e){It({method:"get",responseType:"blob",url:s}).then(n=>{let i=new window.File([n.data],"semantics",{type:"zip"});im.loadAsync(i).then(r=>{for(let a in r.files)r.file(r.files[a].name).async("blob").then(o=>{t(o,"utf-8",function(l,c){e(c)})})})});function t(n,i,r){var a=new FileReader,o=new Blob([n]);a.onload=function(l){r(null,l.target.result)},a.onerror=function(l){r(l.error,null)},a.readAsText(o,i)}}const Mu=new WeakMap;class NM extends Ji{constructor(e){super(e),this.decoderPath="",this.decoderConfig={},this.decoderBinary=null,this.decoderPending=null,this.workerLimit=4,this.workerPool=[],this.workerNextTaskID=1,this.workerSourceURL="",this.defaultAttributeIDs={position:"POSITION",normal:"NORMAL",color:"COLOR",uv:"TEX_COORD"},this.defaultAttributeTypes={position:"Float32Array",normal:"Float32Array",color:"Float32Array",uv:"Float32Array"}}setDecoderPath(e){return this.decoderPath=e,this}setDecoderConfig(e){return this.decoderConfig=e,this}setWorkerLimit(e){return this.workerLimit=e,this}load(e,t,n,i){const r=new Ma(this.manager);r.setPath(this.path),r.setResponseType("arraybuffer"),r.setRequestHeader(this.requestHeader),r.setWithCredentials(this.withCredentials),r.load(e,a=>{this.parse(a,t,i)},n,i)}parse(e,t,n=()=>{}){this.decodeDracoFile(e,t,null,null,Rt,n).catch(n)}decodeDracoFile(e,t,n,i,r=en,a=()=>{}){const o={attributeIDs:n||this.defaultAttributeIDs,attributeTypes:i||this.defaultAttributeTypes,useUniqueIDs:!!n,vertexColorSpace:r};return this.decodeGeometry(e,o).then(t).catch(a)}decodeGeometry(e,t){const n=JSON.stringify(t);if(Mu.has(e)){const l=Mu.get(e);if(l.key===n)return l.promise;if(e.byteLength===0)throw new Error("THREE.DRACOLoader: Unable to re-decode a buffer with different settings. Buffer has already been transferred.")}let i;const r=this.workerNextTaskID++,a=e.byteLength,o=this._getWorker(r,a).then(l=>(i=l,new Promise((c,h)=>{i._callbacks[r]={resolve:c,reject:h},i.postMessage({type:"decode",id:r,taskConfig:t,buffer:e},[e])}))).then(l=>this._createGeometry(l.geometry));return o.catch(()=>!0).then(()=>{i&&r&&this._releaseTask(i,r)}),Mu.set(e,{key:n,promise:o}),o}_createGeometry(e){const t=new dt;e.index&&t.setIndex(new yt(e.index.array,1));for(let n=0;n{n.load(e,i,void 0,r)})}preload(){return this._initDecoder(),this}_initDecoder(){if(this.decoderPending)return this.decoderPending;const e=typeof WebAssembly!="object"||this.decoderConfig.type==="js",t=[];return e?t.push(this._loadLibrary("draco_decoder.js","text")):(t.push(this._loadLibrary("draco_wasm_wrapper.js","text")),t.push(this._loadLibrary("draco_decoder.wasm","arraybuffer"))),this.decoderPending=Promise.all(t).then(n=>{const i=n[0];e||(this.decoderConfig.wasmBinary=n[1]);const r=BM.toString(),a=["/* draco decoder */",i,"","/* worker */",r.substring(r.indexOf("{")+1,r.lastIndexOf("}"))].join(` -`);this.workerSourceURL=URL.createObjectURL(new Blob([a]))}),this.decoderPending}_getWorker(e,t){return this._initDecoder().then(()=>{if(this.workerPool.lengthr._taskLoad?-1:1});const n=this.workerPool[this.workerPool.length-1];return n._taskCosts[e]=t,n._taskLoad+=t,n})}_releaseTask(e,t){e._taskLoad-=e._taskCosts[t],delete e._callbacks[t],delete e._taskCosts[t]}debug(){console.log("Task load: ",this.workerPool.map(e=>e._taskLoad))}dispose(){for(let e=0;e{const u=h.draco,p=new u.Decoder;try{const d=t(u,p,new Int8Array(l),c),m=d.attributes.map(f=>f.array.buffer);d.index&&m.push(d.index.array.buffer),self.postMessage({type:"decode",id:o.id,geometry:d},m)}catch(d){console.error(d),self.postMessage({type:"error",id:o.id,error:d.message})}finally{u.destroy(p)}});break}};function t(a,o,l,c){const h=c.attributeIDs,u=c.attributeTypes;let p,d;const m=o.GetEncodedGeometryType(l);if(m===a.TRIANGULAR_MESH)p=new a.Mesh,d=o.DecodeArrayToMesh(l,l.byteLength,p);else if(m===a.POINT_CLOUD)p=new a.PointCloud,d=o.DecodeArrayToPointCloud(l,l.byteLength,p);else throw new Error("THREE.DRACOLoader: Unexpected geometry type.");if(!d.ok()||p.ptr===0)throw new Error("THREE.DRACOLoader: Decoding failed: "+d.error_msg());const f={index:null,attributes:[]};for(const x in h){const g=self[u[x]];let y,v;if(c.useUniqueIDs)v=h[x],y=o.GetAttributeByUniqueId(p,v);else{if(v=o.GetAttributeId(p,a[h[x]]),v===-1)continue;y=o.GetAttribute(p,v)}const b=i(a,o,p,x,g,y);x==="color"&&(b.vertexColorSpace=c.vertexColorSpace),f.attributes.push(b)}return m===a.TRIANGULAR_MESH&&(f.index=n(a,o,p)),a.destroy(p),f}function n(a,o,l){const c=l.num_faces()*3,h=c*4,u=a._malloc(h);o.GetTrianglesUInt32Array(l,h,u);const p=new Uint32Array(a.HEAPF32.buffer,u,c).slice();return a._free(u),{array:p,itemSize:1}}function i(a,o,l,c,h,u){const p=l.num_points(),d=u.num_components(),m=r(a,h),f=d*h.BYTES_PER_ELEMENT,x=Math.ceil(f/4)*4,g=x/h.BYTES_PER_ELEMENT,y=p*f,v=p*x,b=a._malloc(y);o.GetAttributeDataArrayForAllPoints(l,u,m,y,b);const _=new h(a.HEAPF32.buffer,b,y/h.BYTES_PER_ELEMENT);let M;if(f===x)M=_.slice();else{M=new h(v/h.BYTES_PER_ELEMENT);let T=0;for(let R=0,S=_.length;R(s.ModelLoadStart="model-load-start",s.ModelLoadProgress="model-load-progress",s.ModelLoaded="model-loaded",s.ModelError="model-error",s.SelectionChanged="selection-changed",s.HoverChanged="hover-changed",s.Click="click",s.MouseMove="mouse-move",s.CameraChanged="camera-changed",s.CameraIdle="camera-idle",s.ViewportResize="viewport-resize",s.EngineFree="engine-free",s.EngineBusy="engine-busy",s.MeasureChanged="measure-changed",s.SectionMove="section-move",s))(ts||{});function kM(s,e,t,n){let i=0,r=0,a=0,o=s.models.find(d=>d.url==t),l=e.circularMeps,c=e.rectMeps.filter(d=>d.type==="风管"),h=e.rectMeps.filter(d=>d.type==="桥架"),u=e.ellipseMeps,p=s.scene;if(new Ht,new dt,l&&l.length){let d=[],m=0;for(let f of l)f.color=f.color.split(",").map(x=>parseInt(x)/255),f.color=new Fe(f.color[0],f.color[1],f.color[2]),f.position={x:f.startPoint.X*.3048+i,y:f.startPoint.Z*.3048+r,z:-f.startPoint.Y*.3048+a},f.rotation={x:0,y:0,z:0},f.indexes=[[s.scene.children.length,m++,0,0]],o.nodesMap.set(Number(f.id),f),d.push(f);_l("Circle",p,d,t)}if(c&&c.length){let d=[],m=0;for(let f of c)f.color=f.color.split(",").map(x=>parseInt(x)/255),f.color=new Fe(f.color[0],f.color[1],f.color[2]),f.position={x:f.startPoint.X*.3048+i,y:f.startPoint.Z*.3048+r,z:-f.startPoint.Y*.3048+a},f.rotation={x:0,y:0,z:0},f.indexes=[[s.scene.children.length,m++,0,0]],o.nodesMap.set(Number(f.id),f),d.push(f);_l("Rect",p,d,t)}if(u&&u.length){let d=[],m=0;for(let f of u)f.color=f.color.split(",").map(x=>parseInt(x)/255),f.color=new Fe(f.color[0],f.color[1],f.color[2]),f.position={x:f.startPoint.X*.3048+i,y:f.startPoint.Z*.3048+r,z:-f.startPoint.Y*.3048+a},f.rotation={x:0,y:0,z:0},f.indexes=[[s.scene.children.length,m++,0,0]],o.nodesMap.set(Number(f.id),f),d.push(f);_l("Ellipse",p,d,t)}if(h&&h.length){let d=[],m=0;for(let f of h)f.color=f.color.split(",").map(x=>parseInt(x)/255),f.color=new Fe(f.color[0],f.color[1],f.color[2]),f.position={x:f.startPoint.X*.3048+i,y:f.startPoint.Z*.3048+r,z:-f.startPoint.Y*.3048+a},f.rotation={x:0,y:0,z:0},f.indexes=[[s.scene.children.length,m++,0,0]],o.nodesMap.set(Number(f.id),f),d.push(f);_l("Bridge",p,d,t)}}function _l(s,e,t,n,i){let r,a,o={width:1,height:1,length:1,diameter:1,color:new Fe,position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0}};switch(s){case"Rect":a=Ml("Rect",o);break;case"Bridge":a=Ml("Bridge",o);break;case"Circle":a=Ml("Circle",o);break;case"Ellipse":a=Ml("Ellipse",o);break}a&&(r=new Ut(a.geometry,a.material,t.length),r.url=n,e.add(r));let l=[],c=[];for(var h=0;hd.endPoint.Z?1:-1)*Math.PI*.5,d.base_x!=null){var u=new P(d.base_x.X,0,-d.base_x.Y);v=(u.clone().cross(new P(0,0,1)).y<=0?1:-1)*u.angleTo(new P(0,0,1))+Math.PI*.5}}else v=(f.clone().sub(m.clone()).cross(new P(0,0,1)).y>0?-1:1)*f.clone().sub(m.clone()).angleTo(new P(0,0,1)),y=(d.startPoint.Z>d.endPoint.Z?1:-1)*f.clone().sub(m.clone()).angleTo(g.clone().sub(x.clone()));let _=new De;const M=new Pn(y,v,b,"YXZ");let T=_.clone().makeRotationFromEuler(M),R,S;s==="Circle"?(R=d.diameter,S=d.diameter):(R=d.width,S=d.height);let E=_.clone().makeScale(R,S,d.length);_.multiplyMatrices(T,E),_.setPosition(d.position.x,d.position.y,d.position.z),r.setMatrixAt(h,_.clone()),r.setColorAt(h,d.color),r.geometry.computeBoundingBox();let L=r.geometry.boundingBox.min.clone().applyMatrix4(_.clone()),A=r.geometry.boundingBox.max.clone().applyMatrix4(_.clone()),I=new P(Math.min(L.x,A.x),Math.min(L.y,A.y),Math.min(L.z,A.z)),w=new P(Math.max(L.x,A.x),Math.max(L.y,A.y),Math.max(L.z,A.z)),z=I.clone().add(w.clone()).multiplyScalar(.5),G={name:d.name,min:I,max:w,center:z,dbid:h,materialName:a.material.name},j=null,Y=null;s==="Circle"&&(j={x:d.startPoint.X*.3048,y:d.startPoint.Z*.3048,z:-d.startPoint.Y*.3048},Y={x:d.endPoint.X*.3048,y:d.endPoint.Z*.3048,z:-d.endPoint.Y*.3048},G.minC=j,G.maxC=Y),r.ids||(r.ids=[]),r.matrixs||(r.matrixs=[]),r.matrixs.push(_.clone()),c.push(_.clone()),r.ids.push(Number(d.id)),l.push(G)}r.castShadow=!0,r.ElementInfos=l,r.name="rootModel",r.TypeName="InstancedMesh-Pipe",r.PipeType=s,r.MeshId=null,r.realMaterial=r.material.clone(),r.originalMaterial=r.material.clone(),r.materialClone=c;let p=[];p={geometry:r.geometry,matrix:r.matrix,position:r.position,rotation:r.rotation},r.meshs=p,r.instanceMatrix&&r.instanceMatrix.array&&(r.cloneInstanceMatrix=Array.from(r.instanceMatrix.array))}function Ml(s,e,t){let n=new Qp;switch(e.width=e.width*.3048,e.height=e.height*.3048,e.diameter=e.diameter*.3048,s){case"Rect":n.moveTo(-e.width/2,-e.height/2),n.lineTo(-e.width/2,e.height/2),n.lineTo(e.width/2,e.height/2),n.lineTo(e.width/2,-e.height/2),n.lineTo(-e.width/2,-e.height/2);break;case"Ellipse":n.moveTo(-e.width/2,-e.height/2),n.lineTo(-e.width/2,e.height/2),n.lineTo(e.width/2,e.height/2),n.lineTo(e.width/2,-e.height/2),n.lineTo(-e.width/2,-e.height/2);break;case"Bridge":n.moveTo(-e.width/2,-e.height/2),n.lineTo(-e.width/2,e.height/2),n.lineTo(-e.width/2+.01,e.height/2),n.lineTo(-e.width/2+.01,-e.height/2+.01),n.lineTo(e.width/2-.01,-e.height/2+.01),n.lineTo(e.width/2-.01,e.height/2),n.lineTo(e.width/2,e.height/2),n.lineTo(e.width/2,-e.height/2),n.lineTo(-e.width/2,-e.height/2);break;case"Circle":n.moveTo(0,0),n.absarc(0,0,e.diameter*.5,0,Math.PI*2,!1);break}const i={depth:e.length*.3048,bevelEnabled:!1};return r(n,i,e.color,e.position,e.rotation);function r(a,o,l,c,h){let u=new Hh(a,o),p=new Ki({color:l,side:bt}),d=new rt(u,p);return d.position.set(c.x,c.y,c.z),d.rotation._order="YXZ",d.rotation.set(h.x,h.y,h.z),d}}function Xm(s,e=!1){const t=s[0].index!==null,n=new Set(Object.keys(s[0].attributes)),i=new Set(Object.keys(s[0].morphAttributes)),r={},a={},o=s[0].morphTargetsRelative,l=new dt;let c=0;for(let h=0;h=2.0 are supported."));return}const c=new gw(r,{path:t||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});c.fileLoader.setRequestHeader(this.requestHeader);for(let h=0;h=0&&o[u]===void 0&&console.warn('THREE.GLTFLoader: Unknown extension "'+u+'".')}}c.setExtensions(a),c.setPlugins(o),c.parse(n,i)}parseAsync(e,t){const n=this;return new Promise(function(i,r){n.parse(e,t,i,r)})}}function OM(){let s={};return{get:function(e){return s[e]},add:function(e,t){s[e]=t},remove:function(e){delete s[e]},removeAll:function(){s={}}}}const nt={KHR_BINARY_GLTF:"KHR_binary_glTF",KHR_DRACO_MESH_COMPRESSION:"KHR_draco_mesh_compression",KHR_LIGHTS_PUNCTUAL:"KHR_lights_punctual",KHR_MATERIALS_CLEARCOAT:"KHR_materials_clearcoat",KHR_MATERIALS_DISPERSION:"KHR_materials_dispersion",KHR_MATERIALS_IOR:"KHR_materials_ior",KHR_MATERIALS_SHEEN:"KHR_materials_sheen",KHR_MATERIALS_SPECULAR:"KHR_materials_specular",KHR_MATERIALS_TRANSMISSION:"KHR_materials_transmission",KHR_MATERIALS_IRIDESCENCE:"KHR_materials_iridescence",KHR_MATERIALS_ANISOTROPY:"KHR_materials_anisotropy",KHR_MATERIALS_UNLIT:"KHR_materials_unlit",KHR_MATERIALS_VOLUME:"KHR_materials_volume",KHR_TEXTURE_BASISU:"KHR_texture_basisu",KHR_TEXTURE_TRANSFORM:"KHR_texture_transform",KHR_MESH_QUANTIZATION:"KHR_mesh_quantization",KHR_MATERIALS_EMISSIVE_STRENGTH:"KHR_materials_emissive_strength",EXT_MATERIALS_BUMP:"EXT_materials_bump",EXT_TEXTURE_WEBP:"EXT_texture_webp",EXT_TEXTURE_AVIF:"EXT_texture_avif",EXT_MESHOPT_COMPRESSION:"EXT_meshopt_compression",EXT_MESH_GPU_INSTANCING:"EXT_mesh_gpu_instancing"};class zM{constructor(e){this.parser=e,this.name=nt.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){const e=this.parser,t=this.parser.json.nodes||[];for(let n=0,i=t.length;n=0)throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures");return null}return t.loadTextureImage(e,r.source,a)}}class QM{constructor(e){this.parser=e,this.name=nt.EXT_TEXTURE_WEBP}loadTexture(e){const t=this.name,n=this.parser,i=n.json,r=i.textures[e];if(!r.extensions||!r.extensions[t])return null;const a=r.extensions[t],o=i.images[a.source];let l=n.textureLoader;if(o.uri){const c=n.options.manager.getHandler(o.uri);c!==null&&(l=c)}return n.loadTextureImage(e,a.source,l)}}class ew{constructor(e){this.parser=e,this.name=nt.EXT_TEXTURE_AVIF}loadTexture(e){const t=this.name,n=this.parser,i=n.json,r=i.textures[e];if(!r.extensions||!r.extensions[t])return null;const a=r.extensions[t],o=i.images[a.source];let l=n.textureLoader;if(o.uri){const c=n.options.manager.getHandler(o.uri);c!==null&&(l=c)}return n.loadTextureImage(e,a.source,l)}}class tw{constructor(e){this.name=nt.EXT_MESHOPT_COMPRESSION,this.parser=e}loadBufferView(e){const t=this.parser.json,n=t.bufferViews[e];if(n.extensions&&n.extensions[this.name]){const i=n.extensions[this.name],r=this.parser.getDependency("buffer",i.buffer),a=this.parser.options.meshoptDecoder;if(!a||!a.supported){if(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files");return null}return r.then(function(o){const l=i.byteOffset||0,c=i.byteLength||0,h=i.count,u=i.byteStride,p=new Uint8Array(o,l,c);return a.decodeGltfBufferAsync?a.decodeGltfBufferAsync(h,u,p,i.mode,i.filter).then(function(d){return d.buffer}):a.ready.then(function(){const d=new ArrayBuffer(h*u);return a.decodeGltfBuffer(new Uint8Array(d),h,u,p,i.mode,i.filter),d})})}else return null}}class nw{constructor(e){this.name=nt.EXT_MESH_GPU_INSTANCING,this.parser=e}createNodeMesh(e){const t=this.parser.json,n=t.nodes[e];if(!n.extensions||!n.extensions[this.name]||n.mesh===void 0)return null;const i=t.meshes[n.mesh];for(const l of i.primitives)if(l.mode!==Gn.TRIANGLES&&l.mode!==Gn.TRIANGLE_STRIP&&l.mode!==Gn.TRIANGLE_FAN&&l.mode!==void 0)return null;const r=n.extensions[this.name].attributes,a=[],o={};for(const l in r)a.push(this.parser.getDependency("accessor",r[l]).then(c=>(o[l]=c,o[l])));return a.length<1?null:(a.push(this.parser.createNodeMesh(e)),Promise.all(a).then(l=>{const c=l.pop(),h=c.isGroup?c.children:[c],u=l[0].count,p=[];for(const d of h){const m=new De,f=new P,x=new zn,g=new P(1,1,1),y=new Ut(d.geometry,d.material,u);for(let v=0;v0||s.search(/^data\:image\/jpeg/)===0?"image/jpeg":s.search(/\.webp($|\?)/i)>0||s.search(/^data\:image\/webp/)===0?"image/webp":s.search(/\.ktx2($|\?)/i)>0||s.search(/^data\:image\/ktx2/)===0?"image/ktx2":"image/png"}const mw=new De;class gw{constructor(e={},t={}){this.json=e,this.extensions={},this.plugins={},this.options=t,this.cache=new OM,this.associations=new Map,this.primitiveCache={},this.nodeCache={},this.meshCache={refs:{},uses:{}},this.cameraCache={refs:{},uses:{}},this.lightCache={refs:{},uses:{}},this.sourceCache={},this.textureCache={},this.nodeNamesUsed={};let n=!1,i=-1,r=!1,a=-1;if(typeof navigator<"u"){const o=navigator.userAgent;n=/^((?!chrome|android).)*safari/i.test(o)===!0;const l=o.match(/Version\/(\d+)/);i=n&&l?parseInt(l[1],10):-1,r=o.indexOf("Firefox")>-1,a=r?o.match(/Firefox\/([0-9]+)\./)[1]:-1}typeof createImageBitmap>"u"||n&&i<17||r&&a<98?this.textureLoader=new Gh(this.options.manager):this.textureLoader=new sv(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new Ma(this.options.manager),this.fileLoader.setResponseType("arraybuffer"),this.options.crossOrigin==="use-credentials"&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,t){const n=this,i=this.json,r=this.extensions;this.cache.removeAll(),this.nodeCache={},this._invokeAll(function(a){return a._markDefs&&a._markDefs()}),Promise.all(this._invokeAll(function(a){return a.beforeRoot&&a.beforeRoot()})).then(function(){return Promise.all([n.getDependencies("scene"),n.getDependencies("animation"),n.getDependencies("camera")])}).then(function(a){const o={scene:a[0][i.scene||0],scenes:a[0],animations:a[1],cameras:a[2],asset:i.asset,parser:n,userData:{}};return Is(r,o,i),pi(o,i),Promise.all(n._invokeAll(function(l){return l.afterRoot&&l.afterRoot(o)})).then(function(){for(const l of o.scenes)l.updateMatrixWorld();e(o)})}).catch(t)}_markDefs(){const e=this.json.nodes||[],t=this.json.skins||[],n=this.json.meshes||[];for(let i=0,r=t.length;i{const l=this.associations.get(a);l!=null&&this.associations.set(o,l);for(const[c,h]of a.children.entries())r(h,o.children[c])};return r(n,i),i.name+="_instance_"+e.uses[t]++,i}_invokeOne(e){const t=Object.values(this.plugins);t.push(this);for(let n=0;n=2&&x.setY(S,M[T*l+1]),l>=3&&x.setZ(S,M[T*l+2]),l>=4&&x.setW(S,M[T*l+3]),l>=5)throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}x.normalized=m}return x})}loadTexture(e){const t=this.json,n=this.options,i=t.textures[e].source,r=t.images[i];let a=this.textureLoader;if(r.uri){const o=n.manager.getHandler(r.uri);o!==null&&(a=o)}return this.loadTextureImage(e,i,a)}loadTextureImage(e,t,n){const i=this,r=this.json,a=r.textures[e],o=r.images[t],l=(o.uri||o.bufferView)+":"+a.sampler;if(this.textureCache[l])return this.textureCache[l];const c=this.loadImageSource(t,n).then(function(h){h.flipY=!1,h.name=a.name||o.name||"",h.name===""&&typeof o.uri=="string"&&o.uri.startsWith("data:image/")===!1&&(h.name=o.uri);const u=(r.samplers||{})[a.sampler]||{};return h.magFilter=Km[u.magFilter]||Pt,h.minFilter=Km[u.minFilter]||ai,h.wrapS=Jm[u.wrapS]||Tn,h.wrapT=Jm[u.wrapT]||Tn,h.generateMipmaps=!h.isCompressedTexture&&h.minFilter!==Xt&&h.minFilter!==Pt,i.associations.set(h,{textures:e}),h}).catch(function(){return null});return this.textureCache[l]=c,c}loadImageSource(e,t){const n=this,i=this.json,r=this.options;if(this.sourceCache[e]!==void 0)return this.sourceCache[e].then(u=>u.clone());const a=i.images[e],o=self.URL||self.webkitURL;let l=a.uri||"",c=!1;if(a.bufferView!==void 0)l=n.getDependency("bufferView",a.bufferView).then(function(u){c=!0;const p=new Blob([u],{type:a.mimeType});return l=o.createObjectURL(p),l});else if(a.uri===void 0)throw new Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");const h=Promise.resolve(l).then(function(u){return new Promise(function(p,d){let m=p;t.isImageBitmapLoader===!0&&(m=function(f){const x=new Ft(f);x.needsUpdate=!0,p(x)}),t.load(Sa.resolveURL(u,r.path),m,void 0,d)})}).then(function(u){return c===!0&&o.revokeObjectURL(l),pi(u,a),u.userData.mimeType=a.mimeType||fw(a.uri),u}).catch(function(u){throw console.error("THREE.GLTFLoader: Couldn't load texture",l),u});return this.sourceCache[e]=h,h}assignTexture(e,t,n,i){const r=this;return this.getDependency("texture",n.index).then(function(a){if(!a)return null;if(n.texCoord!==void 0&&n.texCoord>0&&(a=a.clone(),a.channel=n.texCoord),r.extensions[nt.KHR_TEXTURE_TRANSFORM]){const o=n.extensions!==void 0?n.extensions[nt.KHR_TEXTURE_TRANSFORM]:void 0;if(o){const l=r.associations.get(a);a=r.extensions[nt.KHR_TEXTURE_TRANSFORM].extendTexture(a,o),r.associations.set(a,l)}}return i!==void 0&&(a.colorSpace=i),e[t]=a,a})}assignFinalMaterial(e){const t=e.geometry;let n=e.material;const i=t.attributes.tangent===void 0,r=t.attributes.color!==void 0,a=t.attributes.normal===void 0;if(e.isPoints){const o="PointsMaterial:"+n.uuid;let l=this.cache.get(o);l||(l=new Vp,Rn.prototype.copy.call(l,n),l.color.copy(n.color),l.map=n.map,l.sizeAttenuation=!1,this.cache.add(o,l)),n=l}else if(e.isLine){const o="LineBasicMaterial:"+n.uuid;let l=this.cache.get(o);l||(l=new Ms,Rn.prototype.copy.call(l,n),l.color.copy(n.color),l.map=n.map,this.cache.add(o,l)),n=l}if(i||r||a){let o="ClonedMaterial:"+n.uuid+":";i&&(o+="derivative-tangents:"),r&&(o+="vertex-colors:"),a&&(o+="flat-shading:");let l=this.cache.get(o);l||(l=n.clone(),r&&(l.vertexColors=!0),a&&(l.flatShading=!0),i&&(l.normalScale&&(l.normalScale.y*=-1),l.clearcoatNormalScale&&(l.clearcoatNormalScale.y*=-1)),this.cache.add(o,l),this.associations.set(l,this.associations.get(n))),n=l}e.material=n}getMaterialType(){return Ki}loadMaterial(e){const t=this,n=this.json,i=this.extensions,r=n.materials[e];let a;const o={},l=r.extensions||{},c=[];if(l[nt.KHR_MATERIALS_UNLIT]){const u=i[nt.KHR_MATERIALS_UNLIT];a=u.getMaterialType(),c.push(u.extendParams(o,r,t))}else{const u=r.pbrMetallicRoughness||{};if(o.color=new Fe(1,1,1),o.opacity=1,Array.isArray(u.baseColorFactor)){const p=u.baseColorFactor;o.color.setRGB(p[0],p[1],p[2],en),o.opacity=p[3]}u.baseColorTexture!==void 0&&c.push(t.assignTexture(o,"map",u.baseColorTexture,Rt)),o.metalness=u.metallicFactor!==void 0?u.metallicFactor:1,o.roughness=u.roughnessFactor!==void 0?u.roughnessFactor:1,u.metallicRoughnessTexture!==void 0&&(c.push(t.assignTexture(o,"metalnessMap",u.metallicRoughnessTexture)),c.push(t.assignTexture(o,"roughnessMap",u.metallicRoughnessTexture))),a=this._invokeOne(function(p){return p.getMaterialType&&p.getMaterialType(e)}),c.push(Promise.all(this._invokeAll(function(p){return p.extendMaterialParams&&p.extendMaterialParams(e,o)})))}r.doubleSided===!0&&(o.side=bt);const h=r.alphaMode||Eu.OPAQUE;if(h===Eu.BLEND?(o.transparent=!0,o.depthWrite=!1):(o.transparent=!1,h===Eu.MASK&&(o.alphaTest=r.alphaCutoff!==void 0?r.alphaCutoff:.5)),r.normalTexture!==void 0&&a!==Ht&&(c.push(t.assignTexture(o,"normalMap",r.normalTexture)),o.normalScale=new he(1,1),r.normalTexture.scale!==void 0)){const u=r.normalTexture.scale;o.normalScale.set(u,u)}if(r.occlusionTexture!==void 0&&a!==Ht&&(c.push(t.assignTexture(o,"aoMap",r.occlusionTexture)),r.occlusionTexture.strength!==void 0&&(o.aoMapIntensity=r.occlusionTexture.strength)),r.emissiveFactor!==void 0&&a!==Ht){const u=r.emissiveFactor;o.emissive=new Fe().setRGB(u[0],u[1],u[2],en)}return r.emissiveTexture!==void 0&&a!==Ht&&c.push(t.assignTexture(o,"emissiveMap",r.emissiveTexture,Rt)),Promise.all(c).then(function(){const u=new a(o);return r.name&&(u.name=r.name),pi(u,r),t.associations.set(u,{materials:e}),r.extensions&&Is(i,u,r),u})}createUniqueName(e){const t=ut.sanitizeNodeName(e||"");return t in this.nodeNamesUsed?t+"_"+ ++this.nodeNamesUsed[t]:(this.nodeNamesUsed[t]=0,t)}loadGeometries(e){const t=this,n=this.extensions,i=this.primitiveCache;function r(o){return n[nt.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(o,t).then(function(l){return Qm(l,o,t)})}const a=[];for(let o=0,l=e.length;o0&&dw(g,r),g.name=t.createUniqueName(r.name||"mesh_"+e),pi(g,r),x.extensions&&Is(i,g,x),t.assignFinalMaterial(g),u.push(g)}for(let d=0,m=u.length;d1?h=new ln:c.length===1?h=c[0]:h=new Et,h!==c[0])for(let u=0,p=c.length;u1){const u=i.associations.get(h);i.associations.set(h,{...u})}return i.associations.get(h).nodes=e,h}),this.nodeCache[e]}loadScene(e){const t=this.extensions,n=this.json.scenes[e],i=this,r=new ln;n.name&&(r.name=i.createUniqueName(n.name)),pi(r,n),n.extensions&&Is(t,r,n);const a=n.nodes||[],o=[];for(let l=0,c=a.length;l{const u=new Map;for(const[p,d]of i.associations)(p instanceof Rn||p instanceof Ft)&&u.set(p,d);return h.traverse(p=>{const d=i.associations.get(p);d!=null&&u.set(p,d)}),u};return i.associations=c(r),r})}_createAnimationTracks(e,t,n,i,r){const a=[],o=e.name?e.name:e.uuid,l=[];ns[r.path]===ns.weights?e.traverse(function(p){p.morphTargetInfluences&&l.push(p.name?p.name:p.uuid)}):l.push(o);let c;switch(ns[r.path]){case ns.weights:c=Sr;break;case ns.rotation:c=Er;break;case ns.translation:case ns.scale:c=Cr;break;default:switch(n.itemSize){case 1:c=Sr;break;case 2:case 3:default:c=Cr;break}break}const h=i.interpolation!==void 0?cw[i.interpolation]:ea,u=this._getArrayFromAccessor(n);for(let p=0,d=l.length;p{let r=JSON.parse(i);s.engineStatus.models.push({type:"light",info:r,name:r.baseInfo.name,status:"loading",url:e,elements:new Map}),s.models==null&&(s.models=[]),s.models.push({url:e,nodesMap:new Map,boundingBox:{min:new P(r.baseInfo.min.X*.3048,r.baseInfo.min.Z*.3048,-r.baseInfo.min.Y*.3048),max:new P(r.baseInfo.max.X*.3048,r.baseInfo.max.Z*.3048,-r.baseInfo.max.Y*.3048)}}),s.events.trigger(ts.EngineFree,e)})}function yw(s,e){s.engineStatus.models.filter(t=>e==null||t.url==e).forEach(t=>{t.loadStatus==null&&(t.loadStatus={mep:!1,instance:!1,normal:!1}),t.status==="loading"&&t.type==="light"&&(t.loadStatus.modelMep!=!0&&(t.loadStatus.modelMep=!0,kM(s,t.info.modelMep,t.url)),t.loadStatus.normal!=!0&&bw(s,t))})}function bw(s,e){if(s.camera.position,e.size,e.info==null||e.info.lods==null)return;e.info.lods.forEach(n=>{if(n.status!=!0)if(n.glbs==null)console.log("加载GLB............."),n.glbs={},IM(e.url+n.path,i=>{Gm(i.get("/nodes.json"),r=>{let a=JSON.parse(r);s.models.find(c=>c.url==e.url).nodesMap==null&&(s.models.find(c=>c.url==e.url).nodesMap=new Map);let o=s.models.find(c=>c.url==e.url).nodesMap,l=0;for(let c in a){a[c].forEach(p=>{p.glb=c,o.has(p.id)==!1?o.set(p.id,{infos:[p]}):o.get(p.id).infos.push(p)});let h=new UM;const u=new NM;u.setDecoderPath("/draco/"),u.preload(),h.setDRACOLoader(u),h.load(i.get(c+".glb"),p=>{n.glbs[c]=p.scene.children,n.glbs[c].forEach(d=>{d.geometry.computeVertexNormals()}),l++,l==Object.keys(a).length&&s.engineStatus.isFree&&(s.events.trigger(ts.EngineFree,e.url),s.viewCube.CameraGoHome())})}Gm(i.get("/instances.json"),c=>{let h=JSON.parse(c);s.models.find(u=>u.url==e.url).instanceNodes=h})})});else{let i=t(e,n,n.octreeBox),r=[],a=s.models.find(l=>l.url==e.url);i.forEach(l=>{a.nodesMap.has(l)&&a.nodesMap.get(l).infos.forEach(c=>{let h=n.glbs[c.glb][c.mesh];if(h!=null&&h.geometry!=null&&h.material!=null){let u=new De;u.elements=c.matrix;let p=new rt(h.geometry.clone().applyMatrix4(u),h.material),d=new gt().setFromObject(p);c.box=d,c.mesh=p,p.name=l,p.glb=c.glb,p.url=e.url,h.geometry.attributes.position!=null&&r.push(p)}})}),_w(e.url,s,r);let o=a.instanceNodes;if(o!=null)for(let l in o)(o[l].isLoaded==null||o[l].isLoaded==!1)&&(o[l].isLoaded=!0,o[l].forEach(c=>{if(n.glbs[l]!=null){let h=n.glbs[l][c.mesh];Mw(e.url,c.mesh,s,h,c.children)}}))}});function t(n,i,r){let a=[];if(r.status!=!0){if(!s.engineStatus.isFree)return a;let o=new P(r.min.X,r.min.Z,-r.min.Y),l=new P(r.max.X,r.max.Z,-r.max.Y);l.distanceTo(o);let c=s.camera.position,h=new P(o.x+l.x/2,o.y+l.y/2,o.z+l.z/2);c.distanceTo(h),r.elements.forEach(u=>{a.push(u)}),r.children.forEach(u=>{a.push(...t(n,i,u))}),r.children.findIndex(u=>u.status!=!0)==-1&&(r.status=!0),r.children.length==0&&(r.status=!0)}return a}}function _w(s,e,t){let n=[];t.forEach(i=>{n.findIndex(a=>a.glb==i.glb)==-1?n.push({glb:i.glb,meshes:[i],currentIndex:i.geometry.index.count,indexes:new Map}):(n.find(a=>a.glb==i.glb).meshes.push(i),n.find(a=>a.glb==i.glb).currentIndex+=i.geometry.index.count);let r=n.find(a=>a.glb==i.glb);r.indexes.set(Number(i.name),[r.currentIndex-i.geometry.index.count,r.currentIndex])}),n.forEach(i=>{let r=e.scene.children.find(a=>a instanceof rt&&a.url==s&&a.glb==i.glb);if(r!=null)r.castShadow=!0,r.receiveShadow=!0;else{let a=new dt,o=ww(i.meshes[0].material);a=Xm(i.meshes.map(h=>h.geometry),!1);let l=new rt(a,o);l.castShadow=!0,l.receiveShadow=!0,e.scene.add(l),l.index=e.scene.children.length-1,l.url=s,l.glb=i.glb,l.indexes=i.indexes,l.materialClone=o,l.geometrys=i.meshes.map(h=>h.geometry);let c=e.models.find(h=>h.url==s);if(c!=null){let h=0;i.indexes.forEach(u=>{c.nodesMap.get(Number(i.meshes[h].name)).indexes==null&&(c.nodesMap.get(Number(i.meshes[h].name)).indexes=[]),c.nodesMap.get(Number(i.meshes[h].name)).indexes.push([l.index,h++,u[0],u[1]])})}}})}function Mw(s,e,t,n,i){if(n==null)return;let r=new Ut(n.geometry,n.material,i.length);t.scene.add(r);const a=new Float32Array(i.length*3);for(let l=0;lu.url==s).nodesMap.has(c.id)?(t.models.find(u=>u.url==s).nodesMap.get(c.id).indexes==null&&(t.models.find(u=>u.url==s).nodesMap.get(c.id).indexes=[]),t.models.find(u=>u.url==s).nodesMap.get(c.id).indexes.push([t.scene.children.length-1,l,0,0])):t.models.find(u=>u.url==s).nodesMap.set(c.id,{instance:!0,info:c,indexes:[[t.scene.children.length-1,l,0,0]]})}r.index=t.scene.children.length-1,r.materialClone=n.material,r.url=s,r.glb=n.glb,r.ids=i.map(l=>l.id),r.matrixsClone=o}function ww(s){return s.map!=null&&(s.map.colorSpace=Rt,s.map.needsUpdate=!0),s.shadowSide=kn,s.side=s.side,s}class Sw{engine;constructor(e){this.engine=e}async loadModels(e,t){console.log("待加载模型",e);for(const i of e)n(i)==="light"&&vw(this.engine,i);function n(i){const r=i.split(".").pop();return r==="glb"||r==="gltf"?"gltf":"light"}}}class Ew{engine;isFree;highlightModels;hideModels;translucentModels;models;constructor(e){this.engine=e,this.isFree=!0,this.highlightModels=[],this.hideModels=[],this.translucentModels=[],this.models=[]}init(){this.engine.events.on(ts.EngineFree,e=>{this.updateFree(!0),yw(this.engine,e)}),this.engine.events.on(ts.EngineBusy,()=>{this.updateFree(!1)})}updateFree(e){this.isFree=e}closeAllFunction=()=>{}}class Tw{listeners=new Map;debugMode=!1;setDebugMode(e){this.debugMode=e}on(e,t){const n=String(e);this.listeners.has(n)||this.listeners.set(n,[]),this.listeners.get(n).push(t),this.debugMode&&console.debug(`[EventModule] 注册事件监听器: ${n}, 当前监听器数量: ${this.listeners.get(n).length}`)}off(e,t){const n=String(e);if(!this.listeners.has(n)){this.debugMode&&console.warn(`[EventModule] 尝试移除不存在的事件监听器: ${n}`);return}const i=this.listeners.get(n),r=i.indexOf(t);r!==-1?(i.splice(r,1),this.debugMode&&console.debug(`[EventModule] 移除事件监听器: ${n}, 剩余监听器数量: ${i.length}`)):this.debugMode&&console.warn(`[EventModule] 尝试移除的回调函数未找到: ${n}`)}trigger(e,t){const n=String(e);if(!this.listeners.has(n)){this.debugMode&&(console.warn(`[EventModule] 触发事件但未找到监听器: ${n}`),console.debug("[EventModule] 当前已注册的事件类型:",Array.from(this.listeners.keys())));return}const i=this.listeners.get(n);this.debugMode&&console.debug(`[EventModule] 触发事件: ${n}, 监听器数量: ${i.length}`,t),i.forEach((r,a)=>{try{r(t)}catch(o){console.error(`[EventModule] 事件监听器执行错误 [${n}] #${a}:`,o)}})}}class Cw{engine;constructor(e){this.engine=e}init(){const e=new Pi(16777215,1);e.position.set(100,200,100),e.castShadow=!0,e.shadow.mapSize.width=2048,e.shadow.mapSize.height=2048,e.shadow.camera.near=.1,e.shadow.camera.far=5e3,e.shadow.bias=-5e-5,e.shadow.normalBias=.02;const t=50;e.shadow.camera.left=-t,e.shadow.camera.right=t,e.shadow.camera.top=t,e.shadow.camera.bottom=-t,e.shadow.radius=2;const n=new Pi(16777215,2);this.engine.scene.add(e),this.engine.scene.add(n),this.engine.scene.dirLight=n;const i=new jo(16777215,1);this.engine.scene.add(i)}}var Yt=(s=>(s.ModelLoadStart="model-load-start",s.ModelLoadProgress="model-load-progress",s.ModelLoaded="model-loaded",s.ModelError="model-error",s.SelectionChanged="selection-changed",s.HoverChanged="hover-changed",s.Click="click",s.MouseMove="mouse-move",s.CameraChanged="camera-changed",s.CameraIdle="camera-idle",s.EngineFree="engine-free",s.EngineBusy="engine-busy",s.MeasureChanged="measure-changed",s.MeasureClick="measure-click",s.SectionMove="section-move",s))(Yt||{});class Aw{engine;behavior;isCtrlDown=!1;highlightedInstances=[];highlightColor=new Fe(43775);constructor(e){this.engine=e}init(){this.behavior=this.engine.handelBehaved,this.behavior.init(this)}active(){this.behavior.active()}disActive(){this.behavior.disActive()}handelKeyCtrlUp(){this.isCtrlDown=!1}handelKeyCtrlDown(){this.isCtrlDown=!0}hoverOldId=null;handleMouseMove(e){if(!this.engine.engineStatus.isFree){this.engine.hoverHighLight.clearHighlight();return}let t=this.getCatchMeshs(e);t!=null?t.length>0&&this.engine.hoverHighLight.hightMesh(t):this.engine.hoverHighLight.clearHighlight()}getCatchMeshs(e){if(e.catch==null)return this.hoverOldId=null,null;if(e.catch.object.isInstance){let t=e.catch.object,n=e.catch.object.id,i=this.engine.models.find(o=>o.url==t.url).nodesMap.get(n),r=new Map;i?.indexes.forEach(o=>{this.engine.scene.children[o[0]]instanceof Ut&&(r.has(o[0])?r.get(o[0])?.push(o[1]):r.set(o[0],[o[1]]))});let a=[];return r.forEach((o,l)=>{let c=this.engine.scene.children[l];o.forEach(h=>{let u=c.geometry.clone();u.applyMatrix4(c.matrixs[h]),a.push(new rt(u,c.material))})}),this.hoverOldId==n?[]:(this.hoverOldId=n,this.engine.hoverHighLight.clearHighlight(),a)}else{const t=e.catch;t.object;let n=t.object,i=n.name,r=this.engine.models.find(a=>a.url===n.url).nodesMap.get(i).infos.map(a=>a.mesh);return this.hoverOldId==i?[]:(this.hoverOldId=i,this.engine.hoverHighLight.clearHighlight(),r)}}handleMouseClick(e){if(e.catch!=null){const t=e.catch;let n=t.object;this.isCtrlDown||this.engine.modelToolModule.unhighlightAllModels(),console.log([{url:n.url,ids:[n.name]}]),this.engine.controlModule.orbitControls.origin.set(t.point.x,t.point.y,t.point.z),this.engine.modelToolModule.highlightModel([{url:n.url,ids:[n.name]}]),this.engine.events.trigger(Yt.Click,!0)}else this.engine.modelToolModule.unhighlightAllModels()}handleMouseDoubleClick(e){if(e.catch){const n=e.catch;n.object,this.engine.events.trigger(Yt.Click,n);let i=n.object,r=this.engine.models.find(o=>o.url===i.url).nodesMap.get(i.name).infos.map(o=>o.box),a=t(r);this.engine.viewCube.zoomToModel(a)}function t(n){let i=new P(1e8,1e9,1e10),r=new P(-1e8,-1e9,-1e10);return n.forEach(a=>{a.min.xr.x&&(r.x=a.max.x),a.max.y>r.y&&(r.y=a.max.y),a.max.z>r.z&&(r.z=a.max.z)}),new gt(i,r)}}handleMouseClickInstance(e){return e.intersectObjects(this.engine.scene.children.filter(t=>t instanceof Ut),!0)}}class Pw{engine;highlightMaterial;hideMaterial;translucentMaterial;constructor(e){this.engine=e,this.highlightMaterial=new Ht({color:43775,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.5,side:bt}),this.hideMaterial=new Ht({color:0,transparent:!0,opacity:0,side:bt}),this.translucentMaterial=new Ht({color:16777215,transparent:!0,opacity:.05,side:bt}),this.highlightMaterial.clippingPlanes=this.engine.sectionPlane,this.hideMaterial.clippingPlanes=this.engine.sectionPlane,this.translucentMaterial.clippingPlanes=this.engine.sectionPlane}split_merge_model(e){if(e.isSplit||e instanceof Ut)return;let t=e.materialClone.clone(),n=Xm(e.geometrys,!0);n.groups.forEach(i=>{i.materialIndex=0}),e.geometry=n,e.material=[t,this.highlightMaterial,this.translucentMaterial],e.needsUpdate=!0,e.isSplit=!0}un_split_merge_model(e){}highlightModel(e){e.forEach(t=>{let n=new Map;t.ids.forEach(r=>{let a=this.engine.models.find(o=>o.url==t.url).nodesMap.get(r);a!=null&&a.indexes!=null&&a.indexes.forEach(o=>{this.engine.scene.children[o[0]]instanceof Ut?n.has(o[0])?n.get(o[0])?.push(o[1]):n.set(o[0],[o[1]]):(console.log(this.engine.scene.children[o[0]].materialClone.color),this.split_merge_model(this.engine.scene.children[o[0]]),this.engine.scene.children[o[0]].geometry.groups[o[1]].materialIndex=1)})}),Rw(n,this.engine);let i=this.engine.engineStatus.highlightModels.find(r=>r.url==t.url);i!=null?i.ids.push(...t.ids):this.engine.engineStatus.highlightModels.push(t)})}unhighlightModel(e){e.forEach(t=>{let n=new Map;t.ids.forEach(i=>{let r=this.engine.models.find(a=>a.url==t.url).nodesMap.get(i);r!=null&&r.indexes!=null&&r.indexes.forEach(a=>{this.engine.scene.children[a[0]]instanceof Ut?n.has(a[0])?n.get(a[0])?.push(a[1]):n.set(a[0],[a[1]]):this.engine.scene.children[a[0]].geometry.groups[a[1]].materialIndex=0})}),e0(n,this.engine,"highlightModel")})}unhighlightAllModels(e=!0){this.engine.engineStatus.highlightModels.forEach(t=>{this.unhighlightModel([t])}),e&&(this.engine.engineStatus.highlightModels=[])}hideModel(e){e.forEach(t=>{let n=new Map;t.ids.forEach(r=>{let a=this.engine.models.find(o=>o.url==t.url).nodesMap.get(r);this.engine.modelEdge.hideModelEdge(t.url,r),a!=null&&a.indexes!=null&&a.indexes.forEach(o=>{const l=this.engine.scene.children[o[0]];l instanceof Ut?n.has(o[0])?n.get(o[0])?.push(o[1]):n.set(o[0],[o[1]]):(this.split_merge_model(this.engine.scene.children[o[0]]),l.geometry.groups[o[1]].materialIndex=-1,l.geometry.groups[o[1]].visible=!1)})}),n.size>0&&Dw(n,this.engine);let i=this.engine.engineStatus.hideModels.find(r=>r.url==t.url);i!=null?i.ids.push(...t.ids):this.engine.engineStatus.hideModels.push({url:t.url,ids:t.ids}),this.engine.engineStatus.highlightModels=[]})}showModel(e){e.forEach(t=>{let n=new Map;t.ids.forEach(r=>{let a=this.engine.models.find(o=>o.url==t.url).nodesMap.get(r);this.engine.modelEdge.showModelEdge(t.url,r),a!=null&&a.indexes!=null&&a.indexes.forEach(o=>{const l=this.engine.scene.children[o[0]];l instanceof Ut?n.has(o[0])?n.get(o[0])?.push(o[1]):n.set(o[0],[o[1]]):(l.geometry.groups[o[1]].materialIndex=0,l.geometry.groups[o[1]].visible=!0)})}),n.size>0&&t0(n,this.engine);let i=this.engine.engineStatus.hideModels.find(r=>r.url==t.url);i&&(t.ids.forEach(r=>{const a=i.ids.indexOf(r);a!==-1&&i.ids.splice(a,1)}),i.ids.length===0&&(this.engine.engineStatus.hideModels=this.engine.engineStatus.hideModels.filter(r=>r!==i)))})}isolateModel(e){let t=[];this.engine.models.forEach(n=>{let i={url:n.url,ids:[]},r=e.find(a=>a.url==n.url);for(let a of n.nodesMap)r==null?i.ids.push(a[0]):r.ids.includes(a[0])||i.ids.push(a[0]);t.push(i)}),this.unhighlightAllModels(),this.hideModel(t)}translucentOtherModel(e){let t=[];this.engine.models.forEach(n=>{let i={url:n.url,ids:[]},r=e.find(a=>a.url==n.url);for(let a of n.nodesMap)r==null?i.ids.push(a[0]):r.ids.includes(a[0])||i.ids.push(a[0]);t.push(i)}),this.translucentModel(t)}setModelColor(e,t){e.material.color.set(t)}setAllModelsColor(e){this.engine.scene.children.forEach(t=>{t.isMesh})}restoreAllModelsColor(){this.engine.scene.children.forEach(e=>{e.isMesh})}translucentModel(e){this.unhighlightAllModels(),e.forEach(t=>{let n=new Map;t.ids.forEach(r=>{let a=this.engine.models.find(o=>o.url==t.url).nodesMap.get(r);a!=null&&a.indexes!=null&&a.indexes.forEach(o=>{const l=this.engine.scene.children[o[0]];l instanceof Ut?n.has(o[0])?n.get(o[0])?.push(o[1]):n.set(o[0],[o[1]]):(this.split_merge_model(this.engine.scene.children[o[0]]),l.geometry.groups[o[1]].materialIndex=2)})}),Lw(n,this.engine);let i=this.engine.engineStatus.translucentModels.find(r=>r.url==t.url);i!=null?i.ids.push(...t.ids):this.engine.engineStatus.translucentModels.push({url:t.url,ids:t.ids})}),this.engine.engineStatus.highlightModels=[]}unTranslucentModel(){this.engine.engineStatus.translucentModels.forEach(e=>{let t=new Map;e.ids.forEach(n=>{let i=this.engine.models.find(r=>r.url==e.url).nodesMap.get(n);i!=null&&i.indexes!=null&&i.indexes.forEach(r=>{const a=this.engine.scene.children[r[0]];a instanceof Ut?t.has(r[0])?t.get(r[0])?.push(r[1]):t.set(r[0],[r[1]]):(this.split_merge_model(this.engine.scene.children[r[0]]),a.geometry.groups[r[1]].materialIndex=0)})}),t.size>0&&t0(t,this.engine),e0(t,this.engine,"translucentModel")}),this.engine.engineStatus.translucentModels=[]}showAllModels(){this.engine.engineStatus.hideModels&&this.engine.engineStatus.hideModels.length>0&&this.showModel(this.engine.engineStatus.hideModels),this.engine.engineStatus.hideModels=[],this.unhighlightAllModels()}batchSelectSameLevelTypeModel(e){if(e.length==0)return;let t=e[0],n=this.engine.modelMapperBatch.getModelMapper(t.url,t.ids[0]);this.engine.modelMapperBatch.getModelsWithLevelType(n.levelName,n.typeName,i=>{this.engine.modelToolModule.highlightModel(i)})}batchSelectSameLevelModel(e){if(e.length==0)return;let t=e[0],n=this.engine.modelMapperBatch.getModelMapper(t.url,t.ids[0]);this.engine.modelMapperBatch.getModelsWithLevel(n.levelName,i=>{this.engine.modelToolModule.highlightModel(i)})}batchSelectSameTypeModel(e){if(e.length==0)return;let t=e[0],n=this.engine.modelMapperBatch.getModelMapper(t.url,t.ids[0]);this.engine.modelMapperBatch.getModelsWithType(n.typeName,i=>{this.engine.modelToolModule.highlightModel(i)})}}function Rw(s,e){s.forEach((t,n)=>{const i=e.scene.children[n];if(!(i instanceof Ut))return;const r=i.geometry,a=new Ht({color:43775,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.5,side:bt}),o=new Ut(r,a,t.length);o.name="highlightModel",o.key=n;const l=new Map,c=new De,h=new De;h.makeScale(0,0,0),t.forEach((u,p)=>{i.getMatrixAt(u,c),l.set(u,c.clone()),i.setMatrixAt(u,h),o.setMatrixAt(p,c)}),i.instanceMatrix.needsUpdate=!0,o.instanceMatrix.needsUpdate=!0,e.scene.add(o)})}function e0(s,e,t){s.forEach((n,i)=>{const r=e.scene.children[i];r instanceof Ut&&(n.forEach(a=>{const o=r.matrixsClone[a];o&&r.setMatrixAt(a,o)}),r.instanceMatrix.needsUpdate=!0,e.scene.children.filter(a=>a.key==i&&a.name==t).forEach(a=>{e.scene.remove(a)}))})}function Lw(s,e){s.forEach((t,n)=>{const i=e.scene.children[n];if(!(i instanceof Ut))return;const r=i.geometry,a=new Ht({color:16777215,transparent:!0,opacity:.05,side:bt}),o=new Ut(r,a,t.length);o.name="translucentModel",o.key=n;const l=new Map,c=new De,h=new De;h.makeScale(0,0,0),t.forEach((u,p)=>{i.getMatrixAt(u,c),l.set(u,c.clone()),i.setMatrixAt(u,h),o.setMatrixAt(p,c)}),i.instanceMatrix.needsUpdate=!0,o.instanceMatrix.needsUpdate=!0,e.scene.add(o)})}function Dw(s,e){e.scene.children.filter(t=>t.name=="highlightModel").forEach(t=>{e.scene.remove(t)}),s.forEach((t,n)=>{const i=e.scene.children[n];if(!(i instanceof Ut))return;const r=new Map,a=new De,o=new De;o.makeScale(0,0,0),t.forEach((l,c)=>{i.getMatrixAt(l,a),r.set(l,a.clone()),i.setMatrixAt(l,o)}),i.instanceMatrix.needsUpdate=!0})}function t0(s,e){s.forEach((t,n)=>{const i=e.scene.children[n];i instanceof Ut&&(t.forEach(r=>{const a=i.matrixs[r];a&&i.setMatrixAt(r,a)}),i.instanceMatrix.needsUpdate=!0)})}class Dn{constructor(e,t,n){this.camera=e,this.renderer=t,this.scene=n,this.raycaster=new Qi}raycaster;worldToScreenNormalized(e){const t=e.clone();return t.project(this.camera),new he(t.x,t.y)}worldToScreen(e){const t=this.worldToScreenNormalized(e),n=this.renderer.domElement.width,i=this.renderer.domElement.height,r=(t.x+1)*n/2,a=(1-t.y)*i/2;return new he(r,a)}screenToNormalized(e,t){const n=this.renderer.domElement.clientWidth,i=this.renderer.domElement.clientHeight,r=e/n*2-1,a=-(t/i*2-1);return new he(r,a)}screenToWorld(e,t,n){if(!this.scene&&!n)return console.warn("WorldToScreen: 需要提供 scene 或 objects 参数才能进行屏幕坐标转世界坐标"),null;const i=this.screenToNormalized(e,t);this.raycaster.setFromCamera(i,this.camera);const r=n||this.scene.children,a=this.raycaster.intersectObjects(r,!0);return a.length>0?a[0].point:null}screenToWorldWithDepth(e,t,n=0){const i=this.screenToNormalized(e,t);this.raycaster.setFromCamera(i,this.camera);const r=new P;return this.raycaster.ray.at(n,r),r}updateCamera(e){this.camera=e}updateRenderer(e){this.renderer=e}updateScene(e){this.scene=e}}class Iw{engine;currentMode="";isManualMode=!1;gtaoPass=null;ssaoPass=null;saturationPass=null;outputPass=null;fxaaPass=null;constructor(e){this.engine=e}init(){this.cachePassReferences(),this.autoSwitch("advanced")}switchModel(e){this.isManualMode=!0,this.currentMode=e,this.applyMode(e)}autoSwitch(e){this.isManualMode||(this.currentMode=e,this.applyMode(e))}enableAutoMode(){this.isManualMode=!1}get isManual(){return this.isManualMode}setMode(e){this.isManualMode=!0,this.currentMode=e,this.applyMode(e)}getCurrentMode(){return this.currentMode}cachePassReferences(){this.engine.composerModule?.composer&&(this.engine.composerModule.gtaoPass&&(this.gtaoPass=this.engine.composerModule.gtaoPass),this.engine.composerModule.ssaoPass&&(this.ssaoPass=this.engine.composerModule.ssaoPass),this.engine.composerModule.saturationPass&&(this.saturationPass=this.engine.composerModule.saturationPass),this.engine.composerModule.outputPass&&(this.outputPass=this.engine.composerModule.outputPass),this.engine.composerModule.fxaaPass&&(this.fxaaPass=this.engine.composerModule.fxaaPass))}applyMode(e){switch(e){case"simple":this.setShadows(!1),this.setGTAO(!1),this.setSSAO(!1),this.setSaturation(!1),this.setOutputPass(!1),this.setFXAA(!1);break;case"balance":this.setShadows(!0),this.setGTAO(!1),this.setSSAO(!1),this.setSaturation(!1),this.setOutputPass(!1),this.setFXAA(!1);break;case"advanced":this.setShadows(!0),this.setSSAO(!1),this.setGTAO(!0),this.setSaturation(!0),this.setOutputPass(!0),this.setFXAA(!0);break;default:console.warn(`[EngineModelModule] Unknown mode: ${e}`)}this.engine.updateVersionDisplay?.()}setShadows(e){this.engine.renderer&&(this.engine.renderer.shadowMap.enabled=e);const t=this.engine.scene?.children.find(n=>n instanceof Pi);t&&(t.castShadow=e),this.engine.scene?.traverse(n=>{n.material&&(n.castShadow!==void 0&&(n.castShadow=e),n.receiveShadow!==void 0&&(n.receiveShadow=e))})}setGTAO(e){this.engine.composerModule?.composer&&this.gtaoPass&&(this.gtaoPass.enabled=e)}setSSAO(e){this.engine.composerModule?.composer&&this.ssaoPass&&(this.ssaoPass.enabled=e)}setSaturation(e){this.saturationPass&&(this.saturationPass.enabled=e)}setOutputPass(e){this.outputPass&&(this.outputPass.enabled=e)}setFXAA(e){this.fxaaPass&&(this.fxaaPass.enabled=e)}setPerformanceMode(){this.setMode("simple")}setBalancedMode(){this.setMode("balance")}setQualityMode(){this.setMode("advanced")}setSuperQualityMode(){this.setMode("superAdvanced")}setShadowQuality(e){const t=this.engine.scene?.children.find(i=>i instanceof Pi),n={low:1024,medium:2048,high:2048}[e];t?.shadow&&n&&(t.shadow.mapSize.width=n,t.shadow.mapSize.height=n,t.shadow.map?.dispose(),t.shadow.map=null)}setSaturationValue(e){this.saturationPass&&(this.saturationPass.uniforms.saturation.value=e)}setContrastValue(e){this.saturationPass&&(this.saturationPass.uniforms.contrast.value=e)}setGTAOIntensity(e){this.gtaoPass&&(this.gtaoPass.blendIntensity=e)}}class wl{engine;overlayMaterial;overlayMeshes=[];animState="idle";animStartTime=0;static FADE_IN_MS=200;static FADE_OUT_MS=150;constructor(e){this.engine=e,this.init()}init(){this.overlayMaterial=new Ht({color:16777215,transparent:!0,opacity:0,blending:nc,depthWrite:!1}),this.overlayMaterial.clippingPlanes=this.engine.sectionPlane}hightMesh(e,t=16777215,n=.15){this.animState==="fadeOut"&&this.removeOverlayMeshes();const i=(Array.isArray(e)?e:e?[e]:[]).filter(r=>r?.geometry);if(i.length===0){this.clearHighlight();return}this.overlayMaterial.color.set(t),this.overlayMaterial.opacity=0,this.overlayMaterial.userData.targetOpacity=n;for(const r of i){const a=new rt(r.geometry,this.overlayMaterial);r.updateWorldMatrix(!0,!1),a.matrix.copy(r.matrixWorld),a.matrixAutoUpdate=!1,this.engine.scene.add(a),this.overlayMeshes.push(a)}this.animState="fadeIn",this.animStartTime=performance.now()}clearHighlight(){this.overlayMeshes.length===0||this.animState==="fadeOut"||(this.animState="fadeOut",this.animStartTime=performance.now())}update(){if(this.animState==="idle"||this.overlayMeshes.length===0)return;const e=performance.now()-this.animStartTime,t=this.overlayMaterial.userData.targetOpacity??.35;if(this.animState==="fadeIn"){const n=Math.min(e/wl.FADE_IN_MS,1);this.overlayMaterial.opacity=this.easeOutQuad(n)*t,n>=1&&(this.animState="idle")}else if(this.animState==="fadeOut"){const n=Math.min(e/wl.FADE_OUT_MS,1);this.overlayMaterial.opacity=(1-this.easeOutQuad(n))*t,n>=1&&(this.removeOverlayMeshes(),this.animState="idle")}}removeOverlayMeshes(){for(const e of this.overlayMeshes)this.engine.scene.remove(e);this.overlayMeshes=[]}easeOutQuad(e){return 1-(1-e)*(1-e)}dispose(){this.removeOverlayMeshes(),this.overlayMaterial.dispose(),this.animState="idle"}}var Au={exports:{}},Nw=Au.exports,n0;function Bw(){return n0||(n0=1,(function(s,e){(function(t,n){s.exports=n()})(Nw,function(){var t=function(){function n(d){return a.appendChild(d.dom),d}function i(d){for(var m=0;ml+1e3&&(h.update(1e3*c/(d-l),100),l=d,c=0,p)){var m=performance.memory;p.update(m.usedJSHeapSize/1048576,m.jsHeapSizeLimit/1048576)}return d},update:function(){o=this.end()},domElement:a,setMode:i}};return t.Panel=function(n,i,r){var a=1/0,o=0,l=Math.round,c=l(window.devicePixelRatio||1),h=80*c,u=48*c,p=3*c,d=2*c,m=3*c,f=15*c,x=74*c,g=30*c,y=document.createElement("canvas");y.width=h,y.height=u,y.style.cssText="width:80px;height:48px";var v=y.getContext("2d");return v.font="bold "+9*c+"px Helvetica,Arial,sans-serif",v.textBaseline="top",v.fillStyle=r,v.fillRect(0,0,h,u),v.fillStyle=i,v.fillText(n,p,d),v.fillRect(m,f,x,g),v.fillStyle=r,v.globalAlpha=.9,v.fillRect(m,f,x,g),{dom:y,update:function(b,_){a=Math.min(a,b),o=Math.max(o,b),v.fillStyle=r,v.globalAlpha=1,v.fillRect(0,0,h,f),v.fillStyle=i,v.fillText(l(b)+" "+n+" ("+l(a)+"-"+l(o)+")",p,d),v.drawImage(y,m+c,f,x-c,g,m,f,x-c,g),v.fillRect(m+x-c,f,c,g),v.fillStyle=r,v.globalAlpha=.9,v.fillRect(m+x-c,f,c,l((1-b/_)*g))}}},t})})(Au)),Au.exports}var kw=Bw();const Uw=em(kw);var Ur=Object.freeze({Linear:Object.freeze({None:function(s){return s},In:function(s){return s},Out:function(s){return s},InOut:function(s){return s}}),Quadratic:Object.freeze({In:function(s){return s*s},Out:function(s){return s*(2-s)},InOut:function(s){return(s*=2)<1?.5*s*s:-.5*(--s*(s-2)-1)}}),Cubic:Object.freeze({In:function(s){return s*s*s},Out:function(s){return--s*s*s+1},InOut:function(s){return(s*=2)<1?.5*s*s*s:.5*((s-=2)*s*s+2)}}),Quartic:Object.freeze({In:function(s){return s*s*s*s},Out:function(s){return 1- --s*s*s*s},InOut:function(s){return(s*=2)<1?.5*s*s*s*s:-.5*((s-=2)*s*s*s-2)}}),Quintic:Object.freeze({In:function(s){return s*s*s*s*s},Out:function(s){return--s*s*s*s*s+1},InOut:function(s){return(s*=2)<1?.5*s*s*s*s*s:.5*((s-=2)*s*s*s*s+2)}}),Sinusoidal:Object.freeze({In:function(s){return 1-Math.sin((1-s)*Math.PI/2)},Out:function(s){return Math.sin(s*Math.PI/2)},InOut:function(s){return .5*(1-Math.sin(Math.PI*(.5-s)))}}),Exponential:Object.freeze({In:function(s){return s===0?0:Math.pow(1024,s-1)},Out:function(s){return s===1?1:1-Math.pow(2,-10*s)},InOut:function(s){return s===0?0:s===1?1:(s*=2)<1?.5*Math.pow(1024,s-1):.5*(-Math.pow(2,-10*(s-1))+2)}}),Circular:Object.freeze({In:function(s){return 1-Math.sqrt(1-s*s)},Out:function(s){return Math.sqrt(1- --s*s)},InOut:function(s){return(s*=2)<1?-.5*(Math.sqrt(1-s*s)-1):.5*(Math.sqrt(1-(s-=2)*s)+1)}}),Elastic:Object.freeze({In:function(s){return s===0?0:s===1?1:-Math.pow(2,10*(s-1))*Math.sin((s-1.1)*5*Math.PI)},Out:function(s){return s===0?0:s===1?1:Math.pow(2,-10*s)*Math.sin((s-.1)*5*Math.PI)+1},InOut:function(s){return s===0?0:s===1?1:(s*=2,s<1?-.5*Math.pow(2,10*(s-1))*Math.sin((s-1.1)*5*Math.PI):.5*Math.pow(2,-10*(s-1))*Math.sin((s-1.1)*5*Math.PI)+1)}}),Back:Object.freeze({In:function(s){var e=1.70158;return s===1?1:s*s*((e+1)*s-e)},Out:function(s){var e=1.70158;return s===0?0:--s*s*((e+1)*s+e)+1},InOut:function(s){var e=2.5949095;return(s*=2)<1?.5*(s*s*((e+1)*s-e)):.5*((s-=2)*s*((e+1)*s+e)+2)}}),Bounce:Object.freeze({In:function(s){return 1-Ur.Bounce.Out(1-s)},Out:function(s){return s<1/2.75?7.5625*s*s:s<2/2.75?7.5625*(s-=1.5/2.75)*s+.75:s<2.5/2.75?7.5625*(s-=2.25/2.75)*s+.9375:7.5625*(s-=2.625/2.75)*s+.984375},InOut:function(s){return s<.5?Ur.Bounce.In(s*2)*.5:Ur.Bounce.Out(s*2-1)*.5+.5}}),generatePow:function(s){return s===void 0&&(s=4),s=s1e4?1e4:s,{In:function(e){return Math.pow(e,s)},Out:function(e){return 1-Math.pow(1-e,s)},InOut:function(e){return e<.5?Math.pow(e*2,s)/2:(1-Math.pow(2-e*2,s))/2+.5}}}}),Ia=function(){return performance.now()},Ow=(function(){function s(){this._tweens={},this._tweensAddedDuringUpdate={}}return s.prototype.getAll=function(){var e=this;return Object.keys(this._tweens).map(function(t){return e._tweens[t]})},s.prototype.removeAll=function(){this._tweens={}},s.prototype.add=function(e){this._tweens[e.getId()]=e,this._tweensAddedDuringUpdate[e.getId()]=e},s.prototype.remove=function(e){delete this._tweens[e.getId()],delete this._tweensAddedDuringUpdate[e.getId()]},s.prototype.update=function(e,t){e===void 0&&(e=Ia()),t===void 0&&(t=!1);var n=Object.keys(this._tweens);if(n.length===0)return!1;for(;n.length>0;){this._tweensAddedDuringUpdate={};for(var i=0;i1?r(s[t],s[t-1],t-n):r(s[i],s[i+1>t?t:i+1],n-i)},Utils:{Linear:function(s,e,t){return(e-s)*t+s}}},i0=(function(){function s(){}return s.nextId=function(){return s._nextId++},s._nextId=0,s})(),Ru=new Ow,zw=(function(){function s(e,t){t===void 0&&(t=Ru),this._object=e,this._group=t,this._isPaused=!1,this._pauseStart=0,this._valuesStart={},this._valuesEnd={},this._valuesStartRepeat={},this._duration=1e3,this._isDynamic=!1,this._initialRepeat=0,this._repeat=0,this._yoyo=!1,this._isPlaying=!1,this._reversed=!1,this._delayTime=0,this._startTime=0,this._easingFunction=Ur.Linear.None,this._interpolationFunction=Pu.Linear,this._chainedTweens=[],this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._id=i0.nextId(),this._isChainStopped=!1,this._propertiesAreSetUp=!1,this._goToEnd=!1}return s.prototype.getId=function(){return this._id},s.prototype.isPlaying=function(){return this._isPlaying},s.prototype.isPaused=function(){return this._isPaused},s.prototype.getDuration=function(){return this._duration},s.prototype.to=function(e,t){if(t===void 0&&(t=1e3),this._isPlaying)throw new Error("Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.");return this._valuesEnd=e,this._propertiesAreSetUp=!1,this._duration=t<0?0:t,this},s.prototype.duration=function(e){return e===void 0&&(e=1e3),this._duration=e<0?0:e,this},s.prototype.dynamic=function(e){return e===void 0&&(e=!1),this._isDynamic=e,this},s.prototype.start=function(e,t){if(e===void 0&&(e=Ia()),t===void 0&&(t=!1),this._isPlaying)return this;if(this._group&&this._group.add(this),this._repeat=this._initialRepeat,this._reversed){this._reversed=!1;for(var n in this._valuesStartRepeat)this._swapEndStartRepeatValues(n),this._valuesStart[n]=this._valuesStartRepeat[n]}if(this._isPlaying=!0,this._isPaused=!1,this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._isChainStopped=!1,this._startTime=e,this._startTime+=this._delayTime,!this._propertiesAreSetUp||t){if(this._propertiesAreSetUp=!0,!this._isDynamic){var i={};for(var r in this._valuesEnd)i[r]=this._valuesEnd[r];this._valuesEnd=i}this._setupProperties(this._object,this._valuesStart,this._valuesEnd,this._valuesStartRepeat,t)}return this},s.prototype.startFromCurrentValues=function(e){return this.start(e,!0)},s.prototype._setupProperties=function(e,t,n,i,r){for(var a in n){var o=e[a],l=Array.isArray(o),c=l?"array":typeof o,h=!l&&Array.isArray(n[a]);if(!(c==="undefined"||c==="function")){if(h){var u=n[a];if(u.length===0)continue;for(var p=[o],d=0,m=u.length;d"u"||r)&&(t[a]=o),l||(t[a]*=1),h?i[a]=n[a].slice().reverse():i[a]=t[a]||0}}},s.prototype.stop=function(){return this._isChainStopped||(this._isChainStopped=!0,this.stopChainedTweens()),this._isPlaying?(this._group&&this._group.remove(this),this._isPlaying=!1,this._isPaused=!1,this._onStopCallback&&this._onStopCallback(this._object),this):this},s.prototype.end=function(){return this._goToEnd=!0,this.update(1/0),this},s.prototype.pause=function(e){return e===void 0&&(e=Ia()),this._isPaused||!this._isPlaying?this:(this._isPaused=!0,this._pauseStart=e,this._group&&this._group.remove(this),this)},s.prototype.resume=function(e){return e===void 0&&(e=Ia()),!this._isPaused||!this._isPlaying?this:(this._isPaused=!1,this._startTime+=e-this._pauseStart,this._pauseStart=0,this._group&&this._group.add(this),this)},s.prototype.stopChainedTweens=function(){for(var e=0,t=this._chainedTweens.length;ea)return!1;t&&this.start(e,!0)}if(this._goToEnd=!1,ec)return 1;var x=Math.trunc(o/l),g=o-x*l,y=Math.min(g/n._duration,1);return y===0&&o===n._duration?1:y},u=h(),p=this._easingFunction(u);if(this._updateProperties(this._object,this._valuesStart,this._valuesEnd,p),this._onUpdateCallback&&this._onUpdateCallback(this._object,u),this._duration===0||o>=this._duration)if(this._repeat>0){var d=Math.min(Math.trunc((o-this._duration)/l)+1,this._repeat);isFinite(this._repeat)&&(this._repeat-=d);for(r in this._valuesStartRepeat)!this._yoyo&&typeof this._valuesEnd[r]=="string"&&(this._valuesStartRepeat[r]=this._valuesStartRepeat[r]+parseFloat(this._valuesEnd[r])),this._yoyo&&this._swapEndStartRepeatValues(r),this._valuesStart[r]=this._valuesStartRepeat[r];return this._yoyo&&(this._reversed=!this._reversed),this._startTime+=l*d,this._onRepeatCallback&&this._onRepeatCallback(this._object),this._onEveryStartCallbackFired=!1,!0}else{this._onCompleteCallback&&this._onCompleteCallback(this._object);for(var m=0,f=this._chainedTweens.length;m(b=T.indexOf(` -`))&&_=x.byteLength||!(T=n(x)))&&t(1,"no header found"),(R=T.match(g))||t(3,"bad initial token"),M.valid|=1,M.programtype=R[1],M.string+=T+` -`;T=n(x),T!==!1;){if(M.string+=T+` -`,T.charAt(0)==="#"){M.comments+=T+` -`;continue}if((R=T.match(y))&&(M.gamma=parseFloat(R[1])),(R=T.match(v))&&(M.exposure=parseFloat(R[1])),(R=T.match(b))&&(M.valid|=2,M.format=R[1]),(R=T.match(_))&&(M.valid|=4,M.height=parseInt(R[1],10),M.width=parseInt(R[2],10)),M.valid&2&&M.valid&4)break}return M.valid&2||t(3,"missing format specifier"),M.valid&4||t(3,"missing image size specifier"),M},r=function(x,g,y){const v=g;if(v<8||v>32767||x[0]!==2||x[1]!==2||x[2]&128)return new Uint8Array(x);v!==(x[2]<<8|x[3])&&t(3,"wrong scanline width");const b=new Uint8Array(4*g*y);b.length||t(4,"unable to allocate buffer space");let _=0,M=0;const T=4*v,R=new Uint8Array(4),S=new Uint8Array(T);let E=y;for(;E>0&&Mx.byteLength&&t(1),R[0]=x[M++],R[1]=x[M++],R[2]=x[M++],R[3]=x[M++],(R[0]!=2||R[1]!=2||(R[2]<<8|R[3])!=v)&&t(3,"bad rgbe scanline format");let L=0,A;for(;L128;if(w&&(A-=128),(A===0||L+A>T)&&t(3,"bad scanline data"),w){const z=x[M++];for(let G=0;G{x&&(b||(x(_),b=!0))}),x&&setTimeout(()=>{b||(x(!0),b=!0)},f+10)},n.CameraGoHome=function(){var m=s.octreeBox.getBoundingBox(),f=m.min.clone().add(m.max.clone()).multiplyScalar(.5);let x=new P(1,1,1);var g=m.max.distanceTo(m.min),y=f.clone().add(x.multiplyScalar(g));if(e.camera.isOrthographicCamera){var v=s.container.clientWidth/s.container.clientHeight,b=g*.6;e.camera.left=-b*v,e.camera.right=b*v,e.camera.top=b,e.camera.bottom=-b,e.camera.zoom=1,e.camera.updateProjectionMatrix()}l(e.camera.position,y,s.controls.target.clone(),f)},n.zoomToBox=function(m){var f=m.min.clone().add(m.max.clone()).multiplyScalar(.5),x=e.camera.position.clone().sub(s.controls.target.clone()).normalize(),g=e.camera.position.distanceTo(s.controls.target),y=f.clone().add(x.multiplyScalar(g)),v=e.camera.zoom;if(e.camera.isOrthographicCamera){var b=new P(1,0,0).applyQuaternion(e.camera.quaternion),_=new P(0,1,0).applyQuaternion(e.camera.quaternion),M=[new P(m.min.x,m.min.y,m.min.z),new P(m.max.x,m.min.y,m.min.z),new P(m.min.x,m.max.y,m.min.z),new P(m.max.x,m.max.y,m.min.z),new P(m.min.x,m.min.y,m.max.z),new P(m.max.x,m.min.y,m.max.z),new P(m.min.x,m.max.y,m.max.z),new P(m.max.x,m.max.y,m.max.z)],T=1/0,R=-1/0,S=1/0,E=-1/0;for(var L of M){var A=L.dot(b),I=L.dot(_);T=Math.min(T,A),R=Math.max(R,A),S=Math.min(S,I),E=Math.max(E,I)}var w=(R-T)/2,z=(E-S)/2,G=(e.camera.right-e.camera.left)/2,j=(e.camera.top-e.camera.bottom)/2;v=Math.min(G/w,j/z)*.75}var Y=e.camera.position.clone(),q=s.controls.target.clone(),ie=e.camera.zoom,W=new Na.Tween({x1:Y.x,y1:Y.y,z1:Y.z,x2:q.x,y2:q.y,z2:q.z,zoom:ie}).to({x1:y.x,y1:y.y,z1:y.z,x2:f.x,y2:f.y,z2:f.z,zoom:v},1e3);W.onUpdate(function(fe){s.controls&&(e.camera.position.set(fe.x1,fe.y1,fe.z1),s.controls.target.set(fe.x2,fe.y2,fe.z2),e.camera.isOrthographicCamera&&(e.camera.zoom=fe.zoom,e.camera.updateProjectionMatrix()),s.controls.auto=!0,s.controls.update(),n.RenderScene())}),W.onComplete(function(){s.controls&&(s.controls.auto=!1,n.RenderScene(),cancelAnimationFrame(i),i=null)}),W.easing(Na.Easing.Cubic.InOut),W.start();function $(){i=requestAnimationFrame($),W.update()}$()};function l(m,f,x,g,y,v,b=1e3,_){var M;y&&v?(M=new Na.Tween({x1:m.x,y1:m.y,z1:m.z,x2:x.x,y2:x.y,z2:x.z,_x:y._x,_y:y._y,_z:y._z,_w:y._w}),M.to({x1:f.x,y1:f.y,z1:f.z,x2:g.x,y2:g.y,z2:g.z,_x:v._x,_y:v._y,_z:v._z,_w:v._w},b)):(M=new Na.Tween({x1:m.x,y1:m.y,z1:m.z,x2:x.x,y2:x.y,z2:x.z}),M.to({x1:f.x,y1:f.y,z1:f.z,x2:g.x,y2:g.y,z2:g.z},b)),M.onUpdate(function(R){s.controls&&(y&&v?(e.camera.quaternion._x=R._x,e.camera.quaternion._y=R._y,e.camera.quaternion._z=R._z,e.camera.quaternion._w=R._w):s.controls.auto=!0,e.camera.position.x=R.x1,e.camera.position.y=R.y1,e.camera.position.z=R.z1,s.controls.target.x=R.x2,s.controls.target.y=R.y2,s.controls.target.z=R.z2,s.controls.update(),n.RenderScene())}),M.onComplete(function(R){s.controls&&(s.controls.auto=!1,n.RenderScene(),_&&_(!0),cancelAnimationFrame(i),i=null)}),M.easing(Na.Easing.Cubic.InOut);function T(R){i=requestAnimationFrame(T),M.update()}M.start(),T()}function c(){r=document.createElement("div"),r.className="ViewCube",t.appendChild(r),a=document.createElement("div"),a.className="viewSettingWrapper",a.innerHTML="...",r.appendChild(a);var m=document.createElement("div");m.className="homeViewWrapper",m.addEventListener("mousedown",function(){console.log("归位"),n.CameraGoHome()}),r.appendChild(m);const f=document.createElement("div");f.className="cameraToggleWrapper",f.title="切换正交/透视视图",f.innerHTML="⊞",f.addEventListener("mousedown",function(b){b.stopPropagation(),console.log("切换视图"),n.ToggleCameraType(),y()}),r.appendChild(f);const x=document.createElement("div");x.className="screenshotWrapper",x.title="截图",x.innerHTML="📷",x.addEventListener("mousedown",function(b){b.stopPropagation(),console.log("截图"),n.TakeScreenshot(),y()}),r.appendChild(x);const g=document.createElement("div");g.className="fullscreenWrapper",g.title="全屏",g.innerHTML="⛶",g.addEventListener("mousedown",function(b){b.stopPropagation(),console.log("全屏"),n.ToggleFullscreen(),y()}),r.appendChild(g),a.addEventListener("mousedown",function(b){b.stopPropagation(),f.classList.contains("show")?(y(),console.log("隐藏功能按钮")):(v(),console.log("显示功能按钮"))});function y(){f.classList.remove("show"),x.classList.remove("show"),g.classList.remove("show")}function v(){f.classList.add("show"),x.classList.add("show"),g.classList.add("show")}}function h(){n.sceneOrtho=Hw();var x=t.clientWidth,g=t.clientWidth,m=x>g?x/g:g/x,f=300;n.camera=new Ai(f*m/-2,f*m/2,f/2,f/-2,.01,1e4);var x=r.clientWidth,g=r.clientHeight,y=new au({alpha:!0});y.setSize(x,g),y.setClearAlpha(0),n.sceneOrtho.renderer=y;let v=new jo(16777215,.8);n.sceneOrtho.add(v),Vw(r,y)}function u(){const m="/assets/viewcube/";let f=[{label:"右",icon:m+"cn_right.png"},{label:"左",icon:m+"cn_left.png"},{label:"顶",icon:m+"cn_top.png"},{label:"底",icon:m+"cn_bottom.png"},{label:"前",icon:m+"cn_front.png"},{label:"后",icon:m+"cn_back.png"}];var x=[];for(const y of f)x.push(new Ht({color:16777215,map:new Gh().load(y.icon)}));new k1({color:255});var g=new rt(new Zi(110,110,110),x);n.sceneOrtho.add(g),p(122),r.addEventListener("mousedown",y=>{var v={};v.x=y.offsetX/r.clientWidth*2-1,v.y=-(y.offsetY/r.clientHeight)*2+1;var b=new Qi;b.setFromCamera(v,n.camera);const _=b.intersectObjects(o,!1);_.length>0&&n.ToggleDirectionView(_[0].object.name)}),r.addEventListener("mousemove",y=>{var v={};v.x=y.offsetX/r.clientWidth*2-1,v.y=-(y.offsetY/r.clientHeight)*2+1;var b=new Qi;b.setFromCamera(v,n.camera);const _=b.intersectObjects(o,!1);for(var M of o)M.material.opacity=.01;_.length>0&&(_[0].object.material.opacity=.2)})}function p(m){for(var f=m*.5-20,x=[{name:"right",a:30,b:75,c:75,point:new P(f,0,0)},{name:"back",a:75,b:75,c:30,point:new P(0,0,-f)},{name:"left",a:30,b:75,c:75,point:new P(-f,0,0)},{name:"front",a:75,b:75,c:30,point:new P(0,0,f)},{name:"top",a:75,b:30,c:75,point:new P(0,f,0)},{name:"button",a:75,b:30,c:75,point:new P(0,-f,0)}],g=[{name:"top_right_back",a:30,b:30,c:30,point:new P(-f,f,f)},{name:"button_front_right",a:30,b:30,c:30,point:new P(-f,-f,f)},{name:"top_front_right",a:30,b:30,c:30,point:new P(f,f,f)},{name:"button_right_back",a:30,b:30,c:30,point:new P(f,-f,f)},{name:"top_back_left",a:30,b:30,c:30,point:new P(-f,f,-f)},{name:"button_back_left",a:30,b:30,c:30,point:new P(-f,-f,-f)},{name:"top_left_front",a:30,b:30,c:30,point:new P(f,f,-f)},{name:"button_left_front",a:30,b:30,c:30,point:new P(f,-f,-f)}],y=[{name:"top_front",a:30,b:30,c:75,point:new P(f,f,0)},{name:"top_right",a:75,b:30,c:30,point:new P(0,f,f)},{name:"top_back",a:30,b:30,c:75,point:new P(-f,f,0)},{name:"top_left",a:75,b:30,c:30,point:new P(0,f,-f)},{name:"button_front",a:30,b:30,c:75,point:new P(f,-f,0)},{name:"button_right",a:75,b:30,c:30,point:new P(0,-f,f)},{name:"button_back",a:30,b:30,c:75,point:new P(-f,-f,0)},{name:"button_left",a:75,b:30,c:30,point:new P(0,-f,-f)},{name:"front_right",a:30,b:75,c:30,point:new P(f,0,f)},{name:"right_back",a:30,b:75,c:30,point:new P(-f,0,f)},{name:"back_left",a:30,b:75,c:30,point:new P(-f,0,-f)},{name:"left_front",a:30,b:75,c:30,point:new P(f,0,-f)}],v=0;v{let p=u.boundingBox.min,d=u.boundingBox.max;p.xi.x&&(i.x=d.x),d.y>i.y&&(i.y=d.y),d.z>i.z&&(i.z=d.z)});let r=Math.min(n.x,i.x),a=Math.min(n.y,i.y),o=Math.min(n.z,i.z),l=Math.max(n.x,i.x),c=Math.max(n.y,i.y),h=Math.max(n.z,i.z);return{min:new P(r,a,o),max:new P(l,c,h)}},e.rayInterationModel=function(t){let n=[];return s.engineStatus.models.forEach(r=>{r.info.lods.forEach(a=>{let o=a.octreeBox;i(t,o,r)})}),n=n.filter(r=>r instanceof rt),t.intersectObjects(n,!1);function i(r,a,o){if(a==null)return;let l=new P(a.min.X*.3048,a.min.Z*.3048,-a.min.Y*.3048),c=new P(a.max.X*.3048,a.max.Z*.3048,-a.max.Y*.3048),h=new P(Math.min(l.x,c.X),Math.min(l.y,c.y),Math.min(l.z,c.z)),u=new P(Math.max(c.x,l.x),Math.max(c.y,l.y),Math.max(c.z,l.z)),p=new gt(h,u),d=r.ray.intersectsBox(p);if(!(d==null||d==!1))if(a.children==null||a.children.length==0){if(a.elements!=null)for(var m of a.elements){let f=s.engineStatus.hideModels.find(y=>y.url==o.url)?.ids;if(f!=null&&f.includes(m))continue;let x=s.engineStatus.translucentModels.find(y=>y.url==o.url)?.ids;if(x!=null&&x.includes(m))continue;let g=s.models.find(y=>y.url==o.url).nodesMap.get(m);g!=null&&!g.instance&&g.infos.map(y=>y.mesh).forEach(y=>{n.push(y)})}}else{if(a.elements!=null)for(var m of a.elements){let x=s.engineStatus.hideModels.find(v=>v.url==o.url)?.ids;if(x!=null&&x.includes(m))continue;let g=s.engineStatus.translucentModels.find(v=>v.url==o.url)?.ids;if(g!=null&&g.includes(m))continue;let y=s.models.find(v=>v.url==o.url).nodesMap.get(m);y!=null&&!y.instance&&y.infos.map(v=>v.mesh).forEach(v=>{n.push(v)})}for(let f of a.children)i(r,f,o)}}},e}class jw{engine;isDrawing=!1;startPoint=new he;endPoint=new he;selectionBox=null;worldToScreen=null;boundMouseDown;boundMouseMove;boundMouseUp;boundKeyDown;constructor(e){this.engine=e,this.boundMouseDown=this.onMouseDown.bind(this),this.boundMouseMove=this.onMouseMove.bind(this),this.boundMouseUp=this.onMouseUp.bind(this),this.boundKeyDown=this.onKeyDown.bind(this)}init(){this.createSelectionBoxElement(),this.engine.scene&&this.engine.camera&&this.engine.renderer&&(this.worldToScreen=new Dn(this.engine.camera,this.engine.renderer,this.engine.scene))}active(){this.engine.controlModule.disActive();const e=this.engine.renderer?.domElement;e&&(e.addEventListener("mousedown",this.boundMouseDown),e.addEventListener("mousemove",this.boundMouseMove),e.addEventListener("mouseup",this.boundMouseUp),e.style.cursor="crosshair"),window.addEventListener("keydown",this.boundKeyDown)}disActive(){this.engine.controlModule.active();const e=this.engine.renderer?.domElement;e&&(e.removeEventListener("mousedown",this.boundMouseDown),e.removeEventListener("mousemove",this.boundMouseMove),e.removeEventListener("mouseup",this.boundMouseUp),e.style.cursor="default"),window.removeEventListener("keydown",this.boundKeyDown),this.isDrawing&&this.endDrawing()}createSelectionBoxElement(){this.selectionBox=document.createElement("div"),this.selectionBox.style.position="absolute",this.selectionBox.style.border="2px dashed #00aaff",this.selectionBox.style.backgroundColor="rgba(0, 170, 255, 0.1)",this.selectionBox.style.pointerEvents="none",this.selectionBox.style.display="none",this.selectionBox.style.zIndex="1000",this.selectionBox.style.boxSizing="border-box";const e=this.engine.renderer?.domElement;e&&e.parentElement&&e.parentElement.appendChild(this.selectionBox)}onMouseDown(e){e.button!==0||!this.engine.renderer?.domElement||(this.startPoint.set(e.offsetX,e.offsetY),this.endPoint.copy(this.startPoint),this.isDrawing=!0,this.selectionBox&&(this.selectionBox.style.display="block",this.updateSelectionBoxUI()),e.preventDefault(),e.stopPropagation())}onMouseMove(e){!this.isDrawing||!this.engine.renderer?.domElement||(this.endPoint.set(e.offsetX,e.offsetY),this.updateSelectionBoxUI(),e.preventDefault(),e.stopPropagation())}onMouseUp(e){this.isDrawing&&(this.endDrawing(),this.performZoom(),e.preventDefault(),e.stopPropagation(),this.disActive())}onKeyDown(e){e.key==="Escape"&&(this.disActive(),e.preventDefault(),e.stopPropagation())}endDrawing(){this.isDrawing&&(this.isDrawing=!1,this.selectionBox&&(this.selectionBox.style.display="none"))}updateSelectionBoxUI(){if(!this.selectionBox||!this.engine.renderer?.domElement)return;const e=Math.min(this.startPoint.x,this.endPoint.x),t=Math.min(this.startPoint.y,this.endPoint.y),n=Math.abs(this.endPoint.x-this.startPoint.x),i=Math.abs(this.endPoint.y-this.startPoint.y);this.selectionBox.style.left=`${e}px`,this.selectionBox.style.top=`${t}px`,this.selectionBox.style.width=`${n}px`,this.selectionBox.style.height=`${i}px`}performZoom(){const e=Math.abs(this.endPoint.x-this.startPoint.x),t=Math.abs(this.endPoint.y-this.startPoint.y);if(e<5||t<5)return;if(!this.worldToScreen){console.warn("RangeScale: 坐标转换工具未初始化");return}const n=Math.min(this.startPoint.x,this.endPoint.x),i=Math.max(this.startPoint.x,this.endPoint.x),r=Math.min(this.startPoint.y,this.endPoint.y),a=Math.max(this.startPoint.y,this.endPoint.y),o=[],l=[{x:n,y:r},{x:i,y:r},{x:i,y:a},{x:n,y:a}];for(const h of l){const u=this.worldToScreen.screenToWorld(h.x,h.y);u&&o.push(u)}if(o.length<3){console.warn("RangeScale: 框选区域未命中模型,无法执行缩放操作");return}if(o.length<3){console.warn("RangeScale: 无法将屏幕区域转换为世界坐标");return}const c=new gt;for(const h of o)c.expandByPoint(h);if(c.isEmpty()){console.warn("RangeScale: 计算得到的包围盒无效");return}this.fitCameraToBoundingBox(c)}fitCameraToBoundingBox(e){const t=this.engine.camera,n=this.engine.controls;if(!t||!n){console.warn("RangeScale: 相机或控制器未初始化");return}const i=new P;e.getCenter(i);const r=new P;e.getSize(r);const a=Math.max(r.x,r.y,r.z);if(t instanceof on){const o=t.fov*(Math.PI/180),l=a/(2*Math.tan(o/2))*1.2,c=new P;t.getWorldDirection(c);const h=i.clone().sub(t.position);c.dot(h.normalize())<0&&c.negate();const u=i.clone().sub(c.multiplyScalar(l));t.position.copy(u),n.target&&n.target.copy(i),t.lookAt(i),n.update()}else if(t instanceof Ai){const o=a*1.2,l=this.engine.renderer?.domElement,c=l?l.width/l.height:1;t.left=-o*c/2,t.right=o*c/2,t.top=o/2,t.bottom=-o/2,t.updateProjectionMatrix();const h=new P;t.getWorldDirection(h);const u=a*1.5,p=i.clone().sub(h.multiplyScalar(u));t.position.copy(p),n.target&&n.target.copy(i),t.lookAt(i),n.update()}}}class qw{engine;ground=null;constructor(e){this.engine=e}init(){}setStatsVisible(e){this.engine.stats?.dom&&(this.engine.stats.dom.style.display=e?"block":"none")}setAmbientLightIntensity(e){const t=this.engine.scene.children.find(n=>n instanceof jo);t&&(t.intensity=e)}setAmbientLightColor(e){const t=this.engine.scene.children.find(n=>n instanceof jo);t&&t.color.set(e)}setDirectionalLightIntensity(e){const t=this.engine.scene.children.find(n=>n instanceof Pi);t&&(t.intensity=e)}setDirectionalLightColor(e){const t=this.engine.scene.children.find(n=>n instanceof Pi);t&&t.color.set(e)}setShadowQuality(e){const t=this.engine.scene.children.find(n=>n instanceof Pi);if(t?.shadow){const n={low:1024,medium:2048,high:4096,ultra:8192}[e];t.shadow.mapSize.width=n,t.shadow.mapSize.height=n,t.shadow.map?.dispose(),t.shadow.map=null}}setDirectionalLightShadow(e){const t=this.engine.scene.children.find(n=>n instanceof Pi);t&&(t.castShadow=e),this.engine.renderer&&(this.engine.renderer.shadowMap.enabled=e)}setGTAOEnabled(e){if(!this.engine.composerModule?.composer){console.warn("Composer not initialized");return}const t=this.engine.composerModule.composer,n=t.passes.find(i=>i instanceof bn);if(e)if(n)n.enabled=!0;else{const{width:i,height:r}=this.engine.deviceModule.getContainerSize(),a=new bn(this.engine.scene,this.engine.camera,i,r);a.output=bn.OUTPUT.Default,a.blendIntensity=.5,a.updateGtaoMaterial&&a.updateGtaoMaterial({radius:1,distanceExponent:1,thickness:1,scale:1,distanceFallOff:1,screenSpaceRadius:!0});const o=t.passes.findIndex(l=>l.constructor.name==="RenderPass");t.passes.splice(o+1,0,a)}else n&&(n.enabled=!1)}setSceneSaturation(e){if(!this.engine.composerModule?.saturationPass){console.warn("Saturation pass not initialized");return}this.engine.composerModule.saturationPass.uniforms.saturation.value=e}setSceneContrast(e){if(!this.engine.composerModule?.saturationPass){console.warn("Saturation pass not initialized");return}this.engine.composerModule.saturationPass.uniforms.contrast.value=e}setGroundEnabled(e,t){if(e)if(this.ground)this.ground.visible=!0;else{const n=t?.size??100,i=t?.color??8421504,r=t?.opacity??.3,a=new Ss(n,n),o=new Ki({color:i,transparent:!0,opacity:r,side:bt});this.ground=new rt(a,o),this.ground.rotation.x=-Math.PI/2,this.ground.position.y=0,this.ground.receiveShadow=!0,this.ground.name="ground",this.engine.scene.add(this.ground)}else this.ground&&(this.ground.visible=!1)}setHDRBackground(e){e?(this.engine.scene.background=e,this.engine.scene.environment=e):(this.engine.scene.background=null,this.engine.scene.environment=null)}}function Di(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(s){var e=Math.random()*16|0,t=s=="x"?e:e&3|8;return t.toString(16)})}class Ii{engine;handelBehaved;setting;constructor(e){this.engine=e,this.handelBehaved=cu(e),this.handelBehaved.init(this,null),this.setting={unit:"m",precision:3}}getSetting(){return this.setting}saveSetting(e){this.setting=e}active(){this.handelBehaved.active()}disActive(){this.handelBehaved.disActive()}getMeasureText(e,t){if(e==null)return null;let n=this.setting.unit,i=n;return t==1?n=="mm"?e=e*1e3:n=="cm"?e=e*100:n=="dm"?e=e*10:n=="m"?e=e*1:n=="km"&&(e=e*.001):t==2&&(n=="mm"?e=e*1e3*1e3:n=="cm"?e=e*100*100:n=="dm"?e=e*10*10:n=="m"?e=e*1*1:n=="km"&&(e=e*.001*.001),i=i+"²"),e.toFixed(this.setting.precision)+" "+i}cancelCurrentSelectedAnnotation(){let e=this.engine.measure.annotationData;for(let t in e)e[t].forEach(n=>{n.highlight==!0&&(n.highlight=!1,n.container.classList.remove("Hight"),n.container.getElementsByTagName("svg")[0].classList.remove("Hight"))})}handelKeyEscDown(){this.cancelCurrentSelectedAnnotation();let e=this.engine.measure.annotationData;for(let t in e)for(let n=e[t].length-1;n>=0;n--){let i=e[t][n];i.isSelect==!0&&(i.container.remove(),e[t].splice(n,1))}this.engine.measure.clearAllPoints()}handelKeyDeleteDown(){let e=this.engine.measure.annotationData;for(let t in e)for(let n=e[t].length-1;n>=0;n--){let i=e[t][n];i.highlight==!0&&(i.container.remove(),e[t].splice(n,1))}}clearHighlight(){let e=this.engine.measure.annotationData;for(let t in e)e[t].forEach(n=>{n.highlight=!1,n.container.classList.remove("Hight"),n.container.getElementsByTagName("svg")[0].classList.remove("Hight")})}drawNormalAnnotation(){let e=this;this.engine.measure.annotationData.normalAnnotation.forEach(l=>{o(l)}),this.engine.measure.annotationData.elevationAnnotation.forEach(l=>{a(l)}),this.engine.measure.annotationData.coordinateAnnotation.forEach(l=>{r(l)}),this.engine.measure.annotationData.angleAnnotation.forEach(l=>{t(l)}),this.engine.measure.annotationData.areaAnnotation.forEach(l=>{n(l)}),this.engine.measure.annotationData.slopeAnnotation.forEach(l=>{i(l)});function t(l){if(l.container==null){let g=['','','','','','','',''+l.text+"",""].join("");l.container=document.createElement("div"),l.container.className="angle-annotation",l.container.id=l.id,l.container.style.pointerEvents="none",l.container.innerHTML=g,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0,e.engine.events.trigger(Yt.MeasureClick,l)})}let c=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point1),h=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point2),u=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point3),p=e.engine.reactBoundingClientRect.left,d=e.engine.reactBoundingClientRect.top;c.x+=p,c.y+=d,h.x+=p,h.y+=d,u.x+=p,u.y+=d;let m=l.container;m.getElementsByTagName("circle")[0].setAttribute("cx",c.x),m.getElementsByTagName("circle")[0].setAttribute("cy",c.y),m.getElementsByTagName("circle")[1].setAttribute("cx",h.x),m.getElementsByTagName("circle")[1].setAttribute("cy",h.y),m.getElementsByTagName("circle")[2].setAttribute("cx",u.x),m.getElementsByTagName("circle")[2].setAttribute("cy",u.y),m.getElementsByTagName("polyline")[0].setAttribute("points",c.x+","+c.y+" "+h.x+","+h.y),m.getElementsByTagName("polyline")[1].setAttribute("points",h.x+","+h.y+" "+u.x+","+u.y);let f=h.x,x=h.y-30;m.getElementsByTagName("rect")[0].setAttribute("x",f-40),m.getElementsByTagName("rect")[0].setAttribute("y",x-12.5),m.getElementsByTagName("text")[0].setAttribute("x",f),m.getElementsByTagName("text")[0].setAttribute("y",x+4),m.getElementsByTagName("text")[0].innerHTML=l.text,m.style.top="0px",m.style.left="0px"}function n(l){if(l.container==null){let y=['','','','',''+e.getMeasureText(l.text,2)+"",""].join("");l.container=document.createElement("div"),l.container.className="area-annotation",l.container.id=l.id,l.container.innerHTML=y,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0,e.engine.events.trigger(Yt.MeasureClick,l)})}if(!l.points||l.points.length<3)return;let c=e.engine.reactBoundingClientRect.left,h=e.engine.reactBoundingClientRect.top,u=[],p=0,d=0;for(let y=0;yy.x+","+y.y).join(" "),f=l.container;f.getElementsByTagName("polygon")[0].setAttribute("points",m),f.getElementsByTagName("polyline")[0].setAttribute("points",m);let x=p,g=d;f.getElementsByTagName("rect")[0].setAttribute("x",x-40),f.getElementsByTagName("rect")[0].setAttribute("y",g-12.5),f.getElementsByTagName("text")[0].setAttribute("x",x),f.getElementsByTagName("text")[0].setAttribute("y",g+4),f.getElementsByTagName("text")[0].innerHTML=e.getMeasureText(l.text,2),f.style.top="0px",f.style.left="0px"}function i(l){if(l.container==null){let x=['',"",'','',"","",'','',''+l.text+"",""].join("");l.container=document.createElement("div"),l.container.className="slope-annotation",l.container.id=l.id,l.container.innerHTML=x,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0,e.engine.events.trigger(Yt.MeasureClick,l)})}let c=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point1),h=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point2),u=e.engine.reactBoundingClientRect.left,p=e.engine.reactBoundingClientRect.top;c.x+=u,c.y+=p,h.x+=u,h.y+=p;let d=l.container;d.getElementsByTagName("polyline")[0].setAttribute("points",c.x+","+c.y+" "+h.x+","+h.y);let m=(c.x+h.x)/2,f=(c.y+h.y)/2-30;d.getElementsByTagName("rect")[0].setAttribute("x",m-50),d.getElementsByTagName("rect")[0].setAttribute("y",f-12.5),d.getElementsByTagName("text")[0].setAttribute("x",m),d.getElementsByTagName("text")[0].setAttribute("y",f+4),d.getElementsByTagName("text")[0].innerHTML=l.text,d.style.top="0px",d.style.left="0px"}function r(l){if(l.container==null){let g=['','','','X: '+e.getMeasureText(l.textX,1)+"",'','Y: '+e.getMeasureText(-l.textZ,1)+"",'','Z: '+e.getMeasureText(l.textY,1)+"",""].join("");l.container=document.createElement("div"),l.container.className="coordinate-annotation",l.container.id=l.id,l.container.style.position="absolute",l.container.style.pointerEvents="none",l.container.innerHTML=g,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0,e.engine.events.trigger(Yt.MeasureClick,l)})}let c=l.container,h=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point),u=e.engine.reactBoundingClientRect.left,p=e.engine.reactBoundingClientRect.top;h.x+=u,h.y+=p,c.style.top="0px",c.style.left="0px";let d=c.getElementsByTagName("circle")[0];d&&(d.setAttribute("cx",h.x),d.setAttribute("cy",h.y));let m=c.getElementsByTagName("rect"),f=c.getElementsByTagName("text"),x=-55;m[0]&&(m[0].setAttribute("x",h.x+10),m[0].setAttribute("y",h.y+10+x)),f[0]&&(f[0].setAttribute("x",h.x+10+40),f[0].setAttribute("y",h.y+10+16+x)),m[1]&&(m[1].setAttribute("x",h.x+10),m[1].setAttribute("y",h.y+10+30+x)),f[1]&&(f[1].setAttribute("x",h.x+10+40),f[1].setAttribute("y",h.y+10+46+x)),m[2]&&(m[2].setAttribute("x",h.x+10),m[2].setAttribute("y",h.y+10+60+x)),f[2]&&(f[2].setAttribute("x",h.x+10+40),f[2].setAttribute("y",h.y+10+76+x)),f[0]&&(f[0].innerHTML="X: "+e.getMeasureText(l.textX,1)),f[1]&&(f[1].innerHTML="Y: "+e.getMeasureText(-l.textZ,1)),f[2]&&(f[2].innerHTML="Z: "+e.getMeasureText(l.textY,1))}function a(l){if(l.container==null){let d=['','',''+e.getMeasureText(l.text,1)+"",'',""].join("");l.container=document.createElement("div"),l.container.className="elevation-annotation",l.container.id=l.id,l.container.style.position="absolute",l.container.style.pointerEvents="none",l.container.innerHTML=d,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0,e.engine.events.trigger(Yt.MeasureClick,l)})}let c=l.container,h=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point),u=e.engine.reactBoundingClientRect.left,p=e.engine.reactBoundingClientRect.top;c.style.top=h.y+p-48+"px",c.style.left=h.x+u-16+"px",c.getElementsByTagName("text")[0].innerHTML=e.getMeasureText(l.text,1)}function o(l){if(l.container==null){let m=['','','','','',''+e.getMeasureText(l.text,1)+"",""].join("");l.container=document.createElement("div"),l.container.className="normal-annotation",l.container.id=l.id,l.container.innerHTML=m,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0,e.engine.events.trigger(Yt.MeasureClick,l)})}let c=l.container;if(l.point1==null||l.point2==null){c.style.display="none";return}else c.style.display="block";let h=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point1),u=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point2),p=e.engine.reactBoundingClientRect.left,d=e.engine.reactBoundingClientRect.top;h.x+=p,h.y+=d,u.x+=p,u.y+=d,c.getElementsByTagName("polyline")[0].setAttribute("points",h.x+","+h.y+" "+u.x+","+u.y),c.getElementsByTagName("circle")[0].setAttribute("cx",h.x),c.getElementsByTagName("circle")[0].setAttribute("cy",h.y),c.getElementsByTagName("circle")[1].setAttribute("cx",u.x),c.getElementsByTagName("circle")[1].setAttribute("cy",u.y),c.getElementsByTagName("rect")[0].setAttribute("x",h.x*.5+u.x*.5-40),c.getElementsByTagName("rect")[0].setAttribute("y",h.y*.5+u.y*.5-12.5),c.getElementsByTagName("text")[0].setAttribute("x",h.x*.5+u.x*.5+40-40),c.getElementsByTagName("text")[0].setAttribute("y",h.y*.5+u.y*.5+16-12.5),c.getElementsByTagName("text")[0].innerHTML=e.getMeasureText(l.text,1),c.style.top="0px",c.style.left="0px"}}}class Zw{engine;isActive=!1;tools;points=[];behavior;catchDir=0;type="point";constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.isActive=!0,this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active();let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}setDirection(e){this.catchDir=e}setSelectType(e){this.type=e}getMeshesMinMaxY(e){if(!Array.isArray(e)||e.length===0)return null;let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;for(let i=0;in&&(n=a.max.y))}return!Number.isFinite(t)||!Number.isFinite(n)?null:{minY:t,maxY:n}}handleMouseClick(e){if(e.catch==null)return;let t=e.catch.point;if(this.type=="element"){let r=this.engine.interactionModule.getCatchMeshs(e);var n=this.getMeshesMinMaxY(r);this.catchDir==0?t.set(t.x,n?.minY,t.z):t.set(t.x,n?.maxY,t.z)}else t=e.catch.point;if(this.points.length==0){this.points.push(t);return}let i=this.engine.measure.annotationData.normalAnnotation.find(r=>r.isSelect==!0);i!=null&&(i.isSelect=!1)}handleMouseMove(e){if(e.catch==null||this.points.length==0)return;let t=this.engine.measure.annotationData.normalAnnotation.find(i=>i.isSelect==!0);t==null&&(t={text:null,id:Di(),isSelect:!0,type:"clear-height"},this.engine.measure.annotationData.normalAnnotation.push(t));let n=e.catch;if(this.type=="element"){let i=e.catch.point.clone();i.set(i.x,this.points[0].y,i.z);let r=new Qi(i.add(new P(0,.01,0)),new P(0,this.catchDir==0?-1:1,0));n.point=this.points[0];const a=this.engine.octreeBox.rayInterationModel(r);if(a.length===0){t.point2=null;return}t.point1=i,t.point2=a[0].point,t.text=t.point1.clone().distanceTo(t.point2.clone()),this.engine.events.trigger(Yt.MeasureChanged,t)}else{let i=new Qi(e.catch.point.clone().add(new P(0,.01,0)),new P(0,this.catchDir==0?-1:1,0));const r=this.engine.octreeBox.rayInterationModel(i);if(r.length===0){t.point2=null;return}t.point1=n.point,t.point2=r[0].point,t.text=t.point1.clone().distanceTo(t.point2.clone()),this.engine.events.trigger(Yt.MeasureChanged,t)}}}class Yw{engine;tools;isActive=!1;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.isActive=!0,this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this,{showCatch:!0}),this.behavior.active();let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.points=[],this.isActive=!1,this.engine.handelBehaved.disActive()}clearAllPoints(){this.points=[]}handleMouseClick(e){if(e.catch==null)return;let t=e.catch;if(this.points.length==0)this.points.push(t.point);else if(this.points.length==1){let n=this.engine.measure.annotationData.normalAnnotation.find(i=>i.isSelect==!0);if(n==null)return;n.point2=t.point,n.isSelect=!1,this.points=[],this.engine.events.trigger(Yt.MeasureChanged,n)}}handleMouseMove(e){if(e.catch==null)return;let t=e.catch;if(t!=null&&this.points.length==1){let n=this.engine.measure.annotationData.normalAnnotation.find(i=>i.isSelect==!0);n==null&&(n={id:Di(),point1:this.points[0].clone(),point2:t.point.clone(),text:this.points[0].clone().distanceTo(t.point.clone()),type:"distance",isSelect:!0},this.engine.measure.annotationData.normalAnnotation.push(n)),n.point2=t.point,n.text=n.point1.clone().distanceTo(n.point2.clone())}}}class $w{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.isActive=!0,this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active();let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseClick(e){if(e.catch==null)return;if(this.points.length==0){this.points.push(e.catch.point);return}let t=this.engine.measure.annotationData.normalAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1)}handleMouseMove(e){if(e.catch==null||this.points.length==0)return;let t=this.engine.measure.annotationData.normalAnnotation.find(a=>a.isSelect==!0);t==null&&(t={text:null,id:Di(),isSelect:!0,type:"clear-distance"},this.engine.measure.annotationData.normalAnnotation.push(t));let n=new Qi(e.catch.point.clone().add(e.catch.face.normal.clone().setLength(.01)),e.catch.face.normal);const i=this.engine.octreeBox.rayInterationModel(n);if(i.length==0){t.point2=null;return}let r=e.catch;t.point1=r.point,t.point2=i[0].point,t.text=t.point1.clone().distanceTo(t.point2.clone()),this.engine.events.trigger(Yt.MeasureChanged,t)}}class Kw{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active(),this.isActive=!0;let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseMove(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.elevationAnnotation.find(n=>n.isSelect==!0);t==null&&(t={id:Di(),point:e.catch.point.clone(),text:e.catch.point.y,isSelect:!0,type:"elevation"},this.engine.measure.annotationData.elevationAnnotation.push(t)),t.point=e.catch.point.clone(),t.text=e.catch.point.y}handleMouseClick(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.elevationAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1,t.point=e.catch.point.clone(),t.text=e.catch.point.y,this.engine.events.trigger(Yt.MeasureChanged,t))}}class Jw{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active(),this.isActive=!0;let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseMove(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.coordinateAnnotation.find(n=>n.isSelect==!0);t==null&&(t={id:Di(),point:e.catch.point.clone(),text:Math.round(e.catch.point.y)+" m",isSelect:!0,type:"point"},this.engine.measure.annotationData.coordinateAnnotation.push(t)),t.point=e.catch.point.clone(),t.textX=e.catch.point.x,t.textY=e.catch.point.y,t.textZ=e.catch.point.z}handleMouseClick(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.coordinateAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1,t.point=e.catch.point.clone(),t.textX=e.catch.point.x,t.textY=e.catch.point.y,t.textZ=e.catch.point.z,this.engine.events.trigger(Yt.MeasureChanged,t))}}class Qw{engine;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active();let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.points=[],this.behavior?.disActive()}clearAllPoints(){this.points=[]}calculateAngle(e,t,n){const i=new P().subVectors(e,t),r=new P().subVectors(n,t),a=i.length(),o=r.length();if(a===0||o===0)return 0;const l=i.dot(r)/(a*o),c=Math.max(-1,Math.min(1,l));return Math.acos(c)*(180/Math.PI)}handleMouseClick(e){if(e.catch==null)return;let t=e.catch;if(this.points.length==0)this.points.push(t.point);else if(this.points.length==1)this.points.push(t.point);else if(this.points.length==2){let n=this.engine.measure.annotationData.angleAnnotation.find(i=>i.isSelect==!0);if(n==null)return;n.point3=t.point.clone(),n.angle=this.calculateAngle(n.point1,n.point2,n.point3),n.text=n.angle.toFixed(2)+"°",n.isSelect=!1,n.type="angle",this.points=[],this.engine.events.trigger(Yt.MeasureChanged,n)}}handleMouseMove(e){if(e.catch!=null&&this.points.length!=1&&this.points.length==2){let t=this.engine.measure.annotationData.angleAnnotation.find(n=>n.isSelect==!0);t==null&&(t={id:Di(),point1:this.points[0].clone(),point2:this.points[1].clone(),point3:e.catch.point.clone(),angle:0,text:"0.00°",isSelect:!0,type:"angle"},this.engine.measure.annotationData.angleAnnotation.push(t)),t.point3=e.catch.point.clone(),t.angle=this.calculateAngle(t.point1,t.point2,t.point3),t.text=t.angle.toFixed(2)+"°",console.log("角度",t.text)}}}class eS{engine;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active();let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.points=[],this.behavior?.disActive()}clearAllPoints(){this.points=[]}calculateArea(e){if(e.length<3)return 0;let t=0;const n=e.length;for(let i=0;i=3){let n=this.engine.measure.annotationData.areaAnnotation.find(i=>i.isSelect==!0);n==null?(n={id:Di(),points:this.points.map(i=>i.clone()),area:0,text:0,isSelect:!0,type:"area"},this.engine.measure.annotationData.areaAnnotation.push(n)):(this.points.push(t.point.clone()),n.points=this.points.map(i=>i.clone())),n.area=this.calculateArea(n.points),n.text=n.area,console.log("面积",n.text)}}handleMouseMove(e){if(e.catch!=null&&this.points.length>=2){let t=this.engine.measure.annotationData.areaAnnotation.find(n=>n.isSelect==!0);if(t==null){if(this.points.length>=2){let n=this.points.map(i=>i.clone());n.push(e.catch.point.clone()),n.length>=3&&(t={id:Di(),points:n,area:0,text:0,isSelect:!0,type:"area"},this.engine.measure.annotationData.areaAnnotation.push(t))}}else if(t.points.length>0){const n=t.points.length-1;t.points[n]=e.catch.point.clone()}else t.points=this.points.map(n=>n.clone()),t.points.push(e.catch.point.clone());t&&t.points.length>=3&&(t.area=this.calculateArea(t.points),t.text=t.area)}}handelKeyEnterDown(){this.finishMeasure()}finishMeasure(){this.points=this.points.slice(0,this.points.length-1);let e=this.engine.measure.annotationData.areaAnnotation.find(t=>t.isSelect==!0);e!=null&&e.points.length>=3&&(e.points.length>this.points.length&&(e.points=this.points.map(t=>t.clone())),e.area=this.calculateArea(e.points),e.text=e.area,e.isSelect=!1,this.points=[],this.engine.events.trigger(Yt.MeasureChanged,e))}}class tS{engine;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active();let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.points=[],this.behavior?.disActive()}clearAllPoints(){this.points=[]}calculateSlope(e,t){const n=t.y-e.y,i=t.x-e.x,r=t.z-e.z,a=Math.sqrt(i*i+r*r);if(a===0)return{percentage:0,angle:0,heightDiff:n,horizontalDist:0,type:"slope"};const o=n/a*100,l=Math.atan(n/a)*(180/Math.PI);return{percentage:o,angle:l,heightDiff:n,horizontalDist:a,type:"slope"}}handleMouseClick(e){if(e.catch==null)return;let t=e.catch;if(this.points.length==0)this.points.push(t.point);else if(this.points.length==1){let n=this.engine.measure.annotationData.slopeAnnotation.find(r=>r.isSelect==!0);if(n==null)return;console.log("进来了"),n.point2=t.point.clone();const i=this.calculateSlope(n.point1,n.point2);n.slopePercentage=i.percentage,n.slopeAngle=i.angle,n.heightDiff=i.heightDiff,n.horizontalDist=i.horizontalDist,n.text=i.percentage.toFixed(2)+"% ("+i.angle.toFixed(2)+"°)",n.isSelect=!1,this.points=[],this.engine.events.trigger(Yt.MeasureChanged,n)}}handleMouseMove(e){if(e.catch==null)return;let t=e.catch;if(t!=null&&this.points.length==1){let n=this.engine.measure.annotationData.slopeAnnotation.find(r=>r.isSelect==!0);n==null&&(n={id:Di(),point1:this.points[0].clone(),point2:t.point.clone(),slopePercentage:0,slopeAngle:0,heightDiff:0,horizontalDist:0,text:"0.00% (0.00°)",isSelect:!0,type:"slope"},this.engine.measure.annotationData.slopeAnnotation.push(n)),n.point2=t.point.clone();const i=this.calculateSlope(n.point1,n.point2);n.slopePercentage=i.percentage,n.slopeAngle=i.angle,n.heightDiff=i.heightDiff,n.horizontalDist=i.horizontalDist,n.text=i.percentage.toFixed(2)+"% ("+i.angle.toFixed(2)+"°)"}}}class nS{isActive=!1;engine;clearHeightMeasure;distanceMeasure;clearDistanceMeasure;elevationMeasure;pointMeasure;angleMeasure;areaMeasure;slopeMeasure;tools;annotationContainer;annotationData={normalAnnotation:[],textAnnotation:[],coordinateAnnotation:[],angleAnnotation:[],distanceAnnotation:[],areaAnnotation:[],slopeAnnotation:[],elevationAnnotation:[],volumeAnnotation:[]};constructor(e){this.engine=e,this.clearHeightMeasure=new Zw(e),this.distanceMeasure=new Yw(e),this.clearDistanceMeasure=new $w(e),this.elevationMeasure=new Kw(e),this.pointMeasure=new Jw(e),this.angleMeasure=new Qw(e),this.areaMeasure=new eS(e),this.slopeMeasure=new tS(e),this.tools=new Ii(e),this.annotationContainer=document.createElement("div"),this.annotationContainer.className="annotation-container",e.container.appendChild(this.annotationContainer)}active(){this.isActive=!0,this.engine.modelEdge.loadModelEdge(),this.tools.active()}disActive(){this.tools.disActive(),this.clearAll(),this.isActive=!1,this.clearHeightMeasure.disActive(),this.distanceMeasure.disActive(),this.clearDistanceMeasure.disActive(),this.elevationMeasure.disActive(),this.pointMeasure.disActive(),this.angleMeasure.disActive(),this.areaMeasure.disActive(),this.slopeMeasure.disActive(),this.engine.interactionModule.init(),this.engine.interactionModule.active()}clearAllPoints(){this.clearHeightMeasure.clearAllPoints(),this.distanceMeasure.clearAllPoints(),this.clearDistanceMeasure.clearAllPoints(),this.elevationMeasure.clearAllPoints(),this.pointMeasure.clearAllPoints(),this.angleMeasure.clearAllPoints(),this.areaMeasure.clearAllPoints(),this.slopeMeasure.clearAllPoints()}clearAll(){e(this.annotationData.normalAnnotation),e(this.annotationData.textAnnotation),e(this.annotationData.coordinateAnnotation),e(this.annotationData.angleAnnotation),e(this.annotationData.distanceAnnotation),e(this.annotationData.areaAnnotation),e(this.annotationData.slopeAnnotation),e(this.annotationData.elevationAnnotation),e(this.annotationData.volumeAnnotation);function e(t){for(let n=0;n65535?new Uint32Array(new e(4*s)):new Uint16Array(new e(2*s))}function lS(s,e){if(!s.index){const t=s.attributes.position.count,n=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=oS(t,n);s.setIndex(new yt(i,1));for(let r=0;ri&&(o.push({pos:Math.max(i,d),isStart:!0}),o.push({pos:Math.min(r,f),isStart:!1}))}o.sort((h,u)=>h.pos!==u.pos?h.pos-u.pos:h.type==="end"?-1:1);let l=0,c=null;for(const h of o){const u=h.pos;l!==0&&u!==c&&t.push({offset:c,count:u-c}),l+=h.isStart?1:-1,c=u}return t}function Iu(s,e,t,n,i){let r=1/0,a=1/0,o=1/0,l=-1/0,c=-1/0,h=-1/0,u=1/0,p=1/0,d=1/0,m=-1/0,f=-1/0,x=-1/0;const g=s.offset||0;for(let y=(e-g)*6,v=(e+t-g)*6;yl&&(l=T),bm&&(m=b);const R=s[y+2],S=s[y+3],E=R-S,L=R+S;Ec&&(c=L),Rf&&(f=R);const A=s[y+4],I=s[y+5],w=A-I,z=A+I;wh&&(h=z),Ax&&(x=A)}n[0]=r,n[1]=a,n[2]=o,n[3]=l,n[4]=c,n[5]=h,i[0]=u,i[1]=p,i[2]=d,i[3]=m,i[4]=f,i[5]=x}function h0(s,e,t=null,n=null,i=null){const r=s.attributes.position,a=s.index?s.index.array:null,o=r.normalized;if(i===null)i=new Float32Array(t*6),i.offset=e;else if(e<0||t+e>i.length/6)throw new Error("MeshBVH: compute triangle bounds range is invalid.");const l=r.array,c=r.offset||0;let h=3;r.isInterleavedBufferAttribute&&(h=r.data.stride);const u=["getX","getY","getZ"],p=i.offset;for(let d=e,m=e+t;dS&&(S=M),T>S&&(S=T);const E=(S-R)/2,L=b*2;i[x+L+0]=R+E,i[x+L+1]=E+(Math.abs(R)+E)*rS}}return i}function Nt(s,e,t){return t.min.x=e[s],t.min.y=e[s+1],t.min.z=e[s+2],t.max.x=e[s+3],t.max.y=e[s+4],t.max.z=e[s+5],t}function u0(s){let e=-1,t=-1/0;for(let n=0;n<3;n++){const i=s[n+3]-s[n];i>t&&(t=i,e=n)}return e}function d0(s,e){e.set(s)}function p0(s,e,t){let n,i;for(let r=0;r<3;r++){const a=r+3;n=s[r],i=e[r],t[r]=ni?n:i}}function Sl(s,e,t){for(let n=0;n<3;n++){const i=e[s+2*n],r=e[s+2*n+1],a=i-r,o=i+r;at[n+3]&&(t[n+3]=o)}}function Ba(s){const e=s[3]-s[0],t=s[4]-s[1],n=s[5]-s[2];return 2*(e*t+t*n+n*e)}const Ni=32,cS=(s,e)=>s.candidate-e.candidate,is=new Array(Ni).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),El=new Float32Array(6);function hS(s,e,t,n,i,r){let a=-1,o=0;if(r===s0)a=u0(e),a!==-1&&(o=(e[a]+e[a+3])/2);else if(r===iS)a=u0(s),a!==-1&&(o=uS(t,n,i,a));else if(r===sS){const l=Ba(s);let c=Lu*i;const h=t.offset||0,u=(n-h)*6,p=(n+i-h)*6;for(let d=0;d<3;d++){const m=e[d],f=(e[d+3]-m)/Ni;if(i=M.candidate?Sl(v,t,M.rightCacheBounds):(Sl(v,t,M.leftCacheBounds),M.count++)}}for(let v=0;v=Ni&&(v=Ni-1);const b=is[v];b.count++,Sl(y,t,b.bounds)}const x=is[Ni-1];d0(x.bounds,x.rightCacheBounds);for(let y=Ni-2;y>=0;y--){const v=is[y],b=is[y+1];p0(v.bounds,b.rightCacheBounds,v.rightCacheBounds)}let g=0;for(let y=0;y=l;)o--;if(a=l;)o--;if(afS)throw new Error("MeshBVH: Cannot store relative child node offset greater than 32 bits.");return Tl[t+6]=p,Tl[t+7]=l,Uu(h,o)}}function gS(s,e,t){const n=(s.index?s.index.count:s.attributes.position.count)/3>65536,i=t.reduce((c,h)=>c+h.count,0),r=n?4:2,a=e?new SharedArrayBuffer(i*r):new ArrayBuffer(i*r),o=n?new Uint32Array(a):new Uint16Array(a);let l=0;for(let c=0;c=r&&(g=!0,a&&(console.warn(`MeshBVH: Max depth of ${r} reached when generating BVH. Consider increasing maxDepth.`),console.warn(p))),T<=o||S>=r)return v(M+T),_.offset=M,_.count=T,_;const E=hS(_.boundingData,R,e,M,T,l);if(E.axis===-1)return v(M+T),_.offset=M,_.count=T,_;const L=m(u,d,e,M,T,E);if(L===M||L===M+T)v(M+T),_.offset=M,_.count=T;else{_.splitAxis=E.axis;const A=new Nu,I=M,w=L-M;_.left=A,Iu(e,I,w,A.boundingData,x),b(A,I,w,x,S+1);const z=new Nu,G=L,j=T-w;_.right=z,Iu(e,G,j,z.boundingData,x),b(z,G,j,x,S+1)}return _}}function vS(s,e){const t=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,n=s.geometry;let i,r;if(e.indirect){const a=c0(n,e.range),o=gS(n,e.useSharedArrayBuffer,a);s._indirectBuffer=o,i=h0(n,0,o.length,o),r=[{offset:0,count:o.length}]}else{lS(n,e);const a=l0(n,e.range)[0];i=h0(n,a.offset,a.count),r=c0(n,e.range)}s._roots=r.map(a=>{const o=xS(s,i,a.offset,a.count,e),l=ku(o),c=new t(fn*l);return mS(0,o,c),c})}class Bi{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(e,t){let n=1/0,i=-1/0;for(let r=0,a=e.length;ri?o:i}this.min=n,this.max=i}setFromPoints(e,t){let n=1/0,i=-1/0;for(let r=0,a=t.length;ri?l:i}this.min=n,this.max=i}isSeparated(e){return this.min>e.max||e.min>this.max}}Bi.prototype.setFromBox=(function(){const s=new P;return function(e,t){const n=t.min,i=t.max;let r=1/0,a=-1/0;for(let o=0;o<=1;o++)for(let l=0;l<=1;l++)for(let c=0;c<=1;c++){s.x=n.x*o+i.x*(1-o),s.y=n.y*l+i.y*(1-l),s.z=n.z*c+i.z*(1-c);const h=e.dot(s);r=Math.min(h,r),a=Math.max(h,a)}this.min=r,this.max=a}})();const yS=(function(){const s=new P,e=new P,t=new P;return function(n,i,r){const a=n.start,o=s,l=i.start,c=e;t.subVectors(a,l),s.subVectors(n.end,n.start),e.subVectors(i.end,i.start);const h=t.dot(c),u=c.dot(o),p=c.dot(c),d=t.dot(o),m=o.dot(o)*p-u*u;let f,x;m!==0?f=(h*u-d*p)/m:f=0,x=(h+f*u)/p,r.x=f,r.y=x}})(),Ou=(function(){const s=new he,e=new P,t=new P;return function(n,i,r,a){yS(n,i,s);let o=s.x,l=s.y;if(o>=0&&o<=1&&l>=0&&l<=1){n.at(o,r),i.at(l,a);return}else if(o>=0&&o<=1){l<0?i.at(0,a):i.at(1,a),n.closestPointToPoint(a,!0,r);return}else if(l>=0&&l<=1){o<0?n.at(0,r):n.at(1,r),i.closestPointToPoint(r,!0,a);return}else{let c;o<0?c=n.start:c=n.end;let h;l<0?h=i.start:h=i.end;const u=e,p=t;if(n.closestPointToPoint(h,!0,e),i.closestPointToPoint(c,!0,t),u.distanceToSquared(h)<=p.distanceToSquared(c)){r.copy(u),a.copy(h);return}else{r.copy(c),a.copy(p);return}}}})(),bS=(function(){const s=new P,e=new P,t=new Dt,n=new Vn;return function(i,r){const{radius:a,center:o}=i,{a:l,b:c,c:h}=r;if(n.start=l,n.end=c,n.closestPointToPoint(o,!0,s).distanceTo(o)<=a||(n.start=l,n.end=h,n.closestPointToPoint(o,!0,s).distanceTo(o)<=a)||(n.start=c,n.end=h,n.closestPointToPoint(o,!0,s).distanceTo(o)<=a))return!0;const u=r.getPlane(t);if(Math.abs(u.distanceToPoint(o))<=a){const p=u.projectPoint(o,e);if(r.containsPoint(p))return!0}return!1}})(),_S=["x","y","z"],ki=1e-15,g0=ki*ki;function Wn(s){return Math.abs(s)new P),this.satBounds=new Array(4).fill().map(()=>new Bi),this.points=[this.a,this.b,this.c],this.plane=new Dt,this.isDegenerateIntoSegment=!1,this.isDegenerateIntoPoint=!1,this.degenerateSegment=new Vn,this.needsUpdate=!0}intersectsSphere(e){return bS(e,this)}update(){const e=this.a,t=this.b,n=this.c,i=this.points,r=this.satAxes,a=this.satBounds,o=r[0],l=a[0];this.getNormal(o),l.setFromPoints(o,i);const c=r[1],h=a[1];c.subVectors(e,t),h.setFromPoints(c,i);const u=r[2],p=a[2];u.subVectors(t,n),p.setFromPoints(u,i);const d=r[3],m=a[3];d.subVectors(n,e),m.setFromPoints(d,i);const f=c.length(),x=u.length(),g=d.length();this.isDegenerateIntoPoint=!1,this.isDegenerateIntoSegment=!1,f0)d(v.c,v.a,v.b,M,b,_,L,S,E,A,I);else if(R>0)d(v.b,v.a,v.c,_,b,M,E,S,L,A,I);else if(E*L>0||S!=0)d(v.a,v.b,v.c,b,_,M,S,E,L,A,I);else if(E!=0)d(v.b,v.a,v.c,_,b,M,E,S,L,A,I);else if(L!=0)d(v.c,v.a,v.b,M,b,_,L,S,E,A,I);else return!0;return!1}function f(v,b,_,M){const T=b.degenerateSegment,R=v.plane.distanceToPoint(T.start),S=v.plane.distanceToPoint(T.end);return Wn(R)?Wn(S)?p(v,b,_,M):(_&&(_.start.copy(T.start),_.end.copy(T.start)),v.containsPoint(T.start)):Wn(S)?(_&&(_.start.copy(T.end),_.end.copy(T.end)),v.containsPoint(T.end)):v.plane.intersectLine(T,n)!=null?(_&&(_.start.copy(n),_.end.copy(n)),v.containsPoint(n)):!1}function x(v,b,_){const M=b.a;return Wn(v.plane.distanceToPoint(M))&&v.containsPoint(M)?(_&&(_.start.copy(M),_.end.copy(M)),!0):!1}function g(v,b,_){const M=v.degenerateSegment,T=b.a;return M.closestPointToPoint(T,!0,n),T.distanceToSquared(n)1||w<0||w>1)return!1;const z=T.start.z+S.z*I,G=R.start.z+E.z*w;return Wn(z-G)?(_&&(_.start.copy(T.start).addScaledVector(S,I),_.end.copy(T.start).addScaledVector(S,I)),!0):!1}else return b.isDegenerateIntoPoint?g(v,b,_):f(b,v,_,M);else{if(v.isDegenerateIntoPoint)return b.isDegenerateIntoPoint?b.a.distanceToSquared(v.a)0&&I>0)return!1;let w=T.distanceToPoint(v.a),z=T.distanceToPoint(v.b),G=T.distanceToPoint(v.c);Wn(w)&&(w=0),Wn(z)&&(z=0),Wn(G)&&(G=0);const j=w*z,Y=w*G;if(j>0&&Y>0)return!1;i.copy(T.normal),r.copy(R.normal);const q=i.cross(r);let ie=0,W=Math.abs(q.x);const $=Math.abs(q.y);$>W&&(W=$,ie=1),Math.abs(q.z)>W&&(ie=2);const fe=_S[ie],me=this.a[fe],de=this.b[fe],se=this.c[fe],ce=v.a[fe],pe=v.b[fe],ye=v.c[fe];if(m(this,me,de,se,A,I,S,E,L,h,o))return p(this,v,b,_);if(m(v,ce,pe,ye,j,Y,w,z,G,u,l))return p(this,v,b,_);if(h.yh.x?b.start.copy(l.start):b.start.copy(o.start),u.ynew P),this.satAxes=new Array(3).fill().map(()=>new P),this.satBounds=new Array(3).fill().map(()=>new Bi),this.alignedSatBounds=new Array(3).fill().map(()=>new Bi),this.needsUpdate=!1,e&&this.min.copy(e),t&&this.max.copy(t),n&&this.matrix.copy(n)}set(e,t,n){this.min.copy(e),this.max.copy(t),this.matrix.copy(n),this.needsUpdate=!0}copy(e){this.min.copy(e.min),this.max.copy(e.max),this.matrix.copy(e.matrix),this.needsUpdate=!0}}mn.prototype.update=(function(){return function(){const s=this.matrix,e=this.min,t=this.max,n=this.points;for(let l=0;l<=1;l++)for(let c=0;c<=1;c++)for(let h=0;h<=1;h++){const u=1*l|2*c|4*h,p=n[u];p.x=l?t.x:e.x,p.y=c?t.y:e.y,p.z=h?t.z:e.z,p.applyMatrix4(s)}const i=this.satBounds,r=this.satAxes,a=n[0];for(let l=0;l<3;l++){const c=r[l],h=i[l],u=1<new Vn),t=new Array(12).fill().map(()=>new Vn),n=new P,i=new P;return function(r,a=0,o=null,l=null){if(this.needsUpdate&&this.update(),this.intersectsBox(r))return(o||l)&&(r.getCenter(i),this.closestPointToPoint(i,n),r.closestPointToPoint(n,i),o&&o.copy(n),l&&l.copy(i)),0;const c=a*a,h=r.min,u=r.max,p=this.points;let d=1/0;for(let f=0;f<8;f++){const x=p[f];i.copy(x).clamp(h,u);const g=x.distanceToSquared(i);if(gnew Xn)}}const jn=new MS;function Jt(s,e){return e[s+15]===o0}function In(s,e){return e[s+6]}function qn(s,e){return e[s+14]}function tn(s){return s+Kt}function nn(s,e){const t=e[s+6];return s+t*Kt}function Fu(s,e){return e[s+7]}class wS{constructor(){this.float32Array=null,this.uint16Array=null,this.uint32Array=null;const e=[];let t=null;this.setBuffer=n=>{t&&e.push(t),t=n,this.float32Array=new Float32Array(n),this.uint16Array=new Uint16Array(n),this.uint32Array=new Uint32Array(n)},this.clearBuffer=()=>{t=null,this.float32Array=null,this.uint16Array=null,this.uint32Array=null,e.length!==0&&this.setBuffer(e.pop())}}}const _t=new wS;let ss,Or;const zr=[],Cl=new zu(()=>new gt);function SS(s,e,t,n,i,r){ss=Cl.getPrimitive(),Or=Cl.getPrimitive(),zr.push(ss,Or),_t.setBuffer(s._roots[e]);const a=Hu(0,s.geometry,t,n,i,r);_t.clearBuffer(),Cl.releasePrimitive(ss),Cl.releasePrimitive(Or),zr.pop(),zr.pop();const o=zr.length;return o>0&&(Or=zr[o-1],ss=zr[o-2]),a}function Hu(s,e,t,n,i=null,r=0,a=0){const{float32Array:o,uint16Array:l,uint32Array:c}=_t;let h=s*2;if(Jt(h,l)){const u=In(s,c),p=qn(h,l);return Nt(s,o,ss),n(u,p,!1,a,r+s/Kt,ss)}else{let u=function(L){const{uint16Array:A,uint32Array:I}=_t;let w=L*2;for(;!Jt(w,A);)L=tn(L),w=L*2;return In(L,I)},p=function(L){const{uint16Array:A,uint32Array:I}=_t;let w=L*2;for(;!Jt(w,A);)L=nn(L,I),w=L*2;return In(L,I)+qn(w,A)};const d=tn(s),m=nn(s,c);let f=d,x=m,g,y,v,b;if(i&&(v=ss,b=Or,Nt(f,o,v),Nt(x,o,b),g=i(v),y=i(b),y(ka.copy(e).clamp(h.min,h.max),ka.distanceToSquared(e)),intersectsBounds:(h,u,p)=>p{h.closestPointToPoint(e,ka);const p=e.distanceToSquared(ka);return p=169,TS=parseInt(Yr)<=161,Bs=new P,ks=new P,Us=new P,Pl=new he,Rl=new he,Ll=new he,x0=new P,v0=new P,y0=new P,Ua=new P;function CS(s,e,t,n,i,r,a,o){let l;if(r===sn?l=s.intersectTriangle(n,t,e,!0,i):l=s.intersectTriangle(e,t,n,r!==bt,i),l===null)return null;const c=s.origin.distanceTo(i);return co?null:{distance:c,point:i.clone()}}function b0(s,e,t,n,i,r,a,o,l,c,h){Bs.fromBufferAttribute(e,r),ks.fromBufferAttribute(e,a),Us.fromBufferAttribute(e,o);const u=CS(s,Bs,ks,Us,Ua,l,c,h);if(u){if(n){Pl.fromBufferAttribute(n,r),Rl.fromBufferAttribute(n,a),Ll.fromBufferAttribute(n,o),u.uv=new he;const d=vt.getInterpolation(Ua,Bs,ks,Us,Pl,Rl,Ll,u.uv);Al||(u.uv=d)}if(i){Pl.fromBufferAttribute(i,r),Rl.fromBufferAttribute(i,a),Ll.fromBufferAttribute(i,o),u.uv1=new he;const d=vt.getInterpolation(Ua,Bs,ks,Us,Pl,Rl,Ll,u.uv1);Al||(u.uv1=d),TS&&(u.uv2=u.uv1)}if(t){x0.fromBufferAttribute(t,r),v0.fromBufferAttribute(t,a),y0.fromBufferAttribute(t,o),u.normal=new P;const d=vt.getInterpolation(Ua,Bs,ks,Us,x0,v0,y0,u.normal);u.normal.dot(s.direction)>0&&u.normal.multiplyScalar(-1),Al||(u.normal=d)}const p={a:r,b:a,c:o,normal:new P,materialIndex:0};if(vt.getNormal(Bs,ks,Us,p.normal),u.face=p,u.faceIndex=r,Al){const d=new P;vt.getBarycoord(Ua,Bs,ks,Us,d),u.barycoord=d}}return u}function _0(s){return s&&s.isMaterial?s.side:s}function Dl(s,e,t,n,i,r,a){const o=n*3;let l=o+0,c=o+1,h=o+2;const{index:u,groups:p}=s;s.index&&(l=u.getX(l),c=u.getX(c),h=u.getX(h));const{position:d,normal:m,uv:f,uv1:x}=s.attributes;if(Array.isArray(e)){const g=n*3;for(let y=0,v=p.length;y=b&&g_&&(_=L),AM&&(M=A),IT&&(T=I)}return l[p+0]!==y||l[p+1]!==v||l[p+2]!==b||l[p+3]!==_||l[p+4]!==M||l[p+5]!==T?(l[p+0]=y,l[p+1]=v,l[p+2]=b,l[p+3]=_,l[p+4]=M,l[p+5]=T,!0):!1}else{const x=tn(p),g=nn(p,a);let y=m,v=!1,b=!1;if(e){if(!y){const E=x/Kt+d/fn,L=g/Kt+d/fn;v=e.has(E),b=e.has(L),y=!v&&!b}}else v=!0,b=!0;const _=y||v,M=y||b;let T=!1;_&&(T=u(x,d,y));let R=!1;M&&(R=u(g,d,y));const S=T||R;if(S)for(let E=0;E<3;E++){const L=x+E,A=g+E,I=l[L],w=l[L+3],z=l[A],G=l[A+3];l[p+E]=IG?w:G}return S}}}function rs(s,e,t,n,i){let r,a,o,l,c,h;const u=1/t.direction.x,p=1/t.direction.y,d=1/t.direction.z,m=t.origin.x,f=t.origin.y,x=t.origin.z;let g=e[s],y=e[s+3],v=e[s+1],b=e[s+3+1],_=e[s+2],M=e[s+3+2];return u>=0?(r=(g-m)*u,a=(y-m)*u):(r=(y-m)*u,a=(g-m)*u),p>=0?(o=(v-f)*p,l=(b-f)*p):(o=(b-f)*p,l=(v-f)*p),r>l||o>a||((o>r||isNaN(r))&&(r=o),(l=0?(c=(_-x)*d,h=(M-x)*d):(c=(M-x)*d,h=(_-x)*d),r>h||c>a)?!1:((c>r||r!==r)&&(r=c),(h=n)}function DS(s,e,t,n,i,r,a,o){const{geometry:l,_indirectBuffer:c}=s;for(let h=n,u=n+i;h=0;let d,m;p?(d=tn(s),m=nn(s,l)):(d=nn(s,l),m=tn(s));const f=rs(d,a,n,i,r)?Wu(d,e,t,n,i,r):null;if(f){const g=f.point[u];if(p?g<=a[m+h]:g>=a[m+h+3])return f}const x=rs(m,a,n,i,r)?Wu(m,e,t,n,i,r):null;return f&&x?f.distance<=x.distance?f:x:f||x||null}}const Il=new gt,Fr=new Xn,Hr=new Xn,Oa=new De,M0=new mn,Nl=new mn;function OS(s,e,t,n){_t.setBuffer(s._roots[e]);const i=Xu(0,s,t,n);return _t.clearBuffer(),i}function Xu(s,e,t,n,i=null){const{float32Array:r,uint16Array:a,uint32Array:o}=_t;let l=s*2;if(i===null&&(t.boundingBox||t.computeBoundingBox(),M0.set(t.boundingBox.min,t.boundingBox.max,n),i=M0),Jt(l,a)){const c=e.geometry,h=c.index,u=c.attributes.position,p=t.index,d=t.attributes.position,m=In(s,o),f=qn(l,a);if(Oa.copy(n).invert(),t.boundsTree)return Nt(s,r,Nl),Nl.matrix.copy(Oa),Nl.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:x=>Nl.intersectsBox(x),intersectsTriangle:x=>{x.a.applyMatrix4(n),x.b.applyMatrix4(n),x.c.applyMatrix4(n),x.needsUpdate=!0;for(let g=m*3,y=(f+m)*3;gju.distanceToBox(_),intersectsBounds:(_,M,T)=>T{if(e.boundsTree)return e.boundsTree.shapecast({boundsTraverseOrder:T=>za.distanceToBox(T),intersectsBounds:(T,R,S)=>S{for(let S=T,E=T+R;S_&&(_=I),wM&&(M=w),zT&&(T=z)}}return l[p+0]!==y||l[p+1]!==v||l[p+2]!==b||l[p+3]!==_||l[p+4]!==M||l[p+5]!==T?(l[p+0]=y,l[p+1]=v,l[p+2]=b,l[p+3]=_,l[p+4]=M,l[p+5]=T,!0):!1}else{const x=tn(p),g=nn(p,a);let y=m,v=!1,b=!1;if(e){if(!y){const E=x/Kt+d/fn,L=g/Kt+d/fn;v=e.has(E),b=e.has(L),y=!v&&!b}}else v=!0,b=!0;const _=y||v,M=y||b;let T=!1;_&&(T=u(x,d,y));let R=!1;M&&(R=u(g,d,y));const S=T||R;if(S)for(let E=0;E<3;E++){const L=x+E,A=g+E,I=l[L],w=l[L+3],z=l[A],G=l[A+3];l[p+E]=IG?w:G}return S}}}function XS(s,e,t,n,i,r,a){_t.setBuffer(s._roots[e]),qu(0,s,t,n,i,r,a),_t.clearBuffer()}function qu(s,e,t,n,i,r,a){const{float32Array:o,uint16Array:l,uint32Array:c}=_t,h=s*2;if(Jt(h,l)){const u=In(s,c),p=qn(h,l);DS(e,t,n,u,p,i,r,a)}else{const u=tn(s);rs(u,o,n,r,a)&&qu(u,e,t,n,i,r,a);const p=nn(s,c);rs(p,o,n,r,a)&&qu(p,e,t,n,i,r,a)}}const jS=["x","y","z"];function qS(s,e,t,n,i,r){_t.setBuffer(s._roots[e]);const a=Zu(0,s,t,n,i,r);return _t.clearBuffer(),a}function Zu(s,e,t,n,i,r){const{float32Array:a,uint16Array:o,uint32Array:l}=_t;let c=s*2;if(Jt(c,o)){const h=In(s,l),u=qn(c,o);return IS(e,t,n,h,u,i,r)}else{const h=Fu(s,l),u=jS[h],p=n.direction[u]>=0;let d,m;p?(d=tn(s),m=nn(s,l)):(d=nn(s,l),m=tn(s));const f=rs(d,a,n,i,r)?Zu(d,e,t,n,i,r):null;if(f){const g=f.point[u];if(p?g<=a[m+h]:g>=a[m+h+3])return f}const x=rs(m,a,n,i,r)?Zu(m,e,t,n,i,r):null;return f&&x?f.distance<=x.distance?f:x:f||x||null}}const kl=new gt,Vr=new Xn,Gr=new Xn,Fa=new De,w0=new mn,Ul=new mn;function ZS(s,e,t,n){_t.setBuffer(s._roots[e]);const i=Yu(0,s,t,n);return _t.clearBuffer(),i}function Yu(s,e,t,n,i=null){const{float32Array:r,uint16Array:a,uint32Array:o}=_t;let l=s*2;if(i===null&&(t.boundingBox||t.computeBoundingBox(),w0.set(t.boundingBox.min,t.boundingBox.max,n),i=w0),Jt(l,a)){const c=e.geometry,h=c.index,u=c.attributes.position,p=t.index,d=t.attributes.position,m=In(s,o),f=qn(l,a);if(Fa.copy(n).invert(),t.boundsTree)return Nt(s,r,Ul),Ul.matrix.copy(Fa),Ul.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:x=>Ul.intersectsBox(x),intersectsTriangle:x=>{x.a.applyMatrix4(n),x.b.applyMatrix4(n),x.c.applyMatrix4(n),x.needsUpdate=!0;for(let g=m,y=f+m;g$u.distanceToBox(_),intersectsBounds:(_,M,T)=>T{if(e.boundsTree){const T=e.boundsTree;return T.shapecast({boundsTraverseOrder:R=>Ha.distanceToBox(R),intersectsBounds:(R,S,E)=>E{for(let E=R,L=R+S;Enew gt),Wr=new gt,Xr=new gt,Ku=new gt,Ju=new gt;let Qu=!1;function tE(s,e,t,n){if(Qu)throw new Error("MeshBVH: Recursive calls to bvhcast not supported.");Qu=!0;const i=s._roots,r=e._roots;let a,o=0,l=0;const c=new De().copy(t).invert();for(let h=0,u=i.length;hl.slice()),o.index=a?a.array.slice():null,o.indirectBuffer=r?r.slice():null):(o.roots=i,o.index=a?a.array:null,o.indirectBuffer=r),o}static deserialize(e,t,n={}){n={setIndex:!0,indirect:!!e.indirectBuffer,...n};const{index:i,roots:r,indirectBuffer:a}=e;e.version||(console.warn("MeshBVH.deserialize: Serialization format has been changed and will be fixed up. It is recommended to regenerate any stored serialized data."),l(r));const o=new ed(t,{...n,[Du]:!0});if(o._roots=r,o._indirectBuffer=a||null,n.setIndex){const c=t.getIndex();if(c===null){const h=new yt(e.index,1,!1);t.setIndex(h)}else c.array!==i&&(c.array.set(i),c.needsUpdate=!0)}return o;function l(c){for(let h=0;hthis._indirectBuffer[n]:n=>n}shiftTriangleOffsets(e){const t=this._indirectBuffer;if(t)for(let n=0,i=t.length;nu(p,d,m,f,x)?!0:n(p,d,this,o,m,f,t)}else a||(o?a=(u,p,d,m)=>n(u,p,this,o,d,m,t):a=(u,p,d)=>d);let l=!1,c=0;const h=this._roots;for(let u=0,p=h.length;u{const f=this.resolveTriangleIndex(m);Wt(a,f*3,o,l)}:m=>{Wt(a,m*3,o,l)},h=jn.getPrimitive(),u=e.geometry.index,p=e.geometry.attributes.position,d=e.indirect?m=>{const f=e.resolveTriangleIndex(m);Wt(h,f*3,u,p)}:m=>{Wt(h,m*3,u,p)};if(r){const m=(f,x,g,y,v,b,_,M)=>{for(let T=g,R=g+y;TFl.intersectsBox(n),intersectsTriangle:n=>Fl.intersectsTriangle(n)})}intersectsSphere(e){return this.shapecast({intersectsBounds:t=>e.intersectsBox(t),intersectsTriangle:t=>t.intersectsSphere(e)})}closestPointToGeometry(e,t,n={},i={},r=0,a=1/0){return(this.indirect?QS:GS)(this,e,t,n,i,r,a)}closestPointToPoint(e,t={},n=0,i=1/0){return ES(this,e,t,n,i)}getBoundingBox(e){return e.makeEmpty(),this._roots.forEach(t=>{Nt(0,new Float32Array(t),S0),e.union(S0)}),e}}const E0=1e-6,iE=E0*.5,T0=Math.pow(10,-Math.log10(E0)),sE=iE*T0;function mi(s){return~~(s*T0+sE)}function rE(s){return`${mi(s.x)},${mi(s.y)}`}function C0(s){return`${mi(s.x)},${mi(s.y)},${mi(s.z)}`}function aE(s){return`${mi(s.x)},${mi(s.y)},${mi(s.z)},${mi(s.w)}`}function oE(s,e,t){t.direction.subVectors(e,s).normalize();const n=s.dot(t.direction);return t.origin.copy(s).addScaledVector(t.direction,-n),t}function A0(){return typeof SharedArrayBuffer<"u"}function lE(s){if(s.buffer instanceof SharedArrayBuffer)return s;const e=s.constructor,t=s.buffer,n=new SharedArrayBuffer(t.byteLength),i=new Uint8Array(t);return new Uint8Array(n).set(i,0),new e(n)}function cE(s,e=ArrayBuffer){return s>65535?new Uint32Array(new e(4*s)):new Uint16Array(new e(2*s))}function hE(s,e){if(!s.index){const t=s.attributes.position.count,n=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=cE(t,n);s.setIndex(new yt(i,1));for(let r=0;rl.end)){if(l.end=h.end)r(h.end,l.end)||s.splice(o+1,0,{start:h.end,end:l.end,index:l.index}),l.end=h.start,h.start=0,h.end=0;else if(l.start>=h.start&&l.end<=h.end)r(l.end,h.end)||e.splice(c+1,0,{start:l.end,end:h.end,index:h.index}),h.end=l.start,l.start=0,l.end=0;else if(l.start<=h.start&&l.end<=h.end){const u=l.end;l.end=h.start,h.start=u}else if(l.start>=h.start&&l.end>=h.end){const u=h.end;h.end=l.start,l.start=u}else throw new Error}if(t.has(l.index)||t.set(l.index,[]),t.has(h.index)||t.set(h.index,[]),t.get(l.index).push(h.index),t.get(h.index).push(l.index),a(h)&&(e.splice(c,1),c--),a(l)){s.splice(o,1),o--;break}}}i(s),i(e);function i(o){for(let l=0;lL0;return l.direction.angleTo(c.direction)>D0||h}function o(l,c){const h=l.origin.distanceTo(c.origin),u=l.direction.angleTo(c.direction);return h/L0+u/D0}}}const nd=new P,id=new P,Hl=new Xi;function vE(s,e,t){const n=s.attributes,i=s.index,r=n.position,a=new Map,o=new Map,l=Array.from(e),c=new xE;for(let h=0,u=l.length;hb&&([v,b]=[b,v]),Hl.direction.dot(y.direction)<0?g.reverse.push({start:v,end:b,index:p}):g.forward.push({start:v,end:b,index:p})}return o.forEach(({forward:h,reverse:u},p)=>{gE(h,u,a,t),h.length===0&&u.length===0&&o.delete(p)}),{disjointConnectivityMap:a,fragmentMap:o}}const yE=new he,sd=new P,bE=new tt,rd=["","",""];class _E{constructor(e=null){this.data=null,this.disjointConnections=null,this.unmatchedDisjointEdges=null,this.unmatchedEdges=-1,this.matchedEdges=-1,this.useDrawRange=!0,this.useAllAttributes=!1,this.matchDisjointEdges=!1,this.degenerateEpsilon=1e-8,e&&this.updateFrom(e)}getSiblingTriangleIndex(e,t){const n=this.data[e*3+t];return n===-1?-1:~~(n/3)}getSiblingEdgeIndex(e,t){const n=this.data[e*3+t];return n===-1?-1:n%3}getDisjointSiblingTriangleIndices(e,t){const n=e*3+t,i=this.disjointConnections.get(n);return i?i.map(r=>~~(r/3)):[]}getDisjointSiblingEdgeIndices(e,t){const n=e*3+t,i=this.disjointConnections.get(n);return i?i.map(r=>r%3):[]}isFullyConnected(){return this.unmatchedEdges===0}updateFrom(e){const{useAllAttributes:t,useDrawRange:n,matchDisjointEdges:i,degenerateEpsilon:r}=this,a=t?v:y,o=new Map,{attributes:l}=e,c=t?Object.keys(l):null,h=e.index,u=l.position;let p=td(e);const d=p;let m=0;n&&(m=e.drawRange.start,e.drawRange.count!==1/0&&(p=~~(e.drawRange.count/3)));let f=this.data;(!f||f.length<3*d)&&(f=new Int32Array(3*d)),f.fill(-1);let x=0,g=new Set;for(let b=m,_=p*3+m;b<_;b+=3){const M=b;for(let T=0;T<3;T++){let R=M+T;h&&(R=h.getX(R)),rd[T]=a(R)}for(let T=0;T<3;T++){const R=(T+1)%3,S=rd[T],E=rd[R],L=`${E}_${S}`;if(o.has(L)){const A=M+T,I=o.get(L);f[A]=I,f[I]=A,o.delete(L),x+=2,g.delete(I)}else{const A=`${S}_${E}`,I=M+T;o.set(A,I),g.add(I)}}}if(i){const{fragmentMap:b,disjointConnectivityMap:_}=vE(e,g,r);g.clear(),b.forEach(({forward:M,reverse:T})=>{M.forEach(({index:R})=>g.add(R)),T.forEach(({index:R})=>g.add(R))}),this.unmatchedDisjointEdges=b,this.disjointConnections=_,x=p*3-g.size}this.matchedEdges=x,this.unmatchedEdges=g.size,this.data=f;function y(b){return sd.fromBufferAttribute(u,b),C0(sd)}function v(b){let _="";for(let M=0,T=c.length;M=this._pool.length&&this._pool.push(new vt),this._pool[this._index++]}clear(){this._index=0}reset(){this._pool.length=0,this._index=0}}class EE{constructor(){this.trianglePool=new SE,this.triangles=[],this.normal=new P,this.coplanarTriangleUsed=!1}initialize(e){this.reset();const{triangles:t,trianglePool:n,normal:i}=this;if(Array.isArray(e))for(let r=0,a=e.length;rod)throw new Error("Triangle Splitter: Cannot initialize with triangles that have different normals.");const l=n.getTriangle();l.copy(o),t.push(l)}else{e.getNormal(i);const r=n.getTriangle();r.copy(e),t.push(r)}}splitByTriangle(e){const{normal:t,triangles:n}=this;if(e.getNormal(ld).normalize(),Math.abs(1-Math.abs(ld.dot(t)))0?m.push(g):f.push(g),Math.abs(v)Ga)if(p!==-1){p=(p+1)%3;let g=0;g===p&&(g=(g+1)%3);let y=g+1;y===p&&(y=(y+1)%3);const v=i.getTriangle();v.a.copy(x[y]),v.b.copy(Ot.end),v.c.copy(Ot.start),os(v)||n.push(v),o.a.copy(x[g]),o.b.copy(Ot.start),o.c.copy(Ot.end),os(o)&&(n.splice(r,1),r--,a--)}else{const g=m.length>=2?f[0]:m[0];if(g===0){let M=Ot.start;Ot.start=Ot.end,Ot.end=M}const y=(g+1)%3,v=(g+2)%3,b=i.getTriangle(),_=i.getTriangle();x[y].distanceToSquared(Ot.start)t.length&&(this.expand(),t=this.array);for(let i=0,r=e.length;i=t.length;){const i={};t.push(i);for(const r in n){const a=n[r],o=new k0(a.type);o.itemSize=a.itemSize,o.normalized=a.normalized,i[r]=o}}return t[e]}getGroupAttrArray(e,t=0){const{groupAttributes:n}=this;if(!n[0][e])throw new Error(`TypedAttributeData: Attribute with "${e}" has not been initialized`);return this.getGroupAttrSet(t)[e]}initializeArray(e,t,n,i){const{groupAttributes:r}=this,a=r[0][e];if(a){if(a.type!==t)for(let o=0,l=r.length;o{for(const n in t)t[n].clear()})}delete(e){this.groupAttributes.forEach(t=>{delete t[e]})}reset(){this.groupAttributes=[],this.groupCount=0}}class U0{constructor(){this.intersectionSet={},this.ids=[]}add(e,t){const{intersectionSet:n,ids:i}=this;n[e]||(n[e]=[],i.push(e)),n[e].push(t)}}const AE=0,PE=1,RE=2,O0=3,LE=4,z0=5,F0=6,Zn=new Xi,H0=new De,gn=new vt,zi=new P,V0=new tt,G0=new tt,W0=new tt,hd=new tt,Wl=new tt,Xl=new tt,X0=new Vn,ud=new P,dd=1e-8,DE=1e-15,Os=-1,zs=1,jl=-2,ql=2,Wa=0,Fs=1,pd=2,IE=1e-14;let Zl=null;function j0(s){Zl=s}function q0(s,e){s.getMidpoint(Zn.origin),s.getNormal(Zn.direction);const t=e.raycastFirst(Zn,bt);return t&&Zn.direction.dot(t.face.normal)>0?Os:zs}function NE(s,e){function t(){return Math.random()-.5}s.getNormal(ud),Zn.direction.copy(ud),s.getMidpoint(Zn.origin);const n=3;let i=0,r=1/0;for(let a=0;a0&&i++,o!==null&&(r=Math.min(r,o.distance)),r<=DE)return o.face.normal.dot(ud)>0?ql:jl;if(i/n>.5||(a-i+1)/n>.5)break}return i/n>.5?Os:zs}function BE(s,e){const t=new U0,n=new U0;return H0.copy(s.matrixWorld).invert().multiply(e.matrixWorld),s.geometry.boundsTree.bvhcast(e.geometry.boundsTree,H0,{intersectsTriangles(i,r,a,o){if(!os(i)&&!os(r)){let l=i.intersectsTriangle(r,X0,!0);if(!l){const c=i.plane,h=r.plane,u=c.normal,p=h.normal;u.dot(p)===1&&Math.abs(c.constant-h.constant){r.push(c.x),i>1&&r.push(c.y),i>2&&r.push(c.z),i>3&&r.push(c.w)};hd.set(0,0,0,0).addScaledVector(s,n.a.x).addScaledVector(e,n.a.y).addScaledVector(t,n.a.z),Wl.set(0,0,0,0).addScaledVector(s,n.b.x).addScaledVector(e,n.b.y).addScaledVector(t,n.b.z),Xl.set(0,0,0,0).addScaledVector(s,n.c.x).addScaledVector(e,n.c.y).addScaledVector(t,n.c.z),o&&(hd.normalize(),Wl.normalize(),Xl.normalize()),l(hd),a?(l(Xl),l(Wl)):(l(Wl),l(Xl))}function md(s,e,t,n,i,r=!1){for(const a in i){const o=e[a],l=i[a];if(!(a in e))throw new Error(`CSG Operations: Attribute ${a} no available on geometry.`);const c=o.itemSize;a==="position"?(zi.fromBufferAttribute(o,s).applyMatrix4(t),l.push(zi.x,zi.y,zi.z)):a==="normal"?(zi.fromBufferAttribute(o,s).applyNormalMatrix(n),r&&zi.multiplyScalar(-1),l.push(zi.x,zi.y,zi.z)):(l.push(o.getX(s)),c>1&&l.push(o.getY(s)),c>2&&l.push(o.getZ(s)),c>3&&l.push(o.getW(s)))}}class OE{constructor(e){this.triangle=new vt().copy(e),this.intersects={}}addTriangle(e,t){this.intersects[e]=new vt().copy(t)}getIntersectArray(){const e=[],{intersects:t}=this;for(const n in t)e.push(t[n]);return e}}class Y0{constructor(){this.data={}}addTriangleIntersection(e,t,n,i){const{data:r}=this;r[e]||(r[e]=new OE(t)),r[e].addTriangle(n,i)}getTrianglesAsArray(e=null){const{data:t}=this,n=[];if(e!==null)e in t&&n.push(t[e].triangle);else for(const i in t)n.push(t[i].triangle);return n}getTriangleIndices(){return Object.keys(this.data).map(e=>parseInt(e))}getIntersectionIndices(e){const{data:t}=this;return t[e]?Object.keys(t[e].intersects).map(n=>parseInt(n)):[]}getIntersectionsAsArray(e=null,t=null){const{data:n}=this,i=new Set,r=[],a=o=>{if(n[o])if(t!==null)n[o].intersects[t]&&r.push(n[o].intersects[t]);else{const l=n[o].intersects;for(const c in l)i.has(c)||(i.add(c),r.push(l[c]))}};if(e!==null)a(e);else for(const o in n)a(o);return r}reset(){this.data={}}}class zE{constructor(){this.enabled=!1,this.triangleIntersectsA=new Y0,this.triangleIntersectsB=new Y0,this.intersectionEdges=[]}addIntersectingTriangles(e,t,n,i){const{triangleIntersectsA:r,triangleIntersectsB:a}=this;r.addTriangleIntersection(e,t,n,i),a.addTriangleIntersection(n,i,e,t)}addEdge(e){this.intersectionEdges.push(e.clone())}reset(){this.triangleIntersectsA.reset(),this.triangleIntersectsB.reset(),this.intersectionEdges=[]}init(){this.enabled&&(this.reset(),j0(this))}complete(){this.enabled&&j0(null)}}const ls=new De,Yl=new $e,Hs=new vt,$l=new vt,cs=new vt,Kl=new vt,si=[],Vs=[];function FE(s){for(const e of s)return e}function HE(s,e,t,n,i,r={}){const{useGroups:a=!0}=r,{aIntersections:o,bIntersections:l}=BE(s,e),c=[];let h=null,u;return u=a?0:-1,$0(s,e,o,t,!1,n,i,u),K0(s,e,o,t,!1,i,u),t.findIndex(p=>p!==F0&&p!==z0)!==-1&&(u=a?s.geometry.groups.length||1:-1,$0(e,s,l,t,!0,n,i,u),K0(e,s,l,t,!0,i,u)),si.length=0,Vs.length=0,{groups:c,materials:h}}function $0(s,e,t,n,i,r,a,o=0){const l=s.matrixWorld.determinant()<0;ls.copy(e.matrixWorld).invert().multiply(s.matrixWorld),Yl.getNormalMatrix(s.matrixWorld).multiplyScalar(l?-1:1);const c=s.geometry.groupIndices,h=s.geometry.index,u=s.geometry.attributes.position,p=e.geometry.boundsTree,d=e.geometry.index,m=e.geometry.attributes.position,f=t.ids,x=t.intersectionSet;for(let g=0,y=f.length;g0;){const g=FE(f);f.delete(g),d.push(g);const y=3*g,v=h.getX(y+0),b=h.getX(y+1),_=h.getX(y+2);cs.a.fromBufferAttribute(p,v).applyMatrix4(ls),cs.b.fromBufferAttribute(p,b).applyMatrix4(ls),cs.c.fromBufferAttribute(p,_).applyMatrix4(ls);const M=q0(cs,l);Vs.length=0,si.length=0;for(let T=0,R=n.length;T0;){const T=d.pop();for(let R=0;R<3;R++){const S=m.getSiblingTriangleIndex(T,R);S!==-1&&f.has(S)&&(d.push(S),f.delete(S))}if(si.length!==0){const R=3*T,S=h.getX(R+0),E=h.getX(R+1),L=h.getX(R+2),A=a===-1?0:c[T]+a;if(cs.a.fromBufferAttribute(p,S),cs.b.fromBufferAttribute(p,E),cs.c.fromBufferAttribute(p,L),!os(cs))for(let I=0,w=si.length;I{t[n.materialIndex]=e})),t}class XE{constructor(){this.triangleSplitter=new EE,this.attributeData=[],this.attributes=["position","uv","normal"],this.useGroups=!0,this.consolidateGroups=!0,this.debug=new zE}getGroupRanges(e){return!this.useGroups||e.groups.length===0?[{start:0,count:1/0,materialIndex:0}]:e.groups.map(t=>({...t}))}evaluate(e,t,n,i=new Vl){let r=!0;if(Array.isArray(n)||(n=[n]),Array.isArray(i)||(i=[i],r=!1),i.length!==n.length)throw new Error("Evaluator: operations and target array passed as different sizes.");e.prepareGeometry(),t.prepareGeometry();const{triangleSplitter:a,attributeData:o,attributes:l,useGroups:c,consolidateGroups:h,debug:u}=this;for(;o.length{GE(e.geometry,g.geometry,o[y],l)}),u.init(),HE(e,t,n,a,o,{useGroups:c}),u.complete();const p=this.getGroupRanges(e.geometry),d=J0(p,e.material),m=this.getGroupRanges(t.geometry),f=J0(m,t.material);m.forEach(g=>g.materialIndex+=d.length);let x=[...p,...m].map((g,y)=>({...g,index:y}));if(c){const g=[...d,...f];h&&(x=x.map(v=>{const b=g[v.materialIndex];return v.materialIndex=g.indexOf(b),v}).sort((v,b)=>v.materialIndex-b.materialIndex));const y=[];for(let v=0,b=g.length;v{v.material=y})}else x=[{start:0,count:1/0,index:0,materialIndex:0}],i.forEach(g=>{g.material=d[0]});return i.forEach((g,y)=>{const v=g.geometry;WE(v,o[y],x),h&&VE(v.groups)}),r?i:i[0]}evaluateHierarchy(e,t=new Vl){e.updateMatrixWorld(!0);const n=(r,a)=>{const o=r.children;for(let l=0,c=o.length;l{const a=r.children;let o=!1;for(let c=0,h=a.length;c{c?c=this.evaluate(c,h,h.operation):c=this.evaluate(r,h,h.operation)}),r._cachedGeometry=c.geometry,r._cachedMaterials=c.material,!0}else return o||l};return i(e),t.geometry=e._cachedGeometry,t.material=e._cachedMaterials,t}reset(){this.triangleSplitter.reset()}}class jE{engine;planeObjects=[];planes=[];isActive=!1;evaluator;geometryCache=new Map;sectionMeshes=new Map;planeGroup;planeSize=1e3;sourceMeshes=new Map;planeThickness=.01;updateThrottleTime=100;lastUpdateTime=0;pendingUpdate=!1;updateTimer=null;cacheExpireTime=3e4;planeStates=new Map;constructor(e,t={}){this.engine=e,this.evaluator=new XE,this.planeGroup=new ln,this.planeGroup.name="CSG_ClippingPlanes_Optimized",t.updateThrottleTime!==void 0&&(this.updateThrottleTime=t.updateThrottleTime),t.cacheExpireTime!==void 0&&(this.cacheExpireTime=t.cacheExpireTime),t.planeThickness!==void 0&&(this.planeThickness=t.planeThickness),this.evaluator.attributes=["position","normal"],this.evaluator.useGroups=!1}init(){this.calculateSceneSize(),this.engine.scene.add(this.planeGroup),this.planes.forEach((e,t)=>{const n=this.createEmptySectionMesh(e,t);this.planeGroup.add(n),this.sectionMeshes.set(`plane_${t}`,n),this.planeObjects.push(n),this.planeStates.set(t,{constant:e.constant,normal:e.normal.clone()})})}createEmptySectionMesh(e,t){const n=new dt,i=new Ki({color:new Fe(33023),metalness:.1,roughness:.75,side:bt,depthWrite:!0,depthTest:!0,clippingPlanes:this.planes.filter((a,o)=>o!==t)}),r=new rt(n,i);return r.name=`CSG_Section_Optimized_${t}`,r.visible=!1,r.renderOrder=t+1,r}active(){this.isActive=!0,this.requestUpdate(),this.planeObjects.forEach(e=>{e.visible=!0})}disActive(){this.isActive=!1,this.planeObjects.forEach(e=>{e.visible=!1}),this.updateTimer&&(clearTimeout(this.updateTimer),this.updateTimer=null)}setSourceMeshes(e){this.sourceMeshes.clear(),e.forEach(t=>{const n=t.uuid;this.sourceMeshes.set(n,t)}),this.isActive&&this.requestUpdate()}addSourceMesh(e){const t=e.uuid;this.sourceMeshes.has(t)||(this.sourceMeshes.set(t,e),this.isActive&&this.requestUpdate())}removeSourceMesh(e){const t=e.uuid;this.sourceMeshes.delete(t)&&(this.clearMeshCache(t),this.isActive&&this.requestUpdate())}requestUpdate(){if(!this.isActive)return;const e=Date.now(),t=e-this.lastUpdateTime;t>=this.updateThrottleTime?(this.lastUpdateTime=e,this.pendingUpdate=!1):(this.pendingUpdate=!0,this.updateTimer&&clearTimeout(this.updateTimer),this.updateTimer=setTimeout(()=>{this.pendingUpdate&&this.isActive&&(this.lastUpdateTime=Date.now(),this.pendingUpdate=!1),this.updateTimer=null},this.updateThrottleTime-t))}updateAllSections(){this.isActive&&(this.planes.forEach((e,t)=>{if(Math.abs(e.constant)<99999)this.hasPlaneChanged(t,e)&&(this.updateSection(e,t),this.updatePlaneState(t,e));else{const n=this.sectionMeshes.get(`plane_${t}`);n&&(n.visible=!1)}}),this.cleanExpiredCache())}hasPlaneChanged(e,t){const n=this.planeStates.get(e);if(!n)return!0;const i=Math.abs(n.constant-t.constant)>1e-4,r=!n.normal.equals(t.normal);return i||r}updatePlaneState(e,t){this.planeStates.set(e,{constant:t.constant,normal:t.normal.clone()})}getPlaneHash(e){const t=e.normal,n=e.constant;return`${t.x.toFixed(4)}_${t.y.toFixed(4)}_${t.z.toFixed(4)}_${n.toFixed(4)}`}getCacheKey(e,t){return`${e}_plane_${t}`}updateSection(e,t){const n=this.sectionMeshes.get(`plane_${t}`);if(!n)return;const i=this.getPlaneHash(e),r=[];if(this.sourceMeshes.forEach((a,o)=>{const l=this.getCacheKey(o,t),c=this.geometryCache.get(l);if(c&&c.planeHash===i)r.push(c.geometry.clone()),c.timestamp=Date.now();else try{const h=this.createPlaneBrush(e),u=new Vl(a.geometry);a.updateMatrixWorld(!0),u.matrix.copy(a.matrixWorld),u.updateMatrixWorld();const p=this.evaluator.evaluate(h,u,O0);p&&p.geometry.attributes.position.count>0?(r.push(p.geometry),this.geometryCache.set(l,{geometry:p.geometry.clone(),planeHash:i,timestamp:Date.now()})):this.geometryCache.delete(l)}catch(h){console.warn(`CSG intersection failed for mesh ${o}:`,h)}}),r.length>0){const a=this.mergeGeometries(r);n.geometry&&n.geometry.dispose(),n.geometry=a,n.visible=!0,n.position.set(0,0,0),n.rotation.set(0,0,0),n.scale.set(1,1,1),n.updateMatrixWorld()}else n.visible=!1;r.forEach(a=>a.dispose())}clearMeshCache(e){const t=[];this.geometryCache.forEach((n,i)=>{i.startsWith(e)&&(n.geometry.dispose(),t.push(i))}),t.forEach(n=>this.geometryCache.delete(n))}cleanExpiredCache(){const e=Date.now(),t=[];this.geometryCache.forEach((n,i)=>{e-n.timestamp>this.cacheExpireTime&&(n.geometry.dispose(),t.push(i))}),t.forEach(n=>this.geometryCache.delete(n))}clearAllCache(){this.geometryCache.forEach(e=>{e.geometry.dispose()}),this.geometryCache.clear()}createPlaneBrush(e){const t=new Zi(this.planeSize,this.planeThickness,this.planeSize);t.translate(0,e.constant,0),t.applyQuaternion(new zn().setFromUnitVectors(new P(0,-1,0),e.normal));const n=new rt(t),i=new Vl(t);return i.matrix.copy(n.matrixWorld),i.updateMatrixWorld(),i}mergeGeometries(e){if(e.length===1)return e[0].clone();const t=new dt,n=[],i=[],r=[];let a=0;return e.forEach(o=>{const l=o.attributes.position,c=o.attributes.normal;for(let h=0;h0?t.setAttribute("normal",new jt(i,3)):t.computeVertexNormals(),r.length>0&&t.setIndex(r),t}calculateSceneSize(){const e=new gt;if(this.engine.scene.traverse(t=>{if(t.isMesh&&t.geometry){const n=new gt().setFromObject(t);e.union(n)}}),e.isEmpty())this.planeSize=1e3;else{const t=e.getSize(new P),n=Math.max(t.x,t.y,t.z);this.planeSize=n*3}}update(){this.isActive&&this.pendingUpdate&&!this.updateTimer&&this.requestUpdate()}dispose(){this.updateTimer&&(clearTimeout(this.updateTimer),this.updateTimer=null),this.clearAllCache(),this.planeObjects.forEach(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(t=>t.dispose()):e.material.dispose())}),this.sectionMeshes.clear(),this.planeObjects=[],this.sourceMeshes.clear(),this.planeGroup.parent&&this.planeGroup.parent.remove(this.planeGroup)}setSectionColor(e){this.planeObjects.forEach(t=>{t.material instanceof Ki&&t.material.color.set(e)})}getCacheStats(){return{cacheSize:this.geometryCache.size,sourceMeshCount:this.sourceMeshes.size,sectionMeshCount:this.sectionMeshes.size}}setPlaneThickness(e){if(e<=0){console.warn("Plane thickness must be positive");return}this.planeThickness=e,this.clearAllCache(),this.isActive&&this.requestUpdate()}getPlaneThickness(){return this.planeThickness}showSections(){this.sectionMeshes.forEach(e=>{e.geometry?.attributes.position?.count&&e.geometry.attributes.position.count>0&&(e.visible=!0)})}hideSections(){this.sectionMeshes.forEach(e=>{e.visible=!1})}showSection(){this.planeGroup.visible=!0}hideSection(){this.planeGroup.visible=!1}toggleSectionsVisibility(){let e=!1;return this.sectionMeshes.forEach(t=>{t.visible&&(e=!0)}),e?(this.hideSections(),!1):(this.showSections(),!0)}toggleSectionVisibility(e){const t=this.sectionMeshes.get(`plane_${e}`);return t?(t.visible=!t.visible,t.visible):!1}}class qE{engine;isActive=!1;box;pickPoint;pickNormal;pickMesh;box_;plane;meshs;isDrag=!1;maxBox;csgClipping=null;useCsgClipping=!1;constructor(e,t){this.engine=e,this.meshs=[],t?.useCsgClipping!==void 0&&(this.useCsgClipping=t.useCsgClipping),this.useCsgClipping&&this.initCsgClipping()}initCsgClipping(){this.csgClipping=new jE(this.engine,{updateThrottleTime:150,cacheExpireTime:45e3}),this.csgClipping.planes=this.engine.sectionPlane,this.csgClipping.init()}active(){this.isActive||(this.engine.handelBehaved.init(this),this.engine.handelBehaved.active(),this.engine.scene.children.filter(e=>e.type=="Group"&&e.name=="ClippingBox").forEach(e=>{e.children.forEach(t=>{t.name.includes("face")||(t.visible=!0)})}),this.isActive=!0,this.init())}disActive(){this.init(),this.isActive=!1,this.engine.handelBehaved.disActive(),this.csgClipping&&this.csgClipping.disActive(),this.engine.scene.children.filter(e=>e.type=="Group"&&e.name=="ClippingBox").forEach(e=>{e.children.forEach(t=>{t.name.includes("face")||(t.visible=!1)})}),this.engine.interactionModule.init(),this.engine.interactionModule.active()}disabled(){this.isActive=!1,this.engine.handelBehaved.disActive(),this.engine.interactionModule.init(),this.engine.interactionModule.active(),this.engine.scene.children.filter(e=>e.type=="Group"&&e.name=="ClippingBox").forEach(e=>{e.children.forEach(t=>{t.name.includes("face")||(t.visible=!1)})})}recover(){this.isActive||(this.engine.handelBehaved.init(this),this.engine.handelBehaved.active(),this.engine.scene.children.filter(e=>e.type=="Group"&&e.name=="ClippingBox").forEach(e=>{e.children.forEach(t=>{t.name.includes("face")||(t.visible=!0)})}),this.isActive=!0)}init(){let e=this.engine.octreeBox.getBoundingBox();this.maxBox=JSON.parse(JSON.stringify(e)),this.box=e,this.updata_face(e)}getboxXyz(){return{minX:this.box.min.x,minY:this.box.min.y,minZ:this.box.min.z,maxX:this.box.max.x,maxY:this.box.max.y,maxZ:this.box.max.z}}setboxXyz(e){this.box.min.x=e.minX,this.box.min.y=e.minY,this.box.min.z=e.minZ,this.box.max.x=e.maxX,this.box.max.y=e.maxY,this.box.max.z=e.maxZ,this.updata_face(this.box)}setBox(e){this.box=e,this.updata_face(e)}reverseBox(){}handleMouseDown(e){this.isDrag=!0;const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0)if(this.pickPoint=t[0].point,this.pickNormal=t[0].face.normal,this.engine.controls.enabled=!1,this.pickMesh=t[0].object,this.box_={min:this.box.min.clone(),max:this.box.max.clone()},this.pickNormal.y==0){const n=new Dt;n.setFromNormalAndCoplanarPoint(new P(0,1,0),this.pickPoint),this.plane=n}else{let n=new P(this.engine.camera.position.x,this.pickPoint.y,this.engine.camera.position.z);const i=new Dt;i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1),this.pickPoint),this.plane=i}}handleMouseUp(e){this.isDrag=!1,this.pickPoint=null,this.pickNormal=null,this.pickMesh=null,this.engine.controls.enabled=!0,this.csgClipping&&this.isActive}handleMouseMove(e){this.meshs.forEach(n=>{n.material.opacity=0});const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0&&(t[0].object.material.opacity=.05),this.pickPoint!=null){const n=new P;if(e.raycaster.ray.intersectPlane(this.plane,n)){let i=n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());this.pickMesh.name=="前"||this.pickMesh.name=="左"||this.pickMesh.name=="底"?this.box.min=this.box_.min.clone().add(this.pickNormal.clone().setLength(i)):this.box.max=this.box_.max.clone().add(this.pickNormal.clone().setLength(i)),this.updata_face(this.box),this.calculate_ratio()}}}calculate_ratio(){let e=this.maxBox.max.x-this.maxBox.min.x,t=this.maxBox.max.y-this.maxBox.min.y,n=this.maxBox.max.z-this.maxBox.min.z,i=(this.box.min.x-this.maxBox.min.x)/e*100,r=(this.box.max.x-this.maxBox.min.x)/e*100,a=(this.box.min.y-this.maxBox.min.y)/t*100,o=(this.box.max.y-this.maxBox.min.y)/t*100,l=(this.box.min.z-this.maxBox.min.z)/n*100,c=(this.box.max.z-this.maxBox.min.z)/n*100;i<0&&(i=0),r<0&&(r=0),a<0&&(a=0),o<0&&(o=0),l<0&&(l=0),c<0&&(c=0),i>100&&(i=100),r>100&&(r=100),a>100&&(a=100),o>100&&(o=100),l>100&&(l=100),c>100&&(c=100);let h={x:{min:i,max:r},y:{min:a,max:o},z:{min:l,max:c}};this.engine.events.trigger(Yt.SectionMove,h)}updata_face(e){let t=this,n=[new P(e.min.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.min.x,e.max.y,e.min.z)],i=[new P(e.min.x,e.min.y,e.max.z),new P(e.max.x,e.min.y,e.max.z),new P(e.max.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.max.z)],r=[new P(e.max.x,e.min.y,e.max.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.max.z)],a=[new P(e.min.x,e.min.y,e.min.z),new P(e.min.x,e.min.y,e.max.z),new P(e.min.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.min.z)],o=[new P(e.min.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.max.z)],l=[new P(e.min.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.max.z),new P(e.min.x,e.min.y,e.max.z)];c(n,new P(0,0,-1),"前"),c(i,new P(0,0,1),"后"),c(r,new P(1,0,0),"右"),c(a,new P(-1,0,0),"左"),c(o,new P(0,1,0),"顶"),c(l,new P(0,-1,0),"底");function c(h,u,p){const d=new dt,m=new Float32Array([h[0].x,h[0].y,h[0].z,h[1].x,h[1].y,h[1].z,h[2].x,h[2].y,h[2].z,h[3].x,h[3].y,h[3].z]),f=[0,1,2,0,2,3];d.setAttribute("position",new yt(m,3)),d.setIndex(f);let x=t.engine.scene.children.find(M=>M.type=="Group"&&M.name=="ClippingBox");x==null&&(x=new ln,x.name="ClippingBox",t.engine.scene.add(x));let g=t.meshs.find(M=>M.name==p);if(g==null){const M=new Ht({color:65280,transparent:!0,opacity:0,side:bt});M.polygonOffset=!0,M.polygonOffsetFactor=1,M.polygonOffsetUnits=4;const T=new rt(d,M);T.normal=u,T.name=p,x.add(T),t.meshs.push(T)}else g.geometry=d;const y=new Float32Array([h[0].x,h[0].y,h[0].z,h[1].x,h[1].y,h[1].z,h[2].x,h[2].y,h[2].z,h[3].x,h[3].y,h[3].z,h[0].x,h[0].y,h[0].z]);let v=new Ms({color:255}),b=new dt;b.setAttribute("position",new yt(y,3));let _=t.meshs.find(M=>M.name==p+"Line");_==null&&(_=new $i(b,v),_.name=p+"Line",x.add(_),t.meshs.push(_)),_.geometry=b,_.material=v,p=="前"||p=="左"||p=="底"?t.engine.sectionPlane.find(M=>M.name==p).setFromNormalAndCoplanarPoint(u.clone().setLength(-1),e.min):t.engine.sectionPlane.find(M=>M.name==p).setFromNormalAndCoplanarPoint(u.clone().setLength(-1),e.max),t.engine.scene.children.filter(M=>M.type=="Mesh"&&M.url).forEach(M=>{M.material&&Array.isArray(M.material)?M.material.forEach(T=>{T.clippingPlanes=t.engine.sectionPlane}):M.material.clippingPlanes=t.engine.sectionPlane})}}}class ZE{engine;isActive=!1;isDrag=!1;meshs=[];box;pickPoint;pickNormal;pickMesh;box_;plane;angleX=0;angleY=0;angleZ=0;direction=1;normal=new P(0,0,1);distance=0;center=null;current_center=null;constructor(e){this.engine=e,this.meshs=[],this.box=null}active(){if(this.isActive==!0)return;this.isActive=!0,this.engine.scene.children.filter(t=>t.type=="Group"&&t.name=="ClippingBox").forEach(t=>{t.children.forEach(n=>{n.name.includes("face")&&(n.visible=!0)})}),this.engine.handelBehaved.init(this),this.engine.handelBehaved.active();let e=this;e.engine.scene.children.filter(t=>t.type=="Mesh"&&t.url).forEach(t=>{t.material&&Array.isArray(t.material)?t.material.forEach(n=>{n.clippingPlanes=e.engine.sectionPlane}):t.material.clippingPlanes=e.engine.sectionPlane,e.engine.clipping.clippingStencil?.addMesh(e.engine.sectionPlane.find(n=>n.name=="face"),t)}),this.init()}disActive(){this.init(),this.isActive=!1,this.engine.handelBehaved.disActive();const e=this.engine.sectionPlane.find(t=>t.name=="face");e&&(e.constant=1e5),this.engine.scene.children.filter(t=>t.type=="Group"&&t.name=="ClippingBox").forEach(t=>{t.children.forEach(n=>{n.name.includes("face")&&(n.visible=!1)})})}init(){let e=this.engine.octreeBox.getBoundingBox();this.box=e,this.updata_face(0)}disabled(){this.isActive=!1,this.engine.handelBehaved.disActive(),this.engine.interactionModule.init(),this.engine.interactionModule.active(),this.engine.scene.children.filter(e=>e.type=="Group"&&e.name=="ClippingBox").forEach(e=>{e.children.forEach(t=>{t.name.includes("face")&&(t.visible=!1)})})}recover(){this.isActive||(this.engine.handelBehaved.init(this),this.engine.handelBehaved.active(),this.engine.scene.children.filter(e=>e.type=="Group"&&e.name=="ClippingBox").forEach(e=>{e.children.forEach(t=>{t.name.includes("face")&&(t.visible=!0)})}),this.isActive=!0)}setFaceAngle(e,t,n){this.angleX=e,this.angleY=t,this.angleZ=n,this.normal=new P(0,1,0).applyAxisAngle(new P(1,0,0),e).applyAxisAngle(new P(0,0,1),t).applyAxisAngle(new P(0,1,0),n),this.normal.normalize(),this.updata_face(0)}setFaceNormal(e,t=0){this.normal=e,this.distance=t,this.updata_face(t)}reverse(){this.direction=this.direction*-1,this.updata_face(this.distance)}getFaceAngle(){return{angleX:this.angleX,angleY:this.angleY,angleZ:this.angleZ,direction:this.direction}}updata_face(e){let t=this,n=t.engine.scene.children.find(R=>R.type=="Group"&&R.name=="ClippingBox");n==null&&(n=new ln,n.name="ClippingBox",t.engine.scene.add(n));let i=new P(1,0,0),r=new P(0,1,0),a=new P(0,0,1),o,l,c=this.normal.clone().normalize(),h=Math.abs(c.dot(i)),u=Math.abs(c.dot(r)),p=Math.abs(c.dot(a));h<=u&&h<=p?o=i:u<=h&&u<=p?o=r:o=a,o=o.clone().sub(c.clone().multiplyScalar(o.dot(c))).normalize(),l=new P().crossVectors(c,o).normalize();let d=null;this.center==null?(d=new P((this.box.min.x+this.box.max.x)/2,(this.box.min.y+this.box.max.y)/2,(this.box.min.z+this.box.max.z)/2),this.center=d.clone()):d=this.center.clone();let m=this.box.max.x-this.box.min.x,f=this.box.max.y-this.box.min.y,x=this.box.max.z-this.box.min.z,g=Math.max(Math.abs(o.x)*m,Math.abs(o.y)*f,Math.abs(o.z)*x),y=Math.max(Math.abs(l.x)*m,Math.abs(l.y)*f,Math.abs(l.z)*x),v=d.clone().add(o.clone().multiplyScalar(-g/2)).add(l.clone().multiplyScalar(-y/2)),b=d.clone().add(o.clone().multiplyScalar(g/2)).add(l.clone().multiplyScalar(-y/2)),_=d.clone().add(o.clone().multiplyScalar(g/2)).add(l.clone().multiplyScalar(y/2)),M=d.clone().add(o.clone().multiplyScalar(-g/2)).add(l.clone().multiplyScalar(y/2));v.add(c.clone().multiplyScalar(e)),b.add(c.clone().multiplyScalar(e)),_.add(c.clone().multiplyScalar(e)),M.add(c.clone().multiplyScalar(e)),this.current_center=d.clone().add(c.clone().multiplyScalar(e)),T([v,b,_,M],c,"face");function T(R,S,E){const L=new dt,A=new Float32Array([R[0].x,R[0].y,R[0].z,R[1].x,R[1].y,R[1].z,R[2].x,R[2].y,R[2].z,R[3].x,R[3].y,R[3].z]),I=[0,1,2,0,2,3];L.setAttribute("position",new yt(A,3)),L.setIndex(I);let w=t.meshs.find(q=>q.name==E);if(w==null){const q=new Ht({color:65280,transparent:!0,opacity:.02,side:bt});q.polygonOffset=!0,q.polygonOffsetFactor=1,q.polygonOffsetUnits=4;const ie=new rt(L,q);ie.normal=S,ie.name=E,n.add(ie),t.meshs.push(ie)}else w.geometry=L;const z=new Float32Array([R[0].x,R[0].y,R[0].z,R[1].x,R[1].y,R[1].z,R[2].x,R[2].y,R[2].z,R[3].x,R[3].y,R[3].z,R[0].x,R[0].y,R[0].z]);let G=new Ms({color:255}),j=new dt;j.setAttribute("position",new yt(z,3));let Y=t.meshs.find(q=>q.name==E+"Line");Y==null&&(Y=new $i(j,G),Y.name=E+"Line",n.add(Y),t.meshs.push(Y)),Y.geometry=j,Y.material=G,t.engine.sectionPlane.find(q=>q.name==E).setFromNormalAndCoplanarPoint(S.clone().setLength(t.direction),R[0])}}handleMouseDown(e){this.isDrag=!0;const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0)if(this.pickPoint=t[0].point,this.pickNormal=t[0].face.normal,this.engine.controls.enabled=!1,this.pickMesh=t[0].object,this.box_={min:this.box.min.clone(),max:this.box.max.clone()},this.center=this.current_center.clone(),this.pickNormal.y==0){const n=new Dt;n.setFromNormalAndCoplanarPoint(new P(0,1,0),this.pickPoint),this.plane=n}else{let n=new P(this.engine.camera.position.x,this.pickPoint.y,this.engine.camera.position.z);const i=new Dt;i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1),this.pickPoint),this.plane=i}}handleMouseUp(e){this.isDrag=!1,this.pickPoint=null,this.pickNormal=null,this.pickMesh=null,this.engine.controls.enabled=!0}handleMouseMove(e){this.meshs.forEach(n=>{n.material.opacity=0});const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0&&(t[0].object.material.opacity=.05),this.pickPoint!=null){const n=new P;if(e.raycaster.ray.intersectPlane(this.plane,n)){let i=n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());this.distance=i,this.updata_face(this.distance)}}}}class YE{engine;callback_;constructor(e){this.engine=e}init(){this.engine.handelBehaved.init(this,{showCatch:!0}),this.engine.handelBehaved.active()}catch_face(e){this.callback_=e}handleMouseMove(e){}handleMouseClick(e){let t=e.catch.normal;this.engine.handelBehaved.disActive(),this.callback_({dir:t,position:e.catch.point})}}class $E{engine;sectionBox;sectionFace;clippingStencil;currentClippingMode="";constructor(e){this.engine=e;let t=new Dt(new P(0,0,1),1e5);t.name="前";let n=new Dt(new P(0,0,1),1e5);n.name="左";let i=new Dt(new P(0,0,1),1e5);i.name="后";let r=new Dt(new P(0,0,1),1e5);r.name="右";let a=new Dt(new P(0,0,1),1e5);a.name="顶";let o=new Dt(new P(0,0,1),1e5);o.name="底";let l=new Dt(new P(0,0,1),1e5);l.name="face",this.engine.sectionPlane=[t,n,i,r,a,o,l]}init(){this.sectionBox=new qE(this.engine),this.sectionFace=new ZE(this.engine)}scaleBox(){let e=this.engine.octreeBox.getBoundingBox();this.sectionBox.setBox(e)}clippingModel(e){let t=[];e.forEach(r=>{let a=this.engine.models.find(o=>o.url===r.url);r.ids.forEach(o=>{a.nodesMap.get(o).infos.forEach(l=>{t.push(l.box)})})}),this.active("box");let n=i(t);this.sectionBox.setBox(n);function i(r){let a=new P(1e8,1e9,1e10),o=new P(-1e8,-1e9,-1e10);return r.forEach(l=>{l.min.xo.x&&(o.x=l.max.x),l.max.y>o.y&&(o.y=l.max.y),l.max.z>o.z&&(o.z=l.max.z)}),new gt(a,o)}}updateClippingValue(e){let t=this.sectionBox.maxBox,n=t.min.x+(t.max.x-t.min.x)*e.x.min*.01,i=t.min.y+(t.max.y-t.min.y)*e.y.min*.01,r=t.min.z+(t.max.z-t.min.z)*e.z.min*.01,a=t.min.x+(t.max.x-t.min.x)*e.x.max*.01,o=t.min.y+(t.max.y-t.min.y)*e.y.max*.01,l=t.min.z+(t.max.z-t.min.z)*e.z.max*.01;this.sectionBox.setboxXyz({minX:n,minY:i,minZ:r,maxX:a,maxY:o,maxZ:l})}active(e){if(this.sectionFace.disActive(),this.sectionBox.disActive(),this.currentClippingMode=e,e=="x")this.sectionFace.init(),this.sectionFace.active(),this.sectionFace.setFaceAngle(Math.PI/2,0,0);else if(e=="y")this.sectionFace.init(),this.sectionFace.active(),this.sectionFace.setFaceAngle(0,Math.PI/2,0);else if(e=="z")this.sectionFace.init(),this.sectionFace.active(),this.sectionFace.setFaceAngle(0,0,Math.PI/2);else if(e=="box")this.sectionBox.init(),this.sectionBox.active();else if(e=="face"){let t=new YE(this.engine);t.init(),t.catch_face(n=>{this.sectionFace.init(),this.sectionFace.active();let i=this.engine.octreeBox.getBoundingBox(),r=n.position.clone().sub(i.min.clone().add(i.max.clone()).setLength(.5)),a=new P(n.dir.x,n.dir.y,n.dir.z),o=r.dot(a);this.sectionFace.setFaceNormal(n.dir,o)})}}disabled(){this.currentClippingMode=="box"?this.sectionBox.disabled():this.sectionFace.disabled()}recover(){this.currentClippingMode=="box"?this.sectionBox.recover():this.sectionFace.recover()}reverse(){this.sectionFace.reverse()}disActive(){this.sectionFace.disActive(),this.sectionBox.disActive(),this.currentClippingMode=""}}class KE{engine;constructor(e){this.engine=e}getLevelTreeData(){let e=[];return this.engine.engineStatus.models.forEach(t=>{e.push({children:t.info.modelTree.modelTreeLevel,name:t.info.baseInfo.name,url:t.url})}),e}getTypeTreeData(){let e=[];return this.engine.engineStatus.models.forEach(t=>{e.push({children:t.info.modelTree.modelTreeType,name:t.info.baseInfo.name,url:t.url})}),e}getMajorTreeData(){let e=[];return this.engine.engineStatus.models.forEach(t=>{e.push({children:t.info.modelTree.modelTreeMajor,name:t.info.baseInfo.name,url:t.url})}),e}}class JE{engine;constructor(e){this.engine=e}getEngineInfo(){let e=0,t=0,n=0;return!this.engine||!this.engine.scene?{totalVertices:0,totalTriangles:0,meshCount:0}:(this.engine.scene.traverse(i=>{if(i instanceof rt){const r=i.geometry;if(r&&r.attributes){const a=r.attributes.position;if(a){const o=a.count;e+=o;let l=0;r.index?l=r.index.count/3:l=o/3,t+=l}}}}),this.engine.engineStatus.models.forEach(i=>{n=n+i.info.modelEdge.length}),{totalVertices:Math.floor(e),totalTriangles:Math.floor(t),meshCount:n})}}class QE{engine;constructor(e){this.engine=e}init(){}getModelProperties(e,t,n){let i=this.engine.engineStatus.models.find(a=>a.url===e);i.properties==null&&Wm(e+"/property",a=>{let o=JSON.parse(a);i.properties=o,setTimeout(()=>{r(o,t,n)},100)}),r(i.properties,t,n);function r(a,o,l){let c=[],h=a.models[o.toString()||""],u=h.map(p=>p[0]);u=u.filter((p,d)=>u.indexOf(p)===d),u.forEach(p=>{let d={name:a.categorys[p],children:[]};c.push(d),h.filter(m=>m[0]===p).forEach(m=>{d.children.push({name:a.names[m[1]],value:a.values[m[2]]})})}),l?.({properties:c,materials:c})}}}class eT{engine;constructor(e){this.engine=e}getModelTypes(){let e=[];return this.engine.engineStatus.models.forEach(t=>{t.info.modelMapper.forEach(n=>{e.push(n.typeName)})}),e=e.filter((t,n,i)=>i.indexOf(t)===n),e}getModelMajors(){let e=[];return this.engine.engineStatus.models.forEach(t=>{t.info.modelMapper.forEach(n=>{e.push(n.majorName)})}),e=e.filter((t,n,i)=>i.indexOf(t)===n),e}getModelLevels(){let e=[];return this.engine.engineStatus.models.forEach(t=>{t.info.modelMapper.forEach(n=>{e.push(n.levelName)})}),e=e.filter((t,n,i)=>i.indexOf(t)===n),e}getModelMappers(e){}getModelMapper(e,t){let n=this.engine.engineStatus.models.find(i=>i.url==e);return n?n.info.modelMapper.find(i=>i.id==t):null}getModelsWithLevelType(e,t,n=null){let i=[];return this.engine.engineStatus.models.forEach(r=>{let a={url:r.url,ids:[]};i.push(a),r.info.modelMapper.filter(o=>o.levelName===e&&o.typeName===t).forEach(o=>{a.ids.push(Number(o.id))})}),n&&n(i),i}getModelsWithType(e,t=null){let n=[];return this.engine.engineStatus.models.forEach(i=>{let r={url:i.url,ids:[]};n.push(r),i.info.modelMapper.filter(a=>a.typeName===e).forEach(a=>{r.ids.push(Number(a.id))})}),t&&t(n),n}getModelsWithLevel(e,t){let n=[];return this.engine.engineStatus.models.forEach(i=>{let r={url:i.url,ids:[]};n.push(r),i.info.modelMapper.filter(a=>a.levelName===e).forEach(a=>{r.ids.push(Number(a.id))})}),t&&t(n),n}getModelsWithMajor(e,t){let n=[];return this.engine.engineStatus.models.forEach(i=>{let r={url:i.url,ids:[]};n.push(r),i.info.modelMapper.filter(a=>a.majorName===e).forEach(a=>{r.ids.push(Number(a.id))})}),t&&t(n),n}}class tT{engine;isActive=!1;groupEdge;material;modelEdgeLoaded=!1;indexes=new Map;constructor(e){this.engine=e,this.groupEdge=this.engine.scene.getObjectByName("groupEdge"),this.material=new Ms({color:"#000000",depthTest:!0,transparent:!0,opacity:.3}),this.material.clippingPlanes=this.engine.sectionPlane}active(){this.isActive=!0,this.groupEdge.visible=!0,this.engine.scene.traverse(e=>{e.isMesh&&e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(t=>{t.polygonOffset=!0,t.polygonOffsetFactor=1,t.polygonOffsetUnits=4})}),this.show()}disActive(){this.isActive=!1,this.groupEdge.visible=!1,this.engine.scene.traverse(e=>{e.isMesh&&e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(t=>{t.polygonOffset=!1})})}loadModelEdge(){this.modelEdgeLoaded||(this.engine.engineStatus.models.forEach(e=>{if(!this.groupEdge.children.find(t=>t.url==e.url)){let t=e.info,n=[],i=new Map;t.modelEdge.forEach(r=>{let a=n.length;for(let o=0;o{let n=[];e.forEach((a,o)=>{a[2].forEach((l,c)=>{l.length==2&&(n.push(l[0].X),n.push(l[0].Z),n.push(-l[0].Y),n.push(l[1].X),n.push(l[1].Z),n.push(-l[1].Y))})});let i=new dt;i.setAttribute("position",new jt(n,3));let r=new Hp(i,this.material);r.url=t,this.groupEdge.add(r)})}getModelEdge(e,t){let n=this.indexes.get(e);if(n){let i=n.get(t);if(i)return i.slice()}return null}hideModelEdge(e,t){let n=this.indexes.get(e);if(n){let i=n.get(t);if(i){let[r,a,o]=i,l=this.groupEdge.children.find(c=>c.url==e);if(l){let c=l.geometry.attributes.position.array;for(let h=r;hc.url==e);if(l){let c=l.geometry.attributes.position.array,h=0;for(let u=r;u=3;if(o[p]&&o[p].length===2){const m=d?o[p][1]:o[p][0];c[u]=m.X,c[u+1]=m.Z,c[u+2]=-m.Y}h+=3}l.geometry.attributes.position.needsUpdate=!0}}}}}class nT{config;constructor(e){this.config={temperature:.7,maxTokens:2e4,timeout:3e5,...e}}async chat(e){const t=new AbortController,n=setTimeout(()=>t.abort(),this.config.timeout);try{const i=await fetch(`${this.config.baseURL}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify({model:this.config.model,messages:e,temperature:this.config.temperature,max_tokens:this.config.maxTokens,stream:!1}),signal:t.signal});if(clearTimeout(n),!i.ok){const r=await i.json().catch(()=>({}));throw new Error(`API请求失败 (${i.status}): ${r.error?.message||r.message||i.statusText}`)}return(await i.json()).choices?.[0]?.message?.content||""}catch(i){throw clearTimeout(n),i.name==="AbortError"?new Error("请求超时,请重试"):i.message.includes("Failed to fetch")?new Error(`网络请求失败,请检查: +`):" "+Um(a[0]):"as no adapter specified";throw new Ke("There is no suitable adapter to dispatch the request "+o,"ERR_NOT_SUPPORT")}return i}const Om={getAdapter:AM,adapters:bu};function yu(s){if(s.cancelToken&&s.cancelToken.throwIfRequested(),s.signal&&s.signal.aborted)throw new Br(null,s)}function zm(s){return yu(s),s.headers=Mn.from(s.headers),s.data=vu.call(s,s.transformRequest),["post","put","patch"].indexOf(s.method)!==-1&&s.headers.setContentType("application/x-www-form-urlencoded",!1),Om.getAdapter(s.adapter||Ra.adapter,s)(s).then(function(e){return yu(s),e.data=vu.call(s,s.transformResponse,e),e.headers=Mn.from(e.headers),e},function(e){return Sm(e)||(yu(s),e&&e.response&&(e.response.data=vu.call(s,s.transformResponse,e.response),e.response.headers=Mn.from(e.response.headers))),Promise.reject(e)})}const Fm="1.13.2",bl={};["object","boolean","number","function","string","symbol"].forEach((s,e)=>{bl[s]=function(t){return typeof t===s||"a"+(e<1?"n ":" ")+s}});const Hm={};bl.transitional=function(s,e,t){function n(i,r){return"[Axios v"+Fm+"] Transitional option '"+i+"'"+r+(t?". "+t:"")}return(i,r,a)=>{if(s===!1)throw new Ke(n(r," has been removed"+(e?" in "+e:"")),Ke.ERR_DEPRECATED);return e&&!Hm[r]&&(Hm[r]=!0,console.warn(n(r," has been deprecated since v"+e+" and will be removed in the near future"))),s?s(i,r,a):!0}},bl.spelling=function(s){return(e,t)=>(console.warn(`${t} is likely a misspelling of ${s}`),!0)};function PM(s,e,t){if(typeof s!="object")throw new Ke("options must be an object",Ke.ERR_BAD_OPTION_VALUE);const n=Object.keys(s);let i=n.length;for(;i-- >0;){const r=n[i],a=e[r];if(a){const o=s[r],l=o===void 0||a(o,r,s);if(l!==!0)throw new Ke("option "+r+" must be "+l,Ke.ERR_BAD_OPTION_VALUE);continue}if(t!==!0)throw new Ke("Unknown option "+r,Ke.ERR_BAD_OPTION)}}const yl={assertOptions:PM,validators:bl},di=yl.validators;let Ds=class{constructor(s){this.defaults=s||{},this.interceptors={request:new ym,response:new ym}}async request(s,e){try{return await this._request(s,e)}catch(t){if(t instanceof Error){let n={};Error.captureStackTrace?Error.captureStackTrace(n):n=new Error;const i=n.stack?n.stack.replace(/^.+\n/,""):"";try{t.stack?i&&!String(t.stack).endsWith(i.replace(/^.+\n.+\n/,""))&&(t.stack+=` +`+i):t.stack=i}catch{}}throw t}}_request(s,e){typeof s=="string"?(e=e||{},e.url=s):e=s||{},e=Ls(this.defaults,e);const{transitional:t,paramsSerializer:n,headers:i}=e;t!==void 0&&yl.assertOptions(t,{silentJSONParsing:di.transitional(di.boolean),forcedJSONParsing:di.transitional(di.boolean),clarifyTimeoutError:di.transitional(di.boolean)},!1),n!=null&&(re.isFunction(n)?e.paramsSerializer={serialize:n}:yl.assertOptions(n,{encode:di.function,serialize:di.function},!0)),e.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?e.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:e.allowAbsoluteUrls=!0),yl.assertOptions(e,{baseUrl:di.spelling("baseURL"),withXsrfToken:di.spelling("withXSRFToken")},!0),e.method=(e.method||this.defaults.method||"get").toLowerCase();let r=i&&re.merge(i.common,i[e.method]);i&&re.forEach(["delete","get","head","post","put","patch","common"],d=>{delete i[d]}),e.headers=Mn.concat(r,i);const a=[];let o=!0;this.interceptors.request.forEach(function(d){typeof d.runWhen=="function"&&d.runWhen(e)===!1||(o=o&&d.synchronous,a.unshift(d.fulfilled,d.rejected))});const l=[];this.interceptors.response.forEach(function(d){l.push(d.fulfilled,d.rejected)});let c,h=0,u;if(!o){const d=[zm.bind(this),void 0];for(d.unshift(...a),d.push(...l),u=d.length,c=Promise.resolve(e);h{if(!n._listeners)return;let r=n._listeners.length;for(;r-- >0;)n._listeners[r](i);n._listeners=null}),this.promise.then=i=>{let r;const a=new Promise(o=>{n.subscribe(o),r=o}).then(i);return a.cancel=function(){n.unsubscribe(r)},a},e(function(i,r,a){n.reason||(n.reason=new Br(i,r,a),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=n=>{e.abort(n)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;return{token:new gg(function(t){e=t}),cancel:e}}};function LM(s){return function(e){return s.apply(null,e)}}function DM(s){return re.isObject(s)&&s.isAxiosError===!0}const _u={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(_u).forEach(([s,e])=>{_u[e]=s});function Vm(s){const e=new Ds(s),t=sm(Ds.prototype.request,e);return re.extend(t,Ds.prototype,e,{allOwnKeys:!0}),re.extend(t,e,null,{allOwnKeys:!0}),t.create=function(n){return Vm(Ls(s,n))},t}const It=Vm(Ra);It.Axios=Ds,It.CanceledError=Br,It.CancelToken=RM,It.isCancel=Sm,It.VERSION=Fm,It.toFormData=ml,It.AxiosError=Ke,It.Cancel=It.CanceledError,It.all=function(s){return Promise.all(s)},It.spread=LM,It.isAxiosError=DM,It.mergeConfig=Ls,It.AxiosHeaders=Mn,It.formToJSON=s=>Mm(re.isHTMLForm(s)?new FormData(s):s),It.getAdapter=Om.getAdapter,It.HttpStatusCode=_u,It.default=It;const{Axios:e4,AxiosError:t4,CanceledError:n4,isCancel:i4,CancelToken:s4,VERSION:r4,all:a4,Cancel:o4,isAxiosError:l4,spread:c4,toFormData:h4,AxiosHeaders:u4,HttpStatusCode:d4,formToJSON:p4,getAdapter:f4,mergeConfig:m4}=It;function Gm(s,e){var t;if(window.XMLHttpRequest?t=new XMLHttpRequest:window.ActiveXObject?t=new window.ActiveXObject:alert("请升级至最新版本的浏览器"),t!=null){let n=s;t.open("GET",n,!0),t.send(null),t.onreadystatechange=function(){t.readyState==4&&t.status==200&&(t.responseText.includes("",0)&&t.responseText.includes("",0)&&t.responseText.includes("",0)?e(null):e(t.responseText))},t.onloadend=function(){t.readyState==4&&t.status==404&&t.status==502&&e(null)}}}function IM(s,e){It({method:"get",responseType:"blob",url:s}).then(t=>{let n=new window.File([t.data],"zipFolder",{type:"zip"});im.loadAsync(n).then(i=>{const r=new Map,a=[];for(let o in i.files){if(i.files[o].dir)continue;const l=i.file(i.files[o].name);if(l){const c=l.async("blob").then(h=>{const u=URL.createObjectURL(h);r.set("/"+i.files[o].name.replace("\\","/"),u)});a.push(c)}}Promise.all(a).then(()=>{e(r)}).catch(o=>{console.error("解压zip文件失败:",o),e(new Map)})}).catch(i=>{console.error("加载zip文件失败:",i),e(new Map)})}).catch(t=>{console.error("下载zip文件失败:",t),e(new Map)})}function Wm(s,e){It({method:"get",responseType:"blob",url:s}).then(n=>{let i=new window.File([n.data],"semantics",{type:"zip"});im.loadAsync(i).then(r=>{for(let a in r.files)r.file(r.files[a].name).async("blob").then(o=>{t(o,"utf-8",function(l,c){e(c)})})})});function t(n,i,r){var a=new FileReader,o=new Blob([n]);a.onload=function(l){r(null,l.target.result)},a.onerror=function(l){r(l.error,null)},a.readAsText(o,i)}}const Mu=new WeakMap;class NM extends Ji{constructor(e){super(e),this.decoderPath="",this.decoderConfig={},this.decoderBinary=null,this.decoderPending=null,this.workerLimit=4,this.workerPool=[],this.workerNextTaskID=1,this.workerSourceURL="",this.defaultAttributeIDs={position:"POSITION",normal:"NORMAL",color:"COLOR",uv:"TEX_COORD"},this.defaultAttributeTypes={position:"Float32Array",normal:"Float32Array",color:"Float32Array",uv:"Float32Array"}}setDecoderPath(e){return this.decoderPath=e,this}setDecoderConfig(e){return this.decoderConfig=e,this}setWorkerLimit(e){return this.workerLimit=e,this}load(e,t,n,i){const r=new Ma(this.manager);r.setPath(this.path),r.setResponseType("arraybuffer"),r.setRequestHeader(this.requestHeader),r.setWithCredentials(this.withCredentials),r.load(e,a=>{this.parse(a,t,i)},n,i)}parse(e,t,n=()=>{}){this.decodeDracoFile(e,t,null,null,Rt,n).catch(n)}decodeDracoFile(e,t,n,i,r=en,a=()=>{}){const o={attributeIDs:n||this.defaultAttributeIDs,attributeTypes:i||this.defaultAttributeTypes,useUniqueIDs:!!n,vertexColorSpace:r};return this.decodeGeometry(e,o).then(t).catch(a)}decodeGeometry(e,t){const n=JSON.stringify(t);if(Mu.has(e)){const l=Mu.get(e);if(l.key===n)return l.promise;if(e.byteLength===0)throw new Error("THREE.DRACOLoader: Unable to re-decode a buffer with different settings. Buffer has already been transferred.")}let i;const r=this.workerNextTaskID++,a=e.byteLength,o=this._getWorker(r,a).then(l=>(i=l,new Promise((c,h)=>{i._callbacks[r]={resolve:c,reject:h},i.postMessage({type:"decode",id:r,taskConfig:t,buffer:e},[e])}))).then(l=>this._createGeometry(l.geometry));return o.catch(()=>!0).then(()=>{i&&r&&this._releaseTask(i,r)}),Mu.set(e,{key:n,promise:o}),o}_createGeometry(e){const t=new dt;e.index&&t.setIndex(new bt(e.index.array,1));for(let n=0;n{n.load(e,i,void 0,r)})}preload(){return this._initDecoder(),this}_initDecoder(){if(this.decoderPending)return this.decoderPending;const e=typeof WebAssembly!="object"||this.decoderConfig.type==="js",t=[];return e?t.push(this._loadLibrary("draco_decoder.js","text")):(t.push(this._loadLibrary("draco_wasm_wrapper.js","text")),t.push(this._loadLibrary("draco_decoder.wasm","arraybuffer"))),this.decoderPending=Promise.all(t).then(n=>{const i=n[0];e||(this.decoderConfig.wasmBinary=n[1]);const r=BM.toString(),a=["/* draco decoder */",i,"","/* worker */",r.substring(r.indexOf("{")+1,r.lastIndexOf("}"))].join(` +`);this.workerSourceURL=URL.createObjectURL(new Blob([a]))}),this.decoderPending}_getWorker(e,t){return this._initDecoder().then(()=>{if(this.workerPool.lengthr._taskLoad?-1:1});const n=this.workerPool[this.workerPool.length-1];return n._taskCosts[e]=t,n._taskLoad+=t,n})}_releaseTask(e,t){e._taskLoad-=e._taskCosts[t],delete e._callbacks[t],delete e._taskCosts[t]}debug(){console.log("Task load: ",this.workerPool.map(e=>e._taskLoad))}dispose(){for(let e=0;e{const u=h.draco,p=new u.Decoder;try{const d=t(u,p,new Int8Array(l),c),m=d.attributes.map(f=>f.array.buffer);d.index&&m.push(d.index.array.buffer),self.postMessage({type:"decode",id:o.id,geometry:d},m)}catch(d){console.error(d),self.postMessage({type:"error",id:o.id,error:d.message})}finally{u.destroy(p)}});break}};function t(a,o,l,c){const h=c.attributeIDs,u=c.attributeTypes;let p,d;const m=o.GetEncodedGeometryType(l);if(m===a.TRIANGULAR_MESH)p=new a.Mesh,d=o.DecodeArrayToMesh(l,l.byteLength,p);else if(m===a.POINT_CLOUD)p=new a.PointCloud,d=o.DecodeArrayToPointCloud(l,l.byteLength,p);else throw new Error("THREE.DRACOLoader: Unexpected geometry type.");if(!d.ok()||p.ptr===0)throw new Error("THREE.DRACOLoader: Decoding failed: "+d.error_msg());const f={index:null,attributes:[]};for(const x in h){const g=self[u[x]];let b,v;if(c.useUniqueIDs)v=h[x],b=o.GetAttributeByUniqueId(p,v);else{if(v=o.GetAttributeId(p,a[h[x]]),v===-1)continue;b=o.GetAttribute(p,v)}const y=i(a,o,p,x,g,b);x==="color"&&(y.vertexColorSpace=c.vertexColorSpace),f.attributes.push(y)}return m===a.TRIANGULAR_MESH&&(f.index=n(a,o,p)),a.destroy(p),f}function n(a,o,l){const c=l.num_faces()*3,h=c*4,u=a._malloc(h);o.GetTrianglesUInt32Array(l,h,u);const p=new Uint32Array(a.HEAPF32.buffer,u,c).slice();return a._free(u),{array:p,itemSize:1}}function i(a,o,l,c,h,u){const p=l.num_points(),d=u.num_components(),m=r(a,h),f=d*h.BYTES_PER_ELEMENT,x=Math.ceil(f/4)*4,g=x/h.BYTES_PER_ELEMENT,b=p*f,v=p*x,y=a._malloc(b);o.GetAttributeDataArrayForAllPoints(l,u,m,b,y);const _=new h(a.HEAPF32.buffer,y,b/h.BYTES_PER_ELEMENT);let M;if(f===x)M=_.slice();else{M=new h(v/h.BYTES_PER_ELEMENT);let C=0;for(let R=0,S=_.length;R(s.ModelLoadStart="model-load-start",s.ModelLoadProgress="model-load-progress",s.ModelLoaded="model-loaded",s.ModelError="model-error",s.SelectionChanged="selection-changed",s.HoverChanged="hover-changed",s.Click="click",s.MouseMove="mouse-move",s.CameraChanged="camera-changed",s.CameraIdle="camera-idle",s.ViewportResize="viewport-resize",s.EngineFree="engine-free",s.EngineBusy="engine-busy",s.MeasureChanged="measure-changed",s.SectionMove="section-move",s))(ts||{});function kM(s,e,t,n){let i=0,r=0,a=0,o=s.models.find(d=>d.url==t),l=e.circularMeps,c=e.rectMeps.filter(d=>d.type==="风管"),h=e.rectMeps.filter(d=>d.type==="桥架"),u=e.ellipseMeps,p=s.scene;if(new Ht,new dt,l&&l.length){let d=[],m=0;for(let f of l)f.color=f.color.split(",").map(x=>parseInt(x)/255),f.color=new Fe(f.color[0],f.color[1],f.color[2]),f.position={x:f.startPoint.X*.3048+i,y:f.startPoint.Z*.3048+r,z:-f.startPoint.Y*.3048+a},f.rotation={x:0,y:0,z:0},f.indexes=[[s.scene.children.length,m++,0,0]],o.nodesMap.set(Number(f.id),f),d.push(f);_l("Circle",p,d,t)}if(c&&c.length){let d=[],m=0;for(let f of c)f.color=f.color.split(",").map(x=>parseInt(x)/255),f.color=new Fe(f.color[0],f.color[1],f.color[2]),f.position={x:f.startPoint.X*.3048+i,y:f.startPoint.Z*.3048+r,z:-f.startPoint.Y*.3048+a},f.rotation={x:0,y:0,z:0},f.indexes=[[s.scene.children.length,m++,0,0]],o.nodesMap.set(Number(f.id),f),d.push(f);_l("Rect",p,d,t)}if(u&&u.length){let d=[],m=0;for(let f of u)f.color=f.color.split(",").map(x=>parseInt(x)/255),f.color=new Fe(f.color[0],f.color[1],f.color[2]),f.position={x:f.startPoint.X*.3048+i,y:f.startPoint.Z*.3048+r,z:-f.startPoint.Y*.3048+a},f.rotation={x:0,y:0,z:0},f.indexes=[[s.scene.children.length,m++,0,0]],o.nodesMap.set(Number(f.id),f),d.push(f);_l("Ellipse",p,d,t)}if(h&&h.length){let d=[],m=0;for(let f of h)f.color=f.color.split(",").map(x=>parseInt(x)/255),f.color=new Fe(f.color[0],f.color[1],f.color[2]),f.position={x:f.startPoint.X*.3048+i,y:f.startPoint.Z*.3048+r,z:-f.startPoint.Y*.3048+a},f.rotation={x:0,y:0,z:0},f.indexes=[[s.scene.children.length,m++,0,0]],o.nodesMap.set(Number(f.id),f),d.push(f);_l("Bridge",p,d,t)}}function _l(s,e,t,n,i){let r,a,o={width:1,height:1,length:1,diameter:1,color:new Fe,position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0}};switch(s){case"Rect":a=Ml("Rect",o);break;case"Bridge":a=Ml("Bridge",o);break;case"Circle":a=Ml("Circle",o);break;case"Ellipse":a=Ml("Ellipse",o);break}a&&(r=new Ut(a.geometry,a.material,t.length),r.url=n,e.add(r));let l=[],c=[];for(var h=0;hd.endPoint.Z?1:-1)*Math.PI*.5,d.base_x!=null){var u=new P(d.base_x.X,0,-d.base_x.Y);v=(u.clone().cross(new P(0,0,1)).y<=0?1:-1)*u.angleTo(new P(0,0,1))+Math.PI*.5}}else v=(f.clone().sub(m.clone()).cross(new P(0,0,1)).y>0?-1:1)*f.clone().sub(m.clone()).angleTo(new P(0,0,1)),b=(d.startPoint.Z>d.endPoint.Z?1:-1)*f.clone().sub(m.clone()).angleTo(g.clone().sub(x.clone()));let _=new De;const M=new Pn(b,v,y,"YXZ");let C=_.clone().makeRotationFromEuler(M),R,S;s==="Circle"?(R=d.diameter,S=d.diameter):(R=d.width,S=d.height);let E=_.clone().makeScale(R,S,d.length);_.multiplyMatrices(C,E),_.setPosition(d.position.x,d.position.y,d.position.z),r.setMatrixAt(h,_.clone()),r.setColorAt(h,d.color),r.geometry.computeBoundingBox();let L=r.geometry.boundingBox.min.clone().applyMatrix4(_.clone()),A=r.geometry.boundingBox.max.clone().applyMatrix4(_.clone()),I=new P(Math.min(L.x,A.x),Math.min(L.y,A.y),Math.min(L.z,A.z)),w=new P(Math.max(L.x,A.x),Math.max(L.y,A.y),Math.max(L.z,A.z)),z=I.clone().add(w.clone()).multiplyScalar(.5),G={name:d.name,min:I,max:w,center:z,dbid:h,materialName:a.material.name},j=null,Y=null;s==="Circle"&&(j={x:d.startPoint.X*.3048,y:d.startPoint.Z*.3048,z:-d.startPoint.Y*.3048},Y={x:d.endPoint.X*.3048,y:d.endPoint.Z*.3048,z:-d.endPoint.Y*.3048},G.minC=j,G.maxC=Y),r.ids||(r.ids=[]),r.matrixs||(r.matrixs=[]),r.matrixs.push(_.clone()),c.push(_.clone()),r.ids.push(Number(d.id)),l.push(G)}r.castShadow=!0,r.ElementInfos=l,r.name="rootModel",r.TypeName="InstancedMesh-Pipe",r.PipeType=s,r.MeshId=null,r.realMaterial=r.material.clone(),r.originalMaterial=r.material.clone(),r.materialClone=c;let p=[];p={geometry:r.geometry,matrix:r.matrix,position:r.position,rotation:r.rotation},r.meshs=p,r.instanceMatrix&&r.instanceMatrix.array&&(r.cloneInstanceMatrix=Array.from(r.instanceMatrix.array))}function Ml(s,e,t){let n=new Qp;switch(e.width=e.width*.3048,e.height=e.height*.3048,e.diameter=e.diameter*.3048,s){case"Rect":n.moveTo(-e.width/2,-e.height/2),n.lineTo(-e.width/2,e.height/2),n.lineTo(e.width/2,e.height/2),n.lineTo(e.width/2,-e.height/2),n.lineTo(-e.width/2,-e.height/2);break;case"Ellipse":n.moveTo(-e.width/2,-e.height/2),n.lineTo(-e.width/2,e.height/2),n.lineTo(e.width/2,e.height/2),n.lineTo(e.width/2,-e.height/2),n.lineTo(-e.width/2,-e.height/2);break;case"Bridge":n.moveTo(-e.width/2,-e.height/2),n.lineTo(-e.width/2,e.height/2),n.lineTo(-e.width/2+.01,e.height/2),n.lineTo(-e.width/2+.01,-e.height/2+.01),n.lineTo(e.width/2-.01,-e.height/2+.01),n.lineTo(e.width/2-.01,e.height/2),n.lineTo(e.width/2,e.height/2),n.lineTo(e.width/2,-e.height/2),n.lineTo(-e.width/2,-e.height/2);break;case"Circle":n.moveTo(0,0),n.absarc(0,0,e.diameter*.5,0,Math.PI*2,!1);break}const i={depth:e.length*.3048,bevelEnabled:!1};return r(n,i,e.color,e.position,e.rotation);function r(a,o,l,c,h){let u=new Hh(a,o),p=new Ki({color:l,side:yt}),d=new rt(u,p);return d.position.set(c.x,c.y,c.z),d.rotation._order="YXZ",d.rotation.set(h.x,h.y,h.z),d}}function Xm(s,e=!1){const t=s[0].index!==null,n=new Set(Object.keys(s[0].attributes)),i=new Set(Object.keys(s[0].morphAttributes)),r={},a={},o=s[0].morphTargetsRelative,l=new dt;let c=0;for(let h=0;h=2.0 are supported."));return}const c=new gw(r,{path:t||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});c.fileLoader.setRequestHeader(this.requestHeader);for(let h=0;h=0&&o[u]===void 0&&console.warn('THREE.GLTFLoader: Unknown extension "'+u+'".')}}c.setExtensions(a),c.setPlugins(o),c.parse(n,i)}parseAsync(e,t){const n=this;return new Promise(function(i,r){n.parse(e,t,i,r)})}}function OM(){let s={};return{get:function(e){return s[e]},add:function(e,t){s[e]=t},remove:function(e){delete s[e]},removeAll:function(){s={}}}}const nt={KHR_BINARY_GLTF:"KHR_binary_glTF",KHR_DRACO_MESH_COMPRESSION:"KHR_draco_mesh_compression",KHR_LIGHTS_PUNCTUAL:"KHR_lights_punctual",KHR_MATERIALS_CLEARCOAT:"KHR_materials_clearcoat",KHR_MATERIALS_DISPERSION:"KHR_materials_dispersion",KHR_MATERIALS_IOR:"KHR_materials_ior",KHR_MATERIALS_SHEEN:"KHR_materials_sheen",KHR_MATERIALS_SPECULAR:"KHR_materials_specular",KHR_MATERIALS_TRANSMISSION:"KHR_materials_transmission",KHR_MATERIALS_IRIDESCENCE:"KHR_materials_iridescence",KHR_MATERIALS_ANISOTROPY:"KHR_materials_anisotropy",KHR_MATERIALS_UNLIT:"KHR_materials_unlit",KHR_MATERIALS_VOLUME:"KHR_materials_volume",KHR_TEXTURE_BASISU:"KHR_texture_basisu",KHR_TEXTURE_TRANSFORM:"KHR_texture_transform",KHR_MESH_QUANTIZATION:"KHR_mesh_quantization",KHR_MATERIALS_EMISSIVE_STRENGTH:"KHR_materials_emissive_strength",EXT_MATERIALS_BUMP:"EXT_materials_bump",EXT_TEXTURE_WEBP:"EXT_texture_webp",EXT_TEXTURE_AVIF:"EXT_texture_avif",EXT_MESHOPT_COMPRESSION:"EXT_meshopt_compression",EXT_MESH_GPU_INSTANCING:"EXT_mesh_gpu_instancing"};class zM{constructor(e){this.parser=e,this.name=nt.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){const e=this.parser,t=this.parser.json.nodes||[];for(let n=0,i=t.length;n=0)throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures");return null}return t.loadTextureImage(e,r.source,a)}}class QM{constructor(e){this.parser=e,this.name=nt.EXT_TEXTURE_WEBP}loadTexture(e){const t=this.name,n=this.parser,i=n.json,r=i.textures[e];if(!r.extensions||!r.extensions[t])return null;const a=r.extensions[t],o=i.images[a.source];let l=n.textureLoader;if(o.uri){const c=n.options.manager.getHandler(o.uri);c!==null&&(l=c)}return n.loadTextureImage(e,a.source,l)}}class ew{constructor(e){this.parser=e,this.name=nt.EXT_TEXTURE_AVIF}loadTexture(e){const t=this.name,n=this.parser,i=n.json,r=i.textures[e];if(!r.extensions||!r.extensions[t])return null;const a=r.extensions[t],o=i.images[a.source];let l=n.textureLoader;if(o.uri){const c=n.options.manager.getHandler(o.uri);c!==null&&(l=c)}return n.loadTextureImage(e,a.source,l)}}class tw{constructor(e){this.name=nt.EXT_MESHOPT_COMPRESSION,this.parser=e}loadBufferView(e){const t=this.parser.json,n=t.bufferViews[e];if(n.extensions&&n.extensions[this.name]){const i=n.extensions[this.name],r=this.parser.getDependency("buffer",i.buffer),a=this.parser.options.meshoptDecoder;if(!a||!a.supported){if(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files");return null}return r.then(function(o){const l=i.byteOffset||0,c=i.byteLength||0,h=i.count,u=i.byteStride,p=new Uint8Array(o,l,c);return a.decodeGltfBufferAsync?a.decodeGltfBufferAsync(h,u,p,i.mode,i.filter).then(function(d){return d.buffer}):a.ready.then(function(){const d=new ArrayBuffer(h*u);return a.decodeGltfBuffer(new Uint8Array(d),h,u,p,i.mode,i.filter),d})})}else return null}}class nw{constructor(e){this.name=nt.EXT_MESH_GPU_INSTANCING,this.parser=e}createNodeMesh(e){const t=this.parser.json,n=t.nodes[e];if(!n.extensions||!n.extensions[this.name]||n.mesh===void 0)return null;const i=t.meshes[n.mesh];for(const l of i.primitives)if(l.mode!==Gn.TRIANGLES&&l.mode!==Gn.TRIANGLE_STRIP&&l.mode!==Gn.TRIANGLE_FAN&&l.mode!==void 0)return null;const r=n.extensions[this.name].attributes,a=[],o={};for(const l in r)a.push(this.parser.getDependency("accessor",r[l]).then(c=>(o[l]=c,o[l])));return a.length<1?null:(a.push(this.parser.createNodeMesh(e)),Promise.all(a).then(l=>{const c=l.pop(),h=c.isGroup?c.children:[c],u=l[0].count,p=[];for(const d of h){const m=new De,f=new P,x=new zn,g=new P(1,1,1),b=new Ut(d.geometry,d.material,u);for(let v=0;v0||s.search(/^data\:image\/jpeg/)===0?"image/jpeg":s.search(/\.webp($|\?)/i)>0||s.search(/^data\:image\/webp/)===0?"image/webp":s.search(/\.ktx2($|\?)/i)>0||s.search(/^data\:image\/ktx2/)===0?"image/ktx2":"image/png"}const mw=new De;class gw{constructor(e={},t={}){this.json=e,this.extensions={},this.plugins={},this.options=t,this.cache=new OM,this.associations=new Map,this.primitiveCache={},this.nodeCache={},this.meshCache={refs:{},uses:{}},this.cameraCache={refs:{},uses:{}},this.lightCache={refs:{},uses:{}},this.sourceCache={},this.textureCache={},this.nodeNamesUsed={};let n=!1,i=-1,r=!1,a=-1;if(typeof navigator<"u"){const o=navigator.userAgent;n=/^((?!chrome|android).)*safari/i.test(o)===!0;const l=o.match(/Version\/(\d+)/);i=n&&l?parseInt(l[1],10):-1,r=o.indexOf("Firefox")>-1,a=r?o.match(/Firefox\/([0-9]+)\./)[1]:-1}typeof createImageBitmap>"u"||n&&i<17||r&&a<98?this.textureLoader=new Gh(this.options.manager):this.textureLoader=new sv(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new Ma(this.options.manager),this.fileLoader.setResponseType("arraybuffer"),this.options.crossOrigin==="use-credentials"&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,t){const n=this,i=this.json,r=this.extensions;this.cache.removeAll(),this.nodeCache={},this._invokeAll(function(a){return a._markDefs&&a._markDefs()}),Promise.all(this._invokeAll(function(a){return a.beforeRoot&&a.beforeRoot()})).then(function(){return Promise.all([n.getDependencies("scene"),n.getDependencies("animation"),n.getDependencies("camera")])}).then(function(a){const o={scene:a[0][i.scene||0],scenes:a[0],animations:a[1],cameras:a[2],asset:i.asset,parser:n,userData:{}};return Is(r,o,i),pi(o,i),Promise.all(n._invokeAll(function(l){return l.afterRoot&&l.afterRoot(o)})).then(function(){for(const l of o.scenes)l.updateMatrixWorld();e(o)})}).catch(t)}_markDefs(){const e=this.json.nodes||[],t=this.json.skins||[],n=this.json.meshes||[];for(let i=0,r=t.length;i{const l=this.associations.get(a);l!=null&&this.associations.set(o,l);for(const[c,h]of a.children.entries())r(h,o.children[c])};return r(n,i),i.name+="_instance_"+e.uses[t]++,i}_invokeOne(e){const t=Object.values(this.plugins);t.push(this);for(let n=0;n=2&&x.setY(S,M[C*l+1]),l>=3&&x.setZ(S,M[C*l+2]),l>=4&&x.setW(S,M[C*l+3]),l>=5)throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}x.normalized=m}return x})}loadTexture(e){const t=this.json,n=this.options,i=t.textures[e].source,r=t.images[i];let a=this.textureLoader;if(r.uri){const o=n.manager.getHandler(r.uri);o!==null&&(a=o)}return this.loadTextureImage(e,i,a)}loadTextureImage(e,t,n){const i=this,r=this.json,a=r.textures[e],o=r.images[t],l=(o.uri||o.bufferView)+":"+a.sampler;if(this.textureCache[l])return this.textureCache[l];const c=this.loadImageSource(t,n).then(function(h){h.flipY=!1,h.name=a.name||o.name||"",h.name===""&&typeof o.uri=="string"&&o.uri.startsWith("data:image/")===!1&&(h.name=o.uri);const u=(r.samplers||{})[a.sampler]||{};return h.magFilter=Km[u.magFilter]||Pt,h.minFilter=Km[u.minFilter]||ai,h.wrapS=Jm[u.wrapS]||Cn,h.wrapT=Jm[u.wrapT]||Cn,h.generateMipmaps=!h.isCompressedTexture&&h.minFilter!==Xt&&h.minFilter!==Pt,i.associations.set(h,{textures:e}),h}).catch(function(){return null});return this.textureCache[l]=c,c}loadImageSource(e,t){const n=this,i=this.json,r=this.options;if(this.sourceCache[e]!==void 0)return this.sourceCache[e].then(u=>u.clone());const a=i.images[e],o=self.URL||self.webkitURL;let l=a.uri||"",c=!1;if(a.bufferView!==void 0)l=n.getDependency("bufferView",a.bufferView).then(function(u){c=!0;const p=new Blob([u],{type:a.mimeType});return l=o.createObjectURL(p),l});else if(a.uri===void 0)throw new Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");const h=Promise.resolve(l).then(function(u){return new Promise(function(p,d){let m=p;t.isImageBitmapLoader===!0&&(m=function(f){const x=new Ft(f);x.needsUpdate=!0,p(x)}),t.load(Sa.resolveURL(u,r.path),m,void 0,d)})}).then(function(u){return c===!0&&o.revokeObjectURL(l),pi(u,a),u.userData.mimeType=a.mimeType||fw(a.uri),u}).catch(function(u){throw console.error("THREE.GLTFLoader: Couldn't load texture",l),u});return this.sourceCache[e]=h,h}assignTexture(e,t,n,i){const r=this;return this.getDependency("texture",n.index).then(function(a){if(!a)return null;if(n.texCoord!==void 0&&n.texCoord>0&&(a=a.clone(),a.channel=n.texCoord),r.extensions[nt.KHR_TEXTURE_TRANSFORM]){const o=n.extensions!==void 0?n.extensions[nt.KHR_TEXTURE_TRANSFORM]:void 0;if(o){const l=r.associations.get(a);a=r.extensions[nt.KHR_TEXTURE_TRANSFORM].extendTexture(a,o),r.associations.set(a,l)}}return i!==void 0&&(a.colorSpace=i),e[t]=a,a})}assignFinalMaterial(e){const t=e.geometry;let n=e.material;const i=t.attributes.tangent===void 0,r=t.attributes.color!==void 0,a=t.attributes.normal===void 0;if(e.isPoints){const o="PointsMaterial:"+n.uuid;let l=this.cache.get(o);l||(l=new Vp,Rn.prototype.copy.call(l,n),l.color.copy(n.color),l.map=n.map,l.sizeAttenuation=!1,this.cache.add(o,l)),n=l}else if(e.isLine){const o="LineBasicMaterial:"+n.uuid;let l=this.cache.get(o);l||(l=new Ms,Rn.prototype.copy.call(l,n),l.color.copy(n.color),l.map=n.map,this.cache.add(o,l)),n=l}if(i||r||a){let o="ClonedMaterial:"+n.uuid+":";i&&(o+="derivative-tangents:"),r&&(o+="vertex-colors:"),a&&(o+="flat-shading:");let l=this.cache.get(o);l||(l=n.clone(),r&&(l.vertexColors=!0),a&&(l.flatShading=!0),i&&(l.normalScale&&(l.normalScale.y*=-1),l.clearcoatNormalScale&&(l.clearcoatNormalScale.y*=-1)),this.cache.add(o,l),this.associations.set(l,this.associations.get(n))),n=l}e.material=n}getMaterialType(){return Ki}loadMaterial(e){const t=this,n=this.json,i=this.extensions,r=n.materials[e];let a;const o={},l=r.extensions||{},c=[];if(l[nt.KHR_MATERIALS_UNLIT]){const u=i[nt.KHR_MATERIALS_UNLIT];a=u.getMaterialType(),c.push(u.extendParams(o,r,t))}else{const u=r.pbrMetallicRoughness||{};if(o.color=new Fe(1,1,1),o.opacity=1,Array.isArray(u.baseColorFactor)){const p=u.baseColorFactor;o.color.setRGB(p[0],p[1],p[2],en),o.opacity=p[3]}u.baseColorTexture!==void 0&&c.push(t.assignTexture(o,"map",u.baseColorTexture,Rt)),o.metalness=u.metallicFactor!==void 0?u.metallicFactor:1,o.roughness=u.roughnessFactor!==void 0?u.roughnessFactor:1,u.metallicRoughnessTexture!==void 0&&(c.push(t.assignTexture(o,"metalnessMap",u.metallicRoughnessTexture)),c.push(t.assignTexture(o,"roughnessMap",u.metallicRoughnessTexture))),a=this._invokeOne(function(p){return p.getMaterialType&&p.getMaterialType(e)}),c.push(Promise.all(this._invokeAll(function(p){return p.extendMaterialParams&&p.extendMaterialParams(e,o)})))}r.doubleSided===!0&&(o.side=yt);const h=r.alphaMode||Eu.OPAQUE;if(h===Eu.BLEND?(o.transparent=!0,o.depthWrite=!1):(o.transparent=!1,h===Eu.MASK&&(o.alphaTest=r.alphaCutoff!==void 0?r.alphaCutoff:.5)),r.normalTexture!==void 0&&a!==Ht&&(c.push(t.assignTexture(o,"normalMap",r.normalTexture)),o.normalScale=new he(1,1),r.normalTexture.scale!==void 0)){const u=r.normalTexture.scale;o.normalScale.set(u,u)}if(r.occlusionTexture!==void 0&&a!==Ht&&(c.push(t.assignTexture(o,"aoMap",r.occlusionTexture)),r.occlusionTexture.strength!==void 0&&(o.aoMapIntensity=r.occlusionTexture.strength)),r.emissiveFactor!==void 0&&a!==Ht){const u=r.emissiveFactor;o.emissive=new Fe().setRGB(u[0],u[1],u[2],en)}return r.emissiveTexture!==void 0&&a!==Ht&&c.push(t.assignTexture(o,"emissiveMap",r.emissiveTexture,Rt)),Promise.all(c).then(function(){const u=new a(o);return r.name&&(u.name=r.name),pi(u,r),t.associations.set(u,{materials:e}),r.extensions&&Is(i,u,r),u})}createUniqueName(e){const t=ut.sanitizeNodeName(e||"");return t in this.nodeNamesUsed?t+"_"+ ++this.nodeNamesUsed[t]:(this.nodeNamesUsed[t]=0,t)}loadGeometries(e){const t=this,n=this.extensions,i=this.primitiveCache;function r(o){return n[nt.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(o,t).then(function(l){return Qm(l,o,t)})}const a=[];for(let o=0,l=e.length;o0&&dw(g,r),g.name=t.createUniqueName(r.name||"mesh_"+e),pi(g,r),x.extensions&&Is(i,g,x),t.assignFinalMaterial(g),u.push(g)}for(let d=0,m=u.length;d1?h=new ln:c.length===1?h=c[0]:h=new Et,h!==c[0])for(let u=0,p=c.length;u1){const u=i.associations.get(h);i.associations.set(h,{...u})}return i.associations.get(h).nodes=e,h}),this.nodeCache[e]}loadScene(e){const t=this.extensions,n=this.json.scenes[e],i=this,r=new ln;n.name&&(r.name=i.createUniqueName(n.name)),pi(r,n),n.extensions&&Is(t,r,n);const a=n.nodes||[],o=[];for(let l=0,c=a.length;l{const u=new Map;for(const[p,d]of i.associations)(p instanceof Rn||p instanceof Ft)&&u.set(p,d);return h.traverse(p=>{const d=i.associations.get(p);d!=null&&u.set(p,d)}),u};return i.associations=c(r),r})}_createAnimationTracks(e,t,n,i,r){const a=[],o=e.name?e.name:e.uuid,l=[];ns[r.path]===ns.weights?e.traverse(function(p){p.morphTargetInfluences&&l.push(p.name?p.name:p.uuid)}):l.push(o);let c;switch(ns[r.path]){case ns.weights:c=Sr;break;case ns.rotation:c=Er;break;case ns.translation:case ns.scale:c=Tr;break;default:switch(n.itemSize){case 1:c=Sr;break;case 2:case 3:default:c=Tr;break}break}const h=i.interpolation!==void 0?cw[i.interpolation]:ea,u=this._getArrayFromAccessor(n);for(let p=0,d=l.length;p{let r=JSON.parse(i);s.engineStatus.models.push({type:"light",info:r,name:r.baseInfo.name,status:"loading",url:e,elements:new Map}),s.models==null&&(s.models=[]),s.models.push({url:e,nodesMap:new Map,boundingBox:{min:new P(r.baseInfo.min.X*.3048,r.baseInfo.min.Z*.3048,-r.baseInfo.min.Y*.3048),max:new P(r.baseInfo.max.X*.3048,r.baseInfo.max.Z*.3048,-r.baseInfo.max.Y*.3048)}}),s.events.trigger(ts.EngineFree,e)})}function bw(s,e){s.engineStatus.models.filter(t=>e==null||t.url==e).forEach(t=>{t.loadStatus==null&&(t.loadStatus={mep:!1,instance:!1,normal:!1}),t.status==="loading"&&t.type==="light"&&(t.loadStatus.modelMep!=!0&&(t.loadStatus.modelMep=!0,kM(s,t.info.modelMep,t.url)),t.loadStatus.normal!=!0&&yw(s,t))})}function yw(s,e){if(s.camera.position,e.size,e.info==null||e.info.lods==null)return;e.info.lods.forEach(n=>{if(n.status!=!0)if(n.glbs==null)console.log("加载GLB............."),n.glbs={},IM(e.url+n.path,i=>{Gm(i.get("/nodes.json"),r=>{let a=JSON.parse(r);s.models.find(c=>c.url==e.url).nodesMap==null&&(s.models.find(c=>c.url==e.url).nodesMap=new Map);let o=s.models.find(c=>c.url==e.url).nodesMap,l=0;for(let c in a){a[c].forEach(p=>{p.glb=c,o.has(p.id)==!1?o.set(p.id,{infos:[p]}):o.get(p.id).infos.push(p)});let h=new UM;const u=new NM;u.setDecoderPath("/draco/"),u.preload(),h.setDRACOLoader(u),h.load(i.get(c+".glb"),p=>{n.glbs[c]=p.scene.children,n.glbs[c].forEach(d=>{d.geometry.computeVertexNormals()}),l++,l==Object.keys(a).length&&s.engineStatus.isFree&&(s.events.trigger(ts.EngineFree,e.url),s.viewCube.CameraGoHome())})}Gm(i.get("/instances.json"),c=>{let h=JSON.parse(c);s.models.find(u=>u.url==e.url).instanceNodes=h})})});else{let i=t(e,n,n.octreeBox),r=[],a=s.models.find(l=>l.url==e.url);i.forEach(l=>{a.nodesMap.has(l)&&a.nodesMap.get(l).infos.forEach(c=>{let h=n.glbs[c.glb][c.mesh];if(h!=null&&h.geometry!=null&&h.material!=null){let u=new De;u.elements=c.matrix;let p=new rt(h.geometry.clone().applyMatrix4(u),h.material),d=new gt().setFromObject(p);c.box=d,c.mesh=p,p.name=l,p.glb=c.glb,p.url=e.url,h.geometry.attributes.position!=null&&r.push(p)}})}),_w(e.url,s,r);let o=a.instanceNodes;if(o!=null)for(let l in o)(o[l].isLoaded==null||o[l].isLoaded==!1)&&(o[l].isLoaded=!0,o[l].forEach(c=>{if(n.glbs[l]!=null){let h=n.glbs[l][c.mesh];Mw(e.url,c.mesh,s,h,c.children)}}))}});function t(n,i,r){let a=[];if(r.status!=!0){if(!s.engineStatus.isFree)return a;let o=new P(r.min.X,r.min.Z,-r.min.Y),l=new P(r.max.X,r.max.Z,-r.max.Y);l.distanceTo(o);let c=s.camera.position,h=new P(o.x+l.x/2,o.y+l.y/2,o.z+l.z/2);c.distanceTo(h),r.elements.forEach(u=>{a.push(u)}),r.children.forEach(u=>{a.push(...t(n,i,u))}),r.children.findIndex(u=>u.status!=!0)==-1&&(r.status=!0),r.children.length==0&&(r.status=!0)}return a}}function _w(s,e,t){let n=[];t.forEach(i=>{n.findIndex(a=>a.glb==i.glb)==-1?n.push({glb:i.glb,meshes:[i],currentIndex:i.geometry.index.count,indexes:new Map}):(n.find(a=>a.glb==i.glb).meshes.push(i),n.find(a=>a.glb==i.glb).currentIndex+=i.geometry.index.count);let r=n.find(a=>a.glb==i.glb);r.indexes.set(Number(i.name),[r.currentIndex-i.geometry.index.count,r.currentIndex])}),n.forEach(i=>{let r=e.scene.children.find(a=>a instanceof rt&&a.url==s&&a.glb==i.glb);if(r!=null)r.castShadow=!0,r.receiveShadow=!0;else{let a=new dt,o=ww(i.meshes[0].material);a=Xm(i.meshes.map(h=>h.geometry),!1);let l=new rt(a,o);l.castShadow=!0,l.receiveShadow=!0,e.scene.add(l),l.index=e.scene.children.length-1,l.url=s,l.glb=i.glb,l.indexes=i.indexes,l.materialClone=o,l.geometrys=i.meshes.map(h=>h.geometry);let c=e.models.find(h=>h.url==s);if(c!=null){let h=0;i.indexes.forEach(u=>{c.nodesMap.get(Number(i.meshes[h].name)).indexes==null&&(c.nodesMap.get(Number(i.meshes[h].name)).indexes=[]),c.nodesMap.get(Number(i.meshes[h].name)).indexes.push([l.index,h++,u[0],u[1]])})}}})}function Mw(s,e,t,n,i){if(n==null)return;let r=new Ut(n.geometry,n.material,i.length);t.scene.add(r);const a=new Float32Array(i.length*3);for(let l=0;lu.url==s).nodesMap.has(c.id)?(t.models.find(u=>u.url==s).nodesMap.get(c.id).indexes==null&&(t.models.find(u=>u.url==s).nodesMap.get(c.id).indexes=[]),t.models.find(u=>u.url==s).nodesMap.get(c.id).indexes.push([t.scene.children.length-1,l,0,0])):t.models.find(u=>u.url==s).nodesMap.set(c.id,{instance:!0,info:c,indexes:[[t.scene.children.length-1,l,0,0]]})}r.index=t.scene.children.length-1,r.materialClone=n.material,r.url=s,r.glb=n.glb,r.ids=i.map(l=>l.id),r.matrixsClone=o}function ww(s){return s.map!=null&&(s.map.colorSpace=Rt,s.map.needsUpdate=!0),s.shadowSide=kn,s.side=s.side,s}class Sw{engine;constructor(e){this.engine=e}async loadModels(e,t){console.log("待加载模型",e);for(const i of e)n(i)==="light"&&vw(this.engine,i);function n(i){const r=i.split(".").pop();return r==="glb"||r==="gltf"?"gltf":"light"}}}class Ew{engine;isFree;highlightModels;hideModels;translucentModels;models;constructor(e){this.engine=e,this.isFree=!0,this.highlightModels=[],this.hideModels=[],this.translucentModels=[],this.models=[]}init(){this.engine.events.on(ts.EngineFree,e=>{this.updateFree(!0),bw(this.engine,e)}),this.engine.events.on(ts.EngineBusy,()=>{this.updateFree(!1)})}updateFree(e){this.isFree=e}closeAllFunction=()=>{}}class Cw{listeners=new Map;debugMode=!1;setDebugMode(e){this.debugMode=e}on(e,t){const n=String(e);this.listeners.has(n)||this.listeners.set(n,[]),this.listeners.get(n).push(t),this.debugMode&&console.debug(`[EventModule] 注册事件监听器: ${n}, 当前监听器数量: ${this.listeners.get(n).length}`)}off(e,t){const n=String(e);if(!this.listeners.has(n)){this.debugMode&&console.warn(`[EventModule] 尝试移除不存在的事件监听器: ${n}`);return}const i=this.listeners.get(n),r=i.indexOf(t);r!==-1?(i.splice(r,1),this.debugMode&&console.debug(`[EventModule] 移除事件监听器: ${n}, 剩余监听器数量: ${i.length}`)):this.debugMode&&console.warn(`[EventModule] 尝试移除的回调函数未找到: ${n}`)}trigger(e,t){const n=String(e);if(!this.listeners.has(n)){this.debugMode&&(console.warn(`[EventModule] 触发事件但未找到监听器: ${n}`),console.debug("[EventModule] 当前已注册的事件类型:",Array.from(this.listeners.keys())));return}const i=this.listeners.get(n);this.debugMode&&console.debug(`[EventModule] 触发事件: ${n}, 监听器数量: ${i.length}`,t),i.forEach((r,a)=>{try{r(t)}catch(o){console.error(`[EventModule] 事件监听器执行错误 [${n}] #${a}:`,o)}})}}class Tw{engine;constructor(e){this.engine=e}init(){const e=new Pi(16777215,1);e.position.set(100,200,100),e.castShadow=!0,e.shadow.mapSize.width=2048,e.shadow.mapSize.height=2048,e.shadow.camera.near=.1,e.shadow.camera.far=5e3,e.shadow.bias=-5e-5,e.shadow.normalBias=.02;const t=50;e.shadow.camera.left=-t,e.shadow.camera.right=t,e.shadow.camera.top=t,e.shadow.camera.bottom=-t,e.shadow.radius=2;const n=new Pi(16777215,2);this.engine.scene.add(e),this.engine.scene.add(n),this.engine.scene.dirLight=n;const i=new jo(16777215,1);this.engine.scene.add(i)}}var Yt=(s=>(s.ModelLoadStart="model-load-start",s.ModelLoadProgress="model-load-progress",s.ModelLoaded="model-loaded",s.ModelError="model-error",s.SelectionChanged="selection-changed",s.HoverChanged="hover-changed",s.Click="click",s.MouseMove="mouse-move",s.CameraChanged="camera-changed",s.CameraIdle="camera-idle",s.EngineFree="engine-free",s.EngineBusy="engine-busy",s.MeasureChanged="measure-changed",s.MeasureClick="measure-click",s.SectionMove="section-move",s))(Yt||{});class Aw{engine;behavior;isCtrlDown=!1;highlightedInstances=[];highlightColor=new Fe(43775);constructor(e){this.engine=e}init(){this.behavior=this.engine.handelBehaved,this.behavior.init(this)}active(){this.behavior.active()}disActive(){this.behavior.disActive()}handelKeyCtrlUp(){this.isCtrlDown=!1}handelKeyCtrlDown(){this.isCtrlDown=!0}hoverOldId=null;handleMouseMove(e){if(!this.engine.engineStatus.isFree){this.engine.hoverHighLight.clearHighlight();return}let t=this.getCatchMeshs(e);t!=null?t.length>0&&this.engine.hoverHighLight.hightMesh(t):this.engine.hoverHighLight.clearHighlight()}getCatchMeshs(e){if(e.catch==null)return this.hoverOldId=null,null;if(e.catch.object.isInstance){let t=e.catch.object,n=e.catch.object.id,i=this.engine.models.find(o=>o.url==t.url).nodesMap.get(n),r=new Map;i?.indexes.forEach(o=>{this.engine.scene.children[o[0]]instanceof Ut&&(r.has(o[0])?r.get(o[0])?.push(o[1]):r.set(o[0],[o[1]]))});let a=[];return r.forEach((o,l)=>{let c=this.engine.scene.children[l];o.forEach(h=>{let u=c.geometry.clone();u.applyMatrix4(c.matrixs[h]),a.push(new rt(u,c.material))})}),this.hoverOldId==n?[]:(this.hoverOldId=n,this.engine.hoverHighLight.clearHighlight(),a)}else{const t=e.catch;t.object;let n=t.object,i=n.name,r=this.engine.models.find(a=>a.url===n.url).nodesMap.get(i).infos.map(a=>a.mesh);return this.hoverOldId==i?[]:(this.hoverOldId=i,this.engine.hoverHighLight.clearHighlight(),r)}}handleMouseClick(e){if(e.catch!=null){const t=e.catch;let n=t.object;this.isCtrlDown||this.engine.modelToolModule.unhighlightAllModels(),console.log([{url:n.url,ids:[n.name]}]),this.engine.controlModule.orbitControls.origin.set(t.point.x,t.point.y,t.point.z),this.engine.modelToolModule.highlightModel([{url:n.url,ids:[n.name]}]),this.engine.events.trigger(Yt.Click,!0)}else this.engine.modelToolModule.unhighlightAllModels()}handleMouseDoubleClick(e){if(e.catch){const n=e.catch;n.object,this.engine.events.trigger(Yt.Click,n);let i=n.object,r=this.engine.models.find(o=>o.url===i.url).nodesMap.get(i.name).infos.map(o=>o.box),a=t(r);this.engine.viewCube.zoomToModel(a)}function t(n){let i=new P(1e8,1e9,1e10),r=new P(-1e8,-1e9,-1e10);return n.forEach(a=>{a.min.xr.x&&(r.x=a.max.x),a.max.y>r.y&&(r.y=a.max.y),a.max.z>r.z&&(r.z=a.max.z)}),new gt(i,r)}}handleMouseClickInstance(e){return e.intersectObjects(this.engine.scene.children.filter(t=>t instanceof Ut),!0)}}class Pw{engine;highlightMaterial;hideMaterial;translucentMaterial;constructor(e){this.engine=e,this.highlightMaterial=new Ht({color:43775,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.5,side:yt}),this.hideMaterial=new Ht({color:0,transparent:!0,opacity:0,side:yt}),this.translucentMaterial=new Ht({color:16777215,transparent:!0,opacity:.05,side:yt}),this.highlightMaterial.clippingPlanes=this.engine.sectionPlane,this.hideMaterial.clippingPlanes=this.engine.sectionPlane,this.translucentMaterial.clippingPlanes=this.engine.sectionPlane}split_merge_model(e){if(e.isSplit||e instanceof Ut)return;let t=e.materialClone.clone(),n=Xm(e.geometrys,!0);n.groups.forEach(i=>{i.materialIndex=0}),e.geometry=n,e.material=[t,this.highlightMaterial,this.translucentMaterial],e.needsUpdate=!0,e.isSplit=!0}un_split_merge_model(e){}highlightModel(e){e.forEach(t=>{let n=new Map;t.ids.forEach(r=>{let a=this.engine.models.find(o=>o.url==t.url).nodesMap.get(r);a!=null&&a.indexes!=null&&a.indexes.forEach(o=>{this.engine.scene.children[o[0]]instanceof Ut?n.has(o[0])?n.get(o[0])?.push(o[1]):n.set(o[0],[o[1]]):(console.log(this.engine.scene.children[o[0]].materialClone.color),this.split_merge_model(this.engine.scene.children[o[0]]),this.engine.scene.children[o[0]].geometry.groups[o[1]].materialIndex=1)})}),Rw(n,this.engine);let i=this.engine.engineStatus.highlightModels.find(r=>r.url==t.url);i!=null?i.ids.push(...t.ids):this.engine.engineStatus.highlightModels.push(t)})}unhighlightModel(e){e.forEach(t=>{let n=new Map;t.ids.forEach(i=>{let r=this.engine.models.find(a=>a.url==t.url).nodesMap.get(i);r!=null&&r.indexes!=null&&r.indexes.forEach(a=>{this.engine.scene.children[a[0]]instanceof Ut?n.has(a[0])?n.get(a[0])?.push(a[1]):n.set(a[0],[a[1]]):this.engine.scene.children[a[0]].geometry.groups[a[1]].materialIndex=0})}),e0(n,this.engine,"highlightModel")})}unhighlightAllModels(e=!0){this.engine.engineStatus.highlightModels.forEach(t=>{this.unhighlightModel([t])}),e&&(this.engine.engineStatus.highlightModels=[])}hideModel(e){e.forEach(t=>{let n=new Map;t.ids.forEach(r=>{let a=this.engine.models.find(o=>o.url==t.url).nodesMap.get(r);this.engine.modelEdge.hideModelEdge(t.url,r),a!=null&&a.indexes!=null&&a.indexes.forEach(o=>{const l=this.engine.scene.children[o[0]];l instanceof Ut?n.has(o[0])?n.get(o[0])?.push(o[1]):n.set(o[0],[o[1]]):(this.split_merge_model(this.engine.scene.children[o[0]]),l.geometry.groups[o[1]].materialIndex=-1,l.geometry.groups[o[1]].visible=!1)})}),n.size>0&&Dw(n,this.engine);let i=this.engine.engineStatus.hideModels.find(r=>r.url==t.url);i!=null?i.ids.push(...t.ids):this.engine.engineStatus.hideModels.push({url:t.url,ids:t.ids}),this.engine.engineStatus.highlightModels=[]})}showModel(e){e.forEach(t=>{let n=new Map;t.ids.forEach(r=>{let a=this.engine.models.find(o=>o.url==t.url).nodesMap.get(r);this.engine.modelEdge.showModelEdge(t.url,r),a!=null&&a.indexes!=null&&a.indexes.forEach(o=>{const l=this.engine.scene.children[o[0]];l instanceof Ut?n.has(o[0])?n.get(o[0])?.push(o[1]):n.set(o[0],[o[1]]):(l.geometry.groups[o[1]].materialIndex=0,l.geometry.groups[o[1]].visible=!0)})}),n.size>0&&t0(n,this.engine);let i=this.engine.engineStatus.hideModels.find(r=>r.url==t.url);i&&(t.ids.forEach(r=>{const a=i.ids.indexOf(r);a!==-1&&i.ids.splice(a,1)}),i.ids.length===0&&(this.engine.engineStatus.hideModels=this.engine.engineStatus.hideModels.filter(r=>r!==i)))})}isolateModel(e){let t=[];this.engine.models.forEach(n=>{let i={url:n.url,ids:[]},r=e.find(a=>a.url==n.url);for(let a of n.nodesMap)r==null?i.ids.push(a[0]):r.ids.includes(a[0])||i.ids.push(a[0]);t.push(i)}),this.unhighlightAllModels(),this.hideModel(t)}translucentOtherModel(e){let t=[];this.engine.models.forEach(n=>{let i={url:n.url,ids:[]},r=e.find(a=>a.url==n.url);for(let a of n.nodesMap)r==null?i.ids.push(a[0]):r.ids.includes(a[0])||i.ids.push(a[0]);t.push(i)}),this.translucentModel(t)}setModelColor(e,t){e.material.color.set(t)}setAllModelsColor(e){this.engine.scene.children.forEach(t=>{t.isMesh})}restoreAllModelsColor(){this.engine.scene.children.forEach(e=>{e.isMesh})}translucentModel(e){this.unhighlightAllModels(),e.forEach(t=>{let n=new Map;t.ids.forEach(r=>{let a=this.engine.models.find(o=>o.url==t.url).nodesMap.get(r);a!=null&&a.indexes!=null&&a.indexes.forEach(o=>{const l=this.engine.scene.children[o[0]];l instanceof Ut?n.has(o[0])?n.get(o[0])?.push(o[1]):n.set(o[0],[o[1]]):(this.split_merge_model(this.engine.scene.children[o[0]]),l.geometry.groups[o[1]].materialIndex=2)})}),Lw(n,this.engine);let i=this.engine.engineStatus.translucentModels.find(r=>r.url==t.url);i!=null?i.ids.push(...t.ids):this.engine.engineStatus.translucentModels.push({url:t.url,ids:t.ids})}),this.engine.engineStatus.highlightModels=[]}unTranslucentModel(){this.engine.engineStatus.translucentModels.forEach(e=>{let t=new Map;e.ids.forEach(n=>{let i=this.engine.models.find(r=>r.url==e.url).nodesMap.get(n);i!=null&&i.indexes!=null&&i.indexes.forEach(r=>{const a=this.engine.scene.children[r[0]];a instanceof Ut?t.has(r[0])?t.get(r[0])?.push(r[1]):t.set(r[0],[r[1]]):(this.split_merge_model(this.engine.scene.children[r[0]]),a.geometry.groups[r[1]].materialIndex=0)})}),t.size>0&&t0(t,this.engine),e0(t,this.engine,"translucentModel")}),this.engine.engineStatus.translucentModels=[]}showAllModels(){this.engine.engineStatus.hideModels&&this.engine.engineStatus.hideModels.length>0&&this.showModel(this.engine.engineStatus.hideModels),this.engine.engineStatus.hideModels=[],this.unhighlightAllModels()}batchSelectSameLevelTypeModel(e){if(e.length==0)return;let t=e[0],n=this.engine.modelMapperBatch.getModelMapper(t.url,t.ids[0]);this.engine.modelMapperBatch.getModelsWithLevelType(n.levelName,n.typeName,i=>{this.engine.modelToolModule.highlightModel(i)})}batchSelectSameLevelModel(e){if(e.length==0)return;let t=e[0],n=this.engine.modelMapperBatch.getModelMapper(t.url,t.ids[0]);this.engine.modelMapperBatch.getModelsWithLevel(n.levelName,i=>{this.engine.modelToolModule.highlightModel(i)})}batchSelectSameTypeModel(e){if(e.length==0)return;let t=e[0],n=this.engine.modelMapperBatch.getModelMapper(t.url,t.ids[0]);this.engine.modelMapperBatch.getModelsWithType(n.typeName,i=>{this.engine.modelToolModule.highlightModel(i)})}}function Rw(s,e){s.forEach((t,n)=>{const i=e.scene.children[n];if(!(i instanceof Ut))return;const r=i.geometry,a=new Ht({color:43775,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.5,side:yt}),o=new Ut(r,a,t.length);o.name="highlightModel",o.key=n;const l=new Map,c=new De,h=new De;h.makeScale(0,0,0),t.forEach((u,p)=>{i.getMatrixAt(u,c),l.set(u,c.clone()),i.setMatrixAt(u,h),o.setMatrixAt(p,c)}),i.instanceMatrix.needsUpdate=!0,o.instanceMatrix.needsUpdate=!0,e.scene.add(o)})}function e0(s,e,t){s.forEach((n,i)=>{const r=e.scene.children[i];r instanceof Ut&&(n.forEach(a=>{const o=r.matrixsClone[a];o&&r.setMatrixAt(a,o)}),r.instanceMatrix.needsUpdate=!0,e.scene.children.filter(a=>a.key==i&&a.name==t).forEach(a=>{e.scene.remove(a)}))})}function Lw(s,e){s.forEach((t,n)=>{const i=e.scene.children[n];if(!(i instanceof Ut))return;const r=i.geometry,a=new Ht({color:16777215,transparent:!0,opacity:.05,side:yt}),o=new Ut(r,a,t.length);o.name="translucentModel",o.key=n;const l=new Map,c=new De,h=new De;h.makeScale(0,0,0),t.forEach((u,p)=>{i.getMatrixAt(u,c),l.set(u,c.clone()),i.setMatrixAt(u,h),o.setMatrixAt(p,c)}),i.instanceMatrix.needsUpdate=!0,o.instanceMatrix.needsUpdate=!0,e.scene.add(o)})}function Dw(s,e){e.scene.children.filter(t=>t.name=="highlightModel").forEach(t=>{e.scene.remove(t)}),s.forEach((t,n)=>{const i=e.scene.children[n];if(!(i instanceof Ut))return;const r=new Map,a=new De,o=new De;o.makeScale(0,0,0),t.forEach((l,c)=>{i.getMatrixAt(l,a),r.set(l,a.clone()),i.setMatrixAt(l,o)}),i.instanceMatrix.needsUpdate=!0})}function t0(s,e){s.forEach((t,n)=>{const i=e.scene.children[n];i instanceof Ut&&(t.forEach(r=>{const a=i.matrixs[r];a&&i.setMatrixAt(r,a)}),i.instanceMatrix.needsUpdate=!0)})}class Dn{constructor(e,t,n){this.camera=e,this.renderer=t,this.scene=n,this.raycaster=new Qi}raycaster;worldToScreenNormalized(e){const t=e.clone();return t.project(this.camera),new he(t.x,t.y)}worldToScreen(e){const t=this.worldToScreenNormalized(e),n=this.renderer.domElement.width,i=this.renderer.domElement.height,r=(t.x+1)*n/2,a=(1-t.y)*i/2;return new he(r,a)}screenToNormalized(e,t){const n=this.renderer.domElement.clientWidth,i=this.renderer.domElement.clientHeight,r=e/n*2-1,a=-(t/i*2-1);return new he(r,a)}screenToWorld(e,t,n){if(!this.scene&&!n)return console.warn("WorldToScreen: 需要提供 scene 或 objects 参数才能进行屏幕坐标转世界坐标"),null;const i=this.screenToNormalized(e,t);this.raycaster.setFromCamera(i,this.camera);const r=n||this.scene.children,a=this.raycaster.intersectObjects(r,!0);return a.length>0?a[0].point:null}screenToWorldWithDepth(e,t,n=0){const i=this.screenToNormalized(e,t);this.raycaster.setFromCamera(i,this.camera);const r=new P;return this.raycaster.ray.at(n,r),r}updateCamera(e){this.camera=e}updateRenderer(e){this.renderer=e}updateScene(e){this.scene=e}}class Iw{engine;currentMode="";isManualMode=!1;gtaoPass=null;ssaoPass=null;saturationPass=null;outputPass=null;fxaaPass=null;constructor(e){this.engine=e}init(){this.cachePassReferences(),this.autoSwitch("advanced")}switchModel(e){this.isManualMode=!0,this.currentMode=e,this.applyMode(e)}autoSwitch(e){this.isManualMode||(this.currentMode=e,this.applyMode(e))}enableAutoMode(){this.isManualMode=!1}get isManual(){return this.isManualMode}setMode(e){this.isManualMode=!0,this.currentMode=e,this.applyMode(e)}getCurrentMode(){return this.currentMode}cachePassReferences(){this.engine.composerModule?.composer&&(this.engine.composerModule.gtaoPass&&(this.gtaoPass=this.engine.composerModule.gtaoPass),this.engine.composerModule.ssaoPass&&(this.ssaoPass=this.engine.composerModule.ssaoPass),this.engine.composerModule.saturationPass&&(this.saturationPass=this.engine.composerModule.saturationPass),this.engine.composerModule.outputPass&&(this.outputPass=this.engine.composerModule.outputPass),this.engine.composerModule.fxaaPass&&(this.fxaaPass=this.engine.composerModule.fxaaPass))}applyMode(e){switch(e){case"simple":this.setShadows(!1),this.setGTAO(!1),this.setSSAO(!1),this.setSaturation(!1),this.setOutputPass(!1),this.setFXAA(!1);break;case"balance":this.setShadows(!0),this.setGTAO(!1),this.setSSAO(!1),this.setSaturation(!1),this.setOutputPass(!1),this.setFXAA(!1);break;case"advanced":this.setShadows(!0),this.setSSAO(!1),this.setGTAO(!0),this.setSaturation(!0),this.setOutputPass(!0),this.setFXAA(!0);break;default:console.warn(`[EngineModelModule] Unknown mode: ${e}`)}this.engine.updateVersionDisplay?.()}setShadows(e){this.engine.renderer&&(this.engine.renderer.shadowMap.enabled=e);const t=this.engine.scene?.children.find(n=>n instanceof Pi);t&&(t.castShadow=e),this.engine.scene?.traverse(n=>{n.material&&(n.castShadow!==void 0&&(n.castShadow=e),n.receiveShadow!==void 0&&(n.receiveShadow=e))})}setGTAO(e){this.engine.composerModule?.composer&&this.gtaoPass&&(this.gtaoPass.enabled=e)}setSSAO(e){this.engine.composerModule?.composer&&this.ssaoPass&&(this.ssaoPass.enabled=e)}setSaturation(e){this.saturationPass&&(this.saturationPass.enabled=e)}setOutputPass(e){this.outputPass&&(this.outputPass.enabled=e)}setFXAA(e){this.fxaaPass&&(this.fxaaPass.enabled=e)}setPerformanceMode(){this.setMode("simple")}setBalancedMode(){this.setMode("balance")}setQualityMode(){this.setMode("advanced")}setSuperQualityMode(){this.setMode("superAdvanced")}setShadowQuality(e){const t=this.engine.scene?.children.find(i=>i instanceof Pi),n={low:1024,medium:2048,high:2048}[e];t?.shadow&&n&&(t.shadow.mapSize.width=n,t.shadow.mapSize.height=n,t.shadow.map?.dispose(),t.shadow.map=null)}setSaturationValue(e){this.saturationPass&&(this.saturationPass.uniforms.saturation.value=e)}setContrastValue(e){this.saturationPass&&(this.saturationPass.uniforms.contrast.value=e)}setGTAOIntensity(e){this.gtaoPass&&(this.gtaoPass.blendIntensity=e)}}class wl{engine;overlayMaterial;overlayMeshes=[];animState="idle";animStartTime=0;static FADE_IN_MS=200;static FADE_OUT_MS=150;constructor(e){this.engine=e,this.init()}init(){this.overlayMaterial=new Ht({color:16777215,transparent:!0,opacity:0,blending:nc,depthWrite:!1}),this.overlayMaterial.clippingPlanes=this.engine.sectionPlane}hightMesh(e,t=16777215,n=.15){this.animState==="fadeOut"&&this.removeOverlayMeshes();const i=(Array.isArray(e)?e:e?[e]:[]).filter(r=>r?.geometry);if(i.length===0){this.clearHighlight();return}this.overlayMaterial.color.set(t),this.overlayMaterial.opacity=0,this.overlayMaterial.userData.targetOpacity=n;for(const r of i){const a=new rt(r.geometry,this.overlayMaterial);r.updateWorldMatrix(!0,!1),a.matrix.copy(r.matrixWorld),a.matrixAutoUpdate=!1,this.engine.scene.add(a),this.overlayMeshes.push(a)}this.animState="fadeIn",this.animStartTime=performance.now()}clearHighlight(){this.overlayMeshes.length===0||this.animState==="fadeOut"||(this.animState="fadeOut",this.animStartTime=performance.now())}update(){if(this.animState==="idle"||this.overlayMeshes.length===0)return;const e=performance.now()-this.animStartTime,t=this.overlayMaterial.userData.targetOpacity??.35;if(this.animState==="fadeIn"){const n=Math.min(e/wl.FADE_IN_MS,1);this.overlayMaterial.opacity=this.easeOutQuad(n)*t,n>=1&&(this.animState="idle")}else if(this.animState==="fadeOut"){const n=Math.min(e/wl.FADE_OUT_MS,1);this.overlayMaterial.opacity=(1-this.easeOutQuad(n))*t,n>=1&&(this.removeOverlayMeshes(),this.animState="idle")}}removeOverlayMeshes(){for(const e of this.overlayMeshes)this.engine.scene.remove(e);this.overlayMeshes=[]}easeOutQuad(e){return 1-(1-e)*(1-e)}dispose(){this.removeOverlayMeshes(),this.overlayMaterial.dispose(),this.animState="idle"}}var Au={exports:{}},Nw=Au.exports,n0;function Bw(){return n0||(n0=1,(function(s,e){(function(t,n){s.exports=n()})(Nw,function(){var t=function(){function n(d){return a.appendChild(d.dom),d}function i(d){for(var m=0;ml+1e3&&(h.update(1e3*c/(d-l),100),l=d,c=0,p)){var m=performance.memory;p.update(m.usedJSHeapSize/1048576,m.jsHeapSizeLimit/1048576)}return d},update:function(){o=this.end()},domElement:a,setMode:i}};return t.Panel=function(n,i,r){var a=1/0,o=0,l=Math.round,c=l(window.devicePixelRatio||1),h=80*c,u=48*c,p=3*c,d=2*c,m=3*c,f=15*c,x=74*c,g=30*c,b=document.createElement("canvas");b.width=h,b.height=u,b.style.cssText="width:80px;height:48px";var v=b.getContext("2d");return v.font="bold "+9*c+"px Helvetica,Arial,sans-serif",v.textBaseline="top",v.fillStyle=r,v.fillRect(0,0,h,u),v.fillStyle=i,v.fillText(n,p,d),v.fillRect(m,f,x,g),v.fillStyle=r,v.globalAlpha=.9,v.fillRect(m,f,x,g),{dom:b,update:function(y,_){a=Math.min(a,y),o=Math.max(o,y),v.fillStyle=r,v.globalAlpha=1,v.fillRect(0,0,h,f),v.fillStyle=i,v.fillText(l(y)+" "+n+" ("+l(a)+"-"+l(o)+")",p,d),v.drawImage(b,m+c,f,x-c,g,m,f,x-c,g),v.fillRect(m+x-c,f,c,g),v.fillStyle=r,v.globalAlpha=.9,v.fillRect(m+x-c,f,c,l((1-y/_)*g))}}},t})})(Au)),Au.exports}var kw=Bw();const Uw=em(kw);var Ur=Object.freeze({Linear:Object.freeze({None:function(s){return s},In:function(s){return s},Out:function(s){return s},InOut:function(s){return s}}),Quadratic:Object.freeze({In:function(s){return s*s},Out:function(s){return s*(2-s)},InOut:function(s){return(s*=2)<1?.5*s*s:-.5*(--s*(s-2)-1)}}),Cubic:Object.freeze({In:function(s){return s*s*s},Out:function(s){return--s*s*s+1},InOut:function(s){return(s*=2)<1?.5*s*s*s:.5*((s-=2)*s*s+2)}}),Quartic:Object.freeze({In:function(s){return s*s*s*s},Out:function(s){return 1- --s*s*s*s},InOut:function(s){return(s*=2)<1?.5*s*s*s*s:-.5*((s-=2)*s*s*s-2)}}),Quintic:Object.freeze({In:function(s){return s*s*s*s*s},Out:function(s){return--s*s*s*s*s+1},InOut:function(s){return(s*=2)<1?.5*s*s*s*s*s:.5*((s-=2)*s*s*s*s+2)}}),Sinusoidal:Object.freeze({In:function(s){return 1-Math.sin((1-s)*Math.PI/2)},Out:function(s){return Math.sin(s*Math.PI/2)},InOut:function(s){return .5*(1-Math.sin(Math.PI*(.5-s)))}}),Exponential:Object.freeze({In:function(s){return s===0?0:Math.pow(1024,s-1)},Out:function(s){return s===1?1:1-Math.pow(2,-10*s)},InOut:function(s){return s===0?0:s===1?1:(s*=2)<1?.5*Math.pow(1024,s-1):.5*(-Math.pow(2,-10*(s-1))+2)}}),Circular:Object.freeze({In:function(s){return 1-Math.sqrt(1-s*s)},Out:function(s){return Math.sqrt(1- --s*s)},InOut:function(s){return(s*=2)<1?-.5*(Math.sqrt(1-s*s)-1):.5*(Math.sqrt(1-(s-=2)*s)+1)}}),Elastic:Object.freeze({In:function(s){return s===0?0:s===1?1:-Math.pow(2,10*(s-1))*Math.sin((s-1.1)*5*Math.PI)},Out:function(s){return s===0?0:s===1?1:Math.pow(2,-10*s)*Math.sin((s-.1)*5*Math.PI)+1},InOut:function(s){return s===0?0:s===1?1:(s*=2,s<1?-.5*Math.pow(2,10*(s-1))*Math.sin((s-1.1)*5*Math.PI):.5*Math.pow(2,-10*(s-1))*Math.sin((s-1.1)*5*Math.PI)+1)}}),Back:Object.freeze({In:function(s){var e=1.70158;return s===1?1:s*s*((e+1)*s-e)},Out:function(s){var e=1.70158;return s===0?0:--s*s*((e+1)*s+e)+1},InOut:function(s){var e=2.5949095;return(s*=2)<1?.5*(s*s*((e+1)*s-e)):.5*((s-=2)*s*((e+1)*s+e)+2)}}),Bounce:Object.freeze({In:function(s){return 1-Ur.Bounce.Out(1-s)},Out:function(s){return s<1/2.75?7.5625*s*s:s<2/2.75?7.5625*(s-=1.5/2.75)*s+.75:s<2.5/2.75?7.5625*(s-=2.25/2.75)*s+.9375:7.5625*(s-=2.625/2.75)*s+.984375},InOut:function(s){return s<.5?Ur.Bounce.In(s*2)*.5:Ur.Bounce.Out(s*2-1)*.5+.5}}),generatePow:function(s){return s===void 0&&(s=4),s=s1e4?1e4:s,{In:function(e){return Math.pow(e,s)},Out:function(e){return 1-Math.pow(1-e,s)},InOut:function(e){return e<.5?Math.pow(e*2,s)/2:(1-Math.pow(2-e*2,s))/2+.5}}}}),Ia=function(){return performance.now()},Ow=(function(){function s(){this._tweens={},this._tweensAddedDuringUpdate={}}return s.prototype.getAll=function(){var e=this;return Object.keys(this._tweens).map(function(t){return e._tweens[t]})},s.prototype.removeAll=function(){this._tweens={}},s.prototype.add=function(e){this._tweens[e.getId()]=e,this._tweensAddedDuringUpdate[e.getId()]=e},s.prototype.remove=function(e){delete this._tweens[e.getId()],delete this._tweensAddedDuringUpdate[e.getId()]},s.prototype.update=function(e,t){e===void 0&&(e=Ia()),t===void 0&&(t=!1);var n=Object.keys(this._tweens);if(n.length===0)return!1;for(;n.length>0;){this._tweensAddedDuringUpdate={};for(var i=0;i1?r(s[t],s[t-1],t-n):r(s[i],s[i+1>t?t:i+1],n-i)},Utils:{Linear:function(s,e,t){return(e-s)*t+s}}},i0=(function(){function s(){}return s.nextId=function(){return s._nextId++},s._nextId=0,s})(),Ru=new Ow,zw=(function(){function s(e,t){t===void 0&&(t=Ru),this._object=e,this._group=t,this._isPaused=!1,this._pauseStart=0,this._valuesStart={},this._valuesEnd={},this._valuesStartRepeat={},this._duration=1e3,this._isDynamic=!1,this._initialRepeat=0,this._repeat=0,this._yoyo=!1,this._isPlaying=!1,this._reversed=!1,this._delayTime=0,this._startTime=0,this._easingFunction=Ur.Linear.None,this._interpolationFunction=Pu.Linear,this._chainedTweens=[],this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._id=i0.nextId(),this._isChainStopped=!1,this._propertiesAreSetUp=!1,this._goToEnd=!1}return s.prototype.getId=function(){return this._id},s.prototype.isPlaying=function(){return this._isPlaying},s.prototype.isPaused=function(){return this._isPaused},s.prototype.getDuration=function(){return this._duration},s.prototype.to=function(e,t){if(t===void 0&&(t=1e3),this._isPlaying)throw new Error("Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.");return this._valuesEnd=e,this._propertiesAreSetUp=!1,this._duration=t<0?0:t,this},s.prototype.duration=function(e){return e===void 0&&(e=1e3),this._duration=e<0?0:e,this},s.prototype.dynamic=function(e){return e===void 0&&(e=!1),this._isDynamic=e,this},s.prototype.start=function(e,t){if(e===void 0&&(e=Ia()),t===void 0&&(t=!1),this._isPlaying)return this;if(this._group&&this._group.add(this),this._repeat=this._initialRepeat,this._reversed){this._reversed=!1;for(var n in this._valuesStartRepeat)this._swapEndStartRepeatValues(n),this._valuesStart[n]=this._valuesStartRepeat[n]}if(this._isPlaying=!0,this._isPaused=!1,this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._isChainStopped=!1,this._startTime=e,this._startTime+=this._delayTime,!this._propertiesAreSetUp||t){if(this._propertiesAreSetUp=!0,!this._isDynamic){var i={};for(var r in this._valuesEnd)i[r]=this._valuesEnd[r];this._valuesEnd=i}this._setupProperties(this._object,this._valuesStart,this._valuesEnd,this._valuesStartRepeat,t)}return this},s.prototype.startFromCurrentValues=function(e){return this.start(e,!0)},s.prototype._setupProperties=function(e,t,n,i,r){for(var a in n){var o=e[a],l=Array.isArray(o),c=l?"array":typeof o,h=!l&&Array.isArray(n[a]);if(!(c==="undefined"||c==="function")){if(h){var u=n[a];if(u.length===0)continue;for(var p=[o],d=0,m=u.length;d"u"||r)&&(t[a]=o),l||(t[a]*=1),h?i[a]=n[a].slice().reverse():i[a]=t[a]||0}}},s.prototype.stop=function(){return this._isChainStopped||(this._isChainStopped=!0,this.stopChainedTweens()),this._isPlaying?(this._group&&this._group.remove(this),this._isPlaying=!1,this._isPaused=!1,this._onStopCallback&&this._onStopCallback(this._object),this):this},s.prototype.end=function(){return this._goToEnd=!0,this.update(1/0),this},s.prototype.pause=function(e){return e===void 0&&(e=Ia()),this._isPaused||!this._isPlaying?this:(this._isPaused=!0,this._pauseStart=e,this._group&&this._group.remove(this),this)},s.prototype.resume=function(e){return e===void 0&&(e=Ia()),!this._isPaused||!this._isPlaying?this:(this._isPaused=!1,this._startTime+=e-this._pauseStart,this._pauseStart=0,this._group&&this._group.add(this),this)},s.prototype.stopChainedTweens=function(){for(var e=0,t=this._chainedTweens.length;ea)return!1;t&&this.start(e,!0)}if(this._goToEnd=!1,ec)return 1;var x=Math.trunc(o/l),g=o-x*l,b=Math.min(g/n._duration,1);return b===0&&o===n._duration?1:b},u=h(),p=this._easingFunction(u);if(this._updateProperties(this._object,this._valuesStart,this._valuesEnd,p),this._onUpdateCallback&&this._onUpdateCallback(this._object,u),this._duration===0||o>=this._duration)if(this._repeat>0){var d=Math.min(Math.trunc((o-this._duration)/l)+1,this._repeat);isFinite(this._repeat)&&(this._repeat-=d);for(r in this._valuesStartRepeat)!this._yoyo&&typeof this._valuesEnd[r]=="string"&&(this._valuesStartRepeat[r]=this._valuesStartRepeat[r]+parseFloat(this._valuesEnd[r])),this._yoyo&&this._swapEndStartRepeatValues(r),this._valuesStart[r]=this._valuesStartRepeat[r];return this._yoyo&&(this._reversed=!this._reversed),this._startTime+=l*d,this._onRepeatCallback&&this._onRepeatCallback(this._object),this._onEveryStartCallbackFired=!1,!0}else{this._onCompleteCallback&&this._onCompleteCallback(this._object);for(var m=0,f=this._chainedTweens.length;m(y=C.indexOf(` +`))&&_=x.byteLength||!(C=n(x)))&&t(1,"no header found"),(R=C.match(g))||t(3,"bad initial token"),M.valid|=1,M.programtype=R[1],M.string+=C+` +`;C=n(x),C!==!1;){if(M.string+=C+` +`,C.charAt(0)==="#"){M.comments+=C+` +`;continue}if((R=C.match(b))&&(M.gamma=parseFloat(R[1])),(R=C.match(v))&&(M.exposure=parseFloat(R[1])),(R=C.match(y))&&(M.valid|=2,M.format=R[1]),(R=C.match(_))&&(M.valid|=4,M.height=parseInt(R[1],10),M.width=parseInt(R[2],10)),M.valid&2&&M.valid&4)break}return M.valid&2||t(3,"missing format specifier"),M.valid&4||t(3,"missing image size specifier"),M},r=function(x,g,b){const v=g;if(v<8||v>32767||x[0]!==2||x[1]!==2||x[2]&128)return new Uint8Array(x);v!==(x[2]<<8|x[3])&&t(3,"wrong scanline width");const y=new Uint8Array(4*g*b);y.length||t(4,"unable to allocate buffer space");let _=0,M=0;const C=4*v,R=new Uint8Array(4),S=new Uint8Array(C);let E=b;for(;E>0&&Mx.byteLength&&t(1),R[0]=x[M++],R[1]=x[M++],R[2]=x[M++],R[3]=x[M++],(R[0]!=2||R[1]!=2||(R[2]<<8|R[3])!=v)&&t(3,"bad rgbe scanline format");let L=0,A;for(;L128;if(w&&(A-=128),(A===0||L+A>C)&&t(3,"bad scanline data"),w){const z=x[M++];for(let G=0;G{x&&(y||(x(_),y=!0))}),x&&setTimeout(()=>{y||(x(!0),y=!0)},f+10)},n.CameraGoHome=function(){var m=s.octreeBox.getBoundingBox(),f=m.min.clone().add(m.max.clone()).multiplyScalar(.5);let x=new P(1,1,1);var g=m.max.distanceTo(m.min),b=f.clone().add(x.multiplyScalar(g));if(e.camera.isOrthographicCamera){var v=s.container.clientWidth/s.container.clientHeight,y=g*.6;e.camera.left=-y*v,e.camera.right=y*v,e.camera.top=y,e.camera.bottom=-y,e.camera.zoom=1,e.camera.updateProjectionMatrix()}l(e.camera.position,b,s.controls.target.clone(),f)},n.zoomToBox=function(m){var f=m.min.clone().add(m.max.clone()).multiplyScalar(.5),x=e.camera.position.clone().sub(s.controls.target.clone()).normalize(),g=e.camera.position.distanceTo(s.controls.target),b=f.clone().add(x.multiplyScalar(g)),v=e.camera.zoom;if(e.camera.isOrthographicCamera){var y=new P(1,0,0).applyQuaternion(e.camera.quaternion),_=new P(0,1,0).applyQuaternion(e.camera.quaternion),M=[new P(m.min.x,m.min.y,m.min.z),new P(m.max.x,m.min.y,m.min.z),new P(m.min.x,m.max.y,m.min.z),new P(m.max.x,m.max.y,m.min.z),new P(m.min.x,m.min.y,m.max.z),new P(m.max.x,m.min.y,m.max.z),new P(m.min.x,m.max.y,m.max.z),new P(m.max.x,m.max.y,m.max.z)],C=1/0,R=-1/0,S=1/0,E=-1/0;for(var L of M){var A=L.dot(y),I=L.dot(_);C=Math.min(C,A),R=Math.max(R,A),S=Math.min(S,I),E=Math.max(E,I)}var w=(R-C)/2,z=(E-S)/2,G=(e.camera.right-e.camera.left)/2,j=(e.camera.top-e.camera.bottom)/2;v=Math.min(G/w,j/z)*.75}var Y=e.camera.position.clone(),q=s.controls.target.clone(),ie=e.camera.zoom,W=new Na.Tween({x1:Y.x,y1:Y.y,z1:Y.z,x2:q.x,y2:q.y,z2:q.z,zoom:ie}).to({x1:b.x,y1:b.y,z1:b.z,x2:f.x,y2:f.y,z2:f.z,zoom:v},1e3);W.onUpdate(function(fe){s.controls&&(e.camera.position.set(fe.x1,fe.y1,fe.z1),s.controls.target.set(fe.x2,fe.y2,fe.z2),e.camera.isOrthographicCamera&&(e.camera.zoom=fe.zoom,e.camera.updateProjectionMatrix()),s.controls.auto=!0,s.controls.update(),n.RenderScene())}),W.onComplete(function(){s.controls&&(s.controls.auto=!1,n.RenderScene(),cancelAnimationFrame(i),i=null)}),W.easing(Na.Easing.Cubic.InOut),W.start();function $(){i=requestAnimationFrame($),W.update()}$()};function l(m,f,x,g,b,v,y=1e3,_){var M;b&&v?(M=new Na.Tween({x1:m.x,y1:m.y,z1:m.z,x2:x.x,y2:x.y,z2:x.z,_x:b._x,_y:b._y,_z:b._z,_w:b._w}),M.to({x1:f.x,y1:f.y,z1:f.z,x2:g.x,y2:g.y,z2:g.z,_x:v._x,_y:v._y,_z:v._z,_w:v._w},y)):(M=new Na.Tween({x1:m.x,y1:m.y,z1:m.z,x2:x.x,y2:x.y,z2:x.z}),M.to({x1:f.x,y1:f.y,z1:f.z,x2:g.x,y2:g.y,z2:g.z},y)),M.onUpdate(function(R){s.controls&&(b&&v?(e.camera.quaternion._x=R._x,e.camera.quaternion._y=R._y,e.camera.quaternion._z=R._z,e.camera.quaternion._w=R._w):s.controls.auto=!0,e.camera.position.x=R.x1,e.camera.position.y=R.y1,e.camera.position.z=R.z1,s.controls.target.x=R.x2,s.controls.target.y=R.y2,s.controls.target.z=R.z2,s.controls.update(),n.RenderScene())}),M.onComplete(function(R){s.controls&&(s.controls.auto=!1,n.RenderScene(),_&&_(!0),cancelAnimationFrame(i),i=null)}),M.easing(Na.Easing.Cubic.InOut);function C(R){i=requestAnimationFrame(C),M.update()}M.start(),C()}function c(){r=document.createElement("div"),r.className="ViewCube",t.appendChild(r),a=document.createElement("div"),a.className="viewSettingWrapper",a.innerHTML="...",r.appendChild(a);var m=document.createElement("div");m.className="homeViewWrapper",m.addEventListener("mousedown",function(){console.log("归位"),n.CameraGoHome()}),r.appendChild(m);const f=document.createElement("div");f.className="cameraToggleWrapper",f.title="切换正交/透视视图",f.innerHTML="⊞",f.addEventListener("mousedown",function(y){y.stopPropagation(),console.log("切换视图"),n.ToggleCameraType(),b()}),r.appendChild(f);const x=document.createElement("div");x.className="screenshotWrapper",x.title="截图",x.innerHTML="📷",x.addEventListener("mousedown",function(y){y.stopPropagation(),console.log("截图"),n.TakeScreenshot(),b()}),r.appendChild(x);const g=document.createElement("div");g.className="fullscreenWrapper",g.title="全屏",g.innerHTML="⛶",g.addEventListener("mousedown",function(y){y.stopPropagation(),console.log("全屏"),n.ToggleFullscreen(),b()}),r.appendChild(g),a.addEventListener("mousedown",function(y){y.stopPropagation(),f.classList.contains("show")?(b(),console.log("隐藏功能按钮")):(v(),console.log("显示功能按钮"))});function b(){f.classList.remove("show"),x.classList.remove("show"),g.classList.remove("show")}function v(){f.classList.add("show"),x.classList.add("show"),g.classList.add("show")}}function h(){n.sceneOrtho=Hw();var x=t.clientWidth,g=t.clientWidth,m=x>g?x/g:g/x,f=300;n.camera=new Ai(f*m/-2,f*m/2,f/2,f/-2,.01,1e4);var x=r.clientWidth,g=r.clientHeight,b=new au({alpha:!0});b.setSize(x,g),b.setClearAlpha(0),n.sceneOrtho.renderer=b;let v=new jo(16777215,.8);n.sceneOrtho.add(v),Vw(r,b)}function u(){const m="/assets/viewcube/";let f=[{label:"右",icon:m+"cn_right.png"},{label:"左",icon:m+"cn_left.png"},{label:"顶",icon:m+"cn_top.png"},{label:"底",icon:m+"cn_bottom.png"},{label:"前",icon:m+"cn_front.png"},{label:"后",icon:m+"cn_back.png"}];var x=[];for(const b of f)x.push(new Ht({color:16777215,map:new Gh().load(b.icon)}));new k1({color:255});var g=new rt(new Zi(110,110,110),x);n.sceneOrtho.add(g),p(122),r.addEventListener("mousedown",b=>{var v={};v.x=b.offsetX/r.clientWidth*2-1,v.y=-(b.offsetY/r.clientHeight)*2+1;var y=new Qi;y.setFromCamera(v,n.camera);const _=y.intersectObjects(o,!1);_.length>0&&n.ToggleDirectionView(_[0].object.name)}),r.addEventListener("mousemove",b=>{var v={};v.x=b.offsetX/r.clientWidth*2-1,v.y=-(b.offsetY/r.clientHeight)*2+1;var y=new Qi;y.setFromCamera(v,n.camera);const _=y.intersectObjects(o,!1);for(var M of o)M.material.opacity=.01;_.length>0&&(_[0].object.material.opacity=.2)})}function p(m){for(var f=m*.5-20,x=[{name:"right",a:30,b:75,c:75,point:new P(f,0,0)},{name:"back",a:75,b:75,c:30,point:new P(0,0,-f)},{name:"left",a:30,b:75,c:75,point:new P(-f,0,0)},{name:"front",a:75,b:75,c:30,point:new P(0,0,f)},{name:"top",a:75,b:30,c:75,point:new P(0,f,0)},{name:"button",a:75,b:30,c:75,point:new P(0,-f,0)}],g=[{name:"top_right_back",a:30,b:30,c:30,point:new P(-f,f,f)},{name:"button_front_right",a:30,b:30,c:30,point:new P(-f,-f,f)},{name:"top_front_right",a:30,b:30,c:30,point:new P(f,f,f)},{name:"button_right_back",a:30,b:30,c:30,point:new P(f,-f,f)},{name:"top_back_left",a:30,b:30,c:30,point:new P(-f,f,-f)},{name:"button_back_left",a:30,b:30,c:30,point:new P(-f,-f,-f)},{name:"top_left_front",a:30,b:30,c:30,point:new P(f,f,-f)},{name:"button_left_front",a:30,b:30,c:30,point:new P(f,-f,-f)}],b=[{name:"top_front",a:30,b:30,c:75,point:new P(f,f,0)},{name:"top_right",a:75,b:30,c:30,point:new P(0,f,f)},{name:"top_back",a:30,b:30,c:75,point:new P(-f,f,0)},{name:"top_left",a:75,b:30,c:30,point:new P(0,f,-f)},{name:"button_front",a:30,b:30,c:75,point:new P(f,-f,0)},{name:"button_right",a:75,b:30,c:30,point:new P(0,-f,f)},{name:"button_back",a:30,b:30,c:75,point:new P(-f,-f,0)},{name:"button_left",a:75,b:30,c:30,point:new P(0,-f,-f)},{name:"front_right",a:30,b:75,c:30,point:new P(f,0,f)},{name:"right_back",a:30,b:75,c:30,point:new P(-f,0,f)},{name:"back_left",a:30,b:75,c:30,point:new P(-f,0,-f)},{name:"left_front",a:30,b:75,c:30,point:new P(f,0,-f)}],v=0;v{let p=u.boundingBox.min,d=u.boundingBox.max;p.xi.x&&(i.x=d.x),d.y>i.y&&(i.y=d.y),d.z>i.z&&(i.z=d.z)});let r=Math.min(n.x,i.x),a=Math.min(n.y,i.y),o=Math.min(n.z,i.z),l=Math.max(n.x,i.x),c=Math.max(n.y,i.y),h=Math.max(n.z,i.z);return{min:new P(r,a,o),max:new P(l,c,h)}},e.rayInterationModel=function(t){let n=[];return s.engineStatus.models.forEach(r=>{r.info.lods.forEach(a=>{let o=a.octreeBox;i(t,o,r)})}),n=n.filter(r=>r instanceof rt),t.intersectObjects(n,!1);function i(r,a,o){if(a==null)return;let l=new P(a.min.X*.3048,a.min.Z*.3048,-a.min.Y*.3048),c=new P(a.max.X*.3048,a.max.Z*.3048,-a.max.Y*.3048),h=new P(Math.min(l.x,c.X),Math.min(l.y,c.y),Math.min(l.z,c.z)),u=new P(Math.max(c.x,l.x),Math.max(c.y,l.y),Math.max(c.z,l.z)),p=new gt(h,u),d=r.ray.intersectsBox(p);if(!(d==null||d==!1))if(a.children==null||a.children.length==0){if(a.elements!=null)for(var m of a.elements){let f=s.engineStatus.hideModels.find(b=>b.url==o.url)?.ids;if(f!=null&&f.includes(m))continue;let x=s.engineStatus.translucentModels.find(b=>b.url==o.url)?.ids;if(x!=null&&x.includes(m))continue;let g=s.models.find(b=>b.url==o.url).nodesMap.get(m);g!=null&&!g.instance&&g.infos.map(b=>b.mesh).forEach(b=>{n.push(b)})}}else{if(a.elements!=null)for(var m of a.elements){let x=s.engineStatus.hideModels.find(v=>v.url==o.url)?.ids;if(x!=null&&x.includes(m))continue;let g=s.engineStatus.translucentModels.find(v=>v.url==o.url)?.ids;if(g!=null&&g.includes(m))continue;let b=s.models.find(v=>v.url==o.url).nodesMap.get(m);b!=null&&!b.instance&&b.infos.map(v=>v.mesh).forEach(v=>{n.push(v)})}for(let f of a.children)i(r,f,o)}}},e}class jw{engine;isDrawing=!1;startPoint=new he;endPoint=new he;selectionBox=null;worldToScreen=null;boundMouseDown;boundMouseMove;boundMouseUp;boundKeyDown;constructor(e){this.engine=e,this.boundMouseDown=this.onMouseDown.bind(this),this.boundMouseMove=this.onMouseMove.bind(this),this.boundMouseUp=this.onMouseUp.bind(this),this.boundKeyDown=this.onKeyDown.bind(this)}init(){this.createSelectionBoxElement(),this.engine.scene&&this.engine.camera&&this.engine.renderer&&(this.worldToScreen=new Dn(this.engine.camera,this.engine.renderer,this.engine.scene))}active(){this.engine.controlModule.disActive();const e=this.engine.renderer?.domElement;e&&(e.addEventListener("mousedown",this.boundMouseDown),e.addEventListener("mousemove",this.boundMouseMove),e.addEventListener("mouseup",this.boundMouseUp),e.style.cursor="crosshair"),window.addEventListener("keydown",this.boundKeyDown)}disActive(){this.engine.controlModule.active();const e=this.engine.renderer?.domElement;e&&(e.removeEventListener("mousedown",this.boundMouseDown),e.removeEventListener("mousemove",this.boundMouseMove),e.removeEventListener("mouseup",this.boundMouseUp),e.style.cursor="default"),window.removeEventListener("keydown",this.boundKeyDown),this.isDrawing&&this.endDrawing()}createSelectionBoxElement(){this.selectionBox=document.createElement("div"),this.selectionBox.style.position="absolute",this.selectionBox.style.border="2px dashed #00aaff",this.selectionBox.style.backgroundColor="rgba(0, 170, 255, 0.1)",this.selectionBox.style.pointerEvents="none",this.selectionBox.style.display="none",this.selectionBox.style.zIndex="1000",this.selectionBox.style.boxSizing="border-box";const e=this.engine.renderer?.domElement;e&&e.parentElement&&e.parentElement.appendChild(this.selectionBox)}onMouseDown(e){e.button!==0||!this.engine.renderer?.domElement||(this.startPoint.set(e.offsetX,e.offsetY),this.endPoint.copy(this.startPoint),this.isDrawing=!0,this.selectionBox&&(this.selectionBox.style.display="block",this.updateSelectionBoxUI()),e.preventDefault(),e.stopPropagation())}onMouseMove(e){!this.isDrawing||!this.engine.renderer?.domElement||(this.endPoint.set(e.offsetX,e.offsetY),this.updateSelectionBoxUI(),e.preventDefault(),e.stopPropagation())}onMouseUp(e){this.isDrawing&&(this.endDrawing(),this.performZoom(),e.preventDefault(),e.stopPropagation(),this.disActive())}onKeyDown(e){e.key==="Escape"&&(this.disActive(),e.preventDefault(),e.stopPropagation())}endDrawing(){this.isDrawing&&(this.isDrawing=!1,this.selectionBox&&(this.selectionBox.style.display="none"))}updateSelectionBoxUI(){if(!this.selectionBox||!this.engine.renderer?.domElement)return;const e=Math.min(this.startPoint.x,this.endPoint.x),t=Math.min(this.startPoint.y,this.endPoint.y),n=Math.abs(this.endPoint.x-this.startPoint.x),i=Math.abs(this.endPoint.y-this.startPoint.y);this.selectionBox.style.left=`${e}px`,this.selectionBox.style.top=`${t}px`,this.selectionBox.style.width=`${n}px`,this.selectionBox.style.height=`${i}px`}performZoom(){const e=Math.abs(this.endPoint.x-this.startPoint.x),t=Math.abs(this.endPoint.y-this.startPoint.y);if(e<5||t<5)return;if(!this.worldToScreen){console.warn("RangeScale: 坐标转换工具未初始化");return}const n=Math.min(this.startPoint.x,this.endPoint.x),i=Math.max(this.startPoint.x,this.endPoint.x),r=Math.min(this.startPoint.y,this.endPoint.y),a=Math.max(this.startPoint.y,this.endPoint.y),o=[],l=[{x:n,y:r},{x:i,y:r},{x:i,y:a},{x:n,y:a}];for(const h of l){const u=this.worldToScreen.screenToWorld(h.x,h.y);u&&o.push(u)}if(o.length<3){console.warn("RangeScale: 框选区域未命中模型,无法执行缩放操作");return}if(o.length<3){console.warn("RangeScale: 无法将屏幕区域转换为世界坐标");return}const c=new gt;for(const h of o)c.expandByPoint(h);if(c.isEmpty()){console.warn("RangeScale: 计算得到的包围盒无效");return}this.fitCameraToBoundingBox(c)}fitCameraToBoundingBox(e){const t=this.engine.camera,n=this.engine.controls;if(!t||!n){console.warn("RangeScale: 相机或控制器未初始化");return}const i=new P;e.getCenter(i);const r=new P;e.getSize(r);const a=Math.max(r.x,r.y,r.z);if(t instanceof on){const o=t.fov*(Math.PI/180),l=a/(2*Math.tan(o/2))*1.2,c=new P;t.getWorldDirection(c);const h=i.clone().sub(t.position);c.dot(h.normalize())<0&&c.negate();const u=i.clone().sub(c.multiplyScalar(l));t.position.copy(u),n.target&&n.target.copy(i),t.lookAt(i),n.update()}else if(t instanceof Ai){const o=a*1.2,l=this.engine.renderer?.domElement,c=l?l.width/l.height:1;t.left=-o*c/2,t.right=o*c/2,t.top=o/2,t.bottom=-o/2,t.updateProjectionMatrix();const h=new P;t.getWorldDirection(h);const u=a*1.5,p=i.clone().sub(h.multiplyScalar(u));t.position.copy(p),n.target&&n.target.copy(i),t.lookAt(i),n.update()}}}class qw{engine;ground=null;constructor(e){this.engine=e}init(){}setStatsVisible(e){this.engine.stats?.dom&&(this.engine.stats.dom.style.display=e?"block":"none")}setAmbientLightIntensity(e){const t=this.engine.scene.children.find(n=>n instanceof jo);t&&(t.intensity=e)}setAmbientLightColor(e){const t=this.engine.scene.children.find(n=>n instanceof jo);t&&t.color.set(e)}setDirectionalLightIntensity(e){const t=this.engine.scene.children.find(n=>n instanceof Pi);t&&(t.intensity=e)}setDirectionalLightColor(e){const t=this.engine.scene.children.find(n=>n instanceof Pi);t&&t.color.set(e)}setShadowQuality(e){const t=this.engine.scene.children.find(n=>n instanceof Pi);if(t?.shadow){const n={low:1024,medium:2048,high:4096,ultra:8192}[e];t.shadow.mapSize.width=n,t.shadow.mapSize.height=n,t.shadow.map?.dispose(),t.shadow.map=null}}setDirectionalLightShadow(e){const t=this.engine.scene.children.find(n=>n instanceof Pi);t&&(t.castShadow=e),this.engine.renderer&&(this.engine.renderer.shadowMap.enabled=e)}setGTAOEnabled(e){if(!this.engine.composerModule?.composer){console.warn("Composer not initialized");return}const t=this.engine.composerModule.composer,n=t.passes.find(i=>i instanceof yn);if(e)if(n)n.enabled=!0;else{const{width:i,height:r}=this.engine.deviceModule.getContainerSize(),a=new yn(this.engine.scene,this.engine.camera,i,r);a.output=yn.OUTPUT.Default,a.blendIntensity=.5,a.updateGtaoMaterial&&a.updateGtaoMaterial({radius:1,distanceExponent:1,thickness:1,scale:1,distanceFallOff:1,screenSpaceRadius:!0});const o=t.passes.findIndex(l=>l.constructor.name==="RenderPass");t.passes.splice(o+1,0,a)}else n&&(n.enabled=!1)}setSceneSaturation(e){if(!this.engine.composerModule?.saturationPass){console.warn("Saturation pass not initialized");return}this.engine.composerModule.saturationPass.uniforms.saturation.value=e}setSceneContrast(e){if(!this.engine.composerModule?.saturationPass){console.warn("Saturation pass not initialized");return}this.engine.composerModule.saturationPass.uniforms.contrast.value=e}setGroundEnabled(e,t){if(e)if(this.ground)this.ground.visible=!0;else{const n=t?.size??100,i=t?.color??8421504,r=t?.opacity??.3,a=new Ss(n,n),o=new Ki({color:i,transparent:!0,opacity:r,side:yt});this.ground=new rt(a,o),this.ground.rotation.x=-Math.PI/2,this.ground.position.y=0,this.ground.receiveShadow=!0,this.ground.name="ground",this.engine.scene.add(this.ground)}else this.ground&&(this.ground.visible=!1)}setHDRBackground(e){e?(this.engine.scene.background=e,this.engine.scene.environment=e):(this.engine.scene.background=null,this.engine.scene.environment=null)}}function Di(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(s){var e=Math.random()*16|0,t=s=="x"?e:e&3|8;return t.toString(16)})}class Ii{engine;handelBehaved;setting;constructor(e){this.engine=e,this.handelBehaved=cu(e),this.handelBehaved.init(this,null),this.setting={unit:"m",precision:3}}getSetting(){return this.setting}saveSetting(e){this.setting=e}active(){this.handelBehaved.active()}disActive(){this.handelBehaved.disActive()}getMeasureText(e,t){if(e==null)return null;let n=this.setting.unit,i=n;return t==1?n=="mm"?e=e*1e3:n=="cm"?e=e*100:n=="dm"?e=e*10:n=="m"?e=e*1:n=="km"&&(e=e*.001):t==2&&(n=="mm"?e=e*1e3*1e3:n=="cm"?e=e*100*100:n=="dm"?e=e*10*10:n=="m"?e=e*1*1:n=="km"&&(e=e*.001*.001),i=i+"²"),e.toFixed(this.setting.precision)+" "+i}cancelCurrentSelectedAnnotation(){let e=this.engine.measure.annotationData;for(let t in e)e[t].forEach(n=>{n.highlight==!0&&(n.highlight=!1,n.container.classList.remove("Hight"),n.container.getElementsByTagName("svg")[0].classList.remove("Hight"))})}handelKeyEscDown(){this.cancelCurrentSelectedAnnotation();let e=this.engine.measure.annotationData;for(let t in e)for(let n=e[t].length-1;n>=0;n--){let i=e[t][n];i.isSelect==!0&&(i.container.remove(),e[t].splice(n,1))}this.engine.measure.clearAllPoints()}handelKeyDeleteDown(){let e=this.engine.measure.annotationData;for(let t in e)for(let n=e[t].length-1;n>=0;n--){let i=e[t][n];i.highlight==!0&&(i.container.remove(),e[t].splice(n,1))}}clearHighlight(){let e=this.engine.measure.annotationData;for(let t in e)e[t].forEach(n=>{n.highlight=!1,n.container.classList.remove("Hight"),n.container.getElementsByTagName("svg")[0].classList.remove("Hight")})}drawNormalAnnotation(){let e=this;this.engine.measure.annotationData.normalAnnotation.forEach(l=>{o(l)}),this.engine.measure.annotationData.elevationAnnotation.forEach(l=>{a(l)}),this.engine.measure.annotationData.coordinateAnnotation.forEach(l=>{r(l)}),this.engine.measure.annotationData.angleAnnotation.forEach(l=>{t(l)}),this.engine.measure.annotationData.areaAnnotation.forEach(l=>{n(l)}),this.engine.measure.annotationData.slopeAnnotation.forEach(l=>{i(l)});function t(l){if(l.container==null){let g=['','','','','','','',''+l.text+"",""].join("");l.container=document.createElement("div"),l.container.className="angle-annotation",l.container.id=l.id,l.container.style.pointerEvents="none",l.container.innerHTML=g,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0,e.engine.events.trigger(Yt.MeasureClick,l)})}let c=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point1),h=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point2),u=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point3),p=e.engine.reactBoundingClientRect.left,d=e.engine.reactBoundingClientRect.top;c.x+=p,c.y+=d,h.x+=p,h.y+=d,u.x+=p,u.y+=d;let m=l.container;m.getElementsByTagName("circle")[0].setAttribute("cx",c.x),m.getElementsByTagName("circle")[0].setAttribute("cy",c.y),m.getElementsByTagName("circle")[1].setAttribute("cx",h.x),m.getElementsByTagName("circle")[1].setAttribute("cy",h.y),m.getElementsByTagName("circle")[2].setAttribute("cx",u.x),m.getElementsByTagName("circle")[2].setAttribute("cy",u.y),m.getElementsByTagName("polyline")[0].setAttribute("points",c.x+","+c.y+" "+h.x+","+h.y),m.getElementsByTagName("polyline")[1].setAttribute("points",h.x+","+h.y+" "+u.x+","+u.y);let f=h.x,x=h.y-30;m.getElementsByTagName("rect")[0].setAttribute("x",f-40),m.getElementsByTagName("rect")[0].setAttribute("y",x-12.5),m.getElementsByTagName("text")[0].setAttribute("x",f),m.getElementsByTagName("text")[0].setAttribute("y",x+4),m.getElementsByTagName("text")[0].innerHTML=l.text,m.style.top="0px",m.style.left="0px"}function n(l){if(l.container==null){let b=['','','','',''+e.getMeasureText(l.text,2)+"",""].join("");l.container=document.createElement("div"),l.container.className="area-annotation",l.container.id=l.id,l.container.innerHTML=b,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0,e.engine.events.trigger(Yt.MeasureClick,l)})}if(!l.points||l.points.length<3)return;let c=e.engine.reactBoundingClientRect.left,h=e.engine.reactBoundingClientRect.top,u=[],p=0,d=0;for(let b=0;bb.x+","+b.y).join(" "),f=l.container;f.getElementsByTagName("polygon")[0].setAttribute("points",m),f.getElementsByTagName("polyline")[0].setAttribute("points",m);let x=p,g=d;f.getElementsByTagName("rect")[0].setAttribute("x",x-40),f.getElementsByTagName("rect")[0].setAttribute("y",g-12.5),f.getElementsByTagName("text")[0].setAttribute("x",x),f.getElementsByTagName("text")[0].setAttribute("y",g+4),f.getElementsByTagName("text")[0].innerHTML=e.getMeasureText(l.text,2),f.style.top="0px",f.style.left="0px"}function i(l){if(l.container==null){let x=['',"",'','',"","",'','',''+l.text+"",""].join("");l.container=document.createElement("div"),l.container.className="slope-annotation",l.container.id=l.id,l.container.innerHTML=x,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0,e.engine.events.trigger(Yt.MeasureClick,l)})}let c=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point1),h=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point2),u=e.engine.reactBoundingClientRect.left,p=e.engine.reactBoundingClientRect.top;c.x+=u,c.y+=p,h.x+=u,h.y+=p;let d=l.container;d.getElementsByTagName("polyline")[0].setAttribute("points",c.x+","+c.y+" "+h.x+","+h.y);let m=(c.x+h.x)/2,f=(c.y+h.y)/2-30;d.getElementsByTagName("rect")[0].setAttribute("x",m-50),d.getElementsByTagName("rect")[0].setAttribute("y",f-12.5),d.getElementsByTagName("text")[0].setAttribute("x",m),d.getElementsByTagName("text")[0].setAttribute("y",f+4),d.getElementsByTagName("text")[0].innerHTML=l.text,d.style.top="0px",d.style.left="0px"}function r(l){if(l.container==null){let g=['','','','X: '+e.getMeasureText(l.textX,1)+"",'','Y: '+e.getMeasureText(-l.textZ,1)+"",'','Z: '+e.getMeasureText(l.textY,1)+"",""].join("");l.container=document.createElement("div"),l.container.className="coordinate-annotation",l.container.id=l.id,l.container.style.position="absolute",l.container.style.pointerEvents="none",l.container.innerHTML=g,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0,e.engine.events.trigger(Yt.MeasureClick,l)})}let c=l.container,h=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point),u=e.engine.reactBoundingClientRect.left,p=e.engine.reactBoundingClientRect.top;h.x+=u,h.y+=p,c.style.top="0px",c.style.left="0px";let d=c.getElementsByTagName("circle")[0];d&&(d.setAttribute("cx",h.x),d.setAttribute("cy",h.y));let m=c.getElementsByTagName("rect"),f=c.getElementsByTagName("text"),x=-55;m[0]&&(m[0].setAttribute("x",h.x+10),m[0].setAttribute("y",h.y+10+x)),f[0]&&(f[0].setAttribute("x",h.x+10+40),f[0].setAttribute("y",h.y+10+16+x)),m[1]&&(m[1].setAttribute("x",h.x+10),m[1].setAttribute("y",h.y+10+30+x)),f[1]&&(f[1].setAttribute("x",h.x+10+40),f[1].setAttribute("y",h.y+10+46+x)),m[2]&&(m[2].setAttribute("x",h.x+10),m[2].setAttribute("y",h.y+10+60+x)),f[2]&&(f[2].setAttribute("x",h.x+10+40),f[2].setAttribute("y",h.y+10+76+x)),f[0]&&(f[0].innerHTML="X: "+e.getMeasureText(l.textX,1)),f[1]&&(f[1].innerHTML="Y: "+e.getMeasureText(-l.textZ,1)),f[2]&&(f[2].innerHTML="Z: "+e.getMeasureText(l.textY,1))}function a(l){if(l.container==null){let d=['','',''+e.getMeasureText(l.text,1)+"",'',""].join("");l.container=document.createElement("div"),l.container.className="elevation-annotation",l.container.id=l.id,l.container.style.position="absolute",l.container.style.pointerEvents="none",l.container.innerHTML=d,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0,e.engine.events.trigger(Yt.MeasureClick,l)})}let c=l.container,h=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point),u=e.engine.reactBoundingClientRect.left,p=e.engine.reactBoundingClientRect.top;c.style.top=h.y+p-48+"px",c.style.left=h.x+u-16+"px",c.getElementsByTagName("text")[0].innerHTML=e.getMeasureText(l.text,1)}function o(l){if(l.container==null){let m=['','','','','',''+e.getMeasureText(l.text,1)+"",""].join("");l.container=document.createElement("div"),l.container.className="normal-annotation",l.container.id=l.id,l.container.innerHTML=m,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0,e.engine.events.trigger(Yt.MeasureClick,l)})}let c=l.container;if(l.point1==null||l.point2==null){c.style.display="none";return}else c.style.display="block";let h=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point1),u=new Dn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point2),p=e.engine.reactBoundingClientRect.left,d=e.engine.reactBoundingClientRect.top;h.x+=p,h.y+=d,u.x+=p,u.y+=d,c.getElementsByTagName("polyline")[0].setAttribute("points",h.x+","+h.y+" "+u.x+","+u.y),c.getElementsByTagName("circle")[0].setAttribute("cx",h.x),c.getElementsByTagName("circle")[0].setAttribute("cy",h.y),c.getElementsByTagName("circle")[1].setAttribute("cx",u.x),c.getElementsByTagName("circle")[1].setAttribute("cy",u.y),c.getElementsByTagName("rect")[0].setAttribute("x",h.x*.5+u.x*.5-40),c.getElementsByTagName("rect")[0].setAttribute("y",h.y*.5+u.y*.5-12.5),c.getElementsByTagName("text")[0].setAttribute("x",h.x*.5+u.x*.5+40-40),c.getElementsByTagName("text")[0].setAttribute("y",h.y*.5+u.y*.5+16-12.5),c.getElementsByTagName("text")[0].innerHTML=e.getMeasureText(l.text,1),c.style.top="0px",c.style.left="0px"}}}class Zw{engine;isActive=!1;tools;points=[];behavior;catchDir=0;type="point";constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.isActive=!0,this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active();let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}setDirection(e){this.catchDir=e}setSelectType(e){this.type=e}getMeshesMinMaxY(e){if(!Array.isArray(e)||e.length===0)return null;let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;for(let i=0;in&&(n=a.max.y))}return!Number.isFinite(t)||!Number.isFinite(n)?null:{minY:t,maxY:n}}handleMouseClick(e){if(e.catch==null)return;let t=e.catch.point;if(this.type=="element"){let r=this.engine.interactionModule.getCatchMeshs(e);var n=this.getMeshesMinMaxY(r);this.catchDir==0?t.set(t.x,n?.minY,t.z):t.set(t.x,n?.maxY,t.z)}else t=e.catch.point;if(this.points.length==0){this.points.push(t);return}let i=this.engine.measure.annotationData.normalAnnotation.find(r=>r.isSelect==!0);i!=null&&(i.isSelect=!1)}handleMouseMove(e){if(e.catch==null||this.points.length==0)return;let t=this.engine.measure.annotationData.normalAnnotation.find(i=>i.isSelect==!0);t==null&&(t={text:null,id:Di(),isSelect:!0,type:"clear-height"},this.engine.measure.annotationData.normalAnnotation.push(t));let n=e.catch;if(this.type=="element"){let i=e.catch.point.clone();i.set(i.x,this.points[0].y,i.z);let r=new Qi(i.add(new P(0,.01,0)),new P(0,this.catchDir==0?-1:1,0));n.point=this.points[0];const a=this.engine.octreeBox.rayInterationModel(r);if(a.length===0){t.point2=null;return}t.point1=i,t.point2=a[0].point,t.text=t.point1.clone().distanceTo(t.point2.clone()),this.engine.events.trigger(Yt.MeasureChanged,t)}else{let i=new Qi(e.catch.point.clone().add(new P(0,.01,0)),new P(0,this.catchDir==0?-1:1,0));const r=this.engine.octreeBox.rayInterationModel(i);if(r.length===0){t.point2=null;return}t.point1=n.point,t.point2=r[0].point,t.text=t.point1.clone().distanceTo(t.point2.clone()),this.engine.events.trigger(Yt.MeasureChanged,t)}}}class Yw{engine;tools;isActive=!1;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.isActive=!0,this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this,{showCatch:!0}),this.behavior.active();let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.points=[],this.isActive=!1,this.engine.handelBehaved.disActive()}clearAllPoints(){this.points=[]}handleMouseClick(e){if(e.catch==null)return;let t=e.catch;if(this.points.length==0)this.points.push(t.point);else if(this.points.length==1){let n=this.engine.measure.annotationData.normalAnnotation.find(i=>i.isSelect==!0);if(n==null)return;n.point2=t.point,n.isSelect=!1,this.points=[],this.engine.events.trigger(Yt.MeasureChanged,n)}}handleMouseMove(e){if(e.catch==null)return;let t=e.catch;if(t!=null&&this.points.length==1){let n=this.engine.measure.annotationData.normalAnnotation.find(i=>i.isSelect==!0);n==null&&(n={id:Di(),point1:this.points[0].clone(),point2:t.point.clone(),text:this.points[0].clone().distanceTo(t.point.clone()),type:"distance",isSelect:!0},this.engine.measure.annotationData.normalAnnotation.push(n)),n.point2=t.point,n.text=n.point1.clone().distanceTo(n.point2.clone())}}}class $w{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.isActive=!0,this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active();let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseClick(e){if(e.catch==null)return;if(this.points.length==0){this.points.push(e.catch.point);return}let t=this.engine.measure.annotationData.normalAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1)}handleMouseMove(e){if(e.catch==null||this.points.length==0)return;let t=this.engine.measure.annotationData.normalAnnotation.find(a=>a.isSelect==!0);t==null&&(t={text:null,id:Di(),isSelect:!0,type:"clear-distance"},this.engine.measure.annotationData.normalAnnotation.push(t));let n=new Qi(e.catch.point.clone().add(e.catch.face.normal.clone().setLength(.01)),e.catch.face.normal);const i=this.engine.octreeBox.rayInterationModel(n);if(i.length==0){t.point2=null;return}let r=e.catch;t.point1=r.point,t.point2=i[0].point,t.text=t.point1.clone().distanceTo(t.point2.clone()),this.engine.events.trigger(Yt.MeasureChanged,t)}}class Kw{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active(),this.isActive=!0;let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseMove(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.elevationAnnotation.find(n=>n.isSelect==!0);t==null&&(t={id:Di(),point:e.catch.point.clone(),text:e.catch.point.y,isSelect:!0,type:"elevation"},this.engine.measure.annotationData.elevationAnnotation.push(t)),t.point=e.catch.point.clone(),t.text=e.catch.point.y}handleMouseClick(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.elevationAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1,t.point=e.catch.point.clone(),t.text=e.catch.point.y,this.engine.events.trigger(Yt.MeasureChanged,t))}}class Jw{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active(),this.isActive=!0;let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseMove(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.coordinateAnnotation.find(n=>n.isSelect==!0);t==null&&(t={id:Di(),point:e.catch.point.clone(),text:Math.round(e.catch.point.y)+" m",isSelect:!0,type:"point"},this.engine.measure.annotationData.coordinateAnnotation.push(t)),t.point=e.catch.point.clone(),t.textX=e.catch.point.x,t.textY=e.catch.point.y,t.textZ=e.catch.point.z}handleMouseClick(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.coordinateAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1,t.point=e.catch.point.clone(),t.textX=e.catch.point.x,t.textY=e.catch.point.y,t.textZ=e.catch.point.z,this.engine.events.trigger(Yt.MeasureChanged,t))}}class Qw{engine;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active();let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.points=[],this.behavior?.disActive()}clearAllPoints(){this.points=[]}calculateAngle(e,t,n){const i=new P().subVectors(e,t),r=new P().subVectors(n,t),a=i.length(),o=r.length();if(a===0||o===0)return 0;const l=i.dot(r)/(a*o),c=Math.max(-1,Math.min(1,l));return Math.acos(c)*(180/Math.PI)}handleMouseClick(e){if(e.catch==null)return;let t=e.catch;if(this.points.length==0)this.points.push(t.point);else if(this.points.length==1)this.points.push(t.point);else if(this.points.length==2){let n=this.engine.measure.annotationData.angleAnnotation.find(i=>i.isSelect==!0);if(n==null)return;n.point3=t.point.clone(),n.angle=this.calculateAngle(n.point1,n.point2,n.point3),n.text=n.angle.toFixed(2)+"°",n.isSelect=!1,n.type="angle",this.points=[],this.engine.events.trigger(Yt.MeasureChanged,n)}}handleMouseMove(e){if(e.catch!=null&&this.points.length!=1&&this.points.length==2){let t=this.engine.measure.annotationData.angleAnnotation.find(n=>n.isSelect==!0);t==null&&(t={id:Di(),point1:this.points[0].clone(),point2:this.points[1].clone(),point3:e.catch.point.clone(),angle:0,text:"0.00°",isSelect:!0,type:"angle"},this.engine.measure.annotationData.angleAnnotation.push(t)),t.point3=e.catch.point.clone(),t.angle=this.calculateAngle(t.point1,t.point2,t.point3),t.text=t.angle.toFixed(2)+"°",console.log("角度",t.text)}}}class eS{engine;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active();let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.points=[],this.behavior?.disActive()}clearAllPoints(){this.points=[]}calculateArea(e){if(e.length<3)return 0;let t=0;const n=e.length;for(let i=0;i=3){let n=this.engine.measure.annotationData.areaAnnotation.find(i=>i.isSelect==!0);n==null?(n={id:Di(),points:this.points.map(i=>i.clone()),area:0,text:0,isSelect:!0,type:"area"},this.engine.measure.annotationData.areaAnnotation.push(n)):(this.points.push(t.point.clone()),n.points=this.points.map(i=>i.clone())),n.area=this.calculateArea(n.points),n.text=n.area,console.log("面积",n.text)}}handleMouseMove(e){if(e.catch!=null&&this.points.length>=2){let t=this.engine.measure.annotationData.areaAnnotation.find(n=>n.isSelect==!0);if(t==null){if(this.points.length>=2){let n=this.points.map(i=>i.clone());n.push(e.catch.point.clone()),n.length>=3&&(t={id:Di(),points:n,area:0,text:0,isSelect:!0,type:"area"},this.engine.measure.annotationData.areaAnnotation.push(t))}}else if(t.points.length>0){const n=t.points.length-1;t.points[n]=e.catch.point.clone()}else t.points=this.points.map(n=>n.clone()),t.points.push(e.catch.point.clone());t&&t.points.length>=3&&(t.area=this.calculateArea(t.points),t.text=t.area)}}handelKeyEnterDown(){this.finishMeasure()}finishMeasure(){this.points=this.points.slice(0,this.points.length-1);let e=this.engine.measure.annotationData.areaAnnotation.find(t=>t.isSelect==!0);e!=null&&e.points.length>=3&&(e.points.length>this.points.length&&(e.points=this.points.map(t=>t.clone())),e.area=this.calculateArea(e.points),e.text=e.area,e.isSelect=!1,this.points=[],this.engine.events.trigger(Yt.MeasureChanged,e))}}class tS{engine;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ii(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active();let e=this.engine.measure.annotationData.normalAnnotation.find(t=>t.isSelect==!0);e!=null&&(e.isSelect=!1)}disActive(){this.points=[],this.behavior?.disActive()}clearAllPoints(){this.points=[]}calculateSlope(e,t){const n=t.y-e.y,i=t.x-e.x,r=t.z-e.z,a=Math.sqrt(i*i+r*r);if(a===0)return{percentage:0,angle:0,heightDiff:n,horizontalDist:0,type:"slope"};const o=n/a*100,l=Math.atan(n/a)*(180/Math.PI);return{percentage:o,angle:l,heightDiff:n,horizontalDist:a,type:"slope"}}handleMouseClick(e){if(e.catch==null)return;let t=e.catch;if(this.points.length==0)this.points.push(t.point);else if(this.points.length==1){let n=this.engine.measure.annotationData.slopeAnnotation.find(r=>r.isSelect==!0);if(n==null)return;console.log("进来了"),n.point2=t.point.clone();const i=this.calculateSlope(n.point1,n.point2);n.slopePercentage=i.percentage,n.slopeAngle=i.angle,n.heightDiff=i.heightDiff,n.horizontalDist=i.horizontalDist,n.text=i.percentage.toFixed(2)+"% ("+i.angle.toFixed(2)+"°)",n.isSelect=!1,this.points=[],this.engine.events.trigger(Yt.MeasureChanged,n)}}handleMouseMove(e){if(e.catch==null)return;let t=e.catch;if(t!=null&&this.points.length==1){let n=this.engine.measure.annotationData.slopeAnnotation.find(r=>r.isSelect==!0);n==null&&(n={id:Di(),point1:this.points[0].clone(),point2:t.point.clone(),slopePercentage:0,slopeAngle:0,heightDiff:0,horizontalDist:0,text:"0.00% (0.00°)",isSelect:!0,type:"slope"},this.engine.measure.annotationData.slopeAnnotation.push(n)),n.point2=t.point.clone();const i=this.calculateSlope(n.point1,n.point2);n.slopePercentage=i.percentage,n.slopeAngle=i.angle,n.heightDiff=i.heightDiff,n.horizontalDist=i.horizontalDist,n.text=i.percentage.toFixed(2)+"% ("+i.angle.toFixed(2)+"°)"}}}class nS{isActive=!1;engine;clearHeightMeasure;distanceMeasure;clearDistanceMeasure;elevationMeasure;pointMeasure;angleMeasure;areaMeasure;slopeMeasure;tools;annotationContainer;annotationData={normalAnnotation:[],textAnnotation:[],coordinateAnnotation:[],angleAnnotation:[],distanceAnnotation:[],areaAnnotation:[],slopeAnnotation:[],elevationAnnotation:[],volumeAnnotation:[]};constructor(e){this.engine=e,this.clearHeightMeasure=new Zw(e),this.distanceMeasure=new Yw(e),this.clearDistanceMeasure=new $w(e),this.elevationMeasure=new Kw(e),this.pointMeasure=new Jw(e),this.angleMeasure=new Qw(e),this.areaMeasure=new eS(e),this.slopeMeasure=new tS(e),this.tools=new Ii(e),this.annotationContainer=document.createElement("div"),this.annotationContainer.className="annotation-container",e.container.appendChild(this.annotationContainer)}active(){this.isActive=!0,this.engine.modelEdge.loadModelEdge(),this.tools.active()}disActive(){this.tools.disActive(),this.clearAll(),this.isActive=!1,this.clearHeightMeasure.disActive(),this.distanceMeasure.disActive(),this.clearDistanceMeasure.disActive(),this.elevationMeasure.disActive(),this.pointMeasure.disActive(),this.angleMeasure.disActive(),this.areaMeasure.disActive(),this.slopeMeasure.disActive(),this.engine.interactionModule.init(),this.engine.interactionModule.active()}clearAllPoints(){this.clearHeightMeasure.clearAllPoints(),this.distanceMeasure.clearAllPoints(),this.clearDistanceMeasure.clearAllPoints(),this.elevationMeasure.clearAllPoints(),this.pointMeasure.clearAllPoints(),this.angleMeasure.clearAllPoints(),this.areaMeasure.clearAllPoints(),this.slopeMeasure.clearAllPoints()}clearAll(){e(this.annotationData.normalAnnotation),e(this.annotationData.textAnnotation),e(this.annotationData.coordinateAnnotation),e(this.annotationData.angleAnnotation),e(this.annotationData.distanceAnnotation),e(this.annotationData.areaAnnotation),e(this.annotationData.slopeAnnotation),e(this.annotationData.elevationAnnotation),e(this.annotationData.volumeAnnotation);function e(t){for(let n=0;n65535?new Uint32Array(new e(4*s)):new Uint16Array(new e(2*s))}function lS(s,e){if(!s.index){const t=s.attributes.position.count,n=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=oS(t,n);s.setIndex(new bt(i,1));for(let r=0;ri&&(o.push({pos:Math.max(i,d),isStart:!0}),o.push({pos:Math.min(r,f),isStart:!1}))}o.sort((h,u)=>h.pos!==u.pos?h.pos-u.pos:h.type==="end"?-1:1);let l=0,c=null;for(const h of o){const u=h.pos;l!==0&&u!==c&&t.push({offset:c,count:u-c}),l+=h.isStart?1:-1,c=u}return t}function Iu(s,e,t,n,i){let r=1/0,a=1/0,o=1/0,l=-1/0,c=-1/0,h=-1/0,u=1/0,p=1/0,d=1/0,m=-1/0,f=-1/0,x=-1/0;const g=s.offset||0;for(let b=(e-g)*6,v=(e+t-g)*6;bl&&(l=C),ym&&(m=y);const R=s[b+2],S=s[b+3],E=R-S,L=R+S;Ec&&(c=L),Rf&&(f=R);const A=s[b+4],I=s[b+5],w=A-I,z=A+I;wh&&(h=z),Ax&&(x=A)}n[0]=r,n[1]=a,n[2]=o,n[3]=l,n[4]=c,n[5]=h,i[0]=u,i[1]=p,i[2]=d,i[3]=m,i[4]=f,i[5]=x}function h0(s,e,t=null,n=null,i=null){const r=s.attributes.position,a=s.index?s.index.array:null,o=r.normalized;if(i===null)i=new Float32Array(t*6),i.offset=e;else if(e<0||t+e>i.length/6)throw new Error("MeshBVH: compute triangle bounds range is invalid.");const l=r.array,c=r.offset||0;let h=3;r.isInterleavedBufferAttribute&&(h=r.data.stride);const u=["getX","getY","getZ"],p=i.offset;for(let d=e,m=e+t;dS&&(S=M),C>S&&(S=C);const E=(S-R)/2,L=y*2;i[x+L+0]=R+E,i[x+L+1]=E+(Math.abs(R)+E)*rS}}return i}function Nt(s,e,t){return t.min.x=e[s],t.min.y=e[s+1],t.min.z=e[s+2],t.max.x=e[s+3],t.max.y=e[s+4],t.max.z=e[s+5],t}function u0(s){let e=-1,t=-1/0;for(let n=0;n<3;n++){const i=s[n+3]-s[n];i>t&&(t=i,e=n)}return e}function d0(s,e){e.set(s)}function p0(s,e,t){let n,i;for(let r=0;r<3;r++){const a=r+3;n=s[r],i=e[r],t[r]=ni?n:i}}function Sl(s,e,t){for(let n=0;n<3;n++){const i=e[s+2*n],r=e[s+2*n+1],a=i-r,o=i+r;at[n+3]&&(t[n+3]=o)}}function Ba(s){const e=s[3]-s[0],t=s[4]-s[1],n=s[5]-s[2];return 2*(e*t+t*n+n*e)}const Ni=32,cS=(s,e)=>s.candidate-e.candidate,is=new Array(Ni).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),El=new Float32Array(6);function hS(s,e,t,n,i,r){let a=-1,o=0;if(r===s0)a=u0(e),a!==-1&&(o=(e[a]+e[a+3])/2);else if(r===iS)a=u0(s),a!==-1&&(o=uS(t,n,i,a));else if(r===sS){const l=Ba(s);let c=Lu*i;const h=t.offset||0,u=(n-h)*6,p=(n+i-h)*6;for(let d=0;d<3;d++){const m=e[d],f=(e[d+3]-m)/Ni;if(i=M.candidate?Sl(v,t,M.rightCacheBounds):(Sl(v,t,M.leftCacheBounds),M.count++)}}for(let v=0;v=Ni&&(v=Ni-1);const y=is[v];y.count++,Sl(b,t,y.bounds)}const x=is[Ni-1];d0(x.bounds,x.rightCacheBounds);for(let b=Ni-2;b>=0;b--){const v=is[b],y=is[b+1];p0(v.bounds,y.rightCacheBounds,v.rightCacheBounds)}let g=0;for(let b=0;b=l;)o--;if(a=l;)o--;if(afS)throw new Error("MeshBVH: Cannot store relative child node offset greater than 32 bits.");return Cl[t+6]=p,Cl[t+7]=l,Uu(h,o)}}function gS(s,e,t){const n=(s.index?s.index.count:s.attributes.position.count)/3>65536,i=t.reduce((c,h)=>c+h.count,0),r=n?4:2,a=e?new SharedArrayBuffer(i*r):new ArrayBuffer(i*r),o=n?new Uint32Array(a):new Uint16Array(a);let l=0;for(let c=0;c=r&&(g=!0,a&&(console.warn(`MeshBVH: Max depth of ${r} reached when generating BVH. Consider increasing maxDepth.`),console.warn(p))),C<=o||S>=r)return v(M+C),_.offset=M,_.count=C,_;const E=hS(_.boundingData,R,e,M,C,l);if(E.axis===-1)return v(M+C),_.offset=M,_.count=C,_;const L=m(u,d,e,M,C,E);if(L===M||L===M+C)v(M+C),_.offset=M,_.count=C;else{_.splitAxis=E.axis;const A=new Nu,I=M,w=L-M;_.left=A,Iu(e,I,w,A.boundingData,x),y(A,I,w,x,S+1);const z=new Nu,G=L,j=C-w;_.right=z,Iu(e,G,j,z.boundingData,x),y(z,G,j,x,S+1)}return _}}function vS(s,e){const t=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,n=s.geometry;let i,r;if(e.indirect){const a=c0(n,e.range),o=gS(n,e.useSharedArrayBuffer,a);s._indirectBuffer=o,i=h0(n,0,o.length,o),r=[{offset:0,count:o.length}]}else{lS(n,e);const a=l0(n,e.range)[0];i=h0(n,a.offset,a.count),r=c0(n,e.range)}s._roots=r.map(a=>{const o=xS(s,i,a.offset,a.count,e),l=ku(o),c=new t(fn*l);return mS(0,o,c),c})}class Bi{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(e,t){let n=1/0,i=-1/0;for(let r=0,a=e.length;ri?o:i}this.min=n,this.max=i}setFromPoints(e,t){let n=1/0,i=-1/0;for(let r=0,a=t.length;ri?l:i}this.min=n,this.max=i}isSeparated(e){return this.min>e.max||e.min>this.max}}Bi.prototype.setFromBox=(function(){const s=new P;return function(e,t){const n=t.min,i=t.max;let r=1/0,a=-1/0;for(let o=0;o<=1;o++)for(let l=0;l<=1;l++)for(let c=0;c<=1;c++){s.x=n.x*o+i.x*(1-o),s.y=n.y*l+i.y*(1-l),s.z=n.z*c+i.z*(1-c);const h=e.dot(s);r=Math.min(h,r),a=Math.max(h,a)}this.min=r,this.max=a}})();const bS=(function(){const s=new P,e=new P,t=new P;return function(n,i,r){const a=n.start,o=s,l=i.start,c=e;t.subVectors(a,l),s.subVectors(n.end,n.start),e.subVectors(i.end,i.start);const h=t.dot(c),u=c.dot(o),p=c.dot(c),d=t.dot(o),m=o.dot(o)*p-u*u;let f,x;m!==0?f=(h*u-d*p)/m:f=0,x=(h+f*u)/p,r.x=f,r.y=x}})(),Ou=(function(){const s=new he,e=new P,t=new P;return function(n,i,r,a){bS(n,i,s);let o=s.x,l=s.y;if(o>=0&&o<=1&&l>=0&&l<=1){n.at(o,r),i.at(l,a);return}else if(o>=0&&o<=1){l<0?i.at(0,a):i.at(1,a),n.closestPointToPoint(a,!0,r);return}else if(l>=0&&l<=1){o<0?n.at(0,r):n.at(1,r),i.closestPointToPoint(r,!0,a);return}else{let c;o<0?c=n.start:c=n.end;let h;l<0?h=i.start:h=i.end;const u=e,p=t;if(n.closestPointToPoint(h,!0,e),i.closestPointToPoint(c,!0,t),u.distanceToSquared(h)<=p.distanceToSquared(c)){r.copy(u),a.copy(h);return}else{r.copy(c),a.copy(p);return}}}})(),yS=(function(){const s=new P,e=new P,t=new Dt,n=new Vn;return function(i,r){const{radius:a,center:o}=i,{a:l,b:c,c:h}=r;if(n.start=l,n.end=c,n.closestPointToPoint(o,!0,s).distanceTo(o)<=a||(n.start=l,n.end=h,n.closestPointToPoint(o,!0,s).distanceTo(o)<=a)||(n.start=c,n.end=h,n.closestPointToPoint(o,!0,s).distanceTo(o)<=a))return!0;const u=r.getPlane(t);if(Math.abs(u.distanceToPoint(o))<=a){const p=u.projectPoint(o,e);if(r.containsPoint(p))return!0}return!1}})(),_S=["x","y","z"],ki=1e-15,g0=ki*ki;function Wn(s){return Math.abs(s)new P),this.satBounds=new Array(4).fill().map(()=>new Bi),this.points=[this.a,this.b,this.c],this.plane=new Dt,this.isDegenerateIntoSegment=!1,this.isDegenerateIntoPoint=!1,this.degenerateSegment=new Vn,this.needsUpdate=!0}intersectsSphere(e){return yS(e,this)}update(){const e=this.a,t=this.b,n=this.c,i=this.points,r=this.satAxes,a=this.satBounds,o=r[0],l=a[0];this.getNormal(o),l.setFromPoints(o,i);const c=r[1],h=a[1];c.subVectors(e,t),h.setFromPoints(c,i);const u=r[2],p=a[2];u.subVectors(t,n),p.setFromPoints(u,i);const d=r[3],m=a[3];d.subVectors(n,e),m.setFromPoints(d,i);const f=c.length(),x=u.length(),g=d.length();this.isDegenerateIntoPoint=!1,this.isDegenerateIntoSegment=!1,f0)d(v.c,v.a,v.b,M,y,_,L,S,E,A,I);else if(R>0)d(v.b,v.a,v.c,_,y,M,E,S,L,A,I);else if(E*L>0||S!=0)d(v.a,v.b,v.c,y,_,M,S,E,L,A,I);else if(E!=0)d(v.b,v.a,v.c,_,y,M,E,S,L,A,I);else if(L!=0)d(v.c,v.a,v.b,M,y,_,L,S,E,A,I);else return!0;return!1}function f(v,y,_,M){const C=y.degenerateSegment,R=v.plane.distanceToPoint(C.start),S=v.plane.distanceToPoint(C.end);return Wn(R)?Wn(S)?p(v,y,_,M):(_&&(_.start.copy(C.start),_.end.copy(C.start)),v.containsPoint(C.start)):Wn(S)?(_&&(_.start.copy(C.end),_.end.copy(C.end)),v.containsPoint(C.end)):v.plane.intersectLine(C,n)!=null?(_&&(_.start.copy(n),_.end.copy(n)),v.containsPoint(n)):!1}function x(v,y,_){const M=y.a;return Wn(v.plane.distanceToPoint(M))&&v.containsPoint(M)?(_&&(_.start.copy(M),_.end.copy(M)),!0):!1}function g(v,y,_){const M=v.degenerateSegment,C=y.a;return M.closestPointToPoint(C,!0,n),C.distanceToSquared(n)1||w<0||w>1)return!1;const z=C.start.z+S.z*I,G=R.start.z+E.z*w;return Wn(z-G)?(_&&(_.start.copy(C.start).addScaledVector(S,I),_.end.copy(C.start).addScaledVector(S,I)),!0):!1}else return y.isDegenerateIntoPoint?g(v,y,_):f(y,v,_,M);else{if(v.isDegenerateIntoPoint)return y.isDegenerateIntoPoint?y.a.distanceToSquared(v.a)0&&I>0)return!1;let w=C.distanceToPoint(v.a),z=C.distanceToPoint(v.b),G=C.distanceToPoint(v.c);Wn(w)&&(w=0),Wn(z)&&(z=0),Wn(G)&&(G=0);const j=w*z,Y=w*G;if(j>0&&Y>0)return!1;i.copy(C.normal),r.copy(R.normal);const q=i.cross(r);let ie=0,W=Math.abs(q.x);const $=Math.abs(q.y);$>W&&(W=$,ie=1),Math.abs(q.z)>W&&(ie=2);const fe=_S[ie],me=this.a[fe],de=this.b[fe],se=this.c[fe],ce=v.a[fe],pe=v.b[fe],be=v.c[fe];if(m(this,me,de,se,A,I,S,E,L,h,o))return p(this,v,y,_);if(m(v,ce,pe,be,j,Y,w,z,G,u,l))return p(this,v,y,_);if(h.yh.x?y.start.copy(l.start):y.start.copy(o.start),u.ynew P),this.satAxes=new Array(3).fill().map(()=>new P),this.satBounds=new Array(3).fill().map(()=>new Bi),this.alignedSatBounds=new Array(3).fill().map(()=>new Bi),this.needsUpdate=!1,e&&this.min.copy(e),t&&this.max.copy(t),n&&this.matrix.copy(n)}set(e,t,n){this.min.copy(e),this.max.copy(t),this.matrix.copy(n),this.needsUpdate=!0}copy(e){this.min.copy(e.min),this.max.copy(e.max),this.matrix.copy(e.matrix),this.needsUpdate=!0}}mn.prototype.update=(function(){return function(){const s=this.matrix,e=this.min,t=this.max,n=this.points;for(let l=0;l<=1;l++)for(let c=0;c<=1;c++)for(let h=0;h<=1;h++){const u=1*l|2*c|4*h,p=n[u];p.x=l?t.x:e.x,p.y=c?t.y:e.y,p.z=h?t.z:e.z,p.applyMatrix4(s)}const i=this.satBounds,r=this.satAxes,a=n[0];for(let l=0;l<3;l++){const c=r[l],h=i[l],u=1<new Vn),t=new Array(12).fill().map(()=>new Vn),n=new P,i=new P;return function(r,a=0,o=null,l=null){if(this.needsUpdate&&this.update(),this.intersectsBox(r))return(o||l)&&(r.getCenter(i),this.closestPointToPoint(i,n),r.closestPointToPoint(n,i),o&&o.copy(n),l&&l.copy(i)),0;const c=a*a,h=r.min,u=r.max,p=this.points;let d=1/0;for(let f=0;f<8;f++){const x=p[f];i.copy(x).clamp(h,u);const g=x.distanceToSquared(i);if(gnew Xn)}}const jn=new MS;function Jt(s,e){return e[s+15]===o0}function In(s,e){return e[s+6]}function qn(s,e){return e[s+14]}function tn(s){return s+Kt}function nn(s,e){const t=e[s+6];return s+t*Kt}function Fu(s,e){return e[s+7]}class wS{constructor(){this.float32Array=null,this.uint16Array=null,this.uint32Array=null;const e=[];let t=null;this.setBuffer=n=>{t&&e.push(t),t=n,this.float32Array=new Float32Array(n),this.uint16Array=new Uint16Array(n),this.uint32Array=new Uint32Array(n)},this.clearBuffer=()=>{t=null,this.float32Array=null,this.uint16Array=null,this.uint32Array=null,e.length!==0&&this.setBuffer(e.pop())}}}const _t=new wS;let ss,Or;const zr=[],Tl=new zu(()=>new gt);function SS(s,e,t,n,i,r){ss=Tl.getPrimitive(),Or=Tl.getPrimitive(),zr.push(ss,Or),_t.setBuffer(s._roots[e]);const a=Hu(0,s.geometry,t,n,i,r);_t.clearBuffer(),Tl.releasePrimitive(ss),Tl.releasePrimitive(Or),zr.pop(),zr.pop();const o=zr.length;return o>0&&(Or=zr[o-1],ss=zr[o-2]),a}function Hu(s,e,t,n,i=null,r=0,a=0){const{float32Array:o,uint16Array:l,uint32Array:c}=_t;let h=s*2;if(Jt(h,l)){const u=In(s,c),p=qn(h,l);return Nt(s,o,ss),n(u,p,!1,a,r+s/Kt,ss)}else{let u=function(L){const{uint16Array:A,uint32Array:I}=_t;let w=L*2;for(;!Jt(w,A);)L=tn(L),w=L*2;return In(L,I)},p=function(L){const{uint16Array:A,uint32Array:I}=_t;let w=L*2;for(;!Jt(w,A);)L=nn(L,I),w=L*2;return In(L,I)+qn(w,A)};const d=tn(s),m=nn(s,c);let f=d,x=m,g,b,v,y;if(i&&(v=ss,y=Or,Nt(f,o,v),Nt(x,o,y),g=i(v),b=i(y),b(ka.copy(e).clamp(h.min,h.max),ka.distanceToSquared(e)),intersectsBounds:(h,u,p)=>p{h.closestPointToPoint(e,ka);const p=e.distanceToSquared(ka);return p=169,CS=parseInt(Yr)<=161,Bs=new P,ks=new P,Us=new P,Pl=new he,Rl=new he,Ll=new he,x0=new P,v0=new P,b0=new P,Ua=new P;function TS(s,e,t,n,i,r,a,o){let l;if(r===sn?l=s.intersectTriangle(n,t,e,!0,i):l=s.intersectTriangle(e,t,n,r!==yt,i),l===null)return null;const c=s.origin.distanceTo(i);return co?null:{distance:c,point:i.clone()}}function y0(s,e,t,n,i,r,a,o,l,c,h){Bs.fromBufferAttribute(e,r),ks.fromBufferAttribute(e,a),Us.fromBufferAttribute(e,o);const u=TS(s,Bs,ks,Us,Ua,l,c,h);if(u){if(n){Pl.fromBufferAttribute(n,r),Rl.fromBufferAttribute(n,a),Ll.fromBufferAttribute(n,o),u.uv=new he;const d=vt.getInterpolation(Ua,Bs,ks,Us,Pl,Rl,Ll,u.uv);Al||(u.uv=d)}if(i){Pl.fromBufferAttribute(i,r),Rl.fromBufferAttribute(i,a),Ll.fromBufferAttribute(i,o),u.uv1=new he;const d=vt.getInterpolation(Ua,Bs,ks,Us,Pl,Rl,Ll,u.uv1);Al||(u.uv1=d),CS&&(u.uv2=u.uv1)}if(t){x0.fromBufferAttribute(t,r),v0.fromBufferAttribute(t,a),b0.fromBufferAttribute(t,o),u.normal=new P;const d=vt.getInterpolation(Ua,Bs,ks,Us,x0,v0,b0,u.normal);u.normal.dot(s.direction)>0&&u.normal.multiplyScalar(-1),Al||(u.normal=d)}const p={a:r,b:a,c:o,normal:new P,materialIndex:0};if(vt.getNormal(Bs,ks,Us,p.normal),u.face=p,u.faceIndex=r,Al){const d=new P;vt.getBarycoord(Ua,Bs,ks,Us,d),u.barycoord=d}}return u}function _0(s){return s&&s.isMaterial?s.side:s}function Dl(s,e,t,n,i,r,a){const o=n*3;let l=o+0,c=o+1,h=o+2;const{index:u,groups:p}=s;s.index&&(l=u.getX(l),c=u.getX(c),h=u.getX(h));const{position:d,normal:m,uv:f,uv1:x}=s.attributes;if(Array.isArray(e)){const g=n*3;for(let b=0,v=p.length;b=y&&g_&&(_=L),AM&&(M=A),IC&&(C=I)}return l[p+0]!==b||l[p+1]!==v||l[p+2]!==y||l[p+3]!==_||l[p+4]!==M||l[p+5]!==C?(l[p+0]=b,l[p+1]=v,l[p+2]=y,l[p+3]=_,l[p+4]=M,l[p+5]=C,!0):!1}else{const x=tn(p),g=nn(p,a);let b=m,v=!1,y=!1;if(e){if(!b){const E=x/Kt+d/fn,L=g/Kt+d/fn;v=e.has(E),y=e.has(L),b=!v&&!y}}else v=!0,y=!0;const _=b||v,M=b||y;let C=!1;_&&(C=u(x,d,b));let R=!1;M&&(R=u(g,d,b));const S=C||R;if(S)for(let E=0;E<3;E++){const L=x+E,A=g+E,I=l[L],w=l[L+3],z=l[A],G=l[A+3];l[p+E]=IG?w:G}return S}}}function rs(s,e,t,n,i){let r,a,o,l,c,h;const u=1/t.direction.x,p=1/t.direction.y,d=1/t.direction.z,m=t.origin.x,f=t.origin.y,x=t.origin.z;let g=e[s],b=e[s+3],v=e[s+1],y=e[s+3+1],_=e[s+2],M=e[s+3+2];return u>=0?(r=(g-m)*u,a=(b-m)*u):(r=(b-m)*u,a=(g-m)*u),p>=0?(o=(v-f)*p,l=(y-f)*p):(o=(y-f)*p,l=(v-f)*p),r>l||o>a||((o>r||isNaN(r))&&(r=o),(l=0?(c=(_-x)*d,h=(M-x)*d):(c=(M-x)*d,h=(_-x)*d),r>h||c>a)?!1:((c>r||r!==r)&&(r=c),(h=n)}function DS(s,e,t,n,i,r,a,o){const{geometry:l,_indirectBuffer:c}=s;for(let h=n,u=n+i;h=0;let d,m;p?(d=tn(s),m=nn(s,l)):(d=nn(s,l),m=tn(s));const f=rs(d,a,n,i,r)?Wu(d,e,t,n,i,r):null;if(f){const g=f.point[u];if(p?g<=a[m+h]:g>=a[m+h+3])return f}const x=rs(m,a,n,i,r)?Wu(m,e,t,n,i,r):null;return f&&x?f.distance<=x.distance?f:x:f||x||null}}const Il=new gt,Fr=new Xn,Hr=new Xn,Oa=new De,M0=new mn,Nl=new mn;function OS(s,e,t,n){_t.setBuffer(s._roots[e]);const i=Xu(0,s,t,n);return _t.clearBuffer(),i}function Xu(s,e,t,n,i=null){const{float32Array:r,uint16Array:a,uint32Array:o}=_t;let l=s*2;if(i===null&&(t.boundingBox||t.computeBoundingBox(),M0.set(t.boundingBox.min,t.boundingBox.max,n),i=M0),Jt(l,a)){const c=e.geometry,h=c.index,u=c.attributes.position,p=t.index,d=t.attributes.position,m=In(s,o),f=qn(l,a);if(Oa.copy(n).invert(),t.boundsTree)return Nt(s,r,Nl),Nl.matrix.copy(Oa),Nl.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:x=>Nl.intersectsBox(x),intersectsTriangle:x=>{x.a.applyMatrix4(n),x.b.applyMatrix4(n),x.c.applyMatrix4(n),x.needsUpdate=!0;for(let g=m*3,b=(f+m)*3;gju.distanceToBox(_),intersectsBounds:(_,M,C)=>C{if(e.boundsTree)return e.boundsTree.shapecast({boundsTraverseOrder:C=>za.distanceToBox(C),intersectsBounds:(C,R,S)=>S{for(let S=C,E=C+R;S_&&(_=I),wM&&(M=w),zC&&(C=z)}}return l[p+0]!==b||l[p+1]!==v||l[p+2]!==y||l[p+3]!==_||l[p+4]!==M||l[p+5]!==C?(l[p+0]=b,l[p+1]=v,l[p+2]=y,l[p+3]=_,l[p+4]=M,l[p+5]=C,!0):!1}else{const x=tn(p),g=nn(p,a);let b=m,v=!1,y=!1;if(e){if(!b){const E=x/Kt+d/fn,L=g/Kt+d/fn;v=e.has(E),y=e.has(L),b=!v&&!y}}else v=!0,y=!0;const _=b||v,M=b||y;let C=!1;_&&(C=u(x,d,b));let R=!1;M&&(R=u(g,d,b));const S=C||R;if(S)for(let E=0;E<3;E++){const L=x+E,A=g+E,I=l[L],w=l[L+3],z=l[A],G=l[A+3];l[p+E]=IG?w:G}return S}}}function XS(s,e,t,n,i,r,a){_t.setBuffer(s._roots[e]),qu(0,s,t,n,i,r,a),_t.clearBuffer()}function qu(s,e,t,n,i,r,a){const{float32Array:o,uint16Array:l,uint32Array:c}=_t,h=s*2;if(Jt(h,l)){const u=In(s,c),p=qn(h,l);DS(e,t,n,u,p,i,r,a)}else{const u=tn(s);rs(u,o,n,r,a)&&qu(u,e,t,n,i,r,a);const p=nn(s,c);rs(p,o,n,r,a)&&qu(p,e,t,n,i,r,a)}}const jS=["x","y","z"];function qS(s,e,t,n,i,r){_t.setBuffer(s._roots[e]);const a=Zu(0,s,t,n,i,r);return _t.clearBuffer(),a}function Zu(s,e,t,n,i,r){const{float32Array:a,uint16Array:o,uint32Array:l}=_t;let c=s*2;if(Jt(c,o)){const h=In(s,l),u=qn(c,o);return IS(e,t,n,h,u,i,r)}else{const h=Fu(s,l),u=jS[h],p=n.direction[u]>=0;let d,m;p?(d=tn(s),m=nn(s,l)):(d=nn(s,l),m=tn(s));const f=rs(d,a,n,i,r)?Zu(d,e,t,n,i,r):null;if(f){const g=f.point[u];if(p?g<=a[m+h]:g>=a[m+h+3])return f}const x=rs(m,a,n,i,r)?Zu(m,e,t,n,i,r):null;return f&&x?f.distance<=x.distance?f:x:f||x||null}}const kl=new gt,Vr=new Xn,Gr=new Xn,Fa=new De,w0=new mn,Ul=new mn;function ZS(s,e,t,n){_t.setBuffer(s._roots[e]);const i=Yu(0,s,t,n);return _t.clearBuffer(),i}function Yu(s,e,t,n,i=null){const{float32Array:r,uint16Array:a,uint32Array:o}=_t;let l=s*2;if(i===null&&(t.boundingBox||t.computeBoundingBox(),w0.set(t.boundingBox.min,t.boundingBox.max,n),i=w0),Jt(l,a)){const c=e.geometry,h=c.index,u=c.attributes.position,p=t.index,d=t.attributes.position,m=In(s,o),f=qn(l,a);if(Fa.copy(n).invert(),t.boundsTree)return Nt(s,r,Ul),Ul.matrix.copy(Fa),Ul.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:x=>Ul.intersectsBox(x),intersectsTriangle:x=>{x.a.applyMatrix4(n),x.b.applyMatrix4(n),x.c.applyMatrix4(n),x.needsUpdate=!0;for(let g=m,b=f+m;g$u.distanceToBox(_),intersectsBounds:(_,M,C)=>C{if(e.boundsTree){const C=e.boundsTree;return C.shapecast({boundsTraverseOrder:R=>Ha.distanceToBox(R),intersectsBounds:(R,S,E)=>E{for(let E=R,L=R+S;Enew gt),Wr=new gt,Xr=new gt,Ku=new gt,Ju=new gt;let Qu=!1;function tE(s,e,t,n){if(Qu)throw new Error("MeshBVH: Recursive calls to bvhcast not supported.");Qu=!0;const i=s._roots,r=e._roots;let a,o=0,l=0;const c=new De().copy(t).invert();for(let h=0,u=i.length;hl.slice()),o.index=a?a.array.slice():null,o.indirectBuffer=r?r.slice():null):(o.roots=i,o.index=a?a.array:null,o.indirectBuffer=r),o}static deserialize(e,t,n={}){n={setIndex:!0,indirect:!!e.indirectBuffer,...n};const{index:i,roots:r,indirectBuffer:a}=e;e.version||(console.warn("MeshBVH.deserialize: Serialization format has been changed and will be fixed up. It is recommended to regenerate any stored serialized data."),l(r));const o=new ed(t,{...n,[Du]:!0});if(o._roots=r,o._indirectBuffer=a||null,n.setIndex){const c=t.getIndex();if(c===null){const h=new bt(e.index,1,!1);t.setIndex(h)}else c.array!==i&&(c.array.set(i),c.needsUpdate=!0)}return o;function l(c){for(let h=0;hthis._indirectBuffer[n]:n=>n}shiftTriangleOffsets(e){const t=this._indirectBuffer;if(t)for(let n=0,i=t.length;nu(p,d,m,f,x)?!0:n(p,d,this,o,m,f,t)}else a||(o?a=(u,p,d,m)=>n(u,p,this,o,d,m,t):a=(u,p,d)=>d);let l=!1,c=0;const h=this._roots;for(let u=0,p=h.length;u{const f=this.resolveTriangleIndex(m);Wt(a,f*3,o,l)}:m=>{Wt(a,m*3,o,l)},h=jn.getPrimitive(),u=e.geometry.index,p=e.geometry.attributes.position,d=e.indirect?m=>{const f=e.resolveTriangleIndex(m);Wt(h,f*3,u,p)}:m=>{Wt(h,m*3,u,p)};if(r){const m=(f,x,g,b,v,y,_,M)=>{for(let C=g,R=g+b;CFl.intersectsBox(n),intersectsTriangle:n=>Fl.intersectsTriangle(n)})}intersectsSphere(e){return this.shapecast({intersectsBounds:t=>e.intersectsBox(t),intersectsTriangle:t=>t.intersectsSphere(e)})}closestPointToGeometry(e,t,n={},i={},r=0,a=1/0){return(this.indirect?QS:GS)(this,e,t,n,i,r,a)}closestPointToPoint(e,t={},n=0,i=1/0){return ES(this,e,t,n,i)}getBoundingBox(e){return e.makeEmpty(),this._roots.forEach(t=>{Nt(0,new Float32Array(t),S0),e.union(S0)}),e}}const E0=1e-6,iE=E0*.5,C0=Math.pow(10,-Math.log10(E0)),sE=iE*C0;function mi(s){return~~(s*C0+sE)}function rE(s){return`${mi(s.x)},${mi(s.y)}`}function T0(s){return`${mi(s.x)},${mi(s.y)},${mi(s.z)}`}function aE(s){return`${mi(s.x)},${mi(s.y)},${mi(s.z)},${mi(s.w)}`}function oE(s,e,t){t.direction.subVectors(e,s).normalize();const n=s.dot(t.direction);return t.origin.copy(s).addScaledVector(t.direction,-n),t}function A0(){return typeof SharedArrayBuffer<"u"}function lE(s){if(s.buffer instanceof SharedArrayBuffer)return s;const e=s.constructor,t=s.buffer,n=new SharedArrayBuffer(t.byteLength),i=new Uint8Array(t);return new Uint8Array(n).set(i,0),new e(n)}function cE(s,e=ArrayBuffer){return s>65535?new Uint32Array(new e(4*s)):new Uint16Array(new e(2*s))}function hE(s,e){if(!s.index){const t=s.attributes.position.count,n=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=cE(t,n);s.setIndex(new bt(i,1));for(let r=0;rl.end)){if(l.end=h.end)r(h.end,l.end)||s.splice(o+1,0,{start:h.end,end:l.end,index:l.index}),l.end=h.start,h.start=0,h.end=0;else if(l.start>=h.start&&l.end<=h.end)r(l.end,h.end)||e.splice(c+1,0,{start:l.end,end:h.end,index:h.index}),h.end=l.start,l.start=0,l.end=0;else if(l.start<=h.start&&l.end<=h.end){const u=l.end;l.end=h.start,h.start=u}else if(l.start>=h.start&&l.end>=h.end){const u=h.end;h.end=l.start,l.start=u}else throw new Error}if(t.has(l.index)||t.set(l.index,[]),t.has(h.index)||t.set(h.index,[]),t.get(l.index).push(h.index),t.get(h.index).push(l.index),a(h)&&(e.splice(c,1),c--),a(l)){s.splice(o,1),o--;break}}}i(s),i(e);function i(o){for(let l=0;lL0;return l.direction.angleTo(c.direction)>D0||h}function o(l,c){const h=l.origin.distanceTo(c.origin),u=l.direction.angleTo(c.direction);return h/L0+u/D0}}}const nd=new P,id=new P,Hl=new Xi;function vE(s,e,t){const n=s.attributes,i=s.index,r=n.position,a=new Map,o=new Map,l=Array.from(e),c=new xE;for(let h=0,u=l.length;hy&&([v,y]=[y,v]),Hl.direction.dot(b.direction)<0?g.reverse.push({start:v,end:y,index:p}):g.forward.push({start:v,end:y,index:p})}return o.forEach(({forward:h,reverse:u},p)=>{gE(h,u,a,t),h.length===0&&u.length===0&&o.delete(p)}),{disjointConnectivityMap:a,fragmentMap:o}}const bE=new he,sd=new P,yE=new tt,rd=["","",""];class _E{constructor(e=null){this.data=null,this.disjointConnections=null,this.unmatchedDisjointEdges=null,this.unmatchedEdges=-1,this.matchedEdges=-1,this.useDrawRange=!0,this.useAllAttributes=!1,this.matchDisjointEdges=!1,this.degenerateEpsilon=1e-8,e&&this.updateFrom(e)}getSiblingTriangleIndex(e,t){const n=this.data[e*3+t];return n===-1?-1:~~(n/3)}getSiblingEdgeIndex(e,t){const n=this.data[e*3+t];return n===-1?-1:n%3}getDisjointSiblingTriangleIndices(e,t){const n=e*3+t,i=this.disjointConnections.get(n);return i?i.map(r=>~~(r/3)):[]}getDisjointSiblingEdgeIndices(e,t){const n=e*3+t,i=this.disjointConnections.get(n);return i?i.map(r=>r%3):[]}isFullyConnected(){return this.unmatchedEdges===0}updateFrom(e){const{useAllAttributes:t,useDrawRange:n,matchDisjointEdges:i,degenerateEpsilon:r}=this,a=t?v:b,o=new Map,{attributes:l}=e,c=t?Object.keys(l):null,h=e.index,u=l.position;let p=td(e);const d=p;let m=0;n&&(m=e.drawRange.start,e.drawRange.count!==1/0&&(p=~~(e.drawRange.count/3)));let f=this.data;(!f||f.length<3*d)&&(f=new Int32Array(3*d)),f.fill(-1);let x=0,g=new Set;for(let y=m,_=p*3+m;y<_;y+=3){const M=y;for(let C=0;C<3;C++){let R=M+C;h&&(R=h.getX(R)),rd[C]=a(R)}for(let C=0;C<3;C++){const R=(C+1)%3,S=rd[C],E=rd[R],L=`${E}_${S}`;if(o.has(L)){const A=M+C,I=o.get(L);f[A]=I,f[I]=A,o.delete(L),x+=2,g.delete(I)}else{const A=`${S}_${E}`,I=M+C;o.set(A,I),g.add(I)}}}if(i){const{fragmentMap:y,disjointConnectivityMap:_}=vE(e,g,r);g.clear(),y.forEach(({forward:M,reverse:C})=>{M.forEach(({index:R})=>g.add(R)),C.forEach(({index:R})=>g.add(R))}),this.unmatchedDisjointEdges=y,this.disjointConnections=_,x=p*3-g.size}this.matchedEdges=x,this.unmatchedEdges=g.size,this.data=f;function b(y){return sd.fromBufferAttribute(u,y),T0(sd)}function v(y){let _="";for(let M=0,C=c.length;M=this._pool.length&&this._pool.push(new vt),this._pool[this._index++]}clear(){this._index=0}reset(){this._pool.length=0,this._index=0}}class EE{constructor(){this.trianglePool=new SE,this.triangles=[],this.normal=new P,this.coplanarTriangleUsed=!1}initialize(e){this.reset();const{triangles:t,trianglePool:n,normal:i}=this;if(Array.isArray(e))for(let r=0,a=e.length;rod)throw new Error("Triangle Splitter: Cannot initialize with triangles that have different normals.");const l=n.getTriangle();l.copy(o),t.push(l)}else{e.getNormal(i);const r=n.getTriangle();r.copy(e),t.push(r)}}splitByTriangle(e){const{normal:t,triangles:n}=this;if(e.getNormal(ld).normalize(),Math.abs(1-Math.abs(ld.dot(t)))0?m.push(g):f.push(g),Math.abs(v)Ga)if(p!==-1){p=(p+1)%3;let g=0;g===p&&(g=(g+1)%3);let b=g+1;b===p&&(b=(b+1)%3);const v=i.getTriangle();v.a.copy(x[b]),v.b.copy(Ot.end),v.c.copy(Ot.start),os(v)||n.push(v),o.a.copy(x[g]),o.b.copy(Ot.start),o.c.copy(Ot.end),os(o)&&(n.splice(r,1),r--,a--)}else{const g=m.length>=2?f[0]:m[0];if(g===0){let M=Ot.start;Ot.start=Ot.end,Ot.end=M}const b=(g+1)%3,v=(g+2)%3,y=i.getTriangle(),_=i.getTriangle();x[b].distanceToSquared(Ot.start)t.length&&(this.expand(),t=this.array);for(let i=0,r=e.length;i=t.length;){const i={};t.push(i);for(const r in n){const a=n[r],o=new k0(a.type);o.itemSize=a.itemSize,o.normalized=a.normalized,i[r]=o}}return t[e]}getGroupAttrArray(e,t=0){const{groupAttributes:n}=this;if(!n[0][e])throw new Error(`TypedAttributeData: Attribute with "${e}" has not been initialized`);return this.getGroupAttrSet(t)[e]}initializeArray(e,t,n,i){const{groupAttributes:r}=this,a=r[0][e];if(a){if(a.type!==t)for(let o=0,l=r.length;o{for(const n in t)t[n].clear()})}delete(e){this.groupAttributes.forEach(t=>{delete t[e]})}reset(){this.groupAttributes=[],this.groupCount=0}}class U0{constructor(){this.intersectionSet={},this.ids=[]}add(e,t){const{intersectionSet:n,ids:i}=this;n[e]||(n[e]=[],i.push(e)),n[e].push(t)}}const AE=0,PE=1,RE=2,O0=3,LE=4,z0=5,F0=6,Zn=new Xi,H0=new De,gn=new vt,zi=new P,V0=new tt,G0=new tt,W0=new tt,hd=new tt,Wl=new tt,Xl=new tt,X0=new Vn,ud=new P,dd=1e-8,DE=1e-15,Os=-1,zs=1,jl=-2,ql=2,Wa=0,Fs=1,pd=2,IE=1e-14;let Zl=null;function j0(s){Zl=s}function q0(s,e){s.getMidpoint(Zn.origin),s.getNormal(Zn.direction);const t=e.raycastFirst(Zn,yt);return t&&Zn.direction.dot(t.face.normal)>0?Os:zs}function NE(s,e){function t(){return Math.random()-.5}s.getNormal(ud),Zn.direction.copy(ud),s.getMidpoint(Zn.origin);const n=3;let i=0,r=1/0;for(let a=0;a0&&i++,o!==null&&(r=Math.min(r,o.distance)),r<=DE)return o.face.normal.dot(ud)>0?ql:jl;if(i/n>.5||(a-i+1)/n>.5)break}return i/n>.5?Os:zs}function BE(s,e){const t=new U0,n=new U0;return H0.copy(s.matrixWorld).invert().multiply(e.matrixWorld),s.geometry.boundsTree.bvhcast(e.geometry.boundsTree,H0,{intersectsTriangles(i,r,a,o){if(!os(i)&&!os(r)){let l=i.intersectsTriangle(r,X0,!0);if(!l){const c=i.plane,h=r.plane,u=c.normal,p=h.normal;u.dot(p)===1&&Math.abs(c.constant-h.constant){r.push(c.x),i>1&&r.push(c.y),i>2&&r.push(c.z),i>3&&r.push(c.w)};hd.set(0,0,0,0).addScaledVector(s,n.a.x).addScaledVector(e,n.a.y).addScaledVector(t,n.a.z),Wl.set(0,0,0,0).addScaledVector(s,n.b.x).addScaledVector(e,n.b.y).addScaledVector(t,n.b.z),Xl.set(0,0,0,0).addScaledVector(s,n.c.x).addScaledVector(e,n.c.y).addScaledVector(t,n.c.z),o&&(hd.normalize(),Wl.normalize(),Xl.normalize()),l(hd),a?(l(Xl),l(Wl)):(l(Wl),l(Xl))}function md(s,e,t,n,i,r=!1){for(const a in i){const o=e[a],l=i[a];if(!(a in e))throw new Error(`CSG Operations: Attribute ${a} no available on geometry.`);const c=o.itemSize;a==="position"?(zi.fromBufferAttribute(o,s).applyMatrix4(t),l.push(zi.x,zi.y,zi.z)):a==="normal"?(zi.fromBufferAttribute(o,s).applyNormalMatrix(n),r&&zi.multiplyScalar(-1),l.push(zi.x,zi.y,zi.z)):(l.push(o.getX(s)),c>1&&l.push(o.getY(s)),c>2&&l.push(o.getZ(s)),c>3&&l.push(o.getW(s)))}}class OE{constructor(e){this.triangle=new vt().copy(e),this.intersects={}}addTriangle(e,t){this.intersects[e]=new vt().copy(t)}getIntersectArray(){const e=[],{intersects:t}=this;for(const n in t)e.push(t[n]);return e}}class Y0{constructor(){this.data={}}addTriangleIntersection(e,t,n,i){const{data:r}=this;r[e]||(r[e]=new OE(t)),r[e].addTriangle(n,i)}getTrianglesAsArray(e=null){const{data:t}=this,n=[];if(e!==null)e in t&&n.push(t[e].triangle);else for(const i in t)n.push(t[i].triangle);return n}getTriangleIndices(){return Object.keys(this.data).map(e=>parseInt(e))}getIntersectionIndices(e){const{data:t}=this;return t[e]?Object.keys(t[e].intersects).map(n=>parseInt(n)):[]}getIntersectionsAsArray(e=null,t=null){const{data:n}=this,i=new Set,r=[],a=o=>{if(n[o])if(t!==null)n[o].intersects[t]&&r.push(n[o].intersects[t]);else{const l=n[o].intersects;for(const c in l)i.has(c)||(i.add(c),r.push(l[c]))}};if(e!==null)a(e);else for(const o in n)a(o);return r}reset(){this.data={}}}class zE{constructor(){this.enabled=!1,this.triangleIntersectsA=new Y0,this.triangleIntersectsB=new Y0,this.intersectionEdges=[]}addIntersectingTriangles(e,t,n,i){const{triangleIntersectsA:r,triangleIntersectsB:a}=this;r.addTriangleIntersection(e,t,n,i),a.addTriangleIntersection(n,i,e,t)}addEdge(e){this.intersectionEdges.push(e.clone())}reset(){this.triangleIntersectsA.reset(),this.triangleIntersectsB.reset(),this.intersectionEdges=[]}init(){this.enabled&&(this.reset(),j0(this))}complete(){this.enabled&&j0(null)}}const ls=new De,Yl=new $e,Hs=new vt,$l=new vt,cs=new vt,Kl=new vt,si=[],Vs=[];function FE(s){for(const e of s)return e}function HE(s,e,t,n,i,r={}){const{useGroups:a=!0}=r,{aIntersections:o,bIntersections:l}=BE(s,e),c=[];let h=null,u;return u=a?0:-1,$0(s,e,o,t,!1,n,i,u),K0(s,e,o,t,!1,i,u),t.findIndex(p=>p!==F0&&p!==z0)!==-1&&(u=a?s.geometry.groups.length||1:-1,$0(e,s,l,t,!0,n,i,u),K0(e,s,l,t,!0,i,u)),si.length=0,Vs.length=0,{groups:c,materials:h}}function $0(s,e,t,n,i,r,a,o=0){const l=s.matrixWorld.determinant()<0;ls.copy(e.matrixWorld).invert().multiply(s.matrixWorld),Yl.getNormalMatrix(s.matrixWorld).multiplyScalar(l?-1:1);const c=s.geometry.groupIndices,h=s.geometry.index,u=s.geometry.attributes.position,p=e.geometry.boundsTree,d=e.geometry.index,m=e.geometry.attributes.position,f=t.ids,x=t.intersectionSet;for(let g=0,b=f.length;g0;){const g=FE(f);f.delete(g),d.push(g);const b=3*g,v=h.getX(b+0),y=h.getX(b+1),_=h.getX(b+2);cs.a.fromBufferAttribute(p,v).applyMatrix4(ls),cs.b.fromBufferAttribute(p,y).applyMatrix4(ls),cs.c.fromBufferAttribute(p,_).applyMatrix4(ls);const M=q0(cs,l);Vs.length=0,si.length=0;for(let C=0,R=n.length;C0;){const C=d.pop();for(let R=0;R<3;R++){const S=m.getSiblingTriangleIndex(C,R);S!==-1&&f.has(S)&&(d.push(S),f.delete(S))}if(si.length!==0){const R=3*C,S=h.getX(R+0),E=h.getX(R+1),L=h.getX(R+2),A=a===-1?0:c[C]+a;if(cs.a.fromBufferAttribute(p,S),cs.b.fromBufferAttribute(p,E),cs.c.fromBufferAttribute(p,L),!os(cs))for(let I=0,w=si.length;I{t[n.materialIndex]=e})),t}class XE{constructor(){this.triangleSplitter=new EE,this.attributeData=[],this.attributes=["position","uv","normal"],this.useGroups=!0,this.consolidateGroups=!0,this.debug=new zE}getGroupRanges(e){return!this.useGroups||e.groups.length===0?[{start:0,count:1/0,materialIndex:0}]:e.groups.map(t=>({...t}))}evaluate(e,t,n,i=new Vl){let r=!0;if(Array.isArray(n)||(n=[n]),Array.isArray(i)||(i=[i],r=!1),i.length!==n.length)throw new Error("Evaluator: operations and target array passed as different sizes.");e.prepareGeometry(),t.prepareGeometry();const{triangleSplitter:a,attributeData:o,attributes:l,useGroups:c,consolidateGroups:h,debug:u}=this;for(;o.length{GE(e.geometry,g.geometry,o[b],l)}),u.init(),HE(e,t,n,a,o,{useGroups:c}),u.complete();const p=this.getGroupRanges(e.geometry),d=J0(p,e.material),m=this.getGroupRanges(t.geometry),f=J0(m,t.material);m.forEach(g=>g.materialIndex+=d.length);let x=[...p,...m].map((g,b)=>({...g,index:b}));if(c){const g=[...d,...f];h&&(x=x.map(v=>{const y=g[v.materialIndex];return v.materialIndex=g.indexOf(y),v}).sort((v,y)=>v.materialIndex-y.materialIndex));const b=[];for(let v=0,y=g.length;v{v.material=b})}else x=[{start:0,count:1/0,index:0,materialIndex:0}],i.forEach(g=>{g.material=d[0]});return i.forEach((g,b)=>{const v=g.geometry;WE(v,o[b],x),h&&VE(v.groups)}),r?i:i[0]}evaluateHierarchy(e,t=new Vl){e.updateMatrixWorld(!0);const n=(r,a)=>{const o=r.children;for(let l=0,c=o.length;l{const a=r.children;let o=!1;for(let c=0,h=a.length;c{c?c=this.evaluate(c,h,h.operation):c=this.evaluate(r,h,h.operation)}),r._cachedGeometry=c.geometry,r._cachedMaterials=c.material,!0}else return o||l};return i(e),t.geometry=e._cachedGeometry,t.material=e._cachedMaterials,t}reset(){this.triangleSplitter.reset()}}class jE{engine;planeObjects=[];planes=[];isActive=!1;evaluator;geometryCache=new Map;sectionMeshes=new Map;planeGroup;planeSize=1e3;sourceMeshes=new Map;planeThickness=.01;updateThrottleTime=100;lastUpdateTime=0;pendingUpdate=!1;updateTimer=null;cacheExpireTime=3e4;planeStates=new Map;constructor(e,t={}){this.engine=e,this.evaluator=new XE,this.planeGroup=new ln,this.planeGroup.name="CSG_ClippingPlanes_Optimized",t.updateThrottleTime!==void 0&&(this.updateThrottleTime=t.updateThrottleTime),t.cacheExpireTime!==void 0&&(this.cacheExpireTime=t.cacheExpireTime),t.planeThickness!==void 0&&(this.planeThickness=t.planeThickness),this.evaluator.attributes=["position","normal"],this.evaluator.useGroups=!1}init(){this.calculateSceneSize(),this.engine.scene.add(this.planeGroup),this.planes.forEach((e,t)=>{const n=this.createEmptySectionMesh(e,t);this.planeGroup.add(n),this.sectionMeshes.set(`plane_${t}`,n),this.planeObjects.push(n),this.planeStates.set(t,{constant:e.constant,normal:e.normal.clone()})})}createEmptySectionMesh(e,t){const n=new dt,i=new Ki({color:new Fe(33023),metalness:.1,roughness:.75,side:yt,depthWrite:!0,depthTest:!0,clippingPlanes:this.planes.filter((a,o)=>o!==t)}),r=new rt(n,i);return r.name=`CSG_Section_Optimized_${t}`,r.visible=!1,r.renderOrder=t+1,r}active(){this.isActive=!0,this.requestUpdate(),this.planeObjects.forEach(e=>{e.visible=!0})}disActive(){this.isActive=!1,this.planeObjects.forEach(e=>{e.visible=!1}),this.updateTimer&&(clearTimeout(this.updateTimer),this.updateTimer=null)}setSourceMeshes(e){this.sourceMeshes.clear(),e.forEach(t=>{const n=t.uuid;this.sourceMeshes.set(n,t)}),this.isActive&&this.requestUpdate()}addSourceMesh(e){const t=e.uuid;this.sourceMeshes.has(t)||(this.sourceMeshes.set(t,e),this.isActive&&this.requestUpdate())}removeSourceMesh(e){const t=e.uuid;this.sourceMeshes.delete(t)&&(this.clearMeshCache(t),this.isActive&&this.requestUpdate())}requestUpdate(){if(!this.isActive)return;const e=Date.now(),t=e-this.lastUpdateTime;t>=this.updateThrottleTime?(this.lastUpdateTime=e,this.pendingUpdate=!1):(this.pendingUpdate=!0,this.updateTimer&&clearTimeout(this.updateTimer),this.updateTimer=setTimeout(()=>{this.pendingUpdate&&this.isActive&&(this.lastUpdateTime=Date.now(),this.pendingUpdate=!1),this.updateTimer=null},this.updateThrottleTime-t))}updateAllSections(){this.isActive&&(this.planes.forEach((e,t)=>{if(Math.abs(e.constant)<99999)this.hasPlaneChanged(t,e)&&(this.updateSection(e,t),this.updatePlaneState(t,e));else{const n=this.sectionMeshes.get(`plane_${t}`);n&&(n.visible=!1)}}),this.cleanExpiredCache())}hasPlaneChanged(e,t){const n=this.planeStates.get(e);if(!n)return!0;const i=Math.abs(n.constant-t.constant)>1e-4,r=!n.normal.equals(t.normal);return i||r}updatePlaneState(e,t){this.planeStates.set(e,{constant:t.constant,normal:t.normal.clone()})}getPlaneHash(e){const t=e.normal,n=e.constant;return`${t.x.toFixed(4)}_${t.y.toFixed(4)}_${t.z.toFixed(4)}_${n.toFixed(4)}`}getCacheKey(e,t){return`${e}_plane_${t}`}updateSection(e,t){const n=this.sectionMeshes.get(`plane_${t}`);if(!n)return;const i=this.getPlaneHash(e),r=[];if(this.sourceMeshes.forEach((a,o)=>{const l=this.getCacheKey(o,t),c=this.geometryCache.get(l);if(c&&c.planeHash===i)r.push(c.geometry.clone()),c.timestamp=Date.now();else try{const h=this.createPlaneBrush(e),u=new Vl(a.geometry);a.updateMatrixWorld(!0),u.matrix.copy(a.matrixWorld),u.updateMatrixWorld();const p=this.evaluator.evaluate(h,u,O0);p&&p.geometry.attributes.position.count>0?(r.push(p.geometry),this.geometryCache.set(l,{geometry:p.geometry.clone(),planeHash:i,timestamp:Date.now()})):this.geometryCache.delete(l)}catch(h){console.warn(`CSG intersection failed for mesh ${o}:`,h)}}),r.length>0){const a=this.mergeGeometries(r);n.geometry&&n.geometry.dispose(),n.geometry=a,n.visible=!0,n.position.set(0,0,0),n.rotation.set(0,0,0),n.scale.set(1,1,1),n.updateMatrixWorld()}else n.visible=!1;r.forEach(a=>a.dispose())}clearMeshCache(e){const t=[];this.geometryCache.forEach((n,i)=>{i.startsWith(e)&&(n.geometry.dispose(),t.push(i))}),t.forEach(n=>this.geometryCache.delete(n))}cleanExpiredCache(){const e=Date.now(),t=[];this.geometryCache.forEach((n,i)=>{e-n.timestamp>this.cacheExpireTime&&(n.geometry.dispose(),t.push(i))}),t.forEach(n=>this.geometryCache.delete(n))}clearAllCache(){this.geometryCache.forEach(e=>{e.geometry.dispose()}),this.geometryCache.clear()}createPlaneBrush(e){const t=new Zi(this.planeSize,this.planeThickness,this.planeSize);t.translate(0,e.constant,0),t.applyQuaternion(new zn().setFromUnitVectors(new P(0,-1,0),e.normal));const n=new rt(t),i=new Vl(t);return i.matrix.copy(n.matrixWorld),i.updateMatrixWorld(),i}mergeGeometries(e){if(e.length===1)return e[0].clone();const t=new dt,n=[],i=[],r=[];let a=0;return e.forEach(o=>{const l=o.attributes.position,c=o.attributes.normal;for(let h=0;h0?t.setAttribute("normal",new jt(i,3)):t.computeVertexNormals(),r.length>0&&t.setIndex(r),t}calculateSceneSize(){const e=new gt;if(this.engine.scene.traverse(t=>{if(t.isMesh&&t.geometry){const n=new gt().setFromObject(t);e.union(n)}}),e.isEmpty())this.planeSize=1e3;else{const t=e.getSize(new P),n=Math.max(t.x,t.y,t.z);this.planeSize=n*3}}update(){this.isActive&&this.pendingUpdate&&!this.updateTimer&&this.requestUpdate()}dispose(){this.updateTimer&&(clearTimeout(this.updateTimer),this.updateTimer=null),this.clearAllCache(),this.planeObjects.forEach(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(t=>t.dispose()):e.material.dispose())}),this.sectionMeshes.clear(),this.planeObjects=[],this.sourceMeshes.clear(),this.planeGroup.parent&&this.planeGroup.parent.remove(this.planeGroup)}setSectionColor(e){this.planeObjects.forEach(t=>{t.material instanceof Ki&&t.material.color.set(e)})}getCacheStats(){return{cacheSize:this.geometryCache.size,sourceMeshCount:this.sourceMeshes.size,sectionMeshCount:this.sectionMeshes.size}}setPlaneThickness(e){if(e<=0){console.warn("Plane thickness must be positive");return}this.planeThickness=e,this.clearAllCache(),this.isActive&&this.requestUpdate()}getPlaneThickness(){return this.planeThickness}showSections(){this.sectionMeshes.forEach(e=>{e.geometry?.attributes.position?.count&&e.geometry.attributes.position.count>0&&(e.visible=!0)})}hideSections(){this.sectionMeshes.forEach(e=>{e.visible=!1})}showSection(){this.planeGroup.visible=!0}hideSection(){this.planeGroup.visible=!1}toggleSectionsVisibility(){let e=!1;return this.sectionMeshes.forEach(t=>{t.visible&&(e=!0)}),e?(this.hideSections(),!1):(this.showSections(),!0)}toggleSectionVisibility(e){const t=this.sectionMeshes.get(`plane_${e}`);return t?(t.visible=!t.visible,t.visible):!1}}class qE{engine;isActive=!1;box;pickPoint;pickNormal;pickMesh;box_;plane;meshs;isDrag=!1;maxBox;csgClipping=null;useCsgClipping=!1;constructor(e,t){this.engine=e,this.meshs=[],t?.useCsgClipping!==void 0&&(this.useCsgClipping=t.useCsgClipping),this.useCsgClipping&&this.initCsgClipping()}initCsgClipping(){this.csgClipping=new jE(this.engine,{updateThrottleTime:150,cacheExpireTime:45e3}),this.csgClipping.planes=this.engine.sectionPlane,this.csgClipping.init()}active(){this.isActive||(this.engine.handelBehaved.init(this),this.engine.handelBehaved.active(),this.engine.scene.children.filter(e=>e.type=="Group"&&e.name=="ClippingBox").forEach(e=>{e.children.forEach(t=>{t.name.includes("face")||(t.visible=!0)})}),this.isActive=!0,this.init())}disActive(){this.init(),this.isActive=!1,this.engine.handelBehaved.disActive(),this.csgClipping&&this.csgClipping.disActive(),this.engine.scene.children.filter(e=>e.type=="Group"&&e.name=="ClippingBox").forEach(e=>{e.children.forEach(t=>{t.name.includes("face")||(t.visible=!1)})}),this.engine.interactionModule.init(),this.engine.interactionModule.active()}disabled(){this.isActive=!1,this.engine.handelBehaved.disActive(),this.engine.interactionModule.init(),this.engine.interactionModule.active(),this.engine.scene.children.filter(e=>e.type=="Group"&&e.name=="ClippingBox").forEach(e=>{e.children.forEach(t=>{t.name.includes("face")||(t.visible=!1)})})}recover(){this.isActive||(this.engine.handelBehaved.init(this),this.engine.handelBehaved.active(),this.engine.scene.children.filter(e=>e.type=="Group"&&e.name=="ClippingBox").forEach(e=>{e.children.forEach(t=>{t.name.includes("face")||(t.visible=!0)})}),this.isActive=!0)}init(){let e=this.engine.octreeBox.getBoundingBox();this.maxBox=JSON.parse(JSON.stringify(e)),this.box=e,this.updata_face(e)}getboxXyz(){return{minX:this.box.min.x,minY:this.box.min.y,minZ:this.box.min.z,maxX:this.box.max.x,maxY:this.box.max.y,maxZ:this.box.max.z}}setboxXyz(e){this.box.min.x=e.minX,this.box.min.y=e.minY,this.box.min.z=e.minZ,this.box.max.x=e.maxX,this.box.max.y=e.maxY,this.box.max.z=e.maxZ,this.updata_face(this.box)}setBox(e){this.box=e,this.updata_face(e)}reverseBox(){}handleMouseDown(e){this.isDrag=!0;const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0)if(this.pickPoint=t[0].point,this.pickNormal=t[0].face.normal,this.engine.controls.enabled=!1,this.pickMesh=t[0].object,this.box_={min:this.box.min.clone(),max:this.box.max.clone()},this.pickNormal.y==0){const n=new Dt;n.setFromNormalAndCoplanarPoint(new P(0,1,0),this.pickPoint),this.plane=n}else{let n=new P(this.engine.camera.position.x,this.pickPoint.y,this.engine.camera.position.z);const i=new Dt;i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1),this.pickPoint),this.plane=i}}handleMouseUp(e){this.isDrag=!1,this.pickPoint=null,this.pickNormal=null,this.pickMesh=null,this.engine.controls.enabled=!0,this.csgClipping&&this.isActive}handleMouseMove(e){this.meshs.forEach(n=>{n.material.opacity=0});const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0&&(t[0].object.material.opacity=.05),this.pickPoint!=null){const n=new P;if(e.raycaster.ray.intersectPlane(this.plane,n)){let i=n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());this.pickMesh.name=="前"||this.pickMesh.name=="左"||this.pickMesh.name=="底"?this.box.min=this.box_.min.clone().add(this.pickNormal.clone().setLength(i)):this.box.max=this.box_.max.clone().add(this.pickNormal.clone().setLength(i)),this.updata_face(this.box),this.calculate_ratio()}}}calculate_ratio(){let e=this.maxBox.max.x-this.maxBox.min.x,t=this.maxBox.max.y-this.maxBox.min.y,n=this.maxBox.max.z-this.maxBox.min.z,i=(this.box.min.x-this.maxBox.min.x)/e*100,r=(this.box.max.x-this.maxBox.min.x)/e*100,a=(this.box.min.y-this.maxBox.min.y)/t*100,o=(this.box.max.y-this.maxBox.min.y)/t*100,l=(this.box.min.z-this.maxBox.min.z)/n*100,c=(this.box.max.z-this.maxBox.min.z)/n*100;i<0&&(i=0),r<0&&(r=0),a<0&&(a=0),o<0&&(o=0),l<0&&(l=0),c<0&&(c=0),i>100&&(i=100),r>100&&(r=100),a>100&&(a=100),o>100&&(o=100),l>100&&(l=100),c>100&&(c=100);let h={x:{min:i,max:r},y:{min:a,max:o},z:{min:l,max:c}};this.engine.events.trigger(Yt.SectionMove,h)}updata_face(e){let t=this,n=[new P(e.min.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.min.x,e.max.y,e.min.z)],i=[new P(e.min.x,e.min.y,e.max.z),new P(e.max.x,e.min.y,e.max.z),new P(e.max.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.max.z)],r=[new P(e.max.x,e.min.y,e.max.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.max.z)],a=[new P(e.min.x,e.min.y,e.min.z),new P(e.min.x,e.min.y,e.max.z),new P(e.min.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.min.z)],o=[new P(e.min.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.max.z)],l=[new P(e.min.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.max.z),new P(e.min.x,e.min.y,e.max.z)];c(n,new P(0,0,-1),"前"),c(i,new P(0,0,1),"后"),c(r,new P(1,0,0),"右"),c(a,new P(-1,0,0),"左"),c(o,new P(0,1,0),"顶"),c(l,new P(0,-1,0),"底");function c(h,u,p){const d=new dt,m=new Float32Array([h[0].x,h[0].y,h[0].z,h[1].x,h[1].y,h[1].z,h[2].x,h[2].y,h[2].z,h[3].x,h[3].y,h[3].z]),f=[0,1,2,0,2,3];d.setAttribute("position",new bt(m,3)),d.setIndex(f);let x=t.engine.scene.children.find(M=>M.type=="Group"&&M.name=="ClippingBox");x==null&&(x=new ln,x.name="ClippingBox",t.engine.scene.add(x));let g=t.meshs.find(M=>M.name==p);if(g==null){const M=new Ht({color:65280,transparent:!0,opacity:0,side:yt});M.polygonOffset=!0,M.polygonOffsetFactor=1,M.polygonOffsetUnits=4;const C=new rt(d,M);C.normal=u,C.name=p,x.add(C),t.meshs.push(C)}else g.geometry=d;const b=new Float32Array([h[0].x,h[0].y,h[0].z,h[1].x,h[1].y,h[1].z,h[2].x,h[2].y,h[2].z,h[3].x,h[3].y,h[3].z,h[0].x,h[0].y,h[0].z]);let v=new Ms({color:255}),y=new dt;y.setAttribute("position",new bt(b,3));let _=t.meshs.find(M=>M.name==p+"Line");_==null&&(_=new $i(y,v),_.name=p+"Line",x.add(_),t.meshs.push(_)),_.geometry=y,_.material=v,p=="前"||p=="左"||p=="底"?t.engine.sectionPlane.find(M=>M.name==p).setFromNormalAndCoplanarPoint(u.clone().setLength(-1),e.min):t.engine.sectionPlane.find(M=>M.name==p).setFromNormalAndCoplanarPoint(u.clone().setLength(-1),e.max),t.engine.scene.children.filter(M=>M.type=="Mesh"&&M.url).forEach(M=>{M.material&&Array.isArray(M.material)?M.material.forEach(C=>{C.clippingPlanes=t.engine.sectionPlane}):M.material.clippingPlanes=t.engine.sectionPlane})}}}class ZE{engine;isActive=!1;isDrag=!1;meshs=[];box;pickPoint;pickNormal;pickMesh;box_;plane;angleX=0;angleY=0;angleZ=0;direction=1;normal=new P(0,0,1);distance=0;center=null;current_center=null;constructor(e){this.engine=e,this.meshs=[],this.box=null}active(){if(this.isActive==!0)return;this.isActive=!0,this.engine.scene.children.filter(t=>t.type=="Group"&&t.name=="ClippingBox").forEach(t=>{t.children.forEach(n=>{n.name.includes("face")&&(n.visible=!0)})}),this.engine.handelBehaved.init(this),this.engine.handelBehaved.active();let e=this;e.engine.scene.children.filter(t=>t.type=="Mesh"&&t.url).forEach(t=>{t.material&&Array.isArray(t.material)?t.material.forEach(n=>{n.clippingPlanes=e.engine.sectionPlane}):t.material.clippingPlanes=e.engine.sectionPlane,e.engine.clipping.clippingStencil?.addMesh(e.engine.sectionPlane.find(n=>n.name=="face"),t)}),this.init()}disActive(){this.init(),this.isActive=!1,this.engine.handelBehaved.disActive();const e=this.engine.sectionPlane.find(t=>t.name=="face");e&&(e.constant=1e5),this.engine.scene.children.filter(t=>t.type=="Group"&&t.name=="ClippingBox").forEach(t=>{t.children.forEach(n=>{n.name.includes("face")&&(n.visible=!1)})})}init(){let e=this.engine.octreeBox.getBoundingBox();this.box=e,this.updata_face(0)}disabled(){this.isActive=!1,this.engine.handelBehaved.disActive(),this.engine.interactionModule.init(),this.engine.interactionModule.active(),this.engine.scene.children.filter(e=>e.type=="Group"&&e.name=="ClippingBox").forEach(e=>{e.children.forEach(t=>{t.name.includes("face")&&(t.visible=!1)})})}recover(){this.isActive||(this.engine.handelBehaved.init(this),this.engine.handelBehaved.active(),this.engine.scene.children.filter(e=>e.type=="Group"&&e.name=="ClippingBox").forEach(e=>{e.children.forEach(t=>{t.name.includes("face")&&(t.visible=!0)})}),this.isActive=!0)}setFaceAngle(e,t,n){this.angleX=e,this.angleY=t,this.angleZ=n,this.normal=new P(0,1,0).applyAxisAngle(new P(1,0,0),e).applyAxisAngle(new P(0,0,1),t).applyAxisAngle(new P(0,1,0),n),this.normal.normalize(),this.updata_face(0)}setFaceNormal(e,t=0){this.normal=e,this.distance=t,this.updata_face(t)}reverse(){this.direction=this.direction*-1,this.updata_face(this.distance)}getFaceAngle(){return{angleX:this.angleX,angleY:this.angleY,angleZ:this.angleZ,direction:this.direction}}updata_face(e){let t=this,n=t.engine.scene.children.find(R=>R.type=="Group"&&R.name=="ClippingBox");n==null&&(n=new ln,n.name="ClippingBox",t.engine.scene.add(n));let i=new P(1,0,0),r=new P(0,1,0),a=new P(0,0,1),o,l,c=this.normal.clone().normalize(),h=Math.abs(c.dot(i)),u=Math.abs(c.dot(r)),p=Math.abs(c.dot(a));h<=u&&h<=p?o=i:u<=h&&u<=p?o=r:o=a,o=o.clone().sub(c.clone().multiplyScalar(o.dot(c))).normalize(),l=new P().crossVectors(c,o).normalize();let d=null;this.center==null?(d=new P((this.box.min.x+this.box.max.x)/2,(this.box.min.y+this.box.max.y)/2,(this.box.min.z+this.box.max.z)/2),this.center=d.clone()):d=this.center.clone();let m=this.box.max.x-this.box.min.x,f=this.box.max.y-this.box.min.y,x=this.box.max.z-this.box.min.z,g=Math.max(Math.abs(o.x)*m,Math.abs(o.y)*f,Math.abs(o.z)*x),b=Math.max(Math.abs(l.x)*m,Math.abs(l.y)*f,Math.abs(l.z)*x),v=d.clone().add(o.clone().multiplyScalar(-g/2)).add(l.clone().multiplyScalar(-b/2)),y=d.clone().add(o.clone().multiplyScalar(g/2)).add(l.clone().multiplyScalar(-b/2)),_=d.clone().add(o.clone().multiplyScalar(g/2)).add(l.clone().multiplyScalar(b/2)),M=d.clone().add(o.clone().multiplyScalar(-g/2)).add(l.clone().multiplyScalar(b/2));v.add(c.clone().multiplyScalar(e)),y.add(c.clone().multiplyScalar(e)),_.add(c.clone().multiplyScalar(e)),M.add(c.clone().multiplyScalar(e)),this.current_center=d.clone().add(c.clone().multiplyScalar(e)),C([v,y,_,M],c,"face");function C(R,S,E){const L=new dt,A=new Float32Array([R[0].x,R[0].y,R[0].z,R[1].x,R[1].y,R[1].z,R[2].x,R[2].y,R[2].z,R[3].x,R[3].y,R[3].z]),I=[0,1,2,0,2,3];L.setAttribute("position",new bt(A,3)),L.setIndex(I);let w=t.meshs.find(q=>q.name==E);if(w==null){const q=new Ht({color:65280,transparent:!0,opacity:.02,side:yt});q.polygonOffset=!0,q.polygonOffsetFactor=1,q.polygonOffsetUnits=4;const ie=new rt(L,q);ie.normal=S,ie.name=E,n.add(ie),t.meshs.push(ie)}else w.geometry=L;const z=new Float32Array([R[0].x,R[0].y,R[0].z,R[1].x,R[1].y,R[1].z,R[2].x,R[2].y,R[2].z,R[3].x,R[3].y,R[3].z,R[0].x,R[0].y,R[0].z]);let G=new Ms({color:255}),j=new dt;j.setAttribute("position",new bt(z,3));let Y=t.meshs.find(q=>q.name==E+"Line");Y==null&&(Y=new $i(j,G),Y.name=E+"Line",n.add(Y),t.meshs.push(Y)),Y.geometry=j,Y.material=G,t.engine.sectionPlane.find(q=>q.name==E).setFromNormalAndCoplanarPoint(S.clone().setLength(t.direction),R[0])}}handleMouseDown(e){this.isDrag=!0;const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0)if(this.pickPoint=t[0].point,this.pickNormal=t[0].face.normal,this.engine.controls.enabled=!1,this.pickMesh=t[0].object,this.box_={min:this.box.min.clone(),max:this.box.max.clone()},this.center=this.current_center.clone(),this.pickNormal.y==0){const n=new Dt;n.setFromNormalAndCoplanarPoint(new P(0,1,0),this.pickPoint),this.plane=n}else{let n=new P(this.engine.camera.position.x,this.pickPoint.y,this.engine.camera.position.z);const i=new Dt;i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1),this.pickPoint),this.plane=i}}handleMouseUp(e){this.isDrag=!1,this.pickPoint=null,this.pickNormal=null,this.pickMesh=null,this.engine.controls.enabled=!0}handleMouseMove(e){this.meshs.forEach(n=>{n.material.opacity=0});const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0&&(t[0].object.material.opacity=.05),this.pickPoint!=null){const n=new P;if(e.raycaster.ray.intersectPlane(this.plane,n)){let i=n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());this.distance=i,this.updata_face(this.distance)}}}}class YE{engine;callback_;constructor(e){this.engine=e}init(){this.engine.handelBehaved.init(this,{showCatch:!0}),this.engine.handelBehaved.active()}catch_face(e){this.callback_=e}handleMouseMove(e){}handleMouseClick(e){let t=e.catch.normal;this.engine.handelBehaved.disActive(),this.callback_({dir:t,position:e.catch.point})}}class $E{engine;sectionBox;sectionFace;clippingStencil;currentClippingMode="";constructor(e){this.engine=e;let t=new Dt(new P(0,0,1),1e5);t.name="前";let n=new Dt(new P(0,0,1),1e5);n.name="左";let i=new Dt(new P(0,0,1),1e5);i.name="后";let r=new Dt(new P(0,0,1),1e5);r.name="右";let a=new Dt(new P(0,0,1),1e5);a.name="顶";let o=new Dt(new P(0,0,1),1e5);o.name="底";let l=new Dt(new P(0,0,1),1e5);l.name="face",this.engine.sectionPlane=[t,n,i,r,a,o,l]}init(){this.sectionBox=new qE(this.engine),this.sectionFace=new ZE(this.engine)}scaleBox(){let e=this.engine.octreeBox.getBoundingBox();this.sectionBox.setBox(e)}clippingModel(e){let t=[];e.forEach(r=>{let a=this.engine.models.find(o=>o.url===r.url);r.ids.forEach(o=>{a.nodesMap.get(o).infos.forEach(l=>{t.push(l.box)})})}),this.active("box");let n=i(t);this.sectionBox.setBox(n);function i(r){let a=new P(1e8,1e9,1e10),o=new P(-1e8,-1e9,-1e10);return r.forEach(l=>{l.min.xo.x&&(o.x=l.max.x),l.max.y>o.y&&(o.y=l.max.y),l.max.z>o.z&&(o.z=l.max.z)}),new gt(a,o)}}updateClippingValue(e){let t=this.sectionBox.maxBox,n=t.min.x+(t.max.x-t.min.x)*e.x.min*.01,i=t.min.y+(t.max.y-t.min.y)*e.y.min*.01,r=t.min.z+(t.max.z-t.min.z)*e.z.min*.01,a=t.min.x+(t.max.x-t.min.x)*e.x.max*.01,o=t.min.y+(t.max.y-t.min.y)*e.y.max*.01,l=t.min.z+(t.max.z-t.min.z)*e.z.max*.01;this.sectionBox.setboxXyz({minX:n,minY:i,minZ:r,maxX:a,maxY:o,maxZ:l})}active(e){if(this.sectionFace.disActive(),this.sectionBox.disActive(),this.currentClippingMode=e,e=="x")this.sectionFace.init(),this.sectionFace.active(),this.sectionFace.setFaceAngle(Math.PI/2,0,0);else if(e=="y")this.sectionFace.init(),this.sectionFace.active(),this.sectionFace.setFaceAngle(0,Math.PI/2,0);else if(e=="z")this.sectionFace.init(),this.sectionFace.active(),this.sectionFace.setFaceAngle(0,0,Math.PI/2);else if(e=="box")this.sectionBox.init(),this.sectionBox.active();else if(e=="face"){let t=new YE(this.engine);t.init(),t.catch_face(n=>{this.sectionFace.init(),this.sectionFace.active();let i=this.engine.octreeBox.getBoundingBox(),r=n.position.clone().sub(i.min.clone().add(i.max.clone()).setLength(.5)),a=new P(n.dir.x,n.dir.y,n.dir.z),o=r.dot(a);this.sectionFace.setFaceNormal(n.dir,o)})}}disabled(){this.currentClippingMode=="box"?this.sectionBox.disabled():this.sectionFace.disabled()}recover(){this.currentClippingMode=="box"?this.sectionBox.recover():this.sectionFace.recover()}reverse(){this.sectionFace.reverse()}disActive(){this.sectionFace.disActive(),this.sectionBox.disActive(),this.currentClippingMode=""}}class KE{engine;constructor(e){this.engine=e}getLevelTreeData(){let e=[];return this.engine.engineStatus.models.forEach(t=>{e.push({children:t.info.modelTree.modelTreeLevel,name:t.info.baseInfo.name,url:t.url})}),e}getTypeTreeData(){let e=[];return this.engine.engineStatus.models.forEach(t=>{e.push({children:t.info.modelTree.modelTreeType,name:t.info.baseInfo.name,url:t.url})}),e}getMajorTreeData(){let e=[];return this.engine.engineStatus.models.forEach(t=>{e.push({children:t.info.modelTree.modelTreeMajor,name:t.info.baseInfo.name,url:t.url})}),e}}class JE{engine;constructor(e){this.engine=e}getEngineInfo(){let e=0,t=0,n=0;return!this.engine||!this.engine.scene?{totalVertices:0,totalTriangles:0,meshCount:0}:(this.engine.scene.traverse(i=>{if(i instanceof rt){const r=i.geometry;if(r&&r.attributes){const a=r.attributes.position;if(a){const o=a.count;e+=o;let l=0;r.index?l=r.index.count/3:l=o/3,t+=l}}}}),this.engine.engineStatus.models.forEach(i=>{n=n+i.info.modelEdge.length}),{totalVertices:Math.floor(e),totalTriangles:Math.floor(t),meshCount:n})}}class QE{engine;constructor(e){this.engine=e}init(){}getModelProperties(e,t,n){let i=this.engine.engineStatus.models.find(a=>a.url===e);i.properties==null&&Wm(e+"/property",a=>{let o=JSON.parse(a);i.properties=o,setTimeout(()=>{r(o,t,n)},100)}),r(i.properties,t,n);function r(a,o,l){let c=[],h=a.models[o.toString()||""],u=h.map(p=>p[0]);u=u.filter((p,d)=>u.indexOf(p)===d),u.forEach(p=>{let d={name:a.categorys[p],children:[]};c.push(d),h.filter(m=>m[0]===p).forEach(m=>{d.children.push({name:a.names[m[1]],value:a.values[m[2]]})})}),l?.({properties:c,materials:c})}}}class eC{engine;constructor(e){this.engine=e}getModelTypes(){let e=[];return this.engine.engineStatus.models.forEach(t=>{t.info.modelMapper.forEach(n=>{e.push(n.typeName)})}),e=e.filter((t,n,i)=>i.indexOf(t)===n),e}getModelMajors(){let e=[];return this.engine.engineStatus.models.forEach(t=>{t.info.modelMapper.forEach(n=>{e.push(n.majorName)})}),e=e.filter((t,n,i)=>i.indexOf(t)===n),e}getModelLevels(){let e=[];return this.engine.engineStatus.models.forEach(t=>{t.info.modelMapper.forEach(n=>{e.push(n.levelName)})}),e=e.filter((t,n,i)=>i.indexOf(t)===n),e}getModelMappers(e){}getModelMapper(e,t){let n=this.engine.engineStatus.models.find(i=>i.url==e);return n?n.info.modelMapper.find(i=>i.id==t):null}getModelsWithLevelType(e,t,n=null){let i=[];return this.engine.engineStatus.models.forEach(r=>{let a={url:r.url,ids:[]};i.push(a),r.info.modelMapper.filter(o=>o.levelName===e&&o.typeName===t).forEach(o=>{a.ids.push(Number(o.id))})}),n&&n(i),i}getModelsWithType(e,t=null){let n=[];return this.engine.engineStatus.models.forEach(i=>{let r={url:i.url,ids:[]};n.push(r),i.info.modelMapper.filter(a=>a.typeName===e).forEach(a=>{r.ids.push(Number(a.id))})}),t&&t(n),n}getModelsWithLevel(e,t){let n=[];return this.engine.engineStatus.models.forEach(i=>{let r={url:i.url,ids:[]};n.push(r),i.info.modelMapper.filter(a=>a.levelName===e).forEach(a=>{r.ids.push(Number(a.id))})}),t&&t(n),n}getModelsWithMajor(e,t){let n=[];return this.engine.engineStatus.models.forEach(i=>{let r={url:i.url,ids:[]};n.push(r),i.info.modelMapper.filter(a=>a.majorName===e).forEach(a=>{r.ids.push(Number(a.id))})}),t&&t(n),n}}class tC{engine;isActive=!1;groupEdge;material;modelEdgeLoaded=!1;indexes=new Map;constructor(e){this.engine=e,this.groupEdge=this.engine.scene.getObjectByName("groupEdge"),this.material=new Ms({color:"#000000",depthTest:!0,transparent:!0,opacity:.3}),this.material.clippingPlanes=this.engine.sectionPlane}active(){this.isActive=!0,this.groupEdge.visible=!0,this.engine.scene.traverse(e=>{e.isMesh&&e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(t=>{t.polygonOffset=!0,t.polygonOffsetFactor=1,t.polygonOffsetUnits=4})}),this.show()}disActive(){this.isActive=!1,this.groupEdge.visible=!1,this.engine.scene.traverse(e=>{e.isMesh&&e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(t=>{t.polygonOffset=!1})})}loadModelEdge(){this.modelEdgeLoaded||(this.engine.engineStatus.models.forEach(e=>{if(!this.groupEdge.children.find(t=>t.url==e.url)){let t=e.info,n=[],i=new Map;t.modelEdge.forEach(r=>{let a=n.length;for(let o=0;o{let n=[];e.forEach((a,o)=>{a[2].forEach((l,c)=>{l.length==2&&(n.push(l[0].X),n.push(l[0].Z),n.push(-l[0].Y),n.push(l[1].X),n.push(l[1].Z),n.push(-l[1].Y))})});let i=new dt;i.setAttribute("position",new jt(n,3));let r=new Hp(i,this.material);r.url=t,this.groupEdge.add(r)})}getModelEdge(e,t){let n=this.indexes.get(e);if(n){let i=n.get(t);if(i)return i.slice()}return null}hideModelEdge(e,t){let n=this.indexes.get(e);if(n){let i=n.get(t);if(i){let[r,a,o]=i,l=this.groupEdge.children.find(c=>c.url==e);if(l){let c=l.geometry.attributes.position.array;for(let h=r;hc.url==e);if(l){let c=l.geometry.attributes.position.array,h=0;for(let u=r;u=3;if(o[p]&&o[p].length===2){const m=d?o[p][1]:o[p][0];c[u]=m.X,c[u+1]=m.Z,c[u+2]=-m.Y}h+=3}l.geometry.attributes.position.needsUpdate=!0}}}}}class nC{config;constructor(e){this.config={temperature:.7,maxTokens:2e4,timeout:3e5,...e}}async chat(e){const t=new AbortController,n=setTimeout(()=>t.abort(),this.config.timeout);try{const i=await fetch(`${this.config.baseURL}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify({model:this.config.model,messages:e,temperature:this.config.temperature,max_tokens:this.config.maxTokens,stream:!1}),signal:t.signal});if(clearTimeout(n),!i.ok){const r=await i.json().catch(()=>({}));throw new Error(`API请求失败 (${i.status}): ${r.error?.message||r.message||i.statusText}`)}return(await i.json()).choices?.[0]?.message?.content||""}catch(i){throw clearTimeout(n),i.name==="AbortError"?new Error("请求超时,请重试"):i.message.includes("Failed to fetch")?new Error(`网络请求失败,请检查: 1. 网络连接 2. API地址是否正确 3. 是否有CORS限制`):i}}async chatStream(e,t){const n=new AbortController,i=setTimeout(()=>n.abort(),this.config.timeout);try{const r=await fetch(`${this.config.baseURL}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify({model:this.config.model,messages:e,temperature:this.config.temperature,max_tokens:this.config.maxTokens,stream:!0}),signal:n.signal});if(clearTimeout(i),!r.ok){const c=await r.json().catch(()=>({}));throw new Error(`API请求失败 (${r.status}): ${c.error?.message||c.message||r.statusText}`)}const a=r.body?.getReader();if(!a)throw new Error("无法读取响应流");const o=new TextDecoder;let l="";for(;;){const{done:c,value:h}=await a.read();if(c){t("",!0);break}l+=o.decode(h,{stream:!0});const u=l.split(` -`);l=u.pop()||"";for(const p of u){const d=p.trim();if(!d||!d.startsWith("data: "))continue;const m=d.slice(6);if(m!=="[DONE]")try{const f=JSON.parse(m).choices?.[0]?.delta?.content;f&&t(f,!1)}catch(f){console.warn("解析流式数据失败:",f)}}}}catch(r){throw clearTimeout(i),r.name==="AbortError"?new Error("请求超时,请重试"):r.message.includes("Failed to fetch")?new Error("网络请求失败,请检查网络连接"):r}}updateConfig(e){this.config={...this.config,...e}}getConfig(){return{...this.config}}}class iT{engine;steps=[];stepResults=new Map;conversationHistory=[];state="idle";llmApi=null;config=null;_callback_message;_callback_question;_callback_content;prompts={};constructor(e){this.engine=e}async init(e,t,n){this._callback_message=e,this._callback_question=t,this._callback_content=n,this.conversationHistory=[];let i={llmConfig:{baseURL:"https://open.bigmodel.cn/api/coding/paas/v4",apiKey:"4041336a72f14d8fa3800bd651a80fec.vZWUxssXOXB37vlV",model:"GLM-4.5-Air",temperature:.7,maxTokens:2e3},debug:!0,stepExecution:{maxRetries:5},prompts:{main:"",step:"",apiDoc:""}};try{this.config=i,this.llmApi=new nT(i.llmConfig);try{const r=await Promise.resolve().then(()=>hC);this.prompts.main=r.default;const a=await Promise.resolve().then(()=>uC);this.prompts.step=a.default;const o=await Promise.resolve().then(()=>dC);this.prompts.apiDoc=o.default}catch(r){throw console.error("[AI Manager] 提示词文件加载失败:",r),new Error(`提示词文件加载失败: ${r.message||"未知错误"}`)}}catch(r){throw console.error("[AI Manager] 初始化失败:",r),r}}async conversationV2(e){if(this.conversationHistory.length===0){const i={role:"system",content:`${this.prompts.main}`},r={role:"system",content:`## BIM引擎API文档 +`);l=u.pop()||"";for(const p of u){const d=p.trim();if(!d||!d.startsWith("data: "))continue;const m=d.slice(6);if(m!=="[DONE]")try{const f=JSON.parse(m).choices?.[0]?.delta?.content;f&&t(f,!1)}catch(f){console.warn("解析流式数据失败:",f)}}}}catch(r){throw clearTimeout(i),r.name==="AbortError"?new Error("请求超时,请重试"):r.message.includes("Failed to fetch")?new Error("网络请求失败,请检查网络连接"):r}}updateConfig(e){this.config={...this.config,...e}}getConfig(){return{...this.config}}}class iC{engine;steps=[];stepResults=new Map;conversationHistory=[];state="idle";llmApi=null;config=null;_callback_message;_callback_question;_callback_content;prompts={};constructor(e){this.engine=e}async init(e,t,n){this._callback_message=e,this._callback_question=t,this._callback_content=n,this.conversationHistory=[];let i={llmConfig:{baseURL:"https://open.bigmodel.cn/api/coding/paas/v4",apiKey:"4041336a72f14d8fa3800bd651a80fec.vZWUxssXOXB37vlV",model:"GLM-4.5-Air",temperature:.7,maxTokens:2e3},debug:!0,stepExecution:{maxRetries:5},prompts:{main:"",step:"",apiDoc:""}};try{this.config=i,this.llmApi=new nC(i.llmConfig);try{const r=await Promise.resolve().then(()=>hT);this.prompts.main=r.default;const a=await Promise.resolve().then(()=>uT);this.prompts.step=a.default;const o=await Promise.resolve().then(()=>dT);this.prompts.apiDoc=o.default}catch(r){throw console.error("[AI Manager] 提示词文件加载失败:",r),new Error(`提示词文件加载失败: ${r.message||"未知错误"}`)}}catch(r){throw console.error("[AI Manager] 初始化失败:",r),r}}async conversationV2(e){if(this.conversationHistory.length===0){const i={role:"system",content:`${this.prompts.main}`},r={role:"system",content:`## BIM引擎API文档 ${this.prompts.apiDoc}`};this.conversationHistory.push(i),this.conversationHistory.push(r)}this.conversationHistory.push({role:"user",content:e});const t=await this.llmApi.chat(this.conversationHistory);this.conversationHistory.push({role:"assistant",content:t}),this.config?.debug&&console.log("[AI Manager] 大模型响应:",t);let n=await this.parseAnalysisResponse(t);n&&n.questions&&n.questions.length>0&&this._callback_question(n.questions)}async parseAnalysisResponse(e){try{if(e.includes("##question##")){const t=e.match(/##question##\s*([\s\S]*?)(?=##|$)/);if(t){let n=t[1].trim();n=n.replace(/^```json\n?/,"").replace(/^```\n?/,"").replace(/\n?```$/,"");const i=n.match(/(\[[\s\S]*\])/);i&&(n=i[1]);const r=JSON.parse(n);return this.state="waiting_answer",{state:"waiting_answer",questions:r}}}if(e.includes("##steps##")){const t=e.match(/##steps##\s*([\s\S]*?)(?=##|$)/);if(t){let n=t[1].trim();n=n.replace(/^```json\n?/,"").replace(/^```\n?/,"").replace(/\n?```$/,"");const i=n.match(/(\[[\s\S]*\])/);return i&&(n=i[1]),this.steps=JSON.parse(n),this.config?.debug&&console.log("[AI Manager] 步骤规划完成,共",this.steps.length,"个步骤"),this._callback_message(this.steps),await this.executeSteps()}}return{state:"completed",data:e}}catch(t){return console.error("[AI Manager] 解析响应失败:",t),{state:"error",error:"解析大模型响应失败: "+t.message}}}async executeSteps(){try{this.state="executing",this.stepResults.clear();for(const e of this.steps){this._callback_message(e),this.config?.debug&&console.log(`[AI Manager] 执行步骤 ${e.id}: ${e.content}`);const t=await this.getDependenciesOutput(e.dependencies),n=await this.executeStep(e,t);this.stepResults.set(e.id,n),this.config?.debug&&console.log(`[AI Manager] 步骤 ${e.id} 执行完成:`,n)}return this.state="completed",{state:"completed",steps:this.steps,result:Array.from(this.stepResults.values())}}catch(e){return console.error("[AI Manager] 步骤执行失败:",e),{state:"error",error:"步骤执行失败: "+e.message}}}async getDependenciesOutput(e){return e.length===0?null:e.length===1?this.stepResults.get(e[0]):e.map(t=>this.stepResults.get(t))}async executeStep(e,t){const n=this.config?.stepExecution?.maxRetries??1,i=[];let r=null,a=!1;for(let o=0;o<=n;o++)try{const l=i.length>0?i[i.length-1]:"",c=await(o===0?this.generateCode(e,t):a?this.regenerateCodeAfterFailure(e,t,l,r,o):this.generateCode(e,t));i.push(c),this.config?.debug&&console.log(`[AI Manager] 步骤 ${e.id} 第 ${o+1} 次生成的代码: ${c}`);try{const h=await this.executeCode(c,t);if(h instanceof Object&&h.success==!1||h instanceof String&&(h.includes("undefined")||h.includes("not"))){r=h,a=!0;debugger;throw h}debugger;return h}catch(h){debugger;throw r=h,a=!0,h}}catch(l){if(a||(r=l),o>=n)throw console.error(`[AI Manager] 执行步骤 ${e.id} 失败(已达重试上限):`,l),new Error(`步骤 ${e.id} (${e.content}) 执行失败: ${l.message}`);console.warn(`[AI Manager] 步骤 ${e.id} 第 ${o+1} 次执行失败,将尝试让AI修复后重试(剩余重试次数:${n-o}):`,l)}throw new Error(`步骤 ${e.id} (${e.content}) 执行失败: 未知错误`)}extractCodeFromResponse(e){const t=e.match(/##code##\s*([\s\S]*?)(?=##|$)/);if(t){let a=t[1].trim();if(a=a.replace(/^```javascript\n?/,"").replace(/^```js\n?/,"").replace(/^```\n?/,"").replace(/\n?```$/,""),a.length>0)return a}const n=[/```javascript\s*([\s\S]*?)```/i,/```js\s*([\s\S]*?)```/i,/```\s*([\s\S]*?)```/];for(const a of n){const o=e.match(a);if(o&&o[1]){const l=o[1].trim();if(l.length>0)return this.config?.debug&&console.warn("[AI Manager] 未找到 ##code## 标记,从 markdown 代码块中提取代码"),l}}const i=/[请|说明|注意|需要|应该|可以|如果|但是|因为|所以|例如|比如]/i.test(e),r=/(function|const|let|var|return|async|await|=>|engine\.|previousStepOutput)/.test(e);if(!i&&r){const a=e.trim().replace(/^[,。:;!?\s]+/,"").replace(/[,。:;!?\s]+$/,"");if(a.length>10)return this.config?.debug&&console.warn("[AI Manager] 未找到 ##code## 标记和代码块,尝试使用整个响应作为代码"),a}throw new Error(`无法从大模型响应中提取代码。响应内容:${e.substring(0,200)}...`)}async generateCode(e,t){try{const n={role:"system",content:`${this.prompts.step}`},i={role:"system",content:` @@ -4962,7 +4962,7 @@ ${JSON.stringify(l,null,2)} 4) 代码需要能在浏览器环境运行(不要使用 Node 专属 API)`},h=await this.llmApi.chat([a,o,c]);try{return this.extractCodeFromResponse(h)}catch(u){throw new Error(`无法从大模型响应中提取代码(修复重试阶段):${u.message}`)}}catch(a){throw console.error("[AI Manager] 修复后代码生成失败:",a),a}}async executeCode(e,t){try{const n=this.engine;let i=e;i=i.replace(/\b(const|let|var)\s+previousStepOutput\s*=\s*[^;]*;/g,""),i=i.replace(/\b(const|let|var)\s+previousStepOutput\s*;/g,"");const r=new Function("engine","previousStepOutput",` 'use strict'; ${i} - `)(n,t);return r&&typeof r.then=="function"?await r:r}catch(n){return console.error("[AI Manager] 代码执行失败:",n),"error"+n.message}}reset(){this.conversationHistory=[],this.steps=[],this.stepResults.clear(),this.state="idle",this.config?.debug&&console.log("[AI Manager] 对话已重置")}getState(){return this.state}getHistory(){return[...this.conversationHistory]}getSteps(){return[...this.steps]}getStepResults(){return new Map(this.stepResults)}}class sT{engine;points=[];isPlaying=!1;animationFrameId=null;playStartTime=0;playFromIndex=0;playToIndex=0;playOptions={};stayTimerId=null;playRangeToIndex=0;constructor(e){this.engine=e}init(){this.points=[],this.stop()}getCurrentPoint(){return{...this.engine.cameraModule.getCameraPose(),stayTime:0}}addPoint(e=0){const t=this.getCurrentPoint();return t.stayTime=e,this.points.push(t),this.points.length}addPoints(e){for(const t of e)this.points.push({...t});return this.points.length}savePoints(e){return this.addPoints(e)}removePoint(e){return e>=0&&e=0&&e=0&&e=this.points.length||e>=t?(console.warn("PathRoaming: 无效的索引范围"),!1):this.points.length<2?(console.warn("PathRoaming: 至少需要2个点位才能播放"),!1):(this.isPlaying&&this.stop(),this.isPlaying=!0,this.playOptions={duration:3e3,loop:!1,...n},this.engine.controlModule.disActive(),this.playFromIndex=e,this.playToIndex=e+1,this.playStartTime=performance.now(),this.playRangeToIndex=t,this.animate(),!0)}stop(){this.isPlaying=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.stayTimerId!==null&&(clearTimeout(this.stayTimerId),this.stayTimerId=null),this.engine.controlModule.active()}pause(){this.isPlaying&&(this.isPlaying=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.stayTimerId!==null&&(clearTimeout(this.stayTimerId),this.stayTimerId=null))}getIsPlaying(){return this.isPlaying}animate=()=>{if(!this.isPlaying)return;const e=performance.now()-this.playStartTime,t=this.playOptions.duration||3e3,n=Math.min(e/t,1),i=this.points[this.playFromIndex],r=this.points[this.playToIndex],a=this.interpolatePose(i,r,n);this.engine.cameraModule.restoreCameraPose(a),n>=1?this.onSegmentComplete():this.animationFrameId=requestAnimationFrame(this.animate)};onSegmentComplete(){const e=this.playToIndex;this.playOptions.onPointComplete&&this.playOptions.onPointComplete(e);const t=this.points[e];t.stayTime&&t.stayTime>0?this.stayTimerId=globalThis.setTimeout(()=>{this.stayTimerId=null,this.moveToNextSegment()},t.stayTime):this.moveToNextSegment()}moveToNextSegment(){const e=this.playToIndex>=this.playRangeToIndex,t=this.playToIndex>=this.points.length-1;e||t?this.playOptions.loop&&this.points.length>=2?(this.playFromIndex=0,this.playToIndex=1,this.playRangeToIndex=this.points.length-1,this.playStartTime=performance.now(),this.animate()):this.onPlayComplete():(this.playFromIndex=this.playToIndex,this.playToIndex=this.playToIndex+1,this.playStartTime=performance.now(),this.animate())}onPlayComplete(){this.stop(),this.playOptions.onComplete&&this.playOptions.onComplete()}interpolatePose(e,t,n){const i=this.easeInOutCubic(n),r={type:t.type,position:{x:zt.lerp(e.position.x,t.position.x,i),y:zt.lerp(e.position.y,t.position.y,i),z:zt.lerp(e.position.z,t.position.z,i)},rotation:{x:zt.lerp(e.rotation.x,t.rotation.x,i),y:zt.lerp(e.rotation.y,t.rotation.y,i),z:zt.lerp(e.rotation.z,t.rotation.z,i)},quaternion:{x:zt.lerp(e.quaternion.x,t.quaternion.x,i),y:zt.lerp(e.quaternion.y,t.quaternion.y,i),z:zt.lerp(e.quaternion.z,t.quaternion.z,i),w:zt.lerp(e.quaternion.w,t.quaternion.w,i)}};return e.target&&t.target?r.target={x:zt.lerp(e.target.x,t.target.x,i),y:zt.lerp(e.target.y,t.target.y,i),z:zt.lerp(e.target.z,t.target.z,i)}:t.target&&(r.target={...t.target}),e.zoom!==void 0&&t.zoom!==void 0&&(r.zoom=zt.lerp(e.zoom,t.zoom,i)),r}easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2}dispose(){this.stop(),this.points=[],this.playOptions={}}}class rT{engine;miniMapCamera=null;miniMapRenderer=null;miniMapContainer=null;overlayCanvas=null;overlayCtx=null;isVisible=!1;mapSize=200;currentHalfSize=500;minHalfSize=5;maxHalfSize=1e4;halfSizeInitialized=!1;camY=1e3;centerX=0;centerZ=0;dragMode=null;lastMouseX=0;lastMouseY=0;constructor(e){this.engine=e,this.init()}getstate(){return this.isVisible}init(){this.miniMapContainer=document.createElement("div"),this.miniMapContainer.style.position="absolute",this.miniMapContainer.style.bottom="20px",this.miniMapContainer.style.left="20px",this.miniMapContainer.style.width=`${this.mapSize}px`,this.miniMapContainer.style.height=`${this.mapSize}px`,this.miniMapContainer.style.border="2px solid rgba(255, 255, 255, 0.4)",this.miniMapContainer.style.borderRadius="4px",this.miniMapContainer.style.overflow="hidden",this.miniMapContainer.style.display="none",this.miniMapContainer.style.zIndex="200",this.miniMapContainer.style.pointerEvents="auto",this.miniMapContainer.style.cursor="crosshair",this.engine.container.appendChild(this.miniMapContainer),this.miniMapRenderer=new au({alpha:!0,antialias:!1}),this.miniMapRenderer.setSize(this.mapSize,this.mapSize),this.miniMapRenderer.setPixelRatio(window.devicePixelRatio),this.miniMapRenderer.setClearColor(1710638,.85),this.miniMapContainer.appendChild(this.miniMapRenderer.domElement);const e=window.devicePixelRatio||1;this.overlayCanvas=document.createElement("canvas"),this.overlayCanvas.width=this.mapSize*e,this.overlayCanvas.height=this.mapSize*e,this.overlayCanvas.style.position="absolute",this.overlayCanvas.style.top="0",this.overlayCanvas.style.left="0",this.overlayCanvas.style.width=`${this.mapSize}px`,this.overlayCanvas.style.height=`${this.mapSize}px`,this.overlayCanvas.style.pointerEvents="none",this.miniMapContainer.appendChild(this.overlayCanvas),this.overlayCtx=this.overlayCanvas.getContext("2d"),this.overlayCtx&&this.overlayCtx.scale(e,e),this.miniMapCamera=new Ai(-this.currentHalfSize,this.currentHalfSize,this.currentHalfSize,-this.currentHalfSize,.1,1e5),this.miniMapCamera.up.set(0,0,-1),this.setupEvents()}worldToPixel(e,t){const n=this.currentHalfSize;return{x:((e-this.centerX)/n*.5+.5)*this.mapSize,y:((t-this.centerZ)/n*.5+.5)*this.mapSize}}pixelToWorld(e,t){const n=this.currentHalfSize;return{x:(e/this.mapSize-.5)*2*n+this.centerX,z:(t/this.mapSize-.5)*2*n+this.centerZ}}setupEvents(){const e=this.miniMapContainer;e.addEventListener("wheel",this.onWheel,{passive:!1}),e.addEventListener("mousedown",this.onMouseDown),e.addEventListener("mousemove",this.onMouseMove),e.addEventListener("mouseup",this.onMouseUp),e.addEventListener("mouseleave",this.onMouseUp),e.addEventListener("contextmenu",t=>t.preventDefault()),["pointerdown","pointermove","pointerup","click","dblclick"].forEach(t=>e.addEventListener(t,n=>n.stopPropagation()))}onWheel=e=>{e.preventDefault(),e.stopPropagation();const t=e.deltaY>0?1.25:.8;this.currentHalfSize=Math.max(this.minHalfSize,Math.min(this.maxHalfSize,this.currentHalfSize*t))};onMouseDown=e=>{e.stopPropagation();const t=this.miniMapContainer.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top,r=this.engine.camera;if(!r)return;const{x:a,y:o}=this.worldToPixel(r.position.x,r.position.z);Math.hypot(n-a,i-o)<25?(this.dragMode="rotate",this.miniMapContainer.style.cursor="alias"):(this.dragMode=null,this.handleTeleport(n,i)),this.lastMouseX=n,this.lastMouseY=i};onMouseMove=e=>{if(e.stopPropagation(),this.dragMode!=="rotate")return;const t=this.miniMapContainer.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top;this.handleRotate(n,i),this.lastMouseX=n,this.lastMouseY=i};onMouseUp=e=>{e.stopPropagation(),this.dragMode=null,this.miniMapContainer&&(this.miniMapContainer.style.cursor="crosshair")};handleTeleport(e,t){const n=this.engine.camera,i=this.engine.controls;if(!n||!i)return;const{x:r,z:a}=this.pixelToWorld(e,t),o=r-n.position.x,l=a-n.position.z;n.position.x+=o,n.position.z+=l,i.target.x+=o,i.target.z+=l,i.update()}handleRotate(e,t){const n=this.engine.camera,i=this.engine.controls;if(!n||!i)return;const r=this.mapSize/2,a=this.mapSize/2,o=Math.atan2(this.lastMouseY-a,this.lastMouseX-r);let l=Math.atan2(t-a,e-r)-o;l>Math.PI&&(l-=2*Math.PI),l<-Math.PI&&(l+=2*Math.PI);const c=new P().copy(i.target).sub(n.position),h=new Kh().setFromVector3(c);h.theta-=l,c.setFromSpherical(h),i.target.copy(n.position).add(c),i.update()}drawOverlay(){const e=this.overlayCtx,t=this.engine.camera;if(!e||!t)return;e.clearRect(0,0,this.mapSize,this.mapSize);const n=this.mapSize/2,i=this.mapSize/2,r=new P;t.getWorldDirection(r);const a=Math.atan2(r.x,-r.z),o=36,l=Math.PI/10;e.save(),e.translate(n,i),e.rotate(a);const c=e.createRadialGradient(0,0,2,0,0,o);c.addColorStop(0,"rgba(0, 230, 130, 0.9)"),c.addColorStop(1,"rgba(0, 230, 130, 0)");const h=-Math.sin(l)*o,u=-Math.cos(l)*o,p=Math.sin(l)*o,d=-Math.cos(l)*o;e.beginPath(),e.moveTo(0,0),e.lineTo(h,u),e.lineTo(p,d),e.closePath(),e.fillStyle=c,e.fill(),e.fillStyle="rgba(255, 255, 255, 0.95)",e.strokeStyle="rgba(0, 200, 110, 0.9)",e.lineWidth=1.5,e.beginPath(),e.arc(0,0,4,0,Math.PI*2),e.fill(),e.stroke(),e.restore()}show(){this.isVisible=!0,this.miniMapContainer&&(this.miniMapContainer.style.display="block")}hide(){this.isVisible=!1,this.miniMapContainer&&(this.miniMapContainer.style.display="none")}toggle(){this.isVisible?this.hide():this.show()}update(){if(!this.isVisible||!this.miniMapCamera||!this.miniMapRenderer)return;const e=this.engine.camera;if(!(!e||!this.engine.scene)){if(this.engine.octreeBox){const t=this.engine.octreeBox.getBoundingBox();if(t?.min&&t?.max){const n=t.max.x-t.min.x,i=t.max.z-t.min.z,r=t.max.y-t.min.y;this.camY=t.max.y+Math.max(n,i,r),!this.halfSizeInitialized&&n+i>0&&(this.currentHalfSize=Math.max(n,i)*2,this.halfSizeInitialized=!0)}}this.centerX=e.position.x,this.centerZ=e.position.z,this.miniMapCamera.left=-this.currentHalfSize,this.miniMapCamera.right=this.currentHalfSize,this.miniMapCamera.top=this.currentHalfSize,this.miniMapCamera.bottom=-this.currentHalfSize,this.miniMapCamera.updateProjectionMatrix(),this.miniMapCamera.position.set(this.centerX,this.camY,this.centerZ),this.miniMapCamera.lookAt(this.centerX,this.camY-1,this.centerZ),this.miniMapRenderer.render(this.engine.scene,this.miniMapCamera),this.drawOverlay()}}dispose(){this.miniMapContainer&&(this.miniMapContainer.removeEventListener("wheel",this.onWheel),this.miniMapContainer.removeEventListener("mousedown",this.onMouseDown),this.miniMapContainer.removeEventListener("mousemove",this.onMouseMove),this.miniMapContainer.removeEventListener("mouseup",this.onMouseUp),this.miniMapContainer.removeEventListener("mouseleave",this.onMouseUp)),this.miniMapRenderer&&(this.miniMapRenderer.dispose(),this.miniMapRenderer=null),this.miniMapContainer&&(this.miniMapContainer.remove(),this.miniMapContainer=null),this.miniMapCamera=null,this.overlayCtx=null,this.overlayCanvas=null}}const aT=[{Id:"100001",Name:"1",Points:[{X:-2,Y:-5,Z:0},{X:-2,Y:5,Z:0}]},{Id:"100002",Name:"2",Points:[{X:2,Y:-5,Z:0},{X:2,Y:5,Z:0}]},{Id:"100003",Name:"A",Points:[{X:-5,Y:-2,Z:0},{X:5,Y:-2,Z:0}]},{Id:"100004",Name:"B",Points:[{X:-5,Y:2,Z:0},{X:5,Y:2,Z:0}]}];class oT{engine;rootGroup=null;isVisible=!1;axes=[];coordinateMapper=e=>new P(e.X,e.Z,-e.Y);constructor(e){this.engine=e,this._initRoot()}setData(e){this._clearAxes(),this.axes=e.map(t=>({data:t,group:null})),this.axes.forEach(t=>this._buildAxis(t))}setMockData(){this.setData(aT)}show(){this.isVisible=!0,this.rootGroup&&(this.rootGroup.visible=!0)}hide(){this.isVisible=!1,this.rootGroup&&(this.rootGroup.visible=!1)}toggle(){this.isVisible?this.hide():this.show()}update(){if(!this.isVisible||!this.rootGroup)return;const e=this.engine.camera,t=this.engine.renderer;if(!e||!t)return;let n=.5;if(e instanceof Ai){const i=e,r=(i.top-i.bottom)/i.zoom,a=t.domElement.clientHeight||1;n=30*r/a}this.rootGroup.traverse(i=>{i instanceof Eh&&i.scale.set(n,n,1)})}dispose(){this._clearAxes(),this.rootGroup&&(this.engine.scene&&this.engine.scene.remove(this.rootGroup),this.rootGroup=null)}_initRoot(){this.rootGroup=new ln,this.rootGroup.name="GridRoot",this.rootGroup.visible=!1,this.engine.scene&&this.engine.scene.add(this.rootGroup)}_clearAxes(){this.axes.forEach(e=>{e.group&&(this.rootGroup?.remove(e.group),e.group.traverse(t=>{const n=t;if("geometry"in n&&n.geometry&&n.geometry.dispose(),"material"in n&&n.material){const i=n.material;"map"in i&&i.map&&i.map.dispose(),i.dispose()}}),e.group=null)}),this.axes=[]}_buildAxis(e){if(!this.rootGroup)return;const t=this.coordinateMapper(e.data.Points[0]),n=this.coordinateMapper(e.data.Points[1]),i=e.data.Name,r=new ln;r.name=`GridAxis_${e.data.Id}`;const a=new dt().setFromPoints([t,n]),o=new Ms({color:1609983,depthTest:!1}),l=new $i(a,o);l.renderOrder=998,r.add(l),r.add(this._makeCircleSprite(i,t)),r.add(this._makeCircleSprite(i,n)),this.rootGroup.add(r),e.group=r}_makeCircleSprite(e,t){const n=document.createElement("canvas");n.width=128,n.height=128;const i=n.getContext("2d"),r=128/2,a=128/2,o=128/2-4;i.beginPath(),i.arc(r,a,o,0,Math.PI*2),i.fillStyle="white",i.fill(),i.strokeStyle="#1890ff",i.lineWidth=6,i.stroke(),i.fillStyle="#1890ff",i.font=`bold ${Math.round(128*.38)}px Arial`,i.textAlign="center",i.textBaseline="middle",i.fillText(e,r,a);const l=new t1(n),c=new Sp({map:l,depthTest:!1,transparent:!0}),h=new Eh(c);return h.position.copy(t),h.scale.set(.5,.5,1),h.renderOrder=999,h}}const lT=[{Id:"339",Name:"站台",Elevation:-.32808398950131235},{Id:"2787",Name:"站厅",Elevation:16.896325459317584},{Id:"236633",Name:"顶板",Elevation:36.745406824146976}];class cT{engine;isVisible=!1;levels=[];svgContainer=null;svgOverlay=null;worldToScreen=null;halfSize=500;COLOR="#1890ff";PLANE_OPACITY=.08;constructor(e){this.engine=e,this._initSvg()}_initSvg(){this.svgContainer=document.createElement("div"),this.svgContainer.style.position="absolute",this.svgContainer.style.top="0",this.svgContainer.style.left="0",this.svgContainer.style.width="100%",this.svgContainer.style.height="100%",this.svgContainer.style.pointerEvents="none",this.svgContainer.style.overflow="hidden",this.svgContainer.style.display="none",this.engine.container.appendChild(this.svgContainer),this.svgOverlay=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svgOverlay.style.position="absolute",this.svgOverlay.style.top="0",this.svgOverlay.style.left="0",this.svgOverlay.style.width="1920px",this.svgOverlay.style.height="1080px",this.svgOverlay.style.overflow="visible",this.svgContainer.appendChild(this.svgOverlay)}setData(e){this._clearAll(),this.levels=e.map(t=>({data:t,group:null,svgGroup:null})),this.levels.forEach(t=>this._buildThreeObject(t))}setMockData(){this.setData(lT)}show(){this.isVisible=!0,this.svgContainer&&(this.svgContainer.style.display="block"),this.levels.forEach(e=>{e.group&&(e.group.visible=!0)})}hide(){this.isVisible=!1,this.svgContainer&&(this.svgContainer.style.display="none"),this.levels.forEach(e=>{e.group&&(e.group.visible=!1)})}toggle(){this.isVisible?this.hide():this.show()}update(){!this.isVisible||!this.svgOverlay||!this.levels.length||!this.engine.camera||!this.engine.renderer||(this._initWorldToScreen(),this.levels.forEach(e=>this._updateSvgLabels(e)))}dispose(){this._clearAll(),this.svgContainer&&(this.svgContainer.remove(),this.svgContainer=null),this.svgOverlay=null,this.worldToScreen=null}_initWorldToScreen(){this.engine.camera&&this.engine.renderer&&this.engine.scene&&(this.worldToScreen=new Dn(this.engine.camera,this.engine.renderer,this.engine.scene))}_clearAll(){this.levels.forEach(e=>{e.group&&this.engine.scene&&(this.engine.scene.remove(e.group),e.group.traverse(t=>{t.geometry&&t.geometry.dispose(),t.material&&(Array.isArray(t.material)?t.material.forEach(n=>n.dispose()):t.material.dispose())}),e.group=null),e.svgGroup&&this.svgOverlay&&(e.svgGroup.remove(),e.svgGroup=null)}),this.levels=[]}_buildThreeObject(e){if(!this.engine.scene)return;const t=e.data.Elevation,n=this.halfSize,i=new ln,r=new Ss(n*2,n*2);r.rotateX(-Math.PI/2);const a=new Ht({color:this.COLOR,transparent:!0,opacity:this.PLANE_OPACITY,side:bt,depthWrite:!1}),o=new rt(r,a);o.position.y=t,i.add(o);const l=[new P(-n,t,-n),new P(n,t,-n),new P(n,t,n),new P(-n,t,n),new P(-n,t,-n)],c=new dt().setFromPoints(l),h=new Ms({color:this.COLOR,transparent:!0,opacity:.7});if(i.add(new $i(c,h)),i.visible=this.isVisible,this.engine.scene.add(i),e.group=i,this.svgOverlay){const u=document.createElementNS("http://www.w3.org/2000/svg","g");u.dataset.levelId=e.data.Id;for(let p=0;p<4;p++)u.appendChild(this._makeLabel(e.data.Name,e.data.Elevation));this.svgOverlay.appendChild(u),e.svgGroup=u}}_updateSvgLabels(e){if(!e.svgGroup||!this.worldToScreen)return;const t=this.halfSize,n=e.data.Elevation,i=[new P(-t,n,-t),new P(t,n,-t),new P(t,n,t),new P(-t,n,t)],r=Array.from(e.svgGroup.children);i.forEach((a,o)=>{const l=this.worldToScreen.worldToScreen(a);r[o].setAttribute("x",String(l.x)),r[o].setAttribute("y",String(l.y))})}_makeLabel(e,t){const n=document.createElementNS("http://www.w3.org/2000/svg","text");return n.textContent=`${e} ▲${t.toFixed(3)}m`,n.setAttribute("text-anchor","middle"),n.setAttribute("dominant-baseline","central"),n.setAttribute("fill",this.COLOR),n.setAttribute("font-size","12"),n.setAttribute("font-family","Arial, sans-serif"),n.setAttribute("font-weight","bold"),n.setAttribute("stroke","white"),n.setAttribute("stroke-width","2"),n.setAttribute("paint-order","stroke"),n.style.pointerEvents="none",n}}class hT{engine;constructor(e){}update(){}}class uT{engine;currentHdrId="0";isVisible=!0;currentIntensity=.2;currentTexture=null;skybox=null;textureCache=new Map;hdrList=[{id:"0",name:"无"},{id:"1",name:"纯净-多云",url:"assets/hdr/纯净-多云.hdr"},{id:"2",name:"纯净-落日",url:"assets/hdr/纯净-落日.hdr"},{id:"3",name:"纯净-少云",url:"assets/hdr/纯净-少云.hdr"},{id:"4",name:"纯净-无云",url:"assets/hdr/纯净-无云.hdr"},{id:"5",name:"纯净-夜晚",url:"assets/hdr/纯净-夜晚.hdr"},{id:"6",name:"纯净-阴天",url:"assets/hdr/纯净-阴天.hdr"},{id:"7",name:"纯净-中云",url:"assets/hdr/纯净-中云.hdr"}];constructor(e){this.engine=e}getHdrList(){return this.hdrList}async setHdr(e){const t=this.hdrList.find(n=>n.id===e);if(!t){console.warn(`[Hdr] HDR id "${e}" not found`);return}if(e==="0"||!t.url){this._clearHdr(),this.currentHdrId="0";return}if(this.textureCache.has(e)){this._applyTexture(this.textureCache.get(e)),this.currentHdrId=e;return}try{const n=await this._loadHdr(t.url);this.textureCache.set(e,n),this._applyTexture(n),this.currentHdrId=e}catch(n){console.error(`[Hdr] Failed to load HDR "${t.url}":`,n)}}setVisible(e){this.isVisible=e,e&&this.currentTexture&&!this.skybox?this._createSkybox(this.currentTexture):this.skybox&&(this.skybox.visible=e)}getCurrentHdrId(){return this.currentHdrId}getVisible(){return this.isVisible}setIntensity(e){this.currentIntensity=e,this.engine.scene&&(this.engine.scene.environmentIntensity=e),this.skybox&&this.skybox.material.color.setScalar(e)}getIntensity(){return this.currentIntensity}addHdrItem(e){const t=this.hdrList.find(n=>n.id===e.id);t?Object.assign(t,e):this.hdrList.push(e)}dispose(){this._clearHdr(),this.textureCache.forEach(e=>e.dispose()),this.textureCache.clear()}_loadHdr(e){return new Promise((t,n)=>{new Fw().load(e,i=>{i.mapping=$a,t(i)},void 0,i=>n(i))})}_applyTexture(e){if(this.currentTexture=e,!this.engine.scene)return;const t=new iu(this.engine.renderer),n=t.fromEquirectangular(e).texture;t.dispose(),this.engine.scene.environment=n,this.engine.scene.environmentIntensity=this.currentIntensity,this.engine.scene.background=null,this._removeSkybox(),this.isVisible&&this._createSkybox(e),this.engine.setting.setAmbientLightIntensity(0)}_createSkybox(e){const t=new Vh(500,64,32),n=new Ht({map:e,side:sn,depthWrite:!1,fog:!1});this.skybox=new rt(t,n),this.skybox.name="hdr_skybox",this.skybox.renderOrder=-1,this.skybox.frustumCulled=!1,n.color.setScalar(this.currentIntensity),this.engine.scene.add(this.skybox)}_removeSkybox(){this.skybox&&(this.engine.scene.remove(this.skybox),this.skybox.geometry.dispose(),this.skybox.material.dispose(),this.skybox=null)}_clearHdr(){this.currentTexture=null,this._removeSkybox(),this.engine.scene&&(this.engine.scene.background=null,this.engine.scene.environment=null,this.engine.setting.setAmbientLightIntensity(1))}}class dT{engine;currentId="0";groundGroup;groundMesh=null;waterMaterial=null;clock;groundY=0;groundList=[{id:"0",name:"无"},{id:"1",name:"草地",color:4881486,roughness:.9,metalness:0,map:"/textures/ground/grass.jpg"},{id:"2",name:"混凝土",color:9474192,roughness:.85,metalness:.1,map:"/textures/ground/concrete.jpg"},{id:"3",name:"地砖",color:13152400,roughness:.55,metalness:.1,map:"/textures/ground/tiles.jpg"},{id:"4",name:"湖面",water:!0,waterColor:28062,waveHeight:.04,waveSpeed:.8},{id:"5",name:"海面",water:!0,waterColor:15708,waveHeight:.12,waveSpeed:1.4}];constructor(e){this.engine=e,this.groundGroup=new ln,this.groundGroup.name="groundGroup",this.clock=new mf}init(){this.engine.scene.add(this.groundGroup)}setGround(e,t){if(this._dispose(),this.currentId=e,e==="0")return;const n=this.groundList.find(c=>c.id===e);if(!n)return;const i=t?.size??300,r=n.water?80:1,a=new Ss(i,i,r,r);a.rotateX(-Math.PI/2);let o;if(n.water)o=this._createWaterMaterial(n,t),this.waterMaterial=o;else{const c=new Ki({color:n.color,roughness:n.roughness,metalness:n.metalness}),h=t?.textureUrl??n.map;h&&new Gh().load(h,u=>{u.wrapS=u.wrapT=Tn,u.repeat.set(8,8),c.map=u,c.needsUpdate=!0},void 0,()=>{}),o=c}const l=new rt(a,o);l.name="groundMesh",l.receiveShadow=!0,l.castShadow=!1,l.position.y=-.01,this.groundMesh=l,this.groundGroup.add(l),this.groundGroup.position.y=this.groundY,this.clock.start()}setHeight(e){this.groundY=e,this.groundGroup.position.y=e}getHeight(){return this.groundY}_createWaterMaterial(e,t){const n=new Fe(e.waterColor),i=n.clone().multiplyScalar(.35),r=t?.sunDirection?t.sunDirection.clone().normalize():new P(.5,.8,.5).normalize();return new Lt({uniforms:{uTime:{value:0},uWaterColor:{value:n},uDeepColor:{value:i},uSunColor:{value:new Fe(16777215)},uSunDir:{value:r},uWaveHeight:{value:e.waveHeight??.05},uWaveSpeed:{value:e.waveSpeed??1},uOpacity:{value:t?.opacity??.82}},vertexShader:pT,fragmentShader:fT,transparent:!0,side:bt})}update(){if(!this.waterMaterial)return;this.waterMaterial.uniforms.uTime.value=this.clock.getElapsedTime();const e=this.engine.scene?.dirLight;if(e){const t=e.position.clone().normalize();this.waterMaterial.uniforms.uSunDir.value.copy(t)}}getGroundList(){return this.groundList.map(({id:e,name:t})=>({id:e,name:t}))}getCurrentId(){return this.currentId}show(){this.groundGroup.visible=!0}hide(){this.groundGroup.visible=!1}dispose(){this._dispose(),this.engine.scene.remove(this.groundGroup)}_dispose(){if(!this.groundMesh)return;this.groundMesh.geometry.dispose();const e=this.groundMesh.material;Array.isArray(e)?e.forEach(t=>t.dispose()):e.dispose(),this.groundGroup.remove(this.groundMesh),this.groundMesh=null,this.waterMaterial=null}}const pT=` + `)(n,t);return r&&typeof r.then=="function"?await r:r}catch(n){return console.error("[AI Manager] 代码执行失败:",n),"error"+n.message}}reset(){this.conversationHistory=[],this.steps=[],this.stepResults.clear(),this.state="idle",this.config?.debug&&console.log("[AI Manager] 对话已重置")}getState(){return this.state}getHistory(){return[...this.conversationHistory]}getSteps(){return[...this.steps]}getStepResults(){return new Map(this.stepResults)}}class sC{engine;points=[];isPlaying=!1;animationFrameId=null;playStartTime=0;playFromIndex=0;playToIndex=0;playOptions={};stayTimerId=null;playRangeToIndex=0;constructor(e){this.engine=e}init(){this.points=[],this.stop()}getCurrentPoint(){return{...this.engine.cameraModule.getCameraPose(),stayTime:0}}addPoint(e=0){const t=this.getCurrentPoint();return t.stayTime=e,this.points.push(t),this.points.length}addPoints(e){for(const t of e)this.points.push({...t});return this.points.length}savePoints(e){return this.addPoints(e)}removePoint(e){return e>=0&&e=0&&e=0&&e=this.points.length||e>=t?(console.warn("PathRoaming: 无效的索引范围"),!1):this.points.length<2?(console.warn("PathRoaming: 至少需要2个点位才能播放"),!1):(this.isPlaying&&this.stop(),this.isPlaying=!0,this.playOptions={duration:3e3,loop:!1,...n},this.engine.controlModule.disActive(),this.playFromIndex=e,this.playToIndex=e+1,this.playStartTime=performance.now(),this.playRangeToIndex=t,this.animate(),!0)}stop(){this.isPlaying=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.stayTimerId!==null&&(clearTimeout(this.stayTimerId),this.stayTimerId=null),this.engine.controlModule.active()}pause(){this.isPlaying&&(this.isPlaying=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.stayTimerId!==null&&(clearTimeout(this.stayTimerId),this.stayTimerId=null))}getIsPlaying(){return this.isPlaying}animate=()=>{if(!this.isPlaying)return;const e=performance.now()-this.playStartTime,t=this.playOptions.duration||3e3,n=Math.min(e/t,1),i=this.points[this.playFromIndex],r=this.points[this.playToIndex],a=this.interpolatePose(i,r,n);this.engine.cameraModule.restoreCameraPose(a),n>=1?this.onSegmentComplete():this.animationFrameId=requestAnimationFrame(this.animate)};onSegmentComplete(){const e=this.playToIndex;this.playOptions.onPointComplete&&this.playOptions.onPointComplete(e);const t=this.points[e];t.stayTime&&t.stayTime>0?this.stayTimerId=globalThis.setTimeout(()=>{this.stayTimerId=null,this.moveToNextSegment()},t.stayTime):this.moveToNextSegment()}moveToNextSegment(){const e=this.playToIndex>=this.playRangeToIndex,t=this.playToIndex>=this.points.length-1;e||t?this.playOptions.loop&&this.points.length>=2?(this.playFromIndex=0,this.playToIndex=1,this.playRangeToIndex=this.points.length-1,this.playStartTime=performance.now(),this.animate()):this.onPlayComplete():(this.playFromIndex=this.playToIndex,this.playToIndex=this.playToIndex+1,this.playStartTime=performance.now(),this.animate())}onPlayComplete(){this.stop(),this.playOptions.onComplete&&this.playOptions.onComplete()}interpolatePose(e,t,n){const i=this.easeInOutCubic(n),r={type:t.type,position:{x:zt.lerp(e.position.x,t.position.x,i),y:zt.lerp(e.position.y,t.position.y,i),z:zt.lerp(e.position.z,t.position.z,i)},rotation:{x:zt.lerp(e.rotation.x,t.rotation.x,i),y:zt.lerp(e.rotation.y,t.rotation.y,i),z:zt.lerp(e.rotation.z,t.rotation.z,i)},quaternion:{x:zt.lerp(e.quaternion.x,t.quaternion.x,i),y:zt.lerp(e.quaternion.y,t.quaternion.y,i),z:zt.lerp(e.quaternion.z,t.quaternion.z,i),w:zt.lerp(e.quaternion.w,t.quaternion.w,i)}};return e.target&&t.target?r.target={x:zt.lerp(e.target.x,t.target.x,i),y:zt.lerp(e.target.y,t.target.y,i),z:zt.lerp(e.target.z,t.target.z,i)}:t.target&&(r.target={...t.target}),e.zoom!==void 0&&t.zoom!==void 0&&(r.zoom=zt.lerp(e.zoom,t.zoom,i)),r}easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2}dispose(){this.stop(),this.points=[],this.playOptions={}}}class rC{engine;miniMapCamera=null;miniMapRenderer=null;miniMapContainer=null;overlayCanvas=null;overlayCtx=null;isVisible=!1;mapSize=200;currentHalfSize=500;minHalfSize=5;maxHalfSize=1e4;halfSizeInitialized=!1;camY=1e3;centerX=0;centerZ=0;dragMode=null;lastMouseX=0;lastMouseY=0;constructor(e){this.engine=e,this.init()}getstate(){return this.isVisible}init(){this.miniMapContainer=document.createElement("div"),this.miniMapContainer.style.position="absolute",this.miniMapContainer.style.bottom="20px",this.miniMapContainer.style.left="20px",this.miniMapContainer.style.width=`${this.mapSize}px`,this.miniMapContainer.style.height=`${this.mapSize}px`,this.miniMapContainer.style.border="2px solid rgba(255, 255, 255, 0.4)",this.miniMapContainer.style.borderRadius="4px",this.miniMapContainer.style.overflow="hidden",this.miniMapContainer.style.display="none",this.miniMapContainer.style.zIndex="200",this.miniMapContainer.style.pointerEvents="auto",this.miniMapContainer.style.cursor="crosshair",this.engine.container.appendChild(this.miniMapContainer),this.miniMapRenderer=new au({alpha:!0,antialias:!1}),this.miniMapRenderer.setSize(this.mapSize,this.mapSize),this.miniMapRenderer.setPixelRatio(window.devicePixelRatio),this.miniMapRenderer.setClearColor(1710638,.85),this.miniMapContainer.appendChild(this.miniMapRenderer.domElement);const e=window.devicePixelRatio||1;this.overlayCanvas=document.createElement("canvas"),this.overlayCanvas.width=this.mapSize*e,this.overlayCanvas.height=this.mapSize*e,this.overlayCanvas.style.position="absolute",this.overlayCanvas.style.top="0",this.overlayCanvas.style.left="0",this.overlayCanvas.style.width=`${this.mapSize}px`,this.overlayCanvas.style.height=`${this.mapSize}px`,this.overlayCanvas.style.pointerEvents="none",this.miniMapContainer.appendChild(this.overlayCanvas),this.overlayCtx=this.overlayCanvas.getContext("2d"),this.overlayCtx&&this.overlayCtx.scale(e,e),this.miniMapCamera=new Ai(-this.currentHalfSize,this.currentHalfSize,this.currentHalfSize,-this.currentHalfSize,.1,1e5),this.miniMapCamera.up.set(0,0,-1),this.setupEvents()}worldToPixel(e,t){const n=this.currentHalfSize;return{x:((e-this.centerX)/n*.5+.5)*this.mapSize,y:((t-this.centerZ)/n*.5+.5)*this.mapSize}}pixelToWorld(e,t){const n=this.currentHalfSize;return{x:(e/this.mapSize-.5)*2*n+this.centerX,z:(t/this.mapSize-.5)*2*n+this.centerZ}}setupEvents(){const e=this.miniMapContainer;e.addEventListener("wheel",this.onWheel,{passive:!1}),e.addEventListener("mousedown",this.onMouseDown),e.addEventListener("mousemove",this.onMouseMove),e.addEventListener("mouseup",this.onMouseUp),e.addEventListener("mouseleave",this.onMouseUp),e.addEventListener("contextmenu",t=>t.preventDefault()),["pointerdown","pointermove","pointerup","click","dblclick"].forEach(t=>e.addEventListener(t,n=>n.stopPropagation()))}onWheel=e=>{e.preventDefault(),e.stopPropagation();const t=e.deltaY>0?1.25:.8;this.currentHalfSize=Math.max(this.minHalfSize,Math.min(this.maxHalfSize,this.currentHalfSize*t))};onMouseDown=e=>{e.stopPropagation();const t=this.miniMapContainer.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top,r=this.engine.camera;if(!r)return;const{x:a,y:o}=this.worldToPixel(r.position.x,r.position.z);Math.hypot(n-a,i-o)<25?(this.dragMode="rotate",this.miniMapContainer.style.cursor="alias"):(this.dragMode=null,this.handleTeleport(n,i)),this.lastMouseX=n,this.lastMouseY=i};onMouseMove=e=>{if(e.stopPropagation(),this.dragMode!=="rotate")return;const t=this.miniMapContainer.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top;this.handleRotate(n,i),this.lastMouseX=n,this.lastMouseY=i};onMouseUp=e=>{e.stopPropagation(),this.dragMode=null,this.miniMapContainer&&(this.miniMapContainer.style.cursor="crosshair")};handleTeleport(e,t){const n=this.engine.camera,i=this.engine.controls;if(!n||!i)return;const{x:r,z:a}=this.pixelToWorld(e,t),o=r-n.position.x,l=a-n.position.z;n.position.x+=o,n.position.z+=l,i.target.x+=o,i.target.z+=l,i.update()}handleRotate(e,t){const n=this.engine.camera,i=this.engine.controls;if(!n||!i)return;const r=this.mapSize/2,a=this.mapSize/2,o=Math.atan2(this.lastMouseY-a,this.lastMouseX-r);let l=Math.atan2(t-a,e-r)-o;l>Math.PI&&(l-=2*Math.PI),l<-Math.PI&&(l+=2*Math.PI);const c=new P().copy(i.target).sub(n.position),h=new Kh().setFromVector3(c);h.theta-=l,c.setFromSpherical(h),i.target.copy(n.position).add(c),i.update()}drawOverlay(){const e=this.overlayCtx,t=this.engine.camera;if(!e||!t)return;e.clearRect(0,0,this.mapSize,this.mapSize);const n=this.mapSize/2,i=this.mapSize/2,r=new P;t.getWorldDirection(r);const a=Math.atan2(r.x,-r.z),o=36,l=Math.PI/10;e.save(),e.translate(n,i),e.rotate(a);const c=e.createRadialGradient(0,0,2,0,0,o);c.addColorStop(0,"rgba(0, 230, 130, 0.9)"),c.addColorStop(1,"rgba(0, 230, 130, 0)");const h=-Math.sin(l)*o,u=-Math.cos(l)*o,p=Math.sin(l)*o,d=-Math.cos(l)*o;e.beginPath(),e.moveTo(0,0),e.lineTo(h,u),e.lineTo(p,d),e.closePath(),e.fillStyle=c,e.fill(),e.fillStyle="rgba(255, 255, 255, 0.95)",e.strokeStyle="rgba(0, 200, 110, 0.9)",e.lineWidth=1.5,e.beginPath(),e.arc(0,0,4,0,Math.PI*2),e.fill(),e.stroke(),e.restore()}show(){this.isVisible=!0,this.miniMapContainer&&(this.miniMapContainer.style.display="block")}hide(){this.isVisible=!1,this.miniMapContainer&&(this.miniMapContainer.style.display="none")}toggle(){this.isVisible?this.hide():this.show()}update(){if(!this.isVisible||!this.miniMapCamera||!this.miniMapRenderer)return;const e=this.engine.camera;if(!(!e||!this.engine.scene)){if(this.engine.octreeBox){const t=this.engine.octreeBox.getBoundingBox();if(t?.min&&t?.max){const n=t.max.x-t.min.x,i=t.max.z-t.min.z,r=t.max.y-t.min.y;this.camY=t.max.y+Math.max(n,i,r),!this.halfSizeInitialized&&n+i>0&&(this.currentHalfSize=Math.max(n,i)*2,this.halfSizeInitialized=!0)}}this.centerX=e.position.x,this.centerZ=e.position.z,this.miniMapCamera.left=-this.currentHalfSize,this.miniMapCamera.right=this.currentHalfSize,this.miniMapCamera.top=this.currentHalfSize,this.miniMapCamera.bottom=-this.currentHalfSize,this.miniMapCamera.updateProjectionMatrix(),this.miniMapCamera.position.set(this.centerX,this.camY,this.centerZ),this.miniMapCamera.lookAt(this.centerX,this.camY-1,this.centerZ),this.miniMapRenderer.render(this.engine.scene,this.miniMapCamera),this.drawOverlay()}}dispose(){this.miniMapContainer&&(this.miniMapContainer.removeEventListener("wheel",this.onWheel),this.miniMapContainer.removeEventListener("mousedown",this.onMouseDown),this.miniMapContainer.removeEventListener("mousemove",this.onMouseMove),this.miniMapContainer.removeEventListener("mouseup",this.onMouseUp),this.miniMapContainer.removeEventListener("mouseleave",this.onMouseUp)),this.miniMapRenderer&&(this.miniMapRenderer.dispose(),this.miniMapRenderer=null),this.miniMapContainer&&(this.miniMapContainer.remove(),this.miniMapContainer=null),this.miniMapCamera=null,this.overlayCtx=null,this.overlayCanvas=null}}const aC=[{Id:"100001",Name:"1",Points:[{X:-2,Y:-5,Z:0},{X:-2,Y:5,Z:0}]},{Id:"100002",Name:"2",Points:[{X:2,Y:-5,Z:0},{X:2,Y:5,Z:0}]},{Id:"100003",Name:"A",Points:[{X:-5,Y:-2,Z:0},{X:5,Y:-2,Z:0}]},{Id:"100004",Name:"B",Points:[{X:-5,Y:2,Z:0},{X:5,Y:2,Z:0}]}];class oC{engine;rootGroup=null;isVisible=!1;axes=[];coordinateMapper=e=>new P(e.X,e.Z,-e.Y);constructor(e){this.engine=e,this._initRoot()}setData(e){this._clearAxes(),this.axes=e.map(t=>({data:t,group:null})),this.axes.forEach(t=>this._buildAxis(t))}setMockData(){this.setData(aC)}show(){this.isVisible=!0,this.rootGroup&&(this.rootGroup.visible=!0)}hide(){this.isVisible=!1,this.rootGroup&&(this.rootGroup.visible=!1)}toggle(){this.isVisible?this.hide():this.show()}update(){if(!this.isVisible||!this.rootGroup)return;const e=this.engine.camera,t=this.engine.renderer;if(!e||!t)return;let n=.5;if(e instanceof Ai){const i=e,r=(i.top-i.bottom)/i.zoom,a=t.domElement.clientHeight||1;n=30*r/a}this.rootGroup.traverse(i=>{i instanceof Eh&&i.scale.set(n,n,1)})}dispose(){this._clearAxes(),this.rootGroup&&(this.engine.scene&&this.engine.scene.remove(this.rootGroup),this.rootGroup=null)}_initRoot(){this.rootGroup=new ln,this.rootGroup.name="GridRoot",this.rootGroup.visible=!1,this.engine.scene&&this.engine.scene.add(this.rootGroup)}_clearAxes(){this.axes.forEach(e=>{e.group&&(this.rootGroup?.remove(e.group),e.group.traverse(t=>{const n=t;if("geometry"in n&&n.geometry&&n.geometry.dispose(),"material"in n&&n.material){const i=n.material;"map"in i&&i.map&&i.map.dispose(),i.dispose()}}),e.group=null)}),this.axes=[]}_buildAxis(e){if(!this.rootGroup)return;const t=this.coordinateMapper(e.data.Points[0]),n=this.coordinateMapper(e.data.Points[1]),i=e.data.Name,r=new ln;r.name=`GridAxis_${e.data.Id}`;const a=new dt().setFromPoints([t,n]),o=new Ms({color:1609983,depthTest:!1}),l=new $i(a,o);l.renderOrder=998,r.add(l),r.add(this._makeCircleSprite(i,t)),r.add(this._makeCircleSprite(i,n)),this.rootGroup.add(r),e.group=r}_makeCircleSprite(e,t){const n=document.createElement("canvas");n.width=128,n.height=128;const i=n.getContext("2d"),r=128/2,a=128/2,o=128/2-4;i.beginPath(),i.arc(r,a,o,0,Math.PI*2),i.fillStyle="white",i.fill(),i.strokeStyle="#1890ff",i.lineWidth=6,i.stroke(),i.fillStyle="#1890ff",i.font=`bold ${Math.round(128*.38)}px Arial`,i.textAlign="center",i.textBaseline="middle",i.fillText(e,r,a);const l=new t1(n),c=new Sp({map:l,depthTest:!1,transparent:!0}),h=new Eh(c);return h.position.copy(t),h.scale.set(.5,.5,1),h.renderOrder=999,h}}const lC=[{Id:"339",Name:"站台",Elevation:-.32808398950131235},{Id:"2787",Name:"站厅",Elevation:16.896325459317584},{Id:"236633",Name:"顶板",Elevation:36.745406824146976}];class cC{engine;isVisible=!1;levels=[];svgContainer=null;svgOverlay=null;worldToScreen=null;halfSize=500;COLOR="#1890ff";PLANE_OPACITY=.08;constructor(e){this.engine=e,this._initSvg()}_initSvg(){this.svgContainer=document.createElement("div"),this.svgContainer.style.position="absolute",this.svgContainer.style.top="0",this.svgContainer.style.left="0",this.svgContainer.style.width="100%",this.svgContainer.style.height="100%",this.svgContainer.style.pointerEvents="none",this.svgContainer.style.overflow="hidden",this.svgContainer.style.display="none",this.engine.container.appendChild(this.svgContainer),this.svgOverlay=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svgOverlay.style.position="absolute",this.svgOverlay.style.top="0",this.svgOverlay.style.left="0",this.svgOverlay.style.width="1920px",this.svgOverlay.style.height="1080px",this.svgOverlay.style.overflow="visible",this.svgContainer.appendChild(this.svgOverlay)}setData(e){this._clearAll(),this.levels=e.map(t=>({data:t,group:null,svgGroup:null})),this.levels.forEach(t=>this._buildThreeObject(t))}setMockData(){this.setData(lC)}show(){this.isVisible=!0,this.svgContainer&&(this.svgContainer.style.display="block"),this.levels.forEach(e=>{e.group&&(e.group.visible=!0)})}hide(){this.isVisible=!1,this.svgContainer&&(this.svgContainer.style.display="none"),this.levels.forEach(e=>{e.group&&(e.group.visible=!1)})}toggle(){this.isVisible?this.hide():this.show()}update(){!this.isVisible||!this.svgOverlay||!this.levels.length||!this.engine.camera||!this.engine.renderer||(this._initWorldToScreen(),this.levels.forEach(e=>this._updateSvgLabels(e)))}dispose(){this._clearAll(),this.svgContainer&&(this.svgContainer.remove(),this.svgContainer=null),this.svgOverlay=null,this.worldToScreen=null}_initWorldToScreen(){this.engine.camera&&this.engine.renderer&&this.engine.scene&&(this.worldToScreen=new Dn(this.engine.camera,this.engine.renderer,this.engine.scene))}_clearAll(){this.levels.forEach(e=>{e.group&&this.engine.scene&&(this.engine.scene.remove(e.group),e.group.traverse(t=>{t.geometry&&t.geometry.dispose(),t.material&&(Array.isArray(t.material)?t.material.forEach(n=>n.dispose()):t.material.dispose())}),e.group=null),e.svgGroup&&this.svgOverlay&&(e.svgGroup.remove(),e.svgGroup=null)}),this.levels=[]}_buildThreeObject(e){if(!this.engine.scene)return;const t=e.data.Elevation,n=this.halfSize,i=new ln,r=new Ss(n*2,n*2);r.rotateX(-Math.PI/2);const a=new Ht({color:this.COLOR,transparent:!0,opacity:this.PLANE_OPACITY,side:yt,depthWrite:!1}),o=new rt(r,a);o.position.y=t,i.add(o);const l=[new P(-n,t,-n),new P(n,t,-n),new P(n,t,n),new P(-n,t,n),new P(-n,t,-n)],c=new dt().setFromPoints(l),h=new Ms({color:this.COLOR,transparent:!0,opacity:.7});if(i.add(new $i(c,h)),i.visible=this.isVisible,this.engine.scene.add(i),e.group=i,this.svgOverlay){const u=document.createElementNS("http://www.w3.org/2000/svg","g");u.dataset.levelId=e.data.Id;for(let p=0;p<4;p++)u.appendChild(this._makeLabel(e.data.Name,e.data.Elevation));this.svgOverlay.appendChild(u),e.svgGroup=u}}_updateSvgLabels(e){if(!e.svgGroup||!this.worldToScreen)return;const t=this.halfSize,n=e.data.Elevation,i=[new P(-t,n,-t),new P(t,n,-t),new P(t,n,t),new P(-t,n,t)],r=Array.from(e.svgGroup.children);i.forEach((a,o)=>{const l=this.worldToScreen.worldToScreen(a);r[o].setAttribute("x",String(l.x)),r[o].setAttribute("y",String(l.y))})}_makeLabel(e,t){const n=document.createElementNS("http://www.w3.org/2000/svg","text");return n.textContent=`${e} ▲${t.toFixed(3)}m`,n.setAttribute("text-anchor","middle"),n.setAttribute("dominant-baseline","central"),n.setAttribute("fill",this.COLOR),n.setAttribute("font-size","12"),n.setAttribute("font-family","Arial, sans-serif"),n.setAttribute("font-weight","bold"),n.setAttribute("stroke","white"),n.setAttribute("stroke-width","2"),n.setAttribute("paint-order","stroke"),n.style.pointerEvents="none",n}}class hC{engine;constructor(e){}update(){}}class uC{engine;currentHdrId="0";isVisible=!0;currentIntensity=.2;currentTexture=null;skybox=null;textureCache=new Map;hdrList=[{id:"0",name:"无"},{id:"1",name:"纯净-多云",url:"assets/hdr/纯净-多云.hdr"},{id:"2",name:"纯净-落日",url:"assets/hdr/纯净-落日.hdr"},{id:"3",name:"纯净-少云",url:"assets/hdr/纯净-少云.hdr"},{id:"4",name:"纯净-无云",url:"assets/hdr/纯净-无云.hdr"},{id:"5",name:"纯净-夜晚",url:"assets/hdr/纯净-夜晚.hdr"},{id:"6",name:"纯净-阴天",url:"assets/hdr/纯净-阴天.hdr"},{id:"7",name:"纯净-中云",url:"assets/hdr/纯净-中云.hdr"}];constructor(e){this.engine=e}getHdrList(){return this.hdrList}async setHdr(e){const t=this.hdrList.find(n=>n.id===e);if(!t){console.warn(`[Hdr] HDR id "${e}" not found`);return}if(e==="0"||!t.url){this._clearHdr(),this.currentHdrId="0";return}if(this.textureCache.has(e)){this._applyTexture(this.textureCache.get(e)),this.currentHdrId=e;return}try{const n=await this._loadHdr(t.url);this.textureCache.set(e,n),this._applyTexture(n),this.currentHdrId=e}catch(n){console.error(`[Hdr] Failed to load HDR "${t.url}":`,n)}}setVisible(e){this.isVisible=e,e&&this.currentTexture&&!this.skybox?this._createSkybox(this.currentTexture):this.skybox&&(this.skybox.visible=e)}getCurrentHdrId(){return this.currentHdrId}getVisible(){return this.isVisible}setIntensity(e){this.currentIntensity=e,this.engine.scene&&(this.engine.scene.environmentIntensity=e),this.skybox&&this.skybox.material.color.setScalar(e)}getIntensity(){return this.currentIntensity}addHdrItem(e){const t=this.hdrList.find(n=>n.id===e.id);t?Object.assign(t,e):this.hdrList.push(e)}dispose(){this._clearHdr(),this.textureCache.forEach(e=>e.dispose()),this.textureCache.clear()}_loadHdr(e){return new Promise((t,n)=>{new Fw().load(e,i=>{i.mapping=$a,t(i)},void 0,i=>n(i))})}_applyTexture(e){if(this.currentTexture=e,!this.engine.scene)return;const t=new iu(this.engine.renderer),n=t.fromEquirectangular(e).texture;t.dispose(),this.engine.scene.environment=n,this.engine.scene.environmentIntensity=this.currentIntensity,this.engine.scene.background=null,this._removeSkybox(),this.isVisible&&this._createSkybox(e),this.engine.setting.setAmbientLightIntensity(0)}_createSkybox(e){const t=new Vh(500,64,32),n=new Ht({map:e,side:sn,depthWrite:!1,fog:!1});this.skybox=new rt(t,n),this.skybox.name="hdr_skybox",this.skybox.renderOrder=-1,this.skybox.frustumCulled=!1,n.color.setScalar(this.currentIntensity),this.engine.scene.add(this.skybox)}_removeSkybox(){this.skybox&&(this.engine.scene.remove(this.skybox),this.skybox.geometry.dispose(),this.skybox.material.dispose(),this.skybox=null)}_clearHdr(){this.currentTexture=null,this._removeSkybox(),this.engine.scene&&(this.engine.scene.background=null,this.engine.scene.environment=null,this.engine.setting.setAmbientLightIntensity(1))}}class dC{engine;currentId="0";groundGroup;groundMesh=null;waterMaterial=null;clock;groundY=0;groundList=[{id:"0",name:"无"},{id:"1",name:"草地",color:4881486,roughness:.9,metalness:0,map:"/textures/ground/grass.jpg"},{id:"2",name:"混凝土",color:9474192,roughness:.85,metalness:.1,map:"/textures/ground/concrete.jpg"},{id:"3",name:"地砖",color:13152400,roughness:.55,metalness:.1,map:"/textures/ground/tiles.jpg"},{id:"4",name:"湖面",water:!0,waterColor:28062,waveHeight:.04,waveSpeed:.8},{id:"5",name:"海面",water:!0,waterColor:15708,waveHeight:.12,waveSpeed:1.4}];constructor(e){this.engine=e,this.groundGroup=new ln,this.groundGroup.name="groundGroup",this.clock=new mf}init(){this.engine.scene.add(this.groundGroup)}setGround(e,t){if(this._dispose(),this.currentId=e,e==="0")return;const n=this.groundList.find(c=>c.id===e);if(!n)return;const i=t?.size??300,r=n.water?80:1,a=new Ss(i,i,r,r);a.rotateX(-Math.PI/2);let o;if(n.water)o=this._createWaterMaterial(n,t),this.waterMaterial=o;else{const c=new Ki({color:n.color,roughness:n.roughness,metalness:n.metalness}),h=t?.textureUrl??n.map;h&&new Gh().load(h,u=>{u.wrapS=u.wrapT=Cn,u.repeat.set(8,8),c.map=u,c.needsUpdate=!0},void 0,()=>{}),o=c}const l=new rt(a,o);l.name="groundMesh",l.receiveShadow=!0,l.castShadow=!1,l.position.y=-.01,this.groundMesh=l,this.groundGroup.add(l),this.groundGroup.position.y=this.groundY,this.clock.start()}setHeight(e){this.groundY=e,this.groundGroup.position.y=e}getHeight(){return this.groundY}_createWaterMaterial(e,t){const n=new Fe(e.waterColor),i=n.clone().multiplyScalar(.35),r=t?.sunDirection?t.sunDirection.clone().normalize():new P(.5,.8,.5).normalize();return new Lt({uniforms:{uTime:{value:0},uWaterColor:{value:n},uDeepColor:{value:i},uSunColor:{value:new Fe(16777215)},uSunDir:{value:r},uWaveHeight:{value:e.waveHeight??.05},uWaveSpeed:{value:e.waveSpeed??1},uOpacity:{value:t?.opacity??.82}},vertexShader:pC,fragmentShader:fC,transparent:!0,side:yt})}update(){if(!this.waterMaterial)return;this.waterMaterial.uniforms.uTime.value=this.clock.getElapsedTime();const e=this.engine.scene?.dirLight;if(e){const t=e.position.clone().normalize();this.waterMaterial.uniforms.uSunDir.value.copy(t)}}getGroundList(){return this.groundList.map(({id:e,name:t})=>({id:e,name:t}))}getCurrentId(){return this.currentId}show(){this.groundGroup.visible=!0}hide(){this.groundGroup.visible=!1}dispose(){this._dispose(),this.engine.scene.remove(this.groundGroup)}_dispose(){if(!this.groundMesh)return;this.groundMesh.geometry.dispose();const e=this.groundMesh.material;Array.isArray(e)?e.forEach(t=>t.dispose()):e.dispose(),this.groundGroup.remove(this.groundMesh),this.groundMesh=null,this.waterMaterial=null}}const pC=` uniform float uTime; uniform float uWaveHeight; uniform float uWaveSpeed; @@ -4998,7 +4998,7 @@ void main() { gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0); } -`,fT=` +`,fC=` uniform float uTime; uniform vec3 uWaterColor; uniform vec3 uDeepColor; @@ -5043,38 +5043,28 @@ void main() { gl_FragColor = vec4(color, uOpacity); } -`;class mT{options;DeviceType;animationId=null;isRenderingPaused=!1;controlsEnabledBeforePause=!0;animate;onWindowResize;_fpsFrameCount=0;_fpsLastCheck=0;_fpsLastSwitch=0;_lowFpsCount=0;_highFpsCount=0;_fpsCheckInterval=100;_fpsSwitchCooldown=100;_fpsThreshold=30;_fpsUpgradeThreshold=60;_lowFpsRequired=3;_highFpsRequired=.1;isMouseDown=!1;isWheeling=!1;scene;camera;renderer;sceneModule;cameraModule;deviceModule;renderModule;controlModule;composerModule;loaderModule;engineStatus;events;lightModule;interactionModule;modelToolModule;worldToScreen;handelBehaved;octreeBox;controls;stats;catchSvg;engineModelModule;viewCube;rangeScale;setting;measure;clipping;modelTree;engineInfo;modelProperties;modelMapperBatch;modelEdge;ai;pathRoaming;hoverHighLight;minMap;grid;level;text;hdr;ground;models=[];reactBoundingClientRect={left:0,top:0};version="2.0.4";versionEl=null;container;constructor(e){if(this.options=e,this.container=document.getElementById(e.containerId),!this.container)throw new Error(`Container ${e.containerId} not found`);this.engineModelModule=new Iw(this),this.engineModelModule.init(),this.ai=new iT(this),this.deviceModule=new T3(this),this.DeviceType=this.deviceModule.getDeviceType(),this.cameraModule=new E3(this),this.sceneModule=new S3(this),this.scene=this.sceneModule.scene,this.renderModule=new C3(this),this.renderer=this.renderModule.createRenderer(),this.camera=this.cameraModule.orthographicCamera,this.scene.camera=this.camera,this.controlModule=new V3(this),this.controlModule.switchDefaultMode(),this.controls=this.controlModule.orbitControls,this.composerModule=new t_(this),this.composerModule.init(),this.events=new Tw,this.engineStatus=new Ew(this),this.engineStatus.init(),this.loaderModule=new Sw(this),this.lightModule=new Cw(this),this.lightModule.init(),this.viewCube=new Ww(this),this.viewCube.init(),this.options.showViewCube==!1&&this.viewCube.hide(),this.octreeBox=Xw(this),this.rangeScale=new jw(this),this.rangeScale.init(),this.clipping=new $E(this),this.clipping.init(),this.setting=new qw(this),this.setting.init(),this.engineModelModule.init(),this.handelBehaved=cu(this),this.modelMapperBatch=new eT(this),this.measure=new nS(this),this.modelToolModule=new Pw(this),this.modelProperties=new QE(this),this.interactionModule=new Aw(this),this.interactionModule.init(),this.interactionModule.active(),this.hoverHighLight=new wl(this),this.modelEdge=new tT(this),this.modelTree=new KE(this),this.engineInfo=new JE(this),this.pathRoaming=new sT(this),this.pathRoaming.init(),this.minMap=new rT(this),this.grid=new oT(this),this.level=new cT(this),this.text=new hT(this),this.hdr=new uT(this),this.ground=new dT(this),this.ground.init(),this.worldToScreen=new Dn(this.camera,this.renderer,this.scene),this.options.showStats&&(this.stats=new Uw,this.stats.showPanel(0),this.stats.dom.style.position="absolute",this.stats.dom.style.top="0px",this.stats.dom.style.left="0px",this.stats.dom.style.zIndex="1000",this.container.appendChild(this.stats.dom));let t=document.createElement("div");t.className="versionText",this.versionEl=t,this.updateVersionDisplay(),this.container.appendChild(t);let n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.style.position="absolute",n.style.width="100%",n.style.height="100%",n.style.zIndex="1000",n.style.left="0px",n.style.top="0px",n.style.pointerEvents="none";const i=this.renderer?.domElement.width||1920,r=this.renderer?.domElement.height||1080;n.setAttribute("viewBox",`0 0 ${i} ${r}`),n.setAttribute("preserveAspectRatio","none"),this.container.appendChild(n),this.catchSvg=n,this.onWindowResize=()=>{this.handleWindowResize()},window.addEventListener("resize",this.onWindowResize);let a=this;this.controls.addEventListener("start",()=>{a.events.trigger(ts.EngineBusy)}),this.controls.addEventListener("end",()=>{a.events.trigger(ts.EngineFree)}),this.controls.addEventListener("change",()=>{}),this.animate=()=>{if(!this.isRenderingPaused)this.animationId=requestAnimationFrame(this.animate);else{this.animationId=null;return}this.stats&&this.stats.begin(),this.composerModule&&this.composerModule.composer.render(),this.viewCube&&this.viewCube.cubeTool.RenderScene(),this.measure.update(),this.ground.update(),this.hoverHighLight.update(),this.controlModule.update(),this.minMap.update(),this.grid.update(),this.level.update(),this.text&&this.text.update(),this.stats&&this.stats.end(),this._fpsFrameCount++;const o=performance.now();if(o-this._fpsLastCheck>=this._fpsCheckInterval){const l=o-this._fpsLastCheck,c=this._fpsFrameCount/l*1e3;this._fpsFrameCount=0,this._fpsLastCheck=o,c=this._lowFpsRequired&&o-this._fpsLastSwitch>this._fpsSwitchCooldown&&(this._adaptiveRenderingDowngrade(),this._fpsLastSwitch=o,this._lowFpsCount=0)):c>this._fpsUpgradeThreshold?(this._highFpsCount++,this._lowFpsCount=0,this._highFpsCount>=this._highFpsRequired&&o-this._fpsLastSwitch>this._fpsSwitchCooldown&&(this._adaptiveRenderingUpgrade(),this._fpsLastSwitch=o,this._highFpsCount=0)):(this._lowFpsCount=0,this._highFpsCount=0)}if(this.scene){let l=this.scene?.dirLight;l&&this.camera&&this.updateLightPosition(this.camera,l)}},this.animate()}updateVersionDisplay(){if(!this.versionEl)return;const e={simple:"simple",balance:"balance",advanced:"advanced"},t=this.engineModelModule?.getCurrentMode()??"",n=e[t]??t;this.versionEl.innerHTML=`v${this.version} | ${n}`}updateLightPosition(e,t){const n=new P;e.getWorldDirection(n);const i=100,r=new P().copy(n).multiplyScalar(-i),a=new P(0,1,0),o=new P().crossVectors(n,a).normalize();r.addScaledVector(a,i*.5),r.addScaledVector(o,i*.3),t.position.copy(e.position).add(r);const l=new P().copy(e.position).add(n.multiplyScalar(20));t.target.position.copy(l),t.target.updateMatrixWorld()}_adaptiveRenderingDowngrade(){const e=["simple","balance","advanced"],t=this.engineModelModule.getCurrentMode(),n=e.indexOf(t);if(n>0){const i=e[n-1];console.log(`[AdaptiveRendering] FPS低于${this._fpsThreshold},自动降级: ${t} → ${i}`),this.engineModelModule.autoSwitch(i)}}_adaptiveRenderingUpgrade(){const e=["simple","balance","advanced"],t=this.engineModelModule.getCurrentMode(),n=e.indexOf(t);if(n{e.dispose&&e.dispose()}),this.composerModule.composer.renderTarget1&&this.composerModule.composer.renderTarget1.dispose(),this.composerModule.composer.renderTarget2&&this.composerModule.composer.renderTarget2.dispose())}catch(e){console.warn("[BimEngine] Error disposing composer:",e)}try{this.renderModule&&this.renderModule.disposeRenderer(),this.renderer&&(this.renderer.domElement&&this.renderer.domElement.parentElement&&this.renderer.domElement.parentElement.removeChild(this.renderer.domElement),this.renderer.dispose(),this.renderer.forceContextLoss())}catch(e){console.warn("[BimEngine] Error disposing renderer:",e)}try{this.stats&&this.stats.dom&&this.stats.dom.parentElement&&this.stats.dom.parentElement.removeChild(this.stats.dom),this.catchSvg&&this.catchSvg.parentElement&&this.catchSvg.parentElement.removeChild(this.catchSvg)}catch(e){console.warn("[BimEngine] Error disposing DOM elements:",e)}try{this.events&&this.events.listeners&&this.events.listeners.clear()}catch(e){console.warn("[BimEngine] Error clearing event listeners:",e)}this.scene=null,this.camera=null,this.renderer=null,this.controls=null,this.models=[],this.container=null,console.log("[BimEngine] Engine disposal completed")}clearScene(e){e&&([...e.children].forEach(t=>{this.clearScene(t)}),e.parent&&e.parent.remove(e),e instanceof rt&&(e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(t=>this.disposeMaterial(t)):this.disposeMaterial(e.material))),e instanceof $i&&(e.geometry&&e.geometry.dispose(),e.material&&this.disposeMaterial(e.material)),e instanceof Wp&&(e.geometry&&e.geometry.dispose(),e.material&&this.disposeMaterial(e.material)),e instanceof Ut&&(e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(t=>this.disposeMaterial(t)):this.disposeMaterial(e.material)),e.instanceMatrix&&(e.instanceMatrix=null),e.instanceColor&&(e.instanceColor=null)),e instanceof Eh&&e.material&&this.disposeMaterial(e.material))}disposeMaterial(e){e&&(["map","lightMap","bumpMap","normalMap","specularMap","envMap","alphaMap","aoMap","displacementMap","emissiveMap","gradientMap","metalnessMap","roughnessMap","clearcoatMap","clearcoatNormalMap","clearcoatRoughnessMap","transmissionMap","thicknessMap","sheenColorMap","sheenRoughnessMap","specularIntensityMap","specularColorMap","iridescenceMap","iridescenceThicknessMap"].forEach(t=>{const n=e[t];n&&n instanceof Ft&&n.dispose()}),e.dispose())}}function gT(s){return new mT(s)}class hs{engine=null;registry;container;containerId;options;_isInitialized=!1;_isDestroyed=!1;unsubscribeTheme=null;currentMeasureType=null;isMeasureActive=!1;currentSectionMode=null;selectedComponent=null;constructor(e,t){this.registry=t,this.container=e.container,this.container.id?this.containerId=this.container.id:(this.containerId=`engine-container-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,this.container.id=this.containerId),this.options={backgroundColor:"linear-gradient(to bottom, rgb(214, 224, 235), rgb(246, 250, 255))",version:e.version??"v2",showStats:e.showStats??!1,showViewCube:e.showViewCube??!0}}init(){if(this._isInitialized){console.warn("[Engine] Engine already initialized.");return}if(this._isDestroyed){console.error("[Engine] Cannot initialize destroyed engine.");return}try{typeof this.options.backgroundColor=="string"&&(this.container.style.background=this.options.backgroundColor);const e={containerId:this.containerId,backgroundColor:this.options.backgroundColor,version:this.options.version,showStats:this.options.showStats,showViewCube:this.options.showViewCube};if(console.log("引擎配置信息:",e),this.engine=gT(e),!this.engine)throw new Error("Failed to create engine instance");this._isInitialized=!0,this.unsubscribeTheme=ot.subscribe(t=>{this.setTheme(t)}),this.setTheme(ot.getTheme()),this.engine.events.on("click",t=>{const n=this.registry;t&&t.object?(this.selectedComponent={url:t.object.url,id:t.object.name},console.log("[Engine] 构件选中:",this.selectedComponent),n.emit("component:selected",this.selectedComponent)):(this.selectedComponent=null,console.log("[Engine] 取消选中"),n.emit("component:deselected",{}))})}catch(e){throw console.error("[Engine] Failed to initialize engine:",e),this._isInitialized=!1,e}}setTheme(e){}setLocales(){}isInitialized(){return this._isInitialized}loadModel(e,t){if(!this._isInitialized||!this.engine){console.error("[Engine] Engine not initialized. Please call init() first.");return}if(!e||e.length===0){console.error("[Engine] Model URLs are required.");return}this.engine.loaderModule.loadModels(e,t)}CameraGoHome(){this.engine.viewCube.CameraGoHome()}getEngine(){return this.engine}pauseRendering(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.pauseRendering()}resumeRendering(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.resumeRendering()}dispose(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.dispose()}resize(){!this._isInitialized||this.engine}activateMeasure(e){if(!this._isInitialized||!this.engine?.measure){console.error("[Engine] Cannot activate measure: engine not initialized.");return}if(this.currentMeasureType===e){console.log(`[Engine] Measure ${e} already active, skipping.`);return}this.isMeasureActive||(console.log("[Engine] Activating measure module"),this.engine.measure.active(),this.isMeasureActive=!0),console.log(`[Engine] Activating measure: ${e}`);const t=this.engine.measure;switch(e){case"clearHeight":t.clearHeightMeasure.active();break;case"clearDistance":t.clearDistanceMeasure.active();break;case"distance":t.distanceMeasure.active();break;case"elevation":t.elevationMeasure.active();break;case"point":t.pointMeasure.active();break;case"angle":t.angleMeasure.active();break;case"area":t.areaMeasure.active();break;case"slope":t.slopeMeasure.active();break;default:console.error(`[Engine] Unknown measure type: ${e}`);return}this.currentMeasureType=e}getCurrentMeasureType(){return this.currentMeasureType}deactivateMeasure(){!this._isInitialized||!this.engine?.measure||(console.log("[Engine] Deactivating measure"),this.engine.measure.disActive(),this.engine.measure.clearAll(),this.isMeasureActive=!1,this.currentMeasureType=null)}clearAllMeasures(){!this._isInitialized||!this.engine?.measure||(console.log("[Engine] Clearing all measures"),this.engine.measure.clearAll())}saveMeasureSetting(e){!this._isInitialized||!this.engine?.measure||this.engine.measure.saveSetting?.(e)}setClearHeightDirection(e){!this._isInitialized||!this.engine?.measure||(console.log(`[Engine] Setting clearHeight direction: ${e}`),this.engine.measure.clearHeightMeasure.setDirection(e))}setClearHeightSelectType(e){!this._isInitialized||!this.engine?.measure||(console.log(`[Engine] Setting clearHeight selectType: ${e}`),this.engine.measure.clearHeightMeasure.setSelectType(e))}activeSection(e){if(!this._isInitialized||!this.engine?.clipping){console.error("[Engine] Cannot activate section: engine not initialized.");return}if(this.currentSectionMode===e){console.log(`[Engine] Section ${e} already active, skipping.`);return}console.log(`[Engine] Activating section: ${e}`),this.engine.clipping.active(e),this.currentSectionMode=e}getCurrentSectionMode(){return this.currentSectionMode}setSectionBoxRange(e){if(!this._isInitialized||!this.engine?.clipping){console.error("[Engine] Cannot set section box range: engine not initialized.");return}this.engine.clipping.updateClippingValue(e)}deactivateSection(){!this._isInitialized||!this.engine?.clipping||(console.log("[Engine] Deactivating all sections"),this.engine.clipping.disActive(),this.currentSectionMode=null)}hideSection(){if(!this._isInitialized||!this.engine?.clipping){console.error("[Engine] Cannot hide section: engine not initialized.");return}console.log("[Engine] Hiding section"),this.engine.clipping.disabled()}recoverSection(){if(!this._isInitialized||!this.engine?.clipping){console.error("[Engine] Cannot recover section: engine not initialized.");return}console.log("[Engine] Recovering section"),this.engine.clipping.recover()}fitSectionBoxToModel(){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot fit section box: engine not initialized.");return}const e=this.engine.engineStatus?.highlightModels;e&&(console.log("[Engine] Fitting section box to model"),this.engine.clipping?.clippingModel(e))}scaleSectionBox(){if(!this._isInitialized||!this.engine?.clipping){console.error("[Engine] Cannot scale section box: engine not initialized.");return}this.engine.clipping.scaleBox()}reverseSection(){if(!this._isInitialized||!this.engine?.clipping){console.error("[Engine] Cannot reverse section: engine not initialized.");return}this.engine.clipping.reverse()}getRenderMode(){return!this._isInitialized||!this.engine?.engineModelModule?"balance":this.engine.engineModelModule.getCurrentMode()}setRenderMode(e){if(!this._isInitialized||!this.engine?.engineModelModule){console.warn("[Engine] Cannot set render mode: engine not initialized.");return}try{this.engine.engineModelModule.setMode(e)}catch(t){console.warn("[Engine] Failed to set render mode:",t)}}isWalkModeActive=!1;activateFirstPersonMode(){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot activate first person mode: engine not initialized.");return}if(!this.engine.controlModule){console.error("[Engine] Control module not available.");return}if(this.isWalkModeActive){console.log("[Engine] First person mode already active, skipping.");return}console.log("[Engine] Activating first person mode"),this.engine.controlModule.switchFirstPersonMode(),this.loadWalkSettings(),this.isWalkModeActive=!0}deactivateFirstPersonMode(){!this._isInitialized||!this.engine?.controlModule||this.isWalkModeActive&&(console.log("[Engine] Deactivating first person mode"),this.engine.controlModule.switchDefaultMode(),this.isWalkModeActive=!1)}static WALK_SPEED_KEY="bim-walk-speed";static WALK_GRAVITY_KEY="bim-walk-gravity";static WALK_COLLISION_KEY="bim-walk-collision";setWalkSpeed(e){if(!this._isInitialized||!this.engine?.controlModule){console.error("[Engine] Cannot set walk speed: engine not initialized.");return}localStorage.setItem(hs.WALK_SPEED_KEY,String(e)),this.engine.controlModule.setMoveSpeed(e)}setWalkGravity(e){if(!this._isInitialized||!this.engine?.controlModule){console.error("[Engine] Cannot set walk gravity: engine not initialized.");return}localStorage.setItem(hs.WALK_GRAVITY_KEY,String(e)),this.engine.controlModule.setApplyGravity(e)}setWalkCollision(e){if(!this._isInitialized||!this.engine?.controlModule){console.error("[Engine] Cannot set walk collision: engine not initialized.");return}localStorage.setItem(hs.WALK_COLLISION_KEY,String(e)),this.engine.controlModule.setApplyCollision(e)}loadWalkSettings(){if(!this.engine?.controlModule)return;const e=localStorage.getItem(hs.WALK_SPEED_KEY),t=localStorage.getItem(hs.WALK_GRAVITY_KEY),n=localStorage.getItem(hs.WALK_COLLISION_KEY);this.engine.controlModule.setMoveSpeed(e?Number(e):1),this.engine.controlModule.setApplyGravity(t==="true"),this.engine.controlModule.setApplyCollision(n==="true")}toggleMiniMap(){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot toggle mini map: engine not initialized.");return}this.engine.minMap?.toggle()}getMiniMapState(){return!this._isInitialized||!this.engine?!1:this.engine.minMap?.getState()??!1}isFirstPersonModeActive(){return this.isWalkModeActive}getSelectedComponent(){return this.selectedComponent}getComponentProperties(e,t,n){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot get component properties: engine not initialized.");return}if(!this.engine.modelProperties){console.error("[Engine] modelProperties not available");return}console.log("[Engine] Getting component properties:",{url:e,id:t}),this.engine.modelProperties.getModelProperties(e,t,n)}getTypeTreeData(){return!this._isInitialized||!this.engine?.modelTree?[]:this.engine.modelTree.getTypeTreeData()}getLevelTreeData(){return!this._isInitialized||!this.engine?.modelTree?[]:this.engine.modelTree.getLevelTreeData()}getMajorTreeData(){return!this._isInitialized||!this.engine?.modelTree?[]:this.engine.modelTree.getMajorTreeData()}activateZoomBox(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.rangeScale?.active()}getEngineInfo(){return!this._isInitialized||!this.engine?(console.warn("[Engine] Engine not initialized."),null):this.engine.engineInfo.getEngineInfo()}pathRoamingAddPoint(){if(!this._isInitialized||!this.engine?.pathRoaming){console.warn("[Engine] pathRoaming not available");return}this.engine.pathRoaming.addPoint(0)}pathRoamingRemovePoint(e){if(!this._isInitialized||!this.engine?.pathRoaming){console.warn("[Engine] pathRoaming not available");return}this.engine.pathRoaming.removePoint(e)}pathRoamingClearPoints(){if(!this._isInitialized||!this.engine?.pathRoaming){console.warn("[Engine] pathRoaming not available");return}this.engine.pathRoaming.clearPoints()}pathRoamingGetPoints(){return!this._isInitialized||!this.engine?.pathRoaming?(console.warn("[Engine] pathRoaming not available"),[]):this.engine.pathRoaming.getPoints()??[]}pathRoamingJumpToPoint(e){if(!this._isInitialized||!this.engine?.pathRoaming){console.warn("[Engine] pathRoaming not available");return}this.engine.pathRoaming.jumpToPoint(e)}pathRoamingPlay(e){if(!this._isInitialized||!this.engine?.pathRoaming){console.warn("[Engine] pathRoaming not available");return}this.engine.pathRoaming.play(e)}pathRoamingStop(){if(!this._isInitialized||!this.engine?.pathRoaming){console.warn("[Engine] pathRoaming not available");return}this.engine.pathRoaming.stop()}getHighlightModels(){return!this._isInitialized||!this.engine?null:this.engine.engineStatus?.highlightModels??null}highlightModel(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot highlight model: engine not initialized.");return}const t=this.sanitizeModelParams(e);if(t.length)try{this.engine.modelToolModule.highlightModel(t)}catch(n){console.warn("[Engine] highlightModel failed:",n)}}unhighlightAllModels(){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot unhighlight models: engine not initialized.");return}this.engine.modelToolModule.unhighlightAllModels()}viewScaleToModel(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot view scale to model: engine not initialized.");return}const t=this.sanitizeModelParams(e);if(t.length)try{this.engine.modelToolModule.viewScaleToModel(t)}catch(n){console.warn("[Engine] viewScaleToModel failed:",n)}}hideModels(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot hide models: engine not initialized.");return}const t=this.sanitizeModelParams(e);if(t.length)try{this.engine.modelToolModule.hideModel(t)}catch(n){console.warn("[Engine] hideModels failed:",n)}}showModel(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot show model: engine not initialized.");return}const t=this.sanitizeModelParams(e);if(t.length)try{this.engine.modelToolModule.showModel(t)}catch(n){console.warn("[Engine] showModel failed:",n)}}sanitizeModelParams(e){if(!Array.isArray(e))return[];const t=a=>a.replace(/\/+$/,""),n=Array.isArray(this.engine?.models)?this.engine.models:[],i=new Map;for(const a of n)a?.url&&i.set(t(a.url),a);const r=[];for(const a of e){if(!a||typeof a.url!="string"||!a.url||!Array.isArray(a.ids))continue;const o=i.get(t(a.url));if(!o||!(o.nodesMap instanceof Map))continue;const l=new Set;for(const h of a.ids){if(!Number.isFinite(h))continue;const u=Number(h);if(!Number.isInteger(u))continue;const p=o.nodesMap.get(u);!p||!Array.isArray(p.indexes)||p.indexes.length===0||l.add(u)}const c=Array.from(l);c.length&&r.push({url:a.url,ids:c})}return r}translucentModels(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot translucent models: engine not initialized.");return}e&&this.engine.modelToolModule.translucentModel(e)}unTranslucentModel(){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot cancel translucent: engine not initialized.");return}this.engine.modelToolModule.unTranslucentModel()}isolateModels(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot isolate models: engine not initialized.");return}e&&this.engine.modelToolModule.isolateModel(e)}translucentOtherModels(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot translucent other models: engine not initialized.");return}e&&this.engine.modelToolModule.translucentOtherModel(e)}showAllModels(){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot show all models: engine not initialized.");return}this.deactivateSection(),this.engine.modelToolModule.showAllModels()}batchSelectSameTypeModel(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot batch select: engine not initialized.");return}e&&this.engine.modelToolModule.batchSelectSameTypeModel(e)}batchSelectSameLevelModel(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot batch select: engine not initialized.");return}e&&this.engine.modelToolModule.batchSelectSameLevelModel(e)}batchSelectSameLevelTypeModel(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot batch select: engine not initialized.");return}e&&this.engine.modelToolModule.batchSelectSameLevelTypeModel(e)}destroy(){this._isDestroyed||(this.deactivateMeasure(),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.engine&&(this.engine.dispose(),this.engine=null),this.container.innerHTML="",this.currentMeasureType=null,this.isMeasureActive=!1,this._isDestroyed=!0,this._isInitialized=!1)}}class xT{element;content=null;isVisible=!1;onCloseCallback;options;mouseDownTime=0;mouseDownX=0;mouseDownY=0;CLICK_THRESHOLD=200;MOVE_THRESHOLD=5;constructor(e){this.options=e,this.element=document.createElement("div"),this.element.className=`bim-right-key ${e?.className||""}`,e?.zIndex&&(this.element.style.zIndex=e.zIndex.toString()),document.body.appendChild(this.element)}init(){document.addEventListener("mousedown",this.handleGlobalClick),this.element.addEventListener("contextmenu",e=>{e.preventDefault(),e.stopPropagation()}),this.options?.container&&(this.options.container.addEventListener("mousedown",this.handleContainerMouseDown),this.options.container.addEventListener("mouseup",this.handleContainerMouseUp),this.options.container.addEventListener("contextmenu",this.handleContainerContextMenu))}setTheme(e){}setLocales(){}destroy(){document.removeEventListener("mousedown",this.handleGlobalClick),this.options?.container&&(this.options.container.removeEventListener("mousedown",this.handleContainerMouseDown),this.options.container.removeEventListener("mouseup",this.handleContainerMouseUp),this.options.container.removeEventListener("contextmenu",this.handleContainerContextMenu)),this.unmountContent(),this.element.remove()}handleContainerMouseDown=e=>{e.button===2&&(this.mouseDownTime=Date.now(),this.mouseDownX=e.clientX,this.mouseDownY=e.clientY)};handleContainerMouseUp=e=>{if(e.button!==2||Date.now()-this.mouseDownTime>this.CLICK_THRESHOLD)return;const n=e.clientX-this.mouseDownX,i=e.clientY-this.mouseDownY;n*n+i*i>this.MOVE_THRESHOLD*this.MOVE_THRESHOLD||this.options?.onContext&&this.options.onContext(e)};handleContainerContextMenu=e=>{e.preventDefault()};setOnClose(e){this.onCloseCallback=e}mount(e){this.unmountContent(),this.content=e,this.element.appendChild(e.getElement())}unmountContent(){this.content&&(this.content.destroy(),this.element.innerHTML="",this.content=null)}show(e,t){this.element.classList.add("visible"),this.isVisible=!0,this.element.style.left=`${e}px`,this.element.style.top=`${t}px`;const n=this.element.getBoundingClientRect(),i=window.innerWidth,r=window.innerHeight;let a=e,o=t;e+n.width>i&&(a=e-n.width),t+n.height>r&&(o=t-n.height),this.element.style.left=`${a}px`,this.element.style.top=`${o}px`}hide(){this.element.classList.remove("visible"),this.isVisible=!1,this.unmountContent(),this.onCloseCallback&&this.onCloseCallback()}handleGlobalClick=e=>{this.isVisible&&(this.element.contains(e.target)||this.hide())}}class gd{element;options;unsubscribeLocale=null;unsubscribeTheme=null;activeSubMenu=null;constructor(e){this.options=e,this.element=document.createElement("ul"),this.element.className="bim-menu"}init(){this.render(),this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)})}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-divider",e.divider),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-shadow-lg",e.shadowLg)}setLocales(){this.element.innerHTML="",this.render()}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.closeSubMenu(),this.element.remove()}getElement(){return this.element}hasAnyIcon(e){return e.some(t=>t.icon?!0:t.children?this.hasAnyIcon(t.children):!1)}render(){const{items:e,groupOrder:t}=this.options;this.hasAnyIcon(e)?this.element.classList.add("has-icons"):this.element.classList.remove("has-icons");const n=new Map,i="default";e.forEach(a=>{const o=a.group||i;n.has(o)||n.set(o,[]),n.get(o).push(a)});let r=[];if(t){r=t.filter(a=>n.has(a));for(const a of n.keys())r.includes(a)||r.push(a)}else r=Array.from(n.keys());r.forEach((a,o)=>{if(o>0){const c=document.createElement("li");c.className="bim-menu-divider",this.element.appendChild(c)}const l=n.get(a);l.sort((c,h)=>(c.order||0)-(h.order||0)),l.forEach(c=>{if(c.visible!==!1&&(this.element.appendChild(this.createItemElement(c)),c.divider)){const h=document.createElement("li");h.className="bim-menu-divider",this.element.appendChild(h)}})})}createItemElement(e){const t=document.createElement("li"),n=!e.disabled;t.className=`bim-menu-item ${n?"":"disabled"}`;const i=document.createElement("div");i.className="bim-menu-item-icon",e.icon&&(i.innerHTML=e.icon),t.appendChild(i);const r=document.createElement("div");r.className="bim-menu-item-label",r.textContent=xe(e.label),t.appendChild(r);const a=e.children,o=a&&a.length>0;if(o){const l=document.createElement("div");l.className="bim-menu-item-arrow",l.innerHTML='',t.appendChild(l),t.addEventListener("mouseenter",()=>this.openSubMenu(e,t))}else t.addEventListener("mouseenter",()=>this.closeSubMenu());return n&&t.addEventListener("click",l=>{l.stopPropagation(),console.log(`[BimMenu] Clicked item: ${e.id}`),o||(e.onClick?(console.log(`[BimMenu] Executing onClick for ${e.id}`),e.onClick()):console.warn(`[BimMenu] No onClick handler for ${e.id}`))}),t}openSubMenu(e,t){const n=e.children;if(!n||n.length===0)return;this.closeSubMenu();const i=document.createElement("div");i.style.position="fixed",i.style.zIndex="10001";const r=t.getBoundingClientRect();i.style.top=`${r.top}px`,i.style.left=`${r.right}px`,i.addEventListener("mousedown",l=>l.stopPropagation());const a=new gd({items:n});a.init(),i.appendChild(a.element),document.body.appendChild(i),this.activeSubMenu={menu:a,container:i};const o=i.getBoundingClientRect();o.right>window.innerWidth&&(i.style.left=`${r.left-o.width}px`)}closeSubMenu(){this.activeSubMenu&&(this.activeSubMenu.menu.destroy(),this.activeSubMenu.container.remove(),this.activeSubMenu=null)}}class Q0 extends xi{container;rightKeyPanel;contextHandlers=[];constructor(e,t){super(t),this.container=e,this.rightKeyPanel=new xT({zIndex:9e3,container:this.container,onContext:this.handleContextMenu}),this.rightKeyPanel.init()}destroy(){this.rightKeyPanel.destroy(),super.destroy()}registerHandler(e){this.contextHandlers.push(e)}showMenu(e,t,n,i){if(!n||n.length===0)return;const r=new gd({items:n,groupOrder:i});r.init(),this.rightKeyPanel.mount(r),this.rightKeyPanel.show(e,t)}hide(){this.rightKeyPanel.hide()}handleContextMenu=e=>{let t=null;for(const n of this.contextHandlers){const i=n(e);i&&i.length>0&&(t||(t=[]),t=t.concat(i))}t&&t.length>0?this.showMenu(e.clientX,e.clientY,t):this.hide()}}class vT extends xi{container;engineInstance=null;rightKey=null;constructor(e,t){super(t),this.container=e}initialize(e){this.engineInstance&&this.engineInstance.isInitialized()&&(console.warn("[EngineManager] 3D Engine already initialized. Destroying old instance..."),this.engineInstance.destroy(),this.engineInstance=null);try{return this.engineInstance=new hs({container:this.container,...e},this.registry),this.engineInstance.init(),this.rightKey=new Q0(this.container,this.registry),this.rightKey.registerHandler(t=>{const n=this.getSelectedComponent(),i=[];return n&&(i.push({id:"componentDetail",label:"menu.componentDetail",group:"component",order:1,divider:!0,onClick:()=>{this.registry.componentDetail?.show(),this.rightKey?.hide()}}),i.push({id:"hideSelected",label:"menu.hideSelected",group:"component",order:2,onClick:()=>{const r=this.getHighlightModels();r&&this.hideModels(r),this.rightKey?.hide()}}),i.push({id:"transparentSelected",label:"menu.transparentSelected",group:"component",order:3,onClick:()=>{const r=this.getHighlightModels();r&&this.translucentModels(r),this.rightKey?.hide()}}),i.push({id:"cancelTranslucent",label:"menu.cancelTranslucent",group:"component",order:4,onClick:()=>{this.unTranslucentModel(),this.rightKey?.hide()}}),i.push({id:"isolateSelected",label:"menu.isolateSelected",group:"component",order:5,divider:!0,children:[{id:"hideOthers",label:"menu.hideOthers",onClick:()=>{const r=this.getHighlightModels();r&&this.isolateModels(r),this.rightKey?.hide()}},{id:"transparentOthers",label:"menu.transparentOthers",onClick:()=>{const r=this.getHighlightModels();r&&this.translucentOtherModels(r),this.rightKey?.hide()}}]}),i.push({id:"quickSelect",label:"menu.quickSelect",group:"component",order:6,children:[{id:"selectSameType",label:"menu.selectSameType",onClick:()=>{const r=this.getHighlightModels();r&&this.batchSelectSameTypeModel(r),this.rightKey?.hide()}},{id:"selectSameLevel",label:"menu.selectSameLevel",onClick:()=>{const r=this.getHighlightModels();r&&this.batchSelectSameLevelModel(r),this.rightKey?.hide()}},{id:"selectSameLevelType",label:"menu.selectSameLevelType",onClick:()=>{const r=this.getHighlightModels();r&&this.batchSelectSameLevelTypeModel(r),this.rightKey?.hide()}}]}),i.push({id:"fitSectionBox",label:"menu.fitSectionBox",group:"component",order:7,onClick:()=>{this.fitSectionBoxToModel(),this.rightKey?.hide()}})),i.push({id:"showAll",label:"menu.showAll",group:"component",order:8,onClick:()=>{this.showAllModels(),this.emit("menu:show-all",{}),this.rightKey?.hide()}}),i}),this.engineInstance.isInitialized()}catch(t){return console.error("[EngineManager] Failed to initialize 3D engine:",t),this.engineInstance=null,!1}}isInitialized(){return this.engineInstance!==null&&this.engineInstance.isInitialized()}loadModel(e,t){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.loadModel(e,t)}getEngine(){return this.engineInstance?this.engineInstance.getEngine():(console.warn("[EngineManager] 3D Engine not initialized."),null)}CameraGoHome(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.CameraGoHome()}pauseRendering(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.pauseRendering()}resumeRendering(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.resumeRendering()}activateMeasure(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activateMeasure(e)}deactivateMeasure(){this.engineInstance&&this.engineInstance.deactivateMeasure()}getCurrentMeasureType(){return this.engineInstance?this.engineInstance.getCurrentMeasureType():null}clearAllMeasures(){this.engineInstance&&this.engineInstance.clearAllMeasures()}saveMeasureSetting(e){this.engineInstance&&this.engineInstance.saveMeasureSetting(e)}setClearHeightDirection(e){this.engineInstance&&this.engineInstance.setClearHeightDirection(e)}setClearHeightSelectType(e){this.engineInstance&&this.engineInstance.setClearHeightSelectType(e)}activeSection(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activeSection(e)}getCurrentSectionMode(){return this.engineInstance?this.engineInstance.getCurrentSectionMode():null}deactivateSection(){this.engineInstance&&this.engineInstance.deactivateSection()}setSectionBoxRange(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.setSectionBoxRange(e)}hideSection(){this.engineInstance&&this.engineInstance.hideSection()}recoverSection(){this.engineInstance&&this.engineInstance.recoverSection()}fitSectionBoxToModel(){this.engineInstance&&this.engineInstance.fitSectionBoxToModel()}scaleSectionBox(){this.engineInstance&&this.engineInstance.scaleSectionBox()}reverseSection(){this.engineInstance&&this.engineInstance.reverseSection()}activateZoomBox(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activateZoomBox()}activateFirstPersonMode(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activateFirstPersonMode()}deactivateFirstPersonMode(){this.engineInstance&&this.engineInstance.deactivateFirstPersonMode()}setWalkSpeed(e){this.engineInstance?.setWalkSpeed(e)}setWalkGravity(e){this.engineInstance?.setWalkGravity(e)}setWalkCollision(e){this.engineInstance?.setWalkCollision(e)}toggleMiniMap(){this.engineInstance?.toggleMiniMap()}getMiniMapState(){return this.engineInstance?.getMiniMapState()??!1}isFirstPersonModeActive(){return this.engineInstance?.isFirstPersonModeActive()??!1}getSelectedComponent(){return this.engineInstance?.getSelectedComponent()??null}getComponentProperties(e,t,n){this.engineInstance?.getComponentProperties(e,t,n)}getTypeTreeData(){return this.engineInstance?.getTypeTreeData()??[]}getLevelTreeData(){return this.engineInstance?.getLevelTreeData()??[]}getMajorTreeData(){return this.engineInstance?.getMajorTreeData()??[]}getEngineInfo(){return this.engineInstance?.getEngineInfo()??null}pathRoamingAddPoint(){this.engineInstance?.pathRoamingAddPoint()}pathRoamingRemovePoint(e){this.engineInstance?.pathRoamingRemovePoint(e)}pathRoamingClearPoints(){this.engineInstance?.pathRoamingClearPoints()}pathRoamingGetPoints(){return this.engineInstance?.pathRoamingGetPoints()??[]}pathRoamingJumpToPoint(e){this.engineInstance?.pathRoamingJumpToPoint(e)}pathRoamingPlay(e){this.engineInstance?.pathRoamingPlay(e)}pathRoamingStop(){this.engineInstance?.pathRoamingStop()}getHighlightModels(){return this.engineInstance?.getHighlightModels()??null}highlightModel(e){this.engineInstance?.highlightModel(e)}unhighlightAllModels(){this.engineInstance?.unhighlightAllModels()}viewScaleToModel(e){this.engineInstance?.viewScaleToModel(e)}hideModels(e){this.engineInstance?.hideModels(e)}showModel(e){this.engineInstance?.showModel(e)}translucentModels(e){this.engineInstance?.translucentModels(e)}unTranslucentModel(){this.engineInstance?.unTranslucentModel()}isolateModels(e){this.engineInstance?.isolateModels(e)}translucentOtherModels(e){this.engineInstance?.translucentOtherModels(e)}showAllModels(){this.engineInstance?.showAllModels()}batchSelectSameTypeModel(e){this.engineInstance?.batchSelectSameTypeModel(e)}batchSelectSameLevelModel(e){this.engineInstance?.batchSelectSameLevelModel(e)}batchSelectSameLevelTypeModel(e){this.engineInstance?.batchSelectSameLevelTypeModel(e)}getRenderMode(){return this.engineInstance?.getRenderMode()??"balance"}setRenderMode(e){this.engineInstance?.setRenderMode(e)}destroy(){this.engineInstance&&(this.engineInstance.destroy(),this.engineInstance=null),this.rightKey&&(this.rightKey.destroy(),this.rightKey=null),super.destroy()}}var Mt=(s=>(s[s.Unchecked=0]="Unchecked",s[s.Checked=1]="Checked",s[s.Indeterminate=2]="Indeterminate",s))(Mt||{});class yT{config;element;children=[];parent=null;checkState=Mt.Unchecked;contentEl;switcherEl;checkboxEl=null;titleEl;actionsEl;childrenContainer;onExpandChange;onCheckChange;onNodeClick;renderActions;constructor(e,t,n){this.config=e,this.onExpandChange=n.onExpand,this.onCheckChange=n.onCheck,this.onNodeClick=n.onClick,this.renderActions=t.renderActions,this.checkState=e.checked?Mt.Checked:Mt.Unchecked,this.element=this.createDom(t)}createDom(e){const t=document.createElement("div");t.className="bim-tree-node",this.config.disabled&&t.classList.add("is-disabled"),this.contentEl=document.createElement("div"),this.contentEl.className="bim-tree-node-content",this.switcherEl=document.createElement("span"),this.switcherEl.className="bim-tree-switcher",this.switcherEl.innerHTML='';const n=this.config.children&&this.config.children.length>0;if(n?this.config.expanded&&this.switcherEl.classList.add("is-expanded"):this.switcherEl.classList.add("is-hidden"),this.switcherEl.addEventListener("click",r=>{r.stopPropagation(),this.toggleExpand()}),this.contentEl.appendChild(this.switcherEl),e.checkable!==!1&&(this.checkboxEl=document.createElement("span"),this.checkboxEl.className="bim-tree-checkbox",this.updateCheckboxUI(),this.checkboxEl.addEventListener("click",r=>{r.stopPropagation(),!this.config.disabled&&this.toggleCheck()}),this.contentEl.appendChild(this.checkboxEl)),this.config.icon){const r=document.createElement("span");r.className="bim-tree-icon",r.innerHTML=this.config.icon.includes("`,this.contentEl.appendChild(r)}this.titleEl=document.createElement("span"),this.titleEl.className="bim-tree-title",this.updateLabel(),this.contentEl.appendChild(this.titleEl),this.actionsEl=document.createElement("div"),this.actionsEl.className="bim-tree-node-actions",this.actionsEl.addEventListener("click",r=>{r.stopPropagation()}),this.contentEl.appendChild(this.actionsEl),this.contentEl.addEventListener("click",r=>{if(r.stopPropagation(),this.config.disabled)return;(this.config.clickAction||"select")==="expand"?this.toggleExpand():this.onNodeClick(this)}),t.appendChild(this.contentEl),this.childrenContainer=document.createElement("div"),this.childrenContainer.className="bim-tree-children";const i=e.indent||24;return this.childrenContainer.style.paddingLeft=`${i}px`,this.config.expanded&&n&&this.childrenContainer.classList.add("is-visible"),t.appendChild(this.childrenContainer),t}setSelected(e){if(e){if(this.contentEl.classList.add("is-selected"),this.renderActions){const t=this.renderActions(this.config);this.actionsEl.innerHTML="",typeof t=="string"?this.actionsEl.innerHTML=t:t instanceof HTMLElement&&this.actionsEl.appendChild(t)}}else this.contentEl.classList.remove("is-selected"),this.actionsEl.innerHTML=""}updateLabel(){this.titleEl&&(this.titleEl.textContent=this.config.label)}toggleExpand(e){if(!this.config.children||this.config.children.length===0)return;const t=e!==void 0?e:!this.config.expanded;this.config.expanded=t,t?(this.switcherEl.classList.add("is-expanded"),this.childrenContainer.classList.add("is-visible")):(this.switcherEl.classList.remove("is-expanded"),this.childrenContainer.classList.remove("is-visible")),e===void 0&&this.onExpandChange(this)}toggleCheck(){const e=this.checkState!==Mt.Checked;this.setChecked(e?Mt.Checked:Mt.Unchecked,!0)}setChecked(e,t=!1,n=!1){!n&&this.checkState===e||(this.checkState=e,this.config.checked=e===Mt.Checked,this.updateCheckboxUI(),t&&this.onCheckChange(this))}updateCheckboxUI(){this.checkboxEl&&(this.checkboxEl.classList.remove("is-checked","is-indeterminate"),this.checkState===Mt.Checked?this.checkboxEl.classList.add("is-checked"):this.checkState===Mt.Indeterminate&&this.checkboxEl.classList.add("is-indeterminate"))}appendChild(e){e.parent=this,this.children.push(e),this.childrenContainer.appendChild(e.element),this.children.length===1&&this.switcherEl.classList.remove("is-hidden")}destroy(){this.children.forEach(e=>e.destroy()),this.children=[],this.element.remove(),this.parent=null}}class bT{element;contentElement;searchInput=null;searchResults=null;options;nodeMap=new Map;rootNodes=[];selectedNode=null;lastRevealedNodeId=null;unsubscribeLocale=null;unsubscribeTheme=null;clickOutsideHandler=null;onNodeCheck;onNodeSelect;onNodeDeselect;onNodeExpand;constructor(e){this.options={checkable:!0,checkStrictly:!0,indent:24,defaultExpandAll:!0,enableSearch:!1,searchPlaceholder:"tree.searchPlaceholder",...e},this.element=document.createElement("div"),this.element.className="bim-tree",this.options.enableSearch&&this.createSearchDOM(),this.contentElement=document.createElement("div"),this.contentElement.className="bim-tree-content",this.element.appendChild(this.contentElement),e.onNodeCheck&&(this.onNodeCheck=e.onNodeCheck),e.onNodeSelect&&(this.onNodeSelect=e.onNodeSelect),e.onNodeDeselect&&(this.onNodeDeselect=e.onNodeDeselect),e.onNodeExpand&&(this.onNodeExpand=e.onNodeExpand)}createSearchDOM(){const e=document.createElement("div");e.className="bim-tree-search";const t=document.createElement("div");t.className="bim-tree-search-wrapper";const n=document.createElement("span");n.className="bim-tree-search-icon",n.innerHTML='',t.appendChild(n),this.searchInput=document.createElement("input"),this.searchInput.className="bim-tree-search-input",this.searchInput.type="text",this.searchInput.placeholder=xe(this.options.searchPlaceholder||"搜索..."),this.searchInput.addEventListener("input",i=>{const r=i.target.value;this.handleSearch(r)}),t.appendChild(this.searchInput),e.appendChild(t),this.searchResults=document.createElement("div"),this.searchResults.className="bim-tree-search-results",e.appendChild(this.searchResults),this.element.appendChild(e),this.clickOutsideHandler=i=>{this.searchResults&&!this.searchResults.contains(i.target)&&!this.searchInput?.contains(i.target)&&this.searchResults.classList.remove("is-visible")},document.addEventListener("click",this.clickOutsideHandler)}init(){this.render(),this.unsubscribeLocale=Qt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=ot.subscribe(e=>this.setTheme(e)),this.setTheme(ot.getTheme())}handleSearch(e){if(!this.searchResults)return;if(!e.trim()){this.searchResults.classList.remove("is-visible"),this.searchResults.innerHTML="";return}const t=[],n=e.toLowerCase();this.nodeMap.forEach(i=>{const r=i.config.label;r.toLowerCase().includes(n)&&t.push({node:i,label:r,path:this.getNodePath(i)})}),this.renderSearchResults(t)}getNodePath(e){const t=[];let n=e.parent;for(;n;)t.unshift(n.config.label),n=n.parent;return t.join(" > ")}renderSearchResults(e){if(this.searchResults){if(this.searchResults.innerHTML="",e.length===0){const t=document.createElement("div");t.className="bim-tree-search-item",t.style.cursor="default",t.style.color="#999",t.textContent="No results",this.searchResults.appendChild(t)}else e.forEach(t=>{const n=document.createElement("div");n.className="bim-tree-search-item";const i=document.createElement("span");i.className="bim-tree-search-item-title",i.textContent=t.label;const r=document.createElement("span");r.className="bim-tree-search-item-path",r.textContent=t.path,n.appendChild(i),t.path&&n.appendChild(r),n.addEventListener("click",()=>{this.revealNode(t.node)}),this.searchResults.appendChild(n)});this.searchResults.classList.add("is-visible")}}revealNode(e){if(this.lastRevealedNodeId===e.config.id&&this.isNodeFullyVisible(e))return;this.lastRevealedNodeId=e.config.id,this.searchResults&&(this.searchResults.classList.remove("is-visible"),this.searchInput&&(this.searchInput.value=""));let t=e.parent;for(;t;)t.toggleExpand(!0),t=t.parent;this.handleNodeSelect(e),requestAnimationFrame(()=>{requestAnimationFrame(()=>{this.scrollNodeIntoContentCenter(e)})})}isNodeFullyVisible(e){const t=this.contentElement;if(!t||!e?.element?.isConnected)return!1;const n=t.getBoundingClientRect(),i=e.element.getBoundingClientRect();return i.top>=n.top&&i.bottom<=n.bottom}scrollNodeIntoContentCenter(e){const t=this.contentElement;if(!t||!e?.element?.isConnected)return;const n=t.getBoundingClientRect(),i=e.element.getBoundingClientRect();if(i.top>=n.top&&i.bottom<=n.bottom)return;const r=i.top-n.top+t.scrollTop,a=Math.max(0,r-(t.clientHeight-i.height)/2);t.scrollTo({top:a,behavior:"auto"})}setTheme(e){const t=this.element.style;t.setProperty("--bim-primary",e.primary),t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-secondary",e.textSecondary),t.setProperty("--bim-text-tertiary",e.textTertiary),t.setProperty("--bim-text-disabled",e.textDisabled),t.setProperty("--bim-text-inverse",e.textInverse),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-border-disabled",e.borderDisabled),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-component-bg-selected",e.componentBgSelected),t.setProperty("--bim-component-bg-disabled",e.componentBgDisabled),t.setProperty("--bim-shadow-md",e.shadowMd),t.setProperty("--bim-focus-ring",e.focusRing)}setLocales(){this.nodeMap.forEach(e=>e.updateLabel()),this.searchInput&&(this.searchInput.placeholder=xe(this.options.searchPlaceholder||"tree.searchPlaceholder"))}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.clickOutsideHandler&&(document.removeEventListener("click",this.clickOutsideHandler),this.clickOutsideHandler=null),this.rootNodes.forEach(e=>e.destroy()),this.rootNodes=[],this.nodeMap.clear(),this.lastRevealedNodeId=null,this.element.remove(),this.selectedNode=null}render(){this.contentElement.innerHTML="",this.nodeMap.clear(),this.rootNodes=[],this.options.data.forEach(e=>{this.createNodeRecursively(e,null)})}createNodeRecursively(e,t){e.expanded===void 0&&(e.expanded=this.options.defaultExpandAll);const n=new yT(e,this.options,{onExpand:i=>{this.onNodeExpand&&this.onNodeExpand(i)},onCheck:i=>this.handleNodeCheck(i),onClick:i=>this.handleNodeSelect(i)});this.nodeMap.set(e.id,n),t?t.appendChild(n):(this.rootNodes.push(n),this.contentElement.appendChild(n.element)),e.children&&e.children.length>0&&e.children.forEach(i=>{this.createNodeRecursively(i,n)})}handleNodeSelect(e){if(this.selectedNode===e){e.setSelected(!1),this.selectedNode=null,this.onNodeDeselect&&this.onNodeDeselect(e);return}this.selectedNode&&this.selectedNode.setSelected(!1),e.setSelected(!0),this.selectedNode=e,this.onNodeSelect&&this.onNodeSelect(e)}handleNodeCheck(e){const t=e.checkState===Mt.Checked;if(this.onNodeCheck&&this.onNodeCheck(e),this.options.checkStrictly===!1)return;const n=(r,a)=>{r.children.forEach(o=>{o.config.disabled||(o.setChecked(a,!1),n(o,a))})};t?n(e,Mt.Checked):n(e,Mt.Unchecked);let i=e.parent;for(;i;){if(i.config.disabled){i=i.parent;continue}const r=i.children,a=r.every(l=>l.checkState===Mt.Checked),o=r.every(l=>l.checkState===Mt.Unchecked);a?i.setChecked(Mt.Checked,!1):o?i.setChecked(Mt.Unchecked,!1):i.setChecked(Mt.Indeterminate,!1),i=i.parent}}getNode(e){return this.nodeMap.get(e)}checkNode(e,t){const n=this.nodeMap.get(e);n&&n.setChecked(t?Mt.Checked:Mt.Unchecked,!0)}expandAll(e){this.nodeMap.forEach(t=>t.toggleExpand(e))}checkAllNodes(e){const t=e?Mt.Checked:Mt.Unchecked;this.nodeMap.forEach(n=>n.setChecked(t,!1,!0))}getCheckedNodes(e=!1){const t=[];return this.nodeMap.forEach(n=>{(n.checkState===Mt.Checked||e&&n.checkState===Mt.Indeterminate)&&t.push(n.config)}),t}}class eg{element;navElement;contentElement;options;activeId;tabMap=new Map;panelMap=new Map;panelTreeScrollTopMap=new Map;unsubscribeLocale=null;unsubscribeTheme=null;navClickHandler=null;constructor(e){this.options=e,this.activeId=e.activeId||(e.tabs[0]?.id??null),e.tabs.forEach(t=>this.tabMap.set(t.id,t)),this.element=document.createElement("div"),this.element.className="bim-tab",this.navElement=document.createElement("div"),this.navElement.className="bim-tab__nav",this.navElement.setAttribute("role","tablist"),this.element.appendChild(this.navElement),this.contentElement=document.createElement("div"),this.contentElement.className="bim-tab__content",this.element.appendChild(this.contentElement),this.options.container.appendChild(this.element)}init(){this.renderNav(),this.renderPanels(),this.setLocales(),this.setTheme(ot.getTheme()),this.unsubscribeLocale=Qt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=ot.subscribe(e=>this.setTheme(e))}renderNav(){this.navElement.innerHTML="",this.navClickHandler=e=>{const t=e.target.closest(".bim-tab__item");if(!t)return;const n=t.dataset.id;!n||this.tabMap.get(n)?.disabled||this.activateTab(n)},this.navElement.addEventListener("click",this.navClickHandler),this.options.tabs.forEach(e=>{const t=document.createElement("button");if(t.type="button",t.className="bim-tab__item",t.dataset.id=e.id,t.setAttribute("role","tab"),t.id=`tab-${e.id}`,t.setAttribute("aria-selected",`${e.id===this.activeId}`),e.disabled&&(t.disabled=!0,t.setAttribute("aria-disabled","true"),t.classList.add("is-disabled")),e.icon){const i=document.createElement("span");i.className="bim-tab__icon",i.innerHTML=e.icon,t.appendChild(i)}const n=document.createElement("span");n.className="bim-tab__title",n.textContent=this.resolveTitle(e.title),t.appendChild(n),e.id===this.activeId&&t.classList.add("is-active"),this.navElement.appendChild(t)})}renderPanels(){this.contentElement.innerHTML="",this.panelMap.clear(),this.options.tabs.forEach(e=>{const t=document.createElement("div");t.className="bim-tab__panel",t.dataset.id=e.id,t.setAttribute("role","tabpanel"),t.setAttribute("aria-labelledby",`tab-${e.id}`),e.content instanceof HTMLElement?t.appendChild(e.content):typeof e.content=="string"&&(t.innerHTML=e.content),e.id===this.activeId?t.classList.add("is-active"):t.style.display="none",this.panelMap.set(e.id,t),this.contentElement.appendChild(t)})}activateTab(e){if(this.activeId===e)return;const t=this.tabMap.get(e);if(!t||t.disabled)return;this.activeId=e,this.navElement.querySelectorAll(".bim-tab__item").forEach(i=>{const r=i.dataset.id===e;i.classList.toggle("is-active",r),i.setAttribute("aria-selected",`${r}`)}),this.panelMap.forEach((i,r)=>{const a=r===e;a||this.savePanelTreeScrollTop(r,i),i.classList.toggle("is-active",a),i.style.display=a?"":"none",a&&this.restorePanelTreeScrollTop(r,i)}),this.options.onChange&&this.options.onChange(e,t)}setTheme(e){const t=this.element.style;t.setProperty("--bim-tab-bg",e.bgElevated),t.setProperty("--bim-tab-nav-bg",e.bgElevated),t.setProperty("--bim-tab-text",e.textPrimary),t.setProperty("--bim-tab-text-secondary",e.textSecondary),t.setProperty("--bim-tab-text-active",e.primary),t.setProperty("--bim-tab-border",e.borderDefault),t.setProperty("--bim-tab-hover-bg",e.componentBgHover),t.setProperty("--bim-tab-active-bg",e.componentBgActive),t.setProperty("--bim-tab-icon",e.iconDefault)}setLocales(){this.navElement.querySelectorAll(".bim-tab__item").forEach(t=>{const n=t.dataset.id;if(!n)return;const i=this.tabMap.get(n);if(!i)return;const r=t.querySelector(".bim-tab__title");r&&(r.textContent=this.resolveTitle(i.title))})}destroy(){this.navClickHandler&&(this.navElement.removeEventListener("click",this.navClickHandler),this.navClickHandler=null),this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.panelMap.clear(),this.panelTreeScrollTopMap.clear(),this.tabMap.clear(),this.element.remove()}savePanelTreeScrollTop(e,t){const n=t.querySelector(".bim-tree-content");n&&this.panelTreeScrollTopMap.set(e,n.scrollTop)}restorePanelTreeScrollTop(e,t){const n=this.panelTreeScrollTopMap.get(e);if(n===void 0)return;const i=t.querySelector(".bim-tree-content");i&&requestAnimationFrame(()=>{i.scrollTop=n})}resolveTitle(e){try{return xe(e)||e}catch{return e}}}const tg={测量:'',地图:'',框选放大:'',漫游:'',目录树:'',剖切:'',剖切盒:'',全屏:'',设置:'',拾曲面剖切:'',轴向剖切:'',主视角:'',文档:'',第一人称漫游:'',反向:'',路径漫游:'',适应到模型:'',隐藏:'',重置:'',标高:'',距离:'',最小距离:'',激光边距:'',角度:'',坡度:'',体积:'',空间体积:'',close:'',check:'',warning:'',error:'',success:'',plus:'',minus:'',arrowUp:'',arrowUpBold:'',arrowDown:'',arrowLeft:'',arrowRight:'',search:'',refresh:'',delete:'',edit:'',save:'',expand:'',collapse:'',bot:'',history:'',settings:'',loader:'',send:'',default:''};function at(s){const e=tg[s];return e||(console.warn(`[IconManager] Icon "${s}" not found, using default icon`),tg.default)}function ng(s,e){let t=e>>>0;for(let n=0;n>>8&255,t=Math.imul(t,16777619)}return t>>>0}async function _T(s){const e=JSON.stringify(s),t=ng(e,2166136261),n=ng(e,522970236);return`${t.toString(16).padStart(8,"0")}${n.toString(16).padStart(8,"0")}`}function ig(s){const e=new Map,t=i=>{const r=i.config.data,a=r?._modelUrl;if(a&&r?.ids?.length){let o=e.get(a);o||(o=new Set,e.set(a,o));for(const l of r.ids){const c=Number(l);Number.isFinite(c)&&o.add(c)}}for(const o of i.children||[])t(o)};t(s);const n=[];for(const[i,r]of e)r.size>0&&n.push({url:i,ids:Array.from(r)});return n}let MT=0;async function wT(s){if(!s||s.length===0)return[];const e=async(t,n)=>{const i=t.children&&t.children.length>0;let r;return t.ids?.length?r=await _T(t.ids):t.id?r=t.id:r=`node_${++MT}`,{id:r,label:t.name||"未命名",expanded:!1,checked:!0,children:i?await Promise.all(t.children.map(a=>e(a,n))):void 0,data:{...t,_modelUrl:n}}};return Promise.all(s.map(async t=>{const n=t.children&&t.children.length>0,i=t.url;return{id:i,label:t.name||"模型",expanded:!0,checked:!0,children:n?await Promise.all(t.children.map(r=>e(r,i))):void 0,data:{_modelUrl:i}}}))}class ST extends xi{toolbar=null;toolbarContainer=null;container;dialog=null;constructor(e,t){super(t),this.container=e,this.init()}init(){this.toolbarContainer=document.createElement("div"),this.toolbarContainer.id="bim-construct-tree",this.container.appendChild(this.toolbarContainer),this.toolbar=new tc({container:this.toolbarContainer,showLabel:!1,direction:"column",position:"top-left",align:"vertical",expand:"up",registry:this.registry}),this.toolbar.init(),this.toolbar.addGroup("construct-tree"),this.toolbar.addButton({id:"construct-tree-btn",groupId:"construct-tree",type:"button",label:"construct-tree",icon:at("目录树"),onClick:()=>{this.openConstructTreeDialog()}}),this.toolbar.render()}async openConstructTreeDialog(){this.setVisible(!1);const e=this.registry.engine3d?.getLevelTreeData()??[],t=this.registry.engine3d?.getTypeTreeData()??[],n=this.registry.engine3d?.getMajorTreeData()??[];console.log("[ConstructTree] 原始数据 (Level):",e),console.log("[ConstructTree] 原始数据 (Type):",t),console.log("[ConstructTree] 原始数据 (Major):",n);const i=async(f,x)=>{const g=await wT(f);console.log(`[ConstructTree] 转换后数据 (${x}):`,g);const y=new bT({data:g,checkable:!0,indent:0,enableSearch:!0,checkStrictly:!0,defaultExpandAll:!0,onNodeCheck:v=>{const b=ig(v);b.length&&(v.checkState===Mt.Checked?this.registry.engine3d?.showModel(b):this.registry.engine3d?.hideModels(b))},onNodeSelect:v=>{const b=ig(v);b.length&&(this.registry.engine3d?.unhighlightAllModels(),this.registry.engine3d?.highlightModel(b),this.registry.engine3d?.viewScaleToModel(b))},onNodeDeselect:()=>{this.registry.engine3d?.unhighlightAllModels()},onNodeExpand:()=>{this.dialog?.fitWidth()}});return y.init(),y},r=await i(e,"Level"),a=await i(t,"Type"),o=await i(n,"Major"),l=document.createElement("div");l.className="construct-tab__panel-content",l.appendChild(r.element);const c=document.createElement("div");c.className="construct-tab__panel-content",c.appendChild(a.element);const h=document.createElement("div");h.className="construct-tab__panel-content",h.appendChild(o.element);const u=document.createElement("div");u.className="construct-tab__container",u.style.height="100%",u.style.overflow="hidden";const p=()=>{this.registry.engine3d?.showAllModels(),r.checkAllNodes(!0),a.checkAllNodes(!0),o.checkAllNodes(!0)},d=new eg({container:u,tabs:[{id:"component",title:"tab.component",content:l},{id:"type",title:"tab.type",content:c},{id:"major",title:"tab.major",content:h}],activeId:"component",onChange:()=>{this.dialog?.fitWidth()}});d.init(),p();const m=this.registry.on("menu:show-all",()=>{p()});this.dialog=this.registry.dialog.create({title:"constructTree.title",minWidth:320,height:600,content:u,position:{x:20,y:20},resizable:!1,onClose:()=>{m(),d.destroy(),r.destroy(),a.destroy(),o.destroy(),this.setVisible(!0)}}),this.dialog?.fitWidth()}refresh(){this.toolbar?.render()}destroy(){this.toolbar?.destroy(),this.toolbar=null,super.destroy()}addGroup(e,t){this.toolbar?.addGroup(e,t),this.toolbar?.render()}addButton(e){this.toolbar?.addButton(e),this.toolbar?.render()}setButtonVisibility(e,t){this.toolbar?.updateButtonVisibility(e,t)}setShowLabel(e){this.toolbar?.setShowLabel(e)}setVisible(e){this.toolbarContainer&&(this.toolbarContainer.style.visibility=e?"visible":"hidden")}setBackgroundColor(e){this.toolbar?.setBackgroundColor(e)}setColors(e){this.toolbar?.setColors(e)}}class Gs extends xi{dialog=null;isVisible=!1;constructor(e){super(e)}get dialogWidth(){return 300}get dialogHeight(){return"auto"}get dialogOptions(){return{draggable:!0,resizable:!1}}onDialogClose(){}onDialogCreated(){}onBeforeDestroy(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight,i=this.dialogWidth,r=typeof this.dialogHeight=="number"?this.dialogHeight:300;return{x:t-i-20,y:(n-r)/2}}show(){if(!this.registry.dialog||!this.registry.container){console.warn(`[${this.dialogId}] Dialog manager or container is not initialized`);return}this.dialog&&this.destroyDialog();const e=this.getDialogPosition(),t=this.createContent(),n=this.dialogOptions;this.dialog=this.registry.dialog.create({id:this.dialogId,title:this.dialogTitle,content:t,width:this.dialogWidth,height:this.dialogHeight,position:e,draggable:n.draggable,resizable:n.resizable,onClose:()=>{this.onDialogClose(),this.destroyDialog()}}),this.dialog.init(),this.isVisible=!0,this.onDialogCreated()}hide(){this.destroyDialog()}toggle(){this.isVisible?this.hide():this.show()}isOpen(){return this.isVisible}destroyDialog(){this.onBeforeDestroy(),this.dialog&&(this.dialog.destroy(),this.dialog=null),this.isVisible=!1}destroy(){this.destroyDialog(),super.destroy()}}const us={clearHeight:'',clearDistance:'',distance:'',elevation:'',point:'',angle:'',area:'',slope:''},Xa={distance:{key:"distance",callBackType:"distance",icon:us.distance,order:0},clearHeight:{key:"clearHeight",callBackType:"clear-height",icon:us.clearHeight,order:1},clearDistance:{key:"clearDistance",callBackType:"clear-distance",icon:us.clearDistance,order:2},elevation:{key:"elevation",callBackType:"elevation",icon:us.elevation,order:3},point:{key:"point",callBackType:"point",icon:us.point,order:4},angle:{key:"angle",callBackType:"angle",icon:us.angle,order:5},area:{key:"area",callBackType:"area",icon:us.area,order:6},slope:{key:"slope",callBackType:"slope",icon:us.slope,order:7}},sg=Object.values(Xa).sort((s,e)=>s.order-e.order).map(s=>s.key);function rg(s){switch(s){case"clearHeight":case"clearDistance":case"distance":case"elevation":return"length";case"area":return"area";case"angle":return"angle";case"slope":return"percent";case"point":default:return"point"}}function ET(s){return Object.values(Xa).find(e=>e.callBackType===s)?.key}class ja{element;options;activeMode;isExpanded;result=null;clearHeightDirection=0;clearHeightSelectType="point";config;draftConfig=null;view="main";static CONFIG_CACHE_KEY="bim-engine:measure:config";static DEFAULT_CONFIG={unit:"mm",precision:2};toolButtons=new Map;toggleBtn;toggleTextEl;mainValueRowEl;mainValueValueEl;mainValueLabelEl;mainNumberEl;mainUnitEl;xyzBoxEl;xyzXEl;xyzYEl;xyzZEl;clearBtn;settingsBtn;modeOptionsEl;directionBtns=new Map;selectTypeBtns=new Map;mainViewEl;settingsViewEl;unitSelectEl;precisionSelectEl;saveSettingsBtn;cancelSettingsBtn;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.activeMode=e.defaultMode??"distance",this.isExpanded=e.defaultExpanded??!1,this.config=this.loadConfigFromCache()??{...ja.DEFAULT_CONFIG},this.element=this.createDom()}init(){this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)}),this.setLocales(),this.setTheme(ot.getTheme()),this.applyExpandedState(),this.applyActiveModeState(),this.applyClearHeightOptionsState(),this.applyViewState(),this.renderResult(),this.options.onModeChange&&this.options.onModeChange(this.activeMode)}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-hover",e.primaryHover??"#60a5fa"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-danger",e.danger??"#ef4444"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-text-secondary",e.textSecondary??"#94a3b8"),t.setProperty("--bim-text-tertiary",e.textTertiary??"#64748b"),t.setProperty("--bim-text-inverse",e.textInverse??"#152232"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}setLocales(){for(const[t,n]of this.toolButtons.entries())n.title=xe(this.getModeI18nKey(t)),n.setAttribute("aria-label",n.title);this.toggleBtn.title=this.isExpanded?xe("measure.actions.collapse"):xe("measure.actions.expand"),this.toggleBtn.setAttribute("aria-label",this.toggleBtn.title),this.toggleTextEl&&(this.toggleTextEl.textContent=this.toggleBtn.title),this.clearBtn.textContent=xe("measure.actions.clearAll"),this.settingsBtn.title=xe("measure.actions.settings"),this.settingsBtn.setAttribute("aria-label",this.settingsBtn.title),this.mainValueLabelEl.textContent=xe(this.getModeValueLabelI18nKey(this.activeMode)),this.element.querySelectorAll("[data-i18n-key]").forEach(t=>{const n=t.dataset.i18nKey;n&&(t.textContent=xe(n))}),this.saveSettingsBtn.textContent=xe("measure.settings.save"),this.cancelSettingsBtn.textContent=xe("measure.settings.cancel")}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove()}getActiveMode(){return this.activeMode}switchMode(e,t=!0){this.setActiveMode(e,t)}setActiveMode(e,t=!0){this.activeMode!==e&&(this.activeMode=e,this.applyActiveModeState(),this.applyClearHeightOptionsState(),this.mainValueLabelEl.textContent=xe(this.getModeValueLabelI18nKey(this.activeMode)),t&&this.options.onModeChange&&this.options.onModeChange(e),this.renderResult(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded))}setResult(e){this.result=e,this.renderResult()}clearAll(){this.result=null,this.renderResult(),this.options.onClearAll&&this.options.onClearAll()}openSettings(){this.enterSettingsView(),this.options.onSettings&&this.options.onSettings()}getConfig(){return{...this.config}}setConfig(e,t=!1){const n={unit:e.unit??this.config.unit,precision:e.precision??this.config.precision};this.config=n,t&&this.saveConfigToCache(n),this.renderResult(),this.view==="settings"&&this.syncSettingsFormFromConfig(n)}setExpanded(e){this.isExpanded!==e&&(this.isExpanded=e,this.applyExpandedState(),this.setLocales(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded))}getExpanded(){return this.isExpanded}createDom(){const e=document.createElement("div");e.className="bim-measure-panel",this.mainViewEl=document.createElement("div"),this.mainViewEl.className="bim-measure-main";const t=document.createElement("div");t.className="bim-measure-tools";const n=document.createElement("div");n.className="bim-measure-tool-grid";const i=` +`;class mC{options;DeviceType;animationId=null;isRenderingPaused=!1;controlsEnabledBeforePause=!0;animate;onWindowResize;_fpsFrameCount=0;_fpsLastCheck=0;_fpsLastSwitch=0;_lowFpsCount=0;_highFpsCount=0;_fpsCheckInterval=100;_fpsSwitchCooldown=100;_fpsThreshold=30;_fpsUpgradeThreshold=60;_lowFpsRequired=3;_highFpsRequired=.1;isMouseDown=!1;isWheeling=!1;scene;camera;renderer;sceneModule;cameraModule;deviceModule;renderModule;controlModule;composerModule;loaderModule;engineStatus;events;lightModule;interactionModule;modelToolModule;worldToScreen;handelBehaved;octreeBox;controls;stats;catchSvg;engineModelModule;viewCube;rangeScale;setting;measure;clipping;modelTree;engineInfo;modelProperties;modelMapperBatch;modelEdge;ai;pathRoaming;hoverHighLight;minMap;grid;level;text;hdr;ground;models=[];reactBoundingClientRect={left:0,top:0};version="2.0.4";versionEl=null;container;constructor(e){if(this.options=e,this.container=document.getElementById(e.containerId),!this.container)throw new Error(`Container ${e.containerId} not found`);this.engineModelModule=new Iw(this),this.engineModelModule.init(),this.ai=new iC(this),this.deviceModule=new C3(this),this.DeviceType=this.deviceModule.getDeviceType(),this.cameraModule=new E3(this),this.sceneModule=new S3(this),this.scene=this.sceneModule.scene,this.renderModule=new T3(this),this.renderer=this.renderModule.createRenderer(),this.camera=this.cameraModule.orthographicCamera,this.scene.camera=this.camera,this.controlModule=new V3(this),this.controlModule.switchDefaultMode(),this.controls=this.controlModule.orbitControls,this.composerModule=new t_(this),this.composerModule.init(),this.events=new Cw,this.engineStatus=new Ew(this),this.engineStatus.init(),this.loaderModule=new Sw(this),this.lightModule=new Tw(this),this.lightModule.init(),this.viewCube=new Ww(this),this.viewCube.init(),this.options.showViewCube==!1&&this.viewCube.hide(),this.octreeBox=Xw(this),this.rangeScale=new jw(this),this.rangeScale.init(),this.clipping=new $E(this),this.clipping.init(),this.setting=new qw(this),this.setting.init(),this.engineModelModule.init(),this.handelBehaved=cu(this),this.modelMapperBatch=new eC(this),this.measure=new nS(this),this.modelToolModule=new Pw(this),this.modelProperties=new QE(this),this.interactionModule=new Aw(this),this.interactionModule.init(),this.interactionModule.active(),this.hoverHighLight=new wl(this),this.modelEdge=new tC(this),this.modelTree=new KE(this),this.engineInfo=new JE(this),this.pathRoaming=new sC(this),this.pathRoaming.init(),this.minMap=new rC(this),this.grid=new oC(this),this.level=new cC(this),this.text=new hC(this),this.hdr=new uC(this),this.ground=new dC(this),this.ground.init(),this.worldToScreen=new Dn(this.camera,this.renderer,this.scene),this.options.showStats&&(this.stats=new Uw,this.stats.showPanel(0),this.stats.dom.style.position="absolute",this.stats.dom.style.top="0px",this.stats.dom.style.left="0px",this.stats.dom.style.zIndex="1000",this.container.appendChild(this.stats.dom));let t=document.createElement("div");t.className="versionText",this.versionEl=t,this.updateVersionDisplay(),this.container.appendChild(t);let n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.style.position="absolute",n.style.width="100%",n.style.height="100%",n.style.zIndex="1000",n.style.left="0px",n.style.top="0px",n.style.pointerEvents="none";const i=this.renderer?.domElement.width||1920,r=this.renderer?.domElement.height||1080;n.setAttribute("viewBox",`0 0 ${i} ${r}`),n.setAttribute("preserveAspectRatio","none"),this.container.appendChild(n),this.catchSvg=n,this.onWindowResize=()=>{this.handleWindowResize()},window.addEventListener("resize",this.onWindowResize);let a=this;this.controls.addEventListener("start",()=>{a.events.trigger(ts.EngineBusy)}),this.controls.addEventListener("end",()=>{a.events.trigger(ts.EngineFree)}),this.controls.addEventListener("change",()=>{}),this.animate=()=>{if(!this.isRenderingPaused)this.animationId=requestAnimationFrame(this.animate);else{this.animationId=null;return}this.stats&&this.stats.begin(),this.composerModule&&this.composerModule.composer.render(),this.viewCube&&this.viewCube.cubeTool.RenderScene(),this.measure.update(),this.ground.update(),this.hoverHighLight.update(),this.controlModule.update(),this.minMap.update(),this.grid.update(),this.level.update(),this.text&&this.text.update(),this.stats&&this.stats.end(),this._fpsFrameCount++;const o=performance.now();if(o-this._fpsLastCheck>=this._fpsCheckInterval){const l=o-this._fpsLastCheck,c=this._fpsFrameCount/l*1e3;this._fpsFrameCount=0,this._fpsLastCheck=o,c=this._lowFpsRequired&&o-this._fpsLastSwitch>this._fpsSwitchCooldown&&(this._adaptiveRenderingDowngrade(),this._fpsLastSwitch=o,this._lowFpsCount=0)):c>this._fpsUpgradeThreshold?(this._highFpsCount++,this._lowFpsCount=0,this._highFpsCount>=this._highFpsRequired&&o-this._fpsLastSwitch>this._fpsSwitchCooldown&&(this._adaptiveRenderingUpgrade(),this._fpsLastSwitch=o,this._highFpsCount=0)):(this._lowFpsCount=0,this._highFpsCount=0)}if(this.scene){let l=this.scene?.dirLight;l&&this.camera&&this.updateLightPosition(this.camera,l)}},this.animate()}updateVersionDisplay(){if(!this.versionEl)return;const e={simple:"simple",balance:"balance",advanced:"advanced"},t=this.engineModelModule?.getCurrentMode()??"",n=e[t]??t;this.versionEl.innerHTML=`v${this.version} | ${n}`}updateLightPosition(e,t){const n=new P;e.getWorldDirection(n);const i=100,r=new P().copy(n).multiplyScalar(-i),a=new P(0,1,0),o=new P().crossVectors(n,a).normalize();r.addScaledVector(a,i*.5),r.addScaledVector(o,i*.3),t.position.copy(e.position).add(r);const l=new P().copy(e.position).add(n.multiplyScalar(20));t.target.position.copy(l),t.target.updateMatrixWorld()}_adaptiveRenderingDowngrade(){const e=["simple","balance","advanced"],t=this.engineModelModule.getCurrentMode(),n=e.indexOf(t);if(n>0){const i=e[n-1];console.log(`[AdaptiveRendering] FPS低于${this._fpsThreshold},自动降级: ${t} → ${i}`),this.engineModelModule.autoSwitch(i)}}_adaptiveRenderingUpgrade(){const e=["simple","balance","advanced"],t=this.engineModelModule.getCurrentMode(),n=e.indexOf(t);if(n{e.dispose&&e.dispose()}),this.composerModule.composer.renderTarget1&&this.composerModule.composer.renderTarget1.dispose(),this.composerModule.composer.renderTarget2&&this.composerModule.composer.renderTarget2.dispose())}catch(e){console.warn("[BimEngine] Error disposing composer:",e)}try{this.renderModule&&this.renderModule.disposeRenderer(),this.renderer&&(this.renderer.domElement&&this.renderer.domElement.parentElement&&this.renderer.domElement.parentElement.removeChild(this.renderer.domElement),this.renderer.dispose(),this.renderer.forceContextLoss())}catch(e){console.warn("[BimEngine] Error disposing renderer:",e)}try{this.stats&&this.stats.dom&&this.stats.dom.parentElement&&this.stats.dom.parentElement.removeChild(this.stats.dom),this.catchSvg&&this.catchSvg.parentElement&&this.catchSvg.parentElement.removeChild(this.catchSvg)}catch(e){console.warn("[BimEngine] Error disposing DOM elements:",e)}try{this.events&&this.events.listeners&&this.events.listeners.clear()}catch(e){console.warn("[BimEngine] Error clearing event listeners:",e)}this.scene=null,this.camera=null,this.renderer=null,this.controls=null,this.models=[],this.container=null,console.log("[BimEngine] Engine disposal completed")}clearScene(e){e&&([...e.children].forEach(t=>{this.clearScene(t)}),e.parent&&e.parent.remove(e),e instanceof rt&&(e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(t=>this.disposeMaterial(t)):this.disposeMaterial(e.material))),e instanceof $i&&(e.geometry&&e.geometry.dispose(),e.material&&this.disposeMaterial(e.material)),e instanceof Wp&&(e.geometry&&e.geometry.dispose(),e.material&&this.disposeMaterial(e.material)),e instanceof Ut&&(e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(t=>this.disposeMaterial(t)):this.disposeMaterial(e.material)),e.instanceMatrix&&(e.instanceMatrix=null),e.instanceColor&&(e.instanceColor=null)),e instanceof Eh&&e.material&&this.disposeMaterial(e.material))}disposeMaterial(e){e&&(["map","lightMap","bumpMap","normalMap","specularMap","envMap","alphaMap","aoMap","displacementMap","emissiveMap","gradientMap","metalnessMap","roughnessMap","clearcoatMap","clearcoatNormalMap","clearcoatRoughnessMap","transmissionMap","thicknessMap","sheenColorMap","sheenRoughnessMap","specularIntensityMap","specularColorMap","iridescenceMap","iridescenceThicknessMap"].forEach(t=>{const n=e[t];n&&n instanceof Ft&&n.dispose()}),e.dispose())}}function gC(s){return new mC(s)}class hs{engine=null;registry;container;containerId;options;_isInitialized=!1;_isDestroyed=!1;unsubscribeTheme=null;currentMeasureType=null;isMeasureActive=!1;currentSectionMode=null;selectedComponent=null;constructor(e,t){this.registry=t,this.container=e.container,this.container.id?this.containerId=this.container.id:(this.containerId=`engine-container-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,this.container.id=this.containerId),this.options={backgroundColor:"linear-gradient(to bottom, rgb(214, 224, 235), rgb(246, 250, 255))",version:e.version??"v2",showStats:e.showStats??!1,showViewCube:e.showViewCube??!0}}init(){if(this._isInitialized){console.warn("[Engine] Engine already initialized.");return}if(this._isDestroyed){console.error("[Engine] Cannot initialize destroyed engine.");return}try{typeof this.options.backgroundColor=="string"&&(this.container.style.background=this.options.backgroundColor);const e={containerId:this.containerId,backgroundColor:this.options.backgroundColor,version:this.options.version,showStats:this.options.showStats,showViewCube:this.options.showViewCube};if(console.log("引擎配置信息:",e),this.engine=gC(e),!this.engine)throw new Error("Failed to create engine instance");this._isInitialized=!0,this.unsubscribeTheme=ot.subscribe(t=>{this.setTheme(t)}),this.setTheme(ot.getTheme()),this.engine.events.on("click",t=>{const n=this.registry;t&&t.object?(this.selectedComponent={url:t.object.url,id:t.object.name},console.log("[Engine] 构件选中:",this.selectedComponent),n.emit("component:selected",this.selectedComponent)):(this.selectedComponent=null,console.log("[Engine] 取消选中"),n.emit("component:deselected",{}))})}catch(e){throw console.error("[Engine] Failed to initialize engine:",e),this._isInitialized=!1,e}}setTheme(e){}setLocales(){}isInitialized(){return this._isInitialized}loadModel(e,t){if(!this._isInitialized||!this.engine){console.error("[Engine] Engine not initialized. Please call init() first.");return}if(!e||e.length===0){console.error("[Engine] Model URLs are required.");return}this.engine.loaderModule.loadModels(e,t)}CameraGoHome(){this.engine.viewCube.CameraGoHome()}onRawEvent(e,t){this.engine?.events?.on(e,t)}offRawEvent(e,t){this.engine?.events?.off(e,t)}pauseRendering(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.pauseRendering()}resumeRendering(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.resumeRendering()}dispose(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.dispose()}resize(){!this._isInitialized||this.engine}activateMeasure(e){if(!this._isInitialized||!this.engine?.measure){console.error("[Engine] Cannot activate measure: engine not initialized.");return}if(this.currentMeasureType===e){console.log(`[Engine] Measure ${e} already active, skipping.`);return}this.isMeasureActive||(console.log("[Engine] Activating measure module"),this.engine.measure.active(),this.isMeasureActive=!0),console.log(`[Engine] Activating measure: ${e}`);const t=this.engine.measure;switch(e){case"clearHeight":t.clearHeightMeasure.active();break;case"clearDistance":t.clearDistanceMeasure.active();break;case"distance":t.distanceMeasure.active();break;case"elevation":t.elevationMeasure.active();break;case"point":t.pointMeasure.active();break;case"angle":t.angleMeasure.active();break;case"area":t.areaMeasure.active();break;case"slope":t.slopeMeasure.active();break;default:console.error(`[Engine] Unknown measure type: ${e}`);return}this.currentMeasureType=e}getCurrentMeasureType(){return this.currentMeasureType}deactivateMeasure(){!this._isInitialized||!this.engine?.measure||(console.log("[Engine] Deactivating measure"),this.engine.measure.disActive(),this.engine.measure.clearAll(),this.isMeasureActive=!1,this.currentMeasureType=null)}clearAllMeasures(){!this._isInitialized||!this.engine?.measure||(console.log("[Engine] Clearing all measures"),this.engine.measure.clearAll())}saveMeasureSetting(e){!this._isInitialized||!this.engine?.measure||this.engine.measure.saveSetting?.(e)}setClearHeightDirection(e){!this._isInitialized||!this.engine?.measure||(console.log(`[Engine] Setting clearHeight direction: ${e}`),this.engine.measure.clearHeightMeasure.setDirection(e))}setClearHeightSelectType(e){!this._isInitialized||!this.engine?.measure||(console.log(`[Engine] Setting clearHeight selectType: ${e}`),this.engine.measure.clearHeightMeasure.setSelectType(e))}activeSection(e){if(!this._isInitialized||!this.engine?.clipping){console.error("[Engine] Cannot activate section: engine not initialized.");return}if(this.currentSectionMode===e){console.log(`[Engine] Section ${e} already active, skipping.`);return}console.log(`[Engine] Activating section: ${e}`),this.engine.clipping.active(e),this.currentSectionMode=e}getCurrentSectionMode(){return this.currentSectionMode}setSectionBoxRange(e){if(!this._isInitialized||!this.engine?.clipping){console.error("[Engine] Cannot set section box range: engine not initialized.");return}this.engine.clipping.updateClippingValue(e)}deactivateSection(){!this._isInitialized||!this.engine?.clipping||(console.log("[Engine] Deactivating all sections"),this.engine.clipping.disActive(),this.currentSectionMode=null)}hideSection(){if(!this._isInitialized||!this.engine?.clipping){console.error("[Engine] Cannot hide section: engine not initialized.");return}console.log("[Engine] Hiding section"),this.engine.clipping.disabled()}recoverSection(){if(!this._isInitialized||!this.engine?.clipping){console.error("[Engine] Cannot recover section: engine not initialized.");return}console.log("[Engine] Recovering section"),this.engine.clipping.recover()}fitSectionBoxToModel(){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot fit section box: engine not initialized.");return}const e=this.engine.engineStatus?.highlightModels;e&&(console.log("[Engine] Fitting section box to model"),this.engine.clipping?.clippingModel(e))}scaleSectionBox(){if(!this._isInitialized||!this.engine?.clipping){console.error("[Engine] Cannot scale section box: engine not initialized.");return}this.engine.clipping.scaleBox()}reverseSection(){if(!this._isInitialized||!this.engine?.clipping){console.error("[Engine] Cannot reverse section: engine not initialized.");return}this.engine.clipping.reverse()}getRenderMode(){return!this._isInitialized||!this.engine?.engineModelModule?"balance":this.engine.engineModelModule.getCurrentMode()}setRenderMode(e){if(!this._isInitialized||!this.engine?.engineModelModule){console.warn("[Engine] Cannot set render mode: engine not initialized.");return}try{this.engine.engineModelModule.setMode(e)}catch(t){console.warn("[Engine] Failed to set render mode:",t)}}activeModelEdge(){if(!this._isInitialized||!this.engine?.modelEdge){console.warn("[Engine] Cannot active model edge: engine not initialized.");return}this.engine.modelEdge.active()}disActiveModelEdge(){!this._isInitialized||!this.engine?.modelEdge||this.engine.modelEdge.disActive()}getModelEdgeActive(){return!this._isInitialized||!this.engine?.modelEdge?!1:this.engine.modelEdge.getActive?.()??!1}setAmbientLightIntensity(e){if(!this._isInitialized||!this.engine?.setting){console.warn("[Engine] Cannot set ambient light intensity: engine not initialized.");return}this.engine.setting.setAmbientLightIntensity(e)}getAmbientLightIntensity(){return!this._isInitialized||!this.engine?.setting?50:this.engine.setting.getAmbientLightIntensity?.()??50}setSceneContrast(e){if(!this._isInitialized||!this.engine?.setting){console.warn("[Engine] Cannot set scene contrast: engine not initialized.");return}this.engine.setting.setSceneContrast(e)}getSceneContrast(){return!this._isInitialized||!this.engine?.setting?50:this.engine.setting.getSceneContrast?.()??50}setSceneSaturation(e){if(!this._isInitialized||!this.engine?.setting){console.warn("[Engine] Cannot set scene saturation: engine not initialized.");return}this.engine.setting.setSceneSaturation(e)}getSceneSaturation(){return!this._isInitialized||!this.engine?.setting?50:this.engine.setting.getSceneSaturation?.()??50}getHDRBackgroundList(){return!this._isInitialized||!this.engine?.setting?[]:this.engine.setting.getHDRBackground?.()??[]}setHDRBackgroundId(e){if(!this._isInitialized||!this.engine?.setting){console.warn("[Engine] Cannot set HDR background: engine not initialized.");return}this.engine.setting.setHDRBackgroundId(e)}getHDRBackgroundId(){return!this._isInitialized||!this.engine?.setting?"":this.engine.setting.getHDRBackgroundId?.()??""}setHDRBackgroundVisibility(e){if(!this._isInitialized||!this.engine?.setting){console.warn("[Engine] Cannot set HDR background visibility: engine not initialized.");return}this.engine.setting.setHDRBackgroundVisibility(e)}getHDRBackgroundVisibility(){return!this._isInitialized||!this.engine?.setting?!0:this.engine.setting.getHDRBackgroundVisibility?.()??!0}getGroundList(){return!this._isInitialized||!this.engine?.setting?[]:this.engine.setting.getGroundList?.()??[]}setGroundId(e){if(!this._isInitialized||!this.engine?.setting){console.warn("[Engine] Cannot set ground: engine not initialized.");return}this.engine.setting.setGroundId(e)}getGroundId(){return!this._isInitialized||!this.engine?.setting?"":this.engine.setting.getGroundId?.()??""}setGroundElevation(e){if(!this._isInitialized||!this.engine?.setting){console.warn("[Engine] Cannot set ground elevation: engine not initialized.");return}this.engine.setting.setGroundElevation(e)}getGroundElevation(){return!this._isInitialized||!this.engine?.setting?0:this.engine.setting.getGroundElevation?.()??0}isWalkModeActive=!1;activateFirstPersonMode(){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot activate first person mode: engine not initialized.");return}if(!this.engine.controlModule){console.error("[Engine] Control module not available.");return}if(this.isWalkModeActive){console.log("[Engine] First person mode already active, skipping.");return}console.log("[Engine] Activating first person mode"),this.engine.controlModule.switchFirstPersonMode(),this.loadWalkSettings(),this.isWalkModeActive=!0}deactivateFirstPersonMode(){!this._isInitialized||!this.engine?.controlModule||this.isWalkModeActive&&(console.log("[Engine] Deactivating first person mode"),this.engine.controlModule.switchDefaultMode(),this.isWalkModeActive=!1)}static WALK_SPEED_KEY="bim-walk-speed";static WALK_GRAVITY_KEY="bim-walk-gravity";static WALK_COLLISION_KEY="bim-walk-collision";setWalkSpeed(e){if(!this._isInitialized||!this.engine?.controlModule){console.error("[Engine] Cannot set walk speed: engine not initialized.");return}localStorage.setItem(hs.WALK_SPEED_KEY,String(e)),this.engine.controlModule.setMoveSpeed(e)}setWalkGravity(e){if(!this._isInitialized||!this.engine?.controlModule){console.error("[Engine] Cannot set walk gravity: engine not initialized.");return}localStorage.setItem(hs.WALK_GRAVITY_KEY,String(e)),this.engine.controlModule.setApplyGravity(e)}setWalkCollision(e){if(!this._isInitialized||!this.engine?.controlModule){console.error("[Engine] Cannot set walk collision: engine not initialized.");return}localStorage.setItem(hs.WALK_COLLISION_KEY,String(e)),this.engine.controlModule.setApplyCollision(e)}loadWalkSettings(){if(!this.engine?.controlModule)return;const e=localStorage.getItem(hs.WALK_SPEED_KEY),t=localStorage.getItem(hs.WALK_GRAVITY_KEY),n=localStorage.getItem(hs.WALK_COLLISION_KEY);this.engine.controlModule.setMoveSpeed(e?Number(e):1),this.engine.controlModule.setApplyGravity(t==="true"),this.engine.controlModule.setApplyCollision(n==="true")}toggleMiniMap(){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot toggle mini map: engine not initialized.");return}this.engine.minMap?.toggle()}getMiniMapState(){return!this._isInitialized||!this.engine?!1:this.engine.minMap?.getState()??!1}isFirstPersonModeActive(){return this.isWalkModeActive}getSelectedComponent(){return this.selectedComponent}getComponentProperties(e,t,n){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot get component properties: engine not initialized.");return}if(!this.engine.modelProperties){console.error("[Engine] modelProperties not available");return}console.log("[Engine] Getting component properties:",{url:e,id:t}),this.engine.modelProperties.getModelProperties(e,t,n)}getTypeTreeData(){return!this._isInitialized||!this.engine?.modelTree?[]:this.engine.modelTree.getTypeTreeData()}getLevelTreeData(){return!this._isInitialized||!this.engine?.modelTree?[]:this.engine.modelTree.getLevelTreeData()}getMajorTreeData(){return!this._isInitialized||!this.engine?.modelTree?[]:this.engine.modelTree.getMajorTreeData()}activateZoomBox(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.rangeScale?.active()}getEngineInfo(){return!this._isInitialized||!this.engine?(console.warn("[Engine] Engine not initialized."),null):this.engine.engineInfo.getEngineInfo()}pathRoamingAddPoint(){if(!this._isInitialized||!this.engine?.pathRoaming){console.warn("[Engine] pathRoaming not available");return}this.engine.pathRoaming.addPoint(0)}pathRoamingRemovePoint(e){if(!this._isInitialized||!this.engine?.pathRoaming){console.warn("[Engine] pathRoaming not available");return}this.engine.pathRoaming.removePoint(e)}pathRoamingClearPoints(){if(!this._isInitialized||!this.engine?.pathRoaming){console.warn("[Engine] pathRoaming not available");return}this.engine.pathRoaming.clearPoints()}pathRoamingGetPoints(){return!this._isInitialized||!this.engine?.pathRoaming?(console.warn("[Engine] pathRoaming not available"),[]):this.engine.pathRoaming.getPoints()??[]}pathRoamingJumpToPoint(e){if(!this._isInitialized||!this.engine?.pathRoaming){console.warn("[Engine] pathRoaming not available");return}this.engine.pathRoaming.jumpToPoint(e)}pathRoamingPlay(e){if(!this._isInitialized||!this.engine?.pathRoaming){console.warn("[Engine] pathRoaming not available");return}this.engine.pathRoaming.play(e)}pathRoamingStop(){if(!this._isInitialized||!this.engine?.pathRoaming){console.warn("[Engine] pathRoaming not available");return}this.engine.pathRoaming.stop()}getHighlightModels(){return!this._isInitialized||!this.engine?null:this.engine.engineStatus?.highlightModels??null}highlightModel(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot highlight model: engine not initialized.");return}const t=this.sanitizeModelParams(e);if(t.length)try{this.engine.modelToolModule.highlightModel(t)}catch(n){console.warn("[Engine] highlightModel failed:",n)}}unhighlightAllModels(){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot unhighlight models: engine not initialized.");return}this.engine.modelToolModule.unhighlightAllModels()}viewScaleToModel(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot view scale to model: engine not initialized.");return}const t=this.sanitizeModelParams(e);if(t.length)try{this.engine.modelToolModule.viewScaleToModel(t)}catch(n){console.warn("[Engine] viewScaleToModel failed:",n)}}hideModels(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot hide models: engine not initialized.");return}const t=this.sanitizeModelParams(e);if(t.length)try{this.engine.modelToolModule.hideModel(t)}catch(n){console.warn("[Engine] hideModels failed:",n)}}showModel(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot show model: engine not initialized.");return}const t=this.sanitizeModelParams(e);if(t.length)try{this.engine.modelToolModule.showModel(t)}catch(n){console.warn("[Engine] showModel failed:",n)}}sanitizeModelParams(e){if(!Array.isArray(e))return[];const t=a=>a.replace(/\/+$/,""),n=Array.isArray(this.engine?.models)?this.engine.models:[],i=new Map;for(const a of n)a?.url&&i.set(t(a.url),a);const r=[];for(const a of e){if(!a||typeof a.url!="string"||!a.url||!Array.isArray(a.ids))continue;const o=i.get(t(a.url));if(!o||!(o.nodesMap instanceof Map))continue;const l=new Set;for(const h of a.ids){if(!Number.isFinite(h))continue;const u=Number(h);if(!Number.isInteger(u))continue;const p=o.nodesMap.get(u);!p||!Array.isArray(p.indexes)||p.indexes.length===0||l.add(u)}const c=Array.from(l);c.length&&r.push({url:a.url,ids:c})}return r}translucentModels(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot translucent models: engine not initialized.");return}e&&this.engine.modelToolModule.translucentModel(e)}unTranslucentModel(){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot cancel translucent: engine not initialized.");return}this.engine.modelToolModule.unTranslucentModel()}isolateModels(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot isolate models: engine not initialized.");return}e&&this.engine.modelToolModule.isolateModel(e)}translucentOtherModels(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot translucent other models: engine not initialized.");return}e&&this.engine.modelToolModule.translucentOtherModel(e)}showAllModels(){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot show all models: engine not initialized.");return}this.deactivateSection(),this.engine.modelToolModule.showAllModels()}batchSelectSameTypeModel(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot batch select: engine not initialized.");return}e&&this.engine.modelToolModule.batchSelectSameTypeModel(e)}batchSelectSameLevelModel(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot batch select: engine not initialized.");return}e&&this.engine.modelToolModule.batchSelectSameLevelModel(e)}batchSelectSameLevelTypeModel(e){if(!this._isInitialized||!this.engine?.modelToolModule){console.warn("[Engine] Cannot batch select: engine not initialized.");return}e&&this.engine.modelToolModule.batchSelectSameLevelTypeModel(e)}destroy(){this._isDestroyed||(this.deactivateMeasure(),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.engine&&(this.engine.dispose(),this.engine=null),this.container.innerHTML="",this.currentMeasureType=null,this.isMeasureActive=!1,this._isDestroyed=!0,this._isInitialized=!1)}}class xC{element;content=null;isVisible=!1;onCloseCallback;options;mouseDownTime=0;mouseDownX=0;mouseDownY=0;CLICK_THRESHOLD=200;MOVE_THRESHOLD=5;constructor(e){this.options=e,this.element=document.createElement("div"),this.element.className=`bim-right-key ${e?.className||""}`,e?.zIndex&&(this.element.style.zIndex=e.zIndex.toString()),document.body.appendChild(this.element)}init(){document.addEventListener("mousedown",this.handleGlobalClick),this.element.addEventListener("contextmenu",e=>{e.preventDefault(),e.stopPropagation()}),this.options?.container&&(this.options.container.addEventListener("mousedown",this.handleContainerMouseDown),this.options.container.addEventListener("mouseup",this.handleContainerMouseUp),this.options.container.addEventListener("contextmenu",this.handleContainerContextMenu))}setTheme(e){}setLocales(){}destroy(){document.removeEventListener("mousedown",this.handleGlobalClick),this.options?.container&&(this.options.container.removeEventListener("mousedown",this.handleContainerMouseDown),this.options.container.removeEventListener("mouseup",this.handleContainerMouseUp),this.options.container.removeEventListener("contextmenu",this.handleContainerContextMenu)),this.unmountContent(),this.element.remove()}handleContainerMouseDown=e=>{e.button===2&&(this.mouseDownTime=Date.now(),this.mouseDownX=e.clientX,this.mouseDownY=e.clientY)};handleContainerMouseUp=e=>{if(e.button!==2||Date.now()-this.mouseDownTime>this.CLICK_THRESHOLD)return;const n=e.clientX-this.mouseDownX,i=e.clientY-this.mouseDownY;n*n+i*i>this.MOVE_THRESHOLD*this.MOVE_THRESHOLD||this.options?.onContext&&this.options.onContext(e)};handleContainerContextMenu=e=>{e.preventDefault()};setOnClose(e){this.onCloseCallback=e}mount(e){this.unmountContent(),this.content=e,this.element.appendChild(e.getElement())}unmountContent(){this.content&&(this.content.destroy(),this.element.innerHTML="",this.content=null)}show(e,t){this.element.classList.add("visible"),this.isVisible=!0,this.element.style.left=`${e}px`,this.element.style.top=`${t}px`;const n=this.element.getBoundingClientRect(),i=window.innerWidth,r=window.innerHeight;let a=e,o=t;e+n.width>i&&(a=e-n.width),t+n.height>r&&(o=t-n.height),this.element.style.left=`${a}px`,this.element.style.top=`${o}px`}hide(){this.element.classList.remove("visible"),this.isVisible=!1,this.unmountContent(),this.onCloseCallback&&this.onCloseCallback()}handleGlobalClick=e=>{this.isVisible&&(this.element.contains(e.target)||this.hide())}}class gd{element;options;unsubscribeLocale=null;unsubscribeTheme=null;activeSubMenu=null;constructor(e){this.options=e,this.element=document.createElement("ul"),this.element.className="bim-menu"}init(){this.render(),this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)})}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-divider",e.divider),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-shadow-lg",e.shadowLg)}setLocales(){this.element.innerHTML="",this.render()}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.closeSubMenu(),this.element.remove()}getElement(){return this.element}hasAnyIcon(e){return e.some(t=>t.icon?!0:t.children?this.hasAnyIcon(t.children):!1)}render(){const{items:e,groupOrder:t}=this.options;this.hasAnyIcon(e)?this.element.classList.add("has-icons"):this.element.classList.remove("has-icons");const n=new Map,i="default";e.forEach(a=>{const o=a.group||i;n.has(o)||n.set(o,[]),n.get(o).push(a)});let r=[];if(t){r=t.filter(a=>n.has(a));for(const a of n.keys())r.includes(a)||r.push(a)}else r=Array.from(n.keys());r.forEach((a,o)=>{if(o>0){const c=document.createElement("li");c.className="bim-menu-divider",this.element.appendChild(c)}const l=n.get(a);l.sort((c,h)=>(c.order||0)-(h.order||0)),l.forEach(c=>{if(c.visible!==!1&&(this.element.appendChild(this.createItemElement(c)),c.divider)){const h=document.createElement("li");h.className="bim-menu-divider",this.element.appendChild(h)}})})}createItemElement(e){const t=document.createElement("li"),n=!e.disabled;t.className=`bim-menu-item ${n?"":"disabled"}`;const i=document.createElement("div");i.className="bim-menu-item-icon",e.icon&&(i.innerHTML=e.icon),t.appendChild(i);const r=document.createElement("div");r.className="bim-menu-item-label",r.textContent=xe(e.label),t.appendChild(r);const a=e.children,o=a&&a.length>0;if(o){const l=document.createElement("div");l.className="bim-menu-item-arrow",l.innerHTML='',t.appendChild(l),t.addEventListener("mouseenter",()=>this.openSubMenu(e,t))}else t.addEventListener("mouseenter",()=>this.closeSubMenu());return n&&t.addEventListener("click",l=>{l.stopPropagation(),console.log(`[BimMenu] Clicked item: ${e.id}`),o||(e.onClick?(console.log(`[BimMenu] Executing onClick for ${e.id}`),e.onClick()):console.warn(`[BimMenu] No onClick handler for ${e.id}`))}),t}openSubMenu(e,t){const n=e.children;if(!n||n.length===0)return;this.closeSubMenu();const i=document.createElement("div");i.style.position="fixed",i.style.zIndex="10001";const r=t.getBoundingClientRect();i.style.top=`${r.top}px`,i.style.left=`${r.right}px`,i.addEventListener("mousedown",l=>l.stopPropagation());const a=new gd({items:n});a.init(),i.appendChild(a.element),document.body.appendChild(i),this.activeSubMenu={menu:a,container:i};const o=i.getBoundingClientRect();o.right>window.innerWidth&&(i.style.left=`${r.left-o.width}px`)}closeSubMenu(){this.activeSubMenu&&(this.activeSubMenu.menu.destroy(),this.activeSubMenu.container.remove(),this.activeSubMenu=null)}}class Q0 extends xi{container;rightKeyPanel;contextHandlers=[];constructor(e,t){super(t),this.container=e,this.rightKeyPanel=new xC({zIndex:9e3,container:this.container,onContext:this.handleContextMenu}),this.rightKeyPanel.init()}destroy(){this.rightKeyPanel.destroy(),super.destroy()}registerHandler(e){this.contextHandlers.push(e)}showMenu(e,t,n,i){if(!n||n.length===0)return;const r=new gd({items:n,groupOrder:i});r.init(),this.rightKeyPanel.mount(r),this.rightKeyPanel.show(e,t)}hide(){this.rightKeyPanel.hide()}handleContextMenu=e=>{let t=null;for(const n of this.contextHandlers){const i=n(e);i&&i.length>0&&(t||(t=[]),t=t.concat(i))}t&&t.length>0?this.showMenu(e.clientX,e.clientY,t):this.hide()}}class vC extends xi{container;engineInstance=null;rightKey=null;constructor(e,t){super(t),this.container=e}getEngineComponent(){return this.engineInstance}initialize(e){this.engineInstance&&this.engineInstance.isInitialized()&&(console.warn("[EngineManager] 3D Engine already initialized. Destroying old instance..."),this.engineInstance.destroy(),this.engineInstance=null);try{return this.engineInstance=new hs({container:this.container,...e},this.registry),this.engineInstance.init(),this.rightKey=new Q0(this.container,this.registry),this.rightKey.registerHandler(t=>{const n=this.engineInstance?.getSelectedComponent(),i=[];return n&&(i.push({id:"componentDetail",label:"menu.componentDetail",group:"component",order:1,divider:!0,onClick:()=>{this.registry.componentDetail?.show(),this.rightKey?.hide()}}),i.push({id:"hideSelected",label:"menu.hideSelected",group:"component",order:2,onClick:()=>{const r=this.engineInstance?.getHighlightModels();r&&this.engineInstance?.hideModels(r),this.rightKey?.hide()}}),i.push({id:"transparentSelected",label:"menu.transparentSelected",group:"component",order:3,onClick:()=>{const r=this.engineInstance?.getHighlightModels();r&&this.engineInstance?.translucentModels(r),this.rightKey?.hide()}}),i.push({id:"cancelTranslucent",label:"menu.cancelTranslucent",group:"component",order:4,onClick:()=>{this.engineInstance?.unTranslucentModel(),this.rightKey?.hide()}}),i.push({id:"isolateSelected",label:"menu.isolateSelected",group:"component",order:5,divider:!0,children:[{id:"hideOthers",label:"menu.hideOthers",onClick:()=>{const r=this.engineInstance?.getHighlightModels();r&&this.engineInstance?.isolateModels(r),this.rightKey?.hide()}},{id:"transparentOthers",label:"menu.transparentOthers",onClick:()=>{const r=this.engineInstance?.getHighlightModels();r&&this.engineInstance?.translucentOtherModels(r),this.rightKey?.hide()}}]}),i.push({id:"quickSelect",label:"menu.quickSelect",group:"component",order:6,children:[{id:"selectSameType",label:"menu.selectSameType",onClick:()=>{const r=this.engineInstance?.getHighlightModels();r&&this.engineInstance?.batchSelectSameTypeModel(r),this.rightKey?.hide()}},{id:"selectSameLevel",label:"menu.selectSameLevel",onClick:()=>{const r=this.engineInstance?.getHighlightModels();r&&this.engineInstance?.batchSelectSameLevelModel(r),this.rightKey?.hide()}},{id:"selectSameLevelType",label:"menu.selectSameLevelType",onClick:()=>{const r=this.engineInstance?.getHighlightModels();r&&this.engineInstance?.batchSelectSameLevelTypeModel(r),this.rightKey?.hide()}}]}),i.push({id:"fitSectionBox",label:"menu.fitSectionBox",group:"component",order:7,onClick:()=>{this.engineInstance?.fitSectionBoxToModel(),this.rightKey?.hide()}})),i.push({id:"showAll",label:"menu.showAll",group:"component",order:8,onClick:()=>{this.engineInstance?.showAllModels(),this.emit("menu:show-all",{}),this.rightKey?.hide()}}),i}),this.engineInstance.isInitialized()}catch(t){return console.error("[EngineManager] Failed to initialize 3D engine:",t),this.engineInstance=null,!1}}isInitialized(){return this.engineInstance!==null&&this.engineInstance.isInitialized()}loadModel(e,t){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.loadModel(e,t)}pauseRendering(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.pauseRendering()}resumeRendering(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.resumeRendering()}destroy(){this.engineInstance&&(this.engineInstance.destroy(),this.engineInstance=null),this.rightKey&&(this.rightKey.destroy(),this.rightKey=null),super.destroy()}}var Mt=(s=>(s[s.Unchecked=0]="Unchecked",s[s.Checked=1]="Checked",s[s.Indeterminate=2]="Indeterminate",s))(Mt||{});class bC{config;element;children=[];parent=null;checkState=Mt.Unchecked;contentEl;switcherEl;checkboxEl=null;titleEl;actionsEl;childrenContainer;onExpandChange;onCheckChange;onNodeClick;renderActions;constructor(e,t,n){this.config=e,this.onExpandChange=n.onExpand,this.onCheckChange=n.onCheck,this.onNodeClick=n.onClick,this.renderActions=t.renderActions,this.checkState=e.checked?Mt.Checked:Mt.Unchecked,this.element=this.createDom(t)}createDom(e){const t=document.createElement("div");t.className="bim-tree-node",this.config.disabled&&t.classList.add("is-disabled"),this.contentEl=document.createElement("div"),this.contentEl.className="bim-tree-node-content",this.switcherEl=document.createElement("span"),this.switcherEl.className="bim-tree-switcher",this.switcherEl.innerHTML='';const n=this.config.children&&this.config.children.length>0;if(n?this.config.expanded&&this.switcherEl.classList.add("is-expanded"):this.switcherEl.classList.add("is-hidden"),this.switcherEl.addEventListener("click",r=>{r.stopPropagation(),this.toggleExpand()}),this.contentEl.appendChild(this.switcherEl),e.checkable!==!1&&(this.checkboxEl=document.createElement("span"),this.checkboxEl.className="bim-tree-checkbox",this.updateCheckboxUI(),this.checkboxEl.addEventListener("click",r=>{r.stopPropagation(),!this.config.disabled&&this.toggleCheck()}),this.contentEl.appendChild(this.checkboxEl)),this.config.icon){const r=document.createElement("span");r.className="bim-tree-icon",r.innerHTML=this.config.icon.includes("`,this.contentEl.appendChild(r)}this.titleEl=document.createElement("span"),this.titleEl.className="bim-tree-title",this.updateLabel(),this.contentEl.appendChild(this.titleEl),this.actionsEl=document.createElement("div"),this.actionsEl.className="bim-tree-node-actions",this.actionsEl.addEventListener("click",r=>{r.stopPropagation()}),this.contentEl.appendChild(this.actionsEl),this.contentEl.addEventListener("click",r=>{if(r.stopPropagation(),this.config.disabled)return;(this.config.clickAction||"select")==="expand"?this.toggleExpand():this.onNodeClick(this)}),t.appendChild(this.contentEl),this.childrenContainer=document.createElement("div"),this.childrenContainer.className="bim-tree-children";const i=e.indent||24;return this.childrenContainer.style.paddingLeft=`${i}px`,this.config.expanded&&n&&this.childrenContainer.classList.add("is-visible"),t.appendChild(this.childrenContainer),t}setSelected(e){if(e){if(this.contentEl.classList.add("is-selected"),this.renderActions){const t=this.renderActions(this.config);this.actionsEl.innerHTML="",typeof t=="string"?this.actionsEl.innerHTML=t:t instanceof HTMLElement&&this.actionsEl.appendChild(t)}}else this.contentEl.classList.remove("is-selected"),this.actionsEl.innerHTML=""}updateLabel(){this.titleEl&&(this.titleEl.textContent=this.config.label)}toggleExpand(e){if(!this.config.children||this.config.children.length===0)return;const t=e!==void 0?e:!this.config.expanded;this.config.expanded=t,t?(this.switcherEl.classList.add("is-expanded"),this.childrenContainer.classList.add("is-visible")):(this.switcherEl.classList.remove("is-expanded"),this.childrenContainer.classList.remove("is-visible")),e===void 0&&this.onExpandChange(this)}toggleCheck(){const e=this.checkState!==Mt.Checked;this.setChecked(e?Mt.Checked:Mt.Unchecked,!0)}setChecked(e,t=!1,n=!1){!n&&this.checkState===e||(this.checkState=e,this.config.checked=e===Mt.Checked,this.updateCheckboxUI(),t&&this.onCheckChange(this))}updateCheckboxUI(){this.checkboxEl&&(this.checkboxEl.classList.remove("is-checked","is-indeterminate"),this.checkState===Mt.Checked?this.checkboxEl.classList.add("is-checked"):this.checkState===Mt.Indeterminate&&this.checkboxEl.classList.add("is-indeterminate"))}appendChild(e){e.parent=this,this.children.push(e),this.childrenContainer.appendChild(e.element),this.children.length===1&&this.switcherEl.classList.remove("is-hidden")}destroy(){this.children.forEach(e=>e.destroy()),this.children=[],this.element.remove(),this.parent=null}}class yC{element;contentElement;searchInput=null;searchResults=null;options;nodeMap=new Map;rootNodes=[];selectedNode=null;lastRevealedNodeId=null;unsubscribeLocale=null;unsubscribeTheme=null;clickOutsideHandler=null;onNodeCheck;onNodeSelect;onNodeDeselect;onNodeExpand;constructor(e){this.options={checkable:!0,checkStrictly:!0,indent:24,defaultExpandAll:!0,enableSearch:!1,searchPlaceholder:"tree.searchPlaceholder",...e},this.element=document.createElement("div"),this.element.className="bim-tree",this.options.enableSearch&&this.createSearchDOM(),this.contentElement=document.createElement("div"),this.contentElement.className="bim-tree-content",this.element.appendChild(this.contentElement),e.onNodeCheck&&(this.onNodeCheck=e.onNodeCheck),e.onNodeSelect&&(this.onNodeSelect=e.onNodeSelect),e.onNodeDeselect&&(this.onNodeDeselect=e.onNodeDeselect),e.onNodeExpand&&(this.onNodeExpand=e.onNodeExpand)}createSearchDOM(){const e=document.createElement("div");e.className="bim-tree-search";const t=document.createElement("div");t.className="bim-tree-search-wrapper";const n=document.createElement("span");n.className="bim-tree-search-icon",n.innerHTML='',t.appendChild(n),this.searchInput=document.createElement("input"),this.searchInput.className="bim-tree-search-input",this.searchInput.type="text",this.searchInput.placeholder=xe(this.options.searchPlaceholder||"搜索..."),this.searchInput.addEventListener("input",i=>{const r=i.target.value;this.handleSearch(r)}),t.appendChild(this.searchInput),e.appendChild(t),this.searchResults=document.createElement("div"),this.searchResults.className="bim-tree-search-results",e.appendChild(this.searchResults),this.element.appendChild(e),this.clickOutsideHandler=i=>{this.searchResults&&!this.searchResults.contains(i.target)&&!this.searchInput?.contains(i.target)&&this.searchResults.classList.remove("is-visible")},document.addEventListener("click",this.clickOutsideHandler)}init(){this.render(),this.unsubscribeLocale=Qt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=ot.subscribe(e=>this.setTheme(e)),this.setTheme(ot.getTheme())}handleSearch(e){if(!this.searchResults)return;if(!e.trim()){this.searchResults.classList.remove("is-visible"),this.searchResults.innerHTML="";return}const t=[],n=e.toLowerCase();this.nodeMap.forEach(i=>{const r=i.config.label;r.toLowerCase().includes(n)&&t.push({node:i,label:r,path:this.getNodePath(i)})}),this.renderSearchResults(t)}getNodePath(e){const t=[];let n=e.parent;for(;n;)t.unshift(n.config.label),n=n.parent;return t.join(" > ")}renderSearchResults(e){if(this.searchResults){if(this.searchResults.innerHTML="",e.length===0){const t=document.createElement("div");t.className="bim-tree-search-item",t.style.cursor="default",t.style.color="#999",t.textContent="No results",this.searchResults.appendChild(t)}else e.forEach(t=>{const n=document.createElement("div");n.className="bim-tree-search-item";const i=document.createElement("span");i.className="bim-tree-search-item-title",i.textContent=t.label;const r=document.createElement("span");r.className="bim-tree-search-item-path",r.textContent=t.path,n.appendChild(i),t.path&&n.appendChild(r),n.addEventListener("click",()=>{this.revealNode(t.node)}),this.searchResults.appendChild(n)});this.searchResults.classList.add("is-visible")}}revealNode(e){if(this.lastRevealedNodeId===e.config.id&&this.isNodeFullyVisible(e))return;this.lastRevealedNodeId=e.config.id,this.searchResults&&(this.searchResults.classList.remove("is-visible"),this.searchInput&&(this.searchInput.value=""));let t=e.parent;for(;t;)t.toggleExpand(!0),t=t.parent;this.handleNodeSelect(e),requestAnimationFrame(()=>{requestAnimationFrame(()=>{this.scrollNodeIntoContentCenter(e)})})}isNodeFullyVisible(e){const t=this.contentElement;if(!t||!e?.element?.isConnected)return!1;const n=t.getBoundingClientRect(),i=e.element.getBoundingClientRect();return i.top>=n.top&&i.bottom<=n.bottom}scrollNodeIntoContentCenter(e){const t=this.contentElement;if(!t||!e?.element?.isConnected)return;const n=t.getBoundingClientRect(),i=e.element.getBoundingClientRect();if(i.top>=n.top&&i.bottom<=n.bottom)return;const r=i.top-n.top+t.scrollTop,a=Math.max(0,r-(t.clientHeight-i.height)/2);t.scrollTo({top:a,behavior:"auto"})}setTheme(e){const t=this.element.style;t.setProperty("--bim-primary",e.primary),t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-secondary",e.textSecondary),t.setProperty("--bim-text-tertiary",e.textTertiary),t.setProperty("--bim-text-disabled",e.textDisabled),t.setProperty("--bim-text-inverse",e.textInverse),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-border-disabled",e.borderDisabled),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-component-bg-selected",e.componentBgSelected),t.setProperty("--bim-component-bg-disabled",e.componentBgDisabled),t.setProperty("--bim-shadow-md",e.shadowMd),t.setProperty("--bim-focus-ring",e.focusRing)}setLocales(){this.nodeMap.forEach(e=>e.updateLabel()),this.searchInput&&(this.searchInput.placeholder=xe(this.options.searchPlaceholder||"tree.searchPlaceholder"))}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.clickOutsideHandler&&(document.removeEventListener("click",this.clickOutsideHandler),this.clickOutsideHandler=null),this.rootNodes.forEach(e=>e.destroy()),this.rootNodes=[],this.nodeMap.clear(),this.lastRevealedNodeId=null,this.element.remove(),this.selectedNode=null}render(){this.contentElement.innerHTML="",this.nodeMap.clear(),this.rootNodes=[],this.options.data.forEach(e=>{this.createNodeRecursively(e,null)})}createNodeRecursively(e,t){e.expanded===void 0&&(e.expanded=this.options.defaultExpandAll);const n=new bC(e,this.options,{onExpand:i=>{this.onNodeExpand&&this.onNodeExpand(i)},onCheck:i=>this.handleNodeCheck(i),onClick:i=>this.handleNodeSelect(i)});this.nodeMap.set(e.id,n),t?t.appendChild(n):(this.rootNodes.push(n),this.contentElement.appendChild(n.element)),e.children&&e.children.length>0&&e.children.forEach(i=>{this.createNodeRecursively(i,n)})}handleNodeSelect(e){if(this.selectedNode===e){e.setSelected(!1),this.selectedNode=null,this.onNodeDeselect&&this.onNodeDeselect(e);return}this.selectedNode&&this.selectedNode.setSelected(!1),e.setSelected(!0),this.selectedNode=e,this.onNodeSelect&&this.onNodeSelect(e)}handleNodeCheck(e){const t=e.checkState===Mt.Checked;if(this.onNodeCheck&&this.onNodeCheck(e),this.options.checkStrictly===!1)return;const n=(r,a)=>{r.children.forEach(o=>{o.config.disabled||(o.setChecked(a,!1),n(o,a))})};t?n(e,Mt.Checked):n(e,Mt.Unchecked);let i=e.parent;for(;i;){if(i.config.disabled){i=i.parent;continue}const r=i.children,a=r.every(l=>l.checkState===Mt.Checked),o=r.every(l=>l.checkState===Mt.Unchecked);a?i.setChecked(Mt.Checked,!1):o?i.setChecked(Mt.Unchecked,!1):i.setChecked(Mt.Indeterminate,!1),i=i.parent}}getNode(e){return this.nodeMap.get(e)}checkNode(e,t){const n=this.nodeMap.get(e);n&&n.setChecked(t?Mt.Checked:Mt.Unchecked,!0)}expandAll(e){this.nodeMap.forEach(t=>t.toggleExpand(e))}checkAllNodes(e){const t=e?Mt.Checked:Mt.Unchecked;this.nodeMap.forEach(n=>n.setChecked(t,!1,!0))}getCheckedNodes(e=!1){const t=[];return this.nodeMap.forEach(n=>{(n.checkState===Mt.Checked||e&&n.checkState===Mt.Indeterminate)&&t.push(n.config)}),t}}class eg{element;navElement;contentElement;options;activeId;tabMap=new Map;panelMap=new Map;panelTreeScrollTopMap=new Map;unsubscribeLocale=null;unsubscribeTheme=null;navClickHandler=null;constructor(e){this.options=e,this.activeId=e.activeId||(e.tabs[0]?.id??null),e.tabs.forEach(t=>this.tabMap.set(t.id,t)),this.element=document.createElement("div"),this.element.className="bim-tab",this.navElement=document.createElement("div"),this.navElement.className="bim-tab__nav",this.navElement.setAttribute("role","tablist"),this.element.appendChild(this.navElement),this.contentElement=document.createElement("div"),this.contentElement.className="bim-tab__content",this.element.appendChild(this.contentElement),this.options.container.appendChild(this.element)}init(){this.renderNav(),this.renderPanels(),this.setLocales(),this.setTheme(ot.getTheme()),this.unsubscribeLocale=Qt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=ot.subscribe(e=>this.setTheme(e))}renderNav(){this.navElement.innerHTML="",this.navClickHandler=e=>{const t=e.target.closest(".bim-tab__item");if(!t)return;const n=t.dataset.id;!n||this.tabMap.get(n)?.disabled||this.activateTab(n)},this.navElement.addEventListener("click",this.navClickHandler),this.options.tabs.forEach(e=>{const t=document.createElement("button");if(t.type="button",t.className="bim-tab__item",t.dataset.id=e.id,t.setAttribute("role","tab"),t.id=`tab-${e.id}`,t.setAttribute("aria-selected",`${e.id===this.activeId}`),e.disabled&&(t.disabled=!0,t.setAttribute("aria-disabled","true"),t.classList.add("is-disabled")),e.icon){const i=document.createElement("span");i.className="bim-tab__icon",i.innerHTML=e.icon,t.appendChild(i)}const n=document.createElement("span");n.className="bim-tab__title",n.textContent=this.resolveTitle(e.title),t.appendChild(n),e.id===this.activeId&&t.classList.add("is-active"),this.navElement.appendChild(t)})}renderPanels(){this.contentElement.innerHTML="",this.panelMap.clear(),this.options.tabs.forEach(e=>{const t=document.createElement("div");t.className="bim-tab__panel",t.dataset.id=e.id,t.setAttribute("role","tabpanel"),t.setAttribute("aria-labelledby",`tab-${e.id}`),e.content instanceof HTMLElement?t.appendChild(e.content):typeof e.content=="string"&&(t.innerHTML=e.content),e.id===this.activeId?t.classList.add("is-active"):t.style.display="none",this.panelMap.set(e.id,t),this.contentElement.appendChild(t)})}activateTab(e){if(this.activeId===e)return;const t=this.tabMap.get(e);if(!t||t.disabled)return;this.activeId=e,this.navElement.querySelectorAll(".bim-tab__item").forEach(i=>{const r=i.dataset.id===e;i.classList.toggle("is-active",r),i.setAttribute("aria-selected",`${r}`)}),this.panelMap.forEach((i,r)=>{const a=r===e;a||this.savePanelTreeScrollTop(r,i),i.classList.toggle("is-active",a),i.style.display=a?"":"none",a&&this.restorePanelTreeScrollTop(r,i)}),this.options.onChange&&this.options.onChange(e,t)}setTheme(e){const t=this.element.style;t.setProperty("--bim-tab-bg",e.bgElevated),t.setProperty("--bim-tab-nav-bg",e.bgElevated),t.setProperty("--bim-tab-text",e.textPrimary),t.setProperty("--bim-tab-text-secondary",e.textSecondary),t.setProperty("--bim-tab-text-active",e.primary),t.setProperty("--bim-tab-border",e.borderDefault),t.setProperty("--bim-tab-hover-bg",e.componentBgHover),t.setProperty("--bim-tab-active-bg",e.componentBgActive),t.setProperty("--bim-tab-icon",e.iconDefault)}setLocales(){this.navElement.querySelectorAll(".bim-tab__item").forEach(t=>{const n=t.dataset.id;if(!n)return;const i=this.tabMap.get(n);if(!i)return;const r=t.querySelector(".bim-tab__title");r&&(r.textContent=this.resolveTitle(i.title))})}destroy(){this.navClickHandler&&(this.navElement.removeEventListener("click",this.navClickHandler),this.navClickHandler=null),this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.panelMap.clear(),this.panelTreeScrollTopMap.clear(),this.tabMap.clear(),this.element.remove()}savePanelTreeScrollTop(e,t){const n=t.querySelector(".bim-tree-content");n&&this.panelTreeScrollTopMap.set(e,n.scrollTop)}restorePanelTreeScrollTop(e,t){const n=this.panelTreeScrollTopMap.get(e);if(n===void 0)return;const i=t.querySelector(".bim-tree-content");i&&requestAnimationFrame(()=>{i.scrollTop=n})}resolveTitle(e){try{return xe(e)||e}catch{return e}}}const tg={测量:'',地图:'',框选放大:'',漫游:'',目录树:'',剖切:'',剖切盒:'',全屏:'',设置:'',拾曲面剖切:'',轴向剖切:'',主视角:'',文档:'',第一人称漫游:'',反向:'',路径漫游:'',适应到模型:'',隐藏:'',重置:'',标高:'',距离:'',最小距离:'',激光边距:'',角度:'',坡度:'',体积:'',空间体积:'',close:'',check:'',warning:'',error:'',success:'',plus:'',minus:'',arrowUp:'',arrowUpBold:'',arrowDown:'',arrowLeft:'',arrowRight:'',search:'',refresh:'',delete:'',edit:'',save:'',expand:'',collapse:'',bot:'',history:'',settings:'',loader:'',send:'',default:''};function at(s){const e=tg[s];return e||(console.warn(`[IconManager] Icon "${s}" not found, using default icon`),tg.default)}function ng(s,e){let t=e>>>0;for(let n=0;n>>8&255,t=Math.imul(t,16777619)}return t>>>0}async function _C(s){const e=JSON.stringify(s),t=ng(e,2166136261),n=ng(e,522970236);return`${t.toString(16).padStart(8,"0")}${n.toString(16).padStart(8,"0")}`}function ig(s){const e=new Map,t=i=>{const r=i.config.data,a=r?._modelUrl;if(a&&r?.ids?.length){let o=e.get(a);o||(o=new Set,e.set(a,o));for(const l of r.ids){const c=Number(l);Number.isFinite(c)&&o.add(c)}}for(const o of i.children||[])t(o)};t(s);const n=[];for(const[i,r]of e)r.size>0&&n.push({url:i,ids:Array.from(r)});return n}let MC=0;async function wC(s){if(!s||s.length===0)return[];const e=async(t,n)=>{const i=t.children&&t.children.length>0;let r;return t.ids?.length?r=await _C(t.ids):t.id?r=t.id:r=`node_${++MC}`,{id:r,label:t.name||"未命名",expanded:!1,checked:!0,children:i?await Promise.all(t.children.map(a=>e(a,n))):void 0,data:{...t,_modelUrl:n}}};return Promise.all(s.map(async t=>{const n=t.children&&t.children.length>0,i=t.url;return{id:i,label:t.name||"模型",expanded:!0,checked:!0,children:n?await Promise.all(t.children.map(r=>e(r,i))):void 0,data:{_modelUrl:i}}}))}class SC extends xi{toolbar=null;toolbarContainer=null;container;dialog=null;constructor(e,t){super(t),this.container=e,this.init()}init(){this.toolbarContainer=document.createElement("div"),this.toolbarContainer.id="bim-construct-tree",this.container.appendChild(this.toolbarContainer),this.toolbar=new tc({container:this.toolbarContainer,showLabel:!1,direction:"column",position:"top-left",align:"vertical",expand:"up",registry:this.registry}),this.toolbar.init(),this.toolbar.addGroup("construct-tree"),this.toolbar.addButton({id:"construct-tree-btn",groupId:"construct-tree",type:"button",label:"construct-tree",icon:at("目录树"),onClick:()=>{this.openConstructTreeDialog()}}),this.toolbar.render()}async openConstructTreeDialog(){this.setVisible(!1);const e=this.engineComponent?.getLevelTreeData()??[],t=this.engineComponent?.getTypeTreeData()??[],n=this.engineComponent?.getMajorTreeData()??[];console.log("[ConstructTree] 原始数据 (Level):",e),console.log("[ConstructTree] 原始数据 (Type):",t),console.log("[ConstructTree] 原始数据 (Major):",n);const i=async(f,x)=>{const g=await wC(f);console.log(`[ConstructTree] 转换后数据 (${x}):`,g);const b=new yC({data:g,checkable:!0,indent:0,enableSearch:!0,checkStrictly:!0,defaultExpandAll:!0,onNodeCheck:v=>{const y=ig(v);y.length&&(v.checkState===Mt.Checked?this.engineComponent?.showModel(y):this.engineComponent?.hideModels(y))},onNodeSelect:v=>{const y=ig(v);y.length&&(this.engineComponent?.unhighlightAllModels(),this.engineComponent?.highlightModel(y),this.engineComponent?.viewScaleToModel(y))},onNodeDeselect:()=>{this.engineComponent?.unhighlightAllModels()},onNodeExpand:()=>{this.dialog?.fitWidth()}});return b.init(),b},r=await i(e,"Level"),a=await i(t,"Type"),o=await i(n,"Major"),l=document.createElement("div");l.className="construct-tab__panel-content",l.appendChild(r.element);const c=document.createElement("div");c.className="construct-tab__panel-content",c.appendChild(a.element);const h=document.createElement("div");h.className="construct-tab__panel-content",h.appendChild(o.element);const u=document.createElement("div");u.className="construct-tab__container",u.style.height="100%",u.style.overflow="hidden";const p=()=>{this.engineComponent?.showAllModels(),r.checkAllNodes(!0),a.checkAllNodes(!0),o.checkAllNodes(!0)},d=new eg({container:u,tabs:[{id:"component",title:"tab.component",content:l},{id:"type",title:"tab.type",content:c},{id:"major",title:"tab.major",content:h}],activeId:"component",onChange:()=>{this.dialog?.fitWidth()}});d.init(),p();const m=this.registry.on("menu:show-all",()=>{p()});this.dialog=this.registry.dialog.create({title:"constructTree.title",minWidth:320,height:600,content:u,position:{x:20,y:20},resizable:!1,onClose:()=>{m(),d.destroy(),r.destroy(),a.destroy(),o.destroy(),this.setVisible(!0)}}),this.dialog?.fitWidth()}refresh(){this.toolbar?.render()}destroy(){this.toolbar?.destroy(),this.toolbar=null,super.destroy()}addGroup(e,t){this.toolbar?.addGroup(e,t),this.toolbar?.render()}addButton(e){this.toolbar?.addButton(e),this.toolbar?.render()}setButtonVisibility(e,t){this.toolbar?.updateButtonVisibility(e,t)}setShowLabel(e){this.toolbar?.setShowLabel(e)}setVisible(e){this.toolbarContainer&&(this.toolbarContainer.style.visibility=e?"visible":"hidden")}setBackgroundColor(e){this.toolbar?.setBackgroundColor(e)}setColors(e){this.toolbar?.setColors(e)}}class Gs extends xi{dialog=null;isVisible=!1;constructor(e){super(e)}get dialogWidth(){return 300}get dialogHeight(){return"auto"}get dialogOptions(){return{draggable:!0,resizable:!1}}onDialogClose(){}onDialogCreated(){}onBeforeDestroy(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight,i=this.dialogWidth,r=typeof this.dialogHeight=="number"?this.dialogHeight:300;return{x:t-i-20,y:(n-r)/2}}show(){if(!this.registry.dialog||!this.registry.container){console.warn(`[${this.dialogId}] Dialog manager or container is not initialized`);return}this.dialog&&this.destroyDialog();const e=this.getDialogPosition(),t=this.createContent(),n=this.dialogOptions;this.dialog=this.registry.dialog.create({id:this.dialogId,title:this.dialogTitle,content:t,width:this.dialogWidth,height:this.dialogHeight,position:e,draggable:n.draggable,resizable:n.resizable,onClose:()=>{this.onDialogClose(),this.destroyDialog()}}),this.dialog.init(),this.isVisible=!0,this.onDialogCreated()}hide(){this.destroyDialog()}toggle(){this.isVisible?this.hide():this.show()}isOpen(){return this.isVisible}destroyDialog(){this.onBeforeDestroy(),this.dialog&&(this.dialog.destroy(),this.dialog=null),this.isVisible=!1}destroy(){this.destroyDialog(),super.destroy()}}const us={clearHeight:'',clearDistance:'',distance:'',elevation:'',point:'',angle:'',area:'',slope:''},Xa={distance:{key:"distance",callBackType:"distance",icon:us.distance,order:0},clearHeight:{key:"clearHeight",callBackType:"clear-height",icon:us.clearHeight,order:1},clearDistance:{key:"clearDistance",callBackType:"clear-distance",icon:us.clearDistance,order:2},elevation:{key:"elevation",callBackType:"elevation",icon:us.elevation,order:3},point:{key:"point",callBackType:"point",icon:us.point,order:4},angle:{key:"angle",callBackType:"angle",icon:us.angle,order:5},area:{key:"area",callBackType:"area",icon:us.area,order:6},slope:{key:"slope",callBackType:"slope",icon:us.slope,order:7}},sg=Object.values(Xa).sort((s,e)=>s.order-e.order).map(s=>s.key);function rg(s){switch(s){case"clearHeight":case"clearDistance":case"distance":case"elevation":return"length";case"area":return"area";case"angle":return"angle";case"slope":return"percent";case"point":default:return"point"}}function EC(s){return Object.values(Xa).find(e=>e.callBackType===s)?.key}class ja{element;options;activeMode;isExpanded;result=null;clearHeightDirection=0;clearHeightSelectType="point";config;draftConfig=null;view="main";static CONFIG_CACHE_KEY="bim-engine:measure:config";static DEFAULT_CONFIG={unit:"mm",precision:2};toolButtons=new Map;toggleBtn;toggleTextEl;mainValueRowEl;mainValueValueEl;mainValueLabelEl;mainNumberEl;mainUnitEl;xyzBoxEl;xyzXEl;xyzYEl;xyzZEl;clearBtn;settingsBtn;modeOptionsEl;directionBtns=new Map;selectTypeBtns=new Map;mainViewEl;settingsViewEl;unitSelectEl;precisionSelectEl;saveSettingsBtn;cancelSettingsBtn;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.activeMode=e.defaultMode??"distance",this.isExpanded=e.defaultExpanded??!1,this.config=this.loadConfigFromCache()??{...ja.DEFAULT_CONFIG},this.element=this.createDom()}init(){this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)}),this.setLocales(),this.setTheme(ot.getTheme()),this.applyExpandedState(),this.applyActiveModeState(),this.applyClearHeightOptionsState(),this.applyViewState(),this.renderResult(),this.options.onModeChange&&this.options.onModeChange(this.activeMode)}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-hover",e.primaryHover??"#60a5fa"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-danger",e.danger??"#ef4444"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-text-secondary",e.textSecondary??"#94a3b8"),t.setProperty("--bim-text-tertiary",e.textTertiary??"#64748b"),t.setProperty("--bim-text-inverse",e.textInverse??"#152232"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}setLocales(){for(const[t,n]of this.toolButtons.entries())n.title=xe(this.getModeI18nKey(t)),n.setAttribute("aria-label",n.title);this.toggleBtn.title=this.isExpanded?xe("measure.actions.collapse"):xe("measure.actions.expand"),this.toggleBtn.setAttribute("aria-label",this.toggleBtn.title),this.toggleTextEl&&(this.toggleTextEl.textContent=this.toggleBtn.title),this.clearBtn.textContent=xe("measure.actions.clearAll"),this.settingsBtn.title=xe("measure.actions.settings"),this.settingsBtn.setAttribute("aria-label",this.settingsBtn.title),this.mainValueLabelEl.textContent=xe(this.getModeValueLabelI18nKey(this.activeMode)),this.element.querySelectorAll("[data-i18n-key]").forEach(t=>{const n=t.dataset.i18nKey;n&&(t.textContent=xe(n))}),this.saveSettingsBtn.textContent=xe("measure.settings.save"),this.cancelSettingsBtn.textContent=xe("measure.settings.cancel")}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove()}getActiveMode(){return this.activeMode}switchMode(e,t=!0){this.setActiveMode(e,t)}setActiveMode(e,t=!0){this.activeMode!==e&&(this.activeMode=e,this.applyActiveModeState(),this.applyClearHeightOptionsState(),this.mainValueLabelEl.textContent=xe(this.getModeValueLabelI18nKey(this.activeMode)),t&&this.options.onModeChange&&this.options.onModeChange(e),this.renderResult(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded))}setResult(e){this.result=e,this.renderResult()}clearAll(){this.result=null,this.renderResult(),this.options.onClearAll&&this.options.onClearAll()}openSettings(){this.enterSettingsView(),this.options.onSettings&&this.options.onSettings()}getConfig(){return{...this.config}}setConfig(e,t=!1){const n={unit:e.unit??this.config.unit,precision:e.precision??this.config.precision};this.config=n,t&&this.saveConfigToCache(n),this.renderResult(),this.view==="settings"&&this.syncSettingsFormFromConfig(n)}setExpanded(e){this.isExpanded!==e&&(this.isExpanded=e,this.applyExpandedState(),this.setLocales(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded))}getExpanded(){return this.isExpanded}createDom(){const e=document.createElement("div");e.className="bim-measure-panel",this.mainViewEl=document.createElement("div"),this.mainViewEl.className="bim-measure-main";const t=document.createElement("div");t.className="bim-measure-tools";const n=document.createElement("div");n.className="bim-measure-tool-grid";const i=` - `;for(let m=0;m{this.setActiveMode(f)}),this.toolButtons.set(f,g),n.appendChild(g)}t.appendChild(n);const r=document.createElement("div");r.className="bim-measure-toggle",this.toggleBtn=document.createElement("button"),this.toggleBtn.type="button",this.toggleBtn.className="bim-measure-toggle-btn",this.toggleTextEl=document.createElement("span"),this.toggleTextEl.className="bim-measure-toggle-text";const a=document.createElement("span");a.className="bim-measure-toggle-icon",a.innerHTML=` + `;for(let m=0;m{this.setActiveMode(f)}),this.toolButtons.set(f,g),n.appendChild(g)}t.appendChild(n);const r=document.createElement("div");r.className="bim-measure-toggle",this.toggleBtn=document.createElement("button"),this.toggleBtn.type="button",this.toggleBtn.className="bim-measure-toggle-btn",this.toggleTextEl=document.createElement("span"),this.toggleTextEl.className="bim-measure-toggle-text";const a=document.createElement("span");a.className="bim-measure-toggle-icon",a.innerHTML=` - `,this.toggleBtn.appendChild(this.toggleTextEl),this.toggleBtn.appendChild(a),this.toggleBtn.addEventListener("click",()=>{this.isExpanded=!this.isExpanded,this.applyExpandedState(),this.setLocales(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded)}),r.appendChild(this.toggleBtn),t.appendChild(r),this.mainViewEl.appendChild(t),this.modeOptionsEl=this.createModeOptionsDom(),this.mainViewEl.appendChild(this.modeOptionsEl);const o=document.createElement("div");o.className="bim-measure-result";const l=document.createElement("div");l.className="bim-measure-row",this.mainValueRowEl=l;const c=document.createElement("span");c.className="label",this.mainValueLabelEl=c;const h=document.createElement("span");h.className="value",this.mainValueValueEl=h,this.mainNumberEl=document.createElement("span"),this.mainNumberEl.className="bim-measure-main-number",this.mainUnitEl=document.createElement("span"),this.mainUnitEl.className="bim-measure-main-unit",this.mainValueValueEl.appendChild(this.mainNumberEl),this.mainValueValueEl.appendChild(document.createTextNode(" ")),this.mainValueValueEl.appendChild(this.mainUnitEl),l.appendChild(c),l.appendChild(h),o.appendChild(l);const u=document.createElement("div");u.className="bim-measure-xyz",this.xyzBoxEl=u;const p=(m,f,x)=>{const g=document.createElement("div");g.className="bim-measure-row";const y=document.createElement("span");y.className="label",y.dataset.i18nKey=m;const v=document.createElement("span");return v.className=`value ${f}`,x(v),g.appendChild(y),g.appendChild(v),g};u.appendChild(p("measure.labels.x","bim-measure-xyz-x",m=>this.xyzXEl=m)),u.appendChild(p("measure.labels.y","bim-measure-xyz-y",m=>this.xyzYEl=m)),u.appendChild(p("measure.labels.z","bim-measure-xyz-z",m=>this.xyzZEl=m)),o.appendChild(u),this.mainViewEl.appendChild(o);const d=document.createElement("div");return d.className="bim-measure-footer",this.clearBtn=document.createElement("button"),this.clearBtn.type="button",this.clearBtn.className="bim-measure-clear-btn",this.clearBtn.addEventListener("click",()=>{this.clearAll()}),this.settingsBtn=document.createElement("button"),this.settingsBtn.type="button",this.settingsBtn.className="bim-measure-settings-btn",this.settingsBtn.innerHTML=` + `,this.toggleBtn.appendChild(this.toggleTextEl),this.toggleBtn.appendChild(a),this.toggleBtn.addEventListener("click",()=>{this.isExpanded=!this.isExpanded,this.applyExpandedState(),this.setLocales(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded)}),r.appendChild(this.toggleBtn),t.appendChild(r),this.mainViewEl.appendChild(t),this.modeOptionsEl=this.createModeOptionsDom(),this.mainViewEl.appendChild(this.modeOptionsEl);const o=document.createElement("div");o.className="bim-measure-result";const l=document.createElement("div");l.className="bim-measure-row",this.mainValueRowEl=l;const c=document.createElement("span");c.className="label",this.mainValueLabelEl=c;const h=document.createElement("span");h.className="value",this.mainValueValueEl=h,this.mainNumberEl=document.createElement("span"),this.mainNumberEl.className="bim-measure-main-number",this.mainUnitEl=document.createElement("span"),this.mainUnitEl.className="bim-measure-main-unit",this.mainValueValueEl.appendChild(this.mainNumberEl),this.mainValueValueEl.appendChild(document.createTextNode(" ")),this.mainValueValueEl.appendChild(this.mainUnitEl),l.appendChild(c),l.appendChild(h),o.appendChild(l);const u=document.createElement("div");u.className="bim-measure-xyz",this.xyzBoxEl=u;const p=(m,f,x)=>{const g=document.createElement("div");g.className="bim-measure-row";const b=document.createElement("span");b.className="label",b.dataset.i18nKey=m;const v=document.createElement("span");return v.className=`value ${f}`,x(v),g.appendChild(b),g.appendChild(v),g};u.appendChild(p("measure.labels.x","bim-measure-xyz-x",m=>this.xyzXEl=m)),u.appendChild(p("measure.labels.y","bim-measure-xyz-y",m=>this.xyzYEl=m)),u.appendChild(p("measure.labels.z","bim-measure-xyz-z",m=>this.xyzZEl=m)),o.appendChild(u),this.mainViewEl.appendChild(o);const d=document.createElement("div");return d.className="bim-measure-footer",this.clearBtn=document.createElement("button"),this.clearBtn.type="button",this.clearBtn.className="bim-measure-clear-btn",this.clearBtn.addEventListener("click",()=>{this.clearAll()}),this.settingsBtn=document.createElement("button"),this.settingsBtn.type="button",this.settingsBtn.className="bim-measure-settings-btn",this.settingsBtn.innerHTML=` - `,this.settingsBtn.addEventListener("click",()=>{this.openSettings()}),d.appendChild(this.clearBtn),d.appendChild(this.settingsBtn),this.mainViewEl.appendChild(d),this.settingsViewEl=this.createSettingsDom(),e.appendChild(this.mainViewEl),e.appendChild(this.settingsViewEl),e}createSettingsDom(){const e=document.createElement("div");e.className="bim-measure-settings";const t=document.createElement("div");t.className="bim-measure-settings-title",t.dataset.i18nKey="measure.settings.title",e.appendChild(t);const n=document.createElement("div");n.className="bim-measure-settings-row";const i=document.createElement("div");i.className="label",i.dataset.i18nKey="measure.settings.unit",this.unitSelectEl=document.createElement("select"),this.unitSelectEl.className="bim-measure-settings-select",this.unitSelectEl.appendChild(this.makeOption("m")),this.unitSelectEl.appendChild(this.makeOption("cm")),this.unitSelectEl.appendChild(this.makeOption("mm")),this.unitSelectEl.appendChild(this.makeOption("km")),n.appendChild(i),n.appendChild(this.unitSelectEl),e.appendChild(n);const r=document.createElement("div");r.className="bim-measure-settings-hint",r.dataset.i18nKey="measure.settings.hint",e.appendChild(r);const a=document.createElement("div");a.className="bim-measure-settings-row";const o=document.createElement("div");o.className="label",o.dataset.i18nKey="measure.settings.precision",this.precisionSelectEl=document.createElement("select"),this.precisionSelectEl.className="bim-measure-settings-select",this.precisionSelectEl.appendChild(this.makePrecisionOption(0)),this.precisionSelectEl.appendChild(this.makePrecisionOption(1)),this.precisionSelectEl.appendChild(this.makePrecisionOption(2)),this.precisionSelectEl.appendChild(this.makePrecisionOption(3)),a.appendChild(o),a.appendChild(this.precisionSelectEl),e.appendChild(a);const l=document.createElement("div");return l.className="bim-measure-settings-actions",this.saveSettingsBtn=document.createElement("button"),this.saveSettingsBtn.type="button",this.saveSettingsBtn.className="bim-measure-settings-save",this.saveSettingsBtn.addEventListener("click",()=>{this.saveSettings()}),this.cancelSettingsBtn=document.createElement("button"),this.cancelSettingsBtn.type="button",this.cancelSettingsBtn.className="bim-measure-settings-cancel",this.cancelSettingsBtn.addEventListener("click",()=>{this.cancelSettings()}),l.appendChild(this.saveSettingsBtn),l.appendChild(this.cancelSettingsBtn),e.appendChild(l),this.syncSettingsFormFromConfig(this.config),e}createModeOptionsDom(){const e=document.createElement("div");e.className="bim-measure-mode-options";const t=document.createElement("div");t.className="bim-measure-radio-group";const n=document.createElement("span");n.className="bim-measure-radio-label",n.dataset.i18nKey="measure.clearHeight.direction";const i=document.createElement("div");i.className="bim-measure-radio-items";const r=this.createRadioItem("measure.clearHeight.directionDown",()=>{this.setClearHeightDirection(0)}),a=this.createRadioItem("measure.clearHeight.directionUp",()=>{this.setClearHeightDirection(1)});this.directionBtns.set(0,r),this.directionBtns.set(1,a),i.appendChild(r),i.appendChild(a),t.appendChild(n),t.appendChild(i),e.appendChild(t);const o=document.createElement("div");o.className="bim-measure-radio-group";const l=document.createElement("span");l.className="bim-measure-radio-label",l.dataset.i18nKey="measure.clearHeight.selectType";const c=document.createElement("div");c.className="bim-measure-radio-items";const h=this.createRadioItem("measure.clearHeight.selectPoint",()=>{this.setClearHeightSelectType("point")}),u=this.createRadioItem("measure.clearHeight.selectElement",()=>{this.setClearHeightSelectType("element")});return this.selectTypeBtns.set("point",h),this.selectTypeBtns.set("element",u),c.appendChild(h),c.appendChild(u),o.appendChild(l),o.appendChild(c),e.appendChild(o),e}createRadioItem(e,t){const n=document.createElement("button");return n.type="button",n.className="bim-measure-radio-item",n.dataset.i18nKey=e,n.textContent=xe(e),n.addEventListener("click",t),n}setClearHeightDirection(e){this.clearHeightDirection!==e&&(this.clearHeightDirection=e,this.applyClearHeightOptionsState(),this.options.onClearHeightDirectionChange?.(e))}setClearHeightSelectType(e){this.clearHeightSelectType!==e&&(this.clearHeightSelectType=e,this.applyClearHeightOptionsState(),this.options.onClearHeightSelectTypeChange?.(e))}applyClearHeightOptionsState(){this.activeMode==="clearHeight"?this.modeOptionsEl.classList.add("is-visible"):this.modeOptionsEl.classList.remove("is-visible");for(const[e,t]of this.directionBtns.entries())e===this.clearHeightDirection?t.classList.add("is-active"):t.classList.remove("is-active");for(const[e,t]of this.selectTypeBtns.entries())e===this.clearHeightSelectType?t.classList.add("is-active"):t.classList.remove("is-active")}makeOption(e){const t=document.createElement("option");return t.value=e,t.textContent=e,t}makePrecisionOption(e){const t=document.createElement("option");return t.value=String(e),t.textContent=e===0?"0":`0.${"0".repeat(e)}`,t}enterSettingsView(){this.draftConfig={...this.config},this.view="settings",this.syncSettingsFormFromConfig(this.config),this.applyViewState()}saveSettings(){const e=this.unitSelectEl.value||this.config.unit,t=Number(this.precisionSelectEl.value),n={unit:e,precision:this.isValidPrecision(t)?t:this.config.precision};this.config=n,this.saveConfigToCache(n),this.draftConfig=null,this.view="main",this.applyViewState(),this.renderResult(),this.options.onConfigSave?.(n),this.options.onExpandedChange?.(this.isExpanded)}cancelSettings(){this.draftConfig&&(this.config={...this.draftConfig}),this.draftConfig=null,this.view="main",this.applyViewState(),this.renderResult(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded)}syncSettingsFormFromConfig(e){this.unitSelectEl.value=e.unit,this.precisionSelectEl.value=String(e.precision)}applyViewState(){this.view==="settings"?(this.mainViewEl.style.display="none",this.settingsViewEl.style.display="block"):(this.mainViewEl.style.display="block",this.settingsViewEl.style.display="none")}loadConfigFromCache(){try{const e=localStorage.getItem(ja.CONFIG_CACHE_KEY);if(!e)return null;const t=JSON.parse(e);if(!t||typeof t!="object")return null;const n=t.unit,i=t.precision;return!this.isValidUnit(n)||!this.isValidPrecision(i)?null:{unit:n,precision:i}}catch{return null}}saveConfigToCache(e){try{localStorage.setItem(ja.CONFIG_CACHE_KEY,JSON.stringify(e))}catch{}}isValidUnit(e){return e==="m"||e==="cm"||e==="mm"||e==="km"}isValidPrecision(e){return e===0||e===1||e===2||e===3}applyExpandedState(){let e=0;for(const t of this.toolButtons.values())e>=4?t.style.display=this.isExpanded?"":"none":t.style.display="",e++;this.isExpanded?this.toggleBtn.classList.add("is-expanded"):this.toggleBtn.classList.remove("is-expanded")}applyActiveModeState(){for(const[e,t]of this.toolButtons.entries())e===this.activeMode?t.classList.add("is-active"):t.classList.remove("is-active")}renderResult(){if(this.activeMode==="point"){this.mainValueRowEl.style.display="none",this.xyzBoxEl.style.display="";const n=this.result?.xyz;if(!n){this.xyzXEl.textContent="--",this.xyzYEl.textContent="--",this.xyzZEl.textContent="--";return}this.xyzXEl.textContent=this.convertValue("length",n.x)+" "+this.getUnitText("length"),this.xyzYEl.textContent=this.convertValue("length",n.y)+" "+this.getUnitText("length"),this.xyzZEl.textContent=this.convertValue("length",n.z)+" "+this.getUnitText("length");return}this.mainValueRowEl.style.display="",this.mainValueLabelEl.textContent=xe(this.getModeValueLabelI18nKey(this.activeMode));const t=this.result?this.result[Xa[this.activeMode].callBackType]:void 0;if(this.activeMode==="slope"||this.activeMode==="angle")this.mainNumberEl.textContent=t??"--",this.mainUnitEl.textContent="";else{const n=rg(this.activeMode);this.mainNumberEl.textContent=this.convertValue(n,t),this.mainUnitEl.textContent=this.getUnitText(n)}this.xyzBoxEl.style.display="none"}getModeI18nKey(e){return`measure.modes.${e}`}getModeValueLabelI18nKey(e){return`measure.labels.value.${e}`}convertValue(e,t){if(t==null||Number.isNaN(t))return"--";const n=this.config.unit,i=this.config.precision;let r;switch(e){case"length":switch(n){case"mm":r=t*1e3;break;case"cm":r=t*100;break;case"km":r=t/1e3;break;default:r=t}break;case"area":switch(n){case"mm":r=t*1e3*1e3;break;case"cm":r=t*100*100;break;case"km":r=t/1e3/1e3;break;default:r=t}break;case"angle":case"percent":case"point":default:r=t}return r.toFixed(i)}getUnitText(e){const t=this.config.unit;switch(e){case"length":case"point":return t;case"area":return`${t}²`;case"angle":case"percent":return"°";default:return""}}}class TT extends Gs{panel=null;config=null;unsubscribeMeasureChanged=null;constructor(e){super(e)}get dialogId(){return"measure-dialog"}get dialogTitle(){return"measure.dialogTitle"}get dialogWidth(){return 250}createContent(){this.panel=new ja({defaultMode:"distance",defaultExpanded:!1,onModeChange:t=>{console.log("[MeasureDialogManager] 当前测量方式已切换:",t),this.registry.engine3d?.activateMeasure(t)},onClearAll:()=>{console.log("[MeasureDialogManager] 删除全部"),this.registry.engine3d?.clearAllMeasures()},onSettings:()=>{console.log("[MeasureDialogManager] 打开设置")},onExpandedChange:()=>{this.dialog?.fitHeight(!1)},onConfigSave:t=>{console.log("[MeasureDialogManager] 保存设置:",t),this.registry.engine3d?.saveMeasureSetting({unit:t.unit,precision:t.precision})},onClearHeightDirectionChange:t=>{console.log("[MeasureDialogManager] 净高朝向切换:",t),this.registry.engine3d?.setClearHeightDirection(t)},onClearHeightSelectTypeChange:t=>{console.log("[MeasureDialogManager] 净高选择对象切换:",t),this.registry.engine3d?.setClearHeightSelectType(t)}}),this.panel.init(),this.config=this.panel.getConfig(),this.config&&(console.log("[MeasureDialogManager] 同步缓存设置到引擎:",this.config),this.registry.engine3d?.saveMeasureSetting({unit:this.config.unit,precision:this.config.precision}));const e=document.createElement("div");return e.style.padding="12px",e.appendChild(this.panel.element),e}onDialogCreated(){this.dialog?.fitHeight(!1),this.registry.engine3d?.setClearHeightDirection(0),this.registry.engine3d?.setClearHeightSelectType("point");const e=this.registry.engine3d?.getEngine();if(e?.events){const t=n=>{console.log("[MeasureDialogManager] 测量值回调:",n),n&&this.panel&&this.handleMeasureChanged(n)};e.events.on("measure-changed",t),e.events.on("measure-click",t),this.unsubscribeMeasureChanged=()=>{e.events.off("measure-changed",t),e.events.off("measure-click",t)}}}handleMeasureChanged(e){if(!this.panel)return;const t=ET(e.type);if(!t){console.warn("[MeasureDialogManager] 未知测量类型:",e.type);return}this.panel.getActiveMode()!==t&&this.panel.switchMode(t,!1);const i=this.convertToMeasureResult(e,t);this.panel.setResult(i)}convertToMeasureResult(e,t){const n=Xa[t],i={};return rg(t)==="point"?e.textX!==void 0&&e.textY!==void 0&&e.textZ!==void 0&&(i.xyz={x:e.textX,y:e.textY,z:e.textZ}):i[n.callBackType]=e.text,i}onDialogClose(){this.unsubscribeMeasureChanged&&(this.unsubscribeMeasureChanged(),this.unsubscribeMeasureChanged=null),this.registry.toolbar?.setBtnActive("measure",!1)}onBeforeDestroy(){this.unsubscribeMeasureChanged&&(this.unsubscribeMeasureChanged(),this.unsubscribeMeasureChanged=null),this.registry.engine3d&&this.registry.engine3d.deactivateMeasure(),this.panel&&(this.panel.destroy(),this.panel=null)}getActiveMode(){return this.panel?this.panel.getActiveMode():null}switchMode(e){this.panel&&this.panel.switchMode(e)}setMeasureResult(e){this.panel&&this.panel.setResult(e)}getConfig(){return this.panel&&(this.config=this.panel.getConfig()),this.config?{...this.config}:null}setConfig(e,t=!0){if(this.panel){this.panel.setConfig(e,t),this.config=this.panel.getConfig(),this.dialog?.fitHeight(!1);return}const n=this.config,i={unit:e.unit??n?.unit??"mm",precision:e.precision??n?.precision??2};this.config=i}clearAll(){this.panel&&this.panel.clearAll()}openSettings(){this.panel&&this.panel.openSettings()}}class CT{element;options;isHidden=!1;hideBtn;reverseBtn;resetBtn;hideLabelEl;reverseLabelEl;resetLabelEl;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.isHidden=e.defaultHidden??!1,this.element=this.createDom()}setHiddenState(e){this.isHidden=e,this.updateButtonStates()}getHiddenState(){return this.isHidden}updateButtonStates(){this.hideBtn?.classList.toggle("active",this.isHidden)}init(){this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)}),this.setLocales(),this.setTheme(ot.getTheme())}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}setLocales(){this.hideLabelEl.textContent=xe("sectionPlane.actions.hide"),this.reverseLabelEl.textContent=xe("sectionPlane.actions.reverse"),this.resetLabelEl.textContent=xe("sectionPlane.actions.reset"),this.hideBtn.title=xe("sectionPlane.actions.hide"),this.reverseBtn.title=xe("sectionPlane.actions.reverse"),this.resetBtn.title=xe("sectionPlane.actions.reset")}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove()}createDom(){const e=document.createElement("div");return e.className="section-plane-panel",this.hideBtn=this.createButton("hide",at("隐藏"),()=>{this.isHidden=!this.isHidden,this.updateButtonStates(),this.options.onHideToggle?.(this.isHidden)}),this.reverseBtn=this.createButton("reverse",at("反向"),()=>{this.options.onReverse&&this.options.onReverse()}),this.resetBtn=this.createButton("reset",at("重置"),()=>{this.options.onReset&&this.options.onReset()}),e.appendChild(this.hideBtn),e.appendChild(this.reverseBtn),e.appendChild(this.resetBtn),e}createButton(e,t,n){const i=document.createElement("button");i.type="button",i.className="section-plane-btn";const r=document.createElement("div");r.className="section-plane-btn-icon",r.innerHTML=t,i.appendChild(r);const a=document.createElement("div");return a.className="section-plane-btn-label",i.appendChild(a),e==="hide"?this.hideLabelEl=a:e==="reverse"?this.reverseLabelEl=a:this.resetLabelEl=a,i.addEventListener("click",n),i}}class AT extends Gs{panel=null;constructor(e){super(e)}get dialogId(){return"section-plane-dialog"}get dialogTitle(){return"sectionPlane.dialogTitle"}get dialogWidth(){return 240}get dialogHeight(){return 120}init(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=20,n=50,i=e.clientWidth,r=e.clientHeight;return{x:i-this.dialogWidth-t,y:r-this.dialogHeight-n}}createContent(){return this.panel=new CT({defaultHidden:!1,onHideToggle:e=>{console.log("[SectionPlaneDialogManager] 隐藏切换:",e),e?this.registry.engine3d?.hideSection():this.registry.engine3d?.recoverSection()},onReverse:()=>{console.log("[SectionPlaneDialogManager] 反向 (not supported in new API)")},onReset:()=>{console.log("[SectionPlaneDialogManager] 重置 (not supported in new API)")}}),this.panel.init(),this.panel.element}onDialogCreated(){this.registry.engine3d?.activeSection("face"),this.dialog?.fitHeight(!1)}onDialogClose(){this.registry.toolbar?.setBtnActive("section-plane",!1)}onBeforeDestroy(){this.registry.engine3d?.deactivateSection(),this.panel&&(this.panel.destroy(),this.panel=null)}}class PT{element;options;isHidden=!1;activeAxis="x";hideBtn;reverseBtn;hideLabelEl;reverseLabelEl;axisXBtn;axisYBtn;axisZBtn;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.isHidden=e.defaultHidden??!1,this.activeAxis=e.defaultAxis??"x",this.element=this.createDom()}init(){this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)}),this.setLocales(),this.setTheme(ot.getTheme()),this.updateHideButtonState(),this.updateAxisButtonsState()}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}setLocales(){this.hideLabelEl.textContent=xe("sectionAxis.actions.hide"),this.reverseLabelEl.textContent=xe("sectionAxis.actions.reverse"),this.hideBtn.title=xe("sectionAxis.actions.hide"),this.reverseBtn.title=xe("sectionAxis.actions.reverse"),this.axisXBtn.title=xe("sectionAxis.actions.axisX"),this.axisYBtn.title=xe("sectionAxis.actions.axisY"),this.axisZBtn.title=xe("sectionAxis.actions.axisZ")}setHiddenState(e){this.isHidden=e,this.updateHideButtonState()}getHiddenState(){return this.isHidden}setActiveAxis(e){this.activeAxis=e,this.updateAxisButtonsState()}getActiveAxis(){return this.activeAxis}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove()}createDom(){const e=document.createElement("div");e.className="section-axis-panel";const t=document.createElement("div");t.className="section-axis-row-1",this.hideBtn=this.createButton("hide",at("隐藏"),()=>this.handleHideToggle()),this.reverseBtn=this.createButton("reverse",at("反向"),()=>this.handleReverse()),t.appendChild(this.hideBtn),t.appendChild(this.reverseBtn);const n=document.createElement("div");return n.className="section-axis-row-2",this.axisXBtn=this.createAxisButton("axisX","X",()=>this.handleAxisChange("x")),this.axisYBtn=this.createAxisButton("axisY","Y",()=>this.handleAxisChange("y")),this.axisZBtn=this.createAxisButton("axisZ","Z",()=>this.handleAxisChange("z")),n.appendChild(this.axisXBtn),n.appendChild(this.axisYBtn),n.appendChild(this.axisZBtn),e.appendChild(t),e.appendChild(n),e}createButton(e,t,n){const i=document.createElement("button");i.type="button",i.className="section-axis-btn";const r=document.createElement("div");r.className="section-axis-btn-icon",r.innerHTML=t,i.appendChild(r);const a=document.createElement("div");return a.className="section-axis-btn-label",i.appendChild(a),e==="hide"?this.hideLabelEl=a:e==="reverse"&&(this.reverseLabelEl=a),i.addEventListener("click",n),i}createAxisButton(e,t,n){const i=document.createElement("button");i.type="button",i.className="section-axis-btn section-axis-btn-text";const r=document.createElement("div");return r.className="section-axis-btn-label",r.textContent=t,i.appendChild(r),i.addEventListener("click",n),i}handleHideToggle(){this.isHidden=!this.isHidden,this.updateHideButtonState(),this.options.onHideToggle&&this.options.onHideToggle(this.isHidden)}handleReverse(){this.options.onReverse&&this.options.onReverse()}handleAxisChange(e){this.activeAxis!==e&&(this.activeAxis=e,this.updateAxisButtonsState(),this.options.onAxisChange&&this.options.onAxisChange(e))}updateHideButtonState(){this.isHidden?this.hideBtn.classList.add("active"):this.hideBtn.classList.remove("active")}updateAxisButtonsState(){this.axisXBtn.classList.toggle("active",this.activeAxis==="x"),this.axisYBtn.classList.toggle("active",this.activeAxis==="y"),this.axisZBtn.classList.toggle("active",this.activeAxis==="z")}}class RT extends Gs{panel=null;constructor(e){super(e)}get dialogId(){return"section-axis-dialog"}get dialogTitle(){return"sectionAxis.dialogTitle"}get dialogWidth(){return 240}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight;return{x:t-this.dialogWidth-20,y:n-50-200}}createContent(){return this.panel=new PT({defaultAxis:"x",defaultHidden:!1,onHideToggle:e=>{console.log("[SectionAxisDialogManager] 隐藏切换:",e),e?this.registry.engine3d?.hideSection():this.registry.engine3d?.recoverSection()},onReverse:()=>{console.log("[SectionAxisDialogManager] 反向剖切(暂不支持)")},onAxisChange:e=>{console.log("[SectionAxisDialogManager] 切换轴向:",e),this.registry.engine3d?.activeSection(e)}}),this.panel.init(),this.panel.element}onDialogCreated(){if(this.dialog?.fitHeight(!1),!this.registry.engine3d){console.error("[SectionAxisDialogManager] Engine not initialized. Call initEngine() first.");return}this.registry.engine3d.activeSection("x")}onDialogClose(){this.registry.toolbar?.setBtnActive("section-axis",!1)}onBeforeDestroy(){this.registry.engine3d?.deactivateSection(),this.panel&&(this.panel.destroy(),this.panel=null)}getHiddenState(){return this.panel?.getHiddenState()??!1}setHiddenState(e){this.panel?.setHiddenState(e)}getActiveAxis(){return this.panel?.getActiveAxis()??"x"}setActiveAxis(e){this.panel?.setActiveAxis(e)}}const ag={x:{min:0,max:100},y:{min:0,max:100},z:{min:0,max:100}};class LT{element;options;isHidden=!1;isReversed=!1;range;hideBtn;reverseBtn;fitBtn;resetBtn;hideLabelEl;reverseLabelEl;fitLabelEl;resetLabelEl;xLabelEl;yLabelEl;zLabelEl;unsubscribeLocale=null;unsubscribeTheme=null;xSlider;ySlider;zSlider;xMinHandle;xMaxHandle;yMinHandle;yMaxHandle;zMinHandle;zMaxHandle;dragState={isDragging:!1,axis:null,handleType:null,pointerId:null};constructor(e={}){this.options=e,this.isHidden=e.defaultHidden??!1,this.isReversed=e.defaultReversed??!1,this.range=JSON.parse(JSON.stringify(e.defaultRange??ag))}init(){this.element=this.createPanel(),this.unsubscribeLocale=Qt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=ot.subscribe(e=>this.setTheme(e)),this.setLocales(),this.setTheme(ot.getTheme()),this.updateButtonStates(),this.updateAllSlidersUI(),this.setupDragListeners()}setHiddenState(e){this.isHidden=e,this.updateButtonStates()}getHiddenState(){return this.isHidden}setReversedState(e){this.isReversed=e,this.updateButtonStates()}getReversedState(){return this.isReversed}setRange(e){e.x&&(this.range.x={...this.range.x,...e.x}),e.y&&(this.range.y={...this.range.y,...e.y}),e.z&&(this.range.z={...this.range.z,...e.z}),this.updateAllSlidersUI()}getRange(){return JSON.parse(JSON.stringify(this.range))}reset(){this.isHidden=this.options.defaultHidden??!1,this.isReversed=this.options.defaultReversed??!1,this.range=JSON.parse(JSON.stringify(this.options.defaultRange??ag)),this.updateButtonStates(),this.updateAllSlidersUI(),this.options.onReset?.(),this.options.onRangeChange?.(this.range)}createPanel(){const e=document.createElement("div");e.className="section-box-panel";const t=document.createElement("div");t.className="section-box-row-buttons",this.hideBtn=this.createButton("hide",xe("sectionBox.actions.hide"),()=>{this.isHidden=!this.isHidden,this.updateButtonStates(),this.options.onHideToggle?.(this.isHidden)},"hide"),this.reverseBtn=this.createButton("reverse",xe("sectionBox.actions.reverse"),()=>{this.isReversed=!this.isReversed,this.updateButtonStates(),this.options.onReverseToggle?.(this.isReversed)},"reverse"),this.fitBtn=this.createButton("fit",xe("sectionBox.actions.fitToModel"),()=>{this.options.onFitToModel?.()},"fit"),this.resetBtn=this.createButton("reset",xe("sectionBox.actions.reset"),()=>this.reset(),"reset"),[this.hideBtn,this.reverseBtn,this.fitBtn,this.resetBtn].forEach(i=>t.appendChild(i));const n=document.createElement("div");return n.className="section-box-sliders",n.addEventListener("pointerdown",i=>i.stopPropagation()),this.xSlider=this.createSlider("x",xe("sectionBox.axes.x")),this.ySlider=this.createSlider("y",xe("sectionBox.axes.y")),this.zSlider=this.createSlider("z",xe("sectionBox.axes.z")),[this.xSlider,this.ySlider,this.zSlider].forEach(i=>n.appendChild(i)),e.appendChild(t),e.appendChild(n),e}createButton(e,t,n,i){const r=document.createElement("button");r.className="section-box-btn",r.title=t;const a={hide:"隐藏",reverse:"反向",fit:"适应到模型",reset:"重置"},o=document.createElement("div");o.className="section-box-btn-icon",o.innerHTML=at(a[e]||e);const l=document.createElement("div");return l.className="section-box-btn-label",l.textContent=t,i==="hide"?this.hideLabelEl=l:i==="reverse"?this.reverseLabelEl=l:i==="fit"?this.fitLabelEl=l:i==="reset"&&(this.resetLabelEl=l),r.appendChild(o),r.appendChild(l),r.addEventListener("click",n),r}createSlider(e,t){const n=document.createElement("div");n.className="section-box-slider";const i=document.createElement("div");i.className="section-box-slider-label",i.textContent=t,e==="x"?this.xLabelEl=i:e==="y"?this.yLabelEl=i:this.zLabelEl=i;const r=document.createElement("div");r.className="section-box-slider-track";const a=document.createElement("div");a.className="section-box-slider-range";const o=document.createElement("div");o.className="section-box-slider-handle",o.setAttribute("data-axis",e),o.setAttribute("data-handle","min");const l=document.createElement("div");return l.className="section-box-slider-handle",l.setAttribute("data-axis",e),l.setAttribute("data-handle","max"),r.append(a,o,l),n.append(i,r),e==="x"?(this.xMinHandle=o,this.xMaxHandle=l):e==="y"?(this.yMinHandle=o,this.yMaxHandle=l):(this.zMinHandle=o,this.zMaxHandle=l),n}setupDragListeners(){[this.xMinHandle,this.xMaxHandle,this.yMinHandle,this.yMaxHandle,this.zMinHandle,this.zMaxHandle].forEach(t=>{t.addEventListener("pointerdown",i=>{i.preventDefault(),i.stopPropagation(),t.setPointerCapture(i.pointerId),this.dragState={isDragging:!0,axis:t.getAttribute("data-axis"),handleType:t.getAttribute("data-handle"),pointerId:i.pointerId},t.classList.add("dragging"),t.closest(".section-box-slider").style.zIndex="100"}),t.addEventListener("pointermove",i=>{this.dragState.isDragging&&this.dragState.pointerId===i.pointerId&&this.onDragging(i)});const n=i=>{this.dragState.isDragging&&this.dragState.pointerId===i.pointerId&&(t.hasPointerCapture(i.pointerId)&&t.releasePointerCapture(i.pointerId),t.closest(".section-box-slider").style.zIndex="",t.classList.remove("dragging"),this.dragState={isDragging:!1,axis:null,handleType:null,pointerId:null})};t.addEventListener("pointerup",n),t.addEventListener("pointercancel",n),t.addEventListener("lostpointercapture",n)})}onDragging(e){const{axis:t,handleType:n}=this.dragState;if(!t||!n)return;const a=(t==="x"?this.xSlider:t==="y"?this.ySlider:this.zSlider).querySelector(".section-box-slider-track").getBoundingClientRect();let o=(e.clientX-a.left)/a.width*100;o=Math.max(0,Math.min(100,o));const l=this.range[t];n==="min"?l.min=Math.min(o,l.max):l.max=Math.max(o,l.min),this.updateSliderUI(t),this.options.onRangeChange?.(this.range)}updateSliderUI(e){const t=this.range[e],n=e==="x"?this.xMinHandle:e==="y"?this.yMinHandle:this.zMinHandle,i=e==="x"?this.xMaxHandle:e==="y"?this.yMaxHandle:this.zMaxHandle,a=(e==="x"?this.xSlider:e==="y"?this.ySlider:this.zSlider).querySelector(".section-box-slider-range");n.style.left=`${t.min}%`,i.style.left=`${t.max}%`,a.style.left=`${t.min}%`,a.style.width=`${t.max-t.min}%`,n.setAttribute("data-value",Math.round(t.min).toString()),i.setAttribute("data-value",Math.round(t.max).toString())}updateAllSlidersUI(){["x","y","z"].forEach(e=>this.updateSliderUI(e))}updateButtonStates(){this.hideBtn&&this.hideBtn.classList.toggle("active",this.isHidden),this.reverseBtn&&this.reverseBtn.classList.toggle("active",this.isReversed)}setLocales(){this.hideLabelEl&&(this.hideLabelEl.textContent=xe("sectionBox.actions.hide"),this.reverseLabelEl.textContent=xe("sectionBox.actions.reverse"),this.fitLabelEl.textContent=xe("sectionBox.actions.fitToModel"),this.resetLabelEl.textContent=xe("sectionBox.actions.reset"),this.xLabelEl.textContent=xe("sectionBox.axes.x"),this.yLabelEl.textContent=xe("sectionBox.axes.y"),this.zLabelEl.textContent=xe("sectionBox.axes.z"),this.hideBtn.title=xe("sectionBox.actions.hide"),this.reverseBtn.title=xe("sectionBox.actions.reverse"),this.fitBtn.title=xe("sectionBox.actions.fitToModel"),this.resetBtn.title=xe("sectionBox.actions.reset"))}setTheme(e){if(!this.element)return;const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}destroy(){this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element&&this.element.parentElement&&this.element.parentElement.removeChild(this.element)}}class DT extends Gs{panel=null;unsubscribeSectionMove=null;constructor(e){super(e)}get dialogId(){return"section-box-dialog"}get dialogTitle(){return"sectionBox.dialogTitle"}get dialogWidth(){return 280}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight;return{x:t-this.dialogWidth-20,y:n-50-300}}createContent(){return this.panel=new LT({defaultHidden:!1,defaultReversed:!1,onHideToggle:e=>{console.log("[SectionBoxDialogManager] 隐藏切换:",e),e?this.registry.engine3d?.hideSection():this.registry.engine3d?.recoverSection()},onReverseToggle:e=>{console.log("[SectionBoxDialogManager] 反向切换:",e),this.registry.engine3d?.reverseSection()},onFitToModel:()=>{this.registry.engine3d?.scaleSectionBox()},onReset:()=>{this.registry.engine3d?.deactivateSection(),this.registry.engine3d?.activeSection("box"),this.registry.engine3d?.recoverSection()},onRangeChange:e=>{this.registry.engine3d?.setSectionBoxRange(e)}}),this.panel.init(),this.panel.element}onDialogCreated(){this.registry.engine3d?.activeSection("box"),this.dialog?.fitHeight(!1);const e=this.registry.engine3d?.getEngine();if(e?.events){const t=n=>{n&&this.panel&&this.panel.setRange(n)};e.events.on("section-move",t),this.unsubscribeSectionMove=()=>e.events.off("section-move",t)}}onDialogClose(){this.unsubscribeSectionMove&&(this.unsubscribeSectionMove(),this.unsubscribeSectionMove=null),this.registry.toolbar?.setBtnActive("section-box",!1)}onBeforeDestroy(){this.unsubscribeSectionMove&&(this.unsubscribeSectionMove(),this.unsubscribeSectionMove=null),this.registry.engine3d?.deactivateSection(),this.panel&&(this.panel.destroy(),this.panel=null)}getHiddenState(){return this.panel?.getHiddenState()??!1}setHiddenState(e){this.panel?.setHiddenState(e)}getReversedState(){return this.panel?.getReversedState()??!1}setReversedState(e){this.panel?.setReversedState(e)}getRange(){return this.panel?.getRange()??null}setRange(e){this.panel?.setRange(e)}}class IT{element;options;state={mode:"none",isPlanViewActive:!1,speed:1,gravity:!1,collision:!1,characterModel:"construction-worker",walkMode:"walk"};planViewBtn;pathModeBtn;settingsContainer;speedControl;speedDecreaseBtn;speedIncreaseBtn;speedDisplay;gravityCheckbox;gravityLabel;collisionCheckbox;collisionLabel;characterModelSelect;characterModelLabel;walkModeSelect;walkModeLabel;exitBtn;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.state.speed=e.defaultSpeed??1,this.state.gravity=e.defaultGravity??!1,this.state.collision=e.defaultCollision??!1,this.state.characterModel=e.defaultCharacterModel??"construction-worker",this.state.walkMode=e.defaultWalkMode??"walk"}init(){this.element=this.createPanel(),this.updateSettingsView(),this.unsubscribeLocale=Qt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=ot.subscribe(e=>this.setTheme(e)),this.setLocales(),this.setTheme(ot.getTheme())}setPlanViewActive(e){this.state.isPlanViewActive=e,this.updateButtonStates()}setPathModeActive(e){if(!e&&this.state.mode!=="path")return;const t=e?"path":"none";this.setMode(t)}getState(){return{...this.state}}createPanel(){const e=document.createElement("div");e.className="walk-control-panel";const t=this.createLeftButtons(),n=document.createElement("div");n.className="walk-divider",this.settingsContainer=this.createSettingsContainer();const i=document.createElement("div");i.className="walk-divider";const r=this.createExitButton();return e.appendChild(t),e.appendChild(n),e.appendChild(this.settingsContainer),e.appendChild(i),e.appendChild(r),e}createLeftButtons(){const e=document.createElement("div");return e.className="walk-control-left",this.planViewBtn=this.createIconButton("plan-view",()=>{this.state.isPlanViewActive=!this.state.isPlanViewActive,this.updateButtonStates(),this.options.onPlanViewToggle?.(this.state.isPlanViewActive)}),this.pathModeBtn=this.createIconButton("path",()=>{const t=this.state.mode==="path"?"none":"path";this.setMode(t),this.options.onPathModeToggle?.(t==="path")}),e.appendChild(this.planViewBtn),e.appendChild(this.pathModeBtn),e}createSettingsContainer(){const e=document.createElement("div");e.className="walk-control-settings",this.speedControl=this.createSpeedControl();const t=document.createElement("label");t.className="walk-checkbox-wrapper walk-checkbox-gravity",this.gravityCheckbox=document.createElement("input"),this.gravityCheckbox.type="checkbox",this.gravityCheckbox.className="walk-checkbox",this.gravityCheckbox.checked=this.state.gravity,this.gravityCheckbox.addEventListener("change",()=>{this.state.gravity=this.gravityCheckbox.checked,this.options.onGravityToggle?.(this.state.gravity)}),this.gravityLabel=document.createElement("span"),this.gravityLabel.className="walk-checkbox-label",t.appendChild(this.gravityCheckbox),t.appendChild(this.gravityLabel);const n=document.createElement("label");n.className="walk-checkbox-wrapper walk-checkbox-collision",this.collisionCheckbox=document.createElement("input"),this.collisionCheckbox.type="checkbox",this.collisionCheckbox.className="walk-checkbox",this.collisionCheckbox.checked=this.state.collision,this.collisionCheckbox.addEventListener("change",()=>{this.state.collision=this.collisionCheckbox.checked,this.options.onCollisionToggle?.(this.state.collision)}),this.collisionLabel=document.createElement("span"),this.collisionLabel.className="walk-checkbox-label",n.appendChild(this.collisionCheckbox),n.appendChild(this.collisionLabel);const i=document.createElement("div");i.className="walk-select-wrapper walk-select-wrapper-character-model",this.characterModelLabel=document.createElement("label"),this.characterModelLabel.className="walk-select-label",this.characterModelSelect=document.createElement("select"),this.characterModelSelect.className="walk-select walk-select-character-model",this.characterModelSelect.addEventListener("change",()=>{this.state.characterModel=this.characterModelSelect.value,this.options.onCharacterModelChange?.(this.state.characterModel)}),i.appendChild(this.characterModelLabel),i.appendChild(this.characterModelSelect);const r=document.createElement("div");return r.className="walk-select-wrapper walk-select-wrapper-walk-mode",this.walkModeLabel=document.createElement("label"),this.walkModeLabel.className="walk-select-label",this.walkModeSelect=document.createElement("select"),this.walkModeSelect.className="walk-select walk-select-walk-mode",this.walkModeSelect.addEventListener("change",()=>{this.state.walkMode=this.walkModeSelect.value,this.options.onWalkModeChange?.(this.state.walkMode)}),r.appendChild(this.walkModeLabel),r.appendChild(this.walkModeSelect),e.appendChild(this.speedControl),e.appendChild(i),e.appendChild(r),e.appendChild(t),e.appendChild(n),e}createSpeedControl(){const e=document.createElement("div");e.className="walk-speed-control";const t=document.createElement("label");t.className="walk-speed-label",t.textContent=xe("walkControl.speed");const n=document.createElement("div");return n.className="walk-speed-group",this.speedDecreaseBtn=document.createElement("button"),this.speedDecreaseBtn.className="walk-speed-btn",this.speedDecreaseBtn.textContent="-",this.speedDecreaseBtn.addEventListener("click",()=>{this.state.speed>1&&(this.state.speed--,this.updateSpeedDisplay(),this.options.onSpeedChange?.(this.state.speed))}),this.speedDisplay=document.createElement("div"),this.speedDisplay.className="walk-speed-display",this.speedDisplay.textContent=`${this.state.speed}X`,this.speedIncreaseBtn=document.createElement("button"),this.speedIncreaseBtn.className="walk-speed-btn",this.speedIncreaseBtn.textContent="+",this.speedIncreaseBtn.addEventListener("click",()=>{this.state.speed<10&&(this.state.speed++,this.updateSpeedDisplay(),this.options.onSpeedChange?.(this.state.speed))}),n.appendChild(this.speedDecreaseBtn),n.appendChild(this.speedDisplay),n.appendChild(this.speedIncreaseBtn),e.appendChild(t),e.appendChild(n),e}createIconButton(e,t){const n=document.createElement("button");return n.className=`walk-icon-btn walk-icon-btn-${e}`,n.innerHTML=this.getIconSVG(e),n.addEventListener("click",t),n}createExitButton(){const e=document.createElement("button");return e.className="walk-exit-btn",e.addEventListener("click",()=>{this.options.onExit?.()}),this.exitBtn=e,e}setMode(e){const t=this.state.mode;t==="walk"&&e!=="walk"&&this.options.onWalkModeToggle?.(!1),t==="path"&&e!=="path"&&this.options.onPathModeToggle?.(!1),this.state.mode=e,e==="path"?(this.state.gravity=!1,this.state.collision=!1,this.gravityCheckbox.checked=!1,this.gravityCheckbox.disabled=!0,this.collisionCheckbox.checked=!1,this.collisionCheckbox.disabled=!0):(this.gravityCheckbox.disabled=!1,this.collisionCheckbox.disabled=!1),this.updateButtonStates(),this.updateSettingsView(),this.updateSpeedButtonStates()}updateButtonStates(){this.planViewBtn.classList.toggle("active",this.state.isPlanViewActive),this.pathModeBtn.classList.toggle("active",this.state.mode==="path")}updateSettingsView(){const e=this.speedControl,t=this.gravityCheckbox.parentElement,n=this.collisionCheckbox.parentElement,i=this.characterModelSelect.parentElement,r=this.walkModeSelect.parentElement;this.state.mode==="walk"?(e.style.display="none",t.style.display="flex",n.style.display="flex",i.style.display="flex",r.style.display="flex"):(e.style.display="flex",t.style.display="flex",n.style.display="flex",i.style.display="none",r.style.display="none")}updateSpeedDisplay(){this.speedDisplay.textContent=`${this.state.speed}X`,this.updateSpeedButtonStates()}updateSpeedButtonStates(){this.speedDecreaseBtn.disabled=this.state.speed<=1,this.speedIncreaseBtn.disabled=this.state.speed>=10}getIconSVG(e){return{"plan-view":at("地图"),path:at("路径漫游"),walk:at("第一人称漫游")}[e]||""}setLocales(){const e=this.speedControl.querySelector(".walk-speed-label");e&&(e.textContent=xe("walkControl.speed")),this.gravityLabel.textContent=xe("walkControl.gravity"),this.collisionLabel.textContent=xe("walkControl.collision"),this.characterModelLabel.textContent=xe("walkControl.characterModel.label"),this.characterModelSelect.innerHTML="";const t=document.createElement("option");t.value="construction-worker",t.textContent=xe("walkControl.characterModel.constructionWorker"),t.selected=this.state.characterModel==="construction-worker",this.characterModelSelect.appendChild(t);const n=document.createElement("option");n.value="office-male",n.textContent=xe("walkControl.characterModel.officeMale"),n.selected=this.state.characterModel==="office-male",this.characterModelSelect.appendChild(n),this.walkModeLabel.textContent=xe("walkControl.walkMode.label"),this.walkModeSelect.innerHTML="";const i=document.createElement("option");i.value="walk",i.textContent=xe("walkControl.walkMode.walk"),i.selected=this.state.walkMode==="walk",this.walkModeSelect.appendChild(i);const r=document.createElement("option");r.value="run",r.textContent=xe("walkControl.walkMode.run"),r.selected=this.state.walkMode==="run",this.walkModeSelect.appendChild(r),this.exitBtn.textContent=xe("walkControl.exit")}setTheme(e){if(!this.element)return;const t=this.element.style;t.setProperty("--bim-bg-base",e.bgBase??"#152232"),t.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-border-subtle",e.borderSubtle??"#1e293b"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-shadow-xl",e.shadowXl??"0 20px 40px rgba(0, 0, 0, 0.3)"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-hover",e.primaryHover??"#60a5fa"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-text-inverse",e.textInverse??"#152232"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)"),t.setProperty("--bim-component-bg-active",e.componentBgActive??"rgba(248, 250, 252, 0.1)")}destroy(){this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element&&this.element.parentElement&&this.element.parentElement.removeChild(this.element)}}class NT{element;registry;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e){this.registry=e}points=[];duration=1e4;loop=!1;playingPointIndex=-1;isPlaying=!1;init(){this.element=document.createElement("div"),this.element.className="walk-path-panel",this.unsubscribeLocale=Qt.subscribe(()=>this.render()),this.unsubscribeTheme=ot.subscribe(e=>this.setTheme(e)),this.loadPointsFromEngine(),this.render(),this.setTheme(ot.getTheme())}loadPointsFromEngine(){const e=this.registry.engine3d?.pathRoamingGetPoints()??[];this.points=e.map((t,n)=>({index:n}))}render(){this.element.innerHTML="";const e=this.createSettingsSection();this.element.appendChild(e);const t=this.createPointsSection();this.element.appendChild(t);const n=this.createPlayButton();this.element.appendChild(n)}createSettingsSection(){const e=document.createElement("div");e.className="walk-path-settings";const t=document.createElement("div");t.className="walk-path-form-group";const n=document.createElement("label");n.textContent=xe("walkControl.path.duration");const i=document.createElement("div");i.className="walk-path-input-wrapper";const r=document.createElement("input");r.type="number",r.className="walk-path-input",r.value=String(this.duration/1e3),r.min="1",r.oninput=h=>{const u=parseInt(h.target.value)||1;this.duration=u*1e3};const a=document.createElement("span");a.className="walk-path-unit",a.textContent=xe("walkControl.path.durationUnit"),i.appendChild(r),i.appendChild(a),t.appendChild(n),t.appendChild(i);const o=document.createElement("div");o.className="walk-path-form-group walk-path-form-group-inline";const l=document.createElement("input");l.type="checkbox",l.id="walk-path-loop-checkbox",l.className="walk-path-checkbox",l.checked=this.loop,l.onchange=h=>{this.loop=h.target.checked};const c=document.createElement("label");return c.htmlFor="walk-path-loop-checkbox",c.textContent=xe("walkControl.path.loop"),o.appendChild(l),o.appendChild(c),e.appendChild(t),e.appendChild(o),e}createPointsSection(){const e=document.createElement("div");e.className="walk-path-points-section";const t=document.createElement("div");t.className="walk-path-points-toolbar";const n=document.createElement("button");n.className="walk-path-btn walk-path-btn-small",n.textContent=`+ ${xe("walkControl.path.addPoint")}`,n.onclick=()=>this.addPoint();const i=document.createElement("button");i.className="walk-path-btn walk-path-btn-small walk-path-btn-danger",i.textContent=xe("walkControl.path.deleteAll"),i.onclick=()=>this.deleteAllPoints(),t.appendChild(n),t.appendChild(i),e.appendChild(t);const r=document.createElement("div");if(r.className="walk-path-points-list",this.points.length===0){const a=document.createElement("div");a.className="walk-path-empty",a.textContent=xe("walkControl.path.noPoints"),r.appendChild(a)}else this.points.forEach((a,o)=>{const l=this.createPointItem(o);r.appendChild(l)});return e.appendChild(r),e}createPointItem(e){const t=document.createElement("div");t.className="walk-path-point-item",this.playingPointIndex===e&&t.classList.add("walk-path-point-item-active");const n=document.createElement("span");n.className="walk-path-point-name",n.textContent=`${xe("walkControl.path.point")}${e}`;const i=document.createElement("div");i.className="walk-path-point-actions";const r=document.createElement("button");r.className="walk-path-btn-icon",r.innerHTML="▶",r.title=xe("walkControl.path.play"),r.onclick=o=>{o.stopPropagation(),this.jumpToPoint(e)};const a=document.createElement("button");return a.className="walk-path-btn-icon walk-path-btn-icon-danger",a.innerHTML="×",a.onclick=o=>{o.stopPropagation(),this.deletePoint(e)},i.appendChild(r),i.appendChild(a),t.appendChild(n),t.appendChild(i),t}createPlayButton(){const e=document.createElement("div");e.className="walk-path-btn-group";const t=document.createElement("button");t.className="walk-path-btn walk-path-btn-play",t.textContent=`▶ ${xe("walkControl.path.play")}`,t.disabled=this.points.length===0||this.isPlaying,t.onclick=()=>this.playPath();const n=document.createElement("button");return n.className="walk-path-btn walk-path-btn-stop",n.textContent=`■ ${xe("walkControl.path.stop")}`,n.disabled=!this.isPlaying,n.onclick=()=>this.stopPath(),e.appendChild(t),e.appendChild(n),e}addPoint(){this.registry.engine3d?.pathRoamingAddPoint();const e=this.points.length;this.points.push({index:e}),this.render()}deletePoint(e){this.registry.engine3d?.pathRoamingRemovePoint(e),this.points.splice(e,1),this.points.forEach((t,n)=>t.index=n),this.render()}deleteAllPoints(){this.registry.engine3d?.pathRoamingClearPoints(),this.points=[],this.render()}jumpToPoint(e){this.registry.engine3d?.pathRoamingJumpToPoint(e)}playPath(){this.points.length!==0&&(this.isPlaying=!0,this.render(),console.log("[WalkPathPanel] 开始播放漫游",{duration:this.duration,loop:this.loop,pointsCount:this.points.length}),this.registry.engine3d?.pathRoamingPlay({duration:this.duration,loop:this.loop,onPointComplete:e=>{console.log("[WalkPathPanel] onPointComplete",{pointIndex:e}),this.playingPointIndex=e,this.render()},onComplete:()=>{console.log("[WalkPathPanel] onComplete 播放完成"),this.isPlaying=!1,this.playingPointIndex=-1,this.render()}}))}stopPath(){console.log("[WalkPathPanel] 停止漫游"),this.registry.engine3d?.pathRoamingStop(),this.isPlaying=!1,this.playingPointIndex=-1,this.render()}setLocales(){this.render()}setTheme(e){this.element&&(this.element.style.setProperty("--bim-text-primary",e.textPrimary??"#fff"),this.element.style.setProperty("--bim-text-secondary",e.textSecondary??"#94a3b8"),this.element.style.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),this.element.style.setProperty("--bim-border-default",e.borderDefault??"#334155"),this.element.style.setProperty("--bim-primary",e.primary??"#3b82f6"))}destroy(){this.isPlaying&&this.stopPath(),this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element?.parentElement&&this.element.parentElement.removeChild(this.element)}}class BT extends Gs{panel=null;constructor(e){super(e)}get dialogId(){return"walk-path-dialog"}get dialogTitle(){return"walkControl.path.dialogTitle"}get dialogWidth(){return 300}get dialogHeight(){return 450}init(){}getDialogPosition(){const e=this.registry.container;return e?{x:e.clientWidth-this.dialogWidth-20,y:20}:{x:100,y:100}}createContent(){return this.panel=new NT(this.registry),this.panel.init(),this.panel.element}onDialogClose(){this.registry.walkControl&&this.registry.walkControl.panel&&this.registry.walkControl.panel.setPathModeActive(!1)}onBeforeDestroy(){this.panel&&(this.panel.destroy(),this.panel=null)}}class kT extends xi{panel=null;pathManager=null;constructor(e){super(e)}init(){this.pathManager=new BT(this.registry),this.pathManager.init()}show(){if(!this.registry.toolbar){console.warn("Toolbar not initialized");return}this.registry.toolbar.hide(),console.log("[WalkControl] 打开漫游面板,激活第一人称模式"),this.registry.engine3d?.activateFirstPersonMode(),this.panel=new IT({onPlanViewToggle:e=>{console.log("[WalkControl] 小地图:",e),this.registry.engine3d?.toggleMiniMap(),this.emit("walk:plan-view-toggle",{isActive:e})},onPathModeToggle:e=>{console.log("[WalkControl] 路径漫游:",e),e?this.pathManager?.show():this.pathManager?.hide(),this.emit("walk:path-mode-toggle",{isActive:e})},onWalkModeToggle:e=>{console.log("[WalkControl] 第三人称漫游按钮点击:",e),e&&(this.pathManager?.hide(),alert("第三人称功能开发中")),this.emit("walk:walk-mode-toggle",{isActive:e})},onSpeedChange:e=>{console.log("[WalkControl] 速度变化:",e);const t=e*.1;this.registry.engine3d?.setWalkSpeed(t),this.emit("walk:speed-change",{speed:e})},onGravityToggle:e=>{console.log("[WalkControl] 重力:",e),this.registry.engine3d?.setWalkGravity(e),this.emit("walk:gravity-toggle",{enabled:e})},onCollisionToggle:e=>{console.log("[WalkControl] 碰撞:",e),this.registry.engine3d?.setWalkCollision(e),this.emit("walk:collision-toggle",{enabled:e})},onCharacterModelChange:e=>{console.log("[WalkControl] 角色模型:",e)},onWalkModeChange:e=>{console.log("[WalkControl] 行走模式:",e)},onExit:()=>{this.hide()}}),this.panel.init(),this.registry.container?(this.panel.element.style.position="absolute",this.panel.element.style.bottom="20px",this.panel.element.style.left="50%",this.panel.element.style.transform="translateX(-50%)",this.panel.element.style.zIndex="1000",this.registry.container.appendChild(this.panel.element)):console.warn("[WalkControlManager] Container not found")}hide(){this.pathManager?.hide(),console.log("[WalkControl] 关闭漫游面板,退出第一人称模式"),this.registry.engine3d?.deactivateFirstPersonMode(),this.panel&&(this.panel.destroy(),this.panel=null),this.registry.toolbar&&this.registry.toolbar.show()}destroy(){this.hide(),this.pathManager?.destroy(),this.pathManager=null,super.destroy()}}class UT extends Gs{get dialogId(){return"engine-info-dialog"}get dialogTitle(){return"info.dialogTitle"}get dialogWidth(){return 280}constructor(e){super(e)}init(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight;return{x:(t-this.dialogWidth)/2,y:(n-150)/2}}createContent(){const e=this.registry.engine3d?.getEngineInfo()??null,t=document.createElement("div");t.className="engine-info-content",t.style.cssText="padding: 16px;";const n=(i,r)=>{const a=document.createElement("div");a.style.cssText="display: flex; justify-content: space-between; margin-bottom: 12px; font-size: 14px;";const o=document.createElement("span");o.style.cssText="color: var(--bim-text-secondary, #94a3b8);",o.textContent=i;const l=document.createElement("span");return l.style.cssText="color: var(--bim-text-primary, #fff); font-weight: 500;",l.textContent=String(r),a.appendChild(o),a.appendChild(l),a};return t.appendChild(n(xe("info.meshCount"),e?.meshCount??"-")),t.appendChild(n(xe("info.totalTriangles"),e?.totalTriangles??"-")),t.appendChild(n(xe("info.totalVertices"),e?.totalVertices??"-")),t}}const xd="font-size: 13px; color: var(--bim-text-secondary, #475569); margin-bottom: 8px;",OT="height: 1px; background: var(--bim-divider, #e2e8f0); margin: 14px 0;",vd="display: flex; align-items: center; justify-content: space-between; gap: 12px;",zT="font-size: 12px; color: var(--bim-text-secondary, #475569); min-width: 32px; text-align: right;",jr="var(--bim-border-default, #e2e8f0)",og="var(--bim-bg-inset, #f1f5f9)",Jl="var(--bim-primary, #3b82f6)",yd="var(--bim-text-primary, #0f172a)",FT="var(--bim-text-inverse, #ffffff)",HT="var(--bim-component-bg-hover, rgba(0,0,0,0.04))";class VT extends Gs{get dialogId(){return"setting-dialog"}get dialogTitle(){return"setting.dialogTitle"}get dialogWidth(){return 320}edgeLineEnabled=!1;groundType="none";groundSize=100;contrastValue=100;saturationValue=100;lightIntensityValue=100;environmentType="default";constructor(e){super(e)}init(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight;return{x:(t-this.dialogWidth)/2,y:Math.max(20,(n-520)/2)}}createContent(){this.ensureSliderStyle();const e=document.createElement("div");return e.style.cssText="padding: 16px; max-height: 480px; overflow-y: auto;",e.appendChild(this.createRenderModeSection()),e.appendChild(this.createDivider()),e.appendChild(this.createEdgeLineSection()),e.appendChild(this.createDivider()),e.appendChild(this.createSliderSection(xe("setting.lightIntensity"),this.lightIntensityValue,0,200,t=>{this.lightIntensityValue=t})),e.appendChild(this.createSliderSection(xe("setting.contrast"),this.contrastValue,0,200,t=>{this.contrastValue=t})),e.appendChild(this.createSliderSection(xe("setting.saturation"),this.saturationValue,0,200,t=>{this.saturationValue=t})),e.appendChild(this.createDivider()),e.appendChild(this.createEnvironmentSection()),e.appendChild(this.createDivider()),e.appendChild(this.createGroundSection()),e}createDivider(){const e=document.createElement("div");return e.style.cssText=OT,e}createRenderModeSection(){const e=this.registry.engine3d?.getRenderMode()??"balance",t=document.createElement("div"),n=document.createElement("div");n.style.cssText=xd,n.textContent=xe("setting.renderMode"),t.appendChild(n);const i=document.createElement("div");i.style.cssText=` + `,this.settingsBtn.addEventListener("click",()=>{this.openSettings()}),d.appendChild(this.clearBtn),d.appendChild(this.settingsBtn),this.mainViewEl.appendChild(d),this.settingsViewEl=this.createSettingsDom(),e.appendChild(this.mainViewEl),e.appendChild(this.settingsViewEl),e}createSettingsDom(){const e=document.createElement("div");e.className="bim-measure-settings";const t=document.createElement("div");t.className="bim-measure-settings-title",t.dataset.i18nKey="measure.settings.title",e.appendChild(t);const n=document.createElement("div");n.className="bim-measure-settings-row";const i=document.createElement("div");i.className="label",i.dataset.i18nKey="measure.settings.unit",this.unitSelectEl=document.createElement("select"),this.unitSelectEl.className="bim-measure-settings-select",this.unitSelectEl.appendChild(this.makeOption("m")),this.unitSelectEl.appendChild(this.makeOption("cm")),this.unitSelectEl.appendChild(this.makeOption("mm")),this.unitSelectEl.appendChild(this.makeOption("km")),n.appendChild(i),n.appendChild(this.unitSelectEl),e.appendChild(n);const r=document.createElement("div");r.className="bim-measure-settings-hint",r.dataset.i18nKey="measure.settings.hint",e.appendChild(r);const a=document.createElement("div");a.className="bim-measure-settings-row";const o=document.createElement("div");o.className="label",o.dataset.i18nKey="measure.settings.precision",this.precisionSelectEl=document.createElement("select"),this.precisionSelectEl.className="bim-measure-settings-select",this.precisionSelectEl.appendChild(this.makePrecisionOption(0)),this.precisionSelectEl.appendChild(this.makePrecisionOption(1)),this.precisionSelectEl.appendChild(this.makePrecisionOption(2)),this.precisionSelectEl.appendChild(this.makePrecisionOption(3)),a.appendChild(o),a.appendChild(this.precisionSelectEl),e.appendChild(a);const l=document.createElement("div");return l.className="bim-measure-settings-actions",this.saveSettingsBtn=document.createElement("button"),this.saveSettingsBtn.type="button",this.saveSettingsBtn.className="bim-measure-settings-save",this.saveSettingsBtn.addEventListener("click",()=>{this.saveSettings()}),this.cancelSettingsBtn=document.createElement("button"),this.cancelSettingsBtn.type="button",this.cancelSettingsBtn.className="bim-measure-settings-cancel",this.cancelSettingsBtn.addEventListener("click",()=>{this.cancelSettings()}),l.appendChild(this.saveSettingsBtn),l.appendChild(this.cancelSettingsBtn),e.appendChild(l),this.syncSettingsFormFromConfig(this.config),e}createModeOptionsDom(){const e=document.createElement("div");e.className="bim-measure-mode-options";const t=document.createElement("div");t.className="bim-measure-radio-group";const n=document.createElement("span");n.className="bim-measure-radio-label",n.dataset.i18nKey="measure.clearHeight.direction";const i=document.createElement("div");i.className="bim-measure-radio-items";const r=this.createRadioItem("measure.clearHeight.directionDown",()=>{this.setClearHeightDirection(0)}),a=this.createRadioItem("measure.clearHeight.directionUp",()=>{this.setClearHeightDirection(1)});this.directionBtns.set(0,r),this.directionBtns.set(1,a),i.appendChild(r),i.appendChild(a),t.appendChild(n),t.appendChild(i),e.appendChild(t);const o=document.createElement("div");o.className="bim-measure-radio-group";const l=document.createElement("span");l.className="bim-measure-radio-label",l.dataset.i18nKey="measure.clearHeight.selectType";const c=document.createElement("div");c.className="bim-measure-radio-items";const h=this.createRadioItem("measure.clearHeight.selectPoint",()=>{this.setClearHeightSelectType("point")}),u=this.createRadioItem("measure.clearHeight.selectElement",()=>{this.setClearHeightSelectType("element")});return this.selectTypeBtns.set("point",h),this.selectTypeBtns.set("element",u),c.appendChild(h),c.appendChild(u),o.appendChild(l),o.appendChild(c),e.appendChild(o),e}createRadioItem(e,t){const n=document.createElement("button");return n.type="button",n.className="bim-measure-radio-item",n.dataset.i18nKey=e,n.textContent=xe(e),n.addEventListener("click",t),n}setClearHeightDirection(e){this.clearHeightDirection!==e&&(this.clearHeightDirection=e,this.applyClearHeightOptionsState(),this.options.onClearHeightDirectionChange?.(e))}setClearHeightSelectType(e){this.clearHeightSelectType!==e&&(this.clearHeightSelectType=e,this.applyClearHeightOptionsState(),this.options.onClearHeightSelectTypeChange?.(e))}applyClearHeightOptionsState(){this.activeMode==="clearHeight"?this.modeOptionsEl.classList.add("is-visible"):this.modeOptionsEl.classList.remove("is-visible");for(const[e,t]of this.directionBtns.entries())e===this.clearHeightDirection?t.classList.add("is-active"):t.classList.remove("is-active");for(const[e,t]of this.selectTypeBtns.entries())e===this.clearHeightSelectType?t.classList.add("is-active"):t.classList.remove("is-active")}makeOption(e){const t=document.createElement("option");return t.value=e,t.textContent=e,t}makePrecisionOption(e){const t=document.createElement("option");return t.value=String(e),t.textContent=e===0?"0":`0.${"0".repeat(e)}`,t}enterSettingsView(){this.draftConfig={...this.config},this.view="settings",this.syncSettingsFormFromConfig(this.config),this.applyViewState()}saveSettings(){const e=this.unitSelectEl.value||this.config.unit,t=Number(this.precisionSelectEl.value),n={unit:e,precision:this.isValidPrecision(t)?t:this.config.precision};this.config=n,this.saveConfigToCache(n),this.draftConfig=null,this.view="main",this.applyViewState(),this.renderResult(),this.options.onConfigSave?.(n),this.options.onExpandedChange?.(this.isExpanded)}cancelSettings(){this.draftConfig&&(this.config={...this.draftConfig}),this.draftConfig=null,this.view="main",this.applyViewState(),this.renderResult(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded)}syncSettingsFormFromConfig(e){this.unitSelectEl.value=e.unit,this.precisionSelectEl.value=String(e.precision)}applyViewState(){this.view==="settings"?(this.mainViewEl.style.display="none",this.settingsViewEl.style.display="block"):(this.mainViewEl.style.display="block",this.settingsViewEl.style.display="none")}loadConfigFromCache(){try{const e=localStorage.getItem(ja.CONFIG_CACHE_KEY);if(!e)return null;const t=JSON.parse(e);if(!t||typeof t!="object")return null;const n=t.unit,i=t.precision;return!this.isValidUnit(n)||!this.isValidPrecision(i)?null:{unit:n,precision:i}}catch{return null}}saveConfigToCache(e){try{localStorage.setItem(ja.CONFIG_CACHE_KEY,JSON.stringify(e))}catch{}}isValidUnit(e){return e==="m"||e==="cm"||e==="mm"||e==="km"}isValidPrecision(e){return e===0||e===1||e===2||e===3}applyExpandedState(){let e=0;for(const t of this.toolButtons.values())e>=4?t.style.display=this.isExpanded?"":"none":t.style.display="",e++;this.isExpanded?this.toggleBtn.classList.add("is-expanded"):this.toggleBtn.classList.remove("is-expanded")}applyActiveModeState(){for(const[e,t]of this.toolButtons.entries())e===this.activeMode?t.classList.add("is-active"):t.classList.remove("is-active")}renderResult(){if(this.activeMode==="point"){this.mainValueRowEl.style.display="none",this.xyzBoxEl.style.display="";const n=this.result?.xyz;if(!n){this.xyzXEl.textContent="--",this.xyzYEl.textContent="--",this.xyzZEl.textContent="--";return}this.xyzXEl.textContent=this.convertValue("length",n.x)+" "+this.getUnitText("length"),this.xyzYEl.textContent=this.convertValue("length",n.y)+" "+this.getUnitText("length"),this.xyzZEl.textContent=this.convertValue("length",n.z)+" "+this.getUnitText("length");return}this.mainValueRowEl.style.display="",this.mainValueLabelEl.textContent=xe(this.getModeValueLabelI18nKey(this.activeMode));const t=this.result?this.result[Xa[this.activeMode].callBackType]:void 0;if(this.activeMode==="slope"||this.activeMode==="angle")this.mainNumberEl.textContent=t??"--",this.mainUnitEl.textContent="";else{const n=rg(this.activeMode);this.mainNumberEl.textContent=this.convertValue(n,t),this.mainUnitEl.textContent=this.getUnitText(n)}this.xyzBoxEl.style.display="none"}getModeI18nKey(e){return`measure.modes.${e}`}getModeValueLabelI18nKey(e){return`measure.labels.value.${e}`}convertValue(e,t){if(t==null||Number.isNaN(t))return"--";const n=this.config.unit,i=this.config.precision;let r;switch(e){case"length":switch(n){case"mm":r=t*1e3;break;case"cm":r=t*100;break;case"km":r=t/1e3;break;default:r=t}break;case"area":switch(n){case"mm":r=t*1e3*1e3;break;case"cm":r=t*100*100;break;case"km":r=t/1e3/1e3;break;default:r=t}break;case"angle":case"percent":case"point":default:r=t}return r.toFixed(i)}getUnitText(e){const t=this.config.unit;switch(e){case"length":case"point":return t;case"area":return`${t}²`;case"angle":case"percent":return"°";default:return""}}}class CC extends Gs{panel=null;config=null;unsubscribeMeasureChanged=null;constructor(e){super(e)}get dialogId(){return"measure-dialog"}get dialogTitle(){return"measure.dialogTitle"}get dialogWidth(){return 250}createContent(){this.panel=new ja({defaultMode:"distance",defaultExpanded:!1,onModeChange:t=>{console.log("[MeasureDialogManager] 当前测量方式已切换:",t),this.engineComponent?.activateMeasure(t)},onClearAll:()=>{console.log("[MeasureDialogManager] 删除全部"),this.engineComponent?.clearAllMeasures()},onSettings:()=>{console.log("[MeasureDialogManager] 打开设置")},onExpandedChange:()=>{this.dialog?.fitHeight(!1)},onConfigSave:t=>{console.log("[MeasureDialogManager] 保存设置:",t),this.engineComponent?.saveMeasureSetting({unit:t.unit,precision:t.precision})},onClearHeightDirectionChange:t=>{console.log("[MeasureDialogManager] 净高朝向切换:",t),this.engineComponent?.setClearHeightDirection(t)},onClearHeightSelectTypeChange:t=>{console.log("[MeasureDialogManager] 净高选择对象切换:",t),this.engineComponent?.setClearHeightSelectType(t)}}),this.panel.init(),this.config=this.panel.getConfig(),this.config&&(console.log("[MeasureDialogManager] 同步缓存设置到引擎:",this.config),this.engineComponent?.saveMeasureSetting({unit:this.config.unit,precision:this.config.precision}));const e=document.createElement("div");return e.style.padding="12px",e.appendChild(this.panel.element),e}onDialogCreated(){this.dialog?.fitHeight(!1),this.engineComponent?.setClearHeightDirection(0),this.engineComponent?.setClearHeightSelectType("point");const e=this.engineComponent;if(e){const t=n=>{console.log("[MeasureDialogManager] 测量值回调:",n),n&&this.panel&&this.handleMeasureChanged(n)};e.onRawEvent("measure-changed",t),e.onRawEvent("measure-click",t),this.unsubscribeMeasureChanged=()=>{e.offRawEvent("measure-changed",t),e.offRawEvent("measure-click",t)}}}handleMeasureChanged(e){if(!this.panel)return;const t=EC(e.type);if(!t){console.warn("[MeasureDialogManager] 未知测量类型:",e.type);return}this.panel.getActiveMode()!==t&&this.panel.switchMode(t,!1);const i=this.convertToMeasureResult(e,t);this.panel.setResult(i)}convertToMeasureResult(e,t){const n=Xa[t],i={};return rg(t)==="point"?e.textX!==void 0&&e.textY!==void 0&&e.textZ!==void 0&&(i.xyz={x:e.textX,y:e.textY,z:e.textZ}):i[n.callBackType]=e.text,i}onDialogClose(){this.unsubscribeMeasureChanged&&(this.unsubscribeMeasureChanged(),this.unsubscribeMeasureChanged=null),this.registry.toolbar?.setBtnActive("measure",!1)}onBeforeDestroy(){this.unsubscribeMeasureChanged&&(this.unsubscribeMeasureChanged(),this.unsubscribeMeasureChanged=null),this.engineComponent?.deactivateMeasure(),this.panel&&(this.panel.destroy(),this.panel=null)}getActiveMode(){return this.panel?this.panel.getActiveMode():null}switchMode(e){this.panel&&this.panel.switchMode(e)}setMeasureResult(e){this.panel&&this.panel.setResult(e)}getConfig(){return this.panel&&(this.config=this.panel.getConfig()),this.config?{...this.config}:null}setConfig(e,t=!0){if(this.panel){this.panel.setConfig(e,t),this.config=this.panel.getConfig(),this.dialog?.fitHeight(!1);return}const n=this.config,i={unit:e.unit??n?.unit??"mm",precision:e.precision??n?.precision??2};this.config=i}clearAll(){this.panel&&this.panel.clearAll()}openSettings(){this.panel&&this.panel.openSettings()}}class TC{element;options;isHidden=!1;hideBtn;reverseBtn;resetBtn;hideLabelEl;reverseLabelEl;resetLabelEl;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.isHidden=e.defaultHidden??!1,this.element=this.createDom()}setHiddenState(e){this.isHidden=e,this.updateButtonStates()}getHiddenState(){return this.isHidden}updateButtonStates(){this.hideBtn?.classList.toggle("active",this.isHidden)}init(){this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)}),this.setLocales(),this.setTheme(ot.getTheme())}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}setLocales(){this.hideLabelEl.textContent=xe("sectionPlane.actions.hide"),this.reverseLabelEl.textContent=xe("sectionPlane.actions.reverse"),this.resetLabelEl.textContent=xe("sectionPlane.actions.reset"),this.hideBtn.title=xe("sectionPlane.actions.hide"),this.reverseBtn.title=xe("sectionPlane.actions.reverse"),this.resetBtn.title=xe("sectionPlane.actions.reset")}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove()}createDom(){const e=document.createElement("div");return e.className="section-plane-panel",this.hideBtn=this.createButton("hide",at("隐藏"),()=>{this.isHidden=!this.isHidden,this.updateButtonStates(),this.options.onHideToggle?.(this.isHidden)}),this.reverseBtn=this.createButton("reverse",at("反向"),()=>{this.options.onReverse&&this.options.onReverse()}),this.resetBtn=this.createButton("reset",at("重置"),()=>{this.options.onReset&&this.options.onReset()}),e.appendChild(this.hideBtn),e.appendChild(this.reverseBtn),e.appendChild(this.resetBtn),e}createButton(e,t,n){const i=document.createElement("button");i.type="button",i.className="section-plane-btn";const r=document.createElement("div");r.className="section-plane-btn-icon",r.innerHTML=t,i.appendChild(r);const a=document.createElement("div");return a.className="section-plane-btn-label",i.appendChild(a),e==="hide"?this.hideLabelEl=a:e==="reverse"?this.reverseLabelEl=a:this.resetLabelEl=a,i.addEventListener("click",n),i}}class AC extends Gs{panel=null;constructor(e){super(e)}get dialogId(){return"section-plane-dialog"}get dialogTitle(){return"sectionPlane.dialogTitle"}get dialogWidth(){return 240}get dialogHeight(){return 120}init(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=20,n=50,i=e.clientWidth,r=e.clientHeight;return{x:i-this.dialogWidth-t,y:r-this.dialogHeight-n}}createContent(){return this.panel=new TC({defaultHidden:!1,onHideToggle:e=>{console.log("[SectionPlaneDialogManager] 隐藏切换:",e),e?this.engineComponent?.hideSection():this.engineComponent?.recoverSection()},onReverse:()=>{console.log("[SectionPlaneDialogManager] 反向 (not supported in new API)")},onReset:()=>{console.log("[SectionPlaneDialogManager] 重置 (not supported in new API)")}}),this.panel.init(),this.panel.element}onDialogCreated(){this.engineComponent?.activeSection("face"),this.dialog?.fitHeight(!1)}onDialogClose(){this.registry.toolbar?.setBtnActive("section-plane",!1)}onBeforeDestroy(){this.engineComponent?.deactivateSection(),this.panel&&(this.panel.destroy(),this.panel=null)}}class PC{element;options;isHidden=!1;activeAxis="x";hideBtn;reverseBtn;hideLabelEl;reverseLabelEl;axisXBtn;axisYBtn;axisZBtn;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.isHidden=e.defaultHidden??!1,this.activeAxis=e.defaultAxis??"x",this.element=this.createDom()}init(){this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)}),this.setLocales(),this.setTheme(ot.getTheme()),this.updateHideButtonState(),this.updateAxisButtonsState()}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}setLocales(){this.hideLabelEl.textContent=xe("sectionAxis.actions.hide"),this.reverseLabelEl.textContent=xe("sectionAxis.actions.reverse"),this.hideBtn.title=xe("sectionAxis.actions.hide"),this.reverseBtn.title=xe("sectionAxis.actions.reverse"),this.axisXBtn.title=xe("sectionAxis.actions.axisX"),this.axisYBtn.title=xe("sectionAxis.actions.axisY"),this.axisZBtn.title=xe("sectionAxis.actions.axisZ")}setHiddenState(e){this.isHidden=e,this.updateHideButtonState()}getHiddenState(){return this.isHidden}setActiveAxis(e){this.activeAxis=e,this.updateAxisButtonsState()}getActiveAxis(){return this.activeAxis}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove()}createDom(){const e=document.createElement("div");e.className="section-axis-panel";const t=document.createElement("div");t.className="section-axis-row-1",this.hideBtn=this.createButton("hide",at("隐藏"),()=>this.handleHideToggle()),this.reverseBtn=this.createButton("reverse",at("反向"),()=>this.handleReverse()),t.appendChild(this.hideBtn),t.appendChild(this.reverseBtn);const n=document.createElement("div");return n.className="section-axis-row-2",this.axisXBtn=this.createAxisButton("axisX","X",()=>this.handleAxisChange("x")),this.axisYBtn=this.createAxisButton("axisY","Y",()=>this.handleAxisChange("y")),this.axisZBtn=this.createAxisButton("axisZ","Z",()=>this.handleAxisChange("z")),n.appendChild(this.axisXBtn),n.appendChild(this.axisYBtn),n.appendChild(this.axisZBtn),e.appendChild(t),e.appendChild(n),e}createButton(e,t,n){const i=document.createElement("button");i.type="button",i.className="section-axis-btn";const r=document.createElement("div");r.className="section-axis-btn-icon",r.innerHTML=t,i.appendChild(r);const a=document.createElement("div");return a.className="section-axis-btn-label",i.appendChild(a),e==="hide"?this.hideLabelEl=a:e==="reverse"&&(this.reverseLabelEl=a),i.addEventListener("click",n),i}createAxisButton(e,t,n){const i=document.createElement("button");i.type="button",i.className="section-axis-btn section-axis-btn-text";const r=document.createElement("div");return r.className="section-axis-btn-label",r.textContent=t,i.appendChild(r),i.addEventListener("click",n),i}handleHideToggle(){this.isHidden=!this.isHidden,this.updateHideButtonState(),this.options.onHideToggle&&this.options.onHideToggle(this.isHidden)}handleReverse(){this.options.onReverse&&this.options.onReverse()}handleAxisChange(e){this.activeAxis!==e&&(this.activeAxis=e,this.updateAxisButtonsState(),this.options.onAxisChange&&this.options.onAxisChange(e))}updateHideButtonState(){this.isHidden?this.hideBtn.classList.add("active"):this.hideBtn.classList.remove("active")}updateAxisButtonsState(){this.axisXBtn.classList.toggle("active",this.activeAxis==="x"),this.axisYBtn.classList.toggle("active",this.activeAxis==="y"),this.axisZBtn.classList.toggle("active",this.activeAxis==="z")}}class RC extends Gs{panel=null;constructor(e){super(e)}get dialogId(){return"section-axis-dialog"}get dialogTitle(){return"sectionAxis.dialogTitle"}get dialogWidth(){return 240}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight;return{x:t-this.dialogWidth-20,y:n-50-200}}createContent(){return this.panel=new PC({defaultAxis:"x",defaultHidden:!1,onHideToggle:e=>{console.log("[SectionAxisDialogManager] 隐藏切换:",e),e?this.engineComponent?.hideSection():this.engineComponent?.recoverSection()},onReverse:()=>{console.log("[SectionAxisDialogManager] 反向剖切(暂不支持)")},onAxisChange:e=>{console.log("[SectionAxisDialogManager] 切换轴向:",e),this.engineComponent?.activeSection(e)}}),this.panel.init(),this.panel.element}onDialogCreated(){if(this.dialog?.fitHeight(!1),!this.engineComponent){console.error("[SectionAxisDialogManager] Engine not initialized. Call initEngine() first.");return}this.engineComponent.activeSection("x")}onDialogClose(){this.registry.toolbar?.setBtnActive("section-axis",!1)}onBeforeDestroy(){this.engineComponent?.deactivateSection(),this.panel&&(this.panel.destroy(),this.panel=null)}getHiddenState(){return this.panel?.getHiddenState()??!1}setHiddenState(e){this.panel?.setHiddenState(e)}getActiveAxis(){return this.panel?.getActiveAxis()??"x"}setActiveAxis(e){this.panel?.setActiveAxis(e)}}const ag={x:{min:0,max:100},y:{min:0,max:100},z:{min:0,max:100}};class LC{element;options;isHidden=!1;isReversed=!1;range;hideBtn;reverseBtn;fitBtn;resetBtn;hideLabelEl;reverseLabelEl;fitLabelEl;resetLabelEl;xLabelEl;yLabelEl;zLabelEl;unsubscribeLocale=null;unsubscribeTheme=null;xSlider;ySlider;zSlider;xMinHandle;xMaxHandle;yMinHandle;yMaxHandle;zMinHandle;zMaxHandle;dragState={isDragging:!1,axis:null,handleType:null,pointerId:null};constructor(e={}){this.options=e,this.isHidden=e.defaultHidden??!1,this.isReversed=e.defaultReversed??!1,this.range=JSON.parse(JSON.stringify(e.defaultRange??ag))}init(){this.element=this.createPanel(),this.unsubscribeLocale=Qt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=ot.subscribe(e=>this.setTheme(e)),this.setLocales(),this.setTheme(ot.getTheme()),this.updateButtonStates(),this.updateAllSlidersUI(),this.setupDragListeners()}setHiddenState(e){this.isHidden=e,this.updateButtonStates()}getHiddenState(){return this.isHidden}setReversedState(e){this.isReversed=e,this.updateButtonStates()}getReversedState(){return this.isReversed}setRange(e){e.x&&(this.range.x={...this.range.x,...e.x}),e.y&&(this.range.y={...this.range.y,...e.y}),e.z&&(this.range.z={...this.range.z,...e.z}),this.updateAllSlidersUI()}getRange(){return JSON.parse(JSON.stringify(this.range))}reset(){this.isHidden=this.options.defaultHidden??!1,this.isReversed=this.options.defaultReversed??!1,this.range=JSON.parse(JSON.stringify(this.options.defaultRange??ag)),this.updateButtonStates(),this.updateAllSlidersUI(),this.options.onReset?.(),this.options.onRangeChange?.(this.range)}createPanel(){const e=document.createElement("div");e.className="section-box-panel";const t=document.createElement("div");t.className="section-box-row-buttons",this.hideBtn=this.createButton("hide",xe("sectionBox.actions.hide"),()=>{this.isHidden=!this.isHidden,this.updateButtonStates(),this.options.onHideToggle?.(this.isHidden)},"hide"),this.reverseBtn=this.createButton("reverse",xe("sectionBox.actions.reverse"),()=>{this.isReversed=!this.isReversed,this.updateButtonStates(),this.options.onReverseToggle?.(this.isReversed)},"reverse"),this.fitBtn=this.createButton("fit",xe("sectionBox.actions.fitToModel"),()=>{this.options.onFitToModel?.()},"fit"),this.resetBtn=this.createButton("reset",xe("sectionBox.actions.reset"),()=>this.reset(),"reset"),[this.hideBtn,this.reverseBtn,this.fitBtn,this.resetBtn].forEach(i=>t.appendChild(i));const n=document.createElement("div");return n.className="section-box-sliders",n.addEventListener("pointerdown",i=>i.stopPropagation()),this.xSlider=this.createSlider("x",xe("sectionBox.axes.x")),this.ySlider=this.createSlider("y",xe("sectionBox.axes.y")),this.zSlider=this.createSlider("z",xe("sectionBox.axes.z")),[this.xSlider,this.ySlider,this.zSlider].forEach(i=>n.appendChild(i)),e.appendChild(t),e.appendChild(n),e}createButton(e,t,n,i){const r=document.createElement("button");r.className="section-box-btn",r.title=t;const a={hide:"隐藏",reverse:"反向",fit:"适应到模型",reset:"重置"},o=document.createElement("div");o.className="section-box-btn-icon",o.innerHTML=at(a[e]||e);const l=document.createElement("div");return l.className="section-box-btn-label",l.textContent=t,i==="hide"?this.hideLabelEl=l:i==="reverse"?this.reverseLabelEl=l:i==="fit"?this.fitLabelEl=l:i==="reset"&&(this.resetLabelEl=l),r.appendChild(o),r.appendChild(l),r.addEventListener("click",n),r}createSlider(e,t){const n=document.createElement("div");n.className="section-box-slider";const i=document.createElement("div");i.className="section-box-slider-label",i.textContent=t,e==="x"?this.xLabelEl=i:e==="y"?this.yLabelEl=i:this.zLabelEl=i;const r=document.createElement("div");r.className="section-box-slider-track";const a=document.createElement("div");a.className="section-box-slider-range";const o=document.createElement("div");o.className="section-box-slider-handle",o.setAttribute("data-axis",e),o.setAttribute("data-handle","min");const l=document.createElement("div");return l.className="section-box-slider-handle",l.setAttribute("data-axis",e),l.setAttribute("data-handle","max"),r.append(a,o,l),n.append(i,r),e==="x"?(this.xMinHandle=o,this.xMaxHandle=l):e==="y"?(this.yMinHandle=o,this.yMaxHandle=l):(this.zMinHandle=o,this.zMaxHandle=l),n}setupDragListeners(){[this.xMinHandle,this.xMaxHandle,this.yMinHandle,this.yMaxHandle,this.zMinHandle,this.zMaxHandle].forEach(t=>{t.addEventListener("pointerdown",i=>{i.preventDefault(),i.stopPropagation(),t.setPointerCapture(i.pointerId),this.dragState={isDragging:!0,axis:t.getAttribute("data-axis"),handleType:t.getAttribute("data-handle"),pointerId:i.pointerId},t.classList.add("dragging"),t.closest(".section-box-slider").style.zIndex="100"}),t.addEventListener("pointermove",i=>{this.dragState.isDragging&&this.dragState.pointerId===i.pointerId&&this.onDragging(i)});const n=i=>{this.dragState.isDragging&&this.dragState.pointerId===i.pointerId&&(t.hasPointerCapture(i.pointerId)&&t.releasePointerCapture(i.pointerId),t.closest(".section-box-slider").style.zIndex="",t.classList.remove("dragging"),this.dragState={isDragging:!1,axis:null,handleType:null,pointerId:null})};t.addEventListener("pointerup",n),t.addEventListener("pointercancel",n),t.addEventListener("lostpointercapture",n)})}onDragging(e){const{axis:t,handleType:n}=this.dragState;if(!t||!n)return;const a=(t==="x"?this.xSlider:t==="y"?this.ySlider:this.zSlider).querySelector(".section-box-slider-track").getBoundingClientRect();let o=(e.clientX-a.left)/a.width*100;o=Math.max(0,Math.min(100,o));const l=this.range[t];n==="min"?l.min=Math.min(o,l.max):l.max=Math.max(o,l.min),this.updateSliderUI(t),this.options.onRangeChange?.(this.range)}updateSliderUI(e){const t=this.range[e],n=e==="x"?this.xMinHandle:e==="y"?this.yMinHandle:this.zMinHandle,i=e==="x"?this.xMaxHandle:e==="y"?this.yMaxHandle:this.zMaxHandle,a=(e==="x"?this.xSlider:e==="y"?this.ySlider:this.zSlider).querySelector(".section-box-slider-range");n.style.left=`${t.min}%`,i.style.left=`${t.max}%`,a.style.left=`${t.min}%`,a.style.width=`${t.max-t.min}%`,n.setAttribute("data-value",Math.round(t.min).toString()),i.setAttribute("data-value",Math.round(t.max).toString())}updateAllSlidersUI(){["x","y","z"].forEach(e=>this.updateSliderUI(e))}updateButtonStates(){this.hideBtn&&this.hideBtn.classList.toggle("active",this.isHidden),this.reverseBtn&&this.reverseBtn.classList.toggle("active",this.isReversed)}setLocales(){this.hideLabelEl&&(this.hideLabelEl.textContent=xe("sectionBox.actions.hide"),this.reverseLabelEl.textContent=xe("sectionBox.actions.reverse"),this.fitLabelEl.textContent=xe("sectionBox.actions.fitToModel"),this.resetLabelEl.textContent=xe("sectionBox.actions.reset"),this.xLabelEl.textContent=xe("sectionBox.axes.x"),this.yLabelEl.textContent=xe("sectionBox.axes.y"),this.zLabelEl.textContent=xe("sectionBox.axes.z"),this.hideBtn.title=xe("sectionBox.actions.hide"),this.reverseBtn.title=xe("sectionBox.actions.reverse"),this.fitBtn.title=xe("sectionBox.actions.fitToModel"),this.resetBtn.title=xe("sectionBox.actions.reset"))}setTheme(e){if(!this.element)return;const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}destroy(){this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element&&this.element.parentElement&&this.element.parentElement.removeChild(this.element)}}class DC extends Gs{panel=null;unsubscribeSectionMove=null;constructor(e){super(e)}get dialogId(){return"section-box-dialog"}get dialogTitle(){return"sectionBox.dialogTitle"}get dialogWidth(){return 280}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight;return{x:t-this.dialogWidth-20,y:n-50-300}}createContent(){return this.panel=new LC({defaultHidden:!1,defaultReversed:!1,onHideToggle:e=>{console.log("[SectionBoxDialogManager] 隐藏切换:",e),e?this.engineComponent?.hideSection():this.engineComponent?.recoverSection()},onReverseToggle:e=>{console.log("[SectionBoxDialogManager] 反向切换:",e),this.engineComponent?.reverseSection()},onFitToModel:()=>{this.engineComponent?.scaleSectionBox()},onReset:()=>{this.engineComponent?.deactivateSection(),this.engineComponent?.activeSection("box"),this.engineComponent?.recoverSection()},onRangeChange:e=>{this.engineComponent?.setSectionBoxRange(e)}}),this.panel.init(),this.panel.element}onDialogCreated(){this.engineComponent?.activeSection("box"),this.dialog?.fitHeight(!1);const e=this.engineComponent;if(e){const t=n=>{n&&this.panel&&this.panel.setRange(n)};e.onRawEvent("section-move",t),this.unsubscribeSectionMove=()=>e.offRawEvent("section-move",t)}}onDialogClose(){this.unsubscribeSectionMove&&(this.unsubscribeSectionMove(),this.unsubscribeSectionMove=null),this.registry.toolbar?.setBtnActive("section-box",!1)}onBeforeDestroy(){this.unsubscribeSectionMove&&(this.unsubscribeSectionMove(),this.unsubscribeSectionMove=null),this.engineComponent?.deactivateSection(),this.panel&&(this.panel.destroy(),this.panel=null)}getHiddenState(){return this.panel?.getHiddenState()??!1}setHiddenState(e){this.panel?.setHiddenState(e)}getReversedState(){return this.panel?.getReversedState()??!1}setReversedState(e){this.panel?.setReversedState(e)}getRange(){return this.panel?.getRange()??null}setRange(e){this.panel?.setRange(e)}}class IC{element;options;state={mode:"none",isPlanViewActive:!1,speed:1,gravity:!1,collision:!1,characterModel:"construction-worker",walkMode:"walk"};planViewBtn;pathModeBtn;settingsContainer;speedControl;speedDecreaseBtn;speedIncreaseBtn;speedDisplay;gravityCheckbox;gravityLabel;collisionCheckbox;collisionLabel;characterModelSelect;characterModelLabel;walkModeSelect;walkModeLabel;exitBtn;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.state.speed=e.defaultSpeed??1,this.state.gravity=e.defaultGravity??!1,this.state.collision=e.defaultCollision??!1,this.state.characterModel=e.defaultCharacterModel??"construction-worker",this.state.walkMode=e.defaultWalkMode??"walk"}init(){this.element=this.createPanel(),this.updateSettingsView(),this.unsubscribeLocale=Qt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=ot.subscribe(e=>this.setTheme(e)),this.setLocales(),this.setTheme(ot.getTheme())}setPlanViewActive(e){this.state.isPlanViewActive=e,this.updateButtonStates()}setPathModeActive(e){if(!e&&this.state.mode!=="path")return;const t=e?"path":"none";this.setMode(t)}getState(){return{...this.state}}createPanel(){const e=document.createElement("div");e.className="walk-control-panel";const t=this.createLeftButtons(),n=document.createElement("div");n.className="walk-divider",this.settingsContainer=this.createSettingsContainer();const i=document.createElement("div");i.className="walk-divider";const r=this.createExitButton();return e.appendChild(t),e.appendChild(n),e.appendChild(this.settingsContainer),e.appendChild(i),e.appendChild(r),e}createLeftButtons(){const e=document.createElement("div");return e.className="walk-control-left",this.planViewBtn=this.createIconButton("plan-view",()=>{this.state.isPlanViewActive=!this.state.isPlanViewActive,this.updateButtonStates(),this.options.onPlanViewToggle?.(this.state.isPlanViewActive)}),this.pathModeBtn=this.createIconButton("path",()=>{const t=this.state.mode==="path"?"none":"path";this.setMode(t),this.options.onPathModeToggle?.(t==="path")}),e.appendChild(this.planViewBtn),e.appendChild(this.pathModeBtn),e}createSettingsContainer(){const e=document.createElement("div");e.className="walk-control-settings",this.speedControl=this.createSpeedControl();const t=document.createElement("label");t.className="walk-checkbox-wrapper walk-checkbox-gravity",this.gravityCheckbox=document.createElement("input"),this.gravityCheckbox.type="checkbox",this.gravityCheckbox.className="walk-checkbox",this.gravityCheckbox.checked=this.state.gravity,this.gravityCheckbox.addEventListener("change",()=>{this.state.gravity=this.gravityCheckbox.checked,this.options.onGravityToggle?.(this.state.gravity)}),this.gravityLabel=document.createElement("span"),this.gravityLabel.className="walk-checkbox-label",t.appendChild(this.gravityCheckbox),t.appendChild(this.gravityLabel);const n=document.createElement("label");n.className="walk-checkbox-wrapper walk-checkbox-collision",this.collisionCheckbox=document.createElement("input"),this.collisionCheckbox.type="checkbox",this.collisionCheckbox.className="walk-checkbox",this.collisionCheckbox.checked=this.state.collision,this.collisionCheckbox.addEventListener("change",()=>{this.state.collision=this.collisionCheckbox.checked,this.options.onCollisionToggle?.(this.state.collision)}),this.collisionLabel=document.createElement("span"),this.collisionLabel.className="walk-checkbox-label",n.appendChild(this.collisionCheckbox),n.appendChild(this.collisionLabel);const i=document.createElement("div");i.className="walk-select-wrapper walk-select-wrapper-character-model",this.characterModelLabel=document.createElement("label"),this.characterModelLabel.className="walk-select-label",this.characterModelSelect=document.createElement("select"),this.characterModelSelect.className="walk-select walk-select-character-model",this.characterModelSelect.addEventListener("change",()=>{this.state.characterModel=this.characterModelSelect.value,this.options.onCharacterModelChange?.(this.state.characterModel)}),i.appendChild(this.characterModelLabel),i.appendChild(this.characterModelSelect);const r=document.createElement("div");return r.className="walk-select-wrapper walk-select-wrapper-walk-mode",this.walkModeLabel=document.createElement("label"),this.walkModeLabel.className="walk-select-label",this.walkModeSelect=document.createElement("select"),this.walkModeSelect.className="walk-select walk-select-walk-mode",this.walkModeSelect.addEventListener("change",()=>{this.state.walkMode=this.walkModeSelect.value,this.options.onWalkModeChange?.(this.state.walkMode)}),r.appendChild(this.walkModeLabel),r.appendChild(this.walkModeSelect),e.appendChild(this.speedControl),e.appendChild(i),e.appendChild(r),e.appendChild(t),e.appendChild(n),e}createSpeedControl(){const e=document.createElement("div");e.className="walk-speed-control";const t=document.createElement("label");t.className="walk-speed-label",t.textContent=xe("walkControl.speed");const n=document.createElement("div");return n.className="walk-speed-group",this.speedDecreaseBtn=document.createElement("button"),this.speedDecreaseBtn.className="walk-speed-btn",this.speedDecreaseBtn.textContent="-",this.speedDecreaseBtn.addEventListener("click",()=>{this.state.speed>1&&(this.state.speed--,this.updateSpeedDisplay(),this.options.onSpeedChange?.(this.state.speed))}),this.speedDisplay=document.createElement("div"),this.speedDisplay.className="walk-speed-display",this.speedDisplay.textContent=`${this.state.speed}X`,this.speedIncreaseBtn=document.createElement("button"),this.speedIncreaseBtn.className="walk-speed-btn",this.speedIncreaseBtn.textContent="+",this.speedIncreaseBtn.addEventListener("click",()=>{this.state.speed<10&&(this.state.speed++,this.updateSpeedDisplay(),this.options.onSpeedChange?.(this.state.speed))}),n.appendChild(this.speedDecreaseBtn),n.appendChild(this.speedDisplay),n.appendChild(this.speedIncreaseBtn),e.appendChild(t),e.appendChild(n),e}createIconButton(e,t){const n=document.createElement("button");return n.className=`walk-icon-btn walk-icon-btn-${e}`,n.innerHTML=this.getIconSVG(e),n.addEventListener("click",t),n}createExitButton(){const e=document.createElement("button");return e.className="walk-exit-btn",e.addEventListener("click",()=>{this.options.onExit?.()}),this.exitBtn=e,e}setMode(e){const t=this.state.mode;t==="walk"&&e!=="walk"&&this.options.onWalkModeToggle?.(!1),t==="path"&&e!=="path"&&this.options.onPathModeToggle?.(!1),this.state.mode=e,e==="path"?(this.state.gravity=!1,this.state.collision=!1,this.gravityCheckbox.checked=!1,this.gravityCheckbox.disabled=!0,this.collisionCheckbox.checked=!1,this.collisionCheckbox.disabled=!0):(this.gravityCheckbox.disabled=!1,this.collisionCheckbox.disabled=!1),this.updateButtonStates(),this.updateSettingsView(),this.updateSpeedButtonStates()}updateButtonStates(){this.planViewBtn.classList.toggle("active",this.state.isPlanViewActive),this.pathModeBtn.classList.toggle("active",this.state.mode==="path")}updateSettingsView(){const e=this.speedControl,t=this.gravityCheckbox.parentElement,n=this.collisionCheckbox.parentElement,i=this.characterModelSelect.parentElement,r=this.walkModeSelect.parentElement;this.state.mode==="walk"?(e.style.display="none",t.style.display="flex",n.style.display="flex",i.style.display="flex",r.style.display="flex"):(e.style.display="flex",t.style.display="flex",n.style.display="flex",i.style.display="none",r.style.display="none")}updateSpeedDisplay(){this.speedDisplay.textContent=`${this.state.speed}X`,this.updateSpeedButtonStates()}updateSpeedButtonStates(){this.speedDecreaseBtn.disabled=this.state.speed<=1,this.speedIncreaseBtn.disabled=this.state.speed>=10}getIconSVG(e){return{"plan-view":at("地图"),path:at("路径漫游"),walk:at("第一人称漫游")}[e]||""}setLocales(){const e=this.speedControl.querySelector(".walk-speed-label");e&&(e.textContent=xe("walkControl.speed")),this.gravityLabel.textContent=xe("walkControl.gravity"),this.collisionLabel.textContent=xe("walkControl.collision"),this.characterModelLabel.textContent=xe("walkControl.characterModel.label"),this.characterModelSelect.innerHTML="";const t=document.createElement("option");t.value="construction-worker",t.textContent=xe("walkControl.characterModel.constructionWorker"),t.selected=this.state.characterModel==="construction-worker",this.characterModelSelect.appendChild(t);const n=document.createElement("option");n.value="office-male",n.textContent=xe("walkControl.characterModel.officeMale"),n.selected=this.state.characterModel==="office-male",this.characterModelSelect.appendChild(n),this.walkModeLabel.textContent=xe("walkControl.walkMode.label"),this.walkModeSelect.innerHTML="";const i=document.createElement("option");i.value="walk",i.textContent=xe("walkControl.walkMode.walk"),i.selected=this.state.walkMode==="walk",this.walkModeSelect.appendChild(i);const r=document.createElement("option");r.value="run",r.textContent=xe("walkControl.walkMode.run"),r.selected=this.state.walkMode==="run",this.walkModeSelect.appendChild(r),this.exitBtn.textContent=xe("walkControl.exit")}setTheme(e){if(!this.element)return;const t=this.element.style;t.setProperty("--bim-bg-base",e.bgBase??"#152232"),t.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-border-subtle",e.borderSubtle??"#1e293b"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-shadow-xl",e.shadowXl??"0 20px 40px rgba(0, 0, 0, 0.3)"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-hover",e.primaryHover??"#60a5fa"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-text-inverse",e.textInverse??"#152232"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)"),t.setProperty("--bim-component-bg-active",e.componentBgActive??"rgba(248, 250, 252, 0.1)")}destroy(){this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element&&this.element.parentElement&&this.element.parentElement.removeChild(this.element)}}class NC{element;registry;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e){this.registry=e}points=[];duration=1e4;loop=!1;playingPointIndex=-1;isPlaying=!1;init(){this.element=document.createElement("div"),this.element.className="walk-path-panel",this.unsubscribeLocale=Qt.subscribe(()=>this.render()),this.unsubscribeTheme=ot.subscribe(e=>this.setTheme(e)),this.loadPointsFromEngine(),this.render(),this.setTheme(ot.getTheme())}loadPointsFromEngine(){const e=this.registry.engine3d?.getEngineComponent()?.pathRoamingGetPoints()??[];this.points=e.map((t,n)=>({index:n}))}render(){this.element.innerHTML="";const e=this.createSettingsSection();this.element.appendChild(e);const t=this.createPointsSection();this.element.appendChild(t);const n=this.createPlayButton();this.element.appendChild(n)}createSettingsSection(){const e=document.createElement("div");e.className="walk-path-settings";const t=document.createElement("div");t.className="walk-path-form-group";const n=document.createElement("label");n.textContent=xe("walkControl.path.duration");const i=document.createElement("div");i.className="walk-path-input-wrapper";const r=document.createElement("input");r.type="number",r.className="walk-path-input",r.value=String(this.duration/1e3),r.min="1",r.oninput=h=>{const u=parseInt(h.target.value)||1;this.duration=u*1e3};const a=document.createElement("span");a.className="walk-path-unit",a.textContent=xe("walkControl.path.durationUnit"),i.appendChild(r),i.appendChild(a),t.appendChild(n),t.appendChild(i);const o=document.createElement("div");o.className="walk-path-form-group walk-path-form-group-inline";const l=document.createElement("input");l.type="checkbox",l.id="walk-path-loop-checkbox",l.className="walk-path-checkbox",l.checked=this.loop,l.onchange=h=>{this.loop=h.target.checked};const c=document.createElement("label");return c.htmlFor="walk-path-loop-checkbox",c.textContent=xe("walkControl.path.loop"),o.appendChild(l),o.appendChild(c),e.appendChild(t),e.appendChild(o),e}createPointsSection(){const e=document.createElement("div");e.className="walk-path-points-section";const t=document.createElement("div");t.className="walk-path-points-toolbar";const n=document.createElement("button");n.className="walk-path-btn walk-path-btn-small",n.textContent=`+ ${xe("walkControl.path.addPoint")}`,n.onclick=()=>this.addPoint();const i=document.createElement("button");i.className="walk-path-btn walk-path-btn-small walk-path-btn-danger",i.textContent=xe("walkControl.path.deleteAll"),i.onclick=()=>this.deleteAllPoints(),t.appendChild(n),t.appendChild(i),e.appendChild(t);const r=document.createElement("div");if(r.className="walk-path-points-list",this.points.length===0){const a=document.createElement("div");a.className="walk-path-empty",a.textContent=xe("walkControl.path.noPoints"),r.appendChild(a)}else this.points.forEach((a,o)=>{const l=this.createPointItem(o);r.appendChild(l)});return e.appendChild(r),e}createPointItem(e){const t=document.createElement("div");t.className="walk-path-point-item",this.playingPointIndex===e&&t.classList.add("walk-path-point-item-active");const n=document.createElement("span");n.className="walk-path-point-name",n.textContent=`${xe("walkControl.path.point")}${e}`;const i=document.createElement("div");i.className="walk-path-point-actions";const r=document.createElement("button");r.className="walk-path-btn-icon",r.innerHTML="▶",r.title=xe("walkControl.path.play"),r.onclick=o=>{o.stopPropagation(),this.jumpToPoint(e)};const a=document.createElement("button");return a.className="walk-path-btn-icon walk-path-btn-icon-danger",a.innerHTML="×",a.onclick=o=>{o.stopPropagation(),this.deletePoint(e)},i.appendChild(r),i.appendChild(a),t.appendChild(n),t.appendChild(i),t}createPlayButton(){const e=document.createElement("div");e.className="walk-path-btn-group";const t=document.createElement("button");t.className="walk-path-btn walk-path-btn-play",t.textContent=`▶ ${xe("walkControl.path.play")}`,t.disabled=this.points.length===0||this.isPlaying,t.onclick=()=>this.playPath();const n=document.createElement("button");return n.className="walk-path-btn walk-path-btn-stop",n.textContent=`■ ${xe("walkControl.path.stop")}`,n.disabled=!this.isPlaying,n.onclick=()=>this.stopPath(),e.appendChild(t),e.appendChild(n),e}addPoint(){this.registry.engine3d?.getEngineComponent()?.pathRoamingAddPoint();const e=this.points.length;this.points.push({index:e}),this.render()}deletePoint(e){this.registry.engine3d?.getEngineComponent()?.pathRoamingRemovePoint(e),this.points.splice(e,1),this.points.forEach((t,n)=>t.index=n),this.render()}deleteAllPoints(){this.registry.engine3d?.getEngineComponent()?.pathRoamingClearPoints(),this.points=[],this.render()}jumpToPoint(e){this.registry.engine3d?.getEngineComponent()?.pathRoamingJumpToPoint(e)}playPath(){this.points.length!==0&&(this.isPlaying=!0,this.render(),console.log("[WalkPathPanel] 开始播放漫游",{duration:this.duration,loop:this.loop,pointsCount:this.points.length}),this.registry.engine3d?.getEngineComponent()?.pathRoamingPlay({duration:this.duration,loop:this.loop,onPointComplete:e=>{console.log("[WalkPathPanel] onPointComplete",{pointIndex:e}),this.playingPointIndex=e,this.render()},onComplete:()=>{console.log("[WalkPathPanel] onComplete 播放完成"),this.isPlaying=!1,this.playingPointIndex=-1,this.render()}}))}stopPath(){console.log("[WalkPathPanel] 停止漫游"),this.registry.engine3d?.getEngineComponent()?.pathRoamingStop(),this.isPlaying=!1,this.playingPointIndex=-1,this.render()}setLocales(){this.render()}setTheme(e){this.element&&(this.element.style.setProperty("--bim-text-primary",e.textPrimary??"#fff"),this.element.style.setProperty("--bim-text-secondary",e.textSecondary??"#94a3b8"),this.element.style.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),this.element.style.setProperty("--bim-border-default",e.borderDefault??"#334155"),this.element.style.setProperty("--bim-primary",e.primary??"#3b82f6"))}destroy(){this.isPlaying&&this.stopPath(),this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element?.parentElement&&this.element.parentElement.removeChild(this.element)}}class BC extends Gs{panel=null;constructor(e){super(e)}get dialogId(){return"walk-path-dialog"}get dialogTitle(){return"walkControl.path.dialogTitle"}get dialogWidth(){return 300}get dialogHeight(){return 450}init(){}getDialogPosition(){const e=this.registry.container;return e?{x:e.clientWidth-this.dialogWidth-20,y:20}:{x:100,y:100}}createContent(){return this.panel=new NC(this.registry),this.panel.init(),this.panel.element}onDialogClose(){this.registry.walkControl&&this.registry.walkControl.panel&&this.registry.walkControl.panel.setPathModeActive(!1)}onBeforeDestroy(){this.panel&&(this.panel.destroy(),this.panel=null)}}class kC extends xi{panel=null;pathManager=null;constructor(e){super(e)}init(){this.pathManager=new BC(this.registry),this.pathManager.init()}show(){if(!this.registry.toolbar){console.warn("Toolbar not initialized");return}this.registry.toolbar.hide(),console.log("[WalkControl] 打开漫游面板,激活第一人称模式"),this.engineComponent?.activateFirstPersonMode(),this.panel=new IC({onPlanViewToggle:e=>{console.log("[WalkControl] 小地图:",e),this.engineComponent?.toggleMiniMap(),this.emit("walk:plan-view-toggle",{isActive:e})},onPathModeToggle:e=>{console.log("[WalkControl] 路径漫游:",e),e?this.pathManager?.show():this.pathManager?.hide(),this.emit("walk:path-mode-toggle",{isActive:e})},onWalkModeToggle:e=>{console.log("[WalkControl] 第三人称漫游按钮点击:",e),e&&(this.pathManager?.hide(),alert("第三人称功能开发中")),this.emit("walk:walk-mode-toggle",{isActive:e})},onSpeedChange:e=>{console.log("[WalkControl] 速度变化:",e);const t=e*.1;this.engineComponent?.setWalkSpeed(t),this.emit("walk:speed-change",{speed:e})},onGravityToggle:e=>{console.log("[WalkControl] 重力:",e),this.engineComponent?.setWalkGravity(e),this.emit("walk:gravity-toggle",{enabled:e})},onCollisionToggle:e=>{console.log("[WalkControl] 碰撞:",e),this.engineComponent?.setWalkCollision(e),this.emit("walk:collision-toggle",{enabled:e})},onCharacterModelChange:e=>{console.log("[WalkControl] 角色模型:",e)},onWalkModeChange:e=>{console.log("[WalkControl] 行走模式:",e)},onExit:()=>{this.hide()}}),this.panel.init(),this.registry.container?(this.panel.element.style.position="absolute",this.panel.element.style.bottom="20px",this.panel.element.style.left="50%",this.panel.element.style.transform="translateX(-50%)",this.panel.element.style.zIndex="1000",this.registry.container.appendChild(this.panel.element)):console.warn("[WalkControlManager] Container not found")}hide(){this.pathManager?.hide(),console.log("[WalkControl] 关闭漫游面板,退出第一人称模式"),this.engineComponent?.deactivateFirstPersonMode(),this.panel&&(this.panel.destroy(),this.panel=null),this.registry.toolbar&&this.registry.toolbar.show()}destroy(){this.hide(),this.pathManager?.destroy(),this.pathManager=null,super.destroy()}}class UC extends Gs{get dialogId(){return"engine-info-dialog"}get dialogTitle(){return"info.dialogTitle"}get dialogWidth(){return 280}constructor(e){super(e)}init(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight;return{x:(t-this.dialogWidth)/2,y:(n-150)/2}}createContent(){const e=this.engineComponent?.getEngineInfo()??null,t=document.createElement("div");t.className="engine-info-content",t.style.cssText="padding: 16px;";const n=(i,r)=>{const a=document.createElement("div");a.style.cssText="display: flex; justify-content: space-between; margin-bottom: 12px; font-size: 14px;";const o=document.createElement("span");o.style.cssText="color: var(--bim-text-secondary, #94a3b8);",o.textContent=i;const l=document.createElement("span");return l.style.cssText="color: var(--bim-text-primary, #fff); font-weight: 500;",l.textContent=String(r),a.appendChild(o),a.appendChild(l),a};return t.appendChild(n(xe("info.meshCount"),e?.meshCount??"-")),t.appendChild(n(xe("info.totalTriangles"),e?.totalTriangles??"-")),t.appendChild(n(xe("info.totalVertices"),e?.totalVertices??"-")),t}}const xd="font-size: 13px; color: var(--bim-text-secondary, #475569); margin-bottom: 8px;",OC="height: 1px; background: var(--bim-divider, #e2e8f0); margin: 14px 0;",vd="display: flex; align-items: center; justify-content: space-between; gap: 12px;",zC="font-size: 12px; color: var(--bim-text-secondary, #475569); min-width: 32px; text-align: right;",jr="var(--bim-border-default, #e2e8f0)",og="var(--bim-bg-inset, #f1f5f9)",Jl="var(--bim-primary, #3b82f6)",bd="var(--bim-text-primary, #0f172a)",FC="var(--bim-text-inverse, #ffffff)",HC="var(--bim-component-bg-hover, rgba(0,0,0,0.04))";class VC extends Gs{get dialogId(){return"setting-dialog"}get dialogTitle(){return"setting.dialogTitle"}get dialogWidth(){return 320}edgeLineEnabled=!1;contrastValue=50;saturationValue=50;lightIntensityValue=50;environmentList=[];environmentId="";backgroundVisible=!0;groundList=[];groundId="";groundElevation=0;savedPosition=null;constructor(e){super(e)}init(){}getDialogPosition(){if(this.savedPosition){const i=this.savedPosition;return this.savedPosition=null,i}const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight;return{x:(t-this.dialogWidth)/2,y:Math.max(20,(n-520)/2)}}loadEngineState(){const e=this.engineComponent;e&&(this.edgeLineEnabled=e.getModelEdgeActive(),this.lightIntensityValue=e.getAmbientLightIntensity(),this.contrastValue=e.getSceneContrast(),this.saturationValue=e.getSceneSaturation(),this.environmentList=e.getHDRBackgroundList(),this.environmentId=e.getHDRBackgroundId(),this.backgroundVisible=e.getHDRBackgroundVisibility(),this.groundList=e.getGroundList(),this.groundId=e.getGroundId(),this.groundElevation=e.getGroundElevation())}createContent(){this.loadEngineState(),this.ensureSliderStyle();const e=document.createElement("div");return e.style.cssText="padding: 16px; max-height: 480px; overflow-y: auto;",e.appendChild(this.createRenderModeSection()),e.appendChild(this.createDivider()),e.appendChild(this.createEdgeLineSection()),e.appendChild(this.createDivider()),e.appendChild(this.createSliderSection(xe("setting.lightIntensity"),this.lightIntensityValue,0,100,t=>{this.lightIntensityValue=t,this.engineComponent?.setAmbientLightIntensity(t)})),e.appendChild(this.createSliderSection(xe("setting.contrast"),this.contrastValue,0,100,t=>{this.contrastValue=t,this.engineComponent?.setSceneContrast(t)})),e.appendChild(this.createSliderSection(xe("setting.saturation"),this.saturationValue,0,100,t=>{this.saturationValue=t,this.engineComponent?.setSceneSaturation(t)})),e.appendChild(this.createDivider()),e.appendChild(this.createEnvironmentSection()),e.appendChild(this.createDivider()),e.appendChild(this.createGroundSection()),e}createDivider(){const e=document.createElement("div");return e.style.cssText=OC,e}createRenderModeSection(){const e=this.engineComponent?.getRenderMode()??"balance",t=document.createElement("div"),n=document.createElement("div");n.style.cssText=xd,n.textContent=xe("setting.renderMode"),t.appendChild(n);const i=document.createElement("div");i.style.cssText=` display: flex; gap: 0; border-radius: 6px; overflow: hidden; border: 1px solid ${jr}; `;const r=[{key:"simple",labelKey:"setting.modes.simple"},{key:"balance",labelKey:"setting.modes.balance"},{key:"advanced",labelKey:"setting.modes.advanced"}];for(let a=0;a{l||(c.style.background=HT)}),c.addEventListener("mouseleave",()=>{l||(c.style.background="transparent")}),c.addEventListener("click",()=>{this.registry.engine3d?.setRenderMode(o.key),this.hide(),this.show()}),i.appendChild(c)}return t.appendChild(i),t}createEdgeLineSection(){const e=document.createElement("div");e.style.cssText=vd;const t=document.createElement("span");t.style.cssText="font-size: 13px; color: var(--bim-text-secondary, #475569);",t.textContent=xe("setting.edgeLine"),e.appendChild(t);const n="var(--bim-border-strong, #cbd5e1)",i=Jl,r=document.createElement("div");r.style.cssText=` - width: 40px; height: 22px; border-radius: 11px; cursor: pointer; - position: relative; transition: background 0.2s; - background: ${this.edgeLineEnabled?i:n}; - `;const a=document.createElement("div");return a.style.cssText=` - width: 18px; height: 18px; border-radius: 50%; - background: #fff; position: absolute; top: 2px; - transition: left 0.2s; - box-shadow: 0 1px 3px rgba(0,0,0,0.2); - left: ${this.edgeLineEnabled?"20px":"2px"}; - `,r.appendChild(a),r.addEventListener("click",()=>{this.edgeLineEnabled=!this.edgeLineEnabled,r.style.background=this.edgeLineEnabled?i:n,a.style.left=this.edgeLineEnabled?"20px":"2px"}),e.appendChild(r),e}createSliderSection(e,t,n,i,r){const a=document.createElement("div");a.style.cssText="margin-bottom: 4px;";const o=document.createElement("div");o.style.cssText=vd+" margin-bottom: 6px;";const l=document.createElement("span");l.style.cssText="font-size: 13px; color: var(--bim-text-secondary, #475569);",l.textContent=e,o.appendChild(l);const c=document.createElement("span");c.style.cssText=zT,c.textContent=String(t),o.appendChild(c),a.appendChild(o);const h=document.createElement("input");return h.type="range",h.min=String(n),h.max=String(i),h.value=String(t),h.className="bim-setting-slider",h.style.cssText=` + `,c.textContent=xe(o.labelKey),c.addEventListener("mouseenter",()=>{l||(c.style.background=HC)}),c.addEventListener("mouseleave",()=>{l||(c.style.background="transparent")}),c.addEventListener("click",()=>{this.engineComponent?.setRenderMode(o.key);const h=document.getElementById(this.dialogId);h&&(this.savedPosition={x:h.offsetLeft,y:h.offsetTop}),this.hide(),this.show()}),i.appendChild(c)}return t.appendChild(i),t}createEdgeLineSection(){return this.createToggleRow(xe("setting.edgeLine"),this.edgeLineEnabled,e=>{this.edgeLineEnabled=e,e?this.engineComponent?.activeModelEdge():this.engineComponent?.disActiveModelEdge()})}createSliderSection(e,t,n,i,r){const a=document.createElement("div");a.style.cssText="margin-bottom: 4px;";const o=document.createElement("div");o.style.cssText=vd+" margin-bottom: 6px;";const l=document.createElement("span");l.style.cssText="font-size: 13px; color: var(--bim-text-secondary, #475569);",l.textContent=e,o.appendChild(l);const c=document.createElement("span");c.style.cssText=zC,c.textContent=String(t),o.appendChild(c),a.appendChild(o);const h=document.createElement("input");return h.type="range",h.min=String(n),h.max=String(i),h.value=String(t),h.className="bim-setting-slider",h.style.cssText=` width: 100%; height: 4px; -webkit-appearance: none; appearance: none; background: var(--bim-border-strong, #cbd5e1); border-radius: 2px; outline: none; cursor: pointer; @@ -5098,17 +5088,17 @@ void main() { background: var(--bim-border-strong, #cbd5e1); height: 4px; border-radius: 2px; border: none; } - `,document.head.appendChild(e)}createEnvironmentSection(){const e=document.createElement("div"),t=document.createElement("div");t.style.cssText=xd,t.textContent=xe("setting.environment"),e.appendChild(t);const n=["default","outdoor","indoor","night","overcast","studio"],i=this.createSelect(n.map(r=>({value:r,label:xe(`setting.environments.${r}`)})),this.environmentType,r=>{this.environmentType=r});return e.appendChild(i),e}createGroundSection(){const e=document.createElement("div"),t=document.createElement("div");t.style.cssText=xd,t.textContent=xe("setting.ground"),e.appendChild(t);const n=["none","concrete","grass","tile","water","wood"],i=this.createSelect(n.map(l=>({value:l,label:xe(`setting.groundTypes.${l}`)})),this.groundType,l=>{this.groundType=l,r.style.display=l==="none"?"none":"flex"});e.appendChild(i);const r=document.createElement("div");r.style.cssText=vd+" margin-top: 10px;",r.style.display=this.groundType==="none"?"none":"flex";const a=document.createElement("span");a.style.cssText="font-size: 13px; color: var(--bim-text-secondary, #475569);",a.textContent=xe("setting.groundSize"),r.appendChild(a);const o=document.createElement("input");return o.type="number",o.value=String(this.groundSize),o.min="1",o.max="10000",o.style.cssText=` - width: 80px; padding: 4px 8px; border-radius: 4px; + `,document.head.appendChild(e)}createEnvironmentSection(){const e=document.createElement("div"),t=document.createElement("div");t.style.cssText=xd,t.textContent=xe("setting.environment"),e.appendChild(t);const n=this.createSelect(this.environmentList.map(r=>({value:r.id,label:r.name})),this.environmentId,r=>{this.environmentId=r,this.engineComponent?.setHDRBackgroundId(r)});e.appendChild(n);const i=this.createToggleRow(xe("setting.backgroundVisible"),this.backgroundVisible,r=>{this.backgroundVisible=r,this.engineComponent?.setHDRBackgroundVisibility(r)});return i.style.marginTop="10px",e.appendChild(i),e}createGroundSection(){const e=document.createElement("div"),t=document.createElement("div");t.style.cssText=xd,t.textContent=xe("setting.ground"),e.appendChild(t);const n=this.createSelect(this.groundList.map(c=>({value:c.id,label:c.name})),this.groundId,c=>{this.groundId=c,this.engineComponent?.setGroundId(c)});e.appendChild(n);const i=document.createElement("div");i.style.cssText=vd+" margin-top: 10px;";const r=document.createElement("span");r.style.cssText="font-size: 13px; color: var(--bim-text-secondary, #475569);",r.textContent=xe("setting.groundElevation"),i.appendChild(r);const a=document.createElement("div");a.style.cssText="display: flex; align-items: center; gap: 4px;";const o=document.createElement("input");o.type="number",o.value=String(this.groundElevation),o.style.cssText=` + width: 72px; padding: 4px 8px; border-radius: 4px; border: 1px solid ${jr}; background: ${og}; - color: ${yd}; + color: ${bd}; font-size: 13px; outline: none; text-align: right; - `,o.addEventListener("input",()=>{const l=Number(o.value);!isNaN(l)&&l>0&&(this.groundSize=l)}),o.addEventListener("focus",()=>{o.style.borderColor=Jl}),o.addEventListener("blur",()=>{o.style.borderColor=jr}),r.appendChild(o),e.appendChild(r),e}createSelect(e,t,n){const i=document.createElement("select");i.style.cssText=` + `,o.addEventListener("input",()=>{const c=Number(o.value);isNaN(c)||(this.groundElevation=c,this.engineComponent?.setGroundElevation(c))}),o.addEventListener("focus",()=>{o.style.borderColor=Jl}),o.addEventListener("blur",()=>{o.style.borderColor=jr});const l=document.createElement("span");return l.style.cssText="font-size: 13px; color: var(--bim-text-secondary, #475569);",l.textContent=xe("setting.groundElevationUnit"),a.appendChild(o),a.appendChild(l),i.appendChild(a),e.appendChild(i),e}createSelect(e,t,n){const i=document.createElement("select");i.style.cssText=` width: 100%; padding: 7px 10px; border-radius: 6px; border: 1px solid ${jr}; background: ${og}; - color: ${yd}; + color: ${bd}; font-size: 13px; outline: none; cursor: pointer; -webkit-appearance: none; appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); @@ -5118,7 +5108,17 @@ void main() { `;for(const r of e){const a=document.createElement("option");a.value=r.value,a.textContent=r.label,a.style.cssText=` background: var(--bim-bg-elevated, #ffffff); color: var(--bim-text-primary, #0f172a); - `,r.value===t&&(a.selected=!0),i.appendChild(a)}return i.addEventListener("change",()=>{n(i.value)}),i.addEventListener("focus",()=>{i.style.borderColor=Jl}),i.addEventListener("blur",()=>{i.style.borderColor=jr}),i}}class GT{element;headerEl;contentEl;contentBoxEl;arrowEl;titleEl;config;parent;constructor(e,t){this.config=e,this.parent=t,this.element=this.createDom()}createDom(){const e=document.createElement("div");if(e.className=`bim-collapse-item ${this.config.className||""}`,this.config.disabled&&e.classList.add("is-disabled"),e.dataset.id=this.config.id,this.headerEl=document.createElement("div"),this.headerEl.className="bim-collapse-header",this.arrowEl=document.createElement("span"),this.arrowEl.className="bim-collapse-arrow",this.arrowEl.innerHTML='',this.headerEl.appendChild(this.arrowEl),this.config.icon){const t=document.createElement("span");t.className="bim-collapse-icon",t.innerHTML=this.config.icon,this.headerEl.appendChild(t)}if(this.titleEl=document.createElement("span"),this.titleEl.className="bim-collapse-title",this.titleEl.textContent=xe(this.config.title),this.headerEl.appendChild(this.titleEl),this.config.extra){const t=document.createElement("div");t.className="bim-collapse-extra",typeof this.config.extra=="string"?t.innerHTML=this.config.extra:t.appendChild(this.config.extra),this.headerEl.appendChild(t)}return this.headerEl.addEventListener("click",()=>{this.config.disabled||this.parent.toggleItem(this.config.id)}),e.appendChild(this.headerEl),this.contentEl=document.createElement("div"),this.contentEl.className="bim-collapse-content is-hidden",this.contentBoxEl=document.createElement("div"),this.contentBoxEl.className="bim-collapse-content-box",typeof this.config.content=="string"?this.contentBoxEl.innerHTML=this.config.content:this.contentBoxEl.appendChild(this.config.content),this.contentEl.appendChild(this.contentBoxEl),e.appendChild(this.contentEl),e}updateLocale(){this.titleEl&&(this.titleEl.textContent=xe(this.config.title))}setActive(e){e?(this.element.classList.add("is-active"),this.contentEl.classList.remove("is-hidden")):(this.element.classList.remove("is-active"),this.contentEl.classList.add("is-hidden"))}}class lg{element;options;items=new Map;activeIds=new Set;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e){this.options={bordered:!0,accordion:!1,...e},this.element=document.createElement("div"),this.element.className=`bim-collapse ${this.options.className||""}`,this.options.bordered||(this.element.style.border="none"),this.options.ghost&&this.element.classList.add("is-ghost");const t=typeof this.options.container=="string"?document.getElementById(this.options.container):this.options.container;t&&t.appendChild(this.element),this.options.activeIds&&this.options.activeIds.forEach(n=>this.activeIds.add(n)),this.init()}init(){this.options.items.forEach(e=>{const t=new GT(e,this);this.items.set(e.id,t),this.element.appendChild(t.element),this.activeIds.has(e.id)&&t.setActive(!0)}),this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)}),this.setTheme(ot.getTheme())}toggleItem(e){const t=this.activeIds.has(e);this.options.accordion?(this.activeIds.clear(),t||this.activeIds.add(e)):t?this.activeIds.delete(e):this.activeIds.add(e),this.refreshState(),this.options.onChange&&this.options.onChange(Array.from(this.activeIds))}refreshState(){this.items.forEach((e,t)=>{e.setActive(this.activeIds.has(t))})}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-border-subtle",e.borderSubtle),t.setProperty("--bim-border-strong",e.borderStrong),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-disabled",e.textDisabled),t.setProperty("--bim-component-bg",e.componentBg),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-component-bg-active",e.componentBgActive)}setLocales(){this.items.forEach(e=>e.updateLocale())}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove(),this.items.clear()}}class WT extends xi{dialogId="component-detail-dialog";dialog=null;currentSelection=null;unsubscribeSelected=null;unsubscribeDeselected=null;tabInstance=null;propertiesData=null;constructor(e){super(e)}init(){this.unsubscribeSelected=this.registry.on("component:selected",e=>{this.currentSelection=e,this.isOpen()&&this.loadAndRenderContent()}),this.unsubscribeDeselected=this.registry.on("component:deselected",()=>{this.currentSelection=null,this.isOpen()&&this.renderNoSelection()})}show(){if(!this.registry.dialog){console.warn("[ComponentDetailManager] Dialog manager not initialized");return}this.isOpen()||this.createDialog(),this.currentSelection?this.loadAndRenderContent():this.renderNoSelection()}createDialog(){const t=document.body.clientWidth-300-40;this.dialog=this.registry.dialog?.create({id:this.dialogId,title:"panel.componentDetail.title",content:"",width:"300px",height:"500px",position:{x:t,y:20},resizable:!0,onClose:()=>this.hide()})}loadAndRenderContent(){!this.dialog||!this.currentSelection||(this.showLoading(),this.registry.engine3d?.getComponentProperties(this.currentSelection.url,this.currentSelection.id,e=>{this.propertiesData=e,this.renderTabbedContent()}))}showLoading(){const e=document.createElement("div");e.style.cssText="height:100%;display:flex;align-items:center;justify-content:center;",e.textContent="加载中...",this.dialog?.setContent(e)}renderNoSelection(){if(!this.dialog)return;const e=document.createElement("div");e.style.cssText="height:100%;display:flex;align-items:center;justify-content:center;color:var(--bim-text-secondary,#999);",e.textContent=xe("panel.componentDetail.noSelection")||"请先选中构件",this.dialog.setContent(e)}renderTabbedContent(){if(!this.dialog)return;this.tabInstance&&(this.tabInstance.destroy(),this.tabInstance=null);const e=document.createElement("div");e.style.cssText="height:100%;display:flex;flex-direction:column;";const t=this.createPropertiesPanel(),n=this.createMaterialsPanel();this.tabInstance=new eg({container:e,activeId:"properties",tabs:[{id:"properties",title:"panel.property.tab.props",content:t},{id:"materials",title:"panel.property.tab.material",content:n}]}),this.tabInstance.init(),this.dialog.setContent(e)}createPropertiesPanel(){const e=document.createElement("div");e.style.cssText="height:100%;overflow-y:auto;";const t=this.propertiesData?.properties||[];if(t.length===0)return e.innerHTML='
无属性数据
',e;const n=t.map((r,a)=>({id:`category-${a}`,title:r.name||`分类 ${a+1}`,content:this.createCategoryContent(r.children||[])}));new lg({container:e,accordion:!1,ghost:!0,activeIds:n.length>0?[n[0].id]:[],items:n});const i=document.createElement("style");return i.textContent=` + `,r.value===t&&(a.selected=!0),i.appendChild(a)}return i.addEventListener("change",()=>{n(i.value)}),i.addEventListener("focus",()=>{i.style.borderColor=Jl}),i.addEventListener("blur",()=>{i.style.borderColor=jr}),i}createToggleRow(e,t,n){const i=document.createElement("div");i.style.cssText=vd;const r=document.createElement("span");r.style.cssText="font-size: 13px; color: var(--bim-text-secondary, #475569);",r.textContent=e,i.appendChild(r);const a="var(--bim-border-strong, #cbd5e1)",o=Jl;let l=t;const c=document.createElement("div");c.style.cssText=` + width: 40px; height: 22px; border-radius: 11px; cursor: pointer; + position: relative; transition: background 0.2s; + background: ${l?o:a}; + `;const h=document.createElement("div");return h.style.cssText=` + width: 18px; height: 18px; border-radius: 50%; + background: #fff; position: absolute; top: 2px; + transition: left 0.2s; + box-shadow: 0 1px 3px rgba(0,0,0,0.2); + left: ${l?"20px":"2px"}; + `,c.appendChild(h),c.addEventListener("click",()=>{l=!l,c.style.background=l?o:a,h.style.left=l?"20px":"2px",n(l)}),i.appendChild(c),i}}class GC{element;headerEl;contentEl;contentBoxEl;arrowEl;titleEl;config;parent;constructor(e,t){this.config=e,this.parent=t,this.element=this.createDom()}createDom(){const e=document.createElement("div");if(e.className=`bim-collapse-item ${this.config.className||""}`,this.config.disabled&&e.classList.add("is-disabled"),e.dataset.id=this.config.id,this.headerEl=document.createElement("div"),this.headerEl.className="bim-collapse-header",this.arrowEl=document.createElement("span"),this.arrowEl.className="bim-collapse-arrow",this.arrowEl.innerHTML='',this.headerEl.appendChild(this.arrowEl),this.config.icon){const t=document.createElement("span");t.className="bim-collapse-icon",t.innerHTML=this.config.icon,this.headerEl.appendChild(t)}if(this.titleEl=document.createElement("span"),this.titleEl.className="bim-collapse-title",this.titleEl.textContent=xe(this.config.title),this.headerEl.appendChild(this.titleEl),this.config.extra){const t=document.createElement("div");t.className="bim-collapse-extra",typeof this.config.extra=="string"?t.innerHTML=this.config.extra:t.appendChild(this.config.extra),this.headerEl.appendChild(t)}return this.headerEl.addEventListener("click",()=>{this.config.disabled||this.parent.toggleItem(this.config.id)}),e.appendChild(this.headerEl),this.contentEl=document.createElement("div"),this.contentEl.className="bim-collapse-content is-hidden",this.contentBoxEl=document.createElement("div"),this.contentBoxEl.className="bim-collapse-content-box",typeof this.config.content=="string"?this.contentBoxEl.innerHTML=this.config.content:this.contentBoxEl.appendChild(this.config.content),this.contentEl.appendChild(this.contentBoxEl),e.appendChild(this.contentEl),e}updateLocale(){this.titleEl&&(this.titleEl.textContent=xe(this.config.title))}setActive(e){e?(this.element.classList.add("is-active"),this.contentEl.classList.remove("is-hidden")):(this.element.classList.remove("is-active"),this.contentEl.classList.add("is-hidden"))}}class lg{element;options;items=new Map;activeIds=new Set;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e){this.options={bordered:!0,accordion:!1,...e},this.element=document.createElement("div"),this.element.className=`bim-collapse ${this.options.className||""}`,this.options.bordered||(this.element.style.border="none"),this.options.ghost&&this.element.classList.add("is-ghost");const t=typeof this.options.container=="string"?document.getElementById(this.options.container):this.options.container;t&&t.appendChild(this.element),this.options.activeIds&&this.options.activeIds.forEach(n=>this.activeIds.add(n)),this.init()}init(){this.options.items.forEach(e=>{const t=new GC(e,this);this.items.set(e.id,t),this.element.appendChild(t.element),this.activeIds.has(e.id)&&t.setActive(!0)}),this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)}),this.setTheme(ot.getTheme())}toggleItem(e){const t=this.activeIds.has(e);this.options.accordion?(this.activeIds.clear(),t||this.activeIds.add(e)):t?this.activeIds.delete(e):this.activeIds.add(e),this.refreshState(),this.options.onChange&&this.options.onChange(Array.from(this.activeIds))}refreshState(){this.items.forEach((e,t)=>{e.setActive(this.activeIds.has(t))})}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-border-subtle",e.borderSubtle),t.setProperty("--bim-border-strong",e.borderStrong),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-disabled",e.textDisabled),t.setProperty("--bim-component-bg",e.componentBg),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-component-bg-active",e.componentBgActive)}setLocales(){this.items.forEach(e=>e.updateLocale())}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove(),this.items.clear()}}class WC extends xi{dialogId="component-detail-dialog";dialog=null;currentSelection=null;unsubscribeSelected=null;unsubscribeDeselected=null;tabInstance=null;propertiesData=null;constructor(e){super(e)}init(){this.unsubscribeSelected=this.registry.on("component:selected",e=>{this.currentSelection=e,this.isOpen()&&this.loadAndRenderContent()}),this.unsubscribeDeselected=this.registry.on("component:deselected",()=>{this.currentSelection=null,this.isOpen()&&this.renderNoSelection()})}show(){if(!this.registry.dialog){console.warn("[ComponentDetailManager] Dialog manager not initialized");return}this.isOpen()||this.createDialog(),this.currentSelection?this.loadAndRenderContent():this.renderNoSelection()}createDialog(){const t=document.body.clientWidth-300-40;this.dialog=this.registry.dialog?.create({id:this.dialogId,title:"panel.componentDetail.title",content:"",width:"300px",height:"500px",position:{x:t,y:20},resizable:!0,onClose:()=>this.hide()})}loadAndRenderContent(){!this.dialog||!this.currentSelection||(this.showLoading(),this.engineComponent?.getComponentProperties(this.currentSelection.url,this.currentSelection.id,e=>{this.propertiesData=e,this.renderTabbedContent()}))}showLoading(){const e=document.createElement("div");e.style.cssText="height:100%;display:flex;align-items:center;justify-content:center;",e.textContent="加载中...",this.dialog?.setContent(e)}renderNoSelection(){if(!this.dialog)return;const e=document.createElement("div");e.style.cssText="height:100%;display:flex;align-items:center;justify-content:center;color:var(--bim-text-secondary,#999);",e.textContent=xe("panel.componentDetail.noSelection")||"请先选中构件",this.dialog.setContent(e)}renderTabbedContent(){if(!this.dialog)return;this.tabInstance&&(this.tabInstance.destroy(),this.tabInstance=null);const e=document.createElement("div");e.style.cssText="height:100%;display:flex;flex-direction:column;";const t=this.createPropertiesPanel(),n=this.createMaterialsPanel();this.tabInstance=new eg({container:e,activeId:"properties",tabs:[{id:"properties",title:"panel.property.tab.props",content:t},{id:"materials",title:"panel.property.tab.material",content:n}]}),this.tabInstance.init(),this.dialog.setContent(e)}createPropertiesPanel(){const e=document.createElement("div");e.style.cssText="height:100%;overflow-y:auto;";const t=this.propertiesData?.properties||[];if(t.length===0)return e.innerHTML='
无属性数据
',e;const n=t.map((r,a)=>({id:`category-${a}`,title:r.name||`分类 ${a+1}`,content:this.createCategoryContent(r.children||[])}));new lg({container:e,accordion:!1,ghost:!0,activeIds:n.length>0?[n[0].id]:[],items:n});const i=document.createElement("style");return i.textContent=` #${this.dialogId} .bim-collapse-header { background-color: var(--bim-component-bg-hover) !important; } @@ -5148,7 +5148,7 @@ void main() { font-size: 13px; padding: 8px 12px; word-break: break-all; - `,o.textContent=String(n.value??"-"),r.appendChild(a),r.appendChild(o),t.appendChild(r)}),t}isOpen(){return this.dialog!==null}hide(){this.tabInstance&&(this.tabInstance.destroy(),this.tabInstance=null),this.dialog&&(this.dialog.destroy(),this.dialog=null)}destroy(){this.unsubscribeSelected&&(this.unsubscribeSelected(),this.unsubscribeSelected=null),this.unsubscribeDeselected&&(this.unsubscribeDeselected(),this.unsubscribeDeselected=null),this.hide(),super.destroy()}}class XT{element;options;container;messagesContainer=null;textarea=null;messages=[];_isDestroyed=!1;_isVisible=!1;unsubscribeTheme=null;unsubscribeLocale=null;rafId=null;constructor(e){this.options={width:440,title:"aiChat.title",placeholder:"aiChat.placeholder",quickPrompts:[{id:"summarize",label:"aiChat.quickPrompt.summarize"},{id:"explain",label:"aiChat.quickPrompt.explain"},{id:"generate",label:"aiChat.quickPrompt.generate"}],...e},this.container=e.container,this.element=this.createDom(),this.init()}init(){this.container.appendChild(this.element),this.hide(),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)}),this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.setTheme(ot.getTheme()),this.setLocales()}setTheme(e){const t=e.name==="dark"||e.name?.includes("dark");this.element.classList.toggle("light",!t);const n=this.element.style;n.setProperty("--bim-ai-accent",e.primary),n.setProperty("--bim-ai-text",e.textPrimary),n.setProperty("--bim-ai-muted",e.textTertiary),n.setProperty("--bim-ai-border",e.borderDefault),n.setProperty("--bim-ai-shadow",e.shadowLg)}setLocales(){const e=this.element.querySelector(".bim-ai-chat-title");e&&this.options.title&&(e.textContent=xe(this.options.title));const t=this.element.querySelector(".bim-ai-textarea");t&&this.options.placeholder&&(t.placeholder=xe(this.options.placeholder));const n=this.element.querySelector(".bim-ai-helper-left");n&&(n.textContent=xe("aiChat.helper.newline"));const i=this.element.querySelector(".bim-ai-helper-right");i&&(i.textContent=xe("aiChat.helper.send")),this.updateQuickPrompts(),this.renderMessages()}show(){this._isVisible=!0,this.element.style.display="flex",this.initPosition(),this.scrollToBottom()}initPosition(){if(this.element.style.left)return;const e=this.container.clientWidth,t=this.element.offsetWidth,n=Math.max(50,e-t-50);this.element.style.left=`${n}px`,this.element.style.top="50px"}hide(){this._isVisible=!1,this.element.style.display="none"}toggle(){this._isVisible?this.hide():this.show()}isVisible(){return this._isVisible}addMessage(e){this.messages.push(e),this.renderMessages(),this.scrollToBottom()}updateMessage(e,t){const n=this.messages.findIndex(i=>i.id===e);n!==-1&&(this.messages[n]={...this.messages[n],...t},this.renderMessages())}removeMessage(e){this.messages=this.messages.filter(t=>t.id!==e),this.renderMessages()}clearMessages(){this.messages=[],this.renderMessages()}addUserMessage(e){const t=`user-${Date.now()}`;return this.addMessage({id:t,type:"user",content:e,timestamp:Date.now()}),t}addAiMessage(e){const t=`ai-${Date.now()}`;return this.addMessage({id:t,type:"ai",content:e,timestamp:Date.now()}),t}addStepMessage(e,t){const n=`step-${Date.now()}`;return this.addMessage({id:n,type:"step",status:e,content:t,timestamp:Date.now()}),n}addThinkingMessage(){const e=`thinking-${Date.now()}`;return this.addMessage({id:e,type:"thinking",timestamp:Date.now()}),e}addQuestionMessage(e,t,n){const i=`question-${Date.now()}`;return this.addMessage({id:i,type:"question",title:e,question:t,options:n,answered:!1,timestamp:Date.now()}),i}createDom(){const e=document.createElement("div");return e.className="bim-ai-chat",e.style.width=`${this.options.width}px`,e.innerHTML=` + `,o.textContent=String(n.value??"-"),r.appendChild(a),r.appendChild(o),t.appendChild(r)}),t}isOpen(){return this.dialog!==null}hide(){this.tabInstance&&(this.tabInstance.destroy(),this.tabInstance=null),this.dialog&&(this.dialog.destroy(),this.dialog=null)}destroy(){this.unsubscribeSelected&&(this.unsubscribeSelected(),this.unsubscribeSelected=null),this.unsubscribeDeselected&&(this.unsubscribeDeselected(),this.unsubscribeDeselected=null),this.hide(),super.destroy()}}class XC{element;options;container;messagesContainer=null;textarea=null;messages=[];_isDestroyed=!1;_isVisible=!1;unsubscribeTheme=null;unsubscribeLocale=null;rafId=null;constructor(e){this.options={width:440,title:"aiChat.title",placeholder:"aiChat.placeholder",quickPrompts:[{id:"summarize",label:"aiChat.quickPrompt.summarize"},{id:"explain",label:"aiChat.quickPrompt.explain"},{id:"generate",label:"aiChat.quickPrompt.generate"}],...e},this.container=e.container,this.element=this.createDom(),this.init()}init(){this.container.appendChild(this.element),this.hide(),this.unsubscribeTheme=ot.subscribe(e=>{this.setTheme(e)}),this.unsubscribeLocale=Qt.subscribe(()=>{this.setLocales()}),this.setTheme(ot.getTheme()),this.setLocales()}setTheme(e){const t=e.name==="dark"||e.name?.includes("dark");this.element.classList.toggle("light",!t);const n=this.element.style;n.setProperty("--bim-ai-accent",e.primary),n.setProperty("--bim-ai-text",e.textPrimary),n.setProperty("--bim-ai-muted",e.textTertiary),n.setProperty("--bim-ai-border",e.borderDefault),n.setProperty("--bim-ai-shadow",e.shadowLg)}setLocales(){const e=this.element.querySelector(".bim-ai-chat-title");e&&this.options.title&&(e.textContent=xe(this.options.title));const t=this.element.querySelector(".bim-ai-textarea");t&&this.options.placeholder&&(t.placeholder=xe(this.options.placeholder));const n=this.element.querySelector(".bim-ai-helper-left");n&&(n.textContent=xe("aiChat.helper.newline"));const i=this.element.querySelector(".bim-ai-helper-right");i&&(i.textContent=xe("aiChat.helper.send")),this.updateQuickPrompts(),this.renderMessages()}show(){this._isVisible=!0,this.element.style.display="flex",this.initPosition(),this.scrollToBottom()}initPosition(){if(this.element.style.left)return;const e=this.container.clientWidth,t=this.element.offsetWidth,n=Math.max(50,e-t-50);this.element.style.left=`${n}px`,this.element.style.top="50px"}hide(){this._isVisible=!1,this.element.style.display="none"}toggle(){this._isVisible?this.hide():this.show()}isVisible(){return this._isVisible}addMessage(e){this.messages.push(e),this.renderMessages(),this.scrollToBottom()}updateMessage(e,t){const n=this.messages.findIndex(i=>i.id===e);n!==-1&&(this.messages[n]={...this.messages[n],...t},this.renderMessages())}removeMessage(e){this.messages=this.messages.filter(t=>t.id!==e),this.renderMessages()}clearMessages(){this.messages=[],this.renderMessages()}addUserMessage(e){const t=`user-${Date.now()}`;return this.addMessage({id:t,type:"user",content:e,timestamp:Date.now()}),t}addAiMessage(e){const t=`ai-${Date.now()}`;return this.addMessage({id:t,type:"ai",content:e,timestamp:Date.now()}),t}addStepMessage(e,t){const n=`step-${Date.now()}`;return this.addMessage({id:n,type:"step",status:e,content:t,timestamp:Date.now()}),n}addThinkingMessage(){const e=`thinking-${Date.now()}`;return this.addMessage({id:e,type:"thinking",timestamp:Date.now()}),e}addQuestionMessage(e,t,n){const i=`question-${Date.now()}`;return this.addMessage({id:i,type:"question",title:e,question:t,options:n,answered:!1,timestamp:Date.now()}),i}createDom(){const e=document.createElement("div");return e.className="bim-ai-chat",e.style.width=`${this.options.width}px`,e.innerHTML=`
@@ -5182,7 +5182,7 @@ void main() {
- `,this.messagesContainer=e.querySelector(".bim-ai-chat-messages"),this.textarea=e.querySelector(".bim-ai-textarea"),this.bindEvents(e),this.updateQuickPrompts(e),e}bindEvents(e){e.querySelectorAll(".bim-ai-chat-action-btn").forEach(a=>{a.addEventListener("click",o=>{switch(o.currentTarget.dataset.action){case"new":this.options.onNewChat?.();break;case"history":this.options.onHistory?.();break;case"settings":this.options.onSettings?.();break;case"close":this.hide(),this.options.onClose?.();break}})});const t=e.querySelector(".bim-ai-chat-header");t&&this.initDrag(t),e.querySelector(".bim-ai-send-btn")?.addEventListener("click",()=>this.handleSend()),this.textarea?.addEventListener("keydown",a=>{a.key==="Enter"&&!a.shiftKey&&(a.preventDefault(),this.handleSend())}),this.textarea?.addEventListener("input",()=>{this.textarea&&(this.textarea.style.height="auto",this.textarea.style.height=Math.min(this.textarea.scrollHeight,100)+"px")});const i=a=>a.stopPropagation();["click","dblclick","mousedown","mouseup","mousemove","wheel","touchstart","touchend","touchmove"].forEach(a=>{e.addEventListener(a,i,{passive:!1})})}handleSend(){if(!this.textarea)return;const e=this.textarea.value.trim();e&&(this.textarea.value="",this.textarea.style.height="auto",this.options.onSend?.(e))}initDrag(e){let t=0,n=0,i=0,r=0,a=0,o=0,l=0,c=0;const h=d=>{d.target.closest(".bim-ai-chat-action-btn")||(d.preventDefault(),d.stopPropagation(),t=d.clientX,n=d.clientY,i=this.element.offsetLeft,r=this.element.offsetTop,a=this.container.clientWidth,o=this.container.clientHeight,l=this.element.offsetWidth,c=this.element.offsetHeight,document.addEventListener("mousemove",u,{capture:!0}),document.addEventListener("mouseup",p,{capture:!0}))},u=d=>{d.preventDefault(),d.stopPropagation(),!this.rafId&&(this.rafId=requestAnimationFrame(()=>{const m=d.clientX-t,f=d.clientY-n;let x=i+m,g=r+f;const y=a-l,v=o-c;x=Math.max(0,Math.min(x,y)),g=Math.max(0,Math.min(g,v)),this.element.style.left=`${x}px`,this.element.style.top=`${g}px`,this.rafId=null}))},p=()=>{this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),document.removeEventListener("mousemove",u,{capture:!0}),document.removeEventListener("mouseup",p,{capture:!0})};e.addEventListener("mousedown",h)}updateQuickPrompts(e){const n=(e||this.element).querySelector(".bim-ai-quick-prompts");!n||!this.options.quickPrompts||(n.innerHTML=this.options.quickPrompts.map(i=>` + `,this.messagesContainer=e.querySelector(".bim-ai-chat-messages"),this.textarea=e.querySelector(".bim-ai-textarea"),this.bindEvents(e),this.updateQuickPrompts(e),e}bindEvents(e){e.querySelectorAll(".bim-ai-chat-action-btn").forEach(a=>{a.addEventListener("click",o=>{switch(o.currentTarget.dataset.action){case"new":this.options.onNewChat?.();break;case"history":this.options.onHistory?.();break;case"settings":this.options.onSettings?.();break;case"close":this.hide(),this.options.onClose?.();break}})});const t=e.querySelector(".bim-ai-chat-header");t&&this.initDrag(t),e.querySelector(".bim-ai-send-btn")?.addEventListener("click",()=>this.handleSend()),this.textarea?.addEventListener("keydown",a=>{a.key==="Enter"&&!a.shiftKey&&(a.preventDefault(),this.handleSend())}),this.textarea?.addEventListener("input",()=>{this.textarea&&(this.textarea.style.height="auto",this.textarea.style.height=Math.min(this.textarea.scrollHeight,100)+"px")});const i=a=>a.stopPropagation();["click","dblclick","mousedown","mouseup","mousemove","wheel","touchstart","touchend","touchmove"].forEach(a=>{e.addEventListener(a,i,{passive:!1})})}handleSend(){if(!this.textarea)return;const e=this.textarea.value.trim();e&&(this.textarea.value="",this.textarea.style.height="auto",this.options.onSend?.(e))}initDrag(e){let t=0,n=0,i=0,r=0,a=0,o=0,l=0,c=0;const h=d=>{d.target.closest(".bim-ai-chat-action-btn")||(d.preventDefault(),d.stopPropagation(),t=d.clientX,n=d.clientY,i=this.element.offsetLeft,r=this.element.offsetTop,a=this.container.clientWidth,o=this.container.clientHeight,l=this.element.offsetWidth,c=this.element.offsetHeight,document.addEventListener("mousemove",u,{capture:!0}),document.addEventListener("mouseup",p,{capture:!0}))},u=d=>{d.preventDefault(),d.stopPropagation(),!this.rafId&&(this.rafId=requestAnimationFrame(()=>{const m=d.clientX-t,f=d.clientY-n;let x=i+m,g=r+f;const b=a-l,v=o-c;x=Math.max(0,Math.min(x,b)),g=Math.max(0,Math.min(g,v)),this.element.style.left=`${x}px`,this.element.style.top=`${g}px`,this.rafId=null}))},p=()=>{this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),document.removeEventListener("mousemove",u,{capture:!0}),document.removeEventListener("mouseup",p,{capture:!0})};e.addEventListener("mousedown",h)}updateQuickPrompts(e){const n=(e||this.element).querySelector(".bim-ai-quick-prompts");!n||!this.options.quickPrompts||(n.innerHTML=this.options.quickPrompts.map(i=>` @@ -5250,7 +5250,7 @@ void main() { ${this.escapeHtml(n||"")} - `}bindQuestionEvents(){this.messagesContainer?.querySelectorAll(".bim-ai-option").forEach(e=>{e.addEventListener("click",t=>{const n=t.currentTarget,i=n.dataset.questionId,r=n.dataset.optionId;if(i&&r){const a=this.messages.find(o=>o.id===i);a&&!a.answered&&(a.selectedOptionId=r,this.renderMessages())}})}),this.messagesContainer?.querySelectorAll(".bim-ai-option-input").forEach(e=>{e.addEventListener("input",t=>{const n=t.target,i=n.dataset.questionId;if(i){const r=this.messages.find(a=>a.id===i);r&&(r.customAnswer=n.value)}})}),this.messagesContainer?.querySelectorAll(".bim-ai-question-submit").forEach(e=>{e.addEventListener("click",t=>{const i=t.currentTarget.dataset.questionId;if(i){const r=this.messages.find(a=>a.id===i);r&&r.selectedOptionId&&(r.answered=!0,this.renderMessages(),this.options.onQuestionSubmit?.(i,r.selectedOptionId,r.customAnswer))}})})}scrollToBottom(){this.messagesContainer&&(this.messagesContainer.scrollTop=this.messagesContainer.scrollHeight)}escapeHtml(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}destroy(){this._isDestroyed||(this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.element.remove(),this._isDestroyed=!0)}}class jT{aiChat=null;registry;initialized=!1;constructor(e){this.registry=e}init(){if(this.initialized)return;const e=this.registry.wrapper;if(!e){console.warn("[AiChatManager] wrapper 不存在,无法初始化");return}this.aiChat=new XT({container:e,width:440,title:"aiChat.title",placeholder:"aiChat.placeholder",quickPrompts:[{id:"summarize",label:"aiChat.quickPrompt.summarize"},{id:"explain",label:"aiChat.quickPrompt.explain"},{id:"generate",label:"aiChat.quickPrompt.generate"}],onSend:t=>{console.log("[AiChatManager] 用户发送消息:",t),this.aiChat?.addUserMessage(t),this.registry.emit("aiChat:message-sent",{message:t})},onQuestionSubmit:(t,n,i)=>{console.log("[AiChatManager] 用户回答问题:",{questionId:t,optionId:n,customAnswer:i}),this.registry.emit("aiChat:question-answered",{questionId:t,optionId:n,customAnswer:i})},onNewChat:()=>{console.log("[AiChatManager] 新建对话"),this.registry.emit("aiChat:new-chat",{})},onHistory:()=>{console.log("[AiChatManager] 打开历史"),this.registry.emit("aiChat:history-opened",{})},onSettings:()=>{console.log("[AiChatManager] 打开设置"),this.registry.emit("aiChat:settings-opened",{})},onClose:()=>{console.log("[AiChatManager] 关闭 AI 聊天"),this.registry.emit("aiChat:closed",{}),this.registry.toolbar?.setBtnActive("aiChat",!1)}}),this.initialized=!0}show(){this.aiChat||this.init(),this.aiChat?.show(),this.registry.emit("aiChat:opened",{}),this.registry.toolbar?.setBtnActive("aiChat",!0)}hide(){this.aiChat?.hide(),this.registry.emit("aiChat:closed",{}),this.registry.toolbar?.setBtnActive("aiChat",!1)}toggle(){this.aiChat?.isVisible()?this.hide():this.show()}isVisible(){return this.aiChat?.isVisible()??!1}addUserMessage(e){return this.aiChat?.addUserMessage(e)??""}addAiMessage(e){return this.aiChat?.addAiMessage(e)??""}addStepMessage(e,t){return this.aiChat?.addStepMessage(e,t)??""}addThinkingMessage(){return this.aiChat?.addThinkingMessage()??""}addQuestionMessage(e,t,n){return this.aiChat?.addQuestionMessage(e,t,n)??""}updateMessage(e,t){this.aiChat?.updateMessage(e,t)}removeMessage(e){this.aiChat?.removeMessage(e)}clearMessages(){this.aiChat?.clearMessages()}destroy(){this.aiChat&&(this.aiChat.destroy(),this.aiChat=null),this.initialized=!1}}class qT{events=new Map;on(e,t){return this.events.has(e)||this.events.set(e,[]),this.events.get(e).push(t),()=>this.off(e,t)}off(e,t){const n=this.events.get(e);if(!n)return;const i=n.indexOf(t);i!==-1&&n.splice(i,1)}emit(e,t){const n=this.events.get(e);n&&n.forEach(i=>{try{i(t)}catch(r){console.error(`[EventEmitter] Error in listener for event "${e}":`,r)}})}clear(){this.events.clear()}}class ZT{eventEmitter=new qT;container=null;wrapper=null;toolbar=null;dialog=null;engine3d=null;buttonGroup=null;rightKey=null;constructTree=null;measure=null;walkControl=null;sectionPlane=null;sectionAxis=null;sectionBox=null;walkPath=null;walkPlanView=null;engineInfo=null;componentDetail=null;aiChat=null;setting=null;constructor(){}reset(){this.eventEmitter.clear(),this.container=null,this.wrapper=null,this.toolbar=null,this.dialog=null,this.engine3d=null,this.buttonGroup=null,this.rightKey=null,this.constructTree=null,this.measure=null,this.walkControl=null,this.sectionPlane=null,this.sectionAxis=null,this.sectionBox=null,this.walkPath=null,this.walkPlanView=null,this.engineInfo=null,this.componentDetail=null,this.aiChat=null,this.setting=null}emit(e,t){this.eventEmitter.emit(e,t)}on(e,t){return this.eventEmitter.on(e,t)}off(e,t){this.eventEmitter.off(e,t)}clearEvents(){this.eventEmitter.clear()}}class YT{container;wrapper=null;registry;toolbar=null;constructTreeBtn=null;buttonGroup=null;dialog=null;engine=null;rightKey=null;measure=null;sectionPlane=null;sectionAxis=null;sectionBox=null;walkControl=null;engineInfo=null;componentDetail=null;aiChat=null;setting=null;constructor(e,t){const n=typeof e=="string"?document.getElementById(e):e;if(!n)throw new Error("Container not found");this.container=n,this.registry=new ZT,t?.locale&&Qt.setLocale(t.locale),t?.theme&&(t.theme==="custom"?console.warn("Custom theme should be set via setCustomTheme()."):ot.setTheme(t.theme)),this.init()}emit(e,t){this.registry.emit(e,t)}on(e,t){return this.registry.on(e,t)}setLocale(e){Qt.setLocale(e)}getLocale(){return Qt.getLocale()}setTheme(e){ot.setTheme(e)}setCustomTheme(e){ot.setCustomTheme(e)}init(){this.container.innerHTML="",this.wrapper=document.createElement("div"),this.wrapper.className="bim-engine-wrapper",this.container.appendChild(this.wrapper);const e=document.createElement("div");e.className="bim-engine-version",e.textContent="v1.3.2",this.wrapper.appendChild(e),this.registry.container=this.container,this.registry.wrapper=this.wrapper,this.engine=new vT(this.wrapper,this.registry),this.dialog=new Eg(this.wrapper,this.registry),this.toolbar=new Mg(this.wrapper,this.registry),this.buttonGroup=new wg(this.wrapper,this.registry),this.rightKey=new Q0(this.wrapper,this.registry),this.constructTreeBtn=new ST(this.wrapper,this.registry),this.measure=new TT(this.registry),this.sectionPlane=new AT(this.registry),this.sectionAxis=new RT(this.registry),this.sectionBox=new DT(this.registry),this.walkControl=new kT(this.registry),this.walkControl.init(),this.engineInfo=new UT(this.registry),this.engineInfo.init(),this.registry.engine3d=this.engine,this.registry.dialog=this.dialog,this.registry.toolbar=this.toolbar,this.registry.buttonGroup=this.buttonGroup,this.registry.rightKey=this.rightKey,this.registry.constructTree=this.constructTreeBtn,this.registry.measure=this.measure,this.registry.sectionPlane=this.sectionPlane,this.registry.sectionAxis=this.sectionAxis,this.registry.sectionBox=this.sectionBox,this.registry.walkControl=this.walkControl,this.registry.engineInfo=this.engineInfo,this.componentDetail=new WT(this.registry),this.registry.componentDetail=this.componentDetail,this.componentDetail.init(),this.aiChat=new jT(this.registry),this.registry.aiChat=this.aiChat,this.aiChat.init(),this.setting=new VT(this.registry),this.registry.setting=this.setting,this.setting.init(),this.updateTheme(ot.getTheme()),ot.subscribe(t=>{this.updateTheme(t)})}updateTheme(e){this.wrapper&&(this.wrapper.style.color=e.textPrimary)}destroy(){this.toolbar?.destroy(),this.buttonGroup?.destroy(),this.engine?.destroy(),this.dialog?.destroy(),this.rightKey?.destroy(),this.measure?.destroy(),this.sectionPlane?.destroy(),this.sectionAxis?.destroy(),this.sectionBox?.destroy(),this.walkControl?.destroy(),this.aiChat?.destroy(),this.setting?.destroy(),this.container.innerHTML="",this.registry.reset()}}const $T=Object.freeze(Object.defineProperty({__proto__:null,createHomeButton:s=>({id:"home",groupId:"group-1",type:"button",label:"toolbar.home",icon:at("主视角"),keepActive:!1,onClick:e=>{console.log("首页按钮被点击:",e.id),s.engine3d?.CameraGoHome()}})},Symbol.toStringTag,{value:"Module"})),KT=Object.freeze(Object.defineProperty({__proto__:null,createZoomBoxButton:s=>({id:"zoom-box",groupId:"group-1",keepActive:!1,type:"button",label:"toolbar.zoomBox",icon:at("框选放大"),onClick:()=>{s.engine3d?.activateZoomBox()}})},Symbol.toStringTag,{value:"Module"})),JT=Object.freeze(Object.defineProperty({__proto__:null,createWalkMenuButton:s=>({id:"walk",groupId:"group-1",type:"button",label:"toolbar.walk",align:"vertical",icon:at("漫游"),onClick:()=>{console.log("漫游按钮被点击"),s.walkControl?.show()}})},Symbol.toStringTag,{value:"Module"})),QT=Object.freeze(Object.defineProperty({__proto__:null,createMapButton:s=>({id:"map",groupId:"group-1",type:"button",label:"toolbar.map",align:"vertical",keepActive:!0,icon:at("地图"),onClick:()=>{s.engine3d?.toggleMiniMap()}})},Symbol.toStringTag,{value:"Module"})),eC=Object.freeze(Object.defineProperty({__proto__:null,createPropertyButton:s=>({id:"property",groupId:"group-1",type:"button",label:"toolbar.property",align:"vertical",icon:at("文档"),onClick:()=>{console.log("构件详情按钮被点击"),s.componentDetail?.show()}})},Symbol.toStringTag,{value:"Module"})),tC=Object.freeze(Object.defineProperty({__proto__:null,createSettingButton:s=>({id:"setting",groupId:"group-2",type:"button",label:"toolbar.setting",icon:at("设置"),keepActive:!1,onClick:e=>{s?.setting?.toggle()}})},Symbol.toStringTag,{value:"Module"})),nC=Object.freeze(Object.defineProperty({__proto__:null,createInfoButton:s=>({id:"info",groupId:"group-2",type:"button",label:"toolbar.info",icon:at("信息"),keepActive:!1,onClick:()=>{s.engineInfo?.show()}})},Symbol.toStringTag,{value:"Module"})),iC=Object.freeze(Object.defineProperty({__proto__:null,createFullscreenButton:s=>({id:"fullscreen",groupId:"group-2",type:"button",label:"toolbar.fullscreen",align:"vertical",icon:at("全屏"),onClick:async()=>{console.log("全屏按钮被点击"),window.self!==window.top&&console.warn('检测到在 Iframe 中运行,请确保父级 iframe 标签拥有 allow="fullscreen" 属性');try{const t=document,i=!!(t.fullscreenElement||t.webkitFullscreenElement||t.mozFullScreenElement||t.msFullscreenElement);console.log("当前是否全屏:",i);const a=document.querySelector(".bim-engine-container")||document.body,o=a;if(i){console.log("准备退出全屏...");const l=t.exitFullscreen||t.webkitExitFullscreen||t.mozCancelFullScreen||t.msExitFullscreen;l&&(await l.call(t),console.log("退出全屏请求已发送"))}else{console.log("准备进入全屏..."),(a.style.backgroundColor===""||a.style.backgroundColor==="transparent")&&(a.style.backgroundColor="#ffffff");const l=o.requestFullscreen||o.webkitRequestFullscreen||o.mozRequestFullScreen||o.msRequestFullscreen;l?(await l.call(o,{navigationUI:"hide"}),console.log("全屏请求已发送")):(console.warn("当前浏览器不支持全屏 API"),alert("当前浏览器不支持全屏功能"))}}catch(t){console.error("全屏操作失败:",t),t&&t.message&&t.message.includes("denied")&&console.error('全屏请求被拒绝。如果是 Iframe,请检查 allow="fullscreen"。如果是自动触发,请确保由用户点击触发。')}}})},Symbol.toStringTag,{value:"Module"})),sC=Object.freeze(Object.defineProperty({__proto__:null,createMeasureButton:s=>({id:"measure",groupId:"group-1",type:"button",label:"toolbar.measure",icon:at("测量"),keepActive:!0,onClick:e=>{e.isActive?s.measure?.show():s.measure?.destroy()}})},Symbol.toStringTag,{value:"Module"})),rC=Object.freeze(Object.defineProperty({__proto__:null,createSectionMenuButton:s=>({id:"section",groupId:"group-1",type:"menu",label:"toolbar.section",align:"vertical",icon:at("剖切"),keepActive:!0,onClick:e=>{console.log("剖切按钮被点击:",e.id)}})},Symbol.toStringTag,{value:"Module"})),aC=Object.freeze(Object.defineProperty({__proto__:null,createSectionPlaneButton:s=>({id:"section-plane",groupId:"group-1",parentId:"section",type:"button",keepActive:!0,exclusive:!0,align:"vertical",label:"toolbar.sectionPlane",icon:at("拾曲面剖切"),onClick:e=>{console.log("拾取面剖切被点击:",e.id,"激活状态:",e.isActive),e.isActive?s.sectionPlane?.show():s.sectionPlane?.hide()}})},Symbol.toStringTag,{value:"Module"})),oC=Object.freeze(Object.defineProperty({__proto__:null,createSectionAxisButton:s=>({id:"section-axis",groupId:"group-1",parentId:"section",type:"button",keepActive:!0,exclusive:!0,align:"vertical",label:"toolbar.sectionAxis",icon:at("轴向剖切"),onClick:e=>{e.isActive?s.sectionAxis?.show():s.sectionAxis?.destroy()}})},Symbol.toStringTag,{value:"Module"})),lC=Object.freeze(Object.defineProperty({__proto__:null,createSectionBoxButton:s=>({id:"section-box",groupId:"group-1",parentId:"section",type:"button",keepActive:!0,exclusive:!0,align:"vertical",label:"toolbar.sectionBox",icon:at("剖切盒"),onClick:e=>{console.log("剖切盒被点击:",e.id,"激活状态:",e.isActive),e.isActive?s.sectionBox?.show():s.sectionBox?.hide()}})},Symbol.toStringTag,{value:"Module"})),cC=Object.freeze(Object.defineProperty({__proto__:null,createAiChatButton:s=>(s.on("aiChat:opened",()=>{s.toolbar?.setBtnActive("aiChat",!0)}),s.on("aiChat:closed",()=>{s.toolbar?.setBtnActive("aiChat",!1)}),{id:"aiChat",groupId:"group-2",type:"button",label:"aiChat.title",align:"vertical",keepActive:!0,icon:at("bot"),onClick:()=>{s.aiChat?.toggle()}})},Symbol.toStringTag,{value:"Module"})),hC=Object.freeze(Object.defineProperty({__proto__:null,default:`# BIM引擎AI助手 - 需求分析与步骤规划专家 + `}bindQuestionEvents(){this.messagesContainer?.querySelectorAll(".bim-ai-option").forEach(e=>{e.addEventListener("click",t=>{const n=t.currentTarget,i=n.dataset.questionId,r=n.dataset.optionId;if(i&&r){const a=this.messages.find(o=>o.id===i);a&&!a.answered&&(a.selectedOptionId=r,this.renderMessages())}})}),this.messagesContainer?.querySelectorAll(".bim-ai-option-input").forEach(e=>{e.addEventListener("input",t=>{const n=t.target,i=n.dataset.questionId;if(i){const r=this.messages.find(a=>a.id===i);r&&(r.customAnswer=n.value)}})}),this.messagesContainer?.querySelectorAll(".bim-ai-question-submit").forEach(e=>{e.addEventListener("click",t=>{const i=t.currentTarget.dataset.questionId;if(i){const r=this.messages.find(a=>a.id===i);r&&r.selectedOptionId&&(r.answered=!0,this.renderMessages(),this.options.onQuestionSubmit?.(i,r.selectedOptionId,r.customAnswer))}})})}scrollToBottom(){this.messagesContainer&&(this.messagesContainer.scrollTop=this.messagesContainer.scrollHeight)}escapeHtml(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}destroy(){this._isDestroyed||(this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.element.remove(),this._isDestroyed=!0)}}class jC{aiChat=null;registry;initialized=!1;constructor(e){this.registry=e}init(){if(this.initialized)return;const e=this.registry.wrapper;if(!e){console.warn("[AiChatManager] wrapper 不存在,无法初始化");return}this.aiChat=new XC({container:e,width:440,title:"aiChat.title",placeholder:"aiChat.placeholder",quickPrompts:[{id:"summarize",label:"aiChat.quickPrompt.summarize"},{id:"explain",label:"aiChat.quickPrompt.explain"},{id:"generate",label:"aiChat.quickPrompt.generate"}],onSend:t=>{console.log("[AiChatManager] 用户发送消息:",t),this.aiChat?.addUserMessage(t),this.registry.emit("aiChat:message-sent",{message:t})},onQuestionSubmit:(t,n,i)=>{console.log("[AiChatManager] 用户回答问题:",{questionId:t,optionId:n,customAnswer:i}),this.registry.emit("aiChat:question-answered",{questionId:t,optionId:n,customAnswer:i})},onNewChat:()=>{console.log("[AiChatManager] 新建对话"),this.registry.emit("aiChat:new-chat",{})},onHistory:()=>{console.log("[AiChatManager] 打开历史"),this.registry.emit("aiChat:history-opened",{})},onSettings:()=>{console.log("[AiChatManager] 打开设置"),this.registry.emit("aiChat:settings-opened",{})},onClose:()=>{console.log("[AiChatManager] 关闭 AI 聊天"),this.registry.emit("aiChat:closed",{}),this.registry.toolbar?.setBtnActive("aiChat",!1)}}),this.initialized=!0}show(){this.aiChat||this.init(),this.aiChat?.show(),this.registry.emit("aiChat:opened",{}),this.registry.toolbar?.setBtnActive("aiChat",!0)}hide(){this.aiChat?.hide(),this.registry.emit("aiChat:closed",{}),this.registry.toolbar?.setBtnActive("aiChat",!1)}toggle(){this.aiChat?.isVisible()?this.hide():this.show()}isVisible(){return this.aiChat?.isVisible()??!1}addUserMessage(e){return this.aiChat?.addUserMessage(e)??""}addAiMessage(e){return this.aiChat?.addAiMessage(e)??""}addStepMessage(e,t){return this.aiChat?.addStepMessage(e,t)??""}addThinkingMessage(){return this.aiChat?.addThinkingMessage()??""}addQuestionMessage(e,t,n){return this.aiChat?.addQuestionMessage(e,t,n)??""}updateMessage(e,t){this.aiChat?.updateMessage(e,t)}removeMessage(e){this.aiChat?.removeMessage(e)}clearMessages(){this.aiChat?.clearMessages()}destroy(){this.aiChat&&(this.aiChat.destroy(),this.aiChat=null),this.initialized=!1}}class qC{events=new Map;on(e,t){return this.events.has(e)||this.events.set(e,[]),this.events.get(e).push(t),()=>this.off(e,t)}off(e,t){const n=this.events.get(e);if(!n)return;const i=n.indexOf(t);i!==-1&&n.splice(i,1)}emit(e,t){const n=this.events.get(e);n&&n.forEach(i=>{try{i(t)}catch(r){console.error(`[EventEmitter] Error in listener for event "${e}":`,r)}})}clear(){this.events.clear()}}class ZC{eventEmitter=new qC;container=null;wrapper=null;toolbar=null;dialog=null;engine3d=null;buttonGroup=null;rightKey=null;constructTree=null;measure=null;walkControl=null;sectionPlane=null;sectionAxis=null;sectionBox=null;walkPath=null;walkPlanView=null;engineInfo=null;componentDetail=null;aiChat=null;setting=null;constructor(){}reset(){this.eventEmitter.clear(),this.container=null,this.wrapper=null,this.toolbar=null,this.dialog=null,this.engine3d=null,this.buttonGroup=null,this.rightKey=null,this.constructTree=null,this.measure=null,this.walkControl=null,this.sectionPlane=null,this.sectionAxis=null,this.sectionBox=null,this.walkPath=null,this.walkPlanView=null,this.engineInfo=null,this.componentDetail=null,this.aiChat=null,this.setting=null}emit(e,t){this.eventEmitter.emit(e,t)}on(e,t){return this.eventEmitter.on(e,t)}off(e,t){this.eventEmitter.off(e,t)}clearEvents(){this.eventEmitter.clear()}}class YC{container;wrapper=null;registry;toolbar=null;constructTreeBtn=null;buttonGroup=null;dialog=null;engine=null;rightKey=null;measure=null;sectionPlane=null;sectionAxis=null;sectionBox=null;walkControl=null;engineInfo=null;componentDetail=null;aiChat=null;setting=null;constructor(e,t){const n=typeof e=="string"?document.getElementById(e):e;if(!n)throw new Error("Container not found");this.container=n,this.registry=new ZC,t?.locale&&Qt.setLocale(t.locale),t?.theme&&(t.theme==="custom"?console.warn("Custom theme should be set via setCustomTheme()."):ot.setTheme(t.theme)),this.init()}emit(e,t){this.registry.emit(e,t)}on(e,t){return this.registry.on(e,t)}setLocale(e){Qt.setLocale(e)}getLocale(){return Qt.getLocale()}setTheme(e){ot.setTheme(e)}setCustomTheme(e){ot.setCustomTheme(e)}init(){this.container.innerHTML="",this.wrapper=document.createElement("div"),this.wrapper.className="bim-engine-wrapper",this.container.appendChild(this.wrapper);const e=document.createElement("div");e.className="bim-engine-version",e.textContent="v1.3.2",this.wrapper.appendChild(e),this.registry.container=this.container,this.registry.wrapper=this.wrapper,this.engine=new vC(this.wrapper,this.registry),this.dialog=new Eg(this.wrapper,this.registry),this.toolbar=new Mg(this.wrapper,this.registry),this.buttonGroup=new wg(this.wrapper,this.registry),this.rightKey=new Q0(this.wrapper,this.registry),this.constructTreeBtn=new SC(this.wrapper,this.registry),this.measure=new CC(this.registry),this.sectionPlane=new AC(this.registry),this.sectionAxis=new RC(this.registry),this.sectionBox=new DC(this.registry),this.walkControl=new kC(this.registry),this.walkControl.init(),this.engineInfo=new UC(this.registry),this.engineInfo.init(),this.registry.engine3d=this.engine,this.registry.dialog=this.dialog,this.registry.toolbar=this.toolbar,this.registry.buttonGroup=this.buttonGroup,this.registry.rightKey=this.rightKey,this.registry.constructTree=this.constructTreeBtn,this.registry.measure=this.measure,this.registry.sectionPlane=this.sectionPlane,this.registry.sectionAxis=this.sectionAxis,this.registry.sectionBox=this.sectionBox,this.registry.walkControl=this.walkControl,this.registry.engineInfo=this.engineInfo,this.componentDetail=new WC(this.registry),this.registry.componentDetail=this.componentDetail,this.componentDetail.init(),this.aiChat=new jC(this.registry),this.registry.aiChat=this.aiChat,this.aiChat.init(),this.setting=new VC(this.registry),this.registry.setting=this.setting,this.setting.init(),this.updateTheme(ot.getTheme()),ot.subscribe(t=>{this.updateTheme(t)})}updateTheme(e){this.wrapper&&(this.wrapper.style.color=e.textPrimary)}destroy(){this.toolbar?.destroy(),this.buttonGroup?.destroy(),this.engine?.destroy(),this.dialog?.destroy(),this.rightKey?.destroy(),this.measure?.destroy(),this.sectionPlane?.destroy(),this.sectionAxis?.destroy(),this.sectionBox?.destroy(),this.walkControl?.destroy(),this.aiChat?.destroy(),this.setting?.destroy(),this.container.innerHTML="",this.registry.reset()}}const $C=Object.freeze(Object.defineProperty({__proto__:null,createHomeButton:s=>({id:"home",groupId:"group-1",type:"button",label:"toolbar.home",icon:at("主视角"),keepActive:!1,onClick:e=>{console.log("首页按钮被点击:",e.id),s.engine3d?.getEngineComponent()?.CameraGoHome()}})},Symbol.toStringTag,{value:"Module"})),KC=Object.freeze(Object.defineProperty({__proto__:null,createZoomBoxButton:s=>({id:"zoom-box",groupId:"group-1",keepActive:!1,type:"button",label:"toolbar.zoomBox",icon:at("框选放大"),onClick:()=>{s.engine3d?.getEngineComponent()?.activateZoomBox()}})},Symbol.toStringTag,{value:"Module"})),JC=Object.freeze(Object.defineProperty({__proto__:null,createWalkMenuButton:s=>({id:"walk",groupId:"group-1",type:"button",label:"toolbar.walk",align:"vertical",icon:at("漫游"),onClick:()=>{console.log("漫游按钮被点击"),s.walkControl?.show()}})},Symbol.toStringTag,{value:"Module"})),QC=Object.freeze(Object.defineProperty({__proto__:null,createMapButton:s=>({id:"map",groupId:"group-1",type:"button",label:"toolbar.map",align:"vertical",keepActive:!0,icon:at("地图"),onClick:()=>{s.engine3d?.getEngineComponent()?.toggleMiniMap()}})},Symbol.toStringTag,{value:"Module"})),eT=Object.freeze(Object.defineProperty({__proto__:null,createPropertyButton:s=>({id:"property",groupId:"group-1",type:"button",label:"toolbar.property",align:"vertical",icon:at("文档"),onClick:()=>{console.log("构件详情按钮被点击"),s.componentDetail?.show()}})},Symbol.toStringTag,{value:"Module"})),tT=Object.freeze(Object.defineProperty({__proto__:null,createSettingButton:s=>({id:"setting",groupId:"group-2",type:"button",label:"toolbar.setting",icon:at("设置"),keepActive:!1,onClick:e=>{s?.setting?.toggle()}})},Symbol.toStringTag,{value:"Module"})),nT=Object.freeze(Object.defineProperty({__proto__:null,createInfoButton:s=>({id:"info",groupId:"group-2",type:"button",label:"toolbar.info",icon:at("信息"),keepActive:!1,onClick:()=>{s.engineInfo?.show()}})},Symbol.toStringTag,{value:"Module"})),iT=Object.freeze(Object.defineProperty({__proto__:null,createFullscreenButton:s=>({id:"fullscreen",groupId:"group-2",type:"button",label:"toolbar.fullscreen",align:"vertical",icon:at("全屏"),onClick:async()=>{console.log("全屏按钮被点击"),window.self!==window.top&&console.warn('检测到在 Iframe 中运行,请确保父级 iframe 标签拥有 allow="fullscreen" 属性');try{const t=document,i=!!(t.fullscreenElement||t.webkitFullscreenElement||t.mozFullScreenElement||t.msFullscreenElement);console.log("当前是否全屏:",i);const a=document.querySelector(".bim-engine-container")||document.body,o=a;if(i){console.log("准备退出全屏...");const l=t.exitFullscreen||t.webkitExitFullscreen||t.mozCancelFullScreen||t.msExitFullscreen;l&&(await l.call(t),console.log("退出全屏请求已发送"))}else{console.log("准备进入全屏..."),(a.style.backgroundColor===""||a.style.backgroundColor==="transparent")&&(a.style.backgroundColor="#ffffff");const l=o.requestFullscreen||o.webkitRequestFullscreen||o.mozRequestFullScreen||o.msRequestFullscreen;l?(await l.call(o,{navigationUI:"hide"}),console.log("全屏请求已发送")):(console.warn("当前浏览器不支持全屏 API"),alert("当前浏览器不支持全屏功能"))}}catch(t){console.error("全屏操作失败:",t),t&&t.message&&t.message.includes("denied")&&console.error('全屏请求被拒绝。如果是 Iframe,请检查 allow="fullscreen"。如果是自动触发,请确保由用户点击触发。')}}})},Symbol.toStringTag,{value:"Module"})),sT=Object.freeze(Object.defineProperty({__proto__:null,createMeasureButton:s=>({id:"measure",groupId:"group-1",type:"button",label:"toolbar.measure",icon:at("测量"),keepActive:!0,onClick:e=>{e.isActive?s.measure?.show():s.measure?.destroy()}})},Symbol.toStringTag,{value:"Module"})),rT=Object.freeze(Object.defineProperty({__proto__:null,createSectionMenuButton:s=>({id:"section",groupId:"group-1",type:"menu",label:"toolbar.section",align:"vertical",icon:at("剖切"),keepActive:!0,onClick:e=>{console.log("剖切按钮被点击:",e.id)}})},Symbol.toStringTag,{value:"Module"})),aT=Object.freeze(Object.defineProperty({__proto__:null,createSectionPlaneButton:s=>({id:"section-plane",groupId:"group-1",parentId:"section",type:"button",keepActive:!0,exclusive:!0,align:"vertical",label:"toolbar.sectionPlane",icon:at("拾曲面剖切"),onClick:e=>{console.log("拾取面剖切被点击:",e.id,"激活状态:",e.isActive),e.isActive?s.sectionPlane?.show():s.sectionPlane?.hide()}})},Symbol.toStringTag,{value:"Module"})),oT=Object.freeze(Object.defineProperty({__proto__:null,createSectionAxisButton:s=>({id:"section-axis",groupId:"group-1",parentId:"section",type:"button",keepActive:!0,exclusive:!0,align:"vertical",label:"toolbar.sectionAxis",icon:at("轴向剖切"),onClick:e=>{e.isActive?s.sectionAxis?.show():s.sectionAxis?.destroy()}})},Symbol.toStringTag,{value:"Module"})),lT=Object.freeze(Object.defineProperty({__proto__:null,createSectionBoxButton:s=>({id:"section-box",groupId:"group-1",parentId:"section",type:"button",keepActive:!0,exclusive:!0,align:"vertical",label:"toolbar.sectionBox",icon:at("剖切盒"),onClick:e=>{console.log("剖切盒被点击:",e.id,"激活状态:",e.isActive),e.isActive?s.sectionBox?.show():s.sectionBox?.hide()}})},Symbol.toStringTag,{value:"Module"})),cT=Object.freeze(Object.defineProperty({__proto__:null,createAiChatButton:s=>(s.on("aiChat:opened",()=>{s.toolbar?.setBtnActive("aiChat",!0)}),s.on("aiChat:closed",()=>{s.toolbar?.setBtnActive("aiChat",!1)}),{id:"aiChat",groupId:"group-2",type:"button",label:"aiChat.title",align:"vertical",keepActive:!0,icon:at("bot"),onClick:()=>{s.aiChat?.toggle()}})},Symbol.toStringTag,{value:"Module"})),hT=Object.freeze(Object.defineProperty({__proto__:null,default:`# BIM引擎AI助手 - 需求分析与步骤规划专家 ## 角色定位 @@ -5420,7 +5420,7 @@ json内容 5. **用户友好**:步骤描述要清晰易懂,便于用户理解整个执行流程 -''`},Symbol.toStringTag,{value:"Module"})),uC=Object.freeze(Object.defineProperty({__proto__:null,default:`# BIM引擎AI助手 - 代码生成专家 +''`},Symbol.toStringTag,{value:"Module"})),uT=Object.freeze(Object.defineProperty({__proto__:null,default:`# BIM引擎AI助手 - 代码生成专家 ## 角色定位 @@ -5666,7 +5666,7 @@ try { 5. **代码可读性**:优先保证代码的可读性,而不是追求"高级"写法 6. **注释清晰**:关键逻辑要有注释,但不要过度注释 7. **性能考虑**:对于大量数据的处理,考虑性能优化 -8. **测试友好**:生成的代码应该便于测试和调试 `},Symbol.toStringTag,{value:"Module"})),dC=Object.freeze(Object.defineProperty({__proto__:null,default:`# BIM Engine SDK API 文档 +8. **测试友好**:生成的代码应该便于测试和调试 `},Symbol.toStringTag,{value:"Module"})),dT=Object.freeze(Object.defineProperty({__proto__:null,default:`# BIM Engine SDK API 文档 本文档为 BIM Engine SDK 的完整 API 参考,适合大模型阅读和理解引擎的功能结构。 @@ -7170,5 +7170,5 @@ BIM Engine SDK 提供了完整的 3D BIM 模型渲染和交互能力,主要特 - 施工模拟 - 运维管理 - AI 辅助设计 -`},Symbol.toStringTag,{value:"Module"}));js.BimEngine=YT,Object.defineProperty(js,Symbol.toStringTag,{value:"Module"})})); +`},Symbol.toStringTag,{value:"Module"}));js.BimEngine=YC,Object.defineProperty(js,Symbol.toStringTag,{value:"Module"})})); //# sourceMappingURL=iflow-engine.umd.js.map diff --git a/demo/lib/iflow-engine.umd.js.map b/demo/lib/iflow-engine.umd.js.map index bdc5d09..d290bdb 100644 --- a/demo/lib/iflow-engine.umd.js.map +++ b/demo/lib/iflow-engine.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"iflow-engine.umd.js","sources":["../src/locales/zh-CN.ts","../src/locales/en-US.ts","../src/services/locale.ts","../src/themes/presets.ts","../src/services/theme.ts","../src/components/button-group/index.ts","../src/components/button-group/toolbar/index.ts","../src/core/base-manager.ts","../src/managers/toolbar-manager.ts","../src/managers/button-group-manager.ts","../src/components/dialog/index.ts","../src/managers/dialog-manager.ts","../../bim_engine_base/node_modules/three/build/three.core.js","../../bim_engine_base/node_modules/three/build/three.module.js","../../bim_engine_base/dist/bim-engine-sdk.es.js","../src/components/engine/index.ts","../src/components/right-key/index.ts","../src/components/menu/index.ts","../src/managers/right-key-manager.ts","../src/managers/engine-manager.ts","../src/components/tree/types.ts","../src/components/tree/tree-node.ts","../src/components/tree/index.ts","../src/components/tab/index.ts","../src/utils/icon-manager.ts","../src/managers/construct-tree-manager-btn.ts","../src/core/base-dialog-manager.ts","../src/types/measure.ts","../src/components/measure-panel/index.ts","../src/managers/measure-dialog-manager.ts","../src/components/section-plane-panel/index.ts","../src/managers/section-plane-dialog-manager.ts","../src/components/section-axis-panel/index.ts","../src/managers/section-axis-dialog-manager.ts","../src/components/section-box-panel/index.ts","../src/managers/section-box-dialog-manager.ts","../src/components/walk-control-panel/index.ts","../src/components/walk-path-panel/index.ts","../src/managers/walk-path-dialog-manager.ts","../src/managers/walk-control-manager.ts","../src/managers/engine-info-dialog-manager.ts","../src/managers/setting-dialog-manager.ts","../src/components/collapse/index.ts","../src/managers/component-detail-manager.ts","../src/components/ai-chat/index.ts","../src/managers/ai-chat-manager.ts","../src/core/event-emitter.ts","../src/core/manager-registry.ts","../src/bim-engine.ts","../src/components/button-group/toolbar/buttons/home/index.ts","../src/components/button-group/toolbar/buttons/zoom-box/index.ts","../src/components/button-group/toolbar/buttons/walk/walk-menu/index.ts","../src/components/button-group/toolbar/buttons/map/index.ts","../src/components/button-group/toolbar/buttons/property/index.ts","../src/components/button-group/toolbar/buttons/setting/index.ts","../src/components/button-group/toolbar/buttons/info/index.ts","../src/components/button-group/toolbar/buttons/fullscreen/index.ts","../src/components/button-group/toolbar/buttons/measure/index.ts","../src/components/button-group/toolbar/buttons/section/section-menu/index.ts","../src/components/button-group/toolbar/buttons/section/section-plane/index.ts","../src/components/button-group/toolbar/buttons/section/section-axis/index.ts","../src/components/button-group/toolbar/buttons/section/section-box/index.ts","../src/components/button-group/toolbar/buttons/ai-chat/index.ts","../../bim_engine_base/dist/main-2Txx2Vau.mjs","../../bim_engine_base/dist/step-CkmZYIvn.mjs","../../bim_engine_base/dist/API文档-B1v8UcRF.mjs"],"sourcesContent":["import {TranslationDictionary} from './types';\n\nexport const zhCN: TranslationDictionary = {\n common: {\n title: 'BimEngine',\n description: '这是一个使用 BIM-ENGINE。',\n openTestDialog: '打开测试弹窗',\n openInfoDialog: '打开信息弹窗 (封装版)',\n },\n toolbar: {\n home: '首页',\n measure: '测量',\n zoomBox: '选框放大',\n info: '信息',\n location: '定位',\n setting: '设置',\n walk: '漫游',\n map: '地图',\n property: '构件详情',\n fullscreen: '全屏',\n walkMenu: '漫游菜单',\n walkPerson: '第一人称',\n walkBird: '第三人称',\n tree: '模型树',\n section: '剖切',\n sectionPlane: '拾取面剖切',\n sectionAxis: '轴向剖切',\n sectionBox: '剖切盒'\n },\n dialog: {\n testTitle: '测试弹窗',\n testContent: '
这是一个 可拖拽可缩放 的弹窗。

你可以尝试拖动标题栏,或者拖动右下角改变大小。
',\n },\n menu: {\n info: '信息',\n home: '首页',\n componentDetail: '构件详情',\n hideSelected: '隐藏选中构件',\n transparentSelected: '半透明选中构件',\n cancelTranslucent: '取消半透明',\n isolateSelected: '隔离选中构件',\n hideOthers: '其他构件隐藏',\n transparentOthers: '其他构件半透明',\n fitSectionBox: '剖切盒适应',\n showAll: '显示全部',\n quickSelect: '快速选择',\n selectSameType: '选择同类模型',\n selectSameLevel: '选择同层模型',\n selectSameLevelType: '选择同层同类模型'\n },\n tree: {\n searchPlaceholder: '请输入要搜索的内容',\n },\n constructTree: {\n title: '目录树',\n },\n tab: {\n component: '构件',\n system: '系统',\n space: '空间',\n type: '类型',\n major: '专业',\n },\n panel: {\n property: {\n title: '构件详情',\n base: '基本属性',\n material: '材质信息',\n advanced: '高级设置',\n tab: {\n props: '属性',\n material: '材质'\n }\n },\n componentDetail: {\n title: '构件详情',\n noSelection: '请先选中构件'\n }\n },\n measure: {\n btnName: '测量',\n dialogTitle: '测量',\n modes: {\n clearHeight: '净高',\n clearDistance: '净距',\n distance: '距离',\n elevation: '标高',\n point: '坐标',\n angle: '角度',\n area: '面积',\n slope: '坡度',\n },\n actions: {\n expand: '展开',\n collapse: '收起',\n clearAll: '删除全部',\n settings: '设置',\n },\n labels: {\n currentMode: '当前测量方式:',\n x: 'X:',\n y: 'Y:',\n z: 'Z:',\n value: {\n clearHeight: '净高:',\n clearDistance: '净距:',\n distance: '距离:',\n elevation: '标高:',\n point: '坐标:',\n angle: '角度:',\n area: '面积:',\n slope: '坡度:',\n }\n },\n settings: {\n title: '设置',\n unit: '单位:',\n precision: '精度:',\n hint: '距离、净距、净高和标高默认使用该单位;角度和面积有各自默认单位。',\n save: '保存设置',\n cancel: '取消',\n },\n clearHeight: {\n direction: '朝向:',\n directionDown: '朝下',\n directionUp: '朝上',\n selectType: '选择对象:',\n selectPoint: '选择点',\n selectElement: '选择构件',\n }\n },\n sectionPlane: {\n dialogTitle: '拾取面剖切',\n actions: {\n hide: '隐藏',\n reverse: '反向',\n reset: '重置'\n }\n },\n sectionAxis: {\n dialogTitle: '轴向剖切',\n actions: {\n hide: '隐藏',\n reverse: '反向',\n axisX: 'X',\n axisY: 'Y',\n axisZ: 'Z'\n }\n },\n sectionBox: {\n dialogTitle: '剖切盒',\n actions: {\n hide: '隐藏',\n reverse: '反向',\n fitToModel: '适应',\n reset: '重置'\n },\n axes: {\n x: 'X',\n y: 'Y',\n z: 'Z'\n }\n },\n walkControl: {\n speed: '移动速度:',\n gravity: '重力',\n collision: '碰撞',\n characterModel: {\n label: '建筑工人',\n constructionWorker: '建筑工人',\n officeMale: '办公室男性'\n },\n walkMode: {\n label: '行走模式',\n walk: '行走模式',\n run: '奔跑模式'\n },\n exit: '退出',\n path: {\n dialogTitle: '路径漫游',\n duration: '漫游时间',\n durationUnit: '秒',\n loop: '循环播放',\n addPoint: '添加漫游点',\n deleteAll: '删除全部',\n point: '漫游点',\n play: '播放漫游',\n stop: '停止漫游',\n noPoints: '暂无漫游点,请添加'\n }\n },\n info: {\n dialogTitle: '基本信息',\n meshCount: '构件数量',\n totalTriangles: '三角面数量',\n totalVertices: '顶点数量',\n },\n aiChat: {\n title: 'AI 助手',\n placeholder: '输入你的问题...',\n quickPrompt: {\n summarize: '总结这个模型',\n explain: '解释选中的构件',\n generate: '生成报告'\n },\n action: {\n new: '新建对话',\n history: '历史记录',\n settings: '设置',\n close: '关闭'\n },\n helper: {\n newline: 'Shift + Enter 换行',\n send: 'Enter 发送'\n },\n thinking: '正在思考...',\n other: '其他',\n otherPlaceholder: '请输入自定义答案',\n submit: '提交'\n },\n setting: {\n dialogTitle: '设置',\n renderMode: '渲染模式',\n modes: {\n simple: '性能模式',\n balance: '平衡模式',\n advanced: '效果模式',\n },\n edgeLine: '边线',\n ground: '显示地面',\n groundSize: '大小',\n groundTypes: {\n none: '无',\n concrete: '混凝土',\n grass: '草地',\n tile: '瓷砖',\n water: '水面',\n wood: '木地板',\n },\n contrast: '对比度',\n saturation: '饱和度',\n lightIntensity: '光照强度',\n environment: '环境背景',\n environments: {\n default: '默认',\n outdoor: '室外',\n indoor: '室内',\n night: '夜晚',\n overcast: '阴天',\n studio: '工作室',\n },\n }\n};\n","import {TranslationDictionary} from './types';\n\nexport const enUS: TranslationDictionary = {\n common: {\n title: 'BimEngine',\n description: 'This is a BIM-ENGINE demo.',\n openTestDialog: 'Open Test Dialog',\n openInfoDialog: 'Open Info Dialog (Wrapped)',\n },\n toolbar: {\n home: 'Home',\n measure: 'Measure',\n zoomBox: 'Zoom Box',\n info: 'Info',\n location: 'Location',\n setting: 'Settings',\n walk: 'Walk',\n map: 'Map',\n property: 'Property',\n fullscreen: 'Fullscreen',\n walkPerson: 'Person',\n walkBird: 'Bird Eye',\n walkMenu: 'Menu',\n tree: 'Tree',\n section: 'Section',\n sectionPlane: 'Plane Section',\n sectionAxis: 'Axis Section',\n sectionBox: 'Section Box'\n },\n dialog: {\n testTitle: 'Test Dialog',\n testContent: '
This is a draggable and resizable dialog.

Try dragging the title bar or resizing from the bottom-right corner.
',\n },\n menu: {\n info: 'Info',\n home: 'Home',\n componentDetail: 'Component Detail',\n hideSelected: 'Hide Selected',\n transparentSelected: 'Transparent Selected',\n cancelTranslucent: 'Cancel Translucent',\n isolateSelected: 'Isolate Selected',\n hideOthers: 'Hide Others',\n transparentOthers: 'Transparent Others',\n fitSectionBox: 'Fit Section Box',\n showAll: 'Show All',\n quickSelect: 'Quick Select',\n selectSameType: 'Select Same Type',\n selectSameLevel: 'Select Same Level',\n selectSameLevelType: 'Select Same Level & Type'\n },\n tree: {\n searchPlaceholder: 'Please enter content to search',\n },\n constructTree: {\n title: 'Construct Tree',\n },\n tab: {\n component: 'Component',\n system: 'System',\n space: 'Space',\n type: 'Type',\n major: 'Major',\n },\n panel: {\n property: {\n title: 'Component Details',\n base: 'Basic Info',\n material: 'Material',\n advanced: 'Advanced',\n tab: {\n props: 'Properties',\n material: 'Material'\n }\n },\n componentDetail: {\n title: 'Component Detail',\n noSelection: 'Please select a component first'\n }\n },\n measure: {\n btnName: 'Measure',\n dialogTitle: 'Measure',\n modes: {\n clearHeight: 'Clear Height',\n clearDistance: 'Clear Distance',\n distance: 'Distance',\n elevation: 'Elevation',\n point: 'Point',\n angle: 'Angle',\n area: 'Area',\n slope: 'Slope',\n },\n actions: {\n expand: 'Expand',\n collapse: 'Collapse',\n clearAll: 'Clear All',\n settings: 'Settings',\n },\n labels: {\n currentMode: 'Mode:',\n x: 'X:',\n y: 'Y:',\n z: 'Z:',\n value: {\n clearHeight: 'Clear Height:',\n clearDistance: 'Clear Distance:',\n distance: 'Distance:',\n elevation: 'Elevation:',\n point: 'Point:',\n angle: 'Angle:',\n area: 'Area:',\n slope: 'Slope:',\n }\n },\n settings: {\n title: 'Settings',\n unit: 'Unit:',\n precision: 'Precision:',\n hint: 'Distance, clear distance, clear height and elevation use this unit by default; angle and area use their own units.',\n save: 'Save',\n cancel: 'Cancel',\n },\n clearHeight: {\n direction: 'Direction:',\n directionDown: 'Down',\n directionUp: 'Up',\n selectType: 'Select:',\n selectPoint: 'Point',\n selectElement: 'Element',\n }\n },\n sectionPlane: {\n dialogTitle: 'Plane Section',\n actions: {\n hide: 'Hide',\n reverse: 'Reverse',\n reset: 'Reset'\n }\n },\n sectionAxis: {\n dialogTitle: 'Axis Section',\n actions: {\n hide: 'Hide',\n reverse: 'Reverse',\n axisX: 'X',\n axisY: 'Y',\n axisZ: 'Z'\n }\n },\n sectionBox: {\n dialogTitle: 'Section Box',\n actions: {\n hide: 'Hide',\n reverse: 'Reverse',\n fitToModel: 'Fit',\n reset: 'Reset'\n },\n axes: {\n x: 'X',\n y: 'Y',\n z: 'Z'\n }\n },\n walkControl: {\n speed: 'Speed:',\n gravity: 'Gravity',\n collision: 'Collision',\n characterModel: {\n label: 'Construction Worker',\n constructionWorker: 'Construction Worker',\n officeMale: 'Office Male'\n },\n walkMode: {\n label: 'Walk Mode',\n walk: 'Walk',\n run: 'Run'\n },\n exit: 'Exit',\n path: {\n dialogTitle: 'Path Roaming',\n duration: 'Duration',\n durationUnit: 's',\n loop: 'Loop',\n addPoint: 'Add Point',\n deleteAll: 'Delete All',\n point: 'Point',\n play: 'Play',\n stop: 'Stop',\n noPoints: 'No points yet'\n }\n },\n info: {\n dialogTitle: 'Basic Info',\n meshCount: 'Mesh Count',\n totalTriangles: 'Total Triangles',\n totalVertices: 'Total Vertices',\n },\n aiChat: {\n title: 'AI Assistant',\n placeholder: 'Ask a question...',\n quickPrompt: {\n summarize: 'Summarize this model',\n explain: 'Explain selected component',\n generate: 'Generate report'\n },\n action: {\n new: 'New Chat',\n history: 'History',\n settings: 'Settings',\n close: 'Close'\n },\n helper: {\n newline: 'Shift + Enter for new line',\n send: 'Enter to send'\n },\n thinking: 'Thinking...',\n other: 'Other',\n otherPlaceholder: 'Enter custom answer',\n submit: 'Submit'\n },\n setting: {\n dialogTitle: 'Settings',\n renderMode: 'Render Mode',\n modes: {\n simple: 'Performance',\n balance: 'Balanced',\n advanced: 'Quality',\n },\n edgeLine: 'Edge Lines',\n ground: 'Ground',\n groundSize: 'Size',\n groundTypes: {\n none: 'None',\n concrete: 'Concrete',\n grass: 'Grass',\n tile: 'Tile',\n water: 'Water',\n wood: 'Wood',\n },\n contrast: 'Contrast',\n saturation: 'Saturation',\n lightIntensity: 'Light Intensity',\n environment: 'Environment',\n environments: {\n default: 'Default',\n outdoor: 'Outdoor',\n indoor: 'Indoor',\n night: 'Night',\n overcast: 'Overcast',\n studio: 'Studio',\n },\n }\n};\n","import { LocaleType, TranslationDictionary } from '../locales/types';\nimport { zhCN } from '../locales/zh-CN';\nimport { enUS } from '../locales/en-US';\n\ntype LocaleChangeListener = (locale: LocaleType) => void;\n\n/**\n * 语言管理器类\n */\nexport class LocaleManager {\n private currentLocale: LocaleType = 'zh-CN';\n private messages: Record = {\n 'zh-CN': zhCN,\n 'en-US': enUS,\n };\n private listeners: LocaleChangeListener[] = [];\n\n constructor() {\n // 默认初始化\n }\n\n /**\n * 获取当前语言\n */\n public getLocale(): LocaleType {\n return this.currentLocale;\n }\n\n /**\n * 切换语言\n */\n public setLocale(locale: LocaleType) {\n if (this.currentLocale === locale) return;\n this.currentLocale = locale;\n this.notifyListeners();\n }\n\n /**\n * 翻译核心方法\n */\n public t(key: string): string {\n if (!key) return '';\n \n const keys = key.split('.');\n let value: any = this.messages[this.currentLocale];\n \n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n return key;\n }\n }\n return value as string;\n }\n\n /**\n * 订阅变更\n */\n public subscribe(listener: LocaleChangeListener): () => void {\n this.listeners.push(listener);\n return () => {\n this.listeners = this.listeners.filter(l => l !== listener);\n };\n }\n\n private notifyListeners() {\n this.listeners.forEach(listener => listener(this.currentLocale));\n }\n}\n\n// --- 导出单例 ---\nexport const localeManager = new LocaleManager();\n\n// --- 导出便捷方法 ---\n/**\n * 全局翻译函数\n * @param key 键路径 (如 'toolbar.home')\n */\nexport const t = (key: string): string => localeManager.t(key);\n","import { ThemeConfig } from './types';\n\n/**\n * Tailwind CSS 调色板参考(维护者参考)\n * \n * Slate: #f8fafc #f1f5f9 #e2e8f0 #cbd5e1 #94a3b8 #64748b #475569 #334155 #1e293b #0f172a\n * Blue: #eff6ff #dbeafe #bfdbfe #93c5fd #60a5fa #3b82f6 #2563eb #1d4ed8 #1e40af #1e3a8a\n * Green: #f0fdf4 #dcfce7 #bbf7d0 #86efac #4ade80 #22c55e #16a34a #15803d #166534 #14532d\n * Amber: #fffbeb #fef3c7 #fde68a #fcd34d #fbbf24 #f59e0b #d97706 #b45309 #92400e #78350f\n * Red: #fef2f2 #fee2e2 #fecaca #fca5a5 #f87171 #ef4444 #dc2626 #b91c1c #991b1b #7f1d1d\n * Cyan: #ecfeff #cffafe #a5f3fc #67e8f9 #22d3ee #06b6d4 #0891b2 #0e7490 #155e75 #164e63\n */\n\nexport const lightTheme: ThemeConfig = {\n name: 'light',\n\n primary: '#2563eb',\n primaryHover: '#1d4ed8',\n primaryActive: '#1e40af',\n primarySubtle: 'rgba(37, 99, 235, 0.1)',\n\n success: '#16a34a',\n successHover: '#15803d',\n successSubtle: 'rgba(22, 163, 74, 0.1)',\n\n warning: '#d97706',\n warningHover: '#b45309',\n warningSubtle: 'rgba(217, 119, 6, 0.1)',\n\n danger: '#dc2626',\n dangerHover: '#b91c1c',\n dangerSubtle: 'rgba(220, 38, 38, 0.1)',\n\n info: '#0891b2',\n infoHover: '#0e7490',\n infoSubtle: 'rgba(8, 145, 178, 0.1)',\n\n bgBase: '#f8fafc',\n bgElevated: '#ffffff',\n bgOverlay: 'rgba(255, 255, 255, 0.98)',\n bgInset: '#f1f5f9',\n bgGlass: 'rgba(255, 255, 255, 0.8)',\n bgGlassBlur: '24px',\n\n textPrimary: '#0f172a',\n textSecondary: '#475569',\n textTertiary: '#94a3b8',\n textDisabled: '#cbd5e1',\n textInverse: '#ffffff',\n textLink: '#2563eb',\n textLinkHover: '#1d4ed8',\n\n iconDefault: '#64748b',\n iconHover: '#334155',\n iconActive: '#2563eb',\n iconDisabled: '#cbd5e1',\n iconInverse: '#ffffff',\n\n borderDefault: '#e2e8f0',\n borderSubtle: '#f1f5f9',\n borderStrong: '#cbd5e1',\n borderDisabled: '#f1f5f9',\n divider: '#e2e8f0',\n\n componentBg: 'transparent',\n componentBgHover: 'rgba(15, 23, 42, 0.04)',\n componentBgActive: 'rgba(15, 23, 42, 0.08)',\n componentBgSelected: 'rgba(37, 99, 235, 0.08)',\n componentBgDisabled: '#f8fafc',\n\n focusRing: 'rgba(37, 99, 235, 0.5)',\n focusRingOffset: '#ffffff',\n selectionBg: 'rgba(37, 99, 235, 0.15)',\n selectionText: '#0f172a',\n\n shadowSm: '0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)',\n shadowMd: '0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)',\n shadowLg: '0 10px 25px rgba(0, 0, 0, 0.15), 0 6px 10px rgba(0, 0, 0, 0.1)',\n shadowXl: '0 20px 40px rgba(0, 0, 0, 0.2), 0 10px 15px rgba(0, 0, 0, 0.1)',\n shadowGlow: '0 2px 8px rgba(59, 130, 246, 0.3), 0 4px 16px rgba(59, 130, 246, 0.2)',\n\n scrollbarTrack: '#f1f5f9',\n scrollbarThumb: '#cbd5e1',\n scrollbarThumbHover: '#94a3b8',\n\n floatingBg: 'rgba(255, 255, 255, 0.8)',\n floatingBorder: 'rgba(226, 232, 240, 0.5)',\n floatingShadow: '0 4px 24px rgba(0, 0, 0, 0.06)',\n floatingBtnBg: 'rgba(255, 255, 255, 0.9)',\n floatingBtnBorder: 'rgba(203, 213, 225, 0.6)',\n floatingBtnShadow: '0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)',\n floatingBtnBgHover: '#ffffff',\n floatingBtnShadowHover: '0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)',\n floatingIconColor: '#334155',\n floatingIconColorHover: '#1e293b',\n\n panelBg: 'rgba(255, 255, 255, 0.95)',\n panelBorder: 'rgba(226, 232, 240, 0.6)',\n panelHeaderBg: 'rgba(248, 250, 252, 0.9)',\n panelRadius: '12px',\n\n tabBg: '#f1f5f9',\n tabItemBg: 'transparent',\n tabItemBgHover: 'rgba(255, 255, 255, 0.6)',\n tabItemBgActive: '#ffffff',\n tabItemTextActive: '#2563eb',\n\n overrides: {\n dialog: {\n headerBg: '#f8fafc',\n },\n toolbar: {\n bg: 'rgba(255, 255, 255, 0.9)',\n buttonBg: 'rgba(255, 255, 255, 0.95)',\n buttonBgHover: '#ffffff',\n buttonBgActive: '#2563eb',\n },\n input: {\n bg: '#ffffff',\n bgFocus: '#ffffff',\n placeholder: '#94a3b8',\n },\n },\n};\n\nexport const darkTheme: ThemeConfig = {\n name: 'dark',\n\n primary: '#3b82f6',\n primaryHover: '#60a5fa',\n primaryActive: '#2563eb',\n primarySubtle: 'rgba(59, 130, 246, 0.15)',\n\n success: '#22c55e',\n successHover: '#4ade80',\n successSubtle: 'rgba(34, 197, 94, 0.15)',\n\n warning: '#f59e0b',\n warningHover: '#fbbf24',\n warningSubtle: 'rgba(245, 158, 11, 0.15)',\n\n danger: '#ef4444',\n dangerHover: '#f87171',\n dangerSubtle: 'rgba(239, 68, 68, 0.15)',\n\n info: '#06b6d4',\n infoHover: '#22d3ee',\n infoSubtle: 'rgba(6, 182, 212, 0.15)',\n\n bgBase: '#152232',\n bgElevated: '#1f2d3e',\n bgOverlay: 'rgba(21, 34, 50, 0.98)',\n bgInset: '#152232',\n bgGlass: 'rgba(21, 34, 50, 0.85)',\n bgGlassBlur: '24px',\n\n textPrimary: '#ffffff',\n textSecondary: '#94a3b8',\n textTertiary: '#64748b',\n textDisabled: '#475569',\n textInverse: '#152232',\n textLink: '#60a5fa',\n textLinkHover: '#93c5fd',\n\n iconDefault: '#ffffff',\n iconHover: '#ffffff',\n iconActive: '#3b82f6',\n iconDisabled: '#475569',\n iconInverse: '#152232',\n\n borderDefault: 'rgba(51, 65, 85, 0.5)',\n borderSubtle: 'rgba(51, 65, 85, 0.5)',\n borderStrong: '#475569',\n borderDisabled: '#1e293b',\n divider: '#334155',\n\n componentBg: 'transparent',\n componentBgHover: 'rgba(248, 250, 252, 0.06)',\n componentBgActive: 'rgba(248, 250, 252, 0.1)',\n componentBgSelected: 'rgba(59, 130, 246, 0.2)',\n componentBgDisabled: '#1e293b',\n\n focusRing: 'rgba(59, 130, 246, 0.5)',\n focusRingOffset: '#1e293b',\n selectionBg: 'rgba(59, 130, 246, 0.3)',\n selectionText: '#f8fafc',\n\n shadowSm: '0 2px 8px rgba(0, 0, 0, 0.4), 0 4px 12px rgba(0, 0, 0, 0.3)',\n shadowMd: '0 4px 12px rgba(0, 0, 0, 0.5), 0 6px 20px rgba(0, 0, 0, 0.4)',\n shadowLg: '0 10px 25px rgba(0, 0, 0, 0.6), 0 6px 10px rgba(0, 0, 0, 0.4)',\n shadowXl: '0 20px 40px rgba(0, 0, 0, 0.7), 0 10px 15px rgba(0, 0, 0, 0.5)',\n shadowGlow: '0 2px 8px rgba(59, 130, 246, 0.4), 0 4px 16px rgba(59, 130, 246, 0.25)',\n\n scrollbarTrack: '#1e293b',\n scrollbarThumb: '#475569',\n scrollbarThumbHover: '#64748b',\n\n floatingBg: 'rgba(15, 23, 42, 0.85)',\n floatingBorder: 'rgba(51, 65, 85, 0.4)',\n floatingShadow: '0 4px 24px rgba(0, 0, 0, 0.25)',\n floatingBtnBg: 'rgba(51, 65, 85, 0.6)',\n floatingBtnBorder: 'rgba(100, 116, 139, 0.5)',\n floatingBtnShadow: '0 2px 8px rgba(0, 0, 0, 0.3), 0 4px 12px rgba(0, 0, 0, 0.25)',\n floatingBtnBgHover: 'rgba(71, 85, 105, 0.7)',\n floatingBtnShadowHover: '0 4px 12px rgba(0, 0, 0, 0.35), 0 6px 20px rgba(0, 0, 0, 0.3)',\n floatingIconColor: '#e2e8f0',\n floatingIconColorHover: '#f8fafc',\n\n panelBg: 'rgba(15, 23, 42, 0.95)',\n panelBorder: 'rgba(51, 65, 85, 0.5)',\n panelHeaderBg: 'rgba(15, 23, 42, 0.9)',\n panelRadius: '12px',\n\n tabBg: 'rgba(30, 41, 59, 0.6)',\n tabItemBg: 'transparent',\n tabItemBgHover: 'rgba(51, 65, 85, 0.5)',\n tabItemBgActive: 'rgba(51, 65, 85, 0.8)',\n tabItemTextActive: '#60a5fa',\n\n overrides: {\n dialog: {\n headerBg: '#0f172a',\n },\n toolbar: {\n bg: 'rgba(30, 41, 59, 0.9)',\n buttonBg: 'rgba(51, 65, 85, 0.6)',\n buttonBgHover: 'rgba(71, 85, 105, 0.7)',\n buttonBgActive: '#3b82f6',\n },\n input: {\n bg: '#0f172a',\n bgFocus: '#1e293b',\n placeholder: '#64748b',\n },\n },\n};\n\nexport function createThemeFromPartial(base: ThemeConfig, partial: Partial): ThemeConfig {\n return {\n ...base,\n ...partial,\n overrides: {\n ...base.overrides,\n ...partial.overrides,\n },\n };\n}\n\nexport function getThemeByName(name: string): ThemeConfig {\n switch (name) {\n case 'light':\n return lightTheme;\n case 'dark':\n default:\n return darkTheme;\n }\n}\n","import { ThemeConfig } from '../themes/types';\nimport { darkTheme, lightTheme } from '../themes/presets';\n\ntype ThemeChangeListener = (theme: ThemeConfig) => void;\n\n/**\n * 主题管理器 (单例)\n */\nexport class ThemeManager {\n private currentTheme: ThemeConfig = lightTheme;\n private listeners: ThemeChangeListener[] = [];\n\n constructor() {\n // 默认初始化\n }\n\n /**\n * 获取当前主题配置\n */\n public getTheme(): ThemeConfig {\n return this.currentTheme;\n }\n\n /**\n * 切换预设主题\n * @param themeName 'dark' | 'light'\n */\n public setTheme(themeName: 'dark' | 'light') {\n if (themeName === 'light') {\n this.applyTheme(lightTheme);\n } else {\n this.applyTheme(darkTheme);\n }\n }\n\n /**\n * 应用自定义主题配置\n * @param theme 配置对象\n */\n public setCustomTheme(theme: ThemeConfig) {\n this.applyTheme(theme);\n }\n\n /**\n * 内部应用主题逻辑\n */\n private applyTheme(theme: ThemeConfig) {\n this.currentTheme = theme;\n this.notifyListeners();\n }\n\n /**\n * 订阅主题变更\n */\n public subscribe(listener: ThemeChangeListener): () => void {\n this.listeners.push(listener);\n // 立即回调一次当前状态\n listener(this.currentTheme);\n return () => {\n this.listeners = this.listeners.filter(l => l !== listener);\n };\n }\n\n private notifyListeners() {\n this.listeners.forEach(listener => listener(this.currentTheme));\n }\n}\n\n// 导出单例\nexport const themeManager = new ThemeManager();","import './index.css';\nimport type {\n OptButton,\n ButtonGroup,\n ButtonGroupOptions,\n ButtonConfig,\n ButtonGroupColors\n} from './index.type';\nimport { t, localeManager } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport type { EngineEvents } from '../../types/events';\n\nexport class BimButtonGroup implements IBimComponent {\n private container: HTMLElement;\n protected options: ButtonGroupOptions;\n private groups: ButtonGroup[] = [];\n private activeBtnIds: Set = new Set();\n private btnRefs: Map = new Map();\n private dropdownElement: HTMLElement | null = null;\n private hoverTimeout: number | null = null;\n private customColors: Set = new Set();\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n private readonly DEFAULT_ICON = '';\n\n constructor(options: ButtonGroupOptions) {\n const el = typeof options.container === 'string'\n ? document.getElementById(options.container)\n : options.container;\n\n if (!el) throw new Error('Container not found');\n\n this.container = el;\n // 合并默认配置\n this.options = {\n showLabel: true,\n visibility: {},\n direction: 'row', // 默认横向\n position: 'static', // 默认静态定位\n align: 'vertical', // 默认图标在上\n expand: 'down', // 默认向下展开\n ...options\n };\n\n // 记录初始传入的自定义颜色\n const colorKeys: (keyof ButtonGroupColors)[] = [\n 'backgroundColor', 'btnBackgroundColor', 'btnHoverColor',\n 'btnActiveColor', 'iconColor', 'iconActiveColor',\n 'textColor', 'textActiveColor'\n ];\n colorKeys.forEach(key => {\n if (options[key]) {\n this.customColors.add(key);\n }\n });\n\n this.initContainer();\n this.applyStyles();\n }\n\n protected emit(event: K, payload: EngineEvents[K]) {\n this.options.registry?.emit(event, payload);\n }\n\n private initContainer(): void {\n this.container.innerHTML = '';\n this.container.classList.add('bim-btn-group-root');\n\n if (this.options.direction === 'column') {\n this.container.classList.add('dir-column');\n } else {\n this.container.classList.add('dir-row');\n }\n\n if (this.options.className) {\n this.container.classList.add(this.options.className);\n }\n\n if (this.options.type && this.options.type !== 'default') {\n this.container.classList.add(`type-${this.options.type}`);\n }\n\n this.updatePosition();\n\n // 添加事件拦截,防止点击穿透到 3D 引擎\n this.setupEventInterception(this.container);\n }\n\n /**\n * 设置事件拦截,防止事件冒泡到下层元素(如 3D 引擎)\n */\n private setupEventInterception(el: HTMLElement): void {\n const stopPropagation = (e: Event) => {\n e.stopPropagation();\n };\n\n const events = [\n 'click', 'dblclick', 'contextmenu', 'wheel',\n 'mousedown', 'mouseup', 'mousemove',\n 'touchstart', 'touchend', 'touchmove',\n 'pointerdown', 'pointerup', 'pointermove', 'pointerenter', 'pointerleave', 'pointerover', 'pointerout'\n ];\n\n events.forEach(eventType => {\n el.addEventListener(eventType, stopPropagation, { passive: false });\n });\n }\n\n private updatePosition() {\n const pos = this.options.position;\n const style = this.container.style;\n\n style.top = ''; style.bottom = ''; style.left = ''; style.right = ''; style.transform = '';\n\n if (pos === 'static') {\n this.container.classList.add('static');\n return;\n }\n\n this.container.classList.remove('static');\n this.container.style.position = 'absolute';\n\n if (typeof pos === 'object' && 'x' in pos) {\n style.left = `${pos.x}px`;\n style.top = `${pos.y}px`;\n } else {\n const margin = '20px';\n switch (pos) {\n case 'top-left':\n style.top = margin; style.left = margin;\n break;\n case 'top-center':\n style.top = margin; style.left = '50%'; style.transform = 'translateX(-50%)';\n break;\n case 'top-right':\n style.top = margin; style.right = margin;\n break;\n case 'bottom-left':\n style.bottom = margin; style.left = margin;\n break;\n case 'bottom-center':\n style.bottom = margin; style.left = '50%'; style.transform = 'translateX(-50%)';\n break;\n case 'bottom-right':\n style.bottom = margin; style.right = margin;\n break;\n case 'left-center':\n style.left = margin; style.top = '50%'; style.transform = 'translateY(-50%)';\n break;\n case 'right-center':\n style.right = margin; style.top = '50%'; style.transform = 'translateY(-50%)';\n break;\n case 'center':\n style.top = '50%'; style.left = '50%'; style.transform = 'translate(-50%, -50%)';\n break;\n }\n }\n }\n\n /**\n * 应用样式到容器\n */\n private applyStyles(): void {\n const style = this.container.style;\n if (this.options.backgroundColor) style.setProperty('--bim-btn-group-section-bg', this.options.backgroundColor);\n if (this.options.btnBackgroundColor) style.setProperty('--bim-btn-bg', this.options.btnBackgroundColor);\n if (this.options.btnHoverColor) style.setProperty('--bim-btn-hover-bg', this.options.btnHoverColor);\n if (this.options.btnActiveColor) style.setProperty('--bim-btn-active-bg', this.options.btnActiveColor);\n if (this.options.iconColor) style.setProperty('--bim-icon-color', this.options.iconColor);\n if (this.options.iconActiveColor) style.setProperty('--bim-icon-active-color', this.options.iconActiveColor);\n if (this.options.textColor) style.setProperty('--bim-btn-text-color', this.options.textColor);\n if (this.options.textActiveColor) style.setProperty('--bim-btn-text-active-color', this.options.textActiveColor);\n\n // 同步更新所有已存在的dropdown元素的CSS变量(dropdown被添加到body,无法继承容器的CSS变量)\n const dropdowns = document.querySelectorAll('.opt-btn-dropdown');\n dropdowns.forEach(dropdown => {\n const dropdownStyle = (dropdown as HTMLElement).style;\n if (this.options.iconColor) dropdownStyle.setProperty('--bim-icon-color', this.options.iconColor);\n if (this.options.iconActiveColor) dropdownStyle.setProperty('--bim-icon-active-color', this.options.iconActiveColor);\n if (this.options.textColor) dropdownStyle.setProperty('--bim-btn-text-color', this.options.textColor);\n if (this.options.textActiveColor) dropdownStyle.setProperty('--bim-btn-text-active-color', this.options.textActiveColor);\n if (this.options.btnBackgroundColor) dropdownStyle.setProperty('--bim-btn-bg', this.options.btnBackgroundColor);\n if (this.options.btnHoverColor) dropdownStyle.setProperty('--bim-btn-hover-bg', this.options.btnHoverColor);\n if (this.options.btnActiveColor) dropdownStyle.setProperty('--bim-btn-active-bg', this.options.btnActiveColor);\n });\n }\n\n /**\n * 设置主题的primary颜色(用于边框等)\n */\n private setPrimaryColor(color: string): void {\n this.container.style.setProperty('--bim-primary-color', color);\n\n // 同步更新所有dropdown(dropdown被添加到body,无法继承容器的CSS变量)\n const dropdowns = document.querySelectorAll('.opt-btn-dropdown');\n dropdowns.forEach(dropdown => {\n (dropdown as HTMLElement).style.setProperty('--bim-primary-color', color);\n });\n }\n\n /**\n * 设置主题颜色\n * 只会应用到没有被用户自定义的颜色属性上\n */\n public setTheme(theme: ThemeConfig): void {\n const themeColors: ButtonGroupColors = {\n backgroundColor: theme.bgElevated,\n btnBackgroundColor: theme.componentBg,\n btnHoverColor: theme.componentBgHover,\n btnActiveColor: theme.componentBgActive,\n iconColor: theme.iconDefault,\n iconActiveColor: theme.iconActive,\n textColor: theme.textSecondary,\n textActiveColor: theme.textPrimary\n };\n\n Object.entries(themeColors).forEach(([key, value]) => {\n const colorKey = key as keyof ButtonGroupColors;\n if (!this.customColors.has(colorKey)) {\n this.options[colorKey] = value;\n }\n });\n\n this.container.classList.remove('theme-dark', 'theme-light');\n this.container.classList.add(`theme-${theme.name}`);\n\n this.applyStyles();\n this.setPrimaryColor(theme.primary);\n this.applyThemeCssVars(theme);\n }\n\n /**\n * 应用主题系统的 CSS 变量到容器\n * 供 glass-pill 等样式变体使用\n */\n private applyThemeCssVars(theme: ThemeConfig): void {\n const style = this.container.style;\n\n style.setProperty('--bim-primary', theme.primary);\n style.setProperty('--bim-primary-hover', theme.primaryHover);\n style.setProperty('--bim-primary-active', theme.primaryActive);\n\n style.setProperty('--bim-bg-glass', theme.bgGlass);\n style.setProperty('--bim-bg-glass-blur', theme.bgGlassBlur);\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-bg-overlay', theme.bgOverlay);\n style.setProperty('--bim-bg-inset', theme.bgInset);\n\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-secondary', theme.textSecondary);\n style.setProperty('--bim-text-tertiary', theme.textTertiary);\n style.setProperty('--bim-text-inverse', theme.textInverse);\n\n style.setProperty('--bim-icon-default', theme.iconDefault);\n style.setProperty('--bim-icon-hover', theme.iconHover);\n style.setProperty('--bim-icon-active', theme.iconActive);\n style.setProperty('--bim-icon-inverse', theme.iconInverse);\n\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-border-subtle', theme.borderSubtle);\n\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover);\n style.setProperty('--bim-component-bg-active', theme.componentBgActive);\n\n style.setProperty('--bim-shadow-sm', theme.shadowSm);\n style.setProperty('--bim-shadow-md', theme.shadowMd);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n style.setProperty('--bim-shadow-glow', theme.shadowGlow);\n\n style.setProperty('--bim-floating-bg', theme.floatingBg);\n style.setProperty('--bim-floating-border', theme.floatingBorder);\n style.setProperty('--bim-floating-shadow', theme.floatingShadow);\n style.setProperty('--bim-floating-btn-bg', theme.floatingBtnBg);\n style.setProperty('--bim-floating-btn-border', theme.floatingBtnBorder);\n style.setProperty('--bim-floating-btn-shadow', theme.floatingBtnShadow);\n style.setProperty('--bim-floating-btn-bg-hover', theme.floatingBtnBgHover);\n style.setProperty('--bim-floating-btn-shadow-hover', theme.floatingBtnShadowHover);\n style.setProperty('--bim-floating-icon-color', theme.floatingIconColor);\n style.setProperty('--bim-floating-icon-color-hover', theme.floatingIconColorHover);\n\n this.syncDropdownCssVars(theme);\n }\n\n /**\n * 同步 CSS 变量到所有 dropdown 元素\n * dropdown 被添加到 body,无法继承容器的 CSS 变量\n */\n private syncDropdownCssVars(theme: ThemeConfig): void {\n const dropdowns = document.querySelectorAll('.opt-btn-dropdown');\n dropdowns.forEach(dropdown => {\n const style = (dropdown as HTMLElement).style;\n\n style.setProperty('--bim-primary', theme.primary);\n style.setProperty('--bim-bg-overlay', theme.bgOverlay);\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-inverse', theme.textInverse);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n style.setProperty('--bim-floating-btn-bg', theme.floatingBtnBg);\n style.setProperty('--bim-floating-btn-bg-hover', theme.floatingBtnBgHover);\n style.setProperty('--bim-floating-icon-color', theme.floatingIconColor);\n });\n }\n\n /**\n * 直接设置颜色(强制覆盖)\n * 设置的颜色会被标记为自定义,后续的 setTheme 不会覆盖它们\n */\n public setColors(colors: ButtonGroupColors): void {\n // 更新 options\n this.options = { ...this.options, ...colors };\n\n // 标记这些颜色为自定义\n Object.keys(colors).forEach(key => {\n this.customColors.add(key as keyof ButtonGroupColors);\n });\n\n this.applyStyles();\n }\n\n public async init(): Promise {\n this.render();\n\n // 自动订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 自动订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n }\n\n public setLocales(): void {\n this.render();\n }\n\n public addGroup(groupId: string, beforeGroupId?: string): void {\n if (this.groups.some(g => g.id === groupId)) return;\n const newGroup: ButtonGroup = { id: groupId, buttons: [] };\n if (beforeGroupId) {\n const index = this.groups.findIndex(g => g.id === beforeGroupId);\n index !== -1 ? this.groups.splice(index, 0, newGroup) : this.groups.push(newGroup);\n } else {\n this.groups.push(newGroup);\n }\n }\n\n public addButton(config: ButtonConfig): void {\n const { groupId, parentId } = config;\n const group = this.groups.find(g => g.id === groupId);\n if (!group) return;\n\n const button: OptButton = { ...config, children: config.children || [] };\n if (parentId) {\n const parentBtn = this.findButton(group.buttons, parentId);\n if (parentBtn) {\n if (!parentBtn.children) parentBtn.children = [];\n parentBtn.children.push(button);\n }\n } else {\n group.buttons.push(button);\n }\n }\n\n private findButton(buttons: OptButton[], id: string): OptButton | undefined {\n for (const btn of buttons) {\n if (btn.id === id) return btn;\n if (btn.children) {\n const found = this.findButton(btn.children, id);\n if (found) return found;\n }\n }\n return undefined;\n }\n\n public render(): void {\n this.container.innerHTML = '';\n this.btnRefs.clear();\n\n this.groups.forEach((group, index) => {\n const groupElement = this.renderGroup(group, index, this.groups.length);\n this.container.appendChild(groupElement);\n });\n }\n\n private renderGroup(group: ButtonGroup, index: number, total: number): HTMLElement {\n const groupEl = document.createElement('div');\n groupEl.className = 'bim-btn-group-section';\n\n if (index < total - 1) {\n groupEl.classList.add('has-divider');\n }\n\n group.buttons.forEach(button => {\n if (this.isVisible(button.id)) {\n const btnWrapper = this.renderButton(button);\n groupEl.appendChild(btnWrapper);\n }\n });\n return groupEl;\n }\n\n private renderButton(button: OptButton): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'opt-btn-wrapper';\n\n const btnEl = document.createElement('div');\n btnEl.className = 'opt-btn';\n\n // 初始化时根据 button 自身的属性同步 active 状态\n if (button.isActive) {\n this.activeBtnIds.add(button.id);\n }\n\n // 按钮优先使用自己的 align,否则使用全局配置,默认为 vertical\n const align = button.align || this.options.align || 'vertical';\n if (align === 'horizontal') {\n btnEl.classList.add('align-horizontal');\n } else {\n btnEl.classList.add('align-vertical');\n }\n\n if (this.activeBtnIds.has(button.id)) btnEl.classList.add('active');\n if (button.disabled) btnEl.classList.add('disabled');\n\n // 判断是否显示 label\n const hasLabel = this.options.showLabel && button.label;\n if (!hasLabel) {\n btnEl.classList.add('no-label');\n // 当不显示 label 时,添加 title 属性作为 tooltip\n if (button.label) {\n btnEl.title = t(button.label);\n }\n }\n\n // 应用按钮的自定义样式\n const iconSize = button.iconSize || 32;\n const minWidth = button.minWidth || 50;\n btnEl.style.minWidth = `${minWidth}px`;\n\n const icon = document.createElement('div');\n icon.className = 'opt-btn-icon';\n icon.style.width = `${iconSize}px`;\n icon.style.height = `${iconSize}px`;\n icon.innerHTML = this.getIcon(button.icon);\n btnEl.appendChild(icon);\n\n // 创建文字和箭头的容器,确保它们始终在一起(无论主轴是横是竖)\n const textWrapper = document.createElement('div');\n textWrapper.className = 'opt-btn-text-wrapper';\n\n if (this.options.showLabel && button.label) {\n const label = document.createElement('span');\n label.className = 'opt-btn-label';\n label.textContent = t(button.label);\n textWrapper.appendChild(label);\n }\n\n // TODO: 暂时隐藏下拉箭头\n // if (button.children && button.children.length > 0) {\n // const arrow = document.createElement('span');\n // arrow.className = 'opt-btn-arrow';\n // arrow.textContent = '▼';\n // textWrapper.appendChild(arrow);\n // }\n\n // 只有当有内容时才添加 wrapper\n if (textWrapper.hasChildNodes()) {\n btnEl.appendChild(textWrapper);\n }\n\n btnEl.addEventListener('click', () => this.handleClick(button));\n btnEl.addEventListener('mouseenter', () => this.handleMouseEnter(button, btnEl));\n btnEl.addEventListener('mouseleave', () => this.handleMouseLeave());\n\n this.btnRefs.set(button.id, btnEl);\n wrapper.appendChild(btnEl);\n return wrapper;\n }\n\n /**\n * 设置按钮的激活状态\n * @param id 按钮 ID\n * @param active 可选,如果不传则切换(toggle)当前状态\n */\n public setBtnActive(id: string, active?: boolean): void {\n const button = this.findButtonById(id);\n if (!button) return;\n\n // 确定最终状态\n const newState = active !== undefined ? active : !this.activeBtnIds.has(id);\n\n if (newState) {\n this.activeBtnIds.add(id);\n } else {\n this.activeBtnIds.delete(id);\n }\n\n // 同步对象状态并更新 DOM\n button.isActive = newState;\n this.updateButtonState(id);\n }\n\n private handleClick(button: OptButton): void {\n if (button.disabled) return;\n if (!button.children || button.children.length === 0) {\n if (button.keepActive) {\n // 1) 先切换自身激活状态(onClick 里通常会根据 isActive 决定“打开/关闭”逻辑)\n const wasActive = this.activeBtnIds.has(button.id);\n const newState = !wasActive;\n this.setBtnActive(button.id, newState);\n\n // 2) 互斥逻辑:仅在“本次切换为激活”时触发\n // - 一级按钮:同 groupId 下其它一级按钮互斥\n // - 二级按钮:同 groupId + 同 parentId 下其它二级按钮互斥\n // - 被关闭的按钮需要触发 onClick(用于执行关闭逻辑)\n if (newState && button.exclusive && button.groupId) {\n this.deactivateExclusiveSiblings(button);\n }\n }\n this.closeDropdown();\n if (button.onClick) button.onClick(button);\n }\n }\n\n /**\n * 互斥关闭同范围内的其它已激活按钮,并触发它们的 onClick\n * @param button 当前被激活的按钮\n */\n private deactivateExclusiveSiblings(button: OptButton): void {\n const group = this.groups.find(g => g.id === button.groupId);\n if (!group) return;\n\n // 二级按钮:同 groupId + 同 parentId\n if (button.parentId) {\n const parent = this.findButton(group.buttons, button.parentId);\n const siblings = parent?.children || [];\n for (const sib of siblings) {\n if (!sib) continue;\n if (sib.id === button.id) continue;\n if (sib.parentId !== button.parentId) continue;\n if (sib.groupId !== button.groupId) continue;\n\n if (this.activeBtnIds.has(sib.id)) {\n this.setBtnActive(sib.id, false);\n // 触发被关闭按钮的 onClick(此时 sib.isActive 已经同步为 false)\n if (sib.onClick) sib.onClick(sib);\n }\n }\n return;\n }\n\n // 一级按钮:同 groupId 下其它一级按钮(不包含二级)\n for (const sib of group.buttons) {\n if (sib.id === button.id) continue;\n if (sib.groupId !== button.groupId) continue;\n if (sib.parentId) continue; // 只处理一级按钮\n\n if (this.activeBtnIds.has(sib.id)) {\n this.setBtnActive(sib.id, false);\n if (sib.onClick) sib.onClick(sib);\n }\n }\n }\n\n private handleMouseEnter(button: OptButton, btnEl: HTMLElement): void {\n if (this.hoverTimeout) clearTimeout(this.hoverTimeout);\n if (button.children && button.children.length > 0) {\n this.showDropdown(button, btnEl);\n } else {\n this.closeDropdown();\n }\n }\n\n private handleMouseLeave(): void {\n this.hoverTimeout = window.setTimeout(() => this.closeDropdown(), 200);\n }\n\n private showDropdown(button: OptButton, btnEl: HTMLElement): void {\n this.closeDropdown();\n if (!button.children) return;\n\n const dropdown = document.createElement('div');\n dropdown.className = 'opt-btn-dropdown';\n if (this.options.backgroundColor) dropdown.style.setProperty('--bim-toolbar-bg', this.options.backgroundColor);\n\n // 将主题CSS变量复制到dropdown元素上(因为dropdown被添加到body,无法继承容器的CSS变量)\n const dropdownStyle = dropdown.style;\n if (this.options.iconColor) dropdownStyle.setProperty('--bim-icon-color', this.options.iconColor);\n if (this.options.iconActiveColor) dropdownStyle.setProperty('--bim-icon-active-color', this.options.iconActiveColor);\n if (this.options.textColor) dropdownStyle.setProperty('--bim-btn-text-color', this.options.textColor);\n if (this.options.textActiveColor) dropdownStyle.setProperty('--bim-btn-text-active-color', this.options.textActiveColor);\n if (this.options.btnBackgroundColor) dropdownStyle.setProperty('--bim-btn-bg', this.options.btnBackgroundColor);\n if (this.options.btnHoverColor) dropdownStyle.setProperty('--bim-btn-hover-bg', this.options.btnHoverColor);\n if (this.options.btnActiveColor) dropdownStyle.setProperty('--bim-btn-active-bg', this.options.btnActiveColor);\n\n // 获取按钮的位置信息\n const btnRect = btnEl.getBoundingClientRect();\n const expand = this.options.expand || 'down';\n\n // 根据主按钮组的方向设置下拉菜单的布局方向\n if (this.options.direction === 'row') {\n dropdown.style.flexDirection = 'column'; // 横向按钮组,菜单纵向排列\n } else {\n dropdown.style.flexDirection = 'row'; // 纵向按钮组,菜单横向排列\n }\n\n if (this.options.type && this.options.type !== 'default') {\n dropdown.classList.add(`type-${this.options.type}`);\n }\n\n const currentTheme = themeManager.getTheme();\n dropdown.classList.add(`theme-${currentTheme.name}`);\n\n dropdownStyle.setProperty('--bim-primary', currentTheme.primary);\n dropdownStyle.setProperty('--bim-bg-overlay', currentTheme.bgOverlay);\n dropdownStyle.setProperty('--bim-border-default', currentTheme.borderDefault);\n dropdownStyle.setProperty('--bim-text-primary', currentTheme.textPrimary);\n dropdownStyle.setProperty('--bim-text-inverse', currentTheme.textInverse);\n dropdownStyle.setProperty('--bim-shadow-lg', currentTheme.shadowLg);\n dropdownStyle.setProperty('--bim-floating-btn-bg', currentTheme.floatingBtnBg);\n dropdownStyle.setProperty('--bim-floating-btn-bg-hover', currentTheme.floatingBtnBgHover);\n dropdownStyle.setProperty('--bim-floating-icon-color', currentTheme.floatingIconColor);\n\n document.body.appendChild(dropdown);\n\n // 添加事件拦截\n this.setupEventInterception(dropdown);\n\n // 添加菜单项\n button.children.forEach(subBtn => {\n if (this.isVisible(subBtn.id)) {\n const item = this.renderDropdownItem(subBtn);\n dropdown.appendChild(item);\n }\n });\n\n // 获取下拉菜单的实际尺寸\n const dropdownRect = dropdown.getBoundingClientRect();\n\n if (expand === 'up') {\n // 向上展开,与按钮水平居中对齐\n dropdown.style.bottom = (window.innerHeight - btnRect.top + 8) + 'px';\n dropdown.style.left = (btnRect.left + (btnRect.width - dropdownRect.width) / 2) + 'px';\n } else if (expand === 'down') {\n // 向下展开,与按钮水平居中对齐\n dropdown.style.top = (btnRect.bottom + 8) + 'px';\n dropdown.style.left = (btnRect.left + (btnRect.width - dropdownRect.width) / 2) + 'px';\n } else if (expand === 'right') {\n // 向右展开,与按钮垂直居中对齐\n dropdown.style.top = (btnRect.top + (btnRect.height - dropdownRect.height) / 2) + 'px';\n dropdown.style.left = (btnRect.right + 8) + 'px';\n } else if (expand === 'left') {\n // 向左展开,与按钮垂直居中对齐\n dropdown.style.top = (btnRect.top + (btnRect.height - dropdownRect.height) / 2) + 'px';\n dropdown.style.right = (window.innerWidth - btnRect.left + 8) + 'px';\n }\n\n dropdown.addEventListener('mouseenter', () => { if (this.hoverTimeout) clearTimeout(this.hoverTimeout); });\n dropdown.addEventListener('mouseleave', () => this.handleMouseLeave());\n this.dropdownElement = dropdown;\n }\n\n private renderDropdownItem(button: OptButton): HTMLElement {\n const item = document.createElement('div');\n item.className = 'opt-btn-dropdown-item';\n\n // 应用按钮的 align 设置,默认为 horizontal(图标在左)\n const align = button.align || 'horizontal';\n if (align === 'horizontal') {\n item.classList.add('align-horizontal');\n } else {\n item.classList.add('align-vertical');\n }\n\n // 二级菜单项的 active 状态渲染(修复 keepActive 在二级按钮“看起来不生效”的问题)\n // 说明:\n // - keepActive 的状态会记录在 activeBtnIds / button.isActive 上\n // - 下拉菜单每次打开都会重新渲染,因此必须在这里同步一次 active 样式\n if (this.activeBtnIds.has(button.id) || button.isActive) {\n item.classList.add('active');\n }\n\n // 应用按钮的自定义样式\n const iconSize = button.iconSize || 32; // 二级菜单默认图标更小\n const minWidth = button.minWidth; // 不设置默认值,让下拉菜单项保持紧凑\n if (minWidth) {\n item.style.minWidth = `${minWidth}px`;\n }\n\n const icon = document.createElement('div');\n icon.className = 'opt-btn-icon';\n icon.style.width = `${iconSize}px`;\n icon.style.height = `${iconSize}px`;\n icon.innerHTML = this.getIcon(button.icon);\n item.appendChild(icon);\n\n // 只有在 showLabel 为 true 时才显示 label\n if (this.options.showLabel && button.label) {\n const label = document.createElement('span');\n label.className = 'opt-btn-dropdown-label';\n label.textContent = t(button.label);\n item.appendChild(label);\n } else if (button.label) {\n // 当不显示 label 时,添加 title 属性作为 tooltip\n item.title = t(button.label);\n }\n\n item.addEventListener('click', (e) => { e.stopPropagation(); this.handleClick(button); });\n return item;\n }\n\n private closeDropdown(): void {\n if (this.dropdownElement) {\n this.dropdownElement.remove();\n this.dropdownElement = null;\n }\n this.btnRefs.forEach(btnEl => {\n const arrow = btnEl.querySelector('.opt-btn-arrow');\n if (arrow) arrow.classList.remove('rotated');\n });\n }\n\n private updateButtonState(buttonId: string): void {\n const btnEl = this.btnRefs.get(buttonId);\n if (btnEl) {\n if (this.activeBtnIds.has(buttonId)) {\n btnEl.classList.add('active');\n } else {\n btnEl.classList.remove('active');\n }\n }\n }\n\n private getIcon(icon?: string): string { return icon || this.DEFAULT_ICON; }\n\n public updateButtonVisibility(id: string, visible: boolean): void {\n if (!this.options.visibility) this.options.visibility = {};\n this.options.visibility[id] = visible;\n this.render();\n }\n\n public setShowLabel(show: boolean): void {\n this.options.showLabel = show;\n this.updateLabelsVisibility();\n }\n\n private updateLabelsVisibility(): void {\n this.btnRefs.forEach((btnEl, buttonId) => {\n // 查找按钮配置\n const button = this.findButtonById(buttonId);\n if (!button) return;\n\n const hasLabel = this.options.showLabel && button.label;\n\n // 更新 no-label 类和 title 属性\n if (hasLabel) {\n btnEl.classList.remove('no-label');\n // 显示标签时,移除 title(避免重复显示)\n btnEl.removeAttribute('title');\n } else {\n btnEl.classList.add('no-label');\n // 隐藏标签时,添加 title 作为 tooltip\n if (button.label) {\n btnEl.title = t(button.label);\n }\n }\n });\n }\n\n private findButtonById(id: string): OptButton | undefined {\n for (const group of this.groups) {\n const found = this.findButton(group.buttons, id);\n if (found) return found;\n }\n return undefined;\n }\n\n public setBackgroundColor(color: string): void { this.setColors({ backgroundColor: color }); }\n private isVisible(id: string): boolean { return this.options.visibility?.[id] !== false; }\n\n public setType(type: 'default' | 'glass-pill'): void {\n this.container.classList.remove('type-default', 'type-glass-pill');\n this.options.type = type;\n\n if (type && type !== 'default') {\n this.container.classList.add(`type-${type}`);\n }\n\n this.render();\n }\n\n public getType(): 'default' | 'glass-pill' {\n return this.options.type || 'default';\n }\n\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.closeDropdown();\n this.container.innerHTML = '';\n this.btnRefs.clear();\n }\n}\n","import { BimButtonGroup } from '../index';\nimport type { ManagerRegistry } from '../../../core/manager-registry';\n\nexport class Toolbar extends BimButtonGroup {\n public async init(): Promise {\n await super.init();\n\n const registry = this.options.registry as ManagerRegistry;\n\n const { createHomeButton } = await import('./buttons/home');\n const { createZoomBoxButton } = await import('./buttons/zoom-box');\n const { createWalkMenuButton } = await import('./buttons/walk/walk-menu');\n const { createMapButton } = await import('./buttons/map');\n const { createPropertyButton } = await import('./buttons/property');\n const { createSettingButton } = await import('./buttons/setting');\n const { createInfoButton } = await import('./buttons/info');\n const { createFullscreenButton } = await import('./buttons/fullscreen');\n const { createMeasureButton } = await import('./buttons/measure');\n const { createSectionMenuButton } = await import('./buttons/section/section-menu');\n const { createSectionPlaneButton } = await import('./buttons/section/section-plane');\n const { createSectionAxisButton } = await import('./buttons/section/section-axis');\n const { createSectionBoxButton } = await import('./buttons/section/section-box');\n const { createAiChatButton } = await import('./buttons/ai-chat');\n\n this.addGroup('group-1');\n\n this.addButton(createHomeButton(registry));\n this.addButton(createZoomBoxButton(registry));\n this.addButton(createMeasureButton(registry));\n this.addButton(createSectionMenuButton(registry));\n this.addButton(createSectionPlaneButton(registry));\n this.addButton(createSectionAxisButton(registry));\n this.addButton(createSectionBoxButton(registry));\n this.addButton(createWalkMenuButton(registry));\n this.addButton(createMapButton(registry));\n this.addButton(createPropertyButton(registry));\n this.addGroup('group-2');\n this.addButton(createAiChatButton(registry));\n this.addButton(createSettingButton(registry));\n this.addButton(createInfoButton(registry));\n this.addButton(createFullscreenButton(registry));\n\n this.render();\n }\n}\n","/**\n * Manager 基类\n * 提供所有 Manager 的通用功能\n */\nimport { ManagerRegistry } from './manager-registry';\nimport type { EngineEvents } from '../types/events';\n\n/**\n * Manager 抽象基类\n * - 通过构造函数接收 Registry 实例\n * - 自动管理事件订阅的清理\n */\nexport abstract class BaseManager {\n /** 注册表实例 */\n protected registry: ManagerRegistry;\n /** 事件订阅列表,用于自动清理 */\n private subscriptions: Array<() => void> = [];\n\n constructor(registry: ManagerRegistry) {\n this.registry = registry;\n }\n\n /**\n * 订阅事件(自动追踪,destroy 时自动取消)\n * @param event 事件名称\n * @param handler 事件处理函数\n */\n protected subscribe(\n event: K,\n handler: (payload: EngineEvents[K]) => void\n ): void {\n const unsubscribe = this.registry.on(event, handler);\n this.subscriptions.push(unsubscribe);\n }\n\n /**\n * 发送事件\n * @param event 事件名称\n * @param payload 事件数据\n */\n protected emit(\n event: K,\n payload: EngineEvents[K]\n ): void {\n this.registry.emit(event, payload);\n }\n\n /**\n * 销毁 Manager,清理所有订阅\n * 子类应该调用 super.destroy()\n */\n public destroy(): void {\n this.subscriptions.forEach(unsub => unsub());\n this.subscriptions = [];\n }\n}\n","/**\n * 工具栏管理器\n * 负责管理底部工具栏的创建、按钮配置和显示控制\n */\nimport type { ButtonGroupColors, ButtonConfig } from '../components/button-group/index.type';\nimport { Toolbar } from '../components/button-group/toolbar';\nimport type { ThemeConfig } from '../themes/types';\nimport { BaseManager } from '../core/base-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\n\n/**\n * 工具栏管理器\n * 提供工具栏按钮的添加、显示/隐藏、主题更新等功能\n */\nexport class ToolbarManager extends BaseManager {\n /** 工具栏实例 */\n private toolbar: Toolbar | null = null;\n /** 工具栏容器元素 */\n private toolbarContainer: HTMLElement | null = null;\n /** 主容器元素 */\n private container: HTMLElement;\n\n constructor(container: HTMLElement, registry: ManagerRegistry) {\n super(registry);\n this.container = container;\n this.init();\n }\n\n /** 初始化工具栏 */\n private init() {\n this.toolbarContainer = document.createElement('div');\n this.toolbarContainer.id = 'opt-btn-groups';\n this.toolbarContainer.className = 'bim-engine-opt-btn-container is-bottom-toolbar';\n this.container.appendChild(this.toolbarContainer);\n\n this.toolbar = new Toolbar({\n container: this.toolbarContainer,\n type: 'glass-pill',\n showLabel: true,\n direction: 'row',\n position: 'bottom-right',\n align: 'vertical',\n expand: 'up',\n registry: this.registry\n });\n\n this.toolbar.init();\n }\n\n /**\n * 更新工具栏主题\n * @param theme 主题配置\n */\n public updateTheme(theme: ThemeConfig) {\n this.toolbar?.setTheme(theme);\n }\n\n /** 刷新工具栏渲染 */\n public refresh() {\n this.toolbar?.render();\n }\n\n /** 销毁工具栏 */\n public destroy() {\n this.toolbar?.destroy();\n this.toolbar = null;\n super.destroy();\n }\n\n /**\n * 添加按钮组\n * @param groupId 组 ID\n * @param beforeGroupId 插入到指定组之前\n */\n public addGroup(groupId: string, beforeGroupId?: string) {\n this.toolbar?.addGroup(groupId, beforeGroupId);\n this.toolbar?.render();\n }\n\n /**\n * 添加按钮\n * @param config 按钮配置\n */\n public addButton(config: ButtonConfig) {\n this.toolbar?.addButton(config);\n this.toolbar?.render();\n }\n\n /**\n * 设置按钮可见性\n * @param id 按钮 ID\n * @param v 是否可见\n */\n public setButtonVisibility(id: string, v: boolean) {\n this.toolbar?.updateButtonVisibility(id, v);\n }\n\n /**\n * 设置是否显示标签\n * @param show 是否显示\n */\n public setShowLabel(show: boolean) {\n this.toolbar?.setShowLabel(show);\n }\n\n /**\n * 设置按钮激活状态\n * @param id 按钮 ID\n * @param active 是否激活\n */\n public setBtnActive(id: string, active?: boolean) {\n this.toolbar?.setBtnActive(id, active);\n }\n\n /**\n * 设置工具栏可见性\n * @param visible 是否可见\n */\n public setVisible(visible: boolean) {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.visibility = visible ? 'visible' : 'hidden';\n }\n }\n\n /**\n * 设置背景颜色\n * @param color 颜色值\n */\n public setBackgroundColor(color: string) {\n this.toolbar?.setBackgroundColor(color);\n }\n\n /**\n * 设置按钮组颜色\n * @param colors 颜色配置\n */\n public setColors(colors: ButtonGroupColors) {\n this.toolbar?.setColors(colors);\n }\n\n /** 隐藏工具栏 */\n public hide(): void {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.display = 'none';\n }\n }\n\n /** 显示工具栏 */\n public show(): void {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.display = '';\n }\n }\n\n /**\n * 获取工具栏容器\n * @returns 容器元素\n */\n public getContainer(): HTMLElement | null {\n return this.toolbarContainer;\n }\n\n public setType(type: 'default' | 'glass-pill'): void {\n this.toolbar?.setType(type);\n }\n\n public getType(): 'default' | 'glass-pill' {\n return this.toolbar?.getType() || 'default';\n }\n}\n","/**\n * 按钮组管理器\n * 负责创建和管理按钮组实例\n */\nimport { BimButtonGroup } from '../components/button-group';\nimport type { ButtonGroupOptions } from '../components/button-group/index.type';\nimport type { ThemeConfig } from '../themes/types';\nimport { BaseManager } from '../core/base-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\n\n/**\n * 按钮组管理器\n * 统一管理多个按钮组的创建、主题更新和销毁\n */\nexport class ButtonGroupManager extends BaseManager {\n /** 按钮组映射表 */\n private groups: Map = new Map();\n /** 容器元素 */\n private container: HTMLElement;\n\n constructor(container: HTMLElement, registry: ManagerRegistry) {\n super(registry);\n this.container = container;\n }\n\n /**\n * 创建按钮组\n * @param id 按钮组 ID\n * @param options 按钮组配置\n * @returns 按钮组实例\n */\n public create(id: string, options: Omit): BimButtonGroup {\n const group = new BimButtonGroup({\n container: this.container,\n registry: this.registry,\n ...options\n });\n\n group.init();\n this.groups.set(id, group);\n return group;\n }\n\n /**\n * 获取按钮组\n * @param id 按钮组 ID\n * @returns 按钮组实例\n */\n public get(id: string): BimButtonGroup | undefined {\n return this.groups.get(id);\n }\n\n /**\n * 更新所有按钮组的主题\n * @param theme 主题配置\n */\n public updateTheme(theme: ThemeConfig) {\n this.groups.forEach(group => group.setTheme(theme));\n }\n\n /** 销毁管理器和所有按钮组 */\n public destroy() {\n this.groups.forEach(group => group.destroy());\n this.groups.clear();\n super.destroy();\n }\n}\n","import './index.css';\nimport type { DialogOptions } from './index.type';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { themeManager } from '../../services/theme';\nimport { t, localeManager } from '../../services/locale';\n\n/**\n * 通用弹窗组件类\n * 支持拖拽、缩放、自定义内容和位置。\n */\nexport class BimDialog implements IBimComponent {\n private element: HTMLElement;\n private options: DialogOptions;\n private container: HTMLElement;\n private header: HTMLElement;\n private contentArea: HTMLElement;\n private _isDestroyed = false;\n private _isInitialized = false;\n private unsubscribeTheme: (() => void) | null = null;\n private unsubscribeLocale: (() => void) | null = null;\n\n // 性能优化:用于存储 requestAnimationFrame 的 ID\n private rafId: number | null = null;\n\n /**\n * 构造函数\n * @param options 弹窗配置选项\n */\n constructor(options: DialogOptions) {\n // 合并默认配置\n this.options = {\n title: 'Dialog',\n width: 300,\n height: 'auto',\n position: 'center',\n draggable: true,\n resizable: false,\n minWidth: 200,\n minHeight: 100,\n ...options\n };\n this.container = options.container;\n\n // 创建 DOM 结构\n this.element = this.createDom();\n this.header = this.element.querySelector('.bim-dialog-header') as HTMLElement;\n this.contentArea = this.element.querySelector('.bim-dialog-content') as HTMLElement;\n\n // 自动初始化 (为了兼容现有逻辑)\n this.init();\n }\n\n /**\n * 设置主题\n * @param theme 全局主题配置\n */\n public setTheme(theme: ThemeConfig) {\n const style = this.element.style;\n if (!this.options.backgroundColor) style.setProperty('--bim-dialog-bg', theme.bgElevated);\n if (!this.options.headerBackgroundColor) style.setProperty('--bim-dialog-header-bg', theme.bgInset);\n if (!this.options.titleColor) style.setProperty('--bim-dialog-title-color', theme.textPrimary);\n if (!this.options.textColor) style.setProperty('--bim-dialog-text-color', theme.textSecondary);\n if (!this.options.borderColor) style.setProperty('--bim-dialog-border-color', theme.borderDefault);\n\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-bg-inset', theme.bgInset);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-secondary', theme.textSecondary);\n style.setProperty('--bim-text-tertiary', theme.textTertiary);\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n }\n\n /**\n * 初始化组件功能 (接口实现)\n */\n public init() {\n if (this._isInitialized) return;\n\n this.container.appendChild(this.element);\n\n // 必须先挂载才能计算尺寸进行定位\n this.initPosition();\n\n if (this.options.draggable) {\n this.initDrag();\n }\n\n if (this.options.resizable) {\n this.initResize();\n }\n\n this._isInitialized = true;\n\n // 调用弹窗开启后回调\n if (this.options.onOpen) {\n this.options.onOpen();\n }\n\n // 自动订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 自动订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n }\n\n public setLocales(): void {\n if (this.options.title) {\n const titleEl = this.header.querySelector('.bim-dialog-title');\n if (titleEl) {\n titleEl.textContent = t(this.options.title);\n }\n }\n }\n\n /**\n * 创建弹窗的 DOM 结构\n */\n private createDom(): HTMLElement {\n const el = document.createElement('div');\n el.className = 'bim-dialog';\n\n if (this.options.id) el.id = this.options.id;\n\n // 应用颜色配置到 CSS 变量\n const style = el.style;\n if (this.options.backgroundColor) style.setProperty('--bim-dialog-bg', this.options.backgroundColor);\n if (this.options.headerBackgroundColor) style.setProperty('--bim-dialog-header-bg', this.options.headerBackgroundColor);\n if (this.options.titleColor) style.setProperty('--bim-dialog-title-color', this.options.titleColor);\n if (this.options.textColor) style.setProperty('--bim-dialog-text-color', this.options.textColor);\n if (this.options.borderColor) style.setProperty('--bim-dialog-border-color', this.options.borderColor);\n\n // 设置初始尺寸\n this.setSize(el, this.options.width, this.options.height);\n // 确保最小尺寸生效\n if (this.options.minWidth) el.style.minWidth = `${this.options.minWidth}px`;\n\n // 创建标题栏 (Header)\n const header = document.createElement('div');\n header.className = 'bim-dialog-header';\n if (this.options.draggable) header.classList.add('draggable');\n\n const title = document.createElement('span');\n title.className = 'bim-dialog-title';\n title.textContent = this.options.title ? t(this.options.title) : '';\n\n const closeBtn = document.createElement('span');\n closeBtn.className = 'bim-dialog-close';\n closeBtn.innerHTML = '×';\n // 修复 TS 报错:去掉未使用的参数 e\n closeBtn.onclick = () => {\n this.close();\n };\n\n header.appendChild(title);\n header.appendChild(closeBtn);\n\n // 创建内容区域 (Content)\n const content = document.createElement('div');\n content.className = 'bim-dialog-content';\n if (typeof this.options.content === 'string') {\n content.innerHTML = this.options.content;\n } else if (this.options.content instanceof HTMLElement) {\n content.appendChild(this.options.content);\n }\n\n el.appendChild(header);\n el.appendChild(content);\n\n // 如果允许缩放,创建缩放手柄\n if (this.options.resizable) {\n const resizeHandle = document.createElement('div');\n resizeHandle.className = 'bim-dialog-resize-handle';\n el.appendChild(resizeHandle);\n }\n\n // ==================== 事件拦截核心逻辑 ====================\n // 定义阻断逻辑:只阻止冒泡,不阻止捕获,也不阻止默认行为(除非显式阻止)\n const stopPropagation = (e: Event) => {\n e.stopPropagation();\n };\n\n // 现代浏览器和 3D 引擎 (Three.js/Cesium) 交互事件\n const events = [\n 'click', 'dblclick', 'contextmenu', 'wheel',\n 'mousedown', 'mouseup', 'mousemove',\n 'touchstart', 'touchend', 'touchmove',\n 'pointerdown', 'pointerup', 'pointermove', 'pointerenter', 'pointerleave', 'pointerover', 'pointerout'\n ];\n\n // 绑定监听器 (默认冒泡阶段)\n // 这样内部元素(如关闭按钮)先触发,然后冒泡到这里被拦截,不再传给地图\n events.forEach(eventType => {\n el.addEventListener(eventType, stopPropagation, { passive: false });\n });\n\n return el;\n }\n\n /**\n * 设置元素尺寸\n */\n private setSize(el: HTMLElement, width?: number | string, height?: number | string) {\n if (width !== undefined) {\n if (width === 'auto' || width === 'fit-content') {\n el.style.width = width;\n } else {\n el.style.width = typeof width === 'number' ? `${width}px` : width;\n }\n }\n if (height !== undefined) {\n if (height === 'auto' || height === 'fit-content') {\n el.style.height = height;\n } else {\n el.style.height = typeof height === 'number' ? `${height}px` : height;\n }\n }\n }\n\n /**\n * 根据内容自动调整弹窗宽度\n * @param recenter 是否重新计算定位(例如保持居中),默认 true\n */\n public fitWidth(recenter: boolean = false) {\n // 1. 设置为 fit-content 以获取自然宽度,高度保持不变\n this.element.style.width = 'fit-content';\n\n // 2. 如果需要重新定位\n if (recenter) {\n this.initPosition();\n }\n }\n\n /**\n * 根据内容自动调整弹窗高度\n *\n * 设计说明:\n * - 主要用于“内容展开/收起”场景(比如测量面板展开后,Dialog 高度跟随变化)\n * - 默认不改变用户拖拽后的当前位置,只做边界夹紧,避免弹窗超出容器\n *\n * @param recenter 是否根据 options.position 重新定位(默认 false)\n */\n public fitHeight(recenter: boolean = false) {\n // 1) 先让高度由内容自然撑开,便于测量真实高度\n this.element.style.height = 'auto';\n\n // 2) 获取自然高度并做约束(最小高度 + 不超过容器)\n const naturalHeight = this.element.getBoundingClientRect().height;\n const minHeight = this.options.minHeight ?? 100;\n const containerHeight = this.container.clientHeight || 0;\n\n // 如果容器高度不可用,至少保证最小高度\n let targetHeight = Math.max(minHeight, naturalHeight);\n\n // 约束最大高度:不超过容器高度(避免完全溢出)\n if (containerHeight > 0) {\n targetHeight = Math.min(targetHeight, containerHeight);\n }\n\n this.element.style.height = `${targetHeight}px`;\n\n // 3) 定位修正:recenter 则重新按 position 计算,否则只做边界夹紧\n if (recenter) {\n this.initPosition();\n } else {\n this.clampToContainer();\n }\n }\n\n /**\n * 边界夹紧:保持当前 left/top 不变的前提下,确保弹窗不超出容器\n * 说明:用于 fitHeight / fitWidth 后的\"尺寸变化\"场景,避免弹窗被裁切。\n */\n private clampToContainer(): void {\n const containerW = this.container.clientWidth;\n const containerH = this.container.clientHeight;\n const elW = this.element.offsetWidth;\n const elH = this.element.offsetHeight;\n const bottomOffset = this.options.bottomOffset ?? 70;\n\n const currentLeft = this.element.offsetLeft;\n const currentTop = this.element.offsetTop;\n\n const maxLeft = Math.max(0, containerW - elW);\n const maxTop = Math.max(0, containerH - elH - bottomOffset);\n\n const nextLeft = Math.max(0, Math.min(currentLeft, maxLeft));\n const nextTop = Math.max(0, Math.min(currentTop, maxTop));\n\n this.element.style.left = `${nextLeft}px`;\n this.element.style.top = `${nextTop}px`;\n }\n\n /**\n * 初始化弹窗位置\n */\n private initPosition() {\n const pos = this.options.position;\n const elRect = this.element.getBoundingClientRect();\n const bottomOffset = this.options.bottomOffset ?? 70;\n\n let left = 0;\n let top = 0;\n\n const pW = this.container.clientWidth;\n const pH = this.container.clientHeight;\n const elW = elRect.width;\n const elH = elRect.height;\n\n if (typeof pos === 'object' && 'x' in pos) {\n left = pos.x;\n top = pos.y;\n } else {\n switch (pos) {\n case 'center':\n left = (pW - elW) / 2;\n top = (pH - elH) / 2;\n break;\n case 'top-left': left = 0; top = 0; break;\n case 'top-center': left = (pW - elW) / 2; top = 0; break;\n case 'top-right': left = pW - elW; top = 0; break;\n case 'left-center': left = 0; top = (pH - elH) / 2; break;\n case 'right-center': left = pW - elW; top = (pH - elH) / 2; break;\n case 'bottom-left': left = 0; top = pH - elH - bottomOffset; break;\n case 'bottom-center': left = (pW - elW) / 2; top = pH - elH - bottomOffset; break;\n case 'bottom-right': left = pW - elW; top = pH - elH - bottomOffset; break;\n default:\n left = (pW - elW) / 2;\n top = (pH - elH) / 2;\n }\n }\n\n left = Math.max(0, Math.min(left, pW - elW));\n top = Math.max(0, Math.min(top, pH - elH - bottomOffset));\n\n this.element.style.left = `${left}px`;\n this.element.style.top = `${top}px`;\n }\n\n /**\n * 初始化拖拽功能 (性能优化 + 解决粘手)\n */\n private initDrag() {\n let startX = 0;\n let startY = 0;\n let startLeft = 0;\n let startTop = 0;\n let containerW = 0;\n let containerH = 0;\n let elW = 0;\n let elH = 0;\n let bottomOffset = 0;\n\n const onMouseDown = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n startX = e.clientX;\n startY = e.clientY;\n startLeft = this.element.offsetLeft;\n startTop = this.element.offsetTop;\n\n containerW = this.container.clientWidth;\n containerH = this.container.clientHeight;\n elW = this.element.offsetWidth;\n elH = this.element.offsetHeight;\n bottomOffset = this.options.bottomOffset ?? 70;\n\n document.addEventListener('mousemove', onMouseMove, { capture: true });\n document.addEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n const onMouseMove = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.rafId) return;\n\n this.rafId = requestAnimationFrame(() => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n\n let newLeft = startLeft + dx;\n let newTop = startTop + dy;\n\n const maxLeft = containerW - elW;\n const maxTop = containerH - elH - bottomOffset;\n\n newLeft = Math.max(0, Math.min(newLeft, maxLeft));\n newTop = Math.max(0, Math.min(newTop, maxTop));\n\n this.element.style.left = `${newLeft}px`;\n this.element.style.top = `${newTop}px`;\n\n this.rafId = null;\n });\n };\n\n const onMouseUp = () => {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n // 移除监听\n document.removeEventListener('mousemove', onMouseMove, { capture: true });\n document.removeEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n this.header.addEventListener('mousedown', onMouseDown);\n }\n\n /**\n * 初始化缩放功能 (性能优化 + 解决粘手)\n */\n private initResize() {\n const handle = this.element.querySelector('.bim-dialog-resize-handle') as HTMLElement;\n if (!handle) return;\n\n let startX = 0;\n let startY = 0;\n let startW = 0;\n let startH = 0;\n\n const onMouseDown = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n startX = e.clientX;\n startY = e.clientY;\n startW = this.element.offsetWidth;\n startH = this.element.offsetHeight;\n\n // 关键:使用 capture: true\n document.addEventListener('mousemove', onMouseMove, { capture: true });\n document.addEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n const onMouseMove = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.rafId) return;\n\n this.rafId = requestAnimationFrame(() => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n\n const newW = Math.max(this.options.minWidth || 100, startW + dx);\n const newH = Math.max(this.options.minHeight || 50, startH + dy);\n\n this.element.style.width = `${newW}px`;\n this.element.style.height = `${newH}px`;\n\n this.rafId = null;\n });\n };\n\n const onMouseUp = () => {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n document.removeEventListener('mousemove', onMouseMove, { capture: true });\n document.removeEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n handle.addEventListener('mousedown', onMouseDown);\n }\n\n /**\n * 动态设置内容\n * @param content 内容元素或 HTML 字符串\n */\n public setContent(content: HTMLElement | string) {\n this.contentArea.innerHTML = '';\n if (typeof content === 'string') {\n this.contentArea.innerHTML = content;\n } else {\n this.contentArea.appendChild(content);\n }\n }\n\n /**\n * 关闭弹窗并销毁\n */\n public close() {\n if (this._isDestroyed) return;\n\n // 清理可能存在的动画帧,防止报错\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n this.element.remove();\n this._isDestroyed = true;\n if (this.options.onClose) {\n this.options.onClose();\n }\n }\n\n /**\n * 销毁组件 (接口实现)\n */\n public destroy() {\n this.close();\n }\n}\n","import { BimDialog } from '../components/dialog';\nimport type { DialogOptions } from '../components/dialog/index.type';\nimport type { ThemeConfig } from '../themes/types';\nimport { themeManager } from '../services/theme';\nimport { BaseManager } from '../core/base-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\n\nexport class DialogManager extends BaseManager {\n private container: HTMLElement;\n private activeDialogs: BimDialog[] = [];\n\n constructor(container: HTMLElement, registry: ManagerRegistry) {\n super(registry);\n this.container = container;\n }\n\n public create(options: Omit): BimDialog {\n const dialog = new BimDialog({\n container: this.container,\n ...options,\n onClose: () => {\n this.activeDialogs = this.activeDialogs.filter(d => d !== dialog);\n if (options.onClose) options.onClose();\n }\n });\n\n dialog.setTheme(themeManager.getTheme());\n this.activeDialogs.push(dialog);\n return dialog;\n }\n\n public updateTheme(theme: ThemeConfig) {\n this.activeDialogs.forEach(dialog => {\n if (dialog.setTheme) {\n dialog.setTheme(theme);\n }\n });\n }\n\n public destroy() {\n this.activeDialogs.forEach(d => d.destroy());\n this.activeDialogs = [];\n super.destroy();\n }\n}\n","/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '181';\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsMouse}\n * @constant\n */\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\n\n/**\n * Represents touch interaction types in context of controls.\n *\n * @type {ConstantsTouch}\n * @constant\n */\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\n\n/**\n * Disables face culling.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceNone = 0;\n\n/**\n * Culls back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceBack = 1;\n\n/**\n * Culls front faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFront = 2;\n\n/**\n * Culls both front and back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFrontBack = 3;\n\n/**\n * Gives unfiltered shadow maps - fastest, but lowest quality.\n *\n * @type {number}\n * @constant\n */\nconst BasicShadowMap = 0;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm.\n *\n * @type {number}\n * @constant\n */\nconst PCFShadowMap = 1;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm with\n * better soft shadows especially when using low-resolution shadow maps.\n *\n * @type {number}\n * @constant\n */\nconst PCFSoftShadowMap = 2;\n\n/**\n * Filters shadow maps using the Variance Shadow Map (VSM) algorithm.\n * When using VSMShadowMap all shadow receivers will also cast shadows.\n *\n * @type {number}\n * @constant\n */\nconst VSMShadowMap = 3;\n\n/**\n * Only front faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst FrontSide = 0;\n\n/**\n * Only back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst BackSide = 1;\n\n/**\n * Both front and back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst DoubleSide = 2;\n\n/**\n * No blending is performed which effectively disables\n * alpha transparency.\n *\n * @type {number}\n * @constant\n */\nconst NoBlending = 0;\n\n/**\n * The default blending.\n *\n * @type {number}\n * @constant\n */\nconst NormalBlending = 1;\n\n/**\n * Represents additive blending.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveBlending = 2;\n\n/**\n * Represents subtractive blending.\n *\n * @type {number}\n * @constant\n */\nconst SubtractiveBlending = 3;\n\n/**\n * Represents multiply blending.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyBlending = 4;\n\n/**\n * Represents custom blending.\n *\n * @type {number}\n * @constant\n */\nconst CustomBlending = 5;\n\n/**\n * A `source + destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst AddEquation = 100;\n\n/**\n * A `source - destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst SubtractEquation = 101;\n\n/**\n * A `destination - source` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst ReverseSubtractEquation = 102;\n\n/**\n * A blend equation that uses the minimum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MinEquation = 103;\n\n/**\n * A blend equation that uses the maximum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MaxEquation = 104;\n\n/**\n * Multiplies all colors by `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroFactor = 200;\n\n/**\n * Multiplies all colors by `1`.\n *\n * @type {number}\n * @constant\n */\nconst OneFactor = 201;\n\n/**\n * Multiplies all colors by the source colors.\n *\n * @type {number}\n * @constant\n */\nconst SrcColorFactor = 202;\n\n/**\n * Multiplies all colors by `1` minus each source color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcColorFactor = 203;\n\n/**\n * Multiplies all colors by the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaFactor = 204;\n\n/**\n * Multiplies all colors by 1 minus the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcAlphaFactor = 205;\n\n/**\n * Multiplies all colors by the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst DstAlphaFactor = 206;\n\n/**\n * Multiplies all colors by `1` minus the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstAlphaFactor = 207;\n\n/**\n * Multiplies all colors by the destination color.\n *\n * @type {number}\n * @constant\n */\nconst DstColorFactor = 208;\n\n/**\n * Multiplies all colors by `1` minus each destination color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstColorFactor = 209;\n\n/**\n * Multiplies the RGB colors by the smaller of either the source alpha\n * value or the value of `1` minus the destination alpha value. The alpha\n * value is multiplied by `1`.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaSaturateFactor = 210;\n\n/**\n * Multiplies all colors by a constant color.\n *\n * @type {number}\n * @constant\n */\nconst ConstantColorFactor = 211;\n\n/**\n * Multiplies all colors by `1` minus a constant color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantColorFactor = 212;\n\n/**\n * Multiplies all colors by a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst ConstantAlphaFactor = 213;\n\n/**\n * Multiplies all colors by 1 minus a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantAlphaFactor = 214;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverDepth = 0;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysDepth = 1;\n\n/**\n * Pass if the incoming value is less than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessDepth = 2;\n\n/**\n * Pass if the incoming value is less than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualDepth = 3;\n\n/**\n * Pass if the incoming value equals the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst EqualDepth = 4;\n\n/**\n * Pass if the incoming value is greater than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualDepth = 5;\n\n/**\n * Pass if the incoming value is greater than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterDepth = 6;\n\n/**\n * Pass if the incoming value is not equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualDepth = 7;\n\n/**\n * Multiplies the environment map color with the surface color.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyOperation = 0;\n\n/**\n * Uses reflectivity to blend between the two colors.\n *\n * @type {number}\n * @constant\n */\nconst MixOperation = 1;\n\n/**\n * Adds the two colors.\n *\n * @type {number}\n * @constant\n */\nconst AddOperation = 2;\n\n/**\n * No tone mapping is applied.\n *\n * @type {number}\n * @constant\n */\nconst NoToneMapping = 0;\n\n/**\n * Linear tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearToneMapping = 1;\n\n/**\n * Reinhard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ReinhardToneMapping = 2;\n\n/**\n * Cineon tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst CineonToneMapping = 3;\n\n/**\n * ACES Filmic tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ACESFilmicToneMapping = 4;\n\n/**\n * Custom tone mapping.\n *\n * Expects a custom implementation by modifying shader code of the material's fragment shader.\n *\n * @type {number}\n * @constant\n */\nconst CustomToneMapping = 5;\n\n/**\n * AgX tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst AgXToneMapping = 6;\n\n/**\n * Neutral tone mapping.\n *\n * Implementation based on the Khronos 3D Commerce Group standard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst NeutralToneMapping = 7;\n\n/**\n * The skinned mesh shares the same world space as the skeleton.\n *\n * @type {string}\n * @constant\n */\nconst AttachedBindMode = 'attached';\n\n/**\n * The skinned mesh does not share the same world space as the skeleton.\n * This is useful when a skeleton is shared across multiple skinned meshes.\n *\n * @type {string}\n * @constant\n */\nconst DetachedBindMode = 'detached';\n\n/**\n * Maps textures using the geometry's UV coordinates.\n *\n * @type {number}\n * @constant\n */\nconst UVMapping = 300;\n\n/**\n * Reflection mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeReflectionMapping = 301;\n\n/**\n * Refraction mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeRefractionMapping = 302;\n\n/**\n * Reflection mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularReflectionMapping = 303;\n\n/**\n * Refraction mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularRefractionMapping = 304;\n\n/**\n * Reflection mapping for PMREM textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeUVReflectionMapping = 306;\n\n/**\n * The texture will simply repeat to infinity.\n *\n * @type {number}\n * @constant\n */\nconst RepeatWrapping = 1000;\n\n/**\n * The last pixel of the texture stretches to the edge of the mesh.\n *\n * @type {number}\n * @constant\n */\nconst ClampToEdgeWrapping = 1001;\n\n/**\n * The texture will repeats to infinity, mirroring on each repeat.\n *\n * @type {number}\n * @constant\n */\nconst MirroredRepeatWrapping = 1002;\n\n/**\n * Returns the value of the texture element that is nearest (in Manhattan distance)\n * to the specified texture coordinates.\n *\n * @type {number}\n * @constant\n */\nconst NearestFilter = 1003;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured\n * and uses the `NearestFilter` criterion (the texel nearest to the center of the pixel)\n * to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and\n * uses the `NearestFilter` criterion to produce a texture value from each mipmap.\n * The final texture value is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005; // legacy\n\n/**\n * Returns the weighted average of the four texture elements that are closest to the specified\n * texture coordinates, and can include items wrapped or repeated from other parts of a texture,\n * depending on the values of `wrapS` and `wrapT`, and on the exact mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearFilter = 1006;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured and uses\n * the `LinearFilter` criterion (a weighted average of the four texels that are closest to the\n * center of the pixel) to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and uses\n * the `LinearFilter` criterion to produce a texture value from each mipmap. The final texture value\n * is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008; // legacy\n\n/**\n * An unsigned byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedByteType = 1009;\n\n/**\n * A byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ByteType = 1010;\n\n/**\n * A short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ShortType = 1011;\n\n/**\n * An unsigned short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShortType = 1012;\n\n/**\n * An int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst IntType = 1013;\n\n/**\n * An unsigned int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedIntType = 1014;\n\n/**\n * A float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst FloatType = 1015;\n\n/**\n * A half float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst HalfFloatType = 1016;\n\n/**\n * An unsigned short 4_4_4_4 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort4444Type = 1017;\n\n/**\n * An unsigned short 5_5_5_1 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort5551Type = 1018;\n\n/**\n * An unsigned int 24_8 data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt248Type = 1020;\n\n/**\n * An unsigned int 5_9_9_9 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt5999Type = 35902;\n\n/**\n * An unsigned int 10_11_11 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt101111Type = 35899;\n\n/**\n * Discards the red, green and blue components and reads just the alpha component.\n *\n * @type {number}\n * @constant\n */\nconst AlphaFormat = 1021;\n\n/**\n * Discards the alpha component and reads the red, green and blue component.\n *\n * @type {number}\n * @constant\n */\nconst RGBFormat = 1022;\n\n/**\n * Reads the red, green, blue and alpha components.\n *\n * @type {number}\n * @constant\n */\nconst RGBAFormat = 1023;\n\n/**\n * Reads each element as a single depth value, converts it to floating point, and clamps to the range `[0,1]`.\n *\n * @type {number}\n * @constant\n */\nconst DepthFormat = 1026;\n\n/**\n * Reads each element is a pair of depth and stencil values. The depth component of the pair is interpreted as\n * in `DepthFormat`. The stencil component is interpreted based on the depth + stencil internal format.\n *\n * @type {number}\n * @constant\n */\nconst DepthStencilFormat = 1027;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component.\n *\n * @type {number}\n * @constant\n */\nconst RedFormat = 1028;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RedIntegerFormat = 1029;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components.\n *\n * @type {number}\n * @constant\n */\nconst RGFormat = 1030;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGIntegerFormat = 1031;\n\n/**\n * Discards the alpha component and reads the red, green and blue component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBIntegerFormat = 1032;\n\n/**\n * Reads the red, green, blue and alpha components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBAIntegerFormat = 1033;\n\n/**\n * A DXT1-compressed image in an RGB image format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_S3TC_DXT1_Format = 33776;\n\n/**\n * A DXT1-compressed image in an RGB image format with a simple on/off alpha value.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT1_Format = 33777;\n\n/**\n * A DXT3-compressed image in an RGBA image format. Compared to a 32-bit RGBA texture, it offers 4:1 compression.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT3_Format = 33778;\n\n/**\n * A DXT5-compressed image in an RGBA image format. It also provides a 4:1 compression, but differs to the DXT3\n * compression in how the alpha compression is done.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT5_Format = 33779;\n\n/**\n * PVRTC RGB compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_4BPPV1_Format = 35840;\n\n/**\n * PVRTC RGB compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_2BPPV1_Format = 35841;\n\n/**\n * PVRTC RGBA compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\n\n/**\n * PVRTC RGBA compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\n\n/**\n * ETC1 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC1_Format = 36196;\n\n/**\n * ETC2 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC2_Format = 37492;\n\n/**\n * ETC2 RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ETC2_EAC_Format = 37496;\n\n/**\n * ASTC RGBA 4x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_4x4_Format = 37808;\n\n/**\n * ASTC RGBA 5x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x4_Format = 37809;\n\n/**\n * ASTC RGBA 5x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x5_Format = 37810;\n\n/**\n * ASTC RGBA 6x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x5_Format = 37811;\n\n/**\n * ASTC RGBA 6x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x6_Format = 37812;\n\n/**\n * ASTC RGBA 8x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x5_Format = 37813;\n\n/**\n * ASTC RGBA 8x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x6_Format = 37814;\n\n/**\n * ASTC RGBA 8x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x8_Format = 37815;\n\n/**\n * ASTC RGBA 10x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x5_Format = 37816;\n\n/**\n * ASTC RGBA 10x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x6_Format = 37817;\n\n/**\n * ASTC RGBA 10x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x8_Format = 37818;\n\n/**\n * ASTC RGBA 10x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x10_Format = 37819;\n\n/**\n * ASTC RGBA 12x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x10_Format = 37820;\n\n/**\n * ASTC RGBA 12x12 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x12_Format = 37821;\n\n/**\n * BPTC RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_BPTC_Format = 36492;\n\n/**\n * BPTC Signed RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_SIGNED_Format = 36494;\n\n/**\n * BPTC Unsigned RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_UNSIGNED_Format = 36495;\n\n/**\n * RGTC1 Red format.\n *\n * @type {number}\n * @constant\n */\nconst RED_RGTC1_Format = 36283;\n\n/**\n * RGTC1 Signed Red format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_RGTC1_Format = 36284;\n\n/**\n * RGTC2 Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst RED_GREEN_RGTC2_Format = 36285;\n\n/**\n * RGTC2 Signed Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_GREEN_RGTC2_Format = 36286;\n\n/**\n * Animations are played once.\n *\n * @type {number}\n * @constant\n */\nconst LoopOnce = 2200;\n\n/**\n * Animations are played with a chosen number of repetitions, each time jumping from\n * the end of the clip directly to its beginning.\n *\n * @type {number}\n * @constant\n */\nconst LoopRepeat = 2201;\n\n/**\n * Animations are played with a chosen number of repetitions, alternately playing forward\n * and backward.\n *\n * @type {number}\n * @constant\n */\nconst LoopPingPong = 2202;\n\n/**\n * Discrete interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateDiscrete = 2300;\n\n/**\n * Linear interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateLinear = 2301;\n\n/**\n * Smooth interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateSmooth = 2302;\n\n/**\n * Zero curvature ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroCurvatureEnding = 2400;\n\n/**\n * Zero slope ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroSlopeEnding = 2401;\n\n/**\n * Wrap around ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst WrapAroundEnding = 2402;\n\n/**\n * Default animation blend mode.\n *\n * @type {number}\n * @constant\n */\nconst NormalAnimationBlendMode = 2500;\n\n/**\n * Additive animation blend mode. Can be used to layer motions on top of\n * each other to build complex performances from smaller re-usable assets.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveAnimationBlendMode = 2501;\n\n/**\n * For every three vertices draw a single triangle.\n *\n * @type {number}\n * @constant\n */\nconst TrianglesDrawMode = 0;\n\n/**\n * For each vertex draw a triangle from the last three vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleStripDrawMode = 1;\n\n/**\n * For each vertex draw a triangle from the first vertex and the last two vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleFanDrawMode = 2;\n\n/**\n * Basic depth packing.\n *\n * @type {number}\n * @constant\n */\nconst BasicDepthPacking = 3200;\n\n/**\n * A depth value is packed into 32 bit RGBA.\n *\n * @type {number}\n * @constant\n */\nconst RGBADepthPacking = 3201;\n\n/**\n * A depth value is packed into 24 bit RGB.\n *\n * @type {number}\n * @constant\n */\nconst RGBDepthPacking = 3202;\n\n/**\n * A depth value is packed into 16 bit RG.\n *\n * @type {number}\n * @constant\n */\nconst RGDepthPacking = 3203;\n\n/**\n * Normal information is relative to the underlying surface.\n *\n * @type {number}\n * @constant\n */\nconst TangentSpaceNormalMap = 0;\n\n/**\n * Normal information is relative to the object orientation.\n *\n * @type {number}\n * @constant\n */\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\n\n/**\n * No color space.\n *\n * @type {string}\n * @constant\n */\nconst NoColorSpace = '';\n\n/**\n * sRGB color space.\n *\n * @type {string}\n * @constant\n */\nconst SRGBColorSpace = 'srgb';\n\n/**\n * sRGB-linear color space.\n *\n * @type {string}\n * @constant\n */\nconst LinearSRGBColorSpace = 'srgb-linear';\n\n/**\n * Linear transfer function.\n *\n * @type {string}\n * @constant\n */\nconst LinearTransfer = 'linear';\n\n/**\n * sRGB transfer function.\n *\n * @type {string}\n * @constant\n */\nconst SRGBTransfer = 'srgb';\n\n/**\n * Sets the stencil buffer value to `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroStencilOp = 0;\n\n/**\n * Keeps the current value.\n *\n * @type {number}\n * @constant\n */\nconst KeepStencilOp = 7680;\n\n/**\n * Sets the stencil buffer value to the specified reference value.\n *\n * @type {number}\n * @constant\n */\nconst ReplaceStencilOp = 7681;\n\n/**\n * Increments the current stencil buffer value. Clamps to the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementStencilOp = 7682;\n\n/**\n * Decrements the current stencil buffer value. Clamps to `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementStencilOp = 7683;\n\n/**\n * Increments the current stencil buffer value. Wraps stencil buffer value to zero when incrementing\n * the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementWrapStencilOp = 34055;\n\n/**\n * Decrements the current stencil buffer value. Wraps stencil buffer value to the maximum representable\n * unsigned value when decrementing a stencil buffer value of `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementWrapStencilOp = 34056;\n\n/**\n * Inverts the current stencil buffer value bitwise.\n *\n * @type {number}\n * @constant\n */\nconst InvertStencilOp = 5386;\n\n/**\n * Will never return true.\n *\n * @type {number}\n * @constant\n */\nconst NeverStencilFunc = 512;\n\n/**\n * Will return true if the stencil reference value is less than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessStencilFunc = 513;\n\n/**\n * Will return true if the stencil reference value is equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst EqualStencilFunc = 514;\n\n/**\n * Will return true if the stencil reference value is less than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualStencilFunc = 515;\n\n/**\n * Will return true if the stencil reference value is greater than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterStencilFunc = 516;\n\n/**\n * Will return true if the stencil reference value is not equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualStencilFunc = 517;\n\n/**\n * Will return true if the stencil reference value is greater than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualStencilFunc = 518;\n\n/**\n * Will always return true.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysStencilFunc = 519;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverCompare = 512;\n\n/**\n * Pass if the incoming value is less than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessCompare = 513;\n\n/**\n * Pass if the incoming value equals the texture value.\n *\n * @type {number}\n * @constant\n */\nconst EqualCompare = 514;\n\n/**\n * Pass if the incoming value is less than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualCompare = 515;\n\n/**\n * Pass if the incoming value is greater than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterCompare = 516;\n\n/**\n * Pass if the incoming value is not equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualCompare = 517;\n\n/**\n * Pass if the incoming value is greater than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualCompare = 518;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysCompare = 519;\n\n/**\n * The contents are intended to be specified once by the application, and used many\n * times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticDrawUsage = 35044;\n\n/**\n * The contents are intended to be respecified repeatedly by the application, and\n * used many times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicDrawUsage = 35048;\n\n/**\n * The contents are intended to be specified once by the application, and used at most\n * a few times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamDrawUsage = 35040;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst StaticReadUsage = 35045;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst DynamicReadUsage = 35049;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried at most\n * a few times by the application\n *\n * @type {number}\n * @constant\n */\nconst StreamReadUsage = 35041;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used many times as\n * the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticCopyUsage = 35046;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and used many times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicCopyUsage = 35050;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used at most a few times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamCopyUsage = 35042;\n\n/**\n * GLSL 1 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL1 = '100';\n\n/**\n * GLSL 3 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL3 = '300 es';\n\n/**\n * WebGL coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGLCoordinateSystem = 2000;\n\n/**\n * WebGPU coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGPUCoordinateSystem = 2001;\n\n/**\n * Represents the different timestamp query types.\n *\n * @type {ConstantsTimestampQuery}\n * @constant\n */\nconst TimestampQuery = {\n\tCOMPUTE: 'compute',\n\tRENDER: 'render'\n};\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsInterpolationSamplingType}\n * @constant\n */\nconst InterpolationSamplingType = {\n\tPERSPECTIVE: 'perspective',\n\tLINEAR: 'linear',\n\tFLAT: 'flat'\n};\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @type {ConstantsInterpolationSamplingMode}\n * @constant\n */\nconst InterpolationSamplingMode = {\n\tNORMAL: 'normal',\n\tCENTROID: 'centroid',\n\tSAMPLE: 'sample',\n\tFIRST: 'first',\n\tEITHER: 'either'\n};\n\n/**\n * This type represents mouse buttons and interaction types in context of controls.\n *\n * @typedef {Object} ConstantsMouse\n * @property {number} MIDDLE - The left mouse button.\n * @property {number} LEFT - The middle mouse button.\n * @property {number} RIGHT - The right mouse button.\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} DOLLY - A dolly interaction.\n * @property {number} PAN - A pan interaction.\n **/\n\n/**\n * This type represents touch interaction types in context of controls.\n *\n * @typedef {Object} ConstantsTouch\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} PAN - A pan interaction.\n * @property {number} DOLLY_PAN - The dolly-pan interaction.\n * @property {number} DOLLY_ROTATE - A dolly-rotate interaction.\n **/\n\n/**\n * This type represents the different timestamp query types.\n *\n * @typedef {Object} ConstantsTimestampQuery\n * @property {string} COMPUTE - A `compute` timestamp query.\n * @property {string} RENDER - A `render` timestamp query.\n **/\n\n/**\n * Represents the different interpolation sampling types.\n *\n * @typedef {Object} ConstantsInterpolationSamplingType\n * @property {string} PERSPECTIVE - Perspective-correct interpolation.\n * @property {string} LINEAR - Linear interpolation.\n * @property {string} FLAT - Flat interpolation.\n */\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @typedef {Object} ConstantsInterpolationSamplingMode\n * @property {string} NORMAL - Normal sampling mode.\n * @property {string} CENTROID - Centroid sampling mode.\n * @property {string} SAMPLE - Sample-specific sampling mode.\n * @property {string} FIRST - Flat interpolation using the first vertex.\n * @property {string} EITHER - Flat interpolation using either vertex.\n */\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nconst _cache = {};\n\nlet _setConsoleFunction = null;\n\nfunction setConsoleFunction( fn ) {\n\n\t_setConsoleFunction = fn;\n\n}\n\nfunction getConsoleFunction() {\n\n\treturn _setConsoleFunction;\n\n}\n\nfunction log( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'log', message, ...params );\n\n\t} else {\n\n\t\tconsole.log( message, ...params );\n\n\t}\n\n}\n\nfunction warn( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'warn', message, ...params );\n\n\t} else {\n\n\t\tconsole.warn( message, ...params );\n\n\t}\n\n}\n\nfunction error( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'error', message, ...params );\n\n\t} else {\n\n\t\tconsole.error( message, ...params );\n\n\t}\n\n}\n\nfunction warnOnce( ...params ) {\n\n\tconst message = params.join( ' ' );\n\n\tif ( message in _cache ) return;\n\n\t_cache[ message ] = true;\n\n\twarn( ...params );\n\n}\n\nfunction probeAsync( gl, sync, interval ) {\n\n\treturn new Promise( function ( resolve, reject ) {\n\n\t\tfunction probe() {\n\n\t\t\tswitch ( gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 ) ) {\n\n\t\t\t\tcase gl.WAIT_FAILED:\n\t\t\t\t\treject();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase gl.TIMEOUT_EXPIRED:\n\t\t\t\t\tsetTimeout( probe, interval );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tresolve();\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetTimeout( probe, interval );\n\n\t} );\n\n}\n\n/**\n * This modules allows to dispatch event objects on custom JavaScript objects.\n *\n * Main repository: [eventdispatcher.js](https://github.com/mrdoob/eventdispatcher.js/)\n *\n * Code Example:\n * ```js\n * class Car extends EventDispatcher {\n * \tstart() {\n *\t\tthis.dispatchEvent( { type: 'start', message: 'vroom vroom!' } );\n *\t}\n *};\n *\n * // Using events with the custom object\n * const car = new Car();\n * car.addEventListener( 'start', function ( event ) {\n * \talert( event.message );\n * } );\n *\n * car.start();\n * ```\n */\nclass EventDispatcher {\n\n\t/**\n\t * Adds the given event listener to the given event type.\n\t *\n\t * @param {string} type - The type of event to listen to.\n\t * @param {Function} listener - The function that gets called when the event is fired.\n\t */\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === -1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the given event listener has been added to the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to check.\n\t * @return {boolean} Whether the given event listener has been added to the given event type.\n\t */\n\thasEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return false;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== -1;\n\n\t}\n\n\t/**\n\t * Removes the given event listener from the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to remove.\n\t */\n\tremoveEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispatches an event object.\n\t *\n\t * @param {Object} event - The event that gets fired.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n/**\n * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n * (universally unique identifier).\n *\n * @return {string} The UUID.\n */\nfunction generateUUID() {\n\n\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\n/**\n * Clamps the given value between min and max.\n *\n * @param {number} value - The value to clamp.\n * @param {number} min - The min value.\n * @param {number} max - The max value.\n * @return {number} The clamped value.\n */\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n/**\n * Computes the Euclidean modulo of the given parameters that\n * is `( ( n % m ) + m ) % m`.\n *\n * @param {number} n - The first parameter.\n * @param {number} m - The second parameter.\n * @return {number} The Euclidean modulo.\n */\nfunction euclideanModulo( n, m ) {\n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n/**\n * Performs a linear mapping from range `` to range ``\n * for the given value.\n *\n * @param {number} x - The value to be mapped.\n * @param {number} a1 - Minimum value for range A.\n * @param {number} a2 - Maximum value for range A.\n * @param {number} b1 - Minimum value for range B.\n * @param {number} b2 - Maximum value for range B.\n * @return {number} The mapped value.\n */\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n/**\n * Returns the percentage in the closed interval `[0, 1]` of the given value\n * between the start and end point.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} value - A value between start and end.\n * @return {number} The interpolation factor.\n */\nfunction inverseLerp( x, y, value ) {\n\n\t// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n/**\n * Returns a value linearly interpolated from two known points based on the given interval -\n * `t = 0` will return `x` and `t = 1` will return `y`.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n * @return {number} The interpolated value.\n */\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n/**\n * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta\n * time to maintain frame rate independent movement. For details, see\n * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n *\n * @param {number} x - The current point.\n * @param {number} y - The target point.\n * @param {number} lambda - A higher lambda value will make the movement more sudden,\n * and a lower value will make the movement more gradual.\n * @param {number} dt - Delta time in seconds.\n * @return {number} The interpolated value.\n */\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n/**\n * Returns a value that alternates between `0` and the given `length` parameter.\n *\n * @param {number} x - The value to pingpong.\n * @param {number} [length=1] - The positive value the function will pingpong to.\n * @return {number} The alternated value.\n */\nfunction pingpong( x, length = 1 ) {\n\n\t// https://www.desmos.com/calculator/vcsjnyz7x4\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n/**\n * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n * the `min` and `max`.\n *\n * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\n/**\n * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n/**\n * Returns a random integer from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random integer.\n */\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n/**\n * Returns a random float from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random float.\n */\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n/**\n * Returns a random integer from `<-range/2, range/2>` interval.\n *\n * @param {number} range - Defines the value range.\n * @return {number} A random float.\n */\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n/**\n * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n *\n * @param {number} [s] - The integer seed.\n * @return {number} A random float.\n */\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param {number} degrees - A value in degrees.\n * @return {number} The converted value in radians.\n */\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\n/**\n * Converts radians to degrees.\n *\n * @param {number} radians - A value in radians.\n * @return {number} The converted value in degrees.\n */\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\n/**\n * Returns `true` if the given number is a power of two.\n *\n * @param {number} value - The value to check.\n * @return {boolean} Whether the given number is a power of two or not.\n */\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\n/**\n * Returns the smallest power of two that is greater than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The smallest power of two that is greater than or equal to the given number.\n */\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Returns the largest power of two that is less than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The largest power of two that is less than or equal to the given number.\n */\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n * defined by the given angles and order.\n *\n * Rotations are applied to the axes in the order specified by order:\n * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n *\n * @param {Quaternion} q - The quaternion to set.\n * @param {number} a - The rotation applied to the first axis, in radians.\n * @param {number} b - The rotation applied to the second axis, in radians.\n * @param {number} c - The rotation applied to the third axis, in radians.\n * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n */\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n/**\n * Denormalizes the given value according to the given typed array.\n *\n * @param {number} value - The value to denormalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The denormalize (float) value in the range `[0,1]`.\n */\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, -1 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, -1 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, -1 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * Normalizes the given value according to the given typed array.\n *\n * @param {number} value - The float value in the range `[0,1]` to normalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The normalize value.\n */\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A collection of math utility functions.\n * @hideconstructor\n */\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\t/**\n\t * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n\t * (universally unique identifier).\n\t *\n\t * @static\n\t * @method\n\t * @return {string} The UUID.\n\t */\n\tgenerateUUID: generateUUID,\n\t/**\n\t * Clamps the given value between min and max.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to clamp.\n\t * @param {number} min - The min value.\n\t * @param {number} max - The max value.\n\t * @return {number} The clamped value.\n\t */\n\tclamp: clamp,\n\t/**\n\t * Computes the Euclidean modulo of the given parameters that\n\t * is `( ( n % m ) + m ) % m`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} n - The first parameter.\n\t * @param {number} m - The second parameter.\n\t * @return {number} The Euclidean modulo.\n\t */\n\teuclideanModulo: euclideanModulo,\n\t/**\n\t * Performs a linear mapping from range `` to range ``\n\t * for the given value.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to be mapped.\n\t * @param {number} a1 - Minimum value for range A.\n\t * @param {number} a2 - Maximum value for range A.\n\t * @param {number} b1 - Minimum value for range B.\n\t * @param {number} b2 - Maximum value for range B.\n\t * @return {number} The mapped value.\n\t */\n\tmapLinear: mapLinear,\n\t/**\n\t * Returns the percentage in the closed interval `[0, 1]` of the given value\n\t * between the start and end point.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} value - A value between start and end.\n\t * @return {number} The interpolation factor.\n\t */\n\tinverseLerp: inverseLerp,\n\t/**\n\t * Returns a value linearly interpolated from two known points based on the given interval -\n\t * `t = 0` will return `x` and `t = 1` will return `y`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {number} The interpolated value.\n\t */\n\tlerp: lerp,\n\t/**\n\t * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta\n\t * time to maintain frame rate independent movement. For details, see\n\t * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The current point.\n\t * @param {number} y - The target point.\n\t * @param {number} lambda - A higher lambda value will make the movement more sudden,\n\t * and a lower value will make the movement more gradual.\n\t * @param {number} dt - Delta time in seconds.\n\t * @return {number} The interpolated value.\n\t */\n\tdamp: damp,\n\t/**\n\t * Returns a value that alternates between `0` and the given `length` parameter.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to pingpong.\n\t * @param {number} [length=1] - The positive value the function will pingpong to.\n\t * @return {number} The alternated value.\n\t */\n\tpingpong: pingpong,\n\t/**\n\t * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n\t * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n\t * the `min` and `max`.\n\t *\n\t * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmoothstep: smoothstep,\n\t/**\n\t * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n\t * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmootherstep: smootherstep,\n\t/**\n\t * Returns a random integer from `` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random integer.\n\t */\n\trandInt: randInt,\n\t/**\n\t * Returns a random float from `` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random float.\n\t */\n\trandFloat: randFloat,\n\t/**\n\t * Returns a random integer from `<-range/2, range/2>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} range - Defines the value range.\n\t * @return {number} A random float.\n\t */\n\trandFloatSpread: randFloatSpread,\n\t/**\n\t * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} [s] - The integer seed.\n\t * @return {number} A random float.\n\t */\n\tseededRandom: seededRandom,\n\t/**\n\t * Converts degrees to radians.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} degrees - A value in degrees.\n\t * @return {number} The converted value in radians.\n\t */\n\tdegToRad: degToRad,\n\t/**\n\t * Converts radians to degrees.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} radians - A value in radians.\n\t * @return {number} The converted value in degrees.\n\t */\n\tradToDeg: radToDeg,\n\t/**\n\t * Returns `true` if the given number is a power of two.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to check.\n\t * @return {boolean} Whether the given number is a power of two or not.\n\t */\n\tisPowerOfTwo: isPowerOfTwo,\n\t/**\n\t * Returns the smallest power of two that is greater than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The smallest power of two that is greater than or equal to the given number.\n\t */\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\t/**\n\t * Returns the largest power of two that is less than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The largest power of two that is less than or equal to the given number.\n\t */\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\t/**\n\t * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n\t * defined by the given angles and order.\n\t *\n\t * Rotations are applied to the axes in the order specified by order:\n\t * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n\t *\n\t * @static\n\t * @method\n\t * @param {Quaternion} q - The quaternion to set.\n\t * @param {number} a - The rotation applied to the first axis, in radians.\n\t * @param {number} b - The rotation applied to the second axis, in radians.\n\t * @param {number} c - The rotation applied to the third axis, in radians.\n\t * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n\t */\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\t/**\n\t * Normalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The float value in the range `[0,1]` to normalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The normalize value.\n\t */\n\tnormalize: normalize,\n\t/**\n\t * Denormalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to denormalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The denormalize (float) value in the range `[0,1]`.\n\t */\n\tdenormalize: denormalize\n};\n\n/**\n * Class representing a 2D vector. A 2D vector is an ordered pair of numbers\n * (labeled x and y), which can be used to represent a number of things, such as:\n *\n * - A point in 2D space (i.e. a position on a plane).\n * - A direction and length across a plane. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0)` to `(x, y)`\n * and the direction is also measured from `(0, 0)` towards `(x, y)`.\n * - Any arbitrary ordered pair of numbers.\n *\n * There are other things a 2D vector can be used to represent, such as\n * momentum vectors, complex numbers and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector2( 0, 1 );\n *\n * //no arguments; will be initialised to (0, 0)\n * const b = new THREE.Vector2( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector2 {\n\n\t/**\n\t * Constructs a new 2D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t */\n\tconstructor( x = 0, y = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector2.prototype.isVector2 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#x}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#y}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @param {number} value - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to copy.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector2} v - The vector to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector2} v - The vector to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 as the 3rd component) by\n\t * the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the given vector's x or y\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is less than the given vector's x or y\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the max vector's x or y\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x or y value is less than the min vector's x or y value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector2} min - The minimum x and y values.\n\t * @param {Vector2} max - The maximum x and y values in the desired range.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x or y values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x and y = -y.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the cross product with.\n\t * @return {number} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0) to (x, y). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Computes the angle in radians of this vector with respect to the positive x-axis.\n\t *\n\t * @return {number} The angle in radians.\n\t */\n\tangle() {\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector2} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector2} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector2} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector2} v1 - The first vector.\n\t * @param {Vector2} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector2} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]` and y\n\t * value to be `array[ offset + 1 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this vector around the given center by the given angle.\n\t *\n\t * @param {Vector2} center - The point around which to rotate.\n\t * @param {number} angle - The angle to rotate, in radians.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\n/**\n * Class for representing a Quaternion. Quaternions are used in three.js to represent rotations.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n *\n * Note that three.js expects Quaternions to be normalized.\n * ```js\n * const quaternion = new THREE.Quaternion();\n * quaternion.setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 );\n *\n * const vector = new THREE.Vector3( 1, 0, 0 );\n * vector.applyQuaternion( quaternion );\n * ```\n */\nclass Quaternion {\n\n\t/**\n\t * Constructs a new quaternion.\n\t *\n\t * @param {number} [x=0] - The x value of this quaternion.\n\t * @param {number} [y=0] - The y value of this quaternion.\n\t * @param {number} [z=0] - The z value of this quaternion.\n\t * @param {number} [w=1] - The w value of this quaternion.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\t/**\n\t * Interpolates between two quaternions via SLERP. This implementation assumes the\n\t * quaternion data are managed in flat arrays.\n\t *\n\t * @param {Array} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array} src1 - The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @param {number} t - The interpolation factor in the range `[0,1]`.\n\t * @see {@link Quaternion#slerp}\n\t */\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tlet x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t <= 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t >= 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n\n\t\t\tif ( dot < 0 ) {\n\n\t\t\t\tx1 = - x1;\n\t\t\t\ty1 = - y1;\n\t\t\t\tz1 = - z1;\n\t\t\t\tw1 = - w1;\n\n\t\t\t\tdot = - dot;\n\n\t\t\t}\n\n\t\t\tlet s = 1 - t;\n\n\t\t\tif ( dot < 0.9995 ) {\n\n\t\t\t\t// slerp\n\n\t\t\t\tconst theta = Math.acos( dot );\n\t\t\t\tconst sin = Math.sin( theta );\n\n\t\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t} else {\n\n\t\t\t\t// for small angles, lerp then normalize\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\t/**\n\t * Multiplies two quaternions. This implementation assumes the quaternion data are managed\n\t * in flat arrays.\n\t *\n\t * @param {Array} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array} src1 - The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @return {Array} The destination array.\n\t * @see {@link Quaternion#multiplyQuaternions}.\n\t */\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\t/**\n\t * The x value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The y value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The z value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The w value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the quaternion components.\n\t *\n\t * @param {number} x - The x value of this quaternion.\n\t * @param {number} y - The y value of this quaternion.\n\t * @param {number} z - The z value of this quaternion.\n\t * @param {number} w - The w value of this quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new quaternion with copied values from this instance.\n\t *\n\t * @return {Quaternion} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given quaternion to this instance.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to copy.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the rotation specified by the given\n\t * Euler angles.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromEuler( euler, update = true ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\twarn( 'Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given axis and angle.\n\t *\n\t * @param {Vector3} axis - The normalized axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the rotation required to rotate the direction vector\n\t * `vFrom` to the direction vector `vTo`.\n\t *\n\t * @param {Vector3} vFrom - The first (normalized) direction vector.\n\t * @param {Vector3} vTo - The second (normalized) direction vector.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < 1e-8 ) { // the epsilon value has been discussed in #31286\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Returns the angle between this quaternion and the given one in radians.\n\t *\n\t * @param {Quaternion} q - The quaternion to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), -1, 1 ) ) );\n\n\t}\n\n\t/**\n\t * Rotates this quaternion by a given angular step to the given quaternion.\n\t * The method ensures that the final quaternion will not overshoot `q`.\n\t *\n\t * @param {Quaternion} q - The target quaternion.\n\t * @param {number} step - The angular step in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the identity quaternion; that is, to the\n\t * quaternion that represents \"no rotation\".\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\t/**\n\t * Inverts this quaternion via {@link Quaternion#conjugate}. The\n\t * quaternion is assumed to have unit length.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tinvert() {\n\n\t\treturn this.conjugate();\n\n\t}\n\n\t/**\n\t * Returns the rotational conjugate of this quaternion. The conjugate of a\n\t * quaternion represents the same rotation in the opposite direction about\n\t * the rotational axis.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tconjugate() {\n\n\t\tthis._x *= -1;\n\t\tthis._y *= -1;\n\t\tthis._z *= -1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of this quaternion and the given one.\n\t *\n\t * @param {Quaternion} v - The quaternion to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\t/**\n\t * Computes the squared Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector. This can be useful if you are comparing the\n\t * lengths of two quaternions, as this is a slightly more efficient calculation than\n\t * {@link Quaternion#length}.\n\t *\n\t * @return {number} The squared Euclidean length.\n\t */\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector.\n\t *\n\t * @return {number} The Euclidean length.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\t/**\n\t * Normalizes this quaternion - that is, calculated the quaternion that performs\n\t * the same rotation as this one, but has a length equal to `1`.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\t/**\n\t * Multiplies the given quaternions and stores the result in this instance.\n\t *\n\t * @param {Quaternion} a - The first quaternion.\n\t * @param {Quaternion} b - The second quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between quaternions.\n\t *\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerp( qb, t ) {\n\n\t\tif ( t <= 0 ) return this;\n\n\t\tif ( t >= 1 ) return this.copy( qb ); // copy calls _onChangeCallback()\n\n\t\tlet x = qb._x, y = qb._y, z = qb._z, w = qb._w;\n\n\t\tlet dot = this.dot( qb );\n\n\t\tif ( dot < 0 ) {\n\n\t\t\tx = - x;\n\t\t\ty = - y;\n\t\t\tz = - z;\n\t\t\tw = - w;\n\n\t\t\tdot = - dot;\n\n\t\t}\n\n\t\tlet s = 1 - t;\n\n\t\tif ( dot < 0.9995 ) {\n\n\t\t\t// slerp\n\n\t\t\tconst theta = Math.acos( dot );\n\t\t\tconst sin = Math.sin( theta );\n\n\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis._onChangeCallback();\n\n\t\t} else {\n\n\t\t\t// for small angles, lerp then normalize\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis.normalize(); // normalize calls _onChangeCallback()\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between the given quaternions\n\t * and stores the result in this quaternion.\n\t *\n\t * @param {Quaternion} qa - The source quaternion.\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\t/**\n\t * Sets this quaternion to a uniformly random, normalized quaternion.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trandom() {\n\n\t\t// Ken Shoemake\n\t\t// Uniform random rotations\n\t\t// D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n\n\t\tconst theta1 = 2 * Math.PI * Math.random();\n\t\tconst theta2 = 2 * Math.PI * Math.random();\n\n\t\tconst x0 = Math.random();\n\t\tconst r1 = Math.sqrt( 1 - x0 );\n\t\tconst r2 = Math.sqrt( x0 );\n\n\t\treturn this.set(\n\t\t\tr1 * Math.sin( theta1 ),\n\t\t\tr1 * Math.cos( theta1 ),\n\t\t\tr2 * Math.sin( theta2 ),\n\t\t\tr2 * Math.cos( theta2 ),\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if this quaternion is equal with the given one.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to test for equality.\n\t * @return {boolean} Whether this quaternion is equal with the given one.\n\t */\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\t/**\n\t * Sets this quaternion's components from the given array.\n\t *\n\t * @param {Array} array - An array holding the quaternion component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this quaternion to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the quaternion components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The quaternion components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this quaternion from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding quaternion data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the\n\t * numerical elements of this quaternion in an array of format `[x, y, z, w]`.\n\t *\n\t * @return {Array} The serialized quaternion.\n\t */\n\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\n/**\n * Class representing a 3D vector. A 3D vector is an ordered triplet of numbers\n * (labeled x, y and z), which can be used to represent a number of things, such as:\n *\n * - A point in 3D space.\n * - A direction and length in 3D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0)` to `(x, y, z)`\n * and the direction is also measured from `(0, 0, 0)` towards `(x, y, z)`.\n * - Any arbitrary ordered triplet of numbers.\n *\n * There are other things a 3D vector can be used to represent, such as\n * momentum vectors and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y, z)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector3( 0, 1, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0)\n * const b = new THREE.Vector3( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector3 {\n\n\t/**\n\t * Constructs a new 3D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector3.prototype.isVector3 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @param {number} value - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to copy.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector3} v - The vector to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Euler rotation to this vector.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\t/**\n\t * Applies a rotation specified by an axis and an angle to this vector.\n\t *\n\t * @param {Vector3} axis - A normalized vector representing the rotation axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector by the given normal matrix and normalizes\n\t * the result.\n\t *\n\t * @param {Matrix3} m - The normal matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and\n\t * divides by perspective.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Quaternion to this vector.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector from world space into the camera's normalized\n\t * device coordinate (NDC) space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\t/**\n\t * Unprojects this vector from the camera's normalized device coordinate (NDC)\n\t * space into world space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\t/**\n\t * Transforms the direction of this vector by a matrix (the upper left 3 x 3\n\t * subset of the given 4x4 matrix and then normalizes the result.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector3} v - The vector to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the given vector's x, y or z\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is less than the given vector's x, y or z\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the max vector's x, y or z\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y or z value is less than the min vector's x, y or z value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector3} min - The minimum x, y and z values.\n\t * @param {Vector3} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y or z values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y and z = -z.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector3} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector3} v1 - The first vector.\n\t * @param {Vector3} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the cross product with.\n\t * @return {Vector3} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vectors and stores the result\n\t * in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector onto the given one.\n\t *\n\t * @param {Vector3} v - The vector to project to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\t/**\n\t * Projects this vector onto a plane by subtracting this\n\t * vector projected onto the plane's normal from this vector.\n\t *\n\t * @param {Vector3} planeNormal - The plane normal.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\t/**\n\t * Reflects this vector off a plane orthogonal to the given normal vector.\n\t *\n\t * @param {Vector3} normal - The (normalized) normal vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\treflect( normal ) {\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector3} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector3} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {Spherical} s - The spherical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The phi angle in radians.\n\t * @param {number} theta - The theta angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {Cylindrical} c - The cylindrical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle in radians.\n\t * @param {number} y - The y value.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the scale elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given Euler angles.\n\t *\n\t * @param {Euler} e - The Euler angles to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the RGB components of the\n\t * given color.\n\t *\n\t * @param {Color} c - The color to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector3} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`\n\t * and z value to be `array[ offset + 2 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this vector to a uniformly random point on a unit sphere.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandomDirection() {\n\n\t\t// https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst theta = Math.random() * Math.PI * 2;\n\t\tconst u = Math.random() * 2 - 1;\n\t\tconst c = Math.sqrt( 1 - u * u );\n\n\t\tthis.x = c * Math.cos( theta );\n\t\tthis.y = u;\n\t\tthis.z = c * Math.sin( theta );\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\n/**\n * Represents a 3x3 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix();\n * m.set( 11, 12, 13,\n * 21, 22, 23,\n * 31, 32, 33 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31,\n * 12, 22, 32,\n * 13, 23, 33 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix3 {\n\n\t/**\n\t * Constructs a new 3x3 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 3x3 identity matrix.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix3} m - The matrix to copy.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set this matrix to the upper 3x3 matrix of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 3x3 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix3} a - The first matrix.\n\t * @param {Matrix3} b - The second matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the normal matrix which is the inverse transpose of the upper\n\t * left 3x3 portion of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\t/**\n\t * Transposes this matrix into the supplied array, and returns itself unchanged.\n\t *\n\t * @param {Array} r - An array to store the transposed matrix elements.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the UV transform matrix from offset, repeat, rotation, and center.\n\t *\n\t * @param {number} tx - Offset x.\n\t * @param {number} ty - Offset y.\n\t * @param {number} sx - Repeat x.\n\t * @param {number} sy - Repeat y.\n\t * @param {number} rotation - Rotation, in radians. Positive values rotate counterclockwise.\n\t * @param {number} cx - Center x of rotation.\n\t * @param {number} cy - Center y of rotation\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this matrix with the given scalar values.\n\t *\n\t * @param {number} sx - The amount to scale in the X axis.\n\t * @param {number} sy - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this matrix by the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates this matrix by the given scalar values.\n\t *\n\t * @param {number} tx - The amount to translate in the X axis.\n\t * @param {number} ty - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\t/**\n\t * Sets this matrix as a 2D translation transform.\n\t *\n\t * @param {number|Vector2} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y ) {\n\n\t\tif ( x.isVector2 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x.x,\n\t\t\t\t0, 1, x.y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x,\n\t\t\t\t0, 1, y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D rotational transformation.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D scale transform.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix3} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nconst LINEAR_REC709_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4123908, 0.3575843, 0.1804808,\n\t0.2126390, 0.7151687, 0.0721923,\n\t0.0193308, 0.1191948, 0.9505322\n);\n\nconst XYZ_TO_LINEAR_REC709 = /*@__PURE__*/ new Matrix3().set(\n\t3.2409699, -1.5373832, -0.4986108,\n\t-0.9692436, 1.8759675, 0.0415551,\n\t0.0556301, -0.203977, 1.0569715\n);\n\nfunction createColorManagement() {\n\n\tconst ColorManagement = {\n\n\t\tenabled: true,\n\n\t\tworkingColorSpace: LinearSRGBColorSpace,\n\n\t\t/**\n\t\t * Implementations of supported color spaces.\n\t\t *\n\t\t * Required:\n\t\t *\t- primaries: chromaticity coordinates [ rx ry gx gy bx by ]\n\t\t *\t- whitePoint: reference white [ x y ]\n\t\t *\t- transfer: transfer function (pre-defined)\n\t\t *\t- toXYZ: Matrix3 RGB to XYZ transform\n\t\t *\t- fromXYZ: Matrix3 XYZ to RGB transform\n\t\t *\t- luminanceCoefficients: RGB luminance coefficients\n\t\t *\n\t\t * Optional:\n\t\t * - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace, toneMappingMode: 'extended' | 'standard' }\n\t\t * - workingColorSpaceConfig: { unpackColorSpace: ColorSpace }\n\t\t *\n\t\t * Reference:\n\t\t * - https://www.russellcottrell.com/photo/matrixCalculator.htm\n\t\t */\n\t\tspaces: {},\n\n\t\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\t\tif ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\t\treturn color;\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = SRGBToLinear( color.r );\n\t\t\t\tcolor.g = SRGBToLinear( color.g );\n\t\t\t\tcolor.b = SRGBToLinear( color.b );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].primaries !== this.spaces[ targetColorSpace ].primaries ) {\n\n\t\t\t\tcolor.applyMatrix3( this.spaces[ sourceColorSpace ].toXYZ );\n\t\t\t\tcolor.applyMatrix3( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ targetColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = LinearToSRGB( color.r );\n\t\t\t\tcolor.g = LinearToSRGB( color.g );\n\t\t\t\tcolor.b = LinearToSRGB( color.b );\n\n\t\t\t}\n\n\t\t\treturn color;\n\n\t\t},\n\n\t\tworkingToColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\treturn this.convert( color, this.workingColorSpace, targetColorSpace );\n\n\t\t},\n\n\t\tcolorSpaceToWorking: function ( color, sourceColorSpace ) {\n\n\t\t\treturn this.convert( color, sourceColorSpace, this.workingColorSpace );\n\n\t\t},\n\n\t\tgetPrimaries: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].primaries;\n\n\t\t},\n\n\t\tgetTransfer: function ( colorSpace ) {\n\n\t\t\tif ( colorSpace === NoColorSpace ) return LinearTransfer;\n\n\t\t\treturn this.spaces[ colorSpace ].transfer;\n\n\t\t},\n\n\t\tgetToneMappingMode: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.toneMappingMode || 'standard';\n\n\t\t},\n\n\t\tgetLuminanceCoefficients: function ( target, colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn target.fromArray( this.spaces[ colorSpace ].luminanceCoefficients );\n\n\t\t},\n\n\t\tdefine: function ( colorSpaces ) {\n\n\t\t\tObject.assign( this.spaces, colorSpaces );\n\n\t\t},\n\n\t\t// Internal APIs\n\n\t\t_getMatrix: function ( targetMatrix, sourceColorSpace, targetColorSpace ) {\n\n\t\t\treturn targetMatrix\n\t\t\t\t.copy( this.spaces[ sourceColorSpace ].toXYZ )\n\t\t\t\t.multiply( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t},\n\n\t\t_getDrawingBufferColorSpace: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.drawingBufferColorSpace;\n\n\t\t},\n\n\t\t_getUnpackColorSpace: function ( colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].workingColorSpaceConfig.unpackColorSpace;\n\n\t\t},\n\n\t\t// Deprecated\n\n\t\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.workingToColorSpace( color, targetColorSpace );\n\n\t\t},\n\n\t\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.colorSpaceToWorking( color, sourceColorSpace );\n\n\t\t},\n\n\t};\n\n\t/******************************************************************************\n\t * sRGB definitions\n\t */\n\n\tconst REC709_PRIMARIES = [ 0.640, 0.330, 0.300, 0.600, 0.150, 0.060 ];\n\tconst REC709_LUMINANCE_COEFFICIENTS = [ 0.2126, 0.7152, 0.0722 ];\n\tconst D65 = [ 0.3127, 0.3290 ];\n\n\tColorManagement.define( {\n\n\t\t[ LinearSRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: LinearTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\tworkingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace },\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t\t[ SRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: SRGBTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t} );\n\n\treturn ColorManagement;\n\n}\n\nconst ColorManagement = /*@__PURE__*/ createColorManagement();\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nlet _canvas;\n\n/**\n * A class containing utility functions for images.\n *\n * @hideconstructor\n */\nclass ImageUtils {\n\n\t/**\n\t * Returns a data URI containing a representation of the given image.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement)} image - The image object.\n\t * @param {string} [type='image/png'] - Indicates the image format.\n\t * @return {string} The data URI.\n\t */\n\tstatic getDataURL( image, type = 'image/png' ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement === 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\treturn canvas.toDataURL( type );\n\n\t}\n\n\t/**\n\t * Converts the given sRGB image data to linear color space.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement|ImageBitmap|Object)} image - The image object.\n\t * @return {HTMLCanvasElement|Object} The converted image.\n\t */\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nlet _sourceId = 0;\n\n/**\n * Represents the data source of a texture.\n *\n * The main purpose of this class is to decouple the data definition from the texture\n * definition so the same data can be used with multiple texture instances.\n */\nclass Source {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {any} [data=null] - The data definition of a texture.\n\t */\n\tconstructor( data = null ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSource = true;\n\n\t\t/**\n\t\t * The ID of the source.\n\t\t *\n\t\t * @name Source#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _sourceId ++ } );\n\n\t\t/**\n\t\t * The UUID of the source.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The data definition of a texture.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.data = data;\n\n\t\t/**\n\t\t * This property is only relevant when {@link Source#needsUpdate} is set to `true` and\n\t\t * provides more control on how texture data should be processed. When `dataReady` is set\n\t\t * to `false`, the engine performs the memory allocation (if necessary) but does not transfer\n\t\t * the data into the GPU memory.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.dataReady = true;\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Source#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Returns the dimensions of the source into the given target vector.\n\t *\n\t * @param {(Vector2|Vector3)} target - The target object the result is written into.\n\t * @return {(Vector2|Vector3)} The dimensions of the source.\n\t */\n\tgetSize( target ) {\n\n\t\tconst data = this.data;\n\n\t\tif ( ( typeof HTMLVideoElement !== 'undefined' ) && ( data instanceof HTMLVideoElement ) ) {\n\n\t\t\ttarget.set( data.videoWidth, data.videoHeight, 0 );\n\n\t\t} else if ( data instanceof VideoFrame ) {\n\n\t\t\ttarget.set( data.displayHeight, data.displayWidth, 0 );\n\n\t\t} else if ( data !== null ) {\n\n\t\t\ttarget.set( data.width, data.height, data.depth || 0 );\n\n\t\t} else {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * When the property is set to `true`, the engine allocates the memory\n\t * for the texture (if necessary) and triggers the actual texture upload\n\t * to the GPU next time the source is used.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Serializes the source into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized source.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.from( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet _textureId = 0;\n\nconst _tempVec3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Base class for all textures.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments EventDispatcher\n */\nclass Texture extends EventDispatcher {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {?Object} [image=Texture.DEFAULT_IMAGE] - The image holding the texture data.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isTexture = true;\n\n\t\t/**\n\t\t * The ID of the texture.\n\t\t *\n\t\t * @name Texture#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _textureId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The data definition of a texture. A reference to the data source can be\n\t\t * shared across textures. This is often useful in context of spritesheets\n\t\t * where multiple textures render the same data but with different texture\n\t\t * transformations.\n\t\t *\n\t\t * @type {Source}\n\t\t */\n\t\tthis.source = new Source( image );\n\n\t\t/**\n\t\t * An array holding user-defined mipmaps.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.mipmaps = [];\n\n\t\t/**\n\t\t * How the texture is applied to the object. The value `UVMapping`\n\t\t * is the default, where texture or uv coordinates are used to apply the map.\n\t\t *\n\t\t * @type {(UVMapping|CubeReflectionMapping|CubeRefractionMapping|EquirectangularReflectionMapping|EquirectangularRefractionMapping|CubeUVReflectionMapping)}\n\t\t * @default UVMapping\n\t\t*/\n\t\tthis.mapping = mapping;\n\n\t\t/**\n\t\t * Lets you select the uv attribute to map the texture to. `0` for `uv`,\n\t\t * `1` for `uv1`, `2` for `uv2` and `3` for `uv3`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.channel = 0;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *U* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapS = wrapS;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *V* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapT = wrapT;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearFilter\n\t\t */\n\t\tthis.magFilter = magFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearMipmapLinearFilter\n\t\t */\n\t\tthis.minFilter = minFilter;\n\n\t\t/**\n\t\t * The number of samples taken along the axis through the pixel that has the\n\t\t * highest density of texels. By default, this value is `1`. A higher value\n\t\t * gives a less blurry result than a basic mipmap, at the cost of more\n\t\t * texture samples being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.anisotropy = anisotropy;\n\n\t\t/**\n\t\t * The format of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default RGBAFormat\n\t\t */\n\t\tthis.format = format;\n\n\t\t/**\n\t\t * The default internal format is derived from {@link Texture#format} and {@link Texture#type} and\n\t\t * defines how the texture data is going to be stored on the GPU.\n\t\t *\n\t\t * This property allows to overwrite the default format.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.internalFormat = null;\n\n\t\t/**\n\t\t * The data type of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * How much a single repetition of the texture is offset from the beginning,\n\t\t * in each direction U and V. Typical range is `0.0` to `1.0`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.offset = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How many times the texture is repeated across the surface, in each\n\t\t * direction U and V. If repeat is set greater than `1` in either direction,\n\t\t * the corresponding wrap parameter should also be set to `RepeatWrapping`\n\t\t * or `MirroredRepeatWrapping` to achieve the desired tiling effect.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The point around which rotation occurs. A value of `(0.5, 0.5)` corresponds\n\t\t * to the center of the texture. Default is `(0, 0)`, the lower left.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.center = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How much the texture is rotated around the center point, in radians.\n\t\t * Positive values are counter-clockwise.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Whether to update the texture's uv-transformation {@link Texture#matrix}\n\t\t * from the properties {@link Texture#offset}, {@link Texture#repeat},\n\t\t * {@link Texture#rotation}, and {@link Texture#center}.\n\t\t *\n\t\t * Set this to `false` if you are specifying the uv-transform matrix directly.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = true;\n\n\t\t/**\n\t\t * The uv-transformation matrix of the texture.\n\t\t *\n\t\t * @type {Matrix3}\n\t\t */\n\t\tthis.matrix = new Matrix3();\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Set this to `false` if you are creating mipmaps manually.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.generateMipmaps = true;\n\n\t\t/**\n\t\t * If set to `true`, the alpha channel, if present, is multiplied into the\n\t\t * color channels when the texture is uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure premultiply alpha on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultiplyAlpha = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure the flip on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.flipY = true;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t * The allowable values are `1` (byte-alignment), `2` (rows aligned to even-numbered bytes),\n\t\t * `4` (word-alignment), and `8` (rows start on double-word boundaries).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 4\n\t\t */\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t/**\n\t\t * Textures containing color data should be annotated with `SRGBColorSpace` or `LinearSRGBColorSpace`.\n\t\t *\n\t\t * @type {string}\n\t\t * @default NoColorSpace\n\t\t */\n\t\tthis.colorSpace = colorSpace;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the texture. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This can be used to only update a subregion or specific rows of the texture (for example, just the\n\t\t * first 3 rows). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Texture#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * A callback function, called when the texture is updated (e.g., when\n\t\t * {@link Texture#needsUpdate} has been set to true and then the texture is used).\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.onUpdate = null;\n\n\t\t/**\n\t\t * An optional back reference to the textures render target.\n\t\t *\n\t\t * @type {?(RenderTarget|WebGLRenderTarget)}\n\t\t * @default null\n\t\t */\n\t\tthis.renderTarget = null;\n\n\t\t/**\n\t\t * Indicates whether a texture belongs to a render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isRenderTargetTexture = false;\n\n\t\t/**\n\t\t * Indicates if a texture should be handled like a texture array.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isArrayTexture = image && image.depth && image.depth > 1 ? true : false;\n\n\t\t/**\n\t\t * Indicates whether this texture should be processed by `PMREMGenerator` or not\n\t\t * (only relevant for render target textures).\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.pmremVersion = 0;\n\n\t}\n\n\t/**\n\t * The width of the texture in pixels.\n\t */\n\tget width() {\n\n\t\treturn this.source.getSize( _tempVec3 ).x;\n\n\t}\n\n\t/**\n\t * The height of the texture in pixels.\n\t */\n\tget height() {\n\n\t\treturn this.source.getSize( _tempVec3 ).y;\n\n\t}\n\n\t/**\n\t * The depth of the texture in pixels.\n\t */\n\tget depth() {\n\n\t\treturn this.source.getSize( _tempVec3 ).z;\n\n\t}\n\n\t/**\n\t * The image object holding the texture data.\n\t *\n\t * @type {?Object}\n\t */\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value = null ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\t/**\n\t * Updates the texture transformation matrix from the from the properties {@link Texture#offset},\n\t * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data texture to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Returns a new texture with copied values from this instance.\n\t *\n\t * @return {Texture} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given texture to this instance.\n\t *\n\t * @param {Texture} source - The texture to copy.\n\t * @return {Texture} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\t\tthis.channel = source.channel;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.colorSpace = source.colorSpace;\n\n\t\tthis.renderTarget = source.renderTarget;\n\t\tthis.isRenderTargetTexture = source.isRenderTargetTexture;\n\t\tthis.isArrayTexture = source.isArrayTexture;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this texture's properties based on `values`.\n\t * @param {Object} values - A container with texture parameters.\n\t */\n\tsetValues( values ) {\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): property '${ key }' does not exist.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( ( currentValue && newValue ) && ( currentValue.isVector2 && newValue.isVector2 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isVector3 && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isMatrix3 && newValue.isMatrix3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the texture into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized texture.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\t\t\tchannel: this.channel,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\tinternalFormat: this.internalFormat,\n\t\t\ttype: this.type,\n\t\t\tcolorSpace: this.colorSpace,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tgenerateMipmaps: this.generateMipmaps,\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the texture has been disposed of.\n\t\t *\n\t\t * @event Texture#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Transforms the given uv vector with the textures uv transformation matrix.\n\t *\n\t * @param {Vector2} uv - The uv vector.\n\t * @return {Vector2} The transformed uv vector.\n\t */\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the texture\n\t * must be updated in the next render. This triggers a texture upload\n\t * to the GPU and ensures correct texture parameter configuration.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the PMREM\n\t * must be regenerated.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsPMREMUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.pmremVersion ++;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * The default image for all textures.\n *\n * @static\n * @type {?Image}\n * @default null\n */\nTexture.DEFAULT_IMAGE = null;\n\n/**\n * The default mapping for all textures.\n *\n * @static\n * @type {number}\n * @default UVMapping\n */\nTexture.DEFAULT_MAPPING = UVMapping;\n\n/**\n * The default anisotropy value for all textures.\n *\n * @static\n * @type {number}\n * @default 1\n */\nTexture.DEFAULT_ANISOTROPY = 1;\n\n/**\n * Class representing a 4D vector. A 4D vector is an ordered quadruplet of numbers\n * (labeled x, y, z and w), which can be used to represent a number of things, such as:\n *\n * - A point in 4D space.\n * - A direction and length in 4D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0, 0)` to `(x, y, z, w)`\n * and the direction is also measured from `(0, 0, 0, 0)` towards `(x, y, z, w)`.\n * - Any arbitrary ordered quadruplet of numbers.\n *\n * There are other things a 4D vector can be used to represent, however these\n * are the most common uses in *three.js*.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector4( 0, 1, 0, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0, 1)\n * const b = new THREE.Vector4( );\n *\n * const d = a.dot( b );\n * ```\n */\nclass Vector4 {\n\n\t/**\n\t * Constructs a new 4D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t * @param {number} [w=1] - The w value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector4.prototype.isVector4 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t\t/**\n\t\t * The w value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.w = w;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#z}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#w}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @param {number} w - The value of the w component.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's w component to the given value\n\t *\n\t * @param {number} w - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @param {number} value - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector to copy.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector4} v - The vector to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector4} v - The vector to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector4} v - The vector to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\t\tthis.w /= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the quaternion's axis and w to the angle.\n\t *\n\t * @param {Quaternion} q - The Quaternion to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the axis of rotation and w to the angle.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper left 3x3 matrix is a pure rotation matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\t\tthis.w = e[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is less than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the max vector's x, y, z or w\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y, z or w value is less than the min vector's x, y, z or w value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector4} min - The minimum x, y and z values.\n\t * @param {Vector4} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\t\tthis.w = clamp( this.w, min.w, max.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y, z or w values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\t\tthis.w = clamp( this.w, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\t\tthis.w = Math.trunc( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y, z = -z, w = -w.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0, 0) to (x, y, z, w). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector4} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector4} v1 - The first vector.\n\t * @param {Vector4} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector4} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`,\n\t * z value to be `array[ offset + 2 ]`, w value to be `array[ offset + 3 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\n/**\n * A render target is a buffer where the video card draws pixels for a scene\n * that is being rendered in the background. It is used in different effects,\n * such as applying postprocessing to a rendered image before displaying it\n * on the screen.\n *\n * @augments EventDispatcher\n */\nclass RenderTarget extends EventDispatcher {\n\n\t/**\n\t * Render target options.\n\t *\n\t * @typedef {Object} RenderTarget~Options\n\t * @property {boolean} [generateMipmaps=false] - Whether to generate mipmaps or not.\n\t * @property {number} [magFilter=LinearFilter] - The mag filter.\n\t * @property {number} [minFilter=LinearFilter] - The min filter.\n\t * @property {number} [format=RGBAFormat] - The texture format.\n\t * @property {number} [type=UnsignedByteType] - The texture type.\n\t * @property {?string} [internalFormat=null] - The texture's internal format.\n\t * @property {number} [wrapS=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [wrapT=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [anisotropy=1] - The texture's anisotropy value.\n\t * @property {string} [colorSpace=NoColorSpace] - The texture's color space.\n\t * @property {boolean} [depthBuffer=true] - Whether to allocate a depth buffer or not.\n\t * @property {boolean} [stencilBuffer=false] - Whether to allocate a stencil buffer or not.\n\t * @property {boolean} [resolveDepthBuffer=true] - Whether to resolve the depth buffer or not.\n\t * @property {boolean} [resolveStencilBuffer=true] - Whether to resolve the stencil buffer or not.\n\t * @property {?Texture} [depthTexture=null] - Reference to a depth texture.\n\t * @property {number} [samples=0] - The MSAA samples count.\n\t * @property {number} [count=1] - Defines the number of color attachments . Must be at least `1`.\n\t * @property {number} [depth=1] - The texture depth.\n\t * @property {boolean} [multiview=false] - Whether this target is used for multiview rendering.\n\t */\n\n\t/**\n\t * Constructs a new render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper();\n\n\t\toptions = Object.assign( {\n\t\t\tgenerateMipmaps: false,\n\t\t\tinternalFormat: null,\n\t\t\tminFilter: LinearFilter,\n\t\t\tdepthBuffer: true,\n\t\t\tstencilBuffer: false,\n\t\t\tresolveDepthBuffer: true,\n\t\t\tresolveStencilBuffer: true,\n\t\t\tdepthTexture: null,\n\t\t\tsamples: 0,\n\t\t\tcount: 1,\n\t\t\tdepth: 1,\n\t\t\tmultiview: false\n\t\t}, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget = true;\n\n\t\t/**\n\t\t * The width of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * The depth of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.depth = options.depth;\n\n\t\t/**\n\t\t * A rectangular area inside the render target's viewport. Fragments that are\n\t\t * outside the area will be discarded.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\n\t\t/**\n\t\t * Indicates whether the scissor test should be enabled when rendering into\n\t\t * this render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.scissorTest = false;\n\n\t\t/**\n\t\t * A rectangular area representing the render target's viewport.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: options.depth };\n\n\t\tconst texture = new Texture( image );\n\n\t\t/**\n\t\t * An array of textures. Each color attachment is represented as a separate texture.\n\t\t * Has at least a single entry for the default color attachment.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.textures = [];\n\n\t\tconst count = options.count;\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.textures[ i ] = texture.clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t}\n\n\t\tthis._setTextureOptions( options );\n\n\t\t/**\n\t\t * Whether to allocate a depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthBuffer = options.depthBuffer;\n\n\t\t/**\n\t\t * Whether to allocate a stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilBuffer = options.stencilBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveDepthBuffer = options.resolveDepthBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveStencilBuffer = options.resolveStencilBuffer;\n\n\t\tthis._depthTexture = null;\n\t\tthis.depthTexture = options.depthTexture;\n\n\t\t/**\n\t\t * The number of MSAA samples.\n\t\t *\n\t\t * A value of `0` disables MSAA.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.samples = options.samples;\n\n\t\t/**\n\t\t * Whether to this target is used in multiview rendering.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.multiview = options.multiview;\n\n\t}\n\n\t_setTextureOptions( options = {} ) {\n\n\t\tconst values = {\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\tflipY: false,\n\t\t\tinternalFormat: null\n\t\t};\n\n\t\tif ( options.mapping !== undefined ) values.mapping = options.mapping;\n\t\tif ( options.wrapS !== undefined ) values.wrapS = options.wrapS;\n\t\tif ( options.wrapT !== undefined ) values.wrapT = options.wrapT;\n\t\tif ( options.wrapR !== undefined ) values.wrapR = options.wrapR;\n\t\tif ( options.magFilter !== undefined ) values.magFilter = options.magFilter;\n\t\tif ( options.minFilter !== undefined ) values.minFilter = options.minFilter;\n\t\tif ( options.format !== undefined ) values.format = options.format;\n\t\tif ( options.type !== undefined ) values.type = options.type;\n\t\tif ( options.anisotropy !== undefined ) values.anisotropy = options.anisotropy;\n\t\tif ( options.colorSpace !== undefined ) values.colorSpace = options.colorSpace;\n\t\tif ( options.flipY !== undefined ) values.flipY = options.flipY;\n\t\tif ( options.generateMipmaps !== undefined ) values.generateMipmaps = options.generateMipmaps;\n\t\tif ( options.internalFormat !== undefined ) values.internalFormat = options.internalFormat;\n\n\t\tfor ( let i = 0; i < this.textures.length; i ++ ) {\n\n\t\t\tconst texture = this.textures[ i ];\n\t\t\ttexture.setValues( values );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The texture representing the default color attachment.\n\t *\n\t * @type {Texture}\n\t */\n\tget texture() {\n\n\t\treturn this.textures[ 0 ];\n\n\t}\n\n\tset texture( value ) {\n\n\t\tthis.textures[ 0 ] = value;\n\n\t}\n\n\tset depthTexture( current ) {\n\n\t\tif ( this._depthTexture !== null ) this._depthTexture.renderTarget = null;\n\t\tif ( current !== null ) current.renderTarget = this;\n\n\t\tthis._depthTexture = current;\n\n\t}\n\n\t/**\n\t * Instead of saving the depth in a renderbuffer, a texture\n\t * can be used instead which is useful for further processing\n\t * e.g. in context of post-processing.\n\t *\n\t * @type {?DepthTexture}\n\t * @default null\n\t */\n\tget depthTexture() {\n\n\t\treturn this._depthTexture;\n\n\t}\n\n\t/**\n\t * Sets the size of this render target.\n\t *\n\t * @param {number} width - The width.\n\t * @param {number} height - The height.\n\t * @param {number} [depth=1] - The depth.\n\t */\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.textures.length; i < il; i ++ ) {\n\n\t\t\t\tthis.textures[ i ].image.width = width;\n\t\t\t\tthis.textures[ i ].image.height = height;\n\t\t\t\tthis.textures[ i ].image.depth = depth;\n\n\t\t\t\tif ( this.textures[ i ].isData3DTexture !== true ) { // Fix for #31693\n\n\t\t\t\t\t// TODO: Reconsider setting isArrayTexture flag here and in the ctor of Texture.\n\t\t\t\t\t// Maybe a method `isArrayTexture()` or just a getter could replace a flag since\n\t\t\t\t\t// both are evaluated on each call?\n\n\t\t\t\t\tthis.textures[ i ].isArrayTexture = this.textures[ i ].image.depth > 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\t/**\n\t * Returns a new render target with copied values from this instance.\n\t *\n\t * @return {RenderTarget} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the settings of the given render target. This is a structural copy so\n\t * no resources are shared between render targets after the copy. That includes\n\t * all MRT textures and the depth texture.\n\t *\n\t * @param {RenderTarget} source - The render target to copy.\n\t * @return {RenderTarget} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.scissor.copy( source.scissor );\n\t\tthis.scissorTest = source.scissorTest;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.textures.length = 0;\n\n\t\tfor ( let i = 0, il = source.textures.length; i < il; i ++ ) {\n\n\t\t\tthis.textures[ i ] = source.textures[ i ].clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t\t// ensure image object is not shared, see #20328\n\n\t\t\tconst image = Object.assign( {}, source.textures[ i ].image );\n\t\t\tthis.textures[ i ].source = new Source( image );\n\n\t\t}\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tthis.resolveDepthBuffer = source.resolveDepthBuffer;\n\t\tthis.resolveStencilBuffer = source.resolveStencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires RenderTarget#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\n/**\n * A render target used in context of {@link WebGLRenderer}.\n *\n * @augments RenderTarget\n */\nclass WebGLRenderTarget extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderTarget = true;\n\n\t}\n\n}\n\n/**\n * Creates an array of textures directly from raw buffer data.\n *\n * @augments Texture\n */\nclass DataArrayTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataArrayTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire data texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * An array render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new array render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Creates a three-dimensional texture from raw data, with parameters to\n * divide it into width, height, and depth.\n *\n * @augments Texture\n */\nclass Data3DTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in Data3DTexture directly.\n\t\t//\n\t\t//\tconst texture = new THREE.Data3DTexture( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isData3DTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\n/**\n * A 3D render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 3D space.\n */\nclass Box3 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector3} [min=(Infinity,Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector3} [max=(-Infinity,-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox3 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector3} min - The lower boundary of the box.\n\t * @param {Vector3} max - The upper boundary of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} array - An array holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromArray( array ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromArray( array, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromBufferAttribute( attribute, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} points - An array holding 3D position data as instances of {@link Vector3}.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector3} center - The center of the box.\n\t * @param {Vector3} size - The x, y and z dimensions of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the world-axis-aligned bounding box for the given 3D object\n\t * (including its children), accounting for the object's, and children's,\n\t * world transforms. The function may result in a larger box than strictly necessary.\n\t *\n\t * @param {Object3D} object - The 3D object to compute the bounding box for.\n\t * @param {boolean} [precise=false] - If set to `true`, the method computes the smallest\n\t * world-axis-aligned bounding box at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box3} box - The box to copy.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector3} point - The point that should be included by the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions. The depth of this box will be\n\t * expanded by the z component of the vector in both directions.\n\t *\n\t * @param {Vector3} vector - The vector that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given 3D object and\n\t * its children, accounting for the object's, and children's, world\n\t * transforms. The function may result in a larger box than strictly\n\t * necessary (unless the precise parameter is set to true).\n\t *\n\t * @param {Object3D} object - The 3D object that should expand the bounding box.\n\t * @param {boolean} precise - If set to `true`, the method expands the bounding box\n\t * as little as necessary at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t// precise AABB computation based on vertex data requires at least a position attribute.\n\t\t\t// instancing isn't supported so far and uses the normal (conservative) code path.\n\n\t\t\tif ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( object.isMesh === true ) {\n\n\t\t\t\t\t\tobject.getVertexPosition( i, _vector$b );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_vector$b.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_vector$b.applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.boundingBox !== undefined ) {\n\n\t\t\t\t\t// object-level bounding box\n\n\t\t\t\t\tif ( object.boundingBox === null ) {\n\n\t\t\t\t\t\tobject.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( object.boundingBox );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// geometry-level bounding box\n\n\t\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( geometry.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\t_box$4.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y &&\n\t\t\tpoint.z >= this.min.z && point.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width, height and depth.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A point as a proportion of this box's width, height and depth.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y &&\n\t\t\tbox.max.z >= this.min.z && box.min.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with this bounding box.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with this bounding box.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given plane intersects with this bounding box.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether the given plane intersects with this bounding box.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given triangle intersects with this bounding box.\n\t *\n\t * @param {Triangle} triangle - The triangle to test.\n\t * @return {boolean} Whether the given triangle intersects with this bounding box.\n\t */\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$4.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$4, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$4 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents );\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector3} point - The point to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$b ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Returns a bounding sphere that encloses this bounding box.\n\t *\n\t * @param {Sphere} target - The target sphere that is used to store the method's result.\n\t * @return {Sphere} The bounding sphere that encloses this bounding box.\n\t */\n\tgetBoundingSphere( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\ttarget.makeEmpty();\n\n\t\t} else {\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box3} box - The bounding box to intersect with.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box3} box - The bounding box that will be unioned with this instance.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this bounding box by the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 3D space.\n\t *\n\t * @param {Vector3} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box3} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tmin: this.min.toArray(),\n\t\t\tmax: this.max.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @param {Object} json - The serialized json to set the box from.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.min.fromArray( json.min );\n\t\tthis.max.fromArray( json.max );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$4 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$4 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$3 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical 3D sphere defined by a center and radius. This class is mainly\n * used as a Bounding Sphere for 3D objects.\n */\nclass Sphere {\n\n\t/**\n\t * Constructs a new sphere.\n\t *\n\t * @param {Vector3} [center=(0,0,0)] - The center of the sphere\n\t * @param {number} [radius=-1] - The radius of the sphere.\n\t */\n\tconstructor( center = new Vector3(), radius = -1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphere = true;\n\n\t\t/**\n\t\t * The center of the sphere\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.center = center;\n\n\t\t/**\n\t\t * The radius of the sphere.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.radius = radius;\n\n\t}\n\n\t/**\n\t * Sets the sphere's components by copying the given values.\n\t *\n\t * @param {Vector3} center - The center.\n\t * @param {number} radius - The radius.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the minimum bounding sphere for list of points.\n\t * If the optional center point is given, it is used as the sphere's\n\t * center. Otherwise, the center of the axis-aligned bounding box\n\t * encompassing the points is calculated.\n\t *\n\t * @param {Array} points - A list of points in 3D space.\n\t * @param {Vector3} [optionalCenter] - The center of the sphere.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$3.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given sphere to this instance.\n\t *\n\t * @param {Sphere} sphere - The sphere to copy.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the sphere is empty (the radius set to a negative number).\n\t *\n\t * Spheres with a radius of `0` contain only their center point and are not\n\t * considered to be empty.\n\t *\n\t * @return {boolean} Whether this sphere is empty or not.\n\t */\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\t/**\n\t * Makes this sphere empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = -1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere contains the given point inclusive of\n\t * the surface of the sphere.\n\t *\n\t * @param {Vector3} point - The point to check.\n\t * @return {boolean} Whether this sphere contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\t/**\n\t * Returns the closest distance from the boundary of the sphere to the\n\t * given point. If the sphere contains the point, the distance will\n\t * be negative.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The distance to the point.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test.\n\t * @return {boolean} Whether this sphere intersects with the given one or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to test.\n\t * @return {boolean} Whether this sphere intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether this sphere intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\t/**\n\t * Clamps a point within the sphere. If the point is outside the sphere, it\n\t * will clamp it to the closest point on the edge of the sphere. Points\n\t * already inside the sphere will not be affected.\n\t *\n\t * @param {Vector3} point - The plane to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a bounding box that encloses this sphere.\n\t *\n\t * @param {Box3} target - The target box that is used to store the method's result.\n\t * @return {Box3} The bounding box that encloses this sphere.\n\t */\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Transforms this sphere with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the sphere's center by the given offset.\n\t *\n\t * @param {Vector3} offset - The offset.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this sphere to include the given point.\n\t *\n\t * @param {Vector3} point - The point to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1$6.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1$6.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1$6, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this sphere to enclose both the original sphere and the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere is equal with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test for equality.\n\t * @return {boolean} Whether this bounding sphere is equal with the given one.\n\t */\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\t/**\n\t * Returns a new sphere with copied values from this instance.\n\t *\n\t * @return {Sphere} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tradius: this.radius,\n\t\t\tcenter: this.center.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @param {Object} json - The serialized json to set the sphere from.\n\t * @return {Box3} A reference to this bounding sphere.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.radius = json.radius;\n\t\tthis.center.fromArray( json.center );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A ray that emits from an origin in a certain direction. The class is used by\n * {@link Raycaster} to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3D space the mouse is over)\n * amongst other things.\n */\nclass Ray {\n\n\t/**\n\t * Constructs a new ray.\n\t *\n\t * @param {Vector3} [origin=(0,0,0)] - The origin of the ray.\n\t * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray.\n\t */\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, -1 ) ) {\n\n\t\t/**\n\t\t * The origin of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.origin = origin;\n\n\t\t/**\n\t\t * The (normalized) direction of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.direction = direction;\n\n\t}\n\n\t/**\n\t * Sets the ray's components by copying the given values.\n\t *\n\t * @param {Vector3} origin - The origin.\n\t * @param {Vector3} direction - The direction.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given ray to this instance.\n\t *\n\t * @param {Ray} ray - The ray to copy.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector that is located at a given distance along this ray.\n\t *\n\t * @param {number} t - The distance along the ray to retrieve a position for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A position on the ray.\n\t */\n\tat( t, target ) {\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, t );\n\n\t}\n\n\t/**\n\t * Adjusts the direction of the ray to point at the given vector in world space.\n\t *\n\t * @param {Vector3} v - The target position.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Shift the origin of this ray along its direction by the given distance.\n\t *\n\t * @param {number} t - The distance along the ray to interpolate.\n\t * @return {Ray} A reference to this ray.\n\t */\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the point along this ray that is closest to the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to get the closet location on the ray for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on this ray.\n\t */\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t}\n\n\t/**\n\t * Returns the distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the squared distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\t/**\n\t * Returns the squared distance between this ray and the given line segment.\n\t *\n\t * @param {Vector3} v0 - The start point of the line segment.\n\t * @param {Vector3} v1 - The end point of the line segment.\n\t * @param {Vector3} [optionalPointOnRay] - When provided, it receives the point on this ray that is closest to the segment.\n\t * @param {Vector3} [optionalPointOnSegment] - When provided, it receives the point on the line segment that is closest to this ray.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given sphere, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if t1 is behind the ray - if so, return null\n\t\tif ( t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @return {boolean} Whether this ray intersects with the given sphere or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tif ( sphere.radius < 0 ) return false; // handle empty spheres, see #31187\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray\n\t * does not intersect with the plane.\n\t *\n\t * @param {Plane} plane - The plane to compute the distance to.\n\t * @return {?number} Whether this ray intersects with the given sphere or not.\n\t */\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given plane, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @return {boolean} Whether this ray intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given bounding box, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\t\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this ray intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given triangle, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Vector3} a - The first vertex of the triangle.\n\t * @param {Vector3} b - The second vertex of the triangle.\n\t * @param {Vector3} c - The third vertex of the triangle.\n\t * @param {boolean} backfaceCulling - Whether to use backface culling or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = -1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\t/**\n\t * Transforms this ray with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The transformation matrix.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray is equal with the given one.\n\t *\n\t * @param {Ray} ray - The ray to test for equality.\n\t * @return {boolean} Whether this ray is equal with the given one.\n\t */\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\t/**\n\t * Returns a new ray with copied values from this instance.\n\t *\n\t * @return {Ray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 4x4 matrix.\n *\n * The most common use of a 4x4 matrix in 3D computer graphics is as a transformation matrix.\n * For an introduction to transformation matrices as used in WebGL, check out [this tutorial](https://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices)\n *\n * This allows a 3D vector representing a point in 3D space to undergo\n * transformations such as translation, rotation, shear, scale, reflection,\n * orthogonal or perspective projection and so on, by being multiplied by the\n * matrix. This is known as `applying` the matrix to the vector.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix4();\n * m.set( 11, 12, 13, 14,\n * 21, 22, 23, 24,\n * 31, 32, 33, 34,\n * 41, 42, 43, 44 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31, 41,\n * 12, 22, 32, 42,\n * 13, 23, 33, 43,\n * 14, 24, 34, 44 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix4 {\n\n\t/**\n\t * Constructs a new 4x4 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 4x4 identity matrix.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix4} m - The matrix to copy.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the translation component of the given matrix\n\t * into this matrix's translation component.\n\t *\n\t * @param {Matrix4} m - The matrix to copy the translation component.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given basis vectors to this matrix.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the rotation component of the given matrix\n\t * into this matrix's rotation component.\n\t *\n\t * Note: This method does not support reflection matrices.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractRotation( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component (the upper left 3x3 matrix) of this matrix to\n\t * the rotation specified by the given Euler angles. The rest of\n\t * the matrix is set to the identity. Depending on the {@link Euler#order},\n\t * there are six possible outcomes. See [this page](https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix)\n\t * for a complete list.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component of this matrix to the rotation specified by\n\t * the given Quaternion as outlined [here](https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion)\n\t * The rest of the matrix is set to the identity.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\t/**\n\t * Sets the rotation component of the transformation matrix, looking from `eye` towards\n\t * `target`, and oriented by the up-direction.\n\t *\n\t * @param {Vector3} eye - The eye vector.\n\t * @param {Vector3} target - The target vector.\n\t * @param {Vector3} up - The up vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 4x4 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix4} a - The first matrix.\n\t * @param {Matrix4} b - The second matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * Based on the method outlined [here](http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html).\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the position component for this matrix from the given vector,\n\t * without affecting the rest of the matrix.\n\t *\n\t * @param {number|Vector3} x - The x component of the vector or alternatively the vector object.\n\t * @param {number} y - The y component of the vector.\n\t * @param {number} z - The z component of the vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the columns of this matrix by the given vector.\n\t *\n\t * @param {Vector3} v - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the maximum scale value of the three axes.\n\t *\n\t * @return {number} The maximum scale.\n\t */\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\t/**\n\t * Sets this matrix as a translation transform from the given vector.\n\t *\n\t * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @param {number} z - The amount to translate in the z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the X axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Y axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Z axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the given axis by\n\t * the given angle.\n\t *\n\t * This is a somewhat controversial but mathematically sound alternative to\n\t * rotating via Quaternions. See the discussion [here](https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199).\n\t *\n\t * @param {Vector3} axis - The normalized rotation axis.\n\t * @param {number} angle - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a scale transformation.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @param {number} z - The amount to scale in the Z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a shear transformation.\n\t *\n\t * @param {number} xy - The amount to shear X by Y.\n\t * @param {number} xz - The amount to shear X by Z.\n\t * @param {number} yx - The amount to shear Y by X.\n\t * @param {number} yz - The amount to shear Y by Z.\n\t * @param {number} zx - The amount to shear Z by X.\n\t * @param {number} zy - The amount to shear Z by Y.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the transformation composed of the given position,\n\t * rotation (Quaternion) and scale.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Decomposes this matrix into its position, rotation and scale components\n\t * and provides the result in the given objects.\n\t *\n\t * Note: Not all matrices are decomposable in this way. For example, if an\n\t * object has a non-uniformly scaled parent, then the object's world matrix\n\t * may not be decomposable, and this method may not be appropriate.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$2.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$2.elements[ 0 ] *= invSX;\n\t\t_m1$2.elements[ 1 ] *= invSX;\n\t\t_m1$2.elements[ 2 ] *= invSX;\n\n\t\t_m1$2.elements[ 4 ] *= invSY;\n\t\t_m1$2.elements[ 5 ] *= invSY;\n\t\t_m1$2.elements[ 6 ] *= invSY;\n\n\t\t_m1$2.elements[ 8 ] *= invSZ;\n\t\t_m1$2.elements[ 9 ] *= invSZ;\n\t\t_m1$2.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$2 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a perspective projection matrix. This is used internally by\n\t * {@link PerspectiveCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = near / ( far - near );\n\t\t\td = ( far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\t\td = ( -2 * far * near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = - far / ( far - near );\n\t\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a; \tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b; \tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c; \tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = -1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a orthographic projection matrix. This is used internally by\n\t * {@link OrthographicCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 / ( right - left );\n\t\tconst y = 2 / ( top - bottom );\n\n\t\tconst a = - ( right + left ) / ( right - left );\n\t\tconst b = - ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = 1 / ( far - near );\n\t\t\td = far / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = -2 / ( far - near );\n\t\t\t\td = - ( far + near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = -1 / ( far - near );\n\t\t\t\td = - near / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\t\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = a;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = y;\t\tte[ 9 ] = 0; \t\tte[ 13 ] = b;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = c;\t\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix4} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$2 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\n/**\n * A class representing Euler angles.\n *\n * Euler angles describe a rotational transformation by rotating an object on\n * its various axes in specified amounts per axis, and a specified axis\n * order.\n *\n * Iterating through an instance will yield its components (x, y, z,\n * order) in the corresponding order.\n *\n * ```js\n * const a = new THREE.Euler( 0, 1, 1.57, 'XYZ' );\n * const b = new THREE.Vector3( 1, 0, 1 );\n * b.applyEuler(a);\n * ```\n */\nclass Euler {\n\n\t/**\n\t * Constructs a new euler instance.\n\t *\n\t * @param {number} [x=0] - The angle of the x axis in radians.\n\t * @param {number} [y=0] - The angle of the y axis in radians.\n\t * @param {number} [z=0] - The angle of the z axis in radians.\n\t * @param {string} [order=Euler.DEFAULT_ORDER] - A string representing the order that the rotations are applied.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\t/**\n\t * The angle of the x axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the y axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the z axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * A string representing the order that the rotations are applied.\n\t *\n\t * @type {string}\n\t * @default 'XYZ'\n\t */\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the Euler components.\n\t *\n\t * @param {number} x - The angle of the x axis in radians.\n\t * @param {number} y - The angle of the y axis in radians.\n\t * @param {number} z - The angle of the z axis in radians.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new Euler instance with copied values from this instance.\n\t *\n\t * @return {Euler} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\t/**\n\t * Copies the values of the given Euler instance to this instance.\n\t *\n\t * @param {Euler} euler - The Euler instance to copy.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a pure rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\twarn( 'Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a normalized quaternion.\n\t *\n\t * @param {Quaternion} q - A normalized Quaternion.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$2.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$2, order, update );\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from the given vector.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\t/**\n\t * Resets the euler angle with a new order by creating a quaternion from this\n\t * euler angle and then setting this euler angle with the quaternion and the\n\t * new order.\n\t *\n\t * Warning: This discards revolution information.\n\t *\n\t * @param {string} [newOrder] - A string representing the new order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\treorder( newOrder ) {\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\t/**\n\t * Returns `true` if this Euler instance is equal with the given one.\n\t *\n\t * @param {Euler} euler - The Euler instance to test for equality.\n\t * @return {boolean} Whether this Euler instance is equal with the given one.\n\t */\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\t/**\n\t * Sets this Euler instance's components to values from the given array. The first three\n\t * entries of the array are assign to the x,y and z components. An optional fourth entry\n\t * defines the Euler order.\n\t *\n\t * @param {Array} array - An array holding the Euler component values.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this Euler instance to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the Euler components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The Euler components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\n/**\n * The default Euler angle order.\n *\n * @static\n * @type {string}\n * @default 'XYZ'\n */\nEuler.DEFAULT_ORDER = 'XYZ';\n\n/**\n * A layers object assigns an 3D object to 1 or more of 32\n * layers numbered `0` to `31` - internally the layers are stored as a\n * bit mask], and by default all 3D objects are a member of layer `0`.\n *\n * This can be used to control visibility - an object must share a layer with\n * a camera to be visible when that camera's view is\n * rendered.\n *\n * All classes that inherit from {@link Object3D} have an `layers` property which\n * is an instance of this class.\n */\nclass Layers {\n\n\t/**\n\t * Constructs a new layers instance, with membership\n\t * initially set to layer `0`.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A bit mask storing which of the 32 layers this layers object is currently\n\t\t * a member of.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\t/**\n\t * Sets membership to the given layer, and remove membership all other layers.\n\t *\n\t * @param {number} layer - The layer to set.\n\t */\n\tset( layer ) {\n\n\t\tthis.mask = ( 1 << layer | 0 ) >>> 0;\n\n\t}\n\n\t/**\n\t * Adds membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tenable( layer ) {\n\n\t\tthis.mask |= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Adds membership to all layers.\n\t */\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\t/**\n\t * Toggles the membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to toggle.\n\t */\n\ttoggle( layer ) {\n\n\t\tthis.mask ^= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Removes membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tdisable( layer ) {\n\n\t\tthis.mask &= ~ ( 1 << layer | 0 );\n\n\t}\n\n\t/**\n\t * Removes the membership from all layers.\n\t */\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if this and the given layers object have at least one\n\t * layer in common.\n\t *\n\t * @param {Layers} layers - The layers to test.\n\t * @return {boolean } Whether this and the given layers object have at least one layer in common or not.\n\t */\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given layer is enabled.\n\t *\n\t * @param {number} layer - The layer to test.\n\t * @return {boolean } Whether the given layer is enabled or not.\n\t */\n\tisEnabled( layer ) {\n\n\t\treturn ( this.mask & ( 1 << layer | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\n/**\n * Fires when the object has been added to its parent object.\n *\n * @event Object3D#added\n * @type {Object}\n */\nconst _addedEvent = { type: 'added' };\n\n/**\n * Fires when the object has been removed from its parent object.\n *\n * @event Object3D#removed\n * @type {Object}\n */\nconst _removedEvent = { type: 'removed' };\n\n/**\n * Fires when a new child object has been added.\n *\n * @event Object3D#childadded\n * @type {Object}\n */\nconst _childaddedEvent = { type: 'childadded', child: null };\n\n/**\n * Fires when a child object has been removed.\n *\n * @event Object3D#childremoved\n * @type {Object}\n */\nconst _childremovedEvent = { type: 'childremoved', child: null };\n\n/**\n * This is the base class for most objects in three.js and provides a set of\n * properties and methods for manipulating objects in 3D space.\n *\n * @augments EventDispatcher\n */\nclass Object3D extends EventDispatcher {\n\n\t/**\n\t * Constructs a new 3D object.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isObject3D = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name Object3D#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Object3D';\n\n\t\t/**\n\t\t * A reference to the parent object.\n\t\t *\n\t\t * @type {?Object3D}\n\t\t * @default null\n\t\t */\n\t\tthis.parent = null;\n\n\t\t/**\n\t\t * An array holding the child 3D objects of this instance.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.children = [];\n\n\t\t/**\n\t\t * Defines the `up` direction of the 3D object which influences\n\t\t * the orientation via methods like {@link Object3D#lookAt}.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_UP`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * Represents the object's local position.\n\t\t\t *\n\t\t\t * @name Object3D#position\n\t\t\t * @type {Vector3}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Euler angles, in radians.\n\t\t\t *\n\t\t\t * @name Object3D#rotation\n\t\t\t * @type {Euler}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Quaternions.\n\t\t\t *\n\t\t\t * @name Object3D#quaternion\n\t\t\t * @type {Quaternion}\n\t\t\t */\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local scale.\n\t\t\t *\n\t\t\t * @name Object3D#scale\n\t\t\t * @type {Vector3}\n\t\t\t * @default (1,1,1)\n\t\t\t */\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's model-view matrix.\n\t\t\t *\n\t\t\t * @name Object3D#modelViewMatrix\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's normal matrix.\n\t\t\t *\n\t\t\t * @name Object3D#normalMatrix\n\t\t\t * @type {Matrix3}\n\t\t\t */\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in local space.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in world space.\n\t\t * If the 3D object has no parent, then it's identical to the local transformation matrix\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the local matrix from position,\n\t\t * rotation and scale every frame.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the world matrix from the current local\n\t\t * matrix and the object's transformation hierarchy.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\n\t\t/**\n\t\t * When set to `true`, it calculates the world matrix in that frame and resets this property\n\t\t * to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t/**\n\t\t * The layer membership of the 3D object. The 3D object is only visible if it has\n\t\t * at least one layer in common with the camera in use. This property can also be\n\t\t * used to filter out unwanted objects in ray-intersection tests when using {@link Raycaster}.\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered into shadow maps.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.castShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is affected by shadows in the scene.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.receiveShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is honored by view frustum culling.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.frustumCulled = true;\n\n\t\t/**\n\t\t * This value allows the default rendering order of scene graph objects to be\n\t\t * overridden although opaque and transparent objects remain sorted independently.\n\t\t * When this property is set for an instance of {@link Group},all descendants\n\t\t * objects will be sorted and rendered together. Sorting is from lowest to highest\n\t\t * render order.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderOrder = 0;\n\n\t\t/**\n\t\t * An array holding the animation clips of the 3D object.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.animations = [];\n\n\t\t/**\n\t\t * Custom depth material to be used when rendering to the depth map. Can only be used\n\t\t * in context of meshes. When shadow-casting with a {@link DirectionalLight} or {@link SpotLight},\n\t\t * if you are modifying vertex positions in the vertex shader you must specify a custom depth\n\t\t * material for proper shadows.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDepthMaterial = undefined;\n\n\t\t/**\n\t\t * Same as {@link Object3D#customDepthMaterial}, but used with {@link PointLight}.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDistanceMaterial = undefined;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the 3D object. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * Applies the given transformation matrix to the object and updates the object's position,\n\t * rotation and scale.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\t/**\n\t * Applies a rotation represented by given the quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as an axis/angle couple to the 3D object.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t */\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as Euler angles to the 3D object.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t */\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as rotation matrix to the 3D object.\n\t *\n\t * @param {Matrix4} m - Although a 4x4 matrix is expected, the upper 3x3 portion must be\n\t * a pure rotation matrix (i.e, unscaled).\n\t */\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as a Quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The Quaternion\n\t */\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in world space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its X axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Y axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Z axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along the given axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its X-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Y-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Z-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's local space to world space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's word space to local space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\t/**\n\t * Rotates the object to face a point in world space.\n\t *\n\t * This method does not support objects having non-uniformly-scaled parent(s).\n\t *\n\t * @param {number|Vector3} x - The x coordinate in world space. Alternatively, a vector representing a position in world space\n\t * @param {number} [y] - The y coordinate in world space.\n\t * @param {number} [z] - The z coordinate in world space.\n\t */\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child to this 3D object. An arbitrary number of\n\t * objects may be added. Any current parent on an object passed in here will be\n\t * removed, since an object can have at most one parent.\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to add.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\terror( 'Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tobject.removeFromParent();\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t\t_childaddedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t\t_childaddedEvent.child = null;\n\n\t\t} else {\n\n\t\t\terror( 'Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given 3D object as child from this 3D object.\n\t * An arbitrary number of objects may be removed.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @param {Object3D} object - The 3D object to remove.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== -1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t\t_childremovedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childremovedEvent );\n\t\t\t_childremovedEvent.child = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes this 3D object from its current parent.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes all child objects.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tclear() {\n\n\t\treturn this.remove( ... this.children );\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child of this 3D object, while maintaining the object's world\n\t * transform. This method does not support scene graphs having non-uniformly-scaled nodes(s).\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to attach.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tobject.removeFromParent();\n\t\tobject.parent = this;\n\t\tthis.children.push( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t_childaddedEvent.child = object;\n\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t_childaddedEvent.child = null;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching ID.\n\t *\n\t * @param {number} id - The id.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching name.\n\t *\n\t * @param {string} name - The name.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns all 3D objects with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @param {Array} result - The method stores the result in this array.\n\t * @return {Array} The found 3D objects.\n\t */\n\tgetObjectsByProperty( name, value, result = [] ) {\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].getObjectsByProperty( name, value, result );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the position of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's position in world space.\n\t */\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Returns a Quaternion representing the position of the 3D object in world space.\n\t *\n\t * @param {Quaternion} target - The target Quaternion the result is stored to.\n\t * @return {Quaternion} The 3D object's rotation in world space.\n\t */\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the scale of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's scale in world space.\n\t */\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\t/**\n\t * Abstract method to get intersections between a casted ray and this\n\t * 3D object. Renderable 3D objects such as {@link Mesh}, {@link Line} or {@link Points}\n\t * implement this method in order to use raycasting.\n\t *\n\t * @abstract\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - An array holding the result of the method.\n\t */\n\traycast( /* raycaster, intersects */ ) {}\n\n\t/**\n\t * Executes the callback on this 3D object and all descendants.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for visible 3D objects.\n\t * Descendants of invisible 3D objects are not traversed.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for all ancestors.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in local space by computing it from the current\n\t * position, rotation and scale values.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in world space of this 3D objects and its descendants.\n\t *\n\t * To ensure correct results, this method also recomputes the 3D object's transformation matrix in\n\t * local space. The computation of the local and world matrix can be controlled with the\n\t * {@link Object3D#matrixAutoUpdate} and {@link Object3D#matrixWorldAutoUpdate} flags which are both\n\t * `true` by default. Set these flags to `false` if you need more control over the update matrix process.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even\n\t * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.\n\t */\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// make sure descendants are updated if required\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tchild.updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * An alternative version of {@link Object3D#updateMatrixWorld} with more control over the\n\t * update of ancestor and descendant nodes.\n\t *\n\t * @param {boolean} [updateParents=false] Whether ancestor nodes should be updated or not.\n\t * @param {boolean} [updateChildren=false] Whether descendant nodes should be updated or not.\n\t */\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// make sure descendants are updated\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the 3D object into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized 3D object.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\t\tobject.up = this.up.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\tif ( this.isBatchedMesh ) {\n\n\t\t\tobject.type = 'BatchedMesh';\n\t\t\tobject.perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\t\tobject.sortObjects = this.sortObjects;\n\n\t\t\tobject.drawRanges = this._drawRanges;\n\t\t\tobject.reservedRanges = this._reservedRanges;\n\n\t\t\tobject.geometryInfo = this._geometryInfo.map( info => ( {\n\t\t\t\t...info,\n\t\t\t\tboundingBox: info.boundingBox ? info.boundingBox.toJSON() : undefined,\n\t\t\t\tboundingSphere: info.boundingSphere ? info.boundingSphere.toJSON() : undefined\n\t\t\t} ) );\n\t\t\tobject.instanceInfo = this._instanceInfo.map( info => ( { ...info } ) );\n\n\t\t\tobject.availableInstanceIds = this._availableInstanceIds.slice();\n\t\t\tobject.availableGeometryIds = this._availableGeometryIds.slice();\n\n\t\t\tobject.nextIndexStart = this._nextIndexStart;\n\t\t\tobject.nextVertexStart = this._nextVertexStart;\n\t\t\tobject.geometryCount = this._geometryCount;\n\n\t\t\tobject.maxInstanceCount = this._maxInstanceCount;\n\t\t\tobject.maxVertexCount = this._maxVertexCount;\n\t\t\tobject.maxIndexCount = this._maxIndexCount;\n\n\t\t\tobject.geometryInitialized = this._geometryInitialized;\n\n\t\t\tobject.matricesTexture = this._matricesTexture.toJSON( meta );\n\n\t\t\tobject.indirectTexture = this._indirectTexture.toJSON( meta );\n\n\t\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\t\tobject.colorsTexture = this._colorsTexture.toJSON( meta );\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tobject.boundingSphere = this.boundingSphere.toJSON();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tobject.boundingBox = this.boundingBox.toJSON();\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new 3D object with copied values from this instance.\n\t *\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are also cloned.\n\t * @return {Object3D} A clone of this instance.\n\t */\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\t/**\n\t * Copies the values of the given 3D object to this instance.\n\t *\n\t * @param {Object3D} source - The 3D object to copy.\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are cloned.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\tthis.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.animations = source.animations.slice();\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * The default up direction for objects, also used as the default\n * position for {@link DirectionalLight} and {@link HemisphereLight}.\n *\n * @static\n * @type {Vector3}\n * @default (0,1,0)\n */\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\n\n/**\n * The default setting for {@link Object3D#matrixAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\n\n/**\n * The default setting for {@link Object3D#matrixWorldAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$2 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nconst _v40 = /*@__PURE__*/ new Vector4();\nconst _v41 = /*@__PURE__*/ new Vector4();\nconst _v42 = /*@__PURE__*/ new Vector4();\n\n/**\n * A geometric triangle as defined by three vectors representing its three corners.\n */\nclass Triangle {\n\n\t/**\n\t * Constructs a new triangle.\n\t *\n\t * @param {Vector3} [a=(0,0,0)] - The first corner of the triangle.\n\t * @param {Vector3} [b=(0,0,0)] - The second corner of the triangle.\n\t * @param {Vector3} [c=(0,0,0)] - The third corner of the triangle.\n\t */\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\t/**\n\t\t * The first corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.a = a;\n\n\t\t/**\n\t\t * The second corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.b = b;\n\n\t\t/**\n\t\t * The third corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.c = c;\n\n\t}\n\n\t/**\n\t * Computes the normal vector of a triangle.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\t// if the triangle is degenerate then we can't contain a point\n\t\tif ( this.getBarycoord( point, a, b, c, _v3$2 ) === null ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn ( _v3$2.x >= 0 ) && ( _v3$2.y >= 0 ) && ( ( _v3$2.x + _v3$2.y ) <= 1 );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} p1 - The first corner of the triangle.\n\t * @param {Vector3} p2 - The second corner of the triangle.\n\t * @param {Vector3} p3 - The third corner of the triangle.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tstatic getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {\n\n\t\tif ( this.getBarycoord( point, p1, p2, p3, _v3$2 ) === null ) {\n\n\t\t\ttarget.x = 0;\n\t\t\ttarget.y = 0;\n\t\t\tif ( 'z' in target ) target.z = 0;\n\t\t\tif ( 'w' in target ) target.w = 0;\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( v1, _v3$2.x );\n\t\ttarget.addScaledVector( v2, _v3$2.y );\n\t\ttarget.addScaledVector( v3, _v3$2.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given attribute and indices.\n\t *\n\t * @param {BufferAttribute} attr - The attribute to interpolate.\n\t * @param {number} i1 - Index of first vertex.\n\t * @param {number} i2 - Index of second vertex.\n\t * @param {number} i3 - Index of third vertex.\n\t * @param {Vector3} barycoord - The barycoordinate value to use to interpolate.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The interpolated attribute value.\n\t */\n\tstatic getInterpolatedAttribute( attr, i1, i2, i3, barycoord, target ) {\n\n\t\t_v40.setScalar( 0 );\n\t\t_v41.setScalar( 0 );\n\t\t_v42.setScalar( 0 );\n\n\t\t_v40.fromBufferAttribute( attr, i1 );\n\t\t_v41.fromBufferAttribute( attr, i2 );\n\t\t_v42.fromBufferAttribute( attr, i3 );\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( _v40, barycoord.x );\n\t\ttarget.addScaledVector( _v41, barycoord.y );\n\t\ttarget.addScaledVector( _v42, barycoord.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given values.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given array values.\n\t *\n\t * @param {Array} points - An array with 3D points.\n\t * @param {number} i0 - The array index representing the first corner of the triangle.\n\t * @param {number} i1 - The array index representing the second corner of the triangle.\n\t * @param {number} i2 - The array index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given attribute values.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute with 3D points data.\n\t * @param {number} i0 - The attribute index representing the first corner of the triangle.\n\t * @param {number} i1 - The attribute index representing the second corner of the triangle.\n\t * @param {number} i2 - The attribute index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new triangle with copied values from this instance.\n\t *\n\t * @return {Triangle} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given triangle to this instance.\n\t *\n\t * @param {Triangle} triangle - The triangle to copy.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the area of the triangle.\n\t *\n\t * @return {number} The triangle's area.\n\t */\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\t/**\n\t * Computes the midpoint of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's midpoint.\n\t */\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\t/**\n\t * Computes the normal of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes a plane the triangle lies within.\n\t *\n\t * @param {Plane} target - The target vector that is used to store the method's result.\n\t * @return {Plane} The plane the triangle lies within.\n\t */\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tgetInterpolation( point, v1, v2, v3, target ) {\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this triangle intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\t/**\n\t * Returns the closest point on the triangle to the given point.\n\t *\n\t * @param {Vector3} p - The point to compute the closest point for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the triangle.\n\t */\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle is equal with the given one.\n\t *\n\t * @param {Triangle} triangle - The triangle to test for equality.\n\t * @return {boolean} Whether this triangle is equal with the given one.\n\t */\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\n/**\n * A Color instance is represented by RGB components in the linear working\n * color space, which defaults to `LinearSRGBColorSpace`. Inputs\n * conventionally using `SRGBColorSpace` (such as hexadecimals and CSS\n * strings) are converted to the working color space automatically.\n *\n * ```js\n * // converted automatically from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setHex( 0x112233 );\n * ```\n * Source color spaces may be specified explicitly, to ensure correct conversions.\n * ```js\n * // assumed already LinearSRGBColorSpace; no conversion\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5 );\n *\n * // converted explicitly from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5, SRGBColorSpace );\n * ```\n * If THREE.ColorManagement is disabled, no conversions occur. For details,\n * see Color management. Iterating through a Color instance will yield\n * its components (r, g, b) in the corresponding order. A Color can be initialised\n * in any of the following ways:\n * ```js\n * //empty constructor - will default white\n * const color1 = new THREE.Color();\n *\n * //Hexadecimal color (recommended)\n * const color2 = new THREE.Color( 0xff0000 );\n *\n * //RGB string\n * const color3 = new THREE.Color(\"rgb(255, 0, 0)\");\n * const color4 = new THREE.Color(\"rgb(100%, 0%, 0%)\");\n *\n * //X11 color name - all 140 color names are supported.\n * //Note the lack of CamelCase in the name\n * const color5 = new THREE.Color( 'skyblue' );\n * //HSL string\n * const color6 = new THREE.Color(\"hsl(0, 100%, 50%)\");\n *\n * //Separate RGB values between 0 and 1\n * const color7 = new THREE.Color( 1, 0, 0 );\n * ```\n */\nclass Color {\n\n\t/**\n\t * Constructs a new color.\n\t *\n\t * Note that standard method of specifying color in three.js is with a hexadecimal triplet,\n\t * and that method is used throughout the rest of the documentation.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t */\n\tconstructor( r, g, b ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isColor = true;\n\n\t\t/**\n\t\t * The red component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.r = 1;\n\n\t\t/**\n\t\t * The green component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.g = 1;\n\n\t\t/**\n\t\t * The blue component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.b = 1;\n\n\t\treturn this.set( r, g, b );\n\n\t}\n\n\t/**\n\t * Sets the colors's components from the given values.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t * @return {Color} A reference to this color.\n\t */\n\tset( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\n\t\t\tconst value = r;\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.setRGB( r, g, b );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the colors's components to the given scalar value.\n\t *\n\t * @param {number} scalar - The scalar value.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a hexadecimal value.\n\t *\n\t * @param {number} hex - The hexadecimal value.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} r - Red channel value between `0.0` and `1.0`.\n\t * @param {number} g - Green channel value between `0.0` and `1.0`.\n\t * @param {number} b - Blue channel value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a CSS-style string. For example, `rgb(250, 0,0)`,\n\t * `rgb(100%, 0%, 0%)`, `hsl(0, 100%, 50%)`, `#ff0000`, `#f00`, or `red` ( or\n\t * any [X11 color name](https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart) -\n\t * all 140 color names are supported).\n\t *\n\t * @param {string} style - Color as a CSS-style string.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\twarn( 'Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^(\\w+)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 1 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 2 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 3 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 1 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 2 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 3 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL(\n\t\t\t\t\t\t\tparseFloat( color[ 1 ] ) / 360,\n\t\t\t\t\t\t\tparseFloat( color[ 2 ] ) / 100,\n\t\t\t\t\t\t\tparseFloat( color[ 3 ] ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\twarn( 'Color: Unknown color model ' + style );\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\treturn this.setRGB(\n\t\t\t\t\tparseInt( hex.charAt( 0 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 1 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 2 ), 16 ) / 15,\n\t\t\t\t\tcolorSpace\n\t\t\t\t);\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\treturn this.setHex( parseInt( hex, 16 ), colorSpace );\n\n\t\t\t} else {\n\n\t\t\t\twarn( 'Color: Invalid hex color ' + style );\n\n\t\t\t}\n\n\t\t} else if ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a color name. Faster than {@link Color#setStyle} if\n\t * you don't need the other CSS-style formats.\n\t *\n\t * For convenience, the list of names is exposed in `Color.NAMES` as a hash.\n\t * ```js\n\t * Color.NAMES.aliceblue // returns 0xF0F8FF\n\t * ```\n\t *\n\t * @param {string} style - The color name.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\twarn( 'Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new color with copied values from this instance.\n\t *\n\t * @return {Color} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\t/**\n\t * Copies the values of the given color to this instance.\n\t *\n\t * @param {Color} color - The color to copy.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {number} The hexadecimal value.\n\t */\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\treturn Math.round( clamp( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp( _color.b * 255, 0, 255 ) );\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color as a string (for example, 'FFFFFF').\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The hexadecimal value as a string.\n\t */\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( -6 );\n\n\t}\n\n\t/**\n\t * Converts the colors RGB values into the HSL format and stores them into the\n\t * given target object.\n\t *\n\t * @param {{h:number,s:number,l:number}} target - The target object that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {{h:number,s:number,l:number}} The HSL representation of this color.\n\t */\n\tgetHSL( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the RGB values of this color and stores them into the given target object.\n\t *\n\t * @param {Color} target - The target color that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} The RGB representation of this color.\n\t */\n\tgetRGB( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\ttarget.r = _color.r;\n\t\ttarget.g = _color.g;\n\t\ttarget.b = _color.b;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the value of this color as a CSS style string. Example: `rgb(255,0,0)`.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The CSS representation of this color.\n\t */\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`;\n\n\t\t}\n\n\t\treturn `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`;\n\n\t}\n\n\t/**\n\t * Adds the given HSL values to this color's values.\n\t * Internally, this converts the color's RGB values to HSL, adds HSL\n\t * and then converts the color back to RGB.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @return {Color} A reference to this color.\n\t */\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\treturn this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l );\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given color to the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to add.\n\t * @return {Color} A reference to this color.\n\t */\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given colors and stores the result in this instance.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @return {Color} A reference to this color.\n\t */\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Color} A reference to this color.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the RGB values of the given color from the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to subtract.\n\t * @return {Color} A reference to this color.\n\t */\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the RGB values of the given color with the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's RGB values toward the RGB values of the\n\t * given color. The alpha argument can be thought of as the ratio between\n\t * the two colors, where `0.0` is this color and `1.0` is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given colors and stores the result in this instance.\n\t * The alpha argument can be thought of as the ratio between the two colors, where `0.0`\n\t * is the first and `1.0` is the second color.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's HSL values toward the HSL values of the\n\t * given color. It differs from {@link Color#lerp} by not interpolating straight\n\t * from one color to the other, but instead going through all the hues in between\n\t * those two colors. The alpha argument can be thought of as the ratio between\n\t * the two colors, where 0.0 is this color and 1.0 is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the color's RGB components from the given 3D vector.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetFromVector3( v ) {\n\n\t\tthis.r = v.x;\n\t\tthis.g = v.y;\n\t\tthis.b = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this color with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix.\n\t * @return {Color} A reference to this color.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\t\tconst e = m.elements;\n\n\t\tthis.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b;\n\t\tthis.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b;\n\t\tthis.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this color is equal with the given one.\n\t *\n\t * @param {Color} c - The color to test for equality.\n\t * @return {boolean} Whether this bounding color is equal with the given one.\n\t */\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\t/**\n\t * Sets this color's RGB components from the given array.\n\t *\n\t * @param {Array} array - An array holding the RGB values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the RGB components of this color to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the color components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The color components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this color from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding color data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the color\n\t * as a hexadecimal value.\n\t *\n\t * @return {number} The hexadecimal value.\n\t */\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nconst _color = /*@__PURE__*/ new Color();\n\n/**\n * A dictionary with X11 color names.\n *\n * Note that multiple words such as Dark Orange become the string 'darkorange'.\n *\n * @static\n * @type {Object}\n */\nColor.NAMES = _colorKeywords;\n\nlet _materialId = 0;\n\n/**\n * Abstract base class for materials.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Material extends EventDispatcher {\n\n\t/**\n\t * Constructs a new material.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMaterial = true;\n\n\t\t/**\n\t\t * The ID of the material.\n\t\t *\n\t\t * @name Material#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _materialId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Material';\n\n\t\t/**\n\t\t * Defines the blending type of the material.\n\t\t *\n\t\t * It must be set to `CustomBlending` if custom blending properties like\n\t\t * {@link Material#blendSrc}, {@link Material#blendDst} or {@link Material#blendEquation}\n\t\t * should have any effect.\n\t\t *\n\t\t * @type {(NoBlending|NormalBlending|AdditiveBlending|SubtractiveBlending|MultiplyBlending|CustomBlending)}\n\t\t * @default NormalBlending\n\t\t */\n\t\tthis.blending = NormalBlending;\n\n\t\t/**\n\t\t * Defines which side of faces will be rendered - front, back or both.\n\t\t *\n\t\t * @type {(FrontSide|BackSide|DoubleSide)}\n\t\t * @default FrontSide\n\t\t */\n\t\tthis.side = FrontSide;\n\n\t\t/**\n\t\t * If set to `true`, vertex colors should be used.\n\t\t *\n\t\t * The engine supports RGB and RGBA vertex colors depending on whether a three (RGB) or\n\t\t * four (RGBA) component color buffer attribute is used.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.vertexColors = false;\n\n\t\t/**\n\t\t * Defines how transparent the material is.\n\t\t * A value of `0.0` indicates fully transparent, `1.0` is fully opaque.\n\t\t *\n\t\t * If the {@link Material#transparent} is not set to `true`,\n\t\t * the material will remain fully opaque and this value will only affect its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.opacity = 1;\n\n\t\t/**\n\t\t * Defines whether this material is transparent. This has an effect on\n\t\t * rendering as transparent objects need special treatment and are rendered\n\t\t * after non-transparent objects.\n\t\t *\n\t\t * When set to true, the extent to which the material is transparent is\n\t\t * controlled by {@link Material#opacity}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparent = false;\n\n\t\t/**\n\t\t * Enables alpha hashed transparency, an alternative to {@link Material#transparent} or\n\t\t * {@link Material#alphaTest}. The material will not be rendered if opacity is lower than\n\t\t * a random threshold. Randomization introduces some grain or noise, but approximates alpha\n\t\t * blending without the associated problems of sorting. Using TAA can reduce the resulting noise.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaHash = false;\n\n\t\t/**\n\t\t * Defines the blending source factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default SrcAlphaFactor\n\t\t */\n\t\tthis.blendSrc = SrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending destination factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default OneMinusSrcAlphaFactor\n\t\t */\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending equation.\n\t\t *\n\t\t * @type {(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default AddEquation\n\t\t */\n\t\tthis.blendEquation = AddEquation;\n\n\t\t/**\n\t\t * Defines the blending source alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendSrcAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending destination alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendDstAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending equation of the alpha channel.\n\t\t *\n\t\t * @type {?(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendEquationAlpha = null;\n\n\t\t/**\n\t\t * Represents the RGB values of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantColor` or `OneMinusConstantColor`.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.blendColor = new Color( 0, 0, 0 );\n\n\t\t/**\n\t\t * Represents the alpha value of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantAlpha` or `OneMinusConstantAlpha`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.blendAlpha = 0;\n\n\t\t/**\n\t\t * Defines the depth function.\n\t\t *\n\t\t * @type {(NeverDepth|AlwaysDepth|LessDepth|LessEqualDepth|EqualDepth|GreaterEqualDepth|GreaterDepth|NotEqualDepth)}\n\t\t * @default LessEqualDepth\n\t\t */\n\t\tthis.depthFunc = LessEqualDepth;\n\n\t\t/**\n\t\t * Whether to have depth test enabled when rendering this material.\n\t\t * When the depth test is disabled, the depth write will also be implicitly disabled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthTest = true;\n\n\t\t/**\n\t\t * Whether rendering this material has any effect on the depth buffer.\n\t\t *\n\t\t * When drawing 2D overlays it can be useful to disable the depth writing in\n\t\t * order to layer several things together without creating z-index artifacts.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthWrite = true;\n\n\t\t/**\n\t\t * The bit mask to use when writing to the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilWriteMask = 0xff;\n\n\t\t/**\n\t\t * The stencil comparison function to use.\n\t\t *\n\t\t * @type {NeverStencilFunc|LessStencilFunc|EqualStencilFunc|LessEqualStencilFunc|GreaterStencilFunc|NotEqualStencilFunc|GreaterEqualStencilFunc|AlwaysStencilFunc}\n\t\t * @default AlwaysStencilFunc\n\t\t */\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\n\t\t/**\n\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.stencilRef = 0;\n\n\t\t/**\n\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilFuncMask = 0xff;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns `false`.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` but the depth test fails.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` and the depth test passes.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZPass = KeepStencilOp;\n\n\t\t/**\n\t\t * Whether stencil operations are performed against the stencil buffer. In\n\t\t * order to perform writes or comparisons against the stencil buffer this\n\t\t * value must be `true`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilWrite = false;\n\n\t\t/**\n\t\t * User-defined clipping planes specified as THREE.Plane objects in world\n\t\t * space. These planes apply to the objects this material is attached to.\n\t\t * Points in space whose signed distance to the plane is negative are clipped\n\t\t * (not rendered). This requires {@link WebGLRenderer#localClippingEnabled} to\n\t\t * be `true`.\n\t\t *\n\t\t * @type {?Array}\n\t\t * @default null\n\t\t */\n\t\tthis.clippingPlanes = null;\n\n\t\t/**\n\t\t * Changes the behavior of clipping planes so that only their intersection is\n\t\t * clipped, rather than their union.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipIntersection = false;\n\n\t\t/**\n\t\t * Defines whether to clip shadows according to the clipping planes specified\n\t\t * on this material.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipShadows = false;\n\n\t\t/**\n\t\t * Defines which side of faces cast shadows. If `null`, the side casting shadows\n\t\t * is determined as follows:\n\t\t *\n\t\t * - When {@link Material#side} is set to `FrontSide`, the back side cast shadows.\n\t\t * - When {@link Material#side} is set to `BackSide`, the front side cast shadows.\n\t\t * - When {@link Material#side} is set to `DoubleSide`, both sides cast shadows.\n\t\t *\n\t\t * @type {?(FrontSide|BackSide|DoubleSide)}\n\t\t * @default null\n\t\t */\n\t\tthis.shadowSide = null;\n\n\t\t/**\n\t\t * Whether to render the material's color.\n\t\t *\n\t\t * This can be used in conjunction with {@link Object3D#renderOder} to create invisible\n\t\t * objects that occlude other objects.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.colorWrite = true;\n\n\t\t/**\n\t\t * Override the renderer's default precision for this material.\n\t\t *\n\t\t * @type {?('highp'|'mediump'|'lowp')}\n\t\t * @default null\n\t\t */\n\t\tthis.precision = null;\n\n\t\t/**\n\t\t * Whether to use polygon offset or not. When enabled, each fragment's depth value will\n\t\t * be offset after it is interpolated from the depth values of the appropriate vertices.\n\t\t * The offset is added before the depth test is performed and before the value is written\n\t\t * into the depth buffer.\n\t\t *\n\t\t * Can be useful for rendering hidden-line images, for applying decals to surfaces, and for\n\t\t * rendering solids with highlighted edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.polygonOffset = false;\n\n\t\t/**\n\t\t * Specifies a scale factor that is used to create a variable depth offset for each polygon.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetFactor = 0;\n\n\t\t/**\n\t\t * Is multiplied by an implementation-specific value to create a constant depth offset.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\t/**\n\t\t * Whether to apply dithering to the color to remove the appearance of banding.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.dithering = false;\n\n\t\t/**\n\t\t * Whether alpha to coverage should be enabled or not. Can only be used with MSAA-enabled contexts\n\t\t * (meaning when the renderer was created with *antialias* parameter set to `true`). Enabling this\n\t\t * will smooth aliasing on clip plane edges and alphaTest-clipped edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaToCoverage = false;\n\n\t\t/**\n\t\t * Whether to premultiply the alpha (transparency) value.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultipliedAlpha = false;\n\n\t\t/**\n\t\t * Whether double-sided, transparent objects should be rendered with a single pass or not.\n\t\t *\n\t\t * The engine renders double-sided, transparent objects with two draw calls (back faces first,\n\t\t * then front faces) to mitigate transparency artifacts. There are scenarios however where this\n\t\t * approach produces no quality gains but still doubles draw calls e.g. when rendering flat\n\t\t * vegetation like grass sprites. In these cases, set the `forceSinglePass` flag to `true` to\n\t\t * disable the two pass rendering to avoid performance issues.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.forceSinglePass = false;\n\n\t\t/**\n\t\t * Whether it's possible to override the material with {@link Scene#overrideMaterial} or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.allowOverride = true;\n\n\t\t/**\n\t\t * Defines whether 3D objects using this material are visible.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * Defines whether this material is tone mapped according to the renderer's tone mapping setting.\n\t\t *\n\t\t * It is ignored when rendering to a render target or using post processing or when using\n\t\t * `WebGPURenderer`. In all these cases, all materials are honored by tone mapping.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.toneMapped = true;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the Material. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Material#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\t/**\n\t * Sets the alpha value to be used when running an alpha test. The material\n\t * will not be rendered if the opacity is lower than this value.\n\t *\n\t * @type {number}\n\t * @readonly\n\t * @default 0\n\t */\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\t/**\n\t * An optional callback that is executed immediately before the material is used to render a 3D object.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\t/**\n\t * An optional callback that is executed immediately before the shader\n\t * program is compiled. This function is called with the shader source code\n\t * as a parameter. Useful for the modification of built-in materials.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}. The\n\t * recommended approach when customizing materials is to use `WebGPURenderer` with the new\n\t * Node Material system and [TSL](https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language).\n\t *\n\t * @param {{vertexShader:string,fragmentShader:string,uniforms:Object}} shaderobject - The object holds the uniforms and the vertex and fragment shader source.\n\t * @param {WebGLRenderer} renderer - A reference to the renderer.\n\t */\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\t/**\n\t * In case {@link Material#onBeforeCompile} is used, this callback can be used to identify\n\t * values of settings used in `onBeforeCompile()`, so three.js can reuse a cached\n\t * shader or recompile the shader for this material as needed.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @return {string} The custom program cache key.\n\t */\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\t/**\n\t * This method can be used to set default values from parameter objects.\n\t * It is a generic implementation so it can be used with different types\n\t * of materials.\n\t *\n\t * @param {Object} [values] - The material values to set.\n\t */\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Material: parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Material: '${ key }' is not a property of THREE.${ this.type }.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the material into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized material.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity !== undefined && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.sheenColorMap && this.sheenColorMap.isTexture ) {\n\n\t\t\tdata.sheenColorMap = this.sheenColorMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.sheenRoughnessMap && this.sheenRoughnessMap.isTexture ) {\n\n\t\t\tdata.sheenRoughnessMap = this.sheenRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.dispersion !== undefined ) data.dispersion = this.dispersion;\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy;\n\t\tif ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation;\n\n\t\tif ( this.anisotropyMap && this.anisotropyMap.isTexture ) {\n\n\t\t\tdata.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapRotation !== undefined ) data.envMapRotation = this.envMapRotation.toArray();\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors === true ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = true;\n\n\t\tif ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc;\n\t\tif ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst;\n\t\tif ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation;\n\t\tif ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha;\n\t\tif ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha;\n\t\tif ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha;\n\t\tif ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex();\n\t\tif ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha;\n\n\t\tif ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc;\n\t\tif ( this.depthTest === false ) data.depthTest = this.depthTest;\n\t\tif ( this.depthWrite === false ) data.depthWrite = this.depthWrite;\n\t\tif ( this.colorWrite === false ) data.colorWrite = this.colorWrite;\n\n\t\tif ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask;\n\t\tif ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc;\n\t\tif ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef;\n\t\tif ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask;\n\t\tif ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail;\n\t\tif ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail;\n\t\tif ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass;\n\t\tif ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaHash === true ) data.alphaHash = true;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = true;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true;\n\t\tif ( this.forceSinglePass === true ) data.forceSinglePass = true;\n\n\t\tif ( this.wireframe === true ) data.wireframe = true;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new material with copied values from this instance.\n\t *\n\t * @return {Material} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given material to this instance.\n\t *\n\t * @param {Material} source - The material to copy.\n\t * @return {Material} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\tthis.blendColor.copy( source.blendColor );\n\t\tthis.blendAlpha = source.blendAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaHash = source.alphaHash;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.forceSinglePass = source.forceSinglePass;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Material#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the material has been disposed of.\n\t\t *\n\t\t * @event Material#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the material\n\t * needs to be recompiled.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometries in a simple shaded (flat or wireframe) way.\n *\n * This material is not affected by lights.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshBasicMaterial\n */\nclass MeshBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshBasicMaterial = true;\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < -27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < -14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= -8388609; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n/**\n * Returns a half precision floating point value (FP16) from the given single\n * precision floating point value (FP32).\n *\n * @param {number} val - A single precision floating point value.\n * @return {number} The FP16 value.\n */\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) warn( 'DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, -65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n/**\n * Returns a single precision floating point value (FP32) from the given half\n * precision floating point value (FP16).\n *\n * @param {number} val - A half precision floating point value.\n * @return {number} The FP32 value.\n */\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\n/**\n * A class containing utility functions for data.\n *\n * @hideconstructor\n */\nclass DataUtils {\n\n\t/**\n\t * Returns a half precision floating point value (FP16) from the given single\n\t * precision floating point value (FP32).\n\t *\n\t * @param {number} val - A single precision floating point value.\n\t * @return {number} The FP16 value.\n\t */\n\tstatic toHalfFloat( val ) {\n\n\t\treturn toHalfFloat( val );\n\n\t}\n\n\t/**\n\t * Returns a single precision floating point value (FP32) from the given half\n\t * precision floating point value (FP16).\n\t *\n\t * @param {number} val - A half precision floating point value.\n\t * @return {number} The FP32 value.\n\t */\n\tstatic fromHalfFloat( val ) {\n\n\t\treturn fromHalfFloat( val );\n\n\t}\n\n}\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nlet _id$2 = 0;\n\n/**\n * This class stores data for an attribute (such as vertex positions, face\n * indices, normals, colors, UVs, and any custom attributes ) associated with\n * a geometry, which allows for more efficient passing of data to the GPU.\n *\n * When working with vector-like data, the `fromBufferAttribute( attribute, index )`\n * helper methods on vector and color class might be helpful. E.g. {@link Vector3#fromBufferAttribute}.\n */\nclass BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized = false ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferAttribute = true;\n\n\t\t/**\n\t\t * The ID of the buffer attribute.\n\t\t *\n\t\t * @name BufferAttribute#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$2 ++ } );\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The array holding the attribute data. It should have `itemSize * numVertices`\n\t\t * elements, where `numVertices` is the number of vertices in the associated geometry.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of values of the array that should be associated with a particular vertex.\n\t\t * For instance, if this attribute is storing a 3-component vector (such as a position,\n\t\t * normal, or color), then the value should be `3`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * Represents the number of items this buffer attribute stores. It is internally computed\n\t\t * by dividing the `array` length by the `itemSize`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `array` is an instance of `UInt16Array`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the array data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * Configures the bound GPU type for use in shaders.\n\t\t *\n\t\t * Note: this only has an effect for integer arrays and is not configurable for float arrays.\n\t\t * For lower precision float types, use `Float16BufferAttribute`.\n\t\t *\n\t\t * @type {(FloatType|IntType)}\n\t\t * @default FloatType\n\t\t */\n\t\tthis.gpuType = FloatType;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute\n\t * array data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this buffer attribute.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {BufferAttribute} A reference to this buffer attribute.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given buffer attribute to this instance.\n\t *\n\t * @param {BufferAttribute} source - The buffer attribute to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\t\tthis.gpuType = source.gpuType;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given buffer attribute to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this buffer attribute.\n\t * @param {BufferAttribute} attribute - The buffer attribute to copy from.\n\t * @param {number} index2 - The source index into the given buffer attribute.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given array data into this buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} array - The array to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 matrix to the given attribute. Works with\n\t * item size `2` and `3`.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this buffer attribute's array.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.itemSize + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.array[ index * this.itemSize + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the attribute array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when attribute data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * @return {BufferAttribute} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8Clamped` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint8ClampedArray)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float16` buffer attribute with\n * a plain `Array` instance.\n *\n * This class automatically converts to and from FP16 via `Uint16Array` since `Float16Array`\n * browser support is still problematic.\n *\n * @augments BufferAttribute\n */\nclass Float16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = fromHalfFloat( this.array[ index * this.itemSize ] );\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = toHalfFloat( x );\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] );\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] );\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] );\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\t\tthis.array[ index + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Float32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Float32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$1 = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\n/**\n * A representation of mesh, line, or point geometry. Includes vertex\n * positions, face indices, normals, colors, UVs, and custom attributes\n * within buffers, reducing the cost of passing all this data to the GPU.\n *\n * ```js\n * const geometry = new THREE.BufferGeometry();\n * // create a simple square shape. We duplicate the top left and bottom right\n * // vertices because each vertex needs to appear once per triangle.\n * const vertices = new Float32Array( [\n * \t-1.0, -1.0, 1.0, // v0\n * \t 1.0, -1.0, 1.0, // v1\n * \t 1.0, 1.0, 1.0, // v2\n *\n * \t 1.0, 1.0, 1.0, // v3\n * \t-1.0, 1.0, 1.0, // v4\n * \t-1.0, -1.0, 1.0 // v5\n * ] );\n * // itemSize = 3 because there are 3 values (components) per vertex\n * geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\n * const material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * ```\n *\n * @augments EventDispatcher\n */\nclass BufferGeometry extends EventDispatcher {\n\n\t/**\n\t * Constructs a new geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferGeometry = true;\n\n\t\t/**\n\t\t * The ID of the geometry.\n\t\t *\n\t\t * @name BufferGeometry#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$1 ++ } );\n\n\t\t/**\n\t\t * The UUID of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\t/**\n\t\t * Allows for vertices to be re-used across multiple triangles; this is\n\t\t * called using \"indexed triangles\". Each triangle is associated with the\n\t\t * indices of three vertices. This attribute therefore stores the index of\n\t\t * each vertex for each triangular face. If this attribute is not set, the\n\t\t * renderer assumes that each three contiguous positions represent a single triangle.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.index = null;\n\n\t\t/**\n\t\t * A (storage) buffer attribute which was generated with a compute shader and\n\t\t * now defines indirect draw calls.\n\t\t *\n\t\t * Can only be used with {@link WebGPURenderer} and a WebGPU backend.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.indirect = null;\n\n\t\t/**\n\t\t * This dictionary has as id the name of the attribute to be set and as value\n\t\t * the buffer attribute to set it to. Rather than accessing this property directly,\n\t\t * use `setAttribute()` and `getAttribute()` to access attributes of this geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.attributes = {};\n\n\t\t/**\n\t\t * This dictionary holds the morph targets of the geometry.\n\t\t *\n\t\t * Note: Once the geometry has been rendered, the morph attribute data cannot\n\t\t * be changed. You will have to call `dispose()?, and create a new geometry instance.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.morphAttributes = {};\n\n\t\t/**\n\t\t * Used to control the morph target behavior; when set to `true`, the morph\n\t\t * target data is treated as relative offsets, rather than as absolute\n\t\t * positions/normals.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.morphTargetsRelative = false;\n\n\t\t/**\n\t\t * Split the geometry into groups, each of which will be rendered in a\n\t\t * separate draw call. This allows an array of materials to be used with the geometry.\n\t\t *\n\t\t * Use `addGroup()` and `clearGroups()` to edit groups, rather than modifying this array directly.\n\t\t *\n\t\t * Every vertex and index must belong to exactly one group — groups must not share vertices or\n\t\t * indices, and must not leave vertices or indices unused.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.groups = [];\n\n\t\t/**\n\t\t * Bounding box for the geometry which can be calculated with `computeBoundingBox()`.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * Bounding sphere for the geometry which can be calculated with `computeBoundingSphere()`.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Determines the part of the geometry to render. This should not be set directly,\n\t\t * instead use `setDrawRange()`.\n\t\t *\n\t\t * @type {{start:number,count:number}}\n\t\t */\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the geometry.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * Returns the index of this geometry.\n\t *\n\t * @return {?BufferAttribute} The index. Returns `null` if no index is defined.\n\t */\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\t/**\n\t * Sets the given index to this geometry.\n\t *\n\t * @param {Array|BufferAttribute} index - The index to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given indirect attribute to this geometry.\n\t *\n\t * @param {BufferAttribute} indirect - The attribute holding indirect draw calls.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndirect( indirect ) {\n\n\t\tthis.indirect = indirect;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the indirect attribute of this geometry.\n\t *\n\t * @return {?BufferAttribute} The indirect attribute. Returns `null` if no indirect attribute is defined.\n\t */\n\tgetIndirect() {\n\n\t\treturn this.indirect;\n\n\t}\n\n\t/**\n\t * Returns the buffer attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {BufferAttribute|InterleavedBufferAttribute|undefined} The buffer attribute.\n\t * Returns `undefined` if not attribute has been found.\n\t */\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\t/**\n\t * Sets the given attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @param {BufferAttribute|InterleavedBufferAttribute} attribute - The attribute to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes the attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name to delete.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this geometry has an attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {boolean} Whether this geometry has an attribute for the given name or not.\n\t */\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\t/**\n\t * Adds a group to this geometry.\n\t *\n\t * @param {number} start - The first element in this draw call. That is the first\n\t * vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - Specifies how many vertices (or indices) are part of this group.\n\t * @param {number} [materialIndex=0] - The material array index to use.\n\t */\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Clears all groups.\n\t */\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\t/**\n\t * Sets the draw range for this geometry.\n\t *\n\t * @param {number} start - The first vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - For non-indexed BufferGeometry, `count` is the number of vertices to render.\n\t * For indexed BufferGeometry, `count` is the number of indices to render.\n\t */\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 transformation matrix to the geometry.\n\t *\n\t * @param {Matrix4} matrix - The matrix to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the rotation represented by the Quaternion to the geometry.\n\t *\n\t * @param {Quaternion} q - The Quaternion to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the X axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Y axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Z axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#position} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x offset.\n\t * @param {number} y - The y offset.\n\t * @param {number} z - The z offset.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#scale} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x scale.\n\t * @param {number} y - The y scale.\n\t * @param {number} z - The z scale.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry to face a point in 3D space. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#lookAt} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {Vector3} vector - The target point.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Center the geometry based on its bounding box.\n\t *\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines a geometry by creating a `position` attribute based on the given array of points. The array\n\t * can hold 2D or 3D vectors. When using two-dimensional data, the `z` coordinate for all vertices is\n\t * set to `0`.\n\t *\n\t * If the method is used with an existing `position` attribute, the vertex data are overwritten with the\n\t * data from the array. The length of the array must match the vertex count.\n\t *\n\t * @param {Array|Array} points - The points.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute === undefined ) {\n\n\t\t\tconst position = [];\n\n\t\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\t} else {\n\n\t\t\tconst l = Math.min( points.length, positionAttribute.count ); // make sure data do not exceed buffer size\n\n\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tpositionAttribute.setXYZ( i, point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tif ( points.length > positionAttribute.count ) {\n\n\t\t\t\twarn( 'BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry.' );\n\n\t\t\t}\n\n\t\t\tpositionAttribute.needsUpdate = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the geometry, and updates the `boundingBox` member.\n\t * The bounding box is not computed by the engine; it must be computed by your app.\n\t * You may need to recompute the bounding box if the geometry vertices are modified.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$2.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$2.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.max );\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\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the geometry, and updates the `boundingSphere` member.\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if the geometry vertices are modified.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$2.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$2.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\terror( 'BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates and adds a tangent attribute to this geometry.\n\t *\n\t * The computation is only supported for indexed geometries and if position, normal, and uv attributes\n\t * are defined. When using a tangent space normal map, prefer the MikkTSpace algorithm provided by\n\t * {@link BufferGeometryUtils#computeMikkTSpaceTangents} instead.\n\t */\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\terror( 'BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst positionAttribute = attributes.position;\n\t\tconst normalAttribute = attributes.normal;\n\t\tconst uvAttribute = attributes.uv;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * positionAttribute.count ), 4 ) );\n\n\t\t}\n\n\t\tconst tangentAttribute = this.getAttribute( 'tangent' );\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tuvA.fromBufferAttribute( uvAttribute, a );\n\t\t\tuvB.fromBufferAttribute( uvAttribute, b );\n\t\t\tuvC.fromBufferAttribute( uvAttribute, c );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: index.count\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindex.getX( j + 0 ),\n\t\t\t\t\tindex.getX( j + 1 ),\n\t\t\t\t\tindex.getX( j + 2 )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromBufferAttribute( normalAttribute, v );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? -1 : 1.0;\n\n\t\t\ttangentAttribute.setXYZW( v, tmp.x, tmp.y, tmp.z, w );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( index.getX( j + 0 ) );\n\t\t\t\thandleVertex( index.getX( j + 1 ) );\n\t\t\t\thandleVertex( index.getX( j + 2 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes vertex normals for the given vertex data. For indexed geometries, the method sets\n\t * each vertex normal to be the average of the face normals of the faces that share that vertex.\n\t * For non-indexed geometries, vertices are not shared, and the method sets each vertex normal\n\t * to be the same as the face normal.\n\t */\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Ensures every normal vector in a geometry will have a magnitude of `1`. This will\n\t * correct lighting on the geometry surfaces.\n\t */\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a new non-index version of this indexed geometry. If the geometry\n\t * is already non-indexed, the method is a NOOP.\n\t *\n\t * @return {BufferGeometry} The non-indexed version of this indexed geometry.\n\t */\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\twarn( 'BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\t/**\n\t * Serializes the geometry into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized geometry.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = boundingSphere.toJSON();\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new geometry with copied values from this instance.\n\t *\n\t * @return {BufferGeometry} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given geometry to this instance.\n\t *\n\t * @param {BufferGeometry} source - The geometry to copy.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires BufferGeometry#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$3 = /*@__PURE__*/ new Matrix4();\nconst _ray$3 = /*@__PURE__*/ new Ray();\nconst _sphere$6 = /*@__PURE__*/ new Sphere();\nconst _sphereHitAt = /*@__PURE__*/ new Vector3();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\n/**\n * Class representing triangular polygon mesh based objects.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments Object3D\n */\nclass Mesh extends Object3D {\n\n\t/**\n\t * Constructs a new mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\t/**\n\t\t * The mesh geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The mesh material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default MeshBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\t/**\n\t\t * The number of instances of this mesh.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Mesh#morphTargetDictionary} and {@link Mesh#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the local-space position of the vertex at the given index, taking into\n\t * account the current animation state of both morph targets and skinning.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * @return {Vector3} The vertex position in local space.\n\t */\n\tgetVertexPosition( index, target ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\n\t\ttarget.fromBufferAttribute( position, index );\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif ( morphPosition && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morphAttribute, index );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( target ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttarget.add( _morphA );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$6.copy( geometry.boundingSphere );\n\t\t_sphere$6.applyMatrix4( matrixWorld );\n\n\t\t// check distance from ray origin to bounding sphere\n\n\t\t_ray$3.copy( raycaster.ray ).recast( raycaster.near );\n\n\t\tif ( _sphere$6.containsPoint( _ray$3.origin ) === false ) {\n\n\t\t\tif ( _ray$3.intersectSphere( _sphere$6, _sphereHitAt ) === null ) return;\n\n\t\t\tif ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return;\n\n\t\t}\n\n\t\t// convert ray to local space of mesh\n\n\t\t_inverseMatrix$3.copy( matrixWorld ).invert();\n\t\t_ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$3 );\n\n\t}\n\n\t_computeIntersections( raycaster, intersects, rayLocalSpace ) {\n\n\t\tlet intersection;\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv1 = geometry.attributes.uv1;\n\t\tconst normal = geometry.attributes.normal;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\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} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\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} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection$1( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) {\n\n\tobject.getVertexPosition( a, _vA$1 );\n\tobject.getVertexPosition( b, _vB$1 );\n\tobject.getVertexPosition( c, _vC$1 );\n\n\tconst intersection = checkIntersection$1( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tconst barycoord = new Vector3();\n\t\tTriangle.getBarycoord( _intersectionPoint, _vA$1, _vB$1, _vC$1, barycoord );\n\n\t\tif ( uv ) {\n\n\t\t\tintersection.uv = Triangle.getInterpolatedAttribute( uv, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\tintersection.uv1 = Triangle.getInterpolatedAttribute( uv1, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\tintersection.normal = Triangle.getInterpolatedAttribute( normal, a, b, c, barycoord, new Vector3() );\n\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( -1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\t\tintersection.barycoord = barycoord;\n\n\t}\n\n\treturn intersection;\n\n}\n\n/**\n * A geometry class for a rectangular cuboid with a given width, height, and depth.\n * On creation, the cuboid is centred on the origin, with each edge parallel to one\n * of the axes.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const cube = new THREE.Mesh( geometry, material );\n * scene.add( cube );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#BoxGeometry\n */\nclass BoxGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new box geometry.\n\t *\n\t * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis.\n\t * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis.\n\t * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis.\n\t * @param {number} [widthSegments=1] - Number of segmented rectangular faces along the width of the sides.\n\t * @param {number} [heightSegments=1] - Number of segmented rectangular faces along the height of the sides.\n\t * @param {number} [depthSegments=1] - Number of segmented rectangular faces along the depth of the sides.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, -1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, -1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', -1, -1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : -1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {BoxGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Provides utility functions for managing uniforms.\n *\n * @module UniformsUtils\n */\n\n/**\n * Clones the given uniform definitions by performing a deep-copy. That means\n * if the value of a uniform refers to an object like a Vector3 or Texture,\n * the cloned uniform will refer to a new object reference.\n *\n * @param {Object} src - An object representing uniform definitions.\n * @return {Object} The cloned uniforms.\n */\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tif ( property.isRenderTargetTexture ) {\n\n\t\t\t\t\twarn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' );\n\t\t\t\t\tdst[ u ][ p ] = null;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\n/**\n * Merges the given uniform definitions into a single object. Since the\n * method internally uses cloneUniforms(), it performs a deep-copy when\n * producing the merged uniform definitions.\n *\n * @param {Array} uniforms - An array of objects containing uniform definitions.\n * @return {Object} The merged uniforms.\n */\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction getUnlitUniformColorSpace( renderer ) {\n\n\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\tif ( currentRenderTarget === null ) {\n\n\t\t// https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398\n\t\treturn renderer.outputColorSpace;\n\n\t}\n\n\t// https://github.com/mrdoob/three.js/issues/27868\n\tif ( currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\treturn currentRenderTarget.texture.colorSpace;\n\n\t}\n\n\treturn ColorManagement.workingColorSpace;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\n/**\n * A material rendered with custom shaders. A shader is a small program written in GLSL.\n * that runs on the GPU. You may want to use a custom shader if you need to implement an\n * effect not included with any of the built-in materials.\n *\n * There are the following notes to bear in mind when using a `ShaderMaterial`:\n *\n * - `ShaderMaterial` can only be used with {@link WebGLRenderer}.\n * - Built in attributes and uniforms are passed to the shaders along with your code. If\n * you don't want that, use {@link RawShaderMaterial} instead.\n * - You can use the directive `#pragma unroll_loop_start` and `#pragma unroll_loop_end`\n * in order to unroll a `for` loop in GLSL by the shader preprocessor. The directive has\n * to be placed right above the loop. The loop formatting has to correspond to a defined standard.\n * - The loop has to be [normalized](https://en.wikipedia.org/wiki/Normalized_loop).\n * - The loop variable has to be *i*.\n * - The value `UNROLLED_LOOP_INDEX` will be replaced with the explicitly\n * value of *i* for the given iteration and can be used in preprocessor\n * statements.\n *\n * ```js\n * const material = new THREE.ShaderMaterial( {\n * \tuniforms: {\n * \t\ttime: { value: 1.0 },\n * \t\tresolution: { value: new THREE.Vector2() }\n * \t},\n * \tvertexShader: document.getElementById( 'vertexShader' ).textContent,\n * \tfragmentShader: document.getElementById( 'fragmentShader' ).textContent\n * } );\n * ```\n *\n * @augments Material\n */\nclass ShaderMaterial extends Material {\n\n\t/**\n\t * Constructs a new shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\t/**\n\t\t * Defines custom constants using `#define` directives within the GLSL code\n\t\t * for both the vertex shader and the fragment shader; each key/value pair\n\t\t * yields another directive.\n\t\t * ```js\n\t\t * defines: {\n\t\t * \tFOO: 15,\n\t\t * \tBAR: true\n\t\t * }\n\t\t * ```\n\t\t * Yields the lines:\n\t\t * ```\n\t\t * #define FOO 15\n\t\t * #define BAR true\n\t\t * ```\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defines = {};\n\n\t\t/**\n\t\t * An object of the form:\n\t\t * ```js\n\t\t * {\n\t\t * \t\"uniform1\": { value: 1.0 },\n\t\t * \t\"uniform2\": { value: 2 }\n\t\t * }\n\t\t * ```\n\t\t * specifying the uniforms to be passed to the shader code; keys are uniform\n\t\t * names, values are definitions of the form\n\t\t * ```\n\t\t * {\n\t\t * \tvalue: 1.0\n\t\t * }\n\t\t * ```\n\t\t * where `value` is the value of the uniform. Names must match the name of\n\t\t * the uniform, as defined in the GLSL code. Note that uniforms are refreshed\n\t\t * on every frame, so updating the value of the uniform will immediately\n\t\t * update the value available to the GLSL code.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = {};\n\n\t\t/**\n\t\t * An array holding uniforms groups for configuring UBOs.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.uniformsGroups = [];\n\n\t\t/**\n\t\t * Vertex shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.vertexShader = default_vertex;\n\n\t\t/**\n\t\t * Fragment shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.fragmentShader = default_fragment;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * WebGL and WebGPU ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Define whether the material color is affected by global fog settings; `true`\n\t\t * to pass fog uniforms to the shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.fog = false;\n\n\t\t/**\n\t\t * Defines whether this material uses lighting; `true` to pass uniform data\n\t\t * related to lighting to this shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.lights = false;\n\n\t\t/**\n\t\t * Defines whether this material supports clipping; `true` to let the renderer\n\t\t * pass the clippingPlanes uniform.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipping = false;\n\n\t\t/**\n\t\t * Overwritten and set to `true` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.forceSinglePass = true;\n\n\t\t/**\n\t\t * This object allows to enable certain WebGL 2 extensions.\n\t\t *\n\t\t * - clipCullDistance: set to `true` to use vertex shader clipping\n\t\t * - multiDraw: set to `true` to use vertex shader multi_draw / enable gl_DrawID\n\t\t *\n\t\t * @type {{clipCullDistance:false,multiDraw:false}}\n\t\t */\n\t\tthis.extensions = {\n\t\t\tclipCullDistance: false, // set to use vertex shader clipping\n\t\t\tmultiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID\n\t\t};\n\n\t\t/**\n\t\t * When the rendered geometry doesn't include these attributes but the\n\t\t * material does, these default values will be passed to the shaders. This\n\t\t * avoids errors when buffer data is missing.\n\t\t *\n\t\t * - color: [ 1, 1, 1 ]\n\t\t * - uv: [ 0, 0 ]\n\t\t * - uv1: [ 0, 0 ]\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv1': [ 0, 0 ]\n\t\t};\n\n\t\t/**\n\t\t * If set, this calls [gl.bindAttribLocation](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bindAttribLocation)\n\t\t * to bind a generic vertex index to an attribute variable.\n\t\t *\n\t\t * @type {string|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.index0AttributeName = undefined;\n\n\t\t/**\n\t\t * Can be used to force a uniform update while changing uniforms in\n\t\t * {@link Object3D#onBeforeRender}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\t/**\n\t\t * Defines the GLSL version of custom shader code.\n\t\t *\n\t\t * @type {?(GLSL1|GLSL3)}\n\t\t * @default null\n\t\t */\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tdata.lights = this.lights;\n\t\tdata.clipping = this.clipping;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Abstract base class for cameras. This class should always be inherited\n * when you build a new camera.\n *\n * @abstract\n * @augments Object3D\n */\nclass Camera extends Object3D {\n\n\t/**\n\t * Constructs a new camera.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\t/**\n\t\t * The inverse of the camera's world matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\t/**\n\t\t * The camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The inverse of the camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The coordinate system in which the camera is used.\n\t\t *\n\t\t * @type {(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t\tthis._reversedDepth = false;\n\n\t}\n\n\t/**\n\t * The flag that indicates whether the camera uses a reversed depth buffer.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget reversedDepth() {\n\n\t\treturn this._reversedDepth;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\tthis.coordinateSystem = source.coordinateSystem;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * This method is overwritten since cameras have a different forward vector compared to other\n\t * 3D objects. A camera looks down its local, negative z-axis by default.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\treturn super.getWorldDirection( target ).negate();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _v3$1 = /*@__PURE__*/ new Vector3();\nconst _minTarget = /*@__PURE__*/ new Vector2();\nconst _maxTarget = /*@__PURE__*/ new Vector2();\n\n/**\n * Camera that uses [perspective projection](https://en.wikipedia.org/wiki/Perspective_(graphical)).\n *\n * This projection mode is designed to mimic the way the human eye sees. It\n * is the most common projection mode used for rendering a 3D scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 45, width / height, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass PerspectiveCamera extends Camera {\n\n\t/**\n\t * Constructs a new perspective camera.\n\t *\n\t * @param {number} [fov=50] - The vertical field of view.\n\t * @param {number} [aspect=1] - The aspect ratio.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\t/**\n\t\t * The vertical field of view, from bottom to top of view,\n\t\t * in degrees.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 50\n\t\t */\n\t\tthis.fov = fov;\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link PerspectiveCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link OrthographicCamera}, `0` is not a\n\t\t * valid value for a perspective camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link PerspectiveCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * Object distance used for stereoscopy and depth-of-field effects. This\n\t\t * parameter does not influence the projection matrix unless a\n\t\t * {@link StereoCamera} is being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.focus = 10;\n\n\t\t/**\n\t\t * The aspect ratio, usually the canvas width / canvas height.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = aspect;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * Film size used for the larger axis. Default is `35` (millimeters). This\n\t\t * parameter does not influence the projection matrix unless {@link PerspectiveCamera#filmOffset}\n\t\t * is set to a nonzero value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 35\n\t\t */\n\t\tthis.filmGauge = 35;\n\n\t\t/**\n\t\t * Horizontal off-center offset in the same unit as {@link PerspectiveCamera#filmGauge}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.filmOffset = 0;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * @param {number} focalLength - Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Returns the focal length from the current {@link PerspectiveCamera#fov} and\n\t * {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The computed focal length.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\t/**\n\t * Returns the current vertical field of view angle in degrees considering {@link PerspectiveCamera#zoom}.\n\t *\n\t * @return {number} The effective FOV.\n\t */\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\t/**\n\t * Returns the width of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Returns the height of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Sets `minTarget` and `maxTarget` to the coordinates of the lower-left and upper-right corners of the view rectangle.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} minTarget - The lower-left corner of the view rectangle is written into this vector.\n\t * @param {Vector2} maxTarget - The upper-right corner of the view rectangle is written into this vector.\n\t */\n\tgetViewBounds( distance, minTarget, maxTarget ) {\n\n\t\t_v3$1.set( -1, -1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tminTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t\t_v3$1.set( 1, 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tmaxTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t}\n\n\t/**\n\t * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} target - The target vector that is used to store result where x is width and y is height.\n\t * @returns {Vector2} The view size.\n\t */\n\tgetViewSize( distance, target ) {\n\n\t\tthis.getViewBounds( distance, _minTarget, _maxTarget );\n\n\t\treturn target.subVectors( _maxTarget, _minTarget );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *```\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *```\n\t * then for each monitor you would call it like this:\n\t *```js\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * // --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * // --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * // --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * // --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * // --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * // --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t * ```\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = -0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst fov = -90; // negative fov is not an error\nconst aspect = 1;\n\n/**\n * A special type of camera that is positioned in 3D space to render its surroundings into a\n * cube render target. The render target can then be used as an environment map for rendering\n * realtime reflections in your scene.\n *\n * ```js\n * // Create cube render target\n * const cubeRenderTarget = new THREE.WebGLCubeRenderTarget( 256, { generateMipmaps: true, minFilter: THREE.LinearMipmapLinearFilter } );\n *\n * // Create cube camera\n * const cubeCamera = new THREE.CubeCamera( 1, 100000, cubeRenderTarget );\n * scene.add( cubeCamera );\n *\n * // Create car\n * const chromeMaterial = new THREE.MeshLambertMaterial( { color: 0xffffff, envMap: cubeRenderTarget.texture } );\n * const car = new THREE.Mesh( carGeometry, chromeMaterial );\n * scene.add( car );\n *\n * // Update the render target cube\n * car.visible = false;\n * cubeCamera.position.copy( car.position );\n * cubeCamera.update( renderer, scene );\n *\n * // Render the scene\n * car.visible = true;\n * renderer.render( scene, camera );\n * ```\n *\n * @augments Object3D\n */\nclass CubeCamera extends Object3D {\n\n\t/**\n\t * Constructs a new cube camera.\n\t *\n\t * @param {number} near - The camera's near plane.\n\t * @param {number} far - The camera's far plane.\n\t * @param {WebGLCubeRenderTarget} renderTarget - The cube render target.\n\t */\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\t/**\n\t\t * A reference to the cube render target.\n\t\t *\n\t\t * @type {WebGLCubeRenderTarget}\n\t\t */\n\t\tthis.renderTarget = renderTarget;\n\n\t\t/**\n\t\t * The current active coordinate system.\n\t\t *\n\t\t * @type {?(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t * @default null\n\t\t */\n\t\tthis.coordinateSystem = null;\n\n\t\t/**\n\t\t * The current active mipmap level\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\t/**\n\t * Must be called when the coordinate system of the cube camera is changed.\n\t */\n\tupdateCoordinateSystem() {\n\n\t\tconst coordinateSystem = this.coordinateSystem;\n\n\t\tconst cameras = this.children.concat();\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras;\n\n\t\tfor ( const camera of cameras ) this.remove( camera );\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, 1, 0 );\n\t\t\tcameraPX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, 1, 0 );\n\t\t\tcameraNX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, -1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, 1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, -1, 0 );\n\t\t\tcameraPX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, -1, 0 );\n\t\t\tcameraNX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, -1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, -1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, -1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tfor ( const camera of cameras ) {\n\n\t\t\tthis.add( camera );\n\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calling this method will render the given scene with the given renderer\n\t * into the cube render target of the camera.\n\t *\n\t * @param {(Renderer|WebGLRenderer)} renderer - The renderer.\n\t * @param {Scene} scene - The scene to render.\n\t */\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst { renderTarget, activeMipmapLevel } = this;\n\n\t\tif ( this.coordinateSystem !== renderer.coordinateSystem ) {\n\n\t\t\tthis.coordinateSystem = renderer.coordinateSystem;\n\n\t\t\tthis.updateCoordinateSystem();\n\n\t\t}\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentActiveCubeFace = renderer.getActiveCubeFace();\n\t\tconst currentActiveMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\t// mipmaps are generated during the last call of render()\n\t\t// at this point, all sides of the cube render target are defined\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a cube texture made up of six images.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader();\n * loader.setPath( 'textures/cube/pisa/' );\n *\n * const textureCube = loader.load( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xffffff, envMap: textureCube } );\n * ```\n *\n * @augments Texture\n */\nclass CubeTexture extends Texture {\n\n\t/**\n\t * Constructs a new cube texture.\n\t *\n\t * @param {Array} [images=[]] - An array holding a image for each side of a cube.\n\t * @param {number} [mapping=CubeReflectionMapping] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space value.\n\t */\n\tconstructor( images = [], mapping = CubeReflectionMapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) {\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t}\n\n\t/**\n\t * Alias for {@link CubeTexture#image}.\n\t *\n\t * @type {Array}\n\t */\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\n/**\n * A cube render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new cube render target.\n\t *\n\t * @param {number} [size=1] - The size of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new CubeTexture( images );\n\t\tthis._setTextureOptions( options );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n\t/**\n\t * Converts the given equirectangular texture to a cube map.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Texture} texture - The equirectangular texture.\n\t * @return {WebGLCubeRenderTarget} A reference to this cube render target.\n\t */\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.colorSpace = texture.colorSpace;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Clears this cube render target.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t */\n\tclear( renderer, color = true, depth = true, stencil = true ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\n/**\n * This is almost identical to an {@link Object3D}. Its purpose is to\n * make working with groups of objects syntactically clearer.\n *\n * ```js\n * // Create a group and add the two cubes.\n * // These cubes can now be rotated / scaled etc as a group.\n * const group = new THREE.Group();\n *\n * group.add( meshA );\n * group.add( meshB );\n *\n * scene.add( group );\n * ```\n *\n * @augments Object3D\n */\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\n/**\n * Class for representing a XR controller with its\n * different coordinate systems.\n *\n * @private\n */\nclass WebXRController {\n\n\t/**\n\t * Constructs a new XR controller.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A group representing the target ray space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._targetRay = null;\n\n\t\t/**\n\t\t * A group representing the grip space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._grip = null;\n\n\t\t/**\n\t\t * A group representing the hand space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._hand = null;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand space of the XR controller.\n\t *\n\t * @return {Group} A group representing the hand space of the XR controller.\n\t */\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\t/**\n\t * Returns a group representing the target ray space of the XR controller.\n\t *\n\t * @return {Group} A group representing the target ray space of the XR controller.\n\t */\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\t/**\n\t * Returns a group representing the grip space of the XR controller.\n\t *\n\t * @return {Group} A group representing the grip space of the XR controller.\n\t */\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\t/**\n\t * Dispatches the given event to the groups representing\n\t * the different coordinate spaces of the XR controller.\n\t *\n\t * @param {Object} event - The event to dispatch.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects the controller with the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tconnect( inputSource ) {\n\n\t\tif ( inputSource && inputSource.hand ) {\n\n\t\t\tconst hand = this._hand;\n\n\t\t\tif ( hand ) {\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Initialize hand with joints when connected\n\t\t\t\t\tthis._getHandJoint( hand, inputjoint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects the controller from the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the controller with the given input source, XR frame and reference space.\n\t * This updates the transformations of the groups that represent the different\n\t * coordinate systems of the controller.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @param {XRFrame} frame - The XR frame.\n\t * @param {XRReferenceSpace} referenceSpace - The reference space.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = this._getHandJoint( hand, inputjoint );\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.matrixWorldNeedsUpdate = true;\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\t\t\t\t\t\tgrip.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\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\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\t\t\t\t\ttargetRay.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand joint for the given input joint.\n\t *\n\t * @private\n\t * @param {Group} hand - The group representing the hand space.\n\t * @param {XRJointSpace} inputjoint - The hand joint data.\n\t * @return {Group} A group representing the hand joint for the given input joint.\n\t */\n\t_getHandJoint( hand, inputjoint ) {\n\n\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\tconst joint = new Group();\n\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\tjoint.visible = false;\n\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\n\t\t\thand.add( joint );\n\n\t\t}\n\n\t\treturn hand.joints[ inputjoint.jointName ];\n\n\t}\n\n}\n\n/**\n * This class can be used to define an exponential squared fog,\n * which gives a clear view near the camera and a faster than exponentially\n * densening fog farther from the camera.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );\n * ```\n */\nclass FogExp2 {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [density=0.00025] - Defines how fast the fog will grow dense.\n\t */\n\tconstructor( color, density = 0.00025 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFogExp2 = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * Defines how fast the fog will grow dense.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.00025\n\t\t */\n\t\tthis.density = density;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {FogExp2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\n/**\n * This class can be used to define a linear fog that grows linearly denser\n * with the distance.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );\n * ```\n */\nclass Fog {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [near=1] - The minimum distance to start applying fog.\n\t * @param {number} [far=1000] - The maximum distance at which fog stops being calculated and applied.\n\t */\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFog = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The minimum distance to start applying fog. Objects that are less than\n\t\t * `near` units from the active camera won't be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The maximum distance at which fog stops being calculated and applied.\n\t\t * Objects that are more than `far` units away from the active camera won't\n\t\t * be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1000\n\t\t */\n\t\tthis.far = far;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {Fog} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\n/**\n * Scenes allow you to set up what is to be rendered and where by three.js.\n * This is where you place 3D objects like meshes, lines or lights.\n *\n * @augments Object3D\n */\nclass Scene extends Object3D {\n\n\t/**\n\t * Constructs a new scene.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\t/**\n\t\t * Defines the background of the scene. Valid inputs are:\n\t\t *\n\t\t * - A color for defining a uniform colored background.\n\t\t * - A texture for defining a (flat) textured background.\n\t\t * - Cube textures or equirectangular textures for defining a skybox.\n\t\t *\n\t\t * @type {?(Color|Texture)}\n\t\t * @default null\n\t\t */\n\t\tthis.background = null;\n\n\t\t/**\n\t\t * Sets the environment map for all physical materials in the scene. However,\n\t\t * it's not possible to overwrite an existing texture assigned to the `envMap`\n\t\t * material property.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.environment = null;\n\n\t\t/**\n\t\t * A fog instance defining the type of fog that affects everything\n\t\t * rendered in the scene.\n\t\t *\n\t\t * @type {?(Fog|FogExp2)}\n\t\t * @default null\n\t\t */\n\t\tthis.fog = null;\n\n\t\t/**\n\t\t * Sets the blurriness of the background. Only influences environment maps\n\t\t * assigned to {@link Scene#background}. Valid input is a float between `0`\n\t\t * and `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.backgroundBlurriness = 0;\n\n\t\t/**\n\t\t * Attenuates the color of the background. Only applies to background textures.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.backgroundIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the background in radians. Only influences environment maps\n\t\t * assigned to {@link Scene#background}.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.backgroundRotation = new Euler();\n\n\t\t/**\n\t\t * Attenuates the color of the environment. Only influences environment maps\n\t\t * assigned to {@link Scene#environment}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.environmentIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians. Only influences physical materials\n\t\t * in the scene when {@link Scene#environment} is used.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.environmentRotation = new Euler();\n\n\t\t/**\n\t\t * Forces everything in the scene to be rendered with the defined material. It is possible\n\t\t * to exclude materials from override by setting {@link Material#allowOverride} to `false`.\n\t\t *\n\t\t * @type {?Material}\n\t\t * @default null\n\t\t */\n\t\tthis.overrideMaterial = null;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tthis.backgroundBlurriness = source.backgroundBlurriness;\n\t\tthis.backgroundIntensity = source.backgroundIntensity;\n\t\tthis.backgroundRotation.copy( source.backgroundRotation );\n\n\t\tthis.environmentIntensity = source.environmentIntensity;\n\t\tthis.environmentRotation.copy( source.environmentRotation );\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\tif ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness;\n\t\tif ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity;\n\t\tdata.object.backgroundRotation = this.backgroundRotation.toArray();\n\n\t\tif ( this.environmentIntensity !== 1 ) data.object.environmentIntensity = this.environmentIntensity;\n\t\tdata.object.environmentRotation = this.environmentRotation.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * \"Interleaved\" means that multiple attributes, possibly of different types,\n * (e.g., position, normal, uv, color) are packed into a single array buffer.\n *\n * An introduction into interleaved arrays can be found here: [Interleaved array basics](https://blog.tojicode.com/2011/05/interleaved-array-basics.html)\n */\nclass InterleavedBuffer {\n\n\t/**\n\t * Constructs a new interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t */\n\tconstructor( array, stride ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBuffer = true;\n\n\t\t/**\n\t\t * A typed array with a shared buffer storing attribute data.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of typed-array elements per vertex.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.stride = stride;\n\n\t\t/**\n\t\t * The total number of elements in the array\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * The UUID of the interleaved buffer.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute array\n\t * data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this interleaved buffer.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {InterleavedBuffer} A reference to this interleaved buffer.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given interleaved buffer to this instance.\n\t *\n\t * @param {InterleavedBuffer} source - The interleaved buffer to copy.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given interleaved buffer to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this interleaved buffer.\n\t * @param {InterleavedBuffer} interleavedBuffer - The interleaved buffer to copy from.\n\t * @param {number} index2 - The source index into the given interleaved buffer.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopyAt( index1, interleavedBuffer, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= interleavedBuffer.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = interleavedBuffer.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the interleaved buffer.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this interleaved buffer's array.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new interleaved buffer with copied values from this instance.\n\t *\n\t * @param {Object} [data] - An object with shared array buffers that allows to retain shared structures.\n\t * @return {InterleavedBuffer} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the interleaved buffer into JSON.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized interleaved buffer.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\n/**\n * An alternative version of a buffer attribute with interleaved data. Interleaved\n * attributes share a common interleaved data storage ({@link InterleavedBuffer}) and refer with\n * different offsets into the buffer.\n */\nclass InterleavedBufferAttribute {\n\n\t/**\n\t * Constructs a new interleaved buffer attribute.\n\t *\n\t * @param {InterleavedBuffer} interleavedBuffer - The buffer holding the interleaved data.\n\t * @param {number} itemSize - The item size.\n\t * @param {number} offset - The attribute offset into the buffer.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer holding the interleaved data.\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.data = interleavedBuffer;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The attribute offset into the buffer.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.offset = offset;\n\n\t\t/**\n\t\t * Whether the data are normalized or not, see {@link BufferAttribute#normalized}\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t}\n\n\t/**\n\t * The item count of this buffer attribute.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\t/**\n\t * The array holding the interleaved buffer attribute data.\n\t *\n\t * @type {TypedArray}\n\t */\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.data.stride + this.offset + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.data.array[ index * this.data.stride + this.offset ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An object with interleaved buffers that allows to retain the interleaved property.\n\t * @return {BufferAttribute|InterleavedBufferAttribute} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// de-interleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribute\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A material for rendering instances of {@link Sprite}.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'textures/sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map, color: 0xffffff } );\n *\n * const sprite = new THREE.Sprite( material );\n * sprite.scale.set(200, 200, 1)\n * scene.add( sprite );\n * ```\n *\n * @augments Material\n */\nclass SpriteMaterial extends Material {\n\n\t/**\n\t * Constructs a new sprite material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The rotation of the sprite in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Specifies whether size of the sprite is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Overwritten since sprite materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\n/**\n * A sprite is a plane that always faces towards the camera, generally with a\n * partially transparent texture applied.\n *\n * Sprites do not cast shadows, setting {@link Object3D#castShadow} to `true` will\n * have no effect.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map } );\n *\n * const sprite = new THREE.Sprite( material );\n * scene.add( sprite );\n * ```\n *\n * @augments Object3D\n */\nclass Sprite extends Object3D {\n\n\t/**\n\t * Constructs a new sprite.\n\t *\n\t * @param {(SpriteMaterial|SpriteNodeMaterial)} [material] - The sprite material.\n\t */\n\tconstructor( material = new SpriteMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t-0.5, -0.5, 0, 0, 0,\n\t\t\t\t0.5, -0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t-0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\t/**\n\t\t * The sprite geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = _geometry;\n\n\t\t/**\n\t\t * The sprite material.\n\t\t *\n\t\t * @type {(SpriteMaterial|SpriteNodeMaterial)}\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * The sprite's anchor point, and the point around which the sprite rotates.\n\t\t * A value of `(0.5, 0.5)` corresponds to the midpoint of the sprite. A value\n\t\t * of `(0, 0)` corresponds to the lower left corner of the sprite.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0.5,0.5)\n\t\t */\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t\t/**\n\t\t * The number of instances of this sprite.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this sprite.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\terror( 'Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( -0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( -0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getInterpolation( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A component for providing a basic Level of Detail (LOD) mechanism.\n *\n * Every LOD level is associated with an object, and rendering can be switched\n * between them at the distances specified. Typically you would create, say,\n * three meshes, one for far away (low detail), one for mid range (medium\n * detail) and one for close up (high detail).\n *\n * ```js\n * const lod = new THREE.LOD();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n *\n * //Create spheres with 3 levels of detail and create new LOD levels for them\n * for( let i = 0; i < 3; i++ ) {\n *\n * \tconst geometry = new THREE.IcosahedronGeometry( 10, 3 - i );\n * \tconst mesh = new THREE.Mesh( geometry, material );\n * \tlod.addLevel( mesh, i * 75 );\n *\n * }\n *\n * scene.add( lod );\n * ```\n *\n * @augments Object3D\n */\nclass LOD extends Object3D {\n\n\t/**\n\t * Constructs a new LOD.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLOD = true;\n\n\t\t/**\n\t\t * The current LOD index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * This array holds the LOD levels.\n\t\t\t *\n\t\t\t * @name LOD#levels\n\t\t\t * @type {Array<{object:Object3D,distance:number,hysteresis:number}>}\n\t\t\t */\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Whether the LOD object is updated automatically by the renderer per frame\n\t\t * or not. If set to `false`, you have to call {@link LOD#update} in the\n\t\t * render loop by yourself.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance, level.hysteresis );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a mesh that will display at a certain distance and greater. Typically\n\t * the further away the distance, the lower the detail on the mesh.\n\t *\n\t * @param {Object3D} object - The 3D object to display at this level.\n\t * @param {number} [distance=0] - The distance at which to display this level of detail.\n\t * @param {number} [hysteresis=0] - Threshold used to avoid flickering at LOD boundaries, as a fraction of distance.\n\t * @return {LOD} A reference to this instance.\n\t */\n\taddLevel( object, distance = 0, hysteresis = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes an existing level, based on the distance from the camera.\n\t * Returns `true` when the level has been removed. Otherwise `false`.\n\t *\n\t * @param {number} distance - Distance of the level to remove.\n\t * @return {boolean} Whether the level has been removed or not.\n\t */\n\tremoveLevel( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0; i < levels.length; i ++ ) {\n\n\t\t\tif ( levels[ i ].distance === distance ) {\n\n\t\t\t\tconst removedElements = levels.splice( i, 1 );\n\t\t\t\tthis.remove( removedElements[ 0 ].object );\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns the currently active LOD level index.\n\t *\n\t * @return {number} The current active LOD level index.\n\t */\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\t/**\n\t * Returns a reference to the first 3D object that is greater than\n\t * the given distance.\n\t *\n\t * @param {number} distance - The LOD distance.\n\t * @return {?Object3D} The found 3D object. `null` if no 3D object has been found.\n\t */\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance < levelDistance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this LOD.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the LOD by computing which LOD level should be visible according\n\t * to the current distance of the given camera.\n\t *\n\t * @param {Camera} camera - The camera the scene is rendered with.\n\t */\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance >= levelDistance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance,\n\t\t\t\thysteresis: level.hysteresis\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector3 = /*@__PURE__*/ new Vector3();\nconst _matrix4 = /*@__PURE__*/ new Matrix4();\nconst _vertex = /*@__PURE__*/ new Vector3();\n\nconst _sphere$5 = /*@__PURE__*/ new Sphere();\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\n\n/**\n * A mesh that has a {@link Skeleton} that can then be used to animate the\n * vertices of the geometry with skinning/skeleton animation.\n *\n * Next to a valid skeleton, the skinned mesh requires skin indices and weights\n * as buffer attributes in its geometry. These attribute define which bones affect a single\n * vertex to a certain extend.\n *\n * Typically skinned meshes are not created manually but loaders like {@link GLTFLoader}\n * or {@link FBXLoader } import respective models.\n *\n * @augments Mesh\n * @demo scenes/bones-browser.html\n */\nclass SkinnedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new skinned mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkinnedMesh = true;\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\t/**\n\t\t * `AttachedBindMode` means the skinned mesh shares the same world space as the skeleton.\n\t\t * This is not true when using `DetachedBindMode` which is useful when sharing a skeleton\n\t\t * across multiple skinned meshes.\n\t\t *\n\t\t * @type {(AttachedBindMode|DetachedBindMode)}\n\t\t * @default AttachedBindMode\n\t\t */\n\t\tthis.bindMode = AttachedBindMode;\n\n\t\t/**\n\t\t * The base matrix that is used for the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The base matrix that is used for resetting the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The bounding box of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the skinned mesh, and updates {@link SkinnedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * If the skinned mesh is animated, the bounding box should be recomputed per frame in order to reflect\n\t * the current animation state.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingBox.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the skinned mesh, and updates {@link SkinnedMesh#boundingSphere}.\n\t * The bounding sphere is automatically computed by the engine once when it is needed, e.g., for ray casting\n\t * and view frustum culling. If the skinned mesh is animated, the bounding sphere should be recomputed\n\t * per frame in order to reflect the current animation state.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingSphere.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$5.copy( this.boundingSphere );\n\t\t_sphere$5.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$5 ) === false ) return;\n\n\t\t// convert ray to local space of skinned mesh\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( this.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$2 );\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tsuper.getVertexPosition( index, target );\n\n\t\tthis.applyBoneTransform( index, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Binds the given skeleton to the skinned mesh.\n\t *\n\t * @param {Skeleton} skeleton - The skeleton to bind.\n\t * @param {Matrix4} [bindMatrix] - The bind matrix. If no bind matrix is provided,\n\t * the skinned mesh's world matrix will be used instead.\n\t */\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\t/**\n\t * This method sets the skinned mesh in the rest pose).\n\t */\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\t/**\n\t * Normalizes the skin weights which are defined as a buffer attribute\n\t * in the skinned mesh's geometry.\n\t */\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === AttachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === DetachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\twarn( 'SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies the bone transform associated with the given index to the given\n\t * vertex position. Returns the updated vector.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * the skinned mesh's world matrix will be used instead.\n\t * @return {Vector3} The updated vertex position.\n\t */\n\tapplyBoneTransform( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( target ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\n/**\n * A bone which is part of a {@link Skeleton}. The skeleton in turn is used by\n * the {@link SkinnedMesh}.\n *\n * ```js\n * const root = new THREE.Bone();\n * const child = new THREE.Bone();\n *\n * root.add( child );\n * child.position.y = 5;\n * ```\n *\n * @augments Object3D\n */\nclass Bone extends Object3D {\n\n\t/**\n\t * Constructs a new bone.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\n/**\n * Creates a texture directly from raw buffer data.\n *\n * The interpretation of the data depends on type and format: If the type is\n * `UnsignedByteType`, a `Uint8Array` will be useful for addressing the\n * texel data. If the format is `RGBAFormat`, data needs four values for\n * one texel; Red, Green, Blue and Alpha (typically the opacity).\n *\n * @augments Texture\n */\nclass DataTexture extends Texture {\n\n\t/**\n\t * Constructs a new data texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=NearestFilter] - The mag filter value.\n\t * @param {number} [minFilter=NearestFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number}}\n\t\t */\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * Class for representing the armatures in `three.js`. The skeleton\n * is defined by a hierarchy of bones.\n *\n * ```js\n * const bones = [];\n *\n * const shoulder = new THREE.Bone();\n * const elbow = new THREE.Bone();\n * const hand = new THREE.Bone();\n *\n * shoulder.add( elbow );\n * elbow.add( hand );\n *\n * bones.push( shoulder , elbow, hand);\n *\n * shoulder.position.y = -5;\n * elbow.position.y = 0;\n * hand.position.y = 5;\n *\n * const armSkeleton = new THREE.Skeleton( bones );\n * ```\n */\nclass Skeleton {\n\n\t/**\n\t * Constructs a new skeleton.\n\t *\n\t * @param {Array} [bones] - An array of bones.\n\t * @param {Array} [boneInverses] - An array of bone inverse matrices.\n\t * If not provided, these matrices will be computed automatically via {@link Skeleton#calculateInverses}.\n\t */\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An array of bones defining the skeleton.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t/**\n\t\t * An array of bone inverse matrices.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.boneInverses = boneInverses;\n\n\t\t/**\n\t\t * An array buffer holding the bone data.\n\t\t * Input data for {@link Skeleton#boneTexture}.\n\t\t *\n\t\t * @type {?Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis.boneMatrices = null;\n\n\t\t/**\n\t\t * A texture holding the bone data for use\n\t\t * in the vertex shader.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.boneTexture = null;\n\n\t\tthis.init();\n\n\t}\n\n\t/**\n\t * Initializes the skeleton. This method gets automatically called by the constructor\n\t * but depending on how the skeleton is created it might be necessary to call this method\n\t * manually.\n\t */\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\twarn( 'Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bone inverse matrices. This method resets {@link Skeleton#boneInverses}\n\t * and fills it with new matrices.\n\t */\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new skeleton with copied values from this instance.\n\t *\n\t * @return {Skeleton} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\t/**\n\t * Computes a data texture for passing bone data to the vertex shader.\n\t *\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the skeleton's bone array and returns the first with a\n\t * matching name.\n\t *\n\t * @param {string} name - The name of the bone.\n\t * @return {Bone|undefined} The found bone. `undefined` if no bone has been found.\n\t */\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setups the skeleton by the given JSON and bones.\n\t *\n\t * @param {Object} json - The skeleton as serialized JSON.\n\t * @param {Object} bones - An array of bones.\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\twarn( 'Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the skeleton into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized skeleton.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * An instanced version of a buffer attribute.\n *\n * @augments BufferAttribute\n */\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new instanced buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t * @param {number} [meshPerAttribute=1] - How often a value of this buffer attribute should be repeated.\n\t */\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated. A\n\t\t * value of one means that each value of the instanced attribute is used for\n\t\t * a single instance. A value of two means that each value is used for two\n\t\t * consecutive instances (and so on).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _box3 = /*@__PURE__*/ new Box3();\nconst _identity = /*@__PURE__*/ new Matrix4();\nconst _mesh$1 = /*@__PURE__*/ new Mesh();\nconst _sphere$4 = /*@__PURE__*/ new Sphere();\n\n/**\n * A special version of a mesh with instanced rendering support. Use\n * this class if you have to render a large number of objects with the same\n * geometry and material(s) but with different world transformations. The usage\n * of 'InstancedMesh' will help you to reduce the number of draw calls and thus\n * improve the overall rendering performance in your application.\n *\n * @augments Mesh\n */\nclass InstancedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new instanced mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t * @param {number} count - The number of instances.\n\t */\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedMesh = true;\n\n\t\t/**\n\t\t * Represents the local transformation of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMatrixAt}.\n\t\t *\n\t\t * @type {InstancedBufferAttribute}\n\t\t */\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\n\t\t/**\n\t\t * Represents the color of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setColorAt}.\n\t\t *\n\t\t * @type {?InstancedBufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.instanceColor = null;\n\n\t\t/**\n\t\t * Represents the morph target weights of all instances. You have to set its\n\t\t * {@link Texture#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMorphAt}.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.morphTexture = null;\n\n\t\t/**\n\t\t * The number of instances.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * The bounding box of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.setMatrixAt( i, _identity );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the instanced mesh, and updates {@link InstancedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * You may need to recompute the bounding box if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingBox.union( _box3 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the instanced mesh, and updates {@link InstancedMesh#boundingSphere}\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_sphere$4.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingSphere.union( _sphere$4 );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone();\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the color of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t */\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Gets the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t */\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Gets the morph target weights of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - The target object that is used to store the method's result.\n\t */\n\tgetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tconst len = objectInfluences.length + 1; // All influences + the baseInfluenceSum\n\n\t\tconst dataIndex = index * len + 1; // Skip the baseInfluenceSum at the beginning\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tobjectInfluences[ i ] = array[ dataIndex + i ];\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh$1.geometry = this.geometry;\n\t\t_mesh$1.material = this.material;\n\n\t\tif ( _mesh$1.material === undefined ) return;\n\n\t\t// test with bounding sphere first\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$4.copy( this.boundingSphere );\n\t\t_sphere$4.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$4 ) === false ) return;\n\n\t\t// now test each instance\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh$1.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh$1.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceColor} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The instance color.\n\t */\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ).fill( 1 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceMatrix} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The local transformation.\n\t */\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Sets the morph target weights to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#morphTexture} to `true` after updating all the influences.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - A mesh which `morphTargetInfluences` property containing the morph target weights\n\t * of a single instance.\n\t */\n\tsetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst len = objectInfluences.length + 1; // morphBaseInfluence + all influences\n\n\t\tif ( this.morphTexture === null ) {\n\n\t\t\tthis.morphTexture = new DataTexture( new Float32Array( len * this.count ), len, this.count, RedFormat, FloatType );\n\n\t\t}\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tlet morphInfluencesSum = 0;\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t}\n\n\t\tconst morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\tconst dataIndex = len * index;\n\n\t\tarray[ dataIndex ] = morphBaseInfluence;\n\n\t\tarray.set( objectInfluences, dataIndex + 1 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\tif ( this.morphTexture !== null ) {\n\n\t\t\tthis.morphTexture.dispose();\n\t\t\tthis.morphTexture = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\n/**\n * A two dimensional surface that extends infinitely in 3D space, represented\n * in [Hessian normal form](http://mathworld.wolfram.com/HessianNormalForm.html)\n * by a unit length normal vector and a constant.\n */\nclass Plane {\n\n\t/**\n\t * Constructs a new plane.\n\t *\n\t * @param {Vector3} [normal=(1,0,0)] - A unit length vector defining the normal of the plane.\n\t * @param {number} [constant=0] - The signed distance from the origin to the plane.\n\t */\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPlane = true;\n\n\t\t/**\n\t\t * A unit length vector defining the normal of the plane.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.normal = normal;\n\n\t\t/**\n\t\t * The signed distance from the origin to the plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.constant = constant;\n\n\t}\n\n\t/**\n\t * Sets the plane components by copying the given values.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {number} constant - The constant.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane components by defining `x`, `y`, `z` as the\n\t * plane normal and `w` as the constant.\n\t *\n\t * @param {number} x - The value for the normal's x component.\n\t * @param {number} y - The value for the normal's y component.\n\t * @param {number} z - The value for the normal's z component.\n\t * @param {number} w - The constant value.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from the given normal and coplanar point (that is a point\n\t * that lies onto the plane).\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Vector3} point - A coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from three coplanar points. The winding order is\n\t * assumed to be counter-clockwise, and determines the direction of\n\t * the plane normal.\n\t *\n\t * @param {Vector3} a - The first coplanar point.\n\t * @param {Vector3} b - The second coplanar point.\n\t * @param {Vector3} c - The third coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given plane to this instance.\n\t *\n\t * @param {Plane} plane - The plane to copy.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Normalizes the plane normal and adjusts the constant accordingly.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Negates both the plane normal and the constant.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnegate() {\n\n\t\tthis.constant *= -1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given point to this plane.\n\t *\n\t * @param {Vector3} point - The point to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given sphere to this plane.\n\t *\n\t * @param {Sphere} sphere - The sphere to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\t/**\n\t * Projects a the given point onto the plane.\n\t *\n\t * @param {Vector3} point - The point to project.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The projected point on the plane.\n\t */\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the intersection point of the passed line and the plane. Returns\n\t * `null` if the line does not intersect. Returns the line's starting point if\n\t * the line is coplanar with the plane.\n\t *\n\t * @param {Line3} line - The line to compute the intersection for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( line.start ).addScaledVector( direction, t );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given line segment intersects with (passes through) the plane.\n\t *\n\t * @param {Line3} line - The line to test.\n\t * @return {boolean} Whether the given line segment intersects with the plane or not.\n\t */\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with the plane.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with the plane or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with the plane.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with the plane or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns a coplanar vector to the plane, by calculating the\n\t * projection of the normal at the origin onto the plane.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The coplanar point.\n\t */\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\t/**\n\t * Apply a 4x4 matrix to the plane. The matrix must be an affine, homogeneous transform.\n\t *\n\t * The optional normal matrix can be pre-computed like so:\n\t * ```js\n\t * const optionalNormalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\n\t * ```\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @param {Matrix4} [optionalNormalMatrix] - A pre-computed normal matrix.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the plane by the distance defined by the given offset vector.\n\t * Note that this only affects the plane constant and will not affect the normal vector.\n\t *\n\t * @param {Vector3} offset - The offset vector.\n\t * @return {Plane} A reference to this plane.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this plane is equal with the given one.\n\t *\n\t * @param {Plane} plane - The plane to test for equality.\n\t * @return {boolean} Whether this plane is equal with the given one.\n\t */\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\t/**\n\t * Returns a new plane with copied values from this instance.\n\t *\n\t * @return {Plane} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\nconst _defaultSpriteCenter = /*@__PURE__*/ new Vector2( 0.5, 0.5 );\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\n/**\n * Frustums are used to determine what is inside the camera's field of view.\n * They help speed up the rendering process - objects which lie outside a camera's\n * frustum can safely be excluded from rendering.\n *\n * This class is mainly intended for use internally by a renderer.\n */\nclass Frustum {\n\n\t/**\n\t * Constructs a new frustum.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t */\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\t/**\n\t\t * This array holds the planes that enclose the frustum.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\t/**\n\t * Sets the frustum planes by copying the given planes.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given frustum to this instance.\n\t *\n\t * @param {Frustum} frustum - The frustum to copy.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the frustum planes from the given projection matrix.\n\t *\n\t * @param {Matrix4} m - The projection matrix.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} coordinateSystem - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tsetFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tplanes[ 4 ].setComponents( me2, me6, me10, me14 ).normalize(); // far\n\t\t\tplanes[ 5 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // near\n\n\t\t} else {\n\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // far\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); // near\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize(); // near\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting this frustum.\n\t *\n\t * Note that the 3D object must have a geometry so that the bounding sphere can be calculated.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @return {boolean} Whether the 3D object's bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsObject( object ) {\n\n\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconst geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t}\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting this frustum.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @return {boolean} Whether the sprite is intersecting this frustum or not.\n\t */\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$3.center.set( 0, 0, 0 );\n\n\t\tconst offset = _defaultSpriteCenter.distanceTo( sprite.center );\n\n\t\t_sphere$3.radius = 0.7071067811865476 + offset;\n\t\t_sphere$3.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting this frustum.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting this frustum.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box is intersecting this frustum or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$6.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$6.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$6.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$6 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within the frustum.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the point lies within this frustum or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns a new frustum with copied values from this instance.\n\t *\n\t * @return {Frustum} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _projScreenMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _frustum$1 = /*@__PURE__*/ new Frustum();\n\n/**\n * FrustumArray is used to determine if an object is visible in at least one camera\n * from an array of cameras. This is particularly useful for multi-view renderers.\n*/\nclass FrustumArray {\n\n\t/**\n\t * Constructs a new frustum array.\n\t *\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The coordinate system to use.\n\t\t *\n\t\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t\t * @default WebGLCoordinateSystem\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the 3D object is visible in any camera.\n\t */\n\tintersectsObject( object, cameraArray ) {\n\n\t\tif ( ! cameraArray.isArrayCamera || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsObject( object ) ) {\n\n\t\t\t\treturn true; // Object is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sprite is visible in any camera.\n\t */\n\tintersectsSprite( sprite, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSprite( sprite ) ) {\n\n\t\t\t\treturn true; // Sprite is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sphere is visible in any camera.\n\t */\n\tintersectsSphere( sphere, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSphere( sphere ) ) {\n\n\t\t\t\treturn true; // Sphere is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the box is visible in any camera.\n\t */\n\tintersectsBox( box, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsBox( box ) ) {\n\n\t\t\t\treturn true; // Box is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within any frustum\n\t * from the camera array.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the point is visible in any camera.\n\t */\n\tcontainsPoint( point, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.containsPoint( point ) ) {\n\n\t\t\t\treturn true; // Point is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns a new frustum array with copied values from this instance.\n\t *\n\t * @return {FrustumArray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FrustumArray();\n\n\t}\n\n}\n\nfunction ascIdSort( a, b ) {\n\n\treturn a - b;\n\n}\n\nfunction sortOpaque( a, b ) {\n\n\treturn a.z - b.z;\n\n}\n\nfunction sortTransparent( a, b ) {\n\n\treturn b.z - a.z;\n\n}\n\nclass MultiDrawRenderList {\n\n\tconstructor() {\n\n\t\tthis.index = 0;\n\t\tthis.pool = [];\n\t\tthis.list = [];\n\n\t}\n\n\tpush( start, count, z, index ) {\n\n\t\tconst pool = this.pool;\n\t\tconst list = this.list;\n\t\tif ( this.index >= pool.length ) {\n\n\t\t\tpool.push( {\n\n\t\t\t\tstart: -1,\n\t\t\t\tcount: -1,\n\t\t\t\tz: -1,\n\t\t\t\tindex: -1,\n\n\t\t\t} );\n\n\t\t}\n\n\t\tconst item = pool[ this.index ];\n\t\tlist.push( item );\n\t\tthis.index ++;\n\n\t\titem.start = start;\n\t\titem.count = count;\n\t\titem.z = z;\n\t\titem.index = index;\n\n\t}\n\n\treset() {\n\n\t\tthis.list.length = 0;\n\t\tthis.index = 0;\n\n\t}\n\n}\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );\nconst _frustum = /*@__PURE__*/ new Frustum();\nconst _frustumArray = /*@__PURE__*/ new FrustumArray();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _forward$1 = /*@__PURE__*/ new Vector3();\nconst _temp = /*@__PURE__*/ new Vector3();\nconst _renderList = /*@__PURE__*/ new MultiDrawRenderList();\nconst _mesh = /*@__PURE__*/ new Mesh();\nconst _batchIntersects = [];\n\n// copies data from attribute \"src\" into \"target\" starting at \"targetOffset\"\nfunction copyAttributeData( src, target, targetOffset = 0 ) {\n\n\tconst itemSize = target.itemSize;\n\tif ( src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor ) {\n\n\t\t// use the component getters and setters if the array data cannot\n\t\t// be copied directly\n\t\tconst vertexCount = src.count;\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\ttarget.setComponent( i + targetOffset, c, src.getComponent( i, c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// faster copy approach using typed array set function\n\t\ttarget.array.set( src.array, targetOffset * itemSize );\n\n\t}\n\n\ttarget.needsUpdate = true;\n\n}\n\n// safely copies array contents to a potentially smaller array\nfunction copyArrayContents( src, target ) {\n\n\tif ( src.constructor !== target.constructor ) {\n\n\t\t// if arrays are of a different type (eg due to index size increasing) then data must be per-element copied\n\t\tconst len = Math.min( src.length, target.length );\n\t\tfor ( let i = 0; i < len; i ++ ) {\n\n\t\t\ttarget[ i ] = src[ i ];\n\n\t\t}\n\n\t} else {\n\n\t\t// if the arrays use the same data layout we can use a fast block copy\n\t\tconst len = Math.min( src.length, target.length );\n\t\ttarget.set( new src.constructor( src.buffer, 0, len ) );\n\n\t}\n\n}\n\n/**\n * A special version of a mesh with multi draw batch rendering support. Use\n * this class if you have to render a large number of objects with the same\n * material but with different geometries or world transformations. The usage of\n * `BatchedMesh` will help you to reduce the number of draw calls and thus improve the overall\n * rendering performance in your application.\n *\n * ```js\n * const box = new THREE.BoxGeometry( 1, 1, 1 );\n * const sphere = new THREE.SphereGeometry( 1, 12, 12 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n *\n * // initialize and add geometries into the batched mesh\n * const batchedMesh = new BatchedMesh( 10, 5000, 10000, material );\n * const boxGeometryId = batchedMesh.addGeometry( box );\n * const sphereGeometryId = batchedMesh.addGeometry( sphere );\n *\n * // create instances of those geometries\n * const boxInstancedId1 = batchedMesh.addInstance( boxGeometryId );\n * const boxInstancedId2 = batchedMesh.addInstance( boxGeometryId );\n *\n * const sphereInstancedId1 = batchedMesh.addInstance( sphereGeometryId );\n * const sphereInstancedId2 = batchedMesh.addInstance( sphereGeometryId );\n *\n * // position the geometries\n * batchedMesh.setMatrixAt( boxInstancedId1, boxMatrix1 );\n * batchedMesh.setMatrixAt( boxInstancedId2, boxMatrix2 );\n *\n * batchedMesh.setMatrixAt( sphereInstancedId1, sphereMatrix1 );\n * batchedMesh.setMatrixAt( sphereInstancedId2, sphereMatrix2 );\n *\n * scene.add( batchedMesh );\n * ```\n *\n * @augments Mesh\n */\nclass BatchedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new batched mesh.\n\t *\n\t * @param {number} maxInstanceCount - The maximum number of individual instances planned to be added and rendered.\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries.\n\t * @param {number} [maxIndexCount=maxVertexCount*2] - The maximum number of indices to be used by all unique geometries\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {\n\n\t\tsuper( new BufferGeometry(), material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBatchedMesh = true;\n\n\t\t/**\n\t\t * When set ot `true`, the individual objects of a batch are frustum culled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.perObjectFrustumCulled = true;\n\n\t\t/**\n\t\t * When set to `true`, the individual objects of a batch are sorted to improve overdraw-related artifacts.\n\t\t * If the material is marked as \"transparent\" objects are rendered back to front and if not then they are\n\t\t * rendered front to back.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t/**\n\t\t * The bounding box of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered\n\t\t * sort with.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.customSort = null;\n\n\t\t// stores visible, active, and geometry id per instance and reserved buffer ranges for geometries\n\t\tthis._instanceInfo = [];\n\t\tthis._geometryInfo = [];\n\n\t\t// instance, geometry ids that have been set as inactive, and are available to be overwritten\n\t\tthis._availableInstanceIds = [];\n\t\tthis._availableGeometryIds = [];\n\n\t\t// used to track where the next point is that geometry should be inserted\n\t\tthis._nextIndexStart = 0;\n\t\tthis._nextVertexStart = 0;\n\t\tthis._geometryCount = 0;\n\n\t\t// flags\n\t\tthis._visibilityChanged = true;\n\t\tthis._geometryInitialized = false;\n\n\t\t// cached user options\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\t// buffers for multi draw\n\t\tthis._multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawCount = 0;\n\t\tthis._multiDrawInstances = null;\n\n\t\t// Local matrix per geometry by using data texture\n\t\tthis._matricesTexture = null;\n\t\tthis._indirectTexture = null;\n\t\tthis._colorsTexture = null;\n\n\t\tthis._initMatricesTexture();\n\t\tthis._initIndirectTexture();\n\n\t}\n\n\t/**\n\t * The maximum number of individual instances that can be stored in the batch.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget maxInstanceCount() {\n\n\t\treturn this._maxInstanceCount;\n\n\t}\n\n\t/**\n\t * The instance count.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget instanceCount() {\n\n\t\treturn this._instanceInfo.length - this._availableInstanceIds.length;\n\n\t}\n\n\t/**\n\t * The number of unused vertices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedVertexCount() {\n\n\t\treturn this._maxVertexCount - this._nextVertexStart;\n\n\t}\n\n\t/**\n\t * The number of unused indices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedIndexCount() {\n\n\t\treturn this._maxIndexCount - this._nextIndexStart;\n\n\t}\n\n\t_initMatricesTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 matrices * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 matrices * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst matricesArray = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tconst matricesTexture = new DataTexture( matricesArray, size, size, RGBAFormat, FloatType );\n\n\t\tthis._matricesTexture = matricesTexture;\n\n\t}\n\n\t_initIndirectTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\tconst indirectArray = new Uint32Array( size * size );\n\t\tconst indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );\n\n\t\tthis._indirectTexture = indirectTexture;\n\n\t}\n\n\t_initColorsTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\t// 4 floats per RGBA pixel initialized to white\n\t\tconst colorsArray = new Float32Array( size * size * 4 ).fill( 1 );\n\t\tconst colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );\n\t\tcolorsTexture.colorSpace = ColorManagement.workingColorSpace;\n\n\t\tthis._colorsTexture = colorsTexture;\n\n\t}\n\n\t_initializeGeometry( reference ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst maxVertexCount = this._maxVertexCount;\n\t\tconst maxIndexCount = this._maxIndexCount;\n\t\tif ( this._geometryInitialized === false ) {\n\n\t\t\tfor ( const attributeName in reference.attributes ) {\n\n\t\t\t\tconst srcAttribute = reference.getAttribute( attributeName );\n\t\t\t\tconst { array, itemSize, normalized } = srcAttribute;\n\n\t\t\t\tconst dstArray = new array.constructor( maxVertexCount * itemSize );\n\t\t\t\tconst dstAttribute = new BufferAttribute( dstArray, itemSize, normalized );\n\n\t\t\t\tgeometry.setAttribute( attributeName, dstAttribute );\n\n\t\t\t}\n\n\t\t\tif ( reference.getIndex() !== null ) {\n\n\t\t\t\t// Reserve last u16 index for primitive restart.\n\t\t\t\tconst indexArray = maxVertexCount > 65535\n\t\t\t\t\t? new Uint32Array( maxIndexCount )\n\t\t\t\t\t: new Uint16Array( maxIndexCount );\n\n\t\t\t\tgeometry.setIndex( new BufferAttribute( indexArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tthis._geometryInitialized = true;\n\n\t\t}\n\n\t}\n\n\t// Make sure the geometry is compatible with the existing combined geometry attributes\n\t_validateGeometry( geometry ) {\n\n\t\t// check to ensure the geometries are using consistent attributes and indices\n\t\tconst batchGeometry = this.geometry;\n\t\tif ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: All geometries must consistently have \"index\".' );\n\n\t\t}\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\tif ( ! geometry.hasAttribute( attributeName ) ) {\n\n\t\t\t\tthrow new Error( `THREE.BatchedMesh: Added geometry missing \"${ attributeName }\". All geometries must have consistent attributes.` );\n\n\t\t\t}\n\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tif ( srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized ) {\n\n\t\t\t\tthrow new Error( 'THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the instance defined by the given ID.\n\t *\n\t * @param {number} instanceId - The instance to validate.\n\t */\n\tvalidateInstanceId( instanceId ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tif ( instanceId < 0 || instanceId >= instanceInfo.length || instanceInfo[ instanceId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid instanceId ${instanceId}. Instance is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the geometry defined by the given ID.\n\t *\n\t * @param {number} geometryId - The geometry to validate.\n\t */\n\tvalidateGeometryId( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId < 0 || geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid geometryId ${geometryId}. Geometry is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered sort with.\n\t *\n\t * @param {Function} func - The custom sort function.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetCustomSort( func ) {\n\n\t\tthis.customSort = func;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box, updating {@link BatchedMesh#boundingBox}.\n\t * Bounding boxes aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst boundingBox = this.boundingBox;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingBox.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingBox.union( _box$1 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}.\n\t * Bounding spheres aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingSphere.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingSphere.union( _sphere$2 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds a new instance to the batch using the geometry of the given ID and returns\n\t * a new id referring to the new instance to be used by other functions.\n\t *\n\t * @param {number} geometryId - The ID of a previously added geometry via {@link BatchedMesh#addGeometry}.\n\t * @return {number} The instance ID.\n\t */\n\taddInstance( geometryId ) {\n\n\t\tconst atCapacity = this._instanceInfo.length >= this.maxInstanceCount;\n\n\t\t// ensure we're not over geometry\n\t\tif ( atCapacity && this._availableInstanceIds.length === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum item count reached.' );\n\n\t\t}\n\n\t\tconst instanceInfo = {\n\t\t\tvisible: true,\n\t\t\tactive: true,\n\t\t\tgeometryIndex: geometryId,\n\t\t};\n\n\t\tlet drawId = null;\n\n\t\t// Prioritize using previously freed instance ids\n\t\tif ( this._availableInstanceIds.length > 0 ) {\n\n\t\t\tthis._availableInstanceIds.sort( ascIdSort );\n\n\t\t\tdrawId = this._availableInstanceIds.shift();\n\t\t\tthis._instanceInfo[ drawId ] = instanceInfo;\n\n\t\t} else {\n\n\t\t\tdrawId = this._instanceInfo.length;\n\t\t\tthis._instanceInfo.push( instanceInfo );\n\n\t\t}\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\t_matrix$1.identity().toArray( matricesTexture.image.data, drawId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\tconst colorsTexture = this._colorsTexture;\n\t\tif ( colorsTexture ) {\n\n\t\t\t_whiteColor.toArray( colorsTexture.image.data, drawId * 4 );\n\t\t\tcolorsTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn drawId;\n\n\t}\n\n\t/**\n\t * Adds the given geometry to the batch and returns the associated\n\t * geometry id referring to it to be used in other functions.\n\t *\n\t * @param {BufferGeometry} geometry - The geometry to add.\n\t * @param {number} [reservedVertexCount=-1] - Optional parameter specifying the amount of\n\t * vertex buffer space to reserve for the added geometry. This is necessary if it is planned\n\t * to set a new geometry at this index at a later time that is larger than the original geometry.\n\t * Defaults to the length of the given geometry vertex buffer.\n\t * @param {number} [reservedIndexCount=-1] - Optional parameter specifying the amount of index\n\t * buffer space to reserve for the added geometry. This is necessary if it is planned to set a\n\t * new geometry at this index at a later time that is larger than the original geometry. Defaults to\n\t * the length of the given geometry index buffer.\n\t * @return {number} The geometry ID.\n\t */\n\taddGeometry( geometry, reservedVertexCount = -1, reservedIndexCount = -1 ) {\n\n\t\tthis._initializeGeometry( geometry );\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst geometryInfo = {\n\t\t\t// geometry information\n\t\t\tvertexStart: -1,\n\t\t\tvertexCount: -1,\n\t\t\treservedVertexCount: -1,\n\n\t\t\tindexStart: -1,\n\t\t\tindexCount: -1,\n\t\t\treservedIndexCount: -1,\n\n\t\t\t// draw range information\n\t\t\tstart: -1,\n\t\t\tcount: -1,\n\n\t\t\t// state\n\t\t\tboundingBox: null,\n\t\t\tboundingSphere: null,\n\t\t\tactive: true,\n\t\t};\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tgeometryInfo.vertexStart = this._nextVertexStart;\n\t\tgeometryInfo.reservedVertexCount = reservedVertexCount === -1 ? geometry.getAttribute( 'position' ).count : reservedVertexCount;\n\n\t\tconst index = geometry.getIndex();\n\t\tconst hasIndex = index !== null;\n\t\tif ( hasIndex ) {\n\n\t\t\tgeometryInfo.indexStart = this._nextIndexStart;\n\t\t\tgeometryInfo.reservedIndexCount = reservedIndexCount === -1 ? index.count : reservedIndexCount;\n\n\t\t}\n\n\t\tif (\n\t\t\tgeometryInfo.indexStart !== -1 &&\n\t\t\tgeometryInfo.indexStart + geometryInfo.reservedIndexCount > this._maxIndexCount ||\n\t\t\tgeometryInfo.vertexStart + geometryInfo.reservedVertexCount > this._maxVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.' );\n\n\t\t}\n\n\t\t// update id\n\t\tlet geometryId;\n\t\tif ( this._availableGeometryIds.length > 0 ) {\n\n\t\t\tthis._availableGeometryIds.sort( ascIdSort );\n\n\t\t\tgeometryId = this._availableGeometryIds.shift();\n\t\t\tgeometryInfoList[ geometryId ] = geometryInfo;\n\n\n\t\t} else {\n\n\t\t\tgeometryId = this._geometryCount;\n\t\t\tthis._geometryCount ++;\n\t\t\tgeometryInfoList.push( geometryInfo );\n\n\t\t}\n\n\t\t// update the geometry\n\t\tthis.setGeometryAt( geometryId, geometry );\n\n\t\t// increment the next geometry position\n\t\tthis._nextIndexStart = geometryInfo.indexStart + geometryInfo.reservedIndexCount;\n\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Replaces the geometry at the given ID with the provided geometry. Throws an error if there\n\t * is not enough space reserved for geometry. Calling this will change all instances that are\n\t * rendering that geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry that should be replaced with the given geometry.\n\t * @param {BufferGeometry} geometry - The new geometry.\n\t * @return {number} The geometry ID.\n\t */\n\tsetGeometryAt( geometryId, geometry ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum geometry count reached.' );\n\n\t\t}\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst batchGeometry = this.geometry;\n\t\tconst hasIndex = batchGeometry.getIndex() !== null;\n\t\tconst dstIndex = batchGeometry.getIndex();\n\t\tconst srcIndex = geometry.getIndex();\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif (\n\t\t\thasIndex &&\n\t\t\tsrcIndex.count > geometryInfo.reservedIndexCount ||\n\t\t\tgeometry.attributes.position.count > geometryInfo.reservedVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space not large enough for provided geometry.' );\n\n\t\t}\n\n\t\t// copy geometry buffer data over\n\t\tconst vertexStart = geometryInfo.vertexStart;\n\t\tconst reservedVertexCount = geometryInfo.reservedVertexCount;\n\t\tgeometryInfo.vertexCount = geometry.getAttribute( 'position' ).count;\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\t// copy attribute data\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tcopyAttributeData( srcAttribute, dstAttribute, vertexStart );\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tconst itemSize = srcAttribute.itemSize;\n\t\t\tfor ( let i = srcAttribute.count, l = reservedVertexCount; i < l; i ++ ) {\n\n\t\t\t\tconst index = vertexStart + i;\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tdstAttribute.setComponent( index, c, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdstAttribute.needsUpdate = true;\n\t\t\tdstAttribute.addUpdateRange( vertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t}\n\n\t\t// copy index\n\t\tif ( hasIndex ) {\n\n\t\t\tconst indexStart = geometryInfo.indexStart;\n\t\t\tconst reservedIndexCount = geometryInfo.reservedIndexCount;\n\t\t\tgeometryInfo.indexCount = geometry.getIndex().count;\n\n\t\t\t// copy index data over\n\t\t\tfor ( let i = 0; i < srcIndex.count; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart + srcIndex.getX( i ) );\n\n\t\t\t}\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tfor ( let i = srcIndex.count, l = reservedIndexCount; i < l; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart );\n\n\t\t\t}\n\n\t\t\tdstIndex.needsUpdate = true;\n\t\t\tdstIndex.addUpdateRange( indexStart, geometryInfo.reservedIndexCount );\n\n\t\t}\n\n\t\t// update the draw range\n\t\tgeometryInfo.start = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\t\tgeometryInfo.count = hasIndex ? geometryInfo.indexCount : geometryInfo.vertexCount;\n\n\t\t// store the bounding boxes\n\t\tgeometryInfo.boundingBox = null;\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tgeometryInfo.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tgeometryInfo.boundingSphere = null;\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tgeometryInfo.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Deletes the geometry defined by the given ID from this batch. Any instances referencing\n\t * this geometry will also be removed as a side effect.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteGeometry( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t// delete any instances associated with this geometry\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active && instanceInfo[ i ].geometryIndex === geometryId ) {\n\n\t\t\t\tthis.deleteInstance( i );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometryInfoList[ geometryId ].active = false;\n\t\tthis._availableGeometryIds.push( geometryId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes an existing instance from the batch using the given ID.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteInstance( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tthis._instanceInfo[ instanceId ].active = false;\n\t\tthis._availableInstanceIds.push( instanceId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Repacks the sub geometries in [name] to remove any unused space remaining from\n\t * previously deleted geometry, freeing up space to add new geometry.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\toptimize() {\n\n\t\t// track the next indices to copy data to\n\t\tlet nextVertexStart = 0;\n\t\tlet nextIndexStart = 0;\n\n\t\t// Iterate over all geometry ranges in order sorted from earliest in the geometry buffer to latest\n\t\t// in the geometry buffer. Because draw range objects can be reused there is no guarantee of their order.\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst indices = geometryInfoList\n\t\t\t.map( ( e, i ) => i )\n\t\t\t.sort( ( a, b ) => {\n\n\t\t\t\treturn geometryInfoList[ a ].vertexStart - geometryInfoList[ b ].vertexStart;\n\n\t\t\t} );\n\n\t\tconst geometry = this.geometry;\n\t\tfor ( let i = 0, l = geometryInfoList.length; i < l; i ++ ) {\n\n\t\t\t// if a geometry range is inactive then don't copy anything\n\t\t\tconst index = indices[ i ];\n\t\t\tconst geometryInfo = geometryInfoList[ index ];\n\t\t\tif ( geometryInfo.active === false ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// if a geometry contains an index buffer then shift it, as well\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tif ( geometryInfo.indexStart !== nextIndexStart ) {\n\n\t\t\t\t\tconst { indexStart, vertexStart, reservedIndexCount } = geometryInfo;\n\t\t\t\t\tconst index = geometry.index;\n\t\t\t\t\tconst array = index.array;\n\n\t\t\t\t\t// shift the index pointers based on how the vertex data will shift\n\t\t\t\t\t// adjusting the index must happen first so the original vertex start value is available\n\t\t\t\t\tconst elementDelta = nextVertexStart - vertexStart;\n\t\t\t\t\tfor ( let j = indexStart; j < indexStart + reservedIndexCount; j ++ ) {\n\n\t\t\t\t\t\tarray[ j ] = array[ j ] + elementDelta;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tindex.array.copyWithin( nextIndexStart, indexStart, indexStart + reservedIndexCount );\n\t\t\t\t\tindex.addUpdateRange( nextIndexStart, reservedIndexCount );\n\n\t\t\t\t\tgeometryInfo.indexStart = nextIndexStart;\n\n\t\t\t\t}\n\n\t\t\t\tnextIndexStart += geometryInfo.reservedIndexCount;\n\n\t\t\t}\n\n\t\t\t// if a geometry needs to be moved then copy attribute data to overwrite unused space\n\t\t\tif ( geometryInfo.vertexStart !== nextVertexStart ) {\n\n\t\t\t\tconst { vertexStart, reservedVertexCount } = geometryInfo;\n\t\t\t\tconst attributes = geometry.attributes;\n\t\t\t\tfor ( const key in attributes ) {\n\n\t\t\t\t\tconst attribute = attributes[ key ];\n\t\t\t\t\tconst { array, itemSize } = attribute;\n\t\t\t\t\tarray.copyWithin( nextVertexStart * itemSize, vertexStart * itemSize, ( vertexStart + reservedVertexCount ) * itemSize );\n\t\t\t\t\tattribute.addUpdateRange( nextVertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tgeometryInfo.vertexStart = nextVertexStart;\n\n\t\t\t}\n\n\t\t\tnextVertexStart += geometryInfo.reservedVertexCount;\n\t\t\tgeometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\n\t\t\t// step the next geometry points to the shifted position\n\t\t\tthis._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0;\n\t\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the bounding box for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding box for.\n\t * @param {Box3} target - The target object that is used to store the method's result.\n\t * @return {?Box3} The geometry's bounding box. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingBoxAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding box\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingBox === null ) {\n\n\t\t\tconst box = new Box3();\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\tbox.expandByPoint( _vector$5.fromBufferAttribute( position, iv ) );\n\n\t\t\t}\n\n\t\t\tgeometryInfo.boundingBox = box;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingBox );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the bounding sphere for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding sphere for.\n\t * @param {Sphere} target - The target object that is used to store the method's result.\n\t * @return {?Sphere} The geometry's bounding sphere. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingSphereAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding sphere\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingSphere === null ) {\n\n\t\t\tconst sphere = new Sphere();\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 );\n\t\t\t_box$1.getCenter( sphere.center );\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet maxRadiusSq = 0;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\t_vector$5.fromBufferAttribute( position, iv );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, sphere.center.distanceToSquared( _vector$5 ) );\n\n\t\t\t}\n\n\t\t\tsphere.radius = Math.sqrt( maxRadiusSq );\n\t\t\tgeometryInfo.boundingSphere = sphere;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingSphere );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance.\n\t * Negatively scaled matrices are not supported.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the matrix of.\n\t * @param {Matrix4} matrix - A 4x4 matrix representing the local transformation of a single instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\t\tmatrix.toArray( matricesArray, instanceId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the matrix of.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t * @return {Matrix4} The instance's local transformation matrix.\n\t */\n\tgetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn matrix.fromArray( this._matricesTexture.image.data, instanceId * 16 );\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the color of.\n\t * @param {Color} color - The color to set the instance to.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._colorsTexture === null ) {\n\n\t\t\tthis._initColorsTexture();\n\n\t\t}\n\n\t\tcolor.toArray( this._colorsTexture.image.data, instanceId * 4 );\n\t\tthis._colorsTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the color of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the color of.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t * @return {Color} The instance's color.\n\t */\n\tgetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn color.fromArray( this._colorsTexture.image.data, instanceId * 4 );\n\n\t}\n\n\t/**\n\t * Sets the visibility of the instance.\n\t *\n\t * @param {number} instanceId - The id of the instance to set the visibility of.\n\t * @param {boolean} visible - Whether the instance is visible or not.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetVisibleAt( instanceId, visible ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._instanceInfo[ instanceId ].visible === visible ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis._instanceInfo[ instanceId ].visible = visible;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the visibility state of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the visibility state of.\n\t * @return {boolean} Whether the instance is visible or not.\n\t */\n\tgetVisibleAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].visible;\n\n\t}\n\n\t/**\n\t * Sets the geometry ID of the instance at the given index.\n\t *\n\t * @param {number} instanceId - The ID of the instance to set the geometry ID of.\n\t * @param {number} geometryId - The geometry ID to be use by the instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetGeometryIdAt( instanceId, geometryId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tthis._instanceInfo[ instanceId ].geometryIndex = geometryId;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the geometry ID of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the geometry ID of.\n\t * @return {number} The instance's geometry ID.\n\t */\n\tgetGeometryIdAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].geometryIndex;\n\n\t}\n\n\t/**\n\t * Get the range representing the subset of triangles related to the attached geometry,\n\t * indicating the starting offset and count, or `null` if invalid.\n\t *\n\t * @param {number} geometryId - The id of the geometry to get the range of.\n\t * @param {Object} [target] - The target object that is used to store the method's result.\n\t * @return {{\n\t * \tvertexStart:number,vertexCount:number,reservedVertexCount:number,\n\t * \tindexStart:number,indexCount:number,reservedIndexCount:number,\n\t * \tstart:number,count:number\n\t * }} The result object with range data.\n\t */\n\tgetGeometryRangeAt( geometryId, target = {} ) {\n\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\ttarget.vertexStart = geometryInfo.vertexStart;\n\t\ttarget.vertexCount = geometryInfo.vertexCount;\n\t\ttarget.reservedVertexCount = geometryInfo.reservedVertexCount;\n\n\t\ttarget.indexStart = geometryInfo.indexStart;\n\t\ttarget.indexCount = geometryInfo.indexCount;\n\t\ttarget.reservedIndexCount = geometryInfo.reservedIndexCount;\n\n\t\ttarget.start = geometryInfo.start;\n\t\ttarget.count = geometryInfo.count;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Resizes the necessary buffers to support the provided number of instances.\n\t * If the provided arguments shrink the number of instances but there are not enough\n\t * unused Ids at the end of the list then an error is thrown.\n\t *\n\t * @param {number} maxInstanceCount - The max number of individual instances that can be added and rendered by the batch.\n\t*/\n\tsetInstanceCount( maxInstanceCount ) {\n\n\t\t// shrink the available instances as much as possible\n\t\tconst availableInstanceIds = this._availableInstanceIds;\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tavailableInstanceIds.sort( ascIdSort );\n\t\twhile ( availableInstanceIds[ availableInstanceIds.length - 1 ] === instanceInfo.length - 1 ) {\n\n\t\t\tinstanceInfo.pop();\n\t\t\tavailableInstanceIds.pop();\n\n\t\t}\n\n\t\t// throw an error if it can't be shrunk to the desired size\n\t\tif ( maxInstanceCount < instanceInfo.length ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Instance ids outside the range ${ maxInstanceCount } are being used. Cannot shrink instance count.` );\n\n\t\t}\n\n\t\t// copy the multi draw counts\n\t\tconst multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tconst multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tcopyArrayContents( this._multiDrawCounts, multiDrawCounts );\n\t\tcopyArrayContents( this._multiDrawStarts, multiDrawStarts );\n\n\t\tthis._multiDrawCounts = multiDrawCounts;\n\t\tthis._multiDrawStarts = multiDrawStarts;\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\n\t\t// update texture data for instance sampling\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst colorsTexture = this._colorsTexture;\n\n\t\tindirectTexture.dispose();\n\t\tthis._initIndirectTexture();\n\t\tcopyArrayContents( indirectTexture.image.data, this._indirectTexture.image.data );\n\n\t\tmatricesTexture.dispose();\n\t\tthis._initMatricesTexture();\n\t\tcopyArrayContents( matricesTexture.image.data, this._matricesTexture.image.data );\n\n\t\tif ( colorsTexture ) {\n\n\t\t\tcolorsTexture.dispose();\n\t\t\tthis._initColorsTexture();\n\t\t\tcopyArrayContents( colorsTexture.image.data, this._colorsTexture.image.data );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resizes the available space in the batch's vertex and index buffer attributes to the provided sizes.\n\t * If the provided arguments shrink the geometry buffers but there is not enough unused space at the\n\t * end of the geometry attributes then an error is thrown.\n\t *\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries to resize to.\n\t * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries to resize to.\n\t*/\n\tsetGeometrySize( maxVertexCount, maxIndexCount ) {\n\n\t\t// Check if we can shrink to the requested vertex attribute size\n\t\tconst validRanges = [ ...this._geometryInfo ].filter( info => info.active );\n\t\tconst requiredVertexLength = Math.max( ...validRanges.map( range => range.vertexStart + range.reservedVertexCount ) );\n\t\tif ( requiredVertexLength > maxVertexCount ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Geometry vertex values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t}\n\n\t\t// Check if we can shrink to the requested index attribute size\n\t\tif ( this.geometry.index ) {\n\n\t\t\tconst requiredIndexLength = Math.max( ...validRanges.map( range => range.indexStart + range.reservedIndexCount ) );\n\t\t\tif ( requiredIndexLength > maxIndexCount ) {\n\n\t\t\t\tthrow new Error( `BatchedMesh: Geometry index values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\t// dispose of the previous geometry\n\t\tconst oldGeometry = this.geometry;\n\t\toldGeometry.dispose();\n\n\t\t// recreate the geometry needed based on the previous variant\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\tif ( this._geometryInitialized ) {\n\n\t\t\tthis._geometryInitialized = false;\n\t\t\tthis.geometry = new BufferGeometry();\n\t\t\tthis._initializeGeometry( oldGeometry );\n\n\t\t}\n\n\t\t// copy data from the previous geometry\n\t\tconst geometry = this.geometry;\n\t\tif ( oldGeometry.index ) {\n\n\t\t\tcopyArrayContents( oldGeometry.index.array, geometry.index.array );\n\n\t\t}\n\n\t\tfor ( const key in oldGeometry.attributes ) {\n\n\t\t\tcopyArrayContents( oldGeometry.attributes[ key ].array, geometry.attributes[ key ].array );\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst batchGeometry = this.geometry;\n\n\t\t// iterate over each geometry\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry.index = batchGeometry.index;\n\t\t_mesh.geometry.attributes = batchGeometry.attributes;\n\t\tif ( _mesh.geometry.boundingBox === null ) {\n\n\t\t\t_mesh.geometry.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( ! instanceInfo[ i ].visible || ! instanceInfo[ i ].active ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t_mesh.geometry.setDrawRange( geometryInfo.start, geometryInfo.count );\n\n\t\t\t// get the intersects\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\t\t\tthis.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );\n\t\t\tthis.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\t// add batch id to the intersects\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.material = null;\n\t\t_mesh.geometry.index = null;\n\t\t_mesh.geometry.attributes = {};\n\t\t_mesh.geometry.setDrawRange( 0, Infinity );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.geometry = source.geometry.clone();\n\t\tthis.perObjectFrustumCulled = source.perObjectFrustumCulled;\n\t\tthis.sortObjects = source.sortObjects;\n\t\tthis.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null;\n\t\tthis.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null;\n\n\t\tthis._geometryInfo = source._geometryInfo.map( info => ( {\n\t\t\t...info,\n\n\t\t\tboundingBox: info.boundingBox !== null ? info.boundingBox.clone() : null,\n\t\t\tboundingSphere: info.boundingSphere !== null ? info.boundingSphere.clone() : null,\n\t\t} ) );\n\t\tthis._instanceInfo = source._instanceInfo.map( info => ( { ...info } ) );\n\n\t\tthis._availableInstanceIds = source._availableInstanceIds.slice();\n\t\tthis._availableGeometryIds = source._availableGeometryIds.slice();\n\n\t\tthis._nextIndexStart = source._nextIndexStart;\n\t\tthis._nextVertexStart = source._nextVertexStart;\n\t\tthis._geometryCount = source._geometryCount;\n\n\t\tthis._maxInstanceCount = source._maxInstanceCount;\n\t\tthis._maxVertexCount = source._maxVertexCount;\n\t\tthis._maxIndexCount = source._maxIndexCount;\n\n\t\tthis._geometryInitialized = source._geometryInitialized;\n\t\tthis._multiDrawCounts = source._multiDrawCounts.slice();\n\t\tthis._multiDrawStarts = source._multiDrawStarts.slice();\n\n\t\tthis._indirectTexture = source._indirectTexture.clone();\n\t\tthis._indirectTexture.image.data = this._indirectTexture.image.data.slice();\n\n\t\tthis._matricesTexture = source._matricesTexture.clone();\n\t\tthis._matricesTexture.image.data = this._matricesTexture.image.data.slice();\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture = source._colorsTexture.clone();\n\t\t\tthis._colorsTexture.image.data = this._colorsTexture.image.data.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Assuming the geometry is not shared with other meshes\n\t\tthis.geometry.dispose();\n\n\t\tthis._matricesTexture.dispose();\n\t\tthis._matricesTexture = null;\n\n\t\tthis._indirectTexture.dispose();\n\t\tthis._indirectTexture = null;\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture.dispose();\n\t\t\tthis._colorsTexture = null;\n\n\t\t}\n\n\t}\n\n\tonBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) {\n\n\t\t// if visibility has not changed and frustum culling and object sorting is not required\n\t\t// then skip iterating over all items\n\t\tif ( ! this._visibilityChanged && ! this.perObjectFrustumCulled && ! this.sortObjects ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// the indexed version of the multi draw function requires specifying the start\n\t\t// offset in bytes.\n\t\tconst index = geometry.getIndex();\n\t\tconst bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst multiDrawStarts = this._multiDrawStarts;\n\t\tconst multiDrawCounts = this._multiDrawCounts;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst indirectArray = indirectTexture.image.data;\n\n\t\tconst frustum = camera.isArrayCamera ? _frustumArray : _frustum;\n\t\t// prepare the frustum in the local frame\n\t\tif ( perObjectFrustumCulled && ! camera.isArrayCamera ) {\n\n\t\t\t_matrix$1\n\t\t\t\t.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )\n\t\t\t\t.multiply( this.matrixWorld );\n\n\t\t\t_frustum.setFromProjectionMatrix(\n\t\t\t\t_matrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t}\n\n\t\tlet multiDrawCount = 0;\n\t\tif ( this.sortObjects ) {\n\n\t\t\t// get the camera position in the local frame\n\t\t\t_matrix$1.copy( this.matrixWorld ).invert();\n\t\t\t_vector$5.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _matrix$1 );\n\t\t\t_forward$1.set( 0, 0, -1 ).transformDirection( camera.matrixWorld ).transformDirection( _matrix$1 );\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\t// get the distance from camera used for sorting\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tconst z = _temp.subVectors( _sphere$2.center, _vector$5 ).dot( _forward$1 );\n\t\t\t\t\t\t_renderList.push( geometryInfo.start, geometryInfo.count, z, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Sort the draw ranges and prep for rendering\n\t\t\tconst list = _renderList.list;\n\t\t\tconst customSort = this.customSort;\n\t\t\tif ( customSort === null ) {\n\n\t\t\t\tlist.sort( material.transparent ? sortTransparent : sortOpaque );\n\n\t\t\t} else {\n\n\t\t\t\tcustomSort.call( this, list, camera );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = list.length; i < l; i ++ ) {\n\n\t\t\t\tconst item = list[ i ];\n\t\t\t\tmultiDrawStarts[ multiDrawCount ] = item.start * bytesPerElement;\n\t\t\t\tmultiDrawCounts[ multiDrawCount ] = item.count;\n\t\t\t\tindirectArray[ multiDrawCount ] = item.index;\n\t\t\t\tmultiDrawCount ++;\n\n\t\t\t}\n\n\t\t\t_renderList.reset();\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tmultiDrawStarts[ multiDrawCount ] = geometryInfo.start * bytesPerElement;\n\t\t\t\t\t\tmultiDrawCounts[ multiDrawCount ] = geometryInfo.count;\n\t\t\t\t\t\tindirectArray[ multiDrawCount ] = i;\n\t\t\t\t\t\tmultiDrawCount ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tindirectTexture.needsUpdate = true;\n\t\tthis._multiDrawCount = multiDrawCount;\n\t\tthis._visibilityChanged = false;\n\n\t}\n\n\tonBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial/* , group */ ) {\n\n\t\tthis.onBeforeRender( renderer, null, shadowCamera, geometry, depthMaterial );\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n * ```\n *\n * @augments Material\n */\nclass LineBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new line basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineBasicMaterial = true;\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * Sets the color of the lines using data from a texture. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}. WebGL and WebGPU\n\t\t * ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of line ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('butt'|'round'|'square')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of line joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vStart = /*@__PURE__*/ new Vector3();\nconst _vEnd = /*@__PURE__*/ new Vector3();\n\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nconst _intersectPointOnRay = /*@__PURE__*/ new Vector3();\nconst _intersectPointOnSegment = /*@__PURE__*/ new Vector3();\n\n/**\n * A continuous line. The line are rendered by connecting consecutive\n * vertices with straight lines.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0x0000ff } );\n *\n * const points = [];\n * points.push( new THREE.Vector3( - 10, 0, 0 ) );\n * points.push( new THREE.Vector3( 0, 10, 0 ) );\n * points.push( new THREE.Vector3( 10, 0, 0 ) );\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments Object3D\n */\nclass Line extends Object3D {\n\n\t/**\n\t * Constructs a new line.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\t/**\n\t\t * The line geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default LineBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes an array of distance values which are necessary for rendering dashed lines.\n\t * For each vertex in the geometry, the method calculates the cumulative length from the\n\t * current point to the very beginning of the line.\n\t *\n\t * @return {Line} A reference to this line.\n\t */\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_vStart.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_vEnd.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _vStart.distanceTo( _vEnd );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst a = index.getX( end - 1 );\n\t\t\t\tconst b = index.getX( start );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, i, i + 1, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, end - 1, start, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Line#morphTargetDictionary} and {@link Line#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection( object, raycaster, ray, thresholdSq, a, b, i ) {\n\n\tconst positionAttribute = object.geometry.attributes.position;\n\n\t_vStart.fromBufferAttribute( positionAttribute, a );\n\t_vEnd.fromBufferAttribute( positionAttribute, b );\n\n\tconst distSq = ray.distanceSqToSegment( _vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment );\n\n\tif ( distSq > thresholdSq ) return;\n\n\t_intersectPointOnRay.applyMatrix4( object.matrixWorld ); // Move back to world space for distance calculation\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectPointOnRay );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\treturn {\n\n\t\tdistance: distance,\n\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t// point: raycaster.ray.at( distance ),\n\t\tpoint: _intersectPointOnSegment.clone().applyMatrix4( object.matrixWorld ),\n\t\tindex: i,\n\t\tface: null,\n\t\tfaceIndex: null,\n\t\tbarycoord: null,\n\t\tobject: object\n\n\t};\n\n}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\n/**\n * A series of lines drawn between pairs of vertices.\n *\n * @augments Line\n */\nclass LineSegments extends Line {\n\n\t/**\n\t * Constructs a new line segments.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A continuous line. This is nearly the same as {@link Line} the only difference\n * is that the last vertex is connected with the first vertex in order to close\n * the line to form a loop.\n *\n * @augments Line\n */\nclass LineLoop extends Line {\n\n\t/**\n\t * Constructs a new line loop.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\n/**\n * A material for rendering point primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const vertices = [];\n *\n * for ( let i = 0; i < 10000; i ++ ) {\n * \tconst x = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst y = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst z = THREE.MathUtils.randFloatSpread( 2000 );\n *\n * \tvertices.push( x, y, z );\n * }\n *\n * const geometry = new THREE.BufferGeometry();\n * geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );\n * const material = new THREE.PointsMaterial( { color: 0x888888 } );\n * const points = new THREE.Points( geometry, material );\n * scene.add( points );\n * ```\n *\n * @augments Material\n */\nclass PointsMaterial extends Material {\n\n\t/**\n\t * Constructs a new points material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Defines the size of the points in pixels.\n\t\t *\n\t\t * Might be capped if the value exceeds hardware dependent parameters like [gl.ALIASED_POINT_SIZE_RANGE](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParamete).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = 1;\n\n\t\t/**\n\t\t * Specifies whether size of individual points is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\n/**\n * A class for displaying points or point clouds.\n *\n * @augments Object3D\n */\nclass Points extends Object3D {\n\n\t/**\n\t * Constructs a new point cloud.\n\t *\n\t * @param {BufferGeometry} [geometry] - The points geometry.\n\t * @param {Material|Array} [material] - The points material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\t/**\n\t\t * The points geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default PointsMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this point cloud.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Points#morphTargetDictionary} and {@link Points#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tfaceIndex: null,\n\t\t\tbarycoord: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * A texture for use with a video.\n *\n * ```js\n * // assuming you have created a HTML video element with id=\"video\"\n * const video = document.getElementById( 'video' );\n * const texture = new THREE.VideoTexture( video );\n * ```\n *\n * Note: When using video textures with {@link WebGPURenderer}, {@link Texture#colorSpace} must be\n * set to THREE.SRGBColorSpace.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments Texture\n */\nclass VideoTexture extends Texture {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {HTMLVideoElement} video - The video element to use as a data source for the texture.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( video, mapping, wrapS, wrapT, magFilter = LinearFilter, minFilter = LinearFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoTexture = true;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * The video frame request callback identifier, which is a positive integer.\n\t\t *\n\t\t * Value of 0 represents no scheduled rVFC.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t */\n\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tscope._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tthis._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\t/**\n\t * This method is called automatically by the renderer and sets {@link Texture#needsUpdate}\n\t * to `true` every time a new frame is available.\n\t *\n\t * Only relevant if `requestVideoFrameCallback` is not supported in the browser.\n\t */\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this._requestVideoFrameCallbackId !== 0 ) {\n\n\t\t\tthis.source.data.cancelVideoFrameCallback( this._requestVideoFrameCallbackId );\n\n\t\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\t}\n\n\t\tsuper.dispose();\n\n\t}\n\n}\n\n/**\n * This class can be used as an alternative way to define video data. Instead of using\n * an instance of `HTMLVideoElement` like with `VideoTexture`, `VideoFrameTexture` expects each frame is\n * defined manually via {@link VideoFrameTexture#setFrame}. A typical use case for this module is when\n * video frames are decoded with the WebCodecs API.\n *\n * ```js\n * const texture = new THREE.VideoFrameTexture();\n * texture.setFrame( frame );\n * ```\n *\n * @augments VideoTexture\n */\nclass VideoFrameTexture extends VideoTexture {\n\n\t/**\n\t * Constructs a new video frame texture.\n\t *\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( {}, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoFrameTexture = true;\n\n\t}\n\n\t/**\n\t * This method overwritten with an empty implementation since\n\t * this type of texture is updated via `setFrame()`.\n\t */\n\tupdate() {}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this ); // restoring Texture.clone()\n\n\t}\n\n\t/**\n\t * Sets the current frame of the video. This will automatically update the texture\n\t * so the data can be used for rendering.\n\t *\n\t * @param {VideoFrame} frame - The video frame.\n\t */\n\tsetFrame( frame ) {\n\n\t\tthis.image = frame;\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can only be used in combination with `copyFramebufferToTexture()` methods\n * of renderers. It extracts the contents of the current bound framebuffer and provides it\n * as a texture for further usage.\n *\n * ```js\n * const pixelRatio = window.devicePixelRatio;\n * const textureSize = 128 * pixelRatio;\n *\n * const frameTexture = new FramebufferTexture( textureSize, textureSize );\n *\n * // calculate start position for copying part of the frame data\n * const vector = new Vector2();\n * vector.x = ( window.innerWidth * pixelRatio / 2 ) - ( textureSize / 2 );\n * vector.y = ( window.innerHeight * pixelRatio / 2 ) - ( textureSize / 2 );\n *\n * renderer.render( scene, camera );\n *\n * // copy part of the rendered frame into the framebuffer texture\n * renderer.copyFramebufferToTexture( frameTexture, vector );\n * ```\n *\n * @augments Texture\n */\nclass FramebufferTexture extends Texture {\n\n\t/**\n\t * Constructs a new framebuffer texture.\n\t *\n\t * @param {number} [width] - The width of the texture.\n\t * @param {number} [height] - The height of the texture.\n\t */\n\tconstructor( width, height ) {\n\n\t\tsuper( { width, height } );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFramebufferTexture = true;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments Texture\n */\nclass CompressedTexture extends Texture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @type {{width:number,height:number}}\n\t\t */\n\t\tthis.image = { width: width, height: height };\n\n\t\t/**\n\t\t * This array holds for all mipmaps (including the bases mip) the data and dimensions.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.mipmaps = mipmaps;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not possible to\n\t\t * flip compressed textures.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not\n\t\t * possible to generate mipmaps for compressed data. Mipmaps\n\t\t * must be embedded in the compressed texture file.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\n/**\n * Creates a texture 2D array based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedArrayTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed array texture.\n\t *\n\t * @param {Array} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} depth - The depth of the texture.\n\t * @param {number} [format=RGBAFormat] - The min filter value.\n\t * @param {number} [type=UnsignedByteType] - The min filter value.\n\t */\n\tconstructor( mipmaps, width, height, depth, format, type ) {\n\n\t\tsuper( mipmaps, width, height, format, type );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedArrayTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @name CompressedArrayTexture#image\n\t\t * @type {{width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image.depth = depth;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire compressed texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * Creates a cube texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedCubeTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array} images - An array of compressed textures.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t */\n\tconstructor( images, format, type ) {\n\n\t\tsuper( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedCubeTexture = true;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.image = images;\n\n\t}\n\n}\n\n/**\n * Creates a texture from a canvas element.\n *\n * This is almost the same as the base texture class, except that it sets {@link Texture#needsUpdate}\n * to `true` immediately since a canvas can directly be used for rendering.\n *\n * @augments Texture\n */\nclass CanvasTexture extends Texture {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {HTMLCanvasElement} [canvas] - The HTML canvas element.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can be used to automatically save the depth information of a\n * rendering into a texture.\n *\n * @augments Texture\n */\nclass DepthTexture extends Texture {\n\n\t/**\n\t * Constructs a new depth texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [type=UnsignedIntType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {number} [format=DepthFormat] - The texture format.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( width, height, type = UnsignedIntType, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, format = DepthFormat, depth = 1 ) {\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tconst image = { width: width, height: height, depth: depth };\n\n\t\tsuper( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDepthTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * Code corresponding to the depth compare function.\n\t\t *\n\t\t * @type {?(NeverCompare|LessCompare|EqualCompare|LessEqualCompare|GreaterCompare|NotEqualCompare|GreaterEqualCompare|AlwaysCompare)}\n\t\t * @default null\n\t\t */\n\t\tthis.compareFunction = null;\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.source = new Source( Object.assign( {}, source.image ) ); // see #30540\n\t\tthis.compareFunction = source.compareFunction;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.compareFunction !== null ) data.compareFunction = this.compareFunction;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a texture created externally with the same renderer context.\n *\n * This may be a texture from a protected media stream, device camera feed,\n * or other data feeds like a depth sensor.\n *\n * Note that this class is only supported in {@link WebGLRenderer}, and in\n * the {@link WebGPURenderer} WebGPU backend.\n *\n * @augments Texture\n */\nclass ExternalTexture extends Texture {\n\n\t/**\n\t * Creates a new raw texture.\n\t *\n\t * @param {?(WebGLTexture|GPUTexture)} [sourceTexture=null] - The external texture.\n\t */\n\tconstructor( sourceTexture = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The external source texture.\n\t\t *\n\t\t * @type {?(WebGLTexture|GPUTexture)}\n\t\t * @default null\n\t\t */\n\t\tthis.sourceTexture = sourceTexture;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isExternalTexture = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sourceTexture = source.sourceTexture;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a capsule.\n *\n * ```js\n * const geometry = new THREE.CapsuleGeometry( 1, 1, 4, 8, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const capsule = new THREE.Mesh( geometry, material );\n * scene.add( capsule );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CapsuleGeometry\n */\nclass CapsuleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new capsule geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the capsule.\n\t * @param {number} [height=1] - Height of the middle section.\n\t * @param {number} [capSegments=4] - Number of curve segments used to build each cap.\n\t * @param {number} [radialSegments=8] - Number of segmented faces around the circumference of the capsule. Must be an integer >= 3.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the middle section. Must be an integer >= 1.\n\t */\n\tconstructor( radius = 1, height = 1, capSegments = 4, radialSegments = 8, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t};\n\n\t\theight = Math.max( 0, height );\n\t\tcapSegments = Math.max( 1, Math.floor( capSegments ) );\n\t\tradialSegments = Math.max( 3, Math.floor( radialSegments ) );\n\t\theightSegments = Math.max( 1, Math.floor( heightSegments ) );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst halfHeight = height / 2;\n\t\tconst capArcLength = ( Math.PI / 2 ) * radius;\n\t\tconst cylinderPartLength = height;\n\t\tconst totalArcLength = 2 * capArcLength + cylinderPartLength;\n\n\t\tconst numVerticalSegments = capSegments * 2 + heightSegments;\n\t\tconst verticesPerRow = radialSegments + 1;\n\n\t\tconst normal = new Vector3();\n\t\tconst vertex = new Vector3();\n\n\t\t// generate vertices, normals, and uvs\n\n\t\tfor ( let iy = 0; iy <= numVerticalSegments; iy ++ ) {\n\n\t\t\tlet currentArcLength = 0;\n\t\t\tlet profileY = 0;\n\t\t\tlet profileRadius = 0;\n\t\t\tlet normalYComponent = 0;\n\n\t\t\tif ( iy <= capSegments ) {\n\n\t\t\t\t// bottom cap\n\t\t\t\tconst segmentProgress = iy / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = - halfHeight - radius * Math.cos( angle );\n\t\t\t\tprofileRadius = radius * Math.sin( angle );\n\t\t\t\tnormalYComponent = - radius * Math.cos( angle );\n\t\t\t\tcurrentArcLength = segmentProgress * capArcLength;\n\n\t\t\t} else if ( iy <= capSegments + heightSegments ) {\n\n\t\t\t\t// middle section\n\t\t\t\tconst segmentProgress = ( iy - capSegments ) / heightSegments;\n\t\t\t\tprofileY = - halfHeight + segmentProgress * height;\n\t\t\t\tprofileRadius = radius;\n\t\t\t\tnormalYComponent = 0;\n\t\t\t\tcurrentArcLength = capArcLength + segmentProgress * cylinderPartLength;\n\n\t\t\t} else {\n\n\t\t\t\t// top cap\n\t\t\t\tconst segmentProgress =\n\t\t\t\t\t( iy - capSegments - heightSegments ) / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = halfHeight + radius * Math.sin( angle );\n\t\t\t\tprofileRadius = radius * Math.cos( angle );\n\t\t\t\tnormalYComponent = radius * Math.sin( angle );\n\t\t\t\tcurrentArcLength =\n\t\t\t\t\tcapArcLength + cylinderPartLength + segmentProgress * capArcLength;\n\n\t\t\t}\n\n\t\t\tconst v = Math.max( 0, Math.min( 1, currentArcLength / totalArcLength ) );\n\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / radialSegments;\n\n\t\t\t} else if ( iy === numVerticalSegments ) {\n\n\t\t\t\tuOffset = -0.5 / radialSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= radialSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / radialSegments;\n\t\t\t\tconst theta = u * Math.PI * 2;\n\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - profileRadius * cosTheta;\n\t\t\t\tvertex.y = profileY;\n\t\t\t\tvertex.z = profileRadius * sinTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set(\n\t\t\t\t\t- profileRadius * cosTheta,\n\t\t\t\t\tnormalYComponent,\n\t\t\t\t\tprofileRadius * sinTheta\n\t\t\t\t);\n\t\t\t\tnormal.normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, v );\n\n\t\t\t}\n\n\t\t\tif ( iy > 0 ) {\n\n\t\t\t\tconst prevIndexRow = ( iy - 1 ) * verticesPerRow;\n\t\t\t\tfor ( let ix = 0; ix < radialSegments; ix ++ ) {\n\n\t\t\t\t\tconst i1 = prevIndexRow + ix;\n\t\t\t\t\tconst i2 = prevIndexRow + ix + 1;\n\t\t\t\t\tconst i3 = iy * verticesPerRow + ix;\n\t\t\t\t\tconst i4 = iy * verticesPerRow + ix + 1;\n\n\t\t\t\t\tindices.push( i1, i2, i3 );\n\t\t\t\t\tindices.push( i2, i4, i3 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CapsuleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.height, data.capSegments, data.radialSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A simple shape of Euclidean geometry. It is constructed from a\n * number of triangular segments that are oriented around a central point and\n * extend as far out as a given radius. It is built counter-clockwise from a\n * start angle and a given central angle. It can also be used to create\n * regular polygons, where the number of segments determines the number of\n * sides.\n *\n * ```js\n * const geometry = new THREE.CircleGeometry( 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const circle = new THREE.Mesh( geometry, material );\n * scene.add( circle )\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CircleGeometry\n */\nclass CircleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new circle geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the circle.\n\t * @param {number} [segments=32] - Number of segments (triangles), minimum = `3`.\n\t * @param {number} [thetaStart=0] - Start angle for first segment in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta,\n\t * of the circular sector in radians. The default value results in a complete circle.\n\t */\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CircleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cylinder.\n *\n * ```js\n * const geometry = new THREE.CylinderGeometry( 5, 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cylinder = new THREE.Mesh( geometry, material );\n * scene.add( cylinder );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CylinderGeometry\n */\nclass CylinderGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new cylinder geometry.\n\t *\n\t * @param {number} [radiusTop=1] - Radius of the cylinder at the top.\n\t * @param {number} [radiusBottom=1] - Radius of the cylinder at the bottom.\n\t * @param {number} [height=1] - Height of the cylinder.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cylinder.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cylinder.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cylinder is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cylinder.\n\t */\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tif ( radiusTop > 0 || y !== 0 ) {\n\n\t\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( radiusBottom > 0 || y !== heightSegments - 1 ) {\n\n\t\t\t\t\t\tindices.push( b, c, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : -1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CylinderGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cone.\n *\n * ```js\n * const geometry = new THREE.ConeGeometry( 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cone = new THREE.Mesh(geometry, material );\n * scene.add( cone );\n * ```\n *\n * @augments CylinderGeometry\n * @demo scenes/geometry-browser.html#ConeGeometry\n */\nclass ConeGeometry extends CylinderGeometry {\n\n\t/**\n\t * Constructs a new cone geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the cone base.\n\t * @param {number} [height=1] - Height of the cone.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cone.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cone.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cone is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cone.\n\t */\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {ConeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A polyhedron is a solid in three dimensions with flat faces. This class\n * will take an array of vertices, project them onto a sphere, and then\n * divide them up to the desired level of detail.\n *\n * @augments BufferGeometry\n */\nclass PolyhedronGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new polyhedron geometry.\n\t *\n\t * @param {Array} [vertices] - A flat array of vertices describing the base shape.\n\t * @param {Array} [indices] - A flat array of indices describing the base shape.\n\t * @param {number} [radius=1] - The radius of the shape.\n\t * @param {number} [detail=0] - How many levels to subdivide the geometry. The more detail, the smoother the shape.\n\t */\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PolyhedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a dodecahedron.\n *\n * ```js\n * const geometry = new THREE.DodecahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const dodecahedron = new THREE.Mesh( geometry, material );\n * scene.add( dodecahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#DodecahedronGeometry\n */\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new dodecahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the dodecahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a dodecahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t-1, -1, -1,\t-1, -1, 1,\n\t\t\t-1, 1, -1, -1, 1, 1,\n\t\t\t1, -1, -1, 1, -1, 1,\n\t\t\t1, 1, -1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {DodecahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\n/**\n * Can be used as a helper object to view the edges of a geometry.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry();\n * const edges = new THREE.EdgesGeometry( geometry );\n * const line = new THREE.LineSegments( edges );\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass EdgesGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new edges geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t * @param {number} [thresholdAngle=1] - An edge is only rendered if the angle (in degrees)\n\t * between the face normals of the adjoining faces exceeds this value.\n\t */\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\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\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An abstract base class for creating an analytic curve object that contains methods\n * for interpolation.\n *\n * @abstract\n */\nclass Curve {\n\n\t/**\n\t * Constructs a new curve.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Curve';\n\n\t\t/**\n\t\t * This value determines the amount of divisions when calculating the\n\t\t * cumulative segment lengths of a curve via {@link Curve#getLengths}. To ensure\n\t\t * precision when using methods like {@link Curve#getSpacedPoints}, it is\n\t\t * recommended to increase the value of this property if the curve is very large.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.arcLengthDivisions = 200;\n\n\t\t/**\n\t\t * Must be set to `true` if the curve parameters have changed.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\t/**\n\t\t * An internal cache that holds precomputed curve length values.\n\t\t *\n\t\t * @private\n\t\t * @type {?Array}\n\t\t * @default null\n\t\t */\n\t\tthis.cacheArcLengths = null;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor.\n\t *\n\t * @abstract\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\twarn( 'Curve: .getPoint() not implemented.' );\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor. Unlike {@link Curve#getPoint}, this method honors the length\n\t * of the curve which equidistant samples.\n\t *\n\t * @param {number} u - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPoint} and returns an array of points representing\n\t * the curve shape.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPointAt} and returns an array of points representing\n\t * the curve shape. Unlike {@link Curve#getPoints}, this method returns equi-spaced points across the entire\n\t * curve.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t/**\n\t * Returns the total arc length of the curve.\n\t *\n\t * @return {number} The length of the curve.\n\t */\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t/**\n\t * Returns an array of cumulative segment lengths of the curve.\n\t *\n\t * @param {number} [divisions=this.arcLengthDivisions] - The number of divisions.\n\t * @return {Array} An array holding the cumulative segment lengths.\n\t */\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\t/**\n\t * Update the cumulative segment distance cache. The method must be called\n\t * every time curve parameters are changed. If an updated curve is part of a\n\t * composed curve like {@link CurvePath}, this method must be called on the\n\t * composed curve, too.\n\t */\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t/**\n\t * Given an interpolation factor in the range `[0,1]`, this method returns an updated\n\t * interpolation factor in the same range that can be ued to sample equidistant points\n\t * from a curve.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {?number} distance - An optional distance on the curve.\n\t * @return {number} The updated interpolation factor.\n\t */\n\tgetUtoTmapping( u, distance = null ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns a unit vector tangent for the given interpolation factor.\n\t * If the derived curve does not implement its tangent derivation,\n\t * two points a small delta apart will be used to find its gradient\n\t * which seems to give a reasonable approximation.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t */\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\t/**\n\t * Same as {@link Curve#getTangent} but with equidistant samples.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t * @see {@link Curve#getPointAt}\n\t */\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * Generates the Frenet Frames. Requires a curve definition in 3D space. Used\n\t * in geometries like {@link TubeGeometry} or {@link ExtrudeGeometry}.\n\t *\n\t * @param {number} segments - The number of segments.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @return {{tangents: Array, normals: Array, binormals: Array}} The Frenet Frames.\n\t */\n\tcomputeFrenetFrames( segments, closed = false ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), -1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), -1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a new curve with copied values from this instance.\n\t *\n\t * @return {Curve} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given curve to this instance.\n\t *\n\t * @param {Curve} source - The curve to copy.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the curve into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized curve.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Deserializes the curve from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized curve.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an ellipse.\n *\n * ```js\n * const curve = new THREE.EllipseCurve(\n * \t0, 0,\n * \t10, 10,\n * \t0, 2 * Math.PI,\n * \tfalse,\n * \t0\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const ellipse = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass EllipseCurve extends Curve {\n\n\t/**\n\t * Constructs a new ellipse curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t */\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\t/**\n\t\t * The X center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aX = aX;\n\n\t\t/**\n\t\t * The Y center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aY = aY;\n\n\t\t/**\n\t\t * The radius of the ellipse in the x direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#yRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.xRadius = xRadius;\n\n\t\t/**\n\t\t * The radius of the ellipse in the y direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#xRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.yRadius = yRadius;\n\n\t\t/**\n\t\t * The start angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aStartAngle = aStartAngle;\n\n\t\t/**\n\t\t * The end angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI*2\n\t\t */\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\t/**\n\t\t * Whether the ellipse is drawn clockwise or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.aClockwise = aClockwise;\n\n\t\t/**\n\t\t * The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an arc.\n *\n * @augments EllipseCurve\n */\nclass ArcCurve extends EllipseCurve {\n\n\t/**\n\t * Constructs a new arc curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [aRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t */\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\nfunction CubicPoly() {\n\n\t/**\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t* cusps and self-intersections in non-uniform catmull rom curves.\n\t* http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t*\n\t* curve.type accepts centripetal(default), chordal and catmullrom\n\t* curve.tension is used for catmullrom which defaults to 0.5\n\t*/\n\n\t/*\n\tBased on an optimized c++ solution in\n\t- http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t- http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = -3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\n/**\n * A curve representing a Catmull-Rom spline.\n *\n * ```js\n * //Create a closed wavey loop\n * const curve = new THREE.CatmullRomCurve3( [\n * \tnew THREE.Vector3( -10, 0, 10 ),\n * \tnew THREE.Vector3( -5, 5, 5 ),\n * \tnew THREE.Vector3( 0, 0, 0 ),\n * \tnew THREE.Vector3( 5, -5, 5 ),\n * \tnew THREE.Vector3( 10, 0, 10 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CatmullRomCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Catmull-Rom curve.\n\t *\n\t * @param {Array} [points] - An array of 3D points defining the curve.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @param {('centripetal'|'chordal'|'catmullrom')} [curveType='centripetal'] - The curve type.\n\t * @param {number} [tension=0.5] - Tension of the curve.\n\t */\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\t/**\n\t\t * An array of 3D points defining the curve.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.points = points;\n\n\t\t/**\n\t\t * Whether the curve is closed or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.closed = closed;\n\n\t\t/**\n\t\t * The curve type.\n\t\t *\n\t\t * @type {('centripetal'|'chordal'|'catmullrom')}\n\t\t * @default 'centripetal'\n\t\t */\n\t\tthis.curveType = curveType;\n\n\t\t/**\n\t\t * Tension of the curve.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.tension = tension;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Interpolations contains spline and Bézier functions internally used by concrete curve classes.\n *\n * Bezier Curves formulas obtained from: https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n *\n * @module Interpolations\n */\n\n/**\n * Computes a point on a Catmull-Rom spline.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Catmull-Rom spline.\n */\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( -3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\n/**\n * Computes a point on a Quadratic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @return {number} The calculated point on a Quadratic Bezier curve.\n */\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\n/**\n * Computes a point on a Cubic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Cubic Bezier curve.\n */\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\n/**\n * A curve representing a 2D Cubic Bezier curve.\n *\n * ```js\n * const curve = new THREE.CubicBezierCurve(\n * \tnew THREE.Vector2( - 0, 0 ),\n * \tnew THREE.Vector2( - 5, 15 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CubicBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The first control point.\n\t * @param {Vector2} [v2] - The second control point.\n\t * @param {Vector2} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Cubic Bezier curve.\n *\n * @augments Curve\n */\nclass CubicBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The first control point.\n\t * @param {Vector3} [v2] - The second control point.\n\t * @param {Vector3} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D line segment.\n *\n * @augments Curve\n */\nclass LineCurve extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector2} [v1] - The start point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector2() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D line segment.\n *\n * @augments Curve\n */\nclass LineCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector3} [v1] - The start point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D Quadratic Bezier curve.\n *\n * ```js\n * const curve = new THREE.QuadraticBezierCurve(\n * \tnew THREE.Vector2( - 10, 0 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * )\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The control point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Quadratic Bezier curve.\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The control point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D spline curve.\n *\n * ```js\n * // Create a sine-like wave\n * const curve = new THREE.SplineCurve( [\n * \tnew THREE.Vector2( -10, 0 ),\n * \tnew THREE.Vector2( -5, 5 ),\n * \tnew THREE.Vector2( 0, 0 ),\n * \tnew THREE.Vector2( 5, -5 ),\n * \tnew THREE.Vector2( 10, 0 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const splineObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass SplineCurve extends Curve {\n\n\t/**\n\t * Constructs a new 2D spline curve.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the curve.\n\t */\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\t/**\n\t\t * An array of 2D points defining the curve.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.points = points;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**\n * A base class extending {@link Curve}. `CurvePath` is simply an\n * array of connected curves, but retains the API of a curve.\n *\n * @augments Curve\n */\nclass CurvePath extends Curve {\n\n\t/**\n\t * Constructs a new curve path.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\t/**\n\t\t * An array of curves defining the\n\t\t * path.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.curves = [];\n\n\t\t/**\n\t\t * Whether the path should automatically be closed\n\t\t * by a line curve.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoClose = false;\n\n\t}\n\n\t/**\n\t * Adds a curve to this curve path.\n\t *\n\t * @param {Curve} curve - The curve to add.\n\t */\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\t/**\n\t * Adds a line curve to close the path.\n\t *\n\t * @return {CurvePath} A reference to this curve path.\n\t */\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tconst lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3';\n\t\t\tthis.curves.push( new Curves[ lineType ]( endPoint, startPoint ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definitions)\n\t * for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {?(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( t, optionalTarget ) {\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 } The curve lengths.\n\t */\n\tgetCurveLengths() {\n\n\t\t// Compute lengths and cache them\n\t\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A 2D path representation. The class provides methods for creating paths\n * and contours of 2D shapes similar to the 2D Canvas API.\n *\n * ```js\n * const path = new THREE.Path();\n *\n * path.lineTo( 0, 0.8 );\n * path.quadraticCurveTo( 0, 1, 0.2, 1 );\n * path.lineTo( 1, 1 );\n *\n * const points = path.getPoints();\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments CurvePath\n */\nclass Path extends CurvePath {\n\n\t/**\n\t * Constructs a new path.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the path.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\t/**\n\t\t * The current offset of the path. Any new curve added will start here.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a path from the given list of points. The points are added\n\t * to the path as instances of {@link LineCurve}.\n\t *\n\t * @param {Array} points - An array of 2D points.\n\t * @return {Path} A reference to this path.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Moves {@link Path#currentPoint} to the given point.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {Path} A reference to this path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array} pts - An array of points in 2D space.\n\t * @return {Path} A reference to this path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an arc as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned arc as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an ellipse as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned ellipse as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the absolute center of the ellipse.\n\t * @param {number} [aY=0] - The y coordinate of the absolute center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Defines an arbitrary 2d shape plane using paths with optional holes. It\n * can be used with {@link ExtrudeGeometry}, {@link ShapeGeometry}, to get\n * points, or to get triangulated faces.\n *\n * ```js\n * const heartShape = new THREE.Shape();\n *\n * heartShape.moveTo( 25, 25 );\n * heartShape.bezierCurveTo( 25, 25, 20, 0, 0, 0 );\n * heartShape.bezierCurveTo( - 30, 0, - 30, 35, - 30, 35 );\n * heartShape.bezierCurveTo( - 30, 55, - 10, 77, 25, 95 );\n * heartShape.bezierCurveTo( 60, 77, 80, 55, 80, 35 );\n * heartShape.bezierCurveTo( 80, 35, 80, 0, 50, 0 );\n * heartShape.bezierCurveTo( 35, 0, 25, 25, 25, 25 );\n *\n * const extrudeSettings = {\n * \tdepth: 8,\n * \tbevelEnabled: true,\n * \tbevelSegments: 2,\n * \tsteps: 2,\n * \tbevelSize: 1,\n * \tbevelThickness: 1\n * };\n *\n * const geometry = new THREE.ExtrudeGeometry( heartShape, extrudeSettings );\n * const mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial() );\n * ```\n *\n * @augments Path\n */\nclass Shape extends Path {\n\n\t/**\n\t * Constructs a new shape.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the shape.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\t/**\n\t\t * The UUID of the shape.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\t/**\n\t\t * Defines the holes in the shape. Hole definitions must use the\n\t\t * opposite winding order (CW/CCW) than the outer shape.\n\t\t *\n\t\t * @type {Array}\n\t\t * @readonly\n\t\t */\n\t\tthis.holes = [];\n\n\t}\n\n\t/**\n\t * Returns an array representing each contour of the holes\n\t * as a list of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {Array>} The holes as a series of 2D points.\n\t */\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\t/**\n\t * Returns an object that holds contour data for the shape and its holes as\n\t * arrays of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {{shape:Array,holes:Array>}} An object with contour data.\n\t */\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* eslint-disable */\n// copy of mapbox/earcut version 3.0.2\n// https://github.com/mapbox/earcut/tree/v3.0.2\n\nfunction earcut(data, holeIndices, dim = 2) {\n\n const hasHoles = holeIndices && holeIndices.length;\n const outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n let outerNode = linkedList(data, 0, outerLen, dim, true);\n const triangles = [];\n\n if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n let minX, minY, invSize;\n\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n if (data.length > 80 * dim) {\n minX = data[0];\n minY = data[1];\n let maxX = minX;\n let maxY = minY;\n\n for (let i = dim; i < outerLen; i += dim) {\n const x = data[i];\n const y = data[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n\n // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n invSize = Math.max(maxX - minX, maxY - minY);\n invSize = invSize !== 0 ? 32767 / invSize : 0;\n }\n\n earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n\n return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n let last;\n\n if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n for (let i = start; i < end; i += dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n } else {\n for (let i = end - dim; i >= start; i -= dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n }\n\n if (last && equals(last, last.next)) {\n removeNode(last);\n last = last.next;\n }\n\n return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n if (!start) return start;\n if (!end) end = start;\n\n let p = start,\n again;\n do {\n again = false;\n\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = end = p.prev;\n if (p === p.next) break;\n again = true;\n\n } else {\n p = p.next;\n }\n } while (again || p !== end);\n\n return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n if (!ear) return;\n\n // interlink polygon nodes in z-order\n if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n let stop = ear;\n\n // iterate through ears, slicing them one by one\n while (ear.prev !== ear.next) {\n const prev = ear.prev;\n const next = ear.next;\n\n if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n triangles.push(prev.i, ear.i, next.i); // cut off the triangle\n\n removeNode(ear);\n\n // skipping the next vertex leads to less sliver triangles\n ear = next.next;\n stop = next.next;\n\n continue;\n }\n\n ear = next;\n\n // if we looped through the whole remaining polygon and can't find any more ears\n if (ear === stop) {\n // try filtering points and slicing again\n if (!pass) {\n earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n // if this didn't work, try curing all small self-intersections locally\n } else if (pass === 1) {\n ear = cureLocalIntersections(filterPoints(ear), triangles);\n earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n // as a last resort, try splitting the remaining polygon into two\n } else if (pass === 2) {\n splitEarcut(ear, triangles, dim, minX, minY, invSize);\n }\n\n break;\n }\n }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n const a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // now make sure we don't have other points inside the potential ear\n const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n // triangle bbox\n const x0 = Math.min(ax, bx, cx),\n y0 = Math.min(ay, by, cy),\n x1 = Math.max(ax, bx, cx),\n y1 = Math.max(ay, by, cy);\n\n let p = c.next;\n while (p !== a) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.next;\n }\n\n return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n const a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n // triangle bbox\n const x0 = Math.min(ax, bx, cx),\n y0 = Math.min(ay, by, cy),\n x1 = Math.max(ax, bx, cx),\n y1 = Math.max(ay, by, cy);\n\n // z-order range for the current triangle bbox;\n const minZ = zOrder(x0, y0, minX, minY, invSize),\n maxZ = zOrder(x1, y1, minX, minY, invSize);\n\n let p = ear.prevZ,\n n = ear.nextZ;\n\n // look for points inside the triangle in both directions\n while (p && p.z >= minZ && n && n.z <= maxZ) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n // look for remaining points in decreasing z-order\n while (p && p.z >= minZ) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n }\n\n // look for remaining points in increasing z-order\n while (n && n.z <= maxZ) {\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles) {\n let p = start;\n do {\n const a = p.prev,\n b = p.next.next;\n\n if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n triangles.push(a.i, p.i, b.i);\n\n // remove two nodes involved\n removeNode(p);\n removeNode(p.next);\n\n p = start = b;\n }\n p = p.next;\n } while (p !== start);\n\n return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n // look for a valid diagonal that divides the polygon into two\n let a = start;\n do {\n let b = a.next.next;\n while (b !== a.prev) {\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n // split the polygon in two by the diagonal\n let c = splitPolygon(a, b);\n\n // filter colinear points around the cuts\n a = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n\n // run earcut on each half\n earcutLinked(a, triangles, dim, minX, minY, invSize, 0);\n earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n return;\n }\n b = b.next;\n }\n a = a.next;\n } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n const queue = [];\n\n for (let i = 0, len = holeIndices.length; i < len; i++) {\n const start = holeIndices[i] * dim;\n const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n const list = linkedList(data, start, end, dim, false);\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n\n queue.sort(compareXYSlope);\n\n // process holes from left to right\n for (let i = 0; i < queue.length; i++) {\n outerNode = eliminateHole(queue[i], outerNode);\n }\n\n return outerNode;\n}\n\nfunction compareXYSlope(a, b) {\n let result = a.x - b.x;\n // when the left-most point of 2 holes meet at a vertex, sort the holes counterclockwise so that when we find\n // the bridge to the outer shell is always the point that they meet at.\n if (result === 0) {\n result = a.y - b.y;\n if (result === 0) {\n const aSlope = (a.next.y - a.y) / (a.next.x - a.x);\n const bSlope = (b.next.y - b.y) / (b.next.x - b.x);\n result = aSlope - bSlope;\n }\n }\n return result;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole(hole, outerNode) {\n const bridge = findHoleBridge(hole, outerNode);\n if (!bridge) {\n return outerNode;\n }\n\n const bridgeReverse = splitPolygon(bridge, hole);\n\n // filter collinear points around the cuts\n filterPoints(bridgeReverse, bridgeReverse.next);\n return filterPoints(bridge, bridge.next);\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n let p = outerNode;\n const hx = hole.x;\n const hy = hole.y;\n let qx = -Infinity;\n let m;\n\n // find a segment intersected by a ray from the hole's leftmost point to the left;\n // segment's endpoint with lesser x will be potential connection point\n // unless they intersect at a vertex, then choose the vertex\n if (equals(hole, p)) return p;\n do {\n if (equals(hole, p.next)) return p.next;\n else if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n if (x <= hx && x > qx) {\n qx = x;\n m = p.x < p.next.x ? p : p.next;\n if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\n }\n }\n p = p.next;\n } while (p !== outerNode);\n\n if (!m) return null;\n\n // look for points inside the triangle of hole point, segment intersection and endpoint;\n // if there are no points found, we have a valid connection;\n // otherwise choose the point of the minimum angle with the ray as connection point\n\n const stop = m;\n const mx = m.x;\n const my = m.y;\n let tanMin = Infinity;\n\n p = m;\n\n do {\n if (hx >= p.x && p.x >= mx && hx !== p.x &&\n pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n const tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n if (locallyInside(p, hole) &&\n (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n m = p;\n tanMin = tan;\n }\n }\n\n p = p.next;\n } while (p !== stop);\n\n return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n let p = start;\n do {\n if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n } while (p !== start);\n\n p.prevZ.nextZ = null;\n p.prevZ = null;\n\n sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n let numMerges;\n let inSize = 1;\n\n do {\n let p = list;\n let e;\n list = null;\n let tail = null;\n numMerges = 0;\n\n while (p) {\n numMerges++;\n let q = p;\n let pSize = 0;\n for (let i = 0; i < inSize; i++) {\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n let qSize = inSize;\n\n while (pSize > 0 || (qSize > 0 && q)) {\n\n if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else {\n e = q;\n q = q.nextZ;\n qSize--;\n }\n\n if (tail) tail.nextZ = e;\n else list = e;\n\n e.prevZ = tail;\n tail = e;\n }\n\n p = q;\n }\n\n tail.nextZ = null;\n inSize *= 2;\n\n } while (numMerges > 1);\n\n return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n // coords are transformed into non-negative 15-bit integer range\n x = (x - minX) * invSize | 0;\n y = (y - minY) * invSize | 0;\n\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n\n y = (y | (y << 8)) & 0x00FF00FF;\n y = (y | (y << 4)) & 0x0F0F0F0F;\n y = (y | (y << 2)) & 0x33333333;\n y = (y | (y << 1)) & 0x55555555;\n\n return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n let p = start,\n leftmost = start;\n do {\n if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n p = p.next;\n } while (p !== start);\n\n return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&\n (ax - px) * (by - py) >= (bx - px) * (ay - py) &&\n (bx - px) * (cy - py) >= (cx - px) * (by - py);\n}\n\n// check if a point lies within a convex triangle but false if its equal to the first point of the triangle\nfunction pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, px, py) {\n return !(ax === px && ay === py) && pointInTriangle(ax, ay, bx, by, cx, cy, px, py);\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // doesn't intersect other edges\n (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n const o1 = sign(area(p1, q1, p2));\n const o2 = sign(area(p1, q1, q2));\n const o3 = sign(area(p2, q2, p1));\n const o4 = sign(area(p2, q2, q1));\n\n if (o1 !== o2 && o3 !== o4) return true; // general case\n\n if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n let p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n intersects(p, p.next, a, b)) return true;\n p = p.next;\n } while (p !== a);\n\n return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n return area(a.prev, a, a.next) < 0 ?\n area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n let p = a;\n let inside = false;\n const px = (a.x + b.x) / 2;\n const py = (a.y + b.y) / 2;\n do {\n if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n inside = !inside;\n p = p.next;\n } while (p !== a);\n\n return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n const a2 = createNode(a.i, a.x, a.y),\n b2 = createNode(b.i, b.x, b.y),\n an = a.next,\n bp = b.prev;\n\n a.next = b;\n b.prev = a;\n\n a2.next = an;\n an.prev = a2;\n\n b2.next = a2;\n a2.prev = b2;\n\n bp.next = b2;\n b2.prev = bp;\n\n return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n const p = createNode(i, x, y);\n\n if (!last) {\n p.prev = p;\n p.next = p;\n\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\n\nfunction removeNode(p) {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction createNode(i, x, y) {\n return {\n i, // vertex index in coordinates array\n x, y, // vertex coordinates\n prev: null, // previous and next vertex nodes in a polygon ring\n next: null,\n z: 0, // z-order curve value\n prevZ: null, // previous and next nodes in z-order\n nextZ: null,\n steiner: false // indicates whether this is a steiner point\n };\n}\n\nfunction signedArea(data, start, end, dim) {\n let sum = 0;\n for (let i = start, j = end - dim; i < end; i += dim) {\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n j = i;\n }\n return sum;\n}\n\n/**\n * An implementation of the earcut polygon triangulation algorithm.\n * The code is a port of [mapbox/earcut](https://github.com/mapbox/earcut).\n *\n * @see https://github.com/mapbox/earcut\n */\nclass Earcut {\n\n\t/**\n\t * Triangulates the given shape definition by returning an array of triangles.\n\t *\n\t * @param {Array} data - An array with 2D points.\n\t * @param {Array} holeIndices - An array with indices defining holes.\n\t * @param {number} [dim=2] - The number of coordinates per vertex in the input array.\n\t * @return {Array} An array representing the triangulated faces. Each face is defined by three consecutive numbers\n\t * representing vertex indices.\n\t */\n\tstatic triangulate( data, holeIndices, dim = 2 ) {\n\n\t\treturn earcut( data, holeIndices, dim );\n\n\t}\n\n}\n\n/**\n * A class containing utility functions for shapes.\n *\n * @hideconstructor\n */\nclass ShapeUtils {\n\n\t/**\n\t * Calculate area of a ( 2D ) contour polygon.\n\t *\n\t * @param {Array} contour - An array of 2D points.\n\t * @return {number} The area.\n\t */\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given contour uses a clockwise winding order.\n\t *\n\t * @param {Array} pts - An array of 2D points defining a polygon.\n\t * @return {boolean} Whether the given contour uses a clockwise winding order or not.\n\t */\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\t/**\n\t * Triangulates the given shape definition.\n\t *\n\t * @param {Array} contour - An array of 2D points defining the contour.\n\t * @param {Array>} holes - An array that holds arrays of 2D points defining the holes.\n\t * @return {Array>} An array that holds for each face definition an array with three indices.\n\t */\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * ```js\n * const length = 12, width = 8;\n *\n * const shape = new THREE.Shape();\n * shape.moveTo( 0,0 );\n * shape.lineTo( 0, width );\n * shape.lineTo( length, width );\n * shape.lineTo( length, 0 );\n * shape.lineTo( 0, 0 );\n *\n * const geometry = new THREE.ExtrudeGeometry( shape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ExtrudeGeometry\n */\nclass ExtrudeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new extrude geometry.\n\t *\n\t * @param {Shape|Array} [shapes] - A shape or an array of shapes.\n\t * @param {ExtrudeGeometry~Options} [options] - The extrude settings.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( -0.5, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/**Merges index-adjacent points that are within a threshold distance of each other. Array is modified in-place. Threshold distance is empirical, and scaled based on the magnitude of point coordinates.\n\t\t\t * @param {Array} points\n\t\t\t*/\n\t\t\tfunction mergeOverlappingPoints( points ) {\n\n\t\t\t\tconst THRESHOLD = 1e-10;\n\t\t\t\tconst THRESHOLD_SQ = THRESHOLD * THRESHOLD;\n\t\t\t\tlet prevPos = points[ 0 ];\n\t\t\t\tfor ( let i = 1; i <= points.length; i ++ ) {\n\n\t\t\t\t\tconst currentIndex = i % points.length;\n\t\t\t\t\tconst currentPos = points[ currentIndex ];\n\t\t\t\t\tconst dx = currentPos.x - prevPos.x;\n\t\t\t\t\tconst dy = currentPos.y - prevPos.y;\n\t\t\t\t\tconst distSq = dx * dx + dy * dy;\n\n\t\t\t\t\tconst scalingFactorSqrt = Math.max(\n\t\t\t\t\t\tMath.abs( currentPos.x ),\n\t\t\t\t\t\tMath.abs( currentPos.y ),\n\t\t\t\t\t\tMath.abs( prevPos.x ),\n\t\t\t\t\t\tMath.abs( prevPos.y )\n\t\t\t\t\t);\n\t\t\t\t\tconst thresholdSqScaled = THRESHOLD_SQ * scalingFactorSqrt * scalingFactorSqrt;\n\t\t\t\t\tif ( distSq <= thresholdSqScaled ) {\n\n\t\t\t\t\t\tpoints.splice( currentIndex, 1 );\n\t\t\t\t\t\ti --;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tprevPos = currentPos;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmergeOverlappingPoints( vertices );\n\t\t\tholes.forEach( mergeOverlappingPoints );\n\n\t\t\tconst numHoles = holes.length;\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0; h < numHoles; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) error( 'ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn pt.clone().addScaledVector( vec, size );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t// but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t// log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\t\t\tlet faces;\n\n\t\t\tif ( bevelSegments === 0 ) {\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contour, holes );\n\n\t\t\t} else {\n\n\t\t\t\tconst contractedContourVertices = [];\n\t\t\t\tconst expandedHoleVertices = [];\n\n\t\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t\t// contract shape\n\n\t\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\tif ( t === 0 ) contractedContourVertices.push( vert );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// expand holes\n\n\t\t\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\t\t\t\t\t\tconst oneHoleVertices = [];\n\t\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\t\tif ( t === 0 ) oneHoleVertices.push( vert );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( t === 0 ) expandedHoleVertices.push( oneHoleVertices );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contractedContourVertices, expandedHoleVertices );\n\n\t\t\t}\n\n\t\t\tconst flen = faces.length;\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\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\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t///// Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array} shapes - An array of shapes.\n\t * @return {ExtrudeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n/**\n * A geometry class for representing an icosahedron.\n *\n * ```js\n * const geometry = new THREE.IcosahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const icosahedron = new THREE.Mesh( geometry, material );\n * scene.add( icosahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#IcosahedronGeometry\n */\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new icosahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the icosahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a icosahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t-1, t, 0, \t1, t, 0, \t-1, - t, 0, \t1, - t, 0,\n\t\t\t0, -1, t, \t0, 1, t,\t0, -1, - t, \t0, 1, - t,\n\t\t\tt, 0, -1, \tt, 0, 1, \t- t, 0, -1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {IcosahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * Creates meshes with axial symmetry like vases. The lathe rotates around the Y axis.\n *\n * ```js\n * const points = [];\n * for ( let i = 0; i < 10; i ++ ) {\n * \tpoints.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );\n * }\n * const geometry = new THREE.LatheGeometry( points );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const lathe = new THREE.Mesh( geometry, material );\n * scene.add( lathe );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#LatheGeometry\n */\nclass LatheGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new lathe geometry.\n\t *\n\t * @param {Array} [points] - An array of points in 2D space. The x-coordinate of each point\n\t * must be greater than zero.\n\t * @param {number} [segments=12] - The number of circumference segments to generate.\n\t * @param {number} [phiStart=0] - The starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The radian (0 to 2PI) range of the lathed section 2PI is a\n\t * closed lathe, less than 2PI is a portion.\n\t */\n\tconstructor( points = [ new Vector2( 0, -0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {LatheGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an octahedron.\n *\n * ```js\n * const geometry = new THREE.OctahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const octahedron = new THREE.Mesh( geometry, material );\n * scene.add( octahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#OctahedronGeometry\n */\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new octahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the octahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a octahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t-1, 0, 0,\t0, 1, 0,\n\t\t\t0, -1, 0, \t0, 0, 1,\t0, 0, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {OctahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a plane.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const plane = new THREE.Mesh( geometry, material );\n * scene.add( plane );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#PlaneGeometry\n */\nclass PlaneGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new plane geometry.\n\t *\n\t * @param {number} [width=1] - The width along the X axis.\n\t * @param {number} [height=1] - The height along the Y axis\n\t * @param {number} [widthSegments=1] - The number of segments along the X axis.\n\t * @param {number} [heightSegments=1] - The number of segments along the Y axis.\n\t */\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PlaneGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A class for generating a two-dimensional ring geometry.\n *\n * ```js\n * const geometry = new THREE.RingGeometry( 1, 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#RingGeometry\n */\nclass RingGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new ring geometry.\n\t *\n\t * @param {number} [innerRadius=0.5] - The inner radius of the ring.\n\t * @param {number} [outerRadius=1] - The outer radius of the ring.\n\t * @param {number} [thetaSegments=32] - Number of segments. A higher number means the ring will be more round. Minimum is `3`.\n\t * @param {number} [phiSegments=1] - Number of segments per ring segment. Minimum is `1`.\n\t * @param {number} [thetaStart=0] - Starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {RingGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * Creates an one-sided polygonal geometry from one or more path shapes.\n *\n * ```js\n * const arcShape = new THREE.Shape()\n *\t.moveTo( 5, 1 )\n *\t.absarc( 1, 1, 4, 0, Math.PI * 2, false );\n *\n * const geometry = new THREE.ShapeGeometry( arcShape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ShapeGeometry\n */\nclass ShapeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new shape geometry.\n\t *\n\t * @param {Shape|Array} [shapes] - A shape or an array of shapes.\n\t * @param {number} [curveSegments=12] - Number of segments per shape.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array} shapes - An array of shapes.\n\t * @return {ShapeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\n/**\n * A class for generating a sphere geometry.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry( 15, 32, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const sphere = new THREE.Mesh( geometry, material );\n * scene.add( sphere );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#SphereGeometry\n */\nclass SphereGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new sphere geometry.\n\t *\n\t * @param {number} [radius=1] - The sphere radius.\n\t * @param {number} [widthSegments=32] - The number of horizontal segments. Minimum value is `3`.\n\t * @param {number} [heightSegments=16] - The number of vertical segments. Minimum value is `2`.\n\t * @param {number} [phiStart=0] - The horizontal starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The horizontal sweep angle size.\n\t * @param {number} [thetaStart=0] - The vertical starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI] - The vertical sweep angle size.\n\t */\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 && thetaStart === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy === heightSegments && thetaEnd === Math.PI ) {\n\n\t\t\t\tuOffset = -0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {SphereGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an tetrahedron.\n *\n * ```js\n * const geometry = new THREE.TetrahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const tetrahedron = new THREE.Mesh( geometry, material );\n * scene.add( tetrahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#TetrahedronGeometry\n */\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new tetrahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the tetrahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a tetrahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t-1, -1, 1, \t-1, 1, -1, \t1, -1, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TetrahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an torus.\n *\n * ```js\n * const geometry = new THREE.TorusGeometry( 10, 3, 16, 100 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torus = new THREE.Mesh( geometry, material );\n * scene.add( torus );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusGeometry\n */\nclass TorusGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus, from the center of the torus to the center of the tube.\n\t * @param {number} [tube=0.4] - Radius of the tube. Must be smaller than `radius`.\n\t * @param {number} [radialSegments=12] - The number of radial segments.\n\t * @param {number} [tubularSegments=48] - The number of tubular segments.\n\t * @param {number} [arc=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\n/**\n * Creates a torus knot, the particular shape of which is defined by a pair\n * of coprime integers, p and q. If p and q are not coprime, the result will\n * be a torus link.\n *\n * ```js\n * const geometry = new THREE.TorusKnotGeometry( 10, 3, 100, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torusKnot = new THREE.Mesh( geometry, material );\n * scene.add( torusKnot );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusKnotGeometry\n */\nclass TorusKnotGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus knot geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus knot.\n\t * @param {number} [tube=0.4] - Radius of the tube.\n\t * @param {number} [tubularSegments=64] - The number of tubular segments.\n\t * @param {number} [radialSegments=8] - The number of radial segments.\n\t * @param {number} [p=2] - This value determines, how many times the geometry winds around its axis of rotational symmetry.\n\t * @param {number} [q=3] - This value determines, how many times the geometry winds around a circle in the interior of the torus.\n\t */\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusKnotGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\n/**\n * Creates a tube that extrudes along a 3D curve.\n *\n * ```js\n * class CustomSinCurve extends THREE.Curve {\n *\n * \tgetPoint( t, optionalTarget = new THREE.Vector3() ) {\n *\n * \t\tconst tx = t * 3 - 1.5;\n * \t\tconst ty = Math.sin( 2 * Math.PI * t );\n * \t\tconst tz = 0;\n *\n * \t\treturn optionalTarget.set( tx, ty, tz );\n * \t}\n *\n * }\n *\n * const path = new CustomSinCurve( 10 );\n * const geometry = new THREE.TubeGeometry( path, 20, 2, 8, false );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TubeGeometry\n */\nclass TubeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new tube geometry.\n\t *\n\t * @param {Curve} [path=QuadraticBezierCurve3] - A 3D curve defining the path of the tube.\n\t * @param {number} [tubularSegments=64] - The number of segments that make up the tube.\n\t * @param {number} [radius=1] -The radius of the tube.\n\t * @param {number} [radialSegments=8] - The number of segments that make up the cross-section.\n\t * @param {boolean} [closed=false] - Whether the tube is closed or not.\n\t */\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( -1, -1, 0 ), new Vector3( -1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TubeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\n/**\n * Can be used as a helper object to visualize a geometry as a wireframe.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry();\n *\n * const wireframe = new THREE.WireframeGeometry( geometry );\n *\n * const line = new THREE.LineSegments( wireframe );\n * line.material.depthWrite = false;\n * line.material.opacity = 0.25;\n * line.material.transparent = true;\n *\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass WireframeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new wireframe geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t */\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\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} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\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\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\n/**\n * This material can receive shadows, but otherwise is completely transparent.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 2000, 2000 );\n * geometry.rotateX( - Math.PI / 2 );\n *\n * const material = new THREE.ShadowMaterial();\n * material.opacity = 0.2;\n *\n * const plane = new THREE.Mesh( geometry, material );\n * plane.position.y = -200;\n * plane.receiveShadow = true;\n * scene.add( plane );\n * ```\n *\n * @augments Material\n */\nclass ShadowMaterial extends Material {\n\n\t/**\n\t * Constructs a new shadow material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.color = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Overwritten since shadow materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This class works just like {@link ShaderMaterial}, except that definitions\n * of built-in uniforms and attributes are not automatically prepended to the\n * GLSL shader code.\n *\n * `RawShaderMaterial` can only be used with {@link WebGLRenderer}.\n *\n * @augments ShaderMaterial\n */\nclass RawShaderMaterial extends ShaderMaterial {\n\n\t/**\n\t * Constructs a new raw shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\n/**\n * A standard physically based material, using Metallic-Roughness workflow.\n *\n * Physically based rendering (PBR) has recently become the standard in many\n * 3D applications, such as [Unity](https://blogs.unity3d.com/2014/10/29/physically-based-shading-in-unity-5-a-primer/),\n * [Unreal](https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/PhysicallyBased/) and\n * [3D Studio Max](http://area.autodesk.com/blogs/the-3ds-max-blog/what039s-new-for-rendering-in-3ds-max-2017).\n *\n * This approach differs from older approaches in that instead of using\n * approximations for the way in which light interacts with a surface, a\n * physically correct model is used. The idea is that, instead of tweaking\n * materials to look good under specific lighting, a material can be created\n * that will react 'correctly' under all lighting scenarios.\n *\n * In practice this gives a more accurate and realistic looking result than\n * the {@link MeshLambertMaterial} or {@link MeshPhongMaterial}, at the cost of\n * being somewhat more computationally expensive. `MeshStandardMaterial` uses per-fragment\n * shading.\n *\n * Note that for best results you should always specify an environment map when using this material.\n *\n * For a non-technical introduction to the concept of PBR and how to set up a\n * PBR material, check out these articles by the people at [marmoset](https://www.marmoset.co):\n *\n * - [Basic Theory of Physically Based Rendering](https://www.marmoset.co/posts/basic-theory-of-physically-based-rendering/)\n * - [Physically Based Rendering and You Can Too](https://www.marmoset.co/posts/physically-based-rendering-and-you-can-too/)\n *\n * Technical details of the approach used in three.js (and most other PBR systems) can be found is this\n * [paper from Disney](https://media.disneyanimation.com/uploads/production/publication_asset/48/asset/s2012_pbs_disney_brdf_notes_v3.pdf)\n * (pdf), by Brent Burley.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshStandardMaterial\n */\nclass MeshStandardMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh standard material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshStandardMaterial = true;\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * How rough the material appears. `0.0` means a smooth mirror reflection, `1.0`\n\t\t * means fully diffuse. If `roughnessMap` is also provided,\n\t\t * both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.roughness = 1.0;\n\n\t\t/**\n\t\t * How much the material is like a metal. Non-metallic materials such as wood\n\t\t * or stone use `0.0`, metallic use `1.0`, with nothing (usually) in between.\n\t\t * A value between `0.0` and `1.0` could be used for a rusty metal look.\n\t\t * If `metalnessMap` is also provided, both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.metalness = 0.0;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The green channel of this texture is used to alter the roughness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.roughnessMap = null;\n\n\t\t/**\n\t\t * The blue channel of this texture is used to alter the metalness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.metalnessMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map. To ensure a physically correct rendering, environment maps\n\t\t * are internally pre-processed with {@link PMREMGenerator}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * Scales the effect of the environment map by multiplying its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An extension of the {@link MeshStandardMaterial}, providing more advanced\n * physically-based rendering properties:\n *\n * - Anisotropy: Ability to represent the anisotropic property of materials\n * as observable with brushed metals.\n * - Clearcoat: Some materials — like car paints, carbon fiber, and wet surfaces — require\n * a clear, reflective layer on top of another layer that may be irregular or rough.\n * Clearcoat approximates this effect, without the need for a separate transparent surface.\n * - Iridescence: Allows to render the effect where hue varies depending on the viewing\n * angle and illumination angle. This can be seen on soap bubbles, oil films, or on the\n * wings of many insects.\n * - Physically-based transparency: One limitation of {@link Material#opacity} is that highly\n * transparent materials are less reflective. Physically-based transmission provides a more\n * realistic option for thin, transparent surfaces like glass.\n * - Advanced reflectivity: More flexible reflectivity for non-metallic materials.\n * - Sheen: Can be used for representing cloth and fabric materials.\n *\n * As a result of these complex shading features, `MeshPhysicalMaterial` has a\n * higher performance cost, per pixel, than other three.js materials. Most\n * effects are disabled by default, and add cost as they are enabled. For\n * best results, always specify an environment map when using this material.\n *\n * @augments MeshStandardMaterial\n * @demo scenes/material-browser.html#MeshPhysicalMaterial\n */\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\t/**\n\t * Constructs a new mesh physical material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\t/**\n\t\t * The rotation of the anisotropy in tangent, bitangent space, measured in radians\n\t\t * counter-clockwise from the tangent. When `anisotropyMap` is present, this\n\t\t * property provides additional rotation to the vectors in the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.anisotropyRotation = 0;\n\n\t\t/**\n\t\t * Red and green channels represent the anisotropy direction in `[-1, 1]` tangent,\n\t\t * bitangent space, to be rotated by `anisotropyRotation`. The blue channel\n\t\t * contains strength as `[0, 1]` to be multiplied by `anisotropy`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.anisotropyMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `clearcoat`,\n\t\t * for per-pixel control over a coating's intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatMap = null;\n\n\t\t/**\n\t\t * Roughness of the clear coat layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.clearcoatRoughness = 0.0;\n\n\t\t/**\n\t\t * The green channel of this texture is multiplied against\n\t\t * `clearcoatRoughness`, for per-pixel control over a coating's roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatRoughnessMap = null;\n\n\t\t/**\n\t\t * How much `clearcoatNormalMap` affects the clear coat layer, from\n\t\t * `(0,0)` to `(1,1)`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * Can be used to enable independent normals for the clear coat layer.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatNormalMap = null;\n\n\t\t/**\n\t\t * Index-of-refraction for non-metallic materials, from `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.5\n\t\t */\n\t\tthis.ior = 1.5;\n\n\t\t/**\n\t\t * Degree of reflectivity, from `0.0` to `1.0`. Default is `0.5`, which\n\t\t * corresponds to an index-of-refraction of `1.5`.\n\t\t *\n\t\t * This models the reflectivity of non-metallic materials. It has no effect\n\t\t * when `metalness` is `1.0`\n\t\t *\n\t\t * @name MeshPhysicalMaterial#reflectivity\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `iridescence`, for per-pixel\n\t\t * control over iridescence.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceMap = null;\n\n\t\t/**\n\t\t * Strength of the iridescence RGB color shift effect, represented by an index-of-refraction.\n\t\t * Between `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.3\n\t\t */\n\t\tthis.iridescenceIOR = 1.3;\n\n\t\t/**\n\t\t *Array of exactly 2 elements, specifying minimum and maximum thickness of the iridescence layer.\n\t\t Thickness of iridescence layer has an equivalent effect of the one `thickness` has on `ior`.\n\t\t *\n\t\t * @type {Array}\n\t\t * @default [100,400]\n\t\t */\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t/**\n\t\t * A texture that defines the thickness of the iridescence layer, stored in the green channel.\n\t\t * Minimum and maximum values of thickness are defined by `iridescenceThicknessRange` array:\n\t\t * - `0.0` in the green channel will result in thickness equal to first element of the array.\n\t\t * - `1.0` in the green channel will result in thickness equal to second element of the array.\n\t\t * - Values in-between will linearly interpolate between the elements of the array.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\t/**\n\t\t * The sheen tint.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.sheenColor = new Color( 0x000000 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against `sheenColor`, for per-pixel control\n\t\t * over sheen tint.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenColorMap = null;\n\n\t\t/**\n\t\t * Roughness of the sheen layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.sheenRoughness = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `sheenRoughness`, for per-pixel control\n\t\t * over sheen roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenRoughnessMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `transmission`, for per-pixel control over\n\t\t * optical transparency.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.transmissionMap = null;\n\n\t\t/**\n\t\t * The thickness of the volume beneath the surface. The value is given in the\n\t\t * coordinate space of the mesh. If the value is `0` the material is\n\t\t * thin-walled. Otherwise the material is a volume boundary.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.thickness = 0;\n\n\t\t/**\n\t\t * A texture that defines the thickness, stored in the green channel. This will\n\t\t * be multiplied by `thickness`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.thicknessMap = null;\n\n\t\t/**\n\t\t * Density of the medium given as the average distance that light travels in\n\t\t * the medium before interacting with a particle. The value is given in world\n\t\t * space units, and must be greater than zero.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.attenuationDistance = Infinity;\n\n\t\t/**\n\t\t * The color that white light turns into due to absorption when reaching the\n\t\t * attenuation distance.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * A float that scales the amount of specular reflection for non-metals only.\n\t\t * When set to zero, the model is effectively Lambertian. From `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.specularIntensity = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `specularIntensity`,\n\t\t * for per-pixel control over specular intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularIntensityMap = null;\n\n\t\t/**\n\t\t * Tints the specular reflection at normal incidence for non-metals only.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against `specularColor`,\n\t\t * for per-pixel control over specular color.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularColorMap = null;\n\n\t\tthis._anisotropy = 0;\n\t\tthis._clearcoat = 0;\n\t\tthis._dispersion = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._sheen = 0.0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * The anisotropy strength, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget anisotropy() {\n\n\t\treturn this._anisotropy;\n\n\t}\n\n\tset anisotropy( value ) {\n\n\t\tif ( this._anisotropy > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._anisotropy = value;\n\n\t}\n\n\t/**\n\t * Represents the intensity of the clear coat layer, from `0.0` to `1.0`. Use\n\t * clear coat related properties to enable multilayer materials that have a\n\t * thin translucent layer over the base layer.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\t/**\n\t * The intensity of the iridescence layer, simulating RGB color shift based on the angle between\n\t * the surface and the viewer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\t/**\n\t * Defines the strength of the angular separation of colors (chromatic aberration) transmitting\n\t * through a relatively clear volume. Any value zero or larger is valid, the typical range of\n\t * realistic values is `[0, 1]`. This property can be only be used with transmissive objects.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget dispersion() {\n\n\t\treturn this._dispersion;\n\n\t}\n\n\tset dispersion( value ) {\n\n\t\tif ( this._dispersion > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._dispersion = value;\n\n\t}\n\n\t/**\n\t * The intensity of the sheen layer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\t/**\n\t * Degree of transmission (or optical transparency), from `0.0` to `1.0`.\n\t *\n\t * Thin, transparent or semitransparent, plastic or glass materials remain\n\t * largely reflective even if they are fully transmissive. The transmission\n\t * property can be used to model these materials.\n\t *\n\t * When transmission is non-zero, `opacity` should be set to `1`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.anisotropyRotation = source.anisotropyRotation;\n\t\tthis.anisotropyMap = source.anisotropyMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.dispersion = source.dispersion;\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for shiny surfaces with specular highlights.\n *\n * The material uses a non-physically based [Blinn-Phong](https://en.wikipedia.org/wiki/Blinn-Phong_shading_model)\n * model for calculating reflectance. Unlike the Lambertian model used in the\n * {@link MeshLambertMaterial} this can simulate shiny surfaces with specular\n * highlights (such as varnished wood). `MeshPhongMaterial` uses per-fragment shading.\n *\n * Performance will generally be greater when using this material over the\n * {@link MeshStandardMaterial} or {@link MeshPhysicalMaterial}, at the cost of\n * some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshPhongMaterial\n */\nclass MeshPhongMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh phong material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhongMaterial = true;\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * Specular color of the material. The default color is set to `0x111111` (very dark grey)\n\t\t *\n\t\t * This defines how shiny the material is and the color of its shine.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.specular = new Color( 0x111111 );\n\n\t\t/**\n\t\t * How shiny the specular highlight is; a higher value gives a sharper highlight.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 30\n\t\t */\n\t\tthis.shininess = 30;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The specular map value affects both how much the specular surface\n\t\t * highlight contributes and how much of the environment map affects the\n\t\t * surface.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material implementing toon shading.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshToonMaterial\n */\nclass MeshToonMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh toon material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Gradient map for toon shading. It's required to set\n\t\t * {@link Texture#minFilter} and {@link Texture#magFilter} to {@linkNearestFilter}\n\t\t * when using this type of texture.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.gradientMap = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material that maps the normal vectors to RGB colors.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshNormalMaterial\n */\nclass MeshNormalMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh normal material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for non-shiny surfaces, without specular highlights.\n *\n * The material uses a non-physically based [Lambertian](https://en.wikipedia.org/wiki/Lambertian_reflectance)\n * model for calculating reflectance. This can simulate some surfaces (such\n * as untreated wood or stone) well, but cannot simulate shiny surfaces with\n * specular highlights (such as varnished wood). `MeshLambertMaterial` uses per-fragment\n * shading.\n *\n * Due to the simplicity of the reflectance and illumination models,\n * performance will be greater when using this material over the\n * {@link MeshPhongMaterial}, {@link MeshStandardMaterial} or\n * {@link MeshPhysicalMaterial}, at the cost of some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshLambertMaterial\n */\nclass MeshLambertMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh lambert material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshLambertMaterial = true;\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometry by depth. Depth is based off of the camera\n * near and far plane. White is nearest, black is farthest.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshDepthMaterial\n */\nclass MeshDepthMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh depth material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\t/**\n\t\t * Type for depth packing.\n\t\t *\n\t\t * @type {(BasicDepthPacking|RGBADepthPacking|RGBDepthPacking|RGDepthPacking)}\n\t\t * @default BasicDepthPacking\n\t\t */\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material used internally for implementing shadow mapping with\n * point lights.\n *\n * Can also be used to customize the shadow casting of an object by assigning\n * an instance of `MeshDistanceMaterial` to {@link Object3D#customDistanceMaterial}.\n * The following examples demonstrates this approach in order to ensure\n * transparent parts of objects do not cast shadows.\n *\n * @augments Material\n */\nclass MeshDistanceMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh distance material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This material is defined by a MatCap (or Lit Sphere) texture, which encodes the\n * material color and shading.\n *\n * `MeshMatcapMaterial` does not respond to lights since the matcap image file encodes\n * baked lighting. It will cast a shadow onto an object that receives shadows\n * (and shadow clipping works), but it will not self-shadow or receive\n * shadows.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshMatcapMaterial\n */\nclass MeshMatcapMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh matcap material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The matcap map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.matcap = null;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineDashedMaterial( {\n * \tcolor: 0xffffff,\n * \tscale: 1,\n * \tdashSize: 3,\n * \tgapSize: 1,\n * } );\n * ```\n *\n * @augments LineBasicMaterial\n */\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\t/**\n\t * Constructs a new line dashed material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineDashedMaterial = true;\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\t/**\n\t\t * The scale of the dashed part of a line.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.scale = 1;\n\n\t\t/**\n\t\t * The size of the dash. This is both the gap with the stroke.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 3\n\t\t */\n\t\tthis.dashSize = 3;\n\n\t\t/**\n\t\t * The size of the gap.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Converts an array to a specific type.\n *\n * @param {TypedArray|Array} array - The array to convert.\n * @param {TypedArray.constructor} type - The constructor of a typed array that defines the new type.\n * @return {TypedArray} The converted array.\n */\nfunction convertArray( array, type ) {\n\n\tif ( ! array || array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\n/**\n * Returns `true` if the given object is a typed array.\n *\n * @param {any} object - The object to check.\n * @return {boolean} Whether the given object is a typed array.\n */\nfunction isTypedArray( object ) {\n\n\treturn ArrayBuffer.isView( object ) && ! ( object instanceof DataView );\n\n}\n\n/**\n * Returns an array by which times and values can be sorted.\n *\n * @param {Array} times - The keyframe time values.\n * @return {Array} The array.\n */\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n/**\n * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n *\n * @param {Array} values - The values to sort.\n * @param {number} stride - The stride.\n * @param {Array} order - The sort order.\n * @return {Array} The sorted values.\n */\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * Used for parsing AOS keyframe formats.\n *\n * @param {Array} jsonKeys - A list of JSON keyframes.\n * @param {Array} times - This array will be filled with keyframe times by this function.\n * @param {Array} values - This array will be filled with keyframe values by this function.\n * @param {string} valuePropertyName - The name of the property to use.\n */\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( ...value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\n/**\n * Creates a new clip, containing only the segment of the original clip between the given frames.\n *\n * @param {AnimationClip} sourceClip - The values to sort.\n * @param {string} name - The name of the clip.\n * @param {number} startFrame - The start frame.\n * @param {number} endFrame - The end frame.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The new sub clip.\n */\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( -1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\n/**\n * Converts the keyframes of the given animation clip to an additive format.\n *\n * @param {AnimationClip} targetClip - The clip to make additive.\n * @param {number} [referenceFrame=0] - The reference frame.\n * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The updated clip which is now additive.\n */\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = interpolant.resultBuffer.slice( startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\n/**\n * A class with various methods to assist with animations.\n *\n * @hideconstructor\n */\nclass AnimationUtils {\n\n\t/**\n\t * Converts an array to a specific type\n\t *\n\t * @static\n\t * @param {TypedArray|Array} array - The array to convert.\n\t * @param {TypedArray.constructor} type - The constructor of a type array.\n\t * @return {TypedArray} The converted array\n\t */\n\tstatic convertArray( array, type ) {\n\n\t\treturn convertArray( array, type );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given object is a typed array.\n\t *\n\t * @static\n\t * @param {any} object - The object to check.\n\t * @return {boolean} Whether the given object is a typed array.\n\t */\n\tstatic isTypedArray( object ) {\n\n\t\treturn isTypedArray( object );\n\n\t}\n\n\t/**\n\t * Returns an array by which times and values can be sorted.\n\t *\n\t * @static\n\t * @param {Array} times - The keyframe time values.\n\t * @return {Array} The array.\n\t */\n\tstatic getKeyframeOrder( times ) {\n\n\t\treturn getKeyframeOrder( times );\n\n\t}\n\n\t/**\n\t * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n\t *\n\t * @static\n\t * @param {Array} values - The values to sort.\n\t * @param {number} stride - The stride.\n\t * @param {Array} order - The sort order.\n\t * @return {Array} The sorted values.\n\t */\n\tstatic sortedArray( values, stride, order ) {\n\n\t\treturn sortedArray( values, stride, order );\n\n\t}\n\n\t/**\n\t * Used for parsing AOS keyframe formats.\n\t *\n\t * @static\n\t * @param {Array} jsonKeys - A list of JSON keyframes.\n\t * @param {Array} times - This array will be filled with keyframe times by this method.\n\t * @param {Array} values - This array will be filled with keyframe values by this method.\n\t * @param {string} valuePropertyName - The name of the property to use.\n\t */\n\tstatic flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tflattenJSON( jsonKeys, times, values, valuePropertyName );\n\n\t}\n\n\t/**\n\t * Creates a new clip, containing only the segment of the original clip between the given frames.\n\t *\n\t * @static\n\t * @param {AnimationClip} sourceClip - The values to sort.\n\t * @param {string} name - The name of the clip.\n\t * @param {number} startFrame - The start frame.\n\t * @param {number} endFrame - The end frame.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The new sub clip.\n\t */\n\tstatic subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\t\treturn subclip( sourceClip, name, startFrame, endFrame, fps );\n\n\t}\n\n\t/**\n\t * Converts the keyframes of the given animation clip to an additive format.\n\t *\n\t * @static\n\t * @param {AnimationClip} targetClip - The clip to make additive.\n\t * @param {number} [referenceFrame=0] - The reference frame.\n\t * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The updated clip which is now additive.\n\t */\n\tstatic makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\t\treturn makeClipAdditive( targetClip, referenceFrame, referenceClip, fps );\n\n\t}\n\n}\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References: {@link http://www.oodesign.com/template-method-pattern.html}\n *\n * @abstract\n */\nclass Interpolant {\n\n\t/**\n\t * Constructs a new interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\t/**\n\t\t * The parameter positions.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.parameterPositions = parameterPositions;\n\n\t\t/**\n\t\t * A cache index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._cachedIndex = 0;\n\n\t\t/**\n\t\t * The result buffer.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.resultBuffer = resultBuffer !== undefined ? resultBuffer : new sampleValues.constructor( sampleSize );\n\n\t\t/**\n\t\t * The sample values.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.sampleValues = sampleValues;\n\n\t\t/**\n\t\t * The value size.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.valueSize = sampleSize;\n\n\t\t/**\n\t\t * The interpolation settings.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.settings = null;\n\n\t\t/**\n\t\t * The default settings object.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\t/**\n\t * Evaluate the interpolant at position `t`.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\t/**\n\t * Returns the interpolation settings.\n\t *\n\t * @return {Object} The interpolation settings.\n\t */\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @param {number} index - An index into the sample value buffer.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @abstract\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t * @param {number} t1 - The next interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\t/**\n\t * Optional method that is executed when the interval has changed.\n\t *\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t */\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n *\n * @augments Interpolant\n */\nclass CubicInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new cubic interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( -1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\tconst s1 = ( -1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A basic linear interpolant.\n *\n * @augments Interpolant\n */\nclass LinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new linear interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n *\n * @augments Interpolant\n */\nclass DiscreteInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new discrete interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\n/**\n * Represents s a timed sequence of keyframes, which are composed of lists of\n * times and related values, and which are used to animate a specific property\n * of an object.\n */\nclass KeyframeTrack {\n\n\t/**\n\t * Constructs a new keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\t/**\n\t\t * The track's name can refer to morph targets or bones or\n\t\t * possibly other values within an animated object. See {@link PropertyBinding#parseTrackName}\n\t\t * for the forms of strings that can be parsed for property binding.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The keyframe times.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\n\t\t/**\n\t\t * The keyframe values.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t/**\n\t * Converts the keyframe track to JSON.\n\t *\n\t * @static\n\t * @param {KeyframeTrack} track - The keyframe track to serialize.\n\t * @return {Object} The serialized keyframe track as JSON.\n\t */\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Factory method for creating a new discrete interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {DiscreteInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new linear interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {LinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new smooth interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {CubicInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Defines the interpolation factor method for this keyframe track.\n\t *\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} interpolation - The interpolation type.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\twarn( 'KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current interpolation type.\n\t *\n\t * @return {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} The interpolation type.\n\t */\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the value size.\n\t *\n\t * @return {number} The value size.\n\t */\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t/**\n\t * Moves all keyframes either forward or backward in time.\n\t *\n\t * @param {number} timeOffset - The offset to move the time values.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scale all keyframe times by a factor (useful for frame - seconds conversions).\n\t *\n\t * @param {number} timeScale - The time scale.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes keyframes before and after animation without changing any values within the defined time range.\n\t *\n\t * Note: The method does not shift around keys to the start of the track time, because for interpolated\n\t * keys this will change their values\n\t *\n\t * @param {number} startTime - The start time.\n\t * @param {number} endTime - The end time.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== -1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = times.slice( from, to );\n\t\t\tthis.values = this.values.slice( from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on the keyframe track. Returns `true` if the values\n\t * are valid.\n\t *\n\t * @return {boolean} Whether the keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\terror( 'KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\terror( 'KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\terror( 'KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes this keyframe track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = this.times.slice(),\n\t\t\tvalues = this.values.slice(),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = times.slice( 0, writeIndex );\n\t\t\tthis.values = values.slice( 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new keyframe track with copied values from this instance.\n\t *\n\t * @return {KeyframeTrack} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst times = this.times.slice();\n\t\tconst values = this.values.slice();\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default ''\n */\nKeyframeTrack.prototype.ValueTypeName = '';\n\n/**\n * The time buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateLinear\n */\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A track for boolean keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new boolean keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'bool'\n */\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for color keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass ColorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new color keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'color'\n */\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A track for numeric keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass NumberKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new number keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'number'\n */\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n *\n * @augments Interpolant\n */\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new SLERP interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A track for Quaternion keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new Quaternion keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n\t/**\n\t * Overwritten so the method returns Quaternion based interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {QuaternionLinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'quaternion'\n */\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\n// DefaultInterpolation is inherited;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for string keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass StringKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new string keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'string'\n */\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nStringKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for vector keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass VectorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new vector keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'vector'\n */\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\n/**\n * A reusable set of keyframe tracks which represent an animation.\n */\nclass AnimationClip {\n\n\t/**\n\t * Constructs a new animation clip.\n\t *\n\t * Note: Instead of instantiating an AnimationClip directly with the constructor, you can\n\t * use the static interface of this class for creating clips. In most cases though, animation clips\n\t * will automatically be created by loaders when importing animated 3D assets.\n\t *\n\t * @param {string} [name=''] - The clip's name.\n\t * @param {number} [duration=-1] - The clip's duration in seconds. If a negative value is passed,\n\t * the duration will be calculated from the passed keyframes.\n\t * @param {Array} tracks - An array of keyframe tracks.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode=NormalAnimationBlendMode] - Defines how the animation\n\t * is blended/combined when two or more animations are simultaneously played.\n\t */\n\tconstructor( name = '', duration = -1, tracks = [], blendMode = NormalAnimationBlendMode ) {\n\n\t\t/**\n\t\t * The clip's name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * An array of keyframe tracks.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.tracks = tracks;\n\n\t\t/**\n\t\t * The clip's duration in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.duration = duration;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\t/**\n\t\t * The UUID of the animation clip.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the animation clip.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Factory method for creating an animation clip from the given JSON.\n\t *\n\t * @static\n\t * @param {Object} json - The serialized animation clip.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\tclip.userData = JSON.parse( json.userData || '{}' );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes the given animation clip into JSON.\n\t *\n\t * @static\n\t * @param {AnimationClip} clip - The animation clip to serialize.\n\t * @return {Object} The JSON object.\n\t */\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode,\n\t\t\t'userData': JSON.stringify( clip.userData ),\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip from the passed morph targets array of a\n\t * geometry, taking a name and the number of frames per second.\n\t *\n\t * Note: The fps parameter is required, but the animation speed can be\n\t * overridden via {@link AnimationAction#setDuration}.\n\t *\n\t * @static\n\t * @param {string} name - The name of the animation clip.\n\t * @param {Array} morphTargetSequence - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, -1, tracks );\n\n\t}\n\n\t/**\n\t * Searches for an animation clip by name, taking as its first parameter\n\t * either an array of clips, or a mesh or geometry that contains an\n\t * array named \"animations\" property.\n\t *\n\t * @static\n\t * @param {(Array|Object3D)} objectOrClipArray - The array or object to search through.\n\t * @param {string} name - The name to search for.\n\t * @return {?AnimationClip} The found animation clip. Returns `null` if no clip has been found.\n\t */\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Returns an array of new AnimationClips created from the morph target\n\t * sequences of a geometry, trying to sort morph target names into\n\t * animation-group-based patterns like \"Walk_001, Walk_002, Run_001, Run_002...\".\n\t *\n\t * See {@link MD2Loader#parse} as an example for how the method should be used.\n\t *\n\t * @static\n\t * @param {Array} morphTargets - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {Array} An array of new animation clips.\n\t */\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t/**\n\t * Parses the `animation.hierarchy` format and returns a new animation clip.\n\t *\n\t * @static\n\t * @deprecated since r175.\n\t * @param {Object} animation - A serialized animation clip as JSON.\n\t * @param {Array} bones - An array of bones.\n\t * @return {?AnimationClip} The new animation clip.\n\t */\n\tstatic parseAnimation( animation, bones ) {\n\n\t\twarn( 'AnimationClip: parseAnimation() is deprecated and will be removed with r185' );\n\n\t\tif ( ! animation ) {\n\n\t\t\terror( 'AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || -1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = -1;\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\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Sets the duration of this clip to the duration of its longest keyframe track.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Trims all tracks to the clip's duration.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on each track in the clip. Returns `true` if all\n\t * tracks are valid.\n\t *\n\t * @return {boolean} Whether the clip's keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes each track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip with copied values from this instance.\n\t *\n\t * @return {AnimationClip} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\tconst clip = new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t\tclip.userData = JSON.parse( JSON.stringify( this.userData ) );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes this animation clip into JSON.\n\t *\n\t * @return {Object} The JSON object.\n\t */\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A simple caching system, used internally by {@link FileLoader}.\n * To enable caching across all loaders that use {@link FileLoader}, add `THREE.Cache.enabled = true.` once in your app.\n * @hideconstructor\n */\nconst Cache = {\n\n\t/**\n\t * Whether caching is enabled or not.\n\t *\n\t * @static\n\t * @type {boolean}\n\t * @default false\n\t */\n\tenabled: false,\n\n\t/**\n\t * A dictionary that holds cached files.\n\t *\n\t * @static\n\t * @type {Object}\n\t */\n\tfiles: {},\n\n\t/**\n\t * Adds a cache entry with a key to reference the file. If this key already\n\t * holds a file, it is overwritten.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @param {Object} file - The file to be cached.\n\t */\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\t/**\n\t * Gets the cached value for the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @return {Object|undefined} The cached file. If the key does not exist `undefined` is returned.\n\t */\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\t/**\n\t * Removes the cached file associated with the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t */\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\t/**\n\t * Remove all values from the cache.\n\t *\n\t * @static\n\t */\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\n/**\n * Handles and keeps track of loaded and pending data. A default global\n * instance of this class is created and used by loaders if not supplied\n * manually.\n *\n * In general that should be sufficient, however there are times when it can\n * be useful to have separate loaders - for example if you want to show\n * separate loading bars for objects and textures.\n *\n * ```js\n * const manager = new THREE.LoadingManager();\n * manager.onLoad = () => console.log( 'Loading complete!' );\n *\n * const loader1 = new OBJLoader( manager );\n * const loader2 = new ColladaLoader( manager );\n * ```\n */\nclass LoadingManager {\n\n\t/**\n\t * Constructs a new loading manager.\n\t *\n\t * @param {Function} [onLoad] - Executes when all items have been loaded.\n\t * @param {Function} [onProgress] - Executes when single items have been loaded.\n\t * @param {Function} [onError] - Executes when an error occurs.\n\t */\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\t/**\n\t\t * Executes when an item starts loading.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onStart = undefined;\n\n\t\t/**\n\t\t * Executes when all items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onLoad = onLoad;\n\n\t\t/**\n\t\t * Executes when single items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onProgress = onProgress;\n\n\t\t/**\n\t\t * Executes when an error occurs.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onError = onError;\n\n\t\t/**\n\t\t * Used for aborting ongoing requests in loaders using this manager.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController | null}\n\t\t */\n\t\tthis._abortController = null;\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * starts loading an item.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t */\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * ended loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the loaded item.\n\t\t */\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * encounters an error when loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the item that produces an error.\n\t\t */\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Given a URL, uses the URL modifier callback (if any) and returns a\n\t\t * resolved URL. If no URL modifier is set, returns the original URL.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t * @return {string} The resolved URL.\n\t\t */\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\t/**\n\t\t * If provided, the callback will be passed each resource URL before a\n\t\t * request is sent. The callback may return the original URL, or a new URL to\n\t\t * override loading behavior. This behavior can be used to load assets from\n\t\t * .ZIP files, drag-and-drop APIs, and Data URIs.\n\t\t *\n\t\t * ```js\n\t\t * const blobs = {'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3};\n\t\t *\n\t\t * const manager = new THREE.LoadingManager();\n\t\t *\n\t\t * // Initialize loading manager with URL callback.\n\t\t * const objectURLs = [];\n\t\t * manager.setURLModifier( ( url ) => {\n\t\t *\n\t\t * \turl = URL.createObjectURL( blobs[ url ] );\n\t\t * \tobjectURLs.push( url );\n\t\t * \treturn url;\n\t\t *\n\t\t * } );\n\t\t *\n\t\t * // Load as usual, then revoke the blob URLs.\n\t\t * const loader = new GLTFLoader( manager );\n\t\t * loader.load( 'fish.gltf', (gltf) => {\n\t\t *\n\t\t * \tscene.add( gltf.scene );\n\t\t * \tobjectURLs.forEach( ( url ) => URL.revokeObjectURL( url ) );\n\t\t *\n\t\t * } );\n\t\t * ```\n\t\t *\n\t\t * @param {function(string):string} transform - URL modifier callback. Called with an URL and must return a resolved URL.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Registers a loader with the given regular expression. Can be used to\n\t\t * define what loader should be used in order to load specific files. A\n\t\t * typical use case is to overwrite the default loader for textures.\n\t\t *\n\t\t * ```js\n\t\t * // add handler for TGA textures\n\t\t * manager.addHandler( /\\.tga$/i, new TGALoader() );\n\t\t * ```\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @param {Loader} loader - A loader that should handle matched cases.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Removes the loader for the given regular expression.\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to retrieve the registered loader for the given file path.\n\t\t *\n\t\t * @param {string} file - The file path.\n\t\t * @return {?Loader} The registered loader. Returns `null` if no loader was found.\n\t\t */\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to abort ongoing loading requests in loaders using this manager.\n\t\t * The abort only works if the loaders implement {@link Loader#abort} and `AbortSignal.any()`\n\t\t * is supported in the browser.\n\t\t *\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.abort = function () {\n\n\n\t\t\tthis.abortController.abort();\n\t\t\tthis._abortController = null;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}\n\n\t// TODO: Revert this back to a single member variable once this issue has been fixed\n\t// https://github.com/cloudflare/workerd/issues/3657\n\n\t/**\n\t * Used for aborting ongoing requests in loaders using this manager.\n\t *\n\t * @type {AbortController}\n\t */\n\tget abortController() {\n\n\t\tif ( ! this._abortController ) {\n\n\t\t\tthis._abortController = new AbortController();\n\n\t\t}\n\n\t\treturn this._abortController;\n\n\t}\n\n}\n\n/**\n * The global default loading manager.\n *\n * @constant\n * @type {LoadingManager}\n */\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\n/**\n * Abstract base class for loaders.\n *\n * @abstract\n */\nclass Loader {\n\n\t/**\n\t * Constructs a new loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\t/**\n\t\t * The loading manager.\n\t\t *\n\t\t * @type {LoadingManager}\n\t\t * @default DefaultLoadingManager\n\t\t */\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t/**\n\t\t * The crossOrigin string to implement CORS for loading the url from a\n\t\t * different domain that allows CORS.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'anonymous'\n\t\t */\n\t\tthis.crossOrigin = 'anonymous';\n\n\t\t/**\n\t\t * Whether the XMLHttpRequest uses credentials.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.withCredentials = false;\n\n\t\t/**\n\t\t * The base path from which the asset will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = '';\n\n\t\t/**\n\t\t * The base path from which additional resources like textures will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.resourcePath = '';\n\n\t\t/**\n\t\t * The [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t\t * used in HTTP request.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.requestHeader = {};\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for loading assets from the backend.\n\t *\n\t * @abstract\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t */\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\t/**\n\t * A async version of {@link Loader#load}.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves when the asset has been loaded.\n\t */\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for parsing the asset into three.js entities.\n\t *\n\t * @abstract\n\t * @param {any} data - The data to parse.\n\t */\n\tparse( /* data */ ) {}\n\n\t/**\n\t * Sets the `crossOrigin` String to implement CORS for loading the URL\n\t * from a different domain that allows CORS.\n\t *\n\t * @param {string} crossOrigin - The `crossOrigin` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Whether the XMLHttpRequest uses credentials such as cookies, authorization\n\t * headers or TLS client certificates, see [XMLHttpRequest.withCredentials](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials).\n\t *\n\t * Note: This setting has no effect if you are loading files locally or from the same domain.\n\t *\n\t * @param {boolean} value - The `withCredentials` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for the asset.\n\t *\n\t * @param {string} path - The base path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for dependent resources like textures.\n\t *\n\t * @param {string} resourcePath - The resource path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given request header.\n\t *\n\t * @param {Object} requestHeader - A [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t * for configuring the HTTP request.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method can be implemented in loaders for aborting ongoing requests.\n\t *\n\t * @abstract\n\t * @return {Loader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Callback for onProgress in loaders.\n *\n * @callback onProgressCallback\n * @param {ProgressEvent} event - An instance of `ProgressEvent` that represents the current loading status.\n */\n\n/**\n * Callback for onError in loaders.\n *\n * @callback onErrorCallback\n * @param {Error} error - The error which occurred during the loading process.\n */\n\n/**\n * The default material name that is used by loaders\n * when creating materials for loaded 3D objects.\n *\n * Note: Not all loaders might honor this setting.\n *\n * @static\n * @type {string}\n * @default '__DEFAULT'\n */\nLoader.DEFAULT_MATERIAL_NAME = '__DEFAULT';\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\n/**\n * A low level class for loading resources with the Fetch API, used internally by\n * most loaders. It can also be used directly to load any file type that does\n * not have a loader.\n *\n * This loader supports caching. If you want to use it, add `THREE.Cache.enabled = true;`\n * once to your application.\n *\n * ```js\n * const loader = new THREE.FileLoader();\n * const data = await loader.loadAsync( 'example.txt' );\n * ```\n *\n * @augments Loader\n */\nclass FileLoader extends Loader {\n\n\t/**\n\t * Constructs a new file loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The expected mime type. Valid values can be found\n\t\t * [here](hhttps://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#mimetype)\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.mimeType = '';\n\n\t\t/**\n\t\t * The expected response type.\n\t\t *\n\t\t * @type {('arraybuffer'|'blob'|'document'|'json'|'')}\n\t\t * @default ''\n\t\t */\n\t\tthis.responseType = '';\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(any)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t * @return {any|undefined} The cached resource if available.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( `file:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\tsignal: ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\twarn( 'FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get( 'X-File-Size' ) || response.headers.get( 'Content-Length' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}, ( e ) => {\n\n\t\t\t\t\t\t\t\t\tcontroller.error( e );\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === '' ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( `file:${url}`, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Sets the expected response type.\n\t *\n\t * @param {('arraybuffer'|'blob'|'document'|'json'|'')} value - The response type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the expected mime type of the loaded file.\n\t *\n\t * @param {string} value - The mime type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {FileLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Class for loading animation clips in the JSON format. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.AnimationLoader();\n * const animations = await loader.loadAsync( 'animations/animation.js' );\n * ```\n *\n * @augments Loader\n */\nclass AnimationLoader extends Loader {\n\n\t/**\n\t * Constructs a new animation loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded animations as an array\n\t * holding instances of {@link AnimationClip} to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Array)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns an array of animation clips.\n\t *\n\t * @param {Object} json - The serialized animation clips.\n\t * @return {Array} The parsed animation clips.\n\t */\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading compressed texture formats S3TC, ASTC or ETC.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass CompressedTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new compressed texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded compressed texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(CompressedTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CompressedTexture} The compressed texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nconst _loading = new WeakMap();\n\n/**\n * A loader for loading images. The class loads images with the HTML `Image` API.\n *\n * ```js\n * const loader = new THREE.ImageLoader();\n * const image = await loader.loadAsync( 'image.png' );\n * ```\n * Please note that `ImageLoader` has dropped support for progress\n * events in `r84`. For an `ImageLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-275785639).\n *\n * @augments Loader\n */\nclass ImageLoader extends Loader {\n\n\t/**\n\t * Constructs a new image loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded image\n\t * to the `onLoad()` callback. The method also returns a new `Image` object which can\n\t * directly be used for texture creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Image)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Image} The image.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tif ( cached.complete === true ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tlet arr = _loading.get( cached );\n\n\t\t\t\tif ( arr === undefined ) {\n\n\t\t\t\t\tarr = [];\n\t\t\t\t\t_loading.set( cached, arr );\n\n\t\t\t\t}\n\n\t\t\t\tarr.push( { onLoad, onError } );\n\n\t\t\t}\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onLoad ) callback.onLoad( this );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tCache.remove( `image:${url}` );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tCache.add( `image:${url}`, image );\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\n/**\n * Class for loading cube textures. Images are internally loaded via {@link ImageLoader}.\n *\n * The loader returns an instance of {@link CubeTexture} and expects the cube map to\n * be defined as six separate images representing the sides of a cube. Other cube map definitions\n * like vertical and horizontal cross, column and row layouts are not supported.\n *\n * Note that, by convention, cube maps are specified in a coordinate system\n * in which positive-x is to the right when looking up the positive-z axis --\n * in other words, using a left-handed coordinate system. Since three.js uses\n * a right-handed coordinate system, environment maps used in three.js will\n * have pos-x and neg-x swapped.\n *\n * The loaded cube texture is in sRGB color space. Meaning {@link Texture#colorSpace}\n * is set to `SRGBColorSpace` by default.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader().setPath( 'textures/cubeMaps/' );\n * const cubeTexture = await loader.loadAsync( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n * scene.background = cubeTexture;\n * ```\n *\n * @augments Loader\n */\nclass CubeTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new cube texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded cube texture\n\t * to the `onLoad()` callback. The method also returns a new cube texture object which can\n\t * directly be used for material creation. If you do it this way, the cube texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {Array} urls - Array of 6 URLs to images, one for each side of the\n\t * cube texture. The urls should be specified in the following order: pos-x,\n\t * neg-x, pos-y, neg-y, pos-z, neg-z. An array of data URIs are allowed as well.\n\t * @param {function(CubeTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CubeTexture} The cube texture.\n\t */\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading binary texture formats RGBE, EXR or TGA.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass DataTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new data texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded data texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(DataTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {DataTexture} The data texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tlet texData;\n\n\t\t\ttry {\n\n\t\t\t\ttexData = scope.parse( buffer );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) {\n\n\t\t\t\t\tonError( error );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = texData.colorSpace;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Class for loading textures. Images are internally\n * loaded via {@link ImageLoader}.\n *\n * ```js\n * const loader = new THREE.TextureLoader();\n * const texture = await loader.loadAsync( 'textures/land_ocean_ice_cloud_2048.jpg' );\n *\n * const material = new THREE.MeshBasicMaterial( { map:texture } );\n * ```\n * Please note that `TextureLoader` has dropped support for progress\n * events in `r84`. For a `TextureLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-293260145).\n *\n * @augments Loader\n */\nclass TextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Texture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Texture} The texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for lights - all other light types inherit the\n * properties and methods described here.\n *\n * @abstract\n * @augments Object3D\n */\nclass Light extends Object3D {\n\n\t/**\n\t * Constructs a new light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\t/**\n\t\t * The light's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The light's intensity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = intensity;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\t\tif ( this.target !== undefined ) data.object.target = this.target.uuid;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * A light source positioned directly above the scene, with color fading from\n * the sky color to the ground color.\n *\n * This light cannot be used to cast shadows.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass HemisphereLight extends Light {\n\n\t/**\n\t * Constructs a new hemisphere light.\n\t *\n\t * @param {(number|Color|string)} [skyColor=0xffffff] - The light's sky color.\n\t * @param {(number|Color|string)} [groundColor=0xffffff] - The light's ground color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The light's ground color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * Abstract base class for light shadow classes. These classes\n * represent the shadow configuration for different light types.\n *\n * @abstract\n */\nclass LightShadow {\n\n\t/**\n\t * Constructs a new light shadow.\n\t *\n\t * @param {Camera} camera - The light's view of the world.\n\t */\n\tconstructor( camera ) {\n\n\t\t/**\n\t\t * The light's view of the world.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The intensity of the shadow. The default is `1`.\n\t\t * Valid values are in the range `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = 1;\n\n\t\t/**\n\t\t * Shadow map bias, how much to add or subtract from the normalized depth\n\t\t * when deciding whether a surface is in shadow.\n\t\t *\n\t\t * The default is `0`. Very tiny adjustments here (in the order of `0.0001`)\n\t\t * may help reduce artifacts in shadows.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bias = 0;\n\n\t\t/**\n\t\t * Defines how much the position used to query the shadow map is offset along\n\t\t * the object normal. The default is `0`. Increasing this value can be used to\n\t\t * reduce shadow acne especially in large scenes where light shines onto\n\t\t * geometry at a shallow angle. The cost is that shadows may appear distorted.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.normalBias = 0;\n\n\t\t/**\n\t\t * Setting this to values greater than 1 will blur the edges of the shadow.\n\t\t * High values will cause unwanted banding effects in the shadows - a greater\n\t\t * map size will allow for a higher value to be used here before these effects\n\t\t * become visible.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `PCFSoftShadowMap` and\n\t\t * and it is recommended to increase softness by decreasing the shadow map size instead.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `BasicShadowMap`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = 1;\n\n\t\t/**\n\t\t * The amount of samples to use when blurring a VSM shadow map.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 8\n\t\t */\n\t\tthis.blurSamples = 8;\n\n\t\t/**\n\t\t * Defines the width and height of the shadow map. Higher values give better quality\n\t\t * shadows at the cost of computation time. Values must be powers of two.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (512,512)\n\t\t */\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\t/**\n\t\t * The type of shadow texture. The default is `UnsignedByteType`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.mapType = UnsignedByteType;\n\n\t\t/**\n\t\t * The depth map generated using the internal camera; a location beyond a\n\t\t * pixel's depth is in shadow. Computed internally during rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The distribution map generated using the internal camera; an occlusion is\n\t\t * calculated based on the distribution of depths. Computed internally during\n\t\t * rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.mapPass = null;\n\n\t\t/**\n\t\t * Model to shadow camera space, to compute location and depth in shadow map.\n\t\t * This is computed internally during rendering.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Enables automatic updates of the light's shadow. If you do not require dynamic\n\t\t * lighting / shadows, you may set this to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t\t/**\n\t\t * When set to `true`, shadow maps will be updated in the next `render` call.\n\t\t * If you have set {@link LightShadow#autoUpdate} to `false`, you will need to\n\t\t * set this property to `true` and then make a render call to update the light's shadow.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\t/**\n\t * Used internally by the renderer to get the number of viewports that need\n\t * to be rendered for this shadow.\n\t *\n\t * @return {number} The viewport count.\n\t */\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\t/**\n\t * Gets the shadow cameras frustum. Used internally by the renderer to cull objects.\n\t *\n\t * @return {Frustum} The shadow camera frustum.\n\t */\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t */\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1, shadowCamera.coordinateSystem, shadowCamera.reversedDepth );\n\n\t\tif ( shadowCamera.reversedDepth ) {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 1.0, 0.0,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t}\n\n\t\tshadowMatrix.multiply( _projScreenMatrix$1 );\n\n\t}\n\n\t/**\n\t * Returns a viewport definition for the given viewport index.\n\t *\n\t * @param {number} viewportIndex - The viewport index.\n\t * @return {Vector4} The viewport.\n\t */\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\t/**\n\t * Returns the frame extends.\n\t *\n\t * @return {Vector2} The frame extends.\n\t */\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Copies the values of the given light shadow instance to this instance.\n\t *\n\t * @param {LightShadow} source - The light shadow to copy.\n\t * @return {LightShadow} A reference to this light shadow instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.intensity = source.intensity;\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.needsUpdate = source.needsUpdate;\n\t\tthis.normalBias = source.normalBias;\n\t\tthis.blurSamples = source.blurSamples;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new light shadow instance with copied values from this instance.\n\t *\n\t * @return {LightShadow} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the light shadow into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized light shadow.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.intensity !== 1 ) object.intensity = this.intensity;\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass SpotLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new spot light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLightShadow = true;\n\n\t\t/**\n\t\t * Used to focus the shadow camera. The camera's field of view is set as a\n\t\t * percentage of the spotlight's field-of-view. Range is `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.focus = 1;\n\n\t\t/**\n\t\t * Texture aspect ratio.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = ( this.mapSize.width / this.mapSize.height ) * this.aspect;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light gets emitted from a single point in one direction, along a cone\n * that increases in size the further from the light it gets.\n *\n * This light can cast shadows - see the {@link SpotLightShadow} for details.\n *\n * ```js\n * // white spotlight shining from the side, modulated by a texture\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 100, 1000, 100 );\n * spotLight.map = new THREE.TextureLoader().load( url );\n *\n * spotLight.castShadow = true;\n * spotLight.shadow.mapSize.width = 1024;\n * spotLight.shadow.mapSize.height = 1024;\n * spotLight.shadow.camera.near = 500;\n * spotLight.shadow.camera.far = 4000;\n * spotLight.shadow.camera.fov = 30;s\n * ```\n *\n * @augments Light\n */\nclass SpotLight extends Light {\n\n\t/**\n\t * Constructs a new spot light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [angle=Math.PI/3] - Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t * @param {number} [penumbra=0] - Percent of the spotlight cone that is attenuated due to penumbra. Value range is `[0,1]`.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLight = true;\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The spot light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * Maximum range of the light. `0` means no limit.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI/3\n\t\t */\n\t\tthis.angle = angle;\n\n\t\t/**\n\t\t * Percent of the spotlight cone that is attenuated due to penumbra.\n\t\t * Value range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.penumbra = penumbra;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * A texture used to modulate the color of the light. The spot light\n\t\t * color is mixed with the RGB value of this texture, with a ratio\n\t\t * corresponding to its alpha value. The cookie-like masking effect is\n\t\t * reproduced using pixel values (0, 0, 0, 1-cookie_value).\n\t\t *\n\t\t * *Warning*: This property is disabled if {@link Object3D#castShadow} is set to `false`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {SpotLightShadow}\n\t\t */\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents the shadow configuration of point lights.\n *\n * @augments LightShadow\n */\nclass PointLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new point light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLightShadow = true;\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t// xzXZ\n\t\t\t// y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( -1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, -1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, -1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, -1 )\n\t\t];\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t * @param {number} [viewportIndex=0] - The viewport index.\n\t */\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );\n\n\t}\n\n}\n\n/**\n * A light that gets emitted from a single point in all directions. A common\n * use case for this is to replicate the light emitted from a bare\n * lightbulb.\n *\n * This light can cast shadows - see the {@link PointLightShadow} for details.\n *\n * ```js\n * const light = new THREE.PointLight( 0xff0000, 1, 100 );\n * light.position.set( 50, 50, 50 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass PointLight extends Light {\n\n\t/**\n\t * Constructs a new point light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\t/**\n\t\t * When distance is zero, light will attenuate according to inverse-square\n\t\t * law to infinite distance. When distance is non-zero, light will attenuate\n\t\t * according to inverse-square law until near the distance cutoff, where it\n\t\t * will then attenuate quickly and smoothly to 0. Inherently, cutoffs are not\n\t\t * physically correct.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {PointLightShadow}\n\t\t */\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Camera that uses [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection).\n *\n * In this projection mode, an object's size in the rendered image stays\n * constant regardless of its distance from the camera. This can be useful\n * for rendering 2D scenes and UI elements, amongst other things.\n *\n * ```js\n * const camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass OrthographicCamera extends Camera {\n\n\t/**\n\t * Constructs a new orthographic camera.\n\t *\n\t * @param {number} [left=-1] - The left plane of the camera's frustum.\n\t * @param {number} [right=1] - The right plane of the camera's frustum.\n\t * @param {number} [top=1] - The top plane of the camera's frustum.\n\t * @param {number} [bottom=-1] - The bottom plane of the camera's frustum.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOrthographicCamera = true;\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * The left plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.left = left;\n\n\t\t/**\n\t\t * The right plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.right = right;\n\n\t\t/**\n\t\t * The top plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.top = top;\n\n\t\t/**\n\t\t * The bottom plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.bottom = bottom;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link OrthographicCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link PerspectiveCamera}, `0` is a\n\t\t * valid value for an orthographic camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link OrthographicCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t * @see {@link PerspectiveCamera#setViewOffset}\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass DirectionalLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new directional light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( -5, 5, 5, -5, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\n/**\n * A light that gets emitted in a specific direction. This light will behave\n * as though it is infinitely far away and the rays produced from it are all\n * parallel. The common use case for this is to simulate daylight; the sun is\n * far enough away that its position can be considered to be infinite, and\n * all light rays coming from it are parallel.\n *\n * A common point of confusion for directional lights is that setting the\n * rotation has no effect. This is because three.js's DirectionalLight is the\n * equivalent to what is often called a 'Target Direct Light' in other\n * applications.\n *\n * This means that its direction is calculated as pointing from the light's\n * {@link Object3D#position} to the {@link DirectionalLight#target} position\n * (as opposed to a 'Free Direct Light' that just has a rotation\n * component).\n *\n * This light can cast shadows - see the {@link DirectionalLightShadow} for details.\n *\n * ```js\n * // White directional light at half intensity shining from the top.\n * const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );\n * scene.add( directionalLight );\n * ```\n *\n * @augments Light\n */\nclass DirectionalLight extends Light {\n\n\t/**\n\t * Constructs a new directional light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLight = true;\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The directional light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {DirectionalLightShadow}\n\t\t */\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light globally illuminates all objects in the scene equally.\n *\n * It cannot be used to cast shadows as it does not have a direction.\n *\n * ```js\n * const light = new THREE.AmbientLight( 0x404040 ); // soft white light\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass AmbientLight extends Light {\n\n\t/**\n\t * Constructs a new ambient light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\n/**\n * This class emits light uniformly across the face a rectangular plane.\n * This light type can be used to simulate light sources such as bright\n * windows or strip lighting.\n *\n * Important Notes:\n *\n * - There is no shadow support.\n * - Only PBR materials are supported.\n * - You have to include `RectAreaLightUniformsLib` (`WebGLRenderer`) or `RectAreaLightTexturesLib` (`WebGPURenderer`)\n * into your app and init the uniforms/textures.\n *\n * ```js\n * RectAreaLightUniformsLib.init(); // only relevant for WebGLRenderer\n * THREE.RectAreaLightNode.setLTC( RectAreaLightTexturesLib.init() ); // only relevant for WebGPURenderer\n *\n * const intensity = 1; const width = 10; const height = 10;\n * const rectLight = new THREE.RectAreaLight( 0xffffff, intensity, width, height );\n * rectLight.position.set( 5, 5, 0 );\n * rectLight.lookAt( 0, 0, 0 );\n * scene.add( rectLight )\n * ```\n *\n * @augments Light\n */\nclass RectAreaLight extends Light {\n\n\t/**\n\t * Constructs a new area light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t * @param {number} [width=10] - The width of the light.\n\t * @param {number} [height=10] - The height of the light.\n\t */\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\t/**\n\t\t * The width of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.height = height;\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a third-order spherical harmonics (SH). Light probes use this class\n * to encode lighting information.\n *\n * - Primary reference: {@link https://graphics.stanford.edu/papers/envmap/envmap.pdf}\n * - Secondary reference: {@link https://www.ppsloan.org/publications/StupidSH36.pdf}\n */\nclass SphericalHarmonics3 {\n\n\t/**\n\t * Constructs a new spherical harmonics.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\t/**\n\t\t * An array holding the (9) SH coefficients.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given SH coefficients to this instance by copying\n\t * the values.\n\t *\n\t * @param {Array} coefficients - The SH coefficients.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets all SH coefficients to `0`.\n\t *\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the radiance in the direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The radiance.\n\t */\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the irradiance (radiance convolved with cosine lobe) in the\n\t * direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The irradiance.\n\t */\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Adds the given SH to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * A convenience method for performing {@link SphericalHarmonics3#add} and\n\t * {@link SphericalHarmonics3#scale} at once.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this SH by the given scale factor.\n\t *\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linear interpolates between the given SH and this instance by the given\n\t * alpha factor.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to interpolate with.\n\t * @param {number} alpha - The alpha factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this spherical harmonics is equal with the given one.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to test for equality.\n\t * @return {boolean} Whether this spherical harmonics is equal with the given one.\n\t */\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical harmonics to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to copy.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\t/**\n\t * Returns a new spherical harmonics with copied values from this instance.\n\t *\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Sets the SH coefficients of this instance from the given array.\n\t *\n\t * @param {Array} array - An array holding the SH coefficients.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns an array with the SH coefficients, or copies them into the provided\n\t * array. The coefficients are represented as numbers.\n\t *\n\t * @param {Array} [array=[]] - The target array.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {Array} An array with flat SH coefficients.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Computes the SH basis for the given normal vector.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Array} shBasis - The target array holding the SH basis.\n\t */\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\n/**\n * Light probes are an alternative way of adding light to a 3D scene. Unlike\n * classical light sources (e.g. directional, point or spot lights), light\n * probes do not emit light. Instead they store information about light\n * passing through 3D space. During rendering, the light that hits a 3D\n * object is approximated by using the data from the light probe.\n *\n * Light probes are usually created from (radiance) environment maps. The\n * class {@link LightProbeGenerator} can be used to create light probes from\n * cube textures or render targets. However, light estimation data could also\n * be provided in other forms e.g. by WebXR. This enables the rendering of\n * augmented reality content that reacts to real world lighting.\n *\n * The current probe implementation in three.js supports so-called diffuse\n * light probes. This type of light probe is functionally equivalent to an\n * irradiance environment map.\n *\n * @augments Light\n */\nclass LightProbe extends Light {\n\n\t/**\n\t * Constructs a new light probe.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics which represents encoded lighting information.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLightProbe = true;\n\n\t\t/**\n\t\t * A light probe uses spherical harmonics to encode lighting information.\n\t\t *\n\t\t * @type {SphericalHarmonics3}\n\t\t */\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deserializes the light prove from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized light probe.\n\t * @return {LightProbe} A reference to this light probe.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.MaterialLoader();\n * const material = await loader.loadAsync( 'material.json' );\n * ```\n * This loader does not support node materials. Use {@link NodeMaterialLoader} instead.\n *\n * @augments Loader\n */\nclass MaterialLoader extends Loader {\n\n\t/**\n\t * Constructs a new material loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * A dictionary holding textures used by the material.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.textures = {};\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded material to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Material)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a material.\n\t *\n\t * @param {Object} json - The serialized material.\n\t * @return {Material} The parsed material.\n\t */\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\twarn( 'MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = this.createMaterialFromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.dispersion !== undefined ) material.dispersion = json.dispersion;\n\t\tif ( json.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.anisotropy !== undefined ) material.anisotropy = json.anisotropy;\n\t\tif ( json.anisotropyRotation !== undefined ) material.anisotropyRotation = json.anisotropyRotation;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.alphaHash !== undefined ) material.alphaHash = json.alphaHash;\n\t\tif ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.blendSrc !== undefined ) material.blendSrc = json.blendSrc;\n\t\tif ( json.blendDst !== undefined ) material.blendDst = json.blendDst;\n\t\tif ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation;\n\t\tif ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha;\n\t\tif ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha;\n\t\tif ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha;\n\t\tif ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor );\n\t\tif ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== undefined ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\t\tif ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.lights !== undefined ) material.lights = json.lights;\n\t\tif ( json.clipping !== undefined ) material.clipping = json.clipping;\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapRotation !== undefined ) material.envMapRotation.fromArray( json.envMapRotation );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.anisotropyMap !== undefined ) material.anisotropyMap = getTexture( json.anisotropyMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\t/**\n\t * Textures are not embedded in the material JSON so they have\n\t * to be injected before the loading process starts.\n\t *\n\t * @param {Object} value - A dictionary holding textures for material properties.\n\t * @return {MaterialLoader} A reference to this material loader.\n\t */\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tcreateMaterialFromType( type ) {\n\n\t\treturn MaterialLoader.createMaterialFromType( type );\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @static\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\n/**\n * A class with loader utility functions.\n */\nclass LoaderUtils {\n\n\t/**\n\t * Extracts the base URL from the given URL.\n\t *\n\t * @param {string} url -The URL to extract the base URL from.\n\t * @return {string} The extracted base URL.\n\t */\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === -1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\t/**\n\t * Resolves relative URLs against the given path. Absolute paths, data urls,\n\t * and blob URLs will be returned as is. Invalid URLs will return an empty\n\t * string.\n\t *\n\t * @param {string} url -The URL to resolve.\n\t * @param {string} path - The base path for relative URLs to be resolved against.\n\t * @return {string} The resolved URL.\n\t */\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\n/**\n * An instanced version of a geometry.\n */\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new instanced buffer geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\n\t\t/**\n\t\t * The instance count.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.BufferGeometryLoader();\n * const geometry = await loader.loadAsync( 'models/json/pressure.json' );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xF5F5F5 } );\n * const object = new THREE.Mesh( geometry, material );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass BufferGeometryLoader extends Loader {\n\n\t/**\n\t * Constructs a new geometry loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded geometry to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a geometry.\n\t *\n\t * @param {Object} json - The serialized geometry.\n\t * @return {BufferGeometry} The parsed geometry.\n\t */\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tgeometry.boundingSphere = new Sphere().fromJSON( boundingSphere );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * A loader for loading a JSON resource in the [JSON Object/Scene format](https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4).\n * The files are internally loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.ObjectLoader();\n * const obj = await loader.loadAsync( 'models/json/example.json' );\n * scene.add( obj );\n *\n * // Alternatively, to parse a previously loaded JSON structure\n * const object = await loader.parseAsync( a_json_object );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass ObjectLoader extends Loader {\n\n\t/**\n\t * Constructs a new object loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded 3D object to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Object3D)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\\'t load ' + url ) );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#load}.\n\t *\n\t * @async\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves with the loaded 3D object.\n\t */\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\t/**\n\t * Parses the given JSON. This is used internally by {@link ObjectLoader#load}\n\t * but can also be used directly to parse a previously loaded JSON structure.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @param {onLoad} onLoad - Executed when all resources (e.g. textures) have been fully loaded.\n\t * @return {Object3D} The parsed 3D object.\n\t */\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#parse}.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @return {Promise} A Promise that resolves with the parsed 3D object.\n\t */\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\treturn object;\n\n\t}\n\n\t// internals\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twarn( `ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\twarn( 'ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\t\t\t\tif ( data.channel !== undefined ) texture.channel = data.channel;\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.internalFormat !== undefined ) texture.internalFormat = data.internalFormat;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.colorSpace !== undefined ) texture.colorSpace = data.colorSpace;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps;\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\t\t\t\tif ( data.compareFunction !== undefined ) texture.compareFunction = data.compareFunction;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\twarn( 'ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.fog.name !== '' ) {\n\n\t\t\t\t\t\tobject.fog.name = data.fog.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness;\n\t\t\t\tif ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity;\n\t\t\t\tif ( data.backgroundRotation !== undefined ) object.backgroundRotation.fromArray( data.backgroundRotation );\n\n\t\t\t\tif ( data.environmentIntensity !== undefined ) object.environmentIntensity = data.environmentIntensity;\n\t\t\t\tif ( data.environmentRotation !== undefined ) object.environmentRotation.fromArray( data.environmentRotation );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'BatchedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new BatchedMesh( data.maxInstanceCount, data.maxVertexCount, data.maxIndexCount, material );\n\t\t\t\tobject.geometry = geometry;\n\t\t\t\tobject.perObjectFrustumCulled = data.perObjectFrustumCulled;\n\t\t\t\tobject.sortObjects = data.sortObjects;\n\n\t\t\t\tobject._drawRanges = data.drawRanges;\n\t\t\t\tobject._reservedRanges = data.reservedRanges;\n\n\t\t\t\tobject._geometryInfo = data.geometryInfo.map( info => {\n\n\t\t\t\t\tlet box = null;\n\t\t\t\t\tlet sphere = null;\n\t\t\t\t\tif ( info.boundingBox !== undefined ) {\n\n\t\t\t\t\t\tbox = new Box3().fromJSON( info.boundingBox );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( info.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\tsphere = new Sphere().fromJSON( info.boundingSphere );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...info,\n\t\t\t\t\t\tboundingBox: box,\n\t\t\t\t\t\tboundingSphere: sphere\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\t\t\t\tobject._instanceInfo = data.instanceInfo;\n\n\t\t\t\tobject._availableInstanceIds = data._availableInstanceIds;\n\t\t\t\tobject._availableGeometryIds = data._availableGeometryIds;\n\n\t\t\t\tobject._nextIndexStart = data.nextIndexStart;\n\t\t\t\tobject._nextVertexStart = data.nextVertexStart;\n\t\t\t\tobject._geometryCount = data.geometryCount;\n\n\t\t\t\tobject._maxInstanceCount = data.maxInstanceCount;\n\t\t\t\tobject._maxVertexCount = data.maxVertexCount;\n\t\t\t\tobject._maxIndexCount = data.maxIndexCount;\n\n\t\t\t\tobject._geometryInitialized = data.geometryInitialized;\n\n\t\t\t\tobject._matricesTexture = getTexture( data.matricesTexture.uuid );\n\n\t\t\t\tobject._indirectTexture = getTexture( data.indirectTexture.uuid );\n\n\t\t\t\tif ( data.colorsTexture !== undefined ) {\n\n\t\t\t\t\tobject._colorsTexture = getTexture( data.colorsTexture.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingSphere !== undefined ) {\n\n\t\t\t\t\tobject.boundingSphere = new Sphere().fromJSON( data.boundingSphere );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingBox !== undefined ) {\n\n\t\t\t\t\tobject.boundingBox = new Box3().fromJSON( data.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.up !== undefined ) object.up.fromArray( data.up );\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.intensity !== undefined ) object.shadow.intensity = data.shadow.intensity;\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance, level.hysteresis );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tbindLightTargets( object ) {\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isDirectionalLight || child.isSpotLight ) {\n\n\t\t\t\tconst uuid = child.target;\n\n\t\t\t\tconst target = object.getObjectByProperty( 'uuid', uuid );\n\n\t\t\t\tif ( target !== undefined ) {\n\n\t\t\t\t\tchild.target = target;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.target = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nconst _errorMap = new WeakMap();\n\n/**\n * A loader for loading images as an [ImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap).\n * An `ImageBitmap` provides an asynchronous and resource efficient pathway to prepare\n * textures for rendering.\n *\n * Note that {@link Texture#flipY} and {@link Texture#premultiplyAlpha} are ignored with image bitmaps.\n * They needs these configuration on bitmap creation unlike regular images need them on uploading to GPU.\n *\n * You need to set the equivalent options via {@link ImageBitmapLoader#setOptions} instead.\n *\n * Also note that unlike {@link FileLoader}, this loader avoids multiple concurrent requests to the same URL only if `Cache` is enabled.\n *\n * ```js\n * const loader = new THREE.ImageBitmapLoader();\n * loader.setOptions( { imageOrientation: 'flipY' } ); // set options if needed\n * const imageBitmap = await loader.loadAsync( 'image.png' );\n *\n * const texture = new THREE.Texture( imageBitmap );\n * texture.needsUpdate = true;\n * ```\n *\n * @augments Loader\n */\nclass ImageBitmapLoader extends Loader {\n\n\t/**\n\t * Constructs a new image bitmap loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\t/**\n\t\t * Represents the loader options.\n\t\t *\n\t\t * @type {Object}\n\t\t * @default {premultiplyAlpha:'none'}\n\t\t */\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Sets the given loader options. The structure of the object must match the `options` parameter of\n\t * [createImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/Window/createImageBitmap).\n\t *\n\t * @param {Object} options - The loader options to set.\n\t * @return {ImageBitmapLoader} A reference to this image bitmap loader.\n\t */\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded image bitmap to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(ImageBitmap)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {ImageBitmap|undefined} The image bitmap.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image-bitmap:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\t// If cached is a promise, wait for it to resolve\n\t\t\tif ( cached.then ) {\n\n\t\t\t\tcached.then( imageBitmap => {\n\n\t\t\t\t\t// check if there is an error for the cached promise\n\n\t\t\t\t\tif ( _errorMap.has( cached ) === true ) {\n\n\t\t\t\t\t\tif ( onError ) onError( _errorMap.get( cached ) );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t\treturn imageBitmap;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// If cached is not a promise (i.e., it's already an imageBitmap)\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\t\tfetchOptions.signal = ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal;\n\n\t\tconst promise = fetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( `image-bitmap:${url}`, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t\treturn imageBitmap;\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\t_errorMap.set( promise, e );\n\n\t\t\tCache.remove( `image-bitmap:${url}` );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tCache.add( `image-bitmap:${url}`, promise );\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {ImageBitmapLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _context;\n\n/**\n * Manages the global audio context in the engine.\n *\n * @hideconstructor\n */\nclass AudioContext {\n\n\t/**\n\t * Returns the global native audio context.\n\t *\n\t * @return {AudioContext} The native audio context.\n\t */\n\tstatic getContext() {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t}\n\n\t/**\n\t * Allows to set the global native audio context from outside.\n\t *\n\t * @param {AudioContext} value - The native context to set.\n\t */\n\tstatic setContext( value ) {\n\n\t\t_context = value;\n\n\t}\n\n}\n\n/**\n * Class for loading audio buffers. Audios are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const audioListener = new THREE.AudioListener();\n * const ambientSound = new THREE.Audio( audioListener );\n *\n * const loader = new THREE.AudioLoader();\n * const audioBuffer = await loader.loadAsync( 'audio/ambient_ocean.ogg' );\n *\n * ambientSound.setBuffer( audioBuffer );\n * ambientSound.play();\n * ```\n *\n * @augments Loader\n */\nclass AudioLoader extends Loader {\n\n\t/**\n\t * Constructs a new audio loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded audio buffer\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(AudioBuffer)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} ).catch( handleError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\thandleError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\tfunction handleError( 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\terror( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\n\t\t}\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * A special type of camera that uses two perspective cameras with\n * stereoscopic projection. Can be used for rendering stereo effects\n * like [3D Anaglyph](https://en.wikipedia.org/wiki/Anaglyph_3D) or\n * [Parallax Barrier](https://en.wikipedia.org/wiki/parallax_barrier).\n */\nclass StereoCamera {\n\n\t/**\n\t * Constructs a new stereo camera.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'StereoCamera';\n\n\t\t/**\n\t\t * The aspect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t\t/**\n\t\t * The eye separation which represents the distance\n\t\t * between the left and right camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.064\n\t\t */\n\t\tthis.eyeSep = 0.064;\n\n\t\t/**\n\t\t * The camera representing the left eye. This is added to layer `1` so objects to be\n\t\t * rendered by the left camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The camera representing the right eye. This is added to layer `2` so objects to be\n\t\t * rendered by the right camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the stereo camera based on the given perspective camera.\n\t *\n\t * @param {PerspectiveCamera} camera - The perspective camera.\n\t */\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\n/**\n * This type of camera can be used in order to efficiently render a scene with a\n * predefined set of cameras. This is an important performance aspect for\n * rendering VR scenes.\n *\n * An instance of `ArrayCamera` always has an array of sub cameras. It's mandatory\n * to define for each sub camera the `viewport` property which determines the\n * part of the viewport that is rendered with this camera.\n *\n * @augments PerspectiveCamera\n */\nclass ArrayCamera extends PerspectiveCamera {\n\n\t/**\n\t * Constructs a new array camera.\n\t *\n\t * @param {Array} [array=[]] - An array of perspective sub cameras.\n\t */\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArrayCamera = true;\n\n\t\t/**\n\t\t * Whether this camera is used with multiview rendering or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isMultiViewCamera = false;\n\n\t\t/**\n\t\t * An array of perspective sub cameras.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\n/**\n * Class for keeping track of time.\n */\nclass Clock {\n\n\t/**\n\t * Constructs a new clock.\n\t *\n\t * @param {boolean} [autoStart=true] - Whether to automatically start the clock when\n\t * `getDelta()` is called for the first time.\n\t */\n\tconstructor( autoStart = true ) {\n\n\t\t/**\n\t\t * If set to `true`, the clock starts automatically when `getDelta()` is called\n\t\t * for the first time.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoStart = autoStart;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()` method was last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.startTime = 0;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()`, `getElapsedTime()` or\n\t\t * `getDelta()` methods were last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.oldTime = 0;\n\n\t\t/**\n\t\t * Keeps track of the total time that the clock has been running.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.elapsedTime = 0;\n\n\t\t/**\n\t\t * Whether the clock is running or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.running = false;\n\n\t}\n\n\t/**\n\t * Starts the clock. When `autoStart` is set to `true`, the method is automatically\n\t * called by the class.\n\t */\n\tstart() {\n\n\t\tthis.startTime = performance.now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\t/**\n\t * Stops the clock.\n\t */\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time.\n\t */\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\t/**\n\t * Returns the delta time in seconds.\n\t *\n\t * @return {number} The delta time.\n\t */\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = performance.now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\n\nconst _forward = /*@__PURE__*/ new Vector3();\nconst _up = /*@__PURE__*/ new Vector3();\n\n/**\n * The class represents a virtual listener of the all positional and non-positional audio effects\n * in the scene. A three.js application usually creates a single listener. It is a mandatory\n * constructor parameter for audios entities like {@link Audio} and {@link PositionalAudio}.\n *\n * In most cases, the listener object is a child of the camera. So the 3D transformation of the\n * camera represents the 3D transformation of the listener.\n *\n * @augments Object3D\n */\nclass AudioListener extends Object3D {\n\n\t/**\n\t * Constructs a new audio listener.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\t/**\n\t\t * The native audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = AudioContext.getContext();\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\t/**\n\t\t * An optional filter.\n\t\t *\n\t\t * Defined via {@link AudioListener#setFilter}.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.filter = null;\n\n\t\t/**\n\t\t * Time delta values required for `linearRampToValueAtTime()` usage.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\t/**\n\t * Returns the listener's input node.\n\t *\n\t * This method is used by other audio nodes to connect to this listener.\n\t *\n\t * @return {GainNode} The input node.\n\t */\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Removes the current filter from this listener.\n\t *\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filter.\n\t *\n\t * @return {?AudioNode} The filter.\n\t */\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\t/**\n\t * Sets the given filter to this listener.\n\t *\n\t * @param {AudioNode} value - The filter to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the applications master volume.\n\t *\n\t * @return {number} The master volume.\n\t */\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the applications master volume. This volume setting affects\n\t * all audio nodes in the scene.\n\t *\n\t * @param {number} value - The master volume to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t// the initial forward and up directions must be orthogonal\n\t\t_forward.set( 0, 0, -1 ).applyQuaternion( _quaternion$1 );\n\t\t_up.set( 0, 1, 0 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _forward.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _forward.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _forward.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( _up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( _up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( _up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _forward.x, _forward.y, _forward.z, _up.x, _up.y, _up.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a non-positional ( global ) audio object.\n *\n * This and related audio modules make use of the [Web Audio API](https://www.w3.org/TR/webaudio-1.1/).\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create a global audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop( true );\n * \tsound.setVolume( 0.5 );\n * \tsound.play();\n * });\n * ```\n *\n * @augments Object3D\n */\nclass Audio extends Object3D {\n\n\t/**\n\t * Constructs a new audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AudioListener}\n\t\t * @readonly\n\t\t */\n\t\tthis.listener = listener;\n\n\t\t/**\n\t\t * The audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = listener.context;\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\t/**\n\t\t * Whether to start playback automatically or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoplay = false;\n\n\t\t/**\n\t\t * A reference to an audio buffer.\n\t\t *\n\t\t * Defined via {@link Audio#setBuffer}.\n\t\t *\n\t\t * @type {?AudioBuffer}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.buffer = null;\n\n\t\t/**\n\t\t * Modify pitch, measured in cents. +/- 100 is a semitone.\n\t\t * +/- 1200 is an octave.\n\t\t *\n\t\t * Defined via {@link Audio#setDetune}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.detune = 0;\n\n\t\t/**\n\t\t * Whether the audio should loop or not.\n\t\t *\n\t\t * Defined via {@link Audio#setLoop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.loop = false;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * start, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopStart = 0;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * stop, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopEnd = 0;\n\n\t\t/**\n\t\t * An offset to the time within the audio buffer the playback\n\t\t * should begin, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.offset = 0;\n\n\t\t/**\n\t\t * Overrides the default duration of the audio.\n\t\t *\n\t\t * @type {undefined|number}\n\t\t * @default undefined\n\t\t */\n\t\tthis.duration = undefined;\n\n\t\t/**\n\t\t * The playback speed.\n\t\t *\n\t\t * Defined via {@link Audio#setPlaybackRate}.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 1\n\t\t */\n\t\tthis.playbackRate = 1;\n\n\t\t/**\n\t\t * Indicates whether the audio is playing or not.\n\t\t *\n\t\t * This flag will be automatically set when using {@link Audio#play},\n\t\t * {@link Audio#pause}, {@link Audio#stop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPlaying = false;\n\n\t\t/**\n\t\t * Indicates whether the audio playback can be controlled\n\t\t * with method like {@link Audio#play} or {@link Audio#pause}.\n\t\t *\n\t\t * This flag will be automatically set when audio sources are\n\t\t * defined.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.hasPlaybackControl = true;\n\n\t\t/**\n\t\t * Holds a reference to the current audio source.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @readonly\n\t\t * @default null\n\t\t */\n\t\tthis.source = null;\n\n\t\t/**\n\t\t * Defines the source type.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {('empty'|'audioNode'|'mediaNode'|'mediaStreamNode'|'buffer')}\n\t\t * @readonly\n\t\t * @default 'empty'\n\t\t */\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\t/**\n\t\t * Can be used to apply a variety of low-order filters to create\n\t\t * more complex sound effects e.g. via `BiquadFilterNode`.\n\t\t *\n\t\t * The property is automatically set by {@link Audio#setFilters}.\n\t\t *\n\t\t * @type {Array}\n\t\t * @readonly\n\t\t */\n\t\tthis.filters = [];\n\n\t}\n\n\t/**\n\t * Returns the output audio node.\n\t *\n\t * @return {GainNode} The output node.\n\t */\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Sets the given audio node as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `audioNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {AudioNode} audioNode - The audio node like an instance of `OscillatorNode`.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media element as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {HTMLMediaElement} mediaElement - The media element.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media stream as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaStreamNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {MediaStream} mediaStream - The media stream.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given audio buffer as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `buffer` and {@link Audio#hasPlaybackControl} to `true`.\n\t *\n\t * @param {AudioBuffer} audioBuffer - The audio buffer.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should start playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\twarn( 'Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\t/**\n\t * Pauses the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should stop playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tstop( delay = 0 ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tif ( this.source !== null ) {\n\n\t\t\tthis.source.stop( this.context.currentTime + delay );\n\t\t\tthis.source.onended = null;\n\n\t\t}\n\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio} A reference to this instance.\n\t */\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._connected === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filters.\n\t *\n\t * @return {Array} The list of filters.\n\t */\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\t/**\n\t * Sets an array of filters and connects them with the audio source.\n\t *\n\t * @param {Array} [value] - A list of filters.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines the detuning of oscillation in cents.\n\t *\n\t * @param {number} value - The detuning of oscillation in cents.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.isPlaying === true && this.source.detune !== undefined ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the detuning of oscillation in cents.\n\t *\n\t * @return {number} The detuning of oscillation in cents.\n\t */\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\t/**\n\t * Returns the first filter in the list of filters.\n\t *\n\t * @return {AudioNode|undefined} The first filter in the list of filters.\n\t */\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\t/**\n\t * Applies a single filter node to the audio.\n\t *\n\t * @param {AudioNode} [filter] - The filter to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\t/**\n\t * Sets the playback rate.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [value] - The playback rate to set.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current playback rate.\n\n\t * @return {number} The playback rate.\n\t */\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\t/**\n\t * Automatically called when playback finished.\n\t */\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\t\tthis._progress = 0;\n\n\t}\n\n\t/**\n\t * Returns the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {boolean} Whether the audio should loop or not.\n\t */\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\t/**\n\t * Sets the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {boolean} value - Whether the audio should loop or not.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop start value which defines where in the audio buffer the replay should\n\t * start, in seconds.\n\t *\n\t * @param {number} value - The loop start value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop end value which defines where in the audio buffer the replay should\n\t * stop, in seconds.\n\t *\n\t * @param {number} value - The loop end value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the volume.\n\t *\n\t * @return {number} The volume.\n\t */\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the volume.\n\t *\n\t * @param {number} value - The volume to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.sourceType !== 'buffer' ) {\n\n\t\t\twarn( 'Audio: Audio source type cannot be copied.' );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.autoplay = source.autoplay;\n\n\t\tthis.buffer = source.buffer;\n\t\tthis.detune = source.detune;\n\t\tthis.loop = source.loop;\n\t\tthis.loopStart = source.loopStart;\n\t\tthis.loopEnd = source.loopEnd;\n\t\tthis.offset = source.offset;\n\t\tthis.duration = source.duration;\n\t\tthis.playbackRate = source.playbackRate;\n\t\tthis.hasPlaybackControl = source.hasPlaybackControl;\n\t\tthis.sourceType = source.sourceType;\n\n\t\tthis.filters = source.filters.slice();\n\n\t\treturn this;\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor( this.listener ).copy( this, recursive );\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents a positional audio object.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create the PositionalAudio object (passing in the listener)\n * const sound = new THREE.PositionalAudio( listener );\n *\n * // load a sound and set it as the PositionalAudio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/song.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setRefDistance( 20 );\n * \tsound.play();\n * });\n *\n * // create an object for the sound to play from\n * const sphere = new THREE.SphereGeometry( 20, 32, 16 );\n * const material = new THREE.MeshPhongMaterial( { color: 0xff2200 } );\n * const mesh = new THREE.Mesh( sphere, material );\n * scene.add( mesh );\n *\n * // finally add the sound to the mesh\n * mesh.add( sound );\n *\n * @augments Audio\n */\nclass PositionalAudio extends Audio {\n\n\t/**\n\t * Constructs a positional audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\t/**\n\t\t * The panner node represents the location, direction, and behavior of an audio\n\t\t * source in 3D space.\n\t\t *\n\t\t * @type {PannerNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tconnect() {\n\n\t\tsuper.connect();\n\n\t\tthis.panner.connect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\t/**\n\t * Returns the current reference distance.\n\t *\n\t * @return {number} The reference distance.\n\t */\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\t/**\n\t * Defines the reference distance for reducing volume as the audio source moves\n\t * further from the listener – i.e. the distance at which the volume reduction\n\t * starts taking effect.\n\t *\n\t * @param {number} value - The reference distance to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current rolloff factor.\n\t *\n\t * @return {number} The rolloff factor.\n\t */\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\t/**\n\t * Defines how quickly the volume is reduced as the source moves away from the listener.\n\t *\n\t * @param {number} value - The rolloff factor.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current distance model.\n\t *\n\t * @return {('linear'|'inverse'|'exponential')} The distance model.\n\t */\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\t/**\n\t * Defines which algorithm to use to reduce the volume of the audio source\n\t * as it moves away from the listener.\n\t *\n\t * Read [the spec](https://www.w3.org/TR/webaudio-1.1/#enumdef-distancemodeltype)\n\t * for more details.\n\t *\n\t * @param {('linear'|'inverse'|'exponential')} value - The distance model to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current max distance.\n\t *\n\t * @return {number} The max distance.\n\t */\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\t/**\n\t * Defines the maximum distance between the audio source and the listener,\n\t * after which the volume is not reduced any further.\n\t *\n\t * This value is used only by the `linear` distance model.\n\t *\n\t * @param {number} value - The max distance.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the directional cone in which the audio can be listened.\n\t *\n\t * @param {number} coneInnerAngle - An angle, in degrees, of a cone inside of which there will be no volume reduction.\n\t * @param {number} coneOuterAngle - An angle, in degrees, of a cone outside of which the volume will be reduced by a constant value, defined by the `coneOuterGain` parameter.\n\t * @param {number} coneOuterGain - The amount of volume reduction outside the cone defined by the `coneOuterAngle`. When set to `0`, no sound can be heard.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class can be used to analyse audio data.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create an Audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop(true);\n * \tsound.setVolume(0.5);\n * \tsound.play();\n * });\n *\n * // create an AudioAnalyser, passing in the sound and desired fftSize\n * const analyser = new THREE.AudioAnalyser( sound, 32 );\n *\n * // get the average frequency of the sound\n * const data = analyser.getAverageFrequency();\n * ```\n */\nclass AudioAnalyser {\n\n\t/**\n\t * Constructs a new audio analyzer.\n\t *\n\t * @param {Audio} audio - The audio to analyze.\n\t * @param {number} [fftSize=2048] - The window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.\n\t */\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AnalyserNode}\n\t\t */\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\t/**\n\t\t * Holds the analyzed data.\n\t\t *\n\t\t * @type {Uint8Array}\n\t\t */\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\t/**\n\t * Returns an array with frequency data of the audio.\n\t *\n\t * Each item in the array represents the decibel value for a specific frequency.\n\t * The frequencies are spread linearly from 0 to 1/2 of the sample rate.\n\t * For example, for 48000 sample rate, the last item of the array will represent\n\t * the decibel value for 24000 Hz.\n\t *\n\t * @return {Uint8Array} The frequency data.\n\t */\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\t/**\n\t * Returns the average of the frequencies returned by {@link AudioAnalyser#getFrequencyData}.\n\t *\n\t * @return {number} The average frequency.\n\t */\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\n/**\n * Buffered scene graph property that allows weighted accumulation; used internally.\n */\nclass PropertyMixer {\n\n\t/**\n\t * Constructs a new property mixer.\n\t *\n\t * @param {PropertyBinding} binding - The property binding.\n\t * @param {string} typeName - The keyframe track type name.\n\t * @param {number} valueSize - The keyframe track value size.\n\t */\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\t/**\n\t\t * The property binding.\n\t\t *\n\t\t * @type {PropertyBinding}\n\t\t */\n\t\tthis.binding = binding;\n\n\t\t/**\n\t\t * The keyframe track value size.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeight = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.useCount = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `accu`.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t * @param {number} weight - The weight.\n\t */\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `add`.\n\t *\n\t * @param {number} weight - The weight.\n\t */\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t/**\n\t * Applies the state of `accu` to the binding when accus differ.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t */\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Remembers the state of the bound property and copy it to both accus.\n\t */\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t/**\n\t * Applies the state previously taken via {@link PropertyMixer#saveOriginalState} to the binding.\n\t */\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t// internals\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\n\n\n/**\n * This holds a reference to a real property in the scene graph; used internally.\n */\nclass PropertyBinding {\n\n\t/**\n\t * Constructs a new property binding.\n\t *\n\t * @param {Object} rootNode - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t */\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\t/**\n\t\t * The object path to the animated property.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = path;\n\n\t\t/**\n\t\t * An object holding information about the path.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\t/**\n\t\t * The object owns the animated property.\n\t\t *\n\t\t * @type {?Object}\n\t\t */\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName );\n\n\t\t/**\n\t\t * The root node.\n\t\t *\n\t\t * @type {Object3D|Skeleton}\n\t\t */\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\t/**\n\t * Factory method for creating a property binding from the given parameters.\n\t *\n\t * @static\n\t * @param {Object} root - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t * @return {PropertyBinding|Composite} The created property binding or composite.\n\t */\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name - Node name to be sanitized.\n\t * @return {string} The sanitized node name.\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\t/**\n\t * Parses the given track name (an object path to an animated property) and\n\t * returns an object with information about the path. Matches strings in the following forms:\n\t *\n\t * - nodeName.property\n\t * - nodeName.property[accessor]\n\t * - nodeName.material.property[accessor]\n\t * - uuid.property[accessor]\n\t * - uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t * - parentName/nodeName.property\n\t * - parentName/parentName/nodeName.property[index]\n\t * - .bone[Armature.DEF_cog].position\n\t * - scene:helium_balloon_model:helium_balloon_model.position\n\t *\n\t * @static\n\t * @param {string} trackName - The track name to parse.\n\t * @return {Object} The parsed track name as an object.\n\t */\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== -1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== -1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\t/**\n\t * Searches for a node in the hierarchy of the given root object by the given\n\t * node name.\n\t *\n\t * @static\n\t * @param {Object} root - The root object.\n\t * @param {string|number} nodeName - The name of the node.\n\t * @return {?Object} The found node. Returns `null` if no object was found.\n\t */\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t/**\n\t * Creates a getter / setter pair for the property tracked by this binding.\n\t */\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName );\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\twarn( 'PropertyBinding: No target node found for track: ' + this.path + '.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map':\n\n\t\t\t\t\tif ( 'map' in targetObject ) {\n\n\t\t\t\t\t\ttargetObject = targetObject.map;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.map ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.map as node.material does not have a map.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.map;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\terror( 'PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.isMaterial === true ) {\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.isObject3D === true ) {\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\t/**\n\t * Unbinds the property.\n\t */\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n * - Instead pass this object as 'root'.\n * - You can also add and remove objects later when the mixer is running.\n *\n * Note:\n *\n * - Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the all objects in the group.\n * - A single property can either be controlled through a target group or directly, but not both.\n */\nclass AnimationObjectGroup {\n\n\t/**\n\t * Constructs a new animation group.\n\t *\n\t * @param {...Object3D} arguments - An arbitrary number of 3D objects that share the same animation state.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * Adds an arbitrary number of objects to this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to add.\n\t */\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\terror( 'AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Removes an arbitrary number of objects to this animation group\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to remove.\n\t */\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for the passed 3D objects of this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to uncache.\n\t */\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * An instance of `AnimationAction` schedules the playback of an animation which is\n * stored in {@link AnimationClip}.\n */\nclass AnimationAction {\n\n\t/**\n\t * Constructs a new animation action.\n\t *\n\t * @param {AnimationMixer} mixer - The mixer that is controlled by this action.\n\t * @param {AnimationClip} clip - The animation clip that holds the actual keyframes.\n\t * @param {?Object3D} [localRoot=null] - The root object on which this action is performed.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t */\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\t/**\n\t\t * The loop mode, set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * @type {(LoopRepeat|LoopOnce|LoopPingPong)}\n\t\t * @default LoopRepeat\n\t\t */\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t/**\n\t\t * The local time of this action (in seconds, starting with `0`).\n\t\t *\n\t\t * The value gets clamped or wrapped to `[0,clip.duration]` (according to the\n\t\t * loop state).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * Scaling factor for the {@link AnimationAction#time}. A value of `0` causes the\n\t\t * animation to pause. Negative values cause the animation to play backwards.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\t/**\n\t\t * The degree of influence of this action (in the interval `[0, 1]`). Values\n\t\t * between `0` (no impact) and `1` (full impact) can be used to blend between\n\t\t * several actions.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\t/**\n\t\t * The number of repetitions of the performed clip over the course of this action.\n\t\t * Can be set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * Setting this number has no effect if {@link AnimationAction#loop} is set to\n\t\t * `THREE:LoopOnce`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.repetitions = Infinity;\n\n\t\t/**\n\t\t * If set to `true`, the playback of the action is paused.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.paused = false;\n\n\t\t/**\n\t\t * If set to `false`, the action is disabled so it has no impact.\n\t\t *\n\t\t * When the action is re-enabled, the animation continues from its current\n\t\t * time (setting `enabled` to `false` doesn't reset the action).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * If set to true the animation will automatically be paused on its last frame.\n\t\t *\n\t\t * If set to false, {@link AnimationAction#enabled} will automatically be switched\n\t\t * to `false` when the last loop of the action has finished, so that this action has\n\t\t * no further impact.\n\t\t *\n\t\t * Note: This member has no impact if the action is interrupted (it\n\t\t * has only an effect if its last loop has really finished).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clampWhenFinished = false;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtStart = true;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtEnd = true;\n\n\t}\n\n\t/**\n\t * Starts the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\t/**\n\t * Resets the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = -1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\t/**\n\t * Returns `true` if the animation is running.\n\t *\n\t * @return {boolean} Whether the animation is running or not.\n\t */\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Returns `true` when {@link AnimationAction#play} has been called.\n\t *\n\t * @return {boolean} Whether the animation is scheduled or not.\n\t */\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Defines the time when the animation should start.\n\t *\n\t * @param {number} time - The start time in seconds.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Configures the loop settings for this action.\n\t *\n\t * @param {(LoopRepeat|LoopOnce|LoopPingPong)} mode - The loop mode.\n\t * @param {number} repetitions - The number of repetitions.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective weight of this action.\n\t *\n\t * An action has no effect and thus an effective weight of zero when the\n\t * action is disabled.\n\t *\n\t * @param {number} weight - The weight to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t/**\n\t * Returns the effective weight of this action.\n\t *\n\t * @return {number} The effective weight.\n\t */\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\t/**\n\t * Fades the animation in by increasing its weight gradually from `0` to `1`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\t/**\n\t * Fades the animation out by decreasing its weight gradually from `1` to `0`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\t/**\n\t * Causes this action to fade in and the given action to fade out,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeOutAction - The animation action to fade out.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeFrom( fadeOutAction, duration, warp = false ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp === true ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Causes this action to fade out and the given action to fade in,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeInAction - The animation action to fade in.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeTo( fadeInAction, duration, warp = false ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\t/**\n\t * Stops any fading which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective time scale of this action.\n\t *\n\t * An action has no effect and thus an effective time scale of zero when the\n\t * action is paused.\n\t *\n\t * @param {number} timeScale - The time scale to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Returns the effective time scale of this action.\n\t *\n\t * @return {number} The effective time scale.\n\t */\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\t/**\n\t * Sets the duration for a single loop of this action.\n\t *\n\t * @param {number} duration - The duration to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Synchronizes this action with the passed other action.\n\t *\n\t * @param {AnimationAction} action - The action to sync with.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Decelerates this animation's speed to `0` within the passed time interval.\n\t *\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\t/**\n\t * Changes the playback speed, within the passed time interval, by modifying\n\t * {@link AnimationAction#timeScale} gradually from `startTimeScale` to\n\t * `endTimeScale`.\n\t *\n\t * @param {number} startTimeScale - The start time scale.\n\t * @param {number} endTimeScale - The end time scale.\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops any scheduled warping which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the animation mixer of this animation action.\n\t *\n\t * @return {AnimationMixer} The animation mixer.\n\t */\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\t/**\n\t * Returns the animation clip of this animation action.\n\t *\n\t * @return {AnimationClip} The animation clip.\n\t */\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\t/**\n\t * Returns the root object of this animation action.\n\t *\n\t * @return {Object3D} The root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\tdeltaTime = 0;\n\n\t\t\t} else {\n\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === -1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n/**\n * `AnimationMixer` is a player for animations on a particular object in\n * the scene. When multiple objects in the scene are animated independently,\n * one `AnimationMixer` may be used for each object.\n */\nclass AnimationMixer extends EventDispatcher {\n\n\t/**\n\t * Constructs a new animation mixer.\n\t *\n\t * @param {Object3D} root - The object whose animations shall be played by this mixer.\n\t */\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\t/**\n\t\t * The global mixer time (in seconds; starting with `0` on the mixer's creation).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * A scaling factor for the global time.\n\t\t *\n\t\t * Note: Setting this member to `0` and later back to `1` is a\n\t\t * possibility to pause/unpause all actions that are controlled by this\n\t\t * mixer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, _controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link AnimationAction} for the passed clip.\n\t *\n\t * If an action fitting the clip and root parameters doesn't yet exist, it\n\t * will be created by this method. Calling this method several times with the\n\t * same clip and root parameters always returns the same action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t * @return {?AnimationAction} The animation action.\n\t */\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t/**\n\t * Returns an existing animation action for the passed clip.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @return {?AnimationAction} The animation action. Returns `null` if no action was found.\n\t */\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Deactivates all previously scheduled actions on this mixer.\n\t *\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Advances the global mixer time and updates the animation.\n\t *\n\t * This is usually done in the render loop by passing the delta\n\t * time from {@link Clock} or {@link Timer}.\n\t *\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the global mixer to a specific time and updates the animation accordingly.\n\t *\n\t * This is useful when you need to jump to an exact time in an animation. The\n\t * input parameter will be scaled by {@link AnimationMixer#timeScale}\n\t *\n\t * @param {number} time - The time to set in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tsetTime( time ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( time ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t/**\n\t * Returns this mixer's root object.\n\t *\n\t * @return {Object3D} The mixer's root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a clip. Before using this method make\n\t * sure to call {@link AnimationAction#stop} for all related actions.\n\t *\n\t * @param {AnimationClip} clip - The clip to uncache.\n\t */\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a root object. Before using this\n\t * method make sure to call {@link AnimationAction#stop} for all related\n\t * actions or alternatively {@link AnimationMixer#stopAllAction} when the\n\t * mixer operates on a single root.\n\t *\n\t * @param {Object3D} root - The root object to uncache.\n\t */\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for an action. The action is identified by the\n\t * given clip and an optional root object. Before using this method make\n\t * sure to call {@link AnimationAction#stop} to deactivate the action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t */\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a 3D render target.\n *\n * @augments RenderTarget\n */\nclass RenderTarget3D extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget3D = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents a uniform which is a global shader variable. They are passed to shader programs.\n *\n * When declaring a uniform of a {@link ShaderMaterial}, it is declared by value or by object.\n * ```js\n * uniforms: {\n * \ttime: { value: 1.0 },\n * \tresolution: new Uniform( new Vector2() )\n * };\n * ```\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n */\nclass Uniform {\n\n\t/**\n\t * Constructs a new uniform.\n\t *\n\t * @param {any} value - The uniform value.\n\t */\n\tconstructor( value ) {\n\n\t\t/**\n\t\t * The uniform value.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * Returns a new uniform with copied values from this instance.\n\t * If the value has a `clone()` method, the value is cloned as well.\n\t *\n\t * @return {Uniform} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet _id = 0;\n\n/**\n * A class for managing multiple uniforms in a single group. The renderer will process\n * such a definition as a single UBO.\n *\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n *\n * @augments EventDispatcher\n */\nclass UniformsGroup extends EventDispatcher {\n\n\t/**\n\t * Constructs a new uniforms group.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isUniformsGroup = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name UniformsGroup#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\t/**\n\t\t * The name of the uniforms group.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer usage.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * An array holding the uniforms.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.uniforms = [];\n\n\t}\n\n\t/**\n\t * Adds the given uniform to this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to add.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given uniform from this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to remove.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== -1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the name of this uniforms group.\n\t *\n\t * @param {string} name - The name to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the usage of this uniforms group.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Copies the values of the given uniforms group to this instance.\n\t *\n\t * @param {UniformsGroup} source - The uniforms group to copy.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tconst uniforms = Array.isArray( uniformsSource[ i ] ) ? uniformsSource[ i ] : [ uniformsSource[ i ] ];\n\n\t\t\tfor ( let j = 0; j < uniforms.length; j ++ ) {\n\n\t\t\t\tthis.uniforms.push( uniforms[ j ].clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new uniforms group with copied values from this instance.\n\t *\n\t * @return {UniformsGroup} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * An instanced version of an interleaved buffer.\n *\n * @augments InterleavedBuffer\n */\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\t/**\n\t * Constructs a new instanced interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t * @param {number} [meshPerAttribute=1] - Defines how often a value of this interleaved buffer should be repeated.\n\t */\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated,\n\t\t * see {@link InstancedBufferAttribute#meshPerAttribute}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\n/**\n * An alternative version of a buffer attribute with more control over the VBO.\n *\n * The renderer does not construct a VBO for this kind of attribute. Instead, it uses\n * whatever VBO is passed in constructor and can later be altered via the `buffer` property.\n *\n * The most common use case for this class is when some kind of GPGPU calculation interferes\n * or even produces the VBOs in question.\n *\n * Notice that this class can only be used with {@link WebGLRenderer}.\n */\nclass GLBufferAttribute {\n\n\t/**\n\t * Constructs a new GL buffer attribute.\n\t *\n\t * @param {WebGLBuffer} buffer - The native WebGL buffer.\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} itemSize - The item size.\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @param {number} count - The expected number of vertices in VBO.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( buffer, type, itemSize, elementSize, count, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGLBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The native WebGL buffer.\n\t\t *\n\t\t * @type {WebGLBuffer}\n\t\t */\n\t\tthis.buffer = buffer;\n\n\t\t/**\n\t\t * The native data type.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The corresponding size (in bytes) for the given `type` parameter.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.elementSize = elementSize;\n\n\t\t/**\n\t\t * The expected number of vertices in VBO.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `buffer` contains data of `gl.UNSIGNED_SHORT`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the buffer data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the given native WebGL buffer.\n\t *\n\t * @param {WebGLBuffer} buffer - The buffer to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given native data type and element size.\n\t *\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the item size.\n\t *\n\t * @param {number} itemSize - The item size.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the count (the expected number of vertices in VBO).\n\t *\n\t * @param {number} count - The count.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * This class is designed to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3d space the mouse is over)\n * amongst other things.\n */\nclass Raycaster {\n\n\t/**\n\t * Constructs a new raycaster.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t * @param {number} [near=0] - All results returned are further away than near. Near can't be negative.\n\t * @param {number} [far=Infinity] - All results returned are closer than far. Far can't be lower than near.\n\t */\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\t/**\n\t\t * The ray used for raycasting.\n\t\t *\n\t\t * @type {Ray}\n\t\t */\n\t\tthis.ray = new Ray( origin, direction );\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * The camera to use when raycasting against view-dependent objects such as\n\t\t * billboarded objects like sprites. This field can be set manually or\n\t\t * is set when calling `setFromCamera()`.\n\t\t *\n\t\t * @type {?Camera}\n\t\t * @default null\n\t\t */\n\t\tthis.camera = null;\n\n\t\t/**\n\t\t * Allows to selectively ignore 3D objects when performing intersection tests.\n\t\t * The following code example ensures that only 3D objects on layer `1` will be\n\t\t * honored by raycaster.\n\t\t * ```js\n\t\t * raycaster.layers.set( 1 );\n\t\t * object.layers.enable( 1 );\n\t\t * ```\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\n\t\t/**\n\t\t * A parameter object that configures the raycasting. It has the structure:\n\t\t *\n\t\t * ```\n\t\t * {\n\t\t * \tMesh: {},\n\t\t * \tLine: { threshold: 1 },\n\t\t * \tLOD: {},\n\t\t * \tPoints: { threshold: 1 },\n\t\t * \tSprite: {}\n\t\t * }\n\t\t * ```\n\t\t * Where `threshold` is the precision of the raycaster when intersecting objects, in world units.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the ray with a new origin and direction by copying the values from the arguments.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t */\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\t/**\n\t * Uses the given coordinates and camera to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {Vector2} coords - 2D coordinates of the mouse, in normalized device coordinates (NDC).\n\t * X and Y components should be between `-1` and `1`.\n\t * @param {Camera} camera - The camera from which the ray should originate.\n\t */\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, -1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\terror( 'Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses the given WebXR controller to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {WebXRController} controller - The controller to copy the position and direction from.\n\t * @return {Raycaster} A reference to this raycaster.\n\t */\n\tsetFromXRController( controller ) {\n\n\t\t_matrix.identity().extractRotation( controller.matrixWorld );\n\n\t\tthis.ray.origin.setFromMatrixPosition( controller.matrixWorld );\n\t\tthis.ray.direction.set( 0, 0, -1 ).applyMatrix4( _matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The intersection point of a raycaster intersection test.\n\t * @typedef {Object} Raycaster~Intersection\n\t * @property {number} distance - The distance from the ray's origin to the intersection point.\n\t * @property {number} distanceToRay - Some 3D objects e.g. {@link Points} provide the distance of the\n\t * intersection to the nearest point on the ray. For other objects it will be `undefined`.\n\t * @property {Vector3} point - The intersection point, in world coordinates.\n\t * @property {Object} face - The face that has been intersected.\n\t * @property {number} faceIndex - The face index.\n\t * @property {Object3D} object - The 3D object that has been intersected.\n\t * @property {Vector2} uv - U,V coordinates at point of intersection.\n\t * @property {Vector2} uv1 - Second set of U,V coordinates at point of intersection.\n\t * @property {Vector3} uv1 - Interpolated normal vector at point of intersection.\n\t * @property {number} instanceId - The index number of the instance where the ray\n\t * intersects the {@link InstancedMesh}.\n\t */\n\n\t/**\n\t * Checks all intersection between the ray and the object with or without the\n\t * descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * `Raycaster` delegates to the `raycast()` method of the passed 3D object, when\n\t * evaluating whether the ray intersects the object or not. This allows meshes to respond\n\t * differently to ray casting than lines or points.\n\t *\n\t * Note that for meshes, faces must be pointed towards the origin of the ray in order\n\t * to be detected; intersections of the ray passing through the back of a face will not\n\t * be detected. To raycast against both faces of an object, you'll want to set {@link Material#side}\n\t * to `THREE.DoubleSide`.\n\t *\n\t * @param {Object3D} object - The 3D object to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array} An array holding the intersection points.\n\t */\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersect( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\t/**\n\t * Checks all intersection between the ray and the objects with or without\n\t * the descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * @param {Array} objects - The 3D objects to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array} An array holding the intersection points.\n\t */\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersect( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersect( object, raycaster, intersects, recursive ) {\n\n\tlet propagate = true;\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tconst result = object.raycast( raycaster, intersects );\n\n\t\tif ( result === false ) propagate = false;\n\n\t}\n\n\tif ( propagate === true && recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersect( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class is an alternative to {@link Clock} with a different API design and behavior.\n * The goal is to avoid the conceptual flaws that became apparent in `Clock` over time.\n *\n * - `Timer` has an `update()` method that updates its internal state. That makes it possible to\n * call `getDelta()` and `getElapsed()` multiple times per simulation step without getting different values.\n * - The class can make use of the Page Visibility API to avoid large time delta values when the app\n * is inactive (e.g. tab switched or browser hidden).\n *\n * ```js\n * const timer = new Timer();\n * timer.connect( document ); // use Page Visibility API\n * ```\n */\nclass Timer {\n\n\t/**\n\t * Constructs a new timer.\n\t */\n\tconstructor() {\n\n\t\tthis._previousTime = 0;\n\t\tthis._currentTime = 0;\n\t\tthis._startTime = performance.now();\n\n\t\tthis._delta = 0;\n\t\tthis._elapsed = 0;\n\n\t\tthis._timescale = 1;\n\n\t\tthis._document = null;\n\t\tthis._pageVisibilityHandler = null;\n\n\t}\n\n\t/**\n\t * Connect the timer to the given document.Calling this method is not mandatory to\n\t * use the timer but enables the usage of the Page Visibility API to avoid large time\n\t * delta values.\n\t *\n\t * @param {Document} document - The document.\n\t */\n\tconnect( document ) {\n\n\t\tthis._document = document;\n\n\t\t// use Page Visibility API to avoid large time delta values\n\n\t\tif ( document.hidden !== undefined ) {\n\n\t\t\tthis._pageVisibilityHandler = handleVisibilityChange.bind( this );\n\n\t\t\tdocument.addEventListener( 'visibilitychange', this._pageVisibilityHandler, false );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disconnects the timer from the DOM and also disables the usage of the Page Visibility API.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._pageVisibilityHandler !== null ) {\n\n\t\t\tthis._document.removeEventListener( 'visibilitychange', this._pageVisibilityHandler );\n\t\t\tthis._pageVisibilityHandler = null;\n\n\t\t}\n\n\t\tthis._document = null;\n\n\t}\n\n\t/**\n\t * Returns the time delta in seconds.\n\t *\n\t * @return {number} The time delta in second.\n\t */\n\tgetDelta() {\n\n\t\treturn this._delta / 1000;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time in second.\n\t */\n\tgetElapsed() {\n\n\t\treturn this._elapsed / 1000;\n\n\t}\n\n\t/**\n\t * Returns the timescale.\n\t *\n\t * @return {number} The timescale.\n\t */\n\tgetTimescale() {\n\n\t\treturn this._timescale;\n\n\t}\n\n\t/**\n\t * Sets the given timescale which scale the time delta computation\n\t * in `update()`.\n\t *\n\t * @param {number} timescale - The timescale to set.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tsetTimescale( timescale ) {\n\n\t\tthis._timescale = timescale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Resets the time computation for the current simulation step.\n\t *\n\t * @return {Timer} A reference to this timer.\n\t */\n\treset() {\n\n\t\tthis._currentTime = performance.now() - this._startTime;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Can be used to free all internal resources. Usually called when\n\t * the timer instance isn't required anymore.\n\t */\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Updates the internal state of the timer. This method should be called\n\t * once per simulation step and before you perform queries against the timer\n\t * (e.g. via `getDelta()`).\n\t *\n\t * @param {number} timestamp - The current time in milliseconds. Can be obtained\n\t * from the `requestAnimationFrame` callback argument. If not provided, the current\n\t * time will be determined with `performance.now`.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tupdate( timestamp ) {\n\n\t\tif ( this._pageVisibilityHandler !== null && this._document.hidden === true ) {\n\n\t\t\tthis._delta = 0;\n\n\t\t} else {\n\n\t\t\tthis._previousTime = this._currentTime;\n\t\t\tthis._currentTime = ( timestamp !== undefined ? timestamp : performance.now() ) - this._startTime;\n\n\t\t\tthis._delta = ( this._currentTime - this._previousTime ) * this._timescale;\n\t\t\tthis._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction handleVisibilityChange() {\n\n\tif ( this._document.hidden === false ) this.reset();\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Spherical coordinates](https://en.wikipedia.org/wiki/Spherical_coordinate_system).\n */\nclass Spherical {\n\n\t/**\n\t * Constructs a new spherical.\n\t *\n\t * @param {number} [radius=1] - The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t * @param {number} [phi=0] - The polar angle in radians from the y (up) axis.\n\t * @param {number} [theta=0] - The equator/azimuthal angle in radians around the y (up) axis.\n\t */\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\t/**\n\t\t * The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * The polar angle in radians from the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.phi = phi;\n\n\t\t/**\n\t\t * The equator/azimuthal angle in radians around the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t}\n\n\t/**\n\t * Sets the spherical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The polar angle.\n\t * @param {number} theta - The azimuthal angle.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical to this instance.\n\t *\n\t * @param {Spherical} other - The spherical to copy.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Restricts the polar angle [page:.phi phi] to be between `0.000001` and pi -\n\t * `0.000001`.\n\t *\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = clamp( this.phi, EPS, Math.PI - EPS );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The y value.\n\t * @param {number} z - The z value.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, -1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new spherical with copied values from this instance.\n\t *\n\t * @return {Spherical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Cylindrical coordinates](https://en.wikipedia.org/wiki/Cylindrical_coordinate_system).\n */\nclass Cylindrical {\n\n\t/**\n\t * Constructs a new cylindrical.\n\t *\n\t * @param {number} [radius=1] - The distance from the origin to a point in the x-z plane.\n\t * @param {number} [theta=0] - A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t * @param {number} [y=0] - The height above the x-z plane.\n\t */\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\t/**\n\t\t * The distance from the origin to a point in the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t\t/**\n\t\t * The height above the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle.\n\t * @param {number} y - The height value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given cylindrical to this instance.\n\t *\n\t * @param {Cylindrical} other - The cylindrical to copy.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The x value.\n\t * @param {number} z - The x value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new cylindrical with copied values from this instance.\n\t *\n\t * @return {Cylindrical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 2x2 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix2#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix2#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix2();\n * m.set( 11, 12,\n * 21, 22 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21,\n * 12, 22 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix2 {\n\n\t/**\n\t * Constructs a new 2x2 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t */\n\tconstructor( n11, n12, n21, n22 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix2.prototype.isMatrix2 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n21, n22 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 2x2 identity matrix.\n\t *\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} n11 - 1-1 matrix element.\n\t * @param {number} n12 - 1-2 matrix element.\n\t * @param {number} n21 - 2-1 matrix element.\n\t * @param {number} n22 - 2-2 matrix element.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tset( n11, n12, n21, n22 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 2 ] = n12;\n\t\tte[ 1 ] = n21; te[ 3 ] = n22;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 2D space.\n */\nclass Box2 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector2} [min=(Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector2} [max=(-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox2 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector2} min - The lower boundary of the box.\n\t * @param {Vector2} max - The upper boundary of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} points - An array holding 2D position data as instances of {@link Vector2}.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector2} center - The center of the box.\n\t * @param {Vector2} size - The x and y dimensions of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box2} box - The box to copy.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 2D.\n\t *\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector2} point - The point that should be included by the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions.\n\t *\n\t * @param {Vector2} vector - The vector that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector2} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width and height.\n\t *\n\t * @param {Vector2} point - A point in 2D space.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} A point as a proportion of this box's width and height.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector2} point - The point to clamp.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector2} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$4 ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box2} box - The bounding box to intersect with.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box2} box - The bounding box that will be unioned with this instance.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 2D space.\n\t *\n\t * @param {Vector2} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box2} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nconst _d1 = /*@__PURE__*/ new Vector3();\nconst _d2 = /*@__PURE__*/ new Vector3();\nconst _r = /*@__PURE__*/ new Vector3();\nconst _c1 = /*@__PURE__*/ new Vector3();\nconst _c2 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical line segment in 3D space represented by a start and end point.\n */\nclass Line3 {\n\n\t/**\n\t * Constructs a new line segment.\n\t *\n\t * @param {Vector3} [start=(0,0,0)] - Start of the line segment.\n\t * @param {Vector3} [end=(0,0,0)] - End of the line segment.\n\t */\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\t/**\n\t\t * Start of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.start = start;\n\n\t\t/**\n\t\t * End of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.end = end;\n\n\t}\n\n\t/**\n\t * Sets the start and end values by copying the given vectors.\n\t *\n\t * @param {Vector3} start - The start point.\n\t * @param {Vector3} end - The end point.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given line segment to this instance.\n\t *\n\t * @param {Line3} line - The line segment to copy.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the center of the line segment.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the delta vector of the line segment's start and end point.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\t/**\n\t * Returns the squared Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The squared Euclidean distance.\n\t */\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\t/**\n\t * Returns the Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The Euclidean distance.\n\t */\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\t/**\n\t * Returns a vector at a certain position along the line segment.\n\t *\n\t * @param {number} t - A value between `[0,1]` to represent a position along the line segment.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns a point parameter based on the closest point as projected on the line segment.\n\t *\n\t * @param {Vector3} point - The point for which to return a point parameter.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @return {number} The point parameter.\n\t */\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns the closest point on the line for a given point.\n\t *\n\t * @param {Vector3} point - The point to compute the closest point on the line for.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the line.\n\t */\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns the closest squared distance between this line segment and the given one.\n\t *\n\t * @param {Line3} line - The line segment to compute the closest squared distance to.\n\t * @param {Vector3} [c1] - The closest point on this line segment.\n\t * @param {Vector3} [c2] - The closest point on the given line segment.\n\t * @return {number} The squared distance between this line segment and the given one.\n\t */\n\tdistanceSqToLine3( line, c1 = _c1, c2 = _c2 ) {\n\n\t\t// from Real-Time Collision Detection by Christer Ericson, chapter 5.1.9\n\n\t\t// Computes closest points C1 and C2 of S1(s)=P1+s*(Q1-P1) and\n\t\t// S2(t)=P2+t*(Q2-P2), returning s and t. Function result is squared\n\t\t// distance between between S1(s) and S2(t)\n\n\t\tconst EPSILON = 1e-8 * 1e-8; // must be squared since we compare squared length\n\t\tlet s, t;\n\n\t\tconst p1 = this.start;\n\t\tconst p2 = line.start;\n\t\tconst q1 = this.end;\n\t\tconst q2 = line.end;\n\n\t\t_d1.subVectors( q1, p1 ); // Direction vector of segment S1\n\t\t_d2.subVectors( q2, p2 ); // Direction vector of segment S2\n\t\t_r.subVectors( p1, p2 );\n\n\t\tconst a = _d1.dot( _d1 ); // Squared length of segment S1, always nonnegative\n\t\tconst e = _d2.dot( _d2 ); // Squared length of segment S2, always nonnegative\n\t\tconst f = _d2.dot( _r );\n\n\t\t// Check if either or both segments degenerate into points\n\n\t\tif ( a <= EPSILON && e <= EPSILON ) {\n\n\t\t\t// Both segments degenerate into points\n\n\t\t\tc1.copy( p1 );\n\t\t\tc2.copy( p2 );\n\n\t\t\tc1.sub( c2 );\n\n\t\t\treturn c1.dot( c1 );\n\n\t\t}\n\n\t\tif ( a <= EPSILON ) {\n\n\t\t\t// First segment degenerates into a point\n\n\t\t\ts = 0;\n\t\t\tt = f / e; // s = 0 => t = (b*s + f) / e = f / e\n\t\t\tt = clamp( t, 0, 1 );\n\n\n\t\t} else {\n\n\t\t\tconst c = _d1.dot( _r );\n\n\t\t\tif ( e <= EPSILON ) {\n\n\t\t\t\t// Second segment degenerates into a point\n\n\t\t\t\tt = 0;\n\t\t\t\ts = clamp( - c / a, 0, 1 ); // t = 0 => s = (b*t - c) / a = -c / a\n\n\t\t\t} else {\n\n\t\t\t\t// The general nondegenerate case starts here\n\n\t\t\t\tconst b = _d1.dot( _d2 );\n\t\t\t\tconst denom = a * e - b * b; // Always nonnegative\n\n\t\t\t\t// If segments not parallel, compute closest point on L1 to L2 and\n\t\t\t\t// clamp to segment S1. Else pick arbitrary s (here 0)\n\n\t\t\t\tif ( denom !== 0 ) {\n\n\t\t\t\t\ts = clamp( ( b * f - c * e ) / denom, 0, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ts = 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Compute point on L2 closest to S1(s) using\n\t\t\t\t// t = Dot((P1 + D1*s) - P2,D2) / Dot(D2,D2) = (b*s + f) / e\n\n\t\t\t\tt = ( b * s + f ) / e;\n\n\t\t\t\t// If t in [0,1] done. Else clamp t, recompute s for the new value\n\t\t\t\t// of t using s = Dot((P2 + D2*t) - P1,D1) / Dot(D1,D1)= (t*b - c) / a\n\t\t\t\t// and clamp s to [0, 1]\n\n\t\t\t\tif ( t < 0 ) {\n\n\t\t\t\t\tt = 0.;\n\t\t\t\t\ts = clamp( - c / a, 0, 1 );\n\n\t\t\t\t} else if ( t > 1 ) {\n\n\t\t\t\t\tt = 1;\n\t\t\t\t\ts = clamp( ( b - c ) / a, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tc1.copy( p1 ).add( _d1.multiplyScalar( s ) );\n\t\tc2.copy( p2 ).add( _d2.multiplyScalar( t ) );\n\n\t\tc1.sub( c2 );\n\n\t\treturn c1.dot( c1 );\n\n\t}\n\n\t/**\n\t * Applies a 4x4 transformation matrix to this line segment.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this line segment is equal with the given one.\n\t *\n\t * @param {Line3} line - The line segment to test for equality.\n\t * @return {boolean} Whether this line segment is equal with the given one.\n\t */\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\t/**\n\t * Returns a new line segment with copied values from this instance.\n\t *\n\t * @return {Line3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * This displays a cone shaped helper object for a {@link SpotLight}.\n *\n * ```js\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 10, 10, 10 );\n * scene.add( spotLight );\n *\n * const spotLightHelper = new THREE.SpotLightHelper( spotLight );\n * scene.add( spotLightHelper );\n * ```\n *\n * @augments Object3D\n */\nclass SpotLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new spot light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {SpotLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'SpotLightHelper';\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t-1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, -1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t// update the local matrix based on the parent and light target transforms\n\t\tif ( this.parent ) {\n\n\t\t\tthis.parent.updateWorldMatrix( true );\n\n\t\t\tthis.matrix\n\t\t\t\t.copy( this.parent.matrixWorld )\n\t\t\t\t.invert()\n\t\t\t\t.multiply( this.light.matrixWorld );\n\n\t\t} else {\n\n\t\t\tthis.matrix.copy( this.light.matrixWorld );\n\n\t\t}\n\n\t\tthis.matrixWorld.copy( this.light.matrixWorld );\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n/**\n * A helper object to assist with visualizing a {@link Skeleton}.\n *\n * ```js\n * const helper = new THREE.SkeletonHelper( skinnedMesh );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass SkeletonHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new skeleton helper.\n\t *\n\t * @param {Object3D} object - Usually an instance of {@link SkinnedMesh}. However, any 3D object\n\t * can be used if it represents a hierarchy of bones (see {@link Bone}).\n\t */\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\t/**\n\t\t * The object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.root = object;\n\n\t\t/**\n\t\t * The list of bones that the helper visualizes.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t// colors\n\n\t\tconst color1 = new Color( 0x0000ff );\n\t\tconst color2 = new Color( 0x00ff00 );\n\n\t\tthis.setColors( color1, color2 );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} color1 - The first line color for each bone.\n\t * @param {Color} color2 - The second line color for each bone.\n\t * @return {SkeletonHelper} A reference to this helper.\n\t */\n\tsetColors( color1, color2 ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\tfor ( let i = 0; i < colorAttribute.count; i += 2 ) {\n\n\t\t\tcolorAttribute.setXYZ( i, color1.r, color1.g, color1.b );\n\t\t\tcolorAttribute.setXYZ( i + 1, color2.r, color2.g, color2.b );\n\n\t\t}\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push( ...getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\n/**\n * This displays a helper object consisting of a spherical mesh for\n * visualizing an instance of {@link PointLight}.\n *\n * ```js\n * const pointLight = new THREE.PointLight( 0xff0000, 1, 100 );\n * pointLight.position.set( 10, 10, 10 );\n * scene.add( pointLight );\n *\n * const sphereSize = 1;\n * const pointLightHelper = new THREE.PointLightHelper( pointLight, sphereSize );\n * scene.add( pointLightHelper );\n * ```\n *\n * @augments Mesh\n */\nclass PointLightHelper extends Mesh {\n\n\t/**\n\t * Constructs a new point light helper.\n\t *\n\t * @param {PointLight} light - The light to be visualized.\n\t * @param {number} [sphereSize=1] - The size of the sphere helper.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\n/**\n * Creates a visual aid consisting of a spherical mesh for a\n * given {@link HemisphereLight}.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * const helper = new THREE.HemisphereLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass HemisphereLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new hemisphere light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The size of the mesh used to visualize the light.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'HemisphereLightHelper';\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\n/**\n * The helper is an object to define grids. Grids are two-dimensional\n * arrays of lines.\n *\n * ```js\n * const size = 10;\n * const divisions = 10;\n *\n * const gridHelper = new THREE.GridHelper( size, divisions );\n * scene.add( gridHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass GridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new grid helper.\n\t *\n\t * @param {number} [size=10] - The size of the grid.\n\t * @param {number} [divisions=10] - The number of divisions across the grid.\n\t * @param {number|Color|string} [color1=0x444444] - The color of the center line.\n\t * @param {number|Color|string} [color2=0x888888] - The color of the lines of the grid.\n\t */\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This helper is an object to define polar grids. Grids are\n * two-dimensional arrays of lines.\n *\n * ```js\n * const radius = 10;\n * const sectors = 16;\n * const rings = 8;\n * const divisions = 64;\n *\n * const helper = new THREE.PolarGridHelper( radius, sectors, rings, divisions );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass PolarGridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new polar grid helper.\n\t *\n\t * @param {number} [radius=10] - The radius of the polar grid. This can be any positive number.\n\t * @param {number} [sectors=16] - The number of sectors the grid will be divided into. This can be any positive integer.\n\t * @param {number} [rings=16] - The number of rings. This can be any positive integer.\n\t * @param {number} [divisions=64] - The number of line segments used for each circle. This can be any positive integer.\n\t * @param {number|Color|string} [color1=0x444444] - The first color used for grid elements.\n\t * @param {number|Color|string} [color2=0x888888] - The second color used for grid elements.\n\t */\n\tconstructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\n\t\tif ( sectors > 1 ) {\n\n\t\t\tfor ( let i = 0; i < sectors; i ++ ) {\n\n\t\t\t\tconst v = ( i / sectors ) * ( Math.PI * 2 );\n\n\t\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( x, 0, z );\n\n\t\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create the rings\n\n\t\tfor ( let i = 0; i < rings; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / rings * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Helper object to assist with visualizing a {@link DirectionalLight}'s\n * effect on the scene. This consists of plane and a line representing the\n * light's position and direction.\n *\n * ```js\n * const light = new THREE.DirectionalLight( 0xFFFFFF );\n * scene.add( light );\n *\n * const helper = new THREE.DirectionalLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass DirectionalLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new directional light helper.\n\t *\n\t * @param {DirectionalLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The dimensions of the plane.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {DirectionalLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'DirectionalLightHelper';\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\t/**\n\t\t * Contains the line showing the location of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\t/**\n\t\t * Represents the target line of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n * This helps with visualizing what a camera contains in its frustum. It\n * visualizes the frustum of a camera using a line segments.\n *\n * Based on frustum visualization in [lightgl.js shadowmap example](https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html).\n *\n * `CameraHelper` must be a child of the scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );\n * const helper = new THREE.CameraHelper( camera );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass CameraHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Camera} camera - The camera to visualize.\n\t */\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\t/**\n\t\t * The camera being visualized.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * This contains the points used to visualize the camera.\n\t\t *\n\t\t * @type {Object>}\n\t\t */\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} frustum - The frustum line color.\n\t * @param {Color} cone - The cone line color.\n\t * @param {Color} up - The up line color.\n\t * @param {Color} target - The target line color.\n\t * @param {Color} cross - The cross line color.\n\t * @return {CameraHelper} A reference to this helper.\n\t */\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the helper based on the projection matrix of the camera.\n\t */\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\tlet nearZ, farZ;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// Adjust z values based on coordinate system\n\n\t\tif ( this.camera.reversedDepth === true ) {\n\n\t\t\tnearZ = 1;\n\t\t\tfarZ = 0;\n\n\t\t} else {\n\n\t\t\tif ( this.camera.coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tnearZ = -1;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else if ( this.camera.coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tnearZ = 0;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.CameraHelper.update(): Invalid coordinate system: ' + this.camera.coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// center / target\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, nearZ );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, farZ );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, nearZ );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, nearZ );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, nearZ );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, nearZ );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, farZ );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, farZ );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, farZ );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, farZ );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, nearZ );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, farZ );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, farZ );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, farZ );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, farZ );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, nearZ );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, nearZ );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, nearZ );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, nearZ );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\n/**\n * Helper object to graphically show the world-axis-aligned bounding box\n * around an object. The actual bounding box is handled with {@link Box3},\n * this is just a visual helper for debugging. It can be automatically\n * resized with {@link BoxHelper#update} when the object it's created from\n * is transformed. Note that the object must have a geometry for this to work,\n * so it won't work with sprites.\n *\n * ```js\n * const sphere = new THREE.SphereGeometry();\n * const object = new THREE.Mesh( sphere, new THREE.MeshBasicMaterial( 0xff0000 ) );\n * const box = new THREE.BoxHelper( object, 0xffff00 );\n * scene.add( box );\n * ```\n *\n * @augments LineSegments\n */\nclass BoxHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new box helper.\n\t *\n\t * @param {Object3D} [object] - The 3D object to show the world-axis-aligned bounding box.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The 3D object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Updates the helper's geometry to match the dimensions of the object,\n\t * including any children.\n\t */\n\tupdate() {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\t/**\n\t * Updates the wireframe box for the passed object.\n\t *\n\t * @param {Object3D} object - The 3D object to create the helper for.\n\t * @return {BoxHelper} A reference to this instance.\n\t */\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Box3}.\n *\n * ```js\n * const box = new THREE.Box3();\n * box.setFromCenterAndSize( new THREE.Vector3( 1, 1, 1 ), new THREE.Vector3( 2, 1, 3 ) );\n *\n * const helper = new THREE.Box3Helper( box, 0xffff00 );\n * scene.add( helper )\n * ```\n *\n * @augments LineSegments\n */\nclass Box3Helper extends LineSegments {\n\n\t/**\n\t * Constructs a new box3 helper.\n\t *\n\t * @param {Box3} box - The box to visualize.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The box being visualized.\n\t\t *\n\t\t * @type {Box3}\n\t\t */\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Plane}.\n *\n * ```js\n * const plane = new THREE.Plane( new THREE.Vector3( 1, 1, 0.2 ), 3 );\n * const helper = new THREE.PlaneHelper( plane, 1, 0xffff00 );\n * scene.add( helper );\n * ```\n *\n * @augments Line\n */\nclass PlaneHelper extends Line {\n\n\t/**\n\t * Constructs a new plane helper.\n\t *\n\t * @param {Plane} plane - The plane to be visualized.\n\t * @param {number} [size=1] - The side length of plane helper.\n\t * @param {number|Color|string} [hex=0xffff00] - The helper's color.\n\t */\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\t/**\n\t\t * The plane being visualized.\n\t\t *\n\t\t * @type {Plane}\n\t\t */\n\t\tthis.plane = plane;\n\n\t\t/**\n\t\t * The side length of plane helper.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\n/**\n * An 3D arrow object for visualizing directions.\n *\n * ```js\n * const dir = new THREE.Vector3( 1, 2, 0 );\n *\n * //normalize the direction vector (convert to vector of length 1)\n * dir.normalize();\n *\n * const origin = new THREE.Vector3( 0, 0, 0 );\n * const length = 1;\n * const hex = 0xffff00;\n *\n * const arrowHelper = new THREE.ArrowHelper( dir, origin, length, hex );\n * scene.add( arrowHelper );\n * ```\n *\n * @augments Object3D\n */\nclass ArrowHelper extends Object3D {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Vector3} [dir=(0, 0, 1)] - The (normalized) direction vector.\n\t * @param {Vector3} [origin=(0, 0, 0)] - Point at which the arrow starts.\n\t * @param {number} [length=1] - Length of the arrow in world units.\n\t * @param {(number|Color|string)} [color=0xffff00] - Color of the arrow.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new ConeGeometry( 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, -0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\t/**\n\t\t * The line part of the arrow helper.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\t/**\n\t\t * The cone part of the arrow helper.\n\t\t *\n\t\t * @type {Mesh}\n\t\t */\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\t/**\n\t * Sets the direction of the helper.\n\t *\n\t * @param {Vector3} dir - The normalized direction vector.\n\t */\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < -0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the length of the helper.\n\t *\n\t * @param {number} length - Length of the arrow in world units.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\t/**\n\t * Sets the color of the helper.\n\t *\n\t * @param {number|Color|string} color - The color to set.\n\t */\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.line.geometry.dispose();\n\t\tthis.line.material.dispose();\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n}\n\n/**\n * An axis object to visualize the 3 axes in a simple way.\n * The X axis is red. The Y axis is green. The Z axis is blue.\n *\n * ```js\n * const axesHelper = new THREE.AxesHelper( 5 );\n * scene.add( axesHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass AxesHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new axes helper.\n\t *\n\t * @param {number} [size=1] - Size of the lines representing the axes.\n\t */\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\t/**\n\t * Defines the colors of the axes helper.\n\t *\n\t * @param {number|Color|string} xAxisColor - The color for the x axis.\n\t * @param {number|Color|string} yAxisColor - The color for the y axis.\n\t * @param {number|Color|string} zAxisColor - The color for the z axis.\n\t * @return {AxesHelper} A reference to this axes helper.\n\t */\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This class is used to convert a series of paths to an array of\n * shapes. It is specifically used in context of fonts and SVG.\n */\nclass ShapePath {\n\n\t/**\n\t * Constructs a new shape path.\n\t */\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\t/**\n\t\t * The color of the shape.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color();\n\n\t\t/**\n\t\t * The paths that have been generated for this shape.\n\t\t *\n\t\t * @type {Array}\n\t\t * @default null\n\t\t */\n\t\tthis.subPaths = [];\n\n\t\t/**\n\t\t * The current path that is being generated.\n\t\t *\n\t\t * @type {?Path}\n\t\t * @default null\n\t\t */\n\t\tthis.currentPath = null;\n\n\t}\n\n\t/**\n\t * Creates a new path and moves it current point to the given one.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array} pts - An array of points in 2D space.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts the paths into an array of shapes.\n\t *\n\t * @param {boolean} isCCW - By default solid shapes are defined clockwise (CW) and holes are defined counterclockwise (CCW).\n\t * If this flag is set to `true`, then those are flipped.\n\t * @return {Array} An array of shapes.\n\t */\n\ttoShapes( isCCW ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\n/**\n * Abstract base class for controls.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Controls extends EventDispatcher {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The object that is managed by the controls.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The HTML element used for event listeners.\n\t\t *\n\t\t * @type {?HTMLElement}\n\t\t * @default null\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\t/**\n\t\t * Whether the controls responds to user input or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * The internal state of the controls.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.state = -1;\n\n\t\t/**\n\t\t * This object defines the keyboard input of the controls.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.keys = {};\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to the available mouse buttons.\n\t\t * It depends on the control implementation what kind of mouse buttons and actions are supported.\n\t\t *\n\t\t * @type {{LEFT: ?number, MIDDLE: ?number, RIGHT: ?number}}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: null, MIDDLE: null, RIGHT: null };\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to what kind of touch interaction.\n\t\t * It depends on the control implementation what kind of touch interaction and actions are supported.\n\t\t *\n\t\t * @type {{ONE: ?number, TWO: ?number}}\n\t\t */\n\t\tthis.touches = { ONE: null, TWO: null };\n\n\t}\n\n\t/**\n\t * Connects the controls to the DOM. This method has so called \"side effects\" since\n\t * it adds the module's event listeners to the DOM.\n\t *\n\t * @param {HTMLElement} element - The DOM element to connect to.\n\t */\n\tconnect( element ) {\n\n\t\tif ( element === undefined ) {\n\n\t\t\twarn( 'Controls: connect() now requires an element.' ); // @deprecated, the warning can be removed with r185\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.domElement !== null ) this.disconnect();\n\n\t\tthis.domElement = element;\n\n\t}\n\n\t/**\n\t * Disconnects the controls from the DOM.\n\t */\n\tdisconnect() {}\n\n\t/**\n\t * Call this method if you no longer want use to the controls. It frees all internal\n\t * resources and removes all event listeners.\n\t */\n\tdispose() {}\n\n\t/**\n\t * Controls should implement this method if they have to update their internal state\n\t * per simulation step.\n\t *\n\t * @param {number} [delta] - The time delta in seconds.\n\t */\n\tupdate( /* delta */ ) {}\n\n}\n\n/**\n * Scales the texture as large as possible within its surface without cropping\n * or stretching the texture. The method preserves the original aspect ratio of\n * the texture. Akin to CSS `object-fit: contain`\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction contain( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t} else {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Scales the texture to the smallest possible size to fill the surface, leaving\n * no empty space. The method preserves the original aspect ratio of the texture.\n * Akin to CSS `object-fit: cover`.\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction cover( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t} else {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n *\n * @param {Texture} texture - The texture.\n * @return {Texture} The updated texture.\n */\nfunction fill( texture ) {\n\n\ttexture.repeat.x = 1;\n\ttexture.repeat.y = 1;\n\n\ttexture.offset.x = 0;\n\ttexture.offset.y = 0;\n\n\treturn texture;\n\n}\n\n/**\n * Determines how many bytes must be used to represent the texture.\n *\n * @param {number} width - The width of the texture.\n * @param {number} height - The height of the texture.\n * @param {number} format - The texture's format.\n * @param {number} type - The texture's type.\n * @return {number} The byte length.\n */\nfunction getByteLength( width, height, format, type ) {\n\n\tconst typeByteLength = getTextureTypeByteLength( type );\n\n\tswitch ( format ) {\n\n\t\t// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml\n\t\tcase AlphaFormat:\n\t\t\treturn width * height;\n\t\tcase RedFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RedIntegerFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGIntegerFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBFormat:\n\t\t\treturn ( ( width * height * 3 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAIntegerFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/\n\t\tcase RGB_S3TC_DXT1_Format:\n\t\tcase RGBA_S3TC_DXT1_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_S3TC_DXT3_Format:\n\t\tcase RGBA_S3TC_DXT5_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/\n\t\tcase RGB_PVRTC_2BPPV1_Format:\n\t\tcase RGBA_PVRTC_2BPPV1_Format:\n\t\t\treturn ( Math.max( width, 16 ) * Math.max( height, 8 ) ) / 4;\n\t\tcase RGB_PVRTC_4BPPV1_Format:\n\t\tcase RGBA_PVRTC_4BPPV1_Format:\n\t\t\treturn ( Math.max( width, 8 ) * Math.max( height, 8 ) ) / 2;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/\n\t\tcase RGB_ETC1_Format:\n\t\tcase RGB_ETC2_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_ETC2_EAC_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/\n\t\tcase RGBA_ASTC_4x4_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x4_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x5_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x5_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x6_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x5_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_8x6_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x8_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x5_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_10x6_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_10x8_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x10_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x10_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x12_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 11 ) / 12 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/\n\t\tcase RGBA_BPTC_Format:\n\t\tcase RGB_BPTC_SIGNED_Format:\n\t\tcase RGB_BPTC_UNSIGNED_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/\n\t\tcase RED_RGTC1_Format:\n\t\tcase SIGNED_RED_RGTC1_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 8;\n\t\tcase RED_GREEN_RGTC2_Format:\n\t\tcase SIGNED_RED_GREEN_RGTC2_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t}\n\n\tthrow new Error(\n\t\t`Unable to determine texture byte length for ${format} format.`,\n\t);\n\n}\n\nfunction getTextureTypeByteLength( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase UnsignedByteType:\n\t\tcase ByteType:\n\t\t\treturn { byteLength: 1, components: 1 };\n\t\tcase UnsignedShortType:\n\t\tcase ShortType:\n\t\tcase HalfFloatType:\n\t\t\treturn { byteLength: 2, components: 1 };\n\t\tcase UnsignedShort4444Type:\n\t\tcase UnsignedShort5551Type:\n\t\t\treturn { byteLength: 2, components: 4 };\n\t\tcase UnsignedIntType:\n\t\tcase IntType:\n\t\tcase FloatType:\n\t\t\treturn { byteLength: 4, components: 1 };\n\t\tcase UnsignedInt5999Type:\n\t\tcase UnsignedInt101111Type:\n\t\t\treturn { byteLength: 4, components: 3 };\n\n\t}\n\n\tthrow new Error( `Unknown texture type ${type}.` );\n\n}\n\n/**\n * A class containing utility functions for textures.\n *\n * @hideconstructor\n */\nclass TextureUtils {\n\n\t/**\n\t * Scales the texture as large as possible within its surface without cropping\n\t * or stretching the texture. The method preserves the original aspect ratio of\n\t * the texture. Akin to CSS `object-fit: contain`\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic contain( texture, aspect ) {\n\n\t\treturn contain( texture, aspect );\n\n\t}\n\n\t/**\n\t * Scales the texture to the smallest possible size to fill the surface, leaving\n\t * no empty space. The method preserves the original aspect ratio of the texture.\n\t * Akin to CSS `object-fit: cover`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic cover( texture, aspect ) {\n\n\t\treturn cover( texture, aspect );\n\n\t}\n\n\t/**\n\t * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic fill( texture ) {\n\n\t\treturn fill( texture );\n\n\t}\n\n\t/**\n\t * Determines how many bytes must be used to represent the texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} format - The texture's format.\n\t * @param {number} type - The texture's type.\n\t * @return {number} The byte length.\n\t */\n\tstatic getByteLength( width, height, format, type ) {\n\n\t\treturn getByteLength( width, height, format, type );\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\twarn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, Controls, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, FrustumArray, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RAD2DEG, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDepthPacking, RGBFormat, RGBIntegerFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGDepthPacking, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RenderTarget3D, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGPUCoordinateSystem, WebXRController, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, arrayNeedsUint32, cloneUniforms, createCanvasElement, createElementNS, error, getByteLength, getConsoleFunction, getUnlitUniformColorSpace, log, mergeUniforms, probeAsync, setConsoleFunction, warn, warnOnce };\n","/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nimport { Matrix3, Vector2, Color, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, BackSide, cloneUniforms, Euler, Matrix4, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, IntType, warn, HalfFloatType, UnsignedByteType, FloatType, RGBAFormat, Plane, EquirectangularReflectionMapping, EquirectangularRefractionMapping, WebGLCubeRenderTarget, CubeReflectionMapping, CubeRefractionMapping, BufferGeometry, OrthographicCamera, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, error, NoBlending, WebGLRenderTarget, BufferAttribute, LinearSRGBColorSpace, LinearFilter, warnOnce, Uint32BufferAttribute, Uint16BufferAttribute, arrayNeedsUint32, Vector4, DataArrayTexture, CubeTexture, Data3DTexture, LessEqualCompare, DepthTexture, Texture, GLSL3, PCFShadowMap, PCFSoftShadowMap, VSMShadowMap, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, LinearTransfer, AddOperation, MixOperation, MultiplyOperation, UniformsUtils, DoubleSide, NormalBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, Layers, Frustum, MeshDepthMaterial, RGBADepthPacking, MeshDistanceMaterial, NearestFilter, LessEqualDepth, ReverseSubtractEquation, SubtractEquation, AddEquation, OneMinusConstantAlphaFactor, ConstantAlphaFactor, OneMinusConstantColorFactor, ConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, DstAlphaFactor, DstColorFactor, SrcAlphaSaturateFactor, SrcAlphaFactor, SrcColorFactor, OneFactor, ZeroFactor, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceNone, CullFaceBack, CullFaceFront, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, MinEquation, MaxEquation, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NotEqualCompare, GreaterCompare, GreaterEqualCompare, EqualCompare, LessCompare, AlwaysCompare, NeverCompare, NoColorSpace, DepthStencilFormat, getByteLength, DepthFormat, UnsignedIntType, UnsignedInt248Type, UnsignedShortType, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, UnsignedInt101111Type, ByteType, ShortType, AlphaFormat, RGBFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, ExternalTexture, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, DataTexture, createCanvasElement, SRGBColorSpace, REVISION, log, WebGLCoordinateSystem, probeAsync } from './three.core.js';\nexport { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls, CubeCamera, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CylinderGeometry, Cylindrical, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualStencilFunc, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, Fog, FogExp2, FramebufferTexture, FrustumArray, GLBufferAttribute, GLSL1, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverStencilFunc, NormalAnimationBlendMode, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, OctahedronGeometry, Path, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBDepthPacking, RGBIntegerFormat, RGDepthPacking, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RenderTarget, RenderTarget3D, ReplaceStencilOp, RingGeometry, Scene, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, TOUCH, TetrahedronGeometry, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroSlopeEnding, ZeroStencilOp, getConsoleFunction, setConsoleFunction } from './three.core.js';\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl ) {\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\t\tconst size = array.byteLength;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( typeof Float16Array !== 'undefined' && array instanceof Float16Array ) {\n\n\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version,\n\t\t\tsize: size\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRanges = attribute.updateRanges;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\t// Not using update ranges\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.bufferSubData`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif ( range.start <= previousRange.start + previousRange.count + 1 ) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tgl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, range.start, range.count );\n\n\t\t\t}\n\n\t\t\tattribute.clearUpdateRanges();\n\n\t\t}\n\n\t\tattribute.onUploadCallback();\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tif ( data.size !== attribute.array.byteLength ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' );\n\n\t\t\t}\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nvar alphahash_fragment = \"#ifdef USE_ALPHAHASH\\n\\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\\n#endif\";\n\nvar alphahash_pars_fragment = \"#ifdef USE_ALPHAHASH\\n\\tconst float ALPHA_HASH_SCALE = 0.05;\\n\\tfloat hash2D( vec2 value ) {\\n\\t\\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\\n\\t}\\n\\tfloat hash3D( vec3 value ) {\\n\\t\\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\\n\\t}\\n\\tfloat getAlphaHashThreshold( vec3 position ) {\\n\\t\\tfloat maxDeriv = max(\\n\\t\\t\\tlength( dFdx( position.xyz ) ),\\n\\t\\t\\tlength( dFdy( position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\\n\\t\\tvec2 pixScales = vec2(\\n\\t\\t\\texp2( floor( log2( pixScale ) ) ),\\n\\t\\t\\texp2( ceil( log2( pixScale ) ) )\\n\\t\\t);\\n\\t\\tvec2 alpha = vec2(\\n\\t\\t\\thash3D( floor( pixScales.x * position.xyz ) ),\\n\\t\\t\\thash3D( floor( pixScales.y * position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat lerpFactor = fract( log2( pixScale ) );\\n\\t\\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\\n\\t\\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\\n\\t\\tvec3 cases = vec3(\\n\\t\\t\\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\\n\\t\\t\\t( x - 0.5 * a ) / ( 1.0 - a ),\\n\\t\\t\\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\\n\\t\\t);\\n\\t\\tfloat threshold = ( x < ( 1.0 - a ) )\\n\\t\\t\\t? ( ( x < a ) ? cases.x : cases.y )\\n\\t\\t\\t: cases.z;\\n\\t\\treturn clamp( threshold , 1.0e-6, 1.0 );\\n\\t}\\n#endif\";\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\\n\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n\\t#endif\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_CLEARCOAT ) \\n\\t\\tclearcoatSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_SHEEN ) \\n\\t\\tsheenSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar batching_pars_vertex = \"#ifdef USE_BATCHING\\n\\t#if ! defined( GL_ANGLE_multi_draw )\\n\\t#define gl_DrawID _gl_DrawID\\n\\tuniform int _gl_DrawID;\\n\\t#endif\\n\\tuniform highp sampler2D batchingTexture;\\n\\tuniform highp usampler2D batchingIdTexture;\\n\\tmat4 getBatchingMatrix( const in float i ) {\\n\\t\\tint size = textureSize( batchingTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n\\tfloat getIndirectIndex( const in int i ) {\\n\\t\\tint size = textureSize( batchingIdTexture, 0 ).x;\\n\\t\\tint x = i % size;\\n\\t\\tint y = i / size;\\n\\t\\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\\n\\t}\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tuniform sampler2D batchingColorTexture;\\n\\tvec3 getBatchingColor( const in float i ) {\\n\\t\\tint size = textureSize( batchingColorTexture, 0 ).x;\\n\\t\\tint j = int( i );\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\\n\\t}\\n#endif\";\n\nvar batching_vertex = \"#ifdef USE_BATCHING\\n\\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\\n#ifdef USE_ALPHAHASH\\n\\tvPosition = vec3( position );\\n#endif\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"float G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n} // validated\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660, 0.0556434,\\n\\t\\t-1.5371385, 1.8760108, -0.2040259,\\n\\t\\t-0.4985314, 0.0415560, 1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vBumpMapUv );\\n\\t\\tvec2 dSTdy = dFdy( vBumpMapUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\\n\\t\\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\t\\tfloat distanceToPlane, distanceGradient;\\n\\t\\tfloat clipOpacity = 1.0;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\tif ( clipOpacity == 0.0 ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tfloat unionClipOpacity = 1.0;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\t\\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tclipOpacity *= 1.0 - unionClipOpacity;\\n\\t\\t#endif\\n\\t\\tdiffuseColor.a *= clipOpacity;\\n\\t\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tbool clipped = true;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tif ( clipped ) discard;\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\\n\\tvColor.xyz *= batchingColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nvec3 pow2( const in vec3 x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract( sin( sn ) * c );\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\n#ifdef USE_ALPHAHASH\\n\\tvarying vec3 vPosition;\\n#endif\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n} // validated\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define cubeUV_r0 1.0\\n\\t#define cubeUV_m0 - 2.0\\n\\t#define cubeUV_r1 0.8\\n\\t#define cubeUV_m1 - 1.0\\n\\t#define cubeUV_r4 0.4\\n\\t#define cubeUV_m4 2.0\\n\\t#define cubeUV_r5 0.305\\n\\t#define cubeUV_m5 3.0\\n\\t#define cubeUV_r6 0.21\\n\\t#define cubeUV_m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= cubeUV_r1 ) {\\n\\t\\t\\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\\n\\t\\t} else if ( roughness >= cubeUV_r4 ) {\\n\\t\\t\\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\\n\\t\\t} else if ( roughness >= cubeUV_r5 ) {\\n\\t\\t\\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\\n\\t\\t} else if ( roughness >= cubeUV_r6 ) {\\n\\t\\t\\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = objectTangent;\\n#endif\\n#ifdef USE_BATCHING\\n\\tmat3 bm = mat3( batchingMatrix );\\n\\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\\n\\ttransformedNormal = bm * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = bm * transformedTangent;\\n\\t#endif\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmat3 im = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\\n\\ttransformedNormal = im * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = im * transformedTangent;\\n\\t#endif\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\\n\\t\\temissiveColor = sRGBTransferEOTF( emissiveColor );\\n\\t#endif\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar colorspace_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar colorspace_pars_fragment = \"vec4 LinearTransferOETF( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 sRGBTransferEOTF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\\n}\\nvec4 sRGBTransferOETF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\tuniform mat3 envMapRotation;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\tvec2 fw = fwidth( coord ) * 0.5;\\n\\t\\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\\n\\t#endif\\n}\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_fragment = \"LambertMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_lambert_pars_fragment = \"varying vec3 vViewPosition;\\nstruct LambertMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Lambert\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Lambert\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\n#if defined( USE_LIGHT_PROBES )\\n\\tuniform vec3 lightProbe[ 9 ];\\n#endif\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t}\\n\\treturn distanceFalloff;\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\\n\\t\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\t\\tvec3 bentNormal = cross( bitangent, viewDir );\\n\\t\\t\\t\\tbentNormal = normalize( cross( bentNormal, bitangent ) );\\n\\t\\t\\t\\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\\n\\t\\t\\t\\treturn getIBLRadiance( viewDir, bentNormal, roughness );\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\tmaterial.ior = ior;\\n\\t#ifdef USE_SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_DISPERSION\\n\\tmaterial.dispersion = dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\\n\\t\\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\\n\\t\\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\\n\\t#else\\n\\t\\tvec2 anisotropyV = anisotropyVector;\\n\\t#endif\\n\\tmaterial.anisotropy = length( anisotropyV );\\n\\tif( material.anisotropy == 0.0 ) {\\n\\t\\tanisotropyV = vec2( 1.0, 0.0 );\\n\\t} else {\\n\\t\\tanisotropyV /= material.anisotropy;\\n\\t\\tmaterial.anisotropy = saturate( material.anisotropy );\\n\\t}\\n\\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\\n\\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\\n\\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"uniform sampler2D dfgLUT;\\nstruct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\tfloat dispersion;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n\\t#ifdef IOR\\n\\t\\tfloat ior;\\n\\t#endif\\n\\t#ifdef USE_TRANSMISSION\\n\\t\\tfloat transmission;\\n\\t\\tfloat transmissionAlpha;\\n\\t\\tfloat thickness;\\n\\t\\tfloat attenuationDistance;\\n\\t\\tvec3 attenuationColor;\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat anisotropy;\\n\\t\\tfloat alphaT;\\n\\t\\tvec3 anisotropyT;\\n\\t\\tvec3 anisotropyB;\\n\\t#endif\\n};\\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\\nvec3 sheenSpecularDirect = vec3( 0.0 );\\nvec3 sheenSpecularIndirect = vec3(0.0 );\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n float x2 = x * x;\\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\n#ifdef USE_ANISOTROPY\\n\\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\\n\\t\\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\\n\\t\\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\\n\\t\\tfloat v = 0.5 / ( gv + gl );\\n\\t\\treturn saturate(v);\\n\\t}\\n\\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\\n\\t\\tfloat a2 = alphaT * alphaB;\\n\\t\\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\\n\\t\\thighp float v2 = dot( v, v );\\n\\t\\tfloat w2 = a2 / v2;\\n\\t\\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\\n\\t}\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\\n\\t\\tvec3 f0 = material.clearcoatF0;\\n\\t\\tfloat f90 = material.clearcoatF90;\\n\\t\\tfloat roughness = material.clearcoatRoughness;\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 f0 = material.specularColor;\\n\\tfloat f90 = material.specularF90;\\n\\tfloat roughness = material.roughness;\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tF = mix( F, material.iridescenceFresnel, material.iridescence );\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat dotTL = dot( material.anisotropyT, lightDir );\\n\\t\\tfloat dotTV = dot( material.anisotropyT, viewDir );\\n\\t\\tfloat dotTH = dot( material.anisotropyT, halfDir );\\n\\t\\tfloat dotBL = dot( material.anisotropyB, lightDir );\\n\\t\\tfloat dotBV = dot( material.anisotropyB, viewDir );\\n\\t\\tfloat dotBH = dot( material.anisotropyB, halfDir );\\n\\t\\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\\n\\t\\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\\n\\t#else\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t#endif\\n\\treturn F * ( V * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 uv = vec2( roughness, dotNV );\\n\\treturn texture2D( dfgLUT, uv ).rg;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 dfgV = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNV * dotNV), 0.0, dotNV), material.roughness );\\n\\tvec2 dfgL = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNL * dotNL), 0.0, dotNL), material.roughness );\\n\\tvec3 FssEss_V = material.specularColor * dfgV.x + material.specularF90 * dfgV.y;\\n\\tvec3 FssEss_L = material.specularColor * dfgL.x + material.specularF90 * dfgL.y;\\n\\tfloat Ess_V = dfgV.x + dfgV.y;\\n\\tfloat Ess_L = dfgL.x + dfgL.y;\\n\\tfloat Ems_V = 1.0 - Ess_V;\\n\\tfloat Ems_L = 1.0 - Ess_L;\\n\\tvec3 Favg = material.specularColor + ( 1.0 - material.specularColor ) * 0.047619;\\n\\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg * Favg + EPSILON );\\n\\tfloat compensationFactor = Ems_V * Ems_L;\\n\\tvec3 multiScatter = Fms * compensationFactor;\\n\\treturn singleScatter + multiScatter;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometryNormal;\\n\\t\\tvec3 viewDir = geometryViewDir;\\n\\t\\tvec3 position = geometryPosition;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\t#endif\\n\\tvec3 totalScattering = singleScattering + multiScattering;\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nvec3 geometryPosition = - vViewPosition;\\nvec3 geometryNormal = normal;\\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\nvec3 geometryClearcoatNormal = vec3( 0.0 );\\n#ifdef USE_CLEARCOAT\\n\\tgeometryClearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometryPosition, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tvec4 spotColor;\\n\\tvec3 spotLightCoord;\\n\\tbool inSpotLightMap;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\\n\\t\\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\\n\\t\\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\\n\\t\\t#else\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#endif\\n\\t\\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\\n\\t\\t\\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\\n\\t\\t\\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\\n\\t\\t\\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\\n\\t\\t\\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\\n\\t\\t#endif\\n\\t\\t#undef SPOT_LIGHT_MAP_INDEX\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#if defined( USE_LIGHT_PROBES )\\n\\t\\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometryNormal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\\n\\t#else\\n\\t\\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvFragDepth = 1.0 + gl_Position.w;\\n\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t#if defined( USE_POINTS_UV )\\n\\t\\tvec2 uv = vUv;\\n\\t#else\\n\\t\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_POINTS_UV )\\n\\tvarying vec2 vUv;\\n#else\\n\\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t\\tuniform mat3 uvTransform;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphinstance_vertex = \"#ifdef USE_INSTANCING_MORPH\\n\\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\\n\\t}\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_INSTANCING_MORPH\\n\\t\\tuniform float morphTargetBaseInfluence;\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t#endif\\n\\tuniform sampler2DArray morphTargetsTexture;\\n\\tuniform ivec2 morphTargetsTextureSize;\\n\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t}\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = dFdx( vViewPosition );\\n\\tvec3 fdy = dFdy( vViewPosition );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal *= faceDirection;\\n\\t#endif\\n#endif\\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\\n\\t\\t#if defined( USE_NORMALMAP )\\n\\t\\t\\tvNormalMapUv\\n\\t\\t#elif defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tvClearcoatNormalMapUv\\n\\t\\t#else\\n\\t\\t\\tvUv\\n\\t\\t#endif\\n\\t\\t);\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn[0] *= faceDirection;\\n\\t\\ttbn[1] *= faceDirection;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn2[0] *= faceDirection;\\n\\t\\ttbn2[1] *= faceDirection;\\n\\t#endif\\n#endif\\nvec3 nonPerturbedNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\tnormal = normalize( tbn * mapN );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\\n\\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( uv.st );\\n\\t\\tvec2 st1 = dFdy( uv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\\n\\t\\treturn mat3( T * scale, B * scale, N );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = nonPerturbedNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar opaque_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= material.transmissionAlpha;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\\nconst float Inv255 = 1. / 255.;\\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec4( 0., 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec4( 1., 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat af = modf( v * PackFactors.a, vuf );\\n\\tfloat bf = modf( vuf * ShiftRight8, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\\n}\\nvec3 packDepthToRGB( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec3( 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec3( 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat bf = modf( v * PackFactors.b, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\\n}\\nvec2 packDepthToRG( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec2( 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec2( 1., 1. );\\n\\tfloat vuf;\\n\\tfloat gf = modf( v * 256., vuf );\\n\\treturn vec2( vuf * Inv255, gf );\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors4 );\\n}\\nfloat unpackRGBToDepth( const in vec3 v ) {\\n\\treturn dot( v, UnpackFactors3 );\\n}\\nfloat unpackRGToDepth( const in vec2 v ) {\\n\\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\\n}\\nvec4 pack2HalfToRGBA( const in vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( const in vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn depth * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * depth - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_BATCHING\\n\\tmvPosition = batchingMatrix * mvPosition;\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#if NUM_SPOT_LIGHT_MAPS > 0\\n\\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\tfloat depth = unpackRGBAToDepth( texture2D( depths, uv ) );\\n\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\treturn step( depth, compare );\\n\\t\\t#else\\n\\t\\t\\treturn step( compare, depth );\\n\\t\\t#endif\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow( sampler2D shadow, vec2 uv, float compare ) {\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\tfloat hard_shadow = step( distribution.x, compare );\\n\\t\\t#else\\n\\t\\t\\tfloat hard_shadow = step( compare, distribution.x );\\n\\t\\t#endif\\n\\t\\tif ( hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\t\\n\\t\\tfloat lightToPositionLength = length( lightToPosition );\\n\\t\\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\\n\\t\\t\\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\t\\tdp += shadowBias;\\n\\t\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\t\\tshadow = (\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\\n\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\tvec4 shadowWorldPosition;\\n#endif\\n#if defined( USE_SHADOWMAP )\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if NUM_SPOT_LIGHT_COORDS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition;\\n\\t\\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t\\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\\n\\t\\t#endif\\n\\t\\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tint size = textureSize( boneTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn saturate( toneMappingExposure * color );\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 CineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3( 1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108, 1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605, 1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.6605, - 0.1246, - 0.0182 ),\\n\\tvec3( - 0.5876, 1.1329, - 0.1006 ),\\n\\tvec3( - 0.0728, - 0.0083, 1.1187 )\\n);\\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\\n\\tvec3( 0.6274, 0.0691, 0.0164 ),\\n\\tvec3( 0.3293, 0.9195, 0.0880 ),\\n\\tvec3( 0.0433, 0.0113, 0.8956 )\\n);\\nvec3 agxDefaultContrastApprox( vec3 x ) {\\n\\tvec3 x2 = x * x;\\n\\tvec3 x4 = x2 * x2;\\n\\treturn + 15.5 * x4 * x2\\n\\t\\t- 40.14 * x4 * x\\n\\t\\t+ 31.96 * x4\\n\\t\\t- 6.868 * x2 * x\\n\\t\\t+ 0.4298 * x2\\n\\t\\t+ 0.1191 * x\\n\\t\\t- 0.00232;\\n}\\nvec3 AgXToneMapping( vec3 color ) {\\n\\tconst mat3 AgXInsetMatrix = mat3(\\n\\t\\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\\n\\t\\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\\n\\t\\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\\n\\t);\\n\\tconst mat3 AgXOutsetMatrix = mat3(\\n\\t\\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\\n\\t\\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\\n\\t\\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\\n\\t);\\n\\tconst float AgxMinEv = - 12.47393;\\tconst float AgxMaxEv = 4.026069;\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\\n\\tcolor = AgXInsetMatrix * color;\\n\\tcolor = max( color, 1e-10 );\\tcolor = log2( color );\\n\\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\tcolor = agxDefaultContrastApprox( color );\\n\\tcolor = AgXOutsetMatrix * color;\\n\\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\\n\\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\treturn color;\\n}\\nvec3 NeutralToneMapping( vec3 color ) {\\n\\tconst float StartCompression = 0.8 - 0.04;\\n\\tconst float Desaturation = 0.15;\\n\\tcolor *= toneMappingExposure;\\n\\tfloat x = min( color.r, min( color.g, color.b ) );\\n\\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\\n\\tcolor -= offset;\\n\\tfloat peak = max( color.r, max( color.g, color.b ) );\\n\\tif ( peak < StartCompression ) return color;\\n\\tfloat d = 1. - StartCompression;\\n\\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\\n\\tcolor *= newPeak / peak;\\n\\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\\n\\treturn mix( color, vec3( newPeak ), g );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tmaterial.transmission = transmission;\\n\\tmaterial.transmissionAlpha = 1.0;\\n\\tmaterial.thickness = thickness;\\n\\tmaterial.attenuationDistance = attenuationDistance;\\n\\tmaterial.attenuationColor = attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmitted = getIBLVolumeRefraction(\\n\\t\\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\\n\\t\\tmaterial.attenuationColor, material.attenuationDistance );\\n\\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\\n\\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tfloat w0( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w1( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\\n\\t}\\n\\tfloat w2( float a ){\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w3( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * a );\\n\\t}\\n\\tfloat g0( float a ) {\\n\\t\\treturn w0( a ) + w1( a );\\n\\t}\\n\\tfloat g1( float a ) {\\n\\t\\treturn w2( a ) + w3( a );\\n\\t}\\n\\tfloat h0( float a ) {\\n\\t\\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\\n\\t}\\n\\tfloat h1( float a ) {\\n\\t\\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\\n\\t}\\n\\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\\n\\t\\tuv = uv * texelSize.zw + 0.5;\\n\\t\\tvec2 iuv = floor( uv );\\n\\t\\tvec2 fuv = fract( uv );\\n\\t\\tfloat g0x = g0( fuv.x );\\n\\t\\tfloat g1x = g1( fuv.x );\\n\\t\\tfloat h0x = h0( fuv.x );\\n\\t\\tfloat h1x = h1( fuv.x );\\n\\t\\tfloat h0y = h0( fuv.y );\\n\\t\\tfloat h1y = h1( fuv.y );\\n\\t\\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\\n\\t\\t\\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\\n\\t}\\n\\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\\n\\t\\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\\n\\t\\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\\n\\t\\tvec2 fLodSizeInv = 1.0 / fLodSize;\\n\\t\\tvec2 cLodSizeInv = 1.0 / cLodSize;\\n\\t\\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\\n\\t\\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\\n\\t\\treturn mix( fSample, cSample, fract( lod ) );\\n\\t}\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\\n\\t}\\n\\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( isinf( attenuationDistance ) ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec4 transmittedLight;\\n\\t\\tvec3 transmittance;\\n\\t\\t#ifdef USE_DISPERSION\\n\\t\\t\\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\\n\\t\\t\\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\\n\\t\\t\\tfor ( int i = 0; i < 3; i ++ ) {\\n\\t\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\\n\\t\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\t\\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\\n\\t\\t\\t\\ttransmittedLight[ i ] = transmissionSample[ i ];\\n\\t\\t\\t\\ttransmittedLight.a += transmissionSample.a;\\n\\t\\t\\t\\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\\n\\t\\t\\t}\\n\\t\\t\\ttransmittedLight.a /= 3.0;\\n\\t\\t#else\\n\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\t\\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\t#endif\\n\\t\\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform mat3 mapTransform;\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform mat3 alphaMapTransform;\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tuniform mat3 lightMapTransform;\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapTransform;\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tuniform mat3 bumpMapTransform;\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tuniform mat3 normalMapTransform;\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tuniform mat3 displacementMapTransform;\\n\\tvarying vec2 vDisplacementMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapTransform;\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tuniform mat3 metalnessMapTransform;\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform mat3 roughnessMapTransform;\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tuniform mat3 anisotropyMapTransform;\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform mat3 clearcoatMapTransform;\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform mat3 clearcoatNormalMapTransform;\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform mat3 clearcoatRoughnessMapTransform;\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tuniform mat3 sheenColorMapTransform;\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tuniform mat3 sheenRoughnessMapTransform;\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tuniform mat3 iridescenceMapTransform;\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform mat3 iridescenceThicknessMapTransform;\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tuniform mat3 specularMapTransform;\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tuniform mat3 specularColorMapTransform;\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tuniform mat3 specularIntensityMapTransform;\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvUv = vec3( uv, 1 ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_BATCHING\\n\\t\\tworldPosition = batchingMatrix * worldPosition;\\n\\t#endif\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$h = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$h = \"uniform sampler2D t2D;\\nuniform float backgroundIntensity;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$g = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$g = \"#ifdef ENVMAP_TYPE_CUBE\\n\\tuniform samplerCube envMap;\\n#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\tuniform sampler2D envMap;\\n#endif\\nuniform float flipEnvMap;\\nuniform float backgroundBlurriness;\\nuniform float backgroundIntensity;\\nuniform mat3 backgroundRotation;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\\n\\t#else\\n\\t\\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = texColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$e = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\\n\\t#else\\n\\t\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\\n\\t#endif\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#elif DEPTH_PACKING == 3202\\n\\t\\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\\n\\t#elif DEPTH_PACKING == 3203\\n\\t\\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main () {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$a = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$9 = \"#define LAMBERT\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define USE_SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef USE_SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_DISPERSION\\n\\tuniform float dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\tuniform vec2 anisotropyVector;\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tuniform sampler2D anisotropyMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include \\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#ifdef USE_POINTS_UV\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\nvoid main() {\\n\\t#ifdef USE_POINTS_UV\\n\\t\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$2 = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 mvPosition = modelViewMatrix[ 3 ];\\n\\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst ShaderChunk = {\n\talphahash_fragment: alphahash_fragment,\n\talphahash_pars_fragment: alphahash_pars_fragment,\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbatching_pars_vertex: batching_pars_vertex,\n\tbatching_vertex: batching_vertex,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tiridescence_fragment: iridescence_fragment,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tcolorspace_fragment: colorspace_fragment,\n\tcolorspace_pars_fragment: colorspace_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_fragment: lights_lambert_fragment,\n\tlights_lambert_pars_fragment: lights_lambert_pars_fragment,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphinstance_vertex: morphinstance_vertex,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\topaque_fragment: opaque_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$h,\n\tbackground_frag: fragment$h,\n\tbackgroundCube_vert: vertex$g,\n\tbackgroundCube_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n// Uniforms library for shared webgl shaders\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\t\tspecularMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tenvMapRotation: { value: /*@__PURE__*/ new Matrix3() },\n\t\tflipEnvMap: { value: -1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 }, // basic, lambert, phong\n\t\tdfgLUT: { value: null } // DFG LUT for physically-based rendering\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 },\n\t\taoMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 },\n\t\tlightMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null },\n\t\temissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null },\n\t\tmetalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null },\n\t\troughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotLightMap: { value: [] },\n\t\tspotShadowMap: { value: [] },\n\t\tspotLightMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tbackgroundCube: {\n\n\t\tuniforms: {\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: -1 },\n\t\t\tbackgroundBlurriness: { value: 0 },\n\t\t\tbackgroundIntensity: { value: 1 },\n\t\t\tbackgroundRotation: { value: /*@__PURE__*/ new Matrix3() }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.backgroundCube_vert,\n\t\tfragmentShader: ShaderChunk.backgroundCube_frag\n\n\t},\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: -1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tclearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tdispersion: { value: 0 },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tiridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\tsheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tthicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t\tspecularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tanisotropyVector: { value: /*@__PURE__*/ new Vector2() },\n\t\t\tanisotropyMap: { value: null },\n\t\t\tanisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nconst _rgb = { r: 0, b: 0, g: 0 };\nconst _e1$1 = /*@__PURE__*/ new Euler();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction getBackground( scene ) {\n\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tconst usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background\n\t\t\tbackground = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );\n\n\t\t}\n\n\t\treturn background;\n\n\t}\n\n\tfunction render( scene ) {\n\n\t\tlet forceClear = false;\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tconst environmentBlendMode = renderer.xr.getEnvironmentBlendMode();\n\n\t\tif ( environmentBlendMode === 'additive' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );\n\n\t\t} else if ( environmentBlendMode === 'alpha-blend' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\t// buffers might not be writable which is required to ensure a correct clear\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t}\n\n\tfunction addToRenderList( renderList, scene ) {\n\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\t_e1$1.copy( scene.backgroundRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1$1.x *= -1; _e1$1.y *= -1; _e1$1.z *= -1;\n\n\t\t\tif ( background.isCubeTexture && background.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1$1.y *= -1;\n\t\t\t\t_e1$1.z *= -1;\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? -1 : 1;\n\t\t\tboxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;\n\t\t\tboxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tboxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4( _m1$1.makeRotationFromEuler( _e1$1 ) );\n\t\t\tboxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// add \"map\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\t\t\tplaneMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tplaneMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tcolor.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) );\n\n\t\tstate.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha );\n\n\t}\n\n\tfunction dispose() {\n\n\t\tif ( boxMesh !== undefined ) {\n\n\t\t\tboxMesh.geometry.dispose();\n\t\t\tboxMesh.material.dispose();\n\n\t\t\tboxMesh = undefined;\n\n\t\t}\n\n\t\tif ( planeMesh !== undefined ) {\n\n\t\t\tplaneMesh.geometry.dispose();\n\t\t\tplaneMesh.material.dispose();\n\n\t\t\tplaneMesh = undefined;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render,\n\t\taddToRenderList: addToRenderList,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, attributes ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tconst state = getBindingState( geometry, program, material );\n\n\t\tif ( currentState !== state ) {\n\n\t\t\tcurrentState = state;\n\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t}\n\n\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\treturn gl.createVertexArray();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\treturn gl.bindVertexArray( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\treturn gl.deleteVertexArray( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tgl.vertexAttribDivisor( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) {\n\n\t\tif ( integer === true ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\t// check for integer attributes\n\n\t\t\t\t\tconst integer = ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType );\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\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}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawArraysInstanced( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ], counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters, utils ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction textureFormatReadable( textureFormat ) {\n\n\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction textureTypeReadable( textureType ) {\n\n\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );\n\n\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\ttextureType !== FloatType && ! halfFloatSupportedByExt ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\twarn( 'WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\tconst reversedDepthBuffer = parameters.reversedDepthBuffer === true && extensions.has( 'EXT_clip_control' );\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\n\tconst maxSamples = gl.getParameter( gl.MAX_SAMPLES );\n\n\treturn {\n\n\t\tisWebGL2: true, // keeping this for backwards compatibility\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\ttextureFormatReadable: textureFormatReadable,\n\t\ttextureTypeReadable: textureTypeReadable,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\n\t};\n\n\tthis.setGlobalState = function ( planes, camera ) {\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips.\n// Used for scene blur in fromScene() method.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\n// Used for scene blur in fromScene() method.\nconst MAX_SAMPLES = 20;\n\n// GGX VNDF importance sampling configuration\nconst GGX_SAMPLES = 256;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\nlet _oldActiveCubeFace = 0;\nlet _oldActiveMipmapLevel = 0;\nlet _oldXrEnabled = false;\n\nconst _origin = /*@__PURE__*/ new Vector3();\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * The prefiltering uses GGX VNDF (Visible Normal Distribution Function)\n * importance sampling based on \"Sampling the GGX Distribution of Visible Normals\"\n * (Heitz, 2018) to generate environment maps that accurately match the GGX BRDF\n * used in material rendering for physically-based image-based lighting.\n */\nclass PMREMGenerator {\n\n\t/**\n\t * Constructs a new PMREM generator.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\t\tthis._lodMeshes = [];\n\n\t\tthis._backgroundBox = null;\n\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._blurMaterial = null;\n\t\tthis._ggxMaterial = null;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety.\n\t *\n\t * @param {Scene} scene - The scene to be captured.\n\t * @param {number} [sigma=0] - The blur radius in radians.\n\t * @param {number} [near=0.1] - The near plane distance.\n\t * @param {number} [far=100] - The far plane distance.\n\t * @param {Object} [options={}] - The configuration options.\n\t * @param {number} [options.size=256] - The texture size of the PMREM.\n\t * @param {Vector3} [options.renderTarget=origin] - The position of the internal cube camera that renders the scene.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100, options = {} ) {\n\n\t\tconst {\n\t\t\tsize = 256,\n\t\t\tposition = _origin,\n\t\t} = options;\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tthis._setSize( size );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} equirectangular - The equirectangular texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} cubemap - The cubemap texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t\tif ( this._backgroundBox !== null ) {\n\n\t\t\tthis._backgroundBox.geometry.dispose();\n\t\t\tthis._backgroundBox.material.dispose();\n\n\t\t}\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\t\tif ( this._ggxMaterial !== null ) this._ggxMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodMeshes.length; i ++ ) {\n\n\t\t\tthis._lodMeshes[ i ].geometry.dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );\n\t\tthis._renderer.xr.enabled = _oldXrEnabled;\n\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\t\t\tthis._ggxMaterial = _getGGXShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst mesh = new Mesh( new BufferGeometry(), material );\n\t\tthis._renderer.compile( mesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, -1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, -1, -1, -1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\t// https://github.com/mrdoob/three.js/issues/31413#issuecomment-3095966812\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tif ( reversedDepthBuffer ) {\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\t\trenderer.clearDepth();\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t}\n\n\t\tif ( this._backgroundBox === null ) {\n\n\t\t\tthis._backgroundBox = new Mesh(\n\t\t\t\tnew BoxGeometry(),\n\t\t\t\tnew MeshBasicMaterial( {\n\t\t\t\t\tname: 'PMREM.Background',\n\t\t\t\t\tside: BackSide,\n\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\tdepthTest: false,\n\t\t\t\t} )\n\t\t\t);\n\n\t\t}\n\n\t\tconst backgroundBox = this._backgroundBox;\n\t\tconst backgroundMaterial = backgroundBox.material;\n\n\t\tlet useSolidColor = false;\n\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x + forwardSign[ i ], position.y, position.z );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y + forwardSign[ i ], position.z );\n\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y, position.z + forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\n\t\tconst mesh = this._lodMeshes[ 0 ];\n\t\tmesh.material = material;\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tconst n = this._lodMeshes.length;\n\n\t\t// Use GGX VNDF importance sampling\n\t\tfor ( let i = 1; i < n; i ++ ) {\n\n\t\t\tthis._applyGGXFilter( cubeUVRenderTarget, i - 1, i );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * Applies GGX VNDF importance sampling filter to generate a prefiltered environment map.\n\t * Uses Monte Carlo integration with VNDF importance sampling to accurately represent the\n\t * GGX BRDF for physically-based rendering. Reads from the previous LOD level and\n\t * applies incremental roughness filtering to avoid over-blurring.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn - Source LOD level to read from\n\t * @param {number} lodOut - Target LOD level to write to\n\t */\n\t_applyGGXFilter( cubeUVRenderTarget, lodIn, lodOut ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tconst ggxMaterial = this._ggxMaterial;\n\t\tconst ggxMesh = this._lodMeshes[ lodOut ];\n\t\tggxMesh.material = ggxMaterial;\n\n\t\tconst ggxUniforms = ggxMaterial.uniforms;\n\n\t\t// Calculate incremental roughness between LOD levels\n\t\tconst targetRoughness = lodOut / ( this._lodMeshes.length - 1 );\n\t\tconst sourceRoughness = lodIn / ( this._lodMeshes.length - 1 );\n\t\tconst incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );\n\n\t\t// Apply blur strength mapping for better quality across the roughness range\n\t\tconst blurStrength = 0.05 + targetRoughness * 0.95;\n\t\tconst adjustedRoughness = incrementalRoughness * blurStrength;\n\n\t\t// Calculate viewport position based on output LOD level\n\t\tconst { _lodMax } = this;\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t// Read from previous LOD with incremental roughness\n\t\tggxUniforms[ 'envMap' ].value = cubeUVRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = adjustedRoughness;\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodIn; // Sample from input LOD\n\n\t\t_setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( pingPongRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t\t// Copy from pingPong back to cubeUV (simple direct copy)\n\t\tggxUniforms[ 'envMap' ].value = pingPongRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = 0.0; // Direct copy\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodOut; // Read from the level we just wrote\n\n\t\t_setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t *\n\t * Used for initial scene blur in fromScene() method when sigma > 0.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn\n\t * @param {number} lodOut\n\t * @param {number} sigma\n\t * @param {Vector3} [poleAxis]\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\terror(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = this._lodMeshes[ lodOut ];\n\t\tblurMesh.material = blurMaterial;\n\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\twarn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\tconst lodMeshes = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : -1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodMeshes.push( new Mesh( planes, null ) );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodMeshes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getGGXShader( lodMax, width, height ) {\n\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'PMREMGGXConvolution',\n\n\t\tdefines: {\n\t\t\t'GGX_SAMPLES': GGX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'roughness': { value: 0.0 },\n\t\t\t'mipInt': { value: 0 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// \"Sampling the GGX Distribution of Visible Normals\"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 3.2: Transform view direction to hemisphere configuration\n\t\t\t\tvec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tfloat lensq = Vh.x * Vh.x + Vh.y * Vh.y;\n\t\t\t\tvec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(Vh, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + Vh.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: -1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\tconst currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( renderTarget !== undefined ) {\n\n\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\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}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tconst extension = gl.getExtension( name );\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function () {\n\n\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\t\t\tgetExtension( 'WEBGL_clip_cull_distance' );\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\t\t\tgetExtension( 'WEBGL_render_shared_exponent' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\twarnOnce( 'WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else if ( geometryPosition !== undefined ) {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tfunction update( object, geometry, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\t// the following encodes morph targets into an array of data textures. Each layer represents a single morph target.\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet entry = morphTextures.get( geometry );\n\n\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\tlet vertexDataCount = 0;\n\n\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\tlet height = 1;\n\n\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t}\n\n\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\ttexture.type = FloatType;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\t// fill buffer\n\n\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tentry = {\n\t\t\t\tcount: morphTargetsCount,\n\t\t\t\ttexture: texture,\n\t\t\t\tsize: new Vector2( width, height )\n\t\t\t};\n\n\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\tfunction disposeTexture() {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t}\n\n\t\t//\n\t\tif ( object.isInstancedMesh === true && object.morphTexture !== null ) {\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );\n\n\t\t} else {\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tif ( updateMap.get( object ) !== frame ) {\n\n\t\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t\tupdateMap.set( object, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( updateMap.get( skeleton ) !== frame ) {\n\n\t\t\t\tskeleton.update();\n\n\t\t\t\tupdateMap.set( skeleton, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\n\nconst emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 );\n\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array or THREE.VectorN)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2i( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3i( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4i( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array or THREE.VectorN)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2ui( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3ui( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4ui( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\tlet emptyTexture2D;\n\n\tif ( this.type === gl.SAMPLER_2D_SHADOW ) {\n\n\t\temptyShadowTexture.compareFunction = LessEqualCompare; // #28670\n\t\temptyTexture2D = emptyShadowTexture;\n\n\t} else {\n\n\t\temptyTexture2D = emptyTexture;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture2D, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\n// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/\nconst COMPLETION_STATUS_KHR = 0x91B1;\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nconst _m0 = /*@__PURE__*/ new Matrix3();\n\nfunction getEncodingComponents( colorSpace ) {\n\n\tColorManagement._getMatrix( _m0, ColorManagement.workingColorSpace, colorSpace );\n\n\tconst encodingMatrix = `mat3( ${ _m0.elements.map( ( v ) => v.toFixed( 4 ) ) } )`;\n\n\tswitch ( ColorManagement.getTransfer( colorSpace ) ) {\n\n\t\tcase LinearTransfer:\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t\tcase SRGBTransfer:\n\t\t\treturn [ encodingMatrix, 'sRGBTransferOETF' ];\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported color space: ', colorSpace );\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\n\tconst shaderInfoLog = gl.getShaderInfoLog( shader ) || '';\n\tconst errors = shaderInfoLog.trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, colorSpace ) {\n\n\tconst components = getEncodingComponents( colorSpace );\n\n\treturn [\n\n\t\t`vec4 ${functionName}( vec4 value ) {`,\n\n\t\t`\treturn ${components[ 1 ]}( vec4( value.rgb * ${components[ 0 ]}, value.a ) );`,\n\n\t\t'}',\n\n\t].join( '\\n' );\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'Cineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase AgXToneMapping:\n\t\t\ttoneMappingName = 'AgX';\n\t\t\tbreak;\n\n\t\tcase NeutralToneMapping:\n\t\t\ttoneMappingName = 'Neutral';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\n\nfunction getLuminanceFunction() {\n\n\tColorManagement.getLuminanceCoefficients( _v0 );\n\n\tconst r = _v0.x.toFixed( 4 );\n\tconst g = _v0.y.toFixed( 4 );\n\tconst b = _v0.z.toFixed( 4 );\n\n\treturn [\n\n\t\t'float luminance( const in vec3 rgb ) {',\n\n\t\t`\tconst vec3 weights = vec3( ${ r }, ${ g }, ${ b } );`,\n\n\t\t'\treturn dot( weights, rgb );',\n\n\t\t'}'\n\n\t].join( '\\n' );\n\n}\n\nfunction generateVertexExtensions( parameters ) {\n\n\tconst chunks = [\n\t\tparameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : '',\n\t\tparameters.extensionMultiDraw ? '#extension GL_ANGLE_multi_draw : require' : '',\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// log( 'WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\tconst numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps;\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nconst shaderChunkMap = new Map();\n\nfunction includeReplacer( match, include ) {\n\n\tlet string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tconst newInclude = shaderChunkMap.get( include );\n\n\t\tif ( newInclude !== undefined ) {\n\n\t\t\tstring = ShaderChunk[ newInclude ];\n\t\t\twarn( 'WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.', include, newInclude );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string.replace( unrollLoopPattern, loopReplacer );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = `precision ${parameters.precision} float;\n\tprecision ${parameters.precision} int;\n\tprecision ${parameters.precision} sampler2D;\n\tprecision ${parameters.precision} samplerCube;\n\tprecision ${parameters.precision} sampler3D;\n\tprecision ${parameters.precision} sampler2DArray;\n\tprecision ${parameters.precision} sampler2DShadow;\n\tprecision ${parameters.precision} samplerCubeShadow;\n\tprecision ${parameters.precision} sampler2DArrayShadow;\n\tprecision ${parameters.precision} isampler2D;\n\tprecision ${parameters.precision} isampler3D;\n\tprecision ${parameters.precision} isamplerCube;\n\tprecision ${parameters.precision} isampler2DArray;\n\tprecision ${parameters.precision} usampler2D;\n\tprecision ${parameters.precision} usampler3D;\n\tprecision ${parameters.precision} usamplerCube;\n\tprecision ${parameters.precision} usampler2DArray;\n\t`;\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customVertexExtensions = generateVertexExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '',\n\t\t\tparameters.batching ? '#define USE_BATCHING' : '',\n\t\t\tparameters.batchingColor ? '#define USE_BATCHING_COLOR' : '',\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\t\t\tparameters.instancingMorph ? '#define USE_INSTANCING_MORPH' : '',\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\t//\n\n\t\t\tparameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '',\n\t\t\tparameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '',\n\t\t\tparameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '',\n\t\t\tparameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '',\n\t\t\tparameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '',\n\t\t\tparameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '',\n\t\t\tparameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '',\n\t\t\tparameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '',\n\n\t\t\tparameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '',\n\t\t\tparameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '',\n\n\t\t\tparameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '',\n\n\t\t\tparameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '',\n\t\t\tparameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '',\n\t\t\tparameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '',\n\n\t\t\tparameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '',\n\t\t\tparameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '',\n\n\t\t\tparameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '',\n\t\t\tparameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '',\n\n\t\t\tparameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '',\n\t\t\tparameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '',\n\t\t\tparameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '',\n\n\t\t\tparameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '',\n\t\t\tparameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '',\n\n\t\t\t//\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_MORPH',\n\n\t\t\t'\tuniform sampler2D morphTexture;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_UV1',\n\n\t\t\t'\tattribute vec2 uv1;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV2',\n\n\t\t\t'\tattribute vec2 uv2;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV3',\n\n\t\t\t'\tattribute vec2 uv3;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.alphaToCoverage ? '#define ALPHA_TO_COVERAGE' : '',\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.dispersion ? '#define USE_DISPERSION' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\t\t\tparameters.decodeVideoTextureEmissive ? '#define DECODE_VIDEO_TEXTURE_EMISSIVE' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ),\n\t\t\tgetLuminanceFunction(),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\tcustomVertexExtensions,\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// log( '*VERTEX*', vertexGlsl );\n\t// log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\tfunction onFirstUse( self ) {\n\n\t\t// check for link errors\n\t\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\t\tconst programInfoLog = gl.getProgramInfoLog( program ) || '';\n\t\t\tconst vertexShaderInfoLog = gl.getShaderInfoLog( glVertexShader ) || '';\n\t\t\tconst fragmentShaderInfoLog = gl.getShaderInfoLog( glFragmentShader ) || '';\n\n\t\t\tconst programLog = programInfoLog.trim();\n\t\t\tconst vertexLog = vertexShaderInfoLog.trim();\n\t\t\tconst fragmentLog = fragmentShaderInfoLog.trim();\n\n\t\t\tlet runnable = true;\n\t\t\tlet haveDiagnostics = true;\n\n\t\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\t\trunnable = false;\n\n\t\t\t\tif ( typeof renderer.debug.onShaderError === 'function' ) {\n\n\t\t\t\t\trenderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// default error reporting\n\n\t\t\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\t\t\terror(\n\t\t\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t\t\t'Material Name: ' + self.name + '\\n' +\n\t\t\t\t\t\t'Material Type: ' + self.type + '\\n\\n' +\n\t\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\t\tfragmentErrors\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( programLog !== '' ) {\n\n\t\t\t\twarn( 'WebGLProgram: Program Info Log:', programLog );\n\n\t\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\t\thaveDiagnostics = false;\n\n\t\t\t}\n\n\t\t\tif ( haveDiagnostics ) {\n\n\t\t\t\tself.diagnostics = {\n\n\t\t\t\t\trunnable: runnable,\n\n\t\t\t\t\tprogramLog: programLog,\n\n\t\t\t\t\tvertexShader: {\n\n\t\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t\t},\n\n\t\t\t\t\tfragmentShader: {\n\n\t\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Clean up\n\n\t\t// Crashes in iOS9 and iOS10. #18402\n\t\t// gl.detachShader( program, glVertexShader );\n\t\t// gl.detachShader( program, glFragmentShader );\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t}\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t// Populates cachedUniforms and cachedAttributes\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t// Populates cachedAttributes and cachedUniforms\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported,\n\t// flag the program as ready immediately. It may cause a stall when it's first used.\n\n\tlet programReady = ( parameters.rendererExtensionParallelShaderCompile === false );\n\n\tthis.isReady = function () {\n\n\t\tif ( programReady === false ) {\n\n\t\t\tprogramReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR );\n\n\t\t}\n\n\t\treturn programReady;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.type = parameters.shaderType;\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\t\tlet set = cache.get( material );\n\n\t\tif ( set === undefined ) {\n\n\t\t\tset = new Set();\n\t\t\tcache.set( material, set );\n\n\t\t}\n\n\t\treturn set;\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\t\tlet stage = cache.get( code );\n\n\t\tif ( stage === undefined ) {\n\n\t\t\tstage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn stage;\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst _activeChannels = new Set();\n\tconst programs = [];\n\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;\n\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getChannel( value ) {\n\n\t\t_activeChannels.add( value );\n\n\t\tif ( value === 0 ) return 'uv';\n\n\t\treturn `uv${ value }`;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\twarn( 'WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tconst IS_INSTANCEDMESH = object.isInstancedMesh === true;\n\t\tconst IS_BATCHEDMESH = object.isBatchedMesh === true;\n\n\t\tconst HAS_MAP = !! material.map;\n\t\tconst HAS_MATCAP = !! material.matcap;\n\t\tconst HAS_ENVMAP = !! envMap;\n\t\tconst HAS_AOMAP = !! material.aoMap;\n\t\tconst HAS_LIGHTMAP = !! material.lightMap;\n\t\tconst HAS_BUMPMAP = !! material.bumpMap;\n\t\tconst HAS_NORMALMAP = !! material.normalMap;\n\t\tconst HAS_DISPLACEMENTMAP = !! material.displacementMap;\n\t\tconst HAS_EMISSIVEMAP = !! material.emissiveMap;\n\n\t\tconst HAS_METALNESSMAP = !! material.metalnessMap;\n\t\tconst HAS_ROUGHNESSMAP = !! material.roughnessMap;\n\n\t\tconst HAS_ANISOTROPY = material.anisotropy > 0;\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\t\tconst HAS_DISPERSION = material.dispersion > 0;\n\t\tconst HAS_IRIDESCENCE = material.iridescence > 0;\n\t\tconst HAS_SHEEN = material.sheen > 0;\n\t\tconst HAS_TRANSMISSION = material.transmission > 0;\n\n\t\tconst HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap;\n\n\t\tconst HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap;\n\t\tconst HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap;\n\n\t\tconst HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap;\n\t\tconst HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap;\n\n\t\tconst HAS_SPECULARMAP = !! material.specularMap;\n\t\tconst HAS_SPECULAR_COLORMAP = !! material.specularColorMap;\n\t\tconst HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap;\n\n\t\tconst HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap;\n\t\tconst HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap;\n\n\t\tconst HAS_GRADIENTMAP = !! material.gradientMap;\n\n\t\tconst HAS_ALPHAMAP = !! material.alphaMap;\n\n\t\tconst HAS_ALPHATEST = material.alphaTest > 0;\n\n\t\tconst HAS_ALPHAHASH = !! material.alphaHash;\n\n\t\tconst HAS_EXTENSIONS = !! material.extensions;\n\n\t\tlet toneMapping = NoToneMapping;\n\n\t\tif ( material.toneMapped ) {\n\n\t\t\tif ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\ttoneMapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst parameters = {\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderType: material.type,\n\t\t\tshaderName: material.name,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tbatching: IS_BATCHEDMESH,\n\t\t\tbatchingColor: IS_BATCHEDMESH && object._colorsTexture !== null,\n\t\t\tinstancing: IS_INSTANCEDMESH,\n\t\t\tinstancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,\n\t\t\tinstancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null,\n\n\t\t\tsupportsVertexTextures: SUPPORTS_VERTEX_TEXTURES,\n\t\t\toutputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),\n\t\t\talphaToCoverage: !! material.alphaToCoverage,\n\n\t\t\tmap: HAS_MAP,\n\t\t\tmatcap: HAS_MATCAP,\n\t\t\tenvMap: HAS_ENVMAP,\n\t\t\tenvMapMode: HAS_ENVMAP && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\taoMap: HAS_AOMAP,\n\t\t\tlightMap: HAS_LIGHTMAP,\n\t\t\tbumpMap: HAS_BUMPMAP,\n\t\t\tnormalMap: HAS_NORMALMAP,\n\t\t\tdisplacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP,\n\t\t\temissiveMap: HAS_EMISSIVEMAP,\n\n\t\t\tnormalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,\n\t\t\tnormalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tmetalnessMap: HAS_METALNESSMAP,\n\t\t\troughnessMap: HAS_ROUGHNESSMAP,\n\n\t\t\tanisotropy: HAS_ANISOTROPY,\n\t\t\tanisotropyMap: HAS_ANISOTROPYMAP,\n\n\t\t\tclearcoat: HAS_CLEARCOAT,\n\t\t\tclearcoatMap: HAS_CLEARCOATMAP,\n\t\t\tclearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,\n\t\t\tclearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,\n\n\t\t\tdispersion: HAS_DISPERSION,\n\n\t\t\tiridescence: HAS_IRIDESCENCE,\n\t\t\tiridescenceMap: HAS_IRIDESCENCEMAP,\n\t\t\tiridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,\n\n\t\t\tsheen: HAS_SHEEN,\n\t\t\tsheenColorMap: HAS_SHEEN_COLORMAP,\n\t\t\tsheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP,\n\n\t\t\tspecularMap: HAS_SPECULARMAP,\n\t\t\tspecularColorMap: HAS_SPECULAR_COLORMAP,\n\t\t\tspecularIntensityMap: HAS_SPECULAR_INTENSITYMAP,\n\n\t\t\ttransmission: HAS_TRANSMISSION,\n\t\t\ttransmissionMap: HAS_TRANSMISSIONMAP,\n\t\t\tthicknessMap: HAS_THICKNESSMAP,\n\n\t\t\tgradientMap: HAS_GRADIENTMAP,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false,\n\n\t\t\talphaMap: HAS_ALPHAMAP,\n\t\t\talphaTest: HAS_ALPHATEST,\n\t\t\talphaHash: HAS_ALPHAHASH,\n\n\t\t\tcombine: material.combine,\n\n\t\t\t//\n\n\t\t\tmapUv: HAS_MAP && getChannel( material.map.channel ),\n\t\t\taoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ),\n\t\t\tlightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ),\n\t\t\tbumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ),\n\t\t\tnormalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ),\n\t\t\tdisplacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ),\n\t\t\temissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ),\n\n\t\t\tmetalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ),\n\t\t\troughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ),\n\n\t\t\tanisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ),\n\n\t\t\tclearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ),\n\t\t\tclearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ),\n\t\t\tclearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ),\n\n\t\t\tiridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ),\n\t\t\tiridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ),\n\n\t\t\tsheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ),\n\t\t\tsheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ),\n\n\t\t\tspecularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ),\n\t\t\tspecularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ),\n\t\t\tspecularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ),\n\n\t\t\ttransmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ),\n\t\t\tthicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ),\n\n\t\t\talphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ),\n\n\t\t\t//\n\n\t\t\tvertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\n\t\t\tpointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ),\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( !! fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: ( material.flatShading === true && material.wireframe === false ),\n\n\t\t\tsizeAttenuation: material.sizeAttenuation === true,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumSpotLightMaps: lights.spotLightMap.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\t\t\tnumSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,\n\n\t\t\tnumLightProbes: lights.numLightProbes,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: toneMapping,\n\n\t\t\tdecodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ),\n\t\t\tdecodeVideoTextureEmissive: HAS_EMISSIVEMAP && ( material.emissiveMap.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.emissiveMap.colorSpace ) === SRGBTransfer ),\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: material.depthPacking >= 0,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),\n\t\t\textensionMultiDraw: ( HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH ) && extensions.has( 'WEBGL_multi_draw' ),\n\n\t\t\trendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\t// the usage of getChannel() determines the active texture channels for this shader\n\n\t\tparameters.vertexUv1s = _activeChannels.has( 1 );\n\t\tparameters.vertexUv2s = _activeChannels.has( 2 );\n\t\tparameters.vertexUv3s = _activeChannels.has( 3 );\n\n\t\t_activeChannels.clear();\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputColorSpace );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputColorSpace );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.mapUv );\n\t\tarray.push( parameters.alphaMapUv );\n\t\tarray.push( parameters.lightMapUv );\n\t\tarray.push( parameters.aoMapUv );\n\t\tarray.push( parameters.bumpMapUv );\n\t\tarray.push( parameters.normalMapUv );\n\t\tarray.push( parameters.displacementMapUv );\n\t\tarray.push( parameters.emissiveMapUv );\n\t\tarray.push( parameters.metalnessMapUv );\n\t\tarray.push( parameters.roughnessMapUv );\n\t\tarray.push( parameters.anisotropyMapUv );\n\t\tarray.push( parameters.clearcoatMapUv );\n\t\tarray.push( parameters.clearcoatNormalMapUv );\n\t\tarray.push( parameters.clearcoatRoughnessMapUv );\n\t\tarray.push( parameters.iridescenceMapUv );\n\t\tarray.push( parameters.iridescenceThicknessMapUv );\n\t\tarray.push( parameters.sheenColorMapUv );\n\t\tarray.push( parameters.sheenRoughnessMapUv );\n\t\tarray.push( parameters.specularMapUv );\n\t\tarray.push( parameters.specularColorMapUv );\n\t\tarray.push( parameters.specularIntensityMapUv );\n\t\tarray.push( parameters.transmissionMapUv );\n\t\tarray.push( parameters.thicknessMapUv );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numSpotLightMaps );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.numSpotLightShadowsWithMaps );\n\t\tarray.push( parameters.numLightProbes );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingMorph )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.normalMapObjectSpace )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.normalMapTangentSpace )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.vertexUv1s )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.vertexUv2s )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.vertexUv3s )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.anisotropy )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.alphaHash )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.batching )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.dispersion )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.batchingColor )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 22 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.reversedDepthBuffer )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.pointsUvs )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.decodeVideoTextureEmissive )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.alphaToCoverage )\n\t\t\t_programLayers.enable( 21 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction has( object ) {\n\n\t\treturn properties.has( object );\n\n\t}\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\thas: has,\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tconst listArray = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( listArray === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= listArray.length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlistArray.push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = listArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingAndTexturingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: -1,\n\t\t\tpointLength: -1,\n\t\t\tspotLength: -1,\n\t\t\trectAreaLength: -1,\n\t\t\themiLength: -1,\n\n\t\t\tnumDirectionalShadows: -1,\n\t\t\tnumPointShadows: -1,\n\t\t\tnumSpotShadows: -1,\n\t\t\tnumSpotMaps: -1,\n\n\t\t\tnumLightProbes: -1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotLightMap: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotLightMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: [],\n\t\tnumSpotLightShadowsWithMaps: 0,\n\t\tnumLightProbes: 0\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\t\tlet numSpotMaps = 0;\n\t\tlet numSpotShadowsWithMaps = 0;\n\n\t\tlet numLightProbes = 0;\n\n\t\t// ordering : [shadow casting + map texturing, map texturing, shadow casting, none ]\n\t\tlights.sort( shadowCastingAndTexturingLightsFirst );\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t\tnumLightProbes ++;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\tif ( light.map ) {\n\n\t\t\t\t\tstate.spotLightMap[ numSpotMaps ] = light.map;\n\t\t\t\t\tnumSpotMaps ++;\n\n\t\t\t\t\t// make sure the lightMatrix is up to date\n\t\t\t\t\t// TODO : do it if required only\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t\tif ( light.castShadow ) numSpotShadowsWithMaps ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotLightMatrix[ spotLength ] = shadow.matrix;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ||\n\t\t\thash.numSpotMaps !== numSpotMaps ||\n\t\t\thash.numLightProbes !== numLightProbes ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps;\n\t\t\tstate.spotLightMap.length = numSpotMaps;\n\t\t\tstate.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps;\n\t\t\tstate.numLightProbes = numLightProbes;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\t\t\thash.numSpotMaps = numSpotMaps;\n\n\t\t\thash.numLightProbes = numLightProbes;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions ) {\n\n\tconst lights = new WebGLLights( extensions );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init( camera ) {\n\n\t\tstate.camera = camera;\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights() {\n\n\t\tlights.setup( lightsArray );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tcamera: null,\n\n\t\tlights: lights,\n\n\t\ttransmissionRenderTarget: {}\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tconst renderStateArray = renderStates.get( scene );\n\t\tlet renderState;\n\n\t\tif ( renderStateArray === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStateArray.length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\t\trenderStateArray.push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStateArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include \\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( renderer, objects, capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = capabilities.maxTextureSize;\n\n\tconst shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ -1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\tlet _previousType = this.type;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst activeCubeFace = renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst _state = renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\n\t\tif ( _state.buffers.depth.getReversed() === true ) {\n\n\t\t\t_state.buffers.color.setClear( 0, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\n\t\t}\n\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// check for shadow map type changes\n\n\t\tconst toVSM = ( _previousType !== VSMShadowMap && this.type === VSMShadowMap );\n\t\tconst fromVSM = ( _previousType === VSMShadowMap && this.type !== VSMShadowMap );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\twarn( 'WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null || toVSM === true || fromVSM === true ) {\n\n\t\t\t\tconst pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {};\n\n\t\t\t\tif ( shadow.map !== null ) {\n\n\t\t\t\t\tshadow.map.dispose();\n\n\t\t\t\t}\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\trenderer.setRenderTarget( shadow.map );\n\t\t\trenderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\t_previousType = this.type;\n\n\t\tscope.needsUpdate = false;\n\n\t\trenderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.mapPass );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.map );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t\tif ( ( renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t\t( material.alphaMap && material.alphaTest > 0 ) ||\n\t\t\t\t( material.map && material.alphaTest > 0 ) ||\n\t\t\t\t( material.alphaToCoverage === true ) ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\t\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = ( material.alphaToCoverage === true ) ? 0.5 : material.alphaTest; // approximate alphaToCoverage by using a fixed alphaTest value\n\t\tresult.map = material.map;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tconst materialProperties = renderer.properties.get( result );\n\t\t\tmaterialProperties.light = light;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, type );\n\n\t\t\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, type );\n\n\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t// make sure to remove the unique distance/depth materials used for shadow map rendering\n\n\t\tfor ( const id in _materialCache ) {\n\n\t\t\tconst cache = _materialCache[ id ];\n\n\t\t\tconst uuid = event.target.uuid;\n\n\t\t\tif ( uuid in cache ) {\n\n\t\t\t\tconst shadowMaterial = cache[ uuid ];\n\t\t\t\tshadowMaterial.dispose();\n\t\t\t\tdelete cache[ uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nconst reversedFuncs = {\n\t[ NeverDepth ]: AlwaysDepth,\n\t[ LessDepth ]: GreaterDepth,\n\t[ EqualDepth ]: NotEqualDepth,\n\t[ LessEqualDepth ]: GreaterEqualDepth,\n\n\t[ AlwaysDepth ]: NeverDepth,\n\t[ GreaterDepth ]: LessDepth,\n\t[ NotEqualDepth ]: EqualDepth,\n\t[ GreaterEqualDepth ]: LessEqualDepth,\n};\n\nfunction WebGLState( gl, extensions ) {\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( -1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentReversed = false;\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetReversed: function ( reversed ) {\n\n\t\t\t\tif ( currentReversed !== reversed ) {\n\n\t\t\t\t\tconst ext = extensions.get( 'EXT_clip_control' );\n\n\t\t\t\t\tif ( reversed ) {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.NEGATIVE_ONE_TO_ONE_EXT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentReversed = reversed;\n\n\t\t\t\t\tconst oldDepth = currentDepthClear;\n\t\t\t\t\tcurrentDepthClear = null;\n\t\t\t\t\tthis.setClear( oldDepth );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tgetReversed: function () {\n\n\t\t\t\treturn currentReversed;\n\n\t\t\t},\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentReversed ) depthFunc = reversedFuncs[ depthFunc ];\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tif ( currentReversed ) {\n\n\t\t\t\t\t\tdepth = 1 - depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\t\t\t\tcurrentReversed = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef !== stencilRef ||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgramMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentBlendColor = new Color( 0, 0, 0 );\n\tlet currentBlendAlpha = 0;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count, dimensions ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tif ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tgl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t} else {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\temptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 );\n\temptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t}\n\n\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t}\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tequationToGL[ MinEquation ] = gl.MIN;\n\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA,\n\t\t[ ConstantColorFactor ]: gl.CONSTANT_COLOR,\n\t\t[ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR,\n\t\t[ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA,\n\t\t[ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: SubtractiveBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: MultiplyBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\t\t\t\tcurrentBlendColor.set( 0, 0, 0 );\n\t\t\t\tcurrentBlendAlpha = 0;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tif ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) {\n\n\t\t\tgl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha );\n\n\t\t\tcurrentBlendColor.copy( blendColor );\n\t\t\tcurrentBlendAlpha = blendAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = false;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture, webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgramMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgramMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgramMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( program ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( program, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\t\tgl.blendColor( 0, 0, 0, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\n\t\tdepthBuffer.setReversed( false );\n\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentBlendColor = new Color( 0, 0, 0 );\n\t\tcurrentBlendAlpha = 0;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\tcompressedTexImage3D: compressedTexImage3D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\t\tcompressedTexSubImage3D: compressedTexSubImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _imageDimensions = new Vector2();\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\tconst dimensions = getDimensions( image );\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( dimensions.width > maxSize || dimensions.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( dimensions.width, dimensions.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) ) {\n\n\t\t\t\tconst width = Math.floor( scale * dimensions.width );\n\t\t\t\tconst height = Math.floor( scale * dimensions.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\twarn( 'WebGLRenderer: Texture has been resized from (' + dimensions.width + 'x' + dimensions.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\twarn( 'WebGLRenderer: Image in DataTexture is too big (' + dimensions.width + 'x' + dimensions.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture ) {\n\n\t\treturn texture.generateMipmaps;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getTargetType( texture ) {\n\n\t\tif ( texture.isWebGLCubeRenderTarget ) return _gl.TEXTURE_CUBE_MAP;\n\t\tif ( texture.isWebGL3DRenderTarget ) return _gl.TEXTURE_3D;\n\t\tif ( texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture ) return _gl.TEXTURE_2D_ARRAY;\n\t\treturn _gl.TEXTURE_2D;\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) {\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\twarn( 'WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RED_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.R8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.R16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RG16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RG32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RG8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RG16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RG32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGB8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGB16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGB32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGB8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGB16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGB32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGBA8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGBA16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGBA32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGBA8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGBA16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGBA32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = _gl.RGB9_E5;\n\t\t\tif ( glType === _gl.UNSIGNED_INT_10F_11F_11F_REV ) internalFormat = _gl.R11F_G11F_B10F;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getInternalDepthFormat( useStencil, depthType ) {\n\n\t\tlet glInternalFormat;\n\t\tif ( useStencil ) {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH32F_STENCIL8;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\t\t\t\twarn( 'DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.' );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn glInternalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\tproperties.remove( renderTarget.depthTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {\n\n\t\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {\n\n\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\tinfo.memory.textures --;\n\n\t\t\t}\n\n\t\t\tproperties.remove( textures[ i ] );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\twarn( 'WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.wrapR || 0 );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.colorSpace );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.isExternalTexture !== true && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tconst compareToGL = {\n\t\t[ NeverCompare ]: _gl.NEVER,\n\t\t[ AlwaysCompare ]: _gl.ALWAYS,\n\t\t[ LessCompare ]: _gl.LESS,\n\t\t[ LessEqualCompare ]: _gl.LEQUAL,\n\t\t[ EqualCompare ]: _gl.EQUAL,\n\t\t[ GreaterEqualCompare ]: _gl.GEQUAL,\n\t\t[ GreaterCompare ]: _gl.GREATER,\n\t\t[ NotEqualCompare ]: _gl.NOTEQUAL\n\t};\n\n\tfunction setTextureParameters( textureType, texture ) {\n\n\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false &&\n\t\t\t( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter ||\n\t\t\ttexture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter ) ) {\n\n\t\t\twarn( 'WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device.' );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\tif ( texture.compareFunction ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] );\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction getRow( index, rowLength, componentStride ) {\n\n\t\treturn Math.floor( Math.floor( index / componentStride ) / rowLength );\n\n\t}\n\n\tfunction updateTexture( texture, image, glFormat, glType ) {\n\n\t\tconst componentStride = 4; // only RGBA supported\n\n\t\tconst updateRanges = texture.updateRanges;\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.texSubImage2D`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// Only merge if in the same row and overlapping/adjacent\n\t\t\t\tconst previousEnd = previousRange.start + previousRange.count;\n\t\t\t\tconst currentRow = getRow( range.start, image.width, componentStride );\n\t\t\t\tconst previousRow = getRow( previousRange.start, image.width, componentStride );\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif (\n\t\t\t\t\trange.start <= previousEnd + 1 &&\n\t\t\t\t\tcurrentRow === previousRow &&\n\t\t\t\t\tgetRow( range.start + range.count - 1, image.width, componentStride ) === currentRow // ensure range doesn't spill\n\t\t\t\t) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tconst pixelStart = Math.floor( range.start / componentStride );\n\t\t\t\tconst pixelCount = Math.ceil( range.count / componentStride );\n\n\t\t\t\tconst x = pixelStart % image.width;\n\t\t\t\tconst y = Math.floor( pixelStart / image.width );\n\n\t\t\t\t// Assumes update ranges refer to contiguous memory\n\t\t\t\tconst width = pixelCount;\n\t\t\t\tconst height = 1;\n\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, x );\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, y );\n\n\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, x, y, width, height, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t\ttexture.clearUpdateRanges();\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tlet image = resizeImage( texture.image, false, capabilities.maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tlet glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tconst levels = getMipLevels( texture, image );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\tglInternalFormat = getInternalDepthFormat( texture.format === DepthStencilFormat, texture.type );\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tupdateTexture( texture, image, glFormat, glType );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tconst layerData = mipmap.data.subarray(\n\t\t\t\t\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData );\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\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} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\tconst layerByteLength = getByteLength( image.width, image.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\tconst layerData = image.data.subarray(\n\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / image.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\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} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tconst dimensions = getDimensions( mipmaps[ 0 ] );\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tconst dimensions = getDimensions( image );\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], true, capabilities.maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tglFormat = utils.convert( texture.format, texture.colorSpace ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tlet levels = getMipLevels( texture, image );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\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} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tconst dimensions = getDimensions( cubeImage[ 0 ] );\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\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\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tconst width = Math.max( 1, renderTarget.width >> level );\n\t\t\tconst height = Math.max( 1, renderTarget.height >> level );\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, level );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t// retrieve the depth attachment types\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tconst depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null;\n\t\t\tconst glInternalFormat = getInternalDepthFormat( renderTarget.stencilBuffer, depthType );\n\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t// set up the attachment\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\tconst isUseMultisampledRTT = useMultisampledRTT( renderTarget );\n\t\t\tif ( isUseMultisampledRTT ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( isMultisample ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\tconst textureProperties = properties.get( renderTarget.depthTexture );\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! textureProperties.__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = textureProperties.__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\t// if the bound depth texture has changed\n\t\tif ( renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture ) {\n\n\t\t\t// fire the dispose event to get rid of stored state associated with the previously bound depth buffer\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tif ( renderTargetProperties.__depthDisposeCallback ) {\n\n\t\t\t\trenderTargetProperties.__depthDisposeCallback();\n\n\t\t\t}\n\n\t\t\t// set up dispose listeners to track when the currently attached buffer is implicitly unbound\n\t\t\tif ( depthTexture ) {\n\n\t\t\t\tconst disposeEvent = () => {\n\n\t\t\t\t\tdelete renderTargetProperties.__boundDepthTexture;\n\t\t\t\t\tdelete renderTargetProperties.__depthDisposeCallback;\n\t\t\t\t\tdepthTexture.removeEventListener( 'dispose', disposeEvent );\n\n\t\t\t\t};\n\n\t\t\t\tdepthTexture.addEventListener( 'dispose', disposeEvent );\n\t\t\t\trenderTargetProperties.__depthDisposeCallback = disposeEvent;\n\n\t\t\t}\n\n\t\t\trenderTargetProperties.__boundDepthTexture = depthTexture;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer[ 0 ], renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer[ i ] === undefined ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer[ i ];\n\t\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer === undefined ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer;\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\tif ( ! isMultipleRenderTargets ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = [];\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindTexture( glTextureType, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( glTextureType, attachment );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, glTextureType, 0 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment ) ) {\n\n\t\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture );\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tconst targetType = getTargetType( renderTarget );\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( targetType, webglTexture );\n\t\t\t\tgenerateMipmap( targetType );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst invalidationArrayRead = [];\n\tconst invalidationArrayDraw = [];\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.samples > 0 ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tconst textures = renderTarget.textures;\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\t\t\t// If MRT we need to remove FBO attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTarget.resolveDepthBuffer ) {\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t\t\t\t// resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)\n\n\t\t\t\t\t\tif ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\n\t\t\t\t\tif ( supportsInvalidateFramebuffer === true ) {\n\n\t\t\t\t\t\tinvalidationArrayRead.length = 0;\n\t\t\t\t\t\tinvalidationArrayDraw.length = 0;\n\n\t\t\t\t\t\tinvalidationArrayRead.push( _gl.COLOR_ATTACHMENT0 + i );\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false ) {\n\n\t\t\t\t\t\t\tinvalidationArrayRead.push( depthStyle );\n\t\t\t\t\t\t\tinvalidationArrayDraw.push( depthStyle );\n\n\t\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, invalidationArrayDraw );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArrayRead );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t} else {\n\n\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( capabilities.maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst colorSpace = texture.colorSpace;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true ) return image;\n\n\t\tif ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) {\n\n\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\twarn( 'WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\terror( 'WebGLTextures: Unsupported texture color space:', colorSpace );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction getDimensions( image ) {\n\n\t\tif ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) {\n\n\t\t\t// if intrinsic data are not available, fallback to width/height\n\n\t\t\t_imageDimensions.width = image.naturalWidth || image.width;\n\t\t\t_imageDimensions.height = image.naturalHeight || image.height;\n\n\t\t} else if ( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) {\n\n\t\t\t_imageDimensions.width = image.displayWidth;\n\t\t\t_imageDimensions.height = image.displayHeight;\n\n\t\t} else {\n\n\t\t\t_imageDimensions.width = image.width;\n\t\t\t_imageDimensions.height = image.height;\n\n\t\t}\n\n\t\treturn _imageDimensions;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions ) {\n\n\tfunction convert( p, colorSpace = NoColorSpace ) {\n\n\t\tlet extension;\n\n\t\tconst transfer = ColorManagement.getTransfer( colorSpace );\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedInt5999Type ) return gl.UNSIGNED_INT_5_9_9_9_REV;\n\t\tif ( p === UnsignedInt101111Type ) return gl.UNSIGNED_INT_10F_11F_11F_REV;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\t\tif ( p === HalfFloatType ) return gl.HALF_FLOAT;\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return gl.RED;\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( transfer === SRGBTransfer ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC\n\n\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RED_RGTC1_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) return gl.UNSIGNED_INT_24_8;\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nconst _occlusion_vertex = `\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}`;\n\nconst _occlusion_fragment = `\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}`;\n\n/**\n * A XR module that manages the access to the Depth Sensing API.\n */\nclass WebXRDepthSensing {\n\n\t/**\n\t * Constructs a new depth sensing module.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * An opaque texture representing the depth of the user's environment.\n\t\t *\n\t\t * @type {?ExternalTexture}\n\t\t */\n\t\tthis.texture = null;\n\n\t\t/**\n\t\t * A plane mesh for visualizing the depth texture.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t */\n\t\tthis.mesh = null;\n\n\t\t/**\n\t\t * The depth near value.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthNear = 0;\n\n\t\t/**\n\t\t * The depth near far.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthFar = 0;\n\n\t}\n\n\t/**\n\t * Inits the depth sensing module\n\t *\n\t * @param {XRWebGLDepthInformation} depthData - The XR depth data.\n\t * @param {XRRenderState} renderState - The XR render state.\n\t */\n\tinit( depthData, renderState ) {\n\n\t\tif ( this.texture === null ) {\n\n\t\t\tconst texture = new ExternalTexture( depthData.texture );\n\n\t\t\tif ( ( depthData.depthNear !== renderState.depthNear ) || ( depthData.depthFar !== renderState.depthFar ) ) {\n\n\t\t\t\tthis.depthNear = depthData.depthNear;\n\t\t\t\tthis.depthFar = depthData.depthFar;\n\n\t\t\t}\n\n\t\t\tthis.texture = texture;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a plane mesh that visualizes the depth texture.\n\t *\n\t * @param {ArrayCamera} cameraXR - The XR camera.\n\t * @return {?Mesh} The plane mesh.\n\t */\n\tgetMesh( cameraXR ) {\n\n\t\tif ( this.texture !== null ) {\n\n\t\t\tif ( this.mesh === null ) {\n\n\t\t\t\tconst viewport = cameraXR.cameras[ 0 ].viewport;\n\t\t\t\tconst material = new ShaderMaterial( {\n\t\t\t\t\tvertexShader: _occlusion_vertex,\n\t\t\t\t\tfragmentShader: _occlusion_fragment,\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tdepthColor: { value: this.texture },\n\t\t\t\t\t\tdepthWidth: { value: viewport.z },\n\t\t\t\t\t\tdepthHeight: { value: viewport.w }\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.mesh = new Mesh( new PlaneGeometry( 20, 20 ), material );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this.mesh;\n\n\t}\n\n\t/**\n\t * Resets the module\n\t */\n\treset() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t}\n\n\t/**\n\t * Returns a texture representing the depth of the user's environment.\n\t *\n\t * @return {?ExternalTexture} The depth texture.\n\t */\n\tgetDepthTexture() {\n\n\t\treturn this.texture;\n\n\t}\n\n}\n\n/**\n * This class represents an abstraction of the WebXR Device API and is\n * internally used by {@link WebGLRenderer}. `WebXRManager` also provides a public\n * interface that allows users to enable/disable XR and perform XR related\n * tasks like for instance retrieving controllers.\n *\n * @augments EventDispatcher\n * @hideconstructor\n */\nclass WebXRManager extends EventDispatcher {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGL2RenderingContext} gl - The rendering context.\n\t */\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\t// Set default foveation to maximum.\n\t\tlet foveation = 1.0;\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\n\t\tconst supportsGlBinding = typeof XRWebGLBinding !== 'undefined';\n\n\t\tconst depthSensing = new WebXRDepthSensing();\n\t\tconst cameraAccessTextures = {};\n\t\tconst attributes = gl.getContextAttributes();\n\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\tconst currentSize = new Vector2();\n\t\tlet currentPixelRatio = null;\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraXR = new ArrayCamera();\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\t/**\n\t\t * Whether the manager's XR camera should be automatically updated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.cameraAutoUpdate = true;\n\n\t\t/**\n\t\t * This flag notifies the renderer to be ready for XR rendering. Set it to `true`\n\t\t * if you are going to use XR in your app.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enabled = false;\n\n\t\t/**\n\t\t * Whether XR presentation is active or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPresenting = false;\n\n\t\t/**\n\t\t * Returns a group representing the `target ray` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `target ray` space.\n\t\t */\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `grip` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * Note: If you want to show something in the user's hand AND offer a\n\t\t * pointing ray at the same time, you'll want to attached the handheld object\n\t\t * to the group returned by `getControllerGrip()` and the ray to the\n\t\t * group returned by `getController()`. The idea is to have two\n\t\t * different groups in two different coordinate spaces for the same WebXR\n\t\t * controller.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `grip` space.\n\t\t */\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `hand` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `hand` space.\n\t\t */\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace );\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\tdepthSensing.reset();\n\t\t\tfor ( const key in cameraAccessTextures ) {\n\n\t\t\t\tdelete cameraAccessTextures[ key ];\n\n\t\t\t}\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\trenderer.setPixelRatio( currentPixelRatio );\n\t\t\trenderer.setSize( currentSize.width, currentSize.height, false );\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\t/**\n\t\t * Sets the framebuffer scale factor.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {number} value - The framebuffer scale factor.\n\t\t */\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the reference space type. Can be used to configure a spatial relationship with the user's physical\n\t\t * environment. Depending on how the user moves in 3D space, setting an appropriate reference space can\n\t\t * improve tracking. Default is `local-floor`. Valid values can be found here\n\t\t * https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpace#reference_space_types.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {string} value - The reference space type.\n\t\t */\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the XR reference space.\n\t\t *\n\t\t * @return {XRReferenceSpace} The XR reference space.\n\t\t */\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom XR reference space.\n\t\t *\n\t\t * @param {XRReferenceSpace} space - The XR reference space.\n\t\t */\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current base layer.\n\t\t *\n\t\t * This is an `XRProjectionLayer` when the targeted XR device supports the\n\t\t * WebXR Layers API, or an `XRWebGLLayer` otherwise.\n\t\t *\n\t\t * @return {?(XRWebGLLayer|XRProjectionLayer)} The XR base layer.\n\t\t */\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR binding.\n\t\t *\n\t\t * Creates a new binding if needed and the browser is\n\t\t * capable of doing so.\n\t\t *\n\t\t * @return {?XRWebGLBinding} The XR binding. Returns `null` if one cannot be created.\n\t\t */\n\t\tthis.getBinding = function () {\n\n\t\t\tif ( glBinding === null && supportsGlBinding ) {\n\n\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t}\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR frame.\n\t\t *\n\t\t * @return {?XRFrame} The XR frame. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR session.\n\t\t *\n\t\t * @return {?XRSession} The XR session. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\t/**\n\t\t * After a XR session has been requested usually with one of the `*Button` modules, it\n\t\t * is injected into the renderer with this method. This method triggers the start of\n\t\t * the actual XR rendering.\n\t\t *\n\t\t * @async\n\t\t * @param {XRSession} value - The XR session to set.\n\t\t * @return {Promise} A Promise that resolves when the session has been set.\n\t\t */\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\t\trenderer.getSize( currentSize );\n\n\n\t\t\t\t// Check that the browser implements the necessary APIs to use an\n\t\t\t\t// XRProjectionLayer rather than an XRWebGLLayer\n\t\t\t\tconst supportsLayers = supportsGlBinding && 'createProjectionLayer' in XRWebGLBinding.prototype;\n\n\t\t\t\tif ( ! supportsLayers ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: attributes.antialias,\n\t\t\t\t\t\talpha: true,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glBaseLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glBaseLayer.ignoreDepthValues === false )\n\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = this.getBinding();\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glProjLayer.ignoreDepthValues === false )\n\t\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\tthis.setFoveation( foveation );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the environment blend mode from the current XR session.\n\t\t *\n\t\t * @return {'opaque'|'additive'|'alpha-blend'|undefined} The environment blend mode. Returns `undefined` when used outside of a XR session.\n\t\t */\n\t\tthis.getEnvironmentBlendMode = function () {\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\treturn session.environmentBlendMode;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current depth texture computed via depth sensing.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getDepthTexture}.\n\t\t *\n\t\t * @return {?Texture} The depth texture.\n\t\t */\n\t\tthis.getDepthTexture = function () {\n\n\t\t\treturn depthSensing.getDepthTexture();\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === -1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.connect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t *\n\t\t * @param {ArrayCamera} camera - The camera to update.\n\t\t * @param {PerspectiveCamera} cameraL - The left camera.\n\t\t * @param {PerspectiveCamera} cameraR - The right camera.\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Check if the projection uses an infinite far plane.\n\t\t\tif ( projL[ 10 ] === -1 ) {\n\n\t\t\t\t// Use the projection matrix from the left eye.\n\t\t\t\t// The camera offset is sufficient to include the view volumes\n\t\t\t\t// of both eyes (assuming symmetric projections).\n\t\t\t\tcamera.projectionMatrix.copy( cameraL.projectionMatrix );\n\t\t\t\tcamera.projectionMatrixInverse.copy( cameraL.projectionMatrixInverse );\n\n\t\t\t} else {\n\n\t\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t\t// although must now be relative to the new union camera.\n\t\t\t\tconst near2 = near + zOffset;\n\t\t\t\tconst far2 = far + zOffset;\n\t\t\t\tconst left2 = left - xOffset;\n\t\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\t/**\n\t\t * Updates the state of the XR camera. Use this method on app level if you\n\t\t * set `cameraAutoUpdate` to `false`. The method requires the non-XR\n\t\t * camera of the scene as a parameter. The passed in camera's transformation\n\t\t * is automatically adjusted to the position of the XR camera when calling\n\t\t * this method.\n\t\t *\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tlet depthNear = camera.near;\n\t\t\tlet depthFar = camera.far;\n\n\t\t\tif ( depthSensing.texture !== null ) {\n\n\t\t\t\tif ( depthSensing.depthNear > 0 ) depthNear = depthSensing.depthNear;\n\t\t\t\tif ( depthSensing.depthFar > 0 ) depthFar = depthSensing.depthFar;\n\n\t\t\t}\n\n\t\t\tcameraXR.near = cameraR.near = cameraL.near = depthNear;\n\t\t\tcameraXR.far = cameraR.far = cameraL.far = depthFar;\n\n\t\t\tif ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraXR.near,\n\t\t\t\t\tdepthFar: cameraXR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraXR.near;\n\t\t\t\t_currentDepthFar = cameraXR.far;\n\n\t\t\t}\n\n\t\t\t// inherit camera layers and enable eye layers (1 = left, 2 = right)\n\t\t\tcameraXR.layers.mask = camera.layers.mask | 0b110;\n\t\t\tcameraL.layers.mask = cameraXR.layers.mask & 0b011;\n\t\t\tcameraR.layers.mask = cameraXR.layers.mask & 0b101;\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraXR.cameras;\n\n\t\t\tupdateCamera( cameraXR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraXR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraXR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t\t// update user camera and its children\n\n\t\t\tupdateUserCamera( camera, cameraXR, parent );\n\n\t\t};\n\n\t\tfunction updateUserCamera( camera, cameraXR, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrix.copy( cameraXR.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrix.copy( parent.matrixWorld );\n\t\t\t\tcamera.matrix.invert();\n\t\t\t\tcamera.matrix.multiply( cameraXR.matrixWorld );\n\n\t\t\t}\n\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.updateMatrixWorld( true );\n\n\t\t\tcamera.projectionMatrix.copy( cameraXR.projectionMatrix );\n\t\t\tcamera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );\n\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tcamera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );\n\t\t\t\tcamera.zoom = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Returns an instance of {@link ArrayCamera} which represents the XR camera\n\t\t * of the active XR session. For each view it holds a separate camera object.\n\t\t *\n\t\t * The camera's `fov` is currently not used and does not reflect the fov of\n\t\t * the XR camera. If you need the fov on app level, you have to compute in\n\t\t * manually from the XR camera's projection matrices.\n\t\t *\n\t\t * @return {ArrayCamera} The XR camera.\n\t\t */\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraXR;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the amount of foveation used by the XR compositor for the projection layer.\n\t\t *\n\t\t * @return {number|undefined} The amount of foveation.\n\t\t */\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer === null && glBaseLayer === null ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn foveation;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the foveation value.\n\t\t *\n\t\t * @param {number} value - A number in the range `[0,1]` where `0` means no foveation (full resolution)\n\t\t * and `1` means maximum foveation (the edges render at lower resolution).\n\t\t */\n\t\tthis.setFoveation = function ( value ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tfoveation = value;\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if depth sensing is supported.\n\t\t *\n\t\t * @return {boolean} Whether depth sensing is supported or not.\n\t\t */\n\t\tthis.hasDepthSensing = function () {\n\n\t\t\treturn depthSensing.texture !== null;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the depth sensing mesh.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getMesh}.\n\t\t *\n\t\t * @return {Mesh} The depth sensing mesh.\n\t\t */\n\t\tthis.getDepthSensingMesh = function () {\n\n\t\t\treturn depthSensing.getMesh( cameraXR );\n\n\t\t};\n\n\t\t/**\n\t\t * Retrieves an opaque texture from the view-aligned {@link XRCamera}.\n\t\t * Only available during the current animation loop.\n\t\t *\n\t\t * @param {XRCamera} xrCamera - The camera to query.\n\t\t * @return {?Texture} An opaque texture representing the current raw camera frame.\n\t\t */\n\t\tthis.getCameraTexture = function ( xrCamera ) {\n\n\t\t\treturn cameraAccessTextures[ xrCamera ];\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraXRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraXR's camera list\n\n\t\t\t\tif ( views.length !== cameraXR.cameras.length ) {\n\n\t\t\t\t\tcameraXR.cameras.length = 0;\n\t\t\t\t\tcameraXRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraXR.matrix.copy( camera.matrix );\n\t\t\t\t\t\tcameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraXRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraXR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tconst enabledFeatures = session.enabledFeatures;\n\t\t\t\tconst gpuDepthSensingEnabled = enabledFeatures &&\n\t\t\t\t\tenabledFeatures.includes( 'depth-sensing' ) &&\n\t\t\t\t\tsession.depthUsage == 'gpu-optimized';\n\n\t\t\t\tif ( gpuDepthSensingEnabled && supportsGlBinding ) {\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tconst depthData = glBinding.getDepthInformation( views[ 0 ] );\n\n\t\t\t\t\tif ( depthData && depthData.isValid && depthData.texture ) {\n\n\t\t\t\t\t\tdepthSensing.init( depthData, session.renderState );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst cameraAccessEnabled = enabledFeatures &&\n\t\t\t\t enabledFeatures.includes( 'camera-access' );\n\n\t\t\t\tif ( cameraAccessEnabled && supportsGlBinding ) {\n\n\t\t\t\t\trenderer.state.unbindTexture();\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\t\tconst camera = views[ i ].camera;\n\n\t\t\t\t\t\tif ( camera ) {\n\n\t\t\t\t\t\t\tlet cameraTex = cameraAccessTextures[ camera ];\n\n\t\t\t\t\t\t\tif ( ! cameraTex ) {\n\n\t\t\t\t\t\t\t\tcameraTex = new ExternalTexture();\n\t\t\t\t\t\t\t\tcameraAccessTextures[ camera ] = cameraTex;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst glTexture = glBinding.getCameraImage( camera );\n\t\t\t\t\t\t\tcameraTex.sourceTexture = glTexture;\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\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\tif ( frame.detectedPlanes ) {\n\n\t\t\t\tscope.dispatchEvent( { type: 'planesdetected', data: frame } );\n\n\t\t\t}\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nconst _e1 = /*@__PURE__*/ new Euler();\nconst _m1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshTransformUniform( map, uniform ) {\n\n\t\tif ( map.matrixAutoUpdate === true ) {\n\n\t\t\tmap.updateMatrix();\n\n\t\t}\n\n\t\tuniform.value.copy( map.matrix );\n\n\t}\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tfog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\n\t\t\trefreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform );\n\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.bumpScale.value *= -1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\n\t\t\trefreshTransformUniform( material.normalMap, uniforms.normalMapTransform );\n\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.normalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\n\t\t\trefreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform );\n\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\trefreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t\trefreshTransformUniform( material.specularMap, uniforms.specularMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst envMap = materialProperties.envMap;\n\t\tconst envMapRotation = materialProperties.envMapRotation;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\t_e1.copy( envMapRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1.x *= -1; _e1.y *= -1; _e1.z *= -1;\n\n\t\t\tif ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1.y *= -1;\n\t\t\t\t_e1.z *= -1;\n\n\t\t\t}\n\n\t\t\tuniforms.envMapRotation.value.setFromMatrix4( _m1.makeRotationFromEuler( _e1 ) );\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\trefreshTransformUniform( material.lightMap, uniforms.lightMapTransform );\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\trefreshTransformUniform( material.aoMap, uniforms.aoMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.uvTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\trefreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform );\n\n\t\t}\n\n\t\tuniforms.roughness.value = material.roughness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\trefreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform );\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform );\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.dispersion > 0 ) {\n\n\t\t\tuniforms.dispersion.value = material.dispersion;\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t\trefreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tif ( material.anisotropy > 0 ) {\n\n\t\t\tuniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );\n\n\t\t\tif ( material.anisotropyMap ) {\n\n\t\t\t\tuniforms.anisotropyMap.value = material.anisotropyMap;\n\n\t\t\t\trefreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t\trefreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t\trefreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tconst light = properties.get( material ).light;\n\n\t\tuniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld );\n\t\tuniforms.nearDistance.value = light.shadow.camera.near;\n\t\tuniforms.farDistance.value = light.shadow.camera.far;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ); // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\t\tgl.bufferData( gl.UNIFORM_BUFFER, size, usage );\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\t\tgl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === -1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\terror( 'WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tif ( hasUniformChanged( uniform, i, j, cache ) === true ) {\n\n\t\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\t\tlet arrayOffset = 0;\n\n\t\t\t\t\tfor ( let k = 0; k < values.length; k ++ ) {\n\n\t\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\t\t// TODO add integer and struct support\n\t\t\t\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data );\n\n\t\t\t\t\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value.elements[ 0 ];\n\t\t\t\t\t\t\tuniform.__data[ 1 ] = value.elements[ 1 ];\n\t\t\t\t\t\t\tuniform.__data[ 2 ] = value.elements[ 2 ];\n\t\t\t\t\t\t\tuniform.__data[ 3 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 4 ] = value.elements[ 3 ];\n\t\t\t\t\t\t\tuniform.__data[ 5 ] = value.elements[ 4 ];\n\t\t\t\t\t\t\tuniform.__data[ 6 ] = value.elements[ 5 ];\n\t\t\t\t\t\t\tuniform.__data[ 7 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 8 ] = value.elements[ 6 ];\n\t\t\t\t\t\t\tuniform.__data[ 9 ] = value.elements[ 7 ];\n\t\t\t\t\t\t\tuniform.__data[ 10 ] = value.elements[ 8 ];\n\t\t\t\t\t\t\tuniform.__data[ 11 ] = 0;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvalue.toArray( uniform.__data, arrayOffset );\n\n\t\t\t\t\t\t\tarrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, indexArray, cache ) {\n\n\t\tconst value = uniform.value;\n\t\tconst indexString = index + '_' + indexArray;\n\n\t\tif ( cache[ indexString ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tcache[ indexString ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tcache[ indexString ] = value.clone();\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\tconst cachedObject = cache[ indexString ];\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tif ( cachedObject !== value ) {\n\n\t\t\t\t\tcache[ indexString ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( cachedObject.equals( value ) === false ) {\n\n\t\t\t\t\tcachedObject.copy( value );\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\tfor ( let k = 0, kl = values.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\tconst chunkOffset = offset % chunkSize; // offset in the current chunk\n\t\t\t\t\tconst chunkPadding = chunkOffset % info.boundary; // required padding to match boundary\n\t\t\t\t\tconst chunkStart = chunkOffset + chunkPadding; // the start position in the current chunk for the data\n\n\t\t\t\t\toffset += chunkPadding;\n\n\t\t\t\t\t// Check for chunk overflow\n\t\t\t\t\tif ( chunkStart !== 0 && ( chunkSize - chunkStart ) < info.storage ) {\n\n\t\t\t\t\t\t// Add padding and adjust offset\n\t\t\t\t\t\toffset += ( chunkSize - chunkStart );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following two properties will be used for partial buffer updates\n\t\t\t\t\tuniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\t\t\tuniform.__offset = offset;\n\n\t\t\t\t\t// Update the global offset\n\t\t\t\t\toffset += info.storage;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tconst chunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( value ) {\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t// float/int/bool\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\twarn( 'WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\twarn( 'WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Precomputed DFG LUT for Image-Based Lighting\n * Resolution: 32x32\n * Samples: 4096 per texel\n * Format: RG16F (2 half floats per texel: scale, bias)\n */\n\n\nconst DATA = new Uint16Array( [\n\t0x2cd9, 0x3b64, 0x2d0e, 0x3b43, 0x2e20, 0x3aa7, 0x3061, 0x39fb, 0x325e, 0x397c, 0x3454, 0x3908, 0x357d, 0x3893, 0x3698, 0x381e, 0x379d, 0x375b, 0x3845, 0x3689, 0x38af, 0x35ca, 0x390d, 0x351e, 0x395f, 0x3484, 0x39a8, 0x33f9, 0x39e6, 0x330a, 0x3a1c, 0x3239, 0x3a4b, 0x3183, 0x3a73, 0x30e5, 0x3a95, 0x305b, 0x3ab1, 0x2fc6, 0x3ac9, 0x2ef7, 0x3ade, 0x2e43, 0x3aee, 0x2da7, 0x3afc, 0x2d1f, 0x3b07, 0x2ca9, 0x3b10, 0x2c42, 0x3b17, 0x2bd1, 0x3b1c, 0x2b34, 0x3b1f, 0x2aaa, 0x3b22, 0x2a31, 0x3b23, 0x29c7, 0x3b23, 0x2968,\n\t0x32d4, 0x3a4b, 0x32dc, 0x3a45, 0x3308, 0x3a26, 0x3378, 0x39d0, 0x3425, 0x394a, 0x34c9, 0x38be, 0x359c, 0x383e, 0x3688, 0x3796, 0x3778, 0x36c4, 0x382f, 0x3603, 0x3898, 0x3553, 0x38f7, 0x34b3, 0x394b, 0x3424, 0x3994, 0x334c, 0x39d3, 0x326c, 0x3a08, 0x31a9, 0x3a35, 0x30fe, 0x3a5a, 0x306a, 0x3a78, 0x2fd1, 0x3a90, 0x2ef1, 0x3aa2, 0x2e2e, 0x3ab0, 0x2d86, 0x3aba, 0x2cf3, 0x3ac1, 0x2c74, 0x3ac4, 0x2c05, 0x3ac4, 0x2b49, 0x3ac2, 0x2aa1, 0x3abd, 0x2a0c, 0x3ab7, 0x298b, 0x3aaf, 0x2918, 0x3aa6, 0x28b3, 0x3a9b, 0x285a,\n\t0x3559, 0x3954, 0x355a, 0x3951, 0x3566, 0x3944, 0x3582, 0x391e, 0x35b6, 0x38d3, 0x360a, 0x386a, 0x3684, 0x37ed, 0x3720, 0x370d, 0x37d3, 0x3641, 0x3847, 0x3588, 0x38a3, 0x34e2, 0x38fa, 0x344d, 0x3948, 0x3391, 0x398d, 0x32a6, 0x39c8, 0x31d6, 0x39fa, 0x3121, 0x3a22, 0x3082, 0x3a43, 0x2ff0, 0x3a5c, 0x2f01, 0x3a6f, 0x2e32, 0x3a7c, 0x2d7e, 0x3a84, 0x2ce2, 0x3a87, 0x2c5b, 0x3a87, 0x2bcc, 0x3a83, 0x2b00, 0x3a7b, 0x2a4e, 0x3a71, 0x29b3, 0x3a66, 0x292c, 0x3a58, 0x28b4, 0x3a4b, 0x284b, 0x3a3d, 0x27dc, 0x3a2e, 0x2739,\n\t0x3709, 0x387c, 0x370a, 0x387b, 0x3710, 0x3874, 0x3720, 0x385f, 0x373d, 0x3834, 0x376a, 0x37e1, 0x37ac, 0x3732, 0x3805, 0x3675, 0x383f, 0x35bc, 0x3883, 0x3511, 0x38cb, 0x3476, 0x3912, 0x33d8, 0x3955, 0x32e2, 0x3991, 0x3208, 0x39c6, 0x3149, 0x39f1, 0x30a1, 0x3a15, 0x300f, 0x3a30, 0x2f21, 0x3a44, 0x2e45, 0x3a51, 0x2d87, 0x3a59, 0x2ce2, 0x3a5b, 0x2c53, 0x3a58, 0x2bb0, 0x3a52, 0x2ada, 0x3a49, 0x2a1f, 0x3a40, 0x297d, 0x3a34, 0x28f0, 0x3a25, 0x2874, 0x3a13, 0x2807, 0x3a00, 0x274e, 0x39eb, 0x26a6, 0x39d5, 0x2611,\n\t0x3840, 0x3780, 0x3840, 0x377e, 0x3842, 0x3776, 0x3846, 0x375e, 0x384f, 0x372a, 0x385b, 0x36d3, 0x386c, 0x3659, 0x3885, 0x35c7, 0x38a8, 0x352d, 0x38d4, 0x3497, 0x3906, 0x340c, 0x393b, 0x331a, 0x3970, 0x323a, 0x39a0, 0x3172, 0x39cb, 0x30c3, 0x39ef, 0x302a, 0x3a0c, 0x2f4a, 0x3a21, 0x2e63, 0x3a2f, 0x2d9b, 0x3a37, 0x2ced, 0x3a39, 0x2c57, 0x3a37, 0x2baa, 0x3a34, 0x2ac9, 0x3a2c, 0x2a05, 0x3a20, 0x295d, 0x3a11, 0x28ca, 0x39ff, 0x2849, 0x39eb, 0x27b2, 0x39d5, 0x26ed, 0x39be, 0x2640, 0x39a5, 0x25aa, 0x398b, 0x2523,\n\t0x38e2, 0x363b, 0x38e2, 0x363b, 0x38e3, 0x3635, 0x38e6, 0x3626, 0x38ea, 0x3606, 0x38f0, 0x35cd, 0x38f8, 0x3579, 0x3903, 0x350e, 0x3915, 0x3495, 0x392d, 0x3418, 0x394c, 0x3340, 0x3970, 0x3261, 0x3995, 0x3197, 0x39b8, 0x30e4, 0x39d8, 0x3046, 0x39f3, 0x2f76, 0x3a08, 0x2e86, 0x3a16, 0x2db5, 0x3a1e, 0x2cff, 0x3a22, 0x2c61, 0x3a24, 0x2bb3, 0x3a20, 0x2ac7, 0x3a17, 0x29fc, 0x3a0a, 0x294c, 0x39fa, 0x28b2, 0x39e7, 0x282e, 0x39d1, 0x2773, 0x39b9, 0x26a9, 0x399f, 0x25fa, 0x3985, 0x255f, 0x3968, 0x24d6, 0x394a, 0x245d,\n\t0x396e, 0x3524, 0x396e, 0x3524, 0x396e, 0x3520, 0x396f, 0x3517, 0x3971, 0x3502, 0x3973, 0x34dd, 0x3975, 0x34a5, 0x3978, 0x3458, 0x397e, 0x33f9, 0x3987, 0x3332, 0x3997, 0x326b, 0x39aa, 0x31ac, 0x39c0, 0x30fb, 0x39d7, 0x305c, 0x39eb, 0x2f9e, 0x39fc, 0x2ea7, 0x3a07, 0x2dcf, 0x3a0f, 0x2d13, 0x3a16, 0x2c70, 0x3a17, 0x2bc4, 0x3a14, 0x2ad0, 0x3a0a, 0x29fc, 0x39fd, 0x2945, 0x39ed, 0x28a6, 0x39d9, 0x281d, 0x39c2, 0x274a, 0x39a9, 0x267c, 0x398e, 0x25c7, 0x3971, 0x2528, 0x3952, 0x249e, 0x3931, 0x2425, 0x3910, 0x2374,\n\t0x39e5, 0x3436, 0x39e5, 0x3435, 0x39e5, 0x3434, 0x39e5, 0x342e, 0x39e5, 0x3420, 0x39e5, 0x3408, 0x39e3, 0x33c4, 0x39e1, 0x3359, 0x39df, 0x32d3, 0x39de, 0x323a, 0x39e1, 0x319a, 0x39e7, 0x30fb, 0x39f0, 0x3065, 0x39f9, 0x2fb6, 0x3a02, 0x2ec0, 0x3a08, 0x2de6, 0x3a0d, 0x2d26, 0x3a12, 0x2c7e, 0x3a13, 0x2bda, 0x3a0e, 0x2adc, 0x3a05, 0x2a02, 0x39f8, 0x2945, 0x39e7, 0x28a1, 0x39d3, 0x2813, 0x39bc, 0x2730, 0x39a2, 0x265c, 0x3985, 0x25a3, 0x3966, 0x2501, 0x3945, 0x2475, 0x3923, 0x23f3, 0x3901, 0x231c, 0x38dd, 0x225e,\n\t0x3a4b, 0x32d6, 0x3a4a, 0x32d6, 0x3a4a, 0x32d4, 0x3a4a, 0x32cc, 0x3a48, 0x32bb, 0x3a47, 0x329d, 0x3a43, 0x326b, 0x3a3d, 0x3222, 0x3a36, 0x31c2, 0x3a2e, 0x314f, 0x3a28, 0x30d2, 0x3a23, 0x3052, 0x3a20, 0x2fab, 0x3a1e, 0x2ec2, 0x3a1b, 0x2def, 0x3a19, 0x2d31, 0x3a1a, 0x2c89, 0x3a18, 0x2beb, 0x3a11, 0x2aea, 0x3a07, 0x2a0a, 0x39fa, 0x2948, 0x39e9, 0x28a1, 0x39d4, 0x280f, 0x39bd, 0x2721, 0x39a2, 0x2647, 0x3985, 0x258b, 0x3964, 0x24e5, 0x3942, 0x2455, 0x391f, 0x23b3, 0x38fb, 0x22d8, 0x38d4, 0x2219, 0x38ad, 0x2172,\n\t0x3aa0, 0x3180, 0x3aa0, 0x3180, 0x3aa0, 0x317f, 0x3a9f, 0x317b, 0x3a9d, 0x3170, 0x3a99, 0x315d, 0x3a95, 0x313d, 0x3a8d, 0x310c, 0x3a82, 0x30ca, 0x3a76, 0x3077, 0x3a69, 0x3019, 0x3a5c, 0x2f68, 0x3a4f, 0x2e9e, 0x3a42, 0x2dde, 0x3a37, 0x2d2b, 0x3a30, 0x2c89, 0x3a29, 0x2bef, 0x3a1f, 0x2af0, 0x3a12, 0x2a0f, 0x3a03, 0x294a, 0x39f1, 0x28a0, 0x39dc, 0x280c, 0x39c5, 0x2717, 0x39a9, 0x2638, 0x398b, 0x2578, 0x396a, 0x24d0, 0x3947, 0x243f, 0x3923, 0x2380, 0x38fc, 0x22a4, 0x38d4, 0x21e4, 0x38ac, 0x213c, 0x3883, 0x20a8,\n\t0x3ae8, 0x3062, 0x3ae8, 0x3062, 0x3ae7, 0x3061, 0x3ae6, 0x305f, 0x3ae4, 0x305a, 0x3ae0, 0x304f, 0x3ada, 0x303b, 0x3ad1, 0x301b, 0x3ac5, 0x2fdd, 0x3ab6, 0x2f6a, 0x3aa4, 0x2ede, 0x3a91, 0x2e45, 0x3a7c, 0x2da5, 0x3a67, 0x2d0a, 0x3a57, 0x2c77, 0x3a48, 0x2bdc, 0x3a38, 0x2ae5, 0x3a27, 0x2a0a, 0x3a16, 0x2947, 0x3a02, 0x289d, 0x39eb, 0x2808, 0x39d3, 0x270d, 0x39b6, 0x262b, 0x3997, 0x256a, 0x3976, 0x24bf, 0x3952, 0x242b, 0x392d, 0x2358, 0x3904, 0x227a, 0x38db, 0x21b8, 0x38b2, 0x2110, 0x3887, 0x207d, 0x385b, 0x1ff6,\n\t0x3b23, 0x2ee8, 0x3b23, 0x2ee8, 0x3b22, 0x2ee8, 0x3b21, 0x2ee7, 0x3b1f, 0x2ee3, 0x3b1a, 0x2ed6, 0x3b14, 0x2ec1, 0x3b0b, 0x2e99, 0x3afe, 0x2e60, 0x3aee, 0x2e12, 0x3ad8, 0x2dad, 0x3ac1, 0x2d3d, 0x3aa5, 0x2cc3, 0x3a8b, 0x2c48, 0x3a76, 0x2ba2, 0x3a60, 0x2ac0, 0x3a49, 0x29f2, 0x3a32, 0x2938, 0x3a1b, 0x2893, 0x3a02, 0x27ff, 0x39e8, 0x26ff, 0x39ca, 0x261e, 0x39aa, 0x255b, 0x3988, 0x24b0, 0x3964, 0x241c, 0x393d, 0x2336, 0x3913, 0x2257, 0x38e9, 0x2195, 0x38be, 0x20eb, 0x3891, 0x2059, 0x3864, 0x1fae, 0x3837, 0x1ecd,\n\t0x3b54, 0x2d61, 0x3b54, 0x2d61, 0x3b53, 0x2d61, 0x3b52, 0x2d62, 0x3b4f, 0x2d61, 0x3b4b, 0x2d5c, 0x3b45, 0x2d51, 0x3b3b, 0x2d3d, 0x3b2e, 0x2d1a, 0x3b1d, 0x2ce7, 0x3b06, 0x2ca3, 0x3aeb, 0x2c52, 0x3acb, 0x2bee, 0x3ab0, 0x2b31, 0x3a94, 0x2a74, 0x3a77, 0x29bf, 0x3a5a, 0x2915, 0x3a3f, 0x287a, 0x3a22, 0x27de, 0x3a05, 0x26e4, 0x39e5, 0x2609, 0x39c3, 0x2547, 0x39a0, 0x249f, 0x397b, 0x240c, 0x3953, 0x2314, 0x3928, 0x2238, 0x38fd, 0x2175, 0x38d0, 0x20cb, 0x38a2, 0x2038, 0x3873, 0x1f71, 0x3844, 0x1e90, 0x3815, 0x1dce,\n\t0x3b7c, 0x2c22, 0x3b7c, 0x2c22, 0x3b7b, 0x2c23, 0x3b7a, 0x2c25, 0x3b77, 0x2c27, 0x3b73, 0x2c26, 0x3b6d, 0x2c23, 0x3b64, 0x2c1a, 0x3b57, 0x2c07, 0x3b46, 0x2bd1, 0x3b2e, 0x2b79, 0x3b0f, 0x2b07, 0x3aef, 0x2a86, 0x3ad1, 0x29f8, 0x3ab0, 0x2967, 0x3a8e, 0x28d7, 0x3a6d, 0x284e, 0x3a4c, 0x279f, 0x3a2b, 0x26b7, 0x3a08, 0x25e5, 0x39e4, 0x252c, 0x39be, 0x2488, 0x3998, 0x23f0, 0x396f, 0x22f2, 0x3943, 0x2215, 0x3917, 0x2155, 0x38e8, 0x20ae, 0x38b9, 0x201c, 0x3888, 0x1f38, 0x3857, 0x1e5a, 0x3826, 0x1d9a, 0x37eb, 0x1cf0,\n\t0x3b9c, 0x2a43, 0x3b9c, 0x2a43, 0x3b9b, 0x2a46, 0x3b9a, 0x2a4a, 0x3b98, 0x2a50, 0x3b93, 0x2a54, 0x3b8e, 0x2a59, 0x3b85, 0x2a56, 0x3b79, 0x2a45, 0x3b67, 0x2a24, 0x3b4f, 0x29ee, 0x3b2f, 0x29a4, 0x3b10, 0x294b, 0x3aef, 0x28e5, 0x3ac9, 0x2877, 0x3aa4, 0x2809, 0x3a7e, 0x2739, 0x3a59, 0x266d, 0x3a34, 0x25af, 0x3a0c, 0x2503, 0x39e4, 0x2468, 0x39bb, 0x23bb, 0x3990, 0x22c6, 0x3963, 0x21f0, 0x3936, 0x2133, 0x3906, 0x208f, 0x38d5, 0x1ffd, 0x38a3, 0x1f04, 0x3870, 0x1e28, 0x383d, 0x1d69, 0x380b, 0x1cc3, 0x37b0, 0x1c32,\n\t0x3bb5, 0x28aa, 0x3bb5, 0x28ab, 0x3bb5, 0x28ad, 0x3bb4, 0x28b2, 0x3bb2, 0x28b9, 0x3bae, 0x28c2, 0x3ba8, 0x28ca, 0x3ba0, 0x28d1, 0x3b94, 0x28cd, 0x3b83, 0x28c1, 0x3b6a, 0x28a3, 0x3b4b, 0x2876, 0x3b2d, 0x283d, 0x3b09, 0x27ea, 0x3ae1, 0x274b, 0x3ab9, 0x26a6, 0x3a8f, 0x25fe, 0x3a67, 0x255d, 0x3a3d, 0x24c5, 0x3a11, 0x2439, 0x39e6, 0x2371, 0x39b9, 0x228d, 0x398a, 0x21c1, 0x395a, 0x210b, 0x3929, 0x206c, 0x38f7, 0x1fc1, 0x38c3, 0x1ecb, 0x388f, 0x1df6, 0x385a, 0x1d3a, 0x3825, 0x1c99, 0x37e1, 0x1c08, 0x3779, 0x1b1b,\n\t0x3bc9, 0x26d3, 0x3bc9, 0x26d4, 0x3bc9, 0x26d9, 0x3bc8, 0x26e3, 0x3bc6, 0x26ef, 0x3bc2, 0x2705, 0x3bbd, 0x271a, 0x3bb6, 0x2731, 0x3baa, 0x273c, 0x3b9a, 0x273d, 0x3b81, 0x2726, 0x3b65, 0x26f7, 0x3b46, 0x26af, 0x3b20, 0x2650, 0x3af7, 0x25e1, 0x3acd, 0x256a, 0x3aa1, 0x24eb, 0x3a75, 0x246f, 0x3a46, 0x23ee, 0x3a17, 0x230d, 0x39e9, 0x223e, 0x39b7, 0x2183, 0x3985, 0x20d8, 0x3953, 0x2043, 0x391e, 0x1f7a, 0x38e9, 0x1e8d, 0x38b3, 0x1dbf, 0x387c, 0x1d0b, 0x3845, 0x1c6c, 0x380e, 0x1bc4, 0x37b0, 0x1ad2, 0x3745, 0x19fd,\n\t0x3bd9, 0x24e4, 0x3bd9, 0x24e5, 0x3bd9, 0x24e8, 0x3bd8, 0x24f2, 0x3bd5, 0x24fe, 0x3bd2, 0x2512, 0x3bce, 0x252b, 0x3bc6, 0x2544, 0x3bbc, 0x255a, 0x3bac, 0x256b, 0x3b93, 0x2569, 0x3b7a, 0x2557, 0x3b5b, 0x252f, 0x3b34, 0x24f7, 0x3b0c, 0x24ad, 0x3adf, 0x2458, 0x3ab1, 0x23f8, 0x3a82, 0x233f, 0x3a4f, 0x2286, 0x3a1e, 0x21d5, 0x39eb, 0x2130, 0x39b6, 0x2098, 0x3982, 0x200e, 0x394b, 0x1f25, 0x3914, 0x1e45, 0x38dc, 0x1d83, 0x38a3, 0x1cd6, 0x386b, 0x1c3d, 0x3831, 0x1b71, 0x37f2, 0x1a87, 0x3782, 0x19bc, 0x3714, 0x1909,\n\t0x3be5, 0x22d8, 0x3be5, 0x22d9, 0x3be4, 0x22df, 0x3be4, 0x22ef, 0x3be1, 0x2305, 0x3bde, 0x232a, 0x3bda, 0x2358, 0x3bd4, 0x2392, 0x3bcb, 0x23ca, 0x3bbb, 0x23f4, 0x3ba3, 0x2405, 0x3b8c, 0x2405, 0x3b6c, 0x23ec, 0x3b47, 0x23ae, 0x3b1d, 0x2353, 0x3af0, 0x22e2, 0x3ac0, 0x2261, 0x3a8e, 0x21d9, 0x3a5a, 0x214e, 0x3a26, 0x20c7, 0x39ee, 0x2045, 0x39b7, 0x1f97, 0x397f, 0x1eba, 0x3945, 0x1df0, 0x390b, 0x1d3a, 0x38d0, 0x1c9a, 0x3895, 0x1c0a, 0x385a, 0x1b18, 0x381f, 0x1a39, 0x37c9, 0x1975, 0x3756, 0x18cc, 0x36e6, 0x1836,\n\t0x3bed, 0x20a8, 0x3bed, 0x20a9, 0x3bed, 0x20ae, 0x3bed, 0x20bb, 0x3beb, 0x20cf, 0x3be8, 0x20ef, 0x3be4, 0x2119, 0x3bde, 0x214f, 0x3bd6, 0x2189, 0x3bc6, 0x21b8, 0x3bb1, 0x21de, 0x3b9a, 0x21f2, 0x3b7b, 0x21f2, 0x3b57, 0x21d8, 0x3b2d, 0x21a4, 0x3b00, 0x215f, 0x3acf, 0x2108, 0x3a99, 0x20a8, 0x3a64, 0x2043, 0x3a2c, 0x1fba, 0x39f2, 0x1ef3, 0x39b8, 0x1e36, 0x397c, 0x1d86, 0x3940, 0x1ce5, 0x3903, 0x1c52, 0x38c6, 0x1b9e, 0x3888, 0x1ab3, 0x384a, 0x19e4, 0x380e, 0x192b, 0x37a3, 0x188b, 0x372d, 0x17f7, 0x36ba, 0x1701,\n\t0x3bf4, 0x1e23, 0x3bf4, 0x1e25, 0x3bf4, 0x1e2d, 0x3bf3, 0x1e41, 0x3bf1, 0x1e64, 0x3bef, 0x1e9c, 0x3beb, 0x1ee1, 0x3be6, 0x1f40, 0x3bde, 0x1fa7, 0x3bce, 0x2001, 0x3bbd, 0x202f, 0x3ba6, 0x204e, 0x3b88, 0x205f, 0x3b64, 0x205b, 0x3b3b, 0x2044, 0x3b0e, 0x201f, 0x3adb, 0x1fcf, 0x3aa6, 0x1f4e, 0x3a6e, 0x1ec1, 0x3a33, 0x1e2b, 0x39f7, 0x1d95, 0x39ba, 0x1d06, 0x397b, 0x1c7d, 0x393c, 0x1bfc, 0x38fc, 0x1b13, 0x38bc, 0x1a40, 0x387c, 0x1983, 0x383c, 0x18da, 0x37fa, 0x1842, 0x377f, 0x177f, 0x3706, 0x1695, 0x3691, 0x15c8,\n\t0x3bf8, 0x1bca, 0x3bf8, 0x1bcc, 0x3bf8, 0x1bd8, 0x3bf8, 0x1bf7, 0x3bf6, 0x1c1b, 0x3bf4, 0x1c45, 0x3bf1, 0x1c83, 0x3bec, 0x1cce, 0x3be4, 0x1d21, 0x3bd5, 0x1d78, 0x3bc5, 0x1dd1, 0x3bb0, 0x1e17, 0x3b93, 0x1e4a, 0x3b70, 0x1e5f, 0x3b48, 0x1e57, 0x3b1b, 0x1e35, 0x3ae7, 0x1df6, 0x3ab2, 0x1da4, 0x3a77, 0x1d44, 0x3a3a, 0x1cdb, 0x39fc, 0x1c6e, 0x39bb, 0x1c03, 0x397a, 0x1b35, 0x3938, 0x1a72, 0x38f5, 0x19bb, 0x38b3, 0x1914, 0x3870, 0x187d, 0x382e, 0x17eb, 0x37db, 0x16f9, 0x375c, 0x1621, 0x36e1, 0x1565, 0x3669, 0x14be,\n\t0x3bfb, 0x18b9, 0x3bfb, 0x18ba, 0x3bfb, 0x18c3, 0x3bfb, 0x18da, 0x3bf9, 0x190a, 0x3bf7, 0x1948, 0x3bf5, 0x19ac, 0x3bf0, 0x1a20, 0x3be9, 0x1ab3, 0x3bdb, 0x1b49, 0x3bcd, 0x1be6, 0x3bb7, 0x1c34, 0x3b9c, 0x1c6d, 0x3b7a, 0x1c8e, 0x3b54, 0x1c9e, 0x3b26, 0x1c96, 0x3af2, 0x1c75, 0x3abc, 0x1c47, 0x3a80, 0x1c09, 0x3a42, 0x1b85, 0x3a01, 0x1aec, 0x39be, 0x1a50, 0x397a, 0x19b5, 0x3935, 0x1921, 0x38f0, 0x1895, 0x38aa, 0x1814, 0x3866, 0x173a, 0x3821, 0x1665, 0x37be, 0x15a4, 0x373c, 0x14f9, 0x36be, 0x1460, 0x3644, 0x13b3,\n\t0x3bfd, 0x156b, 0x3bfd, 0x156c, 0x3bfd, 0x1578, 0x3bfd, 0x1598, 0x3bfc, 0x15dd, 0x3bfa, 0x163c, 0x3bf7, 0x16cb, 0x3bf3, 0x177b, 0x3beb, 0x1833, 0x3be0, 0x18ad, 0x3bd2, 0x192e, 0x3bbd, 0x19a6, 0x3ba4, 0x1a0c, 0x3b83, 0x1a5a, 0x3b5d, 0x1a8c, 0x3b30, 0x1a9b, 0x3afd, 0x1a86, 0x3ac6, 0x1a5c, 0x3a89, 0x1a11, 0x3a49, 0x19b7, 0x3a06, 0x194f, 0x39c1, 0x18e3, 0x397a, 0x1873, 0x3933, 0x1805, 0x38eb, 0x173a, 0x38a3, 0x1676, 0x385c, 0x15bf, 0x3816, 0x1519, 0x37a2, 0x1482, 0x371d, 0x13f7, 0x369c, 0x1306, 0x3620, 0x1231,\n\t0x3bff, 0x11cb, 0x3bff, 0x11cd, 0x3bfe, 0x11dd, 0x3bfe, 0x1219, 0x3bfd, 0x126b, 0x3bfb, 0x12e9, 0x3bf9, 0x13c5, 0x3bf5, 0x1460, 0x3bee, 0x150f, 0x3be3, 0x15c9, 0x3bd6, 0x168a, 0x3bc3, 0x174f, 0x3baa, 0x1806, 0x3b8b, 0x184f, 0x3b66, 0x1888, 0x3b39, 0x18a6, 0x3b07, 0x18ad, 0x3acf, 0x189c, 0x3a92, 0x1876, 0x3a50, 0x1840, 0x3a0c, 0x17fd, 0x39c4, 0x176a, 0x397b, 0x16ce, 0x3931, 0x1634, 0x38e6, 0x1599, 0x389c, 0x1508, 0x3852, 0x147f, 0x380a, 0x1401, 0x3788, 0x131c, 0x36ff, 0x124a, 0x367c, 0x1190, 0x35fe, 0x10ea,\n\t0x3bff, 0x0daa, 0x3bff, 0x0dad, 0x3bff, 0x0dc0, 0x3bff, 0x0e0e, 0x3bfe, 0x0e87, 0x3bfc, 0x0f14, 0x3bfb, 0x1029, 0x3bf7, 0x10d1, 0x3bf0, 0x11d3, 0x3be6, 0x12c9, 0x3bd9, 0x13fc, 0x3bc7, 0x1499, 0x3bb0, 0x152a, 0x3b92, 0x15ab, 0x3b6e, 0x1615, 0x3b42, 0x165a, 0x3b10, 0x1681, 0x3ad8, 0x1683, 0x3a9a, 0x1665, 0x3a57, 0x1629, 0x3a11, 0x15dd, 0x39c8, 0x1580, 0x397c, 0x1518, 0x3930, 0x14ae, 0x38e3, 0x1441, 0x3896, 0x13b1, 0x384a, 0x12e9, 0x37ff, 0x122f, 0x376f, 0x1182, 0x36e3, 0x10e5, 0x365e, 0x1057, 0x35de, 0x0fac,\n\t0x3c00, 0x08ea, 0x3c00, 0x08ed, 0x3c00, 0x0902, 0x3c00, 0x0961, 0x3bff, 0x09f3, 0x3bfd, 0x0abc, 0x3bfb, 0x0c1f, 0x3bf8, 0x0d15, 0x3bf1, 0x0e5b, 0x3be8, 0x0fb4, 0x3bdc, 0x10b0, 0x3bcb, 0x1190, 0x3bb5, 0x126c, 0x3b97, 0x132c, 0x3b74, 0x13de, 0x3b4a, 0x1432, 0x3b18, 0x145e, 0x3ae0, 0x1472, 0x3aa2, 0x146f, 0x3a5f, 0x1456, 0x3a17, 0x142e, 0x39cc, 0x13ee, 0x397e, 0x136b, 0x392f, 0x12e1, 0x38df, 0x124f, 0x3890, 0x11bd, 0x3842, 0x1131, 0x37eb, 0x10ac, 0x3757, 0x102e, 0x36c9, 0x0f76, 0x3640, 0x0ea3, 0x35bf, 0x0de4,\n\t0x3c00, 0x039b, 0x3c00, 0x039d, 0x3c00, 0x03b2, 0x3c00, 0x041c, 0x3bff, 0x04be, 0x3bfd, 0x05d6, 0x3bfc, 0x0764, 0x3bf8, 0x08e2, 0x3bf2, 0x0a67, 0x3bea, 0x0c1b, 0x3bde, 0x0d41, 0x3bcd, 0x0e5f, 0x3bb8, 0x0f8c, 0x3b9c, 0x1057, 0x3b7a, 0x10e5, 0x3b51, 0x1155, 0x3b20, 0x11a5, 0x3ae8, 0x11da, 0x3aaa, 0x11ef, 0x3a66, 0x11e5, 0x3a1d, 0x11c1, 0x39d0, 0x1185, 0x3980, 0x113b, 0x392e, 0x10e5, 0x38dc, 0x1087, 0x388b, 0x1028, 0x383b, 0x0f94, 0x37d9, 0x0edb, 0x3741, 0x0e2c, 0x36af, 0x0d89, 0x3625, 0x0cf2, 0x35a1, 0x0c69,\n\t0x3c00, 0x0107, 0x3c00, 0x0108, 0x3c00, 0x0110, 0x3c00, 0x0145, 0x3bff, 0x0197, 0x3bfe, 0x0224, 0x3bfc, 0x030c, 0x3bf8, 0x0478, 0x3bf3, 0x062c, 0x3beb, 0x0833, 0x3be0, 0x0979, 0x3bd0, 0x0aeb, 0x3bbc, 0x0c3d, 0x3ba0, 0x0d01, 0x3b80, 0x0dbd, 0x3b57, 0x0e69, 0x3b27, 0x0eeb, 0x3af0, 0x0f53, 0x3ab1, 0x0f8a, 0x3a6c, 0x0f9f, 0x3a22, 0x0f8b, 0x39d4, 0x0f5b, 0x3982, 0x0f0f, 0x392f, 0x0eac, 0x38da, 0x0e3d, 0x3886, 0x0dc9, 0x3834, 0x0d51, 0x37c7, 0x0cd9, 0x372c, 0x0c65, 0x3697, 0x0bef, 0x360a, 0x0b20, 0x3585, 0x0a62,\n\t0x3c00, 0x0031, 0x3c00, 0x0031, 0x3c00, 0x0034, 0x3c00, 0x004b, 0x3bff, 0x006f, 0x3bfe, 0x00c9, 0x3bfc, 0x011b, 0x3bf9, 0x0207, 0x3bf4, 0x02d6, 0x3bec, 0x0415, 0x3be1, 0x0587, 0x3bd2, 0x0703, 0x3bbf, 0x087d, 0x3ba5, 0x096a, 0x3b85, 0x0a59, 0x3b5d, 0x0b32, 0x3b2e, 0x0bee, 0x3af7, 0x0c44, 0x3ab8, 0x0c7c, 0x3a73, 0x0c9c, 0x3a28, 0x0ca4, 0x39d8, 0x0c98, 0x3985, 0x0c77, 0x392f, 0x0c4a, 0x38d9, 0x0c10, 0x3882, 0x0ba0, 0x382e, 0x0b14, 0x37b6, 0x0a84, 0x3717, 0x09f5, 0x3680, 0x0969, 0x35f0, 0x08e6, 0x356a, 0x086a,\n\t0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x000d, 0x3bff, 0x0021, 0x3bfe, 0x003b, 0x3bfd, 0x0070, 0x3bf9, 0x00c7, 0x3bf4, 0x012e, 0x3bed, 0x01c8, 0x3be3, 0x0274, 0x3bd4, 0x033b, 0x3bc1, 0x043a, 0x3ba8, 0x0534, 0x3b89, 0x0641, 0x3b62, 0x073b, 0x3b34, 0x0815, 0x3afd, 0x087c, 0x3abf, 0x08d0, 0x3a7a, 0x090a, 0x3a2e, 0x092c, 0x39dd, 0x0936, 0x3988, 0x0928, 0x3930, 0x0907, 0x38d7, 0x08d7, 0x387f, 0x089b, 0x3828, 0x0855, 0x37a7, 0x080b, 0x3704, 0x077b, 0x366a, 0x06e1, 0x35d8, 0x0649, 0x3550, 0x05b8,\n\t0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0003, 0x3bff, 0x0012, 0x3bfe, 0x001a, 0x3bfd, 0x0035, 0x3bfa, 0x0050, 0x3bf4, 0x0061, 0x3bed, 0x00a5, 0x3be4, 0x00ee, 0x3bd6, 0x0146, 0x3bc3, 0x01ab, 0x3bab, 0x0211, 0x3b8d, 0x028e, 0x3b67, 0x0303, 0x3b39, 0x0375, 0x3b04, 0x03e2, 0x3ac6, 0x0441, 0x3a80, 0x0492, 0x3a34, 0x04cd, 0x39e1, 0x04f2, 0x398b, 0x0504, 0x3931, 0x0502, 0x38d6, 0x04ec, 0x387c, 0x04c7, 0x3822, 0x0496, 0x3798, 0x045c, 0x36f2, 0x041a, 0x3655, 0x03d5, 0x35c1, 0x038e, 0x3537, 0x0347\n] );\n\nlet lut = null;\n\nfunction getDFGLUT() {\n\n\tif ( lut === null ) {\n\n\t\tlut = new DataTexture( DATA, 32, 32, RGFormat, HalfFloatType );\n\t\tlut.minFilter = LinearFilter;\n\t\tlut.magFilter = LinearFilter;\n\t\tlut.wrapS = ClampToEdgeWrapping;\n\t\tlut.wrapT = ClampToEdgeWrapping;\n\t\tlut.generateMipmaps = false;\n\t\tlut.needsUpdate = true;\n\n\t}\n\n\treturn lut;\n\n}\n\n/**\n * This renderer uses WebGL 2 to display scenes.\n *\n * WebGL 1 is not supported since `r163`.\n */\nclass WebGLRenderer {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer~Options} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tconst {\n\t\t\tcanvas = createCanvasElement(),\n\t\t\tcontext = null,\n\t\t\tdepth = true,\n\t\t\tstencil = false,\n\t\t\talpha = false,\n\t\t\tantialias = false,\n\t\t\tpremultipliedAlpha = true,\n\t\t\tpreserveDrawingBuffer = false,\n\t\t\tpowerPreference = 'default',\n\t\t\tfailIfMajorPerformanceCaveat = false,\n\t\t\treversedDepthBuffer = false,\n\t\t} = parameters;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderer = true;\n\n\t\tlet _alpha;\n\n\t\tif ( context !== null ) {\n\n\t\t\tif ( typeof WebGLRenderingContext !== 'undefined' && context instanceof WebGLRenderingContext ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer: WebGL 1 is not supported since r163.' );\n\n\t\t\t}\n\n\t\t\t_alpha = context.getContextAttributes().alpha;\n\n\t\t} else {\n\n\t\t\t_alpha = alpha;\n\n\t\t}\n\n\t\tconst INTEGER_FORMATS = new Set( [\n\t\t\tRGBAIntegerFormat,\n\t\t\tRGIntegerFormat,\n\t\t\tRedIntegerFormat\n\t\t] );\n\n\t\tconst UNSIGNED_TYPES = new Set( [\n\t\t\tUnsignedByteType,\n\t\t\tUnsignedIntType,\n\t\t\tUnsignedShortType,\n\t\t\tUnsignedInt248Type,\n\t\t\tUnsignedShort4444Type,\n\t\t\tUnsignedShort5551Type\n\t\t] );\n\n\t\tconst uintClearColor = new Uint32Array( 4 );\n\t\tconst intClearColor = new Int32Array( 4 );\n\n\t\tlet currentRenderList = null;\n\t\tlet currentRenderState = null;\n\n\t\t// render() can be called from within a callback triggered by another render.\n\t\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\t\tconst renderListStack = [];\n\t\tconst renderStateStack = [];\n\n\t\t// public properties\n\n\t\t/**\n\t\t * A canvas where the renderer draws its output.This is automatically created by the renderer\n\t\t * in the constructor (if not provided already); you just need to add it to your page like so:\n\t\t * ```js\n\t\t * document.body.appendChild( renderer.domElement );\n\t\t * ```\n\t\t *\n\t\t * @type {HTMLCanvasElement|OffscreenCanvas}\n\t\t */\n\t\tthis.domElement = canvas;\n\n\t\t/**\n\t\t * A object with debug configuration settings.\n\t\t *\n\t\t * - `checkShaderErrors`: If it is `true`, defines whether material shader programs are\n\t\t * checked for errors during compilation and linkage process. It may be useful to disable\n\t\t * this check in production for performance gain. It is strongly recommended to keep these\n\t\t * checks enabled during development. If the shader does not compile and link - it will not\n\t\t * work and associated material will not render.\n\t\t * - `onShaderError(gl, program, glVertexShader,glFragmentShader)`: A callback function that\n\t\t * can be used for custom error reporting. The callback receives the WebGL context, an instance\n\t\t * of WebGLProgram as well two instances of WebGLShader representing the vertex and fragment shader.\n\t\t * Assigning a custom function disables the default error reporting.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.debug = {\n\n\t\t\t/**\n\t\t\t * Enables error checking and reporting when shader programs are being compiled.\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tcheckShaderErrors: true,\n\t\t\t/**\n\t\t\t * Callback for custom error reporting.\n\t\t\t * @type {?Function}\n\t\t\t */\n\t\t\tonShaderError: null\n\t\t};\n\n\t\t// clearing\n\n\t\t/**\n\t\t * Whether the renderer should automatically clear its output before rendering a frame or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClear = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the color buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearColor = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearDepth = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\t/**\n\t\t * Whether the renderer should sort objects or not.\n\t\t *\n\t\t * Note: Sorting is used to attempt to properly render objects that have some\n\t\t * degree of transparency. By definition, sorting objects may not work in all\n\t\t * cases. Depending on the needs of application, it may be necessary to turn\n\t\t * off sorting and use other methods to deal with transparency rendering e.g.\n\t\t * manually determining each object's rendering order.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\t/**\n\t\t * User-defined clipping planes specified in world space. These planes apply globally.\n\t\t * Points in space whose dot product with the plane is negative are cut away.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.clippingPlanes = [];\n\n\t\t/**\n\t\t * Whether the renderer respects object-level clipping planes or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.localClippingEnabled = false;\n\n\t\t// tone mapping\n\n\t\t/**\n\t\t * The tone mapping technique of the renderer.\n\t\t *\n\t\t * @type {(NoToneMapping|LinearToneMapping|ReinhardToneMapping|CineonToneMapping|ACESFilmicToneMapping|CustomToneMapping|AgXToneMapping|NeutralToneMapping)}\n\t\t * @default NoToneMapping\n\t\t */\n\t\tthis.toneMapping = NoToneMapping;\n\n\t\t/**\n\t\t * Exposure level of tone mapping.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.toneMappingExposure = 1.0;\n\n\t\t// transmission\n\n\t\t/**\n\t\t * The normalized resolution scale for the transmission render target, measured in percentage\n\t\t * of viewport dimensions. Lowering this value can result in significant performance improvements\n\t\t * when using {@link MeshPhysicalMaterial#transmission}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.transmissionResolutionScale = 1.0;\n\n\t\t// internal properties\n\n\t\tconst _this = this;\n\n\t\tlet _isContextLost = false;\n\n\t\t// internal state cache\n\n\t\tthis._outputColorSpace = SRGBColorSpace;\n\n\t\tlet _currentActiveCubeFace = 0;\n\t\tlet _currentActiveMipmapLevel = 0;\n\t\tlet _currentRenderTarget = null;\n\t\tlet _currentMaterialId = -1;\n\n\t\tlet _currentCamera = null;\n\n\t\tconst _currentViewport = new Vector4();\n\t\tconst _currentScissor = new Vector4();\n\t\tlet _currentScissorTest = null;\n\n\t\tconst _currentClearColor = new Color( 0x000000 );\n\t\tlet _currentClearAlpha = 0;\n\n\t\t//\n\n\t\tlet _width = canvas.width;\n\t\tlet _height = canvas.height;\n\n\t\tlet _pixelRatio = 1;\n\t\tlet _opaqueSort = null;\n\t\tlet _transparentSort = null;\n\n\t\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\t\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\t\tlet _scissorTest = false;\n\n\t\t// frustum\n\n\t\tconst _frustum = new Frustum();\n\n\t\t// clipping\n\n\t\tlet _clippingEnabled = false;\n\t\tlet _localClippingEnabled = false;\n\n\t\t// camera matrices cache\n\n\t\tconst _projScreenMatrix = new Matrix4();\n\n\t\tconst _vector3 = new Vector3();\n\n\t\tconst _vector4 = new Vector4();\n\n\t\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\t\tlet _renderBackground = false;\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\t// initialize\n\n\t\tlet _gl = context;\n\n\t\tfunction getContext( contextName, contextAttributes ) {\n\n\t\t\treturn canvas.getContext( contextName, contextAttributes );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tconst contextAttributes = {\n\t\t\t\talpha: true,\n\t\t\t\tdepth,\n\t\t\t\tstencil,\n\t\t\t\tantialias,\n\t\t\t\tpremultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer,\n\t\t\t\tpowerPreference,\n\t\t\t\tfailIfMajorPerformanceCaveat,\n\t\t\t};\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t\tcanvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tconst contextName = 'webgl2';\n\n\t\t\t\t_gl = getContext( contextName, contextAttributes );\n\n\t\t\t\tif ( _gl === null ) {\n\n\t\t\t\t\tif ( getContext( contextName ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLRenderer: ' + error.message );\n\t\t\tthrow error;\n\n\t\t}\n\n\t\tlet extensions, capabilities, state, info;\n\t\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\t\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\t\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\t\tlet utils, bindingStates, uniformsGroups;\n\n\t\tfunction initGLContext() {\n\n\t\t\textensions = new WebGLExtensions( _gl );\n\t\t\textensions.init();\n\n\t\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );\n\n\t\t\tstate = new WebGLState( _gl, extensions );\n\n\t\t\tif ( capabilities.reversedDepthBuffer && reversedDepthBuffer ) {\n\n\t\t\t\tstate.buffers.depth.setReversed( true );\n\n\t\t\t}\n\n\t\t\tinfo = new WebGLInfo( _gl );\n\t\t\tproperties = new WebGLProperties();\n\t\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\t\tattributes = new WebGLAttributes( _gl );\n\t\t\tbindingStates = new WebGLBindingStates( _gl, attributes );\n\t\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\t\tclipping = new WebGLClipping( properties );\n\t\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\t\trenderLists = new WebGLRenderLists();\n\t\t\trenderStates = new WebGLRenderStates( extensions );\n\t\t\tbackground = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );\n\t\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );\n\t\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );\n\n\t\t\tinfo.programs = programCache.programs;\n\n\t\t\t/**\n\t\t\t * Holds details about the capabilities of the current rendering context.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#capabilities\n\t\t\t * @type {WebGLRenderer~Capabilities}\n\t\t\t */\n\t\t\t_this.capabilities = capabilities;\n\n\t\t\t/**\n\t\t\t * Provides methods for retrieving and testing WebGL extensions.\n\t\t\t *\n\t\t\t * - `get(extensionName:string)`: Used to check whether a WebGL extension is supported\n\t\t\t * and return the extension object if available.\n\t\t\t * - `has(extensionName:string)`: returns `true` if the extension is supported.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#extensions\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.extensions = extensions;\n\n\t\t\t/**\n\t\t\t * Used to track properties of other objects like native WebGL objects.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#properties\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.properties = properties;\n\n\t\t\t/**\n\t\t\t * Manages the render lists of the renderer.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#renderLists\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.renderLists = renderLists;\n\n\n\n\t\t\t/**\n\t\t\t * Interface for managing shadows.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#shadowMap\n\t\t\t * @type {WebGLRenderer~ShadowMap}\n\t\t\t */\n\t\t\t_this.shadowMap = shadowMap;\n\n\t\t\t/**\n\t\t\t * Interface for managing the WebGL state.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#state\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.state = state;\n\n\t\t\t/**\n\t\t\t * Holds a series of statistical information about the GPU memory\n\t\t\t * and the rendering process. Useful for debugging and monitoring.\n\t\t\t *\n\t\t\t * By default these data are reset at each render call but when having\n\t\t\t * multiple render passes per frame (e.g. when using post processing) it can\n\t\t\t * be preferred to reset with a custom pattern. First, set `autoReset` to\n\t\t\t * `false`.\n\t\t\t * ```js\n\t\t\t * renderer.info.autoReset = false;\n\t\t\t * ```\n\t\t\t * Call `reset()` whenever you have finished to render a single frame.\n\t\t\t * ```js\n\t\t\t * renderer.info.reset();\n\t\t\t * ```\n\t\t\t *\n\t\t\t * @name WebGLRenderer#info\n\t\t\t * @type {WebGLRenderer~Info}\n\t\t\t */\n\t\t\t_this.info = info;\n\n\t\t}\n\n\t\tinitGLContext();\n\n\t\t// xr\n\n\t\tconst xr = new WebXRManager( _this, _gl );\n\n\t\t/**\n\t\t * A reference to the XR manager.\n\t\t *\n\t\t * @type {WebXRManager}\n\t\t */\n\t\tthis.xr = xr;\n\n\t\t/**\n\t\t * Returns the rendering context.\n\t\t *\n\t\t * @return {WebGL2RenderingContext} The rendering context.\n\t\t */\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the rendering context attributes.\n\t\t *\n\t\t * @return {WebGLContextAttributes} The rendering context attributes.\n\t\t */\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a loss of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextLoss = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.loseContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a restore of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextRestore = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.restoreContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the pixel ratio.\n\t\t *\n\t\t * @return {number} The pixel ratio.\n\t\t */\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the given pixel ratio and resizes the canvas if necessary.\n\t\t *\n\t\t * @param {number} value - The pixel ratio.\n\t\t */\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _width, _height, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the renderer's size in logical pixels. This method does not honor the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The renderer's size in logical pixels.\n\t\t */\n\t\tthis.getSize = function ( target ) {\n\n\t\t\treturn target.set( _width, _height );\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the output canvas to (width, height) with device pixel ratio taken\n\t\t * into account, and also sets the viewport to fit that size, starting in (0,\n\t\t * 0). Setting `updateStyle` to false prevents any style changes to the output canvas.\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {boolean} [updateStyle=true] - Whether to update the `style` attribute of the canvas or not.\n\t\t */\n\t\tthis.setSize = function ( width, height, updateStyle = true ) {\n\n\t\t\tif ( xr.isPresenting ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\tcanvas.width = Math.floor( width * _pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * _pixelRatio );\n\n\t\t\tif ( updateStyle === true ) {\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the drawing buffer size in physical pixels. This method honors the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The drawing buffer size.\n\t\t */\n\t\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t\t};\n\n\t\t/**\n\t\t * This method allows to define the drawing buffer size by specifying\n\t\t * width, height and pixel ratio all at once. The size of the drawing\n\t\t * buffer is computed with this formula:\n\t\t * ```js\n\t\t * size.x = width * pixelRatio;\n\t\t * size.y = height * pixelRatio;\n\t\t * ```\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {number} pixelRatio - The pixel ratio.\n\t\t */\n\t\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_pixelRatio = pixelRatio;\n\n\t\t\tcanvas.width = Math.floor( width * pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * pixelRatio );\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current viewport definition.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The current viewport definition.\n\t\t */\n\t\tthis.getCurrentViewport = function ( target ) {\n\n\t\t\treturn target.copy( _currentViewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the viewport definition.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The viewport definition.\n\t\t */\n\t\tthis.getViewport = function ( target ) {\n\n\t\t\treturn target.copy( _viewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the viewport to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the viewport.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t\t * @param {number} width - The width of the viewport in logical pixel unit.\n\t\t * @param {number} height - The height of the viewport in logical pixel unit.\n\t\t */\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_viewport.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the scissor region.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The scissor region.\n\t\t */\n\t\tthis.getScissor = function ( target ) {\n\n\t\t\treturn target.copy( _scissor );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the scissor region to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the scissor region origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the scissor region.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the scissor region origin in logical pixel unit.\n\t\t * @param {number} width - The width of the scissor region in logical pixel unit.\n\t\t * @param {number} height - The height of the scissor region in logical pixel unit.\n\t\t */\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_scissor.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if the scissor test is enabled.\n\t\t *\n\t\t * @return {boolean} Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.getScissorTest = function () {\n\n\t\t\treturn _scissorTest;\n\n\t\t};\n\n\t\t/**\n\t\t * Enable or disable the scissor test. When this is enabled, only the pixels\n\t\t * within the defined scissor area will be affected by further renderer\n\t\t * actions.\n\t\t *\n\t\t * @param {boolean} boolean - Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom opaque sort function for the render lists. Pass `null`\n\t\t * to use the default `painterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setOpaqueSort = function ( method ) {\n\n\t\t\t_opaqueSort = method;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom transparent sort function for the render lists. Pass `null`\n\t\t * to use the default `reversePainterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setTransparentSort = function ( method ) {\n\n\t\t\t_transparentSort = method;\n\n\t\t};\n\n\t\t// Clearing\n\n\t\t/**\n\t\t * Returns the clear color.\n\t\t *\n\t\t * @param {Color} target - The method writes the result in this target object.\n\t\t * @return {Color} The clear color.\n\t\t */\n\t\tthis.getClearColor = function ( target ) {\n\n\t\t\treturn target.copy( background.getClearColor() );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear color and alpha.\n\t\t *\n\t\t * @param {Color} color - The clear color.\n\t\t * @param {number} [alpha=1] - The clear alpha.\n\t\t */\n\t\tthis.setClearColor = function () {\n\n\t\t\tbackground.setClearColor( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the clear alpha. Ranges within `[0,1]`.\n\t\t *\n\t\t * @return {number} The clear alpha.\n\t\t */\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn background.getClearAlpha();\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear alpha.\n\t\t *\n\t\t * @param {number} alpha - The clear alpha.\n\t\t */\n\t\tthis.setClearAlpha = function () {\n\n\t\t\tbackground.setClearAlpha( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Tells the renderer to clear its color, depth or stencil drawing buffer(s).\n\t\t * This method initializes the buffers to the current clear color values.\n\t\t *\n\t\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t\t */\n\t\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\t\tlet bits = 0;\n\n\t\t\tif ( color ) {\n\n\t\t\t\t// check if we're trying to clear an integer target\n\t\t\t\tlet isIntegerFormat = false;\n\t\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t\tconst targetFormat = _currentRenderTarget.texture.format;\n\t\t\t\t\tisIntegerFormat = INTEGER_FORMATS.has( targetFormat );\n\n\t\t\t\t}\n\n\t\t\t\t// use the appropriate clear functions to clear the target if it's a signed\n\t\t\t\t// or unsigned integer target\n\t\t\t\tif ( isIntegerFormat ) {\n\n\t\t\t\t\tconst targetType = _currentRenderTarget.texture.type;\n\t\t\t\t\tconst isUnsignedType = UNSIGNED_TYPES.has( targetType );\n\n\t\t\t\t\tconst clearColor = background.getClearColor();\n\t\t\t\t\tconst a = background.getClearAlpha();\n\t\t\t\t\tconst r = clearColor.r;\n\t\t\t\t\tconst g = clearColor.g;\n\t\t\t\t\tconst b = clearColor.b;\n\n\t\t\t\t\tif ( isUnsignedType ) {\n\n\t\t\t\t\t\tuintClearColor[ 0 ] = r;\n\t\t\t\t\t\tuintClearColor[ 1 ] = g;\n\t\t\t\t\t\tuintClearColor[ 2 ] = b;\n\t\t\t\t\t\tuintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tintClearColor[ 0 ] = r;\n\t\t\t\t\t\tintClearColor[ 1 ] = g;\n\t\t\t\t\t\tintClearColor[ 2 ] = b;\n\t\t\t\t\t\tintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferiv( _gl.COLOR, 0, intClearColor );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbits |= _gl.COLOR_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( depth ) {\n\n\t\t\t\tbits |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t}\n\n\t\t\tif ( stencil ) {\n\n\t\t\t\tbits |= _gl.STENCIL_BUFFER_BIT;\n\t\t\t\tthis.state.buffers.stencil.setMask( 0xffffffff );\n\n\t\t\t}\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the color buffer. Equivalent to calling `renderer.clear( true, false, false )`.\n\t\t */\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the depth buffer. Equivalent to calling `renderer.clear( false, true, false )`.\n\t\t */\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the stencil buffer. Equivalent to calling `renderer.clear( false, false, true )`.\n\t\t */\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\tcanvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tbackground.dispose();\n\t\t\trenderLists.dispose();\n\t\t\trenderStates.dispose();\n\t\t\tproperties.dispose();\n\t\t\tcubemaps.dispose();\n\t\t\tcubeuvmaps.dispose();\n\t\t\tobjects.dispose();\n\t\t\tbindingStates.dispose();\n\t\t\tuniformsGroups.dispose();\n\t\t\tprogramCache.dispose();\n\n\t\t\txr.dispose();\n\n\t\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t\tanimation.stop();\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tlog( 'WebGLRenderer: Context Lost.' );\n\n\t\t\t_isContextLost = true;\n\n\t\t}\n\n\t\tfunction onContextRestore( /* event */ ) {\n\n\t\t\tlog( 'WebGLRenderer: Context Restored.' );\n\n\t\t\t_isContextLost = false;\n\n\t\t\tconst infoAutoReset = info.autoReset;\n\t\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\t\tconst shadowMapType = shadowMap.type;\n\n\t\t\tinitGLContext();\n\n\t\t\tinfo.autoReset = infoAutoReset;\n\t\t\tshadowMap.enabled = shadowMapEnabled;\n\t\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\t\tshadowMap.type = shadowMapType;\n\n\t\t}\n\n\t\tfunction onContextCreationError( event ) {\n\n\t\t\terror( 'WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tconst material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReferences( material );\n\n\t\t\tproperties.remove( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\t\tconst programs = properties.get( material ).programs;\n\n\t\t\tif ( programs !== undefined ) {\n\n\t\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\t//\n\n\t\t\tlet index = geometry.index;\n\t\t\tlet rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\n\t\t\t\tif ( index === undefined ) return;\n\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst drawRange = geometry.drawRange;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet drawStart = drawRange.start * rangeFactor;\n\t\t\tlet drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\t\tif ( group !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, group.start * rangeFactor );\n\t\t\t\tdrawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );\n\n\t\t\t}\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, index.count );\n\n\t\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, position.count );\n\n\t\t\t}\n\n\t\t\tconst drawCount = drawEnd - drawStart;\n\n\t\t\tif ( drawCount < 0 || drawCount === Infinity ) return;\n\n\t\t\t//\n\n\t\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\t\tlet attribute;\n\t\t\tlet renderer = bufferRenderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattribute = attributes.get( index );\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( attribute );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tif ( object._multiDrawInstances !== null ) {\n\n\t\t\t\t\t// @deprecated, r174\n\t\t\t\t\twarnOnce( 'WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );\n\t\t\t\t\trenderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! extensions.get( 'WEBGL_multi_draw' ) ) {\n\n\t\t\t\t\t\tconst starts = object._multiDrawStarts;\n\t\t\t\t\t\tconst counts = object._multiDrawCounts;\n\t\t\t\t\t\tconst drawCount = object._multiDrawCount;\n\t\t\t\t\t\tconst bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1;\n\t\t\t\t\t\tconst uniforms = properties.get( material ).currentProgram.getUniforms();\n\t\t\t\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\t\t\t\tuniforms.setValue( _gl, '_gl_DrawID', i );\n\t\t\t\t\t\t\trenderer.render( starts[ i ] / bytesPerElement, counts[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\trenderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isInstancedMesh ) {\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tconst maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;\n\t\t\t\tconst instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Compile\n\n\t\tfunction prepareMaterial( material, scene, object ) {\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Compiles all materials in the scene with the camera. This is useful to precompile shaders\n\t\t * before the first rendering. If you want to add a 3D object to an existing scene, use the third\n\t\t * optional parameter for applying the target scene.\n\t\t *\n\t\t * Note that the (target) scene's lighting and environment must be configured before calling this method.\n\t\t *\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Set} The precompiled materials.\n\t\t */\n\t\tthis.compile = function ( scene, camera, targetScene = null ) {\n\n\t\t\tif ( targetScene === null ) targetScene = scene;\n\n\t\t\tcurrentRenderState = renderStates.get( targetScene );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t// gather lights from both the target scene and the new object that will be added to the scene.\n\n\t\t\ttargetScene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( scene !== targetScene ) {\n\n\t\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\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\tcurrentRenderState.setupLights();\n\n\t\t\t// Only initialize materials in the new scene, not the targetScene.\n\n\t\t\tconst materials = new Set();\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( ! ( object.isMesh || object.isPoints || object.isLine || object.isSprite ) ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material ) {\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\t\tprepareMaterial( material2, targetScene, object );\n\t\t\t\t\t\t\tmaterials.add( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tprepareMaterial( material, targetScene, object );\n\t\t\t\t\t\tmaterials.add( material );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tcurrentRenderState = renderStateStack.pop();\n\n\t\t\treturn materials;\n\n\t\t};\n\n\t\t// compileAsync\n\n\t\t/**\n\t\t * Asynchronous version of {@link WebGLRenderer#compile}.\n\t\t *\n\t\t * This method makes use of the `KHR_parallel_shader_compile` WebGL extension. Hence,\n\t\t * it is recommended to use this version of `compile()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Promise} A Promise that resolves when the given scene can be rendered without unnecessary stalling due to shader compilation.\n\t\t */\n\t\tthis.compileAsync = function ( scene, camera, targetScene = null ) {\n\n\t\t\tconst materials = this.compile( scene, camera, targetScene );\n\n\t\t\t// Wait for all the materials in the new object to indicate that they're\n\t\t\t// ready to be used before resolving the promise.\n\n\t\t\treturn new Promise( ( resolve ) => {\n\n\t\t\t\tfunction checkMaterialsReady() {\n\n\t\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\t\tconst materialProperties = properties.get( material );\n\t\t\t\t\t\tconst program = materialProperties.currentProgram;\n\n\t\t\t\t\t\tif ( program.isReady() ) {\n\n\t\t\t\t\t\t\t// remove any programs that report they're ready to use from the list\n\t\t\t\t\t\t\tmaterials.delete( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\t// once the list of compiling materials is empty, call the callback\n\n\t\t\t\t\tif ( materials.size === 0 ) {\n\n\t\t\t\t\t\tresolve( scene );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if some materials are still not ready, wait a bit and check again\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {\n\n\t\t\t\t\t// If we can check the compilation status of the materials without\n\t\t\t\t\t// blocking then do so right away.\n\n\t\t\t\t\tcheckMaterialsReady();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise start by waiting a bit to give the materials we just\n\t\t\t\t\t// initialized a chance to finish.\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time ) {\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t\t}\n\n\t\tfunction onXRSessionStart() {\n\n\t\t\tanimation.stop();\n\n\t\t}\n\n\t\tfunction onXRSessionEnd() {\n\n\t\t\tanimation.start();\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\t\t/**\n\t\t * Applications are advised to always define the animation loop\n\t\t * with this method and not manually with `requestAnimationFrame()`\n\t\t * for best compatibility.\n\t\t *\n\t\t * @param {?onAnimationCallback} callback - The application's animation loop.\n\t\t */\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\t\t\txr.setAnimationLoop( callback );\n\n\t\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t\t};\n\n\t\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t// Rendering\n\n\t\t/**\n\t\t * Renders the given scene (or other type of 3D object) using the given camera.\n\t\t *\n\t\t * The render is done to a previously specified render target set by calling {@link WebGLRenderer#setRenderTarget}\n\t\t * or to the canvas as usual.\n\t\t *\n\t\t * By default render buffers are cleared before rendering but you can prevent\n\t\t * this by setting the property `autoClear` to `false`. If you want to prevent\n\t\t * only certain buffers being cleared you can `autoClearColor`, `autoClearDepth`\n\t\t * or `autoClearStencil` to `false`. To force a clear, use {@link WebGLRenderer#clear}.\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\terror( 'WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( _isContextLost === true ) return;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix, WebGLCoordinateSystem, camera.reversedDepth );\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );\n\n\t\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\t\tcurrentRenderList.init();\n\n\t\t\trenderListStack.push( currentRenderList );\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tconst depthSensingMesh = _this.xr.getDepthSensingMesh();\n\n\t\t\t\tif ( depthSensingMesh !== null ) {\n\n\t\t\t\t\tprojectObject( depthSensingMesh, camera, - Infinity, _this.sortObjects );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\t\tcurrentRenderList.finish();\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t\t}\n\n\t\t\t_renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;\n\t\t\tif ( _renderBackground ) {\n\n\t\t\t\tbackground.addToRenderList( currentRenderList, scene );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis.info.render.frame ++;\n\n\t\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t\t//\n\n\t\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t\t// render scene\n\n\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) {\n\n\t\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\t\trenderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _currentRenderTarget !== null && _currentActiveMipmapLevel === 0 ) {\n\n\t\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t\t// _gl.finish();\n\n\t\t\tbindingStates.resetDefaultState();\n\t\t\t_currentMaterialId = -1;\n\t\t\t_currentCamera = null;\n\n\t\t\trenderStateStack.pop();\n\n\t\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera );\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderState = null;\n\n\t\t\t}\n\n\t\t\trenderListStack.pop();\n\n\t\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderList = null;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tconst visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isGroup ) {\n\n\t\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\t_vector4.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( object.boundingSphere.center );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( geometry.boundingSphere.center );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_vector4\n\t\t\t\t\t\t\t\t.applyMatrix4( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\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\tconst children = object.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\t\tconst { opaque: opaqueObjects, transmissive: transmissiveObjects, transparent: transparentObjects } = currentRenderList;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\tstate.setPolygonOffset( false );\n\n\t\t}\n\n\t\tfunction renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tif ( overrideMaterial !== null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) {\n\n\t\t\t\tcurrentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, {\n\t\t\t\t\tgenerateMipmaps: true,\n\t\t\t\t\ttype: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\t\tsamples: 4,\n\t\t\t\t\tstencilBuffer: stencil,\n\t\t\t\t\tresolveDepthBuffer: false,\n\t\t\t\t\tresolveStencilBuffer: false,\n\t\t\t\t\tcolorSpace: ColorManagement.workingColorSpace,\n\t\t\t\t} );\n\n\t\t\t\t// debug\n\n\t\t\t\t/*\n\t\t\t\tconst geometry = new PlaneGeometry();\n\t\t\t\tconst material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } );\n\n\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\tscene.add( mesh );\n\t\t\t\t*/\n\n\t\t\t}\n\n\t\t\tconst transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ];\n\n\t\t\tconst activeViewport = camera.viewport || _currentViewport;\n\t\t\ttransmissionRenderTarget.setSize( activeViewport.z * _this.transmissionResolutionScale, activeViewport.w * _this.transmissionResolutionScale );\n\n\t\t\t//\n\n\t\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t\tconst currentActiveCubeFace = _this.getActiveCubeFace();\n\t\t\tconst currentActiveMipmapLevel = _this.getActiveMipmapLevel();\n\n\t\t\t_this.setRenderTarget( transmissionRenderTarget );\n\n\t\t\t_this.getClearColor( _currentClearColor );\n\t\t\t_currentClearAlpha = _this.getClearAlpha();\n\t\t\tif ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );\n\n\t\t\t_this.clear();\n\n\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\t\tconst currentToneMapping = _this.toneMapping;\n\t\t\t_this.toneMapping = NoToneMapping;\n\n\t\t\t// Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector).\n\t\t\t// Transmission render pass requires viewport to match the transmissionRenderTarget.\n\t\t\tconst currentCameraViewport = camera.viewport;\n\t\t\tif ( camera.viewport !== undefined ) camera.viewport = undefined;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131\n\n\t\t\t\tlet renderTargetNeedsUpdate = false;\n\n\t\t\t\tfor ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst renderItem = transmissiveObjects[ i ];\n\n\t\t\t\t\tconst { object, geometry, material, group } = renderItem;\n\n\t\t\t\t\tif ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tconst currentSide = material.side;\n\n\t\t\t\t\t\tmaterial.side = BackSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t\t\tmaterial.side = currentSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderTargetNeedsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetNeedsUpdate === true ) {\n\n\t\t\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_this.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\t\t_this.setClearColor( _currentClearColor, _currentClearAlpha );\n\n\t\t\tif ( currentCameraViewport !== undefined ) camera.viewport = currentCameraViewport;\n\n\t\t\t_this.toneMapping = currentToneMapping;\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\t\tconst { object, geometry, group } = renderItem;\n\t\t\t\tlet material = renderItem.material;\n\n\t\t\t\tif ( material.allowOverride === true && overrideMaterial !== null ) {\n\n\t\t\t\t\tmaterial = overrideMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t}\n\n\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t\t}\n\n\t\tfunction getProgram( material, scene, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tconst lights = currentRenderState.state.lights;\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tconst lightsStateVersion = lights.state.version;\n\n\t\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\t\tlet programs = materialProperties.programs;\n\n\t\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tmaterialProperties.fog = scene.fog;\n\t\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\t\t\tmaterialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation;\n\n\t\t\tif ( programs === undefined ) {\n\n\t\t\t\t// new material\n\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\tprograms = new Map();\n\t\t\t\tmaterialProperties.programs = programs;\n\n\t\t\t}\n\n\t\t\tlet program = programs.get( programCacheKey );\n\n\t\t\tif ( program !== undefined ) {\n\n\t\t\t\t// early out if program and light state is identical\n\n\t\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\t\treturn program;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t\t}\n\n\t\t\tconst uniforms = materialProperties.uniforms;\n\n\t\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t\t}\n\n\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\t\tuniforms.spotLightMatrix.value = lights.state.spotLightMatrix;\n\t\t\t\tuniforms.spotLightMap.value = lights.state.spotLightMap;\n\t\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tmaterialProperties.currentProgram = program;\n\t\t\tmaterialProperties.uniformsList = null;\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction getUniformList( materialProperties ) {\n\n\t\t\tif ( materialProperties.uniformsList === null ) {\n\n\t\t\t\tconst progUniforms = materialProperties.currentProgram.getUniforms();\n\t\t\t\tmaterialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );\n\n\t\t\t}\n\n\t\t\treturn materialProperties.uniformsList;\n\n\t\t}\n\n\t\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tmaterialProperties.outputColorSpace = parameters.outputColorSpace;\n\t\t\tmaterialProperties.batching = parameters.batching;\n\t\t\tmaterialProperties.batchingColor = parameters.batchingColor;\n\t\t\tmaterialProperties.instancing = parameters.instancing;\n\t\t\tmaterialProperties.instancingColor = parameters.instancingColor;\n\t\t\tmaterialProperties.instancingMorph = parameters.instancingMorph;\n\t\t\tmaterialProperties.skinning = parameters.skinning;\n\t\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t\t}\n\n\t\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\ttextures.resetTextureUnits();\n\n\t\t\tconst fog = scene.fog;\n\t\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tconst colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );\n\t\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\t\tconst vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 );\n\t\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\t\tconst morphColors = !! geometry.morphAttributes.color;\n\n\t\t\tlet toneMapping = NoToneMapping;\n\n\t\t\tif ( material.toneMapped ) {\n\n\t\t\t\tif ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\t\ttoneMapping = _this.toneMapping;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tconst materialProperties = properties.get( material );\n\t\t\tconst lights = currentRenderState.state.lights;\n\n\t\t\tif ( _clippingEnabled === true ) {\n\n\t\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\t\tconst useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet needsProgramChange = false;\n\n\t\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.outputColorSpace !== colorSpace ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batching === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isBatchedMesh && materialProperties.batching === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tneedsProgramChange = true;\n\t\t\t\tmaterialProperties.__version = material.version;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet program = materialProperties.currentProgram;\n\n\t\t\tif ( needsProgramChange === true ) {\n\n\t\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t\tlet refreshProgram = false;\n\t\t\tlet refreshMaterial = false;\n\t\t\tlet refreshLights = false;\n\n\t\t\tconst p_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\t\t// common camera uniforms\n\n\t\t\t\tconst reversedDepthBuffer = state.buffers.depth.getReversed();\n\n\t\t\t\tif ( reversedDepthBuffer && camera.reversedDepth !== true ) {\n\n\t\t\t\t\tcamera._reversedDepth = true;\n\t\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t\t}\n\n\t\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tconst skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingIdTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingIdTexture', object._indirectTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingColorTexture' );\n\t\t\t\tif ( object._colorsTexture !== null ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'batchingColorTexture', object._colorsTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined ) ) {\n\n\t\t\t\tmorphtargets.update( object, geometry, program );\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t\t}\n\n\t\t\t// https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512\n\n\t\t\tif ( material.isMeshGouraudMaterial && material.envMap !== null ) {\n\n\t\t\t\tm_uniforms.envMap.value = envMap;\n\n\t\t\t\tm_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) {\n\n\t\t\t\tm_uniforms.envMapIntensity.value = scene.environmentIntensity;\n\n\t\t\t}\n\n\t\t\t// Set DFG LUT for physically-based materials\n\t\t\tif ( m_uniforms.dfgLUT !== undefined ) {\n\n\t\t\t\tm_uniforms.dfgLUT.value = getDFGLUT();\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] );\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\n\t\t\t}\n\n\t\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\t\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t\t}\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\t// UBOs\n\n\t\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\tfunction materialNeedsLights( material ) {\n\n\t\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t\t}\n\n\t\t/**\n\t\t * Returns the active cube face.\n\t\t *\n\t\t * @return {number} The active cube face.\n\t\t */\n\t\tthis.getActiveCubeFace = function () {\n\n\t\t\treturn _currentActiveCubeFace;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active mipmap level.\n\t\t *\n\t\t * @return {number} The active mipmap level.\n\t\t */\n\t\tthis.getActiveMipmapLevel = function () {\n\n\t\t\treturn _currentActiveMipmapLevel;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active render target.\n\t\t *\n\t\t * @return {?WebGLRenderTarget} The active render target. Returns `null` if no render target\n\t\t * is currently set.\n\t\t */\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = renderTarget.resolveDepthBuffer === false;\n\t\t\tif ( renderTargetProperties.__autoAllocateDepthBuffer === false ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t}\n\n\t\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = renderTargetProperties.__autoAllocateDepthBuffer ? undefined : depthTexture;\n\n\t\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\t};\n\n\t\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t\t};\n\n\t\tconst _scratchFrameBuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Sets the active rendertarget.\n\t\t *\n\t\t * @param {?WebGLRenderTarget} renderTarget - The render target to set. When `null` is given,\n\t\t * the canvas is set as the active render target instead.\n\t\t * @param {number} [activeCubeFace=0] - The active cube face when using a cube render target.\n\t\t * Indicates the z layer to render in to when using 3D or array render targets.\n\t\t * @param {number} [activeMipmapLevel=0] - The active mipmap level.\n\t\t */\n\t\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\t\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\t\tlet useDefaultFramebuffer = true;\n\t\t\tlet framebuffer = null;\n\t\t\tlet isCube = false;\n\t\t\tlet isRenderTarget3D = false;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\t\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t\t} else if ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t// check if the depth texture is already bound to the frame buffer and that it's been initialized\n\t\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\t\t\tif ( renderTargetProperties.__boundDepthTexture !== depthTexture ) {\n\n\t\t\t\t\t\t// check if the depth texture is compatible\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdepthTexture !== null &&\n\t\t\t\t\t\t\tproperties.has( depthTexture ) &&\n\t\t\t\t\t\t\t( renderTarget.width !== depthTexture.image.width || renderTarget.height !== depthTexture.image.height )\n\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\tthrow new Error( 'WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Swap the depth buffer to the currently attached one\n\t\t\t\t\t\ttextures.setupDepthRenderbuffer( renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst texture = renderTarget.texture;\n\n\t\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisCube = true;\n\n\t\t\t\t} else if ( ( renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t} else {\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t}\n\n\t\t\t// Use a scratch frame buffer if rendering to a mip level to avoid depth buffers\n\t\t\t// being bound that are different sizes.\n\t\t\tif ( activeMipmapLevel !== 0 ) {\n\n\t\t\t\tframebuffer = _scratchFrameBuffer;\n\n\t\t\t}\n\n\t\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( framebufferBound && useDefaultFramebuffer ) {\n\n\t\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport );\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\t\tconst layer = activeCubeFace;\n\n\t\t\t\tfor ( let i = 0; i < renderTarget.textures.length; i ++ ) {\n\n\t\t\t\t\tconst textureProperties = properties.get( renderTarget.textures[ i ] );\n\n\t\t\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, textureProperties.__webglTexture, activeMipmapLevel, layer );\n\n\t\t\t\t}\n\n\t\t\t} else if ( renderTarget !== null && activeMipmapLevel !== 0 ) {\n\n\t\t\t\t// Only bind the frame buffer if we are using a scratch frame buffer to render to a mipmap.\n\t\t\t\t// If we rebind the texture when using a multi sample buffer then an error about inconsistent samples will be thrown.\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t}\n\n\t\t\t_currentMaterialId = -1; // reset current material to ensure correct uniform bindings\n\n\t\t};\n\n\t\t/**\n\t\t * Reads the pixel data from the given render target into the given buffer.\n\t\t *\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t */\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Asynchronous, non-blocking version of {@link WebGLRenderer#readRenderTargetPixels}.\n\t\t *\n\t\t * It is recommended to use this version of `readRenderTargetPixels()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t * @return {Promise} A Promise that resolves when the read has been finished. The resolve provides the read data as a typed array.\n\t\t */\n\t\tthis.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t// set the active frame buffer to the one we want to read\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst glBuffer = _gl.createBuffer();\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );\n\n\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );\n\n\t\t\t\t\t// reset the frame buffer to the currently set buffer before waiting\n\t\t\t\t\tconst currFramebuffer = _currentRenderTarget !== null ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, currFramebuffer );\n\n\t\t\t\t\t// check if the commands have finished every 8 ms\n\t\t\t\t\tconst sync = _gl.fenceSync( _gl.SYNC_GPU_COMMANDS_COMPLETE, 0 );\n\n\t\t\t\t\t_gl.flush();\n\n\t\t\t\t\tawait probeAsync( _gl, sync, 4 );\n\n\t\t\t\t\t// read the data and delete the buffer\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.getBufferSubData( _gl.PIXEL_PACK_BUFFER, 0, buffer );\n\t\t\t\t\t_gl.deleteBuffer( glBuffer );\n\t\t\t\t\t_gl.deleteSync( sync );\n\n\t\t\t\t\treturn buffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Copies pixels from the current bound framebuffer into the given texture.\n\t\t *\n\t\t * @param {FramebufferTexture} texture - The texture.\n\t\t * @param {?Vector2} [position=null] - The start position of the copy operation.\n\t\t * @param {number} [level=0] - The mip level. The default represents the base mip.\n\t\t */\n\t\tthis.copyFramebufferToTexture = function ( texture, position = null, level = 0 ) {\n\n\t\t\tconst levelScale = Math.pow( 2, - level );\n\t\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\t\tconst x = position !== null ? position.x : 0;\n\t\t\tconst y = position !== null ? position.y : 0;\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, x, y, width, height );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tconst _srcFramebuffer = _gl.createFramebuffer();\n\t\tconst _dstFramebuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Copies data of the given source texture into a destination texture.\n\t\t *\n\t\t * When using render target textures as `srcTexture` and `dstTexture`, you must make sure both render targets are initialized\n\t\t * {@link WebGLRenderer#initRenderTarget}.\n\t\t *\n\t\t * @param {Texture} srcTexture - The source texture.\n\t\t * @param {Texture} dstTexture - The destination texture.\n\t\t * @param {?(Box2|Box3)} [srcRegion=null] - A bounding box which describes the source region. Can be two or three-dimensional.\n\t\t * @param {?(Vector2|Vector3)} [dstPosition=null] - A vector that represents the origin of the destination region. Can be two or three-dimensional.\n\t\t * @param {number} [srcLevel=0] - The source mipmap level to copy.\n\t\t * @param {?number} [dstLevel=null] - The destination mipmap level.\n\t\t */\n\t\tthis.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = null ) {\n\n\t\t\t// support the previous signature with just a single dst mipmap level\n\t\t\tif ( dstLevel === null ) {\n\n\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t// @deprecated, r171\n\t\t\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels.' );\n\t\t\t\t\tdstLevel = srcLevel;\n\t\t\t\t\tsrcLevel = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdstLevel = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// gather the necessary dimensions to copy\n\t\t\tlet width, height, depth, minX, minY, minZ;\n\t\t\tlet dstX, dstY, dstZ;\n\t\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ dstLevel ] : srcTexture.image;\n\t\t\tif ( srcRegion !== null ) {\n\n\t\t\t\twidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\t\theight = srcRegion.max.y - srcRegion.min.y;\n\t\t\t\tdepth = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1;\n\t\t\t\tminX = srcRegion.min.x;\n\t\t\t\tminY = srcRegion.min.y;\n\t\t\t\tminZ = srcRegion.isBox3 ? srcRegion.min.z : 0;\n\n\t\t\t} else {\n\n\t\t\t\tconst levelScale = Math.pow( 2, - srcLevel );\n\t\t\t\twidth = Math.floor( image.width * levelScale );\n\t\t\t\theight = Math.floor( image.height * levelScale );\n\t\t\t\tif ( srcTexture.isDataArrayTexture ) {\n\n\t\t\t\t\tdepth = image.depth;\n\n\t\t\t\t} else if ( srcTexture.isData3DTexture ) {\n\n\t\t\t\t\tdepth = Math.floor( image.depth * levelScale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdepth = 1;\n\n\t\t\t\t}\n\n\t\t\t\tminX = 0;\n\t\t\t\tminY = 0;\n\t\t\t\tminZ = 0;\n\n\t\t\t}\n\n\t\t\tif ( dstPosition !== null ) {\n\n\t\t\t\tdstX = dstPosition.x;\n\t\t\t\tdstY = dstPosition.y;\n\t\t\t\tdstZ = dstPosition.z;\n\n\t\t\t} else {\n\n\t\t\t\tdstX = 0;\n\t\t\t\tdstY = 0;\n\t\t\t\tdstZ = 0;\n\n\t\t\t}\n\n\t\t\t// Set up the destination target\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\t\t\tlet glTarget;\n\n\t\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t\t} else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D;\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\t// used for copying data from cpu\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\t\tconst currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );\n\n\t\t\t// set up the src texture\n\t\t\tconst isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture;\n\t\t\tconst isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture;\n\t\t\tif ( srcTexture.isDepthTexture ) {\n\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\t\t\t\tconst srcRenderTargetProperties = properties.get( srcTextureProperties.__renderTarget );\n\t\t\t\tconst dstRenderTargetProperties = properties.get( dstTextureProperties.__renderTarget );\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// if the source or destination are a 3d target then a layer needs to be bound\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( srcTexture ).__webglTexture, srcLevel, minZ + i );\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( dstTexture ).__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else if ( srcLevel !== 0 || srcTexture.isRenderTargetTexture || properties.has( srcTexture ) ) {\n\n\t\t\t\t// get the appropriate frame buffers\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\n\t\t\t\t// bind the frame buffer targets\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, _srcFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, _dstFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// assign the correct layers and mip maps to the frame buffers\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, srcTextureProperties.__webglTexture, srcLevel, minZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, srcTextureProperties.__webglTexture, srcLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, dstTextureProperties.__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, dstTextureProperties.__webglTexture, dstLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// copy the data using the fastest function that can achieve the copy\n\t\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.COLOR_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t\t} else if ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.copyTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ + i, minX, minY, width, height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.copyTexSubImage2D( glTarget, dstLevel, dstX, dstY, minX, minY, width, height );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// unbind read, draw buffers\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t// copy data into the 3d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// copy data into the 2d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, image.width, image.height, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// reset values\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( dstLevel === 0 && dstTexture.generateMipmaps ) {\n\n\t\t\t\t_gl.generateMipmap( glTarget );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given WebGLRenderTarget memory. Useful for initializing a render target so data\n\t\t * can be copied into it using {@link WebGLRenderer#copyTextureToTexture} before it has been\n\t\t * rendered to.\n\t\t *\n\t\t * @param {WebGLRenderTarget} target - The render target.\n\t\t */\n\t\tthis.initRenderTarget = function ( target ) {\n\n\t\t\tif ( properties.get( target ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( target );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given texture. Useful for preloading a texture rather than waiting until first\n\t\t * render (which can cause noticeable lags due to decode and GPU upload overhead).\n\t\t *\n\t\t * @param {Texture} texture - The texture.\n\t\t */\n\t\tthis.initTexture = function ( texture ) {\n\n\t\t\tif ( texture.isCubeTexture ) {\n\n\t\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to reset the internal WebGL state. This method is mostly\n\t\t * relevant for applications which share a single WebGL context across\n\t\t * multiple WebGL libraries.\n\t\t */\n\t\tthis.resetState = function () {\n\n\t\t\t_currentActiveCubeFace = 0;\n\t\t\t_currentActiveMipmapLevel = 0;\n\t\t\t_currentRenderTarget = null;\n\n\t\t\tstate.reset();\n\t\t\tbindingStates.reset();\n\n\t\t};\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Defines the coordinate system of the renderer.\n\t *\n\t * In `WebGLRenderer`, the value is always `WebGLCoordinateSystem`.\n\t *\n\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t * @default WebGLCoordinateSystem\n\t * @readonly\n\t */\n\tget coordinateSystem() {\n\n\t\treturn WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Defines the output color space of the renderer.\n\t *\n\t * @type {SRGBColorSpace|LinearSRGBColorSpace}\n\t * @default SRGBColorSpace\n\t */\n\tget outputColorSpace() {\n\n\t\treturn this._outputColorSpace;\n\n\t}\n\n\tset outputColorSpace( colorSpace ) {\n\n\t\tthis._outputColorSpace = colorSpace;\n\n\t\tconst gl = this.getContext();\n\t\tgl.drawingBufferColorSpace = ColorManagement._getDrawingBufferColorSpace( colorSpace );\n\t\tgl.unpackColorSpace = ColorManagement._getUnpackColorSpace();\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, ArrayCamera, BackSide, BoxGeometry, BufferAttribute, BufferGeometry, ByteType, CineonToneMapping, ClampToEdgeWrapping, Color, ColorManagement, ConstantAlphaFactor, ConstantColorFactor, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CustomToneMapping, Data3DTexture, DataArrayTexture, DataTexture, DepthFormat, DepthStencilFormat, DepthTexture, DoubleSide, DstAlphaFactor, DstColorFactor, EqualCompare, EqualDepth, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, FloatType, FrontSide, Frustum, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, HalfFloatType, IntType, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NoBlending, NoColorSpace, NoToneMapping, NormalBlending, NotEqualCompare, NotEqualDepth, ObjectSpaceNormalMap, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PerspectiveCamera, Plane, PlaneGeometry, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReverseSubtractEquation, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, ShaderChunk, ShaderLib, ShaderMaterial, ShortType, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, SubtractEquation, SubtractiveBlending, TangentSpaceNormalMap, Texture, Uint16BufferAttribute, Uint32BufferAttribute, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebXRController, ZeroFactor, createCanvasElement, error, log, warn, warnOnce };\n","import * as M from \"three\";\nimport { Controls as Ya, Vector3 as K, MOUSE as gn, TOUCH as dn, Quaternion as Ni, Spherical as vr, Vector2 as ue, Ray as rr, Plane as Xi, MathUtils as or, Mesh as ar, OrthographicCamera as Vo, BufferGeometry as Zi, Float32BufferAttribute as br, ShaderMaterial as tt, UniformsUtils as nt, WebGLRenderTarget as Vn, HalfFloatType as _t, NoBlending as ze, Clock as Ka, Color as st, Matrix4 as Me, DataTexture as lr, RepeatWrapping as vt, MeshNormalMaterial as Ho, AddEquation as fn, ZeroFactor as pn, DstAlphaFactor as Bs, DstColorFactor as Ns, CustomBlending as jo, DepthTexture as Go, DepthStencilFormat as Wo, UnsignedInt248Type as Xo, NearestFilter as xn, RGBAFormat as $a, UnsignedByteType as Ja, RedFormat as Qa, FloatType as Ci, RawShaderMaterial as el, ColorManagement as Fi, SRGBTransfer as tl, LinearToneMapping as nl, ReinhardToneMapping as il, CineonToneMapping as sl, ACESFilmicToneMapping as rl, AgXToneMapping as ol, NeutralToneMapping as al, CustomToneMapping as ll, Loader as Zo, FileLoader as Ui, SRGBColorSpace as Lt, LinearSRGBColorSpace as rt, BufferAttribute as ut, InterleavedBuffer as qo, InterleavedBufferAttribute as Yo, TrianglesDrawMode as cl, TriangleFanDrawMode as Fs, TriangleStripDrawMode as Ko, LoaderUtils as Nn, MeshPhysicalMaterial as ft, SpotLight as hl, PointLight as ul, DirectionalLight as dl, InstancedMesh as fl, InstancedBufferAttribute as pl, Object3D as $o, TextureLoader as ml, ImageBitmapLoader as gl, LinearMipmapLinearFilter as Jo, NearestMipmapLinearFilter as yl, LinearMipmapNearestFilter as wl, NearestMipmapNearestFilter as xl, LinearFilter as Hn, MirroredRepeatWrapping as _l, ClampToEdgeWrapping as vl, PointsMaterial as bl, Material as ns, LineBasicMaterial as Ml, MeshStandardMaterial as Qo, DoubleSide as qi, MeshBasicMaterial as On, PropertyBinding as Sl, SkinnedMesh as Tl, LineSegments as El, Line as Al, LineLoop as Cl, Points as Pl, Group as is, PerspectiveCamera as Rl, Skeleton as Dl, AnimationClip as kl, Bone as Il, InterpolateDiscrete as Ll, InterpolateLinear as ea, Texture as Mr, VectorKeyframeTrack as Sr, NumberKeyframeTrack as Tr, QuaternionKeyframeTrack as Er, FrontSide as Us, Interpolant as zl, Box3 as ot, Sphere as Ol, DataTextureLoader as Bl, DataUtils as qn, Line3 as Ke, Triangle as Ue, BackSide as Nl, REVISION as ta, Vector4 as en, Matrix3 as Fl } from \"three\";\nclass Ul {\n engine;\n scene;\n constructor(e) {\n this.engine = e, this.scene = new M.Scene();\n let t = new M.Group();\n t.name = \"groupEdge\", this.scene.add(t);\n }\n}\nclass Vl {\n engine;\n // 透视相机\n perspectiveCamera;\n // 正交相机\n orthographicCamera;\n constructor(e) {\n this.engine = e, this.perspectiveCamera = new M.PerspectiveCamera(\n 60,\n this.engine.container.clientWidth / this.engine.container.clientHeight,\n 0.1,\n 1e3\n ), this.perspectiveCamera.position.set(2, 2, 2), this.perspectiveCamera.lookAt(0, 0, 0);\n const t = 50, n = this.engine.container.clientWidth / this.engine.container.clientHeight;\n this.orthographicCamera = new M.OrthographicCamera(t * n / -2, t * n / 2, t / 2, t / -2, 0.1, 1e3);\n }\n // 切换当前相机\n switchCurrentCamera() {\n this.engine.camera === this.perspectiveCamera ? this.switchToOrthographicCamera() : this.switchToPerspectiveCamera();\n }\n // 更新合成器中的相机引用\n updateComposerCamera() {\n if (!this.engine.composerModule?.composer)\n return;\n const e = this.engine.camera, t = this.engine.composerModule.composer;\n if (t.passes)\n for (const n of t.passes)\n n.camera !== void 0 && (n.camera = e);\n }\n // 透视相机\n switchToPerspectiveCamera() {\n if (!this.engine.controls)\n return;\n const e = this.engine.camera.position.clone(), t = this.engine.controls.target.clone();\n this.engine.camera = this.perspectiveCamera, this.engine.scene.camera = this.perspectiveCamera, this.perspectiveCamera.position.copy(e), this.perspectiveCamera.lookAt(t), this.engine.controlModule.orbitControls.object = this.perspectiveCamera, this.engine.controlModule.firstPersonControls.camera = this.perspectiveCamera, this.updateComposerCamera(), this.perspectiveCamera.updateProjectionMatrix(), this.perspectiveCamera.updateMatrixWorld();\n }\n // 正交相机\n switchToOrthographicCamera() {\n if (!this.engine.controls)\n return;\n const e = this.engine.camera.position.clone(), t = this.engine.controls.target.clone();\n this.engine.camera = this.orthographicCamera, this.engine.scene.camera = this.orthographicCamera, this.orthographicCamera.position.copy(e), this.orthographicCamera.lookAt(t), this.engine.controlModule.orbitControls.object = this.orthographicCamera, this.engine.controlModule.firstPersonControls.camera = this.orthographicCamera, this.updateComposerCamera(), this.orthographicCamera.updateProjectionMatrix(), this.orthographicCamera.updateMatrixWorld();\n }\n // 获取当前相机类型\n getCameraType() {\n return this.engine.camera === this.perspectiveCamera ? \"perspective\" : this.engine.camera === this.orthographicCamera ? \"orthographic\" : \"perspective\";\n }\n // 获取当前相机姿态\n getCameraPose() {\n const e = this.engine.camera, t = this.getCameraType(), n = {\n type: t,\n position: {\n x: e.position.x,\n y: e.position.y,\n z: e.position.z\n },\n rotation: {\n x: e.rotation.x,\n y: e.rotation.y,\n z: e.rotation.z\n },\n quaternion: {\n x: e.quaternion.x,\n y: e.quaternion.y,\n z: e.quaternion.z,\n w: e.quaternion.w\n }\n };\n return this.engine.controls && this.engine.controls.target && (n.target = {\n x: this.engine.controls.target.x,\n y: this.engine.controls.target.y,\n z: this.engine.controls.target.z\n }), t === \"orthographic\" && (n.zoom = e.zoom), n;\n }\n // 通过相机姿态还原相机位置\n restoreCameraPose(e) {\n this.getCameraType() !== e.type && (e.type === \"perspective\" ? this.switchToPerspectiveCamera() : this.switchToOrthographicCamera());\n const n = this.engine.camera;\n n.position.set(e.position.x, e.position.y, e.position.z), e.quaternion ? n.quaternion.set(\n e.quaternion.x,\n e.quaternion.y,\n e.quaternion.z,\n e.quaternion.w\n ) : e.rotation && n.rotation.set(e.rotation.x, e.rotation.y, e.rotation.z), e.target && this.engine.controls && this.engine.controls.target && this.engine.controls.target.set(\n e.target.x,\n e.target.y,\n e.target.z\n ), e.type === \"orthographic\" && e.zoom !== void 0 && (n.zoom = e.zoom, n.updateProjectionMatrix()), n.updateMatrix(), n.updateMatrixWorld(!0), this.engine.controls && this.engine.controls.update && this.engine.controls.update();\n }\n}\nclass Hl {\n engine;\n deviceType;\n constructor(e) {\n this.engine = e, this.deviceType = \"PC\";\n }\n // 获取设备类型\n getDeviceType() {\n return this.deviceType;\n }\n // 获取容器尺寸\n getContainerSize() {\n return {\n width: this.engine.container.clientWidth,\n height: this.engine.container.clientHeight\n };\n }\n}\nclass jl {\n engine;\n renderer;\n constructor(e) {\n this.engine = e, this.renderer = null;\n }\n createRenderer() {\n const { width: e, height: t } = this.engine.deviceModule.getContainerSize();\n return this.renderer = new M.WebGLRenderer({\n //antialias: this.engine.options.antialias ?? true,\n alpha: !0,\n premultipliedAlpha: !1,\n stencil: !0\n }), this.renderer.setClearColor(0, 0), this.renderer.setSize(e, t), this.renderer.setPixelRatio(window.devicePixelRatio), this.renderer.shadowMap.enabled = !0, this.renderer.shadowMap.type = M.PCFSoftShadowMap, this.renderer.localClippingEnabled = !0, this.renderer.outputColorSpace = M.SRGBColorSpace, this.engine.container.appendChild(this.renderer.domElement), this.renderer;\n }\n disposeRenderer() {\n this.renderer?.dispose();\n }\n}\nconst Ar = { type: \"change\" }, cr = { type: \"start\" }, na = { type: \"end\" }, Yn = new rr(), Cr = new Xi(), Gl = Math.cos(70 * or.DEG2RAD), ve = new K(), Ne = 2 * Math.PI, fe = {\n NONE: -1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6\n}, ss = 1e-6;\nclass Wl extends Ya {\n /**\n * Constructs a new controls instance.\n *\n * @param {Object3D} object - The object that is managed by the controls.\n * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n */\n constructor(e, t, n = null) {\n super(t, n), this.engine = e, this.state = fe.NONE, this.target = new K(), this.cursor = new K(), this.origin = new K(0, 0, 0), this.showOriginIcon = !0, this.originPosition = {\n x: 0,\n y: 0\n }, this.minDistance = 0, this.maxDistance = 1 / 0, this.minZoom = 0, this.maxZoom = 1 / 0, this.minTargetRadius = 0, this.maxTargetRadius = 1 / 0, this.minPolarAngle = 0, this.maxPolarAngle = Math.PI, this.minAzimuthAngle = -1 / 0, this.maxAzimuthAngle = 1 / 0, this.enableDamping = !1, this.dampingFactor = 0.05, this.enableZoom = !0, this.zoomSpeed = 1, this.enableRotate = !0, this.rotateSpeed = 1, this.keyRotateSpeed = 1, this.enablePan = !0, this.panSpeed = 1, this.screenSpacePanning = !0, this.keyPanSpeed = 7, this.zoomToCursor = !1, this.autoRotate = !1, this.autoRotateSpeed = 2, this.keys = { LEFT: \"ArrowLeft\", UP: \"ArrowUp\", RIGHT: \"ArrowRight\", BOTTOM: \"ArrowDown\" }, this.mouseButtons = { LEFT: gn.ROTATE, MIDDLE: gn.DOLLY, RIGHT: gn.PAN }, this.touches = { ONE: dn.ROTATE, TWO: dn.DOLLY_PAN }, this.target0 = this.target.clone(), this.position0 = this.object.position.clone(), this.zoom0 = this.object.zoom, this._domElementKeyEvents = null, this._lastPosition = new K(), this._lastQuaternion = new Ni(), this._lastTargetPosition = new K(), this._quat = new Ni().setFromUnitVectors(t.up, new K(0, 1, 0)), this._quatInverse = this._quat.clone().invert(), this._spherical = new vr(), this._sphericalDelta = new vr(), this._scale = 1, this._panOffset = new K(), this._rotateStart = new ue(), this._rotateEnd = new ue(), this._rotateDelta = new ue(), this._panStart = new ue(), this._panEnd = new ue(), this._panDelta = new ue(), this._dollyStart = new ue(), this._dollyEnd = new ue(), this._dollyDelta = new ue(), this._dollyDirection = new K(), this._mouse = new ue(), this._performCursorZoom = !1, this._pointers = [], this._pointerPositions = {}, this._controlActive = !1, this._onPointerMove = Zl.bind(this), this._onPointerDown = Xl.bind(this), this._onPointerUp = ql.bind(this), this._onContextMenu = tc.bind(this), this._onMouseWheel = $l.bind(this), this._onKeyDown = Jl.bind(this), this._onTouchStart = Ql.bind(this), this._onTouchMove = ec.bind(this), this._onMouseDown = Yl.bind(this), this._onMouseMove = Kl.bind(this), this._interceptControlDown = nc.bind(this), this._interceptControlUp = ic.bind(this), this.domElement !== null && this.connect(this.domElement), this.update();\n }\n connect(e) {\n super.connect(e), this.domElement.addEventListener(\"pointerdown\", this._onPointerDown), this.domElement.addEventListener(\"pointercancel\", this._onPointerUp), this.domElement.addEventListener(\"contextmenu\", this._onContextMenu), this.domElement.addEventListener(\"wheel\", this._onMouseWheel, { passive: !1 }), this.domElement.getRootNode().addEventListener(\"keydown\", this._interceptControlDown, { passive: !0, capture: !0 }), this.domElement.style.touchAction = \"none\";\n }\n disconnect() {\n this.domElement.removeEventListener(\"pointerdown\", this._onPointerDown), this.domElement.removeEventListener(\"pointermove\", this._onPointerMove), this.domElement.removeEventListener(\"pointerup\", this._onPointerUp), this.domElement.removeEventListener(\"pointercancel\", this._onPointerUp), this.domElement.removeEventListener(\"wheel\", this._onMouseWheel), this.domElement.removeEventListener(\"contextmenu\", this._onContextMenu), this.stopListenToKeyEvents(), this.domElement.getRootNode().removeEventListener(\"keydown\", this._interceptControlDown, { capture: !0 }), this.domElement.style.touchAction = \"auto\";\n }\n dispose() {\n this.disconnect();\n }\n /**\n * Get the current vertical rotation, in radians.\n *\n * @return {number} The current vertical rotation, in radians.\n */\n getPolarAngle() {\n return this._spherical.phi;\n }\n /**\n * Get the current horizontal rotation, in radians.\n *\n * @return {number} The current horizontal rotation, in radians.\n */\n getAzimuthalAngle() {\n return this._spherical.theta;\n }\n /**\n * Returns the distance from the camera to the target.\n *\n * @return {number} The distance from the camera to the target.\n */\n getDistance() {\n return this.object.position.distanceTo(this.target);\n }\n /**\n * Adds key event listeners to the given DOM element.\n * `window` is a recommended argument for using this method.\n *\n * @param {HTMLElement} domElement - The DOM element\n */\n listenToKeyEvents(e) {\n e.addEventListener(\"keydown\", this._onKeyDown), this._domElementKeyEvents = e;\n }\n /**\n * Removes the key event listener previously defined with `listenToKeyEvents()`.\n */\n stopListenToKeyEvents() {\n this._domElementKeyEvents !== null && (this._domElementKeyEvents.removeEventListener(\"keydown\", this._onKeyDown), this._domElementKeyEvents = null);\n }\n /**\n * Save the current state of the controls. This can later be recovered with `reset()`.\n */\n saveState() {\n this.target0.copy(this.target), this.position0.copy(this.object.position), this.zoom0 = this.object.zoom;\n }\n /**\n * Reset the controls to their state from either the last time the `saveState()`\n * was called, or the initial state.\n */\n reset() {\n this.target.copy(this.target0), this.object.position.copy(this.position0), this.object.zoom = this.zoom0, this.object.updateProjectionMatrix(), this.dispatchEvent(Ar), this.update(), this.state = fe.NONE;\n }\n update(e = null) {\n this.engine && this.engine.interactionManager && this.engine.interactionManager.origin && this.origin.copy(this.engine.interactionManager.origin);\n const t = this.object.position;\n ve.copy(t).sub(this.target), ve.applyQuaternion(this._quat), this._spherical.setFromVector3(ve), this.autoRotate && this.state === fe.NONE && this._rotateLeft(this._getAutoRotationAngle(e)), this.enableDamping ? (this._spherical.theta += this._sphericalDelta.theta * this.dampingFactor, this._spherical.phi += this._sphericalDelta.phi * this.dampingFactor) : (this._spherical.theta += this._sphericalDelta.theta, this._spherical.phi += this._sphericalDelta.phi);\n let n = this.minAzimuthAngle, i = this.maxAzimuthAngle;\n isFinite(n) && isFinite(i) && (n < -Math.PI ? n += Ne : n > Math.PI && (n -= Ne), i < -Math.PI ? i += Ne : i > Math.PI && (i -= Ne), n <= i ? this._spherical.theta = Math.max(n, Math.min(i, this._spherical.theta)) : this._spherical.theta = this._spherical.theta > (n + i) / 2 ? Math.max(n, this._spherical.theta) : Math.min(i, this._spherical.theta)), this._spherical.phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this._spherical.phi)), this._spherical.makeSafe(), this.enableDamping === !0 ? this.target.addScaledVector(this._panOffset, this.dampingFactor) : this.target.add(this._panOffset), this.target.sub(this.cursor), this.target.clampLength(this.minTargetRadius, this.maxTargetRadius), this.target.add(this.cursor);\n let s = !1;\n if (this.zoomToCursor && this._performCursorZoom || this.object.isOrthographicCamera)\n this._spherical.radius = this._clampDistance(this._spherical.radius);\n else {\n const r = this._spherical.radius;\n this._spherical.radius = this._clampDistance(this._spherical.radius * this._scale), s = r != this._spherical.radius;\n }\n if (ve.setFromSpherical(this._spherical), ve.applyQuaternion(this._quatInverse), this.engine && this.engine.DeviceType === \"PC\") {\n const r = new K();\n if (r.copy(this.origin).sub(this.target), r.lengthSq() > 1e-4 && (this._sphericalDelta.theta !== 0 || this._sphericalDelta.phi !== 0)) {\n const l = this.enableDamping ? this.dampingFactor * 3 : 1, h = new K(0, 1, 0), c = new K();\n this.object.getWorldDirection(c);\n const u = c.clone().cross(h).normalize(), m = new K().copy(this.object.position).sub(this.origin);\n m.applyAxisAngle(h, Math.PI * this._sphericalDelta.theta * l), m.applyAxisAngle(u, Math.PI * this._sphericalDelta.phi * l), t.copy(this.origin).add(m);\n const f = new K().copy(this.target).sub(this.origin);\n f.applyAxisAngle(h, Math.PI * this._sphericalDelta.theta * l), f.applyAxisAngle(u, Math.PI * this._sphericalDelta.phi * l), this.target.copy(this.origin).add(f);\n } else if (this._panOffset.lengthSq() === 0 && this._sphericalDelta.phi === 0 && this._sphericalDelta.theta === 0) {\n if (this._scale !== 1) {\n const l = new K();\n this.object.getWorldDirection(l);\n const h = this._spherical.radius * 0.05 * (this._scale - 1);\n t.add(l.multiplyScalar(h));\n }\n } else\n t.copy(this.target).add(ve);\n this.object.lookAt(this.target);\n } else\n t.copy(this.target).add(ve), this.object.lookAt(this.target);\n if (this.enableDamping === !0 ? (this._sphericalDelta.theta *= 1 - this.dampingFactor, this._sphericalDelta.phi *= 1 - this.dampingFactor, this._panOffset.multiplyScalar(1 - this.dampingFactor)) : (this._sphericalDelta.set(0, 0, 0), this._panOffset.set(0, 0, 0)), this.zoomToCursor && this._performCursorZoom) {\n let r = null;\n if (this.object.isPerspectiveCamera) {\n const a = ve.length();\n r = this._clampDistance(a * this._scale);\n const l = a - r;\n this.object.position.addScaledVector(this._dollyDirection, l), this.object.updateMatrixWorld(), s = !!l;\n } else if (this.object.isOrthographicCamera) {\n const a = new K(this._mouse.x, this._mouse.y, 0);\n a.unproject(this.object);\n const l = this.object.zoom;\n this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)), this.object.updateProjectionMatrix(), s = l !== this.object.zoom;\n const h = new K(this._mouse.x, this._mouse.y, 0);\n h.unproject(this.object), this.object.position.sub(h).add(a), this.object.updateMatrixWorld(), r = ve.length();\n } else\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.\"), this.zoomToCursor = !1;\n r !== null && (this.screenSpacePanning ? this.target.set(0, 0, -1).transformDirection(this.object.matrix).multiplyScalar(r).add(this.object.position) : (Yn.origin.copy(this.object.position), Yn.direction.set(0, 0, -1).transformDirection(this.object.matrix), Math.abs(this.object.up.dot(Yn.direction)) < Gl ? this.object.lookAt(this.target) : (Cr.setFromNormalAndCoplanarPoint(this.object.up, this.target), Yn.intersectPlane(Cr, this.target))));\n } else if (this.object.isOrthographicCamera) {\n const r = this.object.zoom;\n this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)), r !== this.object.zoom && (this.object.updateProjectionMatrix(), s = !0);\n }\n return this._scale = 1, this._performCursorZoom = !1, s || this._lastPosition.distanceToSquared(this.object.position) > ss || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > ss || this._lastTargetPosition.distanceToSquared(this.target) > ss ? (this.dispatchEvent(Ar), this._lastPosition.copy(this.object.position), this._lastQuaternion.copy(this.object.quaternion), this._lastTargetPosition.copy(this.target), !0) : !1;\n }\n _getAutoRotationAngle(e) {\n return e !== null ? Ne / 60 * this.autoRotateSpeed * e : Ne / 60 / 60 * this.autoRotateSpeed;\n }\n _getZoomScale(e) {\n const t = Math.abs(e * 0.01);\n return Math.pow(0.95, this.zoomSpeed * t);\n }\n _rotateLeft(e) {\n this._sphericalDelta.theta -= e;\n }\n _rotateUp(e) {\n this._sphericalDelta.phi -= e;\n }\n _panLeft(e, t) {\n ve.setFromMatrixColumn(t, 0), ve.multiplyScalar(-e), this._panOffset.add(ve);\n }\n _panUp(e, t) {\n this.screenSpacePanning === !0 ? ve.setFromMatrixColumn(t, 1) : (ve.setFromMatrixColumn(t, 0), ve.crossVectors(this.object.up, ve)), ve.multiplyScalar(e), this._panOffset.add(ve);\n }\n // deltaX and deltaY are in pixels; right and down are positive\n _pan(e, t) {\n const n = this.domElement;\n if (this.object.isPerspectiveCamera) {\n const i = this.object.position;\n ve.copy(i).sub(this.target);\n let s = ve.length();\n s *= Math.tan(this.object.fov / 2 * Math.PI / 180), this._panLeft(2 * e * s / n.clientHeight, this.object.matrix), this._panUp(2 * t * s / n.clientHeight, this.object.matrix);\n } else this.object.isOrthographicCamera ? (this._panLeft(e * (this.object.right - this.object.left) / this.object.zoom / n.clientWidth, this.object.matrix), this._panUp(t * (this.object.top - this.object.bottom) / this.object.zoom / n.clientHeight, this.object.matrix)) : (console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\"), this.enablePan = !1);\n }\n _dollyOut(e) {\n this.object.isPerspectiveCamera || this.object.isOrthographicCamera ? this._scale /= e : (console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\"), this.enableZoom = !1);\n }\n _dollyIn(e) {\n this.object.isPerspectiveCamera || this.object.isOrthographicCamera ? this._scale *= e : (console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\"), this.enableZoom = !1);\n }\n _updateZoomParameters(e, t) {\n if (!this.zoomToCursor)\n return;\n this._performCursorZoom = !0;\n const n = this.domElement.getBoundingClientRect(), i = e - n.left, s = t - n.top, r = n.width, a = n.height;\n this._mouse.x = i / r * 2 - 1, this._mouse.y = -(s / a) * 2 + 1, this._dollyDirection.set(this._mouse.x, this._mouse.y, 1).unproject(this.object).sub(this.object.position).normalize();\n }\n _clampDistance(e) {\n return Math.max(this.minDistance, Math.min(this.maxDistance, e));\n }\n //\n // event callbacks - update the object state\n //\n _handleMouseDownRotate(e) {\n this._rotateStart.set(e.clientX, e.clientY);\n }\n _handleMouseDownDolly(e) {\n this._updateZoomParameters(e.clientX, e.clientX), this._dollyStart.set(e.clientX, e.clientY);\n }\n _handleMouseDownPan(e) {\n this._panStart.set(e.clientX, e.clientY);\n }\n _handleMouseMoveRotate(e) {\n this._rotateEnd.set(e.clientX, e.clientY), this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed);\n const t = this.domElement;\n this._rotateLeft(Ne * this._rotateDelta.x / t.clientHeight), this._rotateUp(Ne * this._rotateDelta.y / t.clientHeight), this._rotateStart.copy(this._rotateEnd), this.update();\n }\n _handleMouseMoveDolly(e) {\n this._dollyEnd.set(e.clientX, e.clientY), this._dollyDelta.subVectors(this._dollyEnd, this._dollyStart), this._dollyDelta.y > 0 ? this._dollyOut(this._getZoomScale(this._dollyDelta.y)) : this._dollyDelta.y < 0 && this._dollyIn(this._getZoomScale(this._dollyDelta.y)), this._dollyStart.copy(this._dollyEnd), this.update();\n }\n _handleMouseMovePan(e) {\n this._panEnd.set(e.clientX, e.clientY), this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed), this._pan(this._panDelta.x, this._panDelta.y), this._panStart.copy(this._panEnd), this.update();\n }\n _handleMouseWheel(e) {\n this._updateZoomParameters(e.clientX, e.clientY);\n let t;\n if (this.object.isOrthographicCamera)\n e.deltaY < 0 ? this._dollyIn(this._getZoomScale(e.deltaY)) : e.deltaY !== 0 && this._dollyOut(this._getZoomScale(e.deltaY));\n else {\n const n = Math.abs(e.deltaY * 0.01);\n t = Math.pow(1.15, this.zoomSpeed * n), e.deltaY > 0 ? this._scale /= t : e.deltaY !== 0 && (this._scale *= t);\n }\n this.update();\n }\n _handleKeyDown(e) {\n let t = !1;\n switch (e.code) {\n case this.keys.UP:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateUp(Ne * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, this.keyPanSpeed), t = !0;\n break;\n case this.keys.BOTTOM:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateUp(-Ne * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, -this.keyPanSpeed), t = !0;\n break;\n case this.keys.LEFT:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateLeft(Ne * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(this.keyPanSpeed, 0), t = !0;\n break;\n case this.keys.RIGHT:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateLeft(-Ne * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(-this.keyPanSpeed, 0), t = !0;\n break;\n }\n t && (e.preventDefault(), this.update());\n }\n _handleTouchStartRotate(e) {\n if (this._pointers.length === 1)\n this._rotateStart.set(e.pageX, e.pageY);\n else {\n const t = this._getSecondPointerPosition(e), n = 0.5 * (e.pageX + t.x), i = 0.5 * (e.pageY + t.y);\n this._rotateStart.set(n, i);\n }\n }\n _handleTouchStartPan(e) {\n if (this._pointers.length === 1)\n this._panStart.set(e.pageX, e.pageY);\n else {\n const t = this._getSecondPointerPosition(e), n = 0.5 * (e.pageX + t.x), i = 0.5 * (e.pageY + t.y);\n this._panStart.set(n, i);\n }\n }\n _handleTouchStartDolly(e) {\n const t = this._getSecondPointerPosition(e), n = e.pageX - t.x, i = e.pageY - t.y, s = Math.sqrt(n * n + i * i);\n this._dollyStart.set(0, s);\n }\n _handleTouchStartDollyPan(e) {\n this.enableZoom && this._handleTouchStartDolly(e), this.enablePan && this._handleTouchStartPan(e);\n }\n _handleTouchStartDollyRotate(e) {\n this.enableZoom && this._handleTouchStartDolly(e), this.enableRotate && this._handleTouchStartRotate(e);\n }\n _handleTouchMoveRotate(e) {\n if (this._pointers.length == 1)\n this._rotateEnd.set(e.pageX, e.pageY);\n else {\n const n = this._getSecondPointerPosition(e), i = 0.5 * (e.pageX + n.x), s = 0.5 * (e.pageY + n.y);\n this._rotateEnd.set(i, s);\n }\n this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed);\n const t = this.domElement;\n this._rotateLeft(Ne * this._rotateDelta.x / t.clientHeight), this._rotateUp(Ne * this._rotateDelta.y / t.clientHeight), this._rotateStart.copy(this._rotateEnd);\n }\n _handleTouchMovePan(e) {\n if (this._pointers.length === 1)\n this._panEnd.set(e.pageX, e.pageY);\n else {\n const t = this._getSecondPointerPosition(e), n = 0.5 * (e.pageX + t.x), i = 0.5 * (e.pageY + t.y);\n this._panEnd.set(n, i);\n }\n this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed), this._pan(this._panDelta.x, this._panDelta.y), this._panStart.copy(this._panEnd);\n }\n _handleTouchMoveDolly(e) {\n const t = this._getSecondPointerPosition(e), n = e.pageX - t.x, i = e.pageY - t.y, s = Math.sqrt(n * n + i * i);\n this._dollyEnd.set(0, s), this._dollyDelta.set(0, Math.pow(this._dollyEnd.y / this._dollyStart.y, this.zoomSpeed)), this._dollyOut(this._dollyDelta.y), this._dollyStart.copy(this._dollyEnd);\n const r = (e.pageX + t.x) * 0.5, a = (e.pageY + t.y) * 0.5;\n this._updateZoomParameters(r, a);\n }\n _handleTouchMoveDollyPan(e) {\n this.enableZoom && this._handleTouchMoveDolly(e), this.enablePan && this._handleTouchMovePan(e);\n }\n _handleTouchMoveDollyRotate(e) {\n this.enableZoom && this._handleTouchMoveDolly(e), this.enableRotate && this._handleTouchMoveRotate(e);\n }\n // pointers\n _addPointer(e) {\n this._pointers.push(e.pointerId);\n }\n _removePointer(e) {\n delete this._pointerPositions[e.pointerId];\n for (let t = 0; t < this._pointers.length; t++)\n if (this._pointers[t] == e.pointerId) {\n this._pointers.splice(t, 1);\n return;\n }\n }\n _isTrackingPointer(e) {\n for (let t = 0; t < this._pointers.length; t++)\n if (this._pointers[t] == e.pointerId) return !0;\n return !1;\n }\n _trackPointer(e) {\n let t = this._pointerPositions[e.pointerId];\n t === void 0 && (t = new ue(), this._pointerPositions[e.pointerId] = t), t.set(e.pageX, e.pageY);\n }\n _getSecondPointerPosition(e) {\n const t = e.pointerId === this._pointers[0] ? this._pointers[1] : this._pointers[0];\n return this._pointerPositions[t];\n }\n //\n _customWheelEvent(e) {\n const t = e.deltaMode, n = {\n clientX: e.clientX,\n clientY: e.clientY,\n deltaY: e.deltaY\n };\n switch (t) {\n case 1:\n n.deltaY *= 16;\n break;\n case 2:\n n.deltaY *= 100;\n break;\n }\n return e.ctrlKey && !this._controlActive && (n.deltaY *= 10), n;\n }\n}\nfunction Xl(o) {\n this.enabled !== !1 && (this._pointers.length === 0 && (this.domElement.setPointerCapture(o.pointerId), this.domElement.addEventListener(\"pointermove\", this._onPointerMove), this.domElement.addEventListener(\"pointerup\", this._onPointerUp)), !this._isTrackingPointer(o) && (this._addPointer(o), o.pointerType === \"touch\" ? this._onTouchStart(o) : this._onMouseDown(o)));\n}\nfunction Zl(o) {\n this.enabled !== !1 && (o.pointerType === \"touch\" ? this._onTouchMove(o) : this._onMouseMove(o));\n}\nfunction ql(o) {\n switch (this._removePointer(o), this._pointers.length) {\n case 0:\n this.domElement.releasePointerCapture(o.pointerId), this.domElement.removeEventListener(\"pointermove\", this._onPointerMove), this.domElement.removeEventListener(\"pointerup\", this._onPointerUp), this.dispatchEvent(na), this.state = fe.NONE;\n break;\n case 1:\n const e = this._pointers[0], t = this._pointerPositions[e];\n this._onTouchStart({ pointerId: e, pageX: t.x, pageY: t.y });\n break;\n }\n}\nfunction Yl(o) {\n if (this.showOriginIcon && this.engine && this.engine.ToolUntils) {\n const t = this.engine.scene?.camera || this.object;\n this.originPosition = this.engine.ToolUntils.WorldPointToScreenPoint(this.origin.clone(), t), console.log(\"Origin position:\", this.originPosition, \"Origin:\", this.origin);\n }\n let e;\n switch (o.button) {\n case 0:\n e = this.mouseButtons.LEFT;\n break;\n case 1:\n e = this.mouseButtons.MIDDLE;\n break;\n case 2:\n e = this.mouseButtons.RIGHT;\n break;\n default:\n e = -1;\n }\n switch (e) {\n case gn.DOLLY:\n if (this.enableZoom === !1) return;\n this._handleMouseDownDolly(o), this.state = fe.DOLLY;\n break;\n case gn.ROTATE:\n if (o.ctrlKey || o.metaKey || o.shiftKey) {\n if (this.enablePan === !1) return;\n this._handleMouseDownPan(o), this.state = fe.PAN;\n } else {\n if (this.enableRotate === !1) return;\n this._handleMouseDownRotate(o), this.state = fe.ROTATE;\n }\n break;\n case gn.PAN:\n if (o.ctrlKey || o.metaKey || o.shiftKey) {\n if (this.enableRotate === !1) return;\n this._handleMouseDownRotate(o), this.state = fe.ROTATE;\n } else {\n if (this.enablePan === !1) return;\n this._handleMouseDownPan(o), this.state = fe.PAN;\n }\n break;\n default:\n this.state = fe.NONE;\n }\n this.state !== fe.NONE && this.dispatchEvent(cr);\n}\nfunction Kl(o) {\n switch (this.state) {\n case fe.ROTATE:\n if (this.enableRotate === !1) return;\n this._handleMouseMoveRotate(o);\n break;\n case fe.DOLLY:\n if (this.enableZoom === !1) return;\n this._handleMouseMoveDolly(o);\n break;\n case fe.PAN:\n if (this.enablePan === !1) return;\n this._handleMouseMovePan(o);\n break;\n }\n}\nfunction $l(o) {\n this.enabled === !1 || this.enableZoom === !1 || this.state !== fe.NONE || (o.preventDefault(), this.dispatchEvent(cr), this._handleMouseWheel(this._customWheelEvent(o)), this.dispatchEvent(na));\n}\nfunction Jl(o) {\n this.enabled !== !1 && this._handleKeyDown(o);\n}\nfunction Ql(o) {\n switch (this._trackPointer(o), this._pointers.length) {\n case 1:\n switch (this.touches.ONE) {\n case dn.ROTATE:\n if (this.enableRotate === !1) return;\n this._handleTouchStartRotate(o), this.state = fe.TOUCH_ROTATE;\n break;\n case dn.PAN:\n if (this.enablePan === !1) return;\n this._handleTouchStartPan(o), this.state = fe.TOUCH_PAN;\n break;\n default:\n this.state = fe.NONE;\n }\n break;\n case 2:\n switch (this.touches.TWO) {\n case dn.DOLLY_PAN:\n if (this.enableZoom === !1 && this.enablePan === !1) return;\n this._handleTouchStartDollyPan(o), this.state = fe.TOUCH_DOLLY_PAN;\n break;\n case dn.DOLLY_ROTATE:\n if (this.enableZoom === !1 && this.enableRotate === !1) return;\n this._handleTouchStartDollyRotate(o), this.state = fe.TOUCH_DOLLY_ROTATE;\n break;\n default:\n this.state = fe.NONE;\n }\n break;\n default:\n this.state = fe.NONE;\n }\n this.state !== fe.NONE && this.dispatchEvent(cr);\n}\nfunction ec(o) {\n switch (this._trackPointer(o), this.state) {\n case fe.TOUCH_ROTATE:\n if (this.enableRotate === !1) return;\n this._handleTouchMoveRotate(o), this.update();\n break;\n case fe.TOUCH_PAN:\n if (this.enablePan === !1) return;\n this._handleTouchMovePan(o), this.update();\n break;\n case fe.TOUCH_DOLLY_PAN:\n if (this.enableZoom === !1 && this.enablePan === !1) return;\n this._handleTouchMoveDollyPan(o), this.update();\n break;\n case fe.TOUCH_DOLLY_ROTATE:\n if (this.enableZoom === !1 && this.enableRotate === !1) return;\n this._handleTouchMoveDollyRotate(o), this.update();\n break;\n default:\n this.state = fe.NONE;\n }\n}\nfunction tc(o) {\n this.enabled !== !1 && o.preventDefault();\n}\nfunction nc(o) {\n o.key === \"Control\" && (this._controlActive = !0, this.domElement.getRootNode().addEventListener(\"keyup\", this._interceptControlUp, { passive: !0, capture: !0 }));\n}\nfunction ic(o) {\n o.key === \"Control\" && (this._controlActive = !1, this.domElement.getRootNode().removeEventListener(\"keyup\", this._interceptControlUp, { passive: !0, capture: !0 }));\n}\nclass Pr {\n constructor(e, t, n, i) {\n this._Engine = e, this.camera = t, this.domElement = n, this._isEnabled = !1, this._rayOriginOffset = new M.Vector3(0, -1, 0), this._camerLocalDirection = new M.Vector3(), this._tmpVector = new M.Vector3(), this._rayCaster = new M.Raycaster(), this._fallingTime = 0, this._euler = new M.Euler(0, 0, 0, \"YZX\"), this._prevMouseX = 0, this._prevMouseY = 0, this.applyGravity = !1, this.gravityMinHeight = !0, this.applyCollision = !0, this.positionEasing = !0, this.lookflag = 1, this.lookSpeed = 8e-3, this.moveSpeed = 0.02, this.playerHeight = 1.4, this.maxRotateX = 0.8, this.g = 9.8, this.bindmousedown = this._Engine && this._Engine.DeviceType !== \"PC\" ? this.onTouchStart.bind(this) : this.onMouseDown.bind(this), this.bindmouseup = this._Engine && this._Engine.DeviceType !== \"PC\" ? this.onTouchEnd.bind(this) : this.onMouseUp.bind(this), this.bindmousemove = this._Engine && this._Engine.DeviceType !== \"PC\" ? this.onTouchMove.bind(this) : this.onMouseMove.bind(this), this.bindonKeyDown = this.onKeyDown.bind(this), this.bindonKeyUp = this.onKeyUp.bind(this), this.bindMousewheel = this.onMousewheel.bind(this), this.needMousewheel = !1, this.moveWheelRun = !0, this.moveWheelStop = !1, this.wheelClock, this.keydown = !1, this.GetEngine = () => e;\n }\n /**\n * @param {Object} colliders set objects for collision detection\n */\n set colliders(e) {\n this._rayCastObjects = e;\n }\n /**\n * @param {boolean} isEnabled set if this camera control is enabled\n */\n set enabled(e) {\n this._isEnabled !== e && (this._isEnabled = e, this._euler.setFromQuaternion(this.camera.quaternion), e ? this.addEvents() : this.removeEvents());\n }\n /**\n * @description: getter if current camera control is enabled.\n */\n get enabled() {\n return this._isEnabled;\n }\n addEvents() {\n const e = this._Engine?.DeviceType, t = e === \"PC\" || !e;\n console.log(\"[FirstPersonCameraControl] addEvents - DeviceType:\", e, \"isPC:\", t), t ? (console.log(\"[FirstPersonCameraControl] 添加鼠标事件监听器 - mousedown, mouseup\"), this.domElement.addEventListener(\"mousedown\", this.bindmousedown, !1), this.domElement.addEventListener(\"mouseup\", this.bindmouseup, !1)) : (console.log(\"[FirstPersonCameraControl] 添加触摸事件监听器\"), this.domElement.addEventListener(\"touchstart\", this.bindmousedown, !1), this.domElement.addEventListener(\"touchend\", this.bindmouseup, !1)), window.addEventListener(\"keydown\", this.bindonKeyDown, !1), window.addEventListener(\"keyup\", this.bindonKeyUp, !1), this.needMousewheel && (document.addEventListener && document.addEventListener(\"DOMMouseScroll\", this.bindMousewheel, !1), window.addEventListener(\"mousewheel\", this.bindMousewheel, !1));\n }\n removeEvents() {\n this._Engine && this._Engine.DeviceType !== \"PC\" ? (this.domElement.removeEventListener(\"touchstart\", this.bindmousedown), this.domElement.removeEventListener(\"touchend\", this.bindmouseup), this.domElement.removeEventListener(\"touchmove\", this.bindmousemove)) : (this.domElement.removeEventListener(\"mousedown\", this.bindmousedown), this.domElement.removeEventListener(\"mouseup\", this.bindmouseup), this.domElement.removeEventListener(\"mousemove\", this.bindmousemove)), window.removeEventListener(\"keydown\", this.bindonKeyDown), window.removeEventListener(\"keyup\", this.bindonKeyUp), this.needMousewheel && (document.addEventListener && document.removeEventListener(\"DOMMouseScroll\", this.bindMousewheel), window.removeEventListener(\"mousewheel\", this.bindMousewheel));\n }\n onMousewheel(e) {\n debugger;\n let t;\n switch (e.wheelDelta ? (e.wheelDelta > 0 && (t = \"up\"), e.wheelDelta < 0 && (t = \"down\")) : e.detail && (e.detail < 0 && (t = \"up\"), e.detail > 0 && (t = \"down\")), t) {\n case \"up\":\n this._camerLocalDirection.z = 1;\n break;\n case \"down\":\n this._camerLocalDirection.z = -1;\n break;\n }\n this.moveWheelRun == !0 ? (this.moveWheelRun = !1, this.moveWheelStop = !0, this.wheelClock = setTimeout(() => {\n this.moveWheelStop == !0 && (this.moveWheelStop = !1, this.moveWheelRun = !0, this._camerLocalDirection.z = 0);\n }, 200)) : (clearTimeout(this.wheelClock), this.wheelClock = setTimeout(() => {\n this.moveWheelStop == !0 && (this.moveWheelStop = !1, this.moveWheelRun = !0, this._camerLocalDirection.z = 0);\n }, 150));\n }\n onMouseDown(e) {\n console.log(\"[FirstPersonCameraControl] onMouseDown 被调用\", e), this.domElement.addEventListener(\"mousemove\", this.bindmousemove, !1), this._prevMouseX = e.screenX, this._prevMouseY = e.screenY;\n }\n onMouseMove(e) {\n if (this._isEnabled == !1)\n return;\n let t = this._prevMouseX ? e.screenX - this._prevMouseX : 0, n = this._prevMouseY ? e.screenY - this._prevMouseY : 0, i = this._euler.x - n * this.lookflag * this.lookSpeed;\n i >= 0 ? i < this.maxRotateX ? this._euler.x = i : this._euler.x = this.maxRotateX : i > -this.maxRotateX ? this._euler.x = i : this._euler.x = -this.maxRotateX, this._euler.y -= t * this.lookSpeed, this.camera.quaternion.setFromEuler(this._euler), this._prevMouseX = e.screenX, this._prevMouseY = e.screenY;\n let s = this.GetEngine();\n s.movefirst = !0;\n var r = new CustomEvent(\"bimengine:camerachange\", {\n detail: \"\"\n });\n window.dispatchEvent(r);\n }\n onMouseUp(e) {\n let t = this.GetEngine();\n t.movefirst = !1, this.domElement.removeEventListener(\"mousemove\", this.bindmousemove);\n }\n onTouchStart(e) {\n this.domElement.addEventListener(\"touchmove\", this.bindmousemove, !1), this._prevMouseX = e.targetTouches[0].clientX, this._prevMouseY = e.targetTouches[0].clientY;\n }\n onTouchMove(e) {\n if (this._isEnabled == !1)\n return;\n let t = this._prevMouseX ? e.targetTouches[0].clientX - this._prevMouseX : 0, n = this._prevMouseY ? e.targetTouches[0].clientY - this._prevMouseY : 0, i = this._euler.x - n * this.lookflag * this.lookSpeed;\n i >= 0 ? i < this.maxRotateX ? this._euler.x = i : this._euler.x = this.maxRotateX : i > -this.maxRotateX ? this._euler.x = i : this._euler.x = -this.maxRotateX, this._euler.y -= t * this.lookSpeed, this.camera.quaternion.setFromEuler(this._euler), this._prevMouseX = e.targetTouches[0].clientX, this._prevMouseY = e.targetTouches[0].clientY;\n let s = this.GetEngine();\n s.movefirst = !0;\n var r = new CustomEvent(\"bimengine:camerachange\", {\n detail: \"\"\n });\n window.dispatchEvent(r);\n }\n onTouchEnd(e) {\n let t = this.GetEngine();\n t.movefirst = !1, this.domElement.removeEventListener(\"touchmove\", this.bindmousemove);\n }\n onKeyDown(e) {\n var t = new CustomEvent(\"bimengine:camerachange\", {\n detail: \"\"\n });\n let n = this.GetEngine();\n switch (n.movefirst = !0, window.dispatchEvent(t), e.keyCode) {\n case 38:\n this.rotateY(-1);\n break;\n case 81:\n this.keydown = !0, this._camerLocalDirection.y = 1;\n break;\n case 69:\n this._camerLocalDirection.y = -1;\n break;\n case 87:\n this._camerLocalDirection.z = 1;\n break;\n case 37:\n this.rotateX(-1);\n break;\n case 65:\n this._camerLocalDirection.x = -1;\n break;\n case 40:\n this.rotateY(1);\n break;\n case 83:\n this._camerLocalDirection.z = -1;\n break;\n case 39:\n this.rotateX(1);\n break;\n case 68:\n this._camerLocalDirection.x = 1;\n break;\n }\n }\n onKeyUp(e) {\n let t = this.GetEngine();\n switch (t.movefirst = !1, e.keyCode) {\n case 38:\n // up\n case 87:\n this._camerLocalDirection.z = 0;\n break;\n case 37:\n // left\n case 65:\n this._camerLocalDirection.x = 0;\n break;\n case 40:\n // down\n case 83:\n this._camerLocalDirection.z = 0;\n break;\n case 39:\n // right\n case 68:\n this._camerLocalDirection.x = 0;\n break;\n case 81:\n case 69:\n this.keydown = !1, this._camerLocalDirection.y = 0;\n break;\n }\n }\n /**\n * @description: rotate camera by left/right\n * @param {Number} value\n * @return: null\n */\n rotateX(e) {\n this._euler.y -= e * this.lookSpeed, this.camera.quaternion.setFromEuler(this._euler);\n }\n /**\n * @description: rotate camera by up/down\n * @param {Number} value\n * @return: null\n */\n rotateY(e) {\n let t = this._euler.x - e * this.lookflag * 0.5 * this.lookSpeed;\n t >= 0 ? t < this.maxRotateX ? this._euler.x = t : this._euler.x = this.maxRotateX : t > -this.maxRotateX ? this._euler.x = t : this._euler.x = -this.maxRotateX, this.camera.quaternion.setFromEuler(this._euler);\n }\n /**\n * @description: update current calcuate each frame.\n */\n update() {\n this.keydown || this.gravityTest(), this.collisionTest();\n }\n gravityTest() {\n if (this.applyGravity) {\n let e = !0;\n this._fallingTime += 0.01, this._tmpVector.set(0, -1, 0);\n const t = this.hitTest();\n if (t) {\n const n = t.point.add(new M.Vector3(0, this.playerHeight, 0));\n if (this.positionEasing) {\n if (n.y >= this.camera.position.y || n.y - this.camera.position.y < 0.2) {\n this.setCameraHeight(this.camera.position.y + (n.y - this.camera.position.y) * 0.08), this._fallingTime = 0, e = !1;\n return;\n }\n } else t.distance < this.playerHeight && (this.setCameraHeight(n.y), this._fallingTime = 0, e = !1);\n }\n e && this.setCameraHeight(this.camera.position.y - this.g * Math.pow(this._fallingTime, 2));\n } else\n this.setCameraHeight(this.camera.position.y);\n }\n collisionTest() {\n this._camerLocalDirection.x !== 0 && this.collisionTestX(), this._camerLocalDirection.z !== 0 && this.collisionTestZ(), this._camerLocalDirection.y !== 0 && this.collisionTestY();\n }\n collisionTestX() {\n let e = this.GetEngine();\n if (e.movefirst = !0, this._tmpVector.setFromMatrixColumn(this.camera.matrix, 0), this._tmpVector.multiplyScalar(this._camerLocalDirection.x), this.applyCollision) {\n const t = this.hitTest();\n if (t && t.distance < 0.3)\n return;\n }\n this.camera.position.addScaledVector(this._tmpVector, this.moveSpeed);\n }\n collisionTestZ() {\n let e = this.GetEngine();\n if (e.movefirst = !0, this._tmpVector.setFromMatrixColumn(this.camera.matrix, 0), this._tmpVector.crossVectors(this.camera.up, this._tmpVector), this._tmpVector.multiplyScalar(this._camerLocalDirection.z), this.applyCollision) {\n const t = this.hitTest();\n if (t && t.distance < 0.3)\n return;\n }\n this.camera.position.addScaledVector(this._tmpVector, this.moveSpeed);\n }\n collisionTestY() {\n let e = this.GetEngine();\n if (e.movefirst = !0, this._tmpVector.setFromMatrixColumn(this.camera.matrix, 0), this._tmpVector = new M.Vector3(0, 1, 0), this._tmpVector.multiplyScalar(this._camerLocalDirection.y), this.applyCollision) {\n const n = this.hitTest();\n if (n && n.distance < 0.3)\n return;\n }\n let t = this.camera.position.clone().addScaledVector(this._tmpVector, this.moveSpeed);\n this.setCameraHeight(t.y);\n }\n // 设置相机Y方向位置\n setCameraHeight(e) {\n let t = this.getMinHeight();\n this.gravityMinHeight && t !== void 0 && e < t ? this.camera.position.y = t : this.camera.position.y = e;\n }\n // 获得所有模型最低点\n getMinHeight() {\n let e, t = this.GetEngine(), n = t.ToolUntils ? t.ToolUntils.GetBoundingBox(t) : null;\n return t && n && (e = n.min.y), e;\n }\n hitTest() {\n const e = this.camera.position.clone().add(this._rayOriginOffset);\n this._rayCaster.ray.origin = e, this._rayCaster.ray.direction = this._tmpVector;\n var n = this.GetEngine().scene.ground;\n return n && n.material.type, null;\n }\n}\nfunction hr(o) {\n const e = {\n self: null,\n // 当前激活的行为对象\n options: null,\n // 行为配置选项\n mouseDownTime: 0,\n // 鼠标按下时的时间戳\n mouseDownPosition: null,\n // 鼠标按下的位置\n lastClickTime: 0\n // 上次点击时间\n };\n e.init = function(u, m) {\n e.self != null && e.self.disActive != null && e.self.type != u.type && e.self.disActive(), e.self = u, m == null && (m = {\n showCatch: !1\n }), e.options = m;\n }, e.render = function() {\n e.self && e.self.render != null && e.self.render();\n }, e.active = function() {\n o.renderer.domElement.addEventListener(\"mousedown\", a), o.renderer.domElement.addEventListener(\"mouseup\", h), o.renderer.domElement.addEventListener(\"mousemove\", l), window.addEventListener(\"keydown\", t), window.addEventListener(\"keyup\", n);\n }, e.disActive = function() {\n o.renderer.domElement.removeEventListener(\"mousedown\", a), o.renderer.domElement.removeEventListener(\"mouseup\", h), o.renderer.domElement.removeEventListener(\"mousemove\", l), window.removeEventListener(\"keydown\", t), window.removeEventListener(\"keyup\", n);\n };\n function t(u) {\n (u.keyCode === 8 || u.keyCode === 46) && e.self && e.self.handelKeyDeleteDown != null && e.self.handelKeyDeleteDown(), u.keyCode === 27 && e.self && e.self.handelKeyEscDown != null && e.self.handelKeyEscDown(), u.keyCode === 13 && e.self && e.self.handelKeyEnterDown != null && e.self.handelKeyEnterDown(), u.keyCode === 32 && e.self && e.self.handelKeySpaceDown != null && e.self.handelKeySpaceDown(), u.key === \"Control\" && e.self && e.self.handelKeyCtrlDown != null && e.self.handelKeyCtrlDown(), u.key === \"Delete\" && e.self && e.self.handelKeyDeleteDown != null && e.self.handelKeyDeleteDown(), u.key === \"Shift\" && e.self && e.self.handelKeyShiftDown != null && e.self.handelKeyShiftDown(), u.key === \"Meta\" && e.self && e.self.handelKeyMetaDown != null && e.self.handelKeyMetaDown();\n }\n function n(u) {\n u.key === \"Alt\" && e.self && e.self.handelKeyAltUp != null && e.self.handelKeyAltUp(), u.key === \"Tab\" && e.self && e.self.handelKeyTabUp != null && e.self.handelKeyTabUp(), u.key === \"Control\" && e.self && e.self.handelKeyCtrlUp != null && e.self.handelKeyCtrlUp(), u.key === \"Shift\" && e.self && e.self.handelKeyShiftUp != null && e.self.handelKeyShiftUp(), u.key === \"Meta\" && e.self && e.self.handelKeyMetaUp != null && e.self.handelKeyMetaUp(), u.key === \"Command\" && e.self && e.self.handelKeyCommandUp != null && e.self.handelKeyCommandUp(), u.key === \"Windows\" && e.self && e.self.handelKeyWindowsUp != null && e.self.handelKeyWindowsUp();\n }\n function i(u) {\n const m = new M.Vector2(), f = o.renderer.domElement.clientWidth, d = o.renderer.domElement.clientHeight;\n return m.x = u.offsetX / f * 2 - 1, m.y = -(u.offsetY / d) * 2 + 1, m;\n }\n function s(u) {\n const m = new M.Raycaster(), f = i(u);\n return m.setFromCamera(f, o.camera), m;\n }\n function r(u, m = !1) {\n const f = s(u);\n if (u.raycaster = f, m) {\n const d = c(f, u);\n u.catch = d;\n }\n }\n function a(u) {\n u.button === 0 && (e.mouseDownTime = Date.now(), e.mouseDownPosition = new M.Vector3(u.offsetX, u.offsetY, 0), e.self && e.self.handleMouseDown != null && (o.engineStatus.isFree = !0, r(u, !0), u.catch != null && o.controlModule.orbitControls.origin.set(u.catch.point.x, u.catch.point.y, u.catch.point.z), e.self.handleMouseDown(u)));\n }\n function l(u) {\n e.self && e.self.handleMouseMove != null && (r(u, !0), e.self.handleMouseMove(u));\n }\n function h(u) {\n if (u.button !== 0)\n return;\n const m = Date.now(), f = m - e.mouseDownTime, d = new M.Vector3(u.offsetX, u.offsetY, 0);\n e.self && e.self.handleMouseUp != null && (r(u, !1), e.self.handleMouseUp(u));\n const p = d.distanceTo(e.mouseDownPosition);\n if ((f < 100 || p == 0) && e.self && e.self.handleMouseClick != null) {\n r(u, !0);\n const g = m - e.lastClickTime;\n console.log(g), g < 200 ? e.self.handleMouseDoubleClick != null && e.self.handleMouseDoubleClick(u) : e.self.handleMouseClick != null && e.self.handleMouseClick(u), e.lastClickTime = Date.now();\n }\n }\n function c(u, m) {\n if (!o.engineStatus.isFree) {\n o.hoverHighLight.clearHighlight();\n return;\n }\n o.catchSvg.innerHTML = \"\";\n const f = o.octreeBox.rayInterationModel(u);\n let d = u.intersectObjects(o.scene.children.filter((I) => I instanceof M.InstancedMesh), !0);\n if (d.length > 0 && (f.length == 0 || d[0].distance < f[0].distance)) {\n let I = d[0].object;\n if (I.ids != null && I.ids.length != 0) {\n let T = I.ids[d[0].instanceId], R = {\n object: {\n url: I.url,\n id: T,\n name: T,\n isInstance: !0\n },\n face: d[0].face,\n distance: d[0].distance,\n point: d[0].point,\n instanceId: d[0].instanceId,\n matrix: I.matrixs[d[0].instanceId]\n };\n f.splice(0, 0, R);\n }\n }\n if (f.length === 0)\n return;\n let p = f[0].object.url, g = f[0].object.name, y = o.modelEdge.getModelEdge(p, g);\n y || (y = [0, 0, []]);\n let w = [];\n y[2].forEach((I) => {\n I[0] != null && I[1] != null && w.push({\n X: I[0].X * 0.5 + I[1].X * 0.5,\n Y: I[0].Y * 0.5 + I[1].Y * 0.5,\n Z: I[0].Z * 0.5 + I[1].Z * 0.5\n });\n });\n let x = [...y[2].map((I) => I[0]), ...w], _ = \"face\", b = [], E = [], A = 10;\n if (x.forEach((I) => {\n if (I != null) {\n let T = new M.Vector3(I.X, I.Z, -I.Y), R = o.worldToScreen.worldToScreen(T), v = Math.sqrt(Math.pow(R.x - m.offsetX, 2) + Math.pow(R.y - m.offsetY, 2));\n v < A && (A = v, b.push({\n point: T,\n distance: v,\n pointxy: R\n }));\n }\n }), b.length > 0 ? (b.sort((I, T) => I.distance - T.distance), _ = \"point\") : (y[2].forEach((I) => {\n if (I[0] != null && I[1] != null) {\n let T = new M.Vector3(I[0].X, I[0].Z, -I[0].Y), R = new M.Vector3(I[1].X, I[1].Z, -I[1].Y), v = o.worldToScreen.worldToScreen(T), z = o.worldToScreen.worldToScreen(R), H = P(new M.Vector2(m.offsetX, m.offsetY), v, z);\n if (H < A) {\n let V = C(new M.Vector2(m.offsetX, m.offsetY), v, z), te = D(V, T, R);\n E.push({\n distance: H,\n point: te,\n pointxy: o.worldToScreen.worldToScreen(te),\n start: v,\n end: z\n });\n }\n }\n }), E.length > 0 && (E.sort((I, T) => I.distance - T.distance), _ = \"line\")), _ == \"point\" && e.options.showCatch) {\n const I = o.worldToScreen.worldToScreen(b[0].point);\n o.catchSvg.innerHTML = \"\";\n const T = I.x + o.reactBoundingClientRect.left, R = I.y + o.reactBoundingClientRect.top, v = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\");\n v.setAttribute(\"class\", \"catchPoint\"), v.setAttribute(\"points\", `${T},${R - 8} ${T - 7},${R + 4} ${T + 7},${R + 4}`), o.catchSvg.appendChild(v), f[0].point = b[0].point;\n } else if (_ == \"line\" && e.options.showCatch) {\n o.worldToScreen.worldToScreen(E[0].point);\n const I = E[0].start, T = E[0].end;\n o.catchSvg.innerHTML = \"\";\n const R = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n R.setAttribute(\"class\", \"catchLine\"), R.setAttribute(\"x1\", (I.x + o.reactBoundingClientRect.left).toString()), R.setAttribute(\"y1\", (I.y + o.reactBoundingClientRect.top).toString()), R.setAttribute(\"x2\", (T.x + o.reactBoundingClientRect.left).toString()), R.setAttribute(\"y2\", (T.y + o.reactBoundingClientRect.top).toString()), R.setAttribute(\"stroke\", \"rgb(8, 223, 215)\"), R.setAttribute(\"stroke-width\", \"2\"), o.catchSvg.appendChild(R), f[0].point = E[0].point;\n } else if (_ == \"face\" && e.options.showCatch) {\n let I = f[0].point.clone(), T = f[0].normal || (f[0].face ? f[0].face.normal : null);\n const R = (T ? T.clone() : new M.Vector3(0, 0, 1)).normalize(), v = Math.abs(R.y) < 0.9 ? new M.Vector3(0, 1, 0) : new M.Vector3(1, 0, 0), z = new M.Vector3().crossVectors(R, v).normalize(), H = new M.Vector3().crossVectors(R, z).normalize(), V = 0.05, $ = [\n new M.Vector3().copy(z).add(H).multiplyScalar(V),\n new M.Vector3().copy(z).sub(H).multiplyScalar(V),\n new M.Vector3().copy(z).multiplyScalar(-1).sub(H).multiplyScalar(V),\n new M.Vector3().copy(z).multiplyScalar(-1).add(H).multiplyScalar(V)\n ].map((O) => new M.Vector3().copy(I).add(O)).map((O) => o.worldToScreen.worldToScreen(O));\n o.catchSvg.innerHTML = \"\";\n const N = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\");\n N.setAttribute(\"class\", \"catchFace\"), N.setAttribute(\"points\", $.map((O) => `${O.x + o.reactBoundingClientRect.left},${O.y + o.reactBoundingClientRect.top}`).join(\" \")), N.setAttribute(\"fill\", \"rgba(1, 238, 255, 0.2)\"), N.setAttribute(\"stroke\", \"rgb(0, 255, 247)\"), N.setAttribute(\"stroke-width\", \"1\"), o.catchSvg.appendChild(N);\n }\n return f[0];\n function P(I, T, R) {\n const v = new M.Vector2().subVectors(R, T), z = v.lengthSq();\n if (z < 1e-10)\n return I.distanceTo(T);\n const H = new M.Vector2().subVectors(I, T), V = M.MathUtils.clamp(H.dot(v) / z, 0, 1), te = new M.Vector2().copy(v).multiplyScalar(V).add(T);\n return I.distanceTo(te);\n }\n function C(I, T, R) {\n const v = new M.Vector2().subVectors(R, T), z = v.lengthSq();\n if (z < 1e-10)\n return 0;\n const H = new M.Vector2().subVectors(I, T);\n return M.MathUtils.clamp(H.dot(v) / z, 0, 1);\n }\n function D(I, T, R) {\n const v = M.MathUtils.clamp(I, 0, 1);\n return new M.Vector3().lerpVectors(T, R, v);\n }\n }\n return e;\n}\nclass sc {\n engine;\n orbitControls;\n firstPersonControls;\n isActive = !0;\n originDiv = null;\n handelBehaved;\n isDragging = !1;\n isDown = !1;\n containerOffset = { left: 0, top: 0 };\n constructor(e) {\n this.engine = e, this.init(), this.handelBehaved = hr(this.engine), this.handelBehaved.init(this, null), this.handelBehaved.active();\n }\n init() {\n this.orbitControls = new Wl(this.engine, this.engine.camera, this.engine.renderer.domElement), this.orbitControls.showOriginIcon = !0, this.firstPersonControls = new Pr(this.engine, this.engine.camera, this.engine.renderer.domElement);\n const e = document.createElement(\"div\");\n this.originDiv = e, e.className = \"originDiv\", e.style.position = \"absolute\", e.style.top = \"0px\", e.style.left = \"0px\", e.style.width = \"30px\", e.style.height = \"30px\", e.style.borderRadius = \"50%\", e.style.pointerEvents = \"none\", e.style.backgroundImage = \"url(/assets/svg/rotate-orbit.svg)\", this.engine.container.appendChild(this.originDiv);\n }\n // 激活控制器\n active() {\n this.isActive = !0, this.orbitControls.enabled = !0;\n }\n // 禁用控制器\n disActive() {\n this.isActive = !1, this.orbitControls.enabled = !1;\n }\n // 设置漫游速度\n setMoveSpeed(e) {\n this.firstPersonControls.moveSpeed = e;\n }\n // 获取当前移动速度\n getMoveSpeed() {\n return this.firstPersonControls.moveSpeed;\n }\n // 设置是否碰撞\n setApplyCollision(e) {\n this.firstPersonControls.applyCollision = e;\n }\n // 获取是否开启碰撞\n getApplyCollision() {\n return this.firstPersonControls.applyCollision;\n }\n // 设置是否重力\n setApplyGravity(e) {\n this.firstPersonControls.applyGravity = e;\n }\n // 获取是否开启重力\n getApplyGravity() {\n return this.firstPersonControls.applyGravity;\n }\n // 开启和关闭小地图\n toggleMinMap() {\n this.engine.minMap.toggle();\n }\n // 切换第一人称漫游模式\n switchFirstPersonMode() {\n this.engine.cameraModule.switchToPerspectiveCamera(), this.firstPersonControls = new Pr(\n this.engine,\n this.engine.camera,\n this.engine.renderer.domElement,\n []\n ), this.orbitControls.enabled = !1, this.firstPersonControls.enabled = !0, this.firstPersonControls.isActive = !0;\n }\n // 切换默认模式\n switchDefaultMode() {\n this.firstPersonControls && (this.firstPersonControls.enabled = !1, this.engine.cameraModule.switchToOrthographicCamera()), this.orbitControls.enabled = !0;\n }\n // 控制鼠标交互\n handleMouseUp(e) {\n this.isDragging = !1, this.isDown = !1;\n }\n handleMouseMove(e) {\n this.isDown ? this.isDragging = !0 : this.isDragging = !1;\n }\n handleMouseDown(e) {\n this.isDown = !0;\n }\n handleMouseClick(e) {\n this.isDragging = !1, this.isDown = !1;\n }\n // 渲染控制器\n update() {\n if (this.firstPersonControls.enabled && this.firstPersonControls.update(), this.orbitControls.enabled) {\n const e = this.engine.controlModule.orbitControls.origin, n = this.engine.worldToScreen.worldToScreen(e);\n this.originDiv && this.isDragging ? (this.originDiv.style.left = n.x - 15 + this.engine.reactBoundingClientRect.left + \"px\", this.originDiv.style.top = n.y - 15 + this.engine.reactBoundingClientRect.top + \"px\", this.originDiv.style.display = \"block\") : this.originDiv && (this.originDiv.style.display = \"none\");\n }\n }\n}\nconst Kt = {\n name: \"CopyShader\",\n uniforms: {\n tDiffuse: { value: null },\n opacity: { value: 1 }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}`\n )\n};\nclass tn {\n /**\n * Constructs a new pass.\n */\n constructor() {\n this.isPass = !0, this.enabled = !0, this.needsSwap = !0, this.clear = !1, this.renderToScreen = !1;\n }\n /**\n * Sets the size of the pass.\n *\n * @abstract\n * @param {number} width - The width to set.\n * @param {number} height - The height to set.\n */\n setSize() {\n }\n /**\n * This method holds the render logic of a pass. It must be implemented in all derived classes.\n *\n * @abstract\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render() {\n console.error(\"THREE.Pass: .render() must be implemented in derived pass.\");\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n *\n * @abstract\n */\n dispose() {\n }\n}\nconst rc = new Vo(-1, 1, 1, -1, 0, 1);\nclass oc extends Zi {\n constructor() {\n super(), this.setAttribute(\"position\", new br([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3)), this.setAttribute(\"uv\", new br([0, 2, 0, 0, 2, 0], 2));\n }\n}\nconst ac = new oc();\nclass Yi {\n /**\n * Constructs a new full screen quad.\n *\n * @param {?Material} material - The material to render te full screen quad with.\n */\n constructor(e) {\n this._mesh = new ar(ac, e);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the instance is no longer used in your app.\n */\n dispose() {\n this._mesh.geometry.dispose();\n }\n /**\n * Renders the full screen quad.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n */\n render(e) {\n e.render(this._mesh, rc);\n }\n /**\n * The quad's material.\n *\n * @type {?Material}\n */\n get material() {\n return this._mesh.material;\n }\n set material(e) {\n this._mesh.material = e;\n }\n}\nclass Pi extends tn {\n /**\n * Constructs a new shader pass.\n *\n * @param {Object|ShaderMaterial} [shader] - A shader object holding vertex and fragment shader as well as\n * defines and uniforms. It's also valid to pass a custom shader material.\n * @param {string} [textureID='tDiffuse'] - The name of the texture uniform that should sample\n * the read buffer.\n */\n constructor(e, t = \"tDiffuse\") {\n super(), this.textureID = t, this.uniforms = null, this.material = null, e instanceof tt ? (this.uniforms = e.uniforms, this.material = e) : e && (this.uniforms = nt.clone(e.uniforms), this.material = new tt({\n name: e.name !== void 0 ? e.name : \"unspecified\",\n defines: Object.assign({}, e.defines),\n uniforms: this.uniforms,\n vertexShader: e.vertexShader,\n fragmentShader: e.fragmentShader\n })), this._fsQuad = new Yi(this.material);\n }\n /**\n * Performs the shader pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n this.uniforms[this.textureID] && (this.uniforms[this.textureID].value = n.texture), this._fsQuad.material = this.material, this.renderToScreen ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(t), this.clear && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), this._fsQuad.render(e));\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.material.dispose(), this._fsQuad.dispose();\n }\n}\nclass Rr extends tn {\n /**\n * Constructs a new mask pass.\n *\n * @param {Scene} scene - The 3D objects in this scene will define the mask.\n * @param {Camera} camera - The camera.\n */\n constructor(e, t) {\n super(), this.scene = e, this.camera = t, this.clear = !0, this.needsSwap = !1, this.inverse = !1;\n }\n /**\n * Performs a mask pass with the configured scene and camera.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n const i = e.getContext(), s = e.state;\n s.buffers.color.setMask(!1), s.buffers.depth.setMask(!1), s.buffers.color.setLocked(!0), s.buffers.depth.setLocked(!0);\n let r, a;\n this.inverse ? (r = 0, a = 1) : (r = 1, a = 0), s.buffers.stencil.setTest(!0), s.buffers.stencil.setOp(i.REPLACE, i.REPLACE, i.REPLACE), s.buffers.stencil.setFunc(i.ALWAYS, r, 4294967295), s.buffers.stencil.setClear(a), s.buffers.stencil.setLocked(!0), e.setRenderTarget(n), this.clear && e.clear(), e.render(this.scene, this.camera), e.setRenderTarget(t), this.clear && e.clear(), e.render(this.scene, this.camera), s.buffers.color.setLocked(!1), s.buffers.depth.setLocked(!1), s.buffers.color.setMask(!0), s.buffers.depth.setMask(!0), s.buffers.stencil.setLocked(!1), s.buffers.stencil.setFunc(i.EQUAL, 1, 4294967295), s.buffers.stencil.setOp(i.KEEP, i.KEEP, i.KEEP), s.buffers.stencil.setLocked(!0);\n }\n}\nclass lc extends tn {\n /**\n * Constructs a new clear mask pass.\n */\n constructor() {\n super(), this.needsSwap = !1;\n }\n /**\n * Performs the clear of the currently defined mask.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e) {\n e.state.buffers.stencil.setLocked(!1), e.state.buffers.stencil.setTest(!1);\n }\n}\nclass cc {\n /**\n * Constructs a new effect composer.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} [renderTarget] - This render target and a clone will\n * be used as the internal read and write buffers. If not given, the composer creates\n * the buffers automatically.\n */\n constructor(e, t) {\n if (this.renderer = e, this._pixelRatio = e.getPixelRatio(), t === void 0) {\n const n = e.getSize(new ue());\n this._width = n.width, this._height = n.height, t = new Vn(this._width * this._pixelRatio, this._height * this._pixelRatio, { type: _t }), t.texture.name = \"EffectComposer.rt1\";\n } else\n this._width = t.width, this._height = t.height;\n this.renderTarget1 = t, this.renderTarget2 = t.clone(), this.renderTarget2.texture.name = \"EffectComposer.rt2\", this.writeBuffer = this.renderTarget1, this.readBuffer = this.renderTarget2, this.renderToScreen = !0, this.passes = [], this.copyPass = new Pi(Kt), this.copyPass.material.blending = ze, this.clock = new Ka();\n }\n /**\n * Swaps the internal read/write buffers.\n */\n swapBuffers() {\n const e = this.readBuffer;\n this.readBuffer = this.writeBuffer, this.writeBuffer = e;\n }\n /**\n * Adds the given pass to the pass chain.\n *\n * @param {Pass} pass - The pass to add.\n */\n addPass(e) {\n this.passes.push(e), e.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio);\n }\n /**\n * Inserts the given pass at a given index.\n *\n * @param {Pass} pass - The pass to insert.\n * @param {number} index - The index into the pass chain.\n */\n insertPass(e, t) {\n this.passes.splice(t, 0, e), e.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio);\n }\n /**\n * Removes the given pass from the pass chain.\n *\n * @param {Pass} pass - The pass to remove.\n */\n removePass(e) {\n const t = this.passes.indexOf(e);\n t !== -1 && this.passes.splice(t, 1);\n }\n /**\n * Returns `true` if the pass for the given index is the last enabled pass in the pass chain.\n *\n * @param {number} passIndex - The pass index.\n * @return {boolean} Whether the pass for the given index is the last pass in the pass chain.\n */\n isLastEnabledPass(e) {\n for (let t = e + 1; t < this.passes.length; t++)\n if (this.passes[t].enabled)\n return !1;\n return !0;\n }\n /**\n * Executes all enabled post-processing passes in order to produce the final frame.\n *\n * @param {number} deltaTime - The delta time in seconds. If not given, the composer computes\n * its own time delta value.\n */\n render(e) {\n e === void 0 && (e = this.clock.getDelta());\n const t = this.renderer.getRenderTarget();\n let n = !1;\n for (let i = 0, s = this.passes.length; i < s; i++) {\n const r = this.passes[i];\n if (r.enabled !== !1) {\n if (r.renderToScreen = this.renderToScreen && this.isLastEnabledPass(i), r.render(this.renderer, this.writeBuffer, this.readBuffer, e, n), r.needsSwap) {\n if (n) {\n const a = this.renderer.getContext(), l = this.renderer.state.buffers.stencil;\n l.setFunc(a.NOTEQUAL, 1, 4294967295), this.copyPass.render(this.renderer, this.writeBuffer, this.readBuffer, e), l.setFunc(a.EQUAL, 1, 4294967295);\n }\n this.swapBuffers();\n }\n Rr !== void 0 && (r instanceof Rr ? n = !0 : r instanceof lc && (n = !1));\n }\n }\n this.renderer.setRenderTarget(t);\n }\n /**\n * Resets the internal state of the EffectComposer.\n *\n * @param {WebGLRenderTarget} [renderTarget] - This render target has the same purpose like\n * the one from the constructor. If set, it is used to setup the read and write buffers.\n */\n reset(e) {\n if (e === void 0) {\n const t = this.renderer.getSize(new ue());\n this._pixelRatio = this.renderer.getPixelRatio(), this._width = t.width, this._height = t.height, e = this.renderTarget1.clone(), e.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio);\n }\n this.renderTarget1.dispose(), this.renderTarget2.dispose(), this.renderTarget1 = e, this.renderTarget2 = e.clone(), this.writeBuffer = this.renderTarget1, this.readBuffer = this.renderTarget2;\n }\n /**\n * Resizes the internal read and write buffers as well as all passes. Similar to {@link WebGLRenderer#setSize},\n * this method honors the current pixel ration.\n *\n * @param {number} width - The width in logical pixels.\n * @param {number} height - The height in logical pixels.\n */\n setSize(e, t) {\n this._width = e, this._height = t;\n const n = this._width * this._pixelRatio, i = this._height * this._pixelRatio;\n this.renderTarget1.setSize(n, i), this.renderTarget2.setSize(n, i);\n for (let s = 0; s < this.passes.length; s++)\n this.passes[s].setSize(n, i);\n }\n /**\n * Sets device pixel ratio. This is usually used for HiDPI device to prevent blurring output.\n * Setting the pixel ratio will automatically resize the composer.\n *\n * @param {number} pixelRatio - The pixel ratio to set.\n */\n setPixelRatio(e) {\n this._pixelRatio = e, this.setSize(this._width, this._height);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the composer is no longer used in your app.\n */\n dispose() {\n this.renderTarget1.dispose(), this.renderTarget2.dispose(), this.copyPass.dispose();\n }\n}\nclass hc extends tn {\n /**\n * Constructs a new render pass.\n *\n * @param {Scene} scene - The scene to render.\n * @param {Camera} camera - The camera.\n * @param {?Material} [overrideMaterial=null] - The override material. If set, this material is used\n * for all objects in the scene.\n * @param {?(number|Color|string)} [clearColor=null] - The clear color of the render pass.\n * @param {?number} [clearAlpha=null] - The clear alpha of the render pass.\n */\n constructor(e, t, n = null, i = null, s = null) {\n super(), this.scene = e, this.camera = t, this.overrideMaterial = n, this.clearColor = i, this.clearAlpha = s, this.clear = !0, this.clearDepth = !1, this.needsSwap = !1, this._oldClearColor = new st();\n }\n /**\n * Performs a beauty pass with the configured scene and camera.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n const i = e.autoClear;\n e.autoClear = !1;\n let s, r;\n this.overrideMaterial !== null && (r = this.scene.overrideMaterial, this.scene.overrideMaterial = this.overrideMaterial), this.clearColor !== null && (e.getClearColor(this._oldClearColor), e.setClearColor(this.clearColor, e.getClearAlpha())), this.clearAlpha !== null && (s = e.getClearAlpha(), e.setClearAlpha(this.clearAlpha)), this.clearDepth == !0 && e.clearDepth(), e.setRenderTarget(this.renderToScreen ? null : n), this.clear === !0 && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), e.render(this.scene, this.camera), this.clearColor !== null && e.setClearColor(this._oldClearColor), this.clearAlpha !== null && e.setClearAlpha(s), this.overrideMaterial !== null && (this.scene.overrideMaterial = r), e.autoClear = i;\n }\n}\nconst Kn = {\n defines: {\n PERSPECTIVE_CAMERA: 1,\n SAMPLES: 16,\n NORMAL_VECTOR_TYPE: 1,\n DEPTH_SWIZZLING: \"x\",\n SCREEN_SPACE_RADIUS: 0,\n SCREEN_SPACE_RADIUS_SCALE: 100,\n SCENE_CLIP_BOX: 0\n },\n uniforms: {\n tNormal: { value: null },\n tDepth: { value: null },\n tNoise: { value: null },\n resolution: { value: new ue() },\n cameraNear: { value: null },\n cameraFar: { value: null },\n cameraProjectionMatrix: { value: new Me() },\n cameraProjectionMatrixInverse: { value: new Me() },\n cameraWorldMatrix: { value: new Me() },\n radius: { value: 0.25 },\n distanceExponent: { value: 1 },\n thickness: { value: 1 },\n distanceFallOff: { value: 1 },\n scale: { value: 1 },\n sceneBoxMin: { value: new K(-1, -1, -1) },\n sceneBoxMax: { value: new K(1, 1, 1) }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tvarying vec2 vUv;\n\t\tuniform highp sampler2D tNormal;\n\t\tuniform highp sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\t\tuniform vec2 resolution;\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform mat4 cameraProjectionMatrix;\n\t\tuniform mat4 cameraProjectionMatrixInverse;\n\t\tuniform mat4 cameraWorldMatrix;\n\t\tuniform float radius;\n\t\tuniform float distanceExponent;\n\t\tuniform float thickness;\n\t\tuniform float distanceFallOff;\n\t\tuniform float scale;\n\t\t#if SCENE_CLIP_BOX == 1\n\t\t\tuniform vec3 sceneBoxMin;\n\t\t\tuniform vec3 sceneBoxMax;\n\t\t#endif\n\n\t\t#include \n\t\t#include \n\n\t\t#ifndef FRAGMENT_OUTPUT\n\t\t#define FRAGMENT_OUTPUT vec4(vec3(ao), 1.)\n\t\t#endif\n\n\t\tvec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n\t\t\tvec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n\t\t\tvec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;\n\t\t\treturn viewSpacePosition.xyz / viewSpacePosition.w;\n\t\t}\n\n\t\tfloat getDepth(const vec2 uv) {\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).DEPTH_SWIZZLING;\n\t\t}\n\n\t\tfloat fetchDepth(const ivec2 uv) {\n\t\t\treturn texelFetch(tDepth, uv.xy, 0).DEPTH_SWIZZLING;\n\t\t}\n\n\t\tfloat getViewZ(const in float depth) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\t\treturn perspectiveDepthToViewZ(depth, cameraNear, cameraFar);\n\t\t\t#else\n\t\t\t\treturn orthographicDepthToViewZ(depth, cameraNear, cameraFar);\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 computeNormalFromDepth(const vec2 uv) {\n\t\t\tvec2 size = vec2(textureSize(tDepth, 0));\n\t\t\tivec2 p = ivec2(uv * size);\n\t\t\tfloat c0 = fetchDepth(p);\n\t\t\tfloat l2 = fetchDepth(p - ivec2(2, 0));\n\t\t\tfloat l1 = fetchDepth(p - ivec2(1, 0));\n\t\t\tfloat r1 = fetchDepth(p + ivec2(1, 0));\n\t\t\tfloat r2 = fetchDepth(p + ivec2(2, 0));\n\t\t\tfloat b2 = fetchDepth(p - ivec2(0, 2));\n\t\t\tfloat b1 = fetchDepth(p - ivec2(0, 1));\n\t\t\tfloat t1 = fetchDepth(p + ivec2(0, 1));\n\t\t\tfloat t2 = fetchDepth(p + ivec2(0, 2));\n\t\t\tfloat dl = abs((2.0 * l1 - l2) - c0);\n\t\t\tfloat dr = abs((2.0 * r1 - r2) - c0);\n\t\t\tfloat db = abs((2.0 * b1 - b2) - c0);\n\t\t\tfloat dt = abs((2.0 * t1 - t2) - c0);\n\t\t\tvec3 ce = getViewPosition(uv, c0).xyz;\n\t\t\tvec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz : -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n\t\t\tvec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz : -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n\t\t\treturn normalize(cross(dpdx, dpdy));\n\t\t}\n\n\t\tvec3 getViewNormal(const vec2 uv) {\n\t\t\t#if NORMAL_VECTOR_TYPE == 2\n\t\t\t\treturn normalize(textureLod(tNormal, uv, 0.).rgb);\n\t\t\t#elif NORMAL_VECTOR_TYPE == 1\n\t\t\t\treturn unpackRGBToNormal(textureLod(tNormal, uv, 0.).rgb);\n\t\t\t#else\n\t\t\t\treturn computeNormalFromDepth(uv);\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 getSceneUvAndDepth(vec3 sampleViewPos) {\n\t\t\tvec4 sampleClipPos = cameraProjectionMatrix * vec4(sampleViewPos, 1.);\n\t\t\tvec2 sampleUv = sampleClipPos.xy / sampleClipPos.w * 0.5 + 0.5;\n\t\t\tfloat sampleSceneDepth = getDepth(sampleUv);\n\t\t\treturn vec3(sampleUv, sampleSceneDepth);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth(vUv.xy);\n\t\t\tif (depth >= 1.0) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvec3 viewPos = getViewPosition(vUv, depth);\n\t\t\tvec3 viewNormal = getViewNormal(vUv);\n\n\t\t\tfloat radiusToUse = radius;\n\t\t\tfloat distanceFalloffToUse = thickness;\n\t\t\t#if SCREEN_SPACE_RADIUS == 1\n\t\t\t\tfloat radiusScale = getViewPosition(vec2(0.5 + float(SCREEN_SPACE_RADIUS_SCALE) / resolution.x, 0.0), depth).x;\n\t\t\t\tradiusToUse *= radiusScale;\n\t\t\t\tdistanceFalloffToUse *= radiusScale;\n\t\t\t#endif\n\n\t\t\t#if SCENE_CLIP_BOX == 1\n\t\t\t\tvec3 worldPos = (cameraWorldMatrix * vec4(viewPos, 1.0)).xyz;\n\t\t\t\tfloat boxDistance = length(max(vec3(0.0), max(sceneBoxMin - worldPos, worldPos - sceneBoxMax)));\n\t\t\t\tif (boxDistance > radiusToUse) {\n\t\t\t\t\tdiscard;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t#endif\n\n\t\t\tvec2 noiseResolution = vec2(textureSize(tNoise, 0));\n\t\t\tvec2 noiseUv = vUv * resolution / noiseResolution;\n\t\t\tvec4 noiseTexel = textureLod(tNoise, noiseUv, 0.0);\n\t\t\tvec3 randomVec = noiseTexel.xyz * 2.0 - 1.0;\n\t\t\tvec3 tangent = normalize(vec3(randomVec.xy, 0.));\n\t\t\tvec3 bitangent = vec3(-tangent.y, tangent.x, 0.);\n\t\t\tmat3 kernelMatrix = mat3(tangent, bitangent, vec3(0., 0., 1.));\n\n\t\t\tconst int DIRECTIONS = SAMPLES < 30 ? 3 : 5;\n\t\t\tconst int STEPS = (SAMPLES + DIRECTIONS - 1) / DIRECTIONS;\n\t\t\tfloat ao = 0.0;\n\t\t\tfor (int i = 0; i < DIRECTIONS; ++i) {\n\n\t\t\t\tfloat angle = float(i) / float(DIRECTIONS) * PI;\n\t\t\t\tvec4 sampleDir = vec4(cos(angle), sin(angle), 0., 0.5 + 0.5 * noiseTexel.w);\n\t\t\t\tsampleDir.xyz = normalize(kernelMatrix * sampleDir.xyz);\n\n\t\t\t\tvec3 viewDir = normalize(-viewPos.xyz);\n\t\t\t\tvec3 sliceBitangent = normalize(cross(sampleDir.xyz, viewDir));\n\t\t\t\tvec3 sliceTangent = cross(sliceBitangent, viewDir);\n\t\t\t\tvec3 normalInSlice = normalize(viewNormal - sliceBitangent * dot(viewNormal, sliceBitangent));\n\n\t\t\t\tvec3 tangentToNormalInSlice = cross(normalInSlice, sliceBitangent);\n\t\t\t\tvec2 cosHorizons = vec2(dot(viewDir, tangentToNormalInSlice), dot(viewDir, -tangentToNormalInSlice));\n\n\t\t\t\tfor (int j = 0; j < STEPS; ++j) {\n\t\t\t\t\tvec3 sampleViewOffset = sampleDir.xyz * radiusToUse * sampleDir.w * pow(float(j + 1) / float(STEPS), distanceExponent);\n\n\t\t\t\t\tvec3 sampleSceneUvDepth = getSceneUvAndDepth(viewPos + sampleViewOffset);\n\t\t\t\t\tvec3 sampleSceneViewPos = getViewPosition(sampleSceneUvDepth.xy, sampleSceneUvDepth.z);\n\t\t\t\t\tvec3 viewDelta = sampleSceneViewPos - viewPos;\n\t\t\t\t\tif (abs(viewDelta.z) < thickness) {\n\t\t\t\t\t\tfloat sampleCosHorizon = dot(viewDir, normalize(viewDelta));\n\t\t\t\t\t\tcosHorizons.x += max(0., (sampleCosHorizon - cosHorizons.x) * mix(1., 2. / float(j + 2), distanceFallOff));\n\t\t\t\t\t}\n\n\t\t\t\t\tsampleSceneUvDepth = getSceneUvAndDepth(viewPos - sampleViewOffset);\n\t\t\t\t\tsampleSceneViewPos = getViewPosition(sampleSceneUvDepth.xy, sampleSceneUvDepth.z);\n\t\t\t\t\tviewDelta = sampleSceneViewPos - viewPos;\n\t\t\t\t\tif (abs(viewDelta.z) < thickness) {\n\t\t\t\t\t\tfloat sampleCosHorizon = dot(viewDir, normalize(viewDelta));\n\t\t\t\t\t\tcosHorizons.y += max(0., (sampleCosHorizon - cosHorizons.y) * mix(1., 2. / float(j + 2), distanceFallOff));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvec2 sinHorizons = sqrt(1. - cosHorizons * cosHorizons);\n\t\t\t\tfloat nx = dot(normalInSlice, sliceTangent);\n\t\t\t\tfloat ny = dot(normalInSlice, viewDir);\n\t\t\t\tfloat nxb = 1. / 2. * (acos(cosHorizons.y) - acos(cosHorizons.x) + sinHorizons.x * cosHorizons.x - sinHorizons.y * cosHorizons.y);\n\t\t\t\tfloat nyb = 1. / 2. * (2. - cosHorizons.x * cosHorizons.x - cosHorizons.y * cosHorizons.y);\n\t\t\t\tfloat occlusion = nx * nxb + ny * nyb;\n\t\t\t\tao += occlusion;\n\t\t\t}\n\n\t\t\tao = clamp(ao / float(DIRECTIONS), 0., 1.);\n\t\t#if SCENE_CLIP_BOX == 1\n\t\t\tao = mix(ao, 1., smoothstep(0., radiusToUse, boxDistance));\n\t\t#endif\n\t\t\tao = pow(ao, scale);\n\n\t\t\tgl_FragColor = FRAGMENT_OUTPUT;\n\t\t}`\n )\n}, $n = {\n defines: {\n PERSPECTIVE_CAMERA: 1\n },\n uniforms: {\n tDepth: { value: null },\n cameraNear: { value: null },\n cameraFar: { value: null }\n },\n vertexShader: (\n /* glsl */\n `\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tuniform sampler2D tDepth;\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tvarying vec2 vUv;\n\n\t\t#include \n\n\t\tfloat getLinearDepth( const in vec2 screenPosition ) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\t\tfloat fragCoordZ = texture2D( tDepth, screenPosition ).x;\n\t\t\t\tfloat viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\n\t\t\t\treturn viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n\t\t\t#else\n\t\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\t\t\t#endif\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getLinearDepth( vUv );\n\t\t\tgl_FragColor = vec4( vec3( 1.0 - depth ), 1.0 );\n\n\t\t}`\n )\n}, rs = {\n uniforms: {\n tDiffuse: { value: null },\n intensity: { value: 1 }\n },\n vertexShader: (\n /* glsl */\n `\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tuniform float intensity;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4(mix(vec3(1.), texel.rgb, intensity), texel.a);\n\t\t}`\n )\n};\nfunction uc(o = 5) {\n const e = Math.floor(o) % 2 === 0 ? Math.floor(o) + 1 : Math.floor(o), t = dc(e), n = t.length, i = new Uint8Array(n * 4);\n for (let r = 0; r < n; ++r) {\n const a = t[r], l = 2 * Math.PI * a / n, h = new K(\n Math.cos(l),\n Math.sin(l),\n 0\n ).normalize();\n i[r * 4] = (h.x * 0.5 + 0.5) * 255, i[r * 4 + 1] = (h.y * 0.5 + 0.5) * 255, i[r * 4 + 2] = 127, i[r * 4 + 3] = 255;\n }\n const s = new lr(i, e, e);\n return s.wrapS = vt, s.wrapT = vt, s.needsUpdate = !0, s;\n}\nfunction dc(o) {\n const e = Math.floor(o) % 2 === 0 ? Math.floor(o) + 1 : Math.floor(o), t = e * e, n = Array(t).fill(0);\n let i = Math.floor(e / 2), s = e - 1;\n for (let r = 1; r <= t; ) {\n if (i === -1 && s === e ? (s = e - 2, i = 0) : (s === e && (s = 0), i < 0 && (i = e - 1)), n[i * e + s] !== 0) {\n s -= 2, i++;\n continue;\n } else\n n[i * e + s] = r++;\n s++, i--;\n }\n return n;\n}\nconst Jn = {\n defines: {\n SAMPLES: 16,\n SAMPLE_VECTORS: ia(16, 2, 1),\n NORMAL_VECTOR_TYPE: 1,\n DEPTH_VALUE_SOURCE: 0\n },\n uniforms: {\n tDiffuse: { value: null },\n tNormal: { value: null },\n tDepth: { value: null },\n tNoise: { value: null },\n resolution: { value: new ue() },\n cameraProjectionMatrixInverse: { value: new Me() },\n lumaPhi: { value: 5 },\n depthPhi: { value: 5 },\n normalPhi: { value: 5 },\n radius: { value: 4 },\n index: { value: 0 }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tNormal;\n\t\tuniform sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\t\tuniform vec2 resolution;\n\t\tuniform mat4 cameraProjectionMatrixInverse;\n\t\tuniform float lumaPhi;\n\t\tuniform float depthPhi;\n\t\tuniform float normalPhi;\n\t\tuniform float radius;\n\t\tuniform int index;\n\n\t\t#include \n\t\t#include \n\n\t\t#ifndef SAMPLE_LUMINANCE\n\t\t#define SAMPLE_LUMINANCE dot(vec3(0.2125, 0.7154, 0.0721), a)\n\t\t#endif\n\n\t\t#ifndef FRAGMENT_OUTPUT\n\t\t#define FRAGMENT_OUTPUT vec4(denoised, 1.)\n\t\t#endif\n\n\t\tfloat getLuminance(const in vec3 a) {\n\t\t\treturn SAMPLE_LUMINANCE;\n\t\t}\n\n\t\tconst vec3 poissonDisk[SAMPLES] = SAMPLE_VECTORS;\n\n\t\tvec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n\t\t\tvec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n\t\t\tvec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;\n\t\t\treturn viewSpacePosition.xyz / viewSpacePosition.w;\n\t\t}\n\n\t\tfloat getDepth(const vec2 uv) {\n\t\t#if DEPTH_VALUE_SOURCE == 1\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).a;\n\t\t#else\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).r;\n\t\t#endif\n\t\t}\n\n\t\tfloat fetchDepth(const ivec2 uv) {\n\t\t\t#if DEPTH_VALUE_SOURCE == 1\n\t\t\t\treturn texelFetch(tDepth, uv.xy, 0).a;\n\t\t\t#else\n\t\t\t\treturn texelFetch(tDepth, uv.xy, 0).r;\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 computeNormalFromDepth(const vec2 uv) {\n\t\t\tvec2 size = vec2(textureSize(tDepth, 0));\n\t\t\tivec2 p = ivec2(uv * size);\n\t\t\tfloat c0 = fetchDepth(p);\n\t\t\tfloat l2 = fetchDepth(p - ivec2(2, 0));\n\t\t\tfloat l1 = fetchDepth(p - ivec2(1, 0));\n\t\t\tfloat r1 = fetchDepth(p + ivec2(1, 0));\n\t\t\tfloat r2 = fetchDepth(p + ivec2(2, 0));\n\t\t\tfloat b2 = fetchDepth(p - ivec2(0, 2));\n\t\t\tfloat b1 = fetchDepth(p - ivec2(0, 1));\n\t\t\tfloat t1 = fetchDepth(p + ivec2(0, 1));\n\t\t\tfloat t2 = fetchDepth(p + ivec2(0, 2));\n\t\t\tfloat dl = abs((2.0 * l1 - l2) - c0);\n\t\t\tfloat dr = abs((2.0 * r1 - r2) - c0);\n\t\t\tfloat db = abs((2.0 * b1 - b2) - c0);\n\t\t\tfloat dt = abs((2.0 * t1 - t2) - c0);\n\t\t\tvec3 ce = getViewPosition(uv, c0).xyz;\n\t\t\tvec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz\n\t\t\t\t\t\t\t\t\t: -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n\t\t\tvec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz\n\t\t\t\t\t\t\t\t\t: -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n\t\t\treturn normalize(cross(dpdx, dpdy));\n\t\t}\n\n\t\tvec3 getViewNormal(const vec2 uv) {\n\t\t#if NORMAL_VECTOR_TYPE == 2\n\t\t\treturn normalize(textureLod(tNormal, uv, 0.).rgb);\n\t\t#elif NORMAL_VECTOR_TYPE == 1\n\t\t\treturn unpackRGBToNormal(textureLod(tNormal, uv, 0.).rgb);\n\t\t#else\n\t\t\treturn computeNormalFromDepth(uv);\n\t\t#endif\n\t\t}\n\n\t\tvoid denoiseSample(in vec3 center, in vec3 viewNormal, in vec3 viewPos, in vec2 sampleUv, inout vec3 denoised, inout float totalWeight) {\n\t\t\tvec4 sampleTexel = textureLod(tDiffuse, sampleUv, 0.0);\n\t\t\tfloat sampleDepth = getDepth(sampleUv);\n\t\t\tvec3 sampleNormal = getViewNormal(sampleUv);\n\t\t\tvec3 neighborColor = sampleTexel.rgb;\n\t\t\tvec3 viewPosSample = getViewPosition(sampleUv, sampleDepth);\n\n\t\t\tfloat normalDiff = dot(viewNormal, sampleNormal);\n\t\t\tfloat normalSimilarity = pow(max(normalDiff, 0.), normalPhi);\n\t\t\tfloat lumaDiff = abs(getLuminance(neighborColor) - getLuminance(center));\n\t\t\tfloat lumaSimilarity = max(1.0 - lumaDiff / lumaPhi, 0.0);\n\t\t\tfloat depthDiff = abs(dot(viewPos - viewPosSample, viewNormal));\n\t\t\tfloat depthSimilarity = max(1. - depthDiff / depthPhi, 0.);\n\t\t\tfloat w = lumaSimilarity * depthSimilarity * normalSimilarity;\n\n\t\t\tdenoised += w * neighborColor;\n\t\t\ttotalWeight += w;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth(vUv.xy);\n\t\t\tvec3 viewNormal = getViewNormal(vUv);\n\t\t\tif (depth == 1. || dot(viewNormal, viewNormal) == 0.) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvec4 texel = textureLod(tDiffuse, vUv, 0.0);\n\t\t\tvec3 center = texel.rgb;\n\t\t\tvec3 viewPos = getViewPosition(vUv, depth);\n\n\t\t\tvec2 noiseResolution = vec2(textureSize(tNoise, 0));\n\t\t\tvec2 noiseUv = vUv * resolution / noiseResolution;\n\t\t\tvec4 noiseTexel = textureLod(tNoise, noiseUv, 0.0);\n \t\tvec2 noiseVec = vec2(sin(noiseTexel[index % 4] * 2. * PI), cos(noiseTexel[index % 4] * 2. * PI));\n \t\tmat2 rotationMatrix = mat2(noiseVec.x, -noiseVec.y, noiseVec.x, noiseVec.y);\n\n\t\t\tfloat totalWeight = 1.0;\n\t\t\tvec3 denoised = texel.rgb;\n\t\t\tfor (int i = 0; i < SAMPLES; i++) {\n\t\t\t\tvec3 sampleDir = poissonDisk[i];\n\t\t\t\tvec2 offset = rotationMatrix * (sampleDir.xy * (1. + sampleDir.z * (radius - 1.)) / resolution);\n\t\t\t\tvec2 sampleUv = vUv + offset;\n\t\t\t\tdenoiseSample(center, viewNormal, viewPos, sampleUv, denoised, totalWeight);\n\t\t\t}\n\n\t\t\tif (totalWeight > 0.) {\n\t\t\t\tdenoised /= totalWeight;\n\t\t\t}\n\t\t\tgl_FragColor = FRAGMENT_OUTPUT;\n\t\t}`\n )\n};\nfunction ia(o, e, t) {\n const n = fc(\n o,\n e,\n t\n );\n let i = \"vec3[SAMPLES](\";\n for (let s = 0; s < o; s++) {\n const r = n[s];\n i += `vec3(${r.x}, ${r.y}, ${r.z})${s < o - 1 ? \",\" : \")\"}`;\n }\n return i;\n}\nfunction fc(o, e, t) {\n const n = [];\n for (let i = 0; i < o; i++) {\n const s = 2 * Math.PI * e * i / o, r = Math.pow(i / (o - 1), t);\n n.push(new K(Math.cos(s), Math.sin(s), r));\n }\n return n;\n}\nclass sa {\n /**\n * Constructs a new simplex noise object.\n *\n * @param {Object} [r=Math] - A math utility class that holds a `random()` method. This makes it\n * possible to pass in custom random number generator.\n */\n constructor(e = Math) {\n this.grad3 = [\n [1, 1, 0],\n [-1, 1, 0],\n [1, -1, 0],\n [-1, -1, 0],\n [1, 0, 1],\n [-1, 0, 1],\n [1, 0, -1],\n [-1, 0, -1],\n [0, 1, 1],\n [0, -1, 1],\n [0, 1, -1],\n [0, -1, -1]\n ], this.grad4 = [\n [0, 1, 1, 1],\n [0, 1, 1, -1],\n [0, 1, -1, 1],\n [0, 1, -1, -1],\n [0, -1, 1, 1],\n [0, -1, 1, -1],\n [0, -1, -1, 1],\n [0, -1, -1, -1],\n [1, 0, 1, 1],\n [1, 0, 1, -1],\n [1, 0, -1, 1],\n [1, 0, -1, -1],\n [-1, 0, 1, 1],\n [-1, 0, 1, -1],\n [-1, 0, -1, 1],\n [-1, 0, -1, -1],\n [1, 1, 0, 1],\n [1, 1, 0, -1],\n [1, -1, 0, 1],\n [1, -1, 0, -1],\n [-1, 1, 0, 1],\n [-1, 1, 0, -1],\n [-1, -1, 0, 1],\n [-1, -1, 0, -1],\n [1, 1, 1, 0],\n [1, 1, -1, 0],\n [1, -1, 1, 0],\n [1, -1, -1, 0],\n [-1, 1, 1, 0],\n [-1, 1, -1, 0],\n [-1, -1, 1, 0],\n [-1, -1, -1, 0]\n ], this.p = [];\n for (let t = 0; t < 256; t++)\n this.p[t] = Math.floor(e.random() * 256);\n this.perm = [];\n for (let t = 0; t < 512; t++)\n this.perm[t] = this.p[t & 255];\n this.simplex = [\n [0, 1, 2, 3],\n [0, 1, 3, 2],\n [0, 0, 0, 0],\n [0, 2, 3, 1],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [1, 2, 3, 0],\n [0, 2, 1, 3],\n [0, 0, 0, 0],\n [0, 3, 1, 2],\n [0, 3, 2, 1],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [1, 3, 2, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [1, 2, 0, 3],\n [0, 0, 0, 0],\n [1, 3, 0, 2],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [2, 3, 0, 1],\n [2, 3, 1, 0],\n [1, 0, 2, 3],\n [1, 0, 3, 2],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [2, 0, 3, 1],\n [0, 0, 0, 0],\n [2, 1, 3, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [2, 0, 1, 3],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [3, 0, 1, 2],\n [3, 0, 2, 1],\n [0, 0, 0, 0],\n [3, 1, 2, 0],\n [2, 1, 0, 3],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [3, 1, 0, 2],\n [0, 0, 0, 0],\n [3, 2, 0, 1],\n [3, 2, 1, 0]\n ];\n }\n /**\n * A 2D simplex noise method.\n *\n * @param {number} xin - The x coordinate.\n * @param {number} yin - The y coordinate.\n * @return {number} The noise value.\n */\n noise(e, t) {\n let n, i, s;\n const r = 0.5 * (Math.sqrt(3) - 1), a = (e + t) * r, l = Math.floor(e + a), h = Math.floor(t + a), c = (3 - Math.sqrt(3)) / 6, u = (l + h) * c, m = l - u, f = h - u, d = e - m, p = t - f;\n let g, y;\n d > p ? (g = 1, y = 0) : (g = 0, y = 1);\n const w = d - g + c, x = p - y + c, _ = d - 1 + 2 * c, b = p - 1 + 2 * c, E = l & 255, A = h & 255, P = this.perm[E + this.perm[A]] % 12, C = this.perm[E + g + this.perm[A + y]] % 12, D = this.perm[E + 1 + this.perm[A + 1]] % 12;\n let I = 0.5 - d * d - p * p;\n I < 0 ? n = 0 : (I *= I, n = I * I * this._dot(this.grad3[P], d, p));\n let T = 0.5 - w * w - x * x;\n T < 0 ? i = 0 : (T *= T, i = T * T * this._dot(this.grad3[C], w, x));\n let R = 0.5 - _ * _ - b * b;\n return R < 0 ? s = 0 : (R *= R, s = R * R * this._dot(this.grad3[D], _, b)), 70 * (n + i + s);\n }\n /**\n * A 3D simplex noise method.\n *\n * @param {number} xin - The x coordinate.\n * @param {number} yin - The y coordinate.\n * @param {number} zin - The z coordinate.\n * @return {number} The noise value.\n */\n noise3d(e, t, n) {\n let i, s, r, a;\n const h = (e + t + n) * 0.3333333333333333, c = Math.floor(e + h), u = Math.floor(t + h), m = Math.floor(n + h), f = 1 / 6, d = (c + u + m) * f, p = c - d, g = u - d, y = m - d, w = e - p, x = t - g, _ = n - y;\n let b, E, A, P, C, D;\n w >= x ? x >= _ ? (b = 1, E = 0, A = 0, P = 1, C = 1, D = 0) : w >= _ ? (b = 1, E = 0, A = 0, P = 1, C = 0, D = 1) : (b = 0, E = 0, A = 1, P = 1, C = 0, D = 1) : x < _ ? (b = 0, E = 0, A = 1, P = 0, C = 1, D = 1) : w < _ ? (b = 0, E = 1, A = 0, P = 0, C = 1, D = 1) : (b = 0, E = 1, A = 0, P = 1, C = 1, D = 0);\n const I = w - b + f, T = x - E + f, R = _ - A + f, v = w - P + 2 * f, z = x - C + 2 * f, H = _ - D + 2 * f, V = w - 1 + 3 * f, te = x - 1 + 3 * f, G = _ - 1 + 3 * f, $ = c & 255, N = u & 255, O = m & 255, Q = this.perm[$ + this.perm[N + this.perm[O]]] % 12, ee = this.perm[$ + b + this.perm[N + E + this.perm[O + A]]] % 12, q = this.perm[$ + P + this.perm[N + C + this.perm[O + D]]] % 12, de = this.perm[$ + 1 + this.perm[N + 1 + this.perm[O + 1]]] % 12;\n let pe = 0.6 - w * w - x * x - _ * _;\n pe < 0 ? i = 0 : (pe *= pe, i = pe * pe * this._dot3(this.grad3[Q], w, x, _));\n let se = 0.6 - I * I - T * T - R * R;\n se < 0 ? s = 0 : (se *= se, s = se * se * this._dot3(this.grad3[ee], I, T, R));\n let oe = 0.6 - v * v - z * z - H * H;\n oe < 0 ? r = 0 : (oe *= oe, r = oe * oe * this._dot3(this.grad3[q], v, z, H));\n let he = 0.6 - V * V - te * te - G * G;\n return he < 0 ? a = 0 : (he *= he, a = he * he * this._dot3(this.grad3[de], V, te, G)), 32 * (i + s + r + a);\n }\n /**\n * A 4D simplex noise method.\n *\n * @param {number} x - The x coordinate.\n * @param {number} y - The y coordinate.\n * @param {number} z - The z coordinate.\n * @param {number} w - The w coordinate.\n * @return {number} The noise value.\n */\n noise4d(e, t, n, i) {\n const s = this.grad4, r = this.simplex, a = this.perm, l = (Math.sqrt(5) - 1) / 4, h = (5 - Math.sqrt(5)) / 20;\n let c, u, m, f, d;\n const p = (e + t + n + i) * l, g = Math.floor(e + p), y = Math.floor(t + p), w = Math.floor(n + p), x = Math.floor(i + p), _ = (g + y + w + x) * h, b = g - _, E = y - _, A = w - _, P = x - _, C = e - b, D = t - E, I = n - A, T = i - P, R = C > D ? 32 : 0, v = C > I ? 16 : 0, z = D > I ? 8 : 0, H = C > T ? 4 : 0, V = D > T ? 2 : 0, te = I > T ? 1 : 0, G = R + v + z + H + V + te, $ = r[G][0] >= 3 ? 1 : 0, N = r[G][1] >= 3 ? 1 : 0, O = r[G][2] >= 3 ? 1 : 0, Q = r[G][3] >= 3 ? 1 : 0, ee = r[G][0] >= 2 ? 1 : 0, q = r[G][1] >= 2 ? 1 : 0, de = r[G][2] >= 2 ? 1 : 0, pe = r[G][3] >= 2 ? 1 : 0, se = r[G][0] >= 1 ? 1 : 0, oe = r[G][1] >= 1 ? 1 : 0, he = r[G][2] >= 1 ? 1 : 0, me = r[G][3] >= 1 ? 1 : 0, Te = C - $ + h, Ie = D - N + h, S = I - O + h, W = T - Q + h, j = C - ee + 2 * h, L = D - q + 2 * h, k = I - de + 2 * h, B = T - pe + 2 * h, X = C - se + 3 * h, Z = D - oe + 3 * h, F = I - he + 3 * h, Y = T - me + 3 * h, ne = C - 1 + 4 * h, J = D - 1 + 4 * h, ie = I - 1 + 4 * h, ce = T - 1 + 4 * h, ae = g & 255, Ee = y & 255, Je = w & 255, De = x & 255, Bt = a[ae + a[Ee + a[Je + a[De]]]] % 32, ye = a[ae + $ + a[Ee + N + a[Je + O + a[De + Q]]]] % 32, sn = a[ae + ee + a[Ee + q + a[Je + de + a[De + pe]]]] % 32, Mn = a[ae + se + a[Ee + oe + a[Je + he + a[De + me]]]] % 32, Qe = a[ae + 1 + a[Ee + 1 + a[Je + 1 + a[De + 1]]]] % 32;\n let Tt = 0.6 - C * C - D * D - I * I - T * T;\n Tt < 0 ? c = 0 : (Tt *= Tt, c = Tt * Tt * this._dot4(s[Bt], C, D, I, T));\n let Nt = 0.6 - Te * Te - Ie * Ie - S * S - W * W;\n Nt < 0 ? u = 0 : (Nt *= Nt, u = Nt * Nt * this._dot4(s[ye], Te, Ie, S, W));\n let Ft = 0.6 - j * j - L * L - k * k - B * B;\n Ft < 0 ? m = 0 : (Ft *= Ft, m = Ft * Ft * this._dot4(s[sn], j, L, k, B));\n let Ut = 0.6 - X * X - Z * Z - F * F - Y * Y;\n Ut < 0 ? f = 0 : (Ut *= Ut, f = Ut * Ut * this._dot4(s[Mn], X, Z, F, Y));\n let Et = 0.6 - ne * ne - J * J - ie * ie - ce * ce;\n return Et < 0 ? d = 0 : (Et *= Et, d = Et * Et * this._dot4(s[Qe], ne, J, ie, ce)), 27 * (c + u + m + f + d);\n }\n // private\n _dot(e, t, n) {\n return e[0] * t + e[1] * n;\n }\n _dot3(e, t, n, i) {\n return e[0] * t + e[1] * n + e[2] * i;\n }\n _dot4(e, t, n, i, s) {\n return e[0] * t + e[1] * n + e[2] * i + e[3] * s;\n }\n}\nclass Fe extends tn {\n /**\n * Constructs a new GTAO pass.\n *\n * @param {Scene} scene - The scene to compute the AO for.\n * @param {Camera} camera - The camera.\n * @param {number} [width=512] - The width of the effect.\n * @param {number} [height=512] - The height of the effect.\n * @param {Object} [parameters] - The pass parameters.\n * @param {Object} [aoParameters] - The AO parameters.\n * @param {Object} [pdParameters] - The denoise parameters.\n */\n constructor(e, t, n = 512, i = 512, s, r, a) {\n super(), this.width = n, this.height = i, this.clear = !0, this.camera = t, this.scene = e, this.output = 0, this._renderGBuffer = !0, this._visibilityCache = [], this.blendIntensity = 1, this.pdRings = 2, this.pdRadiusExponent = 2, this.pdSamples = 16, this.gtaoNoiseTexture = uc(), this.pdNoiseTexture = this._generateNoise(), this.gtaoRenderTarget = new Vn(this.width, this.height, { type: _t }), this.pdRenderTarget = this.gtaoRenderTarget.clone(), this.gtaoMaterial = new tt({\n defines: Object.assign({}, Kn.defines),\n uniforms: nt.clone(Kn.uniforms),\n vertexShader: Kn.vertexShader,\n fragmentShader: Kn.fragmentShader,\n blending: ze,\n depthTest: !1,\n depthWrite: !1\n }), this.gtaoMaterial.defines.PERSPECTIVE_CAMERA = this.camera.isPerspectiveCamera ? 1 : 0, this.gtaoMaterial.uniforms.tNoise.value = this.gtaoNoiseTexture, this.gtaoMaterial.uniforms.resolution.value.set(this.width, this.height), this.gtaoMaterial.uniforms.cameraNear.value = this.camera.near, this.gtaoMaterial.uniforms.cameraFar.value = this.camera.far, this.normalMaterial = new Ho(), this.normalMaterial.blending = ze, this.pdMaterial = new tt({\n defines: Object.assign({}, Jn.defines),\n uniforms: nt.clone(Jn.uniforms),\n vertexShader: Jn.vertexShader,\n fragmentShader: Jn.fragmentShader,\n depthTest: !1,\n depthWrite: !1\n }), this.pdMaterial.uniforms.tDiffuse.value = this.gtaoRenderTarget.texture, this.pdMaterial.uniforms.tNoise.value = this.pdNoiseTexture, this.pdMaterial.uniforms.resolution.value.set(this.width, this.height), this.pdMaterial.uniforms.lumaPhi.value = 10, this.pdMaterial.uniforms.depthPhi.value = 2, this.pdMaterial.uniforms.normalPhi.value = 3, this.pdMaterial.uniforms.radius.value = 8, this.depthRenderMaterial = new tt({\n defines: Object.assign({}, $n.defines),\n uniforms: nt.clone($n.uniforms),\n vertexShader: $n.vertexShader,\n fragmentShader: $n.fragmentShader,\n blending: ze\n }), this.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near, this.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far, this.copyMaterial = new tt({\n uniforms: nt.clone(Kt.uniforms),\n vertexShader: Kt.vertexShader,\n fragmentShader: Kt.fragmentShader,\n transparent: !0,\n depthTest: !1,\n depthWrite: !1,\n blendSrc: Ns,\n blendDst: pn,\n blendEquation: fn,\n blendSrcAlpha: Bs,\n blendDstAlpha: pn,\n blendEquationAlpha: fn\n }), this.blendMaterial = new tt({\n uniforms: nt.clone(rs.uniforms),\n vertexShader: rs.vertexShader,\n fragmentShader: rs.fragmentShader,\n transparent: !0,\n depthTest: !1,\n depthWrite: !1,\n blending: jo,\n blendSrc: Ns,\n blendDst: pn,\n blendEquation: fn,\n blendSrcAlpha: Bs,\n blendDstAlpha: pn,\n blendEquationAlpha: fn\n }), this._fsQuad = new Yi(null), this._originalClearColor = new st(), this.setGBuffer(s ? s.depthTexture : void 0, s ? s.normalTexture : void 0), r !== void 0 && this.updateGtaoMaterial(r), a !== void 0 && this.updatePdMaterial(a);\n }\n /**\n * Sets the size of the pass.\n *\n * @param {number} width - The width to set.\n * @param {number} height - The height to set.\n */\n setSize(e, t) {\n this.width = e, this.height = t, this.gtaoRenderTarget.setSize(e, t), this.normalRenderTarget.setSize(e, t), this.pdRenderTarget.setSize(e, t), this.gtaoMaterial.uniforms.resolution.value.set(e, t), this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix), this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse), this.pdMaterial.uniforms.resolution.value.set(e, t), this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.gtaoNoiseTexture.dispose(), this.pdNoiseTexture.dispose(), this.normalRenderTarget.dispose(), this.gtaoRenderTarget.dispose(), this.pdRenderTarget.dispose(), this.normalMaterial.dispose(), this.pdMaterial.dispose(), this.copyMaterial.dispose(), this.depthRenderMaterial.dispose(), this._fsQuad.dispose();\n }\n /**\n * A texture holding the computed AO.\n *\n * @type {Texture}\n * @readonly\n */\n get gtaoMap() {\n return this.pdRenderTarget.texture;\n }\n /**\n * Configures the GBuffer of this pass. If no arguments are passed,\n * the pass creates an internal render target for holding depth\n * and normal data.\n *\n * @param {DepthTexture} [depthTexture] - The depth texture.\n * @param {DepthTexture} [normalTexture] - The normal texture.\n */\n setGBuffer(e, t) {\n e !== void 0 ? (this.depthTexture = e, this.normalTexture = t, this._renderGBuffer = !1) : (this.depthTexture = new Go(), this.depthTexture.format = Wo, this.depthTexture.type = Xo, this.normalRenderTarget = new Vn(this.width, this.height, {\n minFilter: xn,\n magFilter: xn,\n type: _t,\n depthTexture: this.depthTexture\n }), this.normalTexture = this.normalRenderTarget.texture, this._renderGBuffer = !0);\n const n = this.normalTexture ? 1 : 0, i = this.depthTexture === this.normalTexture ? \"w\" : \"x\";\n this.gtaoMaterial.defines.NORMAL_VECTOR_TYPE = n, this.gtaoMaterial.defines.DEPTH_SWIZZLING = i, this.gtaoMaterial.uniforms.tNormal.value = this.normalTexture, this.gtaoMaterial.uniforms.tDepth.value = this.depthTexture, this.pdMaterial.defines.NORMAL_VECTOR_TYPE = n, this.pdMaterial.defines.DEPTH_SWIZZLING = i, this.pdMaterial.uniforms.tNormal.value = this.normalTexture, this.pdMaterial.uniforms.tDepth.value = this.depthTexture, this.depthRenderMaterial.uniforms.tDepth.value = this.normalRenderTarget.depthTexture;\n }\n /**\n * Configures the clip box of the GTAO shader with the given AABB.\n *\n * @param {?Box3} box - The AABB enclosing the scene that should receive AO. When passing\n * `null`, to clip box is used.\n */\n setSceneClipBox(e) {\n e ? (this.gtaoMaterial.needsUpdate = this.gtaoMaterial.defines.SCENE_CLIP_BOX !== 1, this.gtaoMaterial.defines.SCENE_CLIP_BOX = 1, this.gtaoMaterial.uniforms.sceneBoxMin.value.copy(e.min), this.gtaoMaterial.uniforms.sceneBoxMax.value.copy(e.max)) : (this.gtaoMaterial.needsUpdate = this.gtaoMaterial.defines.SCENE_CLIP_BOX === 0, this.gtaoMaterial.defines.SCENE_CLIP_BOX = 0);\n }\n /**\n * Updates the GTAO material from the given parameter object.\n *\n * @param {Object} parameters - The GTAO material parameters.\n */\n updateGtaoMaterial(e) {\n e.radius !== void 0 && (this.gtaoMaterial.uniforms.radius.value = e.radius), e.distanceExponent !== void 0 && (this.gtaoMaterial.uniforms.distanceExponent.value = e.distanceExponent), e.thickness !== void 0 && (this.gtaoMaterial.uniforms.thickness.value = e.thickness), e.distanceFallOff !== void 0 && (this.gtaoMaterial.uniforms.distanceFallOff.value = e.distanceFallOff, this.gtaoMaterial.needsUpdate = !0), e.scale !== void 0 && (this.gtaoMaterial.uniforms.scale.value = e.scale), e.samples !== void 0 && e.samples !== this.gtaoMaterial.defines.SAMPLES && (this.gtaoMaterial.defines.SAMPLES = e.samples, this.gtaoMaterial.needsUpdate = !0), e.screenSpaceRadius !== void 0 && (e.screenSpaceRadius ? 1 : 0) !== this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS && (this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS = e.screenSpaceRadius ? 1 : 0, this.gtaoMaterial.needsUpdate = !0);\n }\n /**\n * Updates the Denoise material from the given parameter object.\n *\n * @param {Object} parameters - The denoise parameters.\n */\n updatePdMaterial(e) {\n let t = !1;\n e.lumaPhi !== void 0 && (this.pdMaterial.uniforms.lumaPhi.value = e.lumaPhi), e.depthPhi !== void 0 && (this.pdMaterial.uniforms.depthPhi.value = e.depthPhi), e.normalPhi !== void 0 && (this.pdMaterial.uniforms.normalPhi.value = e.normalPhi), e.radius !== void 0 && e.radius !== this.radius && (this.pdMaterial.uniforms.radius.value = e.radius), e.radiusExponent !== void 0 && e.radiusExponent !== this.pdRadiusExponent && (this.pdRadiusExponent = e.radiusExponent, t = !0), e.rings !== void 0 && e.rings !== this.pdRings && (this.pdRings = e.rings, t = !0), e.samples !== void 0 && e.samples !== this.pdSamples && (this.pdSamples = e.samples, t = !0), t && (this.pdMaterial.defines.SAMPLES = this.pdSamples, this.pdMaterial.defines.SAMPLE_VECTORS = ia(this.pdSamples, this.pdRings, this.pdRadiusExponent), this.pdMaterial.needsUpdate = !0);\n }\n /**\n * Performs the GTAO pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n switch (this._renderGBuffer && (this._overrideVisibility(), this._renderOverride(e, this.normalMaterial, this.normalRenderTarget, 7829503, 1), this._restoreVisibility()), this.gtaoMaterial.uniforms.cameraNear.value = this.camera.near, this.gtaoMaterial.uniforms.cameraFar.value = this.camera.far, this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix), this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse), this.gtaoMaterial.uniforms.cameraWorldMatrix.value.copy(this.camera.matrixWorld), this._renderPass(e, this.gtaoMaterial, this.gtaoRenderTarget, 16777215, 1), this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse), this._renderPass(e, this.pdMaterial, this.pdRenderTarget, 16777215, 1), this.output) {\n case Fe.OUTPUT.Off:\n break;\n case Fe.OUTPUT.Diffuse:\n this.copyMaterial.uniforms.tDiffuse.value = n.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Fe.OUTPUT.AO:\n this.copyMaterial.uniforms.tDiffuse.value = this.gtaoRenderTarget.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Fe.OUTPUT.Denoise:\n this.copyMaterial.uniforms.tDiffuse.value = this.pdRenderTarget.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Fe.OUTPUT.Depth:\n this.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near, this.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far, this._renderPass(e, this.depthRenderMaterial, this.renderToScreen ? null : t);\n break;\n case Fe.OUTPUT.Normal:\n this.copyMaterial.uniforms.tDiffuse.value = this.normalRenderTarget.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Fe.OUTPUT.Default:\n this.copyMaterial.uniforms.tDiffuse.value = n.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t), this.blendMaterial.uniforms.intensity.value = this.blendIntensity, this.blendMaterial.uniforms.tDiffuse.value = this.pdRenderTarget.texture, this._renderPass(e, this.blendMaterial, this.renderToScreen ? null : t);\n break;\n default:\n console.warn(\"THREE.GTAOPass: Unknown output type.\");\n }\n }\n // internals\n _renderPass(e, t, n, i, s) {\n e.getClearColor(this._originalClearColor);\n const r = e.getClearAlpha(), a = e.autoClear;\n e.setRenderTarget(n), e.autoClear = !1, i != null && (e.setClearColor(i), e.setClearAlpha(s || 0), e.clear()), this._fsQuad.material = t, this._fsQuad.render(e), e.autoClear = a, e.setClearColor(this._originalClearColor), e.setClearAlpha(r);\n }\n _renderOverride(e, t, n, i, s) {\n e.getClearColor(this._originalClearColor);\n const r = e.getClearAlpha(), a = e.autoClear;\n e.setRenderTarget(n), e.autoClear = !1, i = t.clearColor || i, s = t.clearAlpha || s, i != null && (e.setClearColor(i), e.setClearAlpha(s || 0), e.clear()), this.scene.overrideMaterial = t, e.render(this.scene, this.camera), this.scene.overrideMaterial = null, e.autoClear = a, e.setClearColor(this._originalClearColor), e.setClearAlpha(r);\n }\n _overrideVisibility() {\n const e = this.scene, t = this._visibilityCache;\n e.traverse(function(n) {\n (n.isPoints || n.isLine || n.isLine2) && n.visible && (n.visible = !1, t.push(n));\n });\n }\n _restoreVisibility() {\n const e = this._visibilityCache;\n for (let t = 0; t < e.length; t++)\n e[t].visible = !0;\n e.length = 0;\n }\n _generateNoise(e = 64) {\n const t = new sa(), n = e * e * 4, i = new Uint8Array(n);\n for (let r = 0; r < e; r++)\n for (let a = 0; a < e; a++) {\n const l = r, h = a;\n i[(r * e + a) * 4] = (t.noise(l, h) * 0.5 + 0.5) * 255, i[(r * e + a) * 4 + 1] = (t.noise(l + e, h) * 0.5 + 0.5) * 255, i[(r * e + a) * 4 + 2] = (t.noise(l, h + e) * 0.5 + 0.5) * 255, i[(r * e + a) * 4 + 3] = (t.noise(l + e, h + e) * 0.5 + 0.5) * 255;\n }\n const s = new lr(i, e, e, $a, Ja);\n return s.wrapS = vt, s.wrapT = vt, s.needsUpdate = !0, s;\n }\n}\nFe.OUTPUT = {\n Off: -1,\n Default: 0,\n Diffuse: 1,\n Depth: 2,\n Normal: 3,\n AO: 4,\n Denoise: 5\n};\nconst Qn = {\n defines: {\n PERSPECTIVE_CAMERA: 1,\n KERNEL_SIZE: 32\n },\n uniforms: {\n tNormal: { value: null },\n tDepth: { value: null },\n tNoise: { value: null },\n kernel: { value: null },\n cameraNear: { value: null },\n cameraFar: { value: null },\n resolution: { value: new ue() },\n cameraProjectionMatrix: { value: new Me() },\n cameraInverseProjectionMatrix: { value: new Me() },\n kernelRadius: { value: 8 },\n minDistance: { value: 5e-3 },\n maxDistance: { value: 0.05 }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tuniform highp sampler2D tNormal;\n\t\tuniform highp sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\n\t\tuniform vec3 kernel[ KERNEL_SIZE ];\n\n\t\tuniform vec2 resolution;\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform mat4 cameraProjectionMatrix;\n\t\tuniform mat4 cameraInverseProjectionMatrix;\n\n\t\tuniform float kernelRadius;\n\t\tuniform float minDistance; // avoid artifacts caused by neighbour fragments with minimal depth difference\n\t\tuniform float maxDistance; // avoid the influence of fragments which are too far away\n\n\t\tvarying vec2 vUv;\n\n\t\t#include \n\n\t\tfloat getDepth( const in vec2 screenPosition ) {\n\n\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\n\t\t}\n\n\t\tfloat getLinearDepth( const in vec2 screenPosition ) {\n\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\n\t\t\t\tfloat fragCoordZ = texture2D( tDepth, screenPosition ).x;\n\t\t\t\tfloat viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\n\t\t\t\treturn viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n\n\t\t\t#else\n\n\t\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\n\t\t\t#endif\n\n\t\t}\n\n\t\tfloat getViewZ( const in float depth ) {\n\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\n\t\t\t\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\n\n\t\t\t#else\n\n\t\t\t\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\n\n\t\t\t#endif\n\n\t\t}\n\n\t\tvec3 getViewPosition( const in vec2 screenPosition, const in float depth, const in float viewZ ) {\n\n\t\t\tfloat clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\n\n\t\t\tvec4 clipPosition = vec4( ( vec3( screenPosition, depth ) - 0.5 ) * 2.0, 1.0 );\n\n\t\t\tclipPosition *= clipW; // unprojection.\n\n\t\t\treturn ( cameraInverseProjectionMatrix * clipPosition ).xyz;\n\n\t\t}\n\n\t\tvec3 getViewNormal( const in vec2 screenPosition ) {\n\n\t\t\treturn unpackRGBToNormal( texture2D( tNormal, screenPosition ).xyz );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tfloat depth = getDepth( vUv );\n\n\t\t\tif ( depth == 1.0 ) {\n\n\t\t\t\tgl_FragColor = vec4( 1.0 ); // don't influence background\n\n\t\t\t} else {\n\n\t\t\t\tfloat viewZ = getViewZ( depth );\n\n\t\t\t\tvec3 viewPosition = getViewPosition( vUv, depth, viewZ );\n\t\t\t\tvec3 viewNormal = getViewNormal( vUv );\n\n\t\t\t\tvec2 noiseScale = vec2( resolution.x / 4.0, resolution.y / 4.0 );\n\t\t\t\tvec3 random = vec3( texture2D( tNoise, vUv * noiseScale ).r );\n\n\t\t\t\t// compute matrix used to reorient a kernel vector\n\n\t\t\t\tvec3 tangent = normalize( random - viewNormal * dot( random, viewNormal ) );\n\t\t\t\tvec3 bitangent = cross( viewNormal, tangent );\n\t\t\t\tmat3 kernelMatrix = mat3( tangent, bitangent, viewNormal );\n\n\t\t\t\tfloat occlusion = 0.0;\n\n\t\t\t\tfor ( int i = 0; i < KERNEL_SIZE; i ++ ) {\n\n\t\t\t\t\tvec3 sampleVector = kernelMatrix * kernel[ i ]; // reorient sample vector in view space\n\t\t\t\t\tvec3 samplePoint = viewPosition + ( sampleVector * kernelRadius ); // calculate sample point\n\n\t\t\t\t\tvec4 samplePointNDC = cameraProjectionMatrix * vec4( samplePoint, 1.0 ); // project point and calculate NDC\n\t\t\t\t\tsamplePointNDC /= samplePointNDC.w;\n\n\t\t\t\t\tvec2 samplePointUv = samplePointNDC.xy * 0.5 + 0.5; // compute uv coordinates\n\n\t\t\t\t\tfloat realDepth = getLinearDepth( samplePointUv ); // get linear depth from depth texture\n\t\t\t\t\tfloat sampleDepth = viewZToOrthographicDepth( samplePoint.z, cameraNear, cameraFar ); // compute linear depth of the sample view Z value\n\t\t\t\t\tfloat delta = sampleDepth - realDepth;\n\n\t\t\t\t\tif ( delta > minDistance && delta < maxDistance ) { // if fragment is before sample point, increase occlusion\n\n\t\t\t\t\t\tocclusion += 1.0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tocclusion = clamp( occlusion / float( KERNEL_SIZE ), 0.0, 1.0 );\n\n\t\t\t\tgl_FragColor = vec4( vec3( 1.0 - occlusion ), 1.0 );\n\n\t\t\t}\n\n\t\t}`\n )\n}, ei = {\n defines: {\n PERSPECTIVE_CAMERA: 1\n },\n uniforms: {\n tDepth: { value: null },\n cameraNear: { value: null },\n cameraFar: { value: null }\n },\n vertexShader: `varying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n fragmentShader: `uniform sampler2D tDepth;\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\n\t\tvarying vec2 vUv;\n\n\t\t#include \n\n\t\tfloat getLinearDepth( const in vec2 screenPosition ) {\n\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\n\t\t\t\tfloat fragCoordZ = texture2D( tDepth, screenPosition ).x;\n\t\t\t\tfloat viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\n\t\t\t\treturn viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n\n\t\t\t#else\n\n\t\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\n\t\t\t#endif\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tfloat depth = getLinearDepth( vUv );\n\t\t\tgl_FragColor = vec4( vec3( 1.0 - depth ), 1.0 );\n\n\t\t}`\n}, ti = {\n uniforms: {\n tDiffuse: { value: null },\n resolution: { value: new ue() }\n },\n vertexShader: `varying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n fragmentShader: `uniform sampler2D tDiffuse;\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec2 texelSize = ( 1.0 / resolution );\n\t\t\tfloat result = 0.0;\n\n\t\t\tfor ( int i = - 2; i <= 2; i ++ ) {\n\n\t\t\t\tfor ( int j = - 2; j <= 2; j ++ ) {\n\n\t\t\t\t\tvec2 offset = ( vec2( float( i ), float( j ) ) ) * texelSize;\n\t\t\t\t\tresult += texture2D( tDiffuse, vUv + offset ).r;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgl_FragColor = vec4( vec3( result / ( 5.0 * 5.0 ) ), 1.0 );\n\n\t\t}`\n};\nclass xt extends tn {\n /**\n * Constructs a new SSAO pass.\n *\n * @param {Scene} scene - The scene to compute the AO for.\n * @param {Camera} camera - The camera.\n * @param {number} [width=512] - The width of the effect.\n * @param {number} [height=512] - The height of the effect.\n * @param {number} [kernelSize=32] - The kernel size.\n */\n constructor(e, t, n = 512, i = 512, s = 32) {\n super(), this.width = n, this.height = i, this.clear = !0, this.needsSwap = !1, this.camera = t, this.scene = e, this.kernelRadius = 8, this.kernel = [], this.noiseTexture = null, this.output = 0, this.minDistance = 5e-3, this.maxDistance = 0.1, this._visibilityCache = [], this._generateSampleKernel(s), this._generateRandomKernelRotations();\n const r = new Go();\n r.format = Wo, r.type = Xo, this.normalRenderTarget = new Vn(this.width, this.height, {\n minFilter: xn,\n magFilter: xn,\n type: _t,\n depthTexture: r\n }), this.ssaoRenderTarget = new Vn(this.width, this.height, { type: _t }), this.blurRenderTarget = this.ssaoRenderTarget.clone(), this.ssaoMaterial = new tt({\n defines: Object.assign({}, Qn.defines),\n uniforms: nt.clone(Qn.uniforms),\n vertexShader: Qn.vertexShader,\n fragmentShader: Qn.fragmentShader,\n blending: ze\n }), this.ssaoMaterial.defines.KERNEL_SIZE = s, this.ssaoMaterial.uniforms.tNormal.value = this.normalRenderTarget.texture, this.ssaoMaterial.uniforms.tDepth.value = this.normalRenderTarget.depthTexture, this.ssaoMaterial.uniforms.tNoise.value = this.noiseTexture, this.ssaoMaterial.uniforms.kernel.value = this.kernel, this.ssaoMaterial.uniforms.cameraNear.value = this.camera.near, this.ssaoMaterial.uniforms.cameraFar.value = this.camera.far, this.ssaoMaterial.uniforms.resolution.value.set(this.width, this.height), this.ssaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix), this.ssaoMaterial.uniforms.cameraInverseProjectionMatrix.value.copy(this.camera.projectionMatrixInverse), this.normalMaterial = new Ho(), this.normalMaterial.blending = ze, this.blurMaterial = new tt({\n defines: Object.assign({}, ti.defines),\n uniforms: nt.clone(ti.uniforms),\n vertexShader: ti.vertexShader,\n fragmentShader: ti.fragmentShader\n }), this.blurMaterial.uniforms.tDiffuse.value = this.ssaoRenderTarget.texture, this.blurMaterial.uniforms.resolution.value.set(this.width, this.height), this.depthRenderMaterial = new tt({\n defines: Object.assign({}, ei.defines),\n uniforms: nt.clone(ei.uniforms),\n vertexShader: ei.vertexShader,\n fragmentShader: ei.fragmentShader,\n blending: ze\n }), this.depthRenderMaterial.uniforms.tDepth.value = this.normalRenderTarget.depthTexture, this.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near, this.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far, this.copyMaterial = new tt({\n uniforms: nt.clone(Kt.uniforms),\n vertexShader: Kt.vertexShader,\n fragmentShader: Kt.fragmentShader,\n transparent: !0,\n depthTest: !1,\n depthWrite: !1,\n blendSrc: Ns,\n blendDst: pn,\n blendEquation: fn,\n blendSrcAlpha: Bs,\n blendDstAlpha: pn,\n blendEquationAlpha: fn\n }), this._fsQuad = new Yi(null), this._originalClearColor = new st();\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.normalRenderTarget.dispose(), this.ssaoRenderTarget.dispose(), this.blurRenderTarget.dispose(), this.normalMaterial.dispose(), this.blurMaterial.dispose(), this.copyMaterial.dispose(), this.depthRenderMaterial.dispose(), this._fsQuad.dispose();\n }\n /**\n * Performs the SSAO pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n switch (this._overrideVisibility(), this._renderOverride(e, this.normalMaterial, this.normalRenderTarget, 7829503, 1), this._restoreVisibility(), this.ssaoMaterial.uniforms.kernelRadius.value = this.kernelRadius, this.ssaoMaterial.uniforms.minDistance.value = this.minDistance, this.ssaoMaterial.uniforms.maxDistance.value = this.maxDistance, this._renderPass(e, this.ssaoMaterial, this.ssaoRenderTarget), this._renderPass(e, this.blurMaterial, this.blurRenderTarget), this.output) {\n case xt.OUTPUT.SSAO:\n this.copyMaterial.uniforms.tDiffuse.value = this.ssaoRenderTarget.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : n);\n break;\n case xt.OUTPUT.Blur:\n this.copyMaterial.uniforms.tDiffuse.value = this.blurRenderTarget.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : n);\n break;\n case xt.OUTPUT.Depth:\n this._renderPass(e, this.depthRenderMaterial, this.renderToScreen ? null : n);\n break;\n case xt.OUTPUT.Normal:\n this.copyMaterial.uniforms.tDiffuse.value = this.normalRenderTarget.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : n);\n break;\n case xt.OUTPUT.Default:\n this.copyMaterial.uniforms.tDiffuse.value = this.blurRenderTarget.texture, this.copyMaterial.blending = jo, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : n);\n break;\n default:\n console.warn(\"THREE.SSAOPass: Unknown output type.\");\n }\n }\n /**\n * Sets the size of the pass.\n *\n * @param {number} width - The width to set.\n * @param {number} height - The height to set.\n */\n setSize(e, t) {\n this.width = e, this.height = t, this.ssaoRenderTarget.setSize(e, t), this.normalRenderTarget.setSize(e, t), this.blurRenderTarget.setSize(e, t), this.ssaoMaterial.uniforms.resolution.value.set(e, t), this.ssaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix), this.ssaoMaterial.uniforms.cameraInverseProjectionMatrix.value.copy(this.camera.projectionMatrixInverse), this.blurMaterial.uniforms.resolution.value.set(e, t);\n }\n // internals\n _renderPass(e, t, n, i, s) {\n e.getClearColor(this._originalClearColor);\n const r = e.getClearAlpha(), a = e.autoClear;\n e.setRenderTarget(n), e.autoClear = !1, i != null && (e.setClearColor(i), e.setClearAlpha(s || 0), e.clear()), this._fsQuad.material = t, this._fsQuad.render(e), e.autoClear = a, e.setClearColor(this._originalClearColor), e.setClearAlpha(r);\n }\n _renderOverride(e, t, n, i, s) {\n e.getClearColor(this._originalClearColor);\n const r = e.getClearAlpha(), a = e.autoClear;\n e.setRenderTarget(n), e.autoClear = !1, i = t.clearColor || i, s = t.clearAlpha || s, i != null && (e.setClearColor(i), e.setClearAlpha(s || 0), e.clear()), this.scene.overrideMaterial = t, e.render(this.scene, this.camera), this.scene.overrideMaterial = null, e.autoClear = a, e.setClearColor(this._originalClearColor), e.setClearAlpha(r);\n }\n _generateSampleKernel(e) {\n const t = this.kernel;\n for (let n = 0; n < e; n++) {\n const i = new K();\n i.x = Math.random() * 2 - 1, i.y = Math.random() * 2 - 1, i.z = Math.random(), i.normalize();\n let s = n / e;\n s = or.lerp(0.1, 1, s * s), i.multiplyScalar(s), t.push(i);\n }\n }\n _generateRandomKernelRotations() {\n const n = new sa(), i = 16, s = new Float32Array(i);\n for (let r = 0; r < i; r++) {\n const a = Math.random() * 2 - 1, l = Math.random() * 2 - 1, h = 0;\n s[r] = n.noise3d(a, l, h);\n }\n this.noiseTexture = new lr(s, 4, 4, Qa, Ci), this.noiseTexture.wrapS = vt, this.noiseTexture.wrapT = vt, this.noiseTexture.needsUpdate = !0;\n }\n _overrideVisibility() {\n const e = this.scene, t = this._visibilityCache;\n e.traverse(function(n) {\n (n.isPoints || n.isLine || n.isLine2) && n.visible && (n.visible = !1, t.push(n));\n });\n }\n _restoreVisibility() {\n const e = this._visibilityCache;\n for (let t = 0; t < e.length; t++)\n e[t].visible = !0;\n e.length = 0;\n }\n}\nxt.OUTPUT = {\n Default: 0,\n SSAO: 1,\n Blur: 2,\n Depth: 3,\n Normal: 4\n};\nconst ni = {\n name: \"OutputShader\",\n uniforms: {\n tDiffuse: { value: null },\n toneMappingExposure: { value: 1 }\n },\n vertexShader: (\n /* glsl */\n `\n\t\tprecision highp float;\n\n\t\tuniform mat4 modelViewMatrix;\n\t\tuniform mat4 projectionMatrix;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\n\t\tprecision highp float;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\t#include \n\t\t#include \n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t// tone mapping\n\n\t\t\t#ifdef LINEAR_TONE_MAPPING\n\n\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( AGX_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\n\t\t\t#endif\n\n\t\t\t// color space\n\n\t\t\t#ifdef SRGB_TRANSFER\n\n\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\n\t\t\t#endif\n\n\t\t}`\n )\n};\nclass pc extends tn {\n /**\n * Constructs a new output pass.\n */\n constructor() {\n super(), this.uniforms = nt.clone(ni.uniforms), this.material = new el({\n name: ni.name,\n uniforms: this.uniforms,\n vertexShader: ni.vertexShader,\n fragmentShader: ni.fragmentShader\n }), this._fsQuad = new Yi(this.material), this._outputColorSpace = null, this._toneMapping = null;\n }\n /**\n * Performs the output pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n this.uniforms.tDiffuse.value = n.texture, this.uniforms.toneMappingExposure.value = e.toneMappingExposure, (this._outputColorSpace !== e.outputColorSpace || this._toneMapping !== e.toneMapping) && (this._outputColorSpace = e.outputColorSpace, this._toneMapping = e.toneMapping, this.material.defines = {}, Fi.getTransfer(this._outputColorSpace) === tl && (this.material.defines.SRGB_TRANSFER = \"\"), this._toneMapping === nl ? this.material.defines.LINEAR_TONE_MAPPING = \"\" : this._toneMapping === il ? this.material.defines.REINHARD_TONE_MAPPING = \"\" : this._toneMapping === sl ? this.material.defines.CINEON_TONE_MAPPING = \"\" : this._toneMapping === rl ? this.material.defines.ACES_FILMIC_TONE_MAPPING = \"\" : this._toneMapping === ol ? this.material.defines.AGX_TONE_MAPPING = \"\" : this._toneMapping === al ? this.material.defines.NEUTRAL_TONE_MAPPING = \"\" : this._toneMapping === ll && (this.material.defines.CUSTOM_TONE_MAPPING = \"\"), this.material.needsUpdate = !0), this.renderToScreen === !0 ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(t), this.clear && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), this._fsQuad.render(e));\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.material.dispose(), this._fsQuad.dispose();\n }\n}\nconst mc = {\n name: \"FXAAShader\",\n uniforms: {\n tDiffuse: { value: null },\n resolution: { value: new ue(1 / 1024, 1 / 512) }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec2 resolution;\n\t\tvarying vec2 vUv;\n\n\t\t#define EDGE_STEP_COUNT 6\n\t\t#define EDGE_GUESS 8.0\n\t\t#define EDGE_STEPS 1.0, 1.5, 2.0, 2.0, 2.0, 4.0\n\t\tconst float edgeSteps[EDGE_STEP_COUNT] = float[EDGE_STEP_COUNT]( EDGE_STEPS );\n\n\t\tfloat _ContrastThreshold = 0.0312;\n\t\tfloat _RelativeThreshold = 0.063;\n\t\tfloat _SubpixelBlending = 1.0;\n\n\t\tvec4 Sample( sampler2D tex2D, vec2 uv ) {\n\n\t\t\treturn texture( tex2D, uv );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 uv ) {\n\n\t\t\treturn dot( Sample( tex2D, uv ).rgb, vec3( 0.3, 0.59, 0.11 ) );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 texSize, vec2 uv, float uOffset, float vOffset ) {\n\n\t\t\tuv += texSize * vec2(uOffset, vOffset);\n\t\t\treturn SampleLuminance(tex2D, uv);\n\n\t\t}\n\n\t\tstruct LuminanceData {\n\n\t\t\tfloat m, n, e, s, w;\n\t\t\tfloat ne, nw, se, sw;\n\t\t\tfloat highest, lowest, contrast;\n\n\t\t};\n\n\t\tLuminanceData SampleLuminanceNeighborhood( sampler2D tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData l;\n\t\t\tl.m = SampleLuminance( tex2D, uv );\n\t\t\tl.n = SampleLuminance( tex2D, texSize, uv, 0.0, 1.0 );\n\t\t\tl.e = SampleLuminance( tex2D, texSize, uv, 1.0, 0.0 );\n\t\t\tl.s = SampleLuminance( tex2D, texSize, uv, 0.0, -1.0 );\n\t\t\tl.w = SampleLuminance( tex2D, texSize, uv, -1.0, 0.0 );\n\n\t\t\tl.ne = SampleLuminance( tex2D, texSize, uv, 1.0, 1.0 );\n\t\t\tl.nw = SampleLuminance( tex2D, texSize, uv, -1.0, 1.0 );\n\t\t\tl.se = SampleLuminance( tex2D, texSize, uv, 1.0, -1.0 );\n\t\t\tl.sw = SampleLuminance( tex2D, texSize, uv, -1.0, -1.0 );\n\n\t\t\tl.highest = max( max( max( max( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.lowest = min( min( min( min( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.contrast = l.highest - l.lowest;\n\t\t\treturn l;\n\n\t\t}\n\n\t\tbool ShouldSkipPixel( LuminanceData l ) {\n\n\t\t\tfloat threshold = max( _ContrastThreshold, _RelativeThreshold * l.highest );\n\t\t\treturn l.contrast < threshold;\n\n\t\t}\n\n\t\tfloat DeterminePixelBlendFactor( LuminanceData l ) {\n\n\t\t\tfloat f = 2.0 * ( l.n + l.e + l.s + l.w );\n\t\t\tf += l.ne + l.nw + l.se + l.sw;\n\t\t\tf *= 1.0 / 12.0;\n\t\t\tf = abs( f - l.m );\n\t\t\tf = clamp( f / l.contrast, 0.0, 1.0 );\n\n\t\t\tfloat blendFactor = smoothstep( 0.0, 1.0, f );\n\t\t\treturn blendFactor * blendFactor * _SubpixelBlending;\n\n\t\t}\n\n\t\tstruct EdgeData {\n\n\t\t\tbool isHorizontal;\n\t\t\tfloat pixelStep;\n\t\t\tfloat oppositeLuminance, gradient;\n\n\t\t};\n\n\t\tEdgeData DetermineEdge( vec2 texSize, LuminanceData l ) {\n\n\t\t\tEdgeData e;\n\t\t\tfloat horizontal =\n\t\t\t\tabs( l.n + l.s - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.se - 2.0 * l.e ) +\n\t\t\t\tabs( l.nw + l.sw - 2.0 * l.w );\n\t\t\tfloat vertical =\n\t\t\t\tabs( l.e + l.w - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.nw - 2.0 * l.n ) +\n\t\t\t\tabs( l.se + l.sw - 2.0 * l.s );\n\t\t\te.isHorizontal = horizontal >= vertical;\n\n\t\t\tfloat pLuminance = e.isHorizontal ? l.n : l.e;\n\t\t\tfloat nLuminance = e.isHorizontal ? l.s : l.w;\n\t\t\tfloat pGradient = abs( pLuminance - l.m );\n\t\t\tfloat nGradient = abs( nLuminance - l.m );\n\n\t\t\te.pixelStep = e.isHorizontal ? texSize.y : texSize.x;\n\n\t\t\tif (pGradient < nGradient) {\n\n\t\t\t\te.pixelStep = -e.pixelStep;\n\t\t\t\te.oppositeLuminance = nLuminance;\n\t\t\t\te.gradient = nGradient;\n\n\t\t\t} else {\n\n\t\t\t\te.oppositeLuminance = pLuminance;\n\t\t\t\te.gradient = pGradient;\n\n\t\t\t}\n\n\t\t\treturn e;\n\n\t\t}\n\n\t\tfloat DetermineEdgeBlendFactor( sampler2D tex2D, vec2 texSize, LuminanceData l, EdgeData e, vec2 uv ) {\n\n\t\t\tvec2 uvEdge = uv;\n\t\t\tvec2 edgeStep;\n\t\t\tif (e.isHorizontal) {\n\n\t\t\t\tuvEdge.y += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( texSize.x, 0.0 );\n\n\t\t\t} else {\n\n\t\t\t\tuvEdge.x += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( 0.0, texSize.y );\n\n\t\t\t}\n\n\t\t\tfloat edgeLuminance = ( l.m + e.oppositeLuminance ) * 0.5;\n\t\t\tfloat gradientThreshold = e.gradient * 0.25;\n\n\t\t\tvec2 puv = uvEdge + edgeStep * edgeSteps[0];\n\t\t\tfloat pLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\tbool pAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !pAtEnd; i++ ) {\n\n\t\t\t\tpuv += edgeStep * edgeSteps[i];\n\t\t\t\tpLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\t\tpAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !pAtEnd ) {\n\n\t\t\t\tpuv += edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tvec2 nuv = uvEdge - edgeStep * edgeSteps[0];\n\t\t\tfloat nLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\tbool nAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !nAtEnd; i++ ) {\n\n\t\t\t\tnuv -= edgeStep * edgeSteps[i];\n\t\t\t\tnLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\t\tnAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !nAtEnd ) {\n\n\t\t\t\tnuv -= edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tfloat pDistance, nDistance;\n\t\t\tif ( e.isHorizontal ) {\n\n\t\t\t\tpDistance = puv.x - uv.x;\n\t\t\t\tnDistance = uv.x - nuv.x;\n\n\t\t\t} else {\n\n\t\t\t\tpDistance = puv.y - uv.y;\n\t\t\t\tnDistance = uv.y - nuv.y;\n\n\t\t\t}\n\n\t\t\tfloat shortestDistance;\n\t\t\tbool deltaSign;\n\t\t\tif ( pDistance <= nDistance ) {\n\n\t\t\t\tshortestDistance = pDistance;\n\t\t\t\tdeltaSign = pLuminanceDelta >= 0.0;\n\n\t\t\t} else {\n\n\t\t\t\tshortestDistance = nDistance;\n\t\t\t\tdeltaSign = nLuminanceDelta >= 0.0;\n\n\t\t\t}\n\n\t\t\tif ( deltaSign == ( l.m - edgeLuminance >= 0.0 ) ) {\n\n\t\t\t\treturn 0.0;\n\n\t\t\t}\n\n\t\t\treturn 0.5 - shortestDistance / ( pDistance + nDistance );\n\n\t\t}\n\n\t\tvec4 ApplyFXAA( sampler2D tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData luminance = SampleLuminanceNeighborhood( tex2D, texSize, uv );\n\t\t\tif ( ShouldSkipPixel( luminance ) ) {\n\n\t\t\t\treturn Sample( tex2D, uv );\n\n\t\t\t}\n\n\t\t\tfloat pixelBlend = DeterminePixelBlendFactor( luminance );\n\t\t\tEdgeData edge = DetermineEdge( texSize, luminance );\n\t\t\tfloat edgeBlend = DetermineEdgeBlendFactor( tex2D, texSize, luminance, edge, uv );\n\t\t\tfloat finalBlend = max( pixelBlend, edgeBlend );\n\n\t\t\tif (edge.isHorizontal) {\n\n\t\t\t\tuv.y += edge.pixelStep * finalBlend;\n\n\t\t\t} else {\n\n\t\t\t\tuv.x += edge.pixelStep * finalBlend;\n\n\t\t\t}\n\n\t\t\treturn Sample( tex2D, uv );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = ApplyFXAA( tDiffuse, resolution.xy, vUv );\n\n\t\t}`\n )\n}, gc = {\n uniforms: {\n tDiffuse: { value: null },\n saturation: { value: 1.2 },\n // 饱和度值,1.0为原始,大于1.0增加饱和度\n contrast: { value: 1.2 }\n // 对比度值,1.0为原始,大于1.0增加对比度\n },\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform sampler2D tDiffuse;\n uniform float saturation;\n uniform float contrast;\n varying vec2 vUv;\n \n void main() {\n vec4 color = texture2D(tDiffuse, vUv);\n \n // 转换为灰度值用于饱和度调整\n float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));\n \n // 混合原始颜色和灰度值来调整饱和度\n color.rgb = mix(vec3(gray), color.rgb, saturation);\n \n // 调整对比度\n color.rgb = (color.rgb - 0.5) * contrast + 0.5;\n \n gl_FragColor = color;\n }\n `\n};\nclass yc {\n engine;\n composer;\n saturationPass;\n ssaoPass;\n gtaoPass;\n outputPass;\n fxaaPass;\n constructor(e) {\n this.engine = e;\n }\n resize(e, t) {\n if (e === void 0 || t === void 0) {\n const s = this.engine.deviceModule.getContainerSize();\n e = e ?? s.width, t = t ?? s.height;\n }\n if (!e || !t || !this.composer)\n return;\n const n = this.engine.renderer?.getPixelRatio?.() ?? window.devicePixelRatio ?? 1;\n this.composer.setPixelRatio(n), this.composer.setSize(e, t);\n const i = this.composer.passes.find((s) => s instanceof Pi && s.material.uniforms.resolution);\n i && (i.material.uniforms.resolution.value.x = 1 / (e * n), i.material.uniforms.resolution.value.y = 1 / (t * n));\n }\n init() {\n const { width: e, height: t } = this.engine.deviceModule.getContainerSize(), n = this.engine.scene, i = this.engine.camera, s = this.engine.renderer, r = this.engine.renderer?.getPixelRatio?.() ?? window.devicePixelRatio ?? 1, a = new M.WebGLRenderTarget(e, t, {\n minFilter: M.LinearFilter,\n magFilter: M.LinearFilter,\n format: M.RGBAFormat,\n samples: 4\n // 启用多重采样抗锯齿\n });\n this.composer = new cc(s, a), this.composer.setPixelRatio(r), this.composer.setSize(e, t);\n const l = new hc(n, i);\n this.composer.addPass(l), this.gtaoPass = new Fe(n, i, e, t), this.gtaoPass.output = Fe.OUTPUT.Default, this.gtaoPass.blendIntensity = 0.3, this.gtaoPass.enabled = !1, this.gtaoPass.updateGtaoMaterial && this.gtaoPass.updateGtaoMaterial({\n radius: 1,\n distanceExponent: 1,\n thickness: 1,\n scale: 1,\n distanceFallOff: 1,\n screenSpaceRadius: !0\n }), this.composer.addPass(this.gtaoPass), this.ssaoPass = new xt(n, i, e, t), this.ssaoPass.kernelRadius = 8, this.ssaoPass.minDistance = 5e-3, this.ssaoPass.maxDistance = 0.1, this.ssaoPass.output = xt.OUTPUT.Default, this.ssaoPass.enabled = !1, this.composer.addPass(this.ssaoPass), this.saturationPass = new Pi(gc), this.saturationPass.uniforms.saturation.value = 1.3, this.saturationPass.uniforms.contrast.value = 1.1, this.saturationPass.enabled = !1, this.composer.addPass(this.saturationPass), this.outputPass = new pc(), this.outputPass.enabled = !1, this.composer.addPass(this.outputPass), this.fxaaPass = new Pi(mc), this.fxaaPass.material.uniforms.resolution.value.x = 1 / (e * r), this.fxaaPass.material.uniforms.resolution.value.y = 1 / (t * r), this.fxaaPass.enabled = !1, this.composer.addPass(this.fxaaPass);\n }\n}\nvar ii = typeof globalThis < \"u\" ? globalThis : typeof window < \"u\" ? window : typeof global < \"u\" ? global : typeof self < \"u\" ? self : {};\nfunction ra(o) {\n return o && o.__esModule && Object.prototype.hasOwnProperty.call(o, \"default\") ? o.default : o;\n}\nfunction si(o) {\n throw new Error('Could not dynamically require \"' + o + '\". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');\n}\nvar os = { exports: {} };\nvar Dr;\nfunction wc() {\n return Dr || (Dr = 1, (function(o, e) {\n (function(t) {\n o.exports = t();\n })(function() {\n return (function t(n, i, s) {\n function r(h, c) {\n if (!i[h]) {\n if (!n[h]) {\n var u = typeof si == \"function\" && si;\n if (!c && u) return u(h, !0);\n if (a) return a(h, !0);\n var m = new Error(\"Cannot find module '\" + h + \"'\");\n throw m.code = \"MODULE_NOT_FOUND\", m;\n }\n var f = i[h] = { exports: {} };\n n[h][0].call(f.exports, function(d) {\n var p = n[h][1][d];\n return r(p || d);\n }, f, f.exports, t, n, i, s);\n }\n return i[h].exports;\n }\n for (var a = typeof si == \"function\" && si, l = 0; l < s.length; l++) r(s[l]);\n return r;\n })({ 1: [function(t, n, i) {\n var s = t(\"./utils\"), r = t(\"./support\"), a = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n i.encode = function(l) {\n for (var h, c, u, m, f, d, p, g = [], y = 0, w = l.length, x = w, _ = s.getTypeOf(l) !== \"string\"; y < l.length; ) x = w - y, u = _ ? (h = l[y++], c = y < w ? l[y++] : 0, y < w ? l[y++] : 0) : (h = l.charCodeAt(y++), c = y < w ? l.charCodeAt(y++) : 0, y < w ? l.charCodeAt(y++) : 0), m = h >> 2, f = (3 & h) << 4 | c >> 4, d = 1 < x ? (15 & c) << 2 | u >> 6 : 64, p = 2 < x ? 63 & u : 64, g.push(a.charAt(m) + a.charAt(f) + a.charAt(d) + a.charAt(p));\n return g.join(\"\");\n }, i.decode = function(l) {\n var h, c, u, m, f, d, p = 0, g = 0, y = \"data:\";\n if (l.substr(0, y.length) === y) throw new Error(\"Invalid base64 input, it looks like a data url.\");\n var w, x = 3 * (l = l.replace(/[^A-Za-z0-9+/=]/g, \"\")).length / 4;\n if (l.charAt(l.length - 1) === a.charAt(64) && x--, l.charAt(l.length - 2) === a.charAt(64) && x--, x % 1 != 0) throw new Error(\"Invalid base64 input, bad content length.\");\n for (w = r.uint8array ? new Uint8Array(0 | x) : new Array(0 | x); p < l.length; ) h = a.indexOf(l.charAt(p++)) << 2 | (m = a.indexOf(l.charAt(p++))) >> 4, c = (15 & m) << 4 | (f = a.indexOf(l.charAt(p++))) >> 2, u = (3 & f) << 6 | (d = a.indexOf(l.charAt(p++))), w[g++] = h, f !== 64 && (w[g++] = c), d !== 64 && (w[g++] = u);\n return w;\n };\n }, { \"./support\": 30, \"./utils\": 32 }], 2: [function(t, n, i) {\n var s = t(\"./external\"), r = t(\"./stream/DataWorker\"), a = t(\"./stream/Crc32Probe\"), l = t(\"./stream/DataLengthProbe\");\n function h(c, u, m, f, d) {\n this.compressedSize = c, this.uncompressedSize = u, this.crc32 = m, this.compression = f, this.compressedContent = d;\n }\n h.prototype = { getContentWorker: function() {\n var c = new r(s.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new l(\"data_length\")), u = this;\n return c.on(\"end\", function() {\n if (this.streamInfo.data_length !== u.uncompressedSize) throw new Error(\"Bug : uncompressed data size mismatch\");\n }), c;\n }, getCompressedWorker: function() {\n return new r(s.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\", this.compressedSize).withStreamInfo(\"uncompressedSize\", this.uncompressedSize).withStreamInfo(\"crc32\", this.crc32).withStreamInfo(\"compression\", this.compression);\n } }, h.createWorkerFrom = function(c, u, m) {\n return c.pipe(new a()).pipe(new l(\"uncompressedSize\")).pipe(u.compressWorker(m)).pipe(new l(\"compressedSize\")).withStreamInfo(\"compression\", u);\n }, n.exports = h;\n }, { \"./external\": 6, \"./stream/Crc32Probe\": 25, \"./stream/DataLengthProbe\": 26, \"./stream/DataWorker\": 27 }], 3: [function(t, n, i) {\n var s = t(\"./stream/GenericWorker\");\n i.STORE = { magic: \"\\0\\0\", compressWorker: function() {\n return new s(\"STORE compression\");\n }, uncompressWorker: function() {\n return new s(\"STORE decompression\");\n } }, i.DEFLATE = t(\"./flate\");\n }, { \"./flate\": 7, \"./stream/GenericWorker\": 28 }], 4: [function(t, n, i) {\n var s = t(\"./utils\"), r = (function() {\n for (var a, l = [], h = 0; h < 256; h++) {\n a = h;\n for (var c = 0; c < 8; c++) a = 1 & a ? 3988292384 ^ a >>> 1 : a >>> 1;\n l[h] = a;\n }\n return l;\n })();\n n.exports = function(a, l) {\n return a !== void 0 && a.length ? s.getTypeOf(a) !== \"string\" ? (function(h, c, u, m) {\n var f = r, d = m + u;\n h ^= -1;\n for (var p = m; p < d; p++) h = h >>> 8 ^ f[255 & (h ^ c[p])];\n return -1 ^ h;\n })(0 | l, a, a.length, 0) : (function(h, c, u, m) {\n var f = r, d = m + u;\n h ^= -1;\n for (var p = m; p < d; p++) h = h >>> 8 ^ f[255 & (h ^ c.charCodeAt(p))];\n return -1 ^ h;\n })(0 | l, a, a.length, 0) : 0;\n };\n }, { \"./utils\": 32 }], 5: [function(t, n, i) {\n i.base64 = !1, i.binary = !1, i.dir = !1, i.createFolders = !0, i.date = null, i.compression = null, i.compressionOptions = null, i.comment = null, i.unixPermissions = null, i.dosPermissions = null;\n }, {}], 6: [function(t, n, i) {\n var s = null;\n s = typeof Promise < \"u\" ? Promise : t(\"lie\"), n.exports = { Promise: s };\n }, { lie: 37 }], 7: [function(t, n, i) {\n var s = typeof Uint8Array < \"u\" && typeof Uint16Array < \"u\" && typeof Uint32Array < \"u\", r = t(\"pako\"), a = t(\"./utils\"), l = t(\"./stream/GenericWorker\"), h = s ? \"uint8array\" : \"array\";\n function c(u, m) {\n l.call(this, \"FlateWorker/\" + u), this._pako = null, this._pakoAction = u, this._pakoOptions = m, this.meta = {};\n }\n i.magic = \"\\b\\0\", a.inherits(c, l), c.prototype.processChunk = function(u) {\n this.meta = u.meta, this._pako === null && this._createPako(), this._pako.push(a.transformTo(h, u.data), !1);\n }, c.prototype.flush = function() {\n l.prototype.flush.call(this), this._pako === null && this._createPako(), this._pako.push([], !0);\n }, c.prototype.cleanUp = function() {\n l.prototype.cleanUp.call(this), this._pako = null;\n }, c.prototype._createPako = function() {\n this._pako = new r[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });\n var u = this;\n this._pako.onData = function(m) {\n u.push({ data: m, meta: u.meta });\n };\n }, i.compressWorker = function(u) {\n return new c(\"Deflate\", u);\n }, i.uncompressWorker = function() {\n return new c(\"Inflate\", {});\n };\n }, { \"./stream/GenericWorker\": 28, \"./utils\": 32, pako: 38 }], 8: [function(t, n, i) {\n function s(f, d) {\n var p, g = \"\";\n for (p = 0; p < d; p++) g += String.fromCharCode(255 & f), f >>>= 8;\n return g;\n }\n function r(f, d, p, g, y, w) {\n var x, _, b = f.file, E = f.compression, A = w !== h.utf8encode, P = a.transformTo(\"string\", w(b.name)), C = a.transformTo(\"string\", h.utf8encode(b.name)), D = b.comment, I = a.transformTo(\"string\", w(D)), T = a.transformTo(\"string\", h.utf8encode(D)), R = C.length !== b.name.length, v = T.length !== D.length, z = \"\", H = \"\", V = \"\", te = b.dir, G = b.date, $ = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };\n d && !p || ($.crc32 = f.crc32, $.compressedSize = f.compressedSize, $.uncompressedSize = f.uncompressedSize);\n var N = 0;\n d && (N |= 8), A || !R && !v || (N |= 2048);\n var O = 0, Q = 0;\n te && (O |= 16), y === \"UNIX\" ? (Q = 798, O |= (function(q, de) {\n var pe = q;\n return q || (pe = de ? 16893 : 33204), (65535 & pe) << 16;\n })(b.unixPermissions, te)) : (Q = 20, O |= (function(q) {\n return 63 & (q || 0);\n })(b.dosPermissions)), x = G.getUTCHours(), x <<= 6, x |= G.getUTCMinutes(), x <<= 5, x |= G.getUTCSeconds() / 2, _ = G.getUTCFullYear() - 1980, _ <<= 4, _ |= G.getUTCMonth() + 1, _ <<= 5, _ |= G.getUTCDate(), R && (H = s(1, 1) + s(c(P), 4) + C, z += \"up\" + s(H.length, 2) + H), v && (V = s(1, 1) + s(c(I), 4) + T, z += \"uc\" + s(V.length, 2) + V);\n var ee = \"\";\n return ee += `\n\\0`, ee += s(N, 2), ee += E.magic, ee += s(x, 2), ee += s(_, 2), ee += s($.crc32, 4), ee += s($.compressedSize, 4), ee += s($.uncompressedSize, 4), ee += s(P.length, 2), ee += s(z.length, 2), { fileRecord: u.LOCAL_FILE_HEADER + ee + P + z, dirRecord: u.CENTRAL_FILE_HEADER + s(Q, 2) + ee + s(I.length, 2) + \"\\0\\0\\0\\0\" + s(O, 4) + s(g, 4) + P + z + I };\n }\n var a = t(\"../utils\"), l = t(\"../stream/GenericWorker\"), h = t(\"../utf8\"), c = t(\"../crc32\"), u = t(\"../signature\");\n function m(f, d, p, g) {\n l.call(this, \"ZipFileWorker\"), this.bytesWritten = 0, this.zipComment = d, this.zipPlatform = p, this.encodeFileName = g, this.streamFiles = f, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];\n }\n a.inherits(m, l), m.prototype.push = function(f) {\n var d = f.meta.percent || 0, p = this.entriesCount, g = this._sources.length;\n this.accumulate ? this.contentBuffer.push(f) : (this.bytesWritten += f.data.length, l.prototype.push.call(this, { data: f.data, meta: { currentFile: this.currentFile, percent: p ? (d + 100 * (p - g - 1)) / p : 100 } }));\n }, m.prototype.openedSource = function(f) {\n this.currentSourceOffset = this.bytesWritten, this.currentFile = f.file.name;\n var d = this.streamFiles && !f.file.dir;\n if (d) {\n var p = r(f, d, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);\n this.push({ data: p.fileRecord, meta: { percent: 0 } });\n } else this.accumulate = !0;\n }, m.prototype.closedSource = function(f) {\n this.accumulate = !1;\n var d = this.streamFiles && !f.file.dir, p = r(f, d, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);\n if (this.dirRecords.push(p.dirRecord), d) this.push({ data: (function(g) {\n return u.DATA_DESCRIPTOR + s(g.crc32, 4) + s(g.compressedSize, 4) + s(g.uncompressedSize, 4);\n })(f), meta: { percent: 100 } });\n else for (this.push({ data: p.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length; ) this.push(this.contentBuffer.shift());\n this.currentFile = null;\n }, m.prototype.flush = function() {\n for (var f = this.bytesWritten, d = 0; d < this.dirRecords.length; d++) this.push({ data: this.dirRecords[d], meta: { percent: 100 } });\n var p = this.bytesWritten - f, g = (function(y, w, x, _, b) {\n var E = a.transformTo(\"string\", b(_));\n return u.CENTRAL_DIRECTORY_END + \"\\0\\0\\0\\0\" + s(y, 2) + s(y, 2) + s(w, 4) + s(x, 4) + s(E.length, 2) + E;\n })(this.dirRecords.length, p, f, this.zipComment, this.encodeFileName);\n this.push({ data: g, meta: { percent: 100 } });\n }, m.prototype.prepareNextSource = function() {\n this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();\n }, m.prototype.registerPrevious = function(f) {\n this._sources.push(f);\n var d = this;\n return f.on(\"data\", function(p) {\n d.processChunk(p);\n }), f.on(\"end\", function() {\n d.closedSource(d.previous.streamInfo), d._sources.length ? d.prepareNextSource() : d.end();\n }), f.on(\"error\", function(p) {\n d.error(p);\n }), this;\n }, m.prototype.resume = function() {\n return !!l.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));\n }, m.prototype.error = function(f) {\n var d = this._sources;\n if (!l.prototype.error.call(this, f)) return !1;\n for (var p = 0; p < d.length; p++) try {\n d[p].error(f);\n } catch {\n }\n return !0;\n }, m.prototype.lock = function() {\n l.prototype.lock.call(this);\n for (var f = this._sources, d = 0; d < f.length; d++) f[d].lock();\n }, n.exports = m;\n }, { \"../crc32\": 4, \"../signature\": 23, \"../stream/GenericWorker\": 28, \"../utf8\": 31, \"../utils\": 32 }], 9: [function(t, n, i) {\n var s = t(\"../compressions\"), r = t(\"./ZipFileWorker\");\n i.generateWorker = function(a, l, h) {\n var c = new r(l.streamFiles, h, l.platform, l.encodeFileName), u = 0;\n try {\n a.forEach(function(m, f) {\n u++;\n var d = (function(w, x) {\n var _ = w || x, b = s[_];\n if (!b) throw new Error(_ + \" is not a valid compression method !\");\n return b;\n })(f.options.compression, l.compression), p = f.options.compressionOptions || l.compressionOptions || {}, g = f.dir, y = f.date;\n f._compressWorker(d, p).withStreamInfo(\"file\", { name: m, dir: g, date: y, comment: f.comment || \"\", unixPermissions: f.unixPermissions, dosPermissions: f.dosPermissions }).pipe(c);\n }), c.entriesCount = u;\n } catch (m) {\n c.error(m);\n }\n return c;\n };\n }, { \"../compressions\": 3, \"./ZipFileWorker\": 8 }], 10: [function(t, n, i) {\n function s() {\n if (!(this instanceof s)) return new s();\n if (arguments.length) throw new Error(\"The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.\");\n this.files = /* @__PURE__ */ Object.create(null), this.comment = null, this.root = \"\", this.clone = function() {\n var r = new s();\n for (var a in this) typeof this[a] != \"function\" && (r[a] = this[a]);\n return r;\n };\n }\n (s.prototype = t(\"./object\")).loadAsync = t(\"./load\"), s.support = t(\"./support\"), s.defaults = t(\"./defaults\"), s.version = \"3.10.1\", s.loadAsync = function(r, a) {\n return new s().loadAsync(r, a);\n }, s.external = t(\"./external\"), n.exports = s;\n }, { \"./defaults\": 5, \"./external\": 6, \"./load\": 11, \"./object\": 15, \"./support\": 30 }], 11: [function(t, n, i) {\n var s = t(\"./utils\"), r = t(\"./external\"), a = t(\"./utf8\"), l = t(\"./zipEntries\"), h = t(\"./stream/Crc32Probe\"), c = t(\"./nodejsUtils\");\n function u(m) {\n return new r.Promise(function(f, d) {\n var p = m.decompressed.getContentWorker().pipe(new h());\n p.on(\"error\", function(g) {\n d(g);\n }).on(\"end\", function() {\n p.streamInfo.crc32 !== m.decompressed.crc32 ? d(new Error(\"Corrupted zip : CRC32 mismatch\")) : f();\n }).resume();\n });\n }\n n.exports = function(m, f) {\n var d = this;\n return f = s.extend(f || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: a.utf8decode }), c.isNode && c.isStream(m) ? r.Promise.reject(new Error(\"JSZip can't accept a stream when loading a zip file.\")) : s.prepareContent(\"the loaded zip file\", m, !0, f.optimizedBinaryString, f.base64).then(function(p) {\n var g = new l(f);\n return g.load(p), g;\n }).then(function(p) {\n var g = [r.Promise.resolve(p)], y = p.files;\n if (f.checkCRC32) for (var w = 0; w < y.length; w++) g.push(u(y[w]));\n return r.Promise.all(g);\n }).then(function(p) {\n for (var g = p.shift(), y = g.files, w = 0; w < y.length; w++) {\n var x = y[w], _ = x.fileNameStr, b = s.resolve(x.fileNameStr);\n d.file(b, x.decompressed, { binary: !0, optimizedBinaryString: !0, date: x.date, dir: x.dir, comment: x.fileCommentStr.length ? x.fileCommentStr : null, unixPermissions: x.unixPermissions, dosPermissions: x.dosPermissions, createFolders: f.createFolders }), x.dir || (d.file(b).unsafeOriginalName = _);\n }\n return g.zipComment.length && (d.comment = g.zipComment), d;\n });\n };\n }, { \"./external\": 6, \"./nodejsUtils\": 14, \"./stream/Crc32Probe\": 25, \"./utf8\": 31, \"./utils\": 32, \"./zipEntries\": 33 }], 12: [function(t, n, i) {\n var s = t(\"../utils\"), r = t(\"../stream/GenericWorker\");\n function a(l, h) {\n r.call(this, \"Nodejs stream input adapter for \" + l), this._upstreamEnded = !1, this._bindStream(h);\n }\n s.inherits(a, r), a.prototype._bindStream = function(l) {\n var h = this;\n (this._stream = l).pause(), l.on(\"data\", function(c) {\n h.push({ data: c, meta: { percent: 0 } });\n }).on(\"error\", function(c) {\n h.isPaused ? this.generatedError = c : h.error(c);\n }).on(\"end\", function() {\n h.isPaused ? h._upstreamEnded = !0 : h.end();\n });\n }, a.prototype.pause = function() {\n return !!r.prototype.pause.call(this) && (this._stream.pause(), !0);\n }, a.prototype.resume = function() {\n return !!r.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);\n }, n.exports = a;\n }, { \"../stream/GenericWorker\": 28, \"../utils\": 32 }], 13: [function(t, n, i) {\n var s = t(\"readable-stream\").Readable;\n function r(a, l, h) {\n s.call(this, l), this._helper = a;\n var c = this;\n a.on(\"data\", function(u, m) {\n c.push(u) || c._helper.pause(), h && h(m);\n }).on(\"error\", function(u) {\n c.emit(\"error\", u);\n }).on(\"end\", function() {\n c.push(null);\n });\n }\n t(\"../utils\").inherits(r, s), r.prototype._read = function() {\n this._helper.resume();\n }, n.exports = r;\n }, { \"../utils\": 32, \"readable-stream\": 16 }], 14: [function(t, n, i) {\n n.exports = { isNode: typeof Buffer < \"u\", newBufferFrom: function(s, r) {\n if (Buffer.from && Buffer.from !== Uint8Array.from) return Buffer.from(s, r);\n if (typeof s == \"number\") throw new Error('The \"data\" argument must not be a number');\n return new Buffer(s, r);\n }, allocBuffer: function(s) {\n if (Buffer.alloc) return Buffer.alloc(s);\n var r = new Buffer(s);\n return r.fill(0), r;\n }, isBuffer: function(s) {\n return Buffer.isBuffer(s);\n }, isStream: function(s) {\n return s && typeof s.on == \"function\" && typeof s.pause == \"function\" && typeof s.resume == \"function\";\n } };\n }, {}], 15: [function(t, n, i) {\n function s(b, E, A) {\n var P, C = a.getTypeOf(E), D = a.extend(A || {}, c);\n D.date = D.date || /* @__PURE__ */ new Date(), D.compression !== null && (D.compression = D.compression.toUpperCase()), typeof D.unixPermissions == \"string\" && (D.unixPermissions = parseInt(D.unixPermissions, 8)), D.unixPermissions && 16384 & D.unixPermissions && (D.dir = !0), D.dosPermissions && 16 & D.dosPermissions && (D.dir = !0), D.dir && (b = y(b)), D.createFolders && (P = g(b)) && w.call(this, P, !0);\n var I = C === \"string\" && D.binary === !1 && D.base64 === !1;\n A && A.binary !== void 0 || (D.binary = !I), (E instanceof u && E.uncompressedSize === 0 || D.dir || !E || E.length === 0) && (D.base64 = !1, D.binary = !0, E = \"\", D.compression = \"STORE\", C = \"string\");\n var T = null;\n T = E instanceof u || E instanceof l ? E : d.isNode && d.isStream(E) ? new p(b, E) : a.prepareContent(b, E, D.binary, D.optimizedBinaryString, D.base64);\n var R = new m(b, T, D);\n this.files[b] = R;\n }\n var r = t(\"./utf8\"), a = t(\"./utils\"), l = t(\"./stream/GenericWorker\"), h = t(\"./stream/StreamHelper\"), c = t(\"./defaults\"), u = t(\"./compressedObject\"), m = t(\"./zipObject\"), f = t(\"./generate\"), d = t(\"./nodejsUtils\"), p = t(\"./nodejs/NodejsStreamInputAdapter\"), g = function(b) {\n b.slice(-1) === \"/\" && (b = b.substring(0, b.length - 1));\n var E = b.lastIndexOf(\"/\");\n return 0 < E ? b.substring(0, E) : \"\";\n }, y = function(b) {\n return b.slice(-1) !== \"/\" && (b += \"/\"), b;\n }, w = function(b, E) {\n return E = E !== void 0 ? E : c.createFolders, b = y(b), this.files[b] || s.call(this, b, null, { dir: !0, createFolders: E }), this.files[b];\n };\n function x(b) {\n return Object.prototype.toString.call(b) === \"[object RegExp]\";\n }\n var _ = { load: function() {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }, forEach: function(b) {\n var E, A, P;\n for (E in this.files) P = this.files[E], (A = E.slice(this.root.length, E.length)) && E.slice(0, this.root.length) === this.root && b(A, P);\n }, filter: function(b) {\n var E = [];\n return this.forEach(function(A, P) {\n b(A, P) && E.push(P);\n }), E;\n }, file: function(b, E, A) {\n if (arguments.length !== 1) return b = this.root + b, s.call(this, b, E, A), this;\n if (x(b)) {\n var P = b;\n return this.filter(function(D, I) {\n return !I.dir && P.test(D);\n });\n }\n var C = this.files[this.root + b];\n return C && !C.dir ? C : null;\n }, folder: function(b) {\n if (!b) return this;\n if (x(b)) return this.filter(function(C, D) {\n return D.dir && b.test(C);\n });\n var E = this.root + b, A = w.call(this, E), P = this.clone();\n return P.root = A.name, P;\n }, remove: function(b) {\n b = this.root + b;\n var E = this.files[b];\n if (E || (b.slice(-1) !== \"/\" && (b += \"/\"), E = this.files[b]), E && !E.dir) delete this.files[b];\n else for (var A = this.filter(function(C, D) {\n return D.name.slice(0, b.length) === b;\n }), P = 0; P < A.length; P++) delete this.files[A[P].name];\n return this;\n }, generate: function() {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }, generateInternalStream: function(b) {\n var E, A = {};\n try {\n if ((A = a.extend(b || {}, { streamFiles: !1, compression: \"STORE\", compressionOptions: null, type: \"\", platform: \"DOS\", comment: null, mimeType: \"application/zip\", encodeFileName: r.utf8encode })).type = A.type.toLowerCase(), A.compression = A.compression.toUpperCase(), A.type === \"binarystring\" && (A.type = \"string\"), !A.type) throw new Error(\"No output type specified.\");\n a.checkSupport(A.type), A.platform !== \"darwin\" && A.platform !== \"freebsd\" && A.platform !== \"linux\" && A.platform !== \"sunos\" || (A.platform = \"UNIX\"), A.platform === \"win32\" && (A.platform = \"DOS\");\n var P = A.comment || this.comment || \"\";\n E = f.generateWorker(this, A, P);\n } catch (C) {\n (E = new l(\"error\")).error(C);\n }\n return new h(E, A.type || \"string\", A.mimeType);\n }, generateAsync: function(b, E) {\n return this.generateInternalStream(b).accumulate(E);\n }, generateNodeStream: function(b, E) {\n return (b = b || {}).type || (b.type = \"nodebuffer\"), this.generateInternalStream(b).toNodejsStream(E);\n } };\n n.exports = _;\n }, { \"./compressedObject\": 2, \"./defaults\": 5, \"./generate\": 9, \"./nodejs/NodejsStreamInputAdapter\": 12, \"./nodejsUtils\": 14, \"./stream/GenericWorker\": 28, \"./stream/StreamHelper\": 29, \"./utf8\": 31, \"./utils\": 32, \"./zipObject\": 35 }], 16: [function(t, n, i) {\n n.exports = t(\"stream\");\n }, { stream: void 0 }], 17: [function(t, n, i) {\n var s = t(\"./DataReader\");\n function r(a) {\n s.call(this, a);\n for (var l = 0; l < this.data.length; l++) a[l] = 255 & a[l];\n }\n t(\"../utils\").inherits(r, s), r.prototype.byteAt = function(a) {\n return this.data[this.zero + a];\n }, r.prototype.lastIndexOfSignature = function(a) {\n for (var l = a.charCodeAt(0), h = a.charCodeAt(1), c = a.charCodeAt(2), u = a.charCodeAt(3), m = this.length - 4; 0 <= m; --m) if (this.data[m] === l && this.data[m + 1] === h && this.data[m + 2] === c && this.data[m + 3] === u) return m - this.zero;\n return -1;\n }, r.prototype.readAndCheckSignature = function(a) {\n var l = a.charCodeAt(0), h = a.charCodeAt(1), c = a.charCodeAt(2), u = a.charCodeAt(3), m = this.readData(4);\n return l === m[0] && h === m[1] && c === m[2] && u === m[3];\n }, r.prototype.readData = function(a) {\n if (this.checkOffset(a), a === 0) return [];\n var l = this.data.slice(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./DataReader\": 18 }], 18: [function(t, n, i) {\n var s = t(\"../utils\");\n function r(a) {\n this.data = a, this.length = a.length, this.index = 0, this.zero = 0;\n }\n r.prototype = { checkOffset: function(a) {\n this.checkIndex(this.index + a);\n }, checkIndex: function(a) {\n if (this.length < this.zero + a || a < 0) throw new Error(\"End of data reached (data length = \" + this.length + \", asked index = \" + a + \"). Corrupted zip ?\");\n }, setIndex: function(a) {\n this.checkIndex(a), this.index = a;\n }, skip: function(a) {\n this.setIndex(this.index + a);\n }, byteAt: function() {\n }, readInt: function(a) {\n var l, h = 0;\n for (this.checkOffset(a), l = this.index + a - 1; l >= this.index; l--) h = (h << 8) + this.byteAt(l);\n return this.index += a, h;\n }, readString: function(a) {\n return s.transformTo(\"string\", this.readData(a));\n }, readData: function() {\n }, lastIndexOfSignature: function() {\n }, readAndCheckSignature: function() {\n }, readDate: function() {\n var a = this.readInt(4);\n return new Date(Date.UTC(1980 + (a >> 25 & 127), (a >> 21 & 15) - 1, a >> 16 & 31, a >> 11 & 31, a >> 5 & 63, (31 & a) << 1));\n } }, n.exports = r;\n }, { \"../utils\": 32 }], 19: [function(t, n, i) {\n var s = t(\"./Uint8ArrayReader\");\n function r(a) {\n s.call(this, a);\n }\n t(\"../utils\").inherits(r, s), r.prototype.readData = function(a) {\n this.checkOffset(a);\n var l = this.data.slice(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./Uint8ArrayReader\": 21 }], 20: [function(t, n, i) {\n var s = t(\"./DataReader\");\n function r(a) {\n s.call(this, a);\n }\n t(\"../utils\").inherits(r, s), r.prototype.byteAt = function(a) {\n return this.data.charCodeAt(this.zero + a);\n }, r.prototype.lastIndexOfSignature = function(a) {\n return this.data.lastIndexOf(a) - this.zero;\n }, r.prototype.readAndCheckSignature = function(a) {\n return a === this.readData(4);\n }, r.prototype.readData = function(a) {\n this.checkOffset(a);\n var l = this.data.slice(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./DataReader\": 18 }], 21: [function(t, n, i) {\n var s = t(\"./ArrayReader\");\n function r(a) {\n s.call(this, a);\n }\n t(\"../utils\").inherits(r, s), r.prototype.readData = function(a) {\n if (this.checkOffset(a), a === 0) return new Uint8Array(0);\n var l = this.data.subarray(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./ArrayReader\": 17 }], 22: [function(t, n, i) {\n var s = t(\"../utils\"), r = t(\"../support\"), a = t(\"./ArrayReader\"), l = t(\"./StringReader\"), h = t(\"./NodeBufferReader\"), c = t(\"./Uint8ArrayReader\");\n n.exports = function(u) {\n var m = s.getTypeOf(u);\n return s.checkSupport(m), m !== \"string\" || r.uint8array ? m === \"nodebuffer\" ? new h(u) : r.uint8array ? new c(s.transformTo(\"uint8array\", u)) : new a(s.transformTo(\"array\", u)) : new l(u);\n };\n }, { \"../support\": 30, \"../utils\": 32, \"./ArrayReader\": 17, \"./NodeBufferReader\": 19, \"./StringReader\": 20, \"./Uint8ArrayReader\": 21 }], 23: [function(t, n, i) {\n i.LOCAL_FILE_HEADER = \"PK\u0003\u0004\", i.CENTRAL_FILE_HEADER = \"PK\u0001\u0002\", i.CENTRAL_DIRECTORY_END = \"PK\u0005\u0006\", i.ZIP64_CENTRAL_DIRECTORY_LOCATOR = \"PK\u0006\\x07\", i.ZIP64_CENTRAL_DIRECTORY_END = \"PK\u0006\u0006\", i.DATA_DESCRIPTOR = \"PK\\x07\\b\";\n }, {}], 24: [function(t, n, i) {\n var s = t(\"./GenericWorker\"), r = t(\"../utils\");\n function a(l) {\n s.call(this, \"ConvertWorker to \" + l), this.destType = l;\n }\n r.inherits(a, s), a.prototype.processChunk = function(l) {\n this.push({ data: r.transformTo(this.destType, l.data), meta: l.meta });\n }, n.exports = a;\n }, { \"../utils\": 32, \"./GenericWorker\": 28 }], 25: [function(t, n, i) {\n var s = t(\"./GenericWorker\"), r = t(\"../crc32\");\n function a() {\n s.call(this, \"Crc32Probe\"), this.withStreamInfo(\"crc32\", 0);\n }\n t(\"../utils\").inherits(a, s), a.prototype.processChunk = function(l) {\n this.streamInfo.crc32 = r(l.data, this.streamInfo.crc32 || 0), this.push(l);\n }, n.exports = a;\n }, { \"../crc32\": 4, \"../utils\": 32, \"./GenericWorker\": 28 }], 26: [function(t, n, i) {\n var s = t(\"../utils\"), r = t(\"./GenericWorker\");\n function a(l) {\n r.call(this, \"DataLengthProbe for \" + l), this.propName = l, this.withStreamInfo(l, 0);\n }\n s.inherits(a, r), a.prototype.processChunk = function(l) {\n if (l) {\n var h = this.streamInfo[this.propName] || 0;\n this.streamInfo[this.propName] = h + l.data.length;\n }\n r.prototype.processChunk.call(this, l);\n }, n.exports = a;\n }, { \"../utils\": 32, \"./GenericWorker\": 28 }], 27: [function(t, n, i) {\n var s = t(\"../utils\"), r = t(\"./GenericWorker\");\n function a(l) {\n r.call(this, \"DataWorker\");\n var h = this;\n this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = \"\", this._tickScheduled = !1, l.then(function(c) {\n h.dataIsReady = !0, h.data = c, h.max = c && c.length || 0, h.type = s.getTypeOf(c), h.isPaused || h._tickAndRepeat();\n }, function(c) {\n h.error(c);\n });\n }\n s.inherits(a, r), a.prototype.cleanUp = function() {\n r.prototype.cleanUp.call(this), this.data = null;\n }, a.prototype.resume = function() {\n return !!r.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, s.delay(this._tickAndRepeat, [], this)), !0);\n }, a.prototype._tickAndRepeat = function() {\n this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (s.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));\n }, a.prototype._tick = function() {\n if (this.isPaused || this.isFinished) return !1;\n var l = null, h = Math.min(this.max, this.index + 16384);\n if (this.index >= this.max) return this.end();\n switch (this.type) {\n case \"string\":\n l = this.data.substring(this.index, h);\n break;\n case \"uint8array\":\n l = this.data.subarray(this.index, h);\n break;\n case \"array\":\n case \"nodebuffer\":\n l = this.data.slice(this.index, h);\n }\n return this.index = h, this.push({ data: l, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });\n }, n.exports = a;\n }, { \"../utils\": 32, \"./GenericWorker\": 28 }], 28: [function(t, n, i) {\n function s(r) {\n this.name = r || \"default\", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;\n }\n s.prototype = { push: function(r) {\n this.emit(\"data\", r);\n }, end: function() {\n if (this.isFinished) return !1;\n this.flush();\n try {\n this.emit(\"end\"), this.cleanUp(), this.isFinished = !0;\n } catch (r) {\n this.emit(\"error\", r);\n }\n return !0;\n }, error: function(r) {\n return !this.isFinished && (this.isPaused ? this.generatedError = r : (this.isFinished = !0, this.emit(\"error\", r), this.previous && this.previous.error(r), this.cleanUp()), !0);\n }, on: function(r, a) {\n return this._listeners[r].push(a), this;\n }, cleanUp: function() {\n this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];\n }, emit: function(r, a) {\n if (this._listeners[r]) for (var l = 0; l < this._listeners[r].length; l++) this._listeners[r][l].call(this, a);\n }, pipe: function(r) {\n return r.registerPrevious(this);\n }, registerPrevious: function(r) {\n if (this.isLocked) throw new Error(\"The stream '\" + this + \"' has already been used.\");\n this.streamInfo = r.streamInfo, this.mergeStreamInfo(), this.previous = r;\n var a = this;\n return r.on(\"data\", function(l) {\n a.processChunk(l);\n }), r.on(\"end\", function() {\n a.end();\n }), r.on(\"error\", function(l) {\n a.error(l);\n }), this;\n }, pause: function() {\n return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);\n }, resume: function() {\n if (!this.isPaused || this.isFinished) return !1;\n var r = this.isPaused = !1;\n return this.generatedError && (this.error(this.generatedError), r = !0), this.previous && this.previous.resume(), !r;\n }, flush: function() {\n }, processChunk: function(r) {\n this.push(r);\n }, withStreamInfo: function(r, a) {\n return this.extraStreamInfo[r] = a, this.mergeStreamInfo(), this;\n }, mergeStreamInfo: function() {\n for (var r in this.extraStreamInfo) Object.prototype.hasOwnProperty.call(this.extraStreamInfo, r) && (this.streamInfo[r] = this.extraStreamInfo[r]);\n }, lock: function() {\n if (this.isLocked) throw new Error(\"The stream '\" + this + \"' has already been used.\");\n this.isLocked = !0, this.previous && this.previous.lock();\n }, toString: function() {\n var r = \"Worker \" + this.name;\n return this.previous ? this.previous + \" -> \" + r : r;\n } }, n.exports = s;\n }, {}], 29: [function(t, n, i) {\n var s = t(\"../utils\"), r = t(\"./ConvertWorker\"), a = t(\"./GenericWorker\"), l = t(\"../base64\"), h = t(\"../support\"), c = t(\"../external\"), u = null;\n if (h.nodestream) try {\n u = t(\"../nodejs/NodejsStreamOutputAdapter\");\n } catch {\n }\n function m(d, p) {\n return new c.Promise(function(g, y) {\n var w = [], x = d._internalType, _ = d._outputType, b = d._mimeType;\n d.on(\"data\", function(E, A) {\n w.push(E), p && p(A);\n }).on(\"error\", function(E) {\n w = [], y(E);\n }).on(\"end\", function() {\n try {\n var E = (function(A, P, C) {\n switch (A) {\n case \"blob\":\n return s.newBlob(s.transformTo(\"arraybuffer\", P), C);\n case \"base64\":\n return l.encode(P);\n default:\n return s.transformTo(A, P);\n }\n })(_, (function(A, P) {\n var C, D = 0, I = null, T = 0;\n for (C = 0; C < P.length; C++) T += P[C].length;\n switch (A) {\n case \"string\":\n return P.join(\"\");\n case \"array\":\n return Array.prototype.concat.apply([], P);\n case \"uint8array\":\n for (I = new Uint8Array(T), C = 0; C < P.length; C++) I.set(P[C], D), D += P[C].length;\n return I;\n case \"nodebuffer\":\n return Buffer.concat(P);\n default:\n throw new Error(\"concat : unsupported type '\" + A + \"'\");\n }\n })(x, w), b);\n g(E);\n } catch (A) {\n y(A);\n }\n w = [];\n }).resume();\n });\n }\n function f(d, p, g) {\n var y = p;\n switch (p) {\n case \"blob\":\n case \"arraybuffer\":\n y = \"uint8array\";\n break;\n case \"base64\":\n y = \"string\";\n }\n try {\n this._internalType = y, this._outputType = p, this._mimeType = g, s.checkSupport(y), this._worker = d.pipe(new r(y)), d.lock();\n } catch (w) {\n this._worker = new a(\"error\"), this._worker.error(w);\n }\n }\n f.prototype = { accumulate: function(d) {\n return m(this, d);\n }, on: function(d, p) {\n var g = this;\n return d === \"data\" ? this._worker.on(d, function(y) {\n p.call(g, y.data, y.meta);\n }) : this._worker.on(d, function() {\n s.delay(p, arguments, g);\n }), this;\n }, resume: function() {\n return s.delay(this._worker.resume, [], this._worker), this;\n }, pause: function() {\n return this._worker.pause(), this;\n }, toNodejsStream: function(d) {\n if (s.checkSupport(\"nodestream\"), this._outputType !== \"nodebuffer\") throw new Error(this._outputType + \" is not supported by this method\");\n return new u(this, { objectMode: this._outputType !== \"nodebuffer\" }, d);\n } }, n.exports = f;\n }, { \"../base64\": 1, \"../external\": 6, \"../nodejs/NodejsStreamOutputAdapter\": 13, \"../support\": 30, \"../utils\": 32, \"./ConvertWorker\": 24, \"./GenericWorker\": 28 }], 30: [function(t, n, i) {\n if (i.base64 = !0, i.array = !0, i.string = !0, i.arraybuffer = typeof ArrayBuffer < \"u\" && typeof Uint8Array < \"u\", i.nodebuffer = typeof Buffer < \"u\", i.uint8array = typeof Uint8Array < \"u\", typeof ArrayBuffer > \"u\") i.blob = !1;\n else {\n var s = new ArrayBuffer(0);\n try {\n i.blob = new Blob([s], { type: \"application/zip\" }).size === 0;\n } catch {\n try {\n var r = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();\n r.append(s), i.blob = r.getBlob(\"application/zip\").size === 0;\n } catch {\n i.blob = !1;\n }\n }\n }\n try {\n i.nodestream = !!t(\"readable-stream\").Readable;\n } catch {\n i.nodestream = !1;\n }\n }, { \"readable-stream\": 16 }], 31: [function(t, n, i) {\n for (var s = t(\"./utils\"), r = t(\"./support\"), a = t(\"./nodejsUtils\"), l = t(\"./stream/GenericWorker\"), h = new Array(256), c = 0; c < 256; c++) h[c] = 252 <= c ? 6 : 248 <= c ? 5 : 240 <= c ? 4 : 224 <= c ? 3 : 192 <= c ? 2 : 1;\n h[254] = h[254] = 1;\n function u() {\n l.call(this, \"utf-8 decode\"), this.leftOver = null;\n }\n function m() {\n l.call(this, \"utf-8 encode\");\n }\n i.utf8encode = function(f) {\n return r.nodebuffer ? a.newBufferFrom(f, \"utf-8\") : (function(d) {\n var p, g, y, w, x, _ = d.length, b = 0;\n for (w = 0; w < _; w++) (64512 & (g = d.charCodeAt(w))) == 55296 && w + 1 < _ && (64512 & (y = d.charCodeAt(w + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (y - 56320), w++), b += g < 128 ? 1 : g < 2048 ? 2 : g < 65536 ? 3 : 4;\n for (p = r.uint8array ? new Uint8Array(b) : new Array(b), w = x = 0; x < b; w++) (64512 & (g = d.charCodeAt(w))) == 55296 && w + 1 < _ && (64512 & (y = d.charCodeAt(w + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (y - 56320), w++), g < 128 ? p[x++] = g : (g < 2048 ? p[x++] = 192 | g >>> 6 : (g < 65536 ? p[x++] = 224 | g >>> 12 : (p[x++] = 240 | g >>> 18, p[x++] = 128 | g >>> 12 & 63), p[x++] = 128 | g >>> 6 & 63), p[x++] = 128 | 63 & g);\n return p;\n })(f);\n }, i.utf8decode = function(f) {\n return r.nodebuffer ? s.transformTo(\"nodebuffer\", f).toString(\"utf-8\") : (function(d) {\n var p, g, y, w, x = d.length, _ = new Array(2 * x);\n for (p = g = 0; p < x; ) if ((y = d[p++]) < 128) _[g++] = y;\n else if (4 < (w = h[y])) _[g++] = 65533, p += w - 1;\n else {\n for (y &= w === 2 ? 31 : w === 3 ? 15 : 7; 1 < w && p < x; ) y = y << 6 | 63 & d[p++], w--;\n 1 < w ? _[g++] = 65533 : y < 65536 ? _[g++] = y : (y -= 65536, _[g++] = 55296 | y >> 10 & 1023, _[g++] = 56320 | 1023 & y);\n }\n return _.length !== g && (_.subarray ? _ = _.subarray(0, g) : _.length = g), s.applyFromCharCode(_);\n })(f = s.transformTo(r.uint8array ? \"uint8array\" : \"array\", f));\n }, s.inherits(u, l), u.prototype.processChunk = function(f) {\n var d = s.transformTo(r.uint8array ? \"uint8array\" : \"array\", f.data);\n if (this.leftOver && this.leftOver.length) {\n if (r.uint8array) {\n var p = d;\n (d = new Uint8Array(p.length + this.leftOver.length)).set(this.leftOver, 0), d.set(p, this.leftOver.length);\n } else d = this.leftOver.concat(d);\n this.leftOver = null;\n }\n var g = (function(w, x) {\n var _;\n for ((x = x || w.length) > w.length && (x = w.length), _ = x - 1; 0 <= _ && (192 & w[_]) == 128; ) _--;\n return _ < 0 || _ === 0 ? x : _ + h[w[_]] > x ? _ : x;\n })(d), y = d;\n g !== d.length && (r.uint8array ? (y = d.subarray(0, g), this.leftOver = d.subarray(g, d.length)) : (y = d.slice(0, g), this.leftOver = d.slice(g, d.length))), this.push({ data: i.utf8decode(y), meta: f.meta });\n }, u.prototype.flush = function() {\n this.leftOver && this.leftOver.length && (this.push({ data: i.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);\n }, i.Utf8DecodeWorker = u, s.inherits(m, l), m.prototype.processChunk = function(f) {\n this.push({ data: i.utf8encode(f.data), meta: f.meta });\n }, i.Utf8EncodeWorker = m;\n }, { \"./nodejsUtils\": 14, \"./stream/GenericWorker\": 28, \"./support\": 30, \"./utils\": 32 }], 32: [function(t, n, i) {\n var s = t(\"./support\"), r = t(\"./base64\"), a = t(\"./nodejsUtils\"), l = t(\"./external\");\n function h(p) {\n return p;\n }\n function c(p, g) {\n for (var y = 0; y < p.length; ++y) g[y] = 255 & p.charCodeAt(y);\n return g;\n }\n t(\"setimmediate\"), i.newBlob = function(p, g) {\n i.checkSupport(\"blob\");\n try {\n return new Blob([p], { type: g });\n } catch {\n try {\n var y = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();\n return y.append(p), y.getBlob(g);\n } catch {\n throw new Error(\"Bug : can't construct the Blob.\");\n }\n }\n };\n var u = { stringifyByChunk: function(p, g, y) {\n var w = [], x = 0, _ = p.length;\n if (_ <= y) return String.fromCharCode.apply(null, p);\n for (; x < _; ) g === \"array\" || g === \"nodebuffer\" ? w.push(String.fromCharCode.apply(null, p.slice(x, Math.min(x + y, _)))) : w.push(String.fromCharCode.apply(null, p.subarray(x, Math.min(x + y, _)))), x += y;\n return w.join(\"\");\n }, stringifyByChar: function(p) {\n for (var g = \"\", y = 0; y < p.length; y++) g += String.fromCharCode(p[y]);\n return g;\n }, applyCanBeUsed: { uint8array: (function() {\n try {\n return s.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;\n } catch {\n return !1;\n }\n })(), nodebuffer: (function() {\n try {\n return s.nodebuffer && String.fromCharCode.apply(null, a.allocBuffer(1)).length === 1;\n } catch {\n return !1;\n }\n })() } };\n function m(p) {\n var g = 65536, y = i.getTypeOf(p), w = !0;\n if (y === \"uint8array\" ? w = u.applyCanBeUsed.uint8array : y === \"nodebuffer\" && (w = u.applyCanBeUsed.nodebuffer), w) for (; 1 < g; ) try {\n return u.stringifyByChunk(p, y, g);\n } catch {\n g = Math.floor(g / 2);\n }\n return u.stringifyByChar(p);\n }\n function f(p, g) {\n for (var y = 0; y < p.length; y++) g[y] = p[y];\n return g;\n }\n i.applyFromCharCode = m;\n var d = {};\n d.string = { string: h, array: function(p) {\n return c(p, new Array(p.length));\n }, arraybuffer: function(p) {\n return d.string.uint8array(p).buffer;\n }, uint8array: function(p) {\n return c(p, new Uint8Array(p.length));\n }, nodebuffer: function(p) {\n return c(p, a.allocBuffer(p.length));\n } }, d.array = { string: m, array: h, arraybuffer: function(p) {\n return new Uint8Array(p).buffer;\n }, uint8array: function(p) {\n return new Uint8Array(p);\n }, nodebuffer: function(p) {\n return a.newBufferFrom(p);\n } }, d.arraybuffer = { string: function(p) {\n return m(new Uint8Array(p));\n }, array: function(p) {\n return f(new Uint8Array(p), new Array(p.byteLength));\n }, arraybuffer: h, uint8array: function(p) {\n return new Uint8Array(p);\n }, nodebuffer: function(p) {\n return a.newBufferFrom(new Uint8Array(p));\n } }, d.uint8array = { string: m, array: function(p) {\n return f(p, new Array(p.length));\n }, arraybuffer: function(p) {\n return p.buffer;\n }, uint8array: h, nodebuffer: function(p) {\n return a.newBufferFrom(p);\n } }, d.nodebuffer = { string: m, array: function(p) {\n return f(p, new Array(p.length));\n }, arraybuffer: function(p) {\n return d.nodebuffer.uint8array(p).buffer;\n }, uint8array: function(p) {\n return f(p, new Uint8Array(p.length));\n }, nodebuffer: h }, i.transformTo = function(p, g) {\n if (g = g || \"\", !p) return g;\n i.checkSupport(p);\n var y = i.getTypeOf(g);\n return d[y][p](g);\n }, i.resolve = function(p) {\n for (var g = p.split(\"/\"), y = [], w = 0; w < g.length; w++) {\n var x = g[w];\n x === \".\" || x === \"\" && w !== 0 && w !== g.length - 1 || (x === \"..\" ? y.pop() : y.push(x));\n }\n return y.join(\"/\");\n }, i.getTypeOf = function(p) {\n return typeof p == \"string\" ? \"string\" : Object.prototype.toString.call(p) === \"[object Array]\" ? \"array\" : s.nodebuffer && a.isBuffer(p) ? \"nodebuffer\" : s.uint8array && p instanceof Uint8Array ? \"uint8array\" : s.arraybuffer && p instanceof ArrayBuffer ? \"arraybuffer\" : void 0;\n }, i.checkSupport = function(p) {\n if (!s[p.toLowerCase()]) throw new Error(p + \" is not supported by this platform\");\n }, i.MAX_VALUE_16BITS = 65535, i.MAX_VALUE_32BITS = -1, i.pretty = function(p) {\n var g, y, w = \"\";\n for (y = 0; y < (p || \"\").length; y++) w += \"\\\\x\" + ((g = p.charCodeAt(y)) < 16 ? \"0\" : \"\") + g.toString(16).toUpperCase();\n return w;\n }, i.delay = function(p, g, y) {\n setImmediate(function() {\n p.apply(y || null, g || []);\n });\n }, i.inherits = function(p, g) {\n function y() {\n }\n y.prototype = g.prototype, p.prototype = new y();\n }, i.extend = function() {\n var p, g, y = {};\n for (p = 0; p < arguments.length; p++) for (g in arguments[p]) Object.prototype.hasOwnProperty.call(arguments[p], g) && y[g] === void 0 && (y[g] = arguments[p][g]);\n return y;\n }, i.prepareContent = function(p, g, y, w, x) {\n return l.Promise.resolve(g).then(function(_) {\n return s.blob && (_ instanceof Blob || [\"[object File]\", \"[object Blob]\"].indexOf(Object.prototype.toString.call(_)) !== -1) && typeof FileReader < \"u\" ? new l.Promise(function(b, E) {\n var A = new FileReader();\n A.onload = function(P) {\n b(P.target.result);\n }, A.onerror = function(P) {\n E(P.target.error);\n }, A.readAsArrayBuffer(_);\n }) : _;\n }).then(function(_) {\n var b = i.getTypeOf(_);\n return b ? (b === \"arraybuffer\" ? _ = i.transformTo(\"uint8array\", _) : b === \"string\" && (x ? _ = r.decode(_) : y && w !== !0 && (_ = (function(E) {\n return c(E, s.uint8array ? new Uint8Array(E.length) : new Array(E.length));\n })(_))), _) : l.Promise.reject(new Error(\"Can't read the data of '\" + p + \"'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\"));\n });\n };\n }, { \"./base64\": 1, \"./external\": 6, \"./nodejsUtils\": 14, \"./support\": 30, setimmediate: 54 }], 33: [function(t, n, i) {\n var s = t(\"./reader/readerFor\"), r = t(\"./utils\"), a = t(\"./signature\"), l = t(\"./zipEntry\"), h = t(\"./support\");\n function c(u) {\n this.files = [], this.loadOptions = u;\n }\n c.prototype = { checkSignature: function(u) {\n if (!this.reader.readAndCheckSignature(u)) {\n this.reader.index -= 4;\n var m = this.reader.readString(4);\n throw new Error(\"Corrupted zip or bug: unexpected signature (\" + r.pretty(m) + \", expected \" + r.pretty(u) + \")\");\n }\n }, isSignature: function(u, m) {\n var f = this.reader.index;\n this.reader.setIndex(u);\n var d = this.reader.readString(4) === m;\n return this.reader.setIndex(f), d;\n }, readBlockEndOfCentral: function() {\n this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);\n var u = this.reader.readData(this.zipCommentLength), m = h.uint8array ? \"uint8array\" : \"array\", f = r.transformTo(m, u);\n this.zipComment = this.loadOptions.decodeFileName(f);\n }, readBlockZip64EndOfCentral: function() {\n this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};\n for (var u, m, f, d = this.zip64EndOfCentralSize - 44; 0 < d; ) u = this.reader.readInt(2), m = this.reader.readInt(4), f = this.reader.readData(m), this.zip64ExtensibleData[u] = { id: u, length: m, value: f };\n }, readBlockZip64EndOfCentralLocator: function() {\n if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), 1 < this.disksCount) throw new Error(\"Multi-volumes zip are not supported\");\n }, readLocalFiles: function() {\n var u, m;\n for (u = 0; u < this.files.length; u++) m = this.files[u], this.reader.setIndex(m.localHeaderOffset), this.checkSignature(a.LOCAL_FILE_HEADER), m.readLocalPart(this.reader), m.handleUTF8(), m.processAttributes();\n }, readCentralDir: function() {\n var u;\n for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(a.CENTRAL_FILE_HEADER); ) (u = new l({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(u);\n if (this.centralDirRecords !== this.files.length && this.centralDirRecords !== 0 && this.files.length === 0) throw new Error(\"Corrupted zip or bug: expected \" + this.centralDirRecords + \" records in central dir, got \" + this.files.length);\n }, readEndOfCentral: function() {\n var u = this.reader.lastIndexOfSignature(a.CENTRAL_DIRECTORY_END);\n if (u < 0) throw this.isSignature(0, a.LOCAL_FILE_HEADER) ? new Error(\"Corrupted zip: can't find end of central directory\") : new Error(\"Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html\");\n this.reader.setIndex(u);\n var m = u;\n if (this.checkSignature(a.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === r.MAX_VALUE_16BITS || this.diskWithCentralDirStart === r.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === r.MAX_VALUE_16BITS || this.centralDirRecords === r.MAX_VALUE_16BITS || this.centralDirSize === r.MAX_VALUE_32BITS || this.centralDirOffset === r.MAX_VALUE_32BITS) {\n if (this.zip64 = !0, (u = this.reader.lastIndexOfSignature(a.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory locator\");\n if (this.reader.setIndex(u), this.checkSignature(a.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, a.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(a.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory\");\n this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(a.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();\n }\n var f = this.centralDirOffset + this.centralDirSize;\n this.zip64 && (f += 20, f += 12 + this.zip64EndOfCentralSize);\n var d = m - f;\n if (0 < d) this.isSignature(m, a.CENTRAL_FILE_HEADER) || (this.reader.zero = d);\n else if (d < 0) throw new Error(\"Corrupted zip: missing \" + Math.abs(d) + \" bytes.\");\n }, prepareReader: function(u) {\n this.reader = s(u);\n }, load: function(u) {\n this.prepareReader(u), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();\n } }, n.exports = c;\n }, { \"./reader/readerFor\": 22, \"./signature\": 23, \"./support\": 30, \"./utils\": 32, \"./zipEntry\": 34 }], 34: [function(t, n, i) {\n var s = t(\"./reader/readerFor\"), r = t(\"./utils\"), a = t(\"./compressedObject\"), l = t(\"./crc32\"), h = t(\"./utf8\"), c = t(\"./compressions\"), u = t(\"./support\");\n function m(f, d) {\n this.options = f, this.loadOptions = d;\n }\n m.prototype = { isEncrypted: function() {\n return (1 & this.bitFlag) == 1;\n }, useUTF8: function() {\n return (2048 & this.bitFlag) == 2048;\n }, readLocalPart: function(f) {\n var d, p;\n if (f.skip(22), this.fileNameLength = f.readInt(2), p = f.readInt(2), this.fileName = f.readData(this.fileNameLength), f.skip(p), this.compressedSize === -1 || this.uncompressedSize === -1) throw new Error(\"Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)\");\n if ((d = (function(g) {\n for (var y in c) if (Object.prototype.hasOwnProperty.call(c, y) && c[y].magic === g) return c[y];\n return null;\n })(this.compressionMethod)) === null) throw new Error(\"Corrupted zip : compression \" + r.pretty(this.compressionMethod) + \" unknown (inner file : \" + r.transformTo(\"string\", this.fileName) + \")\");\n this.decompressed = new a(this.compressedSize, this.uncompressedSize, this.crc32, d, f.readData(this.compressedSize));\n }, readCentralPart: function(f) {\n this.versionMadeBy = f.readInt(2), f.skip(2), this.bitFlag = f.readInt(2), this.compressionMethod = f.readString(2), this.date = f.readDate(), this.crc32 = f.readInt(4), this.compressedSize = f.readInt(4), this.uncompressedSize = f.readInt(4);\n var d = f.readInt(2);\n if (this.extraFieldsLength = f.readInt(2), this.fileCommentLength = f.readInt(2), this.diskNumberStart = f.readInt(2), this.internalFileAttributes = f.readInt(2), this.externalFileAttributes = f.readInt(4), this.localHeaderOffset = f.readInt(4), this.isEncrypted()) throw new Error(\"Encrypted zip are not supported\");\n f.skip(d), this.readExtraFields(f), this.parseZIP64ExtraField(f), this.fileComment = f.readData(this.fileCommentLength);\n }, processAttributes: function() {\n this.unixPermissions = null, this.dosPermissions = null;\n var f = this.versionMadeBy >> 8;\n this.dir = !!(16 & this.externalFileAttributes), f == 0 && (this.dosPermissions = 63 & this.externalFileAttributes), f == 3 && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || this.fileNameStr.slice(-1) !== \"/\" || (this.dir = !0);\n }, parseZIP64ExtraField: function() {\n if (this.extraFields[1]) {\n var f = s(this.extraFields[1].value);\n this.uncompressedSize === r.MAX_VALUE_32BITS && (this.uncompressedSize = f.readInt(8)), this.compressedSize === r.MAX_VALUE_32BITS && (this.compressedSize = f.readInt(8)), this.localHeaderOffset === r.MAX_VALUE_32BITS && (this.localHeaderOffset = f.readInt(8)), this.diskNumberStart === r.MAX_VALUE_32BITS && (this.diskNumberStart = f.readInt(4));\n }\n }, readExtraFields: function(f) {\n var d, p, g, y = f.index + this.extraFieldsLength;\n for (this.extraFields || (this.extraFields = {}); f.index + 4 < y; ) d = f.readInt(2), p = f.readInt(2), g = f.readData(p), this.extraFields[d] = { id: d, length: p, value: g };\n f.setIndex(y);\n }, handleUTF8: function() {\n var f = u.uint8array ? \"uint8array\" : \"array\";\n if (this.useUTF8()) this.fileNameStr = h.utf8decode(this.fileName), this.fileCommentStr = h.utf8decode(this.fileComment);\n else {\n var d = this.findExtraFieldUnicodePath();\n if (d !== null) this.fileNameStr = d;\n else {\n var p = r.transformTo(f, this.fileName);\n this.fileNameStr = this.loadOptions.decodeFileName(p);\n }\n var g = this.findExtraFieldUnicodeComment();\n if (g !== null) this.fileCommentStr = g;\n else {\n var y = r.transformTo(f, this.fileComment);\n this.fileCommentStr = this.loadOptions.decodeFileName(y);\n }\n }\n }, findExtraFieldUnicodePath: function() {\n var f = this.extraFields[28789];\n if (f) {\n var d = s(f.value);\n return d.readInt(1) !== 1 || l(this.fileName) !== d.readInt(4) ? null : h.utf8decode(d.readData(f.length - 5));\n }\n return null;\n }, findExtraFieldUnicodeComment: function() {\n var f = this.extraFields[25461];\n if (f) {\n var d = s(f.value);\n return d.readInt(1) !== 1 || l(this.fileComment) !== d.readInt(4) ? null : h.utf8decode(d.readData(f.length - 5));\n }\n return null;\n } }, n.exports = m;\n }, { \"./compressedObject\": 2, \"./compressions\": 3, \"./crc32\": 4, \"./reader/readerFor\": 22, \"./support\": 30, \"./utf8\": 31, \"./utils\": 32 }], 35: [function(t, n, i) {\n function s(d, p, g) {\n this.name = d, this.dir = g.dir, this.date = g.date, this.comment = g.comment, this.unixPermissions = g.unixPermissions, this.dosPermissions = g.dosPermissions, this._data = p, this._dataBinary = g.binary, this.options = { compression: g.compression, compressionOptions: g.compressionOptions };\n }\n var r = t(\"./stream/StreamHelper\"), a = t(\"./stream/DataWorker\"), l = t(\"./utf8\"), h = t(\"./compressedObject\"), c = t(\"./stream/GenericWorker\");\n s.prototype = { internalStream: function(d) {\n var p = null, g = \"string\";\n try {\n if (!d) throw new Error(\"No output type specified.\");\n var y = (g = d.toLowerCase()) === \"string\" || g === \"text\";\n g !== \"binarystring\" && g !== \"text\" || (g = \"string\"), p = this._decompressWorker();\n var w = !this._dataBinary;\n w && !y && (p = p.pipe(new l.Utf8EncodeWorker())), !w && y && (p = p.pipe(new l.Utf8DecodeWorker()));\n } catch (x) {\n (p = new c(\"error\")).error(x);\n }\n return new r(p, g, \"\");\n }, async: function(d, p) {\n return this.internalStream(d).accumulate(p);\n }, nodeStream: function(d, p) {\n return this.internalStream(d || \"nodebuffer\").toNodejsStream(p);\n }, _compressWorker: function(d, p) {\n if (this._data instanceof h && this._data.compression.magic === d.magic) return this._data.getCompressedWorker();\n var g = this._decompressWorker();\n return this._dataBinary || (g = g.pipe(new l.Utf8EncodeWorker())), h.createWorkerFrom(g, d, p);\n }, _decompressWorker: function() {\n return this._data instanceof h ? this._data.getContentWorker() : this._data instanceof c ? this._data : new a(this._data);\n } };\n for (var u = [\"asText\", \"asBinary\", \"asNodeBuffer\", \"asUint8Array\", \"asArrayBuffer\"], m = function() {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }, f = 0; f < u.length; f++) s.prototype[u[f]] = m;\n n.exports = s;\n }, { \"./compressedObject\": 2, \"./stream/DataWorker\": 27, \"./stream/GenericWorker\": 28, \"./stream/StreamHelper\": 29, \"./utf8\": 31 }], 36: [function(t, n, i) {\n (function(s) {\n var r, a, l = s.MutationObserver || s.WebKitMutationObserver;\n if (l) {\n var h = 0, c = new l(d), u = s.document.createTextNode(\"\");\n c.observe(u, { characterData: !0 }), r = function() {\n u.data = h = ++h % 2;\n };\n } else if (s.setImmediate || s.MessageChannel === void 0) r = \"document\" in s && \"onreadystatechange\" in s.document.createElement(\"script\") ? function() {\n var p = s.document.createElement(\"script\");\n p.onreadystatechange = function() {\n d(), p.onreadystatechange = null, p.parentNode.removeChild(p), p = null;\n }, s.document.documentElement.appendChild(p);\n } : function() {\n setTimeout(d, 0);\n };\n else {\n var m = new s.MessageChannel();\n m.port1.onmessage = d, r = function() {\n m.port2.postMessage(0);\n };\n }\n var f = [];\n function d() {\n var p, g;\n a = !0;\n for (var y = f.length; y; ) {\n for (g = f, f = [], p = -1; ++p < y; ) g[p]();\n y = f.length;\n }\n a = !1;\n }\n n.exports = function(p) {\n f.push(p) !== 1 || a || r();\n };\n }).call(this, typeof ii < \"u\" ? ii : typeof self < \"u\" ? self : typeof window < \"u\" ? window : {});\n }, {}], 37: [function(t, n, i) {\n var s = t(\"immediate\");\n function r() {\n }\n var a = {}, l = [\"REJECTED\"], h = [\"FULFILLED\"], c = [\"PENDING\"];\n function u(y) {\n if (typeof y != \"function\") throw new TypeError(\"resolver must be a function\");\n this.state = c, this.queue = [], this.outcome = void 0, y !== r && p(this, y);\n }\n function m(y, w, x) {\n this.promise = y, typeof w == \"function\" && (this.onFulfilled = w, this.callFulfilled = this.otherCallFulfilled), typeof x == \"function\" && (this.onRejected = x, this.callRejected = this.otherCallRejected);\n }\n function f(y, w, x) {\n s(function() {\n var _;\n try {\n _ = w(x);\n } catch (b) {\n return a.reject(y, b);\n }\n _ === y ? a.reject(y, new TypeError(\"Cannot resolve promise with itself\")) : a.resolve(y, _);\n });\n }\n function d(y) {\n var w = y && y.then;\n if (y && (typeof y == \"object\" || typeof y == \"function\") && typeof w == \"function\") return function() {\n w.apply(y, arguments);\n };\n }\n function p(y, w) {\n var x = !1;\n function _(A) {\n x || (x = !0, a.reject(y, A));\n }\n function b(A) {\n x || (x = !0, a.resolve(y, A));\n }\n var E = g(function() {\n w(b, _);\n });\n E.status === \"error\" && _(E.value);\n }\n function g(y, w) {\n var x = {};\n try {\n x.value = y(w), x.status = \"success\";\n } catch (_) {\n x.status = \"error\", x.value = _;\n }\n return x;\n }\n (n.exports = u).prototype.finally = function(y) {\n if (typeof y != \"function\") return this;\n var w = this.constructor;\n return this.then(function(x) {\n return w.resolve(y()).then(function() {\n return x;\n });\n }, function(x) {\n return w.resolve(y()).then(function() {\n throw x;\n });\n });\n }, u.prototype.catch = function(y) {\n return this.then(null, y);\n }, u.prototype.then = function(y, w) {\n if (typeof y != \"function\" && this.state === h || typeof w != \"function\" && this.state === l) return this;\n var x = new this.constructor(r);\n return this.state !== c ? f(x, this.state === h ? y : w, this.outcome) : this.queue.push(new m(x, y, w)), x;\n }, m.prototype.callFulfilled = function(y) {\n a.resolve(this.promise, y);\n }, m.prototype.otherCallFulfilled = function(y) {\n f(this.promise, this.onFulfilled, y);\n }, m.prototype.callRejected = function(y) {\n a.reject(this.promise, y);\n }, m.prototype.otherCallRejected = function(y) {\n f(this.promise, this.onRejected, y);\n }, a.resolve = function(y, w) {\n var x = g(d, w);\n if (x.status === \"error\") return a.reject(y, x.value);\n var _ = x.value;\n if (_) p(y, _);\n else {\n y.state = h, y.outcome = w;\n for (var b = -1, E = y.queue.length; ++b < E; ) y.queue[b].callFulfilled(w);\n }\n return y;\n }, a.reject = function(y, w) {\n y.state = l, y.outcome = w;\n for (var x = -1, _ = y.queue.length; ++x < _; ) y.queue[x].callRejected(w);\n return y;\n }, u.resolve = function(y) {\n return y instanceof this ? y : a.resolve(new this(r), y);\n }, u.reject = function(y) {\n var w = new this(r);\n return a.reject(w, y);\n }, u.all = function(y) {\n var w = this;\n if (Object.prototype.toString.call(y) !== \"[object Array]\") return this.reject(new TypeError(\"must be an array\"));\n var x = y.length, _ = !1;\n if (!x) return this.resolve([]);\n for (var b = new Array(x), E = 0, A = -1, P = new this(r); ++A < x; ) C(y[A], A);\n return P;\n function C(D, I) {\n w.resolve(D).then(function(T) {\n b[I] = T, ++E !== x || _ || (_ = !0, a.resolve(P, b));\n }, function(T) {\n _ || (_ = !0, a.reject(P, T));\n });\n }\n }, u.race = function(y) {\n var w = this;\n if (Object.prototype.toString.call(y) !== \"[object Array]\") return this.reject(new TypeError(\"must be an array\"));\n var x = y.length, _ = !1;\n if (!x) return this.resolve([]);\n for (var b = -1, E = new this(r); ++b < x; ) A = y[b], w.resolve(A).then(function(P) {\n _ || (_ = !0, a.resolve(E, P));\n }, function(P) {\n _ || (_ = !0, a.reject(E, P));\n });\n var A;\n return E;\n };\n }, { immediate: 36 }], 38: [function(t, n, i) {\n var s = {};\n (0, t(\"./lib/utils/common\").assign)(s, t(\"./lib/deflate\"), t(\"./lib/inflate\"), t(\"./lib/zlib/constants\")), n.exports = s;\n }, { \"./lib/deflate\": 39, \"./lib/inflate\": 40, \"./lib/utils/common\": 41, \"./lib/zlib/constants\": 44 }], 39: [function(t, n, i) {\n var s = t(\"./zlib/deflate\"), r = t(\"./utils/common\"), a = t(\"./utils/strings\"), l = t(\"./zlib/messages\"), h = t(\"./zlib/zstream\"), c = Object.prototype.toString, u = 0, m = -1, f = 0, d = 8;\n function p(y) {\n if (!(this instanceof p)) return new p(y);\n this.options = r.assign({ level: m, method: d, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: f, to: \"\" }, y || {});\n var w = this.options;\n w.raw && 0 < w.windowBits ? w.windowBits = -w.windowBits : w.gzip && 0 < w.windowBits && w.windowBits < 16 && (w.windowBits += 16), this.err = 0, this.msg = \"\", this.ended = !1, this.chunks = [], this.strm = new h(), this.strm.avail_out = 0;\n var x = s.deflateInit2(this.strm, w.level, w.method, w.windowBits, w.memLevel, w.strategy);\n if (x !== u) throw new Error(l[x]);\n if (w.header && s.deflateSetHeader(this.strm, w.header), w.dictionary) {\n var _;\n if (_ = typeof w.dictionary == \"string\" ? a.string2buf(w.dictionary) : c.call(w.dictionary) === \"[object ArrayBuffer]\" ? new Uint8Array(w.dictionary) : w.dictionary, (x = s.deflateSetDictionary(this.strm, _)) !== u) throw new Error(l[x]);\n this._dict_set = !0;\n }\n }\n function g(y, w) {\n var x = new p(w);\n if (x.push(y, !0), x.err) throw x.msg || l[x.err];\n return x.result;\n }\n p.prototype.push = function(y, w) {\n var x, _, b = this.strm, E = this.options.chunkSize;\n if (this.ended) return !1;\n _ = w === ~~w ? w : w === !0 ? 4 : 0, typeof y == \"string\" ? b.input = a.string2buf(y) : c.call(y) === \"[object ArrayBuffer]\" ? b.input = new Uint8Array(y) : b.input = y, b.next_in = 0, b.avail_in = b.input.length;\n do {\n if (b.avail_out === 0 && (b.output = new r.Buf8(E), b.next_out = 0, b.avail_out = E), (x = s.deflate(b, _)) !== 1 && x !== u) return this.onEnd(x), !(this.ended = !0);\n b.avail_out !== 0 && (b.avail_in !== 0 || _ !== 4 && _ !== 2) || (this.options.to === \"string\" ? this.onData(a.buf2binstring(r.shrinkBuf(b.output, b.next_out))) : this.onData(r.shrinkBuf(b.output, b.next_out)));\n } while ((0 < b.avail_in || b.avail_out === 0) && x !== 1);\n return _ === 4 ? (x = s.deflateEnd(this.strm), this.onEnd(x), this.ended = !0, x === u) : _ !== 2 || (this.onEnd(u), !(b.avail_out = 0));\n }, p.prototype.onData = function(y) {\n this.chunks.push(y);\n }, p.prototype.onEnd = function(y) {\n y === u && (this.options.to === \"string\" ? this.result = this.chunks.join(\"\") : this.result = r.flattenChunks(this.chunks)), this.chunks = [], this.err = y, this.msg = this.strm.msg;\n }, i.Deflate = p, i.deflate = g, i.deflateRaw = function(y, w) {\n return (w = w || {}).raw = !0, g(y, w);\n }, i.gzip = function(y, w) {\n return (w = w || {}).gzip = !0, g(y, w);\n };\n }, { \"./utils/common\": 41, \"./utils/strings\": 42, \"./zlib/deflate\": 46, \"./zlib/messages\": 51, \"./zlib/zstream\": 53 }], 40: [function(t, n, i) {\n var s = t(\"./zlib/inflate\"), r = t(\"./utils/common\"), a = t(\"./utils/strings\"), l = t(\"./zlib/constants\"), h = t(\"./zlib/messages\"), c = t(\"./zlib/zstream\"), u = t(\"./zlib/gzheader\"), m = Object.prototype.toString;\n function f(p) {\n if (!(this instanceof f)) return new f(p);\n this.options = r.assign({ chunkSize: 16384, windowBits: 0, to: \"\" }, p || {});\n var g = this.options;\n g.raw && 0 <= g.windowBits && g.windowBits < 16 && (g.windowBits = -g.windowBits, g.windowBits === 0 && (g.windowBits = -15)), !(0 <= g.windowBits && g.windowBits < 16) || p && p.windowBits || (g.windowBits += 32), 15 < g.windowBits && g.windowBits < 48 && (15 & g.windowBits) == 0 && (g.windowBits |= 15), this.err = 0, this.msg = \"\", this.ended = !1, this.chunks = [], this.strm = new c(), this.strm.avail_out = 0;\n var y = s.inflateInit2(this.strm, g.windowBits);\n if (y !== l.Z_OK) throw new Error(h[y]);\n this.header = new u(), s.inflateGetHeader(this.strm, this.header);\n }\n function d(p, g) {\n var y = new f(g);\n if (y.push(p, !0), y.err) throw y.msg || h[y.err];\n return y.result;\n }\n f.prototype.push = function(p, g) {\n var y, w, x, _, b, E, A = this.strm, P = this.options.chunkSize, C = this.options.dictionary, D = !1;\n if (this.ended) return !1;\n w = g === ~~g ? g : g === !0 ? l.Z_FINISH : l.Z_NO_FLUSH, typeof p == \"string\" ? A.input = a.binstring2buf(p) : m.call(p) === \"[object ArrayBuffer]\" ? A.input = new Uint8Array(p) : A.input = p, A.next_in = 0, A.avail_in = A.input.length;\n do {\n if (A.avail_out === 0 && (A.output = new r.Buf8(P), A.next_out = 0, A.avail_out = P), (y = s.inflate(A, l.Z_NO_FLUSH)) === l.Z_NEED_DICT && C && (E = typeof C == \"string\" ? a.string2buf(C) : m.call(C) === \"[object ArrayBuffer]\" ? new Uint8Array(C) : C, y = s.inflateSetDictionary(this.strm, E)), y === l.Z_BUF_ERROR && D === !0 && (y = l.Z_OK, D = !1), y !== l.Z_STREAM_END && y !== l.Z_OK) return this.onEnd(y), !(this.ended = !0);\n A.next_out && (A.avail_out !== 0 && y !== l.Z_STREAM_END && (A.avail_in !== 0 || w !== l.Z_FINISH && w !== l.Z_SYNC_FLUSH) || (this.options.to === \"string\" ? (x = a.utf8border(A.output, A.next_out), _ = A.next_out - x, b = a.buf2string(A.output, x), A.next_out = _, A.avail_out = P - _, _ && r.arraySet(A.output, A.output, x, _, 0), this.onData(b)) : this.onData(r.shrinkBuf(A.output, A.next_out)))), A.avail_in === 0 && A.avail_out === 0 && (D = !0);\n } while ((0 < A.avail_in || A.avail_out === 0) && y !== l.Z_STREAM_END);\n return y === l.Z_STREAM_END && (w = l.Z_FINISH), w === l.Z_FINISH ? (y = s.inflateEnd(this.strm), this.onEnd(y), this.ended = !0, y === l.Z_OK) : w !== l.Z_SYNC_FLUSH || (this.onEnd(l.Z_OK), !(A.avail_out = 0));\n }, f.prototype.onData = function(p) {\n this.chunks.push(p);\n }, f.prototype.onEnd = function(p) {\n p === l.Z_OK && (this.options.to === \"string\" ? this.result = this.chunks.join(\"\") : this.result = r.flattenChunks(this.chunks)), this.chunks = [], this.err = p, this.msg = this.strm.msg;\n }, i.Inflate = f, i.inflate = d, i.inflateRaw = function(p, g) {\n return (g = g || {}).raw = !0, d(p, g);\n }, i.ungzip = d;\n }, { \"./utils/common\": 41, \"./utils/strings\": 42, \"./zlib/constants\": 44, \"./zlib/gzheader\": 47, \"./zlib/inflate\": 49, \"./zlib/messages\": 51, \"./zlib/zstream\": 53 }], 41: [function(t, n, i) {\n var s = typeof Uint8Array < \"u\" && typeof Uint16Array < \"u\" && typeof Int32Array < \"u\";\n i.assign = function(l) {\n for (var h = Array.prototype.slice.call(arguments, 1); h.length; ) {\n var c = h.shift();\n if (c) {\n if (typeof c != \"object\") throw new TypeError(c + \"must be non-object\");\n for (var u in c) c.hasOwnProperty(u) && (l[u] = c[u]);\n }\n }\n return l;\n }, i.shrinkBuf = function(l, h) {\n return l.length === h ? l : l.subarray ? l.subarray(0, h) : (l.length = h, l);\n };\n var r = { arraySet: function(l, h, c, u, m) {\n if (h.subarray && l.subarray) l.set(h.subarray(c, c + u), m);\n else for (var f = 0; f < u; f++) l[m + f] = h[c + f];\n }, flattenChunks: function(l) {\n var h, c, u, m, f, d;\n for (h = u = 0, c = l.length; h < c; h++) u += l[h].length;\n for (d = new Uint8Array(u), h = m = 0, c = l.length; h < c; h++) f = l[h], d.set(f, m), m += f.length;\n return d;\n } }, a = { arraySet: function(l, h, c, u, m) {\n for (var f = 0; f < u; f++) l[m + f] = h[c + f];\n }, flattenChunks: function(l) {\n return [].concat.apply([], l);\n } };\n i.setTyped = function(l) {\n l ? (i.Buf8 = Uint8Array, i.Buf16 = Uint16Array, i.Buf32 = Int32Array, i.assign(i, r)) : (i.Buf8 = Array, i.Buf16 = Array, i.Buf32 = Array, i.assign(i, a));\n }, i.setTyped(s);\n }, {}], 42: [function(t, n, i) {\n var s = t(\"./common\"), r = !0, a = !0;\n try {\n String.fromCharCode.apply(null, [0]);\n } catch {\n r = !1;\n }\n try {\n String.fromCharCode.apply(null, new Uint8Array(1));\n } catch {\n a = !1;\n }\n for (var l = new s.Buf8(256), h = 0; h < 256; h++) l[h] = 252 <= h ? 6 : 248 <= h ? 5 : 240 <= h ? 4 : 224 <= h ? 3 : 192 <= h ? 2 : 1;\n function c(u, m) {\n if (m < 65537 && (u.subarray && a || !u.subarray && r)) return String.fromCharCode.apply(null, s.shrinkBuf(u, m));\n for (var f = \"\", d = 0; d < m; d++) f += String.fromCharCode(u[d]);\n return f;\n }\n l[254] = l[254] = 1, i.string2buf = function(u) {\n var m, f, d, p, g, y = u.length, w = 0;\n for (p = 0; p < y; p++) (64512 & (f = u.charCodeAt(p))) == 55296 && p + 1 < y && (64512 & (d = u.charCodeAt(p + 1))) == 56320 && (f = 65536 + (f - 55296 << 10) + (d - 56320), p++), w += f < 128 ? 1 : f < 2048 ? 2 : f < 65536 ? 3 : 4;\n for (m = new s.Buf8(w), p = g = 0; g < w; p++) (64512 & (f = u.charCodeAt(p))) == 55296 && p + 1 < y && (64512 & (d = u.charCodeAt(p + 1))) == 56320 && (f = 65536 + (f - 55296 << 10) + (d - 56320), p++), f < 128 ? m[g++] = f : (f < 2048 ? m[g++] = 192 | f >>> 6 : (f < 65536 ? m[g++] = 224 | f >>> 12 : (m[g++] = 240 | f >>> 18, m[g++] = 128 | f >>> 12 & 63), m[g++] = 128 | f >>> 6 & 63), m[g++] = 128 | 63 & f);\n return m;\n }, i.buf2binstring = function(u) {\n return c(u, u.length);\n }, i.binstring2buf = function(u) {\n for (var m = new s.Buf8(u.length), f = 0, d = m.length; f < d; f++) m[f] = u.charCodeAt(f);\n return m;\n }, i.buf2string = function(u, m) {\n var f, d, p, g, y = m || u.length, w = new Array(2 * y);\n for (f = d = 0; f < y; ) if ((p = u[f++]) < 128) w[d++] = p;\n else if (4 < (g = l[p])) w[d++] = 65533, f += g - 1;\n else {\n for (p &= g === 2 ? 31 : g === 3 ? 15 : 7; 1 < g && f < y; ) p = p << 6 | 63 & u[f++], g--;\n 1 < g ? w[d++] = 65533 : p < 65536 ? w[d++] = p : (p -= 65536, w[d++] = 55296 | p >> 10 & 1023, w[d++] = 56320 | 1023 & p);\n }\n return c(w, d);\n }, i.utf8border = function(u, m) {\n var f;\n for ((m = m || u.length) > u.length && (m = u.length), f = m - 1; 0 <= f && (192 & u[f]) == 128; ) f--;\n return f < 0 || f === 0 ? m : f + l[u[f]] > m ? f : m;\n };\n }, { \"./common\": 41 }], 43: [function(t, n, i) {\n n.exports = function(s, r, a, l) {\n for (var h = 65535 & s | 0, c = s >>> 16 & 65535 | 0, u = 0; a !== 0; ) {\n for (a -= u = 2e3 < a ? 2e3 : a; c = c + (h = h + r[l++] | 0) | 0, --u; ) ;\n h %= 65521, c %= 65521;\n }\n return h | c << 16 | 0;\n };\n }, {}], 44: [function(t, n, i) {\n n.exports = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 };\n }, {}], 45: [function(t, n, i) {\n var s = (function() {\n for (var r, a = [], l = 0; l < 256; l++) {\n r = l;\n for (var h = 0; h < 8; h++) r = 1 & r ? 3988292384 ^ r >>> 1 : r >>> 1;\n a[l] = r;\n }\n return a;\n })();\n n.exports = function(r, a, l, h) {\n var c = s, u = h + l;\n r ^= -1;\n for (var m = h; m < u; m++) r = r >>> 8 ^ c[255 & (r ^ a[m])];\n return -1 ^ r;\n };\n }, {}], 46: [function(t, n, i) {\n var s, r = t(\"../utils/common\"), a = t(\"./trees\"), l = t(\"./adler32\"), h = t(\"./crc32\"), c = t(\"./messages\"), u = 0, m = 4, f = 0, d = -2, p = -1, g = 4, y = 2, w = 8, x = 9, _ = 286, b = 30, E = 19, A = 2 * _ + 1, P = 15, C = 3, D = 258, I = D + C + 1, T = 42, R = 113, v = 1, z = 2, H = 3, V = 4;\n function te(S, W) {\n return S.msg = c[W], W;\n }\n function G(S) {\n return (S << 1) - (4 < S ? 9 : 0);\n }\n function $(S) {\n for (var W = S.length; 0 <= --W; ) S[W] = 0;\n }\n function N(S) {\n var W = S.state, j = W.pending;\n j > S.avail_out && (j = S.avail_out), j !== 0 && (r.arraySet(S.output, W.pending_buf, W.pending_out, j, S.next_out), S.next_out += j, W.pending_out += j, S.total_out += j, S.avail_out -= j, W.pending -= j, W.pending === 0 && (W.pending_out = 0));\n }\n function O(S, W) {\n a._tr_flush_block(S, 0 <= S.block_start ? S.block_start : -1, S.strstart - S.block_start, W), S.block_start = S.strstart, N(S.strm);\n }\n function Q(S, W) {\n S.pending_buf[S.pending++] = W;\n }\n function ee(S, W) {\n S.pending_buf[S.pending++] = W >>> 8 & 255, S.pending_buf[S.pending++] = 255 & W;\n }\n function q(S, W) {\n var j, L, k = S.max_chain_length, B = S.strstart, X = S.prev_length, Z = S.nice_match, F = S.strstart > S.w_size - I ? S.strstart - (S.w_size - I) : 0, Y = S.window, ne = S.w_mask, J = S.prev, ie = S.strstart + D, ce = Y[B + X - 1], ae = Y[B + X];\n S.prev_length >= S.good_match && (k >>= 2), Z > S.lookahead && (Z = S.lookahead);\n do\n if (Y[(j = W) + X] === ae && Y[j + X - 1] === ce && Y[j] === Y[B] && Y[++j] === Y[B + 1]) {\n B += 2, j++;\n do\n ;\n while (Y[++B] === Y[++j] && Y[++B] === Y[++j] && Y[++B] === Y[++j] && Y[++B] === Y[++j] && Y[++B] === Y[++j] && Y[++B] === Y[++j] && Y[++B] === Y[++j] && Y[++B] === Y[++j] && B < ie);\n if (L = D - (ie - B), B = ie - D, X < L) {\n if (S.match_start = W, Z <= (X = L)) break;\n ce = Y[B + X - 1], ae = Y[B + X];\n }\n }\n while ((W = J[W & ne]) > F && --k != 0);\n return X <= S.lookahead ? X : S.lookahead;\n }\n function de(S) {\n var W, j, L, k, B, X, Z, F, Y, ne, J = S.w_size;\n do {\n if (k = S.window_size - S.lookahead - S.strstart, S.strstart >= J + (J - I)) {\n for (r.arraySet(S.window, S.window, J, J, 0), S.match_start -= J, S.strstart -= J, S.block_start -= J, W = j = S.hash_size; L = S.head[--W], S.head[W] = J <= L ? L - J : 0, --j; ) ;\n for (W = j = J; L = S.prev[--W], S.prev[W] = J <= L ? L - J : 0, --j; ) ;\n k += J;\n }\n if (S.strm.avail_in === 0) break;\n if (X = S.strm, Z = S.window, F = S.strstart + S.lookahead, Y = k, ne = void 0, ne = X.avail_in, Y < ne && (ne = Y), j = ne === 0 ? 0 : (X.avail_in -= ne, r.arraySet(Z, X.input, X.next_in, ne, F), X.state.wrap === 1 ? X.adler = l(X.adler, Z, ne, F) : X.state.wrap === 2 && (X.adler = h(X.adler, Z, ne, F)), X.next_in += ne, X.total_in += ne, ne), S.lookahead += j, S.lookahead + S.insert >= C) for (B = S.strstart - S.insert, S.ins_h = S.window[B], S.ins_h = (S.ins_h << S.hash_shift ^ S.window[B + 1]) & S.hash_mask; S.insert && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[B + C - 1]) & S.hash_mask, S.prev[B & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = B, B++, S.insert--, !(S.lookahead + S.insert < C)); ) ;\n } while (S.lookahead < I && S.strm.avail_in !== 0);\n }\n function pe(S, W) {\n for (var j, L; ; ) {\n if (S.lookahead < I) {\n if (de(S), S.lookahead < I && W === u) return v;\n if (S.lookahead === 0) break;\n }\n if (j = 0, S.lookahead >= C && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + C - 1]) & S.hash_mask, j = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart), j !== 0 && S.strstart - j <= S.w_size - I && (S.match_length = q(S, j)), S.match_length >= C) if (L = a._tr_tally(S, S.strstart - S.match_start, S.match_length - C), S.lookahead -= S.match_length, S.match_length <= S.max_lazy_match && S.lookahead >= C) {\n for (S.match_length--; S.strstart++, S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + C - 1]) & S.hash_mask, j = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart, --S.match_length != 0; ) ;\n S.strstart++;\n } else S.strstart += S.match_length, S.match_length = 0, S.ins_h = S.window[S.strstart], S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + 1]) & S.hash_mask;\n else L = a._tr_tally(S, 0, S.window[S.strstart]), S.lookahead--, S.strstart++;\n if (L && (O(S, !1), S.strm.avail_out === 0)) return v;\n }\n return S.insert = S.strstart < C - 1 ? S.strstart : C - 1, W === m ? (O(S, !0), S.strm.avail_out === 0 ? H : V) : S.last_lit && (O(S, !1), S.strm.avail_out === 0) ? v : z;\n }\n function se(S, W) {\n for (var j, L, k; ; ) {\n if (S.lookahead < I) {\n if (de(S), S.lookahead < I && W === u) return v;\n if (S.lookahead === 0) break;\n }\n if (j = 0, S.lookahead >= C && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + C - 1]) & S.hash_mask, j = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart), S.prev_length = S.match_length, S.prev_match = S.match_start, S.match_length = C - 1, j !== 0 && S.prev_length < S.max_lazy_match && S.strstart - j <= S.w_size - I && (S.match_length = q(S, j), S.match_length <= 5 && (S.strategy === 1 || S.match_length === C && 4096 < S.strstart - S.match_start) && (S.match_length = C - 1)), S.prev_length >= C && S.match_length <= S.prev_length) {\n for (k = S.strstart + S.lookahead - C, L = a._tr_tally(S, S.strstart - 1 - S.prev_match, S.prev_length - C), S.lookahead -= S.prev_length - 1, S.prev_length -= 2; ++S.strstart <= k && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + C - 1]) & S.hash_mask, j = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart), --S.prev_length != 0; ) ;\n if (S.match_available = 0, S.match_length = C - 1, S.strstart++, L && (O(S, !1), S.strm.avail_out === 0)) return v;\n } else if (S.match_available) {\n if ((L = a._tr_tally(S, 0, S.window[S.strstart - 1])) && O(S, !1), S.strstart++, S.lookahead--, S.strm.avail_out === 0) return v;\n } else S.match_available = 1, S.strstart++, S.lookahead--;\n }\n return S.match_available && (L = a._tr_tally(S, 0, S.window[S.strstart - 1]), S.match_available = 0), S.insert = S.strstart < C - 1 ? S.strstart : C - 1, W === m ? (O(S, !0), S.strm.avail_out === 0 ? H : V) : S.last_lit && (O(S, !1), S.strm.avail_out === 0) ? v : z;\n }\n function oe(S, W, j, L, k) {\n this.good_length = S, this.max_lazy = W, this.nice_length = j, this.max_chain = L, this.func = k;\n }\n function he() {\n this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = w, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new r.Buf16(2 * A), this.dyn_dtree = new r.Buf16(2 * (2 * b + 1)), this.bl_tree = new r.Buf16(2 * (2 * E + 1)), $(this.dyn_ltree), $(this.dyn_dtree), $(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new r.Buf16(P + 1), this.heap = new r.Buf16(2 * _ + 1), $(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new r.Buf16(2 * _ + 1), $(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;\n }\n function me(S) {\n var W;\n return S && S.state ? (S.total_in = S.total_out = 0, S.data_type = y, (W = S.state).pending = 0, W.pending_out = 0, W.wrap < 0 && (W.wrap = -W.wrap), W.status = W.wrap ? T : R, S.adler = W.wrap === 2 ? 0 : 1, W.last_flush = u, a._tr_init(W), f) : te(S, d);\n }\n function Te(S) {\n var W = me(S);\n return W === f && (function(j) {\n j.window_size = 2 * j.w_size, $(j.head), j.max_lazy_match = s[j.level].max_lazy, j.good_match = s[j.level].good_length, j.nice_match = s[j.level].nice_length, j.max_chain_length = s[j.level].max_chain, j.strstart = 0, j.block_start = 0, j.lookahead = 0, j.insert = 0, j.match_length = j.prev_length = C - 1, j.match_available = 0, j.ins_h = 0;\n })(S.state), W;\n }\n function Ie(S, W, j, L, k, B) {\n if (!S) return d;\n var X = 1;\n if (W === p && (W = 6), L < 0 ? (X = 0, L = -L) : 15 < L && (X = 2, L -= 16), k < 1 || x < k || j !== w || L < 8 || 15 < L || W < 0 || 9 < W || B < 0 || g < B) return te(S, d);\n L === 8 && (L = 9);\n var Z = new he();\n return (S.state = Z).strm = S, Z.wrap = X, Z.gzhead = null, Z.w_bits = L, Z.w_size = 1 << Z.w_bits, Z.w_mask = Z.w_size - 1, Z.hash_bits = k + 7, Z.hash_size = 1 << Z.hash_bits, Z.hash_mask = Z.hash_size - 1, Z.hash_shift = ~~((Z.hash_bits + C - 1) / C), Z.window = new r.Buf8(2 * Z.w_size), Z.head = new r.Buf16(Z.hash_size), Z.prev = new r.Buf16(Z.w_size), Z.lit_bufsize = 1 << k + 6, Z.pending_buf_size = 4 * Z.lit_bufsize, Z.pending_buf = new r.Buf8(Z.pending_buf_size), Z.d_buf = 1 * Z.lit_bufsize, Z.l_buf = 3 * Z.lit_bufsize, Z.level = W, Z.strategy = B, Z.method = j, Te(S);\n }\n s = [new oe(0, 0, 0, 0, function(S, W) {\n var j = 65535;\n for (j > S.pending_buf_size - 5 && (j = S.pending_buf_size - 5); ; ) {\n if (S.lookahead <= 1) {\n if (de(S), S.lookahead === 0 && W === u) return v;\n if (S.lookahead === 0) break;\n }\n S.strstart += S.lookahead, S.lookahead = 0;\n var L = S.block_start + j;\n if ((S.strstart === 0 || S.strstart >= L) && (S.lookahead = S.strstart - L, S.strstart = L, O(S, !1), S.strm.avail_out === 0) || S.strstart - S.block_start >= S.w_size - I && (O(S, !1), S.strm.avail_out === 0)) return v;\n }\n return S.insert = 0, W === m ? (O(S, !0), S.strm.avail_out === 0 ? H : V) : (S.strstart > S.block_start && (O(S, !1), S.strm.avail_out), v);\n }), new oe(4, 4, 8, 4, pe), new oe(4, 5, 16, 8, pe), new oe(4, 6, 32, 32, pe), new oe(4, 4, 16, 16, se), new oe(8, 16, 32, 32, se), new oe(8, 16, 128, 128, se), new oe(8, 32, 128, 256, se), new oe(32, 128, 258, 1024, se), new oe(32, 258, 258, 4096, se)], i.deflateInit = function(S, W) {\n return Ie(S, W, w, 15, 8, 0);\n }, i.deflateInit2 = Ie, i.deflateReset = Te, i.deflateResetKeep = me, i.deflateSetHeader = function(S, W) {\n return S && S.state ? S.state.wrap !== 2 ? d : (S.state.gzhead = W, f) : d;\n }, i.deflate = function(S, W) {\n var j, L, k, B;\n if (!S || !S.state || 5 < W || W < 0) return S ? te(S, d) : d;\n if (L = S.state, !S.output || !S.input && S.avail_in !== 0 || L.status === 666 && W !== m) return te(S, S.avail_out === 0 ? -5 : d);\n if (L.strm = S, j = L.last_flush, L.last_flush = W, L.status === T) if (L.wrap === 2) S.adler = 0, Q(L, 31), Q(L, 139), Q(L, 8), L.gzhead ? (Q(L, (L.gzhead.text ? 1 : 0) + (L.gzhead.hcrc ? 2 : 0) + (L.gzhead.extra ? 4 : 0) + (L.gzhead.name ? 8 : 0) + (L.gzhead.comment ? 16 : 0)), Q(L, 255 & L.gzhead.time), Q(L, L.gzhead.time >> 8 & 255), Q(L, L.gzhead.time >> 16 & 255), Q(L, L.gzhead.time >> 24 & 255), Q(L, L.level === 9 ? 2 : 2 <= L.strategy || L.level < 2 ? 4 : 0), Q(L, 255 & L.gzhead.os), L.gzhead.extra && L.gzhead.extra.length && (Q(L, 255 & L.gzhead.extra.length), Q(L, L.gzhead.extra.length >> 8 & 255)), L.gzhead.hcrc && (S.adler = h(S.adler, L.pending_buf, L.pending, 0)), L.gzindex = 0, L.status = 69) : (Q(L, 0), Q(L, 0), Q(L, 0), Q(L, 0), Q(L, 0), Q(L, L.level === 9 ? 2 : 2 <= L.strategy || L.level < 2 ? 4 : 0), Q(L, 3), L.status = R);\n else {\n var X = w + (L.w_bits - 8 << 4) << 8;\n X |= (2 <= L.strategy || L.level < 2 ? 0 : L.level < 6 ? 1 : L.level === 6 ? 2 : 3) << 6, L.strstart !== 0 && (X |= 32), X += 31 - X % 31, L.status = R, ee(L, X), L.strstart !== 0 && (ee(L, S.adler >>> 16), ee(L, 65535 & S.adler)), S.adler = 1;\n }\n if (L.status === 69) if (L.gzhead.extra) {\n for (k = L.pending; L.gzindex < (65535 & L.gzhead.extra.length) && (L.pending !== L.pending_buf_size || (L.gzhead.hcrc && L.pending > k && (S.adler = h(S.adler, L.pending_buf, L.pending - k, k)), N(S), k = L.pending, L.pending !== L.pending_buf_size)); ) Q(L, 255 & L.gzhead.extra[L.gzindex]), L.gzindex++;\n L.gzhead.hcrc && L.pending > k && (S.adler = h(S.adler, L.pending_buf, L.pending - k, k)), L.gzindex === L.gzhead.extra.length && (L.gzindex = 0, L.status = 73);\n } else L.status = 73;\n if (L.status === 73) if (L.gzhead.name) {\n k = L.pending;\n do {\n if (L.pending === L.pending_buf_size && (L.gzhead.hcrc && L.pending > k && (S.adler = h(S.adler, L.pending_buf, L.pending - k, k)), N(S), k = L.pending, L.pending === L.pending_buf_size)) {\n B = 1;\n break;\n }\n B = L.gzindex < L.gzhead.name.length ? 255 & L.gzhead.name.charCodeAt(L.gzindex++) : 0, Q(L, B);\n } while (B !== 0);\n L.gzhead.hcrc && L.pending > k && (S.adler = h(S.adler, L.pending_buf, L.pending - k, k)), B === 0 && (L.gzindex = 0, L.status = 91);\n } else L.status = 91;\n if (L.status === 91) if (L.gzhead.comment) {\n k = L.pending;\n do {\n if (L.pending === L.pending_buf_size && (L.gzhead.hcrc && L.pending > k && (S.adler = h(S.adler, L.pending_buf, L.pending - k, k)), N(S), k = L.pending, L.pending === L.pending_buf_size)) {\n B = 1;\n break;\n }\n B = L.gzindex < L.gzhead.comment.length ? 255 & L.gzhead.comment.charCodeAt(L.gzindex++) : 0, Q(L, B);\n } while (B !== 0);\n L.gzhead.hcrc && L.pending > k && (S.adler = h(S.adler, L.pending_buf, L.pending - k, k)), B === 0 && (L.status = 103);\n } else L.status = 103;\n if (L.status === 103 && (L.gzhead.hcrc ? (L.pending + 2 > L.pending_buf_size && N(S), L.pending + 2 <= L.pending_buf_size && (Q(L, 255 & S.adler), Q(L, S.adler >> 8 & 255), S.adler = 0, L.status = R)) : L.status = R), L.pending !== 0) {\n if (N(S), S.avail_out === 0) return L.last_flush = -1, f;\n } else if (S.avail_in === 0 && G(W) <= G(j) && W !== m) return te(S, -5);\n if (L.status === 666 && S.avail_in !== 0) return te(S, -5);\n if (S.avail_in !== 0 || L.lookahead !== 0 || W !== u && L.status !== 666) {\n var Z = L.strategy === 2 ? (function(F, Y) {\n for (var ne; ; ) {\n if (F.lookahead === 0 && (de(F), F.lookahead === 0)) {\n if (Y === u) return v;\n break;\n }\n if (F.match_length = 0, ne = a._tr_tally(F, 0, F.window[F.strstart]), F.lookahead--, F.strstart++, ne && (O(F, !1), F.strm.avail_out === 0)) return v;\n }\n return F.insert = 0, Y === m ? (O(F, !0), F.strm.avail_out === 0 ? H : V) : F.last_lit && (O(F, !1), F.strm.avail_out === 0) ? v : z;\n })(L, W) : L.strategy === 3 ? (function(F, Y) {\n for (var ne, J, ie, ce, ae = F.window; ; ) {\n if (F.lookahead <= D) {\n if (de(F), F.lookahead <= D && Y === u) return v;\n if (F.lookahead === 0) break;\n }\n if (F.match_length = 0, F.lookahead >= C && 0 < F.strstart && (J = ae[ie = F.strstart - 1]) === ae[++ie] && J === ae[++ie] && J === ae[++ie]) {\n ce = F.strstart + D;\n do\n ;\n while (J === ae[++ie] && J === ae[++ie] && J === ae[++ie] && J === ae[++ie] && J === ae[++ie] && J === ae[++ie] && J === ae[++ie] && J === ae[++ie] && ie < ce);\n F.match_length = D - (ce - ie), F.match_length > F.lookahead && (F.match_length = F.lookahead);\n }\n if (F.match_length >= C ? (ne = a._tr_tally(F, 1, F.match_length - C), F.lookahead -= F.match_length, F.strstart += F.match_length, F.match_length = 0) : (ne = a._tr_tally(F, 0, F.window[F.strstart]), F.lookahead--, F.strstart++), ne && (O(F, !1), F.strm.avail_out === 0)) return v;\n }\n return F.insert = 0, Y === m ? (O(F, !0), F.strm.avail_out === 0 ? H : V) : F.last_lit && (O(F, !1), F.strm.avail_out === 0) ? v : z;\n })(L, W) : s[L.level].func(L, W);\n if (Z !== H && Z !== V || (L.status = 666), Z === v || Z === H) return S.avail_out === 0 && (L.last_flush = -1), f;\n if (Z === z && (W === 1 ? a._tr_align(L) : W !== 5 && (a._tr_stored_block(L, 0, 0, !1), W === 3 && ($(L.head), L.lookahead === 0 && (L.strstart = 0, L.block_start = 0, L.insert = 0))), N(S), S.avail_out === 0)) return L.last_flush = -1, f;\n }\n return W !== m ? f : L.wrap <= 0 ? 1 : (L.wrap === 2 ? (Q(L, 255 & S.adler), Q(L, S.adler >> 8 & 255), Q(L, S.adler >> 16 & 255), Q(L, S.adler >> 24 & 255), Q(L, 255 & S.total_in), Q(L, S.total_in >> 8 & 255), Q(L, S.total_in >> 16 & 255), Q(L, S.total_in >> 24 & 255)) : (ee(L, S.adler >>> 16), ee(L, 65535 & S.adler)), N(S), 0 < L.wrap && (L.wrap = -L.wrap), L.pending !== 0 ? f : 1);\n }, i.deflateEnd = function(S) {\n var W;\n return S && S.state ? (W = S.state.status) !== T && W !== 69 && W !== 73 && W !== 91 && W !== 103 && W !== R && W !== 666 ? te(S, d) : (S.state = null, W === R ? te(S, -3) : f) : d;\n }, i.deflateSetDictionary = function(S, W) {\n var j, L, k, B, X, Z, F, Y, ne = W.length;\n if (!S || !S.state || (B = (j = S.state).wrap) === 2 || B === 1 && j.status !== T || j.lookahead) return d;\n for (B === 1 && (S.adler = l(S.adler, W, ne, 0)), j.wrap = 0, ne >= j.w_size && (B === 0 && ($(j.head), j.strstart = 0, j.block_start = 0, j.insert = 0), Y = new r.Buf8(j.w_size), r.arraySet(Y, W, ne - j.w_size, j.w_size, 0), W = Y, ne = j.w_size), X = S.avail_in, Z = S.next_in, F = S.input, S.avail_in = ne, S.next_in = 0, S.input = W, de(j); j.lookahead >= C; ) {\n for (L = j.strstart, k = j.lookahead - (C - 1); j.ins_h = (j.ins_h << j.hash_shift ^ j.window[L + C - 1]) & j.hash_mask, j.prev[L & j.w_mask] = j.head[j.ins_h], j.head[j.ins_h] = L, L++, --k; ) ;\n j.strstart = L, j.lookahead = C - 1, de(j);\n }\n return j.strstart += j.lookahead, j.block_start = j.strstart, j.insert = j.lookahead, j.lookahead = 0, j.match_length = j.prev_length = C - 1, j.match_available = 0, S.next_in = Z, S.input = F, S.avail_in = X, j.wrap = B, f;\n }, i.deflateInfo = \"pako deflate (from Nodeca project)\";\n }, { \"../utils/common\": 41, \"./adler32\": 43, \"./crc32\": 45, \"./messages\": 51, \"./trees\": 52 }], 47: [function(t, n, i) {\n n.exports = function() {\n this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = \"\", this.comment = \"\", this.hcrc = 0, this.done = !1;\n };\n }, {}], 48: [function(t, n, i) {\n n.exports = function(s, r) {\n var a, l, h, c, u, m, f, d, p, g, y, w, x, _, b, E, A, P, C, D, I, T, R, v, z;\n a = s.state, l = s.next_in, v = s.input, h = l + (s.avail_in - 5), c = s.next_out, z = s.output, u = c - (r - s.avail_out), m = c + (s.avail_out - 257), f = a.dmax, d = a.wsize, p = a.whave, g = a.wnext, y = a.window, w = a.hold, x = a.bits, _ = a.lencode, b = a.distcode, E = (1 << a.lenbits) - 1, A = (1 << a.distbits) - 1;\n e: do {\n x < 15 && (w += v[l++] << x, x += 8, w += v[l++] << x, x += 8), P = _[w & E];\n t: for (; ; ) {\n if (w >>>= C = P >>> 24, x -= C, (C = P >>> 16 & 255) === 0) z[c++] = 65535 & P;\n else {\n if (!(16 & C)) {\n if ((64 & C) == 0) {\n P = _[(65535 & P) + (w & (1 << C) - 1)];\n continue t;\n }\n if (32 & C) {\n a.mode = 12;\n break e;\n }\n s.msg = \"invalid literal/length code\", a.mode = 30;\n break e;\n }\n D = 65535 & P, (C &= 15) && (x < C && (w += v[l++] << x, x += 8), D += w & (1 << C) - 1, w >>>= C, x -= C), x < 15 && (w += v[l++] << x, x += 8, w += v[l++] << x, x += 8), P = b[w & A];\n n: for (; ; ) {\n if (w >>>= C = P >>> 24, x -= C, !(16 & (C = P >>> 16 & 255))) {\n if ((64 & C) == 0) {\n P = b[(65535 & P) + (w & (1 << C) - 1)];\n continue n;\n }\n s.msg = \"invalid distance code\", a.mode = 30;\n break e;\n }\n if (I = 65535 & P, x < (C &= 15) && (w += v[l++] << x, (x += 8) < C && (w += v[l++] << x, x += 8)), f < (I += w & (1 << C) - 1)) {\n s.msg = \"invalid distance too far back\", a.mode = 30;\n break e;\n }\n if (w >>>= C, x -= C, (C = c - u) < I) {\n if (p < (C = I - C) && a.sane) {\n s.msg = \"invalid distance too far back\", a.mode = 30;\n break e;\n }\n if (R = y, (T = 0) === g) {\n if (T += d - C, C < D) {\n for (D -= C; z[c++] = y[T++], --C; ) ;\n T = c - I, R = z;\n }\n } else if (g < C) {\n if (T += d + g - C, (C -= g) < D) {\n for (D -= C; z[c++] = y[T++], --C; ) ;\n if (T = 0, g < D) {\n for (D -= C = g; z[c++] = y[T++], --C; ) ;\n T = c - I, R = z;\n }\n }\n } else if (T += g - C, C < D) {\n for (D -= C; z[c++] = y[T++], --C; ) ;\n T = c - I, R = z;\n }\n for (; 2 < D; ) z[c++] = R[T++], z[c++] = R[T++], z[c++] = R[T++], D -= 3;\n D && (z[c++] = R[T++], 1 < D && (z[c++] = R[T++]));\n } else {\n for (T = c - I; z[c++] = z[T++], z[c++] = z[T++], z[c++] = z[T++], 2 < (D -= 3); ) ;\n D && (z[c++] = z[T++], 1 < D && (z[c++] = z[T++]));\n }\n break;\n }\n }\n break;\n }\n } while (l < h && c < m);\n l -= D = x >> 3, w &= (1 << (x -= D << 3)) - 1, s.next_in = l, s.next_out = c, s.avail_in = l < h ? h - l + 5 : 5 - (l - h), s.avail_out = c < m ? m - c + 257 : 257 - (c - m), a.hold = w, a.bits = x;\n };\n }, {}], 49: [function(t, n, i) {\n var s = t(\"../utils/common\"), r = t(\"./adler32\"), a = t(\"./crc32\"), l = t(\"./inffast\"), h = t(\"./inftrees\"), c = 1, u = 2, m = 0, f = -2, d = 1, p = 852, g = 592;\n function y(T) {\n return (T >>> 24 & 255) + (T >>> 8 & 65280) + ((65280 & T) << 8) + ((255 & T) << 24);\n }\n function w() {\n this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new s.Buf16(320), this.work = new s.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;\n }\n function x(T) {\n var R;\n return T && T.state ? (R = T.state, T.total_in = T.total_out = R.total = 0, T.msg = \"\", R.wrap && (T.adler = 1 & R.wrap), R.mode = d, R.last = 0, R.havedict = 0, R.dmax = 32768, R.head = null, R.hold = 0, R.bits = 0, R.lencode = R.lendyn = new s.Buf32(p), R.distcode = R.distdyn = new s.Buf32(g), R.sane = 1, R.back = -1, m) : f;\n }\n function _(T) {\n var R;\n return T && T.state ? ((R = T.state).wsize = 0, R.whave = 0, R.wnext = 0, x(T)) : f;\n }\n function b(T, R) {\n var v, z;\n return T && T.state ? (z = T.state, R < 0 ? (v = 0, R = -R) : (v = 1 + (R >> 4), R < 48 && (R &= 15)), R && (R < 8 || 15 < R) ? f : (z.window !== null && z.wbits !== R && (z.window = null), z.wrap = v, z.wbits = R, _(T))) : f;\n }\n function E(T, R) {\n var v, z;\n return T ? (z = new w(), (T.state = z).window = null, (v = b(T, R)) !== m && (T.state = null), v) : f;\n }\n var A, P, C = !0;\n function D(T) {\n if (C) {\n var R;\n for (A = new s.Buf32(512), P = new s.Buf32(32), R = 0; R < 144; ) T.lens[R++] = 8;\n for (; R < 256; ) T.lens[R++] = 9;\n for (; R < 280; ) T.lens[R++] = 7;\n for (; R < 288; ) T.lens[R++] = 8;\n for (h(c, T.lens, 0, 288, A, 0, T.work, { bits: 9 }), R = 0; R < 32; ) T.lens[R++] = 5;\n h(u, T.lens, 0, 32, P, 0, T.work, { bits: 5 }), C = !1;\n }\n T.lencode = A, T.lenbits = 9, T.distcode = P, T.distbits = 5;\n }\n function I(T, R, v, z) {\n var H, V = T.state;\n return V.window === null && (V.wsize = 1 << V.wbits, V.wnext = 0, V.whave = 0, V.window = new s.Buf8(V.wsize)), z >= V.wsize ? (s.arraySet(V.window, R, v - V.wsize, V.wsize, 0), V.wnext = 0, V.whave = V.wsize) : (z < (H = V.wsize - V.wnext) && (H = z), s.arraySet(V.window, R, v - z, H, V.wnext), (z -= H) ? (s.arraySet(V.window, R, v - z, z, 0), V.wnext = z, V.whave = V.wsize) : (V.wnext += H, V.wnext === V.wsize && (V.wnext = 0), V.whave < V.wsize && (V.whave += H))), 0;\n }\n i.inflateReset = _, i.inflateReset2 = b, i.inflateResetKeep = x, i.inflateInit = function(T) {\n return E(T, 15);\n }, i.inflateInit2 = E, i.inflate = function(T, R) {\n var v, z, H, V, te, G, $, N, O, Q, ee, q, de, pe, se, oe, he, me, Te, Ie, S, W, j, L, k = 0, B = new s.Buf8(4), X = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];\n if (!T || !T.state || !T.output || !T.input && T.avail_in !== 0) return f;\n (v = T.state).mode === 12 && (v.mode = 13), te = T.next_out, H = T.output, $ = T.avail_out, V = T.next_in, z = T.input, G = T.avail_in, N = v.hold, O = v.bits, Q = G, ee = $, W = m;\n e: for (; ; ) switch (v.mode) {\n case d:\n if (v.wrap === 0) {\n v.mode = 13;\n break;\n }\n for (; O < 16; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (2 & v.wrap && N === 35615) {\n B[v.check = 0] = 255 & N, B[1] = N >>> 8 & 255, v.check = a(v.check, B, 2, 0), O = N = 0, v.mode = 2;\n break;\n }\n if (v.flags = 0, v.head && (v.head.done = !1), !(1 & v.wrap) || (((255 & N) << 8) + (N >> 8)) % 31) {\n T.msg = \"incorrect header check\", v.mode = 30;\n break;\n }\n if ((15 & N) != 8) {\n T.msg = \"unknown compression method\", v.mode = 30;\n break;\n }\n if (O -= 4, S = 8 + (15 & (N >>>= 4)), v.wbits === 0) v.wbits = S;\n else if (S > v.wbits) {\n T.msg = \"invalid window size\", v.mode = 30;\n break;\n }\n v.dmax = 1 << S, T.adler = v.check = 1, v.mode = 512 & N ? 10 : 12, O = N = 0;\n break;\n case 2:\n for (; O < 16; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (v.flags = N, (255 & v.flags) != 8) {\n T.msg = \"unknown compression method\", v.mode = 30;\n break;\n }\n if (57344 & v.flags) {\n T.msg = \"unknown header flags set\", v.mode = 30;\n break;\n }\n v.head && (v.head.text = N >> 8 & 1), 512 & v.flags && (B[0] = 255 & N, B[1] = N >>> 8 & 255, v.check = a(v.check, B, 2, 0)), O = N = 0, v.mode = 3;\n case 3:\n for (; O < 32; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n v.head && (v.head.time = N), 512 & v.flags && (B[0] = 255 & N, B[1] = N >>> 8 & 255, B[2] = N >>> 16 & 255, B[3] = N >>> 24 & 255, v.check = a(v.check, B, 4, 0)), O = N = 0, v.mode = 4;\n case 4:\n for (; O < 16; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n v.head && (v.head.xflags = 255 & N, v.head.os = N >> 8), 512 & v.flags && (B[0] = 255 & N, B[1] = N >>> 8 & 255, v.check = a(v.check, B, 2, 0)), O = N = 0, v.mode = 5;\n case 5:\n if (1024 & v.flags) {\n for (; O < 16; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n v.length = N, v.head && (v.head.extra_len = N), 512 & v.flags && (B[0] = 255 & N, B[1] = N >>> 8 & 255, v.check = a(v.check, B, 2, 0)), O = N = 0;\n } else v.head && (v.head.extra = null);\n v.mode = 6;\n case 6:\n if (1024 & v.flags && (G < (q = v.length) && (q = G), q && (v.head && (S = v.head.extra_len - v.length, v.head.extra || (v.head.extra = new Array(v.head.extra_len)), s.arraySet(v.head.extra, z, V, q, S)), 512 & v.flags && (v.check = a(v.check, z, q, V)), G -= q, V += q, v.length -= q), v.length)) break e;\n v.length = 0, v.mode = 7;\n case 7:\n if (2048 & v.flags) {\n if (G === 0) break e;\n for (q = 0; S = z[V + q++], v.head && S && v.length < 65536 && (v.head.name += String.fromCharCode(S)), S && q < G; ) ;\n if (512 & v.flags && (v.check = a(v.check, z, q, V)), G -= q, V += q, S) break e;\n } else v.head && (v.head.name = null);\n v.length = 0, v.mode = 8;\n case 8:\n if (4096 & v.flags) {\n if (G === 0) break e;\n for (q = 0; S = z[V + q++], v.head && S && v.length < 65536 && (v.head.comment += String.fromCharCode(S)), S && q < G; ) ;\n if (512 & v.flags && (v.check = a(v.check, z, q, V)), G -= q, V += q, S) break e;\n } else v.head && (v.head.comment = null);\n v.mode = 9;\n case 9:\n if (512 & v.flags) {\n for (; O < 16; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (N !== (65535 & v.check)) {\n T.msg = \"header crc mismatch\", v.mode = 30;\n break;\n }\n O = N = 0;\n }\n v.head && (v.head.hcrc = v.flags >> 9 & 1, v.head.done = !0), T.adler = v.check = 0, v.mode = 12;\n break;\n case 10:\n for (; O < 32; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n T.adler = v.check = y(N), O = N = 0, v.mode = 11;\n case 11:\n if (v.havedict === 0) return T.next_out = te, T.avail_out = $, T.next_in = V, T.avail_in = G, v.hold = N, v.bits = O, 2;\n T.adler = v.check = 1, v.mode = 12;\n case 12:\n if (R === 5 || R === 6) break e;\n case 13:\n if (v.last) {\n N >>>= 7 & O, O -= 7 & O, v.mode = 27;\n break;\n }\n for (; O < 3; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n switch (v.last = 1 & N, O -= 1, 3 & (N >>>= 1)) {\n case 0:\n v.mode = 14;\n break;\n case 1:\n if (D(v), v.mode = 20, R !== 6) break;\n N >>>= 2, O -= 2;\n break e;\n case 2:\n v.mode = 17;\n break;\n case 3:\n T.msg = \"invalid block type\", v.mode = 30;\n }\n N >>>= 2, O -= 2;\n break;\n case 14:\n for (N >>>= 7 & O, O -= 7 & O; O < 32; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if ((65535 & N) != (N >>> 16 ^ 65535)) {\n T.msg = \"invalid stored block lengths\", v.mode = 30;\n break;\n }\n if (v.length = 65535 & N, O = N = 0, v.mode = 15, R === 6) break e;\n case 15:\n v.mode = 16;\n case 16:\n if (q = v.length) {\n if (G < q && (q = G), $ < q && (q = $), q === 0) break e;\n s.arraySet(H, z, V, q, te), G -= q, V += q, $ -= q, te += q, v.length -= q;\n break;\n }\n v.mode = 12;\n break;\n case 17:\n for (; O < 14; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (v.nlen = 257 + (31 & N), N >>>= 5, O -= 5, v.ndist = 1 + (31 & N), N >>>= 5, O -= 5, v.ncode = 4 + (15 & N), N >>>= 4, O -= 4, 286 < v.nlen || 30 < v.ndist) {\n T.msg = \"too many length or distance symbols\", v.mode = 30;\n break;\n }\n v.have = 0, v.mode = 18;\n case 18:\n for (; v.have < v.ncode; ) {\n for (; O < 3; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n v.lens[X[v.have++]] = 7 & N, N >>>= 3, O -= 3;\n }\n for (; v.have < 19; ) v.lens[X[v.have++]] = 0;\n if (v.lencode = v.lendyn, v.lenbits = 7, j = { bits: v.lenbits }, W = h(0, v.lens, 0, 19, v.lencode, 0, v.work, j), v.lenbits = j.bits, W) {\n T.msg = \"invalid code lengths set\", v.mode = 30;\n break;\n }\n v.have = 0, v.mode = 19;\n case 19:\n for (; v.have < v.nlen + v.ndist; ) {\n for (; oe = (k = v.lencode[N & (1 << v.lenbits) - 1]) >>> 16 & 255, he = 65535 & k, !((se = k >>> 24) <= O); ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (he < 16) N >>>= se, O -= se, v.lens[v.have++] = he;\n else {\n if (he === 16) {\n for (L = se + 2; O < L; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (N >>>= se, O -= se, v.have === 0) {\n T.msg = \"invalid bit length repeat\", v.mode = 30;\n break;\n }\n S = v.lens[v.have - 1], q = 3 + (3 & N), N >>>= 2, O -= 2;\n } else if (he === 17) {\n for (L = se + 3; O < L; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n O -= se, S = 0, q = 3 + (7 & (N >>>= se)), N >>>= 3, O -= 3;\n } else {\n for (L = se + 7; O < L; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n O -= se, S = 0, q = 11 + (127 & (N >>>= se)), N >>>= 7, O -= 7;\n }\n if (v.have + q > v.nlen + v.ndist) {\n T.msg = \"invalid bit length repeat\", v.mode = 30;\n break;\n }\n for (; q--; ) v.lens[v.have++] = S;\n }\n }\n if (v.mode === 30) break;\n if (v.lens[256] === 0) {\n T.msg = \"invalid code -- missing end-of-block\", v.mode = 30;\n break;\n }\n if (v.lenbits = 9, j = { bits: v.lenbits }, W = h(c, v.lens, 0, v.nlen, v.lencode, 0, v.work, j), v.lenbits = j.bits, W) {\n T.msg = \"invalid literal/lengths set\", v.mode = 30;\n break;\n }\n if (v.distbits = 6, v.distcode = v.distdyn, j = { bits: v.distbits }, W = h(u, v.lens, v.nlen, v.ndist, v.distcode, 0, v.work, j), v.distbits = j.bits, W) {\n T.msg = \"invalid distances set\", v.mode = 30;\n break;\n }\n if (v.mode = 20, R === 6) break e;\n case 20:\n v.mode = 21;\n case 21:\n if (6 <= G && 258 <= $) {\n T.next_out = te, T.avail_out = $, T.next_in = V, T.avail_in = G, v.hold = N, v.bits = O, l(T, ee), te = T.next_out, H = T.output, $ = T.avail_out, V = T.next_in, z = T.input, G = T.avail_in, N = v.hold, O = v.bits, v.mode === 12 && (v.back = -1);\n break;\n }\n for (v.back = 0; oe = (k = v.lencode[N & (1 << v.lenbits) - 1]) >>> 16 & 255, he = 65535 & k, !((se = k >>> 24) <= O); ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (oe && (240 & oe) == 0) {\n for (me = se, Te = oe, Ie = he; oe = (k = v.lencode[Ie + ((N & (1 << me + Te) - 1) >> me)]) >>> 16 & 255, he = 65535 & k, !(me + (se = k >>> 24) <= O); ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n N >>>= me, O -= me, v.back += me;\n }\n if (N >>>= se, O -= se, v.back += se, v.length = he, oe === 0) {\n v.mode = 26;\n break;\n }\n if (32 & oe) {\n v.back = -1, v.mode = 12;\n break;\n }\n if (64 & oe) {\n T.msg = \"invalid literal/length code\", v.mode = 30;\n break;\n }\n v.extra = 15 & oe, v.mode = 22;\n case 22:\n if (v.extra) {\n for (L = v.extra; O < L; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n v.length += N & (1 << v.extra) - 1, N >>>= v.extra, O -= v.extra, v.back += v.extra;\n }\n v.was = v.length, v.mode = 23;\n case 23:\n for (; oe = (k = v.distcode[N & (1 << v.distbits) - 1]) >>> 16 & 255, he = 65535 & k, !((se = k >>> 24) <= O); ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if ((240 & oe) == 0) {\n for (me = se, Te = oe, Ie = he; oe = (k = v.distcode[Ie + ((N & (1 << me + Te) - 1) >> me)]) >>> 16 & 255, he = 65535 & k, !(me + (se = k >>> 24) <= O); ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n N >>>= me, O -= me, v.back += me;\n }\n if (N >>>= se, O -= se, v.back += se, 64 & oe) {\n T.msg = \"invalid distance code\", v.mode = 30;\n break;\n }\n v.offset = he, v.extra = 15 & oe, v.mode = 24;\n case 24:\n if (v.extra) {\n for (L = v.extra; O < L; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n v.offset += N & (1 << v.extra) - 1, N >>>= v.extra, O -= v.extra, v.back += v.extra;\n }\n if (v.offset > v.dmax) {\n T.msg = \"invalid distance too far back\", v.mode = 30;\n break;\n }\n v.mode = 25;\n case 25:\n if ($ === 0) break e;\n if (q = ee - $, v.offset > q) {\n if ((q = v.offset - q) > v.whave && v.sane) {\n T.msg = \"invalid distance too far back\", v.mode = 30;\n break;\n }\n de = q > v.wnext ? (q -= v.wnext, v.wsize - q) : v.wnext - q, q > v.length && (q = v.length), pe = v.window;\n } else pe = H, de = te - v.offset, q = v.length;\n for ($ < q && (q = $), $ -= q, v.length -= q; H[te++] = pe[de++], --q; ) ;\n v.length === 0 && (v.mode = 21);\n break;\n case 26:\n if ($ === 0) break e;\n H[te++] = v.length, $--, v.mode = 21;\n break;\n case 27:\n if (v.wrap) {\n for (; O < 32; ) {\n if (G === 0) break e;\n G--, N |= z[V++] << O, O += 8;\n }\n if (ee -= $, T.total_out += ee, v.total += ee, ee && (T.adler = v.check = v.flags ? a(v.check, H, ee, te - ee) : r(v.check, H, ee, te - ee)), ee = $, (v.flags ? N : y(N)) !== v.check) {\n T.msg = \"incorrect data check\", v.mode = 30;\n break;\n }\n O = N = 0;\n }\n v.mode = 28;\n case 28:\n if (v.wrap && v.flags) {\n for (; O < 32; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (N !== (4294967295 & v.total)) {\n T.msg = \"incorrect length check\", v.mode = 30;\n break;\n }\n O = N = 0;\n }\n v.mode = 29;\n case 29:\n W = 1;\n break e;\n case 30:\n W = -3;\n break e;\n case 31:\n return -4;\n case 32:\n default:\n return f;\n }\n return T.next_out = te, T.avail_out = $, T.next_in = V, T.avail_in = G, v.hold = N, v.bits = O, (v.wsize || ee !== T.avail_out && v.mode < 30 && (v.mode < 27 || R !== 4)) && I(T, T.output, T.next_out, ee - T.avail_out) ? (v.mode = 31, -4) : (Q -= T.avail_in, ee -= T.avail_out, T.total_in += Q, T.total_out += ee, v.total += ee, v.wrap && ee && (T.adler = v.check = v.flags ? a(v.check, H, ee, T.next_out - ee) : r(v.check, H, ee, T.next_out - ee)), T.data_type = v.bits + (v.last ? 64 : 0) + (v.mode === 12 ? 128 : 0) + (v.mode === 20 || v.mode === 15 ? 256 : 0), (Q == 0 && ee === 0 || R === 4) && W === m && (W = -5), W);\n }, i.inflateEnd = function(T) {\n if (!T || !T.state) return f;\n var R = T.state;\n return R.window && (R.window = null), T.state = null, m;\n }, i.inflateGetHeader = function(T, R) {\n var v;\n return T && T.state ? (2 & (v = T.state).wrap) == 0 ? f : ((v.head = R).done = !1, m) : f;\n }, i.inflateSetDictionary = function(T, R) {\n var v, z = R.length;\n return T && T.state ? (v = T.state).wrap !== 0 && v.mode !== 11 ? f : v.mode === 11 && r(1, R, z, 0) !== v.check ? -3 : I(T, R, z, z) ? (v.mode = 31, -4) : (v.havedict = 1, m) : f;\n }, i.inflateInfo = \"pako inflate (from Nodeca project)\";\n }, { \"../utils/common\": 41, \"./adler32\": 43, \"./crc32\": 45, \"./inffast\": 48, \"./inftrees\": 50 }], 50: [function(t, n, i) {\n var s = t(\"../utils/common\"), r = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], a = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], l = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], h = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];\n n.exports = function(c, u, m, f, d, p, g, y) {\n var w, x, _, b, E, A, P, C, D, I = y.bits, T = 0, R = 0, v = 0, z = 0, H = 0, V = 0, te = 0, G = 0, $ = 0, N = 0, O = null, Q = 0, ee = new s.Buf16(16), q = new s.Buf16(16), de = null, pe = 0;\n for (T = 0; T <= 15; T++) ee[T] = 0;\n for (R = 0; R < f; R++) ee[u[m + R]]++;\n for (H = I, z = 15; 1 <= z && ee[z] === 0; z--) ;\n if (z < H && (H = z), z === 0) return d[p++] = 20971520, d[p++] = 20971520, y.bits = 1, 0;\n for (v = 1; v < z && ee[v] === 0; v++) ;\n for (H < v && (H = v), T = G = 1; T <= 15; T++) if (G <<= 1, (G -= ee[T]) < 0) return -1;\n if (0 < G && (c === 0 || z !== 1)) return -1;\n for (q[1] = 0, T = 1; T < 15; T++) q[T + 1] = q[T] + ee[T];\n for (R = 0; R < f; R++) u[m + R] !== 0 && (g[q[u[m + R]]++] = R);\n if (A = c === 0 ? (O = de = g, 19) : c === 1 ? (O = r, Q -= 257, de = a, pe -= 257, 256) : (O = l, de = h, -1), T = v, E = p, te = R = N = 0, _ = -1, b = ($ = 1 << (V = H)) - 1, c === 1 && 852 < $ || c === 2 && 592 < $) return 1;\n for (; ; ) {\n for (P = T - te, D = g[R] < A ? (C = 0, g[R]) : g[R] > A ? (C = de[pe + g[R]], O[Q + g[R]]) : (C = 96, 0), w = 1 << T - te, v = x = 1 << V; d[E + (N >> te) + (x -= w)] = P << 24 | C << 16 | D | 0, x !== 0; ) ;\n for (w = 1 << T - 1; N & w; ) w >>= 1;\n if (w !== 0 ? (N &= w - 1, N += w) : N = 0, R++, --ee[T] == 0) {\n if (T === z) break;\n T = u[m + g[R]];\n }\n if (H < T && (N & b) !== _) {\n for (te === 0 && (te = H), E += v, G = 1 << (V = T - te); V + te < z && !((G -= ee[V + te]) <= 0); ) V++, G <<= 1;\n if ($ += 1 << V, c === 1 && 852 < $ || c === 2 && 592 < $) return 1;\n d[_ = N & b] = H << 24 | V << 16 | E - p | 0;\n }\n }\n return N !== 0 && (d[E + N] = T - te << 24 | 64 << 16 | 0), y.bits = H, 0;\n };\n }, { \"../utils/common\": 41 }], 51: [function(t, n, i) {\n n.exports = { 2: \"need dictionary\", 1: \"stream end\", 0: \"\", \"-1\": \"file error\", \"-2\": \"stream error\", \"-3\": \"data error\", \"-4\": \"insufficient memory\", \"-5\": \"buffer error\", \"-6\": \"incompatible version\" };\n }, {}], 52: [function(t, n, i) {\n var s = t(\"../utils/common\"), r = 0, a = 1;\n function l(k) {\n for (var B = k.length; 0 <= --B; ) k[B] = 0;\n }\n var h = 0, c = 29, u = 256, m = u + 1 + c, f = 30, d = 19, p = 2 * m + 1, g = 15, y = 16, w = 7, x = 256, _ = 16, b = 17, E = 18, A = [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], P = [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], C = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], D = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], I = new Array(2 * (m + 2));\n l(I);\n var T = new Array(2 * f);\n l(T);\n var R = new Array(512);\n l(R);\n var v = new Array(256);\n l(v);\n var z = new Array(c);\n l(z);\n var H, V, te, G = new Array(f);\n function $(k, B, X, Z, F) {\n this.static_tree = k, this.extra_bits = B, this.extra_base = X, this.elems = Z, this.max_length = F, this.has_stree = k && k.length;\n }\n function N(k, B) {\n this.dyn_tree = k, this.max_code = 0, this.stat_desc = B;\n }\n function O(k) {\n return k < 256 ? R[k] : R[256 + (k >>> 7)];\n }\n function Q(k, B) {\n k.pending_buf[k.pending++] = 255 & B, k.pending_buf[k.pending++] = B >>> 8 & 255;\n }\n function ee(k, B, X) {\n k.bi_valid > y - X ? (k.bi_buf |= B << k.bi_valid & 65535, Q(k, k.bi_buf), k.bi_buf = B >> y - k.bi_valid, k.bi_valid += X - y) : (k.bi_buf |= B << k.bi_valid & 65535, k.bi_valid += X);\n }\n function q(k, B, X) {\n ee(k, X[2 * B], X[2 * B + 1]);\n }\n function de(k, B) {\n for (var X = 0; X |= 1 & k, k >>>= 1, X <<= 1, 0 < --B; ) ;\n return X >>> 1;\n }\n function pe(k, B, X) {\n var Z, F, Y = new Array(g + 1), ne = 0;\n for (Z = 1; Z <= g; Z++) Y[Z] = ne = ne + X[Z - 1] << 1;\n for (F = 0; F <= B; F++) {\n var J = k[2 * F + 1];\n J !== 0 && (k[2 * F] = de(Y[J]++, J));\n }\n }\n function se(k) {\n var B;\n for (B = 0; B < m; B++) k.dyn_ltree[2 * B] = 0;\n for (B = 0; B < f; B++) k.dyn_dtree[2 * B] = 0;\n for (B = 0; B < d; B++) k.bl_tree[2 * B] = 0;\n k.dyn_ltree[2 * x] = 1, k.opt_len = k.static_len = 0, k.last_lit = k.matches = 0;\n }\n function oe(k) {\n 8 < k.bi_valid ? Q(k, k.bi_buf) : 0 < k.bi_valid && (k.pending_buf[k.pending++] = k.bi_buf), k.bi_buf = 0, k.bi_valid = 0;\n }\n function he(k, B, X, Z) {\n var F = 2 * B, Y = 2 * X;\n return k[F] < k[Y] || k[F] === k[Y] && Z[B] <= Z[X];\n }\n function me(k, B, X) {\n for (var Z = k.heap[X], F = X << 1; F <= k.heap_len && (F < k.heap_len && he(B, k.heap[F + 1], k.heap[F], k.depth) && F++, !he(B, Z, k.heap[F], k.depth)); ) k.heap[X] = k.heap[F], X = F, F <<= 1;\n k.heap[X] = Z;\n }\n function Te(k, B, X) {\n var Z, F, Y, ne, J = 0;\n if (k.last_lit !== 0) for (; Z = k.pending_buf[k.d_buf + 2 * J] << 8 | k.pending_buf[k.d_buf + 2 * J + 1], F = k.pending_buf[k.l_buf + J], J++, Z === 0 ? q(k, F, B) : (q(k, (Y = v[F]) + u + 1, B), (ne = A[Y]) !== 0 && ee(k, F -= z[Y], ne), q(k, Y = O(--Z), X), (ne = P[Y]) !== 0 && ee(k, Z -= G[Y], ne)), J < k.last_lit; ) ;\n q(k, x, B);\n }\n function Ie(k, B) {\n var X, Z, F, Y = B.dyn_tree, ne = B.stat_desc.static_tree, J = B.stat_desc.has_stree, ie = B.stat_desc.elems, ce = -1;\n for (k.heap_len = 0, k.heap_max = p, X = 0; X < ie; X++) Y[2 * X] !== 0 ? (k.heap[++k.heap_len] = ce = X, k.depth[X] = 0) : Y[2 * X + 1] = 0;\n for (; k.heap_len < 2; ) Y[2 * (F = k.heap[++k.heap_len] = ce < 2 ? ++ce : 0)] = 1, k.depth[F] = 0, k.opt_len--, J && (k.static_len -= ne[2 * F + 1]);\n for (B.max_code = ce, X = k.heap_len >> 1; 1 <= X; X--) me(k, Y, X);\n for (F = ie; X = k.heap[1], k.heap[1] = k.heap[k.heap_len--], me(k, Y, 1), Z = k.heap[1], k.heap[--k.heap_max] = X, k.heap[--k.heap_max] = Z, Y[2 * F] = Y[2 * X] + Y[2 * Z], k.depth[F] = (k.depth[X] >= k.depth[Z] ? k.depth[X] : k.depth[Z]) + 1, Y[2 * X + 1] = Y[2 * Z + 1] = F, k.heap[1] = F++, me(k, Y, 1), 2 <= k.heap_len; ) ;\n k.heap[--k.heap_max] = k.heap[1], (function(ae, Ee) {\n var Je, De, Bt, ye, sn, Mn, Qe = Ee.dyn_tree, Tt = Ee.max_code, Nt = Ee.stat_desc.static_tree, Ft = Ee.stat_desc.has_stree, Ut = Ee.stat_desc.extra_bits, Et = Ee.stat_desc.extra_base, Sn = Ee.stat_desc.max_length, Zn = 0;\n for (ye = 0; ye <= g; ye++) ae.bl_count[ye] = 0;\n for (Qe[2 * ae.heap[ae.heap_max] + 1] = 0, Je = ae.heap_max + 1; Je < p; Je++) Sn < (ye = Qe[2 * Qe[2 * (De = ae.heap[Je]) + 1] + 1] + 1) && (ye = Sn, Zn++), Qe[2 * De + 1] = ye, Tt < De || (ae.bl_count[ye]++, sn = 0, Et <= De && (sn = Ut[De - Et]), Mn = Qe[2 * De], ae.opt_len += Mn * (ye + sn), Ft && (ae.static_len += Mn * (Nt[2 * De + 1] + sn)));\n if (Zn !== 0) {\n do {\n for (ye = Sn - 1; ae.bl_count[ye] === 0; ) ye--;\n ae.bl_count[ye]--, ae.bl_count[ye + 1] += 2, ae.bl_count[Sn]--, Zn -= 2;\n } while (0 < Zn);\n for (ye = Sn; ye !== 0; ye--) for (De = ae.bl_count[ye]; De !== 0; ) Tt < (Bt = ae.heap[--Je]) || (Qe[2 * Bt + 1] !== ye && (ae.opt_len += (ye - Qe[2 * Bt + 1]) * Qe[2 * Bt], Qe[2 * Bt + 1] = ye), De--);\n }\n })(k, B), pe(Y, ce, k.bl_count);\n }\n function S(k, B, X) {\n var Z, F, Y = -1, ne = B[1], J = 0, ie = 7, ce = 4;\n for (ne === 0 && (ie = 138, ce = 3), B[2 * (X + 1) + 1] = 65535, Z = 0; Z <= X; Z++) F = ne, ne = B[2 * (Z + 1) + 1], ++J < ie && F === ne || (J < ce ? k.bl_tree[2 * F] += J : F !== 0 ? (F !== Y && k.bl_tree[2 * F]++, k.bl_tree[2 * _]++) : J <= 10 ? k.bl_tree[2 * b]++ : k.bl_tree[2 * E]++, Y = F, ce = (J = 0) === ne ? (ie = 138, 3) : F === ne ? (ie = 6, 3) : (ie = 7, 4));\n }\n function W(k, B, X) {\n var Z, F, Y = -1, ne = B[1], J = 0, ie = 7, ce = 4;\n for (ne === 0 && (ie = 138, ce = 3), Z = 0; Z <= X; Z++) if (F = ne, ne = B[2 * (Z + 1) + 1], !(++J < ie && F === ne)) {\n if (J < ce) for (; q(k, F, k.bl_tree), --J != 0; ) ;\n else F !== 0 ? (F !== Y && (q(k, F, k.bl_tree), J--), q(k, _, k.bl_tree), ee(k, J - 3, 2)) : J <= 10 ? (q(k, b, k.bl_tree), ee(k, J - 3, 3)) : (q(k, E, k.bl_tree), ee(k, J - 11, 7));\n Y = F, ce = (J = 0) === ne ? (ie = 138, 3) : F === ne ? (ie = 6, 3) : (ie = 7, 4);\n }\n }\n l(G);\n var j = !1;\n function L(k, B, X, Z) {\n ee(k, (h << 1) + (Z ? 1 : 0), 3), (function(F, Y, ne, J) {\n oe(F), Q(F, ne), Q(F, ~ne), s.arraySet(F.pending_buf, F.window, Y, ne, F.pending), F.pending += ne;\n })(k, B, X);\n }\n i._tr_init = function(k) {\n j || ((function() {\n var B, X, Z, F, Y, ne = new Array(g + 1);\n for (F = Z = 0; F < c - 1; F++) for (z[F] = Z, B = 0; B < 1 << A[F]; B++) v[Z++] = F;\n for (v[Z - 1] = F, F = Y = 0; F < 16; F++) for (G[F] = Y, B = 0; B < 1 << P[F]; B++) R[Y++] = F;\n for (Y >>= 7; F < f; F++) for (G[F] = Y << 7, B = 0; B < 1 << P[F] - 7; B++) R[256 + Y++] = F;\n for (X = 0; X <= g; X++) ne[X] = 0;\n for (B = 0; B <= 143; ) I[2 * B + 1] = 8, B++, ne[8]++;\n for (; B <= 255; ) I[2 * B + 1] = 9, B++, ne[9]++;\n for (; B <= 279; ) I[2 * B + 1] = 7, B++, ne[7]++;\n for (; B <= 287; ) I[2 * B + 1] = 8, B++, ne[8]++;\n for (pe(I, m + 1, ne), B = 0; B < f; B++) T[2 * B + 1] = 5, T[2 * B] = de(B, 5);\n H = new $(I, A, u + 1, m, g), V = new $(T, P, 0, f, g), te = new $(new Array(0), C, 0, d, w);\n })(), j = !0), k.l_desc = new N(k.dyn_ltree, H), k.d_desc = new N(k.dyn_dtree, V), k.bl_desc = new N(k.bl_tree, te), k.bi_buf = 0, k.bi_valid = 0, se(k);\n }, i._tr_stored_block = L, i._tr_flush_block = function(k, B, X, Z) {\n var F, Y, ne = 0;\n 0 < k.level ? (k.strm.data_type === 2 && (k.strm.data_type = (function(J) {\n var ie, ce = 4093624447;\n for (ie = 0; ie <= 31; ie++, ce >>>= 1) if (1 & ce && J.dyn_ltree[2 * ie] !== 0) return r;\n if (J.dyn_ltree[18] !== 0 || J.dyn_ltree[20] !== 0 || J.dyn_ltree[26] !== 0) return a;\n for (ie = 32; ie < u; ie++) if (J.dyn_ltree[2 * ie] !== 0) return a;\n return r;\n })(k)), Ie(k, k.l_desc), Ie(k, k.d_desc), ne = (function(J) {\n var ie;\n for (S(J, J.dyn_ltree, J.l_desc.max_code), S(J, J.dyn_dtree, J.d_desc.max_code), Ie(J, J.bl_desc), ie = d - 1; 3 <= ie && J.bl_tree[2 * D[ie] + 1] === 0; ie--) ;\n return J.opt_len += 3 * (ie + 1) + 5 + 5 + 4, ie;\n })(k), F = k.opt_len + 3 + 7 >>> 3, (Y = k.static_len + 3 + 7 >>> 3) <= F && (F = Y)) : F = Y = X + 5, X + 4 <= F && B !== -1 ? L(k, B, X, Z) : k.strategy === 4 || Y === F ? (ee(k, 2 + (Z ? 1 : 0), 3), Te(k, I, T)) : (ee(k, 4 + (Z ? 1 : 0), 3), (function(J, ie, ce, ae) {\n var Ee;\n for (ee(J, ie - 257, 5), ee(J, ce - 1, 5), ee(J, ae - 4, 4), Ee = 0; Ee < ae; Ee++) ee(J, J.bl_tree[2 * D[Ee] + 1], 3);\n W(J, J.dyn_ltree, ie - 1), W(J, J.dyn_dtree, ce - 1);\n })(k, k.l_desc.max_code + 1, k.d_desc.max_code + 1, ne + 1), Te(k, k.dyn_ltree, k.dyn_dtree)), se(k), Z && oe(k);\n }, i._tr_tally = function(k, B, X) {\n return k.pending_buf[k.d_buf + 2 * k.last_lit] = B >>> 8 & 255, k.pending_buf[k.d_buf + 2 * k.last_lit + 1] = 255 & B, k.pending_buf[k.l_buf + k.last_lit] = 255 & X, k.last_lit++, B === 0 ? k.dyn_ltree[2 * X]++ : (k.matches++, B--, k.dyn_ltree[2 * (v[X] + u + 1)]++, k.dyn_dtree[2 * O(B)]++), k.last_lit === k.lit_bufsize - 1;\n }, i._tr_align = function(k) {\n ee(k, 2, 3), q(k, x, I), (function(B) {\n B.bi_valid === 16 ? (Q(B, B.bi_buf), B.bi_buf = 0, B.bi_valid = 0) : 8 <= B.bi_valid && (B.pending_buf[B.pending++] = 255 & B.bi_buf, B.bi_buf >>= 8, B.bi_valid -= 8);\n })(k);\n };\n }, { \"../utils/common\": 41 }], 53: [function(t, n, i) {\n n.exports = function() {\n this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = \"\", this.state = null, this.data_type = 2, this.adler = 0;\n };\n }, {}], 54: [function(t, n, i) {\n (function(s) {\n (function(r, a) {\n if (!r.setImmediate) {\n var l, h, c, u, m = 1, f = {}, d = !1, p = r.document, g = Object.getPrototypeOf && Object.getPrototypeOf(r);\n g = g && g.setTimeout ? g : r, l = {}.toString.call(r.process) === \"[object process]\" ? function(_) {\n process.nextTick(function() {\n w(_);\n });\n } : (function() {\n if (r.postMessage && !r.importScripts) {\n var _ = !0, b = r.onmessage;\n return r.onmessage = function() {\n _ = !1;\n }, r.postMessage(\"\", \"*\"), r.onmessage = b, _;\n }\n })() ? (u = \"setImmediate$\" + Math.random() + \"$\", r.addEventListener ? r.addEventListener(\"message\", x, !1) : r.attachEvent(\"onmessage\", x), function(_) {\n r.postMessage(u + _, \"*\");\n }) : r.MessageChannel ? ((c = new MessageChannel()).port1.onmessage = function(_) {\n w(_.data);\n }, function(_) {\n c.port2.postMessage(_);\n }) : p && \"onreadystatechange\" in p.createElement(\"script\") ? (h = p.documentElement, function(_) {\n var b = p.createElement(\"script\");\n b.onreadystatechange = function() {\n w(_), b.onreadystatechange = null, h.removeChild(b), b = null;\n }, h.appendChild(b);\n }) : function(_) {\n setTimeout(w, 0, _);\n }, g.setImmediate = function(_) {\n typeof _ != \"function\" && (_ = new Function(\"\" + _));\n for (var b = new Array(arguments.length - 1), E = 0; E < b.length; E++) b[E] = arguments[E + 1];\n var A = { callback: _, args: b };\n return f[m] = A, l(m), m++;\n }, g.clearImmediate = y;\n }\n function y(_) {\n delete f[_];\n }\n function w(_) {\n if (d) setTimeout(w, 0, _);\n else {\n var b = f[_];\n if (b) {\n d = !0;\n try {\n (function(E) {\n var A = E.callback, P = E.args;\n switch (P.length) {\n case 0:\n A();\n break;\n case 1:\n A(P[0]);\n break;\n case 2:\n A(P[0], P[1]);\n break;\n case 3:\n A(P[0], P[1], P[2]);\n break;\n default:\n A.apply(a, P);\n }\n })(b);\n } finally {\n y(_), d = !1;\n }\n }\n }\n }\n function x(_) {\n _.source === r && typeof _.data == \"string\" && _.data.indexOf(u) === 0 && w(+_.data.slice(u.length));\n }\n })(typeof self > \"u\" ? s === void 0 ? this : s : self);\n }).call(this, typeof ii < \"u\" ? ii : typeof self < \"u\" ? self : typeof window < \"u\" ? window : {});\n }, {}] }, {}, [10])(10);\n });\n })(os)), os.exports;\n}\nvar xc = wc();\nconst oa = /* @__PURE__ */ ra(xc);\nfunction aa(o, e) {\n return function() {\n return o.apply(e, arguments);\n };\n}\nconst { toString: _c } = Object.prototype, { getPrototypeOf: ur } = Object, { iterator: Ki, toStringTag: la } = Symbol, $i = /* @__PURE__ */ ((o) => (e) => {\n const t = _c.call(e);\n return o[t] || (o[t] = t.slice(8, -1).toLowerCase());\n})(/* @__PURE__ */ Object.create(null)), at = (o) => (o = o.toLowerCase(), (e) => $i(e) === o), Ji = (o) => (e) => typeof e === o, { isArray: vn } = Array, _n = Ji(\"undefined\");\nfunction jn(o) {\n return o !== null && !_n(o) && o.constructor !== null && !_n(o.constructor) && Ve(o.constructor.isBuffer) && o.constructor.isBuffer(o);\n}\nconst ca = at(\"ArrayBuffer\");\nfunction vc(o) {\n let e;\n return typeof ArrayBuffer < \"u\" && ArrayBuffer.isView ? e = ArrayBuffer.isView(o) : e = o && o.buffer && ca(o.buffer), e;\n}\nconst bc = Ji(\"string\"), Ve = Ji(\"function\"), ha = Ji(\"number\"), Gn = (o) => o !== null && typeof o == \"object\", Mc = (o) => o === !0 || o === !1, Ri = (o) => {\n if ($i(o) !== \"object\")\n return !1;\n const e = ur(o);\n return (e === null || e === Object.prototype || Object.getPrototypeOf(e) === null) && !(la in o) && !(Ki in o);\n}, Sc = (o) => {\n if (!Gn(o) || jn(o))\n return !1;\n try {\n return Object.keys(o).length === 0 && Object.getPrototypeOf(o) === Object.prototype;\n } catch {\n return !1;\n }\n}, Tc = at(\"Date\"), Ec = at(\"File\"), Ac = at(\"Blob\"), Cc = at(\"FileList\"), Pc = (o) => Gn(o) && Ve(o.pipe), Rc = (o) => {\n let e;\n return o && (typeof FormData == \"function\" && o instanceof FormData || Ve(o.append) && ((e = $i(o)) === \"formdata\" || // detect form-data instance\n e === \"object\" && Ve(o.toString) && o.toString() === \"[object FormData]\"));\n}, Dc = at(\"URLSearchParams\"), [kc, Ic, Lc, zc] = [\"ReadableStream\", \"Request\", \"Response\", \"Headers\"].map(at), Oc = (o) => o.trim ? o.trim() : o.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\");\nfunction Wn(o, e, { allOwnKeys: t = !1 } = {}) {\n if (o === null || typeof o > \"u\")\n return;\n let n, i;\n if (typeof o != \"object\" && (o = [o]), vn(o))\n for (n = 0, i = o.length; n < i; n++)\n e.call(null, o[n], n, o);\n else {\n if (jn(o))\n return;\n const s = t ? Object.getOwnPropertyNames(o) : Object.keys(o), r = s.length;\n let a;\n for (n = 0; n < r; n++)\n a = s[n], e.call(null, o[a], a, o);\n }\n}\nfunction ua(o, e) {\n if (jn(o))\n return null;\n e = e.toLowerCase();\n const t = Object.keys(o);\n let n = t.length, i;\n for (; n-- > 0; )\n if (i = t[n], e === i.toLowerCase())\n return i;\n return null;\n}\nconst Yt = typeof globalThis < \"u\" ? globalThis : typeof self < \"u\" ? self : typeof window < \"u\" ? window : global, da = (o) => !_n(o) && o !== Yt;\nfunction Vs() {\n const { caseless: o, skipUndefined: e } = da(this) && this || {}, t = {}, n = (i, s) => {\n const r = o && ua(t, s) || s;\n Ri(t[r]) && Ri(i) ? t[r] = Vs(t[r], i) : Ri(i) ? t[r] = Vs({}, i) : vn(i) ? t[r] = i.slice() : (!e || !_n(i)) && (t[r] = i);\n };\n for (let i = 0, s = arguments.length; i < s; i++)\n arguments[i] && Wn(arguments[i], n);\n return t;\n}\nconst Bc = (o, e, t, { allOwnKeys: n } = {}) => (Wn(e, (i, s) => {\n t && Ve(i) ? o[s] = aa(i, t) : o[s] = i;\n}, { allOwnKeys: n }), o), Nc = (o) => (o.charCodeAt(0) === 65279 && (o = o.slice(1)), o), Fc = (o, e, t, n) => {\n o.prototype = Object.create(e.prototype, n), o.prototype.constructor = o, Object.defineProperty(o, \"super\", {\n value: e.prototype\n }), t && Object.assign(o.prototype, t);\n}, Uc = (o, e, t, n) => {\n let i, s, r;\n const a = {};\n if (e = e || {}, o == null) return e;\n do {\n for (i = Object.getOwnPropertyNames(o), s = i.length; s-- > 0; )\n r = i[s], (!n || n(r, o, e)) && !a[r] && (e[r] = o[r], a[r] = !0);\n o = t !== !1 && ur(o);\n } while (o && (!t || t(o, e)) && o !== Object.prototype);\n return e;\n}, Vc = (o, e, t) => {\n o = String(o), (t === void 0 || t > o.length) && (t = o.length), t -= e.length;\n const n = o.indexOf(e, t);\n return n !== -1 && n === t;\n}, Hc = (o) => {\n if (!o) return null;\n if (vn(o)) return o;\n let e = o.length;\n if (!ha(e)) return null;\n const t = new Array(e);\n for (; e-- > 0; )\n t[e] = o[e];\n return t;\n}, jc = /* @__PURE__ */ ((o) => (e) => o && e instanceof o)(typeof Uint8Array < \"u\" && ur(Uint8Array)), Gc = (o, e) => {\n const n = (o && o[Ki]).call(o);\n let i;\n for (; (i = n.next()) && !i.done; ) {\n const s = i.value;\n e.call(o, s[0], s[1]);\n }\n}, Wc = (o, e) => {\n let t;\n const n = [];\n for (; (t = o.exec(e)) !== null; )\n n.push(t);\n return n;\n}, Xc = at(\"HTMLFormElement\"), Zc = (o) => o.toLowerCase().replace(\n /[-_\\s]([a-z\\d])(\\w*)/g,\n function(t, n, i) {\n return n.toUpperCase() + i;\n }\n), kr = (({ hasOwnProperty: o }) => (e, t) => o.call(e, t))(Object.prototype), qc = at(\"RegExp\"), fa = (o, e) => {\n const t = Object.getOwnPropertyDescriptors(o), n = {};\n Wn(t, (i, s) => {\n let r;\n (r = e(i, s, o)) !== !1 && (n[s] = r || i);\n }), Object.defineProperties(o, n);\n}, Yc = (o) => {\n fa(o, (e, t) => {\n if (Ve(o) && [\"arguments\", \"caller\", \"callee\"].indexOf(t) !== -1)\n return !1;\n const n = o[t];\n if (Ve(n)) {\n if (e.enumerable = !1, \"writable\" in e) {\n e.writable = !1;\n return;\n }\n e.set || (e.set = () => {\n throw Error(\"Can not rewrite read-only method '\" + t + \"'\");\n });\n }\n });\n}, Kc = (o, e) => {\n const t = {}, n = (i) => {\n i.forEach((s) => {\n t[s] = !0;\n });\n };\n return vn(o) ? n(o) : n(String(o).split(e)), t;\n}, $c = () => {\n}, Jc = (o, e) => o != null && Number.isFinite(o = +o) ? o : e;\nfunction Qc(o) {\n return !!(o && Ve(o.append) && o[la] === \"FormData\" && o[Ki]);\n}\nconst eh = (o) => {\n const e = new Array(10), t = (n, i) => {\n if (Gn(n)) {\n if (e.indexOf(n) >= 0)\n return;\n if (jn(n))\n return n;\n if (!(\"toJSON\" in n)) {\n e[i] = n;\n const s = vn(n) ? [] : {};\n return Wn(n, (r, a) => {\n const l = t(r, i + 1);\n !_n(l) && (s[a] = l);\n }), e[i] = void 0, s;\n }\n }\n return n;\n };\n return t(o, 0);\n}, th = at(\"AsyncFunction\"), nh = (o) => o && (Gn(o) || Ve(o)) && Ve(o.then) && Ve(o.catch), pa = ((o, e) => o ? setImmediate : e ? ((t, n) => (Yt.addEventListener(\"message\", ({ source: i, data: s }) => {\n i === Yt && s === t && n.length && n.shift()();\n}, !1), (i) => {\n n.push(i), Yt.postMessage(t, \"*\");\n}))(`axios@${Math.random()}`, []) : (t) => setTimeout(t))(\n typeof setImmediate == \"function\",\n Ve(Yt.postMessage)\n), ih = typeof queueMicrotask < \"u\" ? queueMicrotask.bind(Yt) : typeof process < \"u\" && process.nextTick || pa, sh = (o) => o != null && Ve(o[Ki]), U = {\n isArray: vn,\n isArrayBuffer: ca,\n isBuffer: jn,\n isFormData: Rc,\n isArrayBufferView: vc,\n isString: bc,\n isNumber: ha,\n isBoolean: Mc,\n isObject: Gn,\n isPlainObject: Ri,\n isEmptyObject: Sc,\n isReadableStream: kc,\n isRequest: Ic,\n isResponse: Lc,\n isHeaders: zc,\n isUndefined: _n,\n isDate: Tc,\n isFile: Ec,\n isBlob: Ac,\n isRegExp: qc,\n isFunction: Ve,\n isStream: Pc,\n isURLSearchParams: Dc,\n isTypedArray: jc,\n isFileList: Cc,\n forEach: Wn,\n merge: Vs,\n extend: Bc,\n trim: Oc,\n stripBOM: Nc,\n inherits: Fc,\n toFlatObject: Uc,\n kindOf: $i,\n kindOfTest: at,\n endsWith: Vc,\n toArray: Hc,\n forEachEntry: Gc,\n matchAll: Wc,\n isHTMLForm: Xc,\n hasOwnProperty: kr,\n hasOwnProp: kr,\n // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors: fa,\n freezeMethods: Yc,\n toObjectSet: Kc,\n toCamelCase: Zc,\n noop: $c,\n toFiniteNumber: Jc,\n findKey: ua,\n global: Yt,\n isContextDefined: da,\n isSpecCompliantForm: Qc,\n toJSONObject: eh,\n isAsyncFn: th,\n isThenable: nh,\n setImmediate: pa,\n asap: ih,\n isIterable: sh\n};\nfunction re(o, e, t, n, i) {\n Error.call(this), Error.captureStackTrace ? Error.captureStackTrace(this, this.constructor) : this.stack = new Error().stack, this.message = o, this.name = \"AxiosError\", e && (this.code = e), t && (this.config = t), n && (this.request = n), i && (this.response = i, this.status = i.status ? i.status : null);\n}\nU.inherits(re, Error, {\n toJSON: function() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: U.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\nconst ma = re.prototype, ga = {};\n[\n \"ERR_BAD_OPTION_VALUE\",\n \"ERR_BAD_OPTION\",\n \"ECONNABORTED\",\n \"ETIMEDOUT\",\n \"ERR_NETWORK\",\n \"ERR_FR_TOO_MANY_REDIRECTS\",\n \"ERR_DEPRECATED\",\n \"ERR_BAD_RESPONSE\",\n \"ERR_BAD_REQUEST\",\n \"ERR_CANCELED\",\n \"ERR_NOT_SUPPORT\",\n \"ERR_INVALID_URL\"\n // eslint-disable-next-line func-names\n].forEach((o) => {\n ga[o] = { value: o };\n});\nObject.defineProperties(re, ga);\nObject.defineProperty(ma, \"isAxiosError\", { value: !0 });\nre.from = (o, e, t, n, i, s) => {\n const r = Object.create(ma);\n U.toFlatObject(o, r, function(c) {\n return c !== Error.prototype;\n }, (h) => h !== \"isAxiosError\");\n const a = o && o.message ? o.message : \"Error\", l = e == null && o ? o.code : e;\n return re.call(r, a, l, t, n, i), o && r.cause == null && Object.defineProperty(r, \"cause\", { value: o, configurable: !0 }), r.name = o && o.name || \"Error\", s && Object.assign(r, s), r;\n};\nconst rh = null;\nfunction Hs(o) {\n return U.isPlainObject(o) || U.isArray(o);\n}\nfunction ya(o) {\n return U.endsWith(o, \"[]\") ? o.slice(0, -2) : o;\n}\nfunction Ir(o, e, t) {\n return o ? o.concat(e).map(function(i, s) {\n return i = ya(i), !t && s ? \"[\" + i + \"]\" : i;\n }).join(t ? \".\" : \"\") : e;\n}\nfunction oh(o) {\n return U.isArray(o) && !o.some(Hs);\n}\nconst ah = U.toFlatObject(U, {}, null, function(e) {\n return /^is[A-Z]/.test(e);\n});\nfunction Qi(o, e, t) {\n if (!U.isObject(o))\n throw new TypeError(\"target must be an object\");\n e = e || new FormData(), t = U.toFlatObject(t, {\n metaTokens: !0,\n dots: !1,\n indexes: !1\n }, !1, function(p, g) {\n return !U.isUndefined(g[p]);\n });\n const n = t.metaTokens, i = t.visitor || c, s = t.dots, r = t.indexes, l = (t.Blob || typeof Blob < \"u\" && Blob) && U.isSpecCompliantForm(e);\n if (!U.isFunction(i))\n throw new TypeError(\"visitor must be a function\");\n function h(d) {\n if (d === null) return \"\";\n if (U.isDate(d))\n return d.toISOString();\n if (U.isBoolean(d))\n return d.toString();\n if (!l && U.isBlob(d))\n throw new re(\"Blob is not supported. Use a Buffer instead.\");\n return U.isArrayBuffer(d) || U.isTypedArray(d) ? l && typeof Blob == \"function\" ? new Blob([d]) : Buffer.from(d) : d;\n }\n function c(d, p, g) {\n let y = d;\n if (d && !g && typeof d == \"object\") {\n if (U.endsWith(p, \"{}\"))\n p = n ? p : p.slice(0, -2), d = JSON.stringify(d);\n else if (U.isArray(d) && oh(d) || (U.isFileList(d) || U.endsWith(p, \"[]\")) && (y = U.toArray(d)))\n return p = ya(p), y.forEach(function(x, _) {\n !(U.isUndefined(x) || x === null) && e.append(\n // eslint-disable-next-line no-nested-ternary\n r === !0 ? Ir([p], _, s) : r === null ? p : p + \"[]\",\n h(x)\n );\n }), !1;\n }\n return Hs(d) ? !0 : (e.append(Ir(g, p, s), h(d)), !1);\n }\n const u = [], m = Object.assign(ah, {\n defaultVisitor: c,\n convertValue: h,\n isVisitable: Hs\n });\n function f(d, p) {\n if (!U.isUndefined(d)) {\n if (u.indexOf(d) !== -1)\n throw Error(\"Circular reference detected in \" + p.join(\".\"));\n u.push(d), U.forEach(d, function(y, w) {\n (!(U.isUndefined(y) || y === null) && i.call(\n e,\n y,\n U.isString(w) ? w.trim() : w,\n p,\n m\n )) === !0 && f(y, p ? p.concat(w) : [w]);\n }), u.pop();\n }\n }\n if (!U.isObject(o))\n throw new TypeError(\"data must be an object\");\n return f(o), e;\n}\nfunction Lr(o) {\n const e = {\n \"!\": \"%21\",\n \"'\": \"%27\",\n \"(\": \"%28\",\n \")\": \"%29\",\n \"~\": \"%7E\",\n \"%20\": \"+\",\n \"%00\": \"\\0\"\n };\n return encodeURIComponent(o).replace(/[!'()~]|%20|%00/g, function(n) {\n return e[n];\n });\n}\nfunction dr(o, e) {\n this._pairs = [], o && Qi(o, this, e);\n}\nconst wa = dr.prototype;\nwa.append = function(e, t) {\n this._pairs.push([e, t]);\n};\nwa.toString = function(e) {\n const t = e ? function(n) {\n return e.call(this, n, Lr);\n } : Lr;\n return this._pairs.map(function(i) {\n return t(i[0]) + \"=\" + t(i[1]);\n }, \"\").join(\"&\");\n};\nfunction lh(o) {\n return encodeURIComponent(o).replace(/%3A/gi, \":\").replace(/%24/g, \"$\").replace(/%2C/gi, \",\").replace(/%20/g, \"+\");\n}\nfunction xa(o, e, t) {\n if (!e)\n return o;\n const n = t && t.encode || lh;\n U.isFunction(t) && (t = {\n serialize: t\n });\n const i = t && t.serialize;\n let s;\n if (i ? s = i(e, t) : s = U.isURLSearchParams(e) ? e.toString() : new dr(e, t).toString(n), s) {\n const r = o.indexOf(\"#\");\n r !== -1 && (o = o.slice(0, r)), o += (o.indexOf(\"?\") === -1 ? \"?\" : \"&\") + s;\n }\n return o;\n}\nclass zr {\n constructor() {\n this.handlers = [];\n }\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(e, t, n) {\n return this.handlers.push({\n fulfilled: e,\n rejected: t,\n synchronous: n ? n.synchronous : !1,\n runWhen: n ? n.runWhen : null\n }), this.handlers.length - 1;\n }\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {void}\n */\n eject(e) {\n this.handlers[e] && (this.handlers[e] = null);\n }\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n this.handlers && (this.handlers = []);\n }\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(e) {\n U.forEach(this.handlers, function(n) {\n n !== null && e(n);\n });\n }\n}\nconst _a = {\n silentJSONParsing: !0,\n forcedJSONParsing: !0,\n clarifyTimeoutError: !1\n}, ch = typeof URLSearchParams < \"u\" ? URLSearchParams : dr, hh = typeof FormData < \"u\" ? FormData : null, uh = typeof Blob < \"u\" ? Blob : null, dh = {\n isBrowser: !0,\n classes: {\n URLSearchParams: ch,\n FormData: hh,\n Blob: uh\n },\n protocols: [\"http\", \"https\", \"file\", \"blob\", \"url\", \"data\"]\n}, fr = typeof window < \"u\" && typeof document < \"u\", js = typeof navigator == \"object\" && navigator || void 0, fh = fr && (!js || [\"ReactNative\", \"NativeScript\", \"NS\"].indexOf(js.product) < 0), ph = typeof WorkerGlobalScope < \"u\" && // eslint-disable-next-line no-undef\nself instanceof WorkerGlobalScope && typeof self.importScripts == \"function\", mh = fr && window.location.href || \"http://localhost\", gh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n hasBrowserEnv: fr,\n hasStandardBrowserEnv: fh,\n hasStandardBrowserWebWorkerEnv: ph,\n navigator: js,\n origin: mh\n}, Symbol.toStringTag, { value: \"Module\" })), ke = {\n ...gh,\n ...dh\n};\nfunction yh(o, e) {\n return Qi(o, new ke.classes.URLSearchParams(), {\n visitor: function(t, n, i, s) {\n return ke.isNode && U.isBuffer(t) ? (this.append(n, t.toString(\"base64\")), !1) : s.defaultVisitor.apply(this, arguments);\n },\n ...e\n });\n}\nfunction wh(o) {\n return U.matchAll(/\\w+|\\[(\\w*)]/g, o).map((e) => e[0] === \"[]\" ? \"\" : e[1] || e[0]);\n}\nfunction xh(o) {\n const e = {}, t = Object.keys(o);\n let n;\n const i = t.length;\n let s;\n for (n = 0; n < i; n++)\n s = t[n], e[s] = o[s];\n return e;\n}\nfunction va(o) {\n function e(t, n, i, s) {\n let r = t[s++];\n if (r === \"__proto__\") return !0;\n const a = Number.isFinite(+r), l = s >= t.length;\n return r = !r && U.isArray(i) ? i.length : r, l ? (U.hasOwnProp(i, r) ? i[r] = [i[r], n] : i[r] = n, !a) : ((!i[r] || !U.isObject(i[r])) && (i[r] = []), e(t, n, i[r], s) && U.isArray(i[r]) && (i[r] = xh(i[r])), !a);\n }\n if (U.isFormData(o) && U.isFunction(o.entries)) {\n const t = {};\n return U.forEachEntry(o, (n, i) => {\n e(wh(n), i, t, 0);\n }), t;\n }\n return null;\n}\nfunction _h(o, e, t) {\n if (U.isString(o))\n try {\n return (e || JSON.parse)(o), U.trim(o);\n } catch (n) {\n if (n.name !== \"SyntaxError\")\n throw n;\n }\n return (t || JSON.stringify)(o);\n}\nconst Xn = {\n transitional: _a,\n adapter: [\"xhr\", \"http\", \"fetch\"],\n transformRequest: [function(e, t) {\n const n = t.getContentType() || \"\", i = n.indexOf(\"application/json\") > -1, s = U.isObject(e);\n if (s && U.isHTMLForm(e) && (e = new FormData(e)), U.isFormData(e))\n return i ? JSON.stringify(va(e)) : e;\n if (U.isArrayBuffer(e) || U.isBuffer(e) || U.isStream(e) || U.isFile(e) || U.isBlob(e) || U.isReadableStream(e))\n return e;\n if (U.isArrayBufferView(e))\n return e.buffer;\n if (U.isURLSearchParams(e))\n return t.setContentType(\"application/x-www-form-urlencoded;charset=utf-8\", !1), e.toString();\n let a;\n if (s) {\n if (n.indexOf(\"application/x-www-form-urlencoded\") > -1)\n return yh(e, this.formSerializer).toString();\n if ((a = U.isFileList(e)) || n.indexOf(\"multipart/form-data\") > -1) {\n const l = this.env && this.env.FormData;\n return Qi(\n a ? { \"files[]\": e } : e,\n l && new l(),\n this.formSerializer\n );\n }\n }\n return s || i ? (t.setContentType(\"application/json\", !1), _h(e)) : e;\n }],\n transformResponse: [function(e) {\n const t = this.transitional || Xn.transitional, n = t && t.forcedJSONParsing, i = this.responseType === \"json\";\n if (U.isResponse(e) || U.isReadableStream(e))\n return e;\n if (e && U.isString(e) && (n && !this.responseType || i)) {\n const r = !(t && t.silentJSONParsing) && i;\n try {\n return JSON.parse(e, this.parseReviver);\n } catch (a) {\n if (r)\n throw a.name === \"SyntaxError\" ? re.from(a, re.ERR_BAD_RESPONSE, this, null, this.response) : a;\n }\n }\n return e;\n }],\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n xsrfCookieName: \"XSRF-TOKEN\",\n xsrfHeaderName: \"X-XSRF-TOKEN\",\n maxContentLength: -1,\n maxBodyLength: -1,\n env: {\n FormData: ke.classes.FormData,\n Blob: ke.classes.Blob\n },\n validateStatus: function(e) {\n return e >= 200 && e < 300;\n },\n headers: {\n common: {\n Accept: \"application/json, text/plain, */*\",\n \"Content-Type\": void 0\n }\n }\n};\nU.forEach([\"delete\", \"get\", \"head\", \"post\", \"put\", \"patch\"], (o) => {\n Xn.headers[o] = {};\n});\nconst vh = U.toObjectSet([\n \"age\",\n \"authorization\",\n \"content-length\",\n \"content-type\",\n \"etag\",\n \"expires\",\n \"from\",\n \"host\",\n \"if-modified-since\",\n \"if-unmodified-since\",\n \"last-modified\",\n \"location\",\n \"max-forwards\",\n \"proxy-authorization\",\n \"referer\",\n \"retry-after\",\n \"user-agent\"\n]), bh = (o) => {\n const e = {};\n let t, n, i;\n return o && o.split(`\n`).forEach(function(r) {\n i = r.indexOf(\":\"), t = r.substring(0, i).trim().toLowerCase(), n = r.substring(i + 1).trim(), !(!t || e[t] && vh[t]) && (t === \"set-cookie\" ? e[t] ? e[t].push(n) : e[t] = [n] : e[t] = e[t] ? e[t] + \", \" + n : n);\n }), e;\n}, Or = Symbol(\"internals\");\nfunction Tn(o) {\n return o && String(o).trim().toLowerCase();\n}\nfunction Di(o) {\n return o === !1 || o == null ? o : U.isArray(o) ? o.map(Di) : String(o);\n}\nfunction Mh(o) {\n const e = /* @__PURE__ */ Object.create(null), t = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let n;\n for (; n = t.exec(o); )\n e[n[1]] = n[2];\n return e;\n}\nconst Sh = (o) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(o.trim());\nfunction as(o, e, t, n, i) {\n if (U.isFunction(n))\n return n.call(this, e, t);\n if (i && (e = t), !!U.isString(e)) {\n if (U.isString(n))\n return e.indexOf(n) !== -1;\n if (U.isRegExp(n))\n return n.test(e);\n }\n}\nfunction Th(o) {\n return o.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g, (e, t, n) => t.toUpperCase() + n);\n}\nfunction Eh(o, e) {\n const t = U.toCamelCase(\" \" + e);\n [\"get\", \"set\", \"has\"].forEach((n) => {\n Object.defineProperty(o, n + t, {\n value: function(i, s, r) {\n return this[n].call(this, e, i, s, r);\n },\n configurable: !0\n });\n });\n}\nlet He = class {\n constructor(e) {\n e && this.set(e);\n }\n set(e, t, n) {\n const i = this;\n function s(a, l, h) {\n const c = Tn(l);\n if (!c)\n throw new Error(\"header name must be a non-empty string\");\n const u = U.findKey(i, c);\n (!u || i[u] === void 0 || h === !0 || h === void 0 && i[u] !== !1) && (i[u || l] = Di(a));\n }\n const r = (a, l) => U.forEach(a, (h, c) => s(h, c, l));\n if (U.isPlainObject(e) || e instanceof this.constructor)\n r(e, t);\n else if (U.isString(e) && (e = e.trim()) && !Sh(e))\n r(bh(e), t);\n else if (U.isObject(e) && U.isIterable(e)) {\n let a = {}, l, h;\n for (const c of e) {\n if (!U.isArray(c))\n throw TypeError(\"Object iterator must return a key-value pair\");\n a[h = c[0]] = (l = a[h]) ? U.isArray(l) ? [...l, c[1]] : [l, c[1]] : c[1];\n }\n r(a, t);\n } else\n e != null && s(t, e, n);\n return this;\n }\n get(e, t) {\n if (e = Tn(e), e) {\n const n = U.findKey(this, e);\n if (n) {\n const i = this[n];\n if (!t)\n return i;\n if (t === !0)\n return Mh(i);\n if (U.isFunction(t))\n return t.call(this, i, n);\n if (U.isRegExp(t))\n return t.exec(i);\n throw new TypeError(\"parser must be boolean|regexp|function\");\n }\n }\n }\n has(e, t) {\n if (e = Tn(e), e) {\n const n = U.findKey(this, e);\n return !!(n && this[n] !== void 0 && (!t || as(this, this[n], n, t)));\n }\n return !1;\n }\n delete(e, t) {\n const n = this;\n let i = !1;\n function s(r) {\n if (r = Tn(r), r) {\n const a = U.findKey(n, r);\n a && (!t || as(n, n[a], a, t)) && (delete n[a], i = !0);\n }\n }\n return U.isArray(e) ? e.forEach(s) : s(e), i;\n }\n clear(e) {\n const t = Object.keys(this);\n let n = t.length, i = !1;\n for (; n--; ) {\n const s = t[n];\n (!e || as(this, this[s], s, e, !0)) && (delete this[s], i = !0);\n }\n return i;\n }\n normalize(e) {\n const t = this, n = {};\n return U.forEach(this, (i, s) => {\n const r = U.findKey(n, s);\n if (r) {\n t[r] = Di(i), delete t[s];\n return;\n }\n const a = e ? Th(s) : String(s).trim();\n a !== s && delete t[s], t[a] = Di(i), n[a] = !0;\n }), this;\n }\n concat(...e) {\n return this.constructor.concat(this, ...e);\n }\n toJSON(e) {\n const t = /* @__PURE__ */ Object.create(null);\n return U.forEach(this, (n, i) => {\n n != null && n !== !1 && (t[i] = e && U.isArray(n) ? n.join(\", \") : n);\n }), t;\n }\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n toString() {\n return Object.entries(this.toJSON()).map(([e, t]) => e + \": \" + t).join(`\n`);\n }\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n get [Symbol.toStringTag]() {\n return \"AxiosHeaders\";\n }\n static from(e) {\n return e instanceof this ? e : new this(e);\n }\n static concat(e, ...t) {\n const n = new this(e);\n return t.forEach((i) => n.set(i)), n;\n }\n static accessor(e) {\n const n = (this[Or] = this[Or] = {\n accessors: {}\n }).accessors, i = this.prototype;\n function s(r) {\n const a = Tn(r);\n n[a] || (Eh(i, r), n[a] = !0);\n }\n return U.isArray(e) ? e.forEach(s) : s(e), this;\n }\n};\nHe.accessor([\"Content-Type\", \"Content-Length\", \"Accept\", \"Accept-Encoding\", \"User-Agent\", \"Authorization\"]);\nU.reduceDescriptors(He.prototype, ({ value: o }, e) => {\n let t = e[0].toUpperCase() + e.slice(1);\n return {\n get: () => o,\n set(n) {\n this[t] = n;\n }\n };\n});\nU.freezeMethods(He);\nfunction ls(o, e) {\n const t = this || Xn, n = e || t, i = He.from(n.headers);\n let s = n.data;\n return U.forEach(o, function(a) {\n s = a.call(t, s, i.normalize(), e ? e.status : void 0);\n }), i.normalize(), s;\n}\nfunction ba(o) {\n return !!(o && o.__CANCEL__);\n}\nfunction bn(o, e, t) {\n re.call(this, o ?? \"canceled\", re.ERR_CANCELED, e, t), this.name = \"CanceledError\";\n}\nU.inherits(bn, re, {\n __CANCEL__: !0\n});\nfunction Ma(o, e, t) {\n const n = t.config.validateStatus;\n !t.status || !n || n(t.status) ? o(t) : e(new re(\n \"Request failed with status code \" + t.status,\n [re.ERR_BAD_REQUEST, re.ERR_BAD_RESPONSE][Math.floor(t.status / 100) - 4],\n t.config,\n t.request,\n t\n ));\n}\nfunction Ah(o) {\n const e = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(o);\n return e && e[1] || \"\";\n}\nfunction Ch(o, e) {\n o = o || 10;\n const t = new Array(o), n = new Array(o);\n let i = 0, s = 0, r;\n return e = e !== void 0 ? e : 1e3, function(l) {\n const h = Date.now(), c = n[s];\n r || (r = h), t[i] = l, n[i] = h;\n let u = s, m = 0;\n for (; u !== i; )\n m += t[u++], u = u % o;\n if (i = (i + 1) % o, i === s && (s = (s + 1) % o), h - r < e)\n return;\n const f = c && h - c;\n return f ? Math.round(m * 1e3 / f) : void 0;\n };\n}\nfunction Ph(o, e) {\n let t = 0, n = 1e3 / e, i, s;\n const r = (h, c = Date.now()) => {\n t = c, i = null, s && (clearTimeout(s), s = null), o(...h);\n };\n return [(...h) => {\n const c = Date.now(), u = c - t;\n u >= n ? r(h, c) : (i = h, s || (s = setTimeout(() => {\n s = null, r(i);\n }, n - u)));\n }, () => i && r(i)];\n}\nconst Vi = (o, e, t = 3) => {\n let n = 0;\n const i = Ch(50, 250);\n return Ph((s) => {\n const r = s.loaded, a = s.lengthComputable ? s.total : void 0, l = r - n, h = i(l), c = r <= a;\n n = r;\n const u = {\n loaded: r,\n total: a,\n progress: a ? r / a : void 0,\n bytes: l,\n rate: h || void 0,\n estimated: h && a && c ? (a - r) / h : void 0,\n event: s,\n lengthComputable: a != null,\n [e ? \"download\" : \"upload\"]: !0\n };\n o(u);\n }, t);\n}, Br = (o, e) => {\n const t = o != null;\n return [(n) => e[0]({\n lengthComputable: t,\n total: o,\n loaded: n\n }), e[1]];\n}, Nr = (o) => (...e) => U.asap(() => o(...e)), Rh = ke.hasStandardBrowserEnv ? /* @__PURE__ */ ((o, e) => (t) => (t = new URL(t, ke.origin), o.protocol === t.protocol && o.host === t.host && (e || o.port === t.port)))(\n new URL(ke.origin),\n ke.navigator && /(msie|trident)/i.test(ke.navigator.userAgent)\n) : () => !0, Dh = ke.hasStandardBrowserEnv ? (\n // Standard browser envs support document.cookie\n {\n write(o, e, t, n, i, s, r) {\n if (typeof document > \"u\") return;\n const a = [`${o}=${encodeURIComponent(e)}`];\n U.isNumber(t) && a.push(`expires=${new Date(t).toUTCString()}`), U.isString(n) && a.push(`path=${n}`), U.isString(i) && a.push(`domain=${i}`), s === !0 && a.push(\"secure\"), U.isString(r) && a.push(`SameSite=${r}`), document.cookie = a.join(\"; \");\n },\n read(o) {\n if (typeof document > \"u\") return null;\n const e = document.cookie.match(new RegExp(\"(?:^|; )\" + o + \"=([^;]*)\"));\n return e ? decodeURIComponent(e[1]) : null;\n },\n remove(o) {\n this.write(o, \"\", Date.now() - 864e5, \"/\");\n }\n }\n) : (\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {\n },\n read() {\n return null;\n },\n remove() {\n }\n }\n);\nfunction kh(o) {\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(o);\n}\nfunction Ih(o, e) {\n return e ? o.replace(/\\/?\\/$/, \"\") + \"/\" + e.replace(/^\\/+/, \"\") : o;\n}\nfunction Sa(o, e, t) {\n let n = !kh(e);\n return o && (n || t == !1) ? Ih(o, e) : e;\n}\nconst Fr = (o) => o instanceof He ? { ...o } : o;\nfunction Qt(o, e) {\n e = e || {};\n const t = {};\n function n(h, c, u, m) {\n return U.isPlainObject(h) && U.isPlainObject(c) ? U.merge.call({ caseless: m }, h, c) : U.isPlainObject(c) ? U.merge({}, c) : U.isArray(c) ? c.slice() : c;\n }\n function i(h, c, u, m) {\n if (U.isUndefined(c)) {\n if (!U.isUndefined(h))\n return n(void 0, h, u, m);\n } else return n(h, c, u, m);\n }\n function s(h, c) {\n if (!U.isUndefined(c))\n return n(void 0, c);\n }\n function r(h, c) {\n if (U.isUndefined(c)) {\n if (!U.isUndefined(h))\n return n(void 0, h);\n } else return n(void 0, c);\n }\n function a(h, c, u) {\n if (u in e)\n return n(h, c);\n if (u in o)\n return n(void 0, h);\n }\n const l = {\n url: s,\n method: s,\n data: s,\n baseURL: r,\n transformRequest: r,\n transformResponse: r,\n paramsSerializer: r,\n timeout: r,\n timeoutMessage: r,\n withCredentials: r,\n withXSRFToken: r,\n adapter: r,\n responseType: r,\n xsrfCookieName: r,\n xsrfHeaderName: r,\n onUploadProgress: r,\n onDownloadProgress: r,\n decompress: r,\n maxContentLength: r,\n maxBodyLength: r,\n beforeRedirect: r,\n transport: r,\n httpAgent: r,\n httpsAgent: r,\n cancelToken: r,\n socketPath: r,\n responseEncoding: r,\n validateStatus: a,\n headers: (h, c, u) => i(Fr(h), Fr(c), u, !0)\n };\n return U.forEach(Object.keys({ ...o, ...e }), function(c) {\n const u = l[c] || i, m = u(o[c], e[c], c);\n U.isUndefined(m) && u !== a || (t[c] = m);\n }), t;\n}\nconst Ta = (o) => {\n const e = Qt({}, o);\n let { data: t, withXSRFToken: n, xsrfHeaderName: i, xsrfCookieName: s, headers: r, auth: a } = e;\n if (e.headers = r = He.from(r), e.url = xa(Sa(e.baseURL, e.url, e.allowAbsoluteUrls), o.params, o.paramsSerializer), a && r.set(\n \"Authorization\",\n \"Basic \" + btoa((a.username || \"\") + \":\" + (a.password ? unescape(encodeURIComponent(a.password)) : \"\"))\n ), U.isFormData(t)) {\n if (ke.hasStandardBrowserEnv || ke.hasStandardBrowserWebWorkerEnv)\n r.setContentType(void 0);\n else if (U.isFunction(t.getHeaders)) {\n const l = t.getHeaders(), h = [\"content-type\", \"content-length\"];\n Object.entries(l).forEach(([c, u]) => {\n h.includes(c.toLowerCase()) && r.set(c, u);\n });\n }\n }\n if (ke.hasStandardBrowserEnv && (n && U.isFunction(n) && (n = n(e)), n || n !== !1 && Rh(e.url))) {\n const l = i && s && Dh.read(s);\n l && r.set(i, l);\n }\n return e;\n}, Lh = typeof XMLHttpRequest < \"u\", zh = Lh && function(o) {\n return new Promise(function(t, n) {\n const i = Ta(o);\n let s = i.data;\n const r = He.from(i.headers).normalize();\n let { responseType: a, onUploadProgress: l, onDownloadProgress: h } = i, c, u, m, f, d;\n function p() {\n f && f(), d && d(), i.cancelToken && i.cancelToken.unsubscribe(c), i.signal && i.signal.removeEventListener(\"abort\", c);\n }\n let g = new XMLHttpRequest();\n g.open(i.method.toUpperCase(), i.url, !0), g.timeout = i.timeout;\n function y() {\n if (!g)\n return;\n const x = He.from(\n \"getAllResponseHeaders\" in g && g.getAllResponseHeaders()\n ), b = {\n data: !a || a === \"text\" || a === \"json\" ? g.responseText : g.response,\n status: g.status,\n statusText: g.statusText,\n headers: x,\n config: o,\n request: g\n };\n Ma(function(A) {\n t(A), p();\n }, function(A) {\n n(A), p();\n }, b), g = null;\n }\n \"onloadend\" in g ? g.onloadend = y : g.onreadystatechange = function() {\n !g || g.readyState !== 4 || g.status === 0 && !(g.responseURL && g.responseURL.indexOf(\"file:\") === 0) || setTimeout(y);\n }, g.onabort = function() {\n g && (n(new re(\"Request aborted\", re.ECONNABORTED, o, g)), g = null);\n }, g.onerror = function(_) {\n const b = _ && _.message ? _.message : \"Network Error\", E = new re(b, re.ERR_NETWORK, o, g);\n E.event = _ || null, n(E), g = null;\n }, g.ontimeout = function() {\n let _ = i.timeout ? \"timeout of \" + i.timeout + \"ms exceeded\" : \"timeout exceeded\";\n const b = i.transitional || _a;\n i.timeoutErrorMessage && (_ = i.timeoutErrorMessage), n(new re(\n _,\n b.clarifyTimeoutError ? re.ETIMEDOUT : re.ECONNABORTED,\n o,\n g\n )), g = null;\n }, s === void 0 && r.setContentType(null), \"setRequestHeader\" in g && U.forEach(r.toJSON(), function(_, b) {\n g.setRequestHeader(b, _);\n }), U.isUndefined(i.withCredentials) || (g.withCredentials = !!i.withCredentials), a && a !== \"json\" && (g.responseType = i.responseType), h && ([m, d] = Vi(h, !0), g.addEventListener(\"progress\", m)), l && g.upload && ([u, f] = Vi(l), g.upload.addEventListener(\"progress\", u), g.upload.addEventListener(\"loadend\", f)), (i.cancelToken || i.signal) && (c = (x) => {\n g && (n(!x || x.type ? new bn(null, o, g) : x), g.abort(), g = null);\n }, i.cancelToken && i.cancelToken.subscribe(c), i.signal && (i.signal.aborted ? c() : i.signal.addEventListener(\"abort\", c)));\n const w = Ah(i.url);\n if (w && ke.protocols.indexOf(w) === -1) {\n n(new re(\"Unsupported protocol \" + w + \":\", re.ERR_BAD_REQUEST, o));\n return;\n }\n g.send(s || null);\n });\n}, Oh = (o, e) => {\n const { length: t } = o = o ? o.filter(Boolean) : [];\n if (e || t) {\n let n = new AbortController(), i;\n const s = function(h) {\n if (!i) {\n i = !0, a();\n const c = h instanceof Error ? h : this.reason;\n n.abort(c instanceof re ? c : new bn(c instanceof Error ? c.message : c));\n }\n };\n let r = e && setTimeout(() => {\n r = null, s(new re(`timeout ${e} of ms exceeded`, re.ETIMEDOUT));\n }, e);\n const a = () => {\n o && (r && clearTimeout(r), r = null, o.forEach((h) => {\n h.unsubscribe ? h.unsubscribe(s) : h.removeEventListener(\"abort\", s);\n }), o = null);\n };\n o.forEach((h) => h.addEventListener(\"abort\", s));\n const { signal: l } = n;\n return l.unsubscribe = () => U.asap(a), l;\n }\n}, Bh = function* (o, e) {\n let t = o.byteLength;\n if (t < e) {\n yield o;\n return;\n }\n let n = 0, i;\n for (; n < t; )\n i = n + e, yield o.slice(n, i), n = i;\n}, Nh = async function* (o, e) {\n for await (const t of Fh(o))\n yield* Bh(t, e);\n}, Fh = async function* (o) {\n if (o[Symbol.asyncIterator]) {\n yield* o;\n return;\n }\n const e = o.getReader();\n try {\n for (; ; ) {\n const { done: t, value: n } = await e.read();\n if (t)\n break;\n yield n;\n }\n } finally {\n await e.cancel();\n }\n}, Ur = (o, e, t, n) => {\n const i = Nh(o, e);\n let s = 0, r, a = (l) => {\n r || (r = !0, n && n(l));\n };\n return new ReadableStream({\n async pull(l) {\n try {\n const { done: h, value: c } = await i.next();\n if (h) {\n a(), l.close();\n return;\n }\n let u = c.byteLength;\n if (t) {\n let m = s += u;\n t(m);\n }\n l.enqueue(new Uint8Array(c));\n } catch (h) {\n throw a(h), h;\n }\n },\n cancel(l) {\n return a(l), i.return();\n }\n }, {\n highWaterMark: 2\n });\n}, Vr = 64 * 1024, { isFunction: ri } = U, Uh = (({ Request: o, Response: e }) => ({\n Request: o,\n Response: e\n}))(U.global), {\n ReadableStream: Hr,\n TextEncoder: jr\n} = U.global, Gr = (o, ...e) => {\n try {\n return !!o(...e);\n } catch {\n return !1;\n }\n}, Vh = (o) => {\n o = U.merge.call({\n skipUndefined: !0\n }, Uh, o);\n const { fetch: e, Request: t, Response: n } = o, i = e ? ri(e) : typeof fetch == \"function\", s = ri(t), r = ri(n);\n if (!i)\n return !1;\n const a = i && ri(Hr), l = i && (typeof jr == \"function\" ? /* @__PURE__ */ ((d) => (p) => d.encode(p))(new jr()) : async (d) => new Uint8Array(await new t(d).arrayBuffer())), h = s && a && Gr(() => {\n let d = !1;\n const p = new t(ke.origin, {\n body: new Hr(),\n method: \"POST\",\n get duplex() {\n return d = !0, \"half\";\n }\n }).headers.has(\"Content-Type\");\n return d && !p;\n }), c = r && a && Gr(() => U.isReadableStream(new n(\"\").body)), u = {\n stream: c && ((d) => d.body)\n };\n i && [\"text\", \"arrayBuffer\", \"blob\", \"formData\", \"stream\"].forEach((d) => {\n !u[d] && (u[d] = (p, g) => {\n let y = p && p[d];\n if (y)\n return y.call(p);\n throw new re(`Response type '${d}' is not supported`, re.ERR_NOT_SUPPORT, g);\n });\n });\n const m = async (d) => {\n if (d == null)\n return 0;\n if (U.isBlob(d))\n return d.size;\n if (U.isSpecCompliantForm(d))\n return (await new t(ke.origin, {\n method: \"POST\",\n body: d\n }).arrayBuffer()).byteLength;\n if (U.isArrayBufferView(d) || U.isArrayBuffer(d))\n return d.byteLength;\n if (U.isURLSearchParams(d) && (d = d + \"\"), U.isString(d))\n return (await l(d)).byteLength;\n }, f = async (d, p) => {\n const g = U.toFiniteNumber(d.getContentLength());\n return g ?? m(p);\n };\n return async (d) => {\n let {\n url: p,\n method: g,\n data: y,\n signal: w,\n cancelToken: x,\n timeout: _,\n onDownloadProgress: b,\n onUploadProgress: E,\n responseType: A,\n headers: P,\n withCredentials: C = \"same-origin\",\n fetchOptions: D\n } = Ta(d), I = e || fetch;\n A = A ? (A + \"\").toLowerCase() : \"text\";\n let T = Oh([w, x && x.toAbortSignal()], _), R = null;\n const v = T && T.unsubscribe && (() => {\n T.unsubscribe();\n });\n let z;\n try {\n if (E && h && g !== \"get\" && g !== \"head\" && (z = await f(P, y)) !== 0) {\n let N = new t(p, {\n method: \"POST\",\n body: y,\n duplex: \"half\"\n }), O;\n if (U.isFormData(y) && (O = N.headers.get(\"content-type\")) && P.setContentType(O), N.body) {\n const [Q, ee] = Br(\n z,\n Vi(Nr(E))\n );\n y = Ur(N.body, Vr, Q, ee);\n }\n }\n U.isString(C) || (C = C ? \"include\" : \"omit\");\n const H = s && \"credentials\" in t.prototype, V = {\n ...D,\n signal: T,\n method: g.toUpperCase(),\n headers: P.normalize().toJSON(),\n body: y,\n duplex: \"half\",\n credentials: H ? C : void 0\n };\n R = s && new t(p, V);\n let te = await (s ? I(R, D) : I(p, V));\n const G = c && (A === \"stream\" || A === \"response\");\n if (c && (b || G && v)) {\n const N = {};\n [\"status\", \"statusText\", \"headers\"].forEach((q) => {\n N[q] = te[q];\n });\n const O = U.toFiniteNumber(te.headers.get(\"content-length\")), [Q, ee] = b && Br(\n O,\n Vi(Nr(b), !0)\n ) || [];\n te = new n(\n Ur(te.body, Vr, Q, () => {\n ee && ee(), v && v();\n }),\n N\n );\n }\n A = A || \"text\";\n let $ = await u[U.findKey(u, A) || \"text\"](te, d);\n return !G && v && v(), await new Promise((N, O) => {\n Ma(N, O, {\n data: $,\n headers: He.from(te.headers),\n status: te.status,\n statusText: te.statusText,\n config: d,\n request: R\n });\n });\n } catch (H) {\n throw v && v(), H && H.name === \"TypeError\" && /Load failed|fetch/i.test(H.message) ? Object.assign(\n new re(\"Network Error\", re.ERR_NETWORK, d, R),\n {\n cause: H.cause || H\n }\n ) : re.from(H, H && H.code, d, R);\n }\n };\n}, Hh = /* @__PURE__ */ new Map(), Ea = (o) => {\n let e = o && o.env || {};\n const { fetch: t, Request: n, Response: i } = e, s = [\n n,\n i,\n t\n ];\n let r = s.length, a = r, l, h, c = Hh;\n for (; a--; )\n l = s[a], h = c.get(l), h === void 0 && c.set(l, h = a ? /* @__PURE__ */ new Map() : Vh(e)), c = h;\n return h;\n};\nEa();\nconst pr = {\n http: rh,\n xhr: zh,\n fetch: {\n get: Ea\n }\n};\nU.forEach(pr, (o, e) => {\n if (o) {\n try {\n Object.defineProperty(o, \"name\", { value: e });\n } catch {\n }\n Object.defineProperty(o, \"adapterName\", { value: e });\n }\n});\nconst Wr = (o) => `- ${o}`, jh = (o) => U.isFunction(o) || o === null || o === !1;\nfunction Gh(o, e) {\n o = U.isArray(o) ? o : [o];\n const { length: t } = o;\n let n, i;\n const s = {};\n for (let r = 0; r < t; r++) {\n n = o[r];\n let a;\n if (i = n, !jh(n) && (i = pr[(a = String(n)).toLowerCase()], i === void 0))\n throw new re(`Unknown adapter '${a}'`);\n if (i && (U.isFunction(i) || (i = i.get(e))))\n break;\n s[a || \"#\" + r] = i;\n }\n if (!i) {\n const r = Object.entries(s).map(\n ([l, h]) => `adapter ${l} ` + (h === !1 ? \"is not supported by the environment\" : \"is not available in the build\")\n );\n let a = t ? r.length > 1 ? `since :\n` + r.map(Wr).join(`\n`) : \" \" + Wr(r[0]) : \"as no adapter specified\";\n throw new re(\n \"There is no suitable adapter to dispatch the request \" + a,\n \"ERR_NOT_SUPPORT\"\n );\n }\n return i;\n}\nconst Aa = {\n /**\n * Resolve an adapter from a list of adapter names or functions.\n * @type {Function}\n */\n getAdapter: Gh,\n /**\n * Exposes all known adapters\n * @type {Object}\n */\n adapters: pr\n};\nfunction cs(o) {\n if (o.cancelToken && o.cancelToken.throwIfRequested(), o.signal && o.signal.aborted)\n throw new bn(null, o);\n}\nfunction Xr(o) {\n return cs(o), o.headers = He.from(o.headers), o.data = ls.call(\n o,\n o.transformRequest\n ), [\"post\", \"put\", \"patch\"].indexOf(o.method) !== -1 && o.headers.setContentType(\"application/x-www-form-urlencoded\", !1), Aa.getAdapter(o.adapter || Xn.adapter, o)(o).then(function(n) {\n return cs(o), n.data = ls.call(\n o,\n o.transformResponse,\n n\n ), n.headers = He.from(n.headers), n;\n }, function(n) {\n return ba(n) || (cs(o), n && n.response && (n.response.data = ls.call(\n o,\n o.transformResponse,\n n.response\n ), n.response.headers = He.from(n.response.headers))), Promise.reject(n);\n });\n}\nconst Ca = \"1.13.2\", es = {};\n[\"object\", \"boolean\", \"number\", \"function\", \"string\", \"symbol\"].forEach((o, e) => {\n es[o] = function(n) {\n return typeof n === o || \"a\" + (e < 1 ? \"n \" : \" \") + o;\n };\n});\nconst Zr = {};\nes.transitional = function(e, t, n) {\n function i(s, r) {\n return \"[Axios v\" + Ca + \"] Transitional option '\" + s + \"'\" + r + (n ? \". \" + n : \"\");\n }\n return (s, r, a) => {\n if (e === !1)\n throw new re(\n i(r, \" has been removed\" + (t ? \" in \" + t : \"\")),\n re.ERR_DEPRECATED\n );\n return t && !Zr[r] && (Zr[r] = !0, console.warn(\n i(\n r,\n \" has been deprecated since v\" + t + \" and will be removed in the near future\"\n )\n )), e ? e(s, r, a) : !0;\n };\n};\nes.spelling = function(e) {\n return (t, n) => (console.warn(`${n} is likely a misspelling of ${e}`), !0);\n};\nfunction Wh(o, e, t) {\n if (typeof o != \"object\")\n throw new re(\"options must be an object\", re.ERR_BAD_OPTION_VALUE);\n const n = Object.keys(o);\n let i = n.length;\n for (; i-- > 0; ) {\n const s = n[i], r = e[s];\n if (r) {\n const a = o[s], l = a === void 0 || r(a, s, o);\n if (l !== !0)\n throw new re(\"option \" + s + \" must be \" + l, re.ERR_BAD_OPTION_VALUE);\n continue;\n }\n if (t !== !0)\n throw new re(\"Unknown option \" + s, re.ERR_BAD_OPTION);\n }\n}\nconst ki = {\n assertOptions: Wh,\n validators: es\n}, lt = ki.validators;\nlet $t = class {\n constructor(e) {\n this.defaults = e || {}, this.interceptors = {\n request: new zr(),\n response: new zr()\n };\n }\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(e, t) {\n try {\n return await this._request(e, t);\n } catch (n) {\n if (n instanceof Error) {\n let i = {};\n Error.captureStackTrace ? Error.captureStackTrace(i) : i = new Error();\n const s = i.stack ? i.stack.replace(/^.+\\n/, \"\") : \"\";\n try {\n n.stack ? s && !String(n.stack).endsWith(s.replace(/^.+\\n.+\\n/, \"\")) && (n.stack += `\n` + s) : n.stack = s;\n } catch {\n }\n }\n throw n;\n }\n }\n _request(e, t) {\n typeof e == \"string\" ? (t = t || {}, t.url = e) : t = e || {}, t = Qt(this.defaults, t);\n const { transitional: n, paramsSerializer: i, headers: s } = t;\n n !== void 0 && ki.assertOptions(n, {\n silentJSONParsing: lt.transitional(lt.boolean),\n forcedJSONParsing: lt.transitional(lt.boolean),\n clarifyTimeoutError: lt.transitional(lt.boolean)\n }, !1), i != null && (U.isFunction(i) ? t.paramsSerializer = {\n serialize: i\n } : ki.assertOptions(i, {\n encode: lt.function,\n serialize: lt.function\n }, !0)), t.allowAbsoluteUrls !== void 0 || (this.defaults.allowAbsoluteUrls !== void 0 ? t.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls : t.allowAbsoluteUrls = !0), ki.assertOptions(t, {\n baseUrl: lt.spelling(\"baseURL\"),\n withXsrfToken: lt.spelling(\"withXSRFToken\")\n }, !0), t.method = (t.method || this.defaults.method || \"get\").toLowerCase();\n let r = s && U.merge(\n s.common,\n s[t.method]\n );\n s && U.forEach(\n [\"delete\", \"get\", \"head\", \"post\", \"put\", \"patch\", \"common\"],\n (d) => {\n delete s[d];\n }\n ), t.headers = He.concat(r, s);\n const a = [];\n let l = !0;\n this.interceptors.request.forEach(function(p) {\n typeof p.runWhen == \"function\" && p.runWhen(t) === !1 || (l = l && p.synchronous, a.unshift(p.fulfilled, p.rejected));\n });\n const h = [];\n this.interceptors.response.forEach(function(p) {\n h.push(p.fulfilled, p.rejected);\n });\n let c, u = 0, m;\n if (!l) {\n const d = [Xr.bind(this), void 0];\n for (d.unshift(...a), d.push(...h), m = d.length, c = Promise.resolve(t); u < m; )\n c = c.then(d[u++], d[u++]);\n return c;\n }\n m = a.length;\n let f = t;\n for (; u < m; ) {\n const d = a[u++], p = a[u++];\n try {\n f = d(f);\n } catch (g) {\n p.call(this, g);\n break;\n }\n }\n try {\n c = Xr.call(this, f);\n } catch (d) {\n return Promise.reject(d);\n }\n for (u = 0, m = h.length; u < m; )\n c = c.then(h[u++], h[u++]);\n return c;\n }\n getUri(e) {\n e = Qt(this.defaults, e);\n const t = Sa(e.baseURL, e.url, e.allowAbsoluteUrls);\n return xa(t, e.params, e.paramsSerializer);\n }\n};\nU.forEach([\"delete\", \"get\", \"head\", \"options\"], function(e) {\n $t.prototype[e] = function(t, n) {\n return this.request(Qt(n || {}, {\n method: e,\n url: t,\n data: (n || {}).data\n }));\n };\n});\nU.forEach([\"post\", \"put\", \"patch\"], function(e) {\n function t(n) {\n return function(s, r, a) {\n return this.request(Qt(a || {}, {\n method: e,\n headers: n ? {\n \"Content-Type\": \"multipart/form-data\"\n } : {},\n url: s,\n data: r\n }));\n };\n }\n $t.prototype[e] = t(), $t.prototype[e + \"Form\"] = t(!0);\n});\nlet Xh = class Pa {\n constructor(e) {\n if (typeof e != \"function\")\n throw new TypeError(\"executor must be a function.\");\n let t;\n this.promise = new Promise(function(s) {\n t = s;\n });\n const n = this;\n this.promise.then((i) => {\n if (!n._listeners) return;\n let s = n._listeners.length;\n for (; s-- > 0; )\n n._listeners[s](i);\n n._listeners = null;\n }), this.promise.then = (i) => {\n let s;\n const r = new Promise((a) => {\n n.subscribe(a), s = a;\n }).then(i);\n return r.cancel = function() {\n n.unsubscribe(s);\n }, r;\n }, e(function(s, r, a) {\n n.reason || (n.reason = new bn(s, r, a), t(n.reason));\n });\n }\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason)\n throw this.reason;\n }\n /**\n * Subscribe to the cancel signal\n */\n subscribe(e) {\n if (this.reason) {\n e(this.reason);\n return;\n }\n this._listeners ? this._listeners.push(e) : this._listeners = [e];\n }\n /**\n * Unsubscribe from the cancel signal\n */\n unsubscribe(e) {\n if (!this._listeners)\n return;\n const t = this._listeners.indexOf(e);\n t !== -1 && this._listeners.splice(t, 1);\n }\n toAbortSignal() {\n const e = new AbortController(), t = (n) => {\n e.abort(n);\n };\n return this.subscribe(t), e.signal.unsubscribe = () => this.unsubscribe(t), e.signal;\n }\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let e;\n return {\n token: new Pa(function(i) {\n e = i;\n }),\n cancel: e\n };\n }\n};\nfunction Zh(o) {\n return function(t) {\n return o.apply(null, t);\n };\n}\nfunction qh(o) {\n return U.isObject(o) && o.isAxiosError === !0;\n}\nconst Gs = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n WebServerIsDown: 521,\n ConnectionTimedOut: 522,\n OriginIsUnreachable: 523,\n TimeoutOccurred: 524,\n SslHandshakeFailed: 525,\n InvalidSslCertificate: 526\n};\nObject.entries(Gs).forEach(([o, e]) => {\n Gs[e] = o;\n});\nfunction Ra(o) {\n const e = new $t(o), t = aa($t.prototype.request, e);\n return U.extend(t, $t.prototype, e, { allOwnKeys: !0 }), U.extend(t, e, null, { allOwnKeys: !0 }), t.create = function(i) {\n return Ra(Qt(o, i));\n }, t;\n}\nconst xe = Ra(Xn);\nxe.Axios = $t;\nxe.CanceledError = bn;\nxe.CancelToken = Xh;\nxe.isCancel = ba;\nxe.VERSION = Ca;\nxe.toFormData = Qi;\nxe.AxiosError = re;\nxe.Cancel = xe.CanceledError;\nxe.all = function(e) {\n return Promise.all(e);\n};\nxe.spread = Zh;\nxe.isAxiosError = qh;\nxe.mergeConfig = Qt;\nxe.AxiosHeaders = He;\nxe.formToJSON = (o) => va(U.isHTMLForm(o) ? new FormData(o) : o);\nxe.getAdapter = Aa.getAdapter;\nxe.HttpStatusCode = Gs;\nxe.default = xe;\nconst {\n Axios: Op,\n AxiosError: Bp,\n CanceledError: Np,\n isCancel: Fp,\n CancelToken: Up,\n VERSION: Vp,\n all: Hp,\n Cancel: jp,\n isAxiosError: Gp,\n spread: Wp,\n toFormData: Xp,\n AxiosHeaders: Zp,\n HttpStatusCode: qp,\n formToJSON: Yp,\n getAdapter: Kp,\n mergeConfig: $p\n} = xe;\nfunction qr(o, e) {\n var t;\n if (window.XMLHttpRequest ? t = new XMLHttpRequest() : window.ActiveXObject ? t = new window.ActiveXObject() : alert(\"请升级至最新版本的浏览器\"), t != null) {\n let n = o;\n t.open(\"GET\", n, !0), t.send(null), t.onreadystatechange = function() {\n t.readyState == 4 && t.status == 200 && (t.responseText.includes(\"\", 0) && t.responseText.includes(\"\", 0) && t.responseText.includes(\"\", 0) ? e(null) : e(t.responseText));\n }, t.onloadend = function() {\n t.readyState == 4 && t.status == 404 && t.status == 502 && e(null);\n };\n }\n}\nfunction Yh(o, e) {\n xe({\n method: \"get\",\n responseType: \"blob\",\n url: o\n }).then((t) => {\n let n = new window.File([t.data], \"zipFolder\", {\n type: \"zip\"\n });\n oa.loadAsync(n).then((i) => {\n const s = /* @__PURE__ */ new Map(), r = [];\n for (let a in i.files) {\n if (i.files[a].dir)\n continue;\n const l = i.file(i.files[a].name);\n if (l) {\n const h = l.async(\"blob\").then((c) => {\n const u = URL.createObjectURL(c);\n s.set(\"/\" + i.files[a].name.replace(\"\\\\\", \"/\"), u);\n });\n r.push(h);\n }\n }\n Promise.all(r).then(() => {\n e(s);\n }).catch((a) => {\n console.error(\"解压zip文件失败:\", a), e(/* @__PURE__ */ new Map());\n });\n }).catch((i) => {\n console.error(\"加载zip文件失败:\", i), e(/* @__PURE__ */ new Map());\n });\n }).catch((t) => {\n console.error(\"下载zip文件失败:\", t), e(/* @__PURE__ */ new Map());\n });\n}\nfunction Da(o, e) {\n xe({\n method: \"get\",\n responseType: \"blob\",\n url: o\n }).then((n) => {\n let i = new window.File([n.data], \"semantics\", {\n type: \"zip\"\n });\n oa.loadAsync(i).then((s) => {\n for (let r in s.files)\n s.file(s.files[r].name).async(\"blob\").then((l) => {\n t(l, \"utf-8\", function(h, c) {\n e(c);\n });\n });\n });\n });\n function t(n, i, s) {\n var r = new FileReader(), a = new Blob([n]);\n r.onload = function(l) {\n s(null, l.target.result);\n }, r.onerror = function(l) {\n s(l.error, null);\n }, r.readAsText(a, i);\n }\n}\nconst hs = /* @__PURE__ */ new WeakMap();\nclass Kh extends Zo {\n /**\n * Constructs a new Draco loader.\n *\n * @param {LoadingManager} [manager] - The loading manager.\n */\n constructor(e) {\n super(e), this.decoderPath = \"\", this.decoderConfig = {}, this.decoderBinary = null, this.decoderPending = null, this.workerLimit = 4, this.workerPool = [], this.workerNextTaskID = 1, this.workerSourceURL = \"\", this.defaultAttributeIDs = {\n position: \"POSITION\",\n normal: \"NORMAL\",\n color: \"COLOR\",\n uv: \"TEX_COORD\"\n }, this.defaultAttributeTypes = {\n position: \"Float32Array\",\n normal: \"Float32Array\",\n color: \"Float32Array\",\n uv: \"Float32Array\"\n };\n }\n /**\n * Provides configuration for the decoder libraries. Configuration cannot be changed after decoding begins.\n *\n * @param {string} path - The decoder path.\n * @return {DRACOLoader} A reference to this loader.\n */\n setDecoderPath(e) {\n return this.decoderPath = e, this;\n }\n /**\n * Provides configuration for the decoder libraries. Configuration cannot be changed after decoding begins.\n *\n * @param {{type:('js'|'wasm')}} config - The decoder config.\n * @return {DRACOLoader} A reference to this loader.\n */\n setDecoderConfig(e) {\n return this.decoderConfig = e, this;\n }\n /**\n * Sets the maximum number of Web Workers to be used during decoding.\n * A lower limit may be preferable if workers are also for other tasks in the application.\n *\n * @param {number} workerLimit - The worker limit.\n * @return {DRACOLoader} A reference to this loader.\n */\n setWorkerLimit(e) {\n return this.workerLimit = e, this;\n }\n /**\n * Starts loading from the given URL and passes the loaded Draco asset\n * to the `onLoad()` callback.\n *\n * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n load(e, t, n, i) {\n const s = new Ui(this.manager);\n s.setPath(this.path), s.setResponseType(\"arraybuffer\"), s.setRequestHeader(this.requestHeader), s.setWithCredentials(this.withCredentials), s.load(e, (r) => {\n this.parse(r, t, i);\n }, n, i);\n }\n /**\n * Parses the given Draco data.\n *\n * @param {ArrayBuffer} buffer - The raw Draco data as an array buffer.\n * @param {function(BufferGeometry)} onLoad - Executed when the loading/parsing process has been finished.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n parse(e, t, n = () => {\n }) {\n this.decodeDracoFile(e, t, null, null, Lt, n).catch(n);\n }\n //\n decodeDracoFile(e, t, n, i, s = rt, r = () => {\n }) {\n const a = {\n attributeIDs: n || this.defaultAttributeIDs,\n attributeTypes: i || this.defaultAttributeTypes,\n useUniqueIDs: !!n,\n vertexColorSpace: s\n };\n return this.decodeGeometry(e, a).then(t).catch(r);\n }\n decodeGeometry(e, t) {\n const n = JSON.stringify(t);\n if (hs.has(e)) {\n const l = hs.get(e);\n if (l.key === n)\n return l.promise;\n if (e.byteLength === 0)\n throw new Error(\n \"THREE.DRACOLoader: Unable to re-decode a buffer with different settings. Buffer has already been transferred.\"\n );\n }\n let i;\n const s = this.workerNextTaskID++, r = e.byteLength, a = this._getWorker(s, r).then((l) => (i = l, new Promise((h, c) => {\n i._callbacks[s] = { resolve: h, reject: c }, i.postMessage({ type: \"decode\", id: s, taskConfig: t, buffer: e }, [e]);\n }))).then((l) => this._createGeometry(l.geometry));\n return a.catch(() => !0).then(() => {\n i && s && this._releaseTask(i, s);\n }), hs.set(e, {\n key: n,\n promise: a\n }), a;\n }\n _createGeometry(e) {\n const t = new Zi();\n e.index && t.setIndex(new ut(e.index.array, 1));\n for (let n = 0; n < e.attributes.length; n++) {\n const { name: i, array: s, itemSize: r, stride: a, vertexColorSpace: l } = e.attributes[n];\n let h;\n if (r === a)\n h = new ut(s, r);\n else {\n const c = new qo(s, a);\n h = new Yo(c, r, 0);\n }\n i === \"color\" && (this._assignVertexColorSpace(h, l), h.normalized = !(s instanceof Float32Array)), t.setAttribute(i, h);\n }\n return t;\n }\n _assignVertexColorSpace(e, t) {\n if (t !== Lt) return;\n const n = new st();\n for (let i = 0, s = e.count; i < s; i++)\n n.fromBufferAttribute(e, i), Fi.colorSpaceToWorking(n, Lt), e.setXYZ(i, n.r, n.g, n.b);\n }\n _loadLibrary(e, t) {\n const n = new Ui(this.manager);\n return n.setPath(this.decoderPath), n.setResponseType(t), n.setWithCredentials(this.withCredentials), new Promise((i, s) => {\n n.load(e, i, void 0, s);\n });\n }\n preload() {\n return this._initDecoder(), this;\n }\n _initDecoder() {\n if (this.decoderPending) return this.decoderPending;\n const e = typeof WebAssembly != \"object\" || this.decoderConfig.type === \"js\", t = [];\n return e ? t.push(this._loadLibrary(\"draco_decoder.js\", \"text\")) : (t.push(this._loadLibrary(\"draco_wasm_wrapper.js\", \"text\")), t.push(this._loadLibrary(\"draco_decoder.wasm\", \"arraybuffer\"))), this.decoderPending = Promise.all(t).then((n) => {\n const i = n[0];\n e || (this.decoderConfig.wasmBinary = n[1]);\n const s = $h.toString(), r = [\n \"/* draco decoder */\",\n i,\n \"\",\n \"/* worker */\",\n s.substring(s.indexOf(\"{\") + 1, s.lastIndexOf(\"}\"))\n ].join(`\n`);\n this.workerSourceURL = URL.createObjectURL(new Blob([r]));\n }), this.decoderPending;\n }\n _getWorker(e, t) {\n return this._initDecoder().then(() => {\n if (this.workerPool.length < this.workerLimit) {\n const i = new Worker(this.workerSourceURL);\n i._callbacks = {}, i._taskCosts = {}, i._taskLoad = 0, i.postMessage({ type: \"init\", decoderConfig: this.decoderConfig }), i.onmessage = function(s) {\n const r = s.data;\n switch (r.type) {\n case \"decode\":\n i._callbacks[r.id].resolve(r);\n break;\n case \"error\":\n i._callbacks[r.id].reject(r);\n break;\n default:\n console.error('THREE.DRACOLoader: Unexpected message, \"' + r.type + '\"');\n }\n }, this.workerPool.push(i);\n } else\n this.workerPool.sort(function(i, s) {\n return i._taskLoad > s._taskLoad ? -1 : 1;\n });\n const n = this.workerPool[this.workerPool.length - 1];\n return n._taskCosts[e] = t, n._taskLoad += t, n;\n });\n }\n _releaseTask(e, t) {\n e._taskLoad -= e._taskCosts[t], delete e._callbacks[t], delete e._taskCosts[t];\n }\n debug() {\n console.log(\"Task load: \", this.workerPool.map((e) => e._taskLoad));\n }\n dispose() {\n for (let e = 0; e < this.workerPool.length; ++e)\n this.workerPool[e].terminate();\n return this.workerPool.length = 0, this.workerSourceURL !== \"\" && URL.revokeObjectURL(this.workerSourceURL), this;\n }\n}\nfunction $h() {\n let o, e;\n onmessage = function(r) {\n const a = r.data;\n switch (a.type) {\n case \"init\":\n o = a.decoderConfig, e = new Promise(function(c) {\n o.onModuleLoaded = function(u) {\n c({ draco: u });\n }, DracoDecoderModule(o);\n });\n break;\n case \"decode\":\n const l = a.buffer, h = a.taskConfig;\n e.then((c) => {\n const u = c.draco, m = new u.Decoder();\n try {\n const f = t(u, m, new Int8Array(l), h), d = f.attributes.map((p) => p.array.buffer);\n f.index && d.push(f.index.array.buffer), self.postMessage({ type: \"decode\", id: a.id, geometry: f }, d);\n } catch (f) {\n console.error(f), self.postMessage({ type: \"error\", id: a.id, error: f.message });\n } finally {\n u.destroy(m);\n }\n });\n break;\n }\n };\n function t(r, a, l, h) {\n const c = h.attributeIDs, u = h.attributeTypes;\n let m, f;\n const d = a.GetEncodedGeometryType(l);\n if (d === r.TRIANGULAR_MESH)\n m = new r.Mesh(), f = a.DecodeArrayToMesh(l, l.byteLength, m);\n else if (d === r.POINT_CLOUD)\n m = new r.PointCloud(), f = a.DecodeArrayToPointCloud(l, l.byteLength, m);\n else\n throw new Error(\"THREE.DRACOLoader: Unexpected geometry type.\");\n if (!f.ok() || m.ptr === 0)\n throw new Error(\"THREE.DRACOLoader: Decoding failed: \" + f.error_msg());\n const p = { index: null, attributes: [] };\n for (const g in c) {\n const y = self[u[g]];\n let w, x;\n if (h.useUniqueIDs)\n x = c[g], w = a.GetAttributeByUniqueId(m, x);\n else {\n if (x = a.GetAttributeId(m, r[c[g]]), x === -1) continue;\n w = a.GetAttribute(m, x);\n }\n const _ = i(r, a, m, g, y, w);\n g === \"color\" && (_.vertexColorSpace = h.vertexColorSpace), p.attributes.push(_);\n }\n return d === r.TRIANGULAR_MESH && (p.index = n(r, a, m)), r.destroy(m), p;\n }\n function n(r, a, l) {\n const c = l.num_faces() * 3, u = c * 4, m = r._malloc(u);\n a.GetTrianglesUInt32Array(l, u, m);\n const f = new Uint32Array(r.HEAPF32.buffer, m, c).slice();\n return r._free(m), { array: f, itemSize: 1 };\n }\n function i(r, a, l, h, c, u) {\n const m = l.num_points(), f = u.num_components(), d = s(r, c), p = f * c.BYTES_PER_ELEMENT, g = Math.ceil(p / 4) * 4, y = g / c.BYTES_PER_ELEMENT, w = m * p, x = m * g, _ = r._malloc(w);\n a.GetAttributeDataArrayForAllPoints(l, u, d, w, _);\n const b = new c(r.HEAPF32.buffer, _, w / c.BYTES_PER_ELEMENT);\n let E;\n if (p === g)\n E = b.slice();\n else {\n E = new c(x / c.BYTES_PER_ELEMENT);\n let A = 0;\n for (let P = 0, C = b.length; P < C; P++) {\n for (let D = 0; D < f; D++)\n E[A + D] = b[P * f + D];\n A += y;\n }\n }\n return r._free(_), {\n name: h,\n count: m,\n itemSize: f,\n array: E,\n stride: y\n };\n }\n function s(r, a) {\n switch (a) {\n case Float32Array:\n return r.DT_FLOAT32;\n case Int8Array:\n return r.DT_INT8;\n case Int16Array:\n return r.DT_INT16;\n case Int32Array:\n return r.DT_INT32;\n case Uint8Array:\n return r.DT_UINT8;\n case Uint16Array:\n return r.DT_UINT16;\n case Uint32Array:\n return r.DT_UINT32;\n }\n }\n}\nvar zt = /* @__PURE__ */ ((o) => (o.ModelLoadStart = \"model-load-start\", o.ModelLoadProgress = \"model-load-progress\", o.ModelLoaded = \"model-loaded\", o.ModelError = \"model-error\", o.SelectionChanged = \"selection-changed\", o.HoverChanged = \"hover-changed\", o.Click = \"click\", o.MouseMove = \"mouse-move\", o.CameraChanged = \"camera-changed\", o.CameraIdle = \"camera-idle\", o.ViewportResize = \"viewport-resize\", o.EngineFree = \"engine-free\", o.EngineBusy = \"engine-busy\", o.MeasureChanged = \"measure-changed\", o.SectionMove = \"section-move\", o))(zt || {});\nfunction Jh(o, e, t, n) {\n let i = 0, s = 0, r = 0, a = o.models.find((f) => f.url == t), l = e.circularMeps, h = e.rectMeps.filter((f) => f.type === \"风管\"), c = e.rectMeps.filter((f) => f.type === \"桥架\"), u = e.ellipseMeps, m = o.scene;\n if (new M.MeshBasicMaterial(), new M.BufferGeometry(), l && l.length) {\n let f = [], d = 0;\n for (let p of l)\n p.color = p.color.split(\",\").map((g) => parseInt(g) / 255), p.color = new M.Color(p.color[0], p.color[1], p.color[2]), p.position = {\n x: p.startPoint.X * 0.3048 + i,\n y: p.startPoint.Z * 0.3048 + s,\n z: -p.startPoint.Y * 0.3048 + r\n }, p.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, p.indexes = [\n [o.scene.children.length, d++, 0, 0]\n ], a.nodesMap.set(Number(p.id), p), f.push(p);\n oi(\"Circle\", m, f, t);\n }\n if (h && h.length) {\n let f = [], d = 0;\n for (let p of h)\n p.color = p.color.split(\",\").map((g) => parseInt(g) / 255), p.color = new M.Color(p.color[0], p.color[1], p.color[2]), p.position = {\n x: p.startPoint.X * 0.3048 + i,\n y: p.startPoint.Z * 0.3048 + s,\n z: -p.startPoint.Y * 0.3048 + r\n }, p.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, p.indexes = [\n [o.scene.children.length, d++, 0, 0]\n ], a.nodesMap.set(Number(p.id), p), f.push(p);\n oi(\"Rect\", m, f, t);\n }\n if (u && u.length) {\n let f = [], d = 0;\n for (let p of u)\n p.color = p.color.split(\",\").map((g) => parseInt(g) / 255), p.color = new M.Color(p.color[0], p.color[1], p.color[2]), p.position = {\n x: p.startPoint.X * 0.3048 + i,\n y: p.startPoint.Z * 0.3048 + s,\n z: -p.startPoint.Y * 0.3048 + r\n }, p.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, p.indexes = [\n [o.scene.children.length, d++, 0, 0]\n ], a.nodesMap.set(Number(p.id), p), f.push(p);\n oi(\"Ellipse\", m, f, t);\n }\n if (c && c.length) {\n let f = [], d = 0;\n for (let p of c)\n p.color = p.color.split(\",\").map((g) => parseInt(g) / 255), p.color = new M.Color(p.color[0], p.color[1], p.color[2]), p.position = {\n x: p.startPoint.X * 0.3048 + i,\n y: p.startPoint.Z * 0.3048 + s,\n z: -p.startPoint.Y * 0.3048 + r\n }, p.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, p.indexes = [\n [o.scene.children.length, d++, 0, 0]\n ], a.nodesMap.set(Number(p.id), p), f.push(p);\n oi(\"Bridge\", m, f, t);\n }\n}\nfunction oi(o, e, t, n, i) {\n let s, r, a = {\n width: 1,\n height: 1,\n length: 1,\n diameter: 1,\n color: new M.Color(),\n position: {\n x: 0,\n y: 0,\n z: 0\n },\n rotation: {\n x: 0,\n y: 0,\n z: 0\n }\n };\n switch (o) {\n case \"Rect\":\n r = ai(\"Rect\", a);\n break;\n case \"Bridge\":\n r = ai(\"Bridge\", a);\n break;\n case \"Circle\":\n r = ai(\"Circle\", a);\n break;\n case \"Ellipse\":\n r = ai(\"Ellipse\", a);\n break;\n }\n r && (s = new M.InstancedMesh(r.geometry, r.material, t.length), s.url = n, e.add(s));\n let l = [], h = [];\n for (var c = 0; c < t.length; c++) {\n let f = t[c], d = new M.Vector3(f.startPoint.X, 0, -f.startPoint.Y), p = new M.Vector3(f.endPoint.X, 0, -f.endPoint.Y), g = new M.Vector3(f.startPoint.X, f.startPoint.Z, -f.startPoint.Y), y = new M.Vector3(f.endPoint.X, f.endPoint.Z, -f.endPoint.Y), w = 0, x = 0, _ = 0;\n if (Math.abs(p.clone().sub(d.clone()).z) < 0.01 && Math.abs(p.clone().sub(d.clone()).x) < 0.01) {\n if (w = (f.startPoint.Z > f.endPoint.Z ? 1 : -1) * Math.PI * 0.5, f.base_x != null) {\n var u = new M.Vector3(f.base_x.X, 0, -f.base_x.Y);\n x = (u.clone().cross(new M.Vector3(0, 0, 1)).y <= 0 ? 1 : -1) * u.angleTo(new M.Vector3(0, 0, 1)) + Math.PI * 0.5;\n }\n } else\n x = (p.clone().sub(d.clone()).cross(new M.Vector3(0, 0, 1)).y > 0 ? -1 : 1) * p.clone().sub(d.clone()).angleTo(new M.Vector3(0, 0, 1)), w = (f.startPoint.Z > f.endPoint.Z ? 1 : -1) * p.clone().sub(d.clone()).angleTo(y.clone().sub(g.clone()));\n let b = new M.Matrix4();\n const E = new M.Euler(w, x, _, \"YXZ\");\n let A = b.clone().makeRotationFromEuler(E), P, C;\n o === \"Circle\" ? (P = f.diameter, C = f.diameter) : (P = f.width, C = f.height);\n let D = b.clone().makeScale(P, C, f.length);\n b.multiplyMatrices(A, D), b.setPosition(f.position.x, f.position.y, f.position.z), s.setMatrixAt(c, b.clone()), s.setColorAt(c, f.color), s.geometry.computeBoundingBox();\n let I = s.geometry.boundingBox.min.clone().applyMatrix4(b.clone()), T = s.geometry.boundingBox.max.clone().applyMatrix4(b.clone()), R = new M.Vector3(Math.min(I.x, T.x), Math.min(I.y, T.y), Math.min(I.z, T.z)), v = new M.Vector3(Math.max(I.x, T.x), Math.max(I.y, T.y), Math.max(I.z, T.z)), z = R.clone().add(v.clone()).multiplyScalar(0.5), H = {\n name: f.name,\n min: R,\n max: v,\n center: z,\n dbid: c,\n // url: path + \"/\" + type,\n // basePath: url,\n // relativePath: relativePath,\n materialName: r.material.name\n }, V = null, te = null;\n o === \"Circle\" && (V = {\n x: f.startPoint.X * 0.3048,\n y: f.startPoint.Z * 0.3048,\n z: -f.startPoint.Y * 0.3048\n }, te = {\n x: f.endPoint.X * 0.3048,\n y: f.endPoint.Z * 0.3048,\n z: -f.endPoint.Y * 0.3048\n }, H.minC = V, H.maxC = te), s.ids || (s.ids = []), s.matrixs || (s.matrixs = []), s.matrixs.push(b.clone()), h.push(b.clone()), s.ids.push(Number(f.id)), l.push(H);\n }\n s.castShadow = !0, s.ElementInfos = l, s.name = \"rootModel\", s.TypeName = \"InstancedMesh-Pipe\", s.PipeType = o, s.MeshId = null, s.realMaterial = s.material.clone(), s.originalMaterial = s.material.clone(), s.materialClone = h;\n let m = [];\n m = {\n geometry: s.geometry,\n matrix: s.matrix,\n position: s.position,\n rotation: s.rotation\n }, s.meshs = m, s.instanceMatrix && s.instanceMatrix.array && (s.cloneInstanceMatrix = Array.from(s.instanceMatrix.array));\n}\nfunction ai(o, e, t) {\n let n = new M.Shape();\n switch (e.width = e.width * 0.3048, e.height = e.height * 0.3048, e.diameter = e.diameter * 0.3048, o) {\n case \"Rect\":\n n.moveTo(-e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, e.height / 2), n.lineTo(e.width / 2, e.height / 2), n.lineTo(e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, -e.height / 2);\n break;\n case \"Ellipse\":\n n.moveTo(-e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, e.height / 2), n.lineTo(e.width / 2, e.height / 2), n.lineTo(e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, -e.height / 2);\n break;\n case \"Bridge\":\n n.moveTo(-e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, e.height / 2), n.lineTo(-e.width / 2 + 0.01, e.height / 2), n.lineTo(-e.width / 2 + 0.01, -e.height / 2 + 0.01), n.lineTo(e.width / 2 - 0.01, -e.height / 2 + 0.01), n.lineTo(e.width / 2 - 0.01, e.height / 2), n.lineTo(e.width / 2, e.height / 2), n.lineTo(e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, -e.height / 2);\n break;\n case \"Circle\":\n n.moveTo(0, 0), n.absarc(0, 0, e.diameter * 0.5, 0, Math.PI * 2, !1);\n break;\n }\n const i = {\n depth: e.length * 0.3048,\n //拉伸长度\n bevelEnabled: !1\n };\n return s(n, i, e.color, e.position, e.rotation);\n function s(r, a, l, h, c) {\n let u = new M.ExtrudeGeometry(r, a), m = new M.MeshStandardMaterial({\n color: l,\n side: M.DoubleSide\n //metalness: 0.8, //金属度\n //roughness: 0.1, //粗糙度\n // depthTest:false\n // name: path + \"/\" + type + \"/material\"\n }), f = new M.Mesh(u, m);\n return f.position.set(h.x, h.y, h.z), f.rotation._order = \"YXZ\", f.rotation.set(c.x, c.y, c.z), f;\n }\n}\nfunction ka(o, e = !1) {\n const t = o[0].index !== null, n = new Set(Object.keys(o[0].attributes)), i = new Set(Object.keys(o[0].morphAttributes)), s = {}, r = {}, a = o[0].morphTargetsRelative, l = new Zi();\n let h = 0;\n for (let c = 0; c < o.length; ++c) {\n const u = o[c];\n let m = 0;\n if (t !== (u.index !== null))\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"), null;\n for (const f in u.attributes) {\n if (!n.has(f))\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + '. All geometries must have compatible attributes; make sure \"' + f + '\" attribute exists among all geometries, or in none of them.'), null;\n s[f] === void 0 && (s[f] = []), s[f].push(u.attributes[f]), m++;\n }\n if (m !== n.size)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". Make sure all geometries have the same number of attributes.\"), null;\n if (a !== u.morphTargetsRelative)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". .morphTargetsRelative must be consistent throughout all geometries.\"), null;\n for (const f in u.morphAttributes) {\n if (!i.has(f))\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". .morphAttributes must be consistent throughout all geometries.\"), null;\n r[f] === void 0 && (r[f] = []), r[f].push(u.morphAttributes[f]);\n }\n if (e) {\n let f;\n if (t)\n f = u.index.count;\n else if (u.attributes.position !== void 0)\n f = u.attributes.position.count;\n else\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". The geometry must have either an index or a position attribute\"), null;\n l.addGroup(h, f, c), h += f;\n }\n }\n if (t) {\n let c = 0;\n const u = [];\n for (let m = 0; m < o.length; ++m) {\n const f = o[m].index;\n for (let d = 0; d < f.count; ++d)\n u.push(f.getX(d) + c);\n c += o[m].attributes.position.count;\n }\n l.setIndex(u);\n }\n for (const c in s) {\n const u = Yr(s[c]);\n if (!u)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the \" + c + \" attribute.\"), null;\n l.setAttribute(c, u);\n }\n for (const c in r) {\n const u = r[c][0].length;\n if (u === 0) break;\n l.morphAttributes = l.morphAttributes || {}, l.morphAttributes[c] = [];\n for (let m = 0; m < u; ++m) {\n const f = [];\n for (let p = 0; p < r[c].length; ++p)\n f.push(r[c][p][m]);\n const d = Yr(f);\n if (!d)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the \" + c + \" morphAttribute.\"), null;\n l.morphAttributes[c].push(d);\n }\n }\n return l;\n}\nfunction Yr(o) {\n let e, t, n, i = -1, s = 0;\n for (let h = 0; h < o.length; ++h) {\n const c = o[h];\n if (e === void 0 && (e = c.array.constructor), e !== c.array.constructor)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"), null;\n if (t === void 0 && (t = c.itemSize), t !== c.itemSize)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"), null;\n if (n === void 0 && (n = c.normalized), n !== c.normalized)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"), null;\n if (i === -1 && (i = c.gpuType), i !== c.gpuType)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.\"), null;\n s += c.count * t;\n }\n const r = new e(s), a = new ut(r, t, n);\n let l = 0;\n for (let h = 0; h < o.length; ++h) {\n const c = o[h];\n if (c.isInterleavedBufferAttribute) {\n const u = l / t;\n for (let m = 0, f = c.count; m < f; m++)\n for (let d = 0; d < t; d++) {\n const p = c.getComponent(m, d);\n a.setComponent(m + u, d, p);\n }\n } else\n r.set(c.array, l);\n l += c.count * t;\n }\n return i !== void 0 && (a.gpuType = i), a;\n}\nfunction Kr(o, e) {\n if (e === cl)\n return console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\"), o;\n if (e === Fs || e === Ko) {\n let t = o.getIndex();\n if (t === null) {\n const r = [], a = o.getAttribute(\"position\");\n if (a !== void 0) {\n for (let l = 0; l < a.count; l++)\n r.push(l);\n o.setIndex(r), t = o.getIndex();\n } else\n return console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"), o;\n }\n const n = t.count - 2, i = [];\n if (e === Fs)\n for (let r = 1; r <= n; r++)\n i.push(t.getX(0)), i.push(t.getX(r)), i.push(t.getX(r + 1));\n else\n for (let r = 0; r < n; r++)\n r % 2 === 0 ? (i.push(t.getX(r)), i.push(t.getX(r + 1)), i.push(t.getX(r + 2))) : (i.push(t.getX(r + 2)), i.push(t.getX(r + 1)), i.push(t.getX(r)));\n i.length / 3 !== n && console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n const s = o.clone();\n return s.setIndex(i), s.clearGroups(), s;\n } else\n return console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", e), o;\n}\nclass Qh extends Zo {\n /**\n * Constructs a new glTF loader.\n *\n * @param {LoadingManager} [manager] - The loading manager.\n */\n constructor(e) {\n super(e), this.dracoLoader = null, this.ktx2Loader = null, this.meshoptDecoder = null, this.pluginCallbacks = [], this.register(function(t) {\n return new su(t);\n }), this.register(function(t) {\n return new ru(t);\n }), this.register(function(t) {\n return new pu(t);\n }), this.register(function(t) {\n return new mu(t);\n }), this.register(function(t) {\n return new gu(t);\n }), this.register(function(t) {\n return new au(t);\n }), this.register(function(t) {\n return new lu(t);\n }), this.register(function(t) {\n return new cu(t);\n }), this.register(function(t) {\n return new hu(t);\n }), this.register(function(t) {\n return new iu(t);\n }), this.register(function(t) {\n return new uu(t);\n }), this.register(function(t) {\n return new ou(t);\n }), this.register(function(t) {\n return new fu(t);\n }), this.register(function(t) {\n return new du(t);\n }), this.register(function(t) {\n return new tu(t);\n }), this.register(function(t) {\n return new yu(t);\n }), this.register(function(t) {\n return new wu(t);\n });\n }\n /**\n * Starts loading from the given URL and passes the loaded glTF asset\n * to the `onLoad()` callback.\n *\n * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n * @param {function(GLTFLoader~LoadObject)} onLoad - Executed when the loading process has been finished.\n * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n load(e, t, n, i) {\n const s = this;\n let r;\n if (this.resourcePath !== \"\")\n r = this.resourcePath;\n else if (this.path !== \"\") {\n const h = Nn.extractUrlBase(e);\n r = Nn.resolveURL(h, this.path);\n } else\n r = Nn.extractUrlBase(e);\n this.manager.itemStart(e);\n const a = function(h) {\n i ? i(h) : console.error(h), s.manager.itemError(e), s.manager.itemEnd(e);\n }, l = new Ui(this.manager);\n l.setPath(this.path), l.setResponseType(\"arraybuffer\"), l.setRequestHeader(this.requestHeader), l.setWithCredentials(this.withCredentials), l.load(e, function(h) {\n try {\n s.parse(h, r, function(c) {\n t(c), s.manager.itemEnd(e);\n }, a);\n } catch (c) {\n a(c);\n }\n }, n, a);\n }\n /**\n * Sets the given Draco loader to this loader. Required for decoding assets\n * compressed with the `KHR_draco_mesh_compression` extension.\n *\n * @param {DRACOLoader} dracoLoader - The Draco loader to set.\n * @return {GLTFLoader} A reference to this loader.\n */\n setDRACOLoader(e) {\n return this.dracoLoader = e, this;\n }\n /**\n * Sets the given KTX2 loader to this loader. Required for loading KTX2\n * compressed textures.\n *\n * @param {KTX2Loader} ktx2Loader - The KTX2 loader to set.\n * @return {GLTFLoader} A reference to this loader.\n */\n setKTX2Loader(e) {\n return this.ktx2Loader = e, this;\n }\n /**\n * Sets the given meshopt decoder. Required for decoding assets\n * compressed with the `EXT_meshopt_compression` extension.\n *\n * @param {Object} meshoptDecoder - The meshopt decoder to set.\n * @return {GLTFLoader} A reference to this loader.\n */\n setMeshoptDecoder(e) {\n return this.meshoptDecoder = e, this;\n }\n /**\n * Registers a plugin callback. This API is internally used to implement the various\n * glTF extensions but can also used by third-party code to add additional logic\n * to the loader.\n *\n * @param {function(parser:GLTFParser)} callback - The callback function to register.\n * @return {GLTFLoader} A reference to this loader.\n */\n register(e) {\n return this.pluginCallbacks.indexOf(e) === -1 && this.pluginCallbacks.push(e), this;\n }\n /**\n * Unregisters a plugin callback.\n *\n * @param {Function} callback - The callback function to unregister.\n * @return {GLTFLoader} A reference to this loader.\n */\n unregister(e) {\n return this.pluginCallbacks.indexOf(e) !== -1 && this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e), 1), this;\n }\n /**\n * Parses the given FBX data and returns the resulting group.\n *\n * @param {string|ArrayBuffer} data - The raw glTF data.\n * @param {string} path - The URL base path.\n * @param {function(GLTFLoader~LoadObject)} onLoad - Executed when the loading process has been finished.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n parse(e, t, n, i) {\n let s;\n const r = {}, a = {}, l = new TextDecoder();\n if (typeof e == \"string\")\n s = JSON.parse(e);\n else if (e instanceof ArrayBuffer)\n if (l.decode(new Uint8Array(e, 0, 4)) === Ia) {\n try {\n r[le.KHR_BINARY_GLTF] = new xu(e);\n } catch (u) {\n i && i(u);\n return;\n }\n s = JSON.parse(r[le.KHR_BINARY_GLTF].content);\n } else\n s = JSON.parse(l.decode(e));\n else\n s = e;\n if (s.asset === void 0 || s.asset.version[0] < 2) {\n i && i(new Error(\"THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.\"));\n return;\n }\n const h = new ku(s, {\n path: t || this.resourcePath || \"\",\n crossOrigin: this.crossOrigin,\n requestHeader: this.requestHeader,\n manager: this.manager,\n ktx2Loader: this.ktx2Loader,\n meshoptDecoder: this.meshoptDecoder\n });\n h.fileLoader.setRequestHeader(this.requestHeader);\n for (let c = 0; c < this.pluginCallbacks.length; c++) {\n const u = this.pluginCallbacks[c](h);\n u.name || console.error(\"THREE.GLTFLoader: Invalid plugin found: missing name\"), a[u.name] = u, r[u.name] = !0;\n }\n if (s.extensionsUsed)\n for (let c = 0; c < s.extensionsUsed.length; ++c) {\n const u = s.extensionsUsed[c], m = s.extensionsRequired || [];\n switch (u) {\n case le.KHR_MATERIALS_UNLIT:\n r[u] = new nu();\n break;\n case le.KHR_DRACO_MESH_COMPRESSION:\n r[u] = new _u(s, this.dracoLoader);\n break;\n case le.KHR_TEXTURE_TRANSFORM:\n r[u] = new vu();\n break;\n case le.KHR_MESH_QUANTIZATION:\n r[u] = new bu();\n break;\n default:\n m.indexOf(u) >= 0 && a[u] === void 0 && console.warn('THREE.GLTFLoader: Unknown extension \"' + u + '\".');\n }\n }\n h.setExtensions(r), h.setPlugins(a), h.parse(n, i);\n }\n /**\n * Async version of {@link GLTFLoader#parse}.\n *\n * @async\n * @param {string|ArrayBuffer} data - The raw glTF data.\n * @param {string} path - The URL base path.\n * @return {Promise} A Promise that resolves with the loaded glTF when the parsing has been finished.\n */\n parseAsync(e, t) {\n const n = this;\n return new Promise(function(i, s) {\n n.parse(e, t, i, s);\n });\n }\n}\nfunction eu() {\n let o = {};\n return {\n get: function(e) {\n return o[e];\n },\n add: function(e, t) {\n o[e] = t;\n },\n remove: function(e) {\n delete o[e];\n },\n removeAll: function() {\n o = {};\n }\n };\n}\nconst le = {\n KHR_BINARY_GLTF: \"KHR_binary_glTF\",\n KHR_DRACO_MESH_COMPRESSION: \"KHR_draco_mesh_compression\",\n KHR_LIGHTS_PUNCTUAL: \"KHR_lights_punctual\",\n KHR_MATERIALS_CLEARCOAT: \"KHR_materials_clearcoat\",\n KHR_MATERIALS_DISPERSION: \"KHR_materials_dispersion\",\n KHR_MATERIALS_IOR: \"KHR_materials_ior\",\n KHR_MATERIALS_SHEEN: \"KHR_materials_sheen\",\n KHR_MATERIALS_SPECULAR: \"KHR_materials_specular\",\n KHR_MATERIALS_TRANSMISSION: \"KHR_materials_transmission\",\n KHR_MATERIALS_IRIDESCENCE: \"KHR_materials_iridescence\",\n KHR_MATERIALS_ANISOTROPY: \"KHR_materials_anisotropy\",\n KHR_MATERIALS_UNLIT: \"KHR_materials_unlit\",\n KHR_MATERIALS_VOLUME: \"KHR_materials_volume\",\n KHR_TEXTURE_BASISU: \"KHR_texture_basisu\",\n KHR_TEXTURE_TRANSFORM: \"KHR_texture_transform\",\n KHR_MESH_QUANTIZATION: \"KHR_mesh_quantization\",\n KHR_MATERIALS_EMISSIVE_STRENGTH: \"KHR_materials_emissive_strength\",\n EXT_MATERIALS_BUMP: \"EXT_materials_bump\",\n EXT_TEXTURE_WEBP: \"EXT_texture_webp\",\n EXT_TEXTURE_AVIF: \"EXT_texture_avif\",\n EXT_MESHOPT_COMPRESSION: \"EXT_meshopt_compression\",\n EXT_MESH_GPU_INSTANCING: \"EXT_mesh_gpu_instancing\"\n};\nclass tu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_LIGHTS_PUNCTUAL, this.cache = { refs: {}, uses: {} };\n }\n _markDefs() {\n const e = this.parser, t = this.parser.json.nodes || [];\n for (let n = 0, i = t.length; n < i; n++) {\n const s = t[n];\n s.extensions && s.extensions[this.name] && s.extensions[this.name].light !== void 0 && e._addNodeRef(this.cache, s.extensions[this.name].light);\n }\n }\n _loadLight(e) {\n const t = this.parser, n = \"light:\" + e;\n let i = t.cache.get(n);\n if (i) return i;\n const s = t.json, l = ((s.extensions && s.extensions[this.name] || {}).lights || [])[e];\n let h;\n const c = new st(16777215);\n l.color !== void 0 && c.setRGB(l.color[0], l.color[1], l.color[2], rt);\n const u = l.range !== void 0 ? l.range : 0;\n switch (l.type) {\n case \"directional\":\n h = new dl(c), h.target.position.set(0, 0, -1), h.add(h.target);\n break;\n case \"point\":\n h = new ul(c), h.distance = u;\n break;\n case \"spot\":\n h = new hl(c), h.distance = u, l.spot = l.spot || {}, l.spot.innerConeAngle = l.spot.innerConeAngle !== void 0 ? l.spot.innerConeAngle : 0, l.spot.outerConeAngle = l.spot.outerConeAngle !== void 0 ? l.spot.outerConeAngle : Math.PI / 4, h.angle = l.spot.outerConeAngle, h.penumbra = 1 - l.spot.innerConeAngle / l.spot.outerConeAngle, h.target.position.set(0, 0, -1), h.add(h.target);\n break;\n default:\n throw new Error(\"THREE.GLTFLoader: Unexpected light type: \" + l.type);\n }\n return h.position.set(0, 0, 0), ct(h, l), l.intensity !== void 0 && (h.intensity = l.intensity), h.name = t.createUniqueName(l.name || \"light_\" + e), i = Promise.resolve(h), t.cache.add(n, i), i;\n }\n getDependency(e, t) {\n if (e === \"light\")\n return this._loadLight(t);\n }\n createNodeAttachment(e) {\n const t = this, n = this.parser, s = n.json.nodes[e], a = (s.extensions && s.extensions[this.name] || {}).light;\n return a === void 0 ? null : this._loadLight(a).then(function(l) {\n return n._getNodeRef(t.cache, a, l);\n });\n }\n}\nclass nu {\n constructor() {\n this.name = le.KHR_MATERIALS_UNLIT;\n }\n getMaterialType() {\n return On;\n }\n extendParams(e, t, n) {\n const i = [];\n e.color = new st(1, 1, 1), e.opacity = 1;\n const s = t.pbrMetallicRoughness;\n if (s) {\n if (Array.isArray(s.baseColorFactor)) {\n const r = s.baseColorFactor;\n e.color.setRGB(r[0], r[1], r[2], rt), e.opacity = r[3];\n }\n s.baseColorTexture !== void 0 && i.push(n.assignTexture(e, \"map\", s.baseColorTexture, Lt));\n }\n return Promise.all(i);\n }\n}\nclass iu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_EMISSIVE_STRENGTH;\n }\n extendMaterialParams(e, t) {\n const i = this.parser.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = i.extensions[this.name].emissiveStrength;\n return s !== void 0 && (t.emissiveIntensity = s), Promise.resolve();\n }\n}\nclass su {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_CLEARCOAT;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n if (r.clearcoatFactor !== void 0 && (t.clearcoat = r.clearcoatFactor), r.clearcoatTexture !== void 0 && s.push(n.assignTexture(t, \"clearcoatMap\", r.clearcoatTexture)), r.clearcoatRoughnessFactor !== void 0 && (t.clearcoatRoughness = r.clearcoatRoughnessFactor), r.clearcoatRoughnessTexture !== void 0 && s.push(n.assignTexture(t, \"clearcoatRoughnessMap\", r.clearcoatRoughnessTexture)), r.clearcoatNormalTexture !== void 0 && (s.push(n.assignTexture(t, \"clearcoatNormalMap\", r.clearcoatNormalTexture)), r.clearcoatNormalTexture.scale !== void 0)) {\n const a = r.clearcoatNormalTexture.scale;\n t.clearcoatNormalScale = new ue(a, a);\n }\n return Promise.all(s);\n }\n}\nclass ru {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_DISPERSION;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const i = this.parser.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = i.extensions[this.name];\n return t.dispersion = s.dispersion !== void 0 ? s.dispersion : 0, Promise.resolve();\n }\n}\nclass ou {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_IRIDESCENCE;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n return r.iridescenceFactor !== void 0 && (t.iridescence = r.iridescenceFactor), r.iridescenceTexture !== void 0 && s.push(n.assignTexture(t, \"iridescenceMap\", r.iridescenceTexture)), r.iridescenceIor !== void 0 && (t.iridescenceIOR = r.iridescenceIor), t.iridescenceThicknessRange === void 0 && (t.iridescenceThicknessRange = [100, 400]), r.iridescenceThicknessMinimum !== void 0 && (t.iridescenceThicknessRange[0] = r.iridescenceThicknessMinimum), r.iridescenceThicknessMaximum !== void 0 && (t.iridescenceThicknessRange[1] = r.iridescenceThicknessMaximum), r.iridescenceThicknessTexture !== void 0 && s.push(n.assignTexture(t, \"iridescenceThicknessMap\", r.iridescenceThicknessTexture)), Promise.all(s);\n }\n}\nclass au {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_SHEEN;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [];\n t.sheenColor = new st(0, 0, 0), t.sheenRoughness = 0, t.sheen = 1;\n const r = i.extensions[this.name];\n if (r.sheenColorFactor !== void 0) {\n const a = r.sheenColorFactor;\n t.sheenColor.setRGB(a[0], a[1], a[2], rt);\n }\n return r.sheenRoughnessFactor !== void 0 && (t.sheenRoughness = r.sheenRoughnessFactor), r.sheenColorTexture !== void 0 && s.push(n.assignTexture(t, \"sheenColorMap\", r.sheenColorTexture, Lt)), r.sheenRoughnessTexture !== void 0 && s.push(n.assignTexture(t, \"sheenRoughnessMap\", r.sheenRoughnessTexture)), Promise.all(s);\n }\n}\nclass lu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_TRANSMISSION;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n return r.transmissionFactor !== void 0 && (t.transmission = r.transmissionFactor), r.transmissionTexture !== void 0 && s.push(n.assignTexture(t, \"transmissionMap\", r.transmissionTexture)), Promise.all(s);\n }\n}\nclass cu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_VOLUME;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n t.thickness = r.thicknessFactor !== void 0 ? r.thicknessFactor : 0, r.thicknessTexture !== void 0 && s.push(n.assignTexture(t, \"thicknessMap\", r.thicknessTexture)), t.attenuationDistance = r.attenuationDistance || 1 / 0;\n const a = r.attenuationColor || [1, 1, 1];\n return t.attenuationColor = new st().setRGB(a[0], a[1], a[2], rt), Promise.all(s);\n }\n}\nclass hu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_IOR;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const i = this.parser.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = i.extensions[this.name];\n return t.ior = s.ior !== void 0 ? s.ior : 1.5, Promise.resolve();\n }\n}\nclass uu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_SPECULAR;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n t.specularIntensity = r.specularFactor !== void 0 ? r.specularFactor : 1, r.specularTexture !== void 0 && s.push(n.assignTexture(t, \"specularIntensityMap\", r.specularTexture));\n const a = r.specularColorFactor || [1, 1, 1];\n return t.specularColor = new st().setRGB(a[0], a[1], a[2], rt), r.specularColorTexture !== void 0 && s.push(n.assignTexture(t, \"specularColorMap\", r.specularColorTexture, Lt)), Promise.all(s);\n }\n}\nclass du {\n constructor(e) {\n this.parser = e, this.name = le.EXT_MATERIALS_BUMP;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n return t.bumpScale = r.bumpFactor !== void 0 ? r.bumpFactor : 1, r.bumpTexture !== void 0 && s.push(n.assignTexture(t, \"bumpMap\", r.bumpTexture)), Promise.all(s);\n }\n}\nclass fu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_ANISOTROPY;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n return r.anisotropyStrength !== void 0 && (t.anisotropy = r.anisotropyStrength), r.anisotropyRotation !== void 0 && (t.anisotropyRotation = r.anisotropyRotation), r.anisotropyTexture !== void 0 && s.push(n.assignTexture(t, \"anisotropyMap\", r.anisotropyTexture)), Promise.all(s);\n }\n}\nclass pu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_TEXTURE_BASISU;\n }\n loadTexture(e) {\n const t = this.parser, n = t.json, i = n.textures[e];\n if (!i.extensions || !i.extensions[this.name])\n return null;\n const s = i.extensions[this.name], r = t.options.ktx2Loader;\n if (!r) {\n if (n.extensionsRequired && n.extensionsRequired.indexOf(this.name) >= 0)\n throw new Error(\"THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures\");\n return null;\n }\n return t.loadTextureImage(e, s.source, r);\n }\n}\nclass mu {\n constructor(e) {\n this.parser = e, this.name = le.EXT_TEXTURE_WEBP;\n }\n loadTexture(e) {\n const t = this.name, n = this.parser, i = n.json, s = i.textures[e];\n if (!s.extensions || !s.extensions[t])\n return null;\n const r = s.extensions[t], a = i.images[r.source];\n let l = n.textureLoader;\n if (a.uri) {\n const h = n.options.manager.getHandler(a.uri);\n h !== null && (l = h);\n }\n return n.loadTextureImage(e, r.source, l);\n }\n}\nclass gu {\n constructor(e) {\n this.parser = e, this.name = le.EXT_TEXTURE_AVIF;\n }\n loadTexture(e) {\n const t = this.name, n = this.parser, i = n.json, s = i.textures[e];\n if (!s.extensions || !s.extensions[t])\n return null;\n const r = s.extensions[t], a = i.images[r.source];\n let l = n.textureLoader;\n if (a.uri) {\n const h = n.options.manager.getHandler(a.uri);\n h !== null && (l = h);\n }\n return n.loadTextureImage(e, r.source, l);\n }\n}\nclass yu {\n constructor(e) {\n this.name = le.EXT_MESHOPT_COMPRESSION, this.parser = e;\n }\n loadBufferView(e) {\n const t = this.parser.json, n = t.bufferViews[e];\n if (n.extensions && n.extensions[this.name]) {\n const i = n.extensions[this.name], s = this.parser.getDependency(\"buffer\", i.buffer), r = this.parser.options.meshoptDecoder;\n if (!r || !r.supported) {\n if (t.extensionsRequired && t.extensionsRequired.indexOf(this.name) >= 0)\n throw new Error(\"THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files\");\n return null;\n }\n return s.then(function(a) {\n const l = i.byteOffset || 0, h = i.byteLength || 0, c = i.count, u = i.byteStride, m = new Uint8Array(a, l, h);\n return r.decodeGltfBufferAsync ? r.decodeGltfBufferAsync(c, u, m, i.mode, i.filter).then(function(f) {\n return f.buffer;\n }) : r.ready.then(function() {\n const f = new ArrayBuffer(c * u);\n return r.decodeGltfBuffer(new Uint8Array(f), c, u, m, i.mode, i.filter), f;\n });\n });\n } else\n return null;\n }\n}\nclass wu {\n constructor(e) {\n this.name = le.EXT_MESH_GPU_INSTANCING, this.parser = e;\n }\n createNodeMesh(e) {\n const t = this.parser.json, n = t.nodes[e];\n if (!n.extensions || !n.extensions[this.name] || n.mesh === void 0)\n return null;\n const i = t.meshes[n.mesh];\n for (const h of i.primitives)\n if (h.mode !== Xe.TRIANGLES && h.mode !== Xe.TRIANGLE_STRIP && h.mode !== Xe.TRIANGLE_FAN && h.mode !== void 0)\n return null;\n const r = n.extensions[this.name].attributes, a = [], l = {};\n for (const h in r)\n a.push(this.parser.getDependency(\"accessor\", r[h]).then((c) => (l[h] = c, l[h])));\n return a.length < 1 ? null : (a.push(this.parser.createNodeMesh(e)), Promise.all(a).then((h) => {\n const c = h.pop(), u = c.isGroup ? c.children : [c], m = h[0].count, f = [];\n for (const d of u) {\n const p = new Me(), g = new K(), y = new Ni(), w = new K(1, 1, 1), x = new fl(d.geometry, d.material, m);\n for (let _ = 0; _ < m; _++)\n l.TRANSLATION && g.fromBufferAttribute(l.TRANSLATION, _), l.ROTATION && y.fromBufferAttribute(l.ROTATION, _), l.SCALE && w.fromBufferAttribute(l.SCALE, _), x.setMatrixAt(_, p.compose(g, y, w));\n for (const _ in l)\n if (_ === \"_COLOR_0\") {\n const b = l[_];\n x.instanceColor = new pl(b.array, b.itemSize, b.normalized);\n } else _ !== \"TRANSLATION\" && _ !== \"ROTATION\" && _ !== \"SCALE\" && d.geometry.setAttribute(_, l[_]);\n $o.prototype.copy.call(x, d), this.parser.assignFinalMaterial(x), f.push(x);\n }\n return c.isGroup ? (c.clear(), c.add(...f), c) : f[0];\n }));\n }\n}\nconst Ia = \"glTF\", En = 12, $r = { JSON: 1313821514, BIN: 5130562 };\nclass xu {\n constructor(e) {\n this.name = le.KHR_BINARY_GLTF, this.content = null, this.body = null;\n const t = new DataView(e, 0, En), n = new TextDecoder();\n if (this.header = {\n magic: n.decode(new Uint8Array(e.slice(0, 4))),\n version: t.getUint32(4, !0),\n length: t.getUint32(8, !0)\n }, this.header.magic !== Ia)\n throw new Error(\"THREE.GLTFLoader: Unsupported glTF-Binary header.\");\n if (this.header.version < 2)\n throw new Error(\"THREE.GLTFLoader: Legacy binary file detected.\");\n const i = this.header.length - En, s = new DataView(e, En);\n let r = 0;\n for (; r < i; ) {\n const a = s.getUint32(r, !0);\n r += 4;\n const l = s.getUint32(r, !0);\n if (r += 4, l === $r.JSON) {\n const h = new Uint8Array(e, En + r, a);\n this.content = n.decode(h);\n } else if (l === $r.BIN) {\n const h = En + r;\n this.body = e.slice(h, h + a);\n }\n r += a;\n }\n if (this.content === null)\n throw new Error(\"THREE.GLTFLoader: JSON content not found.\");\n }\n}\nclass _u {\n constructor(e, t) {\n if (!t)\n throw new Error(\"THREE.GLTFLoader: No DRACOLoader instance provided.\");\n this.name = le.KHR_DRACO_MESH_COMPRESSION, this.json = e, this.dracoLoader = t, this.dracoLoader.preload();\n }\n decodePrimitive(e, t) {\n const n = this.json, i = this.dracoLoader, s = e.extensions[this.name].bufferView, r = e.extensions[this.name].attributes, a = {}, l = {}, h = {};\n for (const c in r) {\n const u = Ws[c] || c.toLowerCase();\n a[u] = r[c];\n }\n for (const c in e.attributes) {\n const u = Ws[c] || c.toLowerCase();\n if (r[c] !== void 0) {\n const m = n.accessors[e.attributes[c]], f = yn[m.componentType];\n h[u] = f.name, l[u] = m.normalized === !0;\n }\n }\n return t.getDependency(\"bufferView\", s).then(function(c) {\n return new Promise(function(u, m) {\n i.decodeDracoFile(c, function(f) {\n for (const d in f.attributes) {\n const p = f.attributes[d], g = l[d];\n g !== void 0 && (p.normalized = g);\n }\n u(f);\n }, a, h, rt, m);\n });\n });\n }\n}\nclass vu {\n constructor() {\n this.name = le.KHR_TEXTURE_TRANSFORM;\n }\n extendTexture(e, t) {\n return (t.texCoord === void 0 || t.texCoord === e.channel) && t.offset === void 0 && t.rotation === void 0 && t.scale === void 0 || (e = e.clone(), t.texCoord !== void 0 && (e.channel = t.texCoord), t.offset !== void 0 && e.offset.fromArray(t.offset), t.rotation !== void 0 && (e.rotation = t.rotation), t.scale !== void 0 && e.repeat.fromArray(t.scale), e.needsUpdate = !0), e;\n }\n}\nclass bu {\n constructor() {\n this.name = le.KHR_MESH_QUANTIZATION;\n }\n}\nclass La extends zl {\n constructor(e, t, n, i) {\n super(e, t, n, i);\n }\n copySampleValue_(e) {\n const t = this.resultBuffer, n = this.sampleValues, i = this.valueSize, s = e * i * 3 + i;\n for (let r = 0; r !== i; r++)\n t[r] = n[s + r];\n return t;\n }\n interpolate_(e, t, n, i) {\n const s = this.resultBuffer, r = this.sampleValues, a = this.valueSize, l = a * 2, h = a * 3, c = i - t, u = (n - t) / c, m = u * u, f = m * u, d = e * h, p = d - h, g = -2 * f + 3 * m, y = f - m, w = 1 - g, x = y - m + u;\n for (let _ = 0; _ !== a; _++) {\n const b = r[p + _ + a], E = r[p + _ + l] * c, A = r[d + _ + a], P = r[d + _] * c;\n s[_] = w * b + x * E + g * A + y * P;\n }\n return s;\n }\n}\nconst Mu = new Ni();\nclass Su extends La {\n interpolate_(e, t, n, i) {\n const s = super.interpolate_(e, t, n, i);\n return Mu.fromArray(s).normalize().toArray(s), s;\n }\n}\nconst Xe = {\n POINTS: 0,\n LINES: 1,\n LINE_LOOP: 2,\n LINE_STRIP: 3,\n TRIANGLES: 4,\n TRIANGLE_STRIP: 5,\n TRIANGLE_FAN: 6\n}, yn = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array\n}, Jr = {\n 9728: xn,\n 9729: Hn,\n 9984: xl,\n 9985: wl,\n 9986: yl,\n 9987: Jo\n}, Qr = {\n 33071: vl,\n 33648: _l,\n 10497: vt\n}, us = {\n SCALAR: 1,\n VEC2: 2,\n VEC3: 3,\n VEC4: 4,\n MAT2: 4,\n MAT3: 9,\n MAT4: 16\n}, Ws = {\n POSITION: \"position\",\n NORMAL: \"normal\",\n TANGENT: \"tangent\",\n TEXCOORD_0: \"uv\",\n TEXCOORD_1: \"uv1\",\n TEXCOORD_2: \"uv2\",\n TEXCOORD_3: \"uv3\",\n COLOR_0: \"color\",\n WEIGHTS_0: \"skinWeight\",\n JOINTS_0: \"skinIndex\"\n}, At = {\n scale: \"scale\",\n translation: \"position\",\n rotation: \"quaternion\",\n weights: \"morphTargetInfluences\"\n}, Tu = {\n CUBICSPLINE: void 0,\n // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n // keyframe track will be initialized with a default interpolation type, then modified.\n LINEAR: ea,\n STEP: Ll\n}, ds = {\n OPAQUE: \"OPAQUE\",\n MASK: \"MASK\",\n BLEND: \"BLEND\"\n};\nfunction Eu(o) {\n return o.DefaultMaterial === void 0 && (o.DefaultMaterial = new Qo({\n color: 16777215,\n emissive: 0,\n metalness: 1,\n roughness: 1,\n transparent: !1,\n depthTest: !0,\n side: Us\n })), o.DefaultMaterial;\n}\nfunction Vt(o, e, t) {\n for (const n in t.extensions)\n o[n] === void 0 && (e.userData.gltfExtensions = e.userData.gltfExtensions || {}, e.userData.gltfExtensions[n] = t.extensions[n]);\n}\nfunction ct(o, e) {\n e.extras !== void 0 && (typeof e.extras == \"object\" ? Object.assign(o.userData, e.extras) : console.warn(\"THREE.GLTFLoader: Ignoring primitive type .extras, \" + e.extras));\n}\nfunction Au(o, e, t) {\n let n = !1, i = !1, s = !1;\n for (let h = 0, c = e.length; h < c; h++) {\n const u = e[h];\n if (u.POSITION !== void 0 && (n = !0), u.NORMAL !== void 0 && (i = !0), u.COLOR_0 !== void 0 && (s = !0), n && i && s) break;\n }\n if (!n && !i && !s) return Promise.resolve(o);\n const r = [], a = [], l = [];\n for (let h = 0, c = e.length; h < c; h++) {\n const u = e[h];\n if (n) {\n const m = u.POSITION !== void 0 ? t.getDependency(\"accessor\", u.POSITION) : o.attributes.position;\n r.push(m);\n }\n if (i) {\n const m = u.NORMAL !== void 0 ? t.getDependency(\"accessor\", u.NORMAL) : o.attributes.normal;\n a.push(m);\n }\n if (s) {\n const m = u.COLOR_0 !== void 0 ? t.getDependency(\"accessor\", u.COLOR_0) : o.attributes.color;\n l.push(m);\n }\n }\n return Promise.all([\n Promise.all(r),\n Promise.all(a),\n Promise.all(l)\n ]).then(function(h) {\n const c = h[0], u = h[1], m = h[2];\n return n && (o.morphAttributes.position = c), i && (o.morphAttributes.normal = u), s && (o.morphAttributes.color = m), o.morphTargetsRelative = !0, o;\n });\n}\nfunction Cu(o, e) {\n if (o.updateMorphTargets(), e.weights !== void 0)\n for (let t = 0, n = e.weights.length; t < n; t++)\n o.morphTargetInfluences[t] = e.weights[t];\n if (e.extras && Array.isArray(e.extras.targetNames)) {\n const t = e.extras.targetNames;\n if (o.morphTargetInfluences.length === t.length) {\n o.morphTargetDictionary = {};\n for (let n = 0, i = t.length; n < i; n++)\n o.morphTargetDictionary[t[n]] = n;\n } else\n console.warn(\"THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.\");\n }\n}\nfunction Pu(o) {\n let e;\n const t = o.extensions && o.extensions[le.KHR_DRACO_MESH_COMPRESSION];\n if (t ? e = \"draco:\" + t.bufferView + \":\" + t.indices + \":\" + fs(t.attributes) : e = o.indices + \":\" + fs(o.attributes) + \":\" + o.mode, o.targets !== void 0)\n for (let n = 0, i = o.targets.length; n < i; n++)\n e += \":\" + fs(o.targets[n]);\n return e;\n}\nfunction fs(o) {\n let e = \"\";\n const t = Object.keys(o).sort();\n for (let n = 0, i = t.length; n < i; n++)\n e += t[n] + \":\" + o[t[n]] + \";\";\n return e;\n}\nfunction Xs(o) {\n switch (o) {\n case Int8Array:\n return 1 / 127;\n case Uint8Array:\n return 1 / 255;\n case Int16Array:\n return 1 / 32767;\n case Uint16Array:\n return 1 / 65535;\n default:\n throw new Error(\"THREE.GLTFLoader: Unsupported normalized accessor component type.\");\n }\n}\nfunction Ru(o) {\n return o.search(/\\.jpe?g($|\\?)/i) > 0 || o.search(/^data\\:image\\/jpeg/) === 0 ? \"image/jpeg\" : o.search(/\\.webp($|\\?)/i) > 0 || o.search(/^data\\:image\\/webp/) === 0 ? \"image/webp\" : o.search(/\\.ktx2($|\\?)/i) > 0 || o.search(/^data\\:image\\/ktx2/) === 0 ? \"image/ktx2\" : \"image/png\";\n}\nconst Du = new Me();\nclass ku {\n constructor(e = {}, t = {}) {\n this.json = e, this.extensions = {}, this.plugins = {}, this.options = t, this.cache = new eu(), this.associations = /* @__PURE__ */ new Map(), this.primitiveCache = {}, this.nodeCache = {}, this.meshCache = { refs: {}, uses: {} }, this.cameraCache = { refs: {}, uses: {} }, this.lightCache = { refs: {}, uses: {} }, this.sourceCache = {}, this.textureCache = {}, this.nodeNamesUsed = {};\n let n = !1, i = -1, s = !1, r = -1;\n if (typeof navigator < \"u\") {\n const a = navigator.userAgent;\n n = /^((?!chrome|android).)*safari/i.test(a) === !0;\n const l = a.match(/Version\\/(\\d+)/);\n i = n && l ? parseInt(l[1], 10) : -1, s = a.indexOf(\"Firefox\") > -1, r = s ? a.match(/Firefox\\/([0-9]+)\\./)[1] : -1;\n }\n typeof createImageBitmap > \"u\" || n && i < 17 || s && r < 98 ? this.textureLoader = new ml(this.options.manager) : this.textureLoader = new gl(this.options.manager), this.textureLoader.setCrossOrigin(this.options.crossOrigin), this.textureLoader.setRequestHeader(this.options.requestHeader), this.fileLoader = new Ui(this.options.manager), this.fileLoader.setResponseType(\"arraybuffer\"), this.options.crossOrigin === \"use-credentials\" && this.fileLoader.setWithCredentials(!0);\n }\n setExtensions(e) {\n this.extensions = e;\n }\n setPlugins(e) {\n this.plugins = e;\n }\n parse(e, t) {\n const n = this, i = this.json, s = this.extensions;\n this.cache.removeAll(), this.nodeCache = {}, this._invokeAll(function(r) {\n return r._markDefs && r._markDefs();\n }), Promise.all(this._invokeAll(function(r) {\n return r.beforeRoot && r.beforeRoot();\n })).then(function() {\n return Promise.all([\n n.getDependencies(\"scene\"),\n n.getDependencies(\"animation\"),\n n.getDependencies(\"camera\")\n ]);\n }).then(function(r) {\n const a = {\n scene: r[0][i.scene || 0],\n scenes: r[0],\n animations: r[1],\n cameras: r[2],\n asset: i.asset,\n parser: n,\n userData: {}\n };\n return Vt(s, a, i), ct(a, i), Promise.all(n._invokeAll(function(l) {\n return l.afterRoot && l.afterRoot(a);\n })).then(function() {\n for (const l of a.scenes)\n l.updateMatrixWorld();\n e(a);\n });\n }).catch(t);\n }\n /**\n * Marks the special nodes/meshes in json for efficient parse.\n *\n * @private\n */\n _markDefs() {\n const e = this.json.nodes || [], t = this.json.skins || [], n = this.json.meshes || [];\n for (let i = 0, s = t.length; i < s; i++) {\n const r = t[i].joints;\n for (let a = 0, l = r.length; a < l; a++)\n e[r[a]].isBone = !0;\n }\n for (let i = 0, s = e.length; i < s; i++) {\n const r = e[i];\n r.mesh !== void 0 && (this._addNodeRef(this.meshCache, r.mesh), r.skin !== void 0 && (n[r.mesh].isSkinnedMesh = !0)), r.camera !== void 0 && this._addNodeRef(this.cameraCache, r.camera);\n }\n }\n /**\n * Counts references to shared node / Object3D resources. These resources\n * can be reused, or \"instantiated\", at multiple nodes in the scene\n * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n * be marked. Non-scenegraph resources (like Materials, Geometries, and\n * Textures) can be reused directly and are not marked here.\n *\n * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n *\n * @private\n * @param {Object} cache\n * @param {Object3D} index\n */\n _addNodeRef(e, t) {\n t !== void 0 && (e.refs[t] === void 0 && (e.refs[t] = e.uses[t] = 0), e.refs[t]++);\n }\n /**\n * Returns a reference to a shared resource, cloning it if necessary.\n *\n * @private\n * @param {Object} cache\n * @param {number} index\n * @param {Object} object\n * @return {Object}\n */\n _getNodeRef(e, t, n) {\n if (e.refs[t] <= 1) return n;\n const i = n.clone(), s = (r, a) => {\n const l = this.associations.get(r);\n l != null && this.associations.set(a, l);\n for (const [h, c] of r.children.entries())\n s(c, a.children[h]);\n };\n return s(n, i), i.name += \"_instance_\" + e.uses[t]++, i;\n }\n _invokeOne(e) {\n const t = Object.values(this.plugins);\n t.push(this);\n for (let n = 0; n < t.length; n++) {\n const i = e(t[n]);\n if (i) return i;\n }\n return null;\n }\n _invokeAll(e) {\n const t = Object.values(this.plugins);\n t.unshift(this);\n const n = [];\n for (let i = 0; i < t.length; i++) {\n const s = e(t[i]);\n s && n.push(s);\n }\n return n;\n }\n /**\n * Requests the specified dependency asynchronously, with caching.\n *\n * @private\n * @param {string} type\n * @param {number} index\n * @return {Promise}\n */\n getDependency(e, t) {\n const n = e + \":\" + t;\n let i = this.cache.get(n);\n if (!i) {\n switch (e) {\n case \"scene\":\n i = this.loadScene(t);\n break;\n case \"node\":\n i = this._invokeOne(function(s) {\n return s.loadNode && s.loadNode(t);\n });\n break;\n case \"mesh\":\n i = this._invokeOne(function(s) {\n return s.loadMesh && s.loadMesh(t);\n });\n break;\n case \"accessor\":\n i = this.loadAccessor(t);\n break;\n case \"bufferView\":\n i = this._invokeOne(function(s) {\n return s.loadBufferView && s.loadBufferView(t);\n });\n break;\n case \"buffer\":\n i = this.loadBuffer(t);\n break;\n case \"material\":\n i = this._invokeOne(function(s) {\n return s.loadMaterial && s.loadMaterial(t);\n });\n break;\n case \"texture\":\n i = this._invokeOne(function(s) {\n return s.loadTexture && s.loadTexture(t);\n });\n break;\n case \"skin\":\n i = this.loadSkin(t);\n break;\n case \"animation\":\n i = this._invokeOne(function(s) {\n return s.loadAnimation && s.loadAnimation(t);\n });\n break;\n case \"camera\":\n i = this.loadCamera(t);\n break;\n default:\n if (i = this._invokeOne(function(s) {\n return s != this && s.getDependency && s.getDependency(e, t);\n }), !i)\n throw new Error(\"Unknown type: \" + e);\n break;\n }\n this.cache.add(n, i);\n }\n return i;\n }\n /**\n * Requests all dependencies of the specified type asynchronously, with caching.\n *\n * @private\n * @param {string} type\n * @return {Promise>}\n */\n getDependencies(e) {\n let t = this.cache.get(e);\n if (!t) {\n const n = this, i = this.json[e + (e === \"mesh\" ? \"es\" : \"s\")] || [];\n t = Promise.all(i.map(function(s, r) {\n return n.getDependency(e, r);\n })), this.cache.add(e, t);\n }\n return t;\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n *\n * @private\n * @param {number} bufferIndex\n * @return {Promise}\n */\n loadBuffer(e) {\n const t = this.json.buffers[e], n = this.fileLoader;\n if (t.type && t.type !== \"arraybuffer\")\n throw new Error(\"THREE.GLTFLoader: \" + t.type + \" buffer type is not supported.\");\n if (t.uri === void 0 && e === 0)\n return Promise.resolve(this.extensions[le.KHR_BINARY_GLTF].body);\n const i = this.options;\n return new Promise(function(s, r) {\n n.load(Nn.resolveURL(t.uri, i.path), s, void 0, function() {\n r(new Error('THREE.GLTFLoader: Failed to load buffer \"' + t.uri + '\".'));\n });\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n *\n * @private\n * @param {number} bufferViewIndex\n * @return {Promise}\n */\n loadBufferView(e) {\n const t = this.json.bufferViews[e];\n return this.getDependency(\"buffer\", t.buffer).then(function(n) {\n const i = t.byteLength || 0, s = t.byteOffset || 0;\n return n.slice(s, s + i);\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n *\n * @private\n * @param {number} accessorIndex\n * @return {Promise}\n */\n loadAccessor(e) {\n const t = this, n = this.json, i = this.json.accessors[e];\n if (i.bufferView === void 0 && i.sparse === void 0) {\n const r = us[i.type], a = yn[i.componentType], l = i.normalized === !0, h = new a(i.count * r);\n return Promise.resolve(new ut(h, r, l));\n }\n const s = [];\n return i.bufferView !== void 0 ? s.push(this.getDependency(\"bufferView\", i.bufferView)) : s.push(null), i.sparse !== void 0 && (s.push(this.getDependency(\"bufferView\", i.sparse.indices.bufferView)), s.push(this.getDependency(\"bufferView\", i.sparse.values.bufferView))), Promise.all(s).then(function(r) {\n const a = r[0], l = us[i.type], h = yn[i.componentType], c = h.BYTES_PER_ELEMENT, u = c * l, m = i.byteOffset || 0, f = i.bufferView !== void 0 ? n.bufferViews[i.bufferView].byteStride : void 0, d = i.normalized === !0;\n let p, g;\n if (f && f !== u) {\n const y = Math.floor(m / f), w = \"InterleavedBuffer:\" + i.bufferView + \":\" + i.componentType + \":\" + y + \":\" + i.count;\n let x = t.cache.get(w);\n x || (p = new h(a, y * f, i.count * f / c), x = new qo(p, f / c), t.cache.add(w, x)), g = new Yo(x, l, m % f / c, d);\n } else\n a === null ? p = new h(i.count * l) : p = new h(a, m, i.count * l), g = new ut(p, l, d);\n if (i.sparse !== void 0) {\n const y = us.SCALAR, w = yn[i.sparse.indices.componentType], x = i.sparse.indices.byteOffset || 0, _ = i.sparse.values.byteOffset || 0, b = new w(r[1], x, i.sparse.count * y), E = new h(r[2], _, i.sparse.count * l);\n a !== null && (g = new ut(g.array.slice(), g.itemSize, g.normalized)), g.normalized = !1;\n for (let A = 0, P = b.length; A < P; A++) {\n const C = b[A];\n if (g.setX(C, E[A * l]), l >= 2 && g.setY(C, E[A * l + 1]), l >= 3 && g.setZ(C, E[A * l + 2]), l >= 4 && g.setW(C, E[A * l + 3]), l >= 5) throw new Error(\"THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.\");\n }\n g.normalized = d;\n }\n return g;\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n *\n * @private\n * @param {number} textureIndex\n * @return {Promise}\n */\n loadTexture(e) {\n const t = this.json, n = this.options, s = t.textures[e].source, r = t.images[s];\n let a = this.textureLoader;\n if (r.uri) {\n const l = n.manager.getHandler(r.uri);\n l !== null && (a = l);\n }\n return this.loadTextureImage(e, s, a);\n }\n loadTextureImage(e, t, n) {\n const i = this, s = this.json, r = s.textures[e], a = s.images[t], l = (a.uri || a.bufferView) + \":\" + r.sampler;\n if (this.textureCache[l])\n return this.textureCache[l];\n const h = this.loadImageSource(t, n).then(function(c) {\n c.flipY = !1, c.name = r.name || a.name || \"\", c.name === \"\" && typeof a.uri == \"string\" && a.uri.startsWith(\"data:image/\") === !1 && (c.name = a.uri);\n const m = (s.samplers || {})[r.sampler] || {};\n return c.magFilter = Jr[m.magFilter] || Hn, c.minFilter = Jr[m.minFilter] || Jo, c.wrapS = Qr[m.wrapS] || vt, c.wrapT = Qr[m.wrapT] || vt, c.generateMipmaps = !c.isCompressedTexture && c.minFilter !== xn && c.minFilter !== Hn, i.associations.set(c, { textures: e }), c;\n }).catch(function() {\n return null;\n });\n return this.textureCache[l] = h, h;\n }\n loadImageSource(e, t) {\n const n = this, i = this.json, s = this.options;\n if (this.sourceCache[e] !== void 0)\n return this.sourceCache[e].then((u) => u.clone());\n const r = i.images[e], a = self.URL || self.webkitURL;\n let l = r.uri || \"\", h = !1;\n if (r.bufferView !== void 0)\n l = n.getDependency(\"bufferView\", r.bufferView).then(function(u) {\n h = !0;\n const m = new Blob([u], { type: r.mimeType });\n return l = a.createObjectURL(m), l;\n });\n else if (r.uri === void 0)\n throw new Error(\"THREE.GLTFLoader: Image \" + e + \" is missing URI and bufferView\");\n const c = Promise.resolve(l).then(function(u) {\n return new Promise(function(m, f) {\n let d = m;\n t.isImageBitmapLoader === !0 && (d = function(p) {\n const g = new Mr(p);\n g.needsUpdate = !0, m(g);\n }), t.load(Nn.resolveURL(u, s.path), d, void 0, f);\n });\n }).then(function(u) {\n return h === !0 && a.revokeObjectURL(l), ct(u, r), u.userData.mimeType = r.mimeType || Ru(r.uri), u;\n }).catch(function(u) {\n throw console.error(\"THREE.GLTFLoader: Couldn't load texture\", l), u;\n });\n return this.sourceCache[e] = c, c;\n }\n /**\n * Asynchronously assigns a texture to the given material parameters.\n *\n * @private\n * @param {Object} materialParams\n * @param {string} mapName\n * @param {Object} mapDef\n * @param {string} [colorSpace]\n * @return {Promise}\n */\n assignTexture(e, t, n, i) {\n const s = this;\n return this.getDependency(\"texture\", n.index).then(function(r) {\n if (!r) return null;\n if (n.texCoord !== void 0 && n.texCoord > 0 && (r = r.clone(), r.channel = n.texCoord), s.extensions[le.KHR_TEXTURE_TRANSFORM]) {\n const a = n.extensions !== void 0 ? n.extensions[le.KHR_TEXTURE_TRANSFORM] : void 0;\n if (a) {\n const l = s.associations.get(r);\n r = s.extensions[le.KHR_TEXTURE_TRANSFORM].extendTexture(r, a), s.associations.set(r, l);\n }\n }\n return i !== void 0 && (r.colorSpace = i), e[t] = r, r;\n });\n }\n /**\n * Assigns final material to a Mesh, Line, or Points instance. The instance\n * already has a material (generated from the glTF material options alone)\n * but reuse of the same glTF material may require multiple threejs materials\n * to accommodate different primitive types, defines, etc. New materials will\n * be created if necessary, and reused from a cache.\n *\n * @private\n * @param {Object3D} mesh Mesh, Line, or Points instance.\n */\n assignFinalMaterial(e) {\n const t = e.geometry;\n let n = e.material;\n const i = t.attributes.tangent === void 0, s = t.attributes.color !== void 0, r = t.attributes.normal === void 0;\n if (e.isPoints) {\n const a = \"PointsMaterial:\" + n.uuid;\n let l = this.cache.get(a);\n l || (l = new bl(), ns.prototype.copy.call(l, n), l.color.copy(n.color), l.map = n.map, l.sizeAttenuation = !1, this.cache.add(a, l)), n = l;\n } else if (e.isLine) {\n const a = \"LineBasicMaterial:\" + n.uuid;\n let l = this.cache.get(a);\n l || (l = new Ml(), ns.prototype.copy.call(l, n), l.color.copy(n.color), l.map = n.map, this.cache.add(a, l)), n = l;\n }\n if (i || s || r) {\n let a = \"ClonedMaterial:\" + n.uuid + \":\";\n i && (a += \"derivative-tangents:\"), s && (a += \"vertex-colors:\"), r && (a += \"flat-shading:\");\n let l = this.cache.get(a);\n l || (l = n.clone(), s && (l.vertexColors = !0), r && (l.flatShading = !0), i && (l.normalScale && (l.normalScale.y *= -1), l.clearcoatNormalScale && (l.clearcoatNormalScale.y *= -1)), this.cache.add(a, l), this.associations.set(l, this.associations.get(n))), n = l;\n }\n e.material = n;\n }\n getMaterialType() {\n return Qo;\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n *\n * @private\n * @param {number} materialIndex\n * @return {Promise}\n */\n loadMaterial(e) {\n const t = this, n = this.json, i = this.extensions, s = n.materials[e];\n let r;\n const a = {}, l = s.extensions || {}, h = [];\n if (l[le.KHR_MATERIALS_UNLIT]) {\n const u = i[le.KHR_MATERIALS_UNLIT];\n r = u.getMaterialType(), h.push(u.extendParams(a, s, t));\n } else {\n const u = s.pbrMetallicRoughness || {};\n if (a.color = new st(1, 1, 1), a.opacity = 1, Array.isArray(u.baseColorFactor)) {\n const m = u.baseColorFactor;\n a.color.setRGB(m[0], m[1], m[2], rt), a.opacity = m[3];\n }\n u.baseColorTexture !== void 0 && h.push(t.assignTexture(a, \"map\", u.baseColorTexture, Lt)), a.metalness = u.metallicFactor !== void 0 ? u.metallicFactor : 1, a.roughness = u.roughnessFactor !== void 0 ? u.roughnessFactor : 1, u.metallicRoughnessTexture !== void 0 && (h.push(t.assignTexture(a, \"metalnessMap\", u.metallicRoughnessTexture)), h.push(t.assignTexture(a, \"roughnessMap\", u.metallicRoughnessTexture))), r = this._invokeOne(function(m) {\n return m.getMaterialType && m.getMaterialType(e);\n }), h.push(Promise.all(this._invokeAll(function(m) {\n return m.extendMaterialParams && m.extendMaterialParams(e, a);\n })));\n }\n s.doubleSided === !0 && (a.side = qi);\n const c = s.alphaMode || ds.OPAQUE;\n if (c === ds.BLEND ? (a.transparent = !0, a.depthWrite = !1) : (a.transparent = !1, c === ds.MASK && (a.alphaTest = s.alphaCutoff !== void 0 ? s.alphaCutoff : 0.5)), s.normalTexture !== void 0 && r !== On && (h.push(t.assignTexture(a, \"normalMap\", s.normalTexture)), a.normalScale = new ue(1, 1), s.normalTexture.scale !== void 0)) {\n const u = s.normalTexture.scale;\n a.normalScale.set(u, u);\n }\n if (s.occlusionTexture !== void 0 && r !== On && (h.push(t.assignTexture(a, \"aoMap\", s.occlusionTexture)), s.occlusionTexture.strength !== void 0 && (a.aoMapIntensity = s.occlusionTexture.strength)), s.emissiveFactor !== void 0 && r !== On) {\n const u = s.emissiveFactor;\n a.emissive = new st().setRGB(u[0], u[1], u[2], rt);\n }\n return s.emissiveTexture !== void 0 && r !== On && h.push(t.assignTexture(a, \"emissiveMap\", s.emissiveTexture, Lt)), Promise.all(h).then(function() {\n const u = new r(a);\n return s.name && (u.name = s.name), ct(u, s), t.associations.set(u, { materials: e }), s.extensions && Vt(i, u, s), u;\n });\n }\n /**\n * When Object3D instances are targeted by animation, they need unique names.\n *\n * @private\n * @param {string} originalName\n * @return {string}\n */\n createUniqueName(e) {\n const t = Sl.sanitizeNodeName(e || \"\");\n return t in this.nodeNamesUsed ? t + \"_\" + ++this.nodeNamesUsed[t] : (this.nodeNamesUsed[t] = 0, t);\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n *\n * Creates BufferGeometries from primitives.\n *\n * @private\n * @param {Array} primitives\n * @return {Promise>}\n */\n loadGeometries(e) {\n const t = this, n = this.extensions, i = this.primitiveCache;\n function s(a) {\n return n[le.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(a, t).then(function(l) {\n return eo(l, a, t);\n });\n }\n const r = [];\n for (let a = 0, l = e.length; a < l; a++) {\n const h = e[a], c = Pu(h), u = i[c];\n if (u)\n r.push(u.promise);\n else {\n let m;\n h.extensions && h.extensions[le.KHR_DRACO_MESH_COMPRESSION] ? m = s(h) : m = eo(new Zi(), h, t), i[c] = { primitive: h, promise: m }, r.push(m);\n }\n }\n return Promise.all(r);\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n *\n * @private\n * @param {number} meshIndex\n * @return {Promise}\n */\n loadMesh(e) {\n const t = this, n = this.json, i = this.extensions, s = n.meshes[e], r = s.primitives, a = [];\n for (let l = 0, h = r.length; l < h; l++) {\n const c = r[l].material === void 0 ? Eu(this.cache) : this.getDependency(\"material\", r[l].material);\n a.push(c);\n }\n return a.push(t.loadGeometries(r)), Promise.all(a).then(function(l) {\n const h = l.slice(0, l.length - 1), c = l[l.length - 1], u = [];\n for (let f = 0, d = c.length; f < d; f++) {\n const p = c[f], g = r[f];\n let y;\n const w = h[f];\n if (g.mode === Xe.TRIANGLES || g.mode === Xe.TRIANGLE_STRIP || g.mode === Xe.TRIANGLE_FAN || g.mode === void 0)\n y = s.isSkinnedMesh === !0 ? new Tl(p, w) : new ar(p, w), y.isSkinnedMesh === !0 && y.normalizeSkinWeights(), g.mode === Xe.TRIANGLE_STRIP ? y.geometry = Kr(y.geometry, Ko) : g.mode === Xe.TRIANGLE_FAN && (y.geometry = Kr(y.geometry, Fs));\n else if (g.mode === Xe.LINES)\n y = new El(p, w);\n else if (g.mode === Xe.LINE_STRIP)\n y = new Al(p, w);\n else if (g.mode === Xe.LINE_LOOP)\n y = new Cl(p, w);\n else if (g.mode === Xe.POINTS)\n y = new Pl(p, w);\n else\n throw new Error(\"THREE.GLTFLoader: Primitive mode unsupported: \" + g.mode);\n Object.keys(y.geometry.morphAttributes).length > 0 && Cu(y, s), y.name = t.createUniqueName(s.name || \"mesh_\" + e), ct(y, s), g.extensions && Vt(i, y, g), t.assignFinalMaterial(y), u.push(y);\n }\n for (let f = 0, d = u.length; f < d; f++)\n t.associations.set(u[f], {\n meshes: e,\n primitives: f\n });\n if (u.length === 1)\n return s.extensions && Vt(i, u[0], s), u[0];\n const m = new is();\n s.extensions && Vt(i, m, s), t.associations.set(m, { meshes: e });\n for (let f = 0, d = u.length; f < d; f++)\n m.add(u[f]);\n return m;\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n *\n * @private\n * @param {number} cameraIndex\n * @return {Promise|undefined}\n */\n loadCamera(e) {\n let t;\n const n = this.json.cameras[e], i = n[n.type];\n if (!i) {\n console.warn(\"THREE.GLTFLoader: Missing camera parameters.\");\n return;\n }\n return n.type === \"perspective\" ? t = new Rl(or.radToDeg(i.yfov), i.aspectRatio || 1, i.znear || 1, i.zfar || 2e6) : n.type === \"orthographic\" && (t = new Vo(-i.xmag, i.xmag, i.ymag, -i.ymag, i.znear, i.zfar)), n.name && (t.name = this.createUniqueName(n.name)), ct(t, n), Promise.resolve(t);\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n *\n * @private\n * @param {number} skinIndex\n * @return {Promise}\n */\n loadSkin(e) {\n const t = this.json.skins[e], n = [];\n for (let i = 0, s = t.joints.length; i < s; i++)\n n.push(this._loadNodeShallow(t.joints[i]));\n return t.inverseBindMatrices !== void 0 ? n.push(this.getDependency(\"accessor\", t.inverseBindMatrices)) : n.push(null), Promise.all(n).then(function(i) {\n const s = i.pop(), r = i, a = [], l = [];\n for (let h = 0, c = r.length; h < c; h++) {\n const u = r[h];\n if (u) {\n a.push(u);\n const m = new Me();\n s !== null && m.fromArray(s.array, h * 16), l.push(m);\n } else\n console.warn('THREE.GLTFLoader: Joint \"%s\" could not be found.', t.joints[h]);\n }\n return new Dl(a, l);\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n *\n * @private\n * @param {number} animationIndex\n * @return {Promise}\n */\n loadAnimation(e) {\n const t = this.json, n = this, i = t.animations[e], s = i.name ? i.name : \"animation_\" + e, r = [], a = [], l = [], h = [], c = [];\n for (let u = 0, m = i.channels.length; u < m; u++) {\n const f = i.channels[u], d = i.samplers[f.sampler], p = f.target, g = p.node, y = i.parameters !== void 0 ? i.parameters[d.input] : d.input, w = i.parameters !== void 0 ? i.parameters[d.output] : d.output;\n p.node !== void 0 && (r.push(this.getDependency(\"node\", g)), a.push(this.getDependency(\"accessor\", y)), l.push(this.getDependency(\"accessor\", w)), h.push(d), c.push(p));\n }\n return Promise.all([\n Promise.all(r),\n Promise.all(a),\n Promise.all(l),\n Promise.all(h),\n Promise.all(c)\n ]).then(function(u) {\n const m = u[0], f = u[1], d = u[2], p = u[3], g = u[4], y = [];\n for (let x = 0, _ = m.length; x < _; x++) {\n const b = m[x], E = f[x], A = d[x], P = p[x], C = g[x];\n if (b === void 0) continue;\n b.updateMatrix && b.updateMatrix();\n const D = n._createAnimationTracks(b, E, A, P, C);\n if (D)\n for (let I = 0; I < D.length; I++)\n y.push(D[I]);\n }\n const w = new kl(s, void 0, y);\n return ct(w, i), w;\n });\n }\n createNodeMesh(e) {\n const t = this.json, n = this, i = t.nodes[e];\n return i.mesh === void 0 ? null : n.getDependency(\"mesh\", i.mesh).then(function(s) {\n const r = n._getNodeRef(n.meshCache, i.mesh, s);\n return i.weights !== void 0 && r.traverse(function(a) {\n if (a.isMesh)\n for (let l = 0, h = i.weights.length; l < h; l++)\n a.morphTargetInfluences[l] = i.weights[l];\n }), r;\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n *\n * @private\n * @param {number} nodeIndex\n * @return {Promise}\n */\n loadNode(e) {\n const t = this.json, n = this, i = t.nodes[e], s = n._loadNodeShallow(e), r = [], a = i.children || [];\n for (let h = 0, c = a.length; h < c; h++)\n r.push(n.getDependency(\"node\", a[h]));\n const l = i.skin === void 0 ? Promise.resolve(null) : n.getDependency(\"skin\", i.skin);\n return Promise.all([\n s,\n Promise.all(r),\n l\n ]).then(function(h) {\n const c = h[0], u = h[1], m = h[2];\n m !== null && c.traverse(function(f) {\n f.isSkinnedMesh && f.bind(m, Du);\n });\n for (let f = 0, d = u.length; f < d; f++)\n c.add(u[f]);\n return c;\n });\n }\n // ._loadNodeShallow() parses a single node.\n // skin and child nodes are created and added in .loadNode() (no '_' prefix).\n _loadNodeShallow(e) {\n const t = this.json, n = this.extensions, i = this;\n if (this.nodeCache[e] !== void 0)\n return this.nodeCache[e];\n const s = t.nodes[e], r = s.name ? i.createUniqueName(s.name) : \"\", a = [], l = i._invokeOne(function(h) {\n return h.createNodeMesh && h.createNodeMesh(e);\n });\n return l && a.push(l), s.camera !== void 0 && a.push(i.getDependency(\"camera\", s.camera).then(function(h) {\n return i._getNodeRef(i.cameraCache, s.camera, h);\n })), i._invokeAll(function(h) {\n return h.createNodeAttachment && h.createNodeAttachment(e);\n }).forEach(function(h) {\n a.push(h);\n }), this.nodeCache[e] = Promise.all(a).then(function(h) {\n let c;\n if (s.isBone === !0 ? c = new Il() : h.length > 1 ? c = new is() : h.length === 1 ? c = h[0] : c = new $o(), c !== h[0])\n for (let u = 0, m = h.length; u < m; u++)\n c.add(h[u]);\n if (s.name && (c.userData.name = s.name, c.name = r), ct(c, s), s.extensions && Vt(n, c, s), s.matrix !== void 0) {\n const u = new Me();\n u.fromArray(s.matrix), c.applyMatrix4(u);\n } else\n s.translation !== void 0 && c.position.fromArray(s.translation), s.rotation !== void 0 && c.quaternion.fromArray(s.rotation), s.scale !== void 0 && c.scale.fromArray(s.scale);\n if (!i.associations.has(c))\n i.associations.set(c, {});\n else if (s.mesh !== void 0 && i.meshCache.refs[s.mesh] > 1) {\n const u = i.associations.get(c);\n i.associations.set(c, { ...u });\n }\n return i.associations.get(c).nodes = e, c;\n }), this.nodeCache[e];\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n *\n * @private\n * @param {number} sceneIndex\n * @return {Promise}\n */\n loadScene(e) {\n const t = this.extensions, n = this.json.scenes[e], i = this, s = new is();\n n.name && (s.name = i.createUniqueName(n.name)), ct(s, n), n.extensions && Vt(t, s, n);\n const r = n.nodes || [], a = [];\n for (let l = 0, h = r.length; l < h; l++)\n a.push(i.getDependency(\"node\", r[l]));\n return Promise.all(a).then(function(l) {\n for (let c = 0, u = l.length; c < u; c++)\n s.add(l[c]);\n const h = (c) => {\n const u = /* @__PURE__ */ new Map();\n for (const [m, f] of i.associations)\n (m instanceof ns || m instanceof Mr) && u.set(m, f);\n return c.traverse((m) => {\n const f = i.associations.get(m);\n f != null && u.set(m, f);\n }), u;\n };\n return i.associations = h(s), s;\n });\n }\n _createAnimationTracks(e, t, n, i, s) {\n const r = [], a = e.name ? e.name : e.uuid, l = [];\n At[s.path] === At.weights ? e.traverse(function(m) {\n m.morphTargetInfluences && l.push(m.name ? m.name : m.uuid);\n }) : l.push(a);\n let h;\n switch (At[s.path]) {\n case At.weights:\n h = Tr;\n break;\n case At.rotation:\n h = Er;\n break;\n case At.translation:\n case At.scale:\n h = Sr;\n break;\n default:\n switch (n.itemSize) {\n case 1:\n h = Tr;\n break;\n case 2:\n case 3:\n default:\n h = Sr;\n break;\n }\n break;\n }\n const c = i.interpolation !== void 0 ? Tu[i.interpolation] : ea, u = this._getArrayFromAccessor(n);\n for (let m = 0, f = l.length; m < f; m++) {\n const d = new h(\n l[m] + \".\" + At[s.path],\n t.array,\n u,\n c\n );\n i.interpolation === \"CUBICSPLINE\" && this._createCubicSplineTrackInterpolant(d), r.push(d);\n }\n return r;\n }\n _getArrayFromAccessor(e) {\n let t = e.array;\n if (e.normalized) {\n const n = Xs(t.constructor), i = new Float32Array(t.length);\n for (let s = 0, r = t.length; s < r; s++)\n i[s] = t[s] * n;\n t = i;\n }\n return t;\n }\n _createCubicSplineTrackInterpolant(e) {\n e.createInterpolant = function(n) {\n const i = this instanceof Er ? Su : La;\n return new i(this.times, this.values, this.getValueSize() / 3, n);\n }, e.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = !0;\n }\n}\nfunction Iu(o, e, t) {\n const n = e.attributes, i = new ot();\n if (n.POSITION !== void 0) {\n const a = t.json.accessors[n.POSITION], l = a.min, h = a.max;\n if (l !== void 0 && h !== void 0) {\n if (i.set(\n new K(l[0], l[1], l[2]),\n new K(h[0], h[1], h[2])\n ), a.normalized) {\n const c = Xs(yn[a.componentType]);\n i.min.multiplyScalar(c), i.max.multiplyScalar(c);\n }\n } else {\n console.warn(\"THREE.GLTFLoader: Missing min/max properties for accessor POSITION.\");\n return;\n }\n } else\n return;\n const s = e.targets;\n if (s !== void 0) {\n const a = new K(), l = new K();\n for (let h = 0, c = s.length; h < c; h++) {\n const u = s[h];\n if (u.POSITION !== void 0) {\n const m = t.json.accessors[u.POSITION], f = m.min, d = m.max;\n if (f !== void 0 && d !== void 0) {\n if (l.setX(Math.max(Math.abs(f[0]), Math.abs(d[0]))), l.setY(Math.max(Math.abs(f[1]), Math.abs(d[1]))), l.setZ(Math.max(Math.abs(f[2]), Math.abs(d[2]))), m.normalized) {\n const p = Xs(yn[m.componentType]);\n l.multiplyScalar(p);\n }\n a.max(l);\n } else\n console.warn(\"THREE.GLTFLoader: Missing min/max properties for accessor POSITION.\");\n }\n }\n i.expandByVector(a);\n }\n o.boundingBox = i;\n const r = new Ol();\n i.getCenter(r.center), r.radius = i.min.distanceTo(i.max) / 2, o.boundingSphere = r;\n}\nfunction eo(o, e, t) {\n const n = e.attributes, i = [];\n function s(r, a) {\n return t.getDependency(\"accessor\", r).then(function(l) {\n o.setAttribute(a, l);\n });\n }\n for (const r in n) {\n const a = Ws[r] || r.toLowerCase();\n a in o.attributes || i.push(s(n[r], a));\n }\n if (e.indices !== void 0 && !o.index) {\n const r = t.getDependency(\"accessor\", e.indices).then(function(a) {\n o.setIndex(a);\n });\n i.push(r);\n }\n return Fi.workingColorSpace !== rt && \"COLOR_0\" in n && console.warn(`THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${Fi.workingColorSpace}\" not supported.`), ct(o, e), Iu(o, e, t), Promise.all(i).then(function() {\n return e.targets !== void 0 ? Au(o, e.targets, t) : o;\n });\n}\nfunction Lu(o, e, t) {\n let n = new M.Group();\n n.name = e, o.scene.add(n), Da(e + \"/info\", (i) => {\n let s = JSON.parse(i);\n o.engineStatus.models.push({\n type: \"light\",\n info: s,\n name: s.baseInfo.name,\n status: \"loading\",\n url: e,\n elements: /* @__PURE__ */ new Map()\n }), o.models == null && (o.models = []), o.models.push({\n url: e,\n nodesMap: /* @__PURE__ */ new Map(),\n boundingBox: {\n min: new M.Vector3(s.baseInfo.min.X * 0.3048, s.baseInfo.min.Z * 0.3048, -s.baseInfo.min.Y * 0.3048),\n max: new M.Vector3(s.baseInfo.max.X * 0.3048, s.baseInfo.max.Z * 0.3048, -s.baseInfo.max.Y * 0.3048)\n }\n }), o.events.trigger(zt.EngineFree, e);\n });\n}\nfunction zu(o, e) {\n o.engineStatus.models.filter((t) => e == null || t.url == e).forEach((t) => {\n t.loadStatus == null && (t.loadStatus = {\n mep: !1,\n instance: !1,\n normal: !1\n }), t.status === \"loading\" && t.type === \"light\" && (t.loadStatus.modelMep != !0 && (t.loadStatus.modelMep = !0, Jh(o, t.info.modelMep, t.url)), t.loadStatus.normal != !0 && Ou(o, t));\n });\n}\nfunction Ou(o, e) {\n if (o.camera.position, e.size, e.info == null || e.info.lods == null)\n return;\n e.info.lods.forEach((i) => {\n if (i.status != !0)\n if (i.glbs == null)\n console.log(\"加载GLB.............\"), i.glbs = {}, Yh(e.url + i.path, (s) => {\n qr(s.get(\"/nodes.json\"), (r) => {\n let a = JSON.parse(r);\n o.models.find((c) => c.url == e.url).nodesMap == null && (o.models.find((c) => c.url == e.url).nodesMap = /* @__PURE__ */ new Map());\n let l = o.models.find((c) => c.url == e.url).nodesMap, h = 0;\n for (let c in a) {\n a[c].forEach((f) => {\n f.glb = c, l.has(f.id) == !1 ? l.set(f.id, { infos: [f] }) : l.get(f.id).infos.push(f);\n });\n let u = new Qh();\n const m = new Kh();\n m.setDecoderPath(\"/draco/\"), m.preload(), u.setDRACOLoader(m), u.load(s.get(c + \".glb\"), (f) => {\n i.glbs[c] = f.scene.children, i.glbs[c].forEach((d) => {\n d.geometry.computeVertexNormals();\n }), h++, h == Object.keys(a).length && o.engineStatus.isFree && (o.events.trigger(zt.EngineFree, e.url), o.viewCube.CameraGoHome());\n });\n }\n qr(s.get(\"/instances.json\"), (c) => {\n let u = JSON.parse(c);\n o.models.find((m) => m.url == e.url).instanceNodes = u;\n });\n });\n });\n else {\n let s = n(e, i, i.octreeBox), r = [], a = o.models.find((h) => h.url == e.url);\n s.forEach((h) => {\n a.nodesMap.has(h) && a.nodesMap.get(h).infos.forEach((c) => {\n let u = i.glbs[c.glb][c.mesh];\n if (u != null && u.geometry != null && u.material != null) {\n let m = new M.Matrix4();\n m.elements = c.matrix;\n let f = new M.Mesh(u.geometry.clone().applyMatrix4(m), u.material), d = new M.Box3().setFromObject(f);\n c.box = d, c.mesh = f, f.name = h, f.glb = c.glb, f.url = e.url, u.geometry.attributes.position != null && r.push(f);\n }\n });\n }), Bu(e.url, o, r);\n let l = a.instanceNodes;\n if (l != null)\n for (let h in l)\n (l[h].isLoaded == null || l[h].isLoaded == !1) && (l[h].isLoaded = !0, l[h].forEach((c) => {\n if (i.glbs[h] != null) {\n let u = i.glbs[h][c.mesh];\n Nu(e.url, c.mesh, o, u, c.children);\n }\n }));\n }\n });\n function n(i, s, r) {\n let a = [];\n if (r.status != !0) {\n if (!o.engineStatus.isFree)\n return a;\n let l = new M.Vector3(r.min.X, r.min.Z, -r.min.Y), h = new M.Vector3(r.max.X, r.max.Z, -r.max.Y);\n h.distanceTo(l);\n let c = o.camera.position, u = new M.Vector3(l.x + h.x / 2, l.y + h.y / 2, l.z + h.z / 2);\n c.distanceTo(u), r.elements.forEach((m) => {\n a.push(m);\n }), r.children.forEach((m) => {\n a.push(...n(i, s, m));\n }), r.children.findIndex((m) => m.status != !0) == -1 && (r.status = !0), r.children.length == 0 && (r.status = !0);\n }\n return a;\n }\n}\nfunction Bu(o, e, t) {\n let n = [];\n t.forEach((i) => {\n n.findIndex((r) => r.glb == i.glb) == -1 ? n.push({\n glb: i.glb,\n meshes: [i],\n currentIndex: i.geometry.index.count,\n indexes: /* @__PURE__ */ new Map()\n }) : (n.find((r) => r.glb == i.glb).meshes.push(i), n.find((r) => r.glb == i.glb).currentIndex += i.geometry.index.count);\n let s = n.find((r) => r.glb == i.glb);\n s.indexes.set(Number(i.name), [s.currentIndex - i.geometry.index.count, s.currentIndex]);\n }), n.forEach((i) => {\n let s = e.scene.children.find((r) => r instanceof M.Mesh && r.url == o && r.glb == i.glb);\n if (s != null)\n s.castShadow = !0, s.receiveShadow = !0;\n else {\n let r = new M.BufferGeometry(), a = Fu(i.meshes[0].material);\n r = ka(i.meshes.map((c) => c.geometry), !1);\n let l = new M.Mesh(r, a);\n l.castShadow = !0, l.receiveShadow = !0, e.scene.add(l), l.index = e.scene.children.length - 1, l.url = o, l.glb = i.glb, l.indexes = i.indexes, l.materialClone = a, l.geometrys = i.meshes.map((c) => c.geometry);\n let h = e.models.find((c) => c.url == o);\n if (h != null) {\n let c = 0;\n i.indexes.forEach((u) => {\n h.nodesMap.get(Number(i.meshes[c].name)).indexes == null && (h.nodesMap.get(Number(i.meshes[c].name)).indexes = []), h.nodesMap.get(Number(i.meshes[c].name)).indexes.push([l.index, c++, u[0], u[1]]);\n });\n }\n }\n });\n}\nfunction Nu(o, e, t, n, i) {\n if (n == null)\n return;\n let s = new M.InstancedMesh(n.geometry, n.material, i.length);\n t.scene.add(s);\n const r = new Float32Array(i.length * 3);\n for (let l = 0; l < i.length; l++)\n r[l * 3] = 1, r[l * 3 + 1] = 1, r[l * 3 + 2] = 1;\n s.instanceColor = new M.InstancedBufferAttribute(r, 3);\n let a = [];\n for (let l = 0; l < i.length; l++) {\n let h = i[l], c = new M.Matrix4();\n c.elements = h.matrix, s.setMatrixAt(l, c), s.matrixs || (s.matrixs = []), s.matrixs.push(c.clone()), a.push(c.clone()), t.models.find((u) => u.url == o).nodesMap.has(h.id) ? (t.models.find((u) => u.url == o).nodesMap.get(h.id).indexes == null && (t.models.find((u) => u.url == o).nodesMap.get(h.id).indexes = []), t.models.find((u) => u.url == o).nodesMap.get(h.id).indexes.push([t.scene.children.length - 1, l, 0, 0])) : t.models.find((u) => u.url == o).nodesMap.set(h.id, { instance: !0, info: h, indexes: [[t.scene.children.length - 1, l, 0, 0]] });\n }\n s.index = t.scene.children.length - 1, s.materialClone = n.material, s.url = o, s.glb = n.glb, s.ids = i.map((l) => l.id), s.matrixsClone = a;\n}\nfunction Fu(o) {\n return o.map != null && (o.map.colorSpace = M.SRGBColorSpace, o.map.needsUpdate = !0), o.shadowSide = M.FrontSide, o.side = o.side, o;\n}\nclass Uu {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 加载多个模型\n async loadModels(e, t) {\n console.log(\"待加载模型\", e);\n for (const i of e)\n n(i) === \"light\" && Lu(this.engine, i);\n function n(i) {\n const s = i.split(\".\").pop();\n return s === \"glb\" || s === \"gltf\" ? \"gltf\" : \"light\";\n }\n }\n}\nclass Vu {\n engine;\n isFree;\n // 高亮模型\n highlightModels;\n // 隐藏的毛线哦\n hideModels;\n // 半透明的模型\n translucentModels;\n // 已加载的模型\n models;\n constructor(e) {\n this.engine = e, this.isFree = !0, this.highlightModels = [], this.hideModels = [], this.translucentModels = [], this.models = [];\n }\n init() {\n this.engine.events.on(zt.EngineFree, (e) => {\n this.updateFree(!0), zu(this.engine, e);\n }), this.engine.events.on(zt.EngineBusy, () => {\n this.updateFree(!1);\n });\n }\n // 更新引擎空闲状态\n updateFree(e) {\n this.isFree = e;\n }\n // 关闭所有功能\n closeAllFunction = () => {\n };\n}\nclass Hu {\n // 使用字符串作为键,以确保不同来源的 EventType 枚举值能够正确匹配\n listeners = /* @__PURE__ */ new Map();\n // 是否启用调试模式(可以通过外部设置)\n debugMode = !1;\n /**\n * 设置调试模式\n * @param enabled 是否启用调试模式\n */\n setDebugMode(e) {\n this.debugMode = e;\n }\n /**\n * 订阅事件\n * @param event 事件类型\n * @param callback 回调函数\n */\n on(e, t) {\n const n = String(e);\n this.listeners.has(n) || this.listeners.set(n, []), this.listeners.get(n).push(t), this.debugMode && console.debug(`[EventModule] 注册事件监听器: ${n}, 当前监听器数量: ${this.listeners.get(n).length}`);\n }\n /**\n * 取消订阅事件\n * @param event 事件类型\n * @param callback 要移除的回调函数\n */\n off(e, t) {\n const n = String(e);\n if (!this.listeners.has(n)) {\n this.debugMode && console.warn(`[EventModule] 尝试移除不存在的事件监听器: ${n}`);\n return;\n }\n const i = this.listeners.get(n), s = i.indexOf(t);\n s !== -1 ? (i.splice(s, 1), this.debugMode && console.debug(`[EventModule] 移除事件监听器: ${n}, 剩余监听器数量: ${i.length}`)) : this.debugMode && console.warn(`[EventModule] 尝试移除的回调函数未找到: ${n}`);\n }\n /**\n * 触发事件\n * @param event 事件类型\n * @param data 事件数据\n */\n trigger(e, t) {\n const n = String(e);\n if (!this.listeners.has(n)) {\n this.debugMode && (console.warn(`[EventModule] 触发事件但未找到监听器: ${n}`), console.debug(\"[EventModule] 当前已注册的事件类型:\", Array.from(this.listeners.keys())));\n return;\n }\n const i = this.listeners.get(n);\n this.debugMode && console.debug(`[EventModule] 触发事件: ${n}, 监听器数量: ${i.length}`, t), i.forEach((s, r) => {\n try {\n s(t);\n } catch (a) {\n console.error(`[EventModule] 事件监听器执行错误 [${n}] #${r}:`, a);\n }\n });\n }\n}\nclass ju {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 加入场景基本光照\n init() {\n const e = new M.DirectionalLight(16777215, 1);\n e.position.set(100, 200, 100), e.castShadow = !0, e.shadow.mapSize.width = 2048, e.shadow.mapSize.height = 2048, e.shadow.camera.near = 0.1, e.shadow.camera.far = 5e3, e.shadow.bias = -5e-5, e.shadow.normalBias = 0.02;\n const t = 50;\n e.shadow.camera.left = -t, e.shadow.camera.right = t, e.shadow.camera.top = t, e.shadow.camera.bottom = -t, e.shadow.radius = 2;\n const n = new M.DirectionalLight(16777215, 2);\n this.engine.scene.add(e), this.engine.scene.add(n), this.engine.scene.dirLight = n;\n const i = new M.AmbientLight(16777215, 1);\n this.engine.scene.add(i);\n }\n}\nvar Se = /* @__PURE__ */ ((o) => (o.ModelLoadStart = \"model-load-start\", o.ModelLoadProgress = \"model-load-progress\", o.ModelLoaded = \"model-loaded\", o.ModelError = \"model-error\", o.SelectionChanged = \"selection-changed\", o.HoverChanged = \"hover-changed\", o.Click = \"click\", o.MouseMove = \"mouse-move\", o.CameraChanged = \"camera-changed\", o.CameraIdle = \"camera-idle\", o.EngineFree = \"engine-free\", o.EngineBusy = \"engine-busy\", o.MeasureChanged = \"measure-changed\", o.MeasureClick = \"measure-click\", o.SectionMove = \"section-move\", o))(Se || {});\nclass Gu {\n engine;\n behavior;\n isCtrlDown = !1;\n highlightedInstances = [];\n highlightColor = new M.Color(43775);\n // 高亮颜色:蓝色\n constructor(e) {\n this.engine = e;\n }\n init() {\n this.behavior = this.engine.handelBehaved, this.behavior.init(this);\n }\n active() {\n this.behavior.active();\n }\n disActive() {\n this.behavior.disActive();\n }\n // 键盘事件\n handelKeyCtrlUp() {\n this.isCtrlDown = !1;\n }\n handelKeyCtrlDown() {\n this.isCtrlDown = !0;\n }\n // 监听鼠标按下\n hoverOldId = null;\n // 鼠标移动时,触发模型高亮\n handleMouseMove(e) {\n if (!this.engine.engineStatus.isFree) {\n this.engine.hoverHighLight.clearHighlight();\n return;\n }\n let t = this.getCatchMeshs(e);\n t != null ? t.length > 0 && this.engine.hoverHighLight.hightMesh(t) : this.engine.hoverHighLight.clearHighlight();\n }\n getCatchMeshs(e) {\n if (e.catch == null)\n return this.hoverOldId = null, null;\n if (e.catch.object.isInstance) {\n let t = e.catch.object, n = e.catch.object.id, i = this.engine.models.find((a) => a.url == t.url).nodesMap.get(n), s = /* @__PURE__ */ new Map();\n i?.indexes.forEach((a) => {\n this.engine.scene.children[a[0]] instanceof M.InstancedMesh && (s.has(a[0]) ? s.get(a[0])?.push(a[1]) : s.set(a[0], [a[1]]));\n });\n let r = [];\n return s.forEach((a, l) => {\n let h = this.engine.scene.children[l];\n a.forEach((c) => {\n let u = h.geometry.clone();\n u.applyMatrix4(h.matrixs[c]), r.push(new M.Mesh(u, h.material));\n });\n }), this.hoverOldId == n ? [] : (this.hoverOldId = n, this.engine.hoverHighLight.clearHighlight(), r);\n } else {\n const t = e.catch;\n t.object;\n let n = t.object, i = n.name, a = this.engine.models.find((l) => l.url === n.url).nodesMap.get(i).infos.map((l) => l.mesh);\n return this.hoverOldId == i ? [] : (this.hoverOldId = i, this.engine.hoverHighLight.clearHighlight(), a);\n }\n }\n // 业务功能-监听鼠标谈起,点选模型\n handleMouseClick(e) {\n if (e.catch != null) {\n const t = e.catch;\n let n = t.object;\n this.isCtrlDown || this.engine.modelToolModule.unhighlightAllModels(), console.log([{ url: n.url, ids: [n.name] }]), this.engine.controlModule.orbitControls.origin.set(t.point.x, t.point.y, t.point.z), this.engine.modelToolModule.highlightModel([{ url: n.url, ids: [n.name] }]), this.engine.events.trigger(Se.Click, !0);\n } else\n this.engine.modelToolModule.unhighlightAllModels();\n }\n // 双击模型事件\n handleMouseDoubleClick(e) {\n if (e.catch) {\n const n = e.catch;\n n.object, this.engine.events.trigger(Se.Click, n);\n let i = n.object, a = this.engine.models.find((h) => h.url === i.url).nodesMap.get(i.name).infos.map((h) => h.box), l = t(a);\n this.engine.viewCube.zoomToModel(l);\n }\n function t(n) {\n let i = new M.Vector3(1e8, 1e9, 1e10), s = new M.Vector3(-1e8, -1e9, -1e10);\n return n.forEach((r) => {\n r.min.x < i.x && (i.x = r.min.x), r.min.y < i.y && (i.y = r.min.y), r.min.z < i.z && (i.z = r.min.z), r.max.x > s.x && (s.x = r.max.x), r.max.y > s.y && (s.y = r.max.y), r.max.z > s.z && (s.z = r.max.z);\n }), new M.Box3(i, s);\n }\n }\n // 判断点击instance节点\n handleMouseClickInstance(e) {\n return e.intersectObjects(this.engine.scene.children.filter((n) => n instanceof M.InstancedMesh), !0);\n }\n}\nclass Wu {\n engine;\n highlightMaterial;\n hideMaterial;\n translucentMaterial;\n // 存储克隆的高亮模型,用于后续清理 \n // 存储被隐藏的 InstancedMesh 实例的原始矩阵,用于后续恢复\n // key: 场景中 InstancedMesh 的索引,value: Map<实例索引, 原始矩阵> \n constructor(e) {\n this.engine = e, this.highlightMaterial = new M.MeshBasicMaterial({\n color: 43775,\n // 明显的蓝色\n depthTest: !1,\n // 不进行深度测试,始终显示\n depthWrite: !1,\n // 不写入深度缓冲\n transparent: !0,\n opacity: 0.5,\n // 半透明效果\n side: M.DoubleSide\n // 双面渲染\n }), this.hideMaterial = new M.MeshBasicMaterial({\n color: 0,\n // 明显的蓝色 \n transparent: !0,\n opacity: 0,\n // 半透明效果\n side: M.DoubleSide\n // 双面渲染\n }), this.translucentMaterial = new M.MeshBasicMaterial({\n color: 16777215,\n transparent: !0,\n opacity: 0.05,\n // 半透明效果\n side: M.DoubleSide\n // 双面渲染\n }), this.highlightMaterial.clippingPlanes = this.engine.sectionPlane, this.hideMaterial.clippingPlanes = this.engine.sectionPlane, this.translucentMaterial.clippingPlanes = this.engine.sectionPlane;\n }\n // ***************************************************** 模型高亮 ***************************************************** //\n // 拆分网格\n split_merge_model(e) {\n if (e.isSplit || e instanceof M.InstancedMesh)\n return;\n let t = e.materialClone.clone(), n = ka(e.geometrys, !0);\n n.groups.forEach((i) => {\n i.materialIndex = 0;\n }), e.geometry = n, e.material = [t, this.highlightMaterial, this.translucentMaterial], e.needsUpdate = !0, e.isSplit = !0;\n }\n // 合并网格\n un_split_merge_model(e) {\n }\n // 设置模型高亮\n highlightModel(e) {\n e.forEach((t) => {\n let n = /* @__PURE__ */ new Map();\n t.ids.forEach((s) => {\n let r = this.engine.models.find((a) => a.url == t.url).nodesMap.get(s);\n r != null && r.indexes != null && r.indexes.forEach((a) => {\n this.engine.scene.children[a[0]] instanceof M.InstancedMesh ? n.has(a[0]) ? n.get(a[0])?.push(a[1]) : n.set(a[0], [a[1]]) : (console.log(this.engine.scene.children[a[0]].materialClone.color), this.split_merge_model(this.engine.scene.children[a[0]]), this.engine.scene.children[a[0]].geometry.groups[a[1]].materialIndex = 1);\n });\n }), Xu(n, this.engine);\n let i = this.engine.engineStatus.highlightModels.find((s) => s.url == t.url);\n i != null ? i.ids.push(...t.ids) : this.engine.engineStatus.highlightModels.push(t);\n });\n }\n // 取消模型高亮\n unhighlightModel(e) {\n e.forEach((t) => {\n let n = /* @__PURE__ */ new Map();\n t.ids.forEach((i) => {\n let s = this.engine.models.find((r) => r.url == t.url).nodesMap.get(i);\n s != null && s.indexes != null && s.indexes.forEach((r) => {\n this.engine.scene.children[r[0]] instanceof M.InstancedMesh ? n.has(r[0]) ? n.get(r[0])?.push(r[1]) : n.set(r[0], [r[1]]) : this.engine.scene.children[r[0]].geometry.groups[r[1]].materialIndex = 0;\n });\n }), to(n, this.engine, \"highlightModel\");\n });\n }\n // 取消所有模型高亮\n unhighlightAllModels(e = !0) {\n this.engine.engineStatus.highlightModels.forEach((t) => {\n this.unhighlightModel([t]);\n }), e && (this.engine.engineStatus.highlightModels = []);\n }\n // ***************************************************** 模型高亮 ***************************************************** //\n // ***************************************************** 模型隐藏 ***************************************************** //\n // 隐藏模型\n hideModel(e) {\n e.forEach((t) => {\n let n = /* @__PURE__ */ new Map();\n t.ids.forEach((s) => {\n let r = this.engine.models.find((a) => a.url == t.url).nodesMap.get(s);\n this.engine.modelEdge.hideModelEdge(t.url, s), r != null && r.indexes != null && r.indexes.forEach((a) => {\n const l = this.engine.scene.children[a[0]];\n l instanceof M.InstancedMesh ? n.has(a[0]) ? n.get(a[0])?.push(a[1]) : n.set(a[0], [a[1]]) : (this.split_merge_model(this.engine.scene.children[a[0]]), l.geometry.groups[a[1]].materialIndex = -1, l.geometry.groups[a[1]].visible = !1);\n });\n }), n.size > 0 && qu(n, this.engine);\n let i = this.engine.engineStatus.hideModels.find((s) => s.url == t.url);\n i != null ? i.ids.push(...t.ids) : this.engine.engineStatus.hideModels.push({\n url: t.url,\n ids: t.ids\n }), this.engine.engineStatus.highlightModels = [];\n });\n }\n // 显示模型\n showModel(e) {\n e.forEach((t) => {\n let n = /* @__PURE__ */ new Map();\n t.ids.forEach((s) => {\n let r = this.engine.models.find((a) => a.url == t.url).nodesMap.get(s);\n this.engine.modelEdge.showModelEdge(t.url, s), r != null && r.indexes != null && r.indexes.forEach((a) => {\n const l = this.engine.scene.children[a[0]];\n l instanceof M.InstancedMesh ? n.has(a[0]) ? n.get(a[0])?.push(a[1]) : n.set(a[0], [a[1]]) : (l.geometry.groups[a[1]].materialIndex = 0, l.geometry.groups[a[1]].visible = !0);\n });\n }), n.size > 0 && no(n, this.engine);\n let i = this.engine.engineStatus.hideModels.find((s) => s.url == t.url);\n i && (t.ids.forEach((s) => {\n const r = i.ids.indexOf(s);\n r !== -1 && i.ids.splice(r, 1);\n }), i.ids.length === 0 && (this.engine.engineStatus.hideModels = this.engine.engineStatus.hideModels.filter((s) => s !== i)));\n });\n }\n // 隔离模型 - 只显示传入的模型,隐藏其他所有模型\n isolateModel(e) {\n let t = [];\n this.engine.models.forEach((n) => {\n let i = { url: n.url, ids: [] }, s = e.find((r) => r.url == n.url);\n for (let r of n.nodesMap)\n s == null ? i.ids.push(r[0]) : s.ids.includes(r[0]) || i.ids.push(r[0]);\n t.push(i);\n }), this.unhighlightAllModels(), this.hideModel(t);\n }\n // 隔离模型 - 只显示传入的模型,其他模型半透明\n translucentOtherModel(e) {\n let t = [];\n this.engine.models.forEach((n) => {\n let i = { url: n.url, ids: [] }, s = e.find((r) => r.url == n.url);\n for (let r of n.nodesMap)\n s == null ? i.ids.push(r[0]) : s.ids.includes(r[0]) || i.ids.push(r[0]);\n t.push(i);\n }), this.translucentModel(t);\n }\n // ***************************************************** 模型隐藏 ***************************************************** //\n // ***************************************************** 设置模型颜色 ***************************************************** //\n // 设置模型颜色\n setModelColor(e, t) {\n e.material.color.set(t);\n }\n // 设置所有模型颜色\n setAllModelsColor(e) {\n this.engine.scene.children.forEach((t) => {\n t.isMesh;\n });\n }\n // 恢复所有模型颜色\n restoreAllModelsColor() {\n this.engine.scene.children.forEach((e) => {\n e.isMesh;\n });\n }\n // ***************************************************** 设置模型颜色 ***************************************************** //\n // ***************************************************** 设置模型半透明 ***************************************************** //\n // 半透明模型(仅对普通 Mesh 生效,不影响 InstancedMesh)\n translucentModel(e) {\n this.unhighlightAllModels(), e.forEach((t) => {\n let n = /* @__PURE__ */ new Map();\n t.ids.forEach((s) => {\n let r = this.engine.models.find((a) => a.url == t.url).nodesMap.get(s);\n r != null && r.indexes != null && r.indexes.forEach((a) => {\n const l = this.engine.scene.children[a[0]];\n l instanceof M.InstancedMesh ? n.has(a[0]) ? n.get(a[0])?.push(a[1]) : n.set(a[0], [a[1]]) : (this.split_merge_model(this.engine.scene.children[a[0]]), l.geometry.groups[a[1]].materialIndex = 2);\n });\n }), Zu(n, this.engine);\n let i = this.engine.engineStatus.translucentModels.find((s) => s.url == t.url);\n i != null ? i.ids.push(...t.ids) : this.engine.engineStatus.translucentModels.push({\n url: t.url,\n ids: t.ids\n });\n }), this.engine.engineStatus.highlightModels = [];\n }\n // 取消半透明\n unTranslucentModel() {\n this.engine.engineStatus.translucentModels.forEach((t) => {\n let n = /* @__PURE__ */ new Map();\n t.ids.forEach((i) => {\n let s = this.engine.models.find((r) => r.url == t.url).nodesMap.get(i);\n s != null && s.indexes != null && s.indexes.forEach((r) => {\n const a = this.engine.scene.children[r[0]];\n a instanceof M.InstancedMesh ? n.has(r[0]) ? n.get(r[0])?.push(r[1]) : n.set(r[0], [r[1]]) : (this.split_merge_model(this.engine.scene.children[r[0]]), a.geometry.groups[r[1]].materialIndex = 0);\n });\n }), n.size > 0 && no(n, this.engine), to(n, this.engine, \"translucentModel\");\n }), this.engine.engineStatus.translucentModels = [];\n }\n // ***************************************************** 设置模型半透明 ***************************************************** //\n // 显示所有模型(恢复所有隐藏及半透明效果)\n showAllModels() {\n this.engine.engineStatus.hideModels && this.engine.engineStatus.hideModels.length > 0 && this.showModel(this.engine.engineStatus.hideModels), this.engine.engineStatus.hideModels = [], this.unhighlightAllModels();\n }\n // ***************************************************** 批量选择模型 ***************************************************** // \n // 选择同层同类构件\n batchSelectSameLevelTypeModel(e) {\n if (e.length == 0)\n return;\n let t = e[0], n = this.engine.modelMapperBatch.getModelMapper(t.url, t.ids[0]);\n this.engine.modelMapperBatch.getModelsWithLevelType(n.levelName, n.typeName, (i) => {\n this.engine.modelToolModule.highlightModel(i);\n });\n }\n // 选择同层构件\n batchSelectSameLevelModel(e) {\n if (e.length == 0)\n return;\n let t = e[0], n = this.engine.modelMapperBatch.getModelMapper(t.url, t.ids[0]);\n this.engine.modelMapperBatch.getModelsWithLevel(n.levelName, (i) => {\n this.engine.modelToolModule.highlightModel(i);\n });\n }\n // 选择同类构件\n batchSelectSameTypeModel(e) {\n if (e.length == 0)\n return;\n let t = e[0], n = this.engine.modelMapperBatch.getModelMapper(t.url, t.ids[0]);\n this.engine.modelMapperBatch.getModelsWithType(n.typeName, (i) => {\n this.engine.modelToolModule.highlightModel(i);\n });\n }\n // ***************************************************** 设置模型颜色 ***************************************************** //\n}\nfunction Xu(o, e) {\n o.forEach((t, n) => {\n const i = e.scene.children[n];\n if (!(i instanceof M.InstancedMesh))\n return;\n const s = i.geometry, r = new M.MeshBasicMaterial({\n color: 43775,\n // 明显的蓝色\n depthTest: !1,\n // 不进行深度测试,始终显示\n depthWrite: !1,\n // 不写入深度缓冲\n transparent: !0,\n // 启用透明\n opacity: 0.5,\n // 半透明效果\n side: M.DoubleSide\n // 双面渲染\n }), a = new M.InstancedMesh(s, r, t.length);\n a.name = \"highlightModel\", a.key = n;\n const l = /* @__PURE__ */ new Map(), h = new M.Matrix4(), c = new M.Matrix4();\n c.makeScale(0, 0, 0), t.forEach((u, m) => {\n i.getMatrixAt(u, h), l.set(u, h.clone()), i.setMatrixAt(u, c), a.setMatrixAt(m, h);\n }), i.instanceMatrix.needsUpdate = !0, a.instanceMatrix.needsUpdate = !0, e.scene.add(a);\n });\n}\nfunction to(o, e, t) {\n o.forEach((n, i) => {\n const s = e.scene.children[i];\n if (!(s instanceof M.InstancedMesh))\n return;\n n.forEach((a) => {\n const l = s.matrixsClone[a];\n l && s.setMatrixAt(a, l);\n }), s.instanceMatrix.needsUpdate = !0, e.scene.children.filter((a) => a.key == i && a.name == t).forEach((a) => {\n e.scene.remove(a);\n });\n });\n}\nfunction Zu(o, e) {\n o.forEach((t, n) => {\n const i = e.scene.children[n];\n if (!(i instanceof M.InstancedMesh))\n return;\n const s = i.geometry, r = new M.MeshBasicMaterial({\n color: 16777215,\n // 明显的蓝色 \n transparent: !0,\n // 启用透明\n opacity: 0.05,\n // 半透明效果\n side: M.DoubleSide\n // 双面渲染\n }), a = new M.InstancedMesh(s, r, t.length);\n a.name = \"translucentModel\", a.key = n;\n const l = /* @__PURE__ */ new Map(), h = new M.Matrix4(), c = new M.Matrix4();\n c.makeScale(0, 0, 0), t.forEach((u, m) => {\n i.getMatrixAt(u, h), l.set(u, h.clone()), i.setMatrixAt(u, c), a.setMatrixAt(m, h);\n }), i.instanceMatrix.needsUpdate = !0, a.instanceMatrix.needsUpdate = !0, e.scene.add(a);\n });\n}\nfunction qu(o, e) {\n e.scene.children.filter((t) => t.name == \"highlightModel\").forEach((t) => {\n e.scene.remove(t);\n }), o.forEach((t, n) => {\n const i = e.scene.children[n];\n if (!(i instanceof M.InstancedMesh))\n return;\n const s = /* @__PURE__ */ new Map(), r = new M.Matrix4(), a = new M.Matrix4();\n a.makeScale(0, 0, 0), t.forEach((l, h) => {\n i.getMatrixAt(l, r), s.set(l, r.clone()), i.setMatrixAt(l, a);\n }), i.instanceMatrix.needsUpdate = !0;\n });\n}\nfunction no(o, e) {\n o.forEach((t, n) => {\n const i = e.scene.children[n];\n i instanceof M.InstancedMesh && (t.forEach((s) => {\n const r = i.matrixs[s];\n r && i.setMatrixAt(s, r);\n }), i.instanceMatrix.needsUpdate = !0);\n });\n}\nclass je {\n /**\n * 构造函数\n * @param camera - Three.js 相机对象(用于投影计算)\n * @param renderer - Three.js 渲染器对象(用于获取画布尺寸)\n * @param scene - Three.js 场景对象(用于屏幕坐标转世界坐标时的射线检测,可选)\n */\n constructor(e, t, n) {\n this.camera = e, this.renderer = t, this.scene = n, this.raycaster = new M.Raycaster();\n }\n raycaster;\n /**\n * 将世界坐标转换为屏幕坐标(归一化坐标,范围 -1 到 1)\n * @param worldPos - 世界空间中的3D坐标点\n * @returns 归一化的屏幕坐标,x 和 y 的范围都是 -1 到 1\n * x: -1 表示屏幕左边缘,1 表示屏幕右边缘\n * y: -1 表示屏幕下边缘,1 表示屏幕上边缘\n */\n worldToScreenNormalized(e) {\n const t = e.clone();\n return t.project(this.camera), new M.Vector2(t.x, t.y);\n }\n /**\n * 将世界坐标转换为屏幕坐标(像素坐标)\n * @param worldPos - 世界空间中的3D坐标点\n * @returns 屏幕像素坐标,x 和 y 表示在画布上的实际像素位置\n * x: 0 表示屏幕左边缘,width 表示屏幕右边缘\n * y: 0 表示屏幕上边缘,height 表示屏幕下边缘\n */\n worldToScreen(e) {\n const t = this.worldToScreenNormalized(e), n = this.renderer.domElement.width, i = this.renderer.domElement.height, s = (t.x + 1) * n / 2, r = (1 - t.y) * i / 2;\n return new M.Vector2(s, r);\n }\n /**\n * 将屏幕坐标(像素坐标)转换为归一化坐标\n * @param screenX - 屏幕像素 X 坐标\n * @param screenY - 屏幕像素 Y 坐标\n * @returns 归一化的屏幕坐标,范围 -1 到 1\n */\n screenToNormalized(e, t) {\n const n = this.renderer.domElement.clientWidth, i = this.renderer.domElement.clientHeight, s = e / n * 2 - 1, r = -(t / i * 2 - 1);\n return new M.Vector2(s, r);\n }\n /**\n * 将屏幕坐标(像素坐标)转换为世界坐标\n * 使用射线检测,返回与场景中第一个相交对象的世界坐标点\n * @param screenX - 屏幕像素 X 坐标\n * @param screenY - 屏幕像素 Y 坐标\n * @param objects - 可选,指定要检测的对象数组。如果不提供且 scene 存在,则检测场景中的所有对象\n * @returns 世界坐标点,如果没有相交则返回 null\n */\n screenToWorld(e, t, n) {\n if (!this.scene && !n)\n return console.warn(\"WorldToScreen: 需要提供 scene 或 objects 参数才能进行屏幕坐标转世界坐标\"), null;\n const i = this.screenToNormalized(e, t);\n this.raycaster.setFromCamera(i, this.camera);\n const s = n || this.scene.children, r = this.raycaster.intersectObjects(s, !0);\n return r.length > 0 ? r[0].point : null;\n }\n /**\n * 将屏幕坐标转换为指定深度的世界坐标\n * @param screenX - 屏幕像素 X 坐标\n * @param screenY - 屏幕像素 Y 坐标\n * @param depth - 沿射线方向的距离(世界单位)\n * @returns 世界坐标点\n */\n screenToWorldWithDepth(e, t, n = 0) {\n const i = this.screenToNormalized(e, t);\n this.raycaster.setFromCamera(i, this.camera);\n const s = new M.Vector3();\n return this.raycaster.ray.at(n, s), s;\n }\n /**\n * 更新相机引用(当相机发生变化时调用)\n * @param camera - 新的相机对象\n */\n updateCamera(e) {\n this.camera = e;\n }\n /**\n * 更新渲染器引用(当渲染器发生变化时调用)\n * @param renderer - 新的渲染器对象\n */\n updateRenderer(e) {\n this.renderer = e;\n }\n /**\n * 更新场景引用(当场景发生变化时调用)\n * @param scene - 新的场景对象\n */\n updateScene(e) {\n this.scene = e;\n }\n}\nclass Yu {\n engine;\n currentMode = \"\";\n // 是否为手动设置(手动设置时,自动适配不再生效)\n isManualMode = !1;\n // Pass 引用\n gtaoPass = null;\n ssaoPass = null;\n saturationPass = null;\n outputPass = null;\n fxaaPass = null;\n constructor(e) {\n this.engine = e;\n }\n /**\n * 初始化模块\n */\n init() {\n this.cachePassReferences(), this.autoSwitch(\"advanced\");\n }\n /**\n * 手动切换渲染模式(用户调用),锁定自动适配\n * @param model - \"simple\"(性能) | \"balance\"(平衡) | \"advanced\"(效果)\n */\n switchModel(e) {\n this.isManualMode = !0, this.currentMode = e, this.applyMode(e);\n }\n /**\n * 自动切换渲染模式(引擎内部调用),若已手动设置则跳过\n * @param model - \"simple\"(性能) | \"balance\"(平衡) | \"advanced\"(效果)\n */\n autoSwitch(e) {\n this.isManualMode || (this.currentMode = e, this.applyMode(e));\n }\n /**\n * 恢复自动适配模式(解除手动锁定)\n */\n enableAutoMode() {\n this.isManualMode = !1;\n }\n /**\n * 是否处于手动锁定模式\n */\n get isManual() {\n return this.isManualMode;\n }\n /**\n * 设置模式(内部初始化使用,不影响手动锁定状态)\n * @param model - \"simple\"(性能) | \"balance\"(平衡) | \"advanced\"(效果)\n */\n setMode(e) {\n this.isManualMode = !0, this.currentMode = e, this.applyMode(e);\n }\n /**\n * 获取当前模式\n */\n getCurrentMode() {\n return this.currentMode;\n }\n /**\n * 缓存 Pass 引用\n */\n cachePassReferences() {\n this.engine.composerModule?.composer && (this.engine.composerModule.gtaoPass && (this.gtaoPass = this.engine.composerModule.gtaoPass), this.engine.composerModule.ssaoPass && (this.ssaoPass = this.engine.composerModule.ssaoPass), this.engine.composerModule.saturationPass && (this.saturationPass = this.engine.composerModule.saturationPass), this.engine.composerModule.outputPass && (this.outputPass = this.engine.composerModule.outputPass), this.engine.composerModule.fxaaPass && (this.fxaaPass = this.engine.composerModule.fxaaPass));\n }\n // 应用模式(私有方法)\n applyMode(e) {\n switch (e) {\n case \"simple\":\n this.setShadows(!1), this.setGTAO(!1), this.setSSAO(!1), this.setSaturation(!1), this.setOutputPass(!1), this.setFXAA(!1);\n break;\n case \"balance\":\n this.setShadows(!0), this.setGTAO(!1), this.setSSAO(!1), this.setSaturation(!1), this.setOutputPass(!1), this.setFXAA(!1);\n break;\n case \"advanced\":\n this.setShadows(!0), this.setSSAO(!1), this.setGTAO(!0), this.setSaturation(!0), this.setOutputPass(!0), this.setFXAA(!0);\n break;\n default:\n console.warn(`[EngineModelModule] Unknown mode: ${e}`);\n }\n this.engine.updateVersionDisplay?.();\n }\n /**\n * 设置阴影开关\n */\n setShadows(e) {\n this.engine.renderer && (this.engine.renderer.shadowMap.enabled = e);\n const t = this.engine.scene?.children.find(\n (n) => n instanceof M.DirectionalLight\n );\n t && (t.castShadow = e), this.engine.scene?.traverse((n) => {\n n.material && (n.castShadow !== void 0 && (n.castShadow = e), n.receiveShadow !== void 0 && (n.receiveShadow = e));\n });\n }\n /**\n * 设置环境光遮蔽 (GTAO) 开关\n */\n setGTAO(e) {\n this.engine.composerModule?.composer && this.gtaoPass && (this.gtaoPass.enabled = e);\n }\n /**\n * 设置环境光遮蔽 (SSAO) 开关\n */\n setSSAO(e) {\n this.engine.composerModule?.composer && this.ssaoPass && (this.ssaoPass.enabled = e);\n }\n /**\n * 设置饱和度 Pass 开关\n */\n setSaturation(e) {\n this.saturationPass && (this.saturationPass.enabled = e);\n }\n /**\n * 设置输出 Pass 开关\n */\n setOutputPass(e) {\n this.outputPass && (this.outputPass.enabled = e);\n }\n /**\n * 设置 FXAA Pass 开关\n */\n setFXAA(e) {\n this.fxaaPass && (this.fxaaPass.enabled = e);\n }\n // ============ 公共接口,供 engine 调用 ============\n /**\n * 设置性能模式\n */\n setPerformanceMode() {\n this.setMode(\"simple\");\n }\n /**\n * 设置平衡模式\n */\n setBalancedMode() {\n this.setMode(\"balance\");\n }\n /**\n * 设置效果模式(SSAO)\n */\n setQualityMode() {\n this.setMode(\"advanced\");\n }\n /**\n * 设置超高级模式(GTAO,最高质量)\n */\n setSuperQualityMode() {\n this.setMode(\"superAdvanced\");\n }\n /**\n * 设置阴影质量\n * @param quality - \"low\"(1024) | \"medium\"(2048) | \"high\"(4096)\n */\n setShadowQuality(e) {\n const t = this.engine.scene?.children.find(\n (s) => s instanceof M.DirectionalLight\n ), i = {\n low: 1024,\n medium: 2048,\n high: 2048\n }[e];\n t?.shadow && i && (t.shadow.mapSize.width = i, t.shadow.mapSize.height = i, t.shadow.map?.dispose(), t.shadow.map = null);\n }\n /**\n * 设置饱和度值\n * @param value - 饱和度值,1.0为正常\n */\n setSaturationValue(e) {\n this.saturationPass && (this.saturationPass.uniforms.saturation.value = e);\n }\n /**\n * 设置对比度值\n * @param value - 对比度值,1.0为正常\n */\n setContrastValue(e) {\n this.saturationPass && (this.saturationPass.uniforms.contrast.value = e);\n }\n /**\n * 设置 GTAO 强度\n * @param value - 强度值 0-1\n */\n setGTAOIntensity(e) {\n this.gtaoPass && (this.gtaoPass.blendIntensity = e);\n }\n}\nclass Hi {\n engine;\n overlayMaterial;\n overlayMeshes = [];\n // 动画状态\n animState = \"idle\";\n animStartTime = 0;\n static FADE_IN_MS = 200;\n static FADE_OUT_MS = 150;\n constructor(e) {\n this.engine = e, this.init();\n }\n init() {\n this.overlayMaterial = new M.MeshBasicMaterial({\n color: 16777215,\n transparent: !0,\n opacity: 0,\n blending: M.AdditiveBlending,\n depthWrite: !1\n }), this.overlayMaterial.clippingPlanes = this.engine.sectionPlane;\n }\n /**\n * 高亮一个或多个网格,在原模型同位置叠加亮化覆盖层(原模型不受修改)\n * @param meshes 目标网格或网格数组,传 null/[] 则触发淡出清除\n * @param color 叠加颜色(默认白色 0xffffff,越亮越明显)\n * @param intensity 叠加强度 0~1(默认 0.35)\n */\n hightMesh(e, t = 16777215, n = 0.15) {\n this.animState === \"fadeOut\" && this.removeOverlayMeshes();\n const i = (Array.isArray(e) ? e : e ? [e] : []).filter((s) => s?.geometry);\n if (i.length === 0) {\n this.clearHighlight();\n return;\n }\n this.overlayMaterial.color.set(t), this.overlayMaterial.opacity = 0, this.overlayMaterial.userData.targetOpacity = n;\n for (const s of i) {\n const r = new M.Mesh(s.geometry, this.overlayMaterial);\n s.updateWorldMatrix(!0, !1), r.matrix.copy(s.matrixWorld), r.matrixAutoUpdate = !1, this.engine.scene.add(r), this.overlayMeshes.push(r);\n }\n this.animState = \"fadeIn\", this.animStartTime = performance.now();\n }\n /**\n * 触发淡出动画,结束后自动从场景中移除所有覆盖层\n */\n clearHighlight() {\n this.overlayMeshes.length === 0 || this.animState === \"fadeOut\" || (this.animState = \"fadeOut\", this.animStartTime = performance.now());\n }\n /**\n * 每帧更新动画 — 由���擎 animate 循环调用\n */\n update() {\n if (this.animState === \"idle\" || this.overlayMeshes.length === 0) return;\n const e = performance.now() - this.animStartTime, t = this.overlayMaterial.userData.targetOpacity ?? 0.35;\n if (this.animState === \"fadeIn\") {\n const n = Math.min(e / Hi.FADE_IN_MS, 1);\n this.overlayMaterial.opacity = this.easeOutQuad(n) * t, n >= 1 && (this.animState = \"idle\");\n } else if (this.animState === \"fadeOut\") {\n const n = Math.min(e / Hi.FADE_OUT_MS, 1);\n this.overlayMaterial.opacity = (1 - this.easeOutQuad(n)) * t, n >= 1 && (this.removeOverlayMeshes(), this.animState = \"idle\");\n }\n }\n /** 从场景中移除所有覆盖层(不 dispose geometry,因为与原始 mesh 共享) */\n removeOverlayMeshes() {\n for (const e of this.overlayMeshes)\n this.engine.scene.remove(e);\n this.overlayMeshes = [];\n }\n /** 缓出二次方 */\n easeOutQuad(e) {\n return 1 - (1 - e) * (1 - e);\n }\n /** 销毁,释放 GPU 资源 */\n dispose() {\n this.removeOverlayMeshes(), this.overlayMaterial.dispose(), this.animState = \"idle\";\n }\n}\nvar Ii = { exports: {} }, Ku = Ii.exports, io;\nfunction $u() {\n return io || (io = 1, (function(o, e) {\n (function(t, n) {\n o.exports = n();\n })(Ku, function() {\n var t = function() {\n function n(f) {\n return r.appendChild(f.dom), f;\n }\n function i(f) {\n for (var d = 0; d < r.children.length; d++) r.children[d].style.display = d === f ? \"block\" : \"none\";\n s = f;\n }\n var s = 0, r = document.createElement(\"div\");\n r.style.cssText = \"position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000\", r.addEventListener(\"click\", function(f) {\n f.preventDefault(), i(++s % r.children.length);\n }, !1);\n var a = (performance || Date).now(), l = a, h = 0, c = n(new t.Panel(\"FPS\", \"#0ff\", \"#002\")), u = n(new t.Panel(\"MS\", \"#0f0\", \"#020\"));\n if (self.performance && self.performance.memory) var m = n(new t.Panel(\"MB\", \"#f08\", \"#201\"));\n return i(0), { REVISION: 16, dom: r, addPanel: n, showPanel: i, begin: function() {\n a = (performance || Date).now();\n }, end: function() {\n h++;\n var f = (performance || Date).now();\n if (u.update(f - a, 200), f > l + 1e3 && (c.update(1e3 * h / (f - l), 100), l = f, h = 0, m)) {\n var d = performance.memory;\n m.update(d.usedJSHeapSize / 1048576, d.jsHeapSizeLimit / 1048576);\n }\n return f;\n }, update: function() {\n a = this.end();\n }, domElement: r, setMode: i };\n };\n return t.Panel = function(n, i, s) {\n var r = 1 / 0, a = 0, l = Math.round, h = l(window.devicePixelRatio || 1), c = 80 * h, u = 48 * h, m = 3 * h, f = 2 * h, d = 3 * h, p = 15 * h, g = 74 * h, y = 30 * h, w = document.createElement(\"canvas\");\n w.width = c, w.height = u, w.style.cssText = \"width:80px;height:48px\";\n var x = w.getContext(\"2d\");\n return x.font = \"bold \" + 9 * h + \"px Helvetica,Arial,sans-serif\", x.textBaseline = \"top\", x.fillStyle = s, x.fillRect(0, 0, c, u), x.fillStyle = i, x.fillText(n, m, f), x.fillRect(d, p, g, y), x.fillStyle = s, x.globalAlpha = 0.9, x.fillRect(d, p, g, y), { dom: w, update: function(_, b) {\n r = Math.min(r, _), a = Math.max(a, _), x.fillStyle = s, x.globalAlpha = 1, x.fillRect(0, 0, c, p), x.fillStyle = i, x.fillText(l(_) + \" \" + n + \" (\" + l(r) + \"-\" + l(a) + \")\", m, f), x.drawImage(w, d + h, p, g - h, y, d, p, g - h, y), x.fillRect(d + g - h, p, h, y), x.fillStyle = s, x.globalAlpha = 0.9, x.fillRect(d + g - h, p, h, l((1 - _ / b) * y));\n } };\n }, t;\n });\n })(Ii)), Ii.exports;\n}\nvar Ju = $u();\nconst Qu = /* @__PURE__ */ ra(Ju);\nvar wn = Object.freeze({\n Linear: Object.freeze({\n None: function(o) {\n return o;\n },\n In: function(o) {\n return o;\n },\n Out: function(o) {\n return o;\n },\n InOut: function(o) {\n return o;\n }\n }),\n Quadratic: Object.freeze({\n In: function(o) {\n return o * o;\n },\n Out: function(o) {\n return o * (2 - o);\n },\n InOut: function(o) {\n return (o *= 2) < 1 ? 0.5 * o * o : -0.5 * (--o * (o - 2) - 1);\n }\n }),\n Cubic: Object.freeze({\n In: function(o) {\n return o * o * o;\n },\n Out: function(o) {\n return --o * o * o + 1;\n },\n InOut: function(o) {\n return (o *= 2) < 1 ? 0.5 * o * o * o : 0.5 * ((o -= 2) * o * o + 2);\n }\n }),\n Quartic: Object.freeze({\n In: function(o) {\n return o * o * o * o;\n },\n Out: function(o) {\n return 1 - --o * o * o * o;\n },\n InOut: function(o) {\n return (o *= 2) < 1 ? 0.5 * o * o * o * o : -0.5 * ((o -= 2) * o * o * o - 2);\n }\n }),\n Quintic: Object.freeze({\n In: function(o) {\n return o * o * o * o * o;\n },\n Out: function(o) {\n return --o * o * o * o * o + 1;\n },\n InOut: function(o) {\n return (o *= 2) < 1 ? 0.5 * o * o * o * o * o : 0.5 * ((o -= 2) * o * o * o * o + 2);\n }\n }),\n Sinusoidal: Object.freeze({\n In: function(o) {\n return 1 - Math.sin((1 - o) * Math.PI / 2);\n },\n Out: function(o) {\n return Math.sin(o * Math.PI / 2);\n },\n InOut: function(o) {\n return 0.5 * (1 - Math.sin(Math.PI * (0.5 - o)));\n }\n }),\n Exponential: Object.freeze({\n In: function(o) {\n return o === 0 ? 0 : Math.pow(1024, o - 1);\n },\n Out: function(o) {\n return o === 1 ? 1 : 1 - Math.pow(2, -10 * o);\n },\n InOut: function(o) {\n return o === 0 ? 0 : o === 1 ? 1 : (o *= 2) < 1 ? 0.5 * Math.pow(1024, o - 1) : 0.5 * (-Math.pow(2, -10 * (o - 1)) + 2);\n }\n }),\n Circular: Object.freeze({\n In: function(o) {\n return 1 - Math.sqrt(1 - o * o);\n },\n Out: function(o) {\n return Math.sqrt(1 - --o * o);\n },\n InOut: function(o) {\n return (o *= 2) < 1 ? -0.5 * (Math.sqrt(1 - o * o) - 1) : 0.5 * (Math.sqrt(1 - (o -= 2) * o) + 1);\n }\n }),\n Elastic: Object.freeze({\n In: function(o) {\n return o === 0 ? 0 : o === 1 ? 1 : -Math.pow(2, 10 * (o - 1)) * Math.sin((o - 1.1) * 5 * Math.PI);\n },\n Out: function(o) {\n return o === 0 ? 0 : o === 1 ? 1 : Math.pow(2, -10 * o) * Math.sin((o - 0.1) * 5 * Math.PI) + 1;\n },\n InOut: function(o) {\n return o === 0 ? 0 : o === 1 ? 1 : (o *= 2, o < 1 ? -0.5 * Math.pow(2, 10 * (o - 1)) * Math.sin((o - 1.1) * 5 * Math.PI) : 0.5 * Math.pow(2, -10 * (o - 1)) * Math.sin((o - 1.1) * 5 * Math.PI) + 1);\n }\n }),\n Back: Object.freeze({\n In: function(o) {\n var e = 1.70158;\n return o === 1 ? 1 : o * o * ((e + 1) * o - e);\n },\n Out: function(o) {\n var e = 1.70158;\n return o === 0 ? 0 : --o * o * ((e + 1) * o + e) + 1;\n },\n InOut: function(o) {\n var e = 2.5949095;\n return (o *= 2) < 1 ? 0.5 * (o * o * ((e + 1) * o - e)) : 0.5 * ((o -= 2) * o * ((e + 1) * o + e) + 2);\n }\n }),\n Bounce: Object.freeze({\n In: function(o) {\n return 1 - wn.Bounce.Out(1 - o);\n },\n Out: function(o) {\n return o < 1 / 2.75 ? 7.5625 * o * o : o < 2 / 2.75 ? 7.5625 * (o -= 1.5 / 2.75) * o + 0.75 : o < 2.5 / 2.75 ? 7.5625 * (o -= 2.25 / 2.75) * o + 0.9375 : 7.5625 * (o -= 2.625 / 2.75) * o + 0.984375;\n },\n InOut: function(o) {\n return o < 0.5 ? wn.Bounce.In(o * 2) * 0.5 : wn.Bounce.Out(o * 2 - 1) * 0.5 + 0.5;\n }\n }),\n generatePow: function(o) {\n return o === void 0 && (o = 4), o = o < Number.EPSILON ? Number.EPSILON : o, o = o > 1e4 ? 1e4 : o, {\n In: function(e) {\n return Math.pow(e, o);\n },\n Out: function(e) {\n return 1 - Math.pow(1 - e, o);\n },\n InOut: function(e) {\n return e < 0.5 ? Math.pow(e * 2, o) / 2 : (1 - Math.pow(2 - e * 2, o)) / 2 + 0.5;\n }\n };\n }\n}), Bn = function() {\n return performance.now();\n}, ed = (\n /** @class */\n (function() {\n function o() {\n this._tweens = {}, this._tweensAddedDuringUpdate = {};\n }\n return o.prototype.getAll = function() {\n var e = this;\n return Object.keys(this._tweens).map(function(t) {\n return e._tweens[t];\n });\n }, o.prototype.removeAll = function() {\n this._tweens = {};\n }, o.prototype.add = function(e) {\n this._tweens[e.getId()] = e, this._tweensAddedDuringUpdate[e.getId()] = e;\n }, o.prototype.remove = function(e) {\n delete this._tweens[e.getId()], delete this._tweensAddedDuringUpdate[e.getId()];\n }, o.prototype.update = function(e, t) {\n e === void 0 && (e = Bn()), t === void 0 && (t = !1);\n var n = Object.keys(this._tweens);\n if (n.length === 0)\n return !1;\n for (; n.length > 0; ) {\n this._tweensAddedDuringUpdate = {};\n for (var i = 0; i < n.length; i++) {\n var s = this._tweens[n[i]], r = !t;\n s && s.update(e, r) === !1 && !t && delete this._tweens[n[i]];\n }\n n = Object.keys(this._tweensAddedDuringUpdate);\n }\n return !0;\n }, o;\n })()\n), Zs = {\n Linear: function(o, e) {\n var t = o.length - 1, n = t * e, i = Math.floor(n), s = Zs.Utils.Linear;\n return e < 0 ? s(o[0], o[1], n) : e > 1 ? s(o[t], o[t - 1], t - n) : s(o[i], o[i + 1 > t ? t : i + 1], n - i);\n },\n Utils: {\n Linear: function(o, e, t) {\n return (e - o) * t + o;\n }\n }\n}, za = (\n /** @class */\n (function() {\n function o() {\n }\n return o.nextId = function() {\n return o._nextId++;\n }, o._nextId = 0, o;\n })()\n), qs = new ed(), td = (\n /** @class */\n (function() {\n function o(e, t) {\n t === void 0 && (t = qs), this._object = e, this._group = t, this._isPaused = !1, this._pauseStart = 0, this._valuesStart = {}, this._valuesEnd = {}, this._valuesStartRepeat = {}, this._duration = 1e3, this._isDynamic = !1, this._initialRepeat = 0, this._repeat = 0, this._yoyo = !1, this._isPlaying = !1, this._reversed = !1, this._delayTime = 0, this._startTime = 0, this._easingFunction = wn.Linear.None, this._interpolationFunction = Zs.Linear, this._chainedTweens = [], this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._id = za.nextId(), this._isChainStopped = !1, this._propertiesAreSetUp = !1, this._goToEnd = !1;\n }\n return o.prototype.getId = function() {\n return this._id;\n }, o.prototype.isPlaying = function() {\n return this._isPlaying;\n }, o.prototype.isPaused = function() {\n return this._isPaused;\n }, o.prototype.getDuration = function() {\n return this._duration;\n }, o.prototype.to = function(e, t) {\n if (t === void 0 && (t = 1e3), this._isPlaying)\n throw new Error(\"Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.\");\n return this._valuesEnd = e, this._propertiesAreSetUp = !1, this._duration = t < 0 ? 0 : t, this;\n }, o.prototype.duration = function(e) {\n return e === void 0 && (e = 1e3), this._duration = e < 0 ? 0 : e, this;\n }, o.prototype.dynamic = function(e) {\n return e === void 0 && (e = !1), this._isDynamic = e, this;\n }, o.prototype.start = function(e, t) {\n if (e === void 0 && (e = Bn()), t === void 0 && (t = !1), this._isPlaying)\n return this;\n if (this._group && this._group.add(this), this._repeat = this._initialRepeat, this._reversed) {\n this._reversed = !1;\n for (var n in this._valuesStartRepeat)\n this._swapEndStartRepeatValues(n), this._valuesStart[n] = this._valuesStartRepeat[n];\n }\n if (this._isPlaying = !0, this._isPaused = !1, this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._isChainStopped = !1, this._startTime = e, this._startTime += this._delayTime, !this._propertiesAreSetUp || t) {\n if (this._propertiesAreSetUp = !0, !this._isDynamic) {\n var i = {};\n for (var s in this._valuesEnd)\n i[s] = this._valuesEnd[s];\n this._valuesEnd = i;\n }\n this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, t);\n }\n return this;\n }, o.prototype.startFromCurrentValues = function(e) {\n return this.start(e, !0);\n }, o.prototype._setupProperties = function(e, t, n, i, s) {\n for (var r in n) {\n var a = e[r], l = Array.isArray(a), h = l ? \"array\" : typeof a, c = !l && Array.isArray(n[r]);\n if (!(h === \"undefined\" || h === \"function\")) {\n if (c) {\n var u = n[r];\n if (u.length === 0)\n continue;\n for (var m = [a], f = 0, d = u.length; f < d; f += 1) {\n var p = this._handleRelativeValue(a, u[f]);\n if (isNaN(p)) {\n c = !1, console.warn(\"Found invalid interpolation list. Skipping.\");\n break;\n }\n m.push(p);\n }\n c && (n[r] = m);\n }\n if ((h === \"object\" || l) && a && !c) {\n t[r] = l ? [] : {};\n var g = a;\n for (var y in g)\n t[r][y] = g[y];\n i[r] = l ? [] : {};\n var u = n[r];\n if (!this._isDynamic) {\n var w = {};\n for (var y in u)\n w[y] = u[y];\n n[r] = u = w;\n }\n this._setupProperties(g, t[r], u, i[r], s);\n } else\n (typeof t[r] > \"u\" || s) && (t[r] = a), l || (t[r] *= 1), c ? i[r] = n[r].slice().reverse() : i[r] = t[r] || 0;\n }\n }\n }, o.prototype.stop = function() {\n return this._isChainStopped || (this._isChainStopped = !0, this.stopChainedTweens()), this._isPlaying ? (this._group && this._group.remove(this), this._isPlaying = !1, this._isPaused = !1, this._onStopCallback && this._onStopCallback(this._object), this) : this;\n }, o.prototype.end = function() {\n return this._goToEnd = !0, this.update(1 / 0), this;\n }, o.prototype.pause = function(e) {\n return e === void 0 && (e = Bn()), this._isPaused || !this._isPlaying ? this : (this._isPaused = !0, this._pauseStart = e, this._group && this._group.remove(this), this);\n }, o.prototype.resume = function(e) {\n return e === void 0 && (e = Bn()), !this._isPaused || !this._isPlaying ? this : (this._isPaused = !1, this._startTime += e - this._pauseStart, this._pauseStart = 0, this._group && this._group.add(this), this);\n }, o.prototype.stopChainedTweens = function() {\n for (var e = 0, t = this._chainedTweens.length; e < t; e++)\n this._chainedTweens[e].stop();\n return this;\n }, o.prototype.group = function(e) {\n return e === void 0 && (e = qs), this._group = e, this;\n }, o.prototype.delay = function(e) {\n return e === void 0 && (e = 0), this._delayTime = e, this;\n }, o.prototype.repeat = function(e) {\n return e === void 0 && (e = 0), this._initialRepeat = e, this._repeat = e, this;\n }, o.prototype.repeatDelay = function(e) {\n return this._repeatDelayTime = e, this;\n }, o.prototype.yoyo = function(e) {\n return e === void 0 && (e = !1), this._yoyo = e, this;\n }, o.prototype.easing = function(e) {\n return e === void 0 && (e = wn.Linear.None), this._easingFunction = e, this;\n }, o.prototype.interpolation = function(e) {\n return e === void 0 && (e = Zs.Linear), this._interpolationFunction = e, this;\n }, o.prototype.chain = function() {\n for (var e = [], t = 0; t < arguments.length; t++)\n e[t] = arguments[t];\n return this._chainedTweens = e, this;\n }, o.prototype.onStart = function(e) {\n return this._onStartCallback = e, this;\n }, o.prototype.onEveryStart = function(e) {\n return this._onEveryStartCallback = e, this;\n }, o.prototype.onUpdate = function(e) {\n return this._onUpdateCallback = e, this;\n }, o.prototype.onRepeat = function(e) {\n return this._onRepeatCallback = e, this;\n }, o.prototype.onComplete = function(e) {\n return this._onCompleteCallback = e, this;\n }, o.prototype.onStop = function(e) {\n return this._onStopCallback = e, this;\n }, o.prototype.update = function(e, t) {\n var n = this, i;\n if (e === void 0 && (e = Bn()), t === void 0 && (t = !0), this._isPaused)\n return !0;\n var s, r = this._startTime + this._duration;\n if (!this._goToEnd && !this._isPlaying) {\n if (e > r)\n return !1;\n t && this.start(e, !0);\n }\n if (this._goToEnd = !1, e < this._startTime)\n return !0;\n this._onStartCallbackFired === !1 && (this._onStartCallback && this._onStartCallback(this._object), this._onStartCallbackFired = !0), this._onEveryStartCallbackFired === !1 && (this._onEveryStartCallback && this._onEveryStartCallback(this._object), this._onEveryStartCallbackFired = !0);\n var a = e - this._startTime, l = this._duration + ((i = this._repeatDelayTime) !== null && i !== void 0 ? i : this._delayTime), h = this._duration + this._repeat * l, c = function() {\n if (n._duration === 0 || a > h)\n return 1;\n var g = Math.trunc(a / l), y = a - g * l, w = Math.min(y / n._duration, 1);\n return w === 0 && a === n._duration ? 1 : w;\n }, u = c(), m = this._easingFunction(u);\n if (this._updateProperties(this._object, this._valuesStart, this._valuesEnd, m), this._onUpdateCallback && this._onUpdateCallback(this._object, u), this._duration === 0 || a >= this._duration)\n if (this._repeat > 0) {\n var f = Math.min(Math.trunc((a - this._duration) / l) + 1, this._repeat);\n isFinite(this._repeat) && (this._repeat -= f);\n for (s in this._valuesStartRepeat)\n !this._yoyo && typeof this._valuesEnd[s] == \"string\" && (this._valuesStartRepeat[s] = // eslint-disable-next-line\n // @ts-ignore FIXME?\n this._valuesStartRepeat[s] + parseFloat(this._valuesEnd[s])), this._yoyo && this._swapEndStartRepeatValues(s), this._valuesStart[s] = this._valuesStartRepeat[s];\n return this._yoyo && (this._reversed = !this._reversed), this._startTime += l * f, this._onRepeatCallback && this._onRepeatCallback(this._object), this._onEveryStartCallbackFired = !1, !0;\n } else {\n this._onCompleteCallback && this._onCompleteCallback(this._object);\n for (var d = 0, p = this._chainedTweens.length; d < p; d++)\n this._chainedTweens[d].start(this._startTime + this._duration, !1);\n return this._isPlaying = !1, !1;\n }\n return !0;\n }, o.prototype._updateProperties = function(e, t, n, i) {\n for (var s in n)\n if (t[s] !== void 0) {\n var r = t[s] || 0, a = n[s], l = Array.isArray(e[s]), h = Array.isArray(a), c = !l && h;\n c ? e[s] = this._interpolationFunction(a, i) : typeof a == \"object\" && a ? this._updateProperties(e[s], r, a, i) : (a = this._handleRelativeValue(r, a), typeof a == \"number\" && (e[s] = r + (a - r) * i));\n }\n }, o.prototype._handleRelativeValue = function(e, t) {\n return typeof t != \"string\" ? t : t.charAt(0) === \"+\" || t.charAt(0) === \"-\" ? e + parseFloat(t) : parseFloat(t);\n }, o.prototype._swapEndStartRepeatValues = function(e) {\n var t = this._valuesStartRepeat[e], n = this._valuesEnd[e];\n typeof n == \"string\" ? this._valuesStartRepeat[e] = this._valuesStartRepeat[e] + parseFloat(n) : this._valuesStartRepeat[e] = this._valuesEnd[e], this._valuesEnd[e] = t;\n }, o;\n })()\n);\nza.nextId;\nvar dt = qs;\ndt.getAll.bind(dt);\ndt.removeAll.bind(dt);\ndt.add.bind(dt);\ndt.remove.bind(dt);\ndt.update.bind(dt);\nvar An = {\n Easing: wn,\n Tween: td\n};\nclass nd extends Bl {\n /**\n * Constructs a new RGBE/HDR loader.\n *\n * @param {LoadingManager} [manager] - The loading manager.\n */\n constructor(e) {\n super(e), this.type = _t;\n }\n /**\n * Parses the given RGBE texture data.\n *\n * @param {ArrayBuffer} buffer - The raw texture data.\n * @return {DataTextureLoader~TexData} An object representing the parsed texture data.\n */\n parse(e) {\n const r = function(P, C) {\n switch (P) {\n case 1:\n throw new Error(\"THREE.HDRLoader: Read Error: \" + (C || \"\"));\n case 2:\n throw new Error(\"THREE.HDRLoader: Write Error: \" + (C || \"\"));\n case 3:\n throw new Error(\"THREE.HDRLoader: Bad File Format: \" + (C || \"\"));\n default:\n case 4:\n throw new Error(\"THREE.HDRLoader: Memory Error: \" + (C || \"\"));\n }\n }, u = function(P, C, D) {\n C = C || 1024;\n let T = P.pos, R = -1, v = 0, z = \"\", H = String.fromCharCode.apply(null, new Uint16Array(P.subarray(T, T + 128)));\n for (; 0 > (R = H.indexOf(`\n`)) && v < C && T < P.byteLength; )\n z += H, v += H.length, T += 128, H += String.fromCharCode.apply(null, new Uint16Array(P.subarray(T, T + 128)));\n return -1 < R ? (P.pos += v + R + 1, z + H.slice(0, R)) : !1;\n }, m = function(P) {\n const C = /^#\\?(\\S+)/, D = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/, I = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/, T = /^\\s*FORMAT=(\\S+)\\s*$/, R = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/, v = {\n valid: 0,\n /* indicate which fields are valid */\n string: \"\",\n /* the actual header string */\n comments: \"\",\n /* comments found in header */\n programtype: \"RGBE\",\n /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n format: \"\",\n /* RGBE format, default 32-bit_rle_rgbe */\n gamma: 1,\n /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n exposure: 1,\n /* a value of 1.0 in an image corresponds to watts/steradian/m^2. defaults to 1.0 */\n width: 0,\n height: 0\n /* image dimensions, width/height */\n };\n let z, H;\n for ((P.pos >= P.byteLength || !(z = u(P))) && r(1, \"no header found\"), (H = z.match(C)) || r(3, \"bad initial token\"), v.valid |= 1, v.programtype = H[1], v.string += z + `\n`; z = u(P), z !== !1; ) {\n if (v.string += z + `\n`, z.charAt(0) === \"#\") {\n v.comments += z + `\n`;\n continue;\n }\n if ((H = z.match(D)) && (v.gamma = parseFloat(H[1])), (H = z.match(I)) && (v.exposure = parseFloat(H[1])), (H = z.match(T)) && (v.valid |= 2, v.format = H[1]), (H = z.match(R)) && (v.valid |= 4, v.height = parseInt(H[1], 10), v.width = parseInt(H[2], 10)), v.valid & 2 && v.valid & 4) break;\n }\n return v.valid & 2 || r(3, \"missing format specifier\"), v.valid & 4 || r(3, \"missing image size specifier\"), v;\n }, f = function(P, C, D) {\n const I = C;\n if (\n // run length encoding is not allowed so read flat\n I < 8 || I > 32767 || // this file is not run length encoded\n P[0] !== 2 || P[1] !== 2 || P[2] & 128\n )\n return new Uint8Array(P);\n I !== (P[2] << 8 | P[3]) && r(3, \"wrong scanline width\");\n const T = new Uint8Array(4 * C * D);\n T.length || r(4, \"unable to allocate buffer space\");\n let R = 0, v = 0;\n const z = 4 * I, H = new Uint8Array(4), V = new Uint8Array(z);\n let te = D;\n for (; te > 0 && v < P.byteLength; ) {\n v + 4 > P.byteLength && r(1), H[0] = P[v++], H[1] = P[v++], H[2] = P[v++], H[3] = P[v++], (H[0] != 2 || H[1] != 2 || (H[2] << 8 | H[3]) != I) && r(3, \"bad rgbe scanline format\");\n let G = 0, $;\n for (; G < z && v < P.byteLength; ) {\n $ = P[v++];\n const O = $ > 128;\n if (O && ($ -= 128), ($ === 0 || G + $ > z) && r(3, \"bad scanline data\"), O) {\n const Q = P[v++];\n for (let ee = 0; ee < $; ee++)\n V[G++] = Q;\n } else\n V.set(P.subarray(v, v + $), G), G += $, v += $;\n }\n const N = I;\n for (let O = 0; O < N; O++) {\n let Q = 0;\n T[R] = V[O + Q], Q += I, T[R + 1] = V[O + Q], Q += I, T[R + 2] = V[O + Q], Q += I, T[R + 3] = V[O + Q], R += 4;\n }\n te--;\n }\n return T;\n }, d = function(P, C, D, I) {\n const T = P[C + 3], R = Math.pow(2, T - 128) / 255;\n D[I + 0] = P[C + 0] * R, D[I + 1] = P[C + 1] * R, D[I + 2] = P[C + 2] * R, D[I + 3] = 1;\n }, p = function(P, C, D, I) {\n const T = P[C + 3], R = Math.pow(2, T - 128) / 255;\n D[I + 0] = qn.toHalfFloat(Math.min(P[C + 0] * R, 65504)), D[I + 1] = qn.toHalfFloat(Math.min(P[C + 1] * R, 65504)), D[I + 2] = qn.toHalfFloat(Math.min(P[C + 2] * R, 65504)), D[I + 3] = qn.toHalfFloat(1);\n }, g = new Uint8Array(e);\n g.pos = 0;\n const y = m(g), w = y.width, x = y.height, _ = f(g.subarray(g.pos), w, x);\n let b, E, A;\n switch (this.type) {\n case Ci:\n A = _.length / 4;\n const P = new Float32Array(A * 4);\n for (let D = 0; D < A; D++)\n d(_, D * 4, P, D * 4);\n b = P, E = Ci;\n break;\n case _t:\n A = _.length / 4;\n const C = new Uint16Array(A * 4);\n for (let D = 0; D < A; D++)\n p(_, D * 4, C, D * 4);\n b = C, E = _t;\n break;\n default:\n throw new Error(\"THREE.HDRLoader: Unsupported type: \" + this.type);\n }\n return {\n width: w,\n height: x,\n data: b,\n header: y.string,\n gamma: y.gamma,\n exposure: y.exposure,\n type: E\n };\n }\n /**\n * Sets the texture type.\n *\n * @param {(HalfFloatType|FloatType)} value - The texture type to set.\n * @return {HDRLoader} A reference to this loader.\n */\n setDataType(e) {\n return this.type = e, this;\n }\n load(e, t, n, i) {\n function s(r, a) {\n switch (r.type) {\n case Ci:\n case _t:\n r.colorSpace = rt, r.minFilter = Hn, r.magFilter = Hn, r.generateMipmaps = !1, r.flipY = !0;\n break;\n }\n t && t(r, a);\n }\n return super.load(e, s, n, i);\n }\n}\nfunction id() {\n return new M.Scene();\n}\nfunction sd(o, e) {\n o.appendChild(e.domElement);\n}\nfunction rd(o, e, t) {\n var n = new Object();\n n.visible = !0;\n let i = null, s, r, a = [];\n n.init = function() {\n s || (h(), c(), u());\n }, n.Hide = function() {\n s.style.display = \"none\", n.visible = !1;\n }, n.Show = function() {\n s.style.display = \"block\", n.visible = !0;\n }, n.RenderScene = function() {\n n.camera.quaternion.copy(e.camera.quaternion);\n const d = new M.Vector3(0, 0, 1).applyQuaternion(e.camera.quaternion);\n n.camera.position.copy(d.multiplyScalar(100)), n.sceneOrtho.renderer.render(n.sceneOrtho, n.camera);\n }, n.ToggleDirectionView = function(d) {\n var p = new M.Vector3(0, 0, 0);\n d == \"top\" ? p = new M.Vector3(0, 1, 1e-5) : d == \"down\" ? p = new M.Vector3(0, -1, 1e-5) : d == \"front\" ? p = new M.Vector3(0, 0, 1) : d == \"left\" ? p = new M.Vector3(-1, 0, 0) : d == \"back\" ? p = new M.Vector3(0, 0, -1) : d == \"right\" ? p = new M.Vector3(1, 0, 0) : d == \"top_front\" ? p = new M.Vector3(1, 1, 0) : d == \"top_left\" ? p = new M.Vector3(0, 1, -1) : d == \"top_back\" ? p = new M.Vector3(-1, 1, 0) : d == \"top_right\" ? p = new M.Vector3(0, 1, 1) : d == \"down_front\" ? p = new M.Vector3(1, -1, 0) : d == \"down_left\" ? p = new M.Vector3(0, -1, -1) : d == \"down_back\" ? p = new M.Vector3(-1, -1, 0) : d == \"down_right\" ? p = new M.Vector3(0, -1, 1) : d == \"front_right\" ? p = new M.Vector3(1, 0, 1) : d == \"right_back\" ? p = new M.Vector3(-1, 0, 1) : d == \"back_left\" ? p = new M.Vector3(-1, 0, -1) : d == \"left_front\" ? p = new M.Vector3(1, 0, -1) : d == \"top_left_front\" ? p = new M.Vector3(1, 1, -1) : d == \"top_front_right\" ? p = new M.Vector3(1, 1, 1) : d == \"top_right_back\" ? p = new M.Vector3(-1, 1, 1) : d == \"top_back_left\" ? p = new M.Vector3(-1, 1, -1) : d == \"button_left_front\" ? p = new M.Vector3(1, -1, -1) : d == \"button_front_right\" ? p = new M.Vector3(1, -1, 1) : d == \"button_right_back\" ? p = new M.Vector3(-1, 1, 1) : d == \"button_back_left\" && (p = new M.Vector3(-1, -1, -1));\n var g = o.octreeBox.getBoundingBox(), y = g.min, w = g.max, x = y.clone().add(w.clone()).multiplyScalar(0.5), _ = x.clone().add(p.multiplyScalar(1 * w.distanceTo(y)));\n l(e.camera.position, _, o.controls.target.clone(), x);\n }, n.GetCameraPose = function() {\n var d = e.camera.quaternion, p = e.camera.position, g = o.controls.target, y = {\n quaternion: d,\n position: p,\n target: g\n };\n return y;\n }, n.ReductionCameraPose = function(d, p = 1e3, g) {\n var y = new M.Quaternion(\n d.quaternion._x,\n d.quaternion._y,\n d.quaternion._z,\n d.quaternion._w\n ), w = new M.Vector3(d.position.x, d.position.y, d.position.z), x = new M.Vector3(d.target.x, d.target.y, d.target.z);\n let _ = !1;\n l(\n e.camera.position,\n w,\n o.controls.target.clone(),\n x,\n e.camera.quaternion,\n y,\n p,\n (b) => {\n g && (_ || (g(b), _ = !0));\n }\n ), g && setTimeout(() => {\n _ || (g(!0), _ = !0);\n }, p + 10);\n }, n.CameraGoHome = function() {\n var d = o.octreeBox.getBoundingBox(), p = d.min.clone().add(d.max.clone()).multiplyScalar(0.5);\n let g = new M.Vector3(1, 1, 1);\n var y = d.max.distanceTo(d.min), w = p.clone().add(g.multiplyScalar(y));\n if (e.camera.isOrthographicCamera) {\n var x = o.container.clientWidth / o.container.clientHeight, _ = y * 0.6;\n e.camera.left = -_ * x, e.camera.right = _ * x, e.camera.top = _, e.camera.bottom = -_, e.camera.zoom = 1, e.camera.updateProjectionMatrix();\n }\n l(e.camera.position, w, o.controls.target.clone(), p);\n }, n.zoomToBox = function(d) {\n var p = d.min.clone().add(d.max.clone()).multiplyScalar(0.5), g = e.camera.position.clone().sub(o.controls.target.clone()).normalize(), y = e.camera.position.distanceTo(o.controls.target), w = p.clone().add(g.multiplyScalar(y)), x = e.camera.zoom;\n if (e.camera.isOrthographicCamera) {\n var _ = new M.Vector3(1, 0, 0).applyQuaternion(e.camera.quaternion), b = new M.Vector3(0, 1, 0).applyQuaternion(e.camera.quaternion), E = [\n new M.Vector3(d.min.x, d.min.y, d.min.z),\n new M.Vector3(d.max.x, d.min.y, d.min.z),\n new M.Vector3(d.min.x, d.max.y, d.min.z),\n new M.Vector3(d.max.x, d.max.y, d.min.z),\n new M.Vector3(d.min.x, d.min.y, d.max.z),\n new M.Vector3(d.max.x, d.min.y, d.max.z),\n new M.Vector3(d.min.x, d.max.y, d.max.z),\n new M.Vector3(d.max.x, d.max.y, d.max.z)\n ], A = 1 / 0, P = -1 / 0, C = 1 / 0, D = -1 / 0;\n for (var I of E) {\n var T = I.dot(_), R = I.dot(b);\n A = Math.min(A, T), P = Math.max(P, T), C = Math.min(C, R), D = Math.max(D, R);\n }\n var v = (P - A) / 2, z = (D - C) / 2, H = (e.camera.right - e.camera.left) / 2, V = (e.camera.top - e.camera.bottom) / 2;\n x = Math.min(H / v, V / z) * 0.75;\n }\n var te = e.camera.position.clone(), G = o.controls.target.clone(), $ = e.camera.zoom, N = new An.Tween({\n x1: te.x,\n y1: te.y,\n z1: te.z,\n x2: G.x,\n y2: G.y,\n z2: G.z,\n zoom: $\n }).to({\n x1: w.x,\n y1: w.y,\n z1: w.z,\n x2: p.x,\n y2: p.y,\n z2: p.z,\n zoom: x\n }, 1e3);\n N.onUpdate(function(Q) {\n o.controls && (e.camera.position.set(Q.x1, Q.y1, Q.z1), o.controls.target.set(Q.x2, Q.y2, Q.z2), e.camera.isOrthographicCamera && (e.camera.zoom = Q.zoom, e.camera.updateProjectionMatrix()), o.controls.auto = !0, o.controls.update(), n.RenderScene());\n }), N.onComplete(function() {\n o.controls && (o.controls.auto = !1, n.RenderScene(), cancelAnimationFrame(i), i = null);\n }), N.easing(An.Easing.Cubic.InOut), N.start();\n function O() {\n i = requestAnimationFrame(O), N.update();\n }\n O();\n };\n function l(d, p, g, y, w, x, _ = 1e3, b) {\n var E;\n w && x ? (E = new An.Tween({\n x1: d.x,\n // 相机当前位置x\n y1: d.y,\n // 相机当前位置y\n z1: d.z,\n // 相机当前位置z\n x2: g.x,\n // 控制当前的中心点x\n y2: g.y,\n // 控制当前的中心点y\n z2: g.z,\n // 控制当前的中心点z\n _x: w._x,\n // 相机当前quaternion\n _y: w._y,\n // 相机当前quaternion\n _z: w._z,\n // 相机当前quaternion\n _w: w._w\n // 相机当前quaternion\n }), E.to(\n {\n x1: p.x,\n // 新的相机位置x\n y1: p.y,\n // 新的相机位置y\n z1: p.z,\n // 新的相机位置z\n x2: y.x,\n // 新的控制中心点位置x\n y2: y.y,\n // 新的控制中心点位置x\n z2: y.z,\n // 新的控制中心点位置x\n _x: x._x,\n // 新的相机quaternion\n _y: x._y,\n // 新的相机quaternion\n _z: x._z,\n // 新的相机quaternion\n _w: x._w\n // 新的相机quaternion\n },\n _\n )) : (E = new An.Tween({\n x1: d.x,\n // 相机当前位置x\n y1: d.y,\n // 相机当前位置y\n z1: d.z,\n // 相机当前位置z\n x2: g.x,\n // 控制当前的中心点x\n y2: g.y,\n // 控制当前的中心点y\n z2: g.z\n // 控制当前的中心点z\n }), E.to(\n {\n x1: p.x,\n // 新的相机位置x\n y1: p.y,\n // 新的相机位置y\n z1: p.z,\n // 新的相机位置z\n x2: y.x,\n // 新的控制中心点位置x\n y2: y.y,\n // 新的控制中心点位置x\n z2: y.z\n // 新的控制中心点位置x\n },\n _\n )), E.onUpdate(function(P) {\n o.controls && (w && x ? (e.camera.quaternion._x = P._x, e.camera.quaternion._y = P._y, e.camera.quaternion._z = P._z, e.camera.quaternion._w = P._w) : o.controls.auto = !0, e.camera.position.x = P.x1, e.camera.position.y = P.y1, e.camera.position.z = P.z1, o.controls.target.x = P.x2, o.controls.target.y = P.y2, o.controls.target.z = P.z2, o.controls.update(), n.RenderScene());\n }), E.onComplete(function(P) {\n o.controls && (o.controls.auto = !1, n.RenderScene(), b && b(!0), cancelAnimationFrame(i), i = null);\n }), E.easing(An.Easing.Cubic.InOut);\n function A(P) {\n i = requestAnimationFrame(A), E.update();\n }\n E.start(), A();\n }\n function h() {\n s = document.createElement(\"div\"), s.className = \"ViewCube\", t.appendChild(s), r = document.createElement(\"div\"), r.className = \"viewSettingWrapper\", r.innerHTML = \"...\", s.appendChild(r);\n var d = document.createElement(\"div\");\n d.className = \"homeViewWrapper\", d.addEventListener(\"mousedown\", function() {\n console.log(\"归位\"), n.CameraGoHome();\n }), s.appendChild(d);\n const p = document.createElement(\"div\");\n p.className = \"cameraToggleWrapper\", p.title = \"切换正交/透视视图\", p.innerHTML = \"⊞\", p.addEventListener(\"mousedown\", function(_) {\n _.stopPropagation(), console.log(\"切换视图\"), n.ToggleCameraType(), w();\n }), s.appendChild(p);\n const g = document.createElement(\"div\");\n g.className = \"screenshotWrapper\", g.title = \"截图\", g.innerHTML = \"📷\", g.addEventListener(\"mousedown\", function(_) {\n _.stopPropagation(), console.log(\"截图\"), n.TakeScreenshot(), w();\n }), s.appendChild(g);\n const y = document.createElement(\"div\");\n y.className = \"fullscreenWrapper\", y.title = \"全屏\", y.innerHTML = \"⛶\", y.addEventListener(\"mousedown\", function(_) {\n _.stopPropagation(), console.log(\"全屏\"), n.ToggleFullscreen(), w();\n }), s.appendChild(y), r.addEventListener(\"mousedown\", function(_) {\n _.stopPropagation(), p.classList.contains(\"show\") ? (w(), console.log(\"隐藏功能按钮\")) : (x(), console.log(\"显示功能按钮\"));\n });\n function w() {\n p.classList.remove(\"show\"), g.classList.remove(\"show\"), y.classList.remove(\"show\");\n }\n function x() {\n p.classList.add(\"show\"), g.classList.add(\"show\"), y.classList.add(\"show\");\n }\n }\n function c() {\n n.sceneOrtho = id();\n var g = t.clientWidth, y = t.clientWidth, d = g > y ? g / y : y / g, p = 300;\n n.camera = new M.OrthographicCamera(\n p * d / -2,\n p * d / 2,\n p / 2,\n p / -2,\n 0.01,\n 1e4\n );\n var g = s.clientWidth, y = s.clientHeight, w = new M.WebGLRenderer({\n alpha: !0\n });\n w.setSize(g, y), w.setClearAlpha(0), n.sceneOrtho.renderer = w;\n let x = new M.AmbientLight(16777215, 0.8);\n n.sceneOrtho.add(x), sd(s, w);\n }\n function u() {\n const d = \"/assets/viewcube/\";\n let p = [\n {\n label: \"右\",\n icon: d + \"cn_right.png\"\n },\n {\n label: \"左\",\n icon: d + \"cn_left.png\"\n },\n {\n label: \"顶\",\n icon: d + \"cn_top.png\"\n },\n {\n label: \"底\",\n icon: d + \"cn_bottom.png\"\n },\n {\n label: \"前\",\n icon: d + \"cn_front.png\"\n },\n {\n label: \"后\",\n icon: d + \"cn_back.png\"\n }\n ];\n var g = [];\n for (const w of p)\n g.push(\n new M.MeshBasicMaterial({\n color: 16777215,\n map: new M.TextureLoader().load(w.icon)\n })\n );\n new M.MeshLambertMaterial({\n color: 255\n });\n var y = new M.Mesh(new M.BoxGeometry(110, 110, 110), g);\n n.sceneOrtho.add(y), m(122), s.addEventListener(\"mousedown\", (w) => {\n var x = {};\n x.x = w.offsetX / s.clientWidth * 2 - 1, x.y = -(w.offsetY / s.clientHeight) * 2 + 1;\n var _ = new M.Raycaster();\n _.setFromCamera(x, n.camera);\n const b = _.intersectObjects(a, !1);\n b.length > 0 && n.ToggleDirectionView(b[0].object.name);\n }), s.addEventListener(\"mousemove\", (w) => {\n var x = {};\n x.x = w.offsetX / s.clientWidth * 2 - 1, x.y = -(w.offsetY / s.clientHeight) * 2 + 1;\n var _ = new M.Raycaster();\n _.setFromCamera(x, n.camera);\n const b = _.intersectObjects(a, !1);\n for (var E of a)\n E.material.opacity = 0.01;\n b.length > 0 && (b[0].object.material.opacity = 0.2);\n });\n }\n function m(d) {\n for (var p = d * 0.5 - 20, g = [\n {\n name: \"right\",\n a: 30,\n b: 75,\n c: 75,\n point: new M.Vector3(p, 0, 0)\n },\n {\n name: \"back\",\n a: 75,\n b: 75,\n c: 30,\n point: new M.Vector3(0, 0, -p)\n },\n {\n name: \"left\",\n a: 30,\n b: 75,\n c: 75,\n point: new M.Vector3(-p, 0, 0)\n },\n {\n name: \"front\",\n a: 75,\n b: 75,\n c: 30,\n point: new M.Vector3(0, 0, p)\n },\n {\n name: \"top\",\n a: 75,\n b: 30,\n c: 75,\n point: new M.Vector3(0, p, 0)\n },\n {\n name: \"button\",\n a: 75,\n b: 30,\n c: 75,\n point: new M.Vector3(0, -p, 0)\n }\n ], y = [\n {\n name: \"top_right_back\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(-p, p, p)\n },\n {\n name: \"button_front_right\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(-p, -p, p)\n },\n {\n name: \"top_front_right\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(p, p, p)\n },\n {\n name: \"button_right_back\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(p, -p, p)\n },\n {\n name: \"top_back_left\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(-p, p, -p)\n },\n {\n name: \"button_back_left\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(-p, -p, -p)\n },\n {\n name: \"top_left_front\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(p, p, -p)\n },\n {\n name: \"button_left_front\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(p, -p, -p)\n }\n ], w = [\n {\n name: \"top_front\",\n a: 30,\n b: 30,\n c: 75,\n point: new M.Vector3(p, p, 0)\n },\n {\n name: \"top_right\",\n a: 75,\n b: 30,\n c: 30,\n point: new M.Vector3(0, p, p)\n },\n {\n name: \"top_back\",\n a: 30,\n b: 30,\n c: 75,\n point: new M.Vector3(-p, p, 0)\n },\n {\n name: \"top_left\",\n a: 75,\n b: 30,\n c: 30,\n point: new M.Vector3(0, p, -p)\n },\n {\n name: \"button_front\",\n a: 30,\n b: 30,\n c: 75,\n point: new M.Vector3(p, -p, 0)\n },\n {\n name: \"button_right\",\n a: 75,\n b: 30,\n c: 30,\n point: new M.Vector3(0, -p, p)\n },\n {\n name: \"button_back\",\n a: 30,\n b: 30,\n c: 75,\n point: new M.Vector3(-p, -p, 0)\n },\n {\n name: \"button_left\",\n a: 75,\n b: 30,\n c: 30,\n point: new M.Vector3(0, -p, -p)\n },\n {\n name: \"front_right\",\n a: 30,\n b: 75,\n c: 30,\n point: new M.Vector3(p, 0, p)\n },\n {\n name: \"right_back\",\n a: 30,\n b: 75,\n c: 30,\n point: new M.Vector3(-p, 0, p)\n },\n {\n name: \"back_left\",\n a: 30,\n b: 75,\n c: 30,\n point: new M.Vector3(-p, 0, -p)\n },\n {\n name: \"left_front\",\n a: 30,\n b: 75,\n c: 30,\n point: new M.Vector3(p, 0, -p)\n }\n ], x = 0; x < g.length; x++)\n a.push(f(g[x]));\n for (var x = 0; x < y.length; x++)\n a.push(f(y[x]));\n for (var x = 0; x < w.length; x++)\n a.push(f(w[x]));\n }\n function f(d) {\n const p = new M.BoxGeometry(d.a, d.b, d.c), g = new M.MeshBasicMaterial({\n color: \"blue\",\n transparent: !0,\n opacity: 0.01\n }), y = new M.Matrix4().makeTranslation(d.point.x, d.point.y, d.point.z);\n let w = p.applyMatrix4(y), x = new M.Mesh(w, g);\n return x.name = d.name, n.sceneOrtho.add(x), x;\n }\n return n.ToggleCameraType = function() {\n o.cameraModule.switchCurrentCamera();\n }, n.TakeScreenshot = function() {\n try {\n if (!o.renderer) {\n console.error(\"渲染器未初始化\");\n return;\n }\n o.renderer.render(e, e.camera);\n const p = o.renderer.domElement.toDataURL(\"image/png\"), g = document.createElement(\"a\"), y = (/* @__PURE__ */ new Date()).toISOString().replaceAll(/[:.]/g, \"-\");\n g.download = `screenshot_${y}.png`, g.href = p, g.click(), console.log(\"截图已保存\");\n } catch (d) {\n console.error(\"截图失败:\", d);\n }\n }, n.ToggleFullscreen = function() {\n const d = t || document.documentElement;\n !document.fullscreenElement && !document.webkitFullscreenElement && !document.mozFullScreenElement && !document.msFullscreenElement ? (d.requestFullscreen ? d.requestFullscreen() : d.webkitRequestFullscreen ? d.webkitRequestFullscreen() : d.mozRequestFullScreen ? d.mozRequestFullScreen() : d.msRequestFullscreen && d.msRequestFullscreen(), console.log(\"已进入全屏模式\")) : (document.exitFullscreen ? document.exitFullscreen() : document.webkitExitFullscreen ? document.webkitExitFullscreen() : document.mozCancelFullScreen ? document.mozCancelFullScreen() : document.msExitFullscreen && document.msExitFullscreen(), console.log(\"已退出全屏模式\"));\n }, n;\n}\nclass od {\n engine;\n cubeTool;\n constructor(e) {\n this.engine = e;\n }\n init() {\n this.cubeTool = rd(this.engine, this.engine.scene, this.engine.container), this.cubeTool.init();\n }\n // 相机回归正位\n CameraGoHome() {\n this.cubeTool.CameraGoHome();\n }\n // 缩放到指定模型\n zoomToModel(e) {\n this.cubeTool.zoomToBox(e);\n }\n // 隐藏小方块\n hide() {\n }\n}\nfunction ad(o) {\n let e = new Object();\n return e.getBoundingBox = function() {\n let t = o.models, n = new M.Vector3(1e8, 1e9, 1e10), i = new M.Vector3(-1e8, -1e9, -1e10);\n t.forEach((u) => {\n let m = u.boundingBox.min, f = u.boundingBox.max;\n m.x < n.x && (n.x = m.x), m.y < n.y && (n.y = m.y), m.z < n.z && (n.z = m.z), f.x > i.x && (i.x = f.x), f.y > i.y && (i.y = f.y), f.z > i.z && (i.z = f.z);\n });\n let s = Math.min(n.x, i.x), r = Math.min(n.y, i.y), a = Math.min(n.z, i.z), l = Math.max(n.x, i.x), h = Math.max(n.y, i.y), c = Math.max(n.z, i.z);\n return {\n min: new M.Vector3(s, r, a),\n max: new M.Vector3(l, h, c)\n };\n }, e.rayInterationModel = function(t) {\n let n = [];\n return o.engineStatus.models.forEach((r) => {\n r.info.lods.forEach((a) => {\n let l = a.octreeBox;\n s(t, l, r);\n });\n }), n = n.filter((r) => r instanceof M.Mesh), t.intersectObjects(n, !1);\n function s(r, a, l) {\n if (a == null)\n return;\n let h = new M.Vector3(a.min.X * 0.3048, a.min.Z * 0.3048, -a.min.Y * 0.3048), c = new M.Vector3(a.max.X * 0.3048, a.max.Z * 0.3048, -a.max.Y * 0.3048), u = new M.Vector3(Math.min(h.x, c.X), Math.min(h.y, c.y), Math.min(h.z, c.z)), m = new M.Vector3(Math.max(c.x, h.x), Math.max(c.y, h.y), Math.max(c.z, h.z)), f = new M.Box3(u, m), d = r.ray.intersectsBox(f);\n if (!(d == null || d == !1))\n if (a.children == null || a.children.length == 0) {\n if (a.elements != null)\n for (var p of a.elements) {\n let g = o.engineStatus.hideModels.find((_) => _.url == l.url)?.ids;\n if (g != null && g.includes(p))\n continue;\n let y = o.engineStatus.translucentModels.find((_) => _.url == l.url)?.ids;\n if (y != null && y.includes(p))\n continue;\n let x = o.models.find((_) => _.url == l.url).nodesMap.get(p);\n x != null && !x.instance && x.infos.map((b) => b.mesh).forEach((b) => {\n n.push(b);\n });\n }\n } else {\n if (a.elements != null)\n for (var p of a.elements) {\n let y = o.engineStatus.hideModels.find((b) => b.url == l.url)?.ids;\n if (y != null && y.includes(p))\n continue;\n let w = o.engineStatus.translucentModels.find((b) => b.url == l.url)?.ids;\n if (w != null && w.includes(p))\n continue;\n let _ = o.models.find((b) => b.url == l.url).nodesMap.get(p);\n _ != null && !_.instance && _.infos.map((E) => E.mesh).forEach((E) => {\n n.push(E);\n });\n }\n for (let g of a.children)\n s(r, g, l);\n }\n }\n }, e;\n}\nclass ld {\n engine;\n // 绘制状态\n isDrawing = !1;\n startPoint = new M.Vector2();\n endPoint = new M.Vector2();\n // UI绘制框元素\n selectionBox = null;\n // 坐标转换工具\n worldToScreen = null;\n // 事件处理函数绑定(用于后续移除监听器)\n boundMouseDown;\n boundMouseMove;\n boundMouseUp;\n boundKeyDown;\n constructor(e) {\n this.engine = e, this.boundMouseDown = this.onMouseDown.bind(this), this.boundMouseMove = this.onMouseMove.bind(this), this.boundMouseUp = this.onMouseUp.bind(this), this.boundKeyDown = this.onKeyDown.bind(this);\n }\n /**\n * 初始化工具\n * 创建绘制框UI元素,初始化坐标转换工具\n */\n init() {\n this.createSelectionBoxElement(), this.engine.scene && this.engine.camera && this.engine.renderer && (this.worldToScreen = new je(\n this.engine.camera,\n this.engine.renderer,\n this.engine.scene\n ));\n }\n /**\n * 激活工具\n * 禁用控制器,添加鼠标事件监听器和键盘事件监听器\n */\n active() {\n this.engine.controlModule.disActive();\n const e = this.engine.renderer?.domElement;\n e && (e.addEventListener(\"mousedown\", this.boundMouseDown), e.addEventListener(\"mousemove\", this.boundMouseMove), e.addEventListener(\"mouseup\", this.boundMouseUp), e.style.cursor = \"crosshair\"), window.addEventListener(\"keydown\", this.boundKeyDown);\n }\n /**\n * 停用工具\n * 启用控制器,移除鼠标事件监听器和键盘事件监听器\n */\n disActive() {\n this.engine.controlModule.active();\n const e = this.engine.renderer?.domElement;\n e && (e.removeEventListener(\"mousedown\", this.boundMouseDown), e.removeEventListener(\"mousemove\", this.boundMouseMove), e.removeEventListener(\"mouseup\", this.boundMouseUp), e.style.cursor = \"default\"), window.removeEventListener(\"keydown\", this.boundKeyDown), this.isDrawing && this.endDrawing();\n }\n /**\n * 创建绘制框UI元素\n * 用于在屏幕上显示用户绘制的区域\n */\n createSelectionBoxElement() {\n this.selectionBox = document.createElement(\"div\"), this.selectionBox.style.position = \"absolute\", this.selectionBox.style.border = \"2px dashed #00aaff\", this.selectionBox.style.backgroundColor = \"rgba(0, 170, 255, 0.1)\", this.selectionBox.style.pointerEvents = \"none\", this.selectionBox.style.display = \"none\", this.selectionBox.style.zIndex = \"1000\", this.selectionBox.style.boxSizing = \"border-box\";\n const e = this.engine.renderer?.domElement;\n e && e.parentElement && e.parentElement.appendChild(this.selectionBox);\n }\n /**\n * 鼠标按下事件处理\n * 开始绘制区域\n */\n onMouseDown(e) {\n e.button !== 0 || !this.engine.renderer?.domElement || (this.startPoint.set(e.offsetX, e.offsetY), this.endPoint.copy(this.startPoint), this.isDrawing = !0, this.selectionBox && (this.selectionBox.style.display = \"block\", this.updateSelectionBoxUI()), e.preventDefault(), e.stopPropagation());\n }\n /**\n * 鼠标移动事件处理\n * 更新绘制框的显示\n */\n onMouseMove(e) {\n !this.isDrawing || !this.engine.renderer?.domElement || (this.endPoint.set(e.offsetX, e.offsetY), this.updateSelectionBoxUI(), e.preventDefault(), e.stopPropagation());\n }\n /**\n * 鼠标释放事件处理\n * 结束绘制,执行缩放操作\n */\n onMouseUp(e) {\n this.isDrawing && (this.endDrawing(), this.performZoom(), e.preventDefault(), e.stopPropagation(), this.disActive());\n }\n /**\n * 键盘按下事件处理\n * 按下 ESC 键时退出功能\n */\n onKeyDown(e) {\n e.key === \"Escape\" && (this.disActive(), e.preventDefault(), e.stopPropagation());\n }\n /**\n * 结束绘制\n * 隐藏绘制框\n */\n endDrawing() {\n this.isDrawing && (this.isDrawing = !1, this.selectionBox && (this.selectionBox.style.display = \"none\"));\n }\n /**\n * 更新绘制框UI\n * 根据起点和终点更新绘制框的位置和大小\n */\n updateSelectionBoxUI() {\n if (!this.selectionBox || !this.engine.renderer?.domElement) return;\n const t = Math.min(this.startPoint.x, this.endPoint.x), n = Math.min(this.startPoint.y, this.endPoint.y), i = Math.abs(this.endPoint.x - this.startPoint.x), s = Math.abs(this.endPoint.y - this.startPoint.y);\n this.selectionBox.style.left = `${t}px`, this.selectionBox.style.top = `${n}px`, this.selectionBox.style.width = `${i}px`, this.selectionBox.style.height = `${s}px`;\n }\n /**\n * 执行缩放操作\n * 将屏幕区域转换为世界坐标,计算包围盒,调整相机视角\n */\n performZoom() {\n const e = Math.abs(this.endPoint.x - this.startPoint.x), t = Math.abs(this.endPoint.y - this.startPoint.y);\n if (e < 5 || t < 5)\n return;\n if (!this.worldToScreen) {\n console.warn(\"RangeScale: 坐标转换工具未初始化\");\n return;\n }\n const n = Math.min(this.startPoint.x, this.endPoint.x), i = Math.max(this.startPoint.x, this.endPoint.x), s = Math.min(this.startPoint.y, this.endPoint.y), r = Math.max(this.startPoint.y, this.endPoint.y), a = [], l = [\n { x: n, y: s },\n // 左上\n { x: i, y: s },\n // 右上\n { x: i, y: r },\n // 右下\n { x: n, y: r }\n // 左下\n ];\n for (const c of l) {\n const u = this.worldToScreen.screenToWorld(c.x, c.y);\n u && a.push(u);\n }\n if (a.length < 3) {\n console.warn(\"RangeScale: 框选区域未命中模型,无法执行缩放操作\");\n return;\n }\n if (a.length < 3) {\n console.warn(\"RangeScale: 无法将屏幕区域转换为世界坐标\");\n return;\n }\n const h = new M.Box3();\n for (const c of a)\n h.expandByPoint(c);\n if (h.isEmpty()) {\n console.warn(\"RangeScale: 计算得到的包围盒无效\");\n return;\n }\n this.fitCameraToBoundingBox(h);\n }\n /**\n * 调整相机视角以适应包围盒\n * @param boundingBox - 要适应的包围盒\n */\n fitCameraToBoundingBox(e) {\n const t = this.engine.camera, n = this.engine.controls;\n if (!t || !n) {\n console.warn(\"RangeScale: 相机或控制器未初始化\");\n return;\n }\n const i = new M.Vector3();\n e.getCenter(i);\n const s = new M.Vector3();\n e.getSize(s);\n const r = Math.max(s.x, s.y, s.z);\n if (t instanceof M.PerspectiveCamera) {\n const a = t.fov * (Math.PI / 180), h = r / (2 * Math.tan(a / 2)) * 1.2, c = new M.Vector3();\n t.getWorldDirection(c);\n const u = i.clone().sub(t.position);\n c.dot(u.normalize()) < 0 && c.negate();\n const f = i.clone().sub(c.multiplyScalar(h));\n t.position.copy(f), n.target && n.target.copy(i), t.lookAt(i), n.update();\n } else if (t instanceof M.OrthographicCamera) {\n const l = r * 1.2, h = this.engine.renderer?.domElement, c = h ? h.width / h.height : 1;\n t.left = -l * c / 2, t.right = l * c / 2, t.top = l / 2, t.bottom = -l / 2, t.updateProjectionMatrix();\n const u = new M.Vector3();\n t.getWorldDirection(u);\n const m = r * 1.5, f = i.clone().sub(u.multiplyScalar(m));\n t.position.copy(f), n.target && n.target.copy(i), t.lookAt(i), n.update();\n }\n }\n}\nclass cd {\n engine;\n ground = null;\n // 地面对象\n constructor(e) {\n this.engine = e;\n }\n init() {\n }\n /**\n * 隐藏或显示性能监视器\n * @param visible - true显示,false隐藏\n */\n setStatsVisible(e) {\n this.engine.stats?.dom && (this.engine.stats.dom.style.display = e ? \"block\" : \"none\");\n }\n /**\n * 设置环境光照强度\n * @param intensity - 光照强度,默认范围 0-5\n */\n setAmbientLightIntensity(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof M.AmbientLight\n );\n t && (t.intensity = e);\n }\n /**\n * 设置环境光照颜色\n * @param color - 颜色,可以是十六进制数字 (0xffffff) 或字符串 ('#ffffff')\n */\n setAmbientLightColor(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof M.AmbientLight\n );\n t && t.color.set(e);\n }\n /**\n * 设置定向光源强度\n * @param intensity - 光照强度,默认范围 0-5\n */\n setDirectionalLightIntensity(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof M.DirectionalLight\n );\n t && (t.intensity = e);\n }\n /**\n * 设置定向光源颜色\n * @param color - 颜色,可以是十六进制数字 (0xffffff) 或字符串 ('#ffffff')\n */\n setDirectionalLightColor(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof M.DirectionalLight\n );\n t && t.color.set(e);\n }\n /**\n * 设置阴影精细度(阴影贴图分辨率)\n * @param quality - 质量等级:'low' (1024), 'medium' (2048), 'high' (4096), 'ultra' (8192)\n */\n setShadowQuality(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof M.DirectionalLight\n );\n if (t?.shadow) {\n const i = {\n low: 1024,\n medium: 2048,\n high: 4096,\n ultra: 8192\n }[e];\n t.shadow.mapSize.width = i, t.shadow.mapSize.height = i, t.shadow.map?.dispose(), t.shadow.map = null;\n }\n }\n /**\n * 设置是否开启定向光阴影\n * @param enabled - true开启,false关闭\n */\n setDirectionalLightShadow(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof M.DirectionalLight\n );\n t && (t.castShadow = e), this.engine.renderer && (this.engine.renderer.shadowMap.enabled = e);\n }\n /**\n * 设置是否开启GTAO阴影(环境光遮蔽)\n * @param enabled - true开启,false关闭\n */\n setGTAOEnabled(e) {\n if (!this.engine.composerModule?.composer) {\n console.warn(\"Composer not initialized\");\n return;\n }\n const t = this.engine.composerModule.composer, n = t.passes.find((i) => i instanceof Fe);\n if (e)\n if (n)\n n.enabled = !0;\n else {\n const { width: i, height: s } = this.engine.deviceModule.getContainerSize(), r = new Fe(\n this.engine.scene,\n this.engine.camera,\n i,\n s\n );\n r.output = Fe.OUTPUT.Default, r.blendIntensity = 0.5, r.updateGtaoMaterial && r.updateGtaoMaterial({\n radius: 1,\n distanceExponent: 1,\n thickness: 1,\n scale: 1,\n distanceFallOff: 1,\n screenSpaceRadius: !0\n });\n const a = t.passes.findIndex(\n (l) => l.constructor.name === \"RenderPass\"\n );\n t.passes.splice(a + 1, 0, r);\n }\n else n && (n.enabled = !1);\n }\n /**\n * 设置场景饱和度\n * @param saturation - 饱和度值,1.0为正常,>1增强,<1降低,推荐范围 0.5-2.0\n */\n setSceneSaturation(e) {\n if (!this.engine.composerModule?.saturationPass) {\n console.warn(\"Saturation pass not initialized\");\n return;\n }\n this.engine.composerModule.saturationPass.uniforms.saturation.value = e;\n }\n /**\n * 设置场景对比度\n * @param contrast - 对比度值,1.0为正常,>1增强,<1降低,推荐范围 0.5-2.0\n */\n setSceneContrast(e) {\n if (!this.engine.composerModule?.saturationPass) {\n console.warn(\"Saturation pass not initialized\");\n return;\n }\n this.engine.composerModule.saturationPass.uniforms.contrast.value = e;\n }\n /**\n * 设置是否开启地面\n * @param enabled - true开启,false关闭\n * @param options - 地面配置选项\n */\n setGroundEnabled(e, t) {\n if (e)\n if (this.ground)\n this.ground.visible = !0;\n else {\n const n = t?.size ?? 100, i = t?.color ?? 8421504, s = t?.opacity ?? 0.3, r = new M.PlaneGeometry(n, n), a = new M.MeshStandardMaterial({\n color: i,\n transparent: !0,\n opacity: s,\n side: M.DoubleSide\n });\n this.ground = new M.Mesh(r, a), this.ground.rotation.x = -Math.PI / 2, this.ground.position.y = 0, this.ground.receiveShadow = !0, this.ground.name = \"ground\", this.engine.scene.add(this.ground);\n }\n else this.ground && (this.ground.visible = !1);\n }\n /**\n * 设置HDR背景\n * @param hdrTexture - HDR环境贴图(THREE.Texture),传入null则移除背景\n */\n setHDRBackground(e) {\n e ? (this.engine.scene.background = e, this.engine.scene.environment = e) : (this.engine.scene.background = null, this.engine.scene.environment = null);\n }\n}\nfunction bt() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(o) {\n var e = Math.random() * 16 | 0, t = o == \"x\" ? e : e & 3 | 8;\n return t.toString(16);\n });\n}\nclass St {\n engine;\n handelBehaved;\n setting;\n constructor(e) {\n this.engine = e, this.handelBehaved = hr(e), this.handelBehaved.init(this, null), this.setting = {\n // 单位\n unit: \"m\",\n // 保留几位小数,ui上还是显示0.001这样\n precision: 3\n };\n }\n // 获取设置\n getSetting() {\n return this.setting;\n }\n // 保存设置\n saveSetting(e) {\n this.setting = e;\n }\n active() {\n this.handelBehaved.active();\n }\n disActive() {\n this.handelBehaved.disActive();\n }\n // 获取展示的文字\n getMeasureText(e, t) {\n if (e == null)\n return null;\n let n = this.setting.unit, i = n;\n return t == 1 ? n == \"mm\" ? e = e * 1e3 : n == \"cm\" ? e = e * 100 : n == \"dm\" ? e = e * 10 : n == \"m\" ? e = e * 1 : n == \"km\" && (e = e * 1e-3) : t == 2 && (n == \"mm\" ? e = e * 1e3 * 1e3 : n == \"cm\" ? e = e * 100 * 100 : n == \"dm\" ? e = e * 10 * 10 : n == \"m\" ? e = e * 1 * 1 : n == \"km\" && (e = e * 1e-3 * 1e-3), i = i + \"²\"), e.toFixed(this.setting.precision) + \" \" + i;\n }\n // 取消当前选中的标注\n cancelCurrentSelectedAnnotation() {\n let e = this.engine.measure.annotationData;\n for (let t in e)\n e[t].forEach((n) => {\n n.highlight == !0 && (n.highlight = !1, n.container.classList.remove(\"Hight\"), n.container.getElementsByTagName(\"svg\")[0].classList.remove(\"Hight\"));\n });\n }\n // 监听按下esc\n handelKeyEscDown() {\n this.cancelCurrentSelectedAnnotation();\n let e = this.engine.measure.annotationData;\n for (let t in e)\n for (let n = e[t].length - 1; n >= 0; n--) {\n let i = e[t][n];\n i.isSelect == !0 && (i.container.remove(), e[t].splice(n, 1));\n }\n this.engine.measure.clearAllPoints();\n }\n // 监听按下delete\n handelKeyDeleteDown() {\n let e = this.engine.measure.annotationData;\n for (let t in e)\n for (let n = e[t].length - 1; n >= 0; n--) {\n let i = e[t][n];\n i.highlight == !0 && (i.container.remove(), e[t].splice(n, 1));\n }\n }\n clearHighlight() {\n let e = this.engine.measure.annotationData;\n for (let t in e)\n e[t].forEach((n) => {\n n.highlight = !1, n.container.classList.remove(\"Hight\"), n.container.getElementsByTagName(\"svg\")[0].classList.remove(\"Hight\");\n });\n }\n // 绘制普通标注\n drawNormalAnnotation() {\n let e = this;\n this.engine.measure.annotationData.normalAnnotation.forEach((d) => {\n f(d);\n }), this.engine.measure.annotationData.elevationAnnotation.forEach((d) => {\n m(d);\n }), this.engine.measure.annotationData.coordinateAnnotation.forEach((d) => {\n u(d);\n }), this.engine.measure.annotationData.angleAnnotation.forEach((d) => {\n l(d);\n }), this.engine.measure.annotationData.areaAnnotation.forEach((d) => {\n h(d);\n }), this.engine.measure.annotationData.slopeAnnotation.forEach((d) => {\n c(d);\n });\n function l(d) {\n if (d.container == null) {\n let A = [\n '',\n '',\n // 起点\n '',\n // 顶点\n '',\n // 终点\n '',\n // 起点到顶点的线\n '',\n // 顶点到终点的线\n '',\n '' + d.text + \"\",\n \"\"\n ].join(\"\");\n d.container = document.createElement(\"div\"), d.container.className = \"angle-annotation\", d.container.id = d.id, d.container.style.pointerEvents = \"none\", d.container.innerHTML = A, e.engine.measure.annotationContainer.appendChild(d.container), d.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), d.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), d.highlight = !0, e.engine.events.trigger(Se.MeasureClick, d);\n });\n }\n let p = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point1), g = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point2), y = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point3), w = e.engine.reactBoundingClientRect.left, x = e.engine.reactBoundingClientRect.top;\n p.x += w, p.y += x, g.x += w, g.y += x, y.x += w, y.y += x;\n let _ = d.container;\n _.getElementsByTagName(\"circle\")[0].setAttribute(\"cx\", p.x), _.getElementsByTagName(\"circle\")[0].setAttribute(\"cy\", p.y), _.getElementsByTagName(\"circle\")[1].setAttribute(\"cx\", g.x), _.getElementsByTagName(\"circle\")[1].setAttribute(\"cy\", g.y), _.getElementsByTagName(\"circle\")[2].setAttribute(\"cx\", y.x), _.getElementsByTagName(\"circle\")[2].setAttribute(\"cy\", y.y), _.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", p.x + \",\" + p.y + \" \" + g.x + \",\" + g.y), _.getElementsByTagName(\"polyline\")[1].setAttribute(\"points\", g.x + \",\" + g.y + \" \" + y.x + \",\" + y.y);\n let b = g.x, E = g.y - 30;\n _.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", b - 40), _.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", E - 12.5), _.getElementsByTagName(\"text\")[0].setAttribute(\"x\", b), _.getElementsByTagName(\"text\")[0].setAttribute(\"y\", E + 4), _.getElementsByTagName(\"text\")[0].innerHTML = d.text, _.style.top = \"0px\", _.style.left = \"0px\";\n }\n function h(d) {\n if (d.container == null) {\n let P = [\n '',\n '',\n // 填充区域\n '',\n // 边界线\n '',\n '' + e.getMeasureText(d.text, 2) + \"\",\n \"\"\n ].join(\"\");\n d.container = document.createElement(\"div\"), d.container.className = \"area-annotation\", d.container.id = d.id, d.container.innerHTML = P, e.engine.measure.annotationContainer.appendChild(d.container), d.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), d.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), d.highlight = !0, e.engine.events.trigger(Se.MeasureClick, d);\n });\n }\n if (!d.points || d.points.length < 3)\n return;\n let p = e.engine.reactBoundingClientRect.left, g = e.engine.reactBoundingClientRect.top, y = [], w = 0, x = 0;\n for (let P = 0; P < d.points.length; P++) {\n let C = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.points[P]);\n C.x += p, C.y += g, y.push(C), w += C.x, x += C.y;\n }\n w = w / y.length, x = x / y.length;\n let _ = y.map((P) => P.x + \",\" + P.y).join(\" \"), b = d.container;\n b.getElementsByTagName(\"polygon\")[0].setAttribute(\"points\", _), b.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", _);\n let E = w, A = x;\n b.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", E - 40), b.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", A - 12.5), b.getElementsByTagName(\"text\")[0].setAttribute(\"x\", E), b.getElementsByTagName(\"text\")[0].setAttribute(\"y\", A + 4), b.getElementsByTagName(\"text\")[0].innerHTML = e.getMeasureText(d.text, 2), b.style.top = \"0px\", b.style.left = \"0px\";\n }\n function c(d) {\n if (d.container == null) {\n let E = [\n '',\n \"\",\n '',\n '',\n // 箭头形状\n \"\",\n \"\",\n '',\n // 起点到终点的线,带箭头\n '',\n '' + d.text + \"\",\n \"\"\n ].join(\"\");\n d.container = document.createElement(\"div\"), d.container.className = \"slope-annotation\", d.container.id = d.id, d.container.innerHTML = E, e.engine.measure.annotationContainer.appendChild(d.container), d.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), d.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), d.highlight = !0, e.engine.events.trigger(Se.MeasureClick, d);\n });\n }\n let p = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point1), g = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point2), y = e.engine.reactBoundingClientRect.left, w = e.engine.reactBoundingClientRect.top;\n p.x += y, p.y += w, g.x += y, g.y += w;\n let x = d.container;\n x.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", p.x + \",\" + p.y + \" \" + g.x + \",\" + g.y);\n let _ = (p.x + g.x) / 2, b = (p.y + g.y) / 2 - 30;\n x.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", _ - 50), x.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", b - 12.5), x.getElementsByTagName(\"text\")[0].setAttribute(\"x\", _), x.getElementsByTagName(\"text\")[0].setAttribute(\"y\", b + 4), x.getElementsByTagName(\"text\")[0].innerHTML = d.text, x.style.top = \"0px\", x.style.left = \"0px\";\n }\n function u(d) {\n if (d.container == null) {\n let A = [\n '',\n '',\n '',\n 'X: ' + e.getMeasureText(d.textX, 1) + \"\",\n '',\n 'Y: ' + e.getMeasureText(-d.textZ, 1) + \"\",\n '',\n 'Z: ' + e.getMeasureText(d.textY, 1) + \"\",\n \"\"\n ].join(\"\");\n d.container = document.createElement(\"div\"), d.container.className = \"coordinate-annotation\", d.container.id = d.id, d.container.style.position = \"absolute\", d.container.style.pointerEvents = \"none\", d.container.innerHTML = A, e.engine.measure.annotationContainer.appendChild(d.container), d.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), d.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), d.highlight = !0, e.engine.events.trigger(Se.MeasureClick, d);\n });\n }\n let p = d.container, g = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point), y = e.engine.reactBoundingClientRect.left, w = e.engine.reactBoundingClientRect.top;\n g.x += y, g.y += w, p.style.top = \"0px\", p.style.left = \"0px\";\n let x = p.getElementsByTagName(\"circle\")[0];\n x && (x.setAttribute(\"cx\", g.x), x.setAttribute(\"cy\", g.y));\n let _ = p.getElementsByTagName(\"rect\"), b = p.getElementsByTagName(\"text\"), E = -55;\n _[0] && (_[0].setAttribute(\"x\", g.x + 10), _[0].setAttribute(\"y\", g.y + 10 + E)), b[0] && (b[0].setAttribute(\"x\", g.x + 10 + 40), b[0].setAttribute(\"y\", g.y + 10 + 16 + E)), _[1] && (_[1].setAttribute(\"x\", g.x + 10), _[1].setAttribute(\"y\", g.y + 10 + 30 + E)), b[1] && (b[1].setAttribute(\"x\", g.x + 10 + 40), b[1].setAttribute(\"y\", g.y + 10 + 46 + E)), _[2] && (_[2].setAttribute(\"x\", g.x + 10), _[2].setAttribute(\"y\", g.y + 10 + 60 + E)), b[2] && (b[2].setAttribute(\"x\", g.x + 10 + 40), b[2].setAttribute(\"y\", g.y + 10 + 76 + E)), b[0] && (b[0].innerHTML = \"X: \" + e.getMeasureText(d.textX, 1)), b[1] && (b[1].innerHTML = \"Y: \" + e.getMeasureText(-d.textZ, 1)), b[2] && (b[2].innerHTML = \"Z: \" + e.getMeasureText(d.textY, 1));\n }\n function m(d) {\n if (d.container == null) {\n let x = [\n '',\n '',\n '' + e.getMeasureText(d.text, 1) + \"\",\n '',\n \"\"\n ].join(\"\");\n d.container = document.createElement(\"div\"), d.container.className = \"elevation-annotation\", d.container.id = d.id, d.container.style.position = \"absolute\", d.container.style.pointerEvents = \"none\", d.container.innerHTML = x, e.engine.measure.annotationContainer.appendChild(d.container), d.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), d.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), d.highlight = !0, e.engine.events.trigger(Se.MeasureClick, d);\n });\n }\n let p = d.container, g = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point), y = e.engine.reactBoundingClientRect.left, w = e.engine.reactBoundingClientRect.top;\n p.style.top = g.y + w - 48 + \"px\", p.style.left = g.x + y - 16 + \"px\", p.getElementsByTagName(\"text\")[0].innerHTML = e.getMeasureText(d.text, 1);\n }\n function f(d) {\n if (d.container == null) {\n let _ = [\n '',\n '',\n '',\n '',\n '',\n '' + e.getMeasureText(d.text, 1) + \"\",\n \"\"\n ].join(\"\");\n d.container = document.createElement(\"div\"), d.container.className = \"normal-annotation\", d.container.id = d.id, d.container.innerHTML = _, e.engine.measure.annotationContainer.appendChild(d.container), d.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), d.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), d.highlight = !0, e.engine.events.trigger(Se.MeasureClick, d);\n });\n }\n let p = d.container;\n if (d.point1 == null || d.point2 == null) {\n p.style.display = \"none\";\n return;\n } else\n p.style.display = \"block\";\n let g = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point1), y = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point2), w = e.engine.reactBoundingClientRect.left, x = e.engine.reactBoundingClientRect.top;\n g.x += w, g.y += x, y.x += w, y.y += x, p.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", g.x + \",\" + g.y + \" \" + y.x + \",\" + y.y), p.getElementsByTagName(\"circle\")[0].setAttribute(\"cx\", g.x), p.getElementsByTagName(\"circle\")[0].setAttribute(\"cy\", g.y), p.getElementsByTagName(\"circle\")[1].setAttribute(\"cx\", y.x), p.getElementsByTagName(\"circle\")[1].setAttribute(\"cy\", y.y), p.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", g.x * 0.5 + y.x * 0.5 - 40), p.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", g.y * 0.5 + y.y * 0.5 - 12.5), p.getElementsByTagName(\"text\")[0].setAttribute(\"x\", g.x * 0.5 + y.x * 0.5 + 40 - 40), p.getElementsByTagName(\"text\")[0].setAttribute(\"y\", g.y * 0.5 + y.y * 0.5 + 16 - 12.5), p.getElementsByTagName(\"text\")[0].innerHTML = e.getMeasureText(d.text, 1), p.style.top = \"0px\", p.style.left = \"0px\";\n }\n }\n}\nclass hd {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n catchDir = 0;\n type = \"point\";\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n // 启动净高测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.isActive = !0, this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n // 停止净高测量\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 设置净高方向\n setDirection(e) {\n this.catchDir = e;\n }\n // 设置净高类型\n setSelectType(e) {\n this.type = e;\n }\n getMeshesMinMaxY(e) {\n if (!Array.isArray(e) || e.length === 0)\n return null;\n let t = Number.POSITIVE_INFINITY, n = Number.NEGATIVE_INFINITY;\n for (let i = 0; i < e.length; i++) {\n const s = e[i];\n if (!s)\n continue;\n typeof s.updateMatrixWorld == \"function\" && s.updateMatrixWorld(!0);\n const r = new M.Box3().setFromObject(s);\n !Number.isFinite(r.min.y) || !Number.isFinite(r.max.y) || (r.min.y < t && (t = r.min.y), r.max.y > n && (n = r.max.y));\n }\n return !Number.isFinite(t) || !Number.isFinite(n) ? null : { minY: t, maxY: n };\n }\n // 鼠标点击\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch.point;\n if (this.type == \"element\") {\n let s = this.engine.interactionModule.getCatchMeshs(e);\n var n = this.getMeshesMinMaxY(s);\n this.catchDir == 0 ? t.set(t.x, n?.minY, t.z) : t.set(t.x, n?.maxY, t.z);\n } else\n t = e.catch.point;\n if (this.points.length == 0) {\n this.points.push(t);\n return;\n }\n let i = this.engine.measure.annotationData.normalAnnotation.find((s) => s.isSelect == !0);\n i != null && (i.isSelect = !1);\n }\n // 鼠标移动\n handleMouseMove(e) {\n if (e.catch == null || this.points.length == 0)\n return;\n let t = this.engine.measure.annotationData.normalAnnotation.find((i) => i.isSelect == !0);\n t == null && (t = {\n text: null,\n id: bt(),\n isSelect: !0,\n type: \"clear-height\"\n }, this.engine.measure.annotationData.normalAnnotation.push(t));\n let n = e.catch;\n if (this.type == \"element\") {\n let i = e.catch.point.clone();\n i.set(i.x, this.points[0].y, i.z);\n let s = new M.Raycaster(i.add(new M.Vector3(0, 0.01, 0)), new M.Vector3(0, this.catchDir == 0 ? -1 : 1, 0));\n n.point = this.points[0];\n const r = this.engine.octreeBox.rayInterationModel(s);\n if (r.length === 0) {\n t.point2 = null;\n return;\n }\n t.point1 = i, t.point2 = r[0].point, t.text = t.point1.clone().distanceTo(t.point2.clone()), this.engine.events.trigger(Se.MeasureChanged, t);\n } else {\n let i = new M.Raycaster(e.catch.point.clone().add(new M.Vector3(0, 0.01, 0)), new M.Vector3(0, this.catchDir == 0 ? -1 : 1, 0));\n const s = this.engine.octreeBox.rayInterationModel(i);\n if (s.length === 0) {\n t.point2 = null;\n return;\n }\n t.point1 = n.point, t.point2 = s[0].point, t.text = t.point1.clone().distanceTo(t.point2.clone()), this.engine.events.trigger(Se.MeasureChanged, t);\n }\n }\n}\nclass ud {\n engine;\n tools;\n isActive = !1;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n // 启动距离测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.isActive = !0, this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this, { showCatch: !0 }), this.behavior.active();\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n // 停止距离测量\n disActive() {\n this.points = [], this.isActive = !1, this.engine.handelBehaved.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 鼠标点击\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.length == 0)\n this.points.push(t.point);\n else if (this.points.length == 1) {\n let n = this.engine.measure.annotationData.normalAnnotation.find((i) => i.isSelect == !0);\n if (n == null)\n return;\n n.point2 = t.point, n.isSelect = !1, this.points = [], this.engine.events.trigger(Se.MeasureChanged, n);\n }\n }\n // 鼠标移动\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (t != null && this.points.length == 1) {\n let n = this.engine.measure.annotationData.normalAnnotation.find((i) => i.isSelect == !0);\n n == null && (n = {\n id: bt(),\n point1: this.points[0].clone(),\n point2: t.point.clone(),\n text: this.points[0].clone().distanceTo(t.point.clone()),\n type: \"distance\",\n isSelect: !0\n }, this.engine.measure.annotationData.normalAnnotation.push(n)), n.point2 = t.point, n.text = n.point1.clone().distanceTo(n.point2.clone());\n }\n }\n // 按下esc\n}\nclass dd {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n // 启动净高测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.isActive = !0, this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n // 停止净距测量\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 鼠标点击\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n if (this.points.length == 0) {\n this.points.push(e.catch.point);\n return;\n }\n let t = this.engine.measure.annotationData.normalAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1);\n }\n // 鼠标移动\n handleMouseMove(e) {\n if (e.catch == null || this.points.length == 0)\n return;\n let t = this.engine.measure.annotationData.normalAnnotation.find((r) => r.isSelect == !0);\n t == null && (t = {\n text: null,\n id: bt(),\n isSelect: !0,\n type: \"clear-distance\"\n }, this.engine.measure.annotationData.normalAnnotation.push(t));\n let n = new M.Raycaster(e.catch.point.clone().add(e.catch.face.normal.clone().setLength(0.01)), e.catch.face.normal);\n const i = this.engine.octreeBox.rayInterationModel(n);\n if (i.length == 0) {\n t.point2 = null;\n return;\n }\n let s = e.catch;\n t.point1 = s.point, t.point2 = i[0].point, t.text = t.point1.clone().distanceTo(t.point2.clone()), this.engine.events.trigger(Se.MeasureChanged, t);\n }\n}\nclass fd {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active(), this.isActive = !0;\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.elevationAnnotation.find((n) => n.isSelect == !0);\n t == null && (t = {\n id: bt(),\n point: e.catch.point.clone(),\n text: e.catch.point.y,\n isSelect: !0,\n type: \"elevation\"\n }, this.engine.measure.annotationData.elevationAnnotation.push(t)), t.point = e.catch.point.clone(), t.text = e.catch.point.y;\n }\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.elevationAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1, t.point = e.catch.point.clone(), t.text = e.catch.point.y, this.engine.events.trigger(Se.MeasureChanged, t));\n }\n}\nclass pd {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active(), this.isActive = !0;\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.coordinateAnnotation.find((n) => n.isSelect == !0);\n t == null && (t = {\n id: bt(),\n point: e.catch.point.clone(),\n text: Math.round(e.catch.point.y) + \" m\",\n isSelect: !0,\n type: \"point\"\n }, this.engine.measure.annotationData.coordinateAnnotation.push(t)), t.point = e.catch.point.clone(), t.textX = e.catch.point.x, t.textY = e.catch.point.y, t.textZ = e.catch.point.z;\n }\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.coordinateAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1, t.point = e.catch.point.clone(), t.textX = e.catch.point.x, t.textY = e.catch.point.y, t.textZ = e.catch.point.z, this.engine.events.trigger(Se.MeasureChanged, t));\n }\n}\nclass md {\n engine;\n tools;\n // 存储三个点:起点、顶点(中间点)、终点\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n // 启动角度测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n // 停止角度测量\n disActive() {\n this.points = [], this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 计算三点形成的角度(以第二个点为顶点)\n // point1: 起点, point2: 顶点, point3: 终点\n calculateAngle(e, t, n) {\n const i = new M.Vector3().subVectors(e, t), s = new M.Vector3().subVectors(n, t), r = i.length(), a = s.length();\n if (r === 0 || a === 0)\n return 0;\n const h = i.dot(s) / (r * a), c = Math.max(-1, Math.min(1, h));\n return Math.acos(c) * (180 / Math.PI);\n }\n // 处理鼠标点击事件\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.length == 0)\n this.points.push(t.point);\n else if (this.points.length == 1)\n this.points.push(t.point);\n else if (this.points.length == 2) {\n let n = this.engine.measure.annotationData.angleAnnotation.find((i) => i.isSelect == !0);\n if (n == null)\n return;\n n.point3 = t.point.clone(), n.angle = this.calculateAngle(n.point1, n.point2, n.point3), n.text = n.angle.toFixed(2) + \"°\", n.isSelect = !1, n.type = \"angle\", this.points = [], this.engine.events.trigger(Se.MeasureChanged, n);\n }\n }\n // 处理鼠标移动事件\n handleMouseMove(e) {\n if (e.catch != null && this.points.length != 1 && this.points.length == 2) {\n let t = this.engine.measure.annotationData.angleAnnotation.find((n) => n.isSelect == !0);\n t == null && (t = {\n id: bt(),\n point1: this.points[0].clone(),\n // 起点\n point2: this.points[1].clone(),\n // 顶点(中间点)\n point3: e.catch.point.clone(),\n // 终点(实时更新)\n angle: 0,\n text: \"0.00°\",\n isSelect: !0,\n type: \"angle\"\n }, this.engine.measure.annotationData.angleAnnotation.push(t)), t.point3 = e.catch.point.clone(), t.angle = this.calculateAngle(t.point1, t.point2, t.point3), t.text = t.angle.toFixed(2) + \"°\", console.log(\"角度\", t.text);\n }\n }\n}\nclass gd {\n engine;\n tools;\n // 存储多个点,用于围成区域\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n // 启动面积测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n // 停止面积测量\n disActive() {\n this.points = [], this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 计算多边形面积(使用鞋带公式/Shoelace formula)\n // 注意:这个方法假设点在同一个平面上,使用XZ平面投影计算面积\n calculateArea(e) {\n if (e.length < 3)\n return 0;\n let t = 0;\n const n = e.length;\n for (let i = 0; i < n; i++) {\n const s = (i + 1) % n;\n t += e[i].x * e[s].z, t -= e[s].x * e[i].z;\n }\n return t = Math.abs(t) / 2, t;\n }\n // 处理鼠标点击事件\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.push(t.point.clone()), this.points.length >= 3) {\n let n = this.engine.measure.annotationData.areaAnnotation.find((i) => i.isSelect == !0);\n n == null ? (n = {\n id: bt(),\n points: this.points.map((i) => i.clone()),\n // 复制所有点\n area: 0,\n text: 0,\n isSelect: !0,\n type: \"area\"\n }, this.engine.measure.annotationData.areaAnnotation.push(n)) : (this.points.push(t.point.clone()), n.points = this.points.map((i) => i.clone())), n.area = this.calculateArea(n.points), n.text = n.area, console.log(\"面积\", n.text);\n }\n }\n // 处理鼠标移动事件\n handleMouseMove(e) {\n if (e.catch != null && this.points.length >= 2) {\n let t = this.engine.measure.annotationData.areaAnnotation.find((n) => n.isSelect == !0);\n if (t == null) {\n if (this.points.length >= 2) {\n let n = this.points.map((i) => i.clone());\n n.push(e.catch.point.clone()), n.length >= 3 && (t = {\n id: bt(),\n points: n,\n area: 0,\n text: 0,\n isSelect: !0,\n type: \"area\"\n }, this.engine.measure.annotationData.areaAnnotation.push(t));\n }\n } else if (t.points.length > 0) {\n const n = t.points.length - 1;\n t.points[n] = e.catch.point.clone();\n } else\n t.points = this.points.map((n) => n.clone()), t.points.push(e.catch.point.clone());\n t && t.points.length >= 3 && (t.area = this.calculateArea(t.points), t.text = t.area);\n }\n }\n handelKeyEnterDown() {\n this.finishMeasure();\n }\n // 完成面积测量(可以用于双击或右键完成)\n finishMeasure() {\n this.points = this.points.slice(0, this.points.length - 1);\n let e = this.engine.measure.annotationData.areaAnnotation.find((t) => t.isSelect == !0);\n e != null && e.points.length >= 3 && (e.points.length > this.points.length && (e.points = this.points.map((t) => t.clone())), e.area = this.calculateArea(e.points), e.text = e.area, e.isSelect = !1, this.points = [], this.engine.events.trigger(Se.MeasureChanged, e));\n }\n}\nclass yd {\n engine;\n tools;\n // 存储两个点:起点和终点\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n // 启动坡度测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n // 停止坡度测量\n disActive() {\n this.points = [], this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 计算两点之间的坡度\n // point1: 起点, point2: 终点\n // 返回:{ percentage: 坡度百分比, angle: 坡度角度(度), heightDiff: 高度差, horizontalDist: 水平距离 }\n calculateSlope(e, t) {\n const n = t.y - e.y, i = t.x - e.x, s = t.z - e.z, r = Math.sqrt(i * i + s * s);\n if (r === 0)\n return {\n percentage: 0,\n angle: 0,\n heightDiff: n,\n horizontalDist: 0,\n type: \"slope\"\n };\n const a = n / r * 100, h = Math.atan(n / r) * (180 / Math.PI);\n return {\n percentage: a,\n angle: h,\n heightDiff: n,\n horizontalDist: r,\n type: \"slope\"\n };\n }\n // 处理鼠标点击事件\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.length == 0)\n this.points.push(t.point);\n else if (this.points.length == 1) {\n let n = this.engine.measure.annotationData.slopeAnnotation.find((s) => s.isSelect == !0);\n if (n == null)\n return;\n console.log(\"进来了\"), n.point2 = t.point.clone();\n const i = this.calculateSlope(n.point1, n.point2);\n n.slopePercentage = i.percentage, n.slopeAngle = i.angle, n.heightDiff = i.heightDiff, n.horizontalDist = i.horizontalDist, n.text = i.percentage.toFixed(2) + \"% (\" + i.angle.toFixed(2) + \"°)\", n.isSelect = !1, this.points = [], this.engine.events.trigger(Se.MeasureChanged, n);\n }\n }\n // 处理鼠标移动事件\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (t != null && this.points.length == 1) {\n let n = this.engine.measure.annotationData.slopeAnnotation.find((s) => s.isSelect == !0);\n n == null && (n = {\n id: bt(),\n point1: this.points[0].clone(),\n // 起点\n point2: t.point.clone(),\n // 终点(实时更新)\n slopePercentage: 0,\n slopeAngle: 0,\n heightDiff: 0,\n horizontalDist: 0,\n text: \"0.00% (0.00°)\",\n isSelect: !0,\n type: \"slope\"\n }, this.engine.measure.annotationData.slopeAnnotation.push(n)), n.point2 = t.point.clone();\n const i = this.calculateSlope(n.point1, n.point2);\n n.slopePercentage = i.percentage, n.slopeAngle = i.angle, n.heightDiff = i.heightDiff, n.horizontalDist = i.horizontalDist, n.text = i.percentage.toFixed(2) + \"% (\" + i.angle.toFixed(2) + \"°)\";\n }\n }\n}\nclass wd {\n isActive = !1;\n engine;\n clearHeightMeasure;\n distanceMeasure;\n clearDistanceMeasure;\n elevationMeasure;\n pointMeasure;\n angleMeasure;\n areaMeasure;\n slopeMeasure;\n tools;\n annotationContainer;\n // 存储标注信息\n annotationData = {\n normalAnnotation: [],\n textAnnotation: [],\n coordinateAnnotation: [],\n angleAnnotation: [],\n distanceAnnotation: [],\n areaAnnotation: [],\n slopeAnnotation: [],\n elevationAnnotation: [],\n volumeAnnotation: []\n };\n constructor(e) {\n this.engine = e, this.clearHeightMeasure = new hd(e), this.distanceMeasure = new ud(e), this.clearDistanceMeasure = new dd(e), this.elevationMeasure = new fd(e), this.pointMeasure = new pd(e), this.angleMeasure = new md(e), this.areaMeasure = new gd(e), this.slopeMeasure = new yd(e), this.tools = new St(e), this.annotationContainer = document.createElement(\"div\"), this.annotationContainer.className = \"annotation-container\", e.container.appendChild(this.annotationContainer);\n }\n active() {\n this.isActive = !0, this.engine.modelEdge.loadModelEdge(), this.tools.active();\n }\n disActive() {\n this.tools.disActive(), this.clearAll(), this.isActive = !1, this.clearHeightMeasure.disActive(), this.distanceMeasure.disActive(), this.clearDistanceMeasure.disActive(), this.elevationMeasure.disActive(), this.pointMeasure.disActive(), this.angleMeasure.disActive(), this.areaMeasure.disActive(), this.slopeMeasure.disActive(), this.engine.interactionModule.init(), this.engine.interactionModule.active();\n }\n // 清空所有点的测量\n clearAllPoints() {\n this.clearHeightMeasure.clearAllPoints(), this.distanceMeasure.clearAllPoints(), this.clearDistanceMeasure.clearAllPoints(), this.elevationMeasure.clearAllPoints(), this.pointMeasure.clearAllPoints(), this.angleMeasure.clearAllPoints(), this.areaMeasure.clearAllPoints(), this.slopeMeasure.clearAllPoints();\n }\n // 清除所有测量\n clearAll() {\n e(this.annotationData.normalAnnotation), e(this.annotationData.textAnnotation), e(this.annotationData.coordinateAnnotation), e(this.annotationData.angleAnnotation), e(this.annotationData.distanceAnnotation), e(this.annotationData.areaAnnotation), e(this.annotationData.slopeAnnotation), e(this.annotationData.elevationAnnotation), e(this.annotationData.volumeAnnotation);\n function e(t) {\n for (let n = 0; n < t.length; n++)\n t[n].container.remove();\n t = [];\n }\n }\n // 保存设置\n saveSetting(e) {\n this.tools.saveSetting(e);\n }\n // 获取设置\n getSetting() {\n return this.tools.getSetting();\n }\n // 更新标注\n update() {\n this.isActive && this.tools.drawNormalAnnotation();\n }\n}\nconst Oa = 0, xd = 1, _d = 2, so = 2, ps = 1.25, ro = 1, Oe = 32, Ae = Oe / 4, Ba = 65535, vd = Math.pow(2, -24), ms = Symbol(\"SKIP_GENERATION\");\nfunction bd(o) {\n return o.index ? o.index.count : o.attributes.position.count;\n}\nfunction nn(o) {\n return bd(o) / 3;\n}\nfunction Md(o, e = ArrayBuffer) {\n return o > 65535 ? new Uint32Array(new e(4 * o)) : new Uint16Array(new e(2 * o));\n}\nfunction Sd(o, e) {\n if (!o.index) {\n const t = o.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = Md(t, n);\n o.setIndex(new ut(i, 1));\n for (let s = 0; s < t; s++)\n i[s] = s;\n }\n}\nfunction Na(o, e) {\n const t = nn(o), n = e || o.drawRange, i = n.start / 3, s = (n.start + n.count) / 3, r = Math.max(0, i), a = Math.min(t, s) - r;\n return [{\n offset: Math.floor(r),\n count: Math.floor(a)\n }];\n}\nfunction oo(o, e) {\n if (!o.groups || !o.groups.length)\n return Na(o, e);\n const t = [], n = e || o.drawRange, i = n.start / 3, s = (n.start + n.count) / 3, r = nn(o), a = [];\n for (const c of o.groups) {\n const { start: u, count: m } = c, f = u / 3, d = isFinite(m) ? m : r * 3 - u, p = (u + d) / 3;\n f < s && p > i && (a.push({ pos: Math.max(i, f), isStart: !0 }), a.push({ pos: Math.min(s, p), isStart: !1 }));\n }\n a.sort((c, u) => c.pos !== u.pos ? c.pos - u.pos : c.type === \"end\" ? -1 : 1);\n let l = 0, h = null;\n for (const c of a) {\n const u = c.pos;\n l !== 0 && u !== h && t.push({\n offset: h,\n count: u - h\n }), l += c.isStart ? 1 : -1, h = u;\n }\n return t;\n}\nfunction gs(o, e, t, n, i) {\n let s = 1 / 0, r = 1 / 0, a = 1 / 0, l = -1 / 0, h = -1 / 0, c = -1 / 0, u = 1 / 0, m = 1 / 0, f = 1 / 0, d = -1 / 0, p = -1 / 0, g = -1 / 0;\n const y = o.offset || 0;\n for (let w = (e - y) * 6, x = (e + t - y) * 6; w < x; w += 6) {\n const _ = o[w + 0], b = o[w + 1], E = _ - b, A = _ + b;\n E < s && (s = E), A > l && (l = A), _ < u && (u = _), _ > d && (d = _);\n const P = o[w + 2], C = o[w + 3], D = P - C, I = P + C;\n D < r && (r = D), I > h && (h = I), P < m && (m = P), P > p && (p = P);\n const T = o[w + 4], R = o[w + 5], v = T - R, z = T + R;\n v < a && (a = v), z > c && (c = z), T < f && (f = T), T > g && (g = T);\n }\n n[0] = s, n[1] = r, n[2] = a, n[3] = l, n[4] = h, n[5] = c, i[0] = u, i[1] = m, i[2] = f, i[3] = d, i[4] = p, i[5] = g;\n}\nfunction ao(o, e, t = null, n = null, i = null) {\n const s = o.attributes.position, r = o.index ? o.index.array : null, a = s.normalized;\n if (i === null)\n i = new Float32Array(t * 6), i.offset = e;\n else if (e < 0 || t + e > i.length / 6)\n throw new Error(\"MeshBVH: compute triangle bounds range is invalid.\");\n const l = s.array, h = s.offset || 0;\n let c = 3;\n s.isInterleavedBufferAttribute && (c = s.data.stride);\n const u = [\"getX\", \"getY\", \"getZ\"], m = i.offset;\n for (let f = e, d = e + t; f < d; f++) {\n const g = (n ? n[f] : f) * 3, y = (f - m) * 6;\n let w = g + 0, x = g + 1, _ = g + 2;\n r && (w = r[w], x = r[x], _ = r[_]), a || (w = w * c + h, x = x * c + h, _ = _ * c + h);\n for (let b = 0; b < 3; b++) {\n let E, A, P;\n a ? (E = s[u[b]](w), A = s[u[b]](x), P = s[u[b]](_)) : (E = l[w + b], A = l[x + b], P = l[_ + b]);\n let C = E;\n A < C && (C = A), P < C && (C = P);\n let D = E;\n A > D && (D = A), P > D && (D = P);\n const I = (D - C) / 2, T = b * 2;\n i[y + T + 0] = C + I, i[y + T + 1] = I + (Math.abs(C) + I) * vd;\n }\n }\n return i;\n}\nfunction we(o, e, t) {\n return t.min.x = e[o], t.min.y = e[o + 1], t.min.z = e[o + 2], t.max.x = e[o + 3], t.max.y = e[o + 4], t.max.z = e[o + 5], t;\n}\nfunction lo(o) {\n let e = -1, t = -1 / 0;\n for (let n = 0; n < 3; n++) {\n const i = o[n + 3] - o[n];\n i > t && (t = i, e = n);\n }\n return e;\n}\nfunction co(o, e) {\n e.set(o);\n}\nfunction ho(o, e, t) {\n let n, i;\n for (let s = 0; s < 3; s++) {\n const r = s + 3;\n n = o[s], i = e[s], t[s] = n < i ? n : i, n = o[r], i = e[r], t[r] = n > i ? n : i;\n }\n}\nfunction li(o, e, t) {\n for (let n = 0; n < 3; n++) {\n const i = e[o + 2 * n], s = e[o + 2 * n + 1], r = i - s, a = i + s;\n r < t[n] && (t[n] = r), a > t[n + 3] && (t[n + 3] = a);\n }\n}\nfunction Cn(o) {\n const e = o[3] - o[0], t = o[4] - o[1], n = o[5] - o[2];\n return 2 * (e * t + t * n + n * e);\n}\nconst yt = 32, Td = (o, e) => o.candidate - e.candidate, Ct = /* @__PURE__ */ new Array(yt).fill().map(() => ({\n count: 0,\n bounds: new Float32Array(6),\n rightCacheBounds: new Float32Array(6),\n leftCacheBounds: new Float32Array(6),\n candidate: 0\n})), ci = /* @__PURE__ */ new Float32Array(6);\nfunction Ed(o, e, t, n, i, s) {\n let r = -1, a = 0;\n if (s === Oa)\n r = lo(e), r !== -1 && (a = (e[r] + e[r + 3]) / 2);\n else if (s === xd)\n r = lo(o), r !== -1 && (a = Ad(t, n, i, r));\n else if (s === _d) {\n const l = Cn(o);\n let h = ps * i;\n const c = t.offset || 0, u = (n - c) * 6, m = (n + i - c) * 6;\n for (let f = 0; f < 3; f++) {\n const d = e[f], y = (e[f + 3] - d) / yt;\n if (i < yt / 4) {\n const w = [...Ct];\n w.length = i;\n let x = 0;\n for (let b = u; b < m; b += 6, x++) {\n const E = w[x];\n E.candidate = t[b + 2 * f], E.count = 0;\n const {\n bounds: A,\n leftCacheBounds: P,\n rightCacheBounds: C\n } = E;\n for (let D = 0; D < 3; D++)\n C[D] = 1 / 0, C[D + 3] = -1 / 0, P[D] = 1 / 0, P[D + 3] = -1 / 0, A[D] = 1 / 0, A[D + 3] = -1 / 0;\n li(b, t, A);\n }\n w.sort(Td);\n let _ = i;\n for (let b = 0; b < _; b++) {\n const E = w[b];\n for (; b + 1 < _ && w[b + 1].candidate === E.candidate; )\n w.splice(b + 1, 1), _--;\n }\n for (let b = u; b < m; b += 6) {\n const E = t[b + 2 * f];\n for (let A = 0; A < _; A++) {\n const P = w[A];\n E >= P.candidate ? li(b, t, P.rightCacheBounds) : (li(b, t, P.leftCacheBounds), P.count++);\n }\n }\n for (let b = 0; b < _; b++) {\n const E = w[b], A = E.count, P = i - E.count, C = E.leftCacheBounds, D = E.rightCacheBounds;\n let I = 0;\n A !== 0 && (I = Cn(C) / l);\n let T = 0;\n P !== 0 && (T = Cn(D) / l);\n const R = ro + ps * (I * A + T * P);\n R < h && (r = f, h = R, a = E.candidate);\n }\n } else {\n for (let _ = 0; _ < yt; _++) {\n const b = Ct[_];\n b.count = 0, b.candidate = d + y + _ * y;\n const E = b.bounds;\n for (let A = 0; A < 3; A++)\n E[A] = 1 / 0, E[A + 3] = -1 / 0;\n }\n for (let _ = u; _ < m; _ += 6) {\n let A = ~~((t[_ + 2 * f] - d) / y);\n A >= yt && (A = yt - 1);\n const P = Ct[A];\n P.count++, li(_, t, P.bounds);\n }\n const w = Ct[yt - 1];\n co(w.bounds, w.rightCacheBounds);\n for (let _ = yt - 2; _ >= 0; _--) {\n const b = Ct[_], E = Ct[_ + 1];\n ho(b.bounds, E.rightCacheBounds, b.rightCacheBounds);\n }\n let x = 0;\n for (let _ = 0; _ < yt - 1; _++) {\n const b = Ct[_], E = b.count, A = b.bounds, C = Ct[_ + 1].rightCacheBounds;\n E !== 0 && (x === 0 ? co(A, ci) : ho(A, ci, ci)), x += E;\n let D = 0, I = 0;\n x !== 0 && (D = Cn(ci) / l);\n const T = i - x;\n T !== 0 && (I = Cn(C) / l);\n const R = ro + ps * (D * x + I * T);\n R < h && (r = f, h = R, a = b.candidate);\n }\n }\n }\n } else\n console.warn(`MeshBVH: Invalid build strategy value ${s} used.`);\n return { axis: r, pos: a };\n}\nfunction Ad(o, e, t, n) {\n let i = 0;\n const s = o.offset;\n for (let r = e, a = e + t; r < a; r++)\n i += o[(r - s) * 6 + n * 2];\n return i / t;\n}\nclass ys {\n constructor() {\n this.boundingData = new Float32Array(6);\n }\n}\nfunction Cd(o, e, t, n, i, s) {\n let r = n, a = n + i - 1;\n const l = s.pos, h = s.axis * 2, c = t.offset || 0;\n for (; ; ) {\n for (; r <= a && t[(r - c) * 6 + h] < l; )\n r++;\n for (; r <= a && t[(a - c) * 6 + h] >= l; )\n a--;\n if (r < a) {\n for (let u = 0; u < 3; u++) {\n let m = e[r * 3 + u];\n e[r * 3 + u] = e[a * 3 + u], e[a * 3 + u] = m;\n }\n for (let u = 0; u < 6; u++) {\n const m = r - c, f = a - c, d = t[m * 6 + u];\n t[m * 6 + u] = t[f * 6 + u], t[f * 6 + u] = d;\n }\n r++, a--;\n } else\n return r;\n }\n}\nfunction Pd(o, e, t, n, i, s) {\n let r = n, a = n + i - 1;\n const l = s.pos, h = s.axis * 2, c = t.offset || 0;\n for (; ; ) {\n for (; r <= a && t[(r - c) * 6 + h] < l; )\n r++;\n for (; r <= a && t[(a - c) * 6 + h] >= l; )\n a--;\n if (r < a) {\n let u = o[r];\n o[r] = o[a], o[a] = u;\n for (let m = 0; m < 6; m++) {\n const f = r - c, d = a - c, p = t[f * 6 + m];\n t[f * 6 + m] = t[d * 6 + m], t[d * 6 + m] = p;\n }\n r++, a--;\n } else\n return r;\n }\n}\nlet Fa, Li, Ys, Ua;\nconst Rd = Math.pow(2, 32);\nfunction Ks(o) {\n return \"count\" in o ? 1 : 1 + Ks(o.left) + Ks(o.right);\n}\nfunction Dd(o, e, t) {\n return Fa = new Float32Array(t), Li = new Uint32Array(t), Ys = new Uint16Array(t), Ua = new Uint8Array(t), $s(o, e);\n}\nfunction $s(o, e) {\n const t = o / 4, n = o / 2, i = \"count\" in e, s = e.boundingData;\n for (let r = 0; r < 6; r++)\n Fa[t + r] = s[r];\n if (i)\n return e.buffer ? (Ua.set(new Uint8Array(e.buffer), o), o + e.buffer.byteLength) : (Li[t + 6] = e.offset, Ys[n + 14] = e.count, Ys[n + 15] = Ba, o + Oe);\n {\n const { left: r, right: a, splitAxis: l } = e, h = o + Oe;\n let c = $s(h, r);\n const u = o / Oe, f = c / Oe - u;\n if (f > Rd)\n throw new Error(\"MeshBVH: Cannot store relative child node offset greater than 32 bits.\");\n return Li[t + 6] = f, Li[t + 7] = l, $s(c, a);\n }\n}\nfunction kd(o, e, t) {\n const i = (o.index ? o.index.count : o.attributes.position.count) / 3 > 2 ** 16, s = t.reduce((c, u) => c + u.count, 0), r = i ? 4 : 2, a = e ? new SharedArrayBuffer(s * r) : new ArrayBuffer(s * r), l = i ? new Uint32Array(a) : new Uint16Array(a);\n let h = 0;\n for (let c = 0; c < t.length; c++) {\n const { offset: u, count: m } = t[c];\n for (let f = 0; f < m; f++)\n l[h + f] = u + f;\n h += m;\n }\n return l;\n}\nfunction Id(o, e, t, n, i) {\n const {\n maxDepth: s,\n verbose: r,\n maxLeafTris: a,\n strategy: l,\n onProgress: h,\n indirect: c\n } = i, u = o._indirectBuffer, m = o.geometry, f = m.index ? m.index.array : null, d = c ? Pd : Cd, p = nn(m), g = new Float32Array(6);\n let y = !1;\n const w = new ys();\n return gs(e, t, n, w.boundingData, g), _(w, t, n, g), w;\n function x(b) {\n h && h(b / p);\n }\n function _(b, E, A, P = null, C = 0) {\n if (!y && C >= s && (y = !0, r && (console.warn(`MeshBVH: Max depth of ${s} reached when generating BVH. Consider increasing maxDepth.`), console.warn(m))), A <= a || C >= s)\n return x(E + A), b.offset = E, b.count = A, b;\n const D = Ed(b.boundingData, P, e, E, A, l);\n if (D.axis === -1)\n return x(E + A), b.offset = E, b.count = A, b;\n const I = d(u, f, e, E, A, D);\n if (I === E || I === E + A)\n x(E + A), b.offset = E, b.count = A;\n else {\n b.splitAxis = D.axis;\n const T = new ys(), R = E, v = I - E;\n b.left = T, gs(e, R, v, T.boundingData, g), _(T, R, v, g, C + 1);\n const z = new ys(), H = I, V = A - v;\n b.right = z, gs(e, H, V, z.boundingData, g), _(z, H, V, g, C + 1);\n }\n return b;\n }\n}\nfunction Ld(o, e) {\n const t = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, n = o.geometry;\n let i, s;\n if (e.indirect) {\n const r = oo(n, e.range), a = kd(n, e.useSharedArrayBuffer, r);\n o._indirectBuffer = a, i = ao(n, 0, a.length, a), s = [{ offset: 0, count: a.length }];\n } else {\n Sd(n, e);\n const r = Na(n, e.range)[0];\n i = ao(n, r.offset, r.count), s = oo(n, e.range);\n }\n o._roots = s.map((r) => {\n const a = Id(o, i, r.offset, r.count, e), l = Ks(a), h = new t(Oe * l);\n return Dd(0, a, h), h;\n });\n}\nclass Mt {\n constructor() {\n this.min = 1 / 0, this.max = -1 / 0;\n }\n setFromPointsField(e, t) {\n let n = 1 / 0, i = -1 / 0;\n for (let s = 0, r = e.length; s < r; s++) {\n const l = e[s][t];\n n = l < n ? l : n, i = l > i ? l : i;\n }\n this.min = n, this.max = i;\n }\n setFromPoints(e, t) {\n let n = 1 / 0, i = -1 / 0;\n for (let s = 0, r = t.length; s < r; s++) {\n const a = t[s], l = e.dot(a);\n n = l < n ? l : n, i = l > i ? l : i;\n }\n this.min = n, this.max = i;\n }\n isSeparated(e) {\n return this.min > e.max || e.min > this.max;\n }\n}\nMt.prototype.setFromBox = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new K();\n return function(t, n) {\n const i = n.min, s = n.max;\n let r = 1 / 0, a = -1 / 0;\n for (let l = 0; l <= 1; l++)\n for (let h = 0; h <= 1; h++)\n for (let c = 0; c <= 1; c++) {\n o.x = i.x * l + s.x * (1 - l), o.y = i.y * h + s.y * (1 - h), o.z = i.z * c + s.z * (1 - c);\n const u = t.dot(o);\n r = Math.min(u, r), a = Math.max(u, a);\n }\n this.min = r, this.max = a;\n };\n})();\nconst zd = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new K(), e = /* @__PURE__ */ new K(), t = /* @__PURE__ */ new K();\n return function(i, s, r) {\n const a = i.start, l = o, h = s.start, c = e;\n t.subVectors(a, h), o.subVectors(i.end, i.start), e.subVectors(s.end, s.start);\n const u = t.dot(c), m = c.dot(l), f = c.dot(c), d = t.dot(l), g = l.dot(l) * f - m * m;\n let y, w;\n g !== 0 ? y = (u * m - d * f) / g : y = 0, w = (u + y * m) / f, r.x = y, r.y = w;\n };\n})(), mr = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new ue(), e = /* @__PURE__ */ new K(), t = /* @__PURE__ */ new K();\n return function(i, s, r, a) {\n zd(i, s, o);\n let l = o.x, h = o.y;\n if (l >= 0 && l <= 1 && h >= 0 && h <= 1) {\n i.at(l, r), s.at(h, a);\n return;\n } else if (l >= 0 && l <= 1) {\n h < 0 ? s.at(0, a) : s.at(1, a), i.closestPointToPoint(a, !0, r);\n return;\n } else if (h >= 0 && h <= 1) {\n l < 0 ? i.at(0, r) : i.at(1, r), s.closestPointToPoint(r, !0, a);\n return;\n } else {\n let c;\n l < 0 ? c = i.start : c = i.end;\n let u;\n h < 0 ? u = s.start : u = s.end;\n const m = e, f = t;\n if (i.closestPointToPoint(u, !0, e), s.closestPointToPoint(c, !0, t), m.distanceToSquared(u) <= f.distanceToSquared(c)) {\n r.copy(m), a.copy(u);\n return;\n } else {\n r.copy(c), a.copy(f);\n return;\n }\n }\n };\n})(), Od = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new K(), e = /* @__PURE__ */ new K(), t = /* @__PURE__ */ new Xi(), n = /* @__PURE__ */ new Ke();\n return function(s, r) {\n const { radius: a, center: l } = s, { a: h, b: c, c: u } = r;\n if (n.start = h, n.end = c, n.closestPointToPoint(l, !0, o).distanceTo(l) <= a || (n.start = h, n.end = u, n.closestPointToPoint(l, !0, o).distanceTo(l) <= a) || (n.start = c, n.end = u, n.closestPointToPoint(l, !0, o).distanceTo(l) <= a)) return !0;\n const p = r.getPlane(t);\n if (Math.abs(p.distanceToPoint(l)) <= a) {\n const y = p.projectPoint(l, e);\n if (r.containsPoint(y)) return !0;\n }\n return !1;\n };\n})(), Bd = [\"x\", \"y\", \"z\"], wt = 1e-15, uo = wt * wt;\nfunction We(o) {\n return Math.abs(o) < wt;\n}\nclass $e extends Ue {\n constructor(...e) {\n super(...e), this.isExtendedTriangle = !0, this.satAxes = new Array(4).fill().map(() => new K()), this.satBounds = new Array(4).fill().map(() => new Mt()), this.points = [this.a, this.b, this.c], this.plane = new Xi(), this.isDegenerateIntoSegment = !1, this.isDegenerateIntoPoint = !1, this.degenerateSegment = new Ke(), this.needsUpdate = !0;\n }\n intersectsSphere(e) {\n return Od(e, this);\n }\n update() {\n const e = this.a, t = this.b, n = this.c, i = this.points, s = this.satAxes, r = this.satBounds, a = s[0], l = r[0];\n this.getNormal(a), l.setFromPoints(a, i);\n const h = s[1], c = r[1];\n h.subVectors(e, t), c.setFromPoints(h, i);\n const u = s[2], m = r[2];\n u.subVectors(t, n), m.setFromPoints(u, i);\n const f = s[3], d = r[3];\n f.subVectors(n, e), d.setFromPoints(f, i);\n const p = h.length(), g = u.length(), y = f.length();\n this.isDegenerateIntoPoint = !1, this.isDegenerateIntoSegment = !1, p < wt ? g < wt || y < wt ? this.isDegenerateIntoPoint = !0 : (this.isDegenerateIntoSegment = !0, this.degenerateSegment.start.copy(e), this.degenerateSegment.end.copy(n)) : g < wt ? y < wt ? this.isDegenerateIntoPoint = !0 : (this.isDegenerateIntoSegment = !0, this.degenerateSegment.start.copy(t), this.degenerateSegment.end.copy(e)) : y < wt && (this.isDegenerateIntoSegment = !0, this.degenerateSegment.start.copy(n), this.degenerateSegment.end.copy(t)), this.plane.setFromNormalAndCoplanarPoint(a, e), this.needsUpdate = !1;\n }\n}\n$e.prototype.closestPointToSegment = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new K(), e = /* @__PURE__ */ new K(), t = /* @__PURE__ */ new Ke();\n return function(i, s = null, r = null) {\n const { start: a, end: l } = i, h = this.points;\n let c, u = 1 / 0;\n for (let m = 0; m < 3; m++) {\n const f = (m + 1) % 3;\n t.start.copy(h[m]), t.end.copy(h[f]), mr(t, i, o, e), c = o.distanceToSquared(e), c < u && (u = c, s && s.copy(o), r && r.copy(e));\n }\n return this.closestPointToPoint(a, o), c = a.distanceToSquared(o), c < u && (u = c, s && s.copy(o), r && r.copy(a)), this.closestPointToPoint(l, o), c = l.distanceToSquared(o), c < u && (u = c, s && s.copy(o), r && r.copy(l)), Math.sqrt(u);\n };\n})();\n$e.prototype.intersectsTriangle = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new $e(), e = /* @__PURE__ */ new Mt(), t = /* @__PURE__ */ new Mt(), n = /* @__PURE__ */ new K(), i = /* @__PURE__ */ new K(), s = /* @__PURE__ */ new K(), r = /* @__PURE__ */ new K(), a = /* @__PURE__ */ new Ke(), l = /* @__PURE__ */ new Ke(), h = /* @__PURE__ */ new K(), c = /* @__PURE__ */ new ue(), u = /* @__PURE__ */ new ue();\n function m(x, _, b, E) {\n const A = n;\n !x.isDegenerateIntoPoint && !x.isDegenerateIntoSegment ? A.copy(x.plane.normal) : A.copy(_.plane.normal);\n const P = x.satBounds, C = x.satAxes;\n for (let T = 1; T < 4; T++) {\n const R = P[T], v = C[T];\n if (e.setFromPoints(v, _.points), R.isSeparated(e) || (r.copy(A).cross(v), e.setFromPoints(r, x.points), t.setFromPoints(r, _.points), e.isSeparated(t))) return !1;\n }\n const D = _.satBounds, I = _.satAxes;\n for (let T = 1; T < 4; T++) {\n const R = D[T], v = I[T];\n if (e.setFromPoints(v, x.points), R.isSeparated(e) || (r.crossVectors(A, v), e.setFromPoints(r, x.points), t.setFromPoints(r, _.points), e.isSeparated(t))) return !1;\n }\n return b && (E || console.warn(\"ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0.\"), b.start.set(0, 0, 0), b.end.set(0, 0, 0)), !0;\n }\n function f(x, _, b, E, A, P, C, D, I, T, R) {\n let v = C / (C - D);\n T.x = E + (A - E) * v, R.start.subVectors(_, x).multiplyScalar(v).add(x), v = C / (C - I), T.y = E + (P - E) * v, R.end.subVectors(b, x).multiplyScalar(v).add(x);\n }\n function d(x, _, b, E, A, P, C, D, I, T, R) {\n if (A > 0)\n f(x.c, x.a, x.b, E, _, b, I, C, D, T, R);\n else if (P > 0)\n f(x.b, x.a, x.c, b, _, E, D, C, I, T, R);\n else if (D * I > 0 || C != 0)\n f(x.a, x.b, x.c, _, b, E, C, D, I, T, R);\n else if (D != 0)\n f(x.b, x.a, x.c, b, _, E, D, C, I, T, R);\n else if (I != 0)\n f(x.c, x.a, x.b, E, _, b, I, C, D, T, R);\n else\n return !0;\n return !1;\n }\n function p(x, _, b, E) {\n const A = _.degenerateSegment, P = x.plane.distanceToPoint(A.start), C = x.plane.distanceToPoint(A.end);\n return We(P) ? We(C) ? m(x, _, b, E) : (b && (b.start.copy(A.start), b.end.copy(A.start)), x.containsPoint(A.start)) : We(C) ? (b && (b.start.copy(A.end), b.end.copy(A.end)), x.containsPoint(A.end)) : x.plane.intersectLine(A, n) != null ? (b && (b.start.copy(n), b.end.copy(n)), x.containsPoint(n)) : !1;\n }\n function g(x, _, b) {\n const E = _.a;\n return We(x.plane.distanceToPoint(E)) && x.containsPoint(E) ? (b && (b.start.copy(E), b.end.copy(E)), !0) : !1;\n }\n function y(x, _, b) {\n const E = x.degenerateSegment, A = _.a;\n return E.closestPointToPoint(A, !0, n), A.distanceToSquared(n) < uo ? (b && (b.start.copy(A), b.end.copy(A)), !0) : !1;\n }\n function w(x, _, b, E) {\n if (x.isDegenerateIntoSegment)\n if (_.isDegenerateIntoSegment) {\n const A = x.degenerateSegment, P = _.degenerateSegment, C = i, D = s;\n A.delta(C), P.delta(D);\n const I = n.subVectors(P.start, A.start), T = C.x * D.y - C.y * D.x;\n if (We(T))\n return !1;\n const R = (I.x * D.y - I.y * D.x) / T, v = -(C.x * I.y - C.y * I.x) / T;\n if (R < 0 || R > 1 || v < 0 || v > 1)\n return !1;\n const z = A.start.z + C.z * R, H = P.start.z + D.z * v;\n return We(z - H) ? (b && (b.start.copy(A.start).addScaledVector(C, R), b.end.copy(A.start).addScaledVector(C, R)), !0) : !1;\n } else return _.isDegenerateIntoPoint ? y(x, _, b) : p(_, x, b, E);\n else {\n if (x.isDegenerateIntoPoint)\n return _.isDegenerateIntoPoint ? _.a.distanceToSquared(x.a) < uo ? (b && (b.start.copy(x.a), b.end.copy(x.a)), !0) : !1 : _.isDegenerateIntoSegment ? y(_, x, b) : g(_, x, b);\n if (_.isDegenerateIntoPoint)\n return g(x, _, b);\n if (_.isDegenerateIntoSegment)\n return p(x, _, b, E);\n }\n }\n return function(_, b = null, E = !1) {\n this.needsUpdate && this.update(), _.isExtendedTriangle ? _.needsUpdate && _.update() : (o.copy(_), o.update(), _ = o);\n const A = w(this, _, b, E);\n if (A !== void 0)\n return A;\n const P = this.plane, C = _.plane;\n let D = C.distanceToPoint(this.a), I = C.distanceToPoint(this.b), T = C.distanceToPoint(this.c);\n We(D) && (D = 0), We(I) && (I = 0), We(T) && (T = 0);\n const R = D * I, v = D * T;\n if (R > 0 && v > 0)\n return !1;\n let z = P.distanceToPoint(_.a), H = P.distanceToPoint(_.b), V = P.distanceToPoint(_.c);\n We(z) && (z = 0), We(H) && (H = 0), We(V) && (V = 0);\n const te = z * H, G = z * V;\n if (te > 0 && G > 0)\n return !1;\n i.copy(P.normal), s.copy(C.normal);\n const $ = i.cross(s);\n let N = 0, O = Math.abs($.x);\n const Q = Math.abs($.y);\n Q > O && (O = Q, N = 1), Math.abs($.z) > O && (N = 2);\n const q = Bd[N], de = this.a[q], pe = this.b[q], se = this.c[q], oe = _.a[q], he = _.b[q], me = _.c[q];\n if (d(this, de, pe, se, R, v, D, I, T, c, a))\n return m(this, _, b, E);\n if (d(_, oe, he, me, te, G, z, H, V, u, l))\n return m(this, _, b, E);\n if (c.y < c.x) {\n const Te = c.y;\n c.y = c.x, c.x = Te, h.copy(a.start), a.start.copy(a.end), a.end.copy(h);\n }\n if (u.y < u.x) {\n const Te = u.y;\n u.y = u.x, u.x = Te, h.copy(l.start), l.start.copy(l.end), l.end.copy(h);\n }\n return c.y < u.x || u.y < c.x ? !1 : (b && (u.x > c.x ? b.start.copy(l.start) : b.start.copy(a.start), u.y < c.y ? b.end.copy(l.end) : b.end.copy(a.end)), !0);\n };\n})();\n$e.prototype.distanceToPoint = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new K();\n return function(t) {\n return this.closestPointToPoint(t, o), t.distanceTo(o);\n };\n})();\n$e.prototype.distanceToTriangle = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new K(), e = /* @__PURE__ */ new K(), t = [\"a\", \"b\", \"c\"], n = /* @__PURE__ */ new Ke(), i = /* @__PURE__ */ new Ke();\n return function(r, a = null, l = null) {\n const h = a || l ? n : null;\n if (this.intersectsTriangle(r, h))\n return (a || l) && (a && h.getCenter(a), l && h.getCenter(l)), 0;\n let c = 1 / 0;\n for (let u = 0; u < 3; u++) {\n let m;\n const f = t[u], d = r[f];\n this.closestPointToPoint(d, o), m = d.distanceToSquared(o), m < c && (c = m, a && a.copy(o), l && l.copy(d));\n const p = this[f];\n r.closestPointToPoint(p, o), m = p.distanceToSquared(o), m < c && (c = m, a && a.copy(p), l && l.copy(o));\n }\n for (let u = 0; u < 3; u++) {\n const m = t[u], f = t[(u + 1) % 3];\n n.set(this[m], this[f]);\n for (let d = 0; d < 3; d++) {\n const p = t[d], g = t[(d + 1) % 3];\n i.set(r[p], r[g]), mr(n, i, o, e);\n const y = o.distanceToSquared(e);\n y < c && (c = y, a && a.copy(o), l && l.copy(e));\n }\n }\n return Math.sqrt(c);\n };\n})();\nclass Be {\n constructor(e, t, n) {\n this.isOrientedBox = !0, this.min = new K(), this.max = new K(), this.matrix = new Me(), this.invMatrix = new Me(), this.points = new Array(8).fill().map(() => new K()), this.satAxes = new Array(3).fill().map(() => new K()), this.satBounds = new Array(3).fill().map(() => new Mt()), this.alignedSatBounds = new Array(3).fill().map(() => new Mt()), this.needsUpdate = !1, e && this.min.copy(e), t && this.max.copy(t), n && this.matrix.copy(n);\n }\n set(e, t, n) {\n this.min.copy(e), this.max.copy(t), this.matrix.copy(n), this.needsUpdate = !0;\n }\n copy(e) {\n this.min.copy(e.min), this.max.copy(e.max), this.matrix.copy(e.matrix), this.needsUpdate = !0;\n }\n}\nBe.prototype.update = /* @__PURE__ */ (function() {\n return function() {\n const e = this.matrix, t = this.min, n = this.max, i = this.points;\n for (let h = 0; h <= 1; h++)\n for (let c = 0; c <= 1; c++)\n for (let u = 0; u <= 1; u++) {\n const m = 1 * h | 2 * c | 4 * u, f = i[m];\n f.x = h ? n.x : t.x, f.y = c ? n.y : t.y, f.z = u ? n.z : t.z, f.applyMatrix4(e);\n }\n const s = this.satBounds, r = this.satAxes, a = i[0];\n for (let h = 0; h < 3; h++) {\n const c = r[h], u = s[h], m = 1 << h, f = i[m];\n c.subVectors(a, f), u.setFromPoints(c, i);\n }\n const l = this.alignedSatBounds;\n l[0].setFromPointsField(i, \"x\"), l[1].setFromPointsField(i, \"y\"), l[2].setFromPointsField(i, \"z\"), this.invMatrix.copy(this.matrix).invert(), this.needsUpdate = !1;\n };\n})();\nBe.prototype.intersectsBox = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new Mt();\n return function(t) {\n this.needsUpdate && this.update();\n const n = t.min, i = t.max, s = this.satBounds, r = this.satAxes, a = this.alignedSatBounds;\n if (o.min = n.x, o.max = i.x, a[0].isSeparated(o) || (o.min = n.y, o.max = i.y, a[1].isSeparated(o)) || (o.min = n.z, o.max = i.z, a[2].isSeparated(o))) return !1;\n for (let l = 0; l < 3; l++) {\n const h = r[l], c = s[l];\n if (o.setFromBox(h, t), c.isSeparated(o)) return !1;\n }\n return !0;\n };\n})();\nBe.prototype.intersectsTriangle = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new $e(), e = /* @__PURE__ */ new Array(3), t = /* @__PURE__ */ new Mt(), n = /* @__PURE__ */ new Mt(), i = /* @__PURE__ */ new K();\n return function(r) {\n this.needsUpdate && this.update(), r.isExtendedTriangle ? r.needsUpdate && r.update() : (o.copy(r), o.update(), r = o);\n const a = this.satBounds, l = this.satAxes;\n e[0] = r.a, e[1] = r.b, e[2] = r.c;\n for (let m = 0; m < 3; m++) {\n const f = a[m], d = l[m];\n if (t.setFromPoints(d, e), f.isSeparated(t)) return !1;\n }\n const h = r.satBounds, c = r.satAxes, u = this.points;\n for (let m = 0; m < 3; m++) {\n const f = h[m], d = c[m];\n if (t.setFromPoints(d, u), f.isSeparated(t)) return !1;\n }\n for (let m = 0; m < 3; m++) {\n const f = l[m];\n for (let d = 0; d < 4; d++) {\n const p = c[d];\n if (i.crossVectors(f, p), t.setFromPoints(i, e), n.setFromPoints(i, u), t.isSeparated(n)) return !1;\n }\n }\n return !0;\n };\n})();\nBe.prototype.closestPointToPoint = /* @__PURE__ */ (function() {\n return function(e, t) {\n return this.needsUpdate && this.update(), t.copy(e).applyMatrix4(this.invMatrix).clamp(this.min, this.max).applyMatrix4(this.matrix), t;\n };\n})();\nBe.prototype.distanceToPoint = (function() {\n const o = new K();\n return function(t) {\n return this.closestPointToPoint(t, o), t.distanceTo(o);\n };\n})();\nBe.prototype.distanceToBox = /* @__PURE__ */ (function() {\n const o = [\"x\", \"y\", \"z\"], e = /* @__PURE__ */ new Array(12).fill().map(() => new Ke()), t = /* @__PURE__ */ new Array(12).fill().map(() => new Ke()), n = /* @__PURE__ */ new K(), i = /* @__PURE__ */ new K();\n return function(r, a = 0, l = null, h = null) {\n if (this.needsUpdate && this.update(), this.intersectsBox(r))\n return (l || h) && (r.getCenter(i), this.closestPointToPoint(i, n), r.closestPointToPoint(n, i), l && l.copy(n), h && h.copy(i)), 0;\n const c = a * a, u = r.min, m = r.max, f = this.points;\n let d = 1 / 0;\n for (let g = 0; g < 8; g++) {\n const y = f[g];\n i.copy(y).clamp(u, m);\n const w = y.distanceToSquared(i);\n if (w < d && (d = w, l && l.copy(y), h && h.copy(i), w < c))\n return Math.sqrt(w);\n }\n let p = 0;\n for (let g = 0; g < 3; g++)\n for (let y = 0; y <= 1; y++)\n for (let w = 0; w <= 1; w++) {\n const x = (g + 1) % 3, _ = (g + 2) % 3, b = y << x | w << _, E = 1 << g | y << x | w << _, A = f[b], P = f[E];\n e[p].set(A, P);\n const D = o[g], I = o[x], T = o[_], R = t[p], v = R.start, z = R.end;\n v[D] = u[D], v[I] = y ? u[I] : m[I], v[T] = w ? u[T] : m[I], z[D] = m[D], z[I] = y ? u[I] : m[I], z[T] = w ? u[T] : m[I], p++;\n }\n for (let g = 0; g <= 1; g++)\n for (let y = 0; y <= 1; y++)\n for (let w = 0; w <= 1; w++) {\n i.x = g ? m.x : u.x, i.y = y ? m.y : u.y, i.z = w ? m.z : u.z, this.closestPointToPoint(i, n);\n const x = i.distanceToSquared(n);\n if (x < d && (d = x, l && l.copy(n), h && h.copy(i), x < c))\n return Math.sqrt(x);\n }\n for (let g = 0; g < 12; g++) {\n const y = e[g];\n for (let w = 0; w < 12; w++) {\n const x = t[w];\n mr(y, x, n, i);\n const _ = n.distanceToSquared(i);\n if (_ < d && (d = _, l && l.copy(n), h && h.copy(i), _ < c))\n return Math.sqrt(_);\n }\n }\n return Math.sqrt(d);\n };\n})();\nclass gr {\n constructor(e) {\n this._getNewPrimitive = e, this._primitives = [];\n }\n getPrimitive() {\n const e = this._primitives;\n return e.length === 0 ? this._getNewPrimitive() : e.pop();\n }\n releasePrimitive(e) {\n this._primitives.push(e);\n }\n}\nclass Nd extends gr {\n constructor() {\n super(() => new $e());\n }\n}\nconst qe = /* @__PURE__ */ new Nd();\nfunction Ce(o, e) {\n return e[o + 15] === Ba;\n}\nfunction Ge(o, e) {\n return e[o + 6];\n}\nfunction Ye(o, e) {\n return e[o + 14];\n}\nfunction Pe(o) {\n return o + Ae;\n}\nfunction Re(o, e) {\n const t = e[o + 6];\n return o + t * Ae;\n}\nfunction yr(o, e) {\n return e[o + 7];\n}\nclass Fd {\n constructor() {\n this.float32Array = null, this.uint16Array = null, this.uint32Array = null;\n const e = [];\n let t = null;\n this.setBuffer = (n) => {\n t && e.push(t), t = n, this.float32Array = new Float32Array(n), this.uint16Array = new Uint16Array(n), this.uint32Array = new Uint32Array(n);\n }, this.clearBuffer = () => {\n t = null, this.float32Array = null, this.uint16Array = null, this.uint32Array = null, e.length !== 0 && this.setBuffer(e.pop());\n };\n }\n}\nconst ge = /* @__PURE__ */ new Fd();\nlet kt, mn;\nconst rn = [], hi = /* @__PURE__ */ new gr(() => new ot());\nfunction Ud(o, e, t, n, i, s) {\n kt = hi.getPrimitive(), mn = hi.getPrimitive(), rn.push(kt, mn), ge.setBuffer(o._roots[e]);\n const r = Js(0, o.geometry, t, n, i, s);\n ge.clearBuffer(), hi.releasePrimitive(kt), hi.releasePrimitive(mn), rn.pop(), rn.pop();\n const a = rn.length;\n return a > 0 && (mn = rn[a - 1], kt = rn[a - 2]), r;\n}\nfunction Js(o, e, t, n, i = null, s = 0, r = 0) {\n const { float32Array: a, uint16Array: l, uint32Array: h } = ge;\n let c = o * 2;\n if (Ce(c, l)) {\n const m = Ge(o, h), f = Ye(c, l);\n return we(o, a, kt), n(m, f, !1, r, s + o / Ae, kt);\n } else {\n let D = function(T) {\n const { uint16Array: R, uint32Array: v } = ge;\n let z = T * 2;\n for (; !Ce(z, R); )\n T = Pe(T), z = T * 2;\n return Ge(T, v);\n }, I = function(T) {\n const { uint16Array: R, uint32Array: v } = ge;\n let z = T * 2;\n for (; !Ce(z, R); )\n T = Re(T, v), z = T * 2;\n return Ge(T, v) + Ye(z, R);\n };\n const m = Pe(o), f = Re(o, h);\n let d = m, p = f, g, y, w, x;\n if (i && (w = kt, x = mn, we(d, a, w), we(p, a, x), g = i(w), y = i(x), y < g)) {\n d = f, p = m;\n const T = g;\n g = y, y = T, w = x;\n }\n w || (w = kt, we(d, a, w));\n const _ = Ce(d * 2, l), b = t(w, _, g, r + 1, s + d / Ae);\n let E;\n if (b === so) {\n const T = D(d), v = I(d) - T;\n E = n(T, v, !0, r + 1, s + d / Ae, w);\n } else\n E = b && Js(\n d,\n e,\n t,\n n,\n i,\n s,\n r + 1\n );\n if (E) return !0;\n x = mn, we(p, a, x);\n const A = Ce(p * 2, l), P = t(x, A, y, r + 1, s + p / Ae);\n let C;\n if (P === so) {\n const T = D(p), v = I(p) - T;\n C = n(T, v, !0, r + 1, s + p / Ae, x);\n } else\n C = P && Js(\n p,\n e,\n t,\n n,\n i,\n s,\n r + 1\n );\n return !!C;\n }\n}\nconst Pn = /* @__PURE__ */ new K(), ws = /* @__PURE__ */ new K();\nfunction Vd(o, e, t = {}, n = 0, i = 1 / 0) {\n const s = n * n, r = i * i;\n let a = 1 / 0, l = null;\n if (o.shapecast(\n {\n boundsTraverseOrder: (c) => (Pn.copy(e).clamp(c.min, c.max), Pn.distanceToSquared(e)),\n intersectsBounds: (c, u, m) => m < a && m < r,\n intersectsTriangle: (c, u) => {\n c.closestPointToPoint(e, Pn);\n const m = e.distanceToSquared(Pn);\n return m < a && (ws.copy(Pn), a = m, l = u), m < s;\n }\n }\n ), a === 1 / 0) return null;\n const h = Math.sqrt(a);\n return t.point ? t.point.copy(ws) : t.point = ws.clone(), t.distance = h, t.faceIndex = l, t;\n}\nconst ui = parseInt(ta) >= 169, Hd = parseInt(ta) <= 161, Ht = /* @__PURE__ */ new K(), jt = /* @__PURE__ */ new K(), Gt = /* @__PURE__ */ new K(), di = /* @__PURE__ */ new ue(), fi = /* @__PURE__ */ new ue(), pi = /* @__PURE__ */ new ue(), fo = /* @__PURE__ */ new K(), po = /* @__PURE__ */ new K(), mo = /* @__PURE__ */ new K(), Rn = /* @__PURE__ */ new K();\nfunction jd(o, e, t, n, i, s, r, a) {\n let l;\n if (s === Nl ? l = o.intersectTriangle(n, t, e, !0, i) : l = o.intersectTriangle(e, t, n, s !== qi, i), l === null) return null;\n const h = o.origin.distanceTo(i);\n return h < r || h > a ? null : {\n distance: h,\n point: i.clone()\n };\n}\nfunction go(o, e, t, n, i, s, r, a, l, h, c) {\n Ht.fromBufferAttribute(e, s), jt.fromBufferAttribute(e, r), Gt.fromBufferAttribute(e, a);\n const u = jd(o, Ht, jt, Gt, Rn, l, h, c);\n if (u) {\n if (n) {\n di.fromBufferAttribute(n, s), fi.fromBufferAttribute(n, r), pi.fromBufferAttribute(n, a), u.uv = new ue();\n const f = Ue.getInterpolation(Rn, Ht, jt, Gt, di, fi, pi, u.uv);\n ui || (u.uv = f);\n }\n if (i) {\n di.fromBufferAttribute(i, s), fi.fromBufferAttribute(i, r), pi.fromBufferAttribute(i, a), u.uv1 = new ue();\n const f = Ue.getInterpolation(Rn, Ht, jt, Gt, di, fi, pi, u.uv1);\n ui || (u.uv1 = f), Hd && (u.uv2 = u.uv1);\n }\n if (t) {\n fo.fromBufferAttribute(t, s), po.fromBufferAttribute(t, r), mo.fromBufferAttribute(t, a), u.normal = new K();\n const f = Ue.getInterpolation(Rn, Ht, jt, Gt, fo, po, mo, u.normal);\n u.normal.dot(o.direction) > 0 && u.normal.multiplyScalar(-1), ui || (u.normal = f);\n }\n const m = {\n a: s,\n b: r,\n c: a,\n normal: new K(),\n materialIndex: 0\n };\n if (Ue.getNormal(Ht, jt, Gt, m.normal), u.face = m, u.faceIndex = s, ui) {\n const f = new K();\n Ue.getBarycoord(Rn, Ht, jt, Gt, f), u.barycoord = f;\n }\n }\n return u;\n}\nfunction yo(o) {\n return o && o.isMaterial ? o.side : o;\n}\nfunction ts(o, e, t, n, i, s, r) {\n const a = n * 3;\n let l = a + 0, h = a + 1, c = a + 2;\n const { index: u, groups: m } = o;\n o.index && (l = u.getX(l), h = u.getX(h), c = u.getX(c));\n const { position: f, normal: d, uv: p, uv1: g } = o.attributes;\n if (Array.isArray(e)) {\n const y = n * 3;\n for (let w = 0, x = m.length; w < x; w++) {\n const { start: _, count: b, materialIndex: E } = m[w];\n if (y >= _ && y < _ + b) {\n const A = yo(e[E]), P = go(t, f, d, p, g, l, h, c, A, s, r);\n if (P)\n if (P.faceIndex = n, P.face.materialIndex = E, i)\n i.push(P);\n else\n return P;\n }\n }\n } else {\n const y = yo(e), w = go(t, f, d, p, g, l, h, c, y, s, r);\n if (w)\n if (w.faceIndex = n, w.face.materialIndex = 0, i)\n i.push(w);\n else\n return w;\n }\n return null;\n}\nfunction be(o, e, t, n) {\n const i = o.a, s = o.b, r = o.c;\n let a = e, l = e + 1, h = e + 2;\n t && (a = t.getX(a), l = t.getX(l), h = t.getX(h)), i.x = n.getX(a), i.y = n.getY(a), i.z = n.getZ(a), s.x = n.getX(l), s.y = n.getY(l), s.z = n.getZ(l), r.x = n.getX(h), r.y = n.getY(h), r.z = n.getZ(h);\n}\nfunction Gd(o, e, t, n, i, s, r, a) {\n const { geometry: l, _indirectBuffer: h } = o;\n for (let c = n, u = n + i; c < u; c++)\n ts(l, e, t, c, s, r, a);\n}\nfunction Wd(o, e, t, n, i, s, r) {\n const { geometry: a, _indirectBuffer: l } = o;\n let h = 1 / 0, c = null;\n for (let u = n, m = n + i; u < m; u++) {\n let f;\n f = ts(a, e, t, u, null, s, r), f && f.distance < h && (c = f, h = f.distance);\n }\n return c;\n}\nfunction Xd(o, e, t, n, i, s, r) {\n const { geometry: a } = t, { index: l } = a, h = a.attributes.position;\n for (let c = o, u = e + o; c < u; c++) {\n let m;\n if (m = c, be(r, m * 3, l, h), r.needsUpdate = !0, n(r, m, i, s))\n return !0;\n }\n return !1;\n}\nfunction Zd(o, e = null) {\n e && Array.isArray(e) && (e = new Set(e));\n const t = o.geometry, n = t.index ? t.index.array : null, i = t.attributes.position;\n let s, r, a, l, h = 0;\n const c = o._roots;\n for (let m = 0, f = c.length; m < f; m++)\n s = c[m], r = new Uint32Array(s), a = new Uint16Array(s), l = new Float32Array(s), u(0, h), h += s.byteLength;\n function u(m, f, d = !1) {\n const p = m * 2;\n if (Ce(p, a)) {\n const g = r[m + 6], y = a[p + 14];\n let w = 1 / 0, x = 1 / 0, _ = 1 / 0, b = -1 / 0, E = -1 / 0, A = -1 / 0;\n for (let P = 3 * g, C = 3 * (g + y); P < C; P++) {\n let D = n[P];\n const I = i.getX(D), T = i.getY(D), R = i.getZ(D);\n I < w && (w = I), I > b && (b = I), T < x && (x = T), T > E && (E = T), R < _ && (_ = R), R > A && (A = R);\n }\n return l[m + 0] !== w || l[m + 1] !== x || l[m + 2] !== _ || l[m + 3] !== b || l[m + 4] !== E || l[m + 5] !== A ? (l[m + 0] = w, l[m + 1] = x, l[m + 2] = _, l[m + 3] = b, l[m + 4] = E, l[m + 5] = A, !0) : !1;\n } else {\n const g = Pe(m), y = Re(m, r);\n let w = d, x = !1, _ = !1;\n if (e) {\n if (!w) {\n const D = g / Ae + f / Oe, I = y / Ae + f / Oe;\n x = e.has(D), _ = e.has(I), w = !x && !_;\n }\n } else\n x = !0, _ = !0;\n const b = w || x, E = w || _;\n let A = !1;\n b && (A = u(g, f, w));\n let P = !1;\n E && (P = u(y, f, w));\n const C = A || P;\n if (C)\n for (let D = 0; D < 3; D++) {\n const I = g + D, T = y + D, R = l[I], v = l[I + 3], z = l[T], H = l[T + 3];\n l[m + D] = R < z ? R : z, l[m + D + 3] = v > H ? v : H;\n }\n return C;\n }\n }\n}\nfunction Ot(o, e, t, n, i) {\n let s, r, a, l, h, c;\n const u = 1 / t.direction.x, m = 1 / t.direction.y, f = 1 / t.direction.z, d = t.origin.x, p = t.origin.y, g = t.origin.z;\n let y = e[o], w = e[o + 3], x = e[o + 1], _ = e[o + 3 + 1], b = e[o + 2], E = e[o + 3 + 2];\n return u >= 0 ? (s = (y - d) * u, r = (w - d) * u) : (s = (w - d) * u, r = (y - d) * u), m >= 0 ? (a = (x - p) * m, l = (_ - p) * m) : (a = (_ - p) * m, l = (x - p) * m), s > l || a > r || ((a > s || isNaN(s)) && (s = a), (l < r || isNaN(r)) && (r = l), f >= 0 ? (h = (b - g) * f, c = (E - g) * f) : (h = (E - g) * f, c = (b - g) * f), s > c || h > r) ? !1 : ((h > s || s !== s) && (s = h), (c < r || r !== r) && (r = c), s <= i && r >= n);\n}\nfunction qd(o, e, t, n, i, s, r, a) {\n const { geometry: l, _indirectBuffer: h } = o;\n for (let c = n, u = n + i; c < u; c++) {\n let m = h ? h[c] : c;\n ts(l, e, t, m, s, r, a);\n }\n}\nfunction Yd(o, e, t, n, i, s, r) {\n const { geometry: a, _indirectBuffer: l } = o;\n let h = 1 / 0, c = null;\n for (let u = n, m = n + i; u < m; u++) {\n let f;\n f = ts(a, e, t, l ? l[u] : u, null, s, r), f && f.distance < h && (c = f, h = f.distance);\n }\n return c;\n}\nfunction Kd(o, e, t, n, i, s, r) {\n const { geometry: a } = t, { index: l } = a, h = a.attributes.position;\n for (let c = o, u = e + o; c < u; c++) {\n let m;\n if (m = t.resolveTriangleIndex(c), be(r, m * 3, l, h), r.needsUpdate = !0, n(r, m, i, s))\n return !0;\n }\n return !1;\n}\nfunction $d(o, e, t, n, i, s, r) {\n ge.setBuffer(o._roots[e]), Qs(0, o, t, n, i, s, r), ge.clearBuffer();\n}\nfunction Qs(o, e, t, n, i, s, r) {\n const { float32Array: a, uint16Array: l, uint32Array: h } = ge, c = o * 2;\n if (Ce(c, l)) {\n const m = Ge(o, h), f = Ye(c, l);\n Gd(e, t, n, m, f, i, s, r);\n } else {\n const m = Pe(o);\n Ot(m, a, n, s, r) && Qs(m, e, t, n, i, s, r);\n const f = Re(o, h);\n Ot(f, a, n, s, r) && Qs(f, e, t, n, i, s, r);\n }\n}\nconst Jd = [\"x\", \"y\", \"z\"];\nfunction Qd(o, e, t, n, i, s) {\n ge.setBuffer(o._roots[e]);\n const r = er(0, o, t, n, i, s);\n return ge.clearBuffer(), r;\n}\nfunction er(o, e, t, n, i, s) {\n const { float32Array: r, uint16Array: a, uint32Array: l } = ge;\n let h = o * 2;\n if (Ce(h, a)) {\n const u = Ge(o, l), m = Ye(h, a);\n return Wd(e, t, n, u, m, i, s);\n } else {\n const u = yr(o, l), m = Jd[u], d = n.direction[m] >= 0;\n let p, g;\n d ? (p = Pe(o), g = Re(o, l)) : (p = Re(o, l), g = Pe(o));\n const w = Ot(p, r, n, i, s) ? er(p, e, t, n, i, s) : null;\n if (w) {\n const b = w.point[m];\n if (d ? b <= r[g + u] : (\n // min bounding data\n b >= r[g + u + 3]\n ))\n return w;\n }\n const _ = Ot(g, r, n, i, s) ? er(g, e, t, n, i, s) : null;\n return w && _ ? w.distance <= _.distance ? w : _ : w || _ || null;\n }\n}\nconst mi = /* @__PURE__ */ new ot(), on = /* @__PURE__ */ new $e(), an = /* @__PURE__ */ new $e(), Dn = /* @__PURE__ */ new Me(), wo = /* @__PURE__ */ new Be(), gi = /* @__PURE__ */ new Be();\nfunction ef(o, e, t, n) {\n ge.setBuffer(o._roots[e]);\n const i = tr(0, o, t, n);\n return ge.clearBuffer(), i;\n}\nfunction tr(o, e, t, n, i = null) {\n const { float32Array: s, uint16Array: r, uint32Array: a } = ge;\n let l = o * 2;\n if (i === null && (t.boundingBox || t.computeBoundingBox(), wo.set(t.boundingBox.min, t.boundingBox.max, n), i = wo), Ce(l, r)) {\n const c = e.geometry, u = c.index, m = c.attributes.position, f = t.index, d = t.attributes.position, p = Ge(o, a), g = Ye(l, r);\n if (Dn.copy(n).invert(), t.boundsTree)\n return we(o, s, gi), gi.matrix.copy(Dn), gi.needsUpdate = !0, t.boundsTree.shapecast({\n intersectsBounds: (w) => gi.intersectsBox(w),\n intersectsTriangle: (w) => {\n w.a.applyMatrix4(n), w.b.applyMatrix4(n), w.c.applyMatrix4(n), w.needsUpdate = !0;\n for (let x = p * 3, _ = (g + p) * 3; x < _; x += 3)\n if (be(an, x, u, m), an.needsUpdate = !0, w.intersectsTriangle(an))\n return !0;\n return !1;\n }\n });\n {\n const y = nn(t);\n for (let w = p * 3, x = (g + p) * 3; w < x; w += 3) {\n be(on, w, u, m), on.a.applyMatrix4(Dn), on.b.applyMatrix4(Dn), on.c.applyMatrix4(Dn), on.needsUpdate = !0;\n for (let _ = 0, b = y * 3; _ < b; _ += 3)\n if (be(an, _, f, d), an.needsUpdate = !0, on.intersectsTriangle(an))\n return !0;\n }\n }\n } else {\n const c = Pe(o), u = Re(o, a);\n return we(c, s, mi), !!(i.intersectsBox(mi) && tr(c, e, t, n, i) || (we(u, s, mi), i.intersectsBox(mi) && tr(u, e, t, n, i)));\n }\n}\nconst yi = /* @__PURE__ */ new Me(), xs = /* @__PURE__ */ new Be(), kn = /* @__PURE__ */ new Be(), tf = /* @__PURE__ */ new K(), nf = /* @__PURE__ */ new K(), sf = /* @__PURE__ */ new K(), rf = /* @__PURE__ */ new K();\nfunction of(o, e, t, n = {}, i = {}, s = 0, r = 1 / 0) {\n e.boundingBox || e.computeBoundingBox(), xs.set(e.boundingBox.min, e.boundingBox.max, t), xs.needsUpdate = !0;\n const a = o.geometry, l = a.attributes.position, h = a.index, c = e.attributes.position, u = e.index, m = qe.getPrimitive(), f = qe.getPrimitive();\n let d = tf, p = nf, g = null, y = null;\n i && (g = sf, y = rf);\n let w = 1 / 0, x = null, _ = null;\n return yi.copy(t).invert(), kn.matrix.copy(yi), o.shapecast(\n {\n boundsTraverseOrder: (b) => xs.distanceToBox(b),\n intersectsBounds: (b, E, A) => A < w && A < r ? (E && (kn.min.copy(b.min), kn.max.copy(b.max), kn.needsUpdate = !0), !0) : !1,\n intersectsRange: (b, E) => {\n if (e.boundsTree)\n return e.boundsTree.shapecast({\n boundsTraverseOrder: (P) => kn.distanceToBox(P),\n intersectsBounds: (P, C, D) => D < w && D < r,\n intersectsRange: (P, C) => {\n for (let D = P, I = P + C; D < I; D++) {\n be(f, 3 * D, u, c), f.a.applyMatrix4(t), f.b.applyMatrix4(t), f.c.applyMatrix4(t), f.needsUpdate = !0;\n for (let T = b, R = b + E; T < R; T++) {\n be(m, 3 * T, h, l), m.needsUpdate = !0;\n const v = m.distanceToTriangle(f, d, g);\n if (v < w && (p.copy(d), y && y.copy(g), w = v, x = T, _ = D), v < s)\n return !0;\n }\n }\n }\n });\n {\n const A = nn(e);\n for (let P = 0, C = A; P < C; P++) {\n be(f, 3 * P, u, c), f.a.applyMatrix4(t), f.b.applyMatrix4(t), f.c.applyMatrix4(t), f.needsUpdate = !0;\n for (let D = b, I = b + E; D < I; D++) {\n be(m, 3 * D, h, l), m.needsUpdate = !0;\n const T = m.distanceToTriangle(f, d, g);\n if (T < w && (p.copy(d), y && y.copy(g), w = T, x = D, _ = P), T < s)\n return !0;\n }\n }\n }\n }\n }\n ), qe.releasePrimitive(m), qe.releasePrimitive(f), w === 1 / 0 ? null : (n.point ? n.point.copy(p) : n.point = p.clone(), n.distance = w, n.faceIndex = x, i && (i.point ? i.point.copy(y) : i.point = y.clone(), i.point.applyMatrix4(yi), p.applyMatrix4(yi), i.distance = p.sub(i.point).length(), i.faceIndex = _), n);\n}\nfunction af(o, e = null) {\n e && Array.isArray(e) && (e = new Set(e));\n const t = o.geometry, n = t.index ? t.index.array : null, i = t.attributes.position;\n let s, r, a, l, h = 0;\n const c = o._roots;\n for (let m = 0, f = c.length; m < f; m++)\n s = c[m], r = new Uint32Array(s), a = new Uint16Array(s), l = new Float32Array(s), u(0, h), h += s.byteLength;\n function u(m, f, d = !1) {\n const p = m * 2;\n if (Ce(p, a)) {\n const g = r[m + 6], y = a[p + 14];\n let w = 1 / 0, x = 1 / 0, _ = 1 / 0, b = -1 / 0, E = -1 / 0, A = -1 / 0;\n for (let P = g, C = g + y; P < C; P++) {\n const D = 3 * o.resolveTriangleIndex(P);\n for (let I = 0; I < 3; I++) {\n let T = D + I;\n T = n ? n[T] : T;\n const R = i.getX(T), v = i.getY(T), z = i.getZ(T);\n R < w && (w = R), R > b && (b = R), v < x && (x = v), v > E && (E = v), z < _ && (_ = z), z > A && (A = z);\n }\n }\n return l[m + 0] !== w || l[m + 1] !== x || l[m + 2] !== _ || l[m + 3] !== b || l[m + 4] !== E || l[m + 5] !== A ? (l[m + 0] = w, l[m + 1] = x, l[m + 2] = _, l[m + 3] = b, l[m + 4] = E, l[m + 5] = A, !0) : !1;\n } else {\n const g = Pe(m), y = Re(m, r);\n let w = d, x = !1, _ = !1;\n if (e) {\n if (!w) {\n const D = g / Ae + f / Oe, I = y / Ae + f / Oe;\n x = e.has(D), _ = e.has(I), w = !x && !_;\n }\n } else\n x = !0, _ = !0;\n const b = w || x, E = w || _;\n let A = !1;\n b && (A = u(g, f, w));\n let P = !1;\n E && (P = u(y, f, w));\n const C = A || P;\n if (C)\n for (let D = 0; D < 3; D++) {\n const I = g + D, T = y + D, R = l[I], v = l[I + 3], z = l[T], H = l[T + 3];\n l[m + D] = R < z ? R : z, l[m + D + 3] = v > H ? v : H;\n }\n return C;\n }\n }\n}\nfunction lf(o, e, t, n, i, s, r) {\n ge.setBuffer(o._roots[e]), nr(0, o, t, n, i, s, r), ge.clearBuffer();\n}\nfunction nr(o, e, t, n, i, s, r) {\n const { float32Array: a, uint16Array: l, uint32Array: h } = ge, c = o * 2;\n if (Ce(c, l)) {\n const m = Ge(o, h), f = Ye(c, l);\n qd(e, t, n, m, f, i, s, r);\n } else {\n const m = Pe(o);\n Ot(m, a, n, s, r) && nr(m, e, t, n, i, s, r);\n const f = Re(o, h);\n Ot(f, a, n, s, r) && nr(f, e, t, n, i, s, r);\n }\n}\nconst cf = [\"x\", \"y\", \"z\"];\nfunction hf(o, e, t, n, i, s) {\n ge.setBuffer(o._roots[e]);\n const r = ir(0, o, t, n, i, s);\n return ge.clearBuffer(), r;\n}\nfunction ir(o, e, t, n, i, s) {\n const { float32Array: r, uint16Array: a, uint32Array: l } = ge;\n let h = o * 2;\n if (Ce(h, a)) {\n const u = Ge(o, l), m = Ye(h, a);\n return Yd(e, t, n, u, m, i, s);\n } else {\n const u = yr(o, l), m = cf[u], d = n.direction[m] >= 0;\n let p, g;\n d ? (p = Pe(o), g = Re(o, l)) : (p = Re(o, l), g = Pe(o));\n const w = Ot(p, r, n, i, s) ? ir(p, e, t, n, i, s) : null;\n if (w) {\n const b = w.point[m];\n if (d ? b <= r[g + u] : (\n // min bounding data\n b >= r[g + u + 3]\n ))\n return w;\n }\n const _ = Ot(g, r, n, i, s) ? ir(g, e, t, n, i, s) : null;\n return w && _ ? w.distance <= _.distance ? w : _ : w || _ || null;\n }\n}\nconst wi = /* @__PURE__ */ new ot(), ln = /* @__PURE__ */ new $e(), cn = /* @__PURE__ */ new $e(), In = /* @__PURE__ */ new Me(), xo = /* @__PURE__ */ new Be(), xi = /* @__PURE__ */ new Be();\nfunction uf(o, e, t, n) {\n ge.setBuffer(o._roots[e]);\n const i = sr(0, o, t, n);\n return ge.clearBuffer(), i;\n}\nfunction sr(o, e, t, n, i = null) {\n const { float32Array: s, uint16Array: r, uint32Array: a } = ge;\n let l = o * 2;\n if (i === null && (t.boundingBox || t.computeBoundingBox(), xo.set(t.boundingBox.min, t.boundingBox.max, n), i = xo), Ce(l, r)) {\n const c = e.geometry, u = c.index, m = c.attributes.position, f = t.index, d = t.attributes.position, p = Ge(o, a), g = Ye(l, r);\n if (In.copy(n).invert(), t.boundsTree)\n return we(o, s, xi), xi.matrix.copy(In), xi.needsUpdate = !0, t.boundsTree.shapecast({\n intersectsBounds: (w) => xi.intersectsBox(w),\n intersectsTriangle: (w) => {\n w.a.applyMatrix4(n), w.b.applyMatrix4(n), w.c.applyMatrix4(n), w.needsUpdate = !0;\n for (let x = p, _ = g + p; x < _; x++)\n if (be(cn, 3 * e.resolveTriangleIndex(x), u, m), cn.needsUpdate = !0, w.intersectsTriangle(cn))\n return !0;\n return !1;\n }\n });\n {\n const y = nn(t);\n for (let w = p, x = g + p; w < x; w++) {\n const _ = e.resolveTriangleIndex(w);\n be(ln, 3 * _, u, m), ln.a.applyMatrix4(In), ln.b.applyMatrix4(In), ln.c.applyMatrix4(In), ln.needsUpdate = !0;\n for (let b = 0, E = y * 3; b < E; b += 3)\n if (be(cn, b, f, d), cn.needsUpdate = !0, ln.intersectsTriangle(cn))\n return !0;\n }\n }\n } else {\n const c = Pe(o), u = Re(o, a);\n return we(c, s, wi), !!(i.intersectsBox(wi) && sr(c, e, t, n, i) || (we(u, s, wi), i.intersectsBox(wi) && sr(u, e, t, n, i)));\n }\n}\nconst _i = /* @__PURE__ */ new Me(), _s = /* @__PURE__ */ new Be(), Ln = /* @__PURE__ */ new Be(), df = /* @__PURE__ */ new K(), ff = /* @__PURE__ */ new K(), pf = /* @__PURE__ */ new K(), mf = /* @__PURE__ */ new K();\nfunction gf(o, e, t, n = {}, i = {}, s = 0, r = 1 / 0) {\n e.boundingBox || e.computeBoundingBox(), _s.set(e.boundingBox.min, e.boundingBox.max, t), _s.needsUpdate = !0;\n const a = o.geometry, l = a.attributes.position, h = a.index, c = e.attributes.position, u = e.index, m = qe.getPrimitive(), f = qe.getPrimitive();\n let d = df, p = ff, g = null, y = null;\n i && (g = pf, y = mf);\n let w = 1 / 0, x = null, _ = null;\n return _i.copy(t).invert(), Ln.matrix.copy(_i), o.shapecast(\n {\n boundsTraverseOrder: (b) => _s.distanceToBox(b),\n intersectsBounds: (b, E, A) => A < w && A < r ? (E && (Ln.min.copy(b.min), Ln.max.copy(b.max), Ln.needsUpdate = !0), !0) : !1,\n intersectsRange: (b, E) => {\n if (e.boundsTree) {\n const A = e.boundsTree;\n return A.shapecast({\n boundsTraverseOrder: (P) => Ln.distanceToBox(P),\n intersectsBounds: (P, C, D) => D < w && D < r,\n intersectsRange: (P, C) => {\n for (let D = P, I = P + C; D < I; D++) {\n const T = A.resolveTriangleIndex(D);\n be(f, 3 * T, u, c), f.a.applyMatrix4(t), f.b.applyMatrix4(t), f.c.applyMatrix4(t), f.needsUpdate = !0;\n for (let R = b, v = b + E; R < v; R++) {\n const z = o.resolveTriangleIndex(R);\n be(m, 3 * z, h, l), m.needsUpdate = !0;\n const H = m.distanceToTriangle(f, d, g);\n if (H < w && (p.copy(d), y && y.copy(g), w = H, x = R, _ = D), H < s)\n return !0;\n }\n }\n }\n });\n } else {\n const A = nn(e);\n for (let P = 0, C = A; P < C; P++) {\n be(f, 3 * P, u, c), f.a.applyMatrix4(t), f.b.applyMatrix4(t), f.c.applyMatrix4(t), f.needsUpdate = !0;\n for (let D = b, I = b + E; D < I; D++) {\n const T = o.resolveTriangleIndex(D);\n be(m, 3 * T, h, l), m.needsUpdate = !0;\n const R = m.distanceToTriangle(f, d, g);\n if (R < w && (p.copy(d), y && y.copy(g), w = R, x = D, _ = P), R < s)\n return !0;\n }\n }\n }\n }\n }\n ), qe.releasePrimitive(m), qe.releasePrimitive(f), w === 1 / 0 ? null : (n.point ? n.point.copy(p) : n.point = p.clone(), n.distance = w, n.faceIndex = x, i && (i.point ? i.point.copy(y) : i.point = y.clone(), i.point.applyMatrix4(_i), p.applyMatrix4(_i), i.distance = p.sub(i.point).length(), i.faceIndex = _), n);\n}\nfunction yf() {\n return typeof SharedArrayBuffer < \"u\";\n}\nconst Fn = /* @__PURE__ */ new ge.constructor(), ji = /* @__PURE__ */ new ge.constructor(), Rt = /* @__PURE__ */ new gr(() => new ot()), hn = /* @__PURE__ */ new ot(), un = /* @__PURE__ */ new ot(), vs = /* @__PURE__ */ new ot(), bs = /* @__PURE__ */ new ot();\nlet Ms = !1;\nfunction wf(o, e, t, n) {\n if (Ms)\n throw new Error(\"MeshBVH: Recursive calls to bvhcast not supported.\");\n Ms = !0;\n const i = o._roots, s = e._roots;\n let r, a = 0, l = 0;\n const h = new Me().copy(t).invert();\n for (let c = 0, u = i.length; c < u; c++) {\n Fn.setBuffer(i[c]), l = 0;\n const m = Rt.getPrimitive();\n we(0, Fn.float32Array, m), m.applyMatrix4(h);\n for (let f = 0, d = s.length; f < d && (ji.setBuffer(s[f]), r = et(\n 0,\n 0,\n t,\n h,\n n,\n a,\n l,\n 0,\n 0,\n m\n ), ji.clearBuffer(), l += s[f].byteLength / Oe, !r); f++)\n ;\n if (Rt.releasePrimitive(m), Fn.clearBuffer(), a += i[c].byteLength / Oe, r)\n break;\n }\n return Ms = !1, r;\n}\nfunction et(o, e, t, n, i, s = 0, r = 0, a = 0, l = 0, h = null, c = !1) {\n let u, m;\n c ? (u = ji, m = Fn) : (u = Fn, m = ji);\n const f = u.float32Array, d = u.uint32Array, p = u.uint16Array, g = m.float32Array, y = m.uint32Array, w = m.uint16Array, x = o * 2, _ = e * 2, b = Ce(x, p), E = Ce(_, w);\n let A = !1;\n if (E && b)\n c ? A = i(\n Ge(e, y),\n Ye(e * 2, w),\n Ge(o, d),\n Ye(o * 2, p),\n l,\n r + e / Ae,\n a,\n s + o / Ae\n ) : A = i(\n Ge(o, d),\n Ye(o * 2, p),\n Ge(e, y),\n Ye(e * 2, w),\n a,\n s + o / Ae,\n l,\n r + e / Ae\n );\n else if (E) {\n const P = Rt.getPrimitive();\n we(e, g, P), P.applyMatrix4(t);\n const C = Pe(o), D = Re(o, d);\n we(C, f, hn), we(D, f, un);\n const I = P.intersectsBox(hn), T = P.intersectsBox(un);\n A = I && et(\n e,\n C,\n n,\n t,\n i,\n r,\n s,\n l,\n a + 1,\n P,\n !c\n ) || T && et(\n e,\n D,\n n,\n t,\n i,\n r,\n s,\n l,\n a + 1,\n P,\n !c\n ), Rt.releasePrimitive(P);\n } else {\n const P = Pe(e), C = Re(e, y);\n we(P, g, vs), we(C, g, bs);\n const D = h.intersectsBox(vs), I = h.intersectsBox(bs);\n if (D && I)\n A = et(\n o,\n P,\n t,\n n,\n i,\n s,\n r,\n a,\n l + 1,\n h,\n c\n ) || et(\n o,\n C,\n t,\n n,\n i,\n s,\n r,\n a,\n l + 1,\n h,\n c\n );\n else if (D)\n if (b)\n A = et(\n o,\n P,\n t,\n n,\n i,\n s,\n r,\n a,\n l + 1,\n h,\n c\n );\n else {\n const T = Rt.getPrimitive();\n T.copy(vs).applyMatrix4(t);\n const R = Pe(o), v = Re(o, d);\n we(R, f, hn), we(v, f, un);\n const z = T.intersectsBox(hn), H = T.intersectsBox(un);\n A = z && et(\n P,\n R,\n n,\n t,\n i,\n r,\n s,\n l,\n a + 1,\n T,\n !c\n ) || H && et(\n P,\n v,\n n,\n t,\n i,\n r,\n s,\n l,\n a + 1,\n T,\n !c\n ), Rt.releasePrimitive(T);\n }\n else if (I)\n if (b)\n A = et(\n o,\n C,\n t,\n n,\n i,\n s,\n r,\n a,\n l + 1,\n h,\n c\n );\n else {\n const T = Rt.getPrimitive();\n T.copy(bs).applyMatrix4(t);\n const R = Pe(o), v = Re(o, d);\n we(R, f, hn), we(v, f, un);\n const z = T.intersectsBox(hn), H = T.intersectsBox(un);\n A = z && et(\n C,\n R,\n n,\n t,\n i,\n r,\n s,\n l,\n a + 1,\n T,\n !c\n ) || H && et(\n C,\n v,\n n,\n t,\n i,\n r,\n s,\n l,\n a + 1,\n T,\n !c\n ), Rt.releasePrimitive(T);\n }\n }\n return A;\n}\nconst vi = /* @__PURE__ */ new Be(), _o = /* @__PURE__ */ new ot(), xf = {\n strategy: Oa,\n maxDepth: 40,\n maxLeafTris: 10,\n useSharedArrayBuffer: !1,\n setBoundingBox: !0,\n onProgress: null,\n indirect: !1,\n verbose: !0,\n range: null\n};\nclass wr {\n static serialize(e, t = {}) {\n t = {\n cloneBuffers: !0,\n ...t\n };\n const n = e.geometry, i = e._roots, s = e._indirectBuffer, r = n.getIndex(), a = {\n version: 1,\n roots: null,\n index: null,\n indirectBuffer: null\n };\n return t.cloneBuffers ? (a.roots = i.map((l) => l.slice()), a.index = r ? r.array.slice() : null, a.indirectBuffer = s ? s.slice() : null) : (a.roots = i, a.index = r ? r.array : null, a.indirectBuffer = s), a;\n }\n static deserialize(e, t, n = {}) {\n n = {\n setIndex: !0,\n indirect: !!e.indirectBuffer,\n ...n\n };\n const { index: i, roots: s, indirectBuffer: r } = e;\n e.version || (console.warn(\n \"MeshBVH.deserialize: Serialization format has been changed and will be fixed up. It is recommended to regenerate any stored serialized data.\"\n ), l(s));\n const a = new wr(t, { ...n, [ms]: !0 });\n if (a._roots = s, a._indirectBuffer = r || null, n.setIndex) {\n const h = t.getIndex();\n if (h === null) {\n const c = new ut(e.index, 1, !1);\n t.setIndex(c);\n } else h.array !== i && (h.array.set(i), h.needsUpdate = !0);\n }\n return a;\n function l(h) {\n for (let c = 0; c < h.length; c++) {\n const u = h[c], m = new Uint32Array(u), f = new Uint16Array(u);\n for (let d = 0, p = u.byteLength / Oe; d < p; d++) {\n const g = Ae * d, y = 2 * g;\n Ce(y, f) || (m[g + 6] = m[g + 6] / Ae - d);\n }\n }\n }\n }\n get indirect() {\n return !!this._indirectBuffer;\n }\n constructor(e, t = {}) {\n if (e.isBufferGeometry) {\n if (e.index && e.index.isInterleavedBufferAttribute)\n throw new Error(\"MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.\");\n } else throw new Error(\"MeshBVH: Only BufferGeometries are supported.\");\n if (t = Object.assign({\n ...xf,\n // undocumented options\n // Whether to skip generating the tree. Used for deserialization.\n [ms]: !1\n }, t), t.useSharedArrayBuffer && !yf())\n throw new Error(\"MeshBVH: SharedArrayBuffer is not available.\");\n this.geometry = e, this._roots = null, this._indirectBuffer = null, t[ms] || (Ld(this, t), !e.boundingBox && t.setBoundingBox && (e.boundingBox = this.getBoundingBox(new ot()))), this.resolveTriangleIndex = t.indirect ? (n) => this._indirectBuffer[n] : (n) => n;\n }\n shiftTriangleOffsets(e) {\n const t = this._indirectBuffer;\n if (t)\n for (let n = 0, i = t.length; n < i; n++)\n t[n] += e;\n else {\n const n = this._roots;\n for (let i = 0; i < n.length; i++) {\n const s = n[i], r = new Uint32Array(s), a = new Uint16Array(s), l = s.byteLength / Oe;\n for (let h = 0; h < l; h++) {\n const c = Ae * h, u = 2 * c;\n Ce(u, a) && (r[c + 6] += e);\n }\n }\n }\n }\n refit(e = null) {\n return (this.indirect ? af : Zd)(this, e);\n }\n traverse(e, t = 0) {\n const n = this._roots[t], i = new Uint32Array(n), s = new Uint16Array(n);\n r(0);\n function r(a, l = 0) {\n const h = a * 2, c = Ce(h, s);\n if (c) {\n const u = i[a + 6], m = s[h + 14];\n e(l, c, new Float32Array(n, a * 4, 6), u, m);\n } else {\n const u = Pe(a), m = Re(a, i), f = yr(a, i);\n e(l, c, new Float32Array(n, a * 4, 6), f) || (r(u, l + 1), r(m, l + 1));\n }\n }\n }\n /* Core Cast Functions */\n raycast(e, t = Us, n = 0, i = 1 / 0) {\n const s = this._roots, r = [], a = this.indirect ? lf : $d;\n for (let l = 0, h = s.length; l < h; l++)\n a(this, l, t, e, r, n, i);\n return r;\n }\n raycastFirst(e, t = Us, n = 0, i = 1 / 0) {\n const s = this._roots;\n let r = null;\n const a = this.indirect ? hf : Qd;\n for (let l = 0, h = s.length; l < h; l++) {\n const c = a(this, l, t, e, n, i);\n c != null && (r == null || c.distance < r.distance) && (r = c);\n }\n return r;\n }\n intersectsGeometry(e, t) {\n let n = !1;\n const i = this._roots, s = this.indirect ? uf : ef;\n for (let r = 0, a = i.length; r < a && (n = s(this, r, e, t), !n); r++)\n ;\n return n;\n }\n shapecast(e) {\n const t = qe.getPrimitive(), n = this.indirect ? Kd : Xd;\n let {\n boundsTraverseOrder: i,\n intersectsBounds: s,\n intersectsRange: r,\n intersectsTriangle: a\n } = e;\n if (r && a) {\n const u = r;\n r = (m, f, d, p, g) => u(m, f, d, p, g) ? !0 : n(m, f, this, a, d, p, t);\n } else r || (a ? r = (u, m, f, d) => n(u, m, this, a, f, d, t) : r = (u, m, f) => f);\n let l = !1, h = 0;\n const c = this._roots;\n for (let u = 0, m = c.length; u < m; u++) {\n const f = c[u];\n if (l = Ud(this, u, s, r, i, h), l)\n break;\n h += f.byteLength / Oe;\n }\n return qe.releasePrimitive(t), l;\n }\n bvhcast(e, t, n) {\n let {\n intersectsRanges: i,\n intersectsTriangles: s\n } = n;\n const r = qe.getPrimitive(), a = this.geometry.index, l = this.geometry.attributes.position, h = this.indirect ? (d) => {\n const p = this.resolveTriangleIndex(d);\n be(r, p * 3, a, l);\n } : (d) => {\n be(r, d * 3, a, l);\n }, c = qe.getPrimitive(), u = e.geometry.index, m = e.geometry.attributes.position, f = e.indirect ? (d) => {\n const p = e.resolveTriangleIndex(d);\n be(c, p * 3, u, m);\n } : (d) => {\n be(c, d * 3, u, m);\n };\n if (s) {\n const d = (p, g, y, w, x, _, b, E) => {\n for (let A = y, P = y + w; A < P; A++) {\n f(A), c.a.applyMatrix4(t), c.b.applyMatrix4(t), c.c.applyMatrix4(t), c.needsUpdate = !0;\n for (let C = p, D = p + g; C < D; C++)\n if (h(C), r.needsUpdate = !0, s(r, c, C, A, x, _, b, E))\n return !0;\n }\n return !1;\n };\n if (i) {\n const p = i;\n i = function(g, y, w, x, _, b, E, A) {\n return p(g, y, w, x, _, b, E, A) ? !0 : d(g, y, w, x, _, b, E, A);\n };\n } else\n i = d;\n }\n return wf(this, e, t, i);\n }\n /* Derived Cast Functions */\n intersectsBox(e, t) {\n return vi.set(e.min, e.max, t), vi.needsUpdate = !0, this.shapecast(\n {\n intersectsBounds: (n) => vi.intersectsBox(n),\n intersectsTriangle: (n) => vi.intersectsTriangle(n)\n }\n );\n }\n intersectsSphere(e) {\n return this.shapecast(\n {\n intersectsBounds: (t) => e.intersectsBox(t),\n intersectsTriangle: (t) => t.intersectsSphere(e)\n }\n );\n }\n closestPointToGeometry(e, t, n = {}, i = {}, s = 0, r = 1 / 0) {\n return (this.indirect ? gf : of)(\n this,\n e,\n t,\n n,\n i,\n s,\n r\n );\n }\n closestPointToPoint(e, t = {}, n = 0, i = 1 / 0) {\n return Vd(\n this,\n e,\n t,\n n,\n i\n );\n }\n getBoundingBox(e) {\n return e.makeEmpty(), this._roots.forEach((n) => {\n we(0, new Float32Array(n), _o), e.union(_o);\n }), e;\n }\n}\nconst Va = 1e-6, _f = Va * 0.5, Ha = Math.pow(10, -Math.log10(Va)), vf = _f * Ha;\nfunction ht(o) {\n return ~~(o * Ha + vf);\n}\nfunction bf(o) {\n return `${ht(o.x)},${ht(o.y)}`;\n}\nfunction vo(o) {\n return `${ht(o.x)},${ht(o.y)},${ht(o.z)}`;\n}\nfunction Mf(o) {\n return `${ht(o.x)},${ht(o.y)},${ht(o.z)},${ht(o.w)}`;\n}\nfunction Sf(o, e, t) {\n t.direction.subVectors(e, o).normalize();\n const n = o.dot(t.direction);\n return t.origin.copy(o).addScaledVector(t.direction, -n), t;\n}\nfunction ja() {\n return typeof SharedArrayBuffer < \"u\";\n}\nfunction Tf(o) {\n if (o.buffer instanceof SharedArrayBuffer)\n return o;\n const e = o.constructor, t = o.buffer, n = new SharedArrayBuffer(t.byteLength), i = new Uint8Array(t);\n return new Uint8Array(n).set(i, 0), new e(n);\n}\nfunction Ef(o, e = ArrayBuffer) {\n return o > 65535 ? new Uint32Array(new e(4 * o)) : new Uint16Array(new e(2 * o));\n}\nfunction Af(o, e) {\n if (!o.index) {\n const t = o.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = Ef(t, n);\n o.setIndex(new ut(i, 1));\n for (let s = 0; s < t; s++)\n i[s] = s;\n }\n}\nfunction Cf(o) {\n return o.index ? o.index.count : o.attributes.position.count;\n}\nfunction xr(o) {\n return Cf(o) / 3;\n}\nconst Pf = 1e-8, Rf = new K();\nfunction Df(o) {\n return ~~(o / 3);\n}\nfunction kf(o) {\n return o % 3;\n}\nfunction bo(o, e) {\n return o.start - e.start;\n}\nfunction Mo(o, e) {\n return Rf.subVectors(e, o.origin).dot(o.direction);\n}\nfunction If(o, e, t, n = Pf) {\n o.sort(bo), e.sort(bo);\n for (let a = 0; a < o.length; a++) {\n const l = o[a];\n for (let h = 0; h < e.length; h++) {\n const c = e[h];\n if (!(c.start > l.end)) {\n if (l.end < c.start || c.end < l.start)\n continue;\n if (l.start <= c.start && l.end >= c.end)\n s(c.end, l.end) || o.splice(a + 1, 0, {\n start: c.end,\n end: l.end,\n index: l.index\n }), l.end = c.start, c.start = 0, c.end = 0;\n else if (l.start >= c.start && l.end <= c.end)\n s(l.end, c.end) || e.splice(h + 1, 0, {\n start: l.end,\n end: c.end,\n index: c.index\n }), c.end = l.start, l.start = 0, l.end = 0;\n else if (l.start <= c.start && l.end <= c.end) {\n const u = l.end;\n l.end = c.start, c.start = u;\n } else if (l.start >= c.start && l.end >= c.end) {\n const u = c.end;\n c.end = l.start, l.start = u;\n } else\n throw new Error();\n }\n if (t.has(l.index) || t.set(l.index, []), t.has(c.index) || t.set(c.index, []), t.get(l.index).push(c.index), t.get(c.index).push(l.index), r(c) && (e.splice(h, 1), h--), r(l)) {\n o.splice(a, 1), a--;\n break;\n }\n }\n }\n i(o), i(e);\n function i(a) {\n for (let l = 0; l < a.length; l++)\n r(a[l]) && (a.splice(l, 1), l--);\n }\n function s(a, l) {\n return Math.abs(l - a) < n;\n }\n function r(a) {\n return Math.abs(a.end - a.start) < n;\n }\n}\nconst So = 1e-5, To = 1e-4;\nclass Lf {\n constructor() {\n this._rays = [];\n }\n addRay(e) {\n this._rays.push(e);\n }\n findClosestRay(e) {\n const t = this._rays, n = e.clone();\n n.direction.multiplyScalar(-1);\n let i = 1 / 0, s = null;\n for (let l = 0, h = t.length; l < h; l++) {\n const c = t[l];\n if (r(c, e) && r(c, n))\n continue;\n const u = a(c, e), m = a(c, n), f = Math.min(u, m);\n f < i && (i = f, s = c);\n }\n return s;\n function r(l, h) {\n const c = l.origin.distanceTo(h.origin) > So;\n return l.direction.angleTo(h.direction) > To || c;\n }\n function a(l, h) {\n const c = l.origin.distanceTo(h.origin), u = l.direction.angleTo(h.direction);\n return c / So + u / To;\n }\n }\n}\nconst Ss = new K(), Ts = new K(), bi = new rr();\nfunction zf(o, e, t) {\n const n = o.attributes, i = o.index, s = n.position, r = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), l = Array.from(e), h = new Lf();\n for (let c = 0, u = l.length; c < u; c++) {\n const m = l[c], f = Df(m), d = kf(m);\n let p = 3 * f + d, g = 3 * f + (d + 1) % 3;\n i && (p = i.getX(p), g = i.getX(g)), Ss.fromBufferAttribute(s, p), Ts.fromBufferAttribute(s, g), Sf(Ss, Ts, bi);\n let y, w = h.findClosestRay(bi);\n w === null && (w = bi.clone(), h.addRay(w)), a.has(w) || a.set(w, {\n forward: [],\n reverse: [],\n ray: w\n }), y = a.get(w);\n let x = Mo(w, Ss), _ = Mo(w, Ts);\n x > _ && ([x, _] = [_, x]), bi.direction.dot(w.direction) < 0 ? y.reverse.push({ start: x, end: _, index: m }) : y.forward.push({ start: x, end: _, index: m });\n }\n return a.forEach(({ forward: c, reverse: u }, m) => {\n If(c, u, r, t), c.length === 0 && u.length === 0 && a.delete(m);\n }), {\n disjointConnectivityMap: r,\n fragmentMap: a\n };\n}\nconst Of = new ue(), Es = new K(), Bf = new en(), As = [\"\", \"\", \"\"];\nclass Nf {\n constructor(e = null) {\n this.data = null, this.disjointConnections = null, this.unmatchedDisjointEdges = null, this.unmatchedEdges = -1, this.matchedEdges = -1, this.useDrawRange = !0, this.useAllAttributes = !1, this.matchDisjointEdges = !1, this.degenerateEpsilon = 1e-8, e && this.updateFrom(e);\n }\n getSiblingTriangleIndex(e, t) {\n const n = this.data[e * 3 + t];\n return n === -1 ? -1 : ~~(n / 3);\n }\n getSiblingEdgeIndex(e, t) {\n const n = this.data[e * 3 + t];\n return n === -1 ? -1 : n % 3;\n }\n getDisjointSiblingTriangleIndices(e, t) {\n const n = e * 3 + t, i = this.disjointConnections.get(n);\n return i ? i.map((s) => ~~(s / 3)) : [];\n }\n getDisjointSiblingEdgeIndices(e, t) {\n const n = e * 3 + t, i = this.disjointConnections.get(n);\n return i ? i.map((s) => s % 3) : [];\n }\n isFullyConnected() {\n return this.unmatchedEdges === 0;\n }\n updateFrom(e) {\n const { useAllAttributes: t, useDrawRange: n, matchDisjointEdges: i, degenerateEpsilon: s } = this, r = t ? x : w, a = /* @__PURE__ */ new Map(), { attributes: l } = e, h = t ? Object.keys(l) : null, c = e.index, u = l.position;\n let m = xr(e);\n const f = m;\n let d = 0;\n n && (d = e.drawRange.start, e.drawRange.count !== 1 / 0 && (m = ~~(e.drawRange.count / 3)));\n let p = this.data;\n (!p || p.length < 3 * f) && (p = new Int32Array(3 * f)), p.fill(-1);\n let g = 0, y = /* @__PURE__ */ new Set();\n for (let _ = d, b = m * 3 + d; _ < b; _ += 3) {\n const E = _;\n for (let A = 0; A < 3; A++) {\n let P = E + A;\n c && (P = c.getX(P)), As[A] = r(P);\n }\n for (let A = 0; A < 3; A++) {\n const P = (A + 1) % 3, C = As[A], D = As[P], I = `${D}_${C}`;\n if (a.has(I)) {\n const T = E + A, R = a.get(I);\n p[T] = R, p[R] = T, a.delete(I), g += 2, y.delete(R);\n } else {\n const T = `${C}_${D}`, R = E + A;\n a.set(T, R), y.add(R);\n }\n }\n }\n if (i) {\n const {\n fragmentMap: _,\n disjointConnectivityMap: b\n } = zf(e, y, s);\n y.clear(), _.forEach(({ forward: E, reverse: A }) => {\n E.forEach(({ index: P }) => y.add(P)), A.forEach(({ index: P }) => y.add(P));\n }), this.unmatchedDisjointEdges = _, this.disjointConnections = b, g = m * 3 - y.size;\n }\n this.matchedEdges = g, this.unmatchedEdges = y.size, this.data = p;\n function w(_) {\n return Es.fromBufferAttribute(u, _), vo(Es);\n }\n function x(_) {\n let b = \"\";\n for (let E = 0, A = h.length; E < A; E++) {\n const P = l[h[E]];\n let C;\n switch (P.itemSize) {\n case 1:\n C = ht(P.getX(_));\n break;\n case 2:\n C = bf(Of.fromBufferAttribute(P, _));\n break;\n case 3:\n C = vo(Es.fromBufferAttribute(P, _));\n break;\n case 4:\n C = Mf(Bf.fromBufferAttribute(P, _));\n break;\n }\n b !== \"\" && (b += \"|\"), b += C;\n }\n return b;\n }\n }\n}\nclass Gi extends ar {\n constructor(...e) {\n super(...e), this.isBrush = !0, this._previousMatrix = new Me(), this._previousMatrix.elements.fill(0);\n }\n markUpdated() {\n this._previousMatrix.copy(this.matrix);\n }\n isDirty() {\n const { matrix: e, _previousMatrix: t } = this, n = e.elements, i = t.elements;\n for (let s = 0; s < 16; s++)\n if (n[s] !== i[s])\n return !0;\n return !1;\n }\n prepareGeometry() {\n const e = this.geometry, t = e.attributes, n = ja();\n if (n)\n for (const i in t) {\n const s = t[i];\n if (s.isInterleavedBufferAttribute)\n throw new Error(\"Brush: InterleavedBufferAttributes are not supported.\");\n s.array = Tf(s.array);\n }\n if (e.boundsTree || (Af(e, { useSharedArrayBuffer: n }), e.boundsTree = new wr(e, { maxLeafTris: 3, indirect: !0, useSharedArrayBuffer: n })), e.halfEdges || (e.halfEdges = new Nf(e)), !e.groupIndices) {\n const i = xr(e), s = new Uint16Array(i), r = e.groups;\n for (let a = 0, l = r.length; a < l; a++) {\n const { start: h, count: c } = r[a];\n for (let u = h / 3, m = (h + c) / 3; u < m; u++)\n s[u] = a;\n }\n e.groupIndices = s;\n }\n }\n disposeCacheData() {\n const { geometry: e } = this;\n e.halfEdges = null, e.boundsTree = null, e.groupIndices = null;\n }\n}\nconst Ff = 1e-14, Cs = new K(), Eo = new K(), Ao = new K();\nfunction Dt(o, e = Ff) {\n Cs.subVectors(o.b, o.a), Eo.subVectors(o.c, o.a), Ao.subVectors(o.b, o.c);\n const t = Cs.angleTo(Eo), n = Cs.angleTo(Ao), i = Math.PI - t - n;\n return Math.abs(t) < e || Math.abs(n) < e || Math.abs(i) < e || o.a.distanceToSquared(o.b) < e || o.a.distanceToSquared(o.c) < e || o.b.distanceToSquared(o.c) < e;\n}\nconst Ps = 1e-10, zn = 1e-10, Uf = 1e-10, pt = new Ke(), _e = new Ke(), mt = new K(), Rs = new K(), Co = new K(), Mi = new Xi(), Ds = new $e();\nclass Vf {\n constructor() {\n this._pool = [], this._index = 0;\n }\n getTriangle() {\n return this._index >= this._pool.length && this._pool.push(new Ue()), this._pool[this._index++];\n }\n clear() {\n this._index = 0;\n }\n reset() {\n this._pool.length = 0, this._index = 0;\n }\n}\nclass Hf {\n constructor() {\n this.trianglePool = new Vf(), this.triangles = [], this.normal = new K(), this.coplanarTriangleUsed = !1;\n }\n // initialize the class with a triangle\n initialize(e) {\n this.reset();\n const { triangles: t, trianglePool: n, normal: i } = this;\n if (Array.isArray(e))\n for (let s = 0, r = e.length; s < r; s++) {\n const a = e[s];\n if (s === 0)\n a.getNormal(i);\n else if (Math.abs(1 - a.getNormal(mt).dot(i)) > Ps)\n throw new Error(\"Triangle Splitter: Cannot initialize with triangles that have different normals.\");\n const l = n.getTriangle();\n l.copy(a), t.push(l);\n }\n else {\n e.getNormal(i);\n const s = n.getTriangle();\n s.copy(e), t.push(s);\n }\n }\n // Split the current set of triangles by passing a single triangle in. If the triangle is\n // coplanar it will attempt to split by the triangle edge planes\n splitByTriangle(e) {\n const { normal: t, triangles: n } = this;\n if (e.getNormal(Rs).normalize(), Math.abs(1 - Math.abs(Rs.dot(t))) < Uf) {\n this.coplanarTriangleUsed = !0;\n for (let s = 0, r = n.length; s < r; s++) {\n const a = n[s];\n a.coplanarCount = 0;\n }\n const i = [e.a, e.b, e.c];\n for (let s = 0; s < 3; s++) {\n const r = (s + 1) % 3, a = i[s], l = i[r];\n mt.subVectors(l, a).normalize(), Co.crossVectors(Rs, mt), Mi.setFromNormalAndCoplanarPoint(Co, a), this.splitByPlane(Mi, e);\n }\n } else\n e.getPlane(Mi), this.splitByPlane(Mi, e);\n }\n // Split the triangles by the given plan. If a triangle is provided then we ensure we\n // intersect the triangle before splitting the plane\n splitByPlane(e, t) {\n const { triangles: n, trianglePool: i } = this;\n Ds.copy(t), Ds.needsUpdate = !0;\n for (let s = 0, r = n.length; s < r; s++) {\n const a = n[s];\n if (!Ds.intersectsTriangle(a, pt, !0))\n continue;\n const { a: l, b: h, c } = a;\n let u = 0, m = -1, f = !1, d = [], p = [];\n const g = [l, h, c];\n for (let y = 0; y < 3; y++) {\n const w = (y + 1) % 3;\n pt.start.copy(g[y]), pt.end.copy(g[w]);\n const x = e.distanceToPoint(pt.start), _ = e.distanceToPoint(pt.end);\n if (Math.abs(x) < zn && Math.abs(_) < zn) {\n f = !0;\n break;\n }\n if (x > 0 ? d.push(y) : p.push(y), Math.abs(x) < zn)\n continue;\n let b = !!e.intersectLine(pt, mt);\n !b && Math.abs(_) < zn && (mt.copy(pt.end), b = !0), b && !(mt.distanceTo(pt.start) < Ps) && (mt.distanceTo(pt.end) < Ps && (m = y), u === 0 ? _e.start.copy(mt) : _e.end.copy(mt), u++);\n }\n if (!f && u === 2 && _e.distance() > zn)\n if (m !== -1) {\n m = (m + 1) % 3;\n let y = 0;\n y === m && (y = (y + 1) % 3);\n let w = y + 1;\n w === m && (w = (w + 1) % 3);\n const x = i.getTriangle();\n x.a.copy(g[w]), x.b.copy(_e.end), x.c.copy(_e.start), Dt(x) || n.push(x), a.a.copy(g[y]), a.b.copy(_e.start), a.c.copy(_e.end), Dt(a) && (n.splice(s, 1), s--, r--);\n } else {\n const y = d.length >= 2 ? p[0] : d[0];\n if (y === 0) {\n let E = _e.start;\n _e.start = _e.end, _e.end = E;\n }\n const w = (y + 1) % 3, x = (y + 2) % 3, _ = i.getTriangle(), b = i.getTriangle();\n g[w].distanceToSquared(_e.start) < g[x].distanceToSquared(_e.end) ? (_.a.copy(g[w]), _.b.copy(_e.start), _.c.copy(_e.end), b.a.copy(g[w]), b.b.copy(g[x]), b.c.copy(_e.start)) : (_.a.copy(g[x]), _.b.copy(_e.start), _.c.copy(_e.end), b.a.copy(g[w]), b.b.copy(g[x]), b.c.copy(_e.end)), a.a.copy(g[y]), a.b.copy(_e.end), a.c.copy(_e.start), Dt(_) || n.push(_), Dt(b) || n.push(b), Dt(a) && (n.splice(s, 1), s--, r--);\n }\n else u === 3 && console.warn(\"TriangleClipper: Coplanar clip not handled\");\n }\n }\n reset() {\n this.triangles.length = 0, this.trianglePool.clear(), this.coplanarTriangleUsed = !1;\n }\n}\nfunction jf(o) {\n return o = ~~o, o + 4 - o % 4;\n}\nclass Po {\n constructor(e, t = 500) {\n this.expansionFactor = 1.5, this.type = e, this.length = 0, this.array = null, this.setSize(t);\n }\n setType(e) {\n if (this.length !== 0)\n throw new Error(\"TypeBackedArray: Cannot change the type while there is used data in the buffer.\");\n const t = this.array.buffer;\n this.array = new e(t), this.type = e;\n }\n setSize(e) {\n if (this.array && e === this.array.length)\n return;\n const t = this.type, n = ja() ? SharedArrayBuffer : ArrayBuffer, i = new t(new n(jf(e * t.BYTES_PER_ELEMENT)));\n this.array && i.set(this.array, 0), this.array = i;\n }\n expand() {\n const { array: e, expansionFactor: t } = this;\n this.setSize(e.length * t);\n }\n push(...e) {\n let { array: t, length: n } = this;\n n + e.length > t.length && (this.expand(), t = this.array);\n for (let i = 0, s = e.length; i < s; i++)\n t[n + i] = e[i];\n this.length += e.length;\n }\n clear() {\n this.length = 0;\n }\n}\nclass Gf {\n constructor() {\n this.groupAttributes = [{}], this.groupCount = 0;\n }\n // returns the buffer type for the given attribute\n getType(e) {\n return this.groupAttributes[0][e].type;\n }\n getItemSize(e) {\n return this.groupAttributes[0][e].itemSize;\n }\n getNormalized(e) {\n return this.groupAttributes[0][e].normalized;\n }\n getCount(e) {\n if (this.groupCount <= e)\n return 0;\n const t = this.getGroupAttrArray(\"position\", e);\n return t.length / t.itemSize;\n }\n // returns the total length required for all groups for the given attribute\n getTotalLength(e) {\n const { groupCount: t, groupAttributes: n } = this;\n let i = 0;\n for (let s = 0; s < t; s++) {\n const r = n[s];\n i += r[e].length;\n }\n return i;\n }\n getGroupAttrSet(e = 0) {\n const { groupAttributes: t } = this;\n if (t[e])\n return this.groupCount = Math.max(this.groupCount, e + 1), t[e];\n const n = t[0];\n for (this.groupCount = Math.max(this.groupCount, e + 1); e >= t.length; ) {\n const i = {};\n t.push(i);\n for (const s in n) {\n const r = n[s], a = new Po(r.type);\n a.itemSize = r.itemSize, a.normalized = r.normalized, i[s] = a;\n }\n }\n return t[e];\n }\n // Get the raw array for the group set of data\n getGroupAttrArray(e, t = 0) {\n const { groupAttributes: n } = this;\n if (!n[0][e])\n throw new Error(`TypedAttributeData: Attribute with \"${e}\" has not been initialized`);\n return this.getGroupAttrSet(t)[e];\n }\n // initializes an attribute array with the given name, type, and size\n initializeArray(e, t, n, i) {\n const { groupAttributes: s } = this, a = s[0][e];\n if (a) {\n if (a.type !== t)\n for (let l = 0, h = s.length; l < h; l++) {\n const c = s[l][e];\n c.setType(t), c.itemSize = n, c.normalized = i;\n }\n } else\n for (let l = 0, h = s.length; l < h; l++) {\n const c = new Po(t);\n c.itemSize = n, c.normalized = i, s[l][e] = c;\n }\n }\n // Clear all the data\n clear() {\n this.groupCount = 0;\n const { groupAttributes: e } = this;\n e.forEach((t) => {\n for (const n in t)\n t[n].clear();\n });\n }\n // Remove the given key\n delete(e) {\n this.groupAttributes.forEach((t) => {\n delete t[e];\n });\n }\n // Reset the datasets completely\n reset() {\n this.groupAttributes = [], this.groupCount = 0;\n }\n}\nclass Ro {\n constructor() {\n this.intersectionSet = {}, this.ids = [];\n }\n add(e, t) {\n const { intersectionSet: n, ids: i } = this;\n n[e] || (n[e] = [], i.push(e)), n[e].push(t);\n }\n}\nconst Wf = 0, Xf = 1, Zf = 2, Ga = 3, qf = 4, Wa = 5, Xa = 6, Ze = new rr(), Do = new Me(), Le = new Ue(), gt = new K(), ko = new en(), Io = new en(), Lo = new en(), ks = new en(), Si = new en(), Ti = new en(), zo = new Ke(), Is = new K(), Ls = 1e-8, Yf = 1e-15, Zt = -1, qt = 1, zi = -2, Oi = 2, Un = 0, Wt = 1, _r = 2, Kf = 1e-14;\nlet Bi = null;\nfunction Oo(o) {\n Bi = o;\n}\nfunction Za(o, e) {\n o.getMidpoint(Ze.origin), o.getNormal(Ze.direction);\n const t = e.raycastFirst(Ze, qi);\n return !!(t && Ze.direction.dot(t.face.normal) > 0) ? Zt : qt;\n}\nfunction $f(o, e) {\n function t() {\n return Math.random() - 0.5;\n }\n o.getNormal(Is), Ze.direction.copy(Is), o.getMidpoint(Ze.origin);\n const n = 3;\n let i = 0, s = 1 / 0;\n for (let r = 0; r < n; r++) {\n Ze.direction.x += t() * Ls, Ze.direction.y += t() * Ls, Ze.direction.z += t() * Ls, Ze.direction.multiplyScalar(-1);\n const a = e.raycastFirst(Ze, qi);\n if (!!(a && Ze.direction.dot(a.face.normal) > 0) && i++, a !== null && (s = Math.min(s, a.distance)), s <= Yf)\n return a.face.normal.dot(Is) > 0 ? Oi : zi;\n if (i / n > 0.5 || (r - i + 1) / n > 0.5)\n break;\n }\n return i / n > 0.5 ? Zt : qt;\n}\nfunction Jf(o, e) {\n const t = new Ro(), n = new Ro();\n return Do.copy(o.matrixWorld).invert().multiply(e.matrixWorld), o.geometry.boundsTree.bvhcast(e.geometry.boundsTree, Do, {\n intersectsTriangles(i, s, r, a) {\n if (!Dt(i) && !Dt(s)) {\n let l = i.intersectsTriangle(s, zo, !0);\n if (!l) {\n const h = i.plane, c = s.plane, u = h.normal, m = c.normal;\n u.dot(m) === 1 && Math.abs(h.constant - c.constant) < Kf && (l = !0);\n }\n if (l) {\n let h = o.geometry.boundsTree.resolveTriangleIndex(r), c = e.geometry.boundsTree.resolveTriangleIndex(a);\n t.add(h, c), n.add(c, h), Bi && (Bi.addEdge(zo), Bi.addIntersectingTriangles(r, i, a, s));\n }\n }\n return !1;\n }\n }), { aIntersections: t, bIntersections: n };\n}\nfunction Qf(o, e, t, n, i, s, r = !1) {\n const a = t.attributes, l = t.index, h = o * 3, c = l.getX(h + 0), u = l.getX(h + 1), m = l.getX(h + 2);\n for (const f in s) {\n const d = a[f], p = s[f];\n if (!(f in a))\n throw new Error(`CSG Operations: Attribute ${f} not available on geometry.`);\n const g = d.itemSize;\n f === \"position\" ? (Le.a.fromBufferAttribute(d, c).applyMatrix4(n), Le.b.fromBufferAttribute(d, u).applyMatrix4(n), Le.c.fromBufferAttribute(d, m).applyMatrix4(n), zs(Le.a, Le.b, Le.c, e, 3, p, r)) : f === \"normal\" ? (Le.a.fromBufferAttribute(d, c).applyNormalMatrix(i), Le.b.fromBufferAttribute(d, u).applyNormalMatrix(i), Le.c.fromBufferAttribute(d, m).applyNormalMatrix(i), r && (Le.a.multiplyScalar(-1), Le.b.multiplyScalar(-1), Le.c.multiplyScalar(-1)), zs(Le.a, Le.b, Le.c, e, 3, p, r, !0)) : (ko.fromBufferAttribute(d, c), Io.fromBufferAttribute(d, u), Lo.fromBufferAttribute(d, m), zs(ko, Io, Lo, e, g, p, r));\n }\n}\nfunction ep(o, e, t, n, i, s, r, a = !1) {\n Os(o, n, i, s, r, a), Os(a ? t : e, n, i, s, r, a), Os(a ? e : t, n, i, s, r, a);\n}\nfunction qa(o, e, t = !1) {\n switch (o) {\n case Wf:\n if (e === qt || e === Oi && !t)\n return Wt;\n break;\n case Xf:\n if (t) {\n if (e === Zt)\n return Un;\n } else if (e === qt || e === zi)\n return Wt;\n break;\n case Zf:\n if (t) {\n if (e === qt || e === zi)\n return Wt;\n } else if (e === Zt)\n return Un;\n break;\n case qf:\n if (e === Zt)\n return Un;\n if (e === qt)\n return Wt;\n break;\n case Ga:\n if (e === Zt || e === Oi && !t)\n return Wt;\n break;\n case Wa:\n if (!t && (e === qt || e === zi))\n return Wt;\n break;\n case Xa:\n if (!t && (e === Zt || e === Oi))\n return Wt;\n break;\n default:\n throw new Error(`Unrecognized CSG operation enum \"${o}\".`);\n }\n return _r;\n}\nfunction zs(o, e, t, n, i, s, r = !1, a = !1) {\n const l = (h) => {\n s.push(h.x), i > 1 && s.push(h.y), i > 2 && s.push(h.z), i > 3 && s.push(h.w);\n };\n ks.set(0, 0, 0, 0).addScaledVector(o, n.a.x).addScaledVector(e, n.a.y).addScaledVector(t, n.a.z), Si.set(0, 0, 0, 0).addScaledVector(o, n.b.x).addScaledVector(e, n.b.y).addScaledVector(t, n.b.z), Ti.set(0, 0, 0, 0).addScaledVector(o, n.c.x).addScaledVector(e, n.c.y).addScaledVector(t, n.c.z), a && (ks.normalize(), Si.normalize(), Ti.normalize()), l(ks), r ? (l(Ti), l(Si)) : (l(Si), l(Ti));\n}\nfunction Os(o, e, t, n, i, s = !1) {\n for (const r in i) {\n const a = e[r], l = i[r];\n if (!(r in e))\n throw new Error(`CSG Operations: Attribute ${r} no available on geometry.`);\n const h = a.itemSize;\n r === \"position\" ? (gt.fromBufferAttribute(a, o).applyMatrix4(t), l.push(gt.x, gt.y, gt.z)) : r === \"normal\" ? (gt.fromBufferAttribute(a, o).applyNormalMatrix(n), s && gt.multiplyScalar(-1), l.push(gt.x, gt.y, gt.z)) : (l.push(a.getX(o)), h > 1 && l.push(a.getY(o)), h > 2 && l.push(a.getZ(o)), h > 3 && l.push(a.getW(o)));\n }\n}\nclass tp {\n constructor(e) {\n this.triangle = new Ue().copy(e), this.intersects = {};\n }\n addTriangle(e, t) {\n this.intersects[e] = new Ue().copy(t);\n }\n getIntersectArray() {\n const e = [], { intersects: t } = this;\n for (const n in t)\n e.push(t[n]);\n return e;\n }\n}\nclass Bo {\n constructor() {\n this.data = {};\n }\n addTriangleIntersection(e, t, n, i) {\n const { data: s } = this;\n s[e] || (s[e] = new tp(t)), s[e].addTriangle(n, i);\n }\n getTrianglesAsArray(e = null) {\n const { data: t } = this, n = [];\n if (e !== null)\n e in t && n.push(t[e].triangle);\n else\n for (const i in t)\n n.push(t[i].triangle);\n return n;\n }\n getTriangleIndices() {\n return Object.keys(this.data).map((e) => parseInt(e));\n }\n getIntersectionIndices(e) {\n const { data: t } = this;\n return t[e] ? Object.keys(t[e].intersects).map((n) => parseInt(n)) : [];\n }\n getIntersectionsAsArray(e = null, t = null) {\n const { data: n } = this, i = /* @__PURE__ */ new Set(), s = [], r = (a) => {\n if (n[a])\n if (t !== null)\n n[a].intersects[t] && s.push(n[a].intersects[t]);\n else {\n const l = n[a].intersects;\n for (const h in l)\n i.has(h) || (i.add(h), s.push(l[h]));\n }\n };\n if (e !== null)\n r(e);\n else\n for (const a in n)\n r(a);\n return s;\n }\n reset() {\n this.data = {};\n }\n}\nclass np {\n constructor() {\n this.enabled = !1, this.triangleIntersectsA = new Bo(), this.triangleIntersectsB = new Bo(), this.intersectionEdges = [];\n }\n addIntersectingTriangles(e, t, n, i) {\n const { triangleIntersectsA: s, triangleIntersectsB: r } = this;\n s.addTriangleIntersection(e, t, n, i), r.addTriangleIntersection(n, i, e, t);\n }\n addEdge(e) {\n this.intersectionEdges.push(e.clone());\n }\n reset() {\n this.triangleIntersectsA.reset(), this.triangleIntersectsB.reset(), this.intersectionEdges = [];\n }\n init() {\n this.enabled && (this.reset(), Oo(this));\n }\n complete() {\n this.enabled && Oo(null);\n }\n}\nconst It = new Me(), Wi = new Fl(), Xt = new Ue(), Ei = new Ue(), Pt = new Ue(), Ai = new Ue(), it = [], Jt = [];\nfunction ip(o) {\n for (const e of o) return e;\n}\nfunction sp(o, e, t, n, i, s = {}) {\n const { useGroups: r = !0 } = s, { aIntersections: a, bIntersections: l } = Jf(o, e), h = [];\n let c = null, u;\n return u = r ? 0 : -1, No(o, e, a, t, !1, n, i, u), Fo(o, e, a, t, !1, i, u), t.findIndex((f) => f !== Xa && f !== Wa) !== -1 && (u = r ? o.geometry.groups.length || 1 : -1, No(e, o, l, t, !0, n, i, u), Fo(e, o, l, t, !0, i, u)), it.length = 0, Jt.length = 0, {\n groups: h,\n materials: c\n };\n}\nfunction No(o, e, t, n, i, s, r, a = 0) {\n const l = o.matrixWorld.determinant() < 0;\n It.copy(e.matrixWorld).invert().multiply(o.matrixWorld), Wi.getNormalMatrix(o.matrixWorld).multiplyScalar(l ? -1 : 1);\n const h = o.geometry.groupIndices, c = o.geometry.index, u = o.geometry.attributes.position, m = e.geometry.boundsTree, f = e.geometry.index, d = e.geometry.attributes.position, p = t.ids, g = t.intersectionSet;\n for (let y = 0, w = p.length; y < w; y++) {\n const x = p[y], _ = a === -1 ? 0 : h[x] + a, b = 3 * x, E = c.getX(b + 0), A = c.getX(b + 1), P = c.getX(b + 2);\n Xt.a.fromBufferAttribute(u, E).applyMatrix4(It), Xt.b.fromBufferAttribute(u, A).applyMatrix4(It), Xt.c.fromBufferAttribute(u, P).applyMatrix4(It), s.reset(), s.initialize(Xt);\n const C = g[x];\n for (let I = 0, T = C.length; I < T; I++) {\n const R = 3 * C[I], v = f.getX(R + 0), z = f.getX(R + 1), H = f.getX(R + 2);\n Ei.a.fromBufferAttribute(d, v), Ei.b.fromBufferAttribute(d, z), Ei.c.fromBufferAttribute(d, H), s.splitByTriangle(Ei);\n }\n const D = s.triangles;\n for (let I = 0, T = D.length; I < T; I++) {\n const R = D[I], v = s.coplanarTriangleUsed ? $f(R, m) : Za(R, m);\n it.length = 0, Jt.length = 0;\n for (let z = 0, H = n.length; z < H; z++) {\n const V = qa(n[z], v, i);\n V !== _r && (Jt.push(V), it.push(r[z].getGroupAttrSet(_)));\n }\n if (it.length !== 0) {\n Xt.getBarycoord(R.a, Ai.a), Xt.getBarycoord(R.b, Ai.b), Xt.getBarycoord(R.c, Ai.c);\n for (let z = 0, H = it.length; z < H; z++) {\n const V = it[z], G = Jt[z] === Un;\n Qf(x, Ai, o.geometry, o.matrixWorld, Wi, V, l !== G);\n }\n }\n }\n }\n return p.length;\n}\nfunction Fo(o, e, t, n, i, s, r = 0) {\n const a = o.matrixWorld.determinant() < 0;\n It.copy(e.matrixWorld).invert().multiply(o.matrixWorld), Wi.getNormalMatrix(o.matrixWorld).multiplyScalar(a ? -1 : 1);\n const l = e.geometry.boundsTree, h = o.geometry.groupIndices, c = o.geometry.index, u = o.geometry.attributes, m = u.position, f = [], d = o.geometry.halfEdges, p = /* @__PURE__ */ new Set(), g = xr(o.geometry);\n for (let y = 0, w = g; y < w; y++)\n y in t.intersectionSet || p.add(y);\n for (; p.size > 0; ) {\n const y = ip(p);\n p.delete(y), f.push(y);\n const w = 3 * y, x = c.getX(w + 0), _ = c.getX(w + 1), b = c.getX(w + 2);\n Pt.a.fromBufferAttribute(m, x).applyMatrix4(It), Pt.b.fromBufferAttribute(m, _).applyMatrix4(It), Pt.c.fromBufferAttribute(m, b).applyMatrix4(It);\n const E = Za(Pt, l);\n Jt.length = 0, it.length = 0;\n for (let A = 0, P = n.length; A < P; A++) {\n const C = qa(n[A], E, i);\n C !== _r && (Jt.push(C), it.push(s[A]));\n }\n for (; f.length > 0; ) {\n const A = f.pop();\n for (let P = 0; P < 3; P++) {\n const C = d.getSiblingTriangleIndex(A, P);\n C !== -1 && p.has(C) && (f.push(C), p.delete(C));\n }\n if (it.length !== 0) {\n const P = 3 * A, C = c.getX(P + 0), D = c.getX(P + 1), I = c.getX(P + 2), T = r === -1 ? 0 : h[A] + r;\n if (Pt.a.fromBufferAttribute(m, C), Pt.b.fromBufferAttribute(m, D), Pt.c.fromBufferAttribute(m, I), !Dt(Pt))\n for (let R = 0, v = it.length; R < v; R++) {\n const z = Jt[R], H = it[R].getGroupAttrSet(T), V = z === Un;\n ep(C, D, I, u, o.matrixWorld, Wi, H, V !== a);\n }\n }\n }\n }\n}\nfunction rp(o) {\n for (let e = 0; e < o.length - 1; e++) {\n const t = o[e], n = o[e + 1];\n if (t.materialIndex === n.materialIndex) {\n const i = t.start, s = n.start + n.count;\n n.start = i, n.count = s - i, o.splice(e, 1), e--;\n }\n }\n}\nfunction op(o, e, t, n) {\n t.clear();\n const i = o.attributes;\n for (let s = 0, r = n.length; s < r; s++) {\n const a = n[s], l = i[a];\n t.initializeArray(a, l.array.constructor, l.itemSize, l.normalized);\n }\n for (const s in t.attributes)\n n.includes(s) || t.delete(s);\n for (const s in e.attributes)\n n.includes(s) || (e.deleteAttribute(s), e.dispose());\n}\nfunction ap(o, e, t) {\n let n = !1, i = -1;\n const s = o.attributes, r = e.groupAttributes[0];\n for (const l in r) {\n const h = e.getTotalLength(l), c = e.getType(l), u = e.getItemSize(l), m = e.getNormalized(l);\n let f = s[l];\n (!f || f.array.length < h) && (f = new ut(new c(h), u, m), o.setAttribute(l, f), n = !0);\n let d = 0;\n for (let p = 0, g = Math.min(t.length, e.groupCount); p < g; p++) {\n const y = t[p].index, { array: w, type: x, length: _ } = e.groupAttributes[y][l], b = new x(w.buffer, 0, _);\n f.array.set(b, d), d += b.length;\n }\n f.needsUpdate = !0, i = h / f.itemSize;\n }\n if (o.index) {\n const l = o.index.array;\n if (l.length < i)\n o.index = null, n = !0;\n else\n for (let h = 0, c = l.length; h < c; h++)\n l[h] = h;\n }\n let a = 0;\n o.clearGroups();\n for (let l = 0, h = Math.min(t.length, e.groupCount); l < h; l++) {\n const { index: c, materialIndex: u } = t[l], m = e.getCount(c);\n m !== 0 && (o.addGroup(a, m, u), a += m);\n }\n o.setDrawRange(0, i), o.boundsTree = null, n && o.dispose();\n}\nfunction Uo(o, e) {\n let t = e;\n return Array.isArray(e) || (t = [], o.forEach((n) => {\n t[n.materialIndex] = e;\n })), t;\n}\nclass lp {\n constructor() {\n this.triangleSplitter = new Hf(), this.attributeData = [], this.attributes = [\"position\", \"uv\", \"normal\"], this.useGroups = !0, this.consolidateGroups = !0, this.debug = new np();\n }\n getGroupRanges(e) {\n return !this.useGroups || e.groups.length === 0 ? [{ start: 0, count: 1 / 0, materialIndex: 0 }] : e.groups.map((t) => ({ ...t }));\n }\n evaluate(e, t, n, i = new Gi()) {\n let s = !0;\n if (Array.isArray(n) || (n = [n]), Array.isArray(i) || (i = [i], s = !1), i.length !== n.length)\n throw new Error(\"Evaluator: operations and target array passed as different sizes.\");\n e.prepareGeometry(), t.prepareGeometry();\n const {\n triangleSplitter: r,\n attributeData: a,\n attributes: l,\n useGroups: h,\n consolidateGroups: c,\n debug: u\n } = this;\n for (; a.length < i.length; )\n a.push(new Gf());\n i.forEach((y, w) => {\n op(e.geometry, y.geometry, a[w], l);\n }), u.init(), sp(e, t, n, r, a, { useGroups: h }), u.complete();\n const m = this.getGroupRanges(e.geometry), f = Uo(m, e.material), d = this.getGroupRanges(t.geometry), p = Uo(d, t.material);\n d.forEach((y) => y.materialIndex += f.length);\n let g = [...m, ...d].map((y, w) => ({ ...y, index: w }));\n if (h) {\n const y = [...f, ...p];\n c && (g = g.map((x) => {\n const _ = y[x.materialIndex];\n return x.materialIndex = y.indexOf(_), x;\n }).sort((x, _) => x.materialIndex - _.materialIndex));\n const w = [];\n for (let x = 0, _ = y.length; x < _; x++) {\n let b = !1;\n for (let E = 0, A = g.length; E < A; E++) {\n const P = g[E];\n P.materialIndex === x && (b = !0, P.materialIndex = w.length);\n }\n b && w.push(y[x]);\n }\n i.forEach((x) => {\n x.material = w;\n });\n } else\n g = [{ start: 0, count: 1 / 0, index: 0, materialIndex: 0 }], i.forEach((y) => {\n y.material = f[0];\n });\n return i.forEach((y, w) => {\n const x = y.geometry;\n ap(x, a[w], g), c && rp(x.groups);\n }), s ? i : i[0];\n }\n // TODO: fix\n evaluateHierarchy(e, t = new Gi()) {\n e.updateMatrixWorld(!0);\n const n = (s, r) => {\n const a = s.children;\n for (let l = 0, h = a.length; l < h; l++) {\n const c = a[l];\n c.isOperationGroup ? n(c, r) : r(c);\n }\n }, i = (s) => {\n const r = s.children;\n let a = !1;\n for (let h = 0, c = r.length; h < c; h++) {\n const u = r[h];\n a = i(u) || a;\n }\n const l = s.isDirty();\n if (l && s.markUpdated(), a && !s.isOperationGroup) {\n let h;\n return n(s, (c) => {\n h ? h = this.evaluate(h, c, c.operation) : h = this.evaluate(s, c, c.operation);\n }), s._cachedGeometry = h.geometry, s._cachedMaterials = h.material, !0;\n } else\n return a || l;\n };\n return i(e), t.geometry = e._cachedGeometry, t.material = e._cachedMaterials, t;\n }\n reset() {\n this.triangleSplitter.reset();\n }\n}\nclass cp {\n engine;\n planeObjects = [];\n planes = [];\n isActive = !1;\n evaluator;\n // 缓存相关\n geometryCache = /* @__PURE__ */ new Map();\n sectionMeshes = /* @__PURE__ */ new Map();\n planeGroup;\n planeSize = 1e3;\n sourceMeshes = /* @__PURE__ */ new Map();\n // 使用 Map 存储源网格\n planeThickness = 0.01;\n // 剖切平面盒子的厚度\n // 性能优化参数\n updateThrottleTime = 100;\n // 节流时间(ms)\n lastUpdateTime = 0;\n pendingUpdate = !1;\n updateTimer = null;\n // 缓存过期时间\n cacheExpireTime = 3e4;\n // 30秒\n // 平面变化检测\n planeStates = /* @__PURE__ */ new Map();\n constructor(e, t = {}) {\n this.engine = e, this.evaluator = new lp(), this.planeGroup = new M.Group(), this.planeGroup.name = \"CSG_ClippingPlanes_Optimized\", t.updateThrottleTime !== void 0 && (this.updateThrottleTime = t.updateThrottleTime), t.cacheExpireTime !== void 0 && (this.cacheExpireTime = t.cacheExpireTime), t.planeThickness !== void 0 && (this.planeThickness = t.planeThickness), this.evaluator.attributes = [\"position\", \"normal\"], this.evaluator.useGroups = !1;\n }\n /**\n * 初始化剖切补面系统\n */\n init() {\n this.calculateSceneSize(), this.engine.scene.add(this.planeGroup), this.planes.forEach((e, t) => {\n const n = this.createEmptySectionMesh(e, t);\n this.planeGroup.add(n), this.sectionMeshes.set(`plane_${t}`, n), this.planeObjects.push(n), this.planeStates.set(t, {\n constant: e.constant,\n normal: e.normal.clone()\n });\n });\n }\n /**\n * 创建空的剖切补面网格\n */\n createEmptySectionMesh(e, t) {\n const n = new M.BufferGeometry(), i = new M.MeshStandardMaterial({\n color: new M.Color(33023),\n metalness: 0.1,\n roughness: 0.75,\n side: M.DoubleSide,\n depthWrite: !0,\n depthTest: !0,\n clippingPlanes: this.planes.filter((r, a) => a !== t)\n }), s = new M.Mesh(n, i);\n return s.name = `CSG_Section_Optimized_${t}`, s.visible = !1, s.renderOrder = t + 1, s;\n }\n /**\n * 激活剖切补面\n */\n active() {\n this.isActive = !0, this.requestUpdate(), this.planeObjects.forEach((e) => {\n e.visible = !0;\n });\n }\n /**\n * 停用剖切补面\n */\n disActive() {\n this.isActive = !1, this.planeObjects.forEach((e) => {\n e.visible = !1;\n }), this.updateTimer && (clearTimeout(this.updateTimer), this.updateTimer = null);\n }\n /**\n * 设置需要剖切的源网格\n */\n setSourceMeshes(e) {\n this.sourceMeshes.clear(), e.forEach((t) => {\n const n = t.uuid;\n this.sourceMeshes.set(n, t);\n }), this.isActive && this.requestUpdate();\n }\n /**\n * 添加单个源网格\n */\n addSourceMesh(e) {\n const t = e.uuid;\n this.sourceMeshes.has(t) || (this.sourceMeshes.set(t, e), this.isActive && this.requestUpdate());\n }\n /**\n * 移除源网格\n */\n removeSourceMesh(e) {\n const t = e.uuid;\n this.sourceMeshes.delete(t) && (this.clearMeshCache(t), this.isActive && this.requestUpdate());\n }\n /**\n * 请求更新(带节流)\n */\n requestUpdate() {\n if (!this.isActive) return;\n const e = Date.now(), t = e - this.lastUpdateTime;\n t >= this.updateThrottleTime ? (this.lastUpdateTime = e, this.pendingUpdate = !1) : (this.pendingUpdate = !0, this.updateTimer && clearTimeout(this.updateTimer), this.updateTimer = setTimeout(() => {\n this.pendingUpdate && this.isActive && (this.lastUpdateTime = Date.now(), this.pendingUpdate = !1), this.updateTimer = null;\n }, this.updateThrottleTime - t));\n }\n /**\n * 更新所有剖切补面\n */\n updateAllSections() {\n this.isActive && (this.planes.forEach((e, t) => {\n if (Math.abs(e.constant) < 99999)\n this.hasPlaneChanged(t, e) && (this.updateSection(e, t), this.updatePlaneState(t, e));\n else {\n const n = this.sectionMeshes.get(`plane_${t}`);\n n && (n.visible = !1);\n }\n }), this.cleanExpiredCache());\n }\n /**\n * 检查平面是否变化\n */\n hasPlaneChanged(e, t) {\n const n = this.planeStates.get(e);\n if (!n) return !0;\n const i = Math.abs(n.constant - t.constant) > 1e-4, s = !n.normal.equals(t.normal);\n return i || s;\n }\n /**\n * 更新平面状态\n */\n updatePlaneState(e, t) {\n this.planeStates.set(e, {\n constant: t.constant,\n normal: t.normal.clone()\n });\n }\n /**\n * 生成平面哈希值(用于缓存键)\n */\n getPlaneHash(e) {\n const t = e.normal, n = e.constant;\n return `${t.x.toFixed(4)}_${t.y.toFixed(4)}_${t.z.toFixed(4)}_${n.toFixed(4)}`;\n }\n /**\n * 生成缓存键\n */\n getCacheKey(e, t) {\n return `${e}_plane_${t}`;\n }\n /**\n * 更新单个剖切面的补面(带缓存)\n */\n updateSection(e, t) {\n const n = this.sectionMeshes.get(`plane_${t}`);\n if (!n) return;\n const i = this.getPlaneHash(e), s = [];\n if (this.sourceMeshes.forEach((r, a) => {\n const l = this.getCacheKey(a, t), h = this.geometryCache.get(l);\n if (h && h.planeHash === i)\n s.push(h.geometry.clone()), h.timestamp = Date.now();\n else\n try {\n const c = this.createPlaneBrush(e), u = new Gi(r.geometry);\n r.updateMatrixWorld(!0), u.matrix.copy(r.matrixWorld), u.updateMatrixWorld();\n const m = this.evaluator.evaluate(c, u, Ga);\n m && m.geometry.attributes.position.count > 0 ? (s.push(m.geometry), this.geometryCache.set(l, {\n geometry: m.geometry.clone(),\n planeHash: i,\n timestamp: Date.now()\n })) : this.geometryCache.delete(l);\n } catch (c) {\n console.warn(`CSG intersection failed for mesh ${a}:`, c);\n }\n }), s.length > 0) {\n const r = this.mergeGeometries(s);\n n.geometry && n.geometry.dispose(), n.geometry = r, n.visible = !0, n.position.set(0, 0, 0), n.rotation.set(0, 0, 0), n.scale.set(1, 1, 1), n.updateMatrixWorld();\n } else\n n.visible = !1;\n s.forEach((r) => r.dispose());\n }\n /**\n * 清理指定网格的缓存\n */\n clearMeshCache(e) {\n const t = [];\n this.geometryCache.forEach((n, i) => {\n i.startsWith(e) && (n.geometry.dispose(), t.push(i));\n }), t.forEach((n) => this.geometryCache.delete(n));\n }\n /**\n * 清理过期缓存\n */\n cleanExpiredCache() {\n const e = Date.now(), t = [];\n this.geometryCache.forEach((n, i) => {\n e - n.timestamp > this.cacheExpireTime && (n.geometry.dispose(), t.push(i));\n }), t.forEach((n) => this.geometryCache.delete(n));\n }\n /**\n * 清理所有缓存\n */\n clearAllCache() {\n this.geometryCache.forEach((e) => {\n e.geometry.dispose();\n }), this.geometryCache.clear();\n }\n /**\n * 创建剖切平面的 Brush 对象\n * 使用极薄的盒子代替平面,以便正确进行 CSG 布尔运算\n */\n createPlaneBrush(e) {\n const t = new M.BoxGeometry(this.planeSize, this.planeThickness, this.planeSize);\n t.translate(0, e.constant, 0), t.applyQuaternion(new M.Quaternion().setFromUnitVectors(new M.Vector3(0, -1, 0), e.normal));\n const n = new M.Mesh(t), i = new Gi(t);\n return i.matrix.copy(n.matrixWorld), i.updateMatrixWorld(), i;\n }\n /**\n * 合并多个几何体\n */\n mergeGeometries(e) {\n if (e.length === 1)\n return e[0].clone();\n const t = new M.BufferGeometry(), n = [], i = [], s = [];\n let r = 0;\n return e.forEach((a) => {\n const l = a.attributes.position, h = a.attributes.normal;\n for (let c = 0; c < l.count; c++)\n n.push(l.getX(c), l.getY(c), l.getZ(c));\n if (h)\n for (let c = 0; c < h.count; c++)\n i.push(h.getX(c), h.getY(c), h.getZ(c));\n if (a.index)\n for (let c = 0; c < a.index.count; c++)\n s.push(a.index.getX(c) + r);\n r += l.count;\n }), t.setAttribute(\"position\", new M.Float32BufferAttribute(n, 3)), i.length > 0 ? t.setAttribute(\"normal\", new M.Float32BufferAttribute(i, 3)) : t.computeVertexNormals(), s.length > 0 && t.setIndex(s), t;\n }\n /**\n * 计算场景大小\n */\n calculateSceneSize() {\n const e = new M.Box3();\n if (this.engine.scene.traverse((t) => {\n if (t.isMesh && t.geometry) {\n const n = new M.Box3().setFromObject(t);\n e.union(n);\n }\n }), e.isEmpty())\n this.planeSize = 1e3;\n else {\n const t = e.getSize(new M.Vector3()), n = Math.max(t.x, t.y, t.z);\n this.planeSize = n * 3;\n }\n }\n /**\n * 更新(每帧调用)\n */\n update() {\n this.isActive && this.pendingUpdate && !this.updateTimer && this.requestUpdate();\n }\n /**\n * 清理资源\n */\n dispose() {\n this.updateTimer && (clearTimeout(this.updateTimer), this.updateTimer = null), this.clearAllCache(), this.planeObjects.forEach((e) => {\n e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((t) => t.dispose()) : e.material.dispose());\n }), this.sectionMeshes.clear(), this.planeObjects = [], this.sourceMeshes.clear(), this.planeGroup.parent && this.planeGroup.parent.remove(this.planeGroup);\n }\n /**\n * 设置补面材质颜色\n */\n setSectionColor(e) {\n this.planeObjects.forEach((t) => {\n t.material instanceof M.MeshStandardMaterial && t.material.color.set(e);\n });\n }\n /**\n * 获取缓存统计信息\n */\n getCacheStats() {\n return {\n cacheSize: this.geometryCache.size,\n sourceMeshCount: this.sourceMeshes.size,\n sectionMeshCount: this.sectionMeshes.size\n };\n }\n /**\n * 设置剖切平面的厚度\n * @param thickness 厚度值(建议 0.001 - 1.0)\n */\n setPlaneThickness(e) {\n if (e <= 0) {\n console.warn(\"Plane thickness must be positive\");\n return;\n }\n this.planeThickness = e, this.clearAllCache(), this.isActive && this.requestUpdate();\n }\n /**\n * 获取当前平面厚度\n */\n getPlaneThickness() {\n return this.planeThickness;\n }\n /**\n * 显示所有补面\n */\n showSections() {\n this.sectionMeshes.forEach((e) => {\n e.geometry?.attributes.position?.count && e.geometry.attributes.position.count > 0 && (e.visible = !0);\n });\n }\n /**\n * 隐藏所有补面\n */\n hideSections() {\n this.sectionMeshes.forEach((e) => {\n e.visible = !1;\n });\n }\n /**\n * 显示指定索引的补面\n * @param index 平面索引\n */\n showSection() {\n this.planeGroup.visible = !0;\n }\n /**\n * 隐藏指定索引的补面\n * @param index 平面索引\n */\n hideSection() {\n this.planeGroup.visible = !1;\n }\n /**\n * 切换所有补面的可见性\n * @returns 切换后的可见性状态\n */\n toggleSectionsVisibility() {\n let e = !1;\n return this.sectionMeshes.forEach((t) => {\n t.visible && (e = !0);\n }), e ? (this.hideSections(), !1) : (this.showSections(), !0);\n }\n /**\n * 切换指定索引补面的可见性\n * @param index 平面索引\n * @returns 切换后的可见性状态\n */\n toggleSectionVisibility(e) {\n const t = this.sectionMeshes.get(`plane_${e}`);\n return t ? (t.visible = !t.visible, t.visible) : !1;\n }\n}\nclass hp {\n engine;\n isActive = !1;\n box;\n pickPoint;\n pickNormal;\n pickMesh;\n box_;\n plane;\n meshs;\n isDrag = !1;\n maxBox;\n // CSG 剖切补面\n csgClipping = null;\n useCsgClipping = !1;\n // 是否使用 CSG 补面\n constructor(e, t) {\n this.engine = e, this.meshs = [], t?.useCsgClipping !== void 0 && (this.useCsgClipping = t.useCsgClipping), this.useCsgClipping && this.initCsgClipping();\n }\n /**\n * 初始化 CSG 剖切补面\n */\n initCsgClipping() {\n this.csgClipping = new cp(this.engine, {\n updateThrottleTime: 150,\n cacheExpireTime: 45e3\n }), this.csgClipping.planes = this.engine.sectionPlane, this.csgClipping.init();\n }\n active() {\n this.isActive || (this.engine.handelBehaved.init(this), this.engine.handelBehaved.active(), this.engine.scene.children.filter((e) => e.type == \"Group\" && e.name == \"ClippingBox\").forEach((e) => {\n e.children.forEach((t) => {\n t.name.includes(\"face\") || (t.visible = !0);\n });\n }), this.isActive = !0, this.init());\n }\n disActive() {\n this.init(), this.isActive = !1, this.engine.handelBehaved.disActive(), this.csgClipping && this.csgClipping.disActive(), this.engine.scene.children.filter((e) => e.type == \"Group\" && e.name == \"ClippingBox\").forEach((e) => {\n e.children.forEach((t) => {\n t.name.includes(\"face\") || (t.visible = !1);\n });\n }), this.engine.interactionModule.init(), this.engine.interactionModule.active();\n }\n // ********禁用*********\n disabled() {\n this.isActive = !1, this.engine.handelBehaved.disActive(), this.engine.interactionModule.init(), this.engine.interactionModule.active(), this.engine.scene.children.filter((e) => e.type == \"Group\" && e.name == \"ClippingBox\").forEach((e) => {\n e.children.forEach((t) => {\n t.name.includes(\"face\") || (t.visible = !1);\n });\n });\n }\n // *********恢复*********\n recover() {\n this.isActive || (this.engine.handelBehaved.init(this), this.engine.handelBehaved.active(), this.engine.scene.children.filter((e) => e.type == \"Group\" && e.name == \"ClippingBox\").forEach((e) => {\n e.children.forEach((t) => {\n t.name.includes(\"face\") || (t.visible = !0);\n });\n }), this.isActive = !0);\n }\n // 初始化\n init() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.maxBox = JSON.parse(JSON.stringify(e)), this.box = e, this.updata_face(e);\n }\n // 获取xyz值\n getboxXyz() {\n return {\n minX: this.box.min.x,\n minY: this.box.min.y,\n minZ: this.box.min.z,\n maxX: this.box.max.x,\n maxY: this.box.max.y,\n maxZ: this.box.max.z\n };\n }\n setboxXyz(e) {\n this.box.min.x = e.minX, this.box.min.y = e.minY, this.box.min.z = e.minZ, this.box.max.x = e.maxX, this.box.max.y = e.maxY, this.box.max.z = e.maxZ, this.updata_face(this.box);\n }\n // 设置剖切的box\n setBox(e) {\n this.box = e, this.updata_face(e);\n }\n // 反向剖切\n reverseBox() {\n }\n // 重写鼠标按下事件\n handleMouseDown(e) {\n this.isDrag = !0;\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0)\n if (this.pickPoint = t[0].point, this.pickNormal = t[0].face.normal, this.engine.controls.enabled = !1, this.pickMesh = t[0].object, this.box_ = {\n min: this.box.min.clone(),\n max: this.box.max.clone()\n }, this.pickNormal.y == 0) {\n const n = new M.Plane();\n n.setFromNormalAndCoplanarPoint(new M.Vector3(0, 1, 0), this.pickPoint), this.plane = n;\n } else {\n let n = new M.Vector3(this.engine.camera.position.x, this.pickPoint.y, this.engine.camera.position.z);\n const i = new M.Plane();\n i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint), this.plane = i;\n }\n }\n handleMouseUp(e) {\n this.isDrag = !1, this.pickPoint = null, this.pickNormal = null, this.pickMesh = null, this.engine.controls.enabled = !0, this.csgClipping && this.isActive;\n }\n handleMouseMove(e) {\n this.meshs.forEach((n) => {\n n.material.opacity = 0;\n });\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0 && (t[0].object.material.opacity = 0.05), this.pickPoint != null) {\n const n = new M.Vector3();\n if (e.raycaster.ray.intersectPlane(this.plane, n)) {\n let i = n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());\n this.pickMesh.name == \"前\" || this.pickMesh.name == \"左\" || this.pickMesh.name == \"底\" ? this.box.min = this.box_.min.clone().add(this.pickNormal.clone().setLength(i)) : this.box.max = this.box_.max.clone().add(this.pickNormal.clone().setLength(i)), this.updata_face(this.box), this.calculate_ratio();\n }\n }\n }\n // 计算比例\n calculate_ratio() {\n let e = this.maxBox.max.x - this.maxBox.min.x, t = this.maxBox.max.y - this.maxBox.min.y, n = this.maxBox.max.z - this.maxBox.min.z, i = (this.box.min.x - this.maxBox.min.x) / e * 100, s = (this.box.max.x - this.maxBox.min.x) / e * 100, r = (this.box.min.y - this.maxBox.min.y) / t * 100, a = (this.box.max.y - this.maxBox.min.y) / t * 100, l = (this.box.min.z - this.maxBox.min.z) / n * 100, h = (this.box.max.z - this.maxBox.min.z) / n * 100;\n i < 0 && (i = 0), s < 0 && (s = 0), r < 0 && (r = 0), a < 0 && (a = 0), l < 0 && (l = 0), h < 0 && (h = 0), i > 100 && (i = 100), s > 100 && (s = 100), r > 100 && (r = 100), a > 100 && (a = 100), l > 100 && (l = 100), h > 100 && (h = 100);\n let c = {\n x: {\n min: i,\n max: s\n },\n y: {\n min: r,\n max: a\n },\n z: {\n min: l,\n max: h\n }\n };\n this.engine.events.trigger(Se.SectionMove, c);\n }\n // 更新面\n updata_face(e) {\n let t = this, n = [\n new M.Vector3(e.min.x, e.min.y, e.min.z),\n new M.Vector3(e.max.x, e.min.y, e.min.z),\n new M.Vector3(e.max.x, e.max.y, e.min.z),\n new M.Vector3(e.min.x, e.max.y, e.min.z)\n ], i = [\n new M.Vector3(e.min.x, e.min.y, e.max.z),\n new M.Vector3(e.max.x, e.min.y, e.max.z),\n new M.Vector3(e.max.x, e.max.y, e.max.z),\n new M.Vector3(e.min.x, e.max.y, e.max.z)\n ], s = [\n new M.Vector3(e.max.x, e.min.y, e.max.z),\n new M.Vector3(e.max.x, e.min.y, e.min.z),\n new M.Vector3(e.max.x, e.max.y, e.min.z),\n new M.Vector3(e.max.x, e.max.y, e.max.z)\n ], r = [\n new M.Vector3(e.min.x, e.min.y, e.min.z),\n new M.Vector3(e.min.x, e.min.y, e.max.z),\n new M.Vector3(e.min.x, e.max.y, e.max.z),\n new M.Vector3(e.min.x, e.max.y, e.min.z)\n ], a = [\n new M.Vector3(e.min.x, e.max.y, e.min.z),\n new M.Vector3(e.max.x, e.max.y, e.min.z),\n new M.Vector3(e.max.x, e.max.y, e.max.z),\n new M.Vector3(e.min.x, e.max.y, e.max.z)\n ], l = [\n new M.Vector3(e.min.x, e.min.y, e.min.z),\n new M.Vector3(e.max.x, e.min.y, e.min.z),\n new M.Vector3(e.max.x, e.min.y, e.max.z),\n new M.Vector3(e.min.x, e.min.y, e.max.z)\n ];\n h(n, new M.Vector3(0, 0, -1), \"前\"), h(i, new M.Vector3(0, 0, 1), \"后\"), h(s, new M.Vector3(1, 0, 0), \"右\"), h(r, new M.Vector3(-1, 0, 0), \"左\"), h(a, new M.Vector3(0, 1, 0), \"顶\"), h(l, new M.Vector3(0, -1, 0), \"底\");\n function h(c, u, m) {\n const f = new M.BufferGeometry(), d = new Float32Array([\n c[0].x,\n c[0].y,\n c[0].z,\n // 点1\n c[1].x,\n c[1].y,\n c[1].z,\n // 点2\n c[2].x,\n c[2].y,\n c[2].z,\n // 点3\n c[3].x,\n c[3].y,\n c[3].z\n // 点4\n ]), p = [\n 0,\n 1,\n 2,\n // 第一个三角形\n 0,\n 2,\n 3\n // 第二个三角形\n ];\n f.setAttribute(\"position\", new M.BufferAttribute(d, 3)), f.setIndex(p);\n let g = t.engine.scene.children.find((E) => E.type == \"Group\" && E.name == \"ClippingBox\");\n g == null && (g = new M.Group(), g.name = \"ClippingBox\", t.engine.scene.add(g));\n let y = t.meshs.find((E) => E.name == m);\n if (y == null) {\n const E = new M.MeshBasicMaterial({\n color: 65280,\n // 绿色\n transparent: !0,\n opacity: 0,\n side: M.DoubleSide\n // 双面渲染\n });\n E.polygonOffset = !0, E.polygonOffsetFactor = 1, E.polygonOffsetUnits = 4;\n const A = new M.Mesh(f, E);\n A.normal = u, A.name = m, g.add(A), t.meshs.push(A);\n } else\n y.geometry = f;\n const w = new Float32Array([\n c[0].x,\n c[0].y,\n c[0].z,\n // 点1\n c[1].x,\n c[1].y,\n c[1].z,\n // 点2\n c[2].x,\n c[2].y,\n c[2].z,\n // 点3\n c[3].x,\n c[3].y,\n c[3].z,\n // 点4 \n c[0].x,\n c[0].y,\n c[0].z\n // 点1\n ]);\n let x = new M.LineBasicMaterial({ color: 255 }), _ = new M.BufferGeometry();\n _.setAttribute(\"position\", new M.BufferAttribute(w, 3));\n let b = t.meshs.find((E) => E.name == m + \"Line\");\n b == null && (b = new M.Line(_, x), b.name = m + \"Line\", g.add(b), t.meshs.push(b)), b.geometry = _, b.material = x, m == \"前\" || m == \"左\" || m == \"底\" ? t.engine.sectionPlane.find((E) => E.name == m).setFromNormalAndCoplanarPoint(u.clone().setLength(-1), e.min) : t.engine.sectionPlane.find((E) => E.name == m).setFromNormalAndCoplanarPoint(u.clone().setLength(-1), e.max), t.engine.scene.children.filter((E) => E.type == \"Mesh\" && E.url).forEach((E) => {\n E.material && Array.isArray(E.material) ? E.material.forEach((A) => {\n A.clippingPlanes = t.engine.sectionPlane;\n }) : E.material.clippingPlanes = t.engine.sectionPlane;\n });\n }\n }\n}\nclass up {\n engine;\n isActive = !1;\n isDrag = !1;\n meshs = [];\n box;\n pickPoint;\n pickNormal;\n pickMesh;\n box_;\n plane;\n angleX = 0;\n angleY = 0;\n angleZ = 0;\n direction = 1;\n normal = new M.Vector3(0, 0, 1);\n distance = 0;\n center = null;\n current_center = null;\n constructor(e) {\n this.engine = e, this.meshs = [], this.box = null;\n }\n // 启动\n active() {\n if (this.isActive == !0)\n return;\n this.isActive = !0, this.engine.scene.children.filter((t) => t.type == \"Group\" && t.name == \"ClippingBox\").forEach((t) => {\n t.children.forEach((n) => {\n n.name.includes(\"face\") && (n.visible = !0);\n });\n }), this.engine.handelBehaved.init(this), this.engine.handelBehaved.active();\n let e = this;\n e.engine.scene.children.filter((t) => t.type == \"Mesh\" && t.url).forEach((t) => {\n t.material && Array.isArray(t.material) ? t.material.forEach((n) => {\n n.clippingPlanes = e.engine.sectionPlane;\n }) : t.material.clippingPlanes = e.engine.sectionPlane, e.engine.clipping.clippingStencil?.addMesh(e.engine.sectionPlane.find((n) => n.name == \"face\"), t);\n }), this.init();\n }\n disActive() {\n this.init(), this.isActive = !1, this.engine.handelBehaved.disActive();\n const e = this.engine.sectionPlane.find((t) => t.name == \"face\");\n e && (e.constant = 1e5), this.engine.scene.children.filter((t) => t.type == \"Group\" && t.name == \"ClippingBox\").forEach((t) => {\n t.children.forEach((n) => {\n n.name.includes(\"face\") && (n.visible = !1);\n });\n });\n }\n // 初始化\n init() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.box = e, this.updata_face(0);\n }\n // ********禁用*********\n disabled() {\n this.isActive = !1, this.engine.handelBehaved.disActive(), this.engine.interactionModule.init(), this.engine.interactionModule.active(), this.engine.scene.children.filter((e) => e.type == \"Group\" && e.name == \"ClippingBox\").forEach((e) => {\n e.children.forEach((t) => {\n t.name.includes(\"face\") && (t.visible = !1);\n });\n });\n }\n // *********恢复*********\n recover() {\n this.isActive || (this.engine.handelBehaved.init(this), this.engine.handelBehaved.active(), this.engine.scene.children.filter((e) => e.type == \"Group\" && e.name == \"ClippingBox\").forEach((e) => {\n e.children.forEach((t) => {\n t.name.includes(\"face\") && (t.visible = !0);\n });\n }), this.isActive = !0);\n }\n // 设置面的角度和方向\n setFaceAngle(e, t, n) {\n this.angleX = e, this.angleY = t, this.angleZ = n, this.normal = new M.Vector3(0, 1, 0).applyAxisAngle(new M.Vector3(1, 0, 0), e).applyAxisAngle(new M.Vector3(0, 0, 1), t).applyAxisAngle(new M.Vector3(0, 1, 0), n), this.normal.normalize(), this.updata_face(0);\n }\n // 设置法向量\n setFaceNormal(e, t = 0) {\n this.normal = e, this.distance = t, this.updata_face(t);\n }\n reverse() {\n this.direction = this.direction * -1, this.updata_face(this.distance);\n }\n // 获取旋转角度\n getFaceAngle() {\n return {\n angleX: this.angleX,\n angleY: this.angleY,\n angleZ: this.angleZ,\n direction: this.direction\n };\n }\n // 更新面\n updata_face(e) {\n let t = this, n = t.engine.scene.children.find((C) => C.type == \"Group\" && C.name == \"ClippingBox\");\n n == null && (n = new M.Group(), n.name = \"ClippingBox\", t.engine.scene.add(n));\n let i = new M.Vector3(1, 0, 0), s = new M.Vector3(0, 1, 0), r = new M.Vector3(0, 0, 1), a, l, h = this.normal.clone().normalize(), c = Math.abs(h.dot(i)), u = Math.abs(h.dot(s)), m = Math.abs(h.dot(r));\n c <= u && c <= m ? a = i : u <= c && u <= m ? a = s : a = r, a = a.clone().sub(h.clone().multiplyScalar(a.dot(h))).normalize(), l = new M.Vector3().crossVectors(h, a).normalize();\n let f = null;\n this.center == null ? (f = new M.Vector3(\n (this.box.min.x + this.box.max.x) / 2,\n (this.box.min.y + this.box.max.y) / 2,\n (this.box.min.z + this.box.max.z) / 2\n ), this.center = f.clone()) : f = this.center.clone();\n let d = this.box.max.x - this.box.min.x, p = this.box.max.y - this.box.min.y, g = this.box.max.z - this.box.min.z, y = Math.max(\n Math.abs(a.x) * d,\n Math.abs(a.y) * p,\n Math.abs(a.z) * g\n ), w = Math.max(\n Math.abs(l.x) * d,\n Math.abs(l.y) * p,\n Math.abs(l.z) * g\n ), x = f.clone().add(a.clone().multiplyScalar(-y / 2)).add(l.clone().multiplyScalar(-w / 2)), _ = f.clone().add(a.clone().multiplyScalar(y / 2)).add(l.clone().multiplyScalar(-w / 2)), b = f.clone().add(a.clone().multiplyScalar(y / 2)).add(l.clone().multiplyScalar(w / 2)), E = f.clone().add(a.clone().multiplyScalar(-y / 2)).add(l.clone().multiplyScalar(w / 2));\n x.add(h.clone().multiplyScalar(e)), _.add(h.clone().multiplyScalar(e)), b.add(h.clone().multiplyScalar(e)), E.add(h.clone().multiplyScalar(e)), this.current_center = f.clone().add(h.clone().multiplyScalar(e)), P([x, _, b, E], h, \"face\");\n function P(C, D, I) {\n const T = new M.BufferGeometry(), R = new Float32Array([\n C[0].x,\n C[0].y,\n C[0].z,\n // 点1\n C[1].x,\n C[1].y,\n C[1].z,\n // 点2\n C[2].x,\n C[2].y,\n C[2].z,\n // 点3\n C[3].x,\n C[3].y,\n C[3].z\n // 点4\n ]), v = [\n 0,\n 1,\n 2,\n // 第一个三角形\n 0,\n 2,\n 3\n // 第二个三角形\n ];\n T.setAttribute(\"position\", new M.BufferAttribute(R, 3)), T.setIndex(v);\n let z = t.meshs.find(($) => $.name == I);\n if (z == null) {\n const $ = new M.MeshBasicMaterial({\n color: 65280,\n // 绿色\n transparent: !0,\n opacity: 0.02,\n side: M.DoubleSide\n // 双面渲染\n });\n $.polygonOffset = !0, $.polygonOffsetFactor = 1, $.polygonOffsetUnits = 4;\n const N = new M.Mesh(T, $);\n N.normal = D, N.name = I, n.add(N), t.meshs.push(N);\n } else\n z.geometry = T;\n const H = new Float32Array([\n C[0].x,\n C[0].y,\n C[0].z,\n // 点1\n C[1].x,\n C[1].y,\n C[1].z,\n // 点2\n C[2].x,\n C[2].y,\n C[2].z,\n // 点3\n C[3].x,\n C[3].y,\n C[3].z,\n // 点4 \n C[0].x,\n C[0].y,\n C[0].z\n // 点1\n ]);\n let V = new M.LineBasicMaterial({ color: 255 }), te = new M.BufferGeometry();\n te.setAttribute(\"position\", new M.BufferAttribute(H, 3));\n let G = t.meshs.find(($) => $.name == I + \"Line\");\n G == null && (G = new M.Line(te, V), G.name = I + \"Line\", n.add(G), t.meshs.push(G)), G.geometry = te, G.material = V, t.engine.sectionPlane.find(($) => $.name == I).setFromNormalAndCoplanarPoint(D.clone().setLength(t.direction), C[0]);\n }\n }\n // 重写鼠标按下事件\n handleMouseDown(e) {\n this.isDrag = !0;\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0)\n if (this.pickPoint = t[0].point, this.pickNormal = t[0].face.normal, this.engine.controls.enabled = !1, this.pickMesh = t[0].object, this.box_ = {\n min: this.box.min.clone(),\n max: this.box.max.clone()\n }, this.center = this.current_center.clone(), this.pickNormal.y == 0) {\n const n = new M.Plane();\n n.setFromNormalAndCoplanarPoint(new M.Vector3(0, 1, 0), this.pickPoint), this.plane = n;\n } else {\n let n = new M.Vector3(this.engine.camera.position.x, this.pickPoint.y, this.engine.camera.position.z);\n const i = new M.Plane();\n i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint), this.plane = i;\n }\n }\n handleMouseUp(e) {\n this.isDrag = !1, this.pickPoint = null, this.pickNormal = null, this.pickMesh = null, this.engine.controls.enabled = !0;\n }\n handleMouseMove(e) {\n this.meshs.forEach((n) => {\n n.material.opacity = 0;\n });\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0 && (t[0].object.material.opacity = 0.05), this.pickPoint != null) {\n const n = new M.Vector3();\n if (e.raycaster.ray.intersectPlane(this.plane, n)) {\n let i = n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());\n this.distance = i, this.updata_face(this.distance);\n }\n }\n }\n}\nclass dp {\n engine;\n callback_;\n constructor(e) {\n this.engine = e;\n }\n init() {\n this.engine.handelBehaved.init(this, { showCatch: !0 }), this.engine.handelBehaved.active();\n }\n // 选择面,用于面的剖切\n catch_face(e) {\n this.callback_ = e;\n }\n // 鼠标移动\n handleMouseMove(e) {\n }\n // 鼠标按下\n handleMouseClick(e) {\n let t = e.catch.normal;\n this.engine.handelBehaved.disActive(), this.callback_({\n dir: t,\n position: e.catch.point\n });\n }\n}\nclass fp {\n engine;\n sectionBox;\n sectionFace;\n clippingStencil;\n currentClippingMode = \"\";\n constructor(e) {\n this.engine = e;\n let t = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n t.name = \"前\";\n let n = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n n.name = \"左\";\n let i = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n i.name = \"后\";\n let s = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n s.name = \"右\";\n let r = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n r.name = \"顶\";\n let a = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n a.name = \"底\";\n let l = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n l.name = \"face\", this.engine.sectionPlane = [t, n, i, s, r, a, l];\n }\n init() {\n this.sectionBox = new hp(this.engine), this.sectionFace = new up(this.engine);\n }\n // 自动缩放适用的视图比例\n scaleBox() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.sectionBox.setBox(e);\n }\n // ****************************剖切指定摸******************************* \n clippingModel(e) {\n let t = [];\n e.forEach((s) => {\n let r = this.engine.models.find((a) => a.url === s.url);\n s.ids.forEach((a) => {\n r.nodesMap.get(a).infos.forEach((l) => {\n t.push(l.box);\n });\n });\n }), this.active(\"box\");\n let n = i(t);\n this.sectionBox.setBox(n);\n function i(s) {\n let r = new M.Vector3(1e8, 1e9, 1e10), a = new M.Vector3(-1e8, -1e9, -1e10);\n return s.forEach((l) => {\n l.min.x < r.x && (r.x = l.min.x), l.min.y < r.y && (r.y = l.min.y), l.min.z < r.z && (r.z = l.min.z), l.max.x > a.x && (a.x = l.max.x), l.max.y > a.y && (a.y = l.max.y), l.max.z > a.z && (a.z = l.max.z);\n }), new M.Box3(r, a);\n }\n }\n // ****************************更新剖切值*******************************\n updateClippingValue(e) {\n let t = this.sectionBox.maxBox, n = t.min.x + (t.max.x - t.min.x) * e.x.min * 0.01, i = t.min.y + (t.max.y - t.min.y) * e.y.min * 0.01, s = t.min.z + (t.max.z - t.min.z) * e.z.min * 0.01, r = t.min.x + (t.max.x - t.min.x) * e.x.max * 0.01, a = t.min.y + (t.max.y - t.min.y) * e.y.max * 0.01, l = t.min.z + (t.max.z - t.min.z) * e.z.max * 0.01;\n this.sectionBox.setboxXyz({\n minX: n,\n minY: i,\n minZ: s,\n maxX: r,\n maxY: a,\n maxZ: l\n });\n }\n // *********************************切换剖切模式*********************************** //\n active(e) {\n if (this.sectionFace.disActive(), this.sectionBox.disActive(), this.currentClippingMode = e, e == \"x\")\n this.sectionFace.init(), this.sectionFace.active(), this.sectionFace.setFaceAngle(Math.PI / 2, 0, 0);\n else if (e == \"y\")\n this.sectionFace.init(), this.sectionFace.active(), this.sectionFace.setFaceAngle(0, Math.PI / 2, 0);\n else if (e == \"z\")\n this.sectionFace.init(), this.sectionFace.active(), this.sectionFace.setFaceAngle(0, 0, Math.PI / 2);\n else if (e == \"box\")\n this.sectionBox.init(), this.sectionBox.active();\n else if (e == \"face\") {\n let t = new dp(this.engine);\n t.init(), t.catch_face((n) => {\n this.sectionFace.init(), this.sectionFace.active();\n let i = this.engine.octreeBox.getBoundingBox(), s = n.position.clone().sub(i.min.clone().add(i.max.clone()).setLength(0.5)), r = new M.Vector3(n.dir.x, n.dir.y, n.dir.z), a = s.dot(r);\n this.sectionFace.setFaceNormal(n.dir, a);\n });\n }\n }\n // *********************************禁用剖切*********************************\n disabled() {\n this.currentClippingMode == \"box\" ? this.sectionBox.disabled() : this.sectionFace.disabled();\n }\n // ****************************恢复剖切*********************************\n recover() {\n this.currentClippingMode == \"box\" ? this.sectionBox.recover() : this.sectionFace.recover();\n }\n // ****************************反向剖切*********************************\n reverse() {\n this.sectionFace.reverse();\n }\n // 整体禁用\n disActive() {\n this.sectionFace.disActive(), this.sectionBox.disActive(), this.currentClippingMode = \"\";\n }\n}\nclass pp {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 获取轴网的模型树\n getLevelTreeData() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n e.push({\n children: t.info.modelTree.modelTreeLevel,\n name: t.info.baseInfo.name,\n url: t.url\n });\n }), e;\n }\n // 获取类型的模型树\n getTypeTreeData() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n e.push({\n children: t.info.modelTree.modelTreeType,\n name: t.info.baseInfo.name,\n url: t.url\n });\n }), e;\n }\n // 获取专业的模型树\n getMajorTreeData() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n e.push({\n children: t.info.modelTree.modelTreeMajor,\n name: t.info.baseInfo.name,\n url: t.url\n });\n }), e;\n }\n}\nclass mp {\n engine;\n constructor(e) {\n this.engine = e;\n }\n /**\n * 获取引擎统计信息\n * 统计场景中所有网格的顶点数和三角面数\n * @returns 返回包含顶点数和三角面数的对象\n */\n getEngineInfo() {\n let e = 0, t = 0, n = 0;\n return !this.engine || !this.engine.scene ? {\n totalVertices: 0,\n totalTriangles: 0,\n meshCount: 0\n } : (this.engine.scene.traverse((i) => {\n if (i instanceof M.Mesh) {\n const s = i.geometry;\n if (s && s.attributes) {\n const r = s.attributes.position;\n if (r) {\n const a = r.count;\n e += a;\n let l = 0;\n s.index ? l = s.index.count / 3 : l = a / 3, t += l;\n }\n }\n }\n }), this.engine.engineStatus.models.forEach((i) => {\n n = n + i.info.modelEdge.length;\n }), {\n totalVertices: Math.floor(e),\n totalTriangles: Math.floor(t),\n meshCount: n\n });\n }\n}\nclass gp {\n engine;\n constructor(e) {\n this.engine = e;\n }\n init() {\n }\n // 查询构件属性\n getModelProperties(e, t, n) {\n let i = this.engine.engineStatus.models.find((r) => r.url === e);\n i.properties == null && Da(e + \"/property\", (r) => {\n let a = JSON.parse(r);\n i.properties = a, setTimeout(() => {\n s(a, t, n);\n }, 100);\n }), s(i.properties, t, n);\n function s(r, a, l) {\n let h = [], c = r.models[a.toString() || \"\"], u = c.map((m) => m[0]);\n u = u.filter((m, f) => u.indexOf(m) === f), u.forEach((m) => {\n let f = {\n name: r.categorys[m],\n children: []\n };\n h.push(f), c.filter((d) => d[0] === m).forEach((d) => {\n f.children.push({\n name: r.names[d[1]],\n value: r.values[d[2]]\n });\n });\n }), l?.({\n properties: h,\n materials: h\n });\n }\n }\n}\nclass yp {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 获取模型中所有的类型\n getModelTypes() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n t.info.modelMapper.forEach((i) => {\n e.push(i.typeName);\n });\n }), e = e.filter((t, n, i) => i.indexOf(t) === n), e;\n }\n // 获取模型中所有的专业\n getModelMajors() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n t.info.modelMapper.forEach((i) => {\n e.push(i.majorName);\n });\n }), e = e.filter((t, n, i) => i.indexOf(t) === n), e;\n }\n // 获取模型中所有的楼层\n getModelLevels() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n t.info.modelMapper.forEach((i) => {\n e.push(i.levelName);\n });\n }), e = e.filter((t, n, i) => i.indexOf(t) === n), e;\n }\n // 批量获取模型映射\n getModelMappers(e) {\n }\n // 获取模型的mapper\n getModelMapper(e, t) {\n let n = this.engine.engineStatus.models.find((r) => r.url == e);\n return n ? n.info.modelMapper.find((r) => r.id == t) : null;\n }\n // 获取同层同类构件\n getModelsWithLevelType(e, t, n = null) {\n let i = [];\n return this.engine.engineStatus.models.forEach((s) => {\n let r = {\n url: s.url,\n ids: []\n };\n i.push(r), s.info.modelMapper.filter((l) => l.levelName === e && l.typeName === t).forEach((l) => {\n r.ids.push(Number(l.id));\n });\n }), n && n(i), i;\n }\n // 获取同类型构件\n getModelsWithType(e, t = null) {\n let n = [];\n return this.engine.engineStatus.models.forEach((i) => {\n let s = {\n url: i.url,\n ids: []\n };\n n.push(s), i.info.modelMapper.filter((a) => a.typeName === e).forEach((a) => {\n s.ids.push(Number(a.id));\n });\n }), t && t(n), n;\n }\n // 获取同楼层构件\n getModelsWithLevel(e, t) {\n let n = [];\n return this.engine.engineStatus.models.forEach((i) => {\n let s = {\n url: i.url,\n ids: []\n };\n n.push(s), i.info.modelMapper.filter((a) => a.levelName === e).forEach((a) => {\n s.ids.push(Number(a.id));\n });\n }), t && t(n), n;\n }\n // 获取通专业构件 \n getModelsWithMajor(e, t) {\n let n = [];\n return this.engine.engineStatus.models.forEach((i) => {\n let s = {\n url: i.url,\n ids: []\n };\n n.push(s), i.info.modelMapper.filter((a) => a.majorName === e).forEach((a) => {\n s.ids.push(Number(a.id));\n });\n }), t && t(n), n;\n }\n}\nclass wp {\n engine;\n isActive = !1;\n groupEdge;\n material;\n modelEdgeLoaded = !1;\n indexes = /* @__PURE__ */ new Map();\n constructor(e) {\n this.engine = e, this.groupEdge = this.engine.scene.getObjectByName(\"groupEdge\"), this.material = new M.LineBasicMaterial({\n color: \"#000000\",\n depthTest: !0,\n transparent: !0,\n opacity: 0.3\n }), this.material.clippingPlanes = this.engine.sectionPlane;\n }\n // 启动\n active() {\n this.isActive = !0, this.groupEdge.visible = !0, this.engine.scene.traverse((e) => {\n e.isMesh && e.material && (Array.isArray(e.material) ? e.material : [e.material]).forEach((n) => {\n n.polygonOffset = !0, n.polygonOffsetFactor = 1, n.polygonOffsetUnits = 4;\n });\n }), this.show();\n }\n // 关闭\n disActive() {\n this.isActive = !1, this.groupEdge.visible = !1, this.engine.scene.traverse((e) => {\n e.isMesh && e.material && (Array.isArray(e.material) ? e.material : [e.material]).forEach((n) => {\n n.polygonOffset = !1;\n });\n });\n }\n loadModelEdge() {\n this.modelEdgeLoaded || (this.engine.engineStatus.models.forEach((e) => {\n if (!this.groupEdge.children.find((n) => n.url == e.url)) {\n let n = e.info, i = [], s = /* @__PURE__ */ new Map();\n n.modelEdge.forEach((r) => {\n let a = i.length;\n for (let l = 0; l < r.points.length; l++)\n r.points[l].length == 2 && (i.push(r.points[l][0].X), i.push(r.points[l][0].Z), i.push(-r.points[l][0].Y), i.push(r.points[l][1].X), i.push(r.points[l][1].Z), i.push(-r.points[l][1].Y));\n s.set(Number(r.id), [a, i.length, r.points]);\n }), this.indexes.set(e.url, s);\n }\n }), this.modelEdgeLoaded = !0);\n }\n // 显示模型边线\n show() {\n this.modelEdgeLoaded || this.loadModelEdge(), this.indexes.forEach((e, t) => {\n let n = [];\n e.forEach((r, a) => {\n r[2].forEach((l, h) => {\n l.length == 2 && (n.push(l[0].X), n.push(l[0].Z), n.push(-l[0].Y), n.push(l[1].X), n.push(l[1].Z), n.push(-l[1].Y));\n });\n });\n let i = new M.BufferGeometry();\n i.setAttribute(\"position\", new M.Float32BufferAttribute(n, 3));\n let s = new M.LineSegments(i, this.material);\n s.url = t, this.groupEdge.add(s);\n });\n }\n // 获取指定模型的边线\n getModelEdge(e, t) {\n let n = this.indexes.get(e);\n if (n) {\n let i = n.get(t);\n if (i)\n return i.slice();\n }\n return null;\n }\n //隐藏边线\n hideModelEdge(e, t) {\n let n = this.indexes.get(e);\n if (n) {\n let i = n.get(t);\n if (i) {\n let [s, r, a] = i, l = this.groupEdge.children.find((h) => h.url == e);\n if (l) {\n let h = l.geometry.attributes.position.array;\n for (let c = s; c < r; c++)\n h[c] = NaN;\n l.geometry.attributes.position.needsUpdate = !0;\n }\n }\n }\n }\n // 显示边线\n showModelEdge(e, t) {\n let n = this.indexes.get(e);\n if (n) {\n let i = n.get(t);\n if (i) {\n let [s, r, a] = i, l = this.groupEdge.children.find((h) => h.url == e);\n if (l) {\n let h = l.geometry.attributes.position.array, c = 0;\n for (let u = s; u < r; u += 3) {\n const m = Math.floor(c / 6), f = c % 6 >= 3;\n if (a[m] && a[m].length === 2) {\n const d = f ? a[m][1] : a[m][0];\n h[u] = d.X, h[u + 1] = d.Z, h[u + 2] = -d.Y;\n }\n c += 3;\n }\n l.geometry.attributes.position.needsUpdate = !0;\n }\n }\n }\n }\n}\nclass xp {\n config;\n constructor(e) {\n this.config = {\n temperature: 0.7,\n maxTokens: 2e4,\n timeout: 3e5,\n ...e\n };\n }\n /**\n * 发送消息并获取响应(非流式)\n */\n async chat(e) {\n const t = new AbortController(), n = setTimeout(() => t.abort(), this.config.timeout);\n try {\n const i = await fetch(`${this.config.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`\n },\n body: JSON.stringify({\n model: this.config.model,\n messages: e,\n temperature: this.config.temperature,\n max_tokens: this.config.maxTokens,\n stream: !1\n }),\n signal: t.signal\n });\n if (clearTimeout(n), !i.ok) {\n const r = await i.json().catch(() => ({}));\n throw new Error(\n `API请求失败 (${i.status}): ${r.error?.message || r.message || i.statusText}`\n );\n }\n return (await i.json()).choices?.[0]?.message?.content || \"\";\n } catch (i) {\n throw clearTimeout(n), i.name === \"AbortError\" ? new Error(\"请求超时,请重试\") : i.message.includes(\"Failed to fetch\") ? new Error(`网络请求失败,请检查:\n1. 网络连接\n2. API地址是否正确\n3. 是否有CORS限制`) : i;\n }\n }\n /**\n * 发送消息并获取流式响应\n */\n async chatStream(e, t) {\n const n = new AbortController(), i = setTimeout(() => n.abort(), this.config.timeout);\n try {\n const s = await fetch(`${this.config.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`\n },\n body: JSON.stringify({\n model: this.config.model,\n messages: e,\n temperature: this.config.temperature,\n max_tokens: this.config.maxTokens,\n stream: !0\n }),\n signal: n.signal\n });\n if (clearTimeout(i), !s.ok) {\n const h = await s.json().catch(() => ({}));\n throw new Error(\n `API请求失败 (${s.status}): ${h.error?.message || h.message || s.statusText}`\n );\n }\n const r = s.body?.getReader();\n if (!r)\n throw new Error(\"无法读取响应流\");\n const a = new TextDecoder();\n let l = \"\";\n for (; ; ) {\n const { done: h, value: c } = await r.read();\n if (h) {\n t(\"\", !0);\n break;\n }\n l += a.decode(c, { stream: !0 });\n const u = l.split(`\n`);\n l = u.pop() || \"\";\n for (const m of u) {\n const f = m.trim();\n if (!f || !f.startsWith(\"data: \")) continue;\n const d = f.slice(6);\n if (d !== \"[DONE]\")\n try {\n const g = JSON.parse(d).choices?.[0]?.delta?.content;\n g && t(g, !1);\n } catch (p) {\n console.warn(\"解析流式数据失败:\", p);\n }\n }\n }\n } catch (s) {\n throw clearTimeout(i), s.name === \"AbortError\" ? new Error(\"请求超时,请重试\") : s.message.includes(\"Failed to fetch\") ? new Error(\"网络请求失败,请检查网络连接\") : s;\n }\n }\n /**\n * 更新配置\n */\n updateConfig(e) {\n this.config = { ...this.config, ...e };\n }\n /**\n * 获取当前配置\n */\n getConfig() {\n return { ...this.config };\n }\n}\nclass _p {\n /** 引擎实例 */\n engine;\n /** 步骤列表 */\n steps = [];\n /** 步骤执行结果 */\n stepResults = /* @__PURE__ */ new Map();\n /** 对话历史 */\n conversationHistory = [];\n /** 当前状态 */\n state = \"idle\";\n /** 大模型API实例 */\n llmApi = null;\n /** 配置 */\n config = null;\n /** 回调信息 */\n _callback_message;\n _callback_question;\n _callback_content;\n /** 提示词缓存 */\n prompts = {};\n /**\n * 构造函数\n * @param engine 引擎实例\n */\n constructor(e) {\n this.engine = e;\n }\n /**\n * 初始化AI管理器\n * @param config 对话配置\n */\n async init(e, t, n) {\n this._callback_message = e, this._callback_question = t, this._callback_content = n, this.conversationHistory = [];\n let i = {\n llmConfig: {\n baseURL: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n apiKey: \"4041336a72f14d8fa3800bd651a80fec.vZWUxssXOXB37vlV\",\n model: \"GLM-4.5-Air\",\n temperature: 0.7,\n maxTokens: 2e3\n },\n debug: !0,\n stepExecution: {\n // 默认允许 1 次重试:当 AI 生成的代码偶发不可执行/缺参数时,会自动让 AI 修复后再跑一次\n maxRetries: 5\n },\n prompts: {\n main: \"\",\n step: \"\",\n apiDoc: \"\"\n }\n };\n try {\n this.config = i, this.llmApi = new xp(i.llmConfig);\n try {\n const s = await import(\"./main-2Txx2Vau.mjs\");\n this.prompts.main = s.default;\n const r = await import(\"./step-CkmZYIvn.mjs\");\n this.prompts.step = r.default;\n const a = await import(\"./API文档-B1v8UcRF.mjs\");\n this.prompts.apiDoc = a.default;\n } catch (s) {\n throw console.error(\"[AI Manager] 提示词文件加载失败:\", s), new Error(`提示词文件加载失败: ${s.message || \"未知错误\"}`);\n }\n } catch (s) {\n throw console.error(\"[AI Manager] 初始化失败:\", s), s;\n }\n }\n /**\n * 处理对话,与大模型进行交互\n * callback_message:\n * @param callback_message 回调消息\n * @param callback_question 回调问题\n * @param callback_content 回调内容\n */\n async conversationV2(e) {\n if (this.conversationHistory.length === 0) {\n const i = {\n role: \"system\",\n content: `${this.prompts.main}`\n }, s = {\n role: \"system\",\n content: `## BIM引擎API文档\n${this.prompts.apiDoc}`\n };\n this.conversationHistory.push(i), this.conversationHistory.push(s);\n }\n this.conversationHistory.push({\n role: \"user\",\n content: e\n });\n const t = await this.llmApi.chat(this.conversationHistory);\n this.conversationHistory.push({\n role: \"assistant\",\n content: t\n }), this.config?.debug && console.log(\"[AI Manager] 大模型响应:\", t);\n let n = await this.parseAnalysisResponse(t);\n n && n.questions && n.questions.length > 0 && this._callback_question(n.questions);\n }\n /**\n * 解析分析响应\n */\n async parseAnalysisResponse(e) {\n try {\n if (e.includes(\"##question##\")) {\n const t = e.match(/##question##\\s*([\\s\\S]*?)(?=##|$)/);\n if (t) {\n let n = t[1].trim();\n n = n.replace(/^```json\\n?/, \"\").replace(/^```\\n?/, \"\").replace(/\\n?```$/, \"\");\n const i = n.match(/(\\[[\\s\\S]*\\])/);\n i && (n = i[1]);\n const s = JSON.parse(n);\n return this.state = \"waiting_answer\", {\n state: \"waiting_answer\",\n questions: s\n };\n }\n }\n if (e.includes(\"##steps##\")) {\n const t = e.match(/##steps##\\s*([\\s\\S]*?)(?=##|$)/);\n if (t) {\n let n = t[1].trim();\n n = n.replace(/^```json\\n?/, \"\").replace(/^```\\n?/, \"\").replace(/\\n?```$/, \"\");\n const i = n.match(/(\\[[\\s\\S]*\\])/);\n return i && (n = i[1]), this.steps = JSON.parse(n), this.config?.debug && console.log(\"[AI Manager] 步骤规划完成,共\", this.steps.length, \"个步骤\"), this._callback_message(this.steps), await this.executeSteps();\n }\n }\n return {\n state: \"completed\",\n data: e\n };\n } catch (t) {\n return console.error(\"[AI Manager] 解析响应失败:\", t), {\n state: \"error\",\n error: \"解析大模型响应失败: \" + t.message\n };\n }\n }\n /**\n * 执行步骤\n */\n async executeSteps() {\n try {\n this.state = \"executing\", this.stepResults.clear();\n for (const e of this.steps) {\n this._callback_message(e), this.config?.debug && console.log(`[AI Manager] 执行步骤 ${e.id}: ${e.content}`);\n const t = await this.getDependenciesOutput(e.dependencies), n = await this.executeStep(e, t);\n this.stepResults.set(e.id, n), this.config?.debug && console.log(`[AI Manager] 步骤 ${e.id} 执行完成:`, n);\n }\n return this.state = \"completed\", {\n state: \"completed\",\n steps: this.steps,\n result: Array.from(this.stepResults.values())\n };\n } catch (e) {\n return console.error(\"[AI Manager] 步骤执行失败:\", e), {\n state: \"error\",\n error: \"步骤执行失败: \" + e.message\n };\n }\n }\n /**\n * 获取依赖步骤的输出\n */\n async getDependenciesOutput(e) {\n return e.length === 0 ? null : e.length === 1 ? this.stepResults.get(e[0]) : e.map((t) => this.stepResults.get(t));\n }\n /**\n * 执行单个步骤\n */\n async executeStep(e, t) {\n const n = this.config?.stepExecution?.maxRetries ?? 1, i = [];\n let s = null, r = !1;\n for (let a = 0; a <= n; a++)\n try {\n const l = i.length > 0 ? i[i.length - 1] : \"\", c = await (a === 0 ? this.generateCode(e, t) : r ? this.regenerateCodeAfterFailure(e, t, l, s, a) : this.generateCode(e, t));\n i.push(c), this.config?.debug && console.log(`[AI Manager] 步骤 ${e.id} 第 ${a + 1} 次生成的代码:\n${c}`);\n try {\n const u = await this.executeCode(c, t);\n if (u instanceof Object && u.success == !1 || u instanceof String && (u.includes(\"undefined\") || u.includes(\"not\"))) {\n s = u, r = !0;\n debugger;\n throw u;\n }\n debugger;\n return u;\n } catch (u) {\n debugger;\n throw s = u, r = !0, u;\n }\n } catch (l) {\n if (r || (s = l), a >= n)\n throw console.error(`[AI Manager] 执行步骤 ${e.id} 失败(已达重试上限):`, l), new Error(`步骤 ${e.id} (${e.content}) 执行失败: ${l.message}`);\n console.warn(\n `[AI Manager] 步骤 ${e.id} 第 ${a + 1} 次执行失败,将尝试让AI修复后重试(剩余重试次数:${n - a}):`,\n l\n );\n }\n throw new Error(`步骤 ${e.id} (${e.content}) 执行失败: 未知错误`);\n }\n /**\n * 从大模型响应中提取代码(容错处理)\n * 优先尝试从 ##code## 标记中提取,如果没有则尝试从 markdown 代码块中提取\n * @param response 大模型响应文本\n * @returns 提取的代码字符串\n */\n extractCodeFromResponse(e) {\n const t = e.match(/##code##\\s*([\\s\\S]*?)(?=##|$)/);\n if (t) {\n let r = t[1].trim();\n if (r = r.replace(/^```javascript\\n?/, \"\").replace(/^```js\\n?/, \"\").replace(/^```\\n?/, \"\").replace(/\\n?```$/, \"\"), r.length > 0)\n return r;\n }\n const n = [\n /```javascript\\s*([\\s\\S]*?)```/i,\n // ```javascript ... ```\n /```js\\s*([\\s\\S]*?)```/i,\n // ```js ... ```\n /```\\s*([\\s\\S]*?)```/\n // ``` ... ```(通用代码块)\n ];\n for (const r of n) {\n const a = e.match(r);\n if (a && a[1]) {\n const l = a[1].trim();\n if (l.length > 0)\n return this.config?.debug && console.warn(\"[AI Manager] 未找到 ##code## 标记,从 markdown 代码块中提取代码\"), l;\n }\n }\n const i = /[请|说明|注意|需要|应该|可以|如果|但是|因为|所以|例如|比如]/i.test(e), s = /(function|const|let|var|return|async|await|=>|engine\\.|previousStepOutput)/.test(e);\n if (!i && s) {\n const a = e.trim().replace(/^[,。:;!?\\s]+/, \"\").replace(/[,。:;!?\\s]+$/, \"\");\n if (a.length > 10)\n return this.config?.debug && console.warn(\"[AI Manager] 未找到 ##code## 标记和代码块,尝试使用整个响应作为代码\"), a;\n }\n throw new Error(`无法从大模型响应中提取代码。响应内容:${e.substring(0, 200)}...`);\n }\n /**\n * 生成代码\n */\n async generateCode(e, t) {\n try {\n const n = {\n role: \"system\",\n content: `${this.prompts.step}`\n }, i = {\n role: \"system\",\n content: `\n\n## BIM引擎API文档\n${this.prompts.apiDoc}`\n }, s = {\n role: \"user\",\n content: `请根据以下步骤描述生成可执行的JavaScript代码:\n\n步骤信息:\n${JSON.stringify(e, null, 2)}\n\n前序步骤输出数据:\n${t ? JSON.stringify(t, null, 2) : \"null\"}\n\n请严格按照##code##格式输出代码。`\n }, r = [n, i, s], a = await this.llmApi.chat(r);\n return this.extractCodeFromResponse(a);\n } catch (n) {\n throw console.error(\"[AI Manager] 代码生成失败:\", n), n;\n }\n }\n /**\n * 执行失败后,让 AI 基于“错误信息 + 上一次代码”进行修复再生成\n * @param attempt 当前是第几次重试(从 1 开始)\n */\n async regenerateCodeAfterFailure(e, t, n, i, s) {\n try {\n const r = {\n role: \"system\",\n content: `${this.prompts.step}`\n }, a = {\n role: \"system\",\n content: `\n\n## BIM引擎API文档\n${this.prompts.apiDoc}`\n }, l = {\n message: i?.message || (i instanceof Object ? JSON.stringify(i) : String(i)),\n name: i?.name,\n stack: i?.stack\n }, h = {\n role: \"user\",\n content: `上一次生成的代码在执行时失败了,请你修复后重新输出完整可执行的 JavaScript 代码(仍然要严格按 ##code## 格式输出)。\n\n当前步骤信息:\n${JSON.stringify(e, null, 2)}\n\n前序步骤输出数据:\n${t ? JSON.stringify(t, null, 2) : \"null\"}\n\n上一次生成的代码:\n${n ? `\n\\`\\`\\`javascript\n${n}\n\\`\\`\\`\n` : `\n(无)\n`}\n\n执行错误信息(第 ${s} 次重试前):\n${JSON.stringify(l, null, 2)}\n\n修复要求(请务必遵守):\n1) 不要输出解释文字,只输出 ##code## 段落里的代码\n2) 如果是语法错误/引用未定义/缺少 await/返回值不一致,请直接修复\n3) 尽量保持与步骤目标一致,避免引入与步骤无关的副作用\n4) 代码需要能在浏览器环境运行(不要使用 Node 专属 API)`\n }, c = await this.llmApi.chat([r, a, h]);\n try {\n return this.extractCodeFromResponse(c);\n } catch (u) {\n throw new Error(`无法从大模型响应中提取代码(修复重试阶段):${u.message}`);\n }\n } catch (r) {\n throw console.error(\"[AI Manager] 修复后代码生成失败:\", r), r;\n }\n }\n /**\n * 执行代码\n */\n async executeCode(e, t) {\n try {\n const n = this.engine;\n let i = e;\n i = i.replace(/\\b(const|let|var)\\s+previousStepOutput\\s*=\\s*[^;]*;/g, \"\"), i = i.replace(/\\b(const|let|var)\\s+previousStepOutput\\s*;/g, \"\");\n const r = new Function(\"engine\", \"previousStepOutput\", `\n 'use strict';\n ${i}\n `)(n, t);\n return r && typeof r.then == \"function\" ? await r : r;\n } catch (n) {\n return console.error(\"[AI Manager] 代码执行失败:\", n), \"error\" + n.message;\n }\n }\n /**\n * 重置对话\n */\n reset() {\n this.conversationHistory = [], this.steps = [], this.stepResults.clear(), this.state = \"idle\", this.config?.debug && console.log(\"[AI Manager] 对话已重置\");\n }\n /**\n * 获取当前状态\n */\n getState() {\n return this.state;\n }\n /**\n * 获取对话历史\n */\n getHistory() {\n return [...this.conversationHistory];\n }\n /**\n * 获取步骤列表\n */\n getSteps() {\n return [...this.steps];\n }\n /**\n * 获取步骤结果\n */\n getStepResults() {\n return new Map(this.stepResults);\n }\n}\nclass vp {\n engine;\n /** 点位列表 */\n points = [];\n /** 是否正在播放 */\n isPlaying = !1;\n /** 动画帧ID */\n animationFrameId = null;\n /** 播放开始时间 */\n playStartTime = 0;\n /** 当前播放的起止点位索引 */\n playFromIndex = 0;\n playToIndex = 0;\n /** 当前播放配置 */\n playOptions = {};\n /** 停留定时器ID */\n stayTimerId = null;\n /** 播放范围的结束索引 */\n playRangeToIndex = 0;\n constructor(e) {\n this.engine = e;\n }\n /**\n * 初始化管理器\n */\n init() {\n this.points = [], this.stop();\n }\n /**\n * 获取当前相机点位\n * @returns 当前相机的姿态信息\n */\n getCurrentPoint() {\n return {\n ...this.engine.cameraModule.getCameraPose(),\n stayTime: 0\n };\n }\n /**\n * 添加点位\n * @param point 可选,如果不传则使用当前相机位置\n * @param stayTime 停留时间(毫秒),默认0\n * @returns 添加后的点位列表长度\n */\n addPoint(e = 0) {\n const t = this.getCurrentPoint();\n return t.stayTime = e, this.points.push(t), this.points.length;\n }\n /**\n * 批量添加点位\n * @param points 点位数组\n * @returns 添加后的点位列表长度\n */\n addPoints(e) {\n for (const t of e)\n this.points.push({ ...t });\n return this.points.length;\n }\n /**\n * 保存点位清单(别名方法)\n * @param points 点位数组\n * @returns 添加后的点位列表长度\n */\n savePoints(e) {\n return this.addPoints(e);\n }\n /**\n * 删除指定索引的点位\n * @param index 点位索引\n * @returns 是否删除成功\n */\n removePoint(e) {\n return e >= 0 && e < this.points.length ? (this.points.splice(e, 1), !0) : !1;\n }\n /**\n * 清空所有点位\n */\n clearPoints() {\n this.stop(), this.points = [];\n }\n /**\n * 获取所有点位\n * @returns 点位数组\n */\n getPoints() {\n return [...this.points];\n }\n /**\n * 获取点位数量\n * @returns 点位数量\n */\n getPointCount() {\n return this.points.length;\n }\n /**\n * 更新指定索引的点位\n * @param index 点位索引\n * @param point 新的点位信息\n * @returns 是否更新成功\n */\n updatePoint(e, t) {\n return e >= 0 && e < this.points.length ? (this.points[e] = { ...t }, !0) : !1;\n }\n /**\n * 跳转到指定点位(无动画)\n * @param index 点位索引\n * @returns 是否跳转成功\n */\n jumpToPoint(e) {\n return e >= 0 && e < this.points.length ? (this.stop(), this.engine.cameraModule.restoreCameraPose(this.points[e]), !0) : !1;\n }\n /**\n * 播放路径动画\n * @param options 播放配置\n * @returns 是否开始播放\n */\n play(e = {}) {\n return this.points.length < 2 ? (console.warn(\"PathRoaming: 至少需要2个点位才能播放\"), !1) : (this.isPlaying && this.stop(), this.isPlaying = !0, this.playOptions = {\n duration: 3e3,\n // 默认每个过渡3秒\n loop: !1,\n ...e\n }, this.engine.controlModule.disActive(), this.playFromIndex = 0, this.playToIndex = 1, this.playRangeToIndex = this.points.length - 1, this.playStartTime = performance.now(), this.animate(), !0);\n }\n /**\n * 播放指定范围的路径\n * @param fromIndex 起始索引\n * @param toIndex 结束索引\n * @param options 播放配置\n * @returns 是否开始播放\n */\n playRange(e, t, n = {}) {\n return e < 0 || t >= this.points.length || e >= t ? (console.warn(\"PathRoaming: 无效的索引范围\"), !1) : this.points.length < 2 ? (console.warn(\"PathRoaming: 至少需要2个点位才能播放\"), !1) : (this.isPlaying && this.stop(), this.isPlaying = !0, this.playOptions = {\n duration: 3e3,\n loop: !1,\n ...n\n }, this.engine.controlModule.disActive(), this.playFromIndex = e, this.playToIndex = e + 1, this.playStartTime = performance.now(), this.playRangeToIndex = t, this.animate(), !0);\n }\n /**\n * 停止播放\n */\n stop() {\n this.isPlaying = !1, this.animationFrameId !== null && (cancelAnimationFrame(this.animationFrameId), this.animationFrameId = null), this.stayTimerId !== null && (clearTimeout(this.stayTimerId), this.stayTimerId = null), this.engine.controlModule.active();\n }\n /**\n * 暂停播放(保留当前位置)\n */\n pause() {\n this.isPlaying && (this.isPlaying = !1, this.animationFrameId !== null && (cancelAnimationFrame(this.animationFrameId), this.animationFrameId = null), this.stayTimerId !== null && (clearTimeout(this.stayTimerId), this.stayTimerId = null));\n }\n /**\n * 获取是否正在播放\n */\n getIsPlaying() {\n return this.isPlaying;\n }\n /**\n * 动画循环\n */\n animate = () => {\n if (!this.isPlaying) return;\n const t = performance.now() - this.playStartTime, n = this.playOptions.duration || 3e3, i = Math.min(t / n, 1), s = this.points[this.playFromIndex], r = this.points[this.playToIndex], a = this.interpolatePose(s, r, i);\n this.engine.cameraModule.restoreCameraPose(a), i >= 1 ? this.onSegmentComplete() : this.animationFrameId = requestAnimationFrame(this.animate);\n };\n /**\n * 段播放完成处理\n */\n onSegmentComplete() {\n const e = this.playToIndex;\n this.playOptions.onPointComplete && this.playOptions.onPointComplete(e);\n const t = this.points[e];\n t.stayTime && t.stayTime > 0 ? this.stayTimerId = globalThis.setTimeout(() => {\n this.stayTimerId = null, this.moveToNextSegment();\n }, t.stayTime) : this.moveToNextSegment();\n }\n /**\n * 移动到下一段\n */\n moveToNextSegment() {\n const e = this.playToIndex >= this.playRangeToIndex, t = this.playToIndex >= this.points.length - 1;\n e || t ? this.playOptions.loop && this.points.length >= 2 ? (this.playFromIndex = 0, this.playToIndex = 1, this.playRangeToIndex = this.points.length - 1, this.playStartTime = performance.now(), this.animate()) : this.onPlayComplete() : (this.playFromIndex = this.playToIndex, this.playToIndex = this.playToIndex + 1, this.playStartTime = performance.now(), this.animate());\n }\n /**\n * 播放完成处理\n */\n onPlayComplete() {\n this.stop(), this.playOptions.onComplete && this.playOptions.onComplete();\n }\n /**\n * 插值计算两个相机姿态之间的中间姿态\n * @param from 起始姿态\n * @param to 结束姿态\n * @param t 进度(0-1)\n * @returns 插值后的姿态\n */\n interpolatePose(e, t, n) {\n const i = this.easeInOutCubic(n), s = {\n type: t.type,\n position: {\n x: M.MathUtils.lerp(e.position.x, t.position.x, i),\n y: M.MathUtils.lerp(e.position.y, t.position.y, i),\n z: M.MathUtils.lerp(e.position.z, t.position.z, i)\n },\n rotation: {\n x: M.MathUtils.lerp(e.rotation.x, t.rotation.x, i),\n y: M.MathUtils.lerp(e.rotation.y, t.rotation.y, i),\n z: M.MathUtils.lerp(e.rotation.z, t.rotation.z, i)\n },\n quaternion: {\n x: M.MathUtils.lerp(e.quaternion.x, t.quaternion.x, i),\n y: M.MathUtils.lerp(e.quaternion.y, t.quaternion.y, i),\n z: M.MathUtils.lerp(e.quaternion.z, t.quaternion.z, i),\n w: M.MathUtils.lerp(e.quaternion.w, t.quaternion.w, i)\n }\n };\n return e.target && t.target ? s.target = {\n x: M.MathUtils.lerp(e.target.x, t.target.x, i),\n y: M.MathUtils.lerp(e.target.y, t.target.y, i),\n z: M.MathUtils.lerp(e.target.z, t.target.z, i)\n } : t.target && (s.target = { ...t.target }), e.zoom !== void 0 && t.zoom !== void 0 && (s.zoom = M.MathUtils.lerp(e.zoom, t.zoom, i)), s;\n }\n /**\n * 缓入缓出函数(三次方)\n * @param t 输入值(0-1)\n * @returns 缓动后的值\n */\n easeInOutCubic(e) {\n return e < 0.5 ? 4 * e * e * e : 1 - Math.pow(-2 * e + 2, 3) / 2;\n }\n /**\n * 销毁管理器\n */\n dispose() {\n this.stop(), this.points = [], this.playOptions = {};\n }\n}\nclass bp {\n engine;\n miniMapCamera = null;\n miniMapRenderer = null;\n miniMapContainer = null;\n overlayCanvas = null;\n overlayCtx = null;\n isVisible = !1;\n mapSize = 200;\n // 视野半径(可通过滚轮调整)\n currentHalfSize = 500;\n minHalfSize = 5;\n maxHalfSize = 1e4;\n halfSizeInitialized = !1;\n // 小地图相机高度(由 octreeBox 动态计算)\n camY = 1e3;\n // 当前帧小地图相机中心的世界 XZ(= 主相机 XZ)\n centerX = 0;\n centerZ = 0;\n // 拖拽交互状态(仅旋转模式)\n dragMode = null;\n lastMouseX = 0;\n lastMouseY = 0;\n constructor(e) {\n this.engine = e, this.init();\n }\n // 获取小地图的状态\n getstate() {\n return this.isVisible;\n }\n init() {\n this.miniMapContainer = document.createElement(\"div\"), this.miniMapContainer.style.position = \"absolute\", this.miniMapContainer.style.bottom = \"20px\", this.miniMapContainer.style.left = \"20px\", this.miniMapContainer.style.width = `${this.mapSize}px`, this.miniMapContainer.style.height = `${this.mapSize}px`, this.miniMapContainer.style.border = \"2px solid rgba(255, 255, 255, 0.4)\", this.miniMapContainer.style.borderRadius = \"4px\", this.miniMapContainer.style.overflow = \"hidden\", this.miniMapContainer.style.display = \"none\", this.miniMapContainer.style.zIndex = \"200\", this.miniMapContainer.style.pointerEvents = \"auto\", this.miniMapContainer.style.cursor = \"crosshair\", this.engine.container.appendChild(this.miniMapContainer), this.miniMapRenderer = new M.WebGLRenderer({ alpha: !0, antialias: !1 }), this.miniMapRenderer.setSize(this.mapSize, this.mapSize), this.miniMapRenderer.setPixelRatio(window.devicePixelRatio), this.miniMapRenderer.setClearColor(1710638, 0.85), this.miniMapContainer.appendChild(this.miniMapRenderer.domElement);\n const e = window.devicePixelRatio || 1;\n this.overlayCanvas = document.createElement(\"canvas\"), this.overlayCanvas.width = this.mapSize * e, this.overlayCanvas.height = this.mapSize * e, this.overlayCanvas.style.position = \"absolute\", this.overlayCanvas.style.top = \"0\", this.overlayCanvas.style.left = \"0\", this.overlayCanvas.style.width = `${this.mapSize}px`, this.overlayCanvas.style.height = `${this.mapSize}px`, this.overlayCanvas.style.pointerEvents = \"none\", this.miniMapContainer.appendChild(this.overlayCanvas), this.overlayCtx = this.overlayCanvas.getContext(\"2d\"), this.overlayCtx && this.overlayCtx.scale(e, e), this.miniMapCamera = new M.OrthographicCamera(\n -this.currentHalfSize,\n this.currentHalfSize,\n this.currentHalfSize,\n -this.currentHalfSize,\n 0.1,\n 1e5\n ), this.miniMapCamera.up.set(0, 0, -1), this.setupEvents();\n }\n // ========== 坐标转换 ==========\n /**\n * 世界坐标 XZ → 小地图像素坐标\n * 小地图 up=(0,0,-1):-Z 朝屏幕上方,+X 朝屏幕右方\n */\n worldToPixel(e, t) {\n const n = this.currentHalfSize;\n return {\n x: ((e - this.centerX) / n * 0.5 + 0.5) * this.mapSize,\n y: ((t - this.centerZ) / n * 0.5 + 0.5) * this.mapSize\n };\n }\n /** 小地图像素坐标 → 世界坐标 XZ */\n pixelToWorld(e, t) {\n const n = this.currentHalfSize;\n return {\n x: (e / this.mapSize - 0.5) * 2 * n + this.centerX,\n z: (t / this.mapSize - 0.5) * 2 * n + this.centerZ\n };\n }\n // ========== 事件处理 ==========\n setupEvents() {\n const e = this.miniMapContainer;\n e.addEventListener(\"wheel\", this.onWheel, { passive: !1 }), e.addEventListener(\"mousedown\", this.onMouseDown), e.addEventListener(\"mousemove\", this.onMouseMove), e.addEventListener(\"mouseup\", this.onMouseUp), e.addEventListener(\"mouseleave\", this.onMouseUp), e.addEventListener(\"contextmenu\", (t) => t.preventDefault()), [\"pointerdown\", \"pointermove\", \"pointerup\", \"click\", \"dblclick\"].forEach((t) => e.addEventListener(t, (n) => n.stopPropagation()));\n }\n /** 滚轮缩放小地图视野 */\n onWheel = (e) => {\n e.preventDefault(), e.stopPropagation();\n const t = e.deltaY > 0 ? 1.25 : 0.8;\n this.currentHalfSize = Math.max(\n this.minHalfSize,\n Math.min(this.maxHalfSize, this.currentHalfSize * t)\n );\n };\n /**\n * 点击指示器(中心 25px 范围)→ 进入旋转拖拽模式\n * 点击其他位置 → 计算世界坐标,直接将相机传送过去\n */\n onMouseDown = (e) => {\n e.stopPropagation();\n const t = this.miniMapContainer.getBoundingClientRect(), n = e.clientX - t.left, i = e.clientY - t.top, s = this.engine.camera;\n if (!s) return;\n const { x: r, y: a } = this.worldToPixel(s.position.x, s.position.z);\n Math.hypot(n - r, i - a) < 25 ? (this.dragMode = \"rotate\", this.miniMapContainer.style.cursor = \"alias\") : (this.dragMode = null, this.handleTeleport(n, i)), this.lastMouseX = n, this.lastMouseY = i;\n };\n onMouseMove = (e) => {\n if (e.stopPropagation(), this.dragMode !== \"rotate\") return;\n const t = this.miniMapContainer.getBoundingClientRect(), n = e.clientX - t.left, i = e.clientY - t.top;\n this.handleRotate(n, i), this.lastMouseX = n, this.lastMouseY = i;\n };\n onMouseUp = (e) => {\n e.stopPropagation(), this.dragMode = null, this.miniMapContainer && (this.miniMapContainer.style.cursor = \"crosshair\");\n };\n // ========== 相机操控 ==========\n /**\n * 传送:点击小地图空白区域 → 计算世界坐标,将相机和 target 平移过去\n */\n handleTeleport(e, t) {\n const n = this.engine.camera, i = this.engine.controls;\n if (!n || !i) return;\n const { x: s, z: r } = this.pixelToWorld(e, t), a = s - n.position.x, l = r - n.position.z;\n n.position.x += a, n.position.z += l, i.target.x += a, i.target.z += l, i.update();\n }\n /**\n * 旋转:拖动指示器尖端 → 绕 controls.target 旋转主相机水平轨道角\n */\n handleRotate(e, t) {\n const n = this.engine.camera, i = this.engine.controls;\n if (!n || !i) return;\n const s = this.mapSize / 2, r = this.mapSize / 2, a = Math.atan2(this.lastMouseY - r, this.lastMouseX - s);\n let h = Math.atan2(t - r, e - s) - a;\n h > Math.PI && (h -= 2 * Math.PI), h < -Math.PI && (h += 2 * Math.PI);\n const c = new M.Vector3().copy(i.target).sub(n.position), u = new M.Spherical().setFromVector3(c);\n u.theta -= h, c.setFromSpherical(u), i.target.copy(n.position).add(c), i.update();\n }\n // ========== 绘制 2D 覆盖层 ==========\n drawOverlay() {\n const e = this.overlayCtx, t = this.engine.camera;\n if (!e || !t) return;\n e.clearRect(0, 0, this.mapSize, this.mapSize);\n const n = this.mapSize / 2, i = this.mapSize / 2, s = new M.Vector3();\n t.getWorldDirection(s);\n const r = Math.atan2(s.x, -s.z), a = 36, l = Math.PI / 10;\n e.save(), e.translate(n, i), e.rotate(r);\n const h = e.createRadialGradient(0, 0, 2, 0, 0, a);\n h.addColorStop(0, \"rgba(0, 230, 130, 0.9)\"), h.addColorStop(1, \"rgba(0, 230, 130, 0)\");\n const c = -Math.sin(l) * a, u = -Math.cos(l) * a, m = Math.sin(l) * a, f = -Math.cos(l) * a;\n e.beginPath(), e.moveTo(0, 0), e.lineTo(c, u), e.lineTo(m, f), e.closePath(), e.fillStyle = h, e.fill(), e.fillStyle = \"rgba(255, 255, 255, 0.95)\", e.strokeStyle = \"rgba(0, 200, 110, 0.9)\", e.lineWidth = 1.5, e.beginPath(), e.arc(0, 0, 4, 0, Math.PI * 2), e.fill(), e.stroke(), e.restore();\n }\n // ========== 生命周期 ==========\n show() {\n this.isVisible = !0, this.miniMapContainer && (this.miniMapContainer.style.display = \"block\");\n }\n hide() {\n this.isVisible = !1, this.miniMapContainer && (this.miniMapContainer.style.display = \"none\");\n }\n toggle() {\n this.isVisible ? this.hide() : this.show();\n }\n update() {\n if (!this.isVisible || !this.miniMapCamera || !this.miniMapRenderer) return;\n const e = this.engine.camera;\n if (!(!e || !this.engine.scene)) {\n if (this.engine.octreeBox) {\n const t = this.engine.octreeBox.getBoundingBox();\n if (t?.min && t?.max) {\n const n = t.max.x - t.min.x, i = t.max.z - t.min.z, s = t.max.y - t.min.y;\n this.camY = t.max.y + Math.max(n, i, s), !this.halfSizeInitialized && n + i > 0 && (this.currentHalfSize = Math.max(n, i) * 2, this.halfSizeInitialized = !0);\n }\n }\n this.centerX = e.position.x, this.centerZ = e.position.z, this.miniMapCamera.left = -this.currentHalfSize, this.miniMapCamera.right = this.currentHalfSize, this.miniMapCamera.top = this.currentHalfSize, this.miniMapCamera.bottom = -this.currentHalfSize, this.miniMapCamera.updateProjectionMatrix(), this.miniMapCamera.position.set(this.centerX, this.camY, this.centerZ), this.miniMapCamera.lookAt(this.centerX, this.camY - 1, this.centerZ), this.miniMapRenderer.render(this.engine.scene, this.miniMapCamera), this.drawOverlay();\n }\n }\n dispose() {\n this.miniMapContainer && (this.miniMapContainer.removeEventListener(\"wheel\", this.onWheel), this.miniMapContainer.removeEventListener(\"mousedown\", this.onMouseDown), this.miniMapContainer.removeEventListener(\"mousemove\", this.onMouseMove), this.miniMapContainer.removeEventListener(\"mouseup\", this.onMouseUp), this.miniMapContainer.removeEventListener(\"mouseleave\", this.onMouseUp)), this.miniMapRenderer && (this.miniMapRenderer.dispose(), this.miniMapRenderer = null), this.miniMapContainer && (this.miniMapContainer.remove(), this.miniMapContainer = null), this.miniMapCamera = null, this.overlayCtx = null, this.overlayCanvas = null;\n }\n}\nconst Mp = [\n { Id: \"100001\", Name: \"1\", Points: [{ X: -2, Y: -5, Z: 0 }, { X: -2, Y: 5, Z: 0 }] },\n { Id: \"100002\", Name: \"2\", Points: [{ X: 2, Y: -5, Z: 0 }, { X: 2, Y: 5, Z: 0 }] },\n { Id: \"100003\", Name: \"A\", Points: [{ X: -5, Y: -2, Z: 0 }, { X: 5, Y: -2, Z: 0 }] },\n { Id: \"100004\", Name: \"B\", Points: [{ X: -5, Y: 2, Z: 0 }, { X: 5, Y: 2, Z: 0 }] }\n];\nclass Sp {\n engine;\n rootGroup = null;\n isVisible = !1;\n axes = [];\n /**\n * 坐标转换:BIM(X,Y,Z) → Three.js 世界坐标\n * 默认规则:BIM X=水平, Y=水平深度, Z=高度\n * → Three.js X=水平, Y=高度, Z=-深度\n * 可在外部替换此函数以适配不同坐标系。\n */\n coordinateMapper = (e) => new M.Vector3(e.X, e.Z, -e.Y);\n constructor(e) {\n this.engine = e, this._initRoot();\n }\n // ──────────────────────────────────────────────\n // 公共 API\n // ──────────────────────────────────────────────\n /** 传入轴网数据并在场景中构建对象 */\n setData(e) {\n this._clearAxes(), this.axes = e.map((t) => ({ data: t, group: null })), this.axes.forEach((t) => this._buildAxis(t));\n }\n /** 使用内置模拟数据(调试用) */\n setMockData() {\n this.setData(Mp);\n }\n /** 显示轴网 */\n show() {\n this.isVisible = !0, this.rootGroup && (this.rootGroup.visible = !0);\n }\n /** 隐藏轴网 */\n hide() {\n this.isVisible = !1, this.rootGroup && (this.rootGroup.visible = !1);\n }\n /** 切换显示/隐藏 */\n toggle() {\n this.isVisible ? this.hide() : this.show();\n }\n /**\n * 每帧更新(在动画循环中调用)\n * 根据正交相机缩放动态调整圆圈大小,保持屏幕上视觉尺寸恒定(约 30px)\n */\n update() {\n if (!this.isVisible || !this.rootGroup) return;\n const e = this.engine.camera, t = this.engine.renderer;\n if (!e || !t) return;\n let n = 0.5;\n if (e instanceof M.OrthographicCamera) {\n const i = e, s = (i.top - i.bottom) / i.zoom, r = t.domElement.clientHeight || 1;\n n = 30 * s / r;\n }\n this.rootGroup.traverse((i) => {\n i instanceof M.Sprite && i.scale.set(n, n, 1);\n });\n }\n /** 销毁,释放 Three.js 资源 */\n dispose() {\n this._clearAxes(), this.rootGroup && (this.engine.scene && this.engine.scene.remove(this.rootGroup), this.rootGroup = null);\n }\n // ──────────────────────────────────────────────\n // 内部实现\n // ──────────────────────────────────────────────\n _initRoot() {\n this.rootGroup = new M.Group(), this.rootGroup.name = \"GridRoot\", this.rootGroup.visible = !1, this.engine.scene && this.engine.scene.add(this.rootGroup);\n }\n _clearAxes() {\n this.axes.forEach((e) => {\n e.group && (this.rootGroup?.remove(e.group), e.group.traverse((t) => {\n const n = t;\n if (\"geometry\" in n && n.geometry && n.geometry.dispose(), \"material\" in n && n.material) {\n const i = n.material;\n \"map\" in i && i.map && i.map.dispose(), i.dispose();\n }\n }), e.group = null);\n }), this.axes = [];\n }\n _buildAxis(e) {\n if (!this.rootGroup) return;\n const t = this.coordinateMapper(e.data.Points[0]), n = this.coordinateMapper(e.data.Points[1]), i = e.data.Name, s = new M.Group();\n s.name = `GridAxis_${e.data.Id}`;\n const r = new M.BufferGeometry().setFromPoints([t, n]), a = new M.LineBasicMaterial({\n color: 1609983,\n depthTest: !1\n }), l = new M.Line(r, a);\n l.renderOrder = 998, s.add(l), s.add(this._makeCircleSprite(i, t)), s.add(this._makeCircleSprite(i, n)), this.rootGroup.add(s), e.group = s;\n }\n /**\n * 创建带文字的圆圈 Sprite\n * Sprite 默认朝向相机(billboard),depthTest=false 保证始终可见\n */\n _makeCircleSprite(e, t) {\n const i = document.createElement(\"canvas\");\n i.width = 128, i.height = 128;\n const s = i.getContext(\"2d\"), r = 128 / 2, a = 128 / 2, l = 128 / 2 - 4;\n s.beginPath(), s.arc(r, a, l, 0, Math.PI * 2), s.fillStyle = \"white\", s.fill(), s.strokeStyle = \"#1890ff\", s.lineWidth = 6, s.stroke(), s.fillStyle = \"#1890ff\", s.font = `bold ${Math.round(128 * 0.38)}px Arial`, s.textAlign = \"center\", s.textBaseline = \"middle\", s.fillText(e, r, a);\n const h = new M.CanvasTexture(i), c = new M.SpriteMaterial({\n map: h,\n depthTest: !1,\n transparent: !0\n }), u = new M.Sprite(c);\n return u.position.copy(t), u.scale.set(0.5, 0.5, 1), u.renderOrder = 999, u;\n }\n}\nconst Tp = [\n { Id: \"339\", Name: \"站台\", Elevation: -0.32808398950131235 },\n { Id: \"2787\", Name: \"站厅\", Elevation: 16.896325459317584 },\n { Id: \"236633\", Name: \"顶板\", Elevation: 36.745406824146976 }\n];\nclass Ep {\n engine;\n isVisible = !1;\n levels = [];\n svgContainer = null;\n svgOverlay = null;\n worldToScreen = null;\n // 水平面半尺寸(固定值,与 Three.js 世界坐标单位一致)\n halfSize = 500;\n COLOR = \"#1890ff\";\n PLANE_OPACITY = 0.08;\n constructor(e) {\n this.engine = e, this._initSvg();\n }\n _initSvg() {\n this.svgContainer = document.createElement(\"div\"), this.svgContainer.style.position = \"absolute\", this.svgContainer.style.top = \"0\", this.svgContainer.style.left = \"0\", this.svgContainer.style.width = \"100%\", this.svgContainer.style.height = \"100%\", this.svgContainer.style.pointerEvents = \"none\", this.svgContainer.style.overflow = \"hidden\", this.svgContainer.style.display = \"none\", this.engine.container.appendChild(this.svgContainer), this.svgOverlay = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\"), this.svgOverlay.style.position = \"absolute\", this.svgOverlay.style.top = \"0\", this.svgOverlay.style.left = \"0\", this.svgOverlay.style.width = \"1920px\", this.svgOverlay.style.height = \"1080px\", this.svgOverlay.style.overflow = \"visible\", this.svgContainer.appendChild(this.svgOverlay);\n }\n // ──────────────────────────────────────────────\n // 公共 API\n // ──────────────────────────────────────────────\n /** 传入标高数据并渲染 */\n setData(e) {\n this._clearAll(), this.levels = e.map((t) => ({ data: t, group: null, svgGroup: null })), this.levels.forEach((t) => this._buildThreeObject(t));\n }\n /** 使用内置模拟数据(调试用) */\n setMockData() {\n this.setData(Tp);\n }\n /** 显示标高 */\n show() {\n this.isVisible = !0, this.svgContainer && (this.svgContainer.style.display = \"block\"), this.levels.forEach((e) => {\n e.group && (e.group.visible = !0);\n });\n }\n /** 隐藏标高 */\n hide() {\n this.isVisible = !1, this.svgContainer && (this.svgContainer.style.display = \"none\"), this.levels.forEach((e) => {\n e.group && (e.group.visible = !1);\n });\n }\n /** 切换显示/隐藏 */\n toggle() {\n this.isVisible ? this.hide() : this.show();\n }\n /** 每帧刷新(需在动画循环中调用) */\n update() {\n !this.isVisible || !this.svgOverlay || !this.levels.length || !this.engine.camera || !this.engine.renderer || (this._initWorldToScreen(), this.levels.forEach((e) => this._updateSvgLabels(e)));\n }\n /** 销毁,释放资源 */\n dispose() {\n this._clearAll(), this.svgContainer && (this.svgContainer.remove(), this.svgContainer = null), this.svgOverlay = null, this.worldToScreen = null;\n }\n // ──────────────────────────────────────────────\n // 内部实现\n // ──────────────────────────────────────────────\n _initWorldToScreen() {\n this.engine.camera && this.engine.renderer && this.engine.scene && (this.worldToScreen = new je(\n this.engine.camera,\n this.engine.renderer,\n this.engine.scene\n ));\n }\n _clearAll() {\n this.levels.forEach((e) => {\n e.group && this.engine.scene && (this.engine.scene.remove(e.group), e.group.traverse((t) => {\n t.geometry && t.geometry.dispose(), t.material && (Array.isArray(t.material) ? t.material.forEach((n) => n.dispose()) : t.material.dispose());\n }), e.group = null), e.svgGroup && this.svgOverlay && (e.svgGroup.remove(), e.svgGroup = null);\n }), this.levels = [];\n }\n _buildThreeObject(e) {\n if (!this.engine.scene) return;\n const t = e.data.Elevation, n = this.halfSize, i = new M.Group(), s = new M.PlaneGeometry(n * 2, n * 2);\n s.rotateX(-Math.PI / 2);\n const r = new M.MeshBasicMaterial({\n color: this.COLOR,\n transparent: !0,\n opacity: this.PLANE_OPACITY,\n side: M.DoubleSide,\n depthWrite: !1\n }), a = new M.Mesh(s, r);\n a.position.y = t, i.add(a);\n const l = [\n new M.Vector3(-n, t, -n),\n new M.Vector3(n, t, -n),\n new M.Vector3(n, t, n),\n new M.Vector3(-n, t, n),\n new M.Vector3(-n, t, -n)\n // 闭合\n ], h = new M.BufferGeometry().setFromPoints(l), c = new M.LineBasicMaterial({\n color: this.COLOR,\n transparent: !0,\n opacity: 0.7\n });\n if (i.add(new M.Line(h, c)), i.visible = this.isVisible, this.engine.scene.add(i), e.group = i, this.svgOverlay) {\n const u = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n u.dataset.levelId = e.data.Id;\n for (let m = 0; m < 4; m++)\n u.appendChild(this._makeLabel(e.data.Name, e.data.Elevation));\n this.svgOverlay.appendChild(u), e.svgGroup = u;\n }\n }\n _updateSvgLabels(e) {\n if (!e.svgGroup || !this.worldToScreen) return;\n const t = this.halfSize, n = e.data.Elevation, i = [\n new M.Vector3(-t, n, -t),\n new M.Vector3(t, n, -t),\n new M.Vector3(t, n, t),\n new M.Vector3(-t, n, t)\n ], s = Array.from(e.svgGroup.children);\n i.forEach((r, a) => {\n const l = this.worldToScreen.worldToScreen(r);\n s[a].setAttribute(\"x\", String(l.x)), s[a].setAttribute(\"y\", String(l.y));\n });\n }\n _makeLabel(e, t) {\n const n = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n return n.textContent = `${e} ▲${t.toFixed(3)}m`, n.setAttribute(\"text-anchor\", \"middle\"), n.setAttribute(\"dominant-baseline\", \"central\"), n.setAttribute(\"fill\", this.COLOR), n.setAttribute(\"font-size\", \"12\"), n.setAttribute(\"font-family\", \"Arial, sans-serif\"), n.setAttribute(\"font-weight\", \"bold\"), n.setAttribute(\"stroke\", \"white\"), n.setAttribute(\"stroke-width\", \"2\"), n.setAttribute(\"paint-order\", \"stroke\"), n.style.pointerEvents = \"none\", n;\n }\n}\nclass Ap {\n engine;\n constructor(e) {\n }\n update() {\n }\n}\nclass Cp {\n engine;\n currentHdrId = \"0\";\n isVisible = !0;\n currentIntensity = 0.2;\n currentTexture = null;\n skybox = null;\n textureCache = /* @__PURE__ */ new Map();\n hdrList = [\n { id: \"0\", name: \"无\" },\n { id: \"1\", name: \"纯净-多云\", url: \"assets/hdr/纯净-多云.hdr\" },\n { id: \"2\", name: \"纯净-落日\", url: \"assets/hdr/纯净-落日.hdr\" },\n { id: \"3\", name: \"纯净-少云\", url: \"assets/hdr/纯净-少云.hdr\" },\n { id: \"4\", name: \"纯净-无云\", url: \"assets/hdr/纯净-无云.hdr\" },\n { id: \"5\", name: \"纯净-夜晚\", url: \"assets/hdr/纯净-夜晚.hdr\" },\n { id: \"6\", name: \"纯净-阴天\", url: \"assets/hdr/纯净-阴天.hdr\" },\n { id: \"7\", name: \"纯净-中云\", url: \"assets/hdr/纯净-中云.hdr\" }\n ];\n constructor(e) {\n this.engine = e;\n }\n /**\n * 获取 HDR 列表\n */\n getHdrList() {\n return this.hdrList;\n }\n /**\n * 切换 HDR 背景\n * @param id - HDR id,\"0\" 表示清除 HDR\n */\n async setHdr(e) {\n const t = this.hdrList.find((n) => n.id === e);\n if (!t) {\n console.warn(`[Hdr] HDR id \"${e}\" not found`);\n return;\n }\n if (e === \"0\" || !t.url) {\n this._clearHdr(), this.currentHdrId = \"0\";\n return;\n }\n if (this.textureCache.has(e)) {\n this._applyTexture(this.textureCache.get(e)), this.currentHdrId = e;\n return;\n }\n try {\n const n = await this._loadHdr(t.url);\n this.textureCache.set(e, n), this._applyTexture(n), this.currentHdrId = e;\n } catch (n) {\n console.error(`[Hdr] Failed to load HDR \"${t.url}\":`, n);\n }\n }\n /**\n * 设置 HDR 天空球可见性(不影响环境光照)\n * @param visible - true 显示,false 隐藏\n */\n setVisible(e) {\n this.isVisible = e, e && this.currentTexture && !this.skybox ? this._createSkybox(this.currentTexture) : this.skybox && (this.skybox.visible = e);\n }\n /**\n * 获取当前 HDR id\n */\n getCurrentHdrId() {\n return this.currentHdrId;\n }\n /**\n * 获取 HDR 背景是否可见\n */\n getVisible() {\n return this.isVisible;\n }\n /**\n * 设置 HDR 整体亮度\n * @param intensity - 亮度倍率,1 为原始亮度,推荐范围 0.1 ~ 3\n */\n setIntensity(e) {\n this.currentIntensity = e, this.engine.scene && (this.engine.scene.environmentIntensity = e), this.skybox && this.skybox.material.color.setScalar(e);\n }\n /**\n * 获取当前 HDR 亮度\n */\n getIntensity() {\n return this.currentIntensity;\n }\n /**\n * 动态添加自定义 HDR 条目(用于外部扩展)\n */\n addHdrItem(e) {\n const t = this.hdrList.find((n) => n.id === e.id);\n t ? Object.assign(t, e) : this.hdrList.push(e);\n }\n /**\n * 释放所有缓存纹理\n */\n dispose() {\n this._clearHdr(), this.textureCache.forEach((e) => e.dispose()), this.textureCache.clear();\n }\n // ——— 私有方法 ———\n _loadHdr(e) {\n return new Promise((t, n) => {\n new nd().load(\n e,\n (i) => {\n i.mapping = M.EquirectangularReflectionMapping, t(i);\n },\n void 0,\n (i) => n(i)\n );\n });\n }\n _applyTexture(e) {\n if (this.currentTexture = e, !this.engine.scene) return;\n const t = new M.PMREMGenerator(this.engine.renderer), n = t.fromEquirectangular(e).texture;\n t.dispose(), this.engine.scene.environment = n, this.engine.scene.environmentIntensity = this.currentIntensity, this.engine.scene.background = null, this._removeSkybox(), this.isVisible && this._createSkybox(e), this.engine.setting.setAmbientLightIntensity(0);\n }\n /**\n * 创建超大天空球,兼容正交/透视两种相机\n * - radius 5000:远超任何场景对象,确保始终在背景层\n * - BackSide:从内部观察球面\n * - depthWrite false + renderOrder -1:不写入深度缓冲,始终渲染在最底层\n * - frustumCulled false:防止大球被裁剪掉\n */\n _createSkybox(e) {\n const t = new M.SphereGeometry(500, 64, 32), n = new M.MeshBasicMaterial({\n map: e,\n side: M.BackSide,\n depthWrite: !1,\n fog: !1\n });\n this.skybox = new M.Mesh(t, n), this.skybox.name = \"hdr_skybox\", this.skybox.renderOrder = -1, this.skybox.frustumCulled = !1, n.color.setScalar(this.currentIntensity), this.engine.scene.add(this.skybox);\n }\n _removeSkybox() {\n this.skybox && (this.engine.scene.remove(this.skybox), this.skybox.geometry.dispose(), this.skybox.material.dispose(), this.skybox = null);\n }\n _clearHdr() {\n this.currentTexture = null, this._removeSkybox(), this.engine.scene && (this.engine.scene.background = null, this.engine.scene.environment = null, this.engine.setting.setAmbientLightIntensity(1));\n }\n}\nclass Pp {\n engine;\n currentId = \"0\";\n groundGroup;\n groundMesh = null;\n waterMaterial = null;\n clock;\n groundY = 0;\n groundList = [\n { id: \"0\", name: \"无\" },\n { id: \"1\", name: \"草地\", color: 4881486, roughness: 0.9, metalness: 0, map: \"/textures/ground/grass.jpg\" },\n { id: \"2\", name: \"混凝土\", color: 9474192, roughness: 0.85, metalness: 0.1, map: \"/textures/ground/concrete.jpg\" },\n { id: \"3\", name: \"地砖\", color: 13152400, roughness: 0.55, metalness: 0.1, map: \"/textures/ground/tiles.jpg\" },\n { id: \"4\", name: \"湖面\", water: !0, waterColor: 28062, waveHeight: 0.04, waveSpeed: 0.8 },\n { id: \"5\", name: \"海面\", water: !0, waterColor: 15708, waveHeight: 0.12, waveSpeed: 1.4 }\n ];\n constructor(e) {\n this.engine = e, this.groundGroup = new M.Group(), this.groundGroup.name = \"groundGroup\", this.clock = new M.Clock();\n }\n init() {\n this.engine.scene.add(this.groundGroup);\n }\n /**\n * 切换地面类型\n * @param id 地面 id:\"0\" 无 | \"1\" 草地 | \"2\" 混凝土 | \"3\" 地砖 | \"4\" 湖面 | \"5\" 海面\n */\n setGround(e, t) {\n if (this._dispose(), this.currentId = e, e === \"0\") return;\n const n = this.groundList.find((h) => h.id === e);\n if (!n) return;\n const i = t?.size ?? 300, s = n.water ? 80 : 1, r = new M.PlaneGeometry(i, i, s, s);\n r.rotateX(-Math.PI / 2);\n let a;\n if (n.water)\n a = this._createWaterMaterial(n, t), this.waterMaterial = a;\n else {\n const h = new M.MeshStandardMaterial({\n color: n.color,\n roughness: n.roughness,\n metalness: n.metalness\n }), c = t?.textureUrl ?? n.map;\n c && new M.TextureLoader().load(\n c,\n (u) => {\n u.wrapS = u.wrapT = M.RepeatWrapping, u.repeat.set(8, 8), h.map = u, h.needsUpdate = !0;\n },\n void 0,\n () => {\n }\n ), a = h;\n }\n const l = new M.Mesh(r, a);\n l.name = \"groundMesh\", l.receiveShadow = !0, l.castShadow = !1, l.position.y = -0.01, this.groundMesh = l, this.groundGroup.add(l), this.groundGroup.position.y = this.groundY, this.clock.start();\n }\n /**\n * 设置地面高度(默认 0)\n * @param y 世界空间 Y 坐标\n */\n setHeight(e) {\n this.groundY = e, this.groundGroup.position.y = e;\n }\n /** 获取当前地面高度 */\n getHeight() {\n return this.groundY;\n }\n _createWaterMaterial(e, t) {\n const n = new M.Color(e.waterColor), i = n.clone().multiplyScalar(0.35), s = t?.sunDirection ? t.sunDirection.clone().normalize() : new M.Vector3(0.5, 0.8, 0.5).normalize();\n return new M.ShaderMaterial({\n uniforms: {\n uTime: { value: 0 },\n uWaterColor: { value: n },\n uDeepColor: { value: i },\n uSunColor: { value: new M.Color(16777215) },\n uSunDir: { value: s },\n uWaveHeight: { value: e.waveHeight ?? 0.05 },\n uWaveSpeed: { value: e.waveSpeed ?? 1 },\n uOpacity: { value: t?.opacity ?? 0.82 }\n },\n vertexShader: Rp,\n fragmentShader: Dp,\n transparent: !0,\n side: M.DoubleSide\n });\n }\n /** 每帧调用,驱动水面动画 */\n update() {\n if (!this.waterMaterial) return;\n this.waterMaterial.uniforms.uTime.value = this.clock.getElapsedTime();\n const e = this.engine.scene?.dirLight;\n if (e) {\n const t = e.position.clone().normalize();\n this.waterMaterial.uniforms.uSunDir.value.copy(t);\n }\n }\n /** 获取地面列表(id + 名称) */\n getGroundList() {\n return this.groundList.map(({ id: e, name: t }) => ({ id: e, name: t }));\n }\n /** 获取当前地面 id */\n getCurrentId() {\n return this.currentId;\n }\n show() {\n this.groundGroup.visible = !0;\n }\n hide() {\n this.groundGroup.visible = !1;\n }\n dispose() {\n this._dispose(), this.engine.scene.remove(this.groundGroup);\n }\n _dispose() {\n if (!this.groundMesh) return;\n this.groundMesh.geometry.dispose();\n const e = this.groundMesh.material;\n Array.isArray(e) ? e.forEach((t) => t.dispose()) : e.dispose(), this.groundGroup.remove(this.groundMesh), this.groundMesh = null, this.waterMaterial = null;\n }\n}\nconst Rp = (\n /* glsl */\n `\nuniform float uTime;\nuniform float uWaveHeight;\nuniform float uWaveSpeed;\n\nvarying vec2 vUv;\nvarying vec3 vWorldPos;\nvarying vec3 vNormal;\n\nvoid main() {\n vUv = uv;\n vec3 pos = position;\n float t = uTime * uWaveSpeed;\n\n // 多层叠加正弦波,模拟真实水面涟漪\n float w1 = sin(pos.x * 0.80 + t * 1.20) * uWaveHeight;\n float w2 = sin(pos.z * 0.60 + t * 0.90) * uWaveHeight * 1.10;\n float w3 = sin((pos.x + pos.z) * 0.50 + t * 1.50) * uWaveHeight * 0.60;\n float w4 = sin(pos.x * 1.40 - pos.z * 0.90 + t * 0.70) * uWaveHeight * 0.40;\n pos.y += w1 + w2 + w3 + w4;\n\n // 由波形偏导数近似计算法线\n float dx = ( cos(pos.x * 0.80 + t * 1.20) * 0.80\n + cos((pos.x + pos.z) * 0.50 + t * 1.50) * 0.50\n + cos(pos.x * 1.40 - pos.z * 0.90 + t * 0.70) * 1.40 ) * uWaveHeight;\n float dz = ( cos(pos.z * 0.60 + t * 0.90) * 0.60\n + cos((pos.x + pos.z) * 0.50 + t * 1.50) * 0.50\n - cos(pos.x * 1.40 - pos.z * 0.90 + t * 0.70) * 0.90 ) * uWaveHeight;\n\n vNormal = normalize(normalMatrix * vec3(-dx, 1.0, -dz));\n\n vec4 worldPos = modelMatrix * vec4(pos, 1.0);\n vWorldPos = worldPos.xyz;\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);\n}\n`\n), Dp = (\n /* glsl */\n `\nuniform float uTime;\nuniform vec3 uWaterColor;\nuniform vec3 uDeepColor;\nuniform vec3 uSunColor;\nuniform vec3 uSunDir;\nuniform float uOpacity;\n\nvarying vec2 vUv;\nvarying vec3 vWorldPos;\nvarying vec3 vNormal;\n\nvoid main() {\n vec3 N = normalize(vNormal);\n vec3 V = normalize(cameraPosition - vWorldPos);\n vec3 L = normalize(uSunDir);\n\n // 高频细节法线扰动(模拟毛细波)\n float rx = sin(vUv.x * 55.0 + uTime * 3.2) * 0.012\n + sin(vUv.x * 30.0 - uTime * 1.8) * 0.008;\n float ry = sin(vUv.y * 50.0 + uTime * 2.8) * 0.012\n + sin(vUv.y * 25.0 - uTime * 2.2) * 0.008;\n N = normalize(N + vec3(rx, 0.0, ry));\n\n // Fresnel(Schlick 近似):掠射角反射更强\n float NdotV = clamp(dot(N, V), 0.0, 1.0);\n float fresnel = 0.02 + 0.98 * pow(1.0 - NdotV, 5.0);\n\n // 漫反射\n float diff = max(dot(N, L), 0.0);\n\n // 高光(Blinn-Phong)\n vec3 H = normalize(L + V);\n float spec = pow(max(dot(N, H), 0.0), 160.0);\n\n // 深浅水色混合\n float depthFac = clamp((N.y - 0.90) * 10.0, 0.0, 1.0);\n vec3 baseCol = mix(uDeepColor, uWaterColor, depthFac);\n\n vec3 color = baseCol * (0.30 + diff * 0.60)\n + uSunColor * spec * 1.0\n + vec3(0.72, 0.88, 1.0) * fresnel * 0.28; // 天空反射色\n\n gl_FragColor = vec4(color, uOpacity);\n}\n`\n);\nclass kp {\n // 引擎参数\n options;\n DeviceType;\n animationId = null;\n isRenderingPaused = !1;\n controlsEnabledBeforePause = !0;\n animate;\n onWindowResize;\n // 自适应渲染 FPS 监控\n _fpsFrameCount = 0;\n _fpsLastCheck = 0;\n _fpsLastSwitch = 0;\n _lowFpsCount = 0;\n // 连续低帧次数\n _highFpsCount = 0;\n // 连续高帧次数\n _fpsCheckInterval = 100;\n // 每1秒统计一次\n _fpsSwitchCooldown = 100;\n // 切换后10秒冷却\n _fpsThreshold = 30;\n // 低于30帧计入低帧\n _fpsUpgradeThreshold = 60;\n // 高于60帧计入高帧\n _lowFpsRequired = 3;\n // 连续3秒低帧才降级\n _highFpsRequired = 0.1;\n // 连续5秒高帧才升级\n // 鼠标是否按下\n isMouseDown = !1;\n // 滚轮是否正在滚动\n isWheeling = !1;\n // 基础模块\n scene;\n camera;\n renderer;\n sceneModule;\n cameraModule;\n deviceModule;\n renderModule;\n controlModule;\n composerModule;\n loaderModule;\n engineStatus;\n events;\n lightModule;\n interactionModule;\n modelToolModule;\n worldToScreen;\n handelBehaved;\n octreeBox;\n controls;\n stats;\n catchSvg;\n engineModelModule;\n // 功能模块 \n viewCube;\n rangeScale;\n setting;\n measure;\n clipping;\n modelTree;\n engineInfo;\n modelProperties;\n modelMapperBatch;\n modelEdge;\n ai;\n pathRoaming;\n hoverHighLight;\n minMap;\n grid;\n level;\n text;\n hdr;\n ground;\n // 业务数据\n models = [];\n reactBoundingClientRect = { left: 0, top: 0 };\n version = \"2.0.4\";\n versionEl = null;\n // 引擎容器\n container;\n constructor(e) {\n if (this.options = e, this.container = document.getElementById(e.containerId), !this.container)\n throw new Error(`Container ${e.containerId} not found`);\n this.engineModelModule = new Yu(this), this.engineModelModule.init(), this.ai = new _p(this), this.deviceModule = new Hl(this), this.DeviceType = this.deviceModule.getDeviceType(), this.cameraModule = new Vl(this), this.sceneModule = new Ul(this), this.scene = this.sceneModule.scene, this.renderModule = new jl(this), this.renderer = this.renderModule.createRenderer(), this.camera = this.cameraModule.orthographicCamera, this.scene.camera = this.camera, this.controlModule = new sc(this), this.controlModule.switchDefaultMode(), this.controls = this.controlModule.orbitControls, this.composerModule = new yc(this), this.composerModule.init(), this.events = new Hu(), this.engineStatus = new Vu(this), this.engineStatus.init(), this.loaderModule = new Uu(this), this.lightModule = new ju(this), this.lightModule.init(), this.viewCube = new od(this), this.viewCube.init(), this.options.showViewCube == !1 && this.viewCube.hide(), this.octreeBox = ad(this), this.rangeScale = new ld(this), this.rangeScale.init(), this.clipping = new fp(this), this.clipping.init(), this.setting = new cd(this), this.setting.init(), this.engineModelModule.init(), this.handelBehaved = hr(this), this.modelMapperBatch = new yp(this), this.measure = new wd(this), this.modelToolModule = new Wu(this), this.modelProperties = new gp(this), this.interactionModule = new Gu(this), this.interactionModule.init(), this.interactionModule.active(), this.hoverHighLight = new Hi(this), this.modelEdge = new wp(this), this.modelTree = new pp(this), this.engineInfo = new mp(this), this.pathRoaming = new vp(this), this.pathRoaming.init(), this.minMap = new bp(this), this.grid = new Sp(this), this.level = new Ep(this), this.text = new Ap(this), this.hdr = new Cp(this), this.ground = new Pp(this), this.ground.init(), this.worldToScreen = new je(this.camera, this.renderer, this.scene), this.options.showStats && (this.stats = new Qu(), this.stats.showPanel(0), this.stats.dom.style.position = \"absolute\", this.stats.dom.style.top = \"0px\", this.stats.dom.style.left = \"0px\", this.stats.dom.style.zIndex = \"1000\", this.container.appendChild(this.stats.dom));\n let t = document.createElement(\"div\");\n t.className = \"versionText\", this.versionEl = t, this.updateVersionDisplay(), this.container.appendChild(t);\n let n = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n n.style.position = \"absolute\", n.style.width = \"100%\", n.style.height = \"100%\", n.style.zIndex = \"1000\", n.style.left = \"0px\", n.style.top = \"0px\", n.style.pointerEvents = \"none\";\n const i = this.renderer?.domElement.width || 1920, s = this.renderer?.domElement.height || 1080;\n n.setAttribute(\"viewBox\", `0 0 ${i} ${s}`), n.setAttribute(\"preserveAspectRatio\", \"none\"), this.container.appendChild(n), this.catchSvg = n, this.onWindowResize = () => {\n this.handleWindowResize();\n }, window.addEventListener(\"resize\", this.onWindowResize);\n let r = this;\n this.controls.addEventListener(\"start\", () => {\n r.events.trigger(zt.EngineBusy);\n }), this.controls.addEventListener(\"end\", () => {\n r.events.trigger(zt.EngineFree);\n }), this.controls.addEventListener(\"change\", () => {\n }), this.animate = () => {\n if (!this.isRenderingPaused)\n this.animationId = requestAnimationFrame(this.animate);\n else {\n this.animationId = null;\n return;\n }\n this.stats && this.stats.begin(), this.composerModule && this.composerModule.composer.render(), this.viewCube && this.viewCube.cubeTool.RenderScene(), this.measure.update(), this.ground.update(), this.hoverHighLight.update(), this.controlModule.update(), this.minMap.update(), this.grid.update(), this.level.update(), this.text && this.text.update(), this.stats && this.stats.end(), this._fpsFrameCount++;\n const a = performance.now();\n if (a - this._fpsLastCheck >= this._fpsCheckInterval) {\n const l = a - this._fpsLastCheck, h = this._fpsFrameCount / l * 1e3;\n this._fpsFrameCount = 0, this._fpsLastCheck = a, h < this._fpsThreshold ? (this._lowFpsCount++, this._highFpsCount = 0, this._lowFpsCount >= this._lowFpsRequired && a - this._fpsLastSwitch > this._fpsSwitchCooldown && (this._adaptiveRenderingDowngrade(), this._fpsLastSwitch = a, this._lowFpsCount = 0)) : h > this._fpsUpgradeThreshold ? (this._highFpsCount++, this._lowFpsCount = 0, this._highFpsCount >= this._highFpsRequired && a - this._fpsLastSwitch > this._fpsSwitchCooldown && (this._adaptiveRenderingUpgrade(), this._fpsLastSwitch = a, this._highFpsCount = 0)) : (this._lowFpsCount = 0, this._highFpsCount = 0);\n }\n if (this.scene) {\n let l = this.scene?.dirLight;\n l && this.camera && this.updateLightPosition(this.camera, l);\n }\n }, this.animate();\n }\n updateVersionDisplay() {\n if (!this.versionEl) return;\n const e = {\n simple: \"simple\",\n balance: \"balance\",\n advanced: \"advanced\"\n }, t = this.engineModelModule?.getCurrentMode() ?? \"\", n = e[t] ?? t;\n this.versionEl.innerHTML = `v${this.version} | ${n}`;\n }\n updateLightPosition(e, t) {\n const n = new M.Vector3();\n e.getWorldDirection(n);\n const i = 100, s = new M.Vector3().copy(n).multiplyScalar(-i), r = new M.Vector3(0, 1, 0), a = new M.Vector3().crossVectors(n, r).normalize();\n s.addScaledVector(r, i * 0.5), s.addScaledVector(a, i * 0.3), t.position.copy(e.position).add(s);\n const l = new M.Vector3().copy(e.position).add(n.multiplyScalar(20));\n t.target.position.copy(l), t.target.updateMatrixWorld();\n }\n /**\n * 自适应渲染降级:将渲染模式降低一级\n */\n _adaptiveRenderingDowngrade() {\n const e = [\"simple\", \"balance\", \"advanced\"], t = this.engineModelModule.getCurrentMode(), n = e.indexOf(t);\n if (n > 0) {\n const i = e[n - 1];\n console.log(`[AdaptiveRendering] FPS低于${this._fpsThreshold},自动降级: ${t} → ${i}`), this.engineModelModule.autoSwitch(i);\n }\n }\n /**\n * 自适应渲染升级:将渲染模式提升一级\n */\n _adaptiveRenderingUpgrade() {\n const e = [\"simple\", \"balance\", \"advanced\"], t = this.engineModelModule.getCurrentMode(), n = e.indexOf(t);\n if (n < e.length - 1) {\n const i = e[n + 1];\n console.log(`[AdaptiveRendering] FPS高于${this._fpsUpgradeThreshold},自动升级: ${t} → ${i}`), this.engineModelModule.autoSwitch(i);\n }\n }\n /**\n * 暂停渲染循环\n */\n pauseRendering() {\n if (this.isRenderingPaused) {\n console.warn(\"[BimEngine] Rendering is already paused\");\n return;\n }\n this.isRenderingPaused = !0, this.controls && (this.controlsEnabledBeforePause = this.controls.enabled, this.controls.enabled = !1);\n }\n /**\n * 恢复渲染循环\n */\n resumeRendering() {\n if (!this.isRenderingPaused) {\n console.warn(\"[BimEngine] Rendering is not paused\");\n return;\n }\n this.isRenderingPaused = !1, this.controls && (this.controls.enabled = this.controlsEnabledBeforePause), this.animationId === null && this.animate();\n }\n /**\n * 检查渲染是否暂停\n */\n isRenderingPausedState() {\n return this.isRenderingPaused;\n }\n /**\n * 处理窗口大小变化\n */\n handleWindowResize(e, t) {\n if (!this.container || !this.renderer || !this.camera)\n return;\n if (e === void 0 || t === void 0) {\n const i = this.deviceModule.getContainerSize();\n e = e ?? i.width, t = t ?? i.height;\n }\n if (!e || !t)\n return;\n this.renderer.setPixelRatio(window.devicePixelRatio), this.renderer.setSize(e, t);\n const n = e / t;\n if (this.camera === this.cameraModule.perspectiveCamera)\n this.cameraModule.perspectiveCamera.aspect = n, this.cameraModule.perspectiveCamera.updateProjectionMatrix(), this.camera = this.cameraModule.perspectiveCamera;\n else if (this.camera === this.cameraModule.orthographicCamera) {\n const i = this.cameraModule.orthographicCamera, s = 50, r = this.container.clientWidth / this.container.clientHeight;\n i.left = s * r / -2, i.right = s * r / 2, i.top = s / 2, i.bottom = s / -2, i.updateProjectionMatrix();\n }\n if (this.catchSvg) {\n const i = this.renderer.domElement.width, s = this.renderer.domElement.height;\n this.catchSvg.setAttribute(\"viewBox\", `0 0 ${i} ${s}`);\n }\n this.events && this.events.trigger(zt.ViewportResize, { width: e, height: t });\n }\n /**\n * 销毁引擎,释放资源\n */\n dispose() {\n console.log(\"[BimEngine] Starting engine disposal...\"), this.animationId !== null && (cancelAnimationFrame(this.animationId), this.animationId = null), this.isRenderingPaused = !0, this.onWindowResize && window.removeEventListener(\"resize\", this.onWindowResize);\n try {\n this.measure && (this.measure.disActive(), this.measure.clearAll(), this.measure.annotationContainer && this.measure.annotationContainer.remove()), this.hdr && this.hdr.dispose(), this.minMap && this.minMap.dispose(), this.text && this.text.dispose(), this.clipping && this.clipping.disActive(), this.interactionModule && this.interactionModule.disActive(), this.viewCube && this.viewCube.cubeTool && typeof this.viewCube.cubeTool.dispose == \"function\" && this.viewCube.cubeTool.dispose();\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing managers:\", e);\n }\n try {\n this.controlModule && (this.controlModule.originDiv && this.controlModule.originDiv.remove(), this.controlModule.orbitControls && typeof this.controlModule.orbitControls.dispose == \"function\" && this.controlModule.orbitControls.dispose(), this.controlModule.firstPersonControls && typeof this.controlModule.firstPersonControls.dispose == \"function\" && this.controlModule.firstPersonControls.dispose());\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing controls:\", e);\n }\n this.scene && this.clearScene(this.scene);\n try {\n this.composerModule && this.composerModule.composer && (this.composerModule.composer.passes && this.composerModule.composer.passes.forEach((e) => {\n e.dispose && e.dispose();\n }), this.composerModule.composer.renderTarget1 && this.composerModule.composer.renderTarget1.dispose(), this.composerModule.composer.renderTarget2 && this.composerModule.composer.renderTarget2.dispose());\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing composer:\", e);\n }\n try {\n this.renderModule && this.renderModule.disposeRenderer(), this.renderer && (this.renderer.domElement && this.renderer.domElement.parentElement && this.renderer.domElement.parentElement.removeChild(this.renderer.domElement), this.renderer.dispose(), this.renderer.forceContextLoss());\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing renderer:\", e);\n }\n try {\n this.stats && this.stats.dom && this.stats.dom.parentElement && this.stats.dom.parentElement.removeChild(this.stats.dom), this.catchSvg && this.catchSvg.parentElement && this.catchSvg.parentElement.removeChild(this.catchSvg);\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing DOM elements:\", e);\n }\n try {\n this.events && this.events.listeners && this.events.listeners.clear();\n } catch (e) {\n console.warn(\"[BimEngine] Error clearing event listeners:\", e);\n }\n this.scene = null, this.camera = null, this.renderer = null, this.controls = null, this.models = [], this.container = null, console.log(\"[BimEngine] Engine disposal completed\");\n }\n /**\n * 递归清理场景中的所有对象\n */\n clearScene(e) {\n if (!e) return;\n [...e.children].forEach((n) => {\n this.clearScene(n);\n }), e.parent && e.parent.remove(e), e instanceof M.Mesh && (e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((n) => this.disposeMaterial(n)) : this.disposeMaterial(e.material))), e instanceof M.Line && (e.geometry && e.geometry.dispose(), e.material && this.disposeMaterial(e.material)), e instanceof M.Points && (e.geometry && e.geometry.dispose(), e.material && this.disposeMaterial(e.material)), e instanceof M.InstancedMesh && (e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((n) => this.disposeMaterial(n)) : this.disposeMaterial(e.material)), e.instanceMatrix && (e.instanceMatrix = null), e.instanceColor && (e.instanceColor = null)), e instanceof M.Sprite && e.material && this.disposeMaterial(e.material);\n }\n /**\n * 清理材质及其纹理\n */\n disposeMaterial(e) {\n if (!e) return;\n [\n \"map\",\n \"lightMap\",\n \"bumpMap\",\n \"normalMap\",\n \"specularMap\",\n \"envMap\",\n \"alphaMap\",\n \"aoMap\",\n \"displacementMap\",\n \"emissiveMap\",\n \"gradientMap\",\n \"metalnessMap\",\n \"roughnessMap\",\n \"clearcoatMap\",\n \"clearcoatNormalMap\",\n \"clearcoatRoughnessMap\",\n \"transmissionMap\",\n \"thicknessMap\",\n \"sheenColorMap\",\n \"sheenRoughnessMap\",\n \"specularIntensityMap\",\n \"specularColorMap\",\n \"iridescenceMap\",\n \"iridescenceThicknessMap\"\n ].forEach((n) => {\n const i = e[n];\n i && i instanceof M.Texture && i.dispose();\n }), e.dispose();\n }\n}\nfunction Jp(o) {\n return new kp(o);\n}\nexport {\n Jp as createEngine\n};\n//# sourceMappingURL=bim-engine-sdk.es.js.map\n","import type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { themeManager } from '../../services/theme';\nimport type { EngineOptions, ModelLoadOptions, EngineInfo } from './types';\nimport { type MeasureMode, type ClearHeightDirection, type ClearHeightSelectType } from '../../types/measure';\nimport type { MeasureUnit, MeasurePrecision } from '../measure-panel/types';\nimport type { SectionBoxRange } from '../section-box-panel/types';\nimport type { ManagerRegistry } from '../../core/manager-registry';\n// 导入第三方 SDK 的 createEngine 函数(从 npm 包引入)\n//import { createEngine as createEngineSDK } from 'iflow-engine-base';\nimport { createEngine as createEngineSDK } from '../../../../bim_engine_base/dist/bim-engine-sdk.es';\nimport \"../../../../bim_engine_base/dist/iflow-engine-base.css\"\n\nexport type { EngineOptions, ModelLoadOptions, EngineInfo };\n\n/**\n * 创建 Engine 实例的工厂函数\n * 兼容旧代码直接 import { createEngine } 的方式\n */\nexport const createEngine = (options: EngineOptions, registry: ManagerRegistry) => {\n return new Engine(options, registry);\n};\n\n/**\n * 3D 引擎组件\n * 负责创建和管理第三方 3D 引擎实例\n */\nexport class Engine implements IBimComponent {\n /** 第三方 3D 引擎实例 */\n /** 第三方 3D 引擎实例 */\n private engine: any = null;\n /** 管理器注册表实例 */\n private registry: ManagerRegistry;\n /** 引擎挂载的容器元素 */\n private container: HTMLElement;\n /** 引擎容器 ID(用于传递给 createEngine) */\n private containerId: string;\n /** 引擎配置选项(不包含 container) */\n private options: Omit;\n /** 是否已初始化 */\n private _isInitialized = false;\n /** 是否已销毁 */\n private _isDestroyed = false;\n /** 主题订阅取消函数 */\n private unsubscribeTheme: (() => void) | null = null;\n /** 当前激活的测量类型 */\n private currentMeasureType: MeasureMode | null = null;\n /** 主测量功能是否已激活 */\n private isMeasureActive: boolean = false;\n /** 当前激活的剖切模式 */\n private currentSectionMode: 'x' | 'y' | 'z' | 'box' | 'face' | null = null;\n /** 当前选中的构件信息 */\n private selectedComponent: { url: string; id: string } | null = null;\n\n /**\n * 构造函数\n * @param options 3D 引擎配置选项\n */\n constructor(options: EngineOptions, registry: ManagerRegistry) {\n // 保存注册表\n this.registry = registry;\n // 解析容器元素\n this.container = options.container;\n // 如果容器没有 id,生成一个唯一的 id\n if (!this.container.id) {\n this.containerId = `engine-container-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n this.container.id = this.containerId;\n } else {\n this.containerId = this.container.id;\n }\n\n // 保存配置选项(设置默认值)\n this.options = {\n backgroundColor: 'linear-gradient(to bottom, rgb(214, 224, 235), rgb(246, 250, 255))', // 固定背景渐变色\n version: options.version ?? 'v2', // 默认使用 v2 版本\n showStats: options.showStats ?? false, // 默认不显示统计\n showViewCube: options.showViewCube ?? true, // 默认显示视图立方体\n };\n }\n\n /**\n * 初始化组件 (接口实现)\n * 创建 div 容器并初始化引擎\n */\n public init(): void {\n if (this._isInitialized) {\n console.warn('[Engine] Engine already initialized.');\n return;\n }\n\n if (this._isDestroyed) {\n console.error('[Engine] Cannot initialize destroyed engine.');\n return;\n }\n\n try {\n // 应用背景色到容器\n if (typeof this.options.backgroundColor === 'string') {\n this.container.style.background = this.options.backgroundColor;\n }\n\n // 创建引擎配置对象\n const engineConfig = {\n containerId: this.containerId,\n backgroundColor: this.options.backgroundColor,\n version: this.options.version,\n showStats: this.options.showStats,\n showViewCube: this.options.showViewCube,\n };\n\n // 输出配置信息\n console.log('引擎配置信息:', engineConfig);\n\n // 调用引擎创建函数创建引擎实例\n // 将 options 中的配置复制给 createEngine\n this.engine = createEngineSDK(engineConfig);\n\n if (!this.engine) {\n throw new Error('Failed to create engine instance');\n }\n\n // 标记为已初始化\n this._isInitialized = true;\n\n // 订阅主题变化\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 应用当前主题\n this.setTheme(themeManager.getTheme());\n\n // 监听构件点击事件\n this.engine.events.on('click', (hit: any) => {\n const registry = this.registry;\n if (hit && hit.object) {\n this.selectedComponent = {\n url: hit.object.url,\n id: hit.object.name\n };\n console.log('[Engine] 构件选中:', this.selectedComponent);\n registry.emit('component:selected', this.selectedComponent);\n } else {\n this.selectedComponent = null;\n console.log('[Engine] 取消选中');\n registry.emit('component:deselected', {});\n }\n });\n\n } catch (error) {\n console.error('[Engine] Failed to initialize engine:', error);\n this._isInitialized = false;\n throw error;\n }\n }\n\n /**\n * 设置主题 (接口实现)\n * 根据主题调整 3D 引擎的视觉效果(如背景色)\n * @param theme 全局主题配置\n */\n public setTheme(_theme: ThemeConfig): void {\n\n }\n\n /**\n * 设置语言 (接口实现)\n */\n public setLocales(): void {\n // 3D 引擎组件暂时不需要本地化\n }\n\n /**\n * 检查是否已初始化\n */\n public isInitialized(): boolean {\n return this._isInitialized;\n }\n\n\n /**\n * 加载 3D 模型\n * @param urls 模型文件 URL 数组\n * @param options 加载选项(位置、旋转、缩放)\n */\n public loadModel(urls: string[], options?: ModelLoadOptions): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Engine not initialized. Please call init() first.');\n return;\n }\n if (!urls || urls.length === 0) {\n console.error('[Engine] Model URLs are required.');\n return;\n }\n this.engine.loaderModule.loadModels(urls, options);\n }\n\n /**\n * 回到主视角\n * @returns \n */\n public CameraGoHome() {\n this.engine.viewCube.CameraGoHome();\n }\n\n /**\n * 获取原始 3D 引擎实例\n */\n public getEngine(): any {\n return this.engine;\n }\n\n /**\n * 暂停渲染\n */\n public pauseRendering(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.pauseRendering();\n }\n\n /**\n * 恢复渲染\n */\n public resumeRendering(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.resumeRendering();\n }\n\n /**\n * 销毁 3D 引擎,释放 GPU 资源\n */\n public dispose(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.dispose();\n }\n\n /**\n * 调整渲染器尺寸\n * 容器大小变化时调用,自动更新渲染器、相机投影矩阵和后处理合成器\n */\n public resize(): void {\n if (!this._isInitialized || !this.engine) {\n return;\n }\n // this.engine.handleWindowResize();\n }\n\n // ==================== 测量功能方法 ====================\n\n // ==================== 测量功能(统一 API) ====================\n\n /**\n * 激活测量功能\n * @param mode 测量类型\n * - 'clearHeight': 净高测量\n * - 'clearDistance': 净距测量\n * - 'distance': 距离测量 y\n * - 'elevation': 标高测量 y\n * - 'point': 坐标测量\n * - 'angle': 角度测量 y\n * - 'area': 面积测量 \n * - 'slope': 坡度测量 y\n */\n public activateMeasure(mode: MeasureMode): void {\n if (!this._isInitialized || !this.engine?.measure) {\n console.error('[Engine] Cannot activate measure: engine not initialized.');\n return;\n }\n\n if (this.currentMeasureType === mode) {\n console.log(`[Engine] Measure ${mode} already active, skipping.`);\n return;\n }\n\n // 先激活测量模块\n if (!this.isMeasureActive) {\n console.log('[Engine] Activating measure module');\n this.engine.measure.active();\n this.isMeasureActive = true;\n }\n\n console.log(`[Engine] Activating measure: ${mode}`);\n const measure = this.engine.measure;\n\n switch (mode) {\n case 'clearHeight':\n measure.clearHeightMeasure.active();\n break;\n case 'clearDistance':\n measure.clearDistanceMeasure.active();\n break;\n case 'distance':\n measure.distanceMeasure.active();\n break;\n case 'elevation':\n measure.elevationMeasure.active();\n break;\n case 'point':\n measure.pointMeasure.active();\n break;\n case 'angle':\n measure.angleMeasure.active();\n break;\n case 'area':\n measure.areaMeasure.active();\n break;\n case 'slope':\n measure.slopeMeasure.active();\n break;\n default:\n console.error(`[Engine] Unknown measure type: ${mode}`);\n return;\n }\n this.currentMeasureType = mode;\n }\n\n /**\n * 获取当前激活的测量类型\n * @returns 当前测量类型,未激活时返回 null\n */\n public getCurrentMeasureType(): MeasureMode | null {\n return this.currentMeasureType;\n }\n\n /**\n * 停用测量功能\n * @remarks 关闭测量时调用,会同时清除所有测量标注\n */\n public deactivateMeasure(): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n\n console.log('[Engine] Deactivating measure');\n this.engine.measure.disActive();\n this.engine.measure.clearAll();\n this.isMeasureActive = false;\n this.currentMeasureType = null;\n }\n\n /**\n * 清除所有测量标注(不停用测量模式)\n */\n public clearAllMeasures(): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n console.log('[Engine] Clearing all measures');\n this.engine.measure.clearAll();\n }\n\n /**\n * 保存测量设置\n * @param setting 测量设置,包含单位和精度\n */\n public saveMeasureSetting(setting: { unit: MeasureUnit; precision: MeasurePrecision }): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n this.engine.measure.saveSetting?.(setting);\n }\n\n /**\n * 设置净高测量朝向\n * @param direction 0=朝下,1=朝上\n */\n public setClearHeightDirection(direction: ClearHeightDirection): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n console.log(`[Engine] Setting clearHeight direction: ${direction}`);\n this.engine.measure.clearHeightMeasure.setDirection(direction);\n }\n\n /**\n * 设置净高测量选择对象类型\n * @param selectType 'point'=选择点,'element'=选择构件\n */\n public setClearHeightSelectType(selectType: ClearHeightSelectType): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n console.log(`[Engine] Setting clearHeight selectType: ${selectType}`);\n this.engine.measure.clearHeightMeasure.setSelectType(selectType);\n }\n\n // ==================== 结束:测量功能 ====================\n\n // ==================== 剖切功能(统一 API) ====================\n\n /**\n * 激活剖切功能(统一入口)\n * @param mode 剖切模式\n * - 'x': X轴剖切面\n * - 'y': Y轴剖切面\n * - 'z': Z轴剖切面\n * - 'box': 剖切盒(六面体裁剪)\n * - 'face': 拾取面剖切(点选模型表面创建剖切面)\n * @remarks\n * - 幂等操作:如果当前模式与请求模式相同,则静默返回\n * - 切换模式时会自动停用之前的剖切\n * - 底层调用 engine.clipping.active(mode)\n * @example\n * ```typescript\n * // 激活 X 轴剖切\n * engine.activeSection('x');\n * \n * // 切换到剖切盒\n * engine.activeSection('box');\n * ```\n */\n public activeSection(mode: 'x' | 'y' | 'z' | 'box' | 'face'): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n console.error('[Engine] Cannot activate section: engine not initialized.');\n return;\n }\n if (this.currentSectionMode === mode) {\n console.log(`[Engine] Section ${mode} already active, skipping.`);\n return;\n }\n console.log(`[Engine] Activating section: ${mode}`);\n this.engine.clipping.active(mode);\n this.currentSectionMode = mode;\n }\n\n /**\n * 获取当前激活的剖切模式\n * @returns 当前剖切模式,未激活时返回 null\n * @example\n * ```typescript\n * const mode = engine.getCurrentSectionMode();\n * if (mode === 'box') {\n * console.log('剖切盒已激活');\n * }\n * ```\n */\n public getCurrentSectionMode(): 'x' | 'y' | 'z' | 'box' | 'face' | null {\n return this.currentSectionMode;\n }\n\n /**\n * 设置剖切盒范围\n * @param range 剖切范围配置,每个轴的 min/max 值为百分比 (0-100)\n * @remarks\n * - 仅在 'box' 模式下有效\n * - 底层调用 engine.clipping.updateClippingValue(range)\n * @example\n * ```typescript\n * // 设置 X 轴裁剪 20%-80%,Y/Z 轴保持完整\n * engine.setSectionBoxRange({\n * x: { min: 20, max: 80 },\n * y: { min: 0, max: 100 },\n * z: { min: 0, max: 100 }\n * });\n * ```\n */\n public setSectionBoxRange(range: SectionBoxRange): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n console.error('[Engine] Cannot set section box range: engine not initialized.');\n return;\n }\n this.engine.clipping.updateClippingValue(range);\n }\n\n /**\n * 停用所有剖切功能\n * @remarks\n * - 统一停用入口,无论当前是哪种剖切模式\n * - 关闭剖切对话框时调用此方法\n * - 底层调用 engine.clipping.disActive()\n * @example\n * ```typescript\n * // 关闭剖切\n * engine.deactivateSection();\n * ```\n */\n public deactivateSection(): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n return;\n }\n console.log('[Engine] Deactivating all sections');\n this.engine.clipping.disActive();\n this.currentSectionMode = null;\n }\n\n /**\n * 隐藏剖切面(临时隐藏,可恢复)\n * @remarks\n * - 隐藏当前剖切面,但不停用剖切功能\n * - 配合 recoverSection() 使用\n * - 底层调用 engine.clipping.disabled()\n * @example\n * ```typescript\n * // 临时隐藏剖切面\n * engine.hideSection();\n * // 稍后恢复\n * engine.recoverSection();\n * ```\n */\n public hideSection(): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n console.error('[Engine] Cannot hide section: engine not initialized.');\n return;\n }\n console.log('[Engine] Hiding section');\n this.engine.clipping.disabled();\n }\n\n /**\n * 恢复剖切面(从隐藏状态恢复)\n * @remarks\n * - 恢复被 hideSection() 隐藏的剖切面\n * - 底层调用 engine.clipping.recover()\n * @example\n * ```typescript\n * // 隐藏后恢复剖切面\n * engine.hideSection();\n * // ... 一段时间后\n * engine.recoverSection();\n * ```\n */\n public recoverSection(): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n console.error('[Engine] Cannot recover section: engine not initialized.');\n return;\n }\n console.log('[Engine] Recovering section');\n this.engine.clipping.recover();\n }\n\n /**\n * 剖切盒适应选中模型\n * @remarks 将剖切盒调整为刚好包围选中的模型\n */\n public fitSectionBoxToModel(): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot fit section box: engine not initialized.');\n return;\n }\n const model = this.engine.engineStatus?.highlightModels;\n if (model) {\n console.log('[Engine] Fitting section box to model');\n this.engine.clipping?.clippingModel(model);\n }\n }\n\n /**\n * 剖切盒适应(缩放到场景整体包围盒)\n * @remarks\n * - 对接底层 `engine.clipping.scaleBox()`\n * - 会确保当前处于剖切盒模式\n */\n public scaleSectionBox(): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n console.error('[Engine] Cannot scale section box: engine not initialized.');\n return;\n }\n this.engine.clipping.scaleBox();\n }\n\n /**\n * 反向剖切\n * @remarks 对接底层 `engine.clipping.reverse()`\n */\n public reverseSection(): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n console.error('[Engine] Cannot reverse section: engine not initialized.');\n return;\n }\n this.engine.clipping.reverse();\n }\n\n // ==================== 结束:剖切功能 ====================\n\n // ==================== 渲染模式 ====================\n\n /**\n * 获取当前渲染模式\n * @returns 'simple' | 'balance' | 'advanced'\n */\n public getRenderMode(): string {\n if (!this._isInitialized || !this.engine?.engineModelModule) {\n return 'balance';\n }\n return this.engine.engineModelModule.getCurrentMode();\n }\n\n /**\n * 设置渲染模式\n * @param mode 'simple'(性能模式) | 'balance'(平衡模式) | 'advanced'(效果模式)\n */\n public setRenderMode(mode: 'simple' | 'balance' | 'advanced'): void {\n if (!this._isInitialized || !this.engine?.engineModelModule) {\n console.warn('[Engine] Cannot set render mode: engine not initialized.');\n return;\n }\n try {\n this.engine.engineModelModule.setMode(mode);\n } catch (e) {\n console.warn('[Engine] Failed to set render mode:', e);\n }\n }\n\n // ==================== 结束:渲染模式 ====================\n\n // ==================== 漫游功能 ====================\n\n /** 漫游模式是否激活 */\n private isWalkModeActive: boolean = false;\n\n /**\n * 激活第一人称漫游模式\n * @remarks 切换到第一人称控制器,禁用轨道控制器\n */\n public activateFirstPersonMode(): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot activate first person mode: engine not initialized.');\n return;\n }\n\n if (!this.engine.controlModule) {\n console.error('[Engine] Control module not available.');\n return;\n }\n\n if (this.isWalkModeActive) {\n console.log('[Engine] First person mode already active, skipping.');\n return;\n }\n\n console.log('[Engine] Activating first person mode');\n this.engine.controlModule.switchFirstPersonMode();\n this.loadWalkSettings();\n this.isWalkModeActive = true;\n }\n\n /**\n * 停用第一人称漫游模式\n * @remarks 切换回轨道控制器\n */\n public deactivateFirstPersonMode(): void {\n if (!this._isInitialized || !this.engine?.controlModule) {\n return;\n }\n\n if (!this.isWalkModeActive) {\n return;\n }\n\n console.log('[Engine] Deactivating first person mode');\n this.engine.controlModule.switchDefaultMode();\n this.isWalkModeActive = false;\n }\n\n private static WALK_SPEED_KEY = 'bim-walk-speed';\n private static WALK_GRAVITY_KEY = 'bim-walk-gravity';\n private static WALK_COLLISION_KEY = 'bim-walk-collision';\n\n /**\n * 设置漫游移动速度\n * @param speed 移动速度值\n */\n public setWalkSpeed(speed: number): void {\n if (!this._isInitialized || !this.engine?.controlModule) {\n console.error('[Engine] Cannot set walk speed: engine not initialized.');\n return;\n }\n localStorage.setItem(Engine.WALK_SPEED_KEY, String(speed));\n this.engine.controlModule.setMoveSpeed(speed);\n }\n\n /**\n * 设置漫游重力开关\n * @param enabled 是否启用重力\n */\n public setWalkGravity(enabled: boolean): void {\n if (!this._isInitialized || !this.engine?.controlModule) {\n console.error('[Engine] Cannot set walk gravity: engine not initialized.');\n return;\n }\n localStorage.setItem(Engine.WALK_GRAVITY_KEY, String(enabled));\n this.engine.controlModule.setApplyGravity(enabled);\n }\n\n /**\n * 设置漫游碰撞检测开关\n * @param enabled 是否启用碰撞检测\n */\n public setWalkCollision(enabled: boolean): void {\n if (!this._isInitialized || !this.engine?.controlModule) {\n console.error('[Engine] Cannot set walk collision: engine not initialized.');\n return;\n }\n localStorage.setItem(Engine.WALK_COLLISION_KEY, String(enabled));\n this.engine.controlModule.setApplyCollision(enabled);\n }\n\n private loadWalkSettings(): void {\n if (!this.engine?.controlModule) return;\n\n const speed = localStorage.getItem(Engine.WALK_SPEED_KEY);\n const gravity = localStorage.getItem(Engine.WALK_GRAVITY_KEY);\n const collision = localStorage.getItem(Engine.WALK_COLLISION_KEY);\n\n this.engine.controlModule.setMoveSpeed(speed ? Number(speed) : 1);\n this.engine.controlModule.setApplyGravity(gravity === 'true');\n this.engine.controlModule.setApplyCollision(collision === 'true');\n }\n\n /**\n * 切换小地图显示状态\n */\n public toggleMiniMap(): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot toggle mini map: engine not initialized.');\n return;\n }\n this.engine.minMap?.toggle();\n }\n\n /**\n * 获取小地图显示状态\n * @returns true=显示,false=隐藏\n */\n public getMiniMapState(): boolean {\n if (!this._isInitialized || !this.engine) {\n return false;\n }\n return this.engine.minMap?.getState() ?? false;\n }\n\n /**\n * 获取漫游模式是否激活\n * @returns 是否处于漫游模式\n */\n public isFirstPersonModeActive(): boolean {\n return this.isWalkModeActive;\n }\n\n // ==================== 结束:漫游功能 ====================\n\n // ==================== 构件选中 ====================\n\n /**\n * 获取当前选中的构件\n * @returns 选中构件的 URL 和 ID,未选中时返回 null\n */\n public getSelectedComponent(): { url: string; id: string } | null {\n return this.selectedComponent;\n }\n\n /**\n * 获取构件属性\n * @param url 模型 URL\n * @param id 构件 ID\n * @param callback 回调函数,接收属性数据\n */\n public getComponentProperties(\n url: string,\n id: string,\n callback: (data: any) => void\n ): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot get component properties: engine not initialized.');\n return;\n }\n\n if (!this.engine.modelProperties) {\n console.error('[Engine] modelProperties not available');\n return;\n }\n\n console.log('[Engine] Getting component properties:', { url, id });\n this.engine.modelProperties.getModelProperties(url, id, callback);\n }\n\n // ==================== 结束:构件选中 ====================\n\n // ==================== 模型树 ====================\n\n /**\n * 获取类型树数据\n * @returns 类型树节点数组\n */\n public getTypeTreeData(): any[] {\n if (!this._isInitialized || !this.engine?.modelTree) {\n return [];\n }\n return this.engine.modelTree.getTypeTreeData();\n }\n\n /**\n * 获取楼层树数据\n * @returns 楼层树节点数组\n */\n public getLevelTreeData(): any[] {\n if (!this._isInitialized || !this.engine?.modelTree) {\n return [];\n }\n return this.engine.modelTree.getLevelTreeData();\n }\n\n /**\n * 获取专业树数据\n * @returns 专业树节点数组\n */\n public getMajorTreeData(): any[] {\n if (!this._isInitialized || !this.engine?.modelTree) {\n return [];\n }\n return this.engine.modelTree.getMajorTreeData();\n }\n\n // ==================== 结束:模型树 ====================\n\n /**\n * 激活框选放大功能\n * @remarks 允许用户通过框选区域来放大视图\n */\n public activateZoomBox(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.rangeScale?.active();\n }\n\n /**\n * 获取引擎基本信息\n * @returns 引擎信息对象,包含构件数量、三角面数量、顶点数量等\n */\n public getEngineInfo(): EngineInfo | null {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return null;\n }\n return this.engine.engineInfo.getEngineInfo() as EngineInfo;\n }\n\n // ==================== 路径漫游 ====================\n\n /**\n * 添加漫游点\n * 将当前相机位置添加为一个漫游点\n */\n public pathRoamingAddPoint(): void {\n // 检查引擎是否已初始化\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return;\n }\n // 调用底层 API 添加点位\n this.engine.pathRoaming.addPoint(0);\n }\n\n /**\n * 删除指定索引的漫游点\n * @param index 要删除的漫游点索引\n */\n public pathRoamingRemovePoint(index: number): void {\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return;\n }\n this.engine.pathRoaming.removePoint(index);\n }\n\n /**\n * 清除所有漫游点\n */\n public pathRoamingClearPoints(): void {\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return;\n }\n this.engine.pathRoaming.clearPoints();\n }\n\n /**\n * 获取所有漫游点\n * @returns 漫游点数组\n */\n public pathRoamingGetPoints(): any[] {\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return [];\n }\n return this.engine.pathRoaming.getPoints() ?? [];\n }\n\n /**\n * 跳转到指定漫游点\n * @param index 目标漫游点索引\n */\n public pathRoamingJumpToPoint(index: number): void {\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return;\n }\n this.engine.pathRoaming.jumpToPoint(index);\n }\n\n /**\n * 播放漫游\n * @param options 播放选项,包含时长、循环、回调等配置\n */\n public pathRoamingPlay(options?: {\n duration?: number;\n loop?: boolean;\n onComplete?: () => void;\n onPointComplete?: (pointIndex: number) => void;\n }): void {\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return;\n }\n this.engine.pathRoaming.play(options);\n }\n\n /**\n * 停止漫游\n */\n public pathRoamingStop(): void {\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return;\n }\n this.engine.pathRoaming.stop();\n }\n\n // ==================== 结束:路径漫游 ====================\n\n // ==================== 构件操作 ====================\n\n /**\n * 获取当前高亮(选中)的模型\n * @returns 高亮模型对象,未选中时返回 null\n */\n public getHighlightModels(): any {\n if (!this._isInitialized || !this.engine) {\n return null;\n }\n return this.engine.engineStatus?.highlightModels ?? null;\n }\n\n /**\n * 高亮指定模型构件\n * \n * 用于在 3D 场景中高亮显示指定的构件,常用于:\n * - 点击构件树节点时高亮对应模型\n * - 搜索结果定位\n * - 批量选中构件\n * \n * @param models - 要高亮的模型数组,每个元素包含:\n * - url: 模型资源 URL\n * - ids: 构件 ID 数组\n * \n * @example\n * engine.highlightModel([\n * { url: 'https://xxx/models/xxx/', ids: [350518, 350520] }\n * ]);\n */\n public highlightModel(models: { url: string; ids: number[] }[]): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot highlight model: engine not initialized.');\n return;\n }\n const safeModels = this.sanitizeModelParams(models);\n if (!safeModels.length) return;\n try {\n this.engine.modelToolModule.highlightModel(safeModels);\n } catch (e) {\n console.warn('[Engine] highlightModel failed:', e);\n }\n }\n\n public unhighlightAllModels(): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot unhighlight models: engine not initialized.');\n return;\n }\n this.engine.modelToolModule.unhighlightAllModels();\n }\n\n public viewScaleToModel(models: { url: string; ids: number[] }[]): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot view scale to model: engine not initialized.');\n return;\n }\n const safeModels = this.sanitizeModelParams(models);\n if (!safeModels.length) return;\n try {\n this.engine.modelToolModule.viewScaleToModel(safeModels);\n } catch (e) {\n console.warn('[Engine] viewScaleToModel failed:', e);\n }\n }\n\n public hideModels(models: { url: string; ids: number[] }[]): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot hide models: engine not initialized.');\n return;\n }\n const safeModels = this.sanitizeModelParams(models);\n if (!safeModels.length) return;\n try {\n this.engine.modelToolModule.hideModel(safeModels);\n } catch (e) {\n console.warn('[Engine] hideModels failed:', e);\n }\n }\n\n public showModel(models: { url: string; ids: number[] }[]): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot show model: engine not initialized.');\n return;\n }\n const safeModels = this.sanitizeModelParams(models);\n if (!safeModels.length) return;\n try {\n this.engine.modelToolModule.showModel(safeModels);\n } catch (e) {\n console.warn('[Engine] showModel failed:', e);\n }\n }\n\n private sanitizeModelParams(models: { url: string; ids: number[] }[]): { url: string; ids: number[] }[] {\n if (!Array.isArray(models)) return [];\n\n const normalizeUrl = (url: string): string => url.replace(/\\/+$/, '');\n\n const loadedModels = Array.isArray((this.engine as any)?.models)\n ? ((this.engine as any).models as Array<{ url?: string; nodesMap?: Map }>)\n : [];\n const modelMap = new Map }>();\n for (const loadedModel of loadedModels) {\n if (loadedModel?.url) {\n modelMap.set(normalizeUrl(loadedModel.url), loadedModel);\n }\n }\n\n const result: { url: string; ids: number[] }[] = [];\n for (const model of models) {\n if (!model || typeof model.url !== 'string' || !model.url) continue;\n if (!Array.isArray(model.ids)) continue;\n\n const loadedModel = modelMap.get(normalizeUrl(model.url));\n if (!loadedModel || !(loadedModel.nodesMap instanceof Map)) {\n continue;\n }\n const idsSet = new Set();\n for (const rawId of model.ids) {\n if (!Number.isFinite(rawId)) continue;\n const id = Number(rawId);\n if (!Number.isInteger(id)) continue;\n\n const node = loadedModel.nodesMap.get(id);\n if (!node || !Array.isArray(node.indexes) || node.indexes.length === 0) {\n continue;\n }\n\n idsSet.add(id);\n }\n\n const ids = Array.from(idsSet);\n if (!ids.length) continue;\n\n result.push({ url: model.url, ids });\n }\n\n return result;\n }\n\n /**\n * 半透明指定模型\n * @param models 要半透明的模型对象\n */\n public translucentModels(models: any): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot translucent models: engine not initialized.');\n return;\n }\n if (models) {\n this.engine.modelToolModule.translucentModel(models);\n }\n }\n\n /**\n * 取消半透明\n */\n public unTranslucentModel(): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot cancel translucent: engine not initialized.');\n return;\n }\n this.engine.modelToolModule.unTranslucentModel();\n }\n\n /**\n * 隔离指定模型(隐藏其他)\n * @param models 要隔离的模型对象\n */\n public isolateModels(models: any): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot isolate models: engine not initialized.');\n return;\n }\n if (models) {\n this.engine.modelToolModule.isolateModel(models);\n }\n }\n\n /**\n * 半透明其他构件\n * @param models 选中的模型对象(其他构件将被半透明)\n */\n public translucentOtherModels(models: any): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot translucent other models: engine not initialized.');\n return;\n }\n if (models) {\n this.engine.modelToolModule.translucentOtherModel(models);\n }\n }\n\n /**\n * 显示所有模型\n */\n public showAllModels(): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot show all models: engine not initialized.');\n return;\n }\n // 取消剖切\n this.deactivateSection()\n // 显示所有模型\n this.engine.modelToolModule.showAllModels();\n }\n\n /**\n * 批量选择同类模型\n * @param models 参考模型对象\n */\n public batchSelectSameTypeModel(models: any): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot batch select: engine not initialized.');\n return;\n }\n if (models) {\n this.engine.modelToolModule.batchSelectSameTypeModel(models);\n }\n }\n\n /**\n * 批量选择同层模型\n * @param models 参考模型对象\n */\n public batchSelectSameLevelModel(models: any): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot batch select: engine not initialized.');\n return;\n }\n if (models) {\n this.engine.modelToolModule.batchSelectSameLevelModel(models);\n }\n }\n\n /**\n * 批量选择同层同类模型\n * @param models 参考模型对象\n */\n public batchSelectSameLevelTypeModel(models: any): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot batch select: engine not initialized.');\n return;\n }\n if (models) {\n this.engine.modelToolModule.batchSelectSameLevelTypeModel(models);\n }\n }\n\n // ==================== 结束:构件操作 ====================\n\n /**\n * 销毁组件 (接口实现)\n * 清理资源、取消订阅、销毁引擎实例\n */\n public destroy(): void {\n if (this._isDestroyed) {\n return;\n }\n\n // 停用测量功能\n this.deactivateMeasure();\n\n // 取消主题订阅\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n\n // 销毁 3D 引擎,释放 GPU 资源\n if (this.engine) {\n this.engine.dispose();\n this.engine = null;\n }\n\n // 清理容器\n this.container.innerHTML = '';\n\n // 更新状态\n this.currentMeasureType = null;\n this.isMeasureActive = false;\n this._isDestroyed = true;\n this._isInitialized = false;\n }\n}\n","import { IBimComponent } from '../../types/component';\nimport { ThemeConfig } from '../../themes/types';\nimport { IRightKeyContent, RightKeyOptions } from './types';\nimport './index.css';\n\n/**\n * 右键浮层容器组件 (RightKey)\n * 这是一个纯粹的定位容器,负责在屏幕指定位置显示内容。\n * 它不关心具体内容是什么,只处理定位、边界检测和关闭逻辑。\n */\nexport class BimRightKey implements IBimComponent {\n private element: HTMLElement;\n private content: IRightKeyContent | null = null;\n private isVisible: boolean = false;\n private onCloseCallback?: () => void;\n private options?: RightKeyOptions;\n \n private mouseDownTime: number = 0;\n private mouseDownX: number = 0;\n private mouseDownY: number = 0;\n private readonly CLICK_THRESHOLD: number = 200; // ms\n private readonly MOVE_THRESHOLD: number = 5; // px\n\n constructor(options?: RightKeyOptions) {\n this.options = options;\n this.element = document.createElement('div');\n this.element.className = `bim-right-key ${options?.className || ''}`;\n \n // 设置层级,默认很高以覆盖其他 UI\n if (options?.zIndex) {\n this.element.style.zIndex = options.zIndex.toString();\n }\n \n // 挂载到 body 以便进行固定定位\n document.body.appendChild(this.element);\n }\n\n public init(): void {\n // 绑定全局点击事件,用于实现\"点击外部关闭\"\n document.addEventListener('mousedown', this.handleGlobalClick);\n \n // 阻止在容器自身上触发系统默认右键菜单\n this.element.addEventListener('contextmenu', (e) => {\n e.preventDefault();\n e.stopPropagation();\n });\n\n // 绑定容器交互事件\n if (this.options?.container) {\n this.options.container.addEventListener('mousedown', this.handleContainerMouseDown);\n this.options.container.addEventListener('mouseup', this.handleContainerMouseUp);\n this.options.container.addEventListener('contextmenu', this.handleContainerContextMenu);\n }\n }\n\n public setTheme(_theme: ThemeConfig): void {\n // 容器本身通常是透明的,主题样式主要由内容组件处理\n // 如果容器需要背景色,可以在这里设置\n // 使用 _theme 前缀避免 TS 未使用变量报错\n }\n\n public setLocales(): void {\n // 容器不包含文本,无需处理国际化\n // 内容组件的国际化由内容组件自身处理\n }\n\n public destroy(): void {\n document.removeEventListener('mousedown', this.handleGlobalClick);\n \n if (this.options?.container) {\n this.options.container.removeEventListener('mousedown', this.handleContainerMouseDown);\n this.options.container.removeEventListener('mouseup', this.handleContainerMouseUp);\n this.options.container.removeEventListener('contextmenu', this.handleContainerContextMenu);\n }\n\n this.unmountContent();\n this.element.remove();\n }\n\n private handleContainerMouseDown = (e: MouseEvent): void => {\n // 记录右键按下时间和位置 (button 2 是右键)\n if (e.button === 2) {\n this.mouseDownTime = Date.now();\n this.mouseDownX = e.clientX;\n this.mouseDownY = e.clientY;\n }\n };\n\n private handleContainerMouseUp = (e: MouseEvent): void => {\n // 只处理右键 (button 2)\n if (e.button !== 2) return;\n\n // 检查点击时长,如果是长按或拖拽(时间过长),则不触发回调\n const pressDuration = Date.now() - this.mouseDownTime;\n if (pressDuration > this.CLICK_THRESHOLD) {\n return;\n }\n\n // 检查移动距离,如果鼠标移动超过阈值(用户在拖拽旋转模型),则不触发回调\n const dx = e.clientX - this.mouseDownX;\n const dy = e.clientY - this.mouseDownY;\n if (dx * dx + dy * dy > this.MOVE_THRESHOLD * this.MOVE_THRESHOLD) {\n return;\n }\n\n // 触发有效右键回调\n if (this.options?.onContext) {\n this.options.onContext(e);\n }\n };\n\n private handleContainerContextMenu = (e: MouseEvent): void => {\n // 阻止浏览器默认的右键菜单\n // 真正的菜单触发逻辑已移至 mouseup,这里只负责拦截默认行为\n e.preventDefault();\n };\n\n /**\n * 设置关闭时的回调函数\n * 通常用于通知 Manager 状态变更\n */\n public setOnClose(callback: () => void): void {\n this.onCloseCallback = callback;\n }\n\n /**\n * 挂载内容组件\n * @param content 实现了 IRightKeyContent 接口的组件实例\n */\n public mount(content: IRightKeyContent): void {\n // 先卸载旧内容,防止内存泄漏\n this.unmountContent();\n \n this.content = content;\n this.element.appendChild(content.getElement());\n }\n\n /**\n * 卸载当前内容\n */\n public unmountContent(): void {\n if (this.content) {\n this.content.destroy(); // 重要:调用组件销毁方法清理���源\n this.element.innerHTML = '';\n this.content = null;\n }\n }\n\n /**\n * 在指定位置显示容器\n * 包含智能边界检测逻辑,防止溢出屏幕\n * @param x 目标 X 坐标 (通常是鼠标点击位置)\n * @param y 目标 Y 坐标\n */\n public show(x: number, y: number): void {\n this.element.classList.add('visible');\n this.isVisible = true;\n\n // 1. 先定位到目标位置,以便测量尺寸\n this.element.style.left = `${x}px`;\n this.element.style.top = `${y}px`;\n\n // 2. 获取容器尺寸和视口尺寸\n const rect = this.element.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let newX = x;\n let newY = y;\n\n // 3. 水平方向边界检测:如果溢出右边界,则向左对齐\n if (x + rect.width > viewportWidth) {\n newX = x - rect.width;\n }\n \n // 4. 垂直方向边界检测:如果溢出下边界,则向上对齐\n if (y + rect.height > viewportHeight) {\n newY = y - rect.height;\n }\n\n // 5. 应用修正后的坐标\n this.element.style.left = `${newX}px`;\n this.element.style.top = `${newY}px`;\n }\n\n /**\n * 隐藏容器\n */\n public hide(): void {\n this.element.classList.remove('visible');\n this.isVisible = false;\n \n // 为了状态重置,通常隐藏时也卸载内容\n this.unmountContent(); \n \n if (this.onCloseCallback) {\n this.onCloseCallback();\n }\n }\n\n /**\n * 处理全局点击事件\n * 用于检测是否点击了容器外部\n */\n private handleGlobalClick = (e: MouseEvent): void => {\n if (!this.isVisible) return;\n \n // 如果点击的是容器内部,不做处理\n if (this.element.contains(e.target as Node)) {\n return;\n }\n\n // 点击外部,关闭容器\n this.hide();\n };\n}\n","import { IBimComponent } from '../../types/component';\nimport { ThemeConfig } from '../../themes/types';\nimport { localeManager, t } from '../../services/locale';\nimport { MenuItemConfig } from './item';\nimport { MenuOptions } from './types';\nimport './index.css';\nimport { themeManager } from '../../services/theme';\n\n/**\n * 通用菜单列表组件\n * 负责渲染一组菜单项,支持分组、排序、图标、快捷键提示和递归多级子菜单。\n * 它不包含定位逻辑,仅负责内容渲染。\n */\nexport class BimMenu implements IBimComponent {\n public element: HTMLElement;\n private options: MenuOptions;\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n // 当前激活的子菜单引用,用于自动关闭\n private activeSubMenu: { menu: BimMenu; container: HTMLElement } | null = null;\n\n constructor(options: MenuOptions) {\n this.options = options;\n this.element = document.createElement('ul');\n this.element.className = 'bim-menu';\n }\n\n /**\n * 初始化组件\n * 渲染 DOM 结构并订阅语言变更\n */\n public init(): void {\n this.render();\n\n // 订阅语言变更事件,实现国际化自动更新\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n // 自动订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n }\n\n /**\n * 设置主题\n * @param theme 全局主题配置\n */\n public setTheme(theme: ThemeConfig) {\n const style = this.element.style;\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-divider', theme.divider);\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n }\n\n /**\n * 响应语言变更\n * 重新渲染整个菜单以更新文本\n */\n public setLocales(): void {\n this.element.innerHTML = '';\n this.render();\n }\n\n /**\n * 销毁组件\n * 清理事件监听、子菜单和 DOM 元素\n */\n public destroy(): void {\n // 取消语言订阅\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n // 关闭并销毁所有打开的子菜单\n this.closeSubMenu();\n // 移除自身 DOM\n this.element.remove();\n }\n\n /**\n * 获取组件根元素\n * 实现 IRightKeyContent 接口,允许被 RightKey 容器挂载\n */\n public getElement(): HTMLElement {\n return this.element;\n }\n\n private hasAnyIcon(items: MenuItemConfig[]): boolean {\n return items.some(item => {\n if (item.icon) return true;\n if (item.children) return this.hasAnyIcon(item.children);\n return false;\n });\n }\n\n private render(): void {\n const { items, groupOrder } = this.options;\n\n if (this.hasAnyIcon(items)) {\n this.element.classList.add('has-icons');\n } else {\n this.element.classList.remove('has-icons');\n }\n\n const groups = new Map();\n const defaultGroup = 'default';\n\n items.forEach(item => {\n const groupName = item.group || defaultGroup;\n if (!groups.has(groupName)) {\n groups.set(groupName, []);\n }\n groups.get(groupName)!.push(item);\n });\n\n let sortedGroupKeys: string[] = [];\n if (groupOrder) {\n sortedGroupKeys = groupOrder.filter(g => groups.has(g));\n for (const key of groups.keys()) {\n if (!sortedGroupKeys.includes(key)) {\n sortedGroupKeys.push(key);\n }\n }\n } else {\n sortedGroupKeys = Array.from(groups.keys());\n }\n\n sortedGroupKeys.forEach((groupName, index) => {\n if (index > 0) {\n const divider = document.createElement('li');\n divider.className = 'bim-menu-divider';\n this.element.appendChild(divider);\n }\n\n const groupItems = groups.get(groupName)!;\n groupItems.sort((a, b) => (a.order || 0) - (b.order || 0));\n\n groupItems.forEach(item => {\n if (item.visible !== false) {\n this.element.appendChild(this.createItemElement(item));\n if (item.divider) {\n const divider = document.createElement('li');\n divider.className = 'bim-menu-divider';\n this.element.appendChild(divider);\n }\n }\n });\n });\n }\n\n /**\n * 创建单个菜单项的 DOM 元素\n */\n private createItemElement(item: MenuItemConfig): HTMLElement {\n const li = document.createElement('li');\n // 根据状态设置样式类\n const isEnabled = !item.disabled;\n li.className = `bim-menu-item ${isEnabled ? '' : 'disabled'}`;\n\n // 1. 图标区域 (Icon Slot)\n const iconDiv = document.createElement('div');\n iconDiv.className = 'bim-menu-item-icon';\n if (item.icon) {\n iconDiv.innerHTML = item.icon;\n }\n li.appendChild(iconDiv);\n\n // 2. 文本区域 (Label Slot)\n const labelDiv = document.createElement('div');\n labelDiv.className = 'bim-menu-item-label';\n // 获取翻译后的文本\n labelDiv.textContent = t(item.label);\n li.appendChild(labelDiv);\n\n // 3. 子菜单指示器 (Arrow Slot)\n const children = item.children;\n const hasChildren = children && children.length > 0;\n\n if (hasChildren) {\n const arrowDiv = document.createElement('div');\n arrowDiv.className = 'bim-menu-item-arrow';\n // 简单的右箭头 SVG\n arrowDiv.innerHTML = '';\n li.appendChild(arrowDiv);\n\n // 绑定子菜单交互事件\n // 鼠标移入:打开子菜单\n li.addEventListener('mouseenter', () => this.openSubMenu(item, li));\n } else {\n // 鼠标移入普通项:关闭当前已打开的子菜单\n li.addEventListener('mouseenter', () => this.closeSubMenu());\n }\n\n // 4. 绑定点击事件\n if (isEnabled) {\n // Debug Log: 检查是否绑定了事件\n // console.log(`[BimMenu] Binding click for ${item.id}, hasChildren: ${hasChildren}, hasOnClick: ${!!item.onClick}`);\n \n li.addEventListener('click', (e) => {\n e.stopPropagation(); // 防止冒泡\n console.log(`[BimMenu] Clicked item: ${item.id}`);\n \n // 如果是叶子节点(没有子菜单),则触发点击动作\n if (!hasChildren) {\n if (item.onClick) {\n console.log(`[BimMenu] Executing onClick for ${item.id}`);\n item.onClick();\n } else {\n console.warn(`[BimMenu] No onClick handler for ${item.id}`);\n }\n }\n });\n }\n\n return li;\n }\n\n /**\n * 打开子菜单\n * @param item 当前菜单项\n * @param parentLi 触发的 DOM 元素(用于定位)\n */\n private openSubMenu(item: MenuItemConfig, parentLi: HTMLElement): void {\n const children = item.children;\n if (!children || children.length === 0) return;\n\n // 如果当前已经打开了子菜单,先关闭它\n this.closeSubMenu();\n\n // 创建子菜单容器 (模拟一个临时的悬浮层)\n const container = document.createElement('div');\n container.style.position = 'fixed';\n container.style.zIndex = '10001'; // 确保比父菜单层级高\n\n // 初步计算位置:位于父项右侧\n const rect = parentLi.getBoundingClientRect();\n container.style.top = `${rect.top}px`;\n container.style.left = `${rect.right}px`;\n\n // 关键修复:阻止 mousedown 冒泡\n // 防止点击子菜单时触发 BimRightKey 的全局关闭逻辑(因为它认为点击发生在主菜单外部)\n container.addEventListener('mousedown', (e) => e.stopPropagation());\n\n // 递归创建新的 BimMenu 实例\n const subMenu = new BimMenu({ items: children });\n subMenu.init();\n container.appendChild(subMenu.element);\n document.body.appendChild(container);\n\n // 保存引用以便后续清理\n this.activeSubMenu = { menu: subMenu, container };\n\n // 边界检测:如果超出屏幕右侧,则向左展开\n const subRect = container.getBoundingClientRect();\n if (subRect.right > window.innerWidth) {\n container.style.left = `${rect.left - subRect.width}px`;\n }\n // TODO: 垂直方向边界检测\n }\n\n /**\n * 关闭当前激活的子菜单\n */\n private closeSubMenu(): void {\n if (this.activeSubMenu) {\n this.activeSubMenu.menu.destroy();\n this.activeSubMenu.container.remove();\n this.activeSubMenu = null;\n }\n }\n}\n\n\n","/**\n * 右键菜单管理器\n * 负责管理右键上下文菜单的显示和交互\n */\nimport { BaseManager } from '../core/base-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { BimRightKey } from '../components/right-key';\nimport { BimMenu } from '../components/menu';\nimport { MenuItemConfig } from '../components/menu/item';\n\n/**\n * 右键菜单管理器\n * 支持注册多个上下文处理器,动态生成右键菜单\n */\nexport class RightKeyManager extends BaseManager {\n /** 容器元素 */\n private container: HTMLElement;\n /** 右键面板实例 */\n private rightKeyPanel: BimRightKey;\n /** 上下文处理器列表 */\n private contextHandlers: Array<(e: MouseEvent) => MenuItemConfig[] | null> = [];\n\n constructor(container: HTMLElement, registry: ManagerRegistry) {\n super(registry);\n this.container = container;\n\n this.rightKeyPanel = new BimRightKey({\n zIndex: 9000,\n container: this.container,\n onContext: this.handleContextMenu\n });\n this.rightKeyPanel.init();\n }\n\n /** 销毁管理器 */\n public destroy(): void {\n this.rightKeyPanel.destroy();\n super.destroy();\n }\n\n /**\n * 注册上下文处理器\n * @param handler 处理器函数,返回菜单项配置\n */\n public registerHandler(handler: (e: MouseEvent) => MenuItemConfig[] | null): void {\n this.contextHandlers.push(handler);\n }\n\n /**\n * 显示菜单\n * @param x 横坐标\n * @param y 纵坐标\n * @param items 菜单项配置\n * @param groupOrder 分组顺序\n */\n public showMenu(x: number, y: number, items: MenuItemConfig[], groupOrder?: string[]): void {\n if (!items || items.length === 0) return;\n\n const menu = new BimMenu({ items, groupOrder });\n menu.init();\n\n this.rightKeyPanel.mount(menu);\n this.rightKeyPanel.show(x, y);\n }\n\n /** 隐藏菜单 */\n public hide(): void {\n this.rightKeyPanel.hide();\n }\n\n /** 处理右键点击事件 */\n private handleContextMenu = (e: MouseEvent): void => {\n let items: MenuItemConfig[] | null = null;\n for (const handler of this.contextHandlers) {\n const result = handler(e);\n if (result && result.length > 0) {\n if (!items) items = [];\n items = items.concat(result);\n }\n }\n\n if (items && items.length > 0) {\n this.showMenu(e.clientX, e.clientY, items);\n } else {\n this.hide();\n }\n };\n}\n","/**\n * 3D 引擎管理器\n * 负责管理 3D 渲染引擎的初始化、模型加载和测量功能\n */\nimport { Engine, type EngineOptions, type ModelLoadOptions, type EngineInfo } from '../components/engine';\nimport { BaseManager } from '../core/base-manager';\nimport { RightKeyManager } from './right-key-manager';\nimport type { MeasureMode, ClearHeightDirection, ClearHeightSelectType } from '../types/measure';\nimport type { MeasureUnit, MeasurePrecision } from '../components/measure-panel/types';\nimport type { SectionBoxRange } from '../components/section-box-panel/types';\nimport type { MenuItemConfig } from '../components/menu/item';\nimport { ManagerRegistry } from '../core/manager-registry';\n\n/**\n * 3D 引擎管理器\n * 封装底层 3D 引擎,提供模型加载、相机控制、测量等功能\n */\nexport class EngineManager extends BaseManager {\n /** 容器元素 */\n private container: HTMLElement;\n /** 引擎实例 */\n private engineInstance: Engine | null = null;\n /** 右键菜单管理器 */\n public rightKey: RightKeyManager | null = null;\n\n constructor(container: HTMLElement, registry: ManagerRegistry) {\n super(registry);\n this.container = container;\n }\n\n /**\n * 初始化 3D 引擎\n * @param options 引擎配置选项\n * @returns 是否初始化成功\n */\n public initialize(options?: Omit): boolean {\n if (this.engineInstance && this.engineInstance.isInitialized()) {\n console.warn('[EngineManager] 3D Engine already initialized. Destroying old instance...');\n this.engineInstance.destroy();\n this.engineInstance = null;\n }\n\n try {\n this.engineInstance = new Engine({\n container: this.container,\n ...options,\n }, this.registry);\n\n this.engineInstance.init();\n\n this.rightKey = new RightKeyManager(this.container, this.registry);\n\n this.rightKey.registerHandler((_e) => {\n const selected = this.getSelectedComponent();\n const items: MenuItemConfig[] = [];\n\n if (selected) {\n // 1. 构件详情\n items.push({\n id: 'componentDetail',\n label: 'menu.componentDetail',\n group: 'component',\n order: 1,\n divider: true,\n onClick: () => {\n const registry = this.registry;\n registry.componentDetail?.show();\n this.rightKey?.hide();\n }\n });\n\n // 2. 隐藏选中构件\n items.push({\n id: 'hideSelected',\n label: 'menu.hideSelected',\n group: 'component',\n order: 2,\n onClick: () => {\n const models = this.getHighlightModels();\n if (models) {\n this.hideModels(models);\n }\n this.rightKey?.hide();\n }\n });\n\n // 3. 半透明选中构件\n items.push({\n id: 'transparentSelected',\n label: 'menu.transparentSelected',\n group: 'component',\n order: 3,\n onClick: () => {\n const models = this.getHighlightModels();\n if (models) {\n this.translucentModels(models);\n }\n this.rightKey?.hide();\n }\n });\n\n // 4. 取消半透明\n items.push({\n id: 'cancelTranslucent',\n label: 'menu.cancelTranslucent',\n group: 'component',\n order: 4,\n onClick: () => {\n this.unTranslucentModel();\n this.rightKey?.hide();\n }\n });\n\n // 5. 隔离选中构件(带子菜单)\n items.push({\n id: 'isolateSelected',\n label: 'menu.isolateSelected',\n group: 'component',\n order: 5,\n divider: true,\n children: [\n {\n id: 'hideOthers',\n label: 'menu.hideOthers',\n onClick: () => {\n const models = this.getHighlightModels();\n if (models) {\n this.isolateModels(models);\n }\n this.rightKey?.hide();\n }\n },\n {\n id: 'transparentOthers',\n label: 'menu.transparentOthers',\n onClick: () => {\n const models = this.getHighlightModels();\n if (models) {\n this.translucentOtherModels(models);\n }\n this.rightKey?.hide();\n }\n }\n ]\n });\n\n // 6. 快速选择(带子菜单)\n items.push({\n id: 'quickSelect',\n label: 'menu.quickSelect',\n group: 'component',\n order: 6,\n children: [\n {\n id: 'selectSameType',\n label: 'menu.selectSameType',\n onClick: () => {\n const models = this.getHighlightModels();\n if (models) {\n this.batchSelectSameTypeModel(models);\n }\n this.rightKey?.hide();\n }\n },\n {\n id: 'selectSameLevel',\n label: 'menu.selectSameLevel',\n onClick: () => {\n const models = this.getHighlightModels();\n if (models) {\n this.batchSelectSameLevelModel(models);\n }\n this.rightKey?.hide();\n }\n },\n {\n id: 'selectSameLevelType',\n label: 'menu.selectSameLevelType',\n onClick: () => {\n const models = this.getHighlightModels();\n if (models) {\n this.batchSelectSameLevelTypeModel(models);\n }\n this.rightKey?.hide();\n }\n }\n ]\n });\n\n // 7. 剖切盒适应\n items.push({\n id: 'fitSectionBox',\n label: 'menu.fitSectionBox',\n group: 'component',\n order: 7,\n onClick: () => {\n this.fitSectionBoxToModel();\n this.rightKey?.hide();\n }\n });\n }\n\n // 8. 显示全部(始终显示)\n items.push({\n id: 'showAll',\n label: 'menu.showAll',\n group: 'component',\n order: 8,\n onClick: () => {\n this.showAllModels();\n this.emit('menu:show-all', {});\n this.rightKey?.hide();\n }\n });\n\n return items;\n });\n\n return this.engineInstance.isInitialized();\n } catch (error) {\n console.error('[EngineManager] Failed to initialize 3D engine:', error);\n this.engineInstance = null;\n return false;\n }\n }\n\n /**\n * 检查引擎是否已初始化\n * @returns 是否已初始化\n */\n public isInitialized(): boolean {\n return this.engineInstance !== null && this.engineInstance.isInitialized();\n }\n\n /**\n * 加载模型\n * @param urls 模型 URL 数组\n * @param options 加载选项\n */\n public loadModel(urls: string[], options?: ModelLoadOptions): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.loadModel(urls, options);\n }\n\n /**\n * 获取底层引擎实例\n * @returns 引擎实例\n */\n public getEngine(): any {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return null;\n }\n return this.engineInstance.getEngine();\n }\n\n /** 相机回到初始位置 */\n public CameraGoHome(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.CameraGoHome();\n }\n\n /** 暂停渲染 */\n public pauseRendering(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.pauseRendering();\n }\n\n /** 恢复渲染 */\n public resumeRendering(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.resumeRendering();\n }\n\n /**\n * 激活测量模式\n * @param mode 测量模式\n */\n public activateMeasure(mode: MeasureMode): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activateMeasure(mode);\n }\n\n /** 停用测量模式 */\n public deactivateMeasure(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.deactivateMeasure();\n }\n\n /**\n * 获取当前测量类型\n * @returns 当前测量模式\n */\n public getCurrentMeasureType(): MeasureMode | null {\n if (!this.engineInstance) {\n return null;\n }\n return this.engineInstance.getCurrentMeasureType();\n }\n\n public clearAllMeasures(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.clearAllMeasures();\n }\n\n public saveMeasureSetting(setting: { unit: MeasureUnit; precision: MeasurePrecision }): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.saveMeasureSetting(setting);\n }\n\n /**\n * 设置净高测量朝向\n * @param direction 0=朝下,1=朝上\n */\n public setClearHeightDirection(direction: ClearHeightDirection): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.setClearHeightDirection(direction);\n }\n\n /**\n * 设置净高测量选择对象类型\n * @param selectType 'point'=选择点,'element'=选择构件\n */\n public setClearHeightSelectType(selectType: ClearHeightSelectType): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.setClearHeightSelectType(selectType);\n }\n\n public activeSection(mode: 'x' | 'y' | 'z' | 'box' | 'face'): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activeSection(mode);\n }\n\n /**\n * 获取当前激活的剖切模式\n * @returns 当前剖切模式,未激活时返回 null\n */\n public getCurrentSectionMode(): 'x' | 'y' | 'z' | 'box' | 'face' | null {\n if (!this.engineInstance) {\n return null;\n }\n return this.engineInstance.getCurrentSectionMode();\n }\n\n /**\n * 停用所有剖切功能\n * @remarks 关闭剖切对话框时调用\n */\n public deactivateSection(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.deactivateSection();\n }\n\n /**\n * 设置剖切盒范围\n * @param range 各轴的剖切范围 (百分比 0-100)\n * @remarks 仅在 'box' 模式下有效\n */\n public setSectionBoxRange(range: SectionBoxRange): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.setSectionBoxRange(range);\n }\n\n /**\n * 隐藏剖切面(临时隐藏,可恢复)\n * @remarks 配合 recoverSection() 使用\n */\n public hideSection(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.hideSection();\n }\n\n /**\n * 恢复剖切面(从隐藏状态恢复)\n * @remarks 恢复被 hideSection() 隐藏的剖切面\n */\n public recoverSection(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.recoverSection();\n }\n\n public fitSectionBoxToModel(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.fitSectionBoxToModel();\n }\n\n /**\n * 剖切盒适应(缩放到场景整体包围盒)\n * @remarks 对接底层 clipping.scaleBox()\n */\n public scaleSectionBox(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.scaleSectionBox();\n }\n\n /**\n * 反向剖切\n * @remarks 对接底层 clipping.reverse()\n */\n public reverseSection(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.reverseSection();\n }\n\n /** 激活框选放大功能 */\n public activateZoomBox(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activateZoomBox();\n }\n\n // ==================== 漫游功能 ====================\n\n /** 激活第一人称漫游模式 */\n public activateFirstPersonMode(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activateFirstPersonMode();\n }\n\n /** 停用第一人称漫游模式 */\n public deactivateFirstPersonMode(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.deactivateFirstPersonMode();\n }\n\n public setWalkSpeed(speed: number): void {\n this.engineInstance?.setWalkSpeed(speed);\n }\n\n public setWalkGravity(enabled: boolean): void {\n this.engineInstance?.setWalkGravity(enabled);\n }\n\n public setWalkCollision(enabled: boolean): void {\n this.engineInstance?.setWalkCollision(enabled);\n }\n\n public toggleMiniMap(): void {\n this.engineInstance?.toggleMiniMap();\n }\n\n /**\n * 获取小地图显示状态\n * @returns true=显示,false=隐藏\n */\n public getMiniMapState(): boolean {\n return this.engineInstance?.getMiniMapState() ?? false;\n }\n\n public isFirstPersonModeActive(): boolean {\n return this.engineInstance?.isFirstPersonModeActive() ?? false;\n }\n\n // ==================== 结束:漫游功能 ====================\n\n // ==================== 构件选中 ====================\n\n /**\n * 获取当前选中的构件\n * @returns 选中构件的 URL 和 ID,未选中时返回 null\n */\n public getSelectedComponent(): { url: string; id: string } | null {\n return this.engineInstance?.getSelectedComponent() ?? null;\n }\n\n /**\n * 获取构件属性\n * @param url 模型 URL\n * @param id 构件 ID\n * @param callback 回调函数,接收属性数据\n */\n public getComponentProperties(\n url: string,\n id: string,\n callback: (data: any) => void\n ): void {\n this.engineInstance?.getComponentProperties(url, id, callback);\n }\n\n // ==================== 结束:构件选中 ====================\n\n // ==================== 模型树 ====================\n\n public getTypeTreeData(): any[] {\n return this.engineInstance?.getTypeTreeData() ?? [];\n }\n\n public getLevelTreeData(): any[] {\n return this.engineInstance?.getLevelTreeData() ?? [];\n }\n\n public getMajorTreeData(): any[] {\n return this.engineInstance?.getMajorTreeData() ?? [];\n }\n\n public getEngineInfo(): EngineInfo | null {\n return this.engineInstance?.getEngineInfo() ?? null;\n }\n // ==================== 结束:模型树 ====================\n\n // ==================== 路径漫游 ====================\n\n /**\n * 添加漫游点\n * 将当前相机位置添加为一个漫游点\n */\n public pathRoamingAddPoint(): void {\n this.engineInstance?.pathRoamingAddPoint();\n }\n\n /**\n * 删除指定索引的漫游点\n * @param index 要删除的漫游点索引\n */\n public pathRoamingRemovePoint(index: number): void {\n this.engineInstance?.pathRoamingRemovePoint(index);\n }\n\n /**\n * 清除所有漫游点\n */\n public pathRoamingClearPoints(): void {\n this.engineInstance?.pathRoamingClearPoints();\n }\n\n /**\n * 获取所有漫游点\n * @returns 漫游点数组\n */\n public pathRoamingGetPoints(): any[] {\n return this.engineInstance?.pathRoamingGetPoints() ?? [];\n }\n\n /**\n * 跳转到指定漫游点\n * @param index 目标漫游点索引\n */\n public pathRoamingJumpToPoint(index: number): void {\n this.engineInstance?.pathRoamingJumpToPoint(index);\n }\n\n /**\n * 播放漫游\n * @param options 播放选项,包含时长、循环、回调等配置\n */\n public pathRoamingPlay(options?: {\n duration?: number;\n loop?: boolean;\n onComplete?: () => void;\n onPointComplete?: (pointIndex: number) => void;\n }): void {\n this.engineInstance?.pathRoamingPlay(options);\n }\n\n /**\n * 停止漫游\n */\n public pathRoamingStop(): void {\n this.engineInstance?.pathRoamingStop();\n }\n\n // ==================== 结束:路径漫游 ====================\n\n // ==================== 构件操作 ====================\n\n /**\n * 获取当前高亮(选中)的模型\n * @returns 高亮模型对象,未选中时返回 null\n */\n public getHighlightModels(): any {\n return this.engineInstance?.getHighlightModels() ?? null;\n }\n\n /**\n * 高亮指定模型构件\n * \n * @param models - 要高亮的模型数组,格式: [{ url: string, ids: string[] }]\n * \n * @example\n * manager.highlightModel([\n * { url: 'https://xxx/models/xxx/', ids: [350518, 350520] }\n * ]);\n */\n public highlightModel(models: { url: string; ids: number[] }[]): void {\n this.engineInstance?.highlightModel(models);\n }\n\n public unhighlightAllModels(): void {\n this.engineInstance?.unhighlightAllModels();\n }\n\n public viewScaleToModel(models: { url: string; ids: number[] }[]): void {\n this.engineInstance?.viewScaleToModel(models);\n }\n\n public hideModels(models: { url: string; ids: number[] }[]): void {\n this.engineInstance?.hideModels(models);\n }\n\n public showModel(models: { url: string; ids: number[] }[]): void {\n this.engineInstance?.showModel(models);\n }\n\n /**\n * 半透明指定模型\n * @param models 要半透明的模型对象\n */\n public translucentModels(models: any): void {\n this.engineInstance?.translucentModels(models);\n }\n\n /**\n * 取消半透明\n */\n public unTranslucentModel(): void {\n this.engineInstance?.unTranslucentModel();\n }\n\n /**\n * 隔离指定模型(隐藏其他)\n * @param models 要隔离的模型对象\n */\n public isolateModels(models: any): void {\n this.engineInstance?.isolateModels(models);\n }\n\n /**\n * 半透明其他构件\n * @param models 基准模型对象\n */\n public translucentOtherModels(models: any): void {\n this.engineInstance?.translucentOtherModels(models);\n }\n\n /**\n * 显示所有模型\n */\n public showAllModels(): void {\n this.engineInstance?.showAllModels();\n }\n\n /**\n * 批量选择同类模型\n * @param models 基准模型对象\n */\n public batchSelectSameTypeModel(models: any): void {\n this.engineInstance?.batchSelectSameTypeModel(models);\n }\n\n /**\n * 批量选择同层模型\n * @param models 基准模型对象\n */\n public batchSelectSameLevelModel(models: any): void {\n this.engineInstance?.batchSelectSameLevelModel(models);\n }\n\n /**\n * 批量选择同层同类模型\n * @param models 基准模型对象\n */\n public batchSelectSameLevelTypeModel(models: any): void {\n this.engineInstance?.batchSelectSameLevelTypeModel(models);\n }\n\n // ==================== 结束:构件操作 ====================\n\n // ==================== 渲染模式 ====================\n\n /**\n * 获取当前渲染模式\n * @returns 'simple' | 'balance' | 'advanced'\n */\n public getRenderMode(): string {\n return this.engineInstance?.getRenderMode() ?? 'balance';\n }\n\n /**\n * 设置渲染模式\n * @param mode 'simple' | 'balance' | 'advanced'\n */\n public setRenderMode(mode: 'simple' | 'balance' | 'advanced'): void {\n this.engineInstance?.setRenderMode(mode);\n }\n\n // ==================== 结束:渲染模式 ====================\n\n /** 销毁引擎管理器 */\n public destroy(): void {\n if (this.engineInstance) {\n this.engineInstance.destroy();\n this.engineInstance = null;\n }\n if (this.rightKey) {\n this.rightKey.destroy();\n this.rightKey = null;\n }\n super.destroy();\n }\n}\n","import type { BimTreeNode } from './tree-node';\n\n/**\n * 节点勾选状态枚举\n */\nexport enum TreeNodeCheckState {\n Unchecked = 0,\n Checked = 1,\n Indeterminate = 2 // 半选\n}\n\n/**\n * 节点点击行为类型\n */\nexport type NodeClickAction = 'select' | 'expand';\n\n/**\n * 树节点配置接口\n */\nexport interface TreeNodeConfig {\n /** 唯一标识符 */\n id: string;\n\n /** 显示文本的翻译键 */\n label: string;\n\n /** 节点图标 (SVG string 或 URL) */\n icon?: string;\n\n /** 子节点列表 */\n children?: TreeNodeConfig[];\n\n /** 初始展开状态 (默认 false) */\n expanded?: boolean;\n\n /** 初始选中状态 (默认 false) */\n checked?: boolean;\n\n /** 是否禁用 (默认 false) */\n disabled?: boolean;\n\n /** 自定义业务数据 */\n data?: any;\n\n /** 是否是叶子节点 (用于异步加载场景,暂留接口) */\n isLeaf?: boolean;\n\n /** 点击整行的行为 (默认 'select') */\n clickAction?: NodeClickAction;\n}\n\n/**\n * 树组件配置选项\n */\nexport interface TreeOptions {\n /** 树的数据源 */\n data: TreeNodeConfig[];\n\n /** 是否显示复选框 (默认 true) */\n checkable?: boolean;\n\n /** \n * 父子节点选中状态是否关联 (默认 true)\n * true: 选中父选子,子全选自动选父\n * false: 独立选中\n */\n checkStrictly?: boolean;\n\n /** 默认展开所有节点 (默认 false) */\n defaultExpandAll?: boolean;\n\n /** 缩进宽度 (像素,默认 24) */\n indent?: number;\n\n /** 是否启用搜索功能 (默认 false) */\n enableSearch?: boolean;\n\n /** 搜索框占位符 */\n searchPlaceholder?: string;\n\n /** 节点勾选回调 */\n onNodeCheck?: (node: BimTreeNode) => void;\n\n /** 节点选择回调 */\n onNodeSelect?: (node: BimTreeNode) => void;\n\n /** 节点取消选择回调(再次点击已选中节点时触发) */\n onNodeDeselect?: (node: BimTreeNode) => void;\n\n /** 节点展开/折叠回调 */\n onNodeExpand?: (node: BimTreeNode) => void;\n\n /** \n * 选中时显示的自定义操作栏渲染函数 \n * 返回 HTML 字符串或 HTMLElement\n */\n renderActions?: (node: TreeNodeConfig) => HTMLElement | string;\n}","import { TreeNodeConfig, TreeNodeCheckState, TreeOptions } from './types';\n/**\n * 树节点类\n * 负责渲染单个节点、处理交互和递归\n */\nexport class BimTreeNode {\n public config: TreeNodeConfig;\n public element: HTMLElement;\n public children: BimTreeNode[] = [];\n public parent: BimTreeNode | null = null;\n public checkState: TreeNodeCheckState = TreeNodeCheckState.Unchecked;\n\n // UI Elements\n private contentEl!: HTMLElement;\n private switcherEl!: HTMLElement;\n private checkboxEl: HTMLElement | null = null;\n private titleEl!: HTMLElement;\n private actionsEl!: HTMLElement; // 操作栏容器\n private childrenContainer!: HTMLElement;\n // 外部回调\n private onExpandChange: (node: BimTreeNode) => void;\n private onCheckChange: (node: BimTreeNode) => void;\n private onNodeClick: (node: BimTreeNode) => void;\n private renderActions?: (node: TreeNodeConfig) => HTMLElement | string;\n \n constructor(\n config: TreeNodeConfig, \n options: TreeOptions,\n callbacks: {\n onExpand: (n: BimTreeNode) => void,\n onCheck: (n: BimTreeNode) => void,\n onClick: (n: BimTreeNode) => void\n }\n ) {\n this.config = config;\n this.onExpandChange = callbacks.onExpand;\n this.onCheckChange = callbacks.onCheck;\n this.onNodeClick = callbacks.onClick;\n this.renderActions = options.renderActions;\n \n // 初始化状态\n this.checkState = config.checked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked;\n \n this.element = this.createDom(options);\n }\n /**\n * 创建节点 DOM\n */\n private createDom(options: TreeOptions): HTMLElement {\n const nodeEl = document.createElement('div');\n nodeEl.className = 'bim-tree-node';\n if (this.config.disabled) nodeEl.classList.add('is-disabled');\n\n // 1. 内容行\n this.contentEl = document.createElement('div');\n this.contentEl.className = 'bim-tree-node-content';\n\n // 1.1 展开/折叠箭头\n this.switcherEl = document.createElement('span');\n this.switcherEl.className = 'bim-tree-switcher';\n // 默认右箭头 SVG\n this.switcherEl.innerHTML = ``;\n\n const hasChildren = this.config.children && this.config.children.length > 0;\n if (!hasChildren) {\n this.switcherEl.classList.add('is-hidden');\n } else if (this.config.expanded) {\n this.switcherEl.classList.add('is-expanded');\n }\n\n this.switcherEl.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleExpand();\n });\n\n this.contentEl.appendChild(this.switcherEl);\n\n // 1.2 复选框 (可选)\n if (options.checkable !== false) {\n this.checkboxEl = document.createElement('span');\n this.checkboxEl.className = 'bim-tree-checkbox';\n this.updateCheckboxUI();\n\n this.checkboxEl.addEventListener('click', (e) => {\n e.stopPropagation();\n if (this.config.disabled) return;\n this.toggleCheck();\n });\n this.contentEl.appendChild(this.checkboxEl);\n }\n\n // 1.3 图标 (可选)\n if (this.config.icon) {\n const iconEl = document.createElement('span');\n iconEl.className = 'bim-tree-icon';\n iconEl.innerHTML = this.config.icon.includes('`;\n this.contentEl.appendChild(iconEl);\n }\n\n // 1.4 文本\n this.titleEl = document.createElement('span');\n this.titleEl.className = 'bim-tree-title';\n this.updateLabel(); // 设置文本\n this.contentEl.appendChild(this.titleEl);\n\n // 1.5 操作栏 (Actions)\n this.actionsEl = document.createElement('div');\n this.actionsEl.className = 'bim-tree-node-actions';\n this.actionsEl.addEventListener('click', (e) => {\n e.stopPropagation(); // 防止点击操作栏触发选中/展开\n });\n this.contentEl.appendChild(this.actionsEl);\n\n // 绑定整行点击\n this.contentEl.addEventListener('click', (e) => {\n e.stopPropagation();\n if (this.config.disabled) return;\n\n const action = this.config.clickAction || 'select';\n\n if (action === 'expand') {\n this.toggleExpand();\n } else {\n this.onNodeClick(this);\n }\n });\n\n nodeEl.appendChild(this.contentEl);\n\n // 2. 子节点容器\n this.childrenContainer = document.createElement('div');\n this.childrenContainer.className = 'bim-tree-children';\n // 设置缩进\n const indent = options.indent || 24;\n this.childrenContainer.style.paddingLeft = `${indent}px`; // 每一级子器左移\n\n if (this.config.expanded && hasChildren) {\n this.childrenContainer.classList.add('is-visible');\n }\n nodeEl.appendChild(this.childrenContainer);\n\n return nodeEl;\n }\n\n /**\n * 设置高亮选中状态 (Select 模式下)\n */\n public setSelected(selected: boolean) {\n if (selected) {\n this.contentEl.classList.add('is-selected');\n // 渲染自定义操作栏\n if (this.renderActions) {\n const content = this.renderActions(this.config);\n this.actionsEl.innerHTML = '';\n if (typeof content === 'string') {\n this.actionsEl.innerHTML = content;\n } else if (content instanceof HTMLElement) {\n this.actionsEl.appendChild(content);\n }\n }\n } else {\n this.contentEl.classList.remove('is-selected');\n this.actionsEl.innerHTML = ''; // 清空内容\n }\n }\n\n /**\n * 更新显示文本 (国际化支持) -> 移除国际化,直接显示\n */\n public updateLabel() {\n if (this.titleEl) {\n this.titleEl.textContent = this.config.label;\n }\n }\n\n /**\n * 切换展开状态\n */\n public toggleExpand(force?: boolean) {\n if (!this.config.children || this.config.children.length === 0) return;\n\n const newState = force !== undefined ? force : !this.config.expanded;\n this.config.expanded = newState;\n\n if (newState) {\n this.switcherEl.classList.add('is-expanded');\n this.childrenContainer.classList.add('is-visible');\n } else {\n this.switcherEl.classList.remove('is-expanded');\n this.childrenContainer.classList.remove('is-visible');\n }\n\n // 触发回调\n if (force === undefined) { // 只有用户交互才触发回调,防止初始化时无限循环\n this.onExpandChange(this);\n }\n }\n\n /**\n * 切换选中状态 (用户点击)\n */\n public toggleCheck() {\n // 如果当前是半选,点击变全选;如果全选,点击未选;如果未选,点击变全选\n // 简化逻辑:只要不是 Checked,点击都变 Checked;如果是 Checked,变 Unchecked\n const newChecked = this.checkState !== TreeNodeCheckState.Checked;\n this.setChecked(newChecked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked, true);\n }\n\n public setChecked(state: TreeNodeCheckState, fireEvent: boolean = false, force: boolean = false) {\n if (!force && this.checkState === state) return;\n\n this.checkState = state;\n this.config.checked = (state === TreeNodeCheckState.Checked);\n\n this.updateCheckboxUI();\n\n if (fireEvent) {\n this.onCheckChange(this);\n }\n }\n\n /**\n * 更新复选框 UI 样式\n */\n public updateCheckboxUI() {\n if (!this.checkboxEl) return;\n\n this.checkboxEl.classList.remove('is-checked', 'is-indeterminate');\n\n if (this.checkState === TreeNodeCheckState.Checked) {\n this.checkboxEl.classList.add('is-checked');\n } else if (this.checkState === TreeNodeCheckState.Indeterminate) {\n this.checkboxEl.classList.add('is-indeterminate');\n }\n }\n\n /**\n * 添加子节点实例\n */\n public appendChild(childNode: BimTreeNode) {\n childNode.parent = this;\n this.children.push(childNode);\n this.childrenContainer.appendChild(childNode.element);\n\n // 如果之前是隐藏的箭头,现在有了子节点,需要显示出来\n if (this.children.length === 1) {\n this.switcherEl.classList.remove('is-hidden');\n }\n }\n\n /**\n * 销毁\n */\n public destroy() {\n this.children.forEach(c => c.destroy());\n this.children = [];\n this.element.remove();\n this.parent = null;\n }\n}\n","import { IBimComponent } from '../../types/component';\nimport { ThemeConfig } from '../../themes/types';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport { TreeOptions, TreeNodeConfig, TreeNodeCheckState } from './types';\nimport { BimTreeNode } from './tree-node';\nimport './index.css';\n\n// 定义辅助事件发射器接口 (由于 BimTree 通常作为 Manager 的一部分或独立使用)\n// 为了方便,这里我们假设它会被 TreeManager 管理,TreeManager 会处理事件发射\n// 但 BimTree 本身也需要一个方式通知 Manager。\n// 我们可以通过构造函数传入 event bus 适配器,或者直接使用 CustomEvent。\n// 更好的方式:BimTree 提供 onEvent 回调。\n\nexport class BimTree implements IBimComponent {\n public element: HTMLElement;\n private contentElement: HTMLElement; // 树内容容器\n private searchInput: HTMLInputElement | null = null;\n private searchResults: HTMLElement | null = null;\n\n private options: TreeOptions;\n private nodeMap: Map = new Map();\n private rootNodes: BimTreeNode[] = [];\n private selectedNode: BimTreeNode | null = null; // 当前选中的高亮节点\n private lastRevealedNodeId: string | null = null;\n\n // 订阅清理函数\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n private clickOutsideHandler: ((e: MouseEvent) => void) | null = null;\n\n // 事件回调 (由 Manager 注入)\n public onNodeCheck?: (node: BimTreeNode) => void;\n public onNodeSelect?: (node: BimTreeNode) => void;\n public onNodeDeselect?: (node: BimTreeNode) => void;\n public onNodeExpand?: (node: BimTreeNode) => void;\n\n constructor(options: TreeOptions) {\n this.options = {\n checkable: true,\n checkStrictly: true,\n indent: 24,\n defaultExpandAll: true,\n enableSearch: false,\n searchPlaceholder: 'tree.searchPlaceholder',\n ...options\n };\n \n // 主容器\n this.element = document.createElement('div');\n this.element.className = 'bim-tree';\n\n // 搜索区域\n if (this.options.enableSearch) {\n this.createSearchDOM();\n }\n\n // 内容容器\n this.contentElement = document.createElement('div');\n this.contentElement.className = 'bim-tree-content';\n this.element.appendChild(this.contentElement);\n\n // 初始化回调\n if (options.onNodeCheck) this.onNodeCheck = options.onNodeCheck;\n if (options.onNodeSelect) this.onNodeSelect = options.onNodeSelect;\n if (options.onNodeDeselect) this.onNodeDeselect = options.onNodeDeselect;\n if (options.onNodeExpand) this.onNodeExpand = options.onNodeExpand;\n }\n\n private createSearchDOM() {\n const searchContainer = document.createElement('div');\n searchContainer.className = 'bim-tree-search';\n\n const wrapper = document.createElement('div');\n wrapper.className = 'bim-tree-search-wrapper';\n\n // 图标\n const icon = document.createElement('span');\n icon.className = 'bim-tree-search-icon';\n icon.innerHTML = ``;\n wrapper.appendChild(icon);\n\n this.searchInput = document.createElement('input');\n this.searchInput.className = 'bim-tree-search-input';\n this.searchInput.type = 'text';\n this.searchInput.placeholder = t(this.options.searchPlaceholder || '搜索...');\n\n // 绑定输入事件\n this.searchInput.addEventListener('input', (e) => {\n const query = (e.target as HTMLInputElement).value;\n this.handleSearch(query);\n });\n\n wrapper.appendChild(this.searchInput);\n searchContainer.appendChild(wrapper);\n\n // 搜索结果容器\n this.searchResults = document.createElement('div');\n this.searchResults.className = 'bim-tree-search-results';\n\n searchContainer.appendChild(this.searchResults);\n this.element.appendChild(searchContainer);\n\n // 点击外部关闭搜索结果\n this.clickOutsideHandler = (e: MouseEvent) => {\n if (this.searchResults &&\n !this.searchResults.contains(e.target as Node) &&\n !this.searchInput?.contains(e.target as Node)) {\n this.searchResults.classList.remove('is-visible');\n }\n };\n document.addEventListener('click', this.clickOutsideHandler);\n }\n\n public init(): void {\n this.render();\n\n // 订阅系统事件\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n // 初始化主题\n this.setTheme(themeManager.getTheme());\n }\n\n /**\n * 处理搜索逻辑\n */\n private handleSearch(query: string) {\n if (!this.searchResults) return;\n\n if (!query.trim()) {\n this.searchResults.classList.remove('is-visible');\n this.searchResults.innerHTML = '';\n return;\n }\n\n const results: { node: BimTreeNode, label: string, path: string }[] = [];\n const lowerQuery = query.toLowerCase();\n\n this.nodeMap.forEach(node => {\n // 直接使用 config.label,不进行翻译\n const label = node.config.label;\n if (label.toLowerCase().includes(lowerQuery)) {\n results.push({\n node,\n label,\n path: this.getNodePath(node)\n });\n }\n });\n\n this.renderSearchResults(results);\n }\n\n /**\n * 获取节点路径(面包屑)\n */\n private getNodePath(node: BimTreeNode): string {\n const path: string[] = [];\n let current: BimTreeNode | null = node.parent; // 从父级开始\n while (current) {\n // 直接使用 label\n path.unshift(current.config.label);\n current = current.parent;\n }\n return path.join(' > ');\n }\n\n /**\n * 渲染搜索结果列表\n */\n private renderSearchResults(results: { node: BimTreeNode, label: string, path: string }[]) {\n if (!this.searchResults) return;\n\n this.searchResults.innerHTML = '';\n if (results.length === 0) {\n const noData = document.createElement('div');\n noData.className = 'bim-tree-search-item';\n noData.style.cursor = 'default';\n noData.style.color = '#999';\n noData.textContent = 'No results';\n this.searchResults.appendChild(noData);\n } else {\n results.forEach(res => {\n const item = document.createElement('div');\n item.className = 'bim-tree-search-item';\n\n const title = document.createElement('span');\n title.className = 'bim-tree-search-item-title';\n title.textContent = res.label;\n\n const path = document.createElement('span');\n path.className = 'bim-tree-search-item-path';\n path.textContent = res.path;\n\n item.appendChild(title);\n if (res.path) item.appendChild(path);\n\n item.addEventListener('click', () => {\n this.revealNode(res.node);\n });\n\n this.searchResults!.appendChild(item);\n });\n }\n this.searchResults.classList.add('is-visible');\n }\n\n /**\n * 定位到指定节点\n */\n public revealNode(node: BimTreeNode) {\n if (this.lastRevealedNodeId === node.config.id && this.isNodeFullyVisible(node)) {\n return;\n }\n this.lastRevealedNodeId = node.config.id;\n\n // 1. 关闭搜索下拉\n if (this.searchResults) {\n this.searchResults.classList.remove('is-visible');\n if (this.searchInput) this.searchInput.value = ''; // 可选:清空搜索框\n }\n\n // 2. 递归展开父节点\n let current = node.parent;\n while (current) {\n current.toggleExpand(true); // 强制展开\n current = current.parent;\n }\n\n // 3. 选中节点 (Select)\n this.handleNodeSelect(node);\n\n // 4. 滚动到可视区域\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.scrollNodeIntoContentCenter(node);\n });\n });\n }\n\n private isNodeFullyVisible(node: BimTreeNode): boolean {\n const container = this.contentElement;\n if (!container || !node?.element?.isConnected) return false;\n\n const containerRect = container.getBoundingClientRect();\n const nodeRect = node.element.getBoundingClientRect();\n return nodeRect.top >= containerRect.top && nodeRect.bottom <= containerRect.bottom;\n }\n\n private scrollNodeIntoContentCenter(node: BimTreeNode): void {\n const container = this.contentElement;\n if (!container || !node?.element?.isConnected) return;\n\n const containerRect = container.getBoundingClientRect();\n const nodeRect = node.element.getBoundingClientRect();\n if (nodeRect.top >= containerRect.top && nodeRect.bottom <= containerRect.bottom) {\n return;\n }\n\n const nodeTopInContainer = nodeRect.top - containerRect.top + container.scrollTop;\n const targetTop = Math.max(0, nodeTopInContainer - (container.clientHeight - nodeRect.height) / 2);\n\n container.scrollTo({\n top: targetTop,\n behavior: 'auto'\n });\n }\n\n /**\n * 设置主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-primary', theme.primary);\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-secondary', theme.textSecondary);\n style.setProperty('--bim-text-tertiary', theme.textTertiary);\n style.setProperty('--bim-text-disabled', theme.textDisabled);\n style.setProperty('--bim-text-inverse', theme.textInverse);\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-border-disabled', theme.borderDisabled);\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover);\n style.setProperty('--bim-component-bg-selected', theme.componentBgSelected);\n style.setProperty('--bim-component-bg-disabled', theme.componentBgDisabled);\n style.setProperty('--bim-shadow-md', theme.shadowMd);\n style.setProperty('--bim-focus-ring', theme.focusRing);\n }\n\n /**\n * 响应语言变更\n */\n public setLocales(): void {\n this.nodeMap.forEach(node => node.updateLabel());\n if (this.searchInput) {\n this.searchInput.placeholder = t(this.options.searchPlaceholder || 'tree.searchPlaceholder');\n }\n }\n\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n if (this.clickOutsideHandler) {\n document.removeEventListener('click', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n this.rootNodes.forEach(node => node.destroy());\n this.rootNodes = [];\n this.nodeMap.clear();\n this.lastRevealedNodeId = null;\n this.element.remove();\n this.selectedNode = null;\n }\n\n /**\n * 核心渲染逻辑\n */\n private render(): void {\n this.contentElement.innerHTML = ''; // 清空内容区,而不是整个 element\n this.nodeMap.clear();\n this.rootNodes = [];\n\n this.options.data.forEach(config => {\n this.createNodeRecursively(config, null);\n });\n\n // 移除旧的 expandAll 调用,因为 expanded 状态已在 createNodeRecursively 中处理\n }\n\n /**\n * 递归创建节点\n */\n private createNodeRecursively(config: TreeNodeConfig, parent: BimTreeNode | null) {\n // 处理展开状态优先级: config.expanded > defaultExpandAll\n if (config.expanded === undefined) {\n config.expanded = this.options.defaultExpandAll;\n }\n\n const node = new BimTreeNode(config, this.options, {\n onExpand: (n) => { if (this.onNodeExpand) this.onNodeExpand(n); },\n onCheck: (n) => this.handleNodeCheck(n),\n onClick: (n) => this.handleNodeSelect(n)\n });\n\n this.nodeMap.set(config.id, node);\n\n if (parent) {\n parent.appendChild(node);\n } else {\n this.rootNodes.push(node);\n this.contentElement.appendChild(node.element); // 挂载到 contentElement\n }\n\n if (config.children && config.children.length > 0) {\n config.children.forEach(childConfig => {\n this.createNodeRecursively(childConfig, node);\n });\n }\n\n // 如果是初始化渲染,需要处理 checkStrictly 的向上联动(因为数据里可能只给了子节点 checked,父节点没给)\n // 这里做一个简单的后处理:如果 checkStrictly 开启,且当前节点 checked,则触发一次联动\n // 注意:这可能会导致性能问题,���化做法是在所有节点创建完后统一计算一次状态\n }\n\n /**\n * 处理节点选择 (高亮)\n * 点击已选中节点时切换为取消选中\n */\n private handleNodeSelect(node: BimTreeNode) {\n // 再次点击已选中的节点 → 取消选中\n if (this.selectedNode === node) {\n node.setSelected(false);\n this.selectedNode = null;\n if (this.onNodeDeselect) this.onNodeDeselect(node);\n return;\n }\n\n // 取消之前选中的节点\n if (this.selectedNode) {\n this.selectedNode.setSelected(false);\n }\n\n // 选中当前节点\n node.setSelected(true);\n this.selectedNode = node;\n\n if (this.onNodeSelect) this.onNodeSelect(node);\n }\n\n /**\n * 处理节点勾选逻辑 (核心算法)\n */\n private handleNodeCheck(node: BimTreeNode) {\n const isChecked = node.checkState === TreeNodeCheckState.Checked;\n\n // 1. 触发外部回调 (Event)\n if (this.onNodeCheck) this.onNodeCheck(node);\n\n // 2. 如果不联动,直接返回\n if (this.options.checkStrictly === false) return;\n\n // 3. 联动逻辑\n // 3.1 向下级联 (Cascade Down): 父变子全变\n const updateChildren = (n: BimTreeNode, state: TreeNodeCheckState) => {\n n.children.forEach(child => {\n if (child.config.disabled) return; // 跳过禁用节点\n child.setChecked(state, false); // 不再触发事件,只更新状态 UI\n updateChildren(child, state);\n });\n };\n\n // 当前节点是 Checked 或 Unchecked,子节点跟随\n if (isChecked) {\n updateChildren(node, TreeNodeCheckState.Checked);\n } else {\n updateChildren(node, TreeNodeCheckState.Unchecked);\n }\n\n // 3.2 向上冒泡 (Bubble Up): 子变父更新\n let current = node.parent;\n while (current) {\n if (current.config.disabled) {\n current = current.parent;\n continue;\n }\n\n const children = current.children;\n const allChecked = children.every(c => c.checkState === TreeNodeCheckState.Checked);\n const allUnchecked = children.every(c => c.checkState === TreeNodeCheckState.Unchecked);\n\n if (allChecked) {\n current.setChecked(TreeNodeCheckState.Checked, false);\n } else if (allUnchecked) {\n current.setChecked(TreeNodeCheckState.Unchecked, false);\n } else {\n current.setChecked(TreeNodeCheckState.Indeterminate, false);\n }\n\n current = current.parent;\n }\n }\n\n // ================== Public APIs ==================\n\n public getNode(id: string): BimTreeNode | undefined {\n return this.nodeMap.get(id);\n }\n\n public checkNode(id: string, checked: boolean) {\n const node = this.nodeMap.get(id);\n if (node) {\n node.setChecked(checked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked, true);\n // 手动调用联动处理,因为 setChecked 的 fireEvent 只触发回调,不包含内部逻辑调用?\n // 不,我们在 createNodeRecursively 里绑定的 onCheck 就是 handleNodeCheck\n // 所以只要 fireEvent=true,就会触发 handleNodeCheck,进而触发联动。\n }\n }\n\n public expandAll(expanded: boolean) {\n this.nodeMap.forEach(node => node.toggleExpand(expanded));\n }\n\n public checkAllNodes(checked: boolean): void {\n const state = checked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked;\n this.nodeMap.forEach(node => node.setChecked(state, false, true));\n }\n\n public getCheckedNodes(includeHalfChecked: boolean = false): TreeNodeConfig[] {\n const result: TreeNodeConfig[] = [];\n this.nodeMap.forEach(node => {\n if (node.checkState === TreeNodeCheckState.Checked) {\n result.push(node.config);\n } else if (includeHalfChecked && node.checkState === TreeNodeCheckState.Indeterminate) {\n result.push(node.config);\n }\n });\n return result;\n }\n}\n","import { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { ThemeConfig } from '../../themes/types';\nimport type { TabItem, TabOptions } from './index.type';\nimport './index.css';\n\n/**\n * 简单标签页组件(固定标签,不支持运行时增删)\n * - 仅处理标签头部与内容切换\n * - 主题从 ThemeManager 获取,不在配置中传入\n * - 文案通过 t() 翻译,支持传原文直接展示\n */\nexport class BimTab implements IBimComponent {\n /** 组件根节点 */\n public element: HTMLElement;\n /** 头部容器 */\n private navElement: HTMLElement;\n /** 内容容器 */\n private contentElement: HTMLElement;\n /** 业务配置 */\n private options: TabOptions;\n /** 当前激活的标签 id */\n private activeId: string | null;\n /** id -> TabItem */\n private tabMap: Map = new Map();\n /** id -> 内容容器 */\n private panelMap: Map = new Map();\n private panelTreeScrollTopMap: Map = new Map();\n /** 主题/语言订阅解除函数 */\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n /** 头部点击事件处理引用(便于销毁时解绑) */\n private navClickHandler: ((e: MouseEvent) => void) | null = null;\n\n constructor(options: TabOptions) {\n this.options = options;\n this.activeId = options.activeId || (options.tabs[0]?.id ?? null);\n\n // 预置 tabMap,方便后续查找\n options.tabs.forEach((tab) => this.tabMap.set(tab.id, tab));\n\n // 构建基础 DOM 结构\n this.element = document.createElement('div');\n this.element.className = 'bim-tab';\n\n this.navElement = document.createElement('div');\n this.navElement.className = 'bim-tab__nav';\n this.navElement.setAttribute('role', 'tablist');\n this.element.appendChild(this.navElement);\n\n this.contentElement = document.createElement('div');\n this.contentElement.className = 'bim-tab__content';\n this.element.appendChild(this.contentElement);\n\n // 挂载到容器\n this.options.container.appendChild(this.element);\n }\n\n /**\n * 初始化组件\n */\n public init(): void {\n this.renderNav();\n this.renderPanels();\n // 初始化文案与主题\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n\n // 订阅语言、主题变化\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n }\n\n /**\n * 渲染头部标签\n */\n private renderNav(): void {\n this.navElement.innerHTML = '';\n\n this.navClickHandler = (event: MouseEvent) => {\n const target = (event.target as HTMLElement).closest('.bim-tab__item');\n if (!target) return;\n const tabId = target.dataset.id;\n if (!tabId) return;\n const tab = this.tabMap.get(tabId);\n if (tab?.disabled) return;\n this.activateTab(tabId);\n };\n this.navElement.addEventListener('click', this.navClickHandler);\n\n this.options.tabs.forEach((tab) => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'bim-tab__item';\n btn.dataset.id = tab.id;\n btn.setAttribute('role', 'tab');\n btn.id = `tab-${tab.id}`;\n btn.setAttribute('aria-selected', `${tab.id === this.activeId}`);\n if (tab.disabled) {\n btn.disabled = true;\n btn.setAttribute('aria-disabled', 'true');\n btn.classList.add('is-disabled');\n }\n\n // 图标\n if (tab.icon) {\n const iconEl = document.createElement('span');\n iconEl.className = 'bim-tab__icon';\n iconEl.innerHTML = tab.icon;\n btn.appendChild(iconEl);\n }\n\n const titleEl = document.createElement('span');\n titleEl.className = 'bim-tab__title';\n titleEl.textContent = this.resolveTitle(tab.title);\n btn.appendChild(titleEl);\n\n if (tab.id === this.activeId) {\n btn.classList.add('is-active');\n }\n\n this.navElement.appendChild(btn);\n });\n }\n\n /**\n * 渲染内容面板\n */\n private renderPanels(): void {\n this.contentElement.innerHTML = '';\n this.panelMap.clear();\n\n this.options.tabs.forEach((tab) => {\n const panel = document.createElement('div');\n panel.className = 'bim-tab__panel';\n panel.dataset.id = tab.id;\n panel.setAttribute('role', 'tabpanel');\n panel.setAttribute('aria-labelledby', `tab-${tab.id}`);\n\n if (tab.content instanceof HTMLElement) {\n panel.appendChild(tab.content);\n } else if (typeof tab.content === 'string') {\n panel.innerHTML = tab.content;\n }\n\n if (tab.id === this.activeId) {\n panel.classList.add('is-active');\n } else {\n panel.style.display = 'none';\n }\n\n this.panelMap.set(tab.id, panel);\n this.contentElement.appendChild(panel);\n });\n }\n\n /**\n * 激活指定标签\n * @param tabId 目标标签 id\n */\n public activateTab(tabId: string): void {\n if (this.activeId === tabId) return;\n const targetTab = this.tabMap.get(tabId);\n if (!targetTab || targetTab.disabled) return;\n\n this.activeId = tabId;\n // 更新头部状态\n const buttons = this.navElement.querySelectorAll('.bim-tab__item');\n buttons.forEach((btn) => {\n const isActive = btn.dataset.id === tabId;\n btn.classList.toggle('is-active', isActive);\n btn.setAttribute('aria-selected', `${isActive}`);\n });\n\n // 更新面板显示\n this.panelMap.forEach((panel, id) => {\n const isActive = id === tabId;\n if (!isActive) {\n this.savePanelTreeScrollTop(id, panel);\n }\n panel.classList.toggle('is-active', isActive);\n panel.style.display = isActive ? '' : 'none';\n if (isActive) {\n this.restorePanelTreeScrollTop(id, panel);\n }\n });\n\n if (this.options.onChange) {\n this.options.onChange(tabId, targetTab);\n }\n }\n\n /**\n * 应用主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-tab-bg', theme.bgElevated);\n style.setProperty('--bim-tab-nav-bg', theme.bgElevated);\n style.setProperty('--bim-tab-text', theme.textPrimary);\n style.setProperty('--bim-tab-text-secondary', theme.textSecondary);\n style.setProperty('--bim-tab-text-active', theme.primary);\n style.setProperty('--bim-tab-border', theme.borderDefault);\n style.setProperty('--bim-tab-hover-bg', theme.componentBgHover);\n style.setProperty('--bim-tab-active-bg', theme.componentBgActive);\n style.setProperty('--bim-tab-icon', theme.iconDefault);\n }\n\n /**\n * 应用当前语言文案\n */\n public setLocales(): void {\n const buttons = this.navElement.querySelectorAll('.bim-tab__item');\n buttons.forEach((btn) => {\n const id = btn.dataset.id;\n if (!id) return;\n const tab = this.tabMap.get(id);\n if (!tab) return;\n const titleEl = btn.querySelector('.bim-tab__title');\n if (titleEl) {\n titleEl.textContent = this.resolveTitle(tab.title);\n }\n });\n }\n\n /**\n * 清理资源\n */\n public destroy(): void {\n if (this.navClickHandler) {\n this.navElement.removeEventListener('click', this.navClickHandler);\n this.navClickHandler = null;\n }\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.panelMap.clear();\n this.panelTreeScrollTopMap.clear();\n this.tabMap.clear();\n this.element.remove();\n }\n\n private savePanelTreeScrollTop(tabId: string, panel: HTMLElement): void {\n const treeContent = panel.querySelector('.bim-tree-content');\n if (!treeContent) return;\n this.panelTreeScrollTopMap.set(tabId, treeContent.scrollTop);\n }\n\n private restorePanelTreeScrollTop(tabId: string, panel: HTMLElement): void {\n const savedTop = this.panelTreeScrollTopMap.get(tabId);\n if (savedTop === undefined) return;\n const treeContent = panel.querySelector('.bim-tree-content');\n if (!treeContent) return;\n requestAnimationFrame(() => {\n treeContent.scrollTop = savedTop;\n });\n }\n\n /**\n * 工具:解析标题(优先翻译,不存在则回退原值)\n */\n private resolveTitle(title: string): string {\n try {\n const translated = t(title);\n return translated || title;\n } catch (err) {\n // 翻译失败时使用原值\n return title;\n }\n }\n}\n","/**\n * 图标管理器\n * 统一管理所有 SVG 图标\n */\n\n/**\n * 所有图标集合(静态变量)\n */\nconst ICONS: Record = {\n // ========== 来自 assets 的图标 (48x48) ==========\n 测量: '',\n 地图: '',\n 框选放大: '',\n 漫游: '',\n 目录树: '',\n 剖切: '',\n 剖切盒: '',\n 全屏: '',\n 设置: '',\n 拾曲面剖切: '',\n 轴向剖切: '',\n 主视角: '',\n 文档: '',\n 第一人称漫游: '',\n 反向: '',\n 路径漫游: '',\n 适应到模型: '',\n 隐藏: '',\n 重置: '',\n\n // ========== 测量相关图标 (32x32) ==========\n 标高: '',\n 距离: '',\n 最小距离: '',\n 激光边距: '',\n 角度: '',\n 坡度: '',\n 体积: '',\n 空间体积: '',\n\n // ========== 通用图标 (24x24) ==========\n close: '',\n check: '',\n warning: '',\n error: '',\n success: '',\n plus: '',\n minus: '',\n arrowUp: '',\n arrowUpBold: '',\n arrowDown: '',\n arrowLeft: '',\n arrowRight: '',\n search: '',\n refresh: '',\n delete: '',\n edit: '',\n save: '',\n expand: '',\n collapse: '',\n\n bot: '',\n history: '',\n settings: '',\n loader: '',\n send: '',\n\n // ========== 默认图标 ==========\n default: '',\n};\n\n/**\n * 获取图标\n * @param name 图标名称\n * @returns SVG 字符串,如果找不到返回默认图标\n */\nexport function getIcon(name: string): string {\n const icon = ICONS[name];\n\n if (!icon) {\n console.warn(`[IconManager] Icon \"${name}\" not found, using default icon`);\n return ICONS.default;\n }\n\n return icon;\n}\n","/**\n * @file construct-tree-manager-btn.ts\n * @description 构件树管理器 - 负责管理构件树按钮和对话框\n * \n * 功能概述:\n * 1. 在界面左上角显示构件树按钮\n * 2. 点击按钮打开构件树对话框,包含三个选项卡:楼层树、类型树、专业树\n * 3. 点击树节点时,如果节点有 ids,则高亮对应的 3D 模型构件\n * \n * 数据流:\n * 1. 从 3D 引擎获取原始树数据 (getLevelTreeData/getTypeTreeData/getMajorTreeData)\n * 2. 通过 transformTreeData 转换为 SDK 标准的 TreeNodeConfig 格式\n * 3. 创建 BimTree 组件渲染树结构\n * 4. 用户点击节点时,通过 onNodeSelect 回调触发模型高亮\n */\n\nimport type { ButtonGroupColors, ButtonConfig } from '../components/button-group/index.type';\nimport { BaseManager } from '../core/base-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { BimButtonGroup } from '../components/button-group';\nimport { BimTree } from '../components/tree';\nimport { TreeNodeConfig, TreeNodeCheckState } from '../components/tree/types';\nimport type { BimTreeNode } from '../components/tree/tree-node';\nimport { BimDialog } from '../components/dialog';\nimport { BimTab } from '../components/tab';\nimport { getIcon } from '../utils/icon-manager';\n\n// ============================================================================\n// 类型定义\n// ============================================================================\n\n/**\n * 3D 引擎返回的原始树节点数据结构\n * \n * @example\n * {\n * name: \"标高 1\",\n * id: null,\n * ids: [\"350518\", \"350520\", ...], // 构件 ID 数组,用于高亮模型\n * children: [...],\n * isLeaf: false\n * }\n */\ninterface EngineTreeNode {\n /** 节点显示名称 */\n name?: string;\n /** 节点 ID(可能为 null) */\n id?: string | null;\n /** 构件 ID 数组 - 用于调用 highlightModel 高亮模型 */\n ids?: string[] | null;\n /** 子节点列表 */\n children?: EngineTreeNode[] | null;\n /** 是否为叶子节点 */\n isLeaf?: boolean;\n}\n\n/**\n * 3D 引擎返回的原始模型数据结构(最外层)\n * \n * @example\n * {\n * name: \"栈桥模型\",\n * url: \"https://xxx.com/models/xxx/\", // 模型 URL,用于 highlightModel\n * children: [...]\n * }\n */\ninterface EngineModelData {\n /** 模型显示名称 */\n name?: string;\n /** 模型资源 URL - 调用 highlightModel 时需要此参数 */\n url: string;\n /** 子节点列表 */\n children?: EngineTreeNode[] | null;\n}\n\n/**\n * 扩展的节点数据,包含模型 URL\n * 转换后存储在 TreeNodeConfig.data 中\n */\ninterface TransformedNodeData extends EngineTreeNode {\n /** 模型 URL - 从最外层 model.url 传递下来 */\n _modelUrl: string;\n}\n\ninterface ModelParam {\n url: string;\n ids: number[];\n}\n\n// ============================================================================\n// 工具函数\n// ============================================================================\n\n/**\n * 使用 SHA-256 算法对 ids 数组生成唯一哈希值\n * \n * 为什么需要 hash:\n * - 原始数据中 node.id 可能为 null\n * - ids 数组可能很长(几百个元素),不适合直接作为 ID\n * - 需要一个稳定且唯一的标识符用于树组件的 nodeMap\n * \n * @param ids - 构件 ID 数组\n * @returns 64 位十六进制哈希字符串\n * \n * @example\n * hashIds([\"350518\", \"350520\"]) // => \"a1b2c3d4e5f6...\"\n */\nfunction fnv1a32(input: string, seed: number): number {\n let h = seed >>> 0;\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h ^= c & 0xff;\n h = Math.imul(h, 0x01000193);\n h ^= (c >>> 8) & 0xff;\n h = Math.imul(h, 0x01000193);\n }\n return h >>> 0;\n}\n\nasync function hashIds(ids: string[]): Promise {\n const str = JSON.stringify(ids);\n const h1 = fnv1a32(str, 0x811c9dc5);\n const h2 = fnv1a32(str, 0x811c9dc5 ^ 0x9e3779b9);\n return `${h1.toString(16).padStart(8, '0')}${h2.toString(16).padStart(8, '0')}`;\n}\n\n/**\n * 递归收集节点及其所有子孙节点的 ids\n * 用于父级节点操作时,获取其下所有叶子节点对应的构件 ids\n */\nfunction collectModelParams(node: BimTreeNode): ModelParam[] {\n const grouped = new Map>();\n\n const collect = (current: BimTreeNode): void => {\n const data = current.config.data as TransformedNodeData | undefined;\n const modelUrl = data?._modelUrl;\n if (modelUrl && data?.ids?.length) {\n let idSet = grouped.get(modelUrl);\n if (!idSet) {\n idSet = new Set();\n grouped.set(modelUrl, idSet);\n }\n for (const rawId of data.ids) {\n const id = Number(rawId);\n if (Number.isFinite(id)) {\n idSet.add(id);\n }\n }\n }\n\n for (const child of current.children || []) {\n collect(child);\n }\n };\n\n collect(node);\n\n const result: ModelParam[] = [];\n for (const [url, idSet] of grouped) {\n if (idSet.size > 0) {\n result.push({ url, ids: Array.from(idSet) });\n }\n }\n return result;\n}\n\n/**\n * 将 3D 引擎返回的原始树数据转换为 SDK 标准的 TreeNodeConfig 格式\n * \n * 转换过程:\n * 1. 遍历最外层的模型数组,提取每个模型的 url\n * 2. 递归转换每个节点,将 url 注入到所有子节点的 data 中\n * 3. 如果节点有 ids 数组,使用 SHA-256 生成唯一 ID\n * \n * 点击行为:\n * - 点击节点内容:触发 onNodeSelect(高亮+跳转)\n * - 点击箭头:展开/折叠子节点\n * \n * 数据结构转换示意:\n * \n * 输入:[{ name, url, children: [{ name, ids, children }] }]\n * 输出:[{ id, label, data: { ids, _modelUrl }, children }]\n * \n * @param apiData - 3D 引擎返回的原始树数据\n * @returns 转换后的 TreeNodeConfig 数组\n */\nlet nodeIdCounter = 0;\n\nasync function transformTreeData(apiData: EngineModelData[]): Promise {\n if (!apiData || apiData.length === 0) return [];\n\n /**\n * 递归转换单个节点\n * @param node - 原始节点数据\n * @param modelUrl - 从最外层传递的模型 URL\n */\n const transformNode = async (node: EngineTreeNode, modelUrl: string): Promise => {\n const hasChildren = node.children && node.children.length > 0;\n \n // 生成节点 ID:优先使用 ids 哈希,其次使用原始 id,最后生成唯一 ID\n let id: string;\n if (node.ids?.length) {\n id = await hashIds(node.ids);\n } else if (node.id) {\n id = node.id;\n } else {\n id = `node_${++nodeIdCounter}`;\n }\n \n return {\n id,\n label: node.name || '未命名',\n expanded: false,\n checked: true,\n children: hasChildren\n ? await Promise.all(node.children!.map(child => transformNode(child, modelUrl)))\n : undefined,\n data: {\n ...node,\n _modelUrl: modelUrl\n } as TransformedNodeData\n };\n };\n\n // 遍历最外层模型数组\n return Promise.all(apiData.map(async (model) => {\n const hasChildren = model.children && model.children.length > 0;\n // ⭐ 提取模型 URL,将传递给所有子节点\n const modelUrl = model.url;\n \n return {\n id: modelUrl,\n label: model.name || '模型',\n expanded: true,\n checked: true,\n children: hasChildren\n ? await Promise.all(model.children!.map(child => transformNode(child, modelUrl)))\n : undefined,\n data: {\n _modelUrl: modelUrl\n } as TransformedNodeData\n };\n }));\n}\n\n// ============================================================================\n// 管理器类\n// ============================================================================\n\n/**\n * 构件树管理器\n * \n * 职责:\n * 1. 管理构件树按钮的生命周期(创建、显示/隐藏、销毁)\n * 2. 管理构件树对话框(打开、关闭、内容渲染)\n * 3. 处理树节点点击事件,调用 3D 引擎高亮模型\n * \n * 使用示例:\n * ```typescript\n * const manager = new ConstructTreeManagerBtn(container);\n * manager.openConstructTreeDialog(); // 打开构件树对话框\n * ```\n */\nexport class ConstructTreeManagerBtn extends BaseManager {\n /** 按钮组实例 - 用于渲染构件树按钮 */\n private toolbar: BimButtonGroup | null = null;\n /** 按钮容器元素 */\n private toolbarContainer: HTMLElement | null = null;\n /** 主容器元素 - 按钮挂载的父容器 */\n private container: HTMLElement;\n /** 构件树对话框实例 */\n private dialog: BimDialog | null = null;\n\n /**\n * 创建构件树管理器\n * @param container - 按钮挂载的容器元素\n */\n constructor(container: HTMLElement, registry: ManagerRegistry) {\n super(registry);\n this.container = container;\n this.init();\n }\n\n /**\n * 初始化按钮\n * 创建按钮容器和按钮组,添加构件树按钮\n */\n private init() {\n // 创建按钮容器\n this.toolbarContainer = document.createElement('div');\n this.toolbarContainer.id = 'bim-construct-tree';\n this.container.appendChild(this.toolbarContainer);\n \n // 创建按钮组\n this.toolbar = new BimButtonGroup({\n container: this.toolbarContainer,\n showLabel: false,\n direction: 'column',\n position: 'top-left',\n align: 'vertical',\n expand: 'up',\n registry: this.registry\n });\n this.toolbar.init();\n this.toolbar.addGroup('construct-tree');\n \n // 添加构件树按钮\n this.toolbar.addButton({\n id: 'construct-tree-btn',\n groupId: 'construct-tree',\n type: 'button',\n label: 'construct-tree',\n icon: getIcon('目录树'),\n onClick: () => {\n this.openConstructTreeDialog();\n }\n });\n this.toolbar.render();\n }\n\n /**\n * 打开构件树对话框\n * \n * 流程:\n * 1. 隐藏按钮组\n * 2. 从 3D 引擎获取三种树数据(楼层/类型/专业)\n * 3. 转换数据格式\n * 4. 创建三个 BimTree 实例\n * 5. 创建选项卡组件\n * 6. 创建对话框并显示\n */\n public async openConstructTreeDialog() {\n // 隐藏按钮组,避免遮挡对话框\n this.setVisible(false);\n\n // 从 3D 引擎获取原始树数据\n const levelTreeData = this.registry.engine3d?.getLevelTreeData() ?? [];\n const typeTreeData = this.registry.engine3d?.getTypeTreeData() ?? [];\n const majorTreeData = this.registry.engine3d?.getMajorTreeData() ?? [];\n\n // 调试日志:输出原始数据\n console.log('[ConstructTree] 原始数据 (Level):', levelTreeData);\n console.log('[ConstructTree] 原始数据 (Type):', typeTreeData);\n console.log('[ConstructTree] 原始数据 (Major):', majorTreeData);\n\n /**\n * 创建树组件\n * @param data - 原始树数据\n * @param label - 调试用标签\n */\n const createTree = async (data: any[], label: string) => {\n // 转换数据格式\n const transformedData = await transformTreeData(data);\n console.log(`[ConstructTree] 转换后数据 (${label}):`, transformedData);\n \n const tree = new BimTree({\n data: transformedData,\n checkable: true,\n indent: 0,\n enableSearch: true,\n checkStrictly: true,\n defaultExpandAll: true,\n \n /**\n * 节点勾选回调 - 显示/隐藏模型构件\n * 勾选 → showModel,取消勾选 → hideModels\n */\n onNodeCheck: (node) => {\n const modelParam = collectModelParams(node);\n if (!modelParam.length) return;\n \n if (node.checkState === TreeNodeCheckState.Checked) {\n this.registry.engine3d?.showModel(modelParam);\n } else {\n this.registry.engine3d?.hideModels(modelParam);\n }\n },\n \n /**\n * 节点选中回调 - 高亮并跳转到模型构件\n */\n onNodeSelect: (node) => {\n const modelParam = collectModelParams(node);\n if (!modelParam.length) return;\n \n this.registry.engine3d?.unhighlightAllModels();\n this.registry.engine3d?.highlightModel(modelParam);\n this.registry.engine3d?.viewScaleToModel(modelParam);\n },\n \n // 再次点击已选中节点时取消高亮\n onNodeDeselect: () => {\n this.registry.engine3d?.unhighlightAllModels();\n },\n \n onNodeExpand: () => {\n this.dialog?.fitWidth();\n },\n });\n tree.init();\n return tree;\n };\n\n // 创建三个树实例\n const componentTree = await createTree(levelTreeData, 'Level');\n const typeTree = await createTree(typeTreeData, 'Type');\n const majorTree = await createTree(majorTreeData, 'Major');\n\n // 创建选项卡面板容器\n const componentPanel = document.createElement('div');\n componentPanel.className = 'construct-tab__panel-content';\n componentPanel.appendChild(componentTree.element);\n\n const typePanel = document.createElement('div');\n typePanel.className = 'construct-tab__panel-content';\n typePanel.appendChild(typeTree.element);\n\n const majorPanel = document.createElement('div');\n majorPanel.className = 'construct-tab__panel-content';\n majorPanel.appendChild(majorTree.element);\n\n // 创建选项卡组件\n const tabMount = document.createElement('div');\n tabMount.className = 'construct-tab__container';\n tabMount.style.height = '100%';\n tabMount.style.overflow = 'hidden';\n \n /**\n * 重置所有树的勾选状态并显示所有模型\n * 在 Tab 切换和对话框初始化时调用\n */\n const resetAllTrees = () => {\n this.registry.engine3d?.showAllModels();\n componentTree.checkAllNodes(true);\n typeTree.checkAllNodes(true);\n majorTree.checkAllNodes(true);\n };\n\n const tab = new BimTab({\n container: tabMount,\n tabs: [\n { id: 'component', title: 'tab.component', content: componentPanel },\n { id: 'type', title: 'tab.type', content: typePanel },\n { id: 'major', title: 'tab.major', content: majorPanel },\n ],\n activeId: 'component',\n onChange: () => {\n this.dialog?.fitWidth();\n }\n });\n tab.init();\n\n // BimTab 初始化时不触发 onChange,需要手动调用\n resetAllTrees();\n\n // 监听右键菜单\"显示全部\"事件\n const unsubscribeShowAll = this.registry.on('menu:show-all', () => {\n resetAllTrees();\n });\n\n // 创建对话框\n this.dialog = this.registry.dialog!.create({\n title: 'constructTree.title',\n minWidth: 320,\n height: 600,\n content: tabMount,\n position: { x: 20, y: 20 },\n resizable: false,\n onClose: () => {\n unsubscribeShowAll();\n tab.destroy();\n componentTree.destroy();\n typeTree.destroy();\n majorTree.destroy();\n this.setVisible(true);\n }\n });\n this.dialog?.fitWidth();\n }\n\n /** 刷新渲染 */\n public refresh() {\n this.toolbar?.render();\n }\n\n /** 销毁管理器 */\n public destroy() {\n this.toolbar?.destroy();\n this.toolbar = null;\n super.destroy();\n }\n\n /**\n * 添加按钮组\n * @param groupId - 组 ID\n * @param beforeGroupId - 插入位置\n */\n public addGroup(groupId: string, beforeGroupId?: string) {\n this.toolbar?.addGroup(groupId, beforeGroupId);\n this.toolbar?.render();\n }\n\n /**\n * 添加按钮\n * @param config - 按钮配置\n */\n public addButton(config: ButtonConfig) {\n this.toolbar?.addButton(config);\n this.toolbar?.render();\n }\n\n /**\n * 设置按钮可见性\n * @param id - 按钮 ID\n * @param v - 是否可见\n */\n public setButtonVisibility(id: string, v: boolean) {\n this.toolbar?.updateButtonVisibility(id, v);\n }\n\n /**\n * 设置是否显示标签\n * @param show - 是否显示\n */\n public setShowLabel(show: boolean) {\n this.toolbar?.setShowLabel(show);\n }\n\n /**\n * 设置按钮组可见性\n * @param visible - 是否可见\n */\n public setVisible(visible: boolean) {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.visibility = visible ? 'visible' : 'hidden';\n }\n }\n\n /**\n * 设置背景颜色\n * @param color - 颜色值\n */\n public setBackgroundColor(color: string) {\n this.toolbar?.setBackgroundColor(color);\n }\n\n /**\n * 设置按钮组颜色\n * @param colors - 颜色配置\n */\n public setColors(colors: ButtonGroupColors) {\n this.toolbar?.setColors(colors);\n }\n}\n","/**\n * 对话框管理器基类\n * 提供对话框的通用生命周期管理\n */\nimport { BaseManager } from './base-manager';\nimport { ManagerRegistry } from './manager-registry';\nimport { BimDialog } from '../components/dialog';\n\n/** 对话框配置选项 */\nexport interface DialogManagerOptions {\n /** 是否可拖拽 */\n draggable?: boolean;\n /** 是否可调整大小 */\n resizable?: boolean;\n}\n\n/**\n * 对话框管理器抽象基类\n * 子类需要实现 dialogId、dialogTitle 和 createContent 方法\n */\nexport abstract class BaseDialogManager extends BaseManager {\n /** 对话框实例 */\n protected dialog: BimDialog | null = null;\n /** 对话框是否可见 */\n protected isVisible: boolean = false;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n /** 对话框唯一标识(子类必须实现) */\n protected abstract get dialogId(): string;\n /** 对话框标题,支持国际化 key(子类必须实现) */\n protected abstract get dialogTitle(): string;\n\n /** 对话框宽度,默认 300 */\n protected get dialogWidth(): number {\n return 300;\n }\n\n /** 对话框高度,默认 'auto' 自适应 */\n protected get dialogHeight(): number | 'auto' {\n return 'auto';\n }\n\n /** 对话框选项,默认可拖拽不可缩放 */\n protected get dialogOptions(): DialogManagerOptions {\n return { draggable: true, resizable: false };\n }\n\n /** 创建对话框内容(子类必须实现) */\n protected abstract createContent(): HTMLElement;\n\n /** 对话框关闭时的回调,子类可重写 */\n protected onDialogClose(): void {}\n /** 对话框创建后的回调,子类可重写 */\n protected onDialogCreated(): void {}\n /** 销毁前的回调,子类可重写 */\n protected onBeforeDestroy(): void {}\n\n /**\n * 获取对话框位置\n * 默认定位在容器右侧居中,子类可重写\n */\n protected getDialogPosition(): { x: number; y: number } {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const width = this.dialogWidth;\n const height = typeof this.dialogHeight === 'number' ? this.dialogHeight : 300;\n const paddingRight = 20;\n\n return {\n x: containerWidth - width - paddingRight,\n y: (containerHeight - height) / 2\n };\n }\n\n /** 显示对话框 */\n public show(): void {\n if (!this.registry.dialog || !this.registry.container) {\n console.warn(`[${this.dialogId}] Dialog manager or container is not initialized`);\n return;\n }\n\n if (this.dialog) {\n this.destroyDialog();\n }\n\n const position = this.getDialogPosition();\n const content = this.createContent();\n const options = this.dialogOptions;\n\n this.dialog = this.registry.dialog.create({\n id: this.dialogId,\n title: this.dialogTitle,\n content,\n width: this.dialogWidth,\n height: this.dialogHeight,\n position,\n draggable: options.draggable,\n resizable: options.resizable,\n onClose: () => {\n this.onDialogClose();\n this.destroyDialog();\n }\n });\n this.dialog.init();\n this.isVisible = true;\n this.onDialogCreated();\n }\n\n /** 隐藏对话框 */\n public hide(): void {\n this.destroyDialog();\n }\n\n /** 切换对话框显示状态 */\n public toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /** 获取对话框是否打开 */\n public isOpen(): boolean {\n return this.isVisible;\n }\n\n /** 销毁对话框 */\n protected destroyDialog(): void {\n this.onBeforeDestroy();\n if (this.dialog) {\n this.dialog.destroy();\n this.dialog = null;\n }\n this.isVisible = false;\n }\n\n /** 销毁管理器 */\n public destroy(): void {\n this.destroyDialog();\n super.destroy();\n }\n}\n","const ICONS = {\n clearHeight: ``,\n clearDistance: ``,\n distance: ``,\n elevation: ``,\n point: ``,\n angle: ``,\n area: ``,\n slope: ``,\n} as const;\n\nexport const MEASURE_TYPES = {\n distance: {\n key: 'distance',\n callBackType: 'distance',\n icon: ICONS.distance,\n order: 0,\n },\n clearHeight: {\n key: 'clearHeight',\n callBackType: 'clear-height',\n icon: ICONS.clearHeight,\n order: 1,\n },\n clearDistance: {\n key: 'clearDistance',\n callBackType: 'clear-distance',\n icon: ICONS.clearDistance,\n order: 2,\n },\n\n elevation: {\n key: 'elevation',\n callBackType: 'elevation',\n icon: ICONS.elevation,\n order: 3,\n },\n point: {\n key: 'point',\n callBackType: 'point',\n icon: ICONS.point,\n order: 4,\n },\n angle: {\n key: 'angle',\n callBackType: 'angle',\n icon: ICONS.angle,\n order: 5,\n },\n area: {\n key: 'area',\n callBackType: 'area',\n icon: ICONS.area,\n order: 6,\n },\n slope: {\n key: 'slope',\n callBackType: 'slope',\n icon: ICONS.slope,\n order: 7,\n },\n} as const;\n\nexport type MeasureMode = keyof typeof MEASURE_TYPES;\nexport type CallBackType = typeof MEASURE_TYPES[MeasureMode]['callBackType'];\nexport type MeasureTypeConfig = typeof MEASURE_TYPES[MeasureMode];\nexport type MeasureValueType = 'length' | 'area' | 'angle' | 'percent' | 'point';\n\n/** 净高测量朝向:0=朝下,1=朝上 */\nexport type ClearHeightDirection = 0 | 1;\n\n/** 净高测量选择对象类型 */\nexport type ClearHeightSelectType = 'point' | 'element';\n\nexport const MEASURE_MODES_ORDERED: MeasureMode[] = Object.values(MEASURE_TYPES)\n .sort((a, b) => a.order - b.order)\n .map((t) => t.key);\n\nexport function getValueType(key: MeasureMode): MeasureValueType {\n switch (key) {\n case 'clearHeight':\n case 'clearDistance':\n case 'distance':\n case 'elevation':\n return 'length';\n case 'area':\n return 'area';\n case 'angle':\n return 'angle';\n case 'slope':\n return 'percent';\n case 'point':\n default:\n return 'point';\n }\n}\n\nexport function getModeBycallBackType(callBackType: CallBackType): MeasureMode | undefined {\n return (Object.values(MEASURE_TYPES) as MeasureTypeConfig[]).find(t => t.callBackType === callBackType)?.key;\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { MeasureConfig, MeasurePanelOptions, MeasurePrecision, MeasureResult, MeasureUnit, ClearHeightDirection, ClearHeightSelectType } from './types';\nimport { MEASURE_TYPES, MEASURE_MODES_ORDERED, getValueType, type MeasureMode, type MeasureValueType } from '../../types/measure';\n\n/**\n * 测量面板组件(只做 UI,不实现真实测量)\n *\n * 组件职责:\n * - 展示 8 种测量方式按钮(默认 4 个,可展开/收起)\n * - 维护当前选中的测量方式(current mode)\n * - 展示测量结果(由外部 setResult 注入)\n * - 提供 “删除全部 / 设置” 的 UI 与对外方法(暂不实现真实逻辑,仅回调/占位)\n *\n * 注意:\n * - 所有用户可见文本必须通过 t(key) 获取(国际化强制要求)\n * - 组件需要订阅主题/语言变更,并在 destroy 时清理订阅\n */\nexport class MeasurePanel implements IBimComponent {\n public element: HTMLElement;\n\n private options: MeasurePanelOptions;\n private activeMode: MeasureMode;\n private isExpanded: boolean;\n private result: MeasureResult | null = null;\n\n // 净高模式专属状态\n private clearHeightDirection: ClearHeightDirection = 0; // 默认朝下\n private clearHeightSelectType: ClearHeightSelectType = 'point'; // 默认选择点\n\n /**\n * 测量配置(单位/精度)\n * 说明:\n * - 你要求:创建 MeasurePanel 不传入单位和精度\n * - 默认值维护在组件内部\n * - 初始化时优先读取缓存(localStorage),否则使用默认值\n */\n private config: MeasureConfig;\n\n /** 设置面板的临时配置(用于“取消”回滚) */\n private draftConfig: MeasureConfig | null = null;\n\n /** 当前视图:主面板 / 设置面板 */\n private view: 'main' | 'settings' = 'main';\n\n /** 缓存 key(默认全局) */\n private static readonly CONFIG_CACHE_KEY = 'bim-engine:measure:config';\n\n /** 默认配置(由组件内部维护) */\n private static readonly DEFAULT_CONFIG: MeasureConfig = {\n unit: 'mm',\n precision: 2\n };\n\n // DOM 引用(便于局部更新,减少频繁 querySelector)\n private toolButtons: Map = new Map();\n private toggleBtn!: HTMLButtonElement;\n private toggleTextEl!: HTMLElement;\n private mainValueRowEl!: HTMLElement;\n private mainValueValueEl!: HTMLElement;\n private mainValueLabelEl!: HTMLElement;\n private mainNumberEl!: HTMLElement;\n private mainUnitEl!: HTMLElement;\n private xyzBoxEl!: HTMLElement;\n private xyzXEl!: HTMLElement;\n private xyzYEl!: HTMLElement;\n private xyzZEl!: HTMLElement;\n private clearBtn!: HTMLButtonElement;\n private settingsBtn!: HTMLButtonElement;\n\n // 净高模式选项 DOM\n private modeOptionsEl!: HTMLElement;\n private directionBtns: Map = new Map();\n private selectTypeBtns: Map = new Map();\n\n // Settings DOM\n private mainViewEl!: HTMLElement;\n private settingsViewEl!: HTMLElement;\n private unitSelectEl!: HTMLSelectElement;\n private precisionSelectEl!: HTMLSelectElement;\n private saveSettingsBtn!: HTMLButtonElement;\n private cancelSettingsBtn!: HTMLButtonElement;\n\n // 订阅清理\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n /**\n * 构造函数\n * @param options 组件配置\n */\n constructor(options: MeasurePanelOptions = {}) {\n this.options = options;\n this.activeMode = options.defaultMode ?? 'distance';\n this.isExpanded = options.defaultExpanded ?? false;\n\n // 读取配置:优先缓存,否则默认\n this.config = this.loadConfigFromCache() ?? { ...MeasurePanel.DEFAULT_CONFIG };\n\n this.element = this.createDom();\n }\n\n /**\n * 初始化组件(实现 IBimComponent)\n */\n public init(): void {\n // 订阅语言变更:更新所有文本/提示\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更:更新 CSS 变量(如需要)\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n\n // 初始渲染状态(按钮显隐、选中态、结果区)\n this.applyExpandedState();\n this.applyActiveModeState();\n this.applyClearHeightOptionsState();\n this.applyViewState();\n this.renderResult();\n\n // 触发初始测量模式的回调(让外部知道默认激活了哪个模式)\n if (this.options.onModeChange) {\n this.options.onModeChange(this.activeMode);\n }\n }\n\n /**\n * 设置主题(实现 IBimComponent)\n * @param theme 主题配置\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n \n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-hover', theme.primaryHover ?? '#60a5fa');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-danger', theme.danger ?? '#ef4444');\n \n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-text-secondary', theme.textSecondary ?? '#94a3b8');\n style.setProperty('--bim-text-tertiary', theme.textTertiary ?? '#64748b');\n style.setProperty('--bim-text-inverse', theme.textInverse ?? '#152232');\n \n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n \n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n /**\n * 设置语言(实现 IBimComponent)\n */\n public setLocales(): void {\n // 1) 更新按钮 tooltip(图标占位时,tooltip 是主要的可读文本)\n for (const [mode, btn] of this.toolButtons.entries()) {\n btn.title = t(this.getModeI18nKey(mode));\n btn.setAttribute('aria-label', btn.title);\n }\n\n // 2) 更新展开/收起按钮 tooltip\n this.toggleBtn.title = this.isExpanded ? t('measure.actions.collapse') : t('measure.actions.expand');\n this.toggleBtn.setAttribute('aria-label', this.toggleBtn.title);\n\n // 2.1) 更新展开/收起按钮可见文本(你要求的“文字提示”)\n if (this.toggleTextEl) {\n this.toggleTextEl.textContent = this.toggleBtn.title;\n }\n\n // 3) 更新底部按钮文本/tooltip\n this.clearBtn.textContent = t('measure.actions.clearAll');\n this.settingsBtn.title = t('measure.actions.settings');\n this.settingsBtn.setAttribute('aria-label', this.settingsBtn.title);\n\n // 4) 主值 label(随模式变化)\n this.mainValueLabelEl.textContent = t(this.getModeValueLabelI18nKey(this.activeMode));\n\n // 6) XYZ label(使用 key)\n // 这里 label 在 createDom 已经是固定文本节点,直接用 setText 更新更直观\n // 但为了减少 DOM 结构复杂度,我们把 label 写在 createDom 里,通过 data-key 更新\n const labelNodes = this.element.querySelectorAll('[data-i18n-key]');\n labelNodes.forEach((node) => {\n const key = node.dataset.i18nKey;\n if (key) node.textContent = t(key);\n });\n\n // 7) 设置面板文本\n this.saveSettingsBtn.textContent = t('measure.settings.save');\n this.cancelSettingsBtn.textContent = t('measure.settings.cancel');\n }\n\n /**\n * 销毁组件(实现 IBimComponent)\n */\n public destroy(): void {\n // 清理订阅\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n\n // 清理事件监听:由于本组件的监听都绑定在创建时的具体按钮上,\n // 且按钮会随 element 一起被 GC,这里不做逐个 removeEventListener(可读性优先)\n\n // 移除 DOM\n this.element.remove();\n }\n\n // ==========================\n // 对外 API(给 Manager / 外部业务调用)\n // ==========================\n\n /**\n * 获取当前测量方式\n */\n public getActiveMode(): MeasureMode {\n return this.activeMode;\n }\n\n public switchMode(mode: MeasureMode, triggerCallback: boolean = true): void {\n this.setActiveMode(mode, triggerCallback);\n }\n\n public setActiveMode(mode: MeasureMode, triggerCallback: boolean = true): void {\n if (this.activeMode === mode) return;\n this.activeMode = mode;\n this.applyActiveModeState();\n this.applyClearHeightOptionsState();\n\n this.mainValueLabelEl.textContent = t(this.getModeValueLabelI18nKey(this.activeMode));\n\n if (triggerCallback && this.options.onModeChange) {\n this.options.onModeChange(mode);\n }\n\n this.renderResult();\n\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n /**\n * 设置测量结果(由外部注入)\n * @param result 测量结果;传 null 表示清空\n */\n public setResult(result: MeasureResult | null): void {\n this.result = result;\n this.renderResult();\n }\n\n /**\n * 删除全部(只做 UI 状态清空 + 回调)\n */\n public clearAll(): void {\n // 先清空结果显示\n this.result = null;\n this.renderResult();\n\n // 通知外部\n if (this.options.onClearAll) {\n this.options.onClearAll();\n }\n }\n\n /**\n * 打开设置(本次只预留方法/回调)\n */\n public openSettings(): void {\n // 进入设置面板(组件内部逻辑)\n this.enterSettingsView();\n\n // 仍然保留回调(如果外部想监听)\n if (this.options.onSettings) {\n this.options.onSettings();\n }\n }\n\n /**\n * 获取当前测量配置\n */\n public getConfig(): MeasureConfig {\n return { ...this.config };\n }\n\n /**\n * 设置测量配置(可选对外调用)\n * @param partial 部分更新\n * @param persist 是否写入缓存(默认 false)\n */\n public setConfig(partial: Partial, persist: boolean = false): void {\n const next: MeasureConfig = {\n unit: partial.unit ?? this.config.unit,\n precision: partial.precision ?? this.config.precision\n };\n this.config = next;\n if (persist) {\n this.saveConfigToCache(next);\n }\n\n // 配置变化会影响数值显示(单位/精度)\n this.renderResult();\n\n // 如果当前在设置面板,表单也需要同步\n if (this.view === 'settings') {\n this.syncSettingsFormFromConfig(next);\n }\n }\n\n /**\n * 展开 / 收起(可选对外调用)\n * @param expanded 是否展开\n */\n public setExpanded(expanded: boolean): void {\n if (this.isExpanded === expanded) return;\n this.isExpanded = expanded;\n this.applyExpandedState();\n this.setLocales(); // 更新 tooltip(展开/收起)\n\n // 通知外部:用于重新计算 Dialog 高度\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n /**\n * 获取是否展开\n */\n public getExpanded(): boolean {\n return this.isExpanded;\n }\n\n // ==========================\n // 内部实现\n // ==========================\n\n private createDom(): HTMLElement {\n const root = document.createElement('div');\n root.className = 'bim-measure-panel';\n\n // 主视图容器(默认显示)\n this.mainViewEl = document.createElement('div');\n this.mainViewEl.className = 'bim-measure-main';\n\n // 顶部:工具按钮区\n const toolsBox = document.createElement('div');\n toolsBox.className = 'bim-measure-tools';\n\n const grid = document.createElement('div');\n grid.className = 'bim-measure-tool-grid';\n\n const fallbackCircleIconSvg = `\n \n \n \n `;\n\n for (let i = 0; i < MEASURE_MODES_ORDERED.length; i++) {\n const mode = MEASURE_MODES_ORDERED[i];\n const config = MEASURE_TYPES[mode];\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'bim-measure-tool-btn';\n btn.dataset.mode = mode;\n\n const icon = document.createElement('span');\n icon.className = 'bim-measure-tool-icon';\n icon.innerHTML = config.icon || fallbackCircleIconSvg;\n btn.appendChild(icon);\n\n // 点击切换模式\n btn.addEventListener('click', () => {\n this.setActiveMode(mode);\n });\n\n // 先不在这里设置 title/text(统一交给 setLocales)\n this.toolButtons.set(mode, btn);\n grid.appendChild(btn);\n }\n\n toolsBox.appendChild(grid);\n\n // 展开/收起按钮(箭头)\n const toggleBox = document.createElement('div');\n toggleBox.className = 'bim-measure-toggle';\n\n this.toggleBtn = document.createElement('button');\n this.toggleBtn.type = 'button';\n this.toggleBtn.className = 'bim-measure-toggle-btn';\n // 展开/收起按钮:更小,并带文字提示(展开/收起)\n // 注意:文本内容由 setLocales() 统一更新,这里先放一个占位容器\n this.toggleTextEl = document.createElement('span');\n this.toggleTextEl.className = 'bim-measure-toggle-text';\n const toggleIconEl = document.createElement('span');\n toggleIconEl.className = 'bim-measure-toggle-icon';\n toggleIconEl.innerHTML = `\n \n \n \n `;\n this.toggleBtn.appendChild(this.toggleTextEl);\n this.toggleBtn.appendChild(toggleIconEl);\n this.toggleBtn.addEventListener('click', () => {\n this.isExpanded = !this.isExpanded;\n this.applyExpandedState();\n this.setLocales(); // 更新 tooltip(展开/收起)\n\n // 通知外部:用于重新计算 Dialog 高度\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n });\n\n toggleBox.appendChild(this.toggleBtn);\n toolsBox.appendChild(toggleBox);\n this.mainViewEl.appendChild(toolsBox);\n\n // 净高模式选项区(朝向 + 选择对象)\n this.modeOptionsEl = this.createModeOptionsDom();\n this.mainViewEl.appendChild(this.modeOptionsEl);\n\n // 中部:结果区\n const resultBox = document.createElement('div');\n resultBox.className = 'bim-measure-result';\n\n // 主结果值(随模式变化)\n const mainValueRow = document.createElement('div');\n mainValueRow.className = 'bim-measure-row';\n this.mainValueRowEl = mainValueRow;\n const mainValueLabel = document.createElement('span');\n mainValueLabel.className = 'label';\n this.mainValueLabelEl = mainValueLabel;\n const mainValueValue = document.createElement('span');\n mainValueValue.className = 'value';\n this.mainValueValueEl = mainValueValue;\n\n // 主值拆分:数值(黄色)+ 单位(普通色)\n // 这样可以满足:\n // 1) 只让“数据”变黄,单位不变色\n // 2) 没有数据时展示 `-- 单位`\n this.mainNumberEl = document.createElement('span');\n this.mainNumberEl.className = 'bim-measure-main-number';\n this.mainUnitEl = document.createElement('span');\n this.mainUnitEl.className = 'bim-measure-main-unit';\n this.mainValueValueEl.appendChild(this.mainNumberEl);\n this.mainValueValueEl.appendChild(document.createTextNode(' '));\n this.mainValueValueEl.appendChild(this.mainUnitEl);\n mainValueRow.appendChild(mainValueLabel);\n mainValueRow.appendChild(mainValueValue);\n resultBox.appendChild(mainValueRow);\n\n // XYZ\n const xyzBox = document.createElement('div');\n xyzBox.className = 'bim-measure-xyz';\n this.xyzBoxEl = xyzBox;\n\n const makeXyzRow = (labelKey: string, valueClassName: string, valueElSetter: (el: HTMLElement) => void) => {\n const row = document.createElement('div');\n row.className = 'bim-measure-row';\n const label = document.createElement('span');\n label.className = 'label';\n label.dataset.i18nKey = labelKey;\n const value = document.createElement('span');\n value.className = `value ${valueClassName}`;\n valueElSetter(value);\n row.appendChild(label);\n row.appendChild(value);\n return row;\n };\n\n xyzBox.appendChild(makeXyzRow('measure.labels.x', 'bim-measure-xyz-x', (el) => (this.xyzXEl = el)));\n xyzBox.appendChild(makeXyzRow('measure.labels.y', 'bim-measure-xyz-y', (el) => (this.xyzYEl = el)));\n xyzBox.appendChild(makeXyzRow('measure.labels.z', 'bim-measure-xyz-z', (el) => (this.xyzZEl = el)));\n resultBox.appendChild(xyzBox);\n\n this.mainViewEl.appendChild(resultBox);\n\n // 底部:删除全部 + 设置\n const footer = document.createElement('div');\n footer.className = 'bim-measure-footer';\n\n this.clearBtn = document.createElement('button');\n this.clearBtn.type = 'button';\n this.clearBtn.className = 'bim-measure-clear-btn';\n this.clearBtn.addEventListener('click', () => {\n this.clearAll();\n });\n\n this.settingsBtn = document.createElement('button');\n this.settingsBtn.type = 'button';\n this.settingsBtn.className = 'bim-measure-settings-btn';\n this.settingsBtn.innerHTML = `\n \n \n \n `;\n this.settingsBtn.addEventListener('click', () => {\n this.openSettings();\n });\n\n footer.appendChild(this.clearBtn);\n footer.appendChild(this.settingsBtn);\n this.mainViewEl.appendChild(footer);\n\n // 设置视图容器(默认隐藏)\n this.settingsViewEl = this.createSettingsDom();\n\n root.appendChild(this.mainViewEl);\n root.appendChild(this.settingsViewEl);\n\n return root;\n }\n\n /**\n * 创建“设置面板”DOM\n */\n private createSettingsDom(): HTMLElement {\n const box = document.createElement('div');\n box.className = 'bim-measure-settings';\n\n // 标题\n const title = document.createElement('div');\n title.className = 'bim-measure-settings-title';\n title.dataset.i18nKey = 'measure.settings.title';\n box.appendChild(title);\n\n // 单位\n const unitRow = document.createElement('div');\n unitRow.className = 'bim-measure-settings-row';\n const unitLabel = document.createElement('div');\n unitLabel.className = 'label';\n unitLabel.dataset.i18nKey = 'measure.settings.unit';\n this.unitSelectEl = document.createElement('select');\n this.unitSelectEl.className = 'bim-measure-settings-select';\n this.unitSelectEl.appendChild(this.makeOption('m'));\n this.unitSelectEl.appendChild(this.makeOption('cm'));\n this.unitSelectEl.appendChild(this.makeOption('mm'));\n this.unitSelectEl.appendChild(this.makeOption('km'));\n unitRow.appendChild(unitLabel);\n unitRow.appendChild(this.unitSelectEl);\n box.appendChild(unitRow);\n\n // 提示文本:你要求放在“单位”下面\n const hint = document.createElement('div');\n hint.className = 'bim-measure-settings-hint';\n hint.dataset.i18nKey = 'measure.settings.hint';\n box.appendChild(hint);\n\n // 精度\n const precisionRow = document.createElement('div');\n precisionRow.className = 'bim-measure-settings-row';\n const precisionLabel = document.createElement('div');\n precisionLabel.className = 'label';\n precisionLabel.dataset.i18nKey = 'measure.settings.precision';\n this.precisionSelectEl = document.createElement('select');\n this.precisionSelectEl.className = 'bim-measure-settings-select';\n this.precisionSelectEl.appendChild(this.makePrecisionOption(0));\n this.precisionSelectEl.appendChild(this.makePrecisionOption(1));\n this.precisionSelectEl.appendChild(this.makePrecisionOption(2));\n this.precisionSelectEl.appendChild(this.makePrecisionOption(3));\n precisionRow.appendChild(precisionLabel);\n precisionRow.appendChild(this.precisionSelectEl);\n box.appendChild(precisionRow);\n\n // 底部按钮\n const actions = document.createElement('div');\n actions.className = 'bim-measure-settings-actions';\n\n this.saveSettingsBtn = document.createElement('button');\n this.saveSettingsBtn.type = 'button';\n this.saveSettingsBtn.className = 'bim-measure-settings-save';\n this.saveSettingsBtn.addEventListener('click', () => {\n this.saveSettings();\n });\n\n this.cancelSettingsBtn = document.createElement('button');\n this.cancelSettingsBtn.type = 'button';\n this.cancelSettingsBtn.className = 'bim-measure-settings-cancel';\n this.cancelSettingsBtn.addEventListener('click', () => {\n this.cancelSettings();\n });\n\n actions.appendChild(this.saveSettingsBtn);\n actions.appendChild(this.cancelSettingsBtn);\n box.appendChild(actions);\n\n // 初次同步表单值\n this.syncSettingsFormFromConfig(this.config);\n\n return box;\n }\n\n /**\n * 创建净高模式选项区 DOM(朝向 + 选择对象)\n */\n private createModeOptionsDom(): HTMLElement {\n const box = document.createElement('div');\n box.className = 'bim-measure-mode-options';\n\n // 朝向单选组\n const dirGroup = document.createElement('div');\n dirGroup.className = 'bim-measure-radio-group';\n const dirLabel = document.createElement('span');\n dirLabel.className = 'bim-measure-radio-label';\n dirLabel.dataset.i18nKey = 'measure.clearHeight.direction';\n const dirItems = document.createElement('div');\n dirItems.className = 'bim-measure-radio-items';\n\n const dirDown = this.createRadioItem('measure.clearHeight.directionDown', () => {\n this.setClearHeightDirection(0);\n });\n const dirUp = this.createRadioItem('measure.clearHeight.directionUp', () => {\n this.setClearHeightDirection(1);\n });\n this.directionBtns.set(0, dirDown);\n this.directionBtns.set(1, dirUp);\n\n dirItems.appendChild(dirDown);\n dirItems.appendChild(dirUp);\n dirGroup.appendChild(dirLabel);\n dirGroup.appendChild(dirItems);\n box.appendChild(dirGroup);\n\n // 选择对象单选组\n const selGroup = document.createElement('div');\n selGroup.className = 'bim-measure-radio-group';\n const selLabel = document.createElement('span');\n selLabel.className = 'bim-measure-radio-label';\n selLabel.dataset.i18nKey = 'measure.clearHeight.selectType';\n const selItems = document.createElement('div');\n selItems.className = 'bim-measure-radio-items';\n\n const selPoint = this.createRadioItem('measure.clearHeight.selectPoint', () => {\n this.setClearHeightSelectType('point');\n });\n const selElement = this.createRadioItem('measure.clearHeight.selectElement', () => {\n this.setClearHeightSelectType('element');\n });\n this.selectTypeBtns.set('point', selPoint);\n this.selectTypeBtns.set('element', selElement);\n\n selItems.appendChild(selPoint);\n selItems.appendChild(selElement);\n selGroup.appendChild(selLabel);\n selGroup.appendChild(selItems);\n box.appendChild(selGroup);\n\n return box;\n }\n\n private createRadioItem(i18nKey: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'bim-measure-radio-item';\n btn.dataset.i18nKey = i18nKey;\n btn.textContent = t(i18nKey);\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private setClearHeightDirection(direction: ClearHeightDirection): void {\n if (this.clearHeightDirection === direction) return;\n this.clearHeightDirection = direction;\n this.applyClearHeightOptionsState();\n this.options.onClearHeightDirectionChange?.(direction);\n }\n\n private setClearHeightSelectType(selectType: ClearHeightSelectType): void {\n if (this.clearHeightSelectType === selectType) return;\n this.clearHeightSelectType = selectType;\n this.applyClearHeightOptionsState();\n this.options.onClearHeightSelectTypeChange?.(selectType);\n }\n\n /**\n * 应用净高选项状态(显隐 + 选中态)\n */\n private applyClearHeightOptionsState(): void {\n // 显隐\n if (this.activeMode === 'clearHeight') {\n this.modeOptionsEl.classList.add('is-visible');\n } else {\n this.modeOptionsEl.classList.remove('is-visible');\n }\n\n // 朝向按钮选中态\n for (const [dir, btn] of this.directionBtns.entries()) {\n if (dir === this.clearHeightDirection) {\n btn.classList.add('is-active');\n } else {\n btn.classList.remove('is-active');\n }\n }\n\n // 选择对象按钮选中态\n for (const [type, btn] of this.selectTypeBtns.entries()) {\n if (type === this.clearHeightSelectType) {\n btn.classList.add('is-active');\n } else {\n btn.classList.remove('is-active');\n }\n }\n }\n\n private makeOption(unit: MeasureUnit): HTMLOptionElement {\n const opt = document.createElement('option');\n opt.value = unit;\n // 选项显示内容:直接显示单位字符串\n opt.textContent = unit;\n return opt;\n }\n\n private makePrecisionOption(precision: MeasurePrecision): HTMLOptionElement {\n const opt = document.createElement('option');\n opt.value = String(precision);\n // 显示:0 / 0.0 / 0.00 / 0.000\n opt.textContent = precision === 0 ? '0' : `0.${'0'.repeat(precision)}`;\n return opt;\n }\n\n /**\n * 进入设置视图:保存一份当前配置作为草稿基线\n */\n private enterSettingsView(): void {\n this.draftConfig = { ...this.config };\n this.view = 'settings';\n this.syncSettingsFormFromConfig(this.config);\n this.applyViewState();\n }\n\n /**\n * 保存设置:写入 config + 写缓存 + 返回主视图\n */\n private saveSettings(): void {\n const unit = (this.unitSelectEl.value as MeasureUnit) || this.config.unit;\n const precision = (Number(this.precisionSelectEl.value) as MeasurePrecision);\n const next: MeasureConfig = {\n unit,\n precision: this.isValidPrecision(precision) ? precision : this.config.precision\n };\n\n this.config = next;\n this.saveConfigToCache(next);\n this.draftConfig = null;\n this.view = 'main';\n this.applyViewState();\n\n this.renderResult();\n\n this.options.onConfigSave?.(next);\n this.options.onExpandedChange?.(this.isExpanded);\n }\n\n /**\n * 取消设置:回滚到进入设置前的配置,并返回主视图\n */\n private cancelSettings(): void {\n if (this.draftConfig) {\n this.config = { ...this.draftConfig };\n }\n this.draftConfig = null;\n this.view = 'main';\n this.applyViewState();\n this.renderResult();\n\n // 高度变化(设置面板 -> 主面板)也需要通知外部\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n private syncSettingsFormFromConfig(config: MeasureConfig): void {\n this.unitSelectEl.value = config.unit;\n this.precisionSelectEl.value = String(config.precision);\n }\n\n private applyViewState(): void {\n if (this.view === 'settings') {\n this.mainViewEl.style.display = 'none';\n // 注意:CSS 里 `.bim-measure-settings { display: none; }` 是默认隐藏\n // 因此这里必须显式设置为可见(否则会出现“进入设置页后什么都不显示”的问题)\n this.settingsViewEl.style.display = 'block';\n } else {\n // 显式恢复主视图显示(避免外部样式干扰)\n this.mainViewEl.style.display = 'block';\n this.settingsViewEl.style.display = 'none';\n }\n }\n\n /**\n * 从缓存读取配置\n * - 有缓存:返回解析后的配置\n * - 无缓存/解析失败:返回 null\n */\n private loadConfigFromCache(): MeasureConfig | null {\n try {\n const raw = localStorage.getItem(MeasurePanel.CONFIG_CACHE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial;\n if (!parsed || typeof parsed !== 'object') return null;\n\n const unit = parsed.unit;\n const precision = parsed.precision;\n\n if (!this.isValidUnit(unit) || !this.isValidPrecision(precision as number)) return null;\n\n return {\n unit,\n precision: precision as MeasurePrecision\n };\n } catch (_e) {\n // localStorage 可能被禁用或 JSON 格式不正确,直接忽略\n return null;\n }\n }\n\n /**\n * 写入缓存(localStorage)\n */\n private saveConfigToCache(config: MeasureConfig): void {\n try {\n localStorage.setItem(MeasurePanel.CONFIG_CACHE_KEY, JSON.stringify(config));\n } catch (_e) {\n // localStorage 可能被禁用:忽略即可,不影响功能\n }\n }\n\n private isValidUnit(unit: any): unit is MeasureUnit {\n return unit === 'm' || unit === 'cm' || unit === 'mm' || unit === 'km';\n }\n\n private isValidPrecision(precision: any): precision is MeasurePrecision {\n return precision === 0 || precision === 1 || precision === 2 || precision === 3;\n }\n\n /**\n * 应用“展开/收起”状态:默认只显示前 4 个按钮\n */\n private applyExpandedState(): void {\n let index = 0;\n for (const btn of this.toolButtons.values()) {\n // 默认展示前四个,其余根据展开状态显示/隐藏\n if (index >= 4) {\n btn.style.display = this.isExpanded ? '' : 'none';\n } else {\n btn.style.display = '';\n }\n index++;\n }\n\n // toggle 样式(旋转箭头)\n if (this.isExpanded) {\n this.toggleBtn.classList.add('is-expanded');\n } else {\n this.toggleBtn.classList.remove('is-expanded');\n }\n }\n\n /**\n * 应用“当前选中按钮”样式\n */\n private applyActiveModeState(): void {\n for (const [mode, btn] of this.toolButtons.entries()) {\n if (mode === this.activeMode) {\n btn.classList.add('is-active');\n } else {\n btn.classList.remove('is-active');\n }\n }\n }\n\n /**\n * 渲染结果区(根据 activeMode 从 result 里取对应字段)\n */\n private renderResult(): void {\n // 1) 根据模式决定结果区显示规则\n // 你给的规则:\n // - 距离:只显示数值\n // - 最小距离:只显示数值\n // - 角度:--°\n // - 标高:--m(固定 m)\n // - 体积:--mm³(单位随设置变动,即 unit³)\n // - 激光测距:不显示任何数值/xyz,只显示“激光测距”文字\n // - 坡度:--%\n // - 空间体积:--mm³(单位随设置变动,即 unit³)\n\n const isPointMode = this.activeMode === 'point';\n \n if (isPointMode) {\n this.mainValueRowEl.style.display = 'none';\n this.xyzBoxEl.style.display = '';\n const xyz = this.result?.xyz;\n if (!xyz) {\n this.xyzXEl.textContent = '--';\n this.xyzYEl.textContent = '--';\n this.xyzZEl.textContent = '--';\n return;\n }\n this.xyzXEl.textContent = this.convertValue('length', xyz.x) + ' ' + this.getUnitText('length');\n this.xyzYEl.textContent = this.convertValue('length', xyz.y) + ' ' + this.getUnitText('length');\n this.xyzZEl.textContent = this.convertValue('length', xyz.z) + ' ' + this.getUnitText('length');\n return;\n }\n\n this.mainValueRowEl.style.display = '';\n this.mainValueLabelEl.textContent = t(this.getModeValueLabelI18nKey(this.activeMode));\n const value = this.result ? (this.result as any)[MEASURE_TYPES[this.activeMode].callBackType] : undefined;\n \n if (this.activeMode === 'slope'||this.activeMode === 'angle') {\n this.mainNumberEl.textContent = value ?? '--';\n this.mainUnitEl.textContent = '';\n } else {\n const valueType = getValueType(this.activeMode);\n this.mainNumberEl.textContent = this.convertValue(valueType, value);\n this.mainUnitEl.textContent = this.getUnitText(valueType);\n }\n this.xyzBoxEl.style.display = 'none';\n }\n\n private getModeI18nKey(mode: MeasureMode): string {\n return `measure.modes.${mode}`;\n }\n\n /**\n * 获取“主值 label”的国际化 key(随模式变化)\n */\n private getModeValueLabelI18nKey(mode: MeasureMode): string {\n return `measure.labels.value.${mode}`;\n }\n\n /**\n * 统一的数值转换方法\n * @param type 测量值类型:length(长度)、area(面积)、angle(角度)、percent(百分比)、point(坐标)\n * @param value 原始数值(单位:长度为米,面积为平方米)\n * @returns 转换后的格式化字符串,无效值返回 '--'\n */\n private convertValue(type: MeasureValueType, value: number | undefined | null): string {\n if (value === null || value === undefined || Number.isNaN(value)) {\n return '--';\n }\n\n const unit = this.config.unit;\n const precision = this.config.precision;\n let converted: number;\n\n switch (type) {\n case 'length':\n switch (unit) {\n case 'mm': converted = value * 1000; break;\n case 'cm': converted = value * 100; break;\n case 'km': converted = value / 1000; break;\n default: converted = value;\n }\n break;\n case 'area':\n switch (unit) {\n case 'mm': converted = value * 1000 * 1000; break;\n case 'cm': converted = value * 100 * 100; break;\n case 'km': converted = value / 1000 / 1000; break;\n default: converted = value;\n }\n break;\n case 'angle':\n case 'percent':\n case 'point':\n default:\n converted = value;\n }\n\n return converted.toFixed(precision);\n }\n\n /**\n * 获取单位文本\n * @param type 测量值类型\n * @returns 对应的单位文本(如 mm、m²、°)\n */\n private getUnitText(type: MeasureValueType): string {\n const unit = this.config.unit;\n switch (type) {\n case 'length':\n case 'point':\n return unit;\n case 'area':\n return `${unit}²`;\n case 'angle':\n case 'percent':\n return '°';\n default:\n return '';\n }\n }\n\n}\n\n\n","import { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { MeasurePanel } from '../components/measure-panel';\nimport type { MeasureConfig, MeasureResult } from '../components/measure-panel/types';\nimport { MEASURE_TYPES, getModeBycallBackType, getValueType, type MeasureMode, type CallBackType } from '../types/measure';\n\ninterface EngineMeasureData {\n id: string;\n text: number;\n textX?: number;\n textY?: number;\n textZ?: number;\n type: CallBackType;\n isSelect: boolean;\n container: any;\n}\n\nexport class MeasureDialogManager extends BaseDialogManager {\n private panel: MeasurePanel | null = null;\n private config: MeasureConfig | null = null;\n private unsubscribeMeasureChanged: (() => void) | null = null;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n protected get dialogId(): string {\n return 'measure-dialog';\n }\n\n protected get dialogTitle(): string {\n return 'measure.dialogTitle';\n }\n\n protected get dialogWidth(): number {\n return 250;\n }\n\n protected createContent(): HTMLElement {\n this.panel = new MeasurePanel({\n defaultMode: 'distance',\n defaultExpanded: false,\n onModeChange: (mode) => {\n console.log('[MeasureDialogManager] 当前测量方式已切换:', mode);\n this.registry.engine3d?.activateMeasure(mode);\n },\n onClearAll: () => {\n console.log('[MeasureDialogManager] 删除全部');\n this.registry.engine3d?.clearAllMeasures();\n },\n onSettings: () => {\n console.log('[MeasureDialogManager] 打开设置');\n },\n onExpandedChange: () => {\n this.dialog?.fitHeight(false);\n },\n onConfigSave: (config) => {\n console.log('[MeasureDialogManager] 保存设置:', config);\n this.registry.engine3d?.saveMeasureSetting({\n unit: config.unit,\n precision: config.precision\n });\n },\n onClearHeightDirectionChange: (direction) => {\n console.log('[MeasureDialogManager] 净高朝向切换:', direction);\n this.registry.engine3d?.setClearHeightDirection(direction);\n },\n onClearHeightSelectTypeChange: (selectType) => {\n console.log('[MeasureDialogManager] 净高选择对象切换:', selectType);\n this.registry.engine3d?.setClearHeightSelectType(selectType);\n },\n });\n this.panel.init();\n\n this.config = this.panel.getConfig();\n if (this.config) {\n console.log('[MeasureDialogManager] 同步缓存设置到引擎:', this.config);\n this.registry.engine3d?.saveMeasureSetting({\n unit: this.config.unit,\n precision: this.config.precision\n });\n }\n\n const panelWrapper = document.createElement('div');\n panelWrapper.style.padding = '12px';\n panelWrapper.appendChild(this.panel.element);\n\n return panelWrapper;\n }\n\n protected onDialogCreated(): void {\n this.dialog?.fitHeight(false);\n\n // 同步净高默认值到引擎(朝下=0,选择点='point')\n this.registry.engine3d?.setClearHeightDirection(0);\n this.registry.engine3d?.setClearHeightSelectType('point');\n\n const engine = this.registry.engine3d?.getEngine();\n if (engine?.events) {\n const handler = (data: EngineMeasureData) => {\n console.log('[MeasureDialogManager] 测量值回调:', data);\n if (data && this.panel) {\n this.handleMeasureChanged(data);\n }\n };\n engine.events.on('measure-changed', handler);\n engine.events.on('measure-click', handler);\n this.unsubscribeMeasureChanged = () => {\n engine.events.off('measure-changed', handler);\n engine.events.off('measure-click', handler);\n }\n }\n }\n\n private handleMeasureChanged(data: EngineMeasureData): void {\n if (!this.panel) return;\n\n const targetMode = getModeBycallBackType(data.type);\n if (!targetMode) {\n console.warn('[MeasureDialogManager] 未知测量类型:', data.type);\n return;\n }\n\n const currentMode = this.panel.getActiveMode();\n if (currentMode !== targetMode) {\n this.panel.switchMode(targetMode, false);\n }\n\n const result = this.convertToMeasureResult(data, targetMode);\n this.panel.setResult(result);\n }\n\n private convertToMeasureResult(data: EngineMeasureData, mode: MeasureMode): MeasureResult {\n const config = MEASURE_TYPES[mode];\n const result: MeasureResult = {};\n\n if (getValueType(mode) === 'point') {\n if (data.textX !== undefined && data.textY !== undefined && data.textZ !== undefined) {\n result.xyz = { x: data.textX, y: data.textY, z: data.textZ };\n }\n } else {\n (result as any)[config.callBackType] = data.text;\n }\n\n return result;\n }\n\n protected onDialogClose(): void {\n if (this.unsubscribeMeasureChanged) {\n this.unsubscribeMeasureChanged();\n this.unsubscribeMeasureChanged = null;\n }\n this.registry.toolbar?.setBtnActive('measure', false);\n }\n\n protected onBeforeDestroy(): void {\n if (this.unsubscribeMeasureChanged) {\n this.unsubscribeMeasureChanged();\n this.unsubscribeMeasureChanged = null;\n }\n if (this.registry.engine3d) {\n this.registry.engine3d.deactivateMeasure();\n }\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n public getActiveMode(): MeasureMode | null {\n return this.panel ? this.panel.getActiveMode() : null;\n }\n\n public switchMode(mode: MeasureMode): void {\n if (!this.panel) return;\n this.panel.switchMode(mode);\n }\n\n public setMeasureResult(result: MeasureResult | null): void {\n if (!this.panel) return;\n this.panel.setResult(result);\n }\n\n public getConfig(): MeasureConfig | null {\n if (this.panel) {\n this.config = this.panel.getConfig();\n }\n return this.config ? { ...this.config } : null;\n }\n\n public setConfig(partial: Partial, persist: boolean = true): void {\n if (this.panel) {\n this.panel.setConfig(partial, persist);\n this.config = this.panel.getConfig();\n this.dialog?.fitHeight(false);\n return;\n }\n\n const prev = this.config;\n const next: MeasureConfig = {\n unit: partial.unit ?? prev?.unit ?? 'mm',\n precision: partial.precision ?? prev?.precision ?? 2\n };\n this.config = next;\n }\n\n public clearAll(): void {\n if (!this.panel) return;\n this.panel.clearAll();\n }\n\n public openSettings(): void {\n if (!this.panel) return;\n this.panel.openSettings();\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { SectionPlanePanelOptions } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\n/**\n * 拾取面剖切面板组件\n * 包含三个操作按钮:隐藏、反向、重置\n */\nexport class SectionPlanePanel implements IBimComponent {\n public element: HTMLElement;\n private options: SectionPlanePanelOptions;\n\n private isHidden: boolean = false;\n\n // DOM 引用\n private hideBtn!: HTMLButtonElement;\n private reverseBtn!: HTMLButtonElement;\n private resetBtn!: HTMLButtonElement;\n private hideLabelEl!: HTMLElement;\n private reverseLabelEl!: HTMLElement;\n private resetLabelEl!: HTMLElement;\n\n // 订阅清理\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: SectionPlanePanelOptions = {}) {\n this.options = options;\n this.isHidden = options.defaultHidden ?? false;\n this.element = this.createDom();\n }\n\n public setHiddenState(isHidden: boolean): void {\n this.isHidden = isHidden;\n this.updateButtonStates();\n }\n\n public getHiddenState(): boolean {\n return this.isHidden;\n }\n\n private updateButtonStates(): void {\n this.hideBtn?.classList.toggle('active', this.isHidden);\n }\n\n /**\n * 初始化组件\n */\n public init(): void {\n // 订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n }\n\n /**\n * 设置主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n /**\n * 设置语言\n */\n public setLocales(): void {\n this.hideLabelEl.textContent = t('sectionPlane.actions.hide');\n this.reverseLabelEl.textContent = t('sectionPlane.actions.reverse');\n this.resetLabelEl.textContent = t('sectionPlane.actions.reset');\n\n this.hideBtn.title = t('sectionPlane.actions.hide');\n this.reverseBtn.title = t('sectionPlane.actions.reverse');\n this.resetBtn.title = t('sectionPlane.actions.reset');\n }\n\n /**\n * 销毁组件\n */\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.element.remove();\n }\n\n /**\n * 创建 DOM\n */\n private createDom(): HTMLElement {\n const root = document.createElement('div');\n root.className = 'section-plane-panel';\n\n // 隐藏按钮\n this.hideBtn = this.createButton(\n 'hide',\n getIcon('隐藏'),\n () => {\n this.isHidden = !this.isHidden;\n this.updateButtonStates();\n this.options.onHideToggle?.(this.isHidden);\n }\n );\n\n // 反向按钮\n this.reverseBtn = this.createButton(\n 'reverse',\n getIcon('反向'),\n () => {\n if (this.options.onReverse) {\n this.options.onReverse();\n }\n }\n );\n\n // 重置按钮\n this.resetBtn = this.createButton(\n 'reset',\n getIcon('重置'),\n () => {\n if (this.options.onReset) {\n this.options.onReset();\n }\n }\n );\n\n root.appendChild(this.hideBtn);\n root.appendChild(this.reverseBtn);\n root.appendChild(this.resetBtn);\n\n return root;\n }\n\n /**\n * 创建按钮\n */\n private createButton(type: 'hide' | 'reverse' | 'reset', iconSvg: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'section-plane-btn';\n\n // 图标\n const icon = document.createElement('div');\n icon.className = 'section-plane-btn-icon';\n icon.innerHTML = iconSvg;\n btn.appendChild(icon);\n\n // 标签\n const label = document.createElement('div');\n label.className = 'section-plane-btn-label';\n btn.appendChild(label);\n\n // 保存 label 引用\n if (type === 'hide') {\n this.hideLabelEl = label;\n } else if (type === 'reverse') {\n this.reverseLabelEl = label;\n } else {\n this.resetLabelEl = label;\n }\n\n // 点击事件\n btn.addEventListener('click', onClick);\n\n return btn;\n }\n}\n","/**\n * 拾取面剖切对话框管理器\n * 负责管理拾取面剖切工具对话框的显示和交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { SectionPlanePanel } from '../components/section-plane-panel';\n\n/**\n * 拾取面剖切对话框管理器\n * 继承自 BaseDialogManager,提供拾取面剖切功能的对话框管理\n */\nexport class SectionPlaneDialogManager extends BaseDialogManager {\n /** 剖切面板实例 */\n private panel: SectionPlanePanel | null = null;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n /** 对话框唯一标识 */\n protected get dialogId() { return 'section-plane-dialog'; }\n /** 对话框标题(国际化 key) */\n protected get dialogTitle() { return 'sectionPlane.dialogTitle'; }\n /** 对话框宽度 */\n protected get dialogWidth() { return 240; }\n /** 对话框高度 */\n protected get dialogHeight(): number { return 120; }\n\n /** 初始化 */\n public init(): void {}\n\n /**\n * 获取对话框位置\n * 定位在容器右下角\n */\n protected getDialogPosition() {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const paddingRight = 20;\n const paddingBottom = 50;\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: containerHeight - this.dialogHeight - paddingBottom\n };\n }\n\n /** 创建对话框内容 */\n protected createContent(): HTMLElement {\n this.panel = new SectionPlanePanel({\n defaultHidden: false,\n onHideToggle: (isHidden) => {\n console.log('[SectionPlaneDialogManager] 隐藏切换:', isHidden);\n if (isHidden) {\n this.registry.engine3d?.hideSection();\n } else {\n this.registry.engine3d?.recoverSection();\n }\n },\n onReverse: () => {\n console.log('[SectionPlaneDialogManager] 反向 (not supported in new API)');\n },\n onReset: () => {\n console.log('[SectionPlaneDialogManager] 重置 (not supported in new API)');\n }\n });\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框创建后的回调 */\n protected onDialogCreated(): void {\n this.registry.engine3d?.activeSection('face');\n this.dialog?.fitHeight(false);\n }\n\n /** 对话框关闭时的回调 */\n protected onDialogClose(): void {\n this.registry.toolbar?.setBtnActive('section-plane', false);\n }\n\n /** 销毁前的清理 */\n protected onBeforeDestroy(): void {\n this.registry.engine3d?.deactivateSection();\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { SectionAxisPanelOptions, SectionAxis } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\n/**\n * 轴向剖切面板组件\n * 第一行:隐藏(toggle)、反向\n * 第二行:X、Y、Z(互斥按钮组)\n */\nexport class SectionAxisPanel implements IBimComponent {\n public element: HTMLElement;\n private options: SectionAxisPanelOptions;\n\n // 状态\n private isHidden: boolean = false;\n private activeAxis: SectionAxis = 'x';\n\n // DOM 引用 - 第一行\n private hideBtn!: HTMLButtonElement;\n private reverseBtn!: HTMLButtonElement;\n private hideLabelEl!: HTMLElement;\n private reverseLabelEl!: HTMLElement;\n\n // DOM 引用 - 第二行\n private axisXBtn!: HTMLButtonElement;\n private axisYBtn!: HTMLButtonElement;\n private axisZBtn!: HTMLButtonElement;\n\n // 订阅清理\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: SectionAxisPanelOptions = {}) {\n this.options = options;\n this.isHidden = options.defaultHidden ?? false;\n this.activeAxis = options.defaultAxis ?? 'x';\n this.element = this.createDom();\n }\n\n /**\n * 初始化组件\n */\n public init(): void {\n // 订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n\n // 初始化按钮状态\n this.updateHideButtonState();\n this.updateAxisButtonsState();\n }\n\n /**\n * 设置主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n /**\n * 设置语言\n */\n public setLocales(): void {\n this.hideLabelEl.textContent = t('sectionAxis.actions.hide');\n this.reverseLabelEl.textContent = t('sectionAxis.actions.reverse');\n // XYZ按钮的文字不需要国际化,保持为单个字母\n\n this.hideBtn.title = t('sectionAxis.actions.hide');\n this.reverseBtn.title = t('sectionAxis.actions.reverse');\n this.axisXBtn.title = t('sectionAxis.actions.axisX');\n this.axisYBtn.title = t('sectionAxis.actions.axisY');\n this.axisZBtn.title = t('sectionAxis.actions.axisZ');\n }\n\n /**\n * 设置隐藏状态\n */\n public setHiddenState(isHidden: boolean): void {\n this.isHidden = isHidden;\n this.updateHideButtonState();\n }\n\n /**\n * 获取隐藏状态\n */\n public getHiddenState(): boolean {\n return this.isHidden;\n }\n\n /**\n * 设置激活的轴向\n */\n public setActiveAxis(axis: SectionAxis): void {\n this.activeAxis = axis;\n this.updateAxisButtonsState();\n }\n\n /**\n * 获取激活的轴向\n */\n public getActiveAxis(): SectionAxis {\n return this.activeAxis;\n }\n\n /**\n * 销毁组件\n */\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.element.remove();\n }\n\n /**\n * 创建 DOM\n */\n private createDom(): HTMLElement {\n const root = document.createElement('div');\n root.className = 'section-axis-panel';\n\n // 第一行:隐藏、反向\n const row1 = document.createElement('div');\n row1.className = 'section-axis-row-1';\n\n this.hideBtn = this.createButton(\n 'hide',\n getIcon('隐藏'),\n () => this.handleHideToggle()\n );\n\n this.reverseBtn = this.createButton(\n 'reverse',\n getIcon('反向'),\n () => this.handleReverse()\n );\n\n row1.appendChild(this.hideBtn);\n row1.appendChild(this.reverseBtn);\n\n // 第二行:X、Y、Z\n const row2 = document.createElement('div');\n row2.className = 'section-axis-row-2';\n\n this.axisXBtn = this.createAxisButton('axisX', 'X', () => this.handleAxisChange('x'));\n this.axisYBtn = this.createAxisButton('axisY', 'Y', () => this.handleAxisChange('y'));\n this.axisZBtn = this.createAxisButton('axisZ', 'Z', () => this.handleAxisChange('z'));\n\n row2.appendChild(this.axisXBtn);\n row2.appendChild(this.axisYBtn);\n row2.appendChild(this.axisZBtn);\n\n root.appendChild(row1);\n root.appendChild(row2);\n\n return root;\n }\n\n /**\n * 创建按钮(带图标)\n */\n private createButton(\n type: 'hide' | 'reverse',\n iconSvg: string,\n onClick: () => void\n ): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'section-axis-btn';\n\n // 图标\n const icon = document.createElement('div');\n icon.className = 'section-axis-btn-icon';\n icon.innerHTML = iconSvg;\n btn.appendChild(icon);\n\n // 标签\n const label = document.createElement('div');\n label.className = 'section-axis-btn-label';\n btn.appendChild(label);\n\n // 保存 label 引用\n if (type === 'hide') {\n this.hideLabelEl = label;\n } else if (type === 'reverse') {\n this.reverseLabelEl = label;\n }\n\n // 点击事件\n btn.addEventListener('click', onClick);\n\n return btn;\n }\n\n /**\n * 创建轴向按钮(仅文字)\n */\n private createAxisButton(\n _type: 'axisX' | 'axisY' | 'axisZ',\n text: string,\n onClick: () => void\n ): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'section-axis-btn section-axis-btn-text';\n\n // 文字标签(既是图标也是标签)\n const label = document.createElement('div');\n label.className = 'section-axis-btn-label';\n label.textContent = text;\n btn.appendChild(label);\n\n // 点击事件\n btn.addEventListener('click', onClick);\n\n return btn;\n }\n\n /**\n * 处理隐藏按钮切换\n */\n private handleHideToggle(): void {\n this.isHidden = !this.isHidden;\n this.updateHideButtonState();\n\n if (this.options.onHideToggle) {\n this.options.onHideToggle(this.isHidden);\n }\n }\n\n /**\n * 处理反向按钮点击\n */\n private handleReverse(): void {\n if (this.options.onReverse) {\n this.options.onReverse();\n }\n }\n\n /**\n * 处理轴向切换\n */\n private handleAxisChange(axis: SectionAxis): void {\n if (this.activeAxis === axis) {\n return; // 已经是激活状态,不重复触发\n }\n\n this.activeAxis = axis;\n this.updateAxisButtonsState();\n\n if (this.options.onAxisChange) {\n this.options.onAxisChange(axis);\n }\n }\n\n /**\n * 更新隐藏按钮状态\n */\n private updateHideButtonState(): void {\n if (this.isHidden) {\n this.hideBtn.classList.add('active');\n } else {\n this.hideBtn.classList.remove('active');\n }\n }\n\n /**\n * 更新轴向按钮状态\n */\n private updateAxisButtonsState(): void {\n this.axisXBtn.classList.toggle('active', this.activeAxis === 'x');\n this.axisYBtn.classList.toggle('active', this.activeAxis === 'y');\n this.axisZBtn.classList.toggle('active', this.activeAxis === 'z');\n }\n}\n","/**\n * 轴向剖切对话框管理器\n * 负责管理轴向剖切工具对话框的显示、隐藏和剖切面板的交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { SectionAxisPanel } from '../components/section-axis-panel';\nimport type { SectionAxis } from '../components/section-axis-panel/types';\n\n/**\n * 轴向剖切对话框管理器\n * 继承自 BaseDialogManager,提供 X/Y/Z 轴向剖切的对话框管理功能\n */\nexport class SectionAxisDialogManager extends BaseDialogManager {\n /** 轴向剖切面板实例 */\n private panel: SectionAxisPanel | null = null;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n /** 对话框唯一标识 */\n protected get dialogId(): string {\n return 'section-axis-dialog';\n }\n\n /** 对话框标题(国际化 key) */\n protected get dialogTitle(): string {\n return 'sectionAxis.dialogTitle';\n }\n\n /** 对话框宽度 */\n protected get dialogWidth(): number {\n return 240;\n }\n\n /**\n * 获取对话框位置\n * 定位在容器右下角\n */\n protected getDialogPosition(): { x: number; y: number } {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const paddingRight = 20;\n const paddingBottom = 50;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: containerHeight - paddingBottom - 200\n };\n }\n\n /**\n * 创建对话框内容\n * 初始化轴向剖切面板并设置回调\n */\n protected createContent(): HTMLElement {\n this.panel = new SectionAxisPanel({\n defaultAxis: 'x',\n defaultHidden: false,\n onHideToggle: (isHidden) => {\n console.log('[SectionAxisDialogManager] 隐藏切换:', isHidden);\n if (isHidden) {\n this.registry.engine3d?.hideSection();\n } else {\n this.registry.engine3d?.recoverSection();\n }\n },\n onReverse: () => {\n // 反向功能:第三方引擎无 API,仅输出日志\n console.log('[SectionAxisDialogManager] 反向剖切(暂不支持)');\n },\n onAxisChange: (axis) => {\n console.log('[SectionAxisDialogManager] 切换轴向:', axis);\n this.registry.engine3d?.activeSection(axis);\n }\n });\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框创建后的回调,自适应高度 */\n protected onDialogCreated(): void {\n this.dialog?.fitHeight(false);\n \n // 检查 Engine 是否已初始化\n if (!this.registry.engine3d) {\n console.error('[SectionAxisDialogManager] Engine not initialized. Call initEngine() first.');\n return;\n }\n \n // 自动激活默认轴向剖切(X轴)\n this.registry.engine3d.activeSection('x');\n }\n\n /** 对话框关闭时的回调,取消工具栏按钮激活状态 */\n protected onDialogClose(): void {\n this.registry.toolbar?.setBtnActive('section-axis', false);\n }\n\n /** 销毁前的清理,销毁面板实例 */\n protected onBeforeDestroy(): void {\n this.registry.engine3d?.deactivateSection();\n \n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n /**\n * 获取剖切面隐藏状态\n * @returns 是否隐藏\n */\n public getHiddenState(): boolean {\n return this.panel?.getHiddenState() ?? false;\n }\n\n /**\n * 设置剖切面隐藏状态\n * @param isHidden 是否隐藏\n */\n public setHiddenState(isHidden: boolean): void {\n this.panel?.setHiddenState(isHidden);\n }\n\n /**\n * 获取当前激活的剖切轴向\n * @returns 当前轴向 'x' | 'y' | 'z'\n */\n public getActiveAxis(): SectionAxis {\n return this.panel?.getActiveAxis() ?? 'x';\n }\n\n /**\n * 设置剖切轴向\n * @param axis 目标轴向\n */\n public setActiveAxis(axis: SectionAxis): void {\n this.panel?.setActiveAxis(axis);\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { SectionBoxPanelOptions, SectionBoxRange } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\nconst DEFAULT_RANGE: SectionBoxRange = {\n x: { min: 0, max: 100 },\n y: { min: 0, max: 100 },\n z: { min: 0, max: 100 }\n};\n\nexport class SectionBoxPanel implements IBimComponent {\n public element!: HTMLElement;\n private options: SectionBoxPanelOptions;\n\n private isHidden: boolean = false;\n private isReversed: boolean = false;\n private range: SectionBoxRange;\n\n private hideBtn!: HTMLButtonElement;\n private reverseBtn!: HTMLButtonElement;\n private fitBtn!: HTMLButtonElement;\n private resetBtn!: HTMLButtonElement;\n\n private hideLabelEl!: HTMLElement;\n private reverseLabelEl!: HTMLElement;\n private fitLabelEl!: HTMLElement;\n private resetLabelEl!: HTMLElement;\n private xLabelEl!: HTMLElement;\n private yLabelEl!: HTMLElement;\n private zLabelEl!: HTMLElement;\n\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n private xSlider!: HTMLElement;\n private ySlider!: HTMLElement;\n private zSlider!: HTMLElement;\n\n private xMinHandle!: HTMLElement;\n private xMaxHandle!: HTMLElement;\n private yMinHandle!: HTMLElement;\n private yMaxHandle!: HTMLElement;\n private zMinHandle!: HTMLElement;\n private zMaxHandle!: HTMLElement;\n\n private dragState: {\n isDragging: boolean;\n axis: 'x' | 'y' | 'z' | null;\n handleType: 'min' | 'max' | null;\n pointerId: number | null;\n } = {\n isDragging: false,\n axis: null,\n handleType: null,\n pointerId: null\n };\n\n constructor(options: SectionBoxPanelOptions = {}) {\n this.options = options;\n this.isHidden = options.defaultHidden ?? false;\n this.isReversed = options.defaultReversed ?? false;\n this.range = JSON.parse(JSON.stringify(options.defaultRange ?? DEFAULT_RANGE));\n }\n\n public init(): void {\n this.element = this.createPanel();\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n this.updateButtonStates();\n this.updateAllSlidersUI();\n this.setupDragListeners();\n }\n\n // --- Public APIs ---\n\n public setHiddenState(isHidden: boolean): void {\n this.isHidden = isHidden;\n this.updateButtonStates();\n }\n\n public getHiddenState(): boolean {\n return this.isHidden;\n }\n\n public setReversedState(isReversed: boolean): void {\n this.isReversed = isReversed;\n this.updateButtonStates();\n }\n\n public getReversedState(): boolean {\n return this.isReversed;\n }\n\n public setRange(range: Partial): void {\n if (range.x) this.range.x = { ...this.range.x, ...range.x };\n if (range.y) this.range.y = { ...this.range.y, ...range.y };\n if (range.z) this.range.z = { ...this.range.z, ...range.z };\n this.updateAllSlidersUI();\n }\n\n public getRange(): SectionBoxRange {\n return JSON.parse(JSON.stringify(this.range));\n }\n\n public reset(): void {\n this.isHidden = this.options.defaultHidden ?? false;\n this.isReversed = this.options.defaultReversed ?? false;\n this.range = JSON.parse(JSON.stringify(this.options.defaultRange ?? DEFAULT_RANGE));\n this.updateButtonStates();\n this.updateAllSlidersUI();\n this.options.onReset?.();\n this.options.onRangeChange?.(this.range);\n }\n\n // --- Private Setup ---\n\n private createPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.className = 'section-box-panel';\n\n const buttonsContainer = document.createElement('div');\n buttonsContainer.className = 'section-box-row-buttons';\n\n this.hideBtn = this.createButton('hide', t('sectionBox.actions.hide'), () => {\n this.isHidden = !this.isHidden;\n this.updateButtonStates();\n this.options.onHideToggle?.(this.isHidden);\n }, 'hide');\n\n this.reverseBtn = this.createButton('reverse', t('sectionBox.actions.reverse'), () => {\n this.isReversed = !this.isReversed;\n this.updateButtonStates();\n this.options.onReverseToggle?.(this.isReversed);\n }, 'reverse');\n\n this.fitBtn = this.createButton('fit', t('sectionBox.actions.fitToModel'), () => {\n this.options.onFitToModel?.();\n }, 'fit');\n\n this.resetBtn = this.createButton('reset', t('sectionBox.actions.reset'), () => this.reset(), 'reset');\n\n [this.hideBtn, this.reverseBtn, this.fitBtn, this.resetBtn].forEach(btn => buttonsContainer.appendChild(btn));\n\n const slidersContainer = document.createElement('div');\n slidersContainer.className = 'section-box-sliders';\n slidersContainer.addEventListener('pointerdown', (e) => e.stopPropagation());\n\n this.xSlider = this.createSlider('x', t('sectionBox.axes.x'));\n this.ySlider = this.createSlider('y', t('sectionBox.axes.y'));\n this.zSlider = this.createSlider('z', t('sectionBox.axes.z'));\n\n [this.xSlider, this.ySlider, this.zSlider].forEach(s => slidersContainer.appendChild(s));\n\n panel.appendChild(buttonsContainer);\n panel.appendChild(slidersContainer);\n return panel;\n }\n\n private createButton(type: string, label: string, onClick: () => void, ref?: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = 'section-box-btn';\n btn.title = label;\n\n const iconMap: Record = {\n hide: '隐藏',\n reverse: '反向',\n fit: '适应到模型',\n reset: '重置'\n };\n\n const icon = document.createElement('div');\n icon.className = 'section-box-btn-icon';\n icon.innerHTML = getIcon(iconMap[type] || type);\n\n const labelEl = document.createElement('div');\n labelEl.className = 'section-box-btn-label';\n labelEl.textContent = label;\n\n if (ref === 'hide') this.hideLabelEl = labelEl;\n else if (ref === 'reverse') this.reverseLabelEl = labelEl;\n else if (ref === 'fit') this.fitLabelEl = labelEl;\n else if (ref === 'reset') this.resetLabelEl = labelEl;\n\n btn.appendChild(icon);\n btn.appendChild(labelEl);\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private createSlider(axis: 'x' | 'y' | 'z', label: string): HTMLElement {\n const slider = document.createElement('div');\n slider.className = 'section-box-slider';\n\n const labelEl = document.createElement('div');\n labelEl.className = 'section-box-slider-label';\n labelEl.textContent = label;\n if (axis === 'x') this.xLabelEl = labelEl;\n else if (axis === 'y') this.yLabelEl = labelEl;\n else this.zLabelEl = labelEl;\n\n const track = document.createElement('div');\n track.className = 'section-box-slider-track';\n\n const range = document.createElement('div');\n range.className = 'section-box-slider-range';\n\n const minHandle = document.createElement('div');\n minHandle.className = 'section-box-slider-handle';\n minHandle.setAttribute('data-axis', axis);\n minHandle.setAttribute('data-handle', 'min');\n\n const maxHandle = document.createElement('div');\n maxHandle.className = 'section-box-slider-handle';\n maxHandle.setAttribute('data-axis', axis);\n maxHandle.setAttribute('data-handle', 'max');\n\n track.append(range, minHandle, maxHandle);\n slider.append(labelEl, track);\n\n if (axis === 'x') { this.xMinHandle = minHandle; this.xMaxHandle = maxHandle; }\n else if (axis === 'y') { this.yMinHandle = minHandle; this.yMaxHandle = maxHandle; }\n else { this.zMinHandle = minHandle; this.zMaxHandle = maxHandle; }\n\n return slider;\n }\n\n private setupDragListeners(): void {\n const handles = [this.xMinHandle, this.xMaxHandle, this.yMinHandle, this.yMaxHandle, this.zMinHandle, this.zMaxHandle];\n\n handles.forEach(handle => {\n handle.addEventListener('pointerdown', (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n // 核心锁定:确保后续所有移动事件都只发给这个手柄\n handle.setPointerCapture(e.pointerId);\n\n this.dragState = {\n isDragging: true,\n axis: handle.getAttribute('data-axis') as 'x' | 'y' | 'z',\n handleType: handle.getAttribute('data-handle') as 'min' | 'max',\n pointerId: e.pointerId\n };\n\n handle.classList.add('dragging');\n (handle.closest('.section-box-slider') as HTMLElement).style.zIndex = '100';\n });\n\n handle.addEventListener('pointermove', (e: PointerEvent) => {\n if (this.dragState.isDragging && this.dragState.pointerId === e.pointerId) {\n this.onDragging(e);\n }\n });\n\n const stop = (e: PointerEvent) => {\n if (this.dragState.isDragging && this.dragState.pointerId === e.pointerId) {\n if (handle.hasPointerCapture(e.pointerId)) {\n handle.releasePointerCapture(e.pointerId);\n }\n (handle.closest('.section-box-slider') as HTMLElement).style.zIndex = '';\n handle.classList.remove('dragging');\n this.dragState = {\n isDragging: false,\n axis: null,\n handleType: null,\n pointerId: null\n };\n }\n };\n\n handle.addEventListener('pointerup', stop);\n handle.addEventListener('pointercancel', stop);\n handle.addEventListener('lostpointercapture', stop);\n });\n }\n\n private onDragging(e: PointerEvent): void {\n const { axis, handleType } = this.dragState;\n if (!axis || !handleType) return;\n\n const sliderEl = axis === 'x' ? this.xSlider : (axis === 'y' ? this.ySlider : this.zSlider);\n const track = sliderEl.querySelector('.section-box-slider-track') as HTMLElement;\n const rect = track.getBoundingClientRect();\n\n let percentage = ((e.clientX - rect.left) / rect.width) * 100;\n percentage = Math.max(0, Math.min(100, percentage));\n\n const current = this.range[axis];\n if (handleType === 'min') {\n current.min = Math.min(percentage, current.max);\n } else {\n current.max = Math.max(percentage, current.min);\n }\n\n this.updateSliderUI(axis);\n this.options.onRangeChange?.(this.range);\n }\n\n private updateSliderUI(axis: 'x' | 'y' | 'z'): void {\n const range = this.range[axis];\n const minH = axis === 'x' ? this.xMinHandle : (axis === 'y' ? this.yMinHandle : this.zMinHandle);\n const maxH = axis === 'x' ? this.xMaxHandle : (axis === 'y' ? this.yMaxHandle : this.zMaxHandle);\n const slider = axis === 'x' ? this.xSlider : (axis === 'y' ? this.ySlider : this.zSlider);\n const rangeEl = slider.querySelector('.section-box-slider-range') as HTMLElement;\n\n minH.style.left = `${range.min}%`;\n maxH.style.left = `${range.max}%`;\n rangeEl.style.left = `${range.min}%`;\n rangeEl.style.width = `${range.max - range.min}%`;\n\n minH.setAttribute('data-value', Math.round(range.min).toString());\n maxH.setAttribute('data-value', Math.round(range.max).toString());\n }\n\n private updateAllSlidersUI(): void {\n ['x', 'y', 'z'].forEach((a: any) => this.updateSliderUI(a));\n }\n\n private updateButtonStates(): void {\n if (this.hideBtn) this.hideBtn.classList.toggle('active', this.isHidden);\n if (this.reverseBtn) this.reverseBtn.classList.toggle('active', this.isReversed);\n }\n\n public setLocales(): void {\n if (!this.hideLabelEl) return;\n this.hideLabelEl.textContent = t('sectionBox.actions.hide');\n this.reverseLabelEl.textContent = t('sectionBox.actions.reverse');\n this.fitLabelEl.textContent = t('sectionBox.actions.fitToModel');\n this.resetLabelEl.textContent = t('sectionBox.actions.reset');\n this.xLabelEl.textContent = t('sectionBox.axes.x');\n this.yLabelEl.textContent = t('sectionBox.axes.y');\n this.zLabelEl.textContent = t('sectionBox.axes.z');\n this.hideBtn.title = t('sectionBox.actions.hide');\n this.reverseBtn.title = t('sectionBox.actions.reverse');\n this.fitBtn.title = t('sectionBox.actions.fitToModel');\n this.resetBtn.title = t('sectionBox.actions.reset');\n }\n\n public setTheme(theme: ThemeConfig): void {\n if (!this.element) return;\n const style = this.element.style;\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n public destroy(): void {\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n if (this.element && this.element.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}","import { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { SectionBoxPanel } from '../components/section-box-panel';\nimport type { SectionBoxRange } from '../components/section-box-panel/types';\n\nexport class SectionBoxDialogManager extends BaseDialogManager {\n private panel: SectionBoxPanel | null = null;\n private unsubscribeSectionMove: (() => void) | null = null;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n /** 对话框唯一标识 */\n protected get dialogId(): string {\n return 'section-box-dialog';\n }\n\n /** 对话框标题(国际化 key) */\n protected get dialogTitle(): string {\n return 'sectionBox.dialogTitle';\n }\n\n /** 对话框宽度 */\n protected get dialogWidth(): number {\n return 280;\n }\n\n /**\n * 获取对话框位置\n * 定位在容器右下角\n */\n protected getDialogPosition(): { x: number; y: number } {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const paddingRight = 20;\n const paddingBottom = 50;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: containerHeight - paddingBottom - 300\n };\n }\n\n /**\n * 创建对话框内容\n * 初始化剖切盒面板并设置回调\n */\n protected createContent(): HTMLElement {\n this.panel = new SectionBoxPanel({\n defaultHidden: false,\n defaultReversed: false,\n onHideToggle: (isHidden) => {\n console.log('[SectionBoxDialogManager] 隐藏切换:', isHidden);\n if (isHidden) {\n this.registry.engine3d?.hideSection();\n } else {\n this.registry.engine3d?.recoverSection();\n }\n },\n onReverseToggle: (isReversed) => {\n console.log('[SectionBoxDialogManager] 反向切换:', isReversed);\n // 底层 reverse() 为“切换一次”,这里不使用 isReversed 作为入参,只要用户点击就触发。\n this.registry.engine3d?.reverseSection();\n },\n onFitToModel: () => {\n // 对接底层 scaleBox():缩放剖切盒到场景整体包围盒\n this.registry.engine3d?.scaleSectionBox();\n },\n onReset: () => {\n // 重置定义:关闭剖切再打开剖切盒。\n // UI 侧会自行将滑块强制恢复到 0-100,并将隐藏/反向按钮恢复为关闭状态。\n this.registry.engine3d?.deactivateSection();\n this.registry.engine3d?.activeSection('box');\n // 确保剖切可见(避免上一次处于隐藏状态导致“看起来没重置”)\n this.registry.engine3d?.recoverSection();\n },\n onRangeChange: (range) => {\n this.registry.engine3d?.setSectionBoxRange(range);\n }\n });\n this.panel.init();\n return this.panel.element;\n }\n\n protected onDialogCreated(): void {\n this.registry.engine3d?.activeSection('box');\n this.dialog?.fitHeight(false);\n\n const engine = this.registry.engine3d?.getEngine();\n if (engine?.events) {\n const handler = (data: any) => {\n if (data && this.panel) {\n this.panel.setRange(data as Partial);\n }\n };\n engine.events.on('section-move', handler);\n this.unsubscribeSectionMove = () => engine.events.off('section-move', handler);\n }\n }\n\n protected onDialogClose(): void {\n if (this.unsubscribeSectionMove) {\n this.unsubscribeSectionMove();\n this.unsubscribeSectionMove = null;\n }\n this.registry.toolbar?.setBtnActive('section-box', false);\n }\n\n protected onBeforeDestroy(): void {\n if (this.unsubscribeSectionMove) {\n this.unsubscribeSectionMove();\n this.unsubscribeSectionMove = null;\n }\n this.registry.engine3d?.deactivateSection();\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n /**\n * 获取剖切盒隐藏状态\n * @returns 是否隐藏\n */\n public getHiddenState(): boolean {\n return this.panel?.getHiddenState() ?? false;\n }\n\n /**\n * 设置剖切盒隐藏状态\n * @param isHidden 是否隐藏\n */\n public setHiddenState(isHidden: boolean): void {\n this.panel?.setHiddenState(isHidden);\n }\n\n /**\n * 获取剖切盒反向状态\n * @returns 是否反向(显示盒内/盒外)\n */\n public getReversedState(): boolean {\n return this.panel?.getReversedState() ?? false;\n }\n\n /**\n * 设置剖切盒反向状态\n * @param isReversed 是否反向\n */\n public setReversedState(isReversed: boolean): void {\n this.panel?.setReversedState(isReversed);\n }\n\n /**\n * 获取剖切盒范围\n * @returns 六面体范围 { minX, maxX, minY, maxY, minZ, maxZ }\n */\n public getRange(): SectionBoxRange | null {\n return this.panel?.getRange() ?? null;\n }\n\n /**\n * 设置剖切盒范围\n * @param range 部分或全部范围值\n */\n public setRange(range: Partial): void {\n this.panel?.setRange(range);\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { WalkControlPanelOptions, WalkControlState, WalkControlMode, CharacterModel, WalkMode } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\nexport class WalkControlPanel implements IBimComponent {\n public element!: HTMLElement;\n private options: WalkControlPanelOptions;\n\n // 状态\n private state: WalkControlState = {\n mode: 'none',\n isPlanViewActive: false,\n speed: 1,\n gravity: false,\n collision: false,\n characterModel: 'construction-worker',\n walkMode: 'walk'\n };\n\n // DOM 引用 - 左侧按钮\n private planViewBtn!: HTMLButtonElement;\n private pathModeBtn!: HTMLButtonElement;\n // private walkModeBtn!: HTMLButtonElement;\n\n // DOM 引用 - 中间设置区\n private settingsContainer!: HTMLElement;\n private speedControl!: HTMLElement;\n private speedDecreaseBtn!: HTMLButtonElement;\n private speedIncreaseBtn!: HTMLButtonElement;\n private speedDisplay!: HTMLElement;\n private gravityCheckbox!: HTMLInputElement;\n private gravityLabel!: HTMLElement;\n private collisionCheckbox!: HTMLInputElement;\n private collisionLabel!: HTMLElement;\n private characterModelSelect!: HTMLSelectElement;\n private characterModelLabel!: HTMLElement;\n private walkModeSelect!: HTMLSelectElement;\n private walkModeLabel!: HTMLElement;\n\n // DOM 引用 - 退出按钮\n private exitBtn!: HTMLButtonElement;\n\n // 国际化订阅\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: WalkControlPanelOptions = {}) {\n this.options = options;\n this.state.speed = options.defaultSpeed ?? 1;\n this.state.gravity = options.defaultGravity ?? false;\n this.state.collision = options.defaultCollision ?? false;\n this.state.characterModel = options.defaultCharacterModel ?? 'construction-worker';\n this.state.walkMode = options.defaultWalkMode ?? 'walk';\n }\n\n public init(): void {\n this.element = this.createPanel();\n this.updateSettingsView();\n\n // 订阅\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n }\n\n // --- 公共方法 ---\n\n public setPlanViewActive(active: boolean): void {\n this.state.isPlanViewActive = active;\n this.updateButtonStates();\n }\n\n public setPathModeActive(active: boolean): void {\n // 只有当前是路径模式时,取消才设置为 none\n // 避免在其他模式下被误设置为 none\n if (!active && this.state.mode !== 'path') {\n return;\n }\n const newMode: WalkControlMode = active ? 'path' : 'none';\n this.setMode(newMode);\n }\n\n public getState(): WalkControlState {\n return { ...this.state };\n }\n\n // --- 私有方法 ---\n\n private createPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.className = 'walk-control-panel';\n\n // 左侧按钮区\n const leftButtons = this.createLeftButtons();\n\n // 分割线1\n const divider1 = document.createElement('div');\n divider1.className = 'walk-divider';\n\n // 中间设置区\n this.settingsContainer = this.createSettingsContainer();\n\n // 分割线2\n const divider2 = document.createElement('div');\n divider2.className = 'walk-divider';\n\n // 右侧退出按钮\n const exitBtn = this.createExitButton();\n\n panel.appendChild(leftButtons);\n panel.appendChild(divider1);\n panel.appendChild(this.settingsContainer);\n panel.appendChild(divider2);\n panel.appendChild(exitBtn);\n\n return panel;\n }\n\n private createLeftButtons(): HTMLElement {\n const container = document.createElement('div');\n container.className = 'walk-control-left';\n\n this.planViewBtn = this.createIconButton('plan-view', () => {\n this.state.isPlanViewActive = !this.state.isPlanViewActive;\n this.updateButtonStates();\n this.options.onPlanViewToggle?.(this.state.isPlanViewActive);\n });\n\n this.pathModeBtn = this.createIconButton('path', () => {\n const newMode: WalkControlMode = this.state.mode === 'path' ? 'none' : 'path';\n this.setMode(newMode);\n this.options.onPathModeToggle?.(newMode === 'path');\n });\n\n // this.walkModeBtn = this.createIconButton('walk', () => {\n // const newMode: WalkControlMode = this.state.mode === 'walk' ? 'none' : 'walk';\n // this.setMode(newMode);\n // this.options.onWalkModeToggle?.(newMode === 'walk');\n // });\n\n container.appendChild(this.planViewBtn);\n container.appendChild(this.pathModeBtn);\n // container.appendChild(this.walkModeBtn);\n\n return container;\n }\n\n private createSettingsContainer(): HTMLElement {\n const container = document.createElement('div');\n container.className = 'walk-control-settings';\n\n // 移动速度控件\n this.speedControl = this.createSpeedControl();\n\n // 重力复选框\n const gravityWrapper = document.createElement('label');\n gravityWrapper.className = 'walk-checkbox-wrapper walk-checkbox-gravity';\n this.gravityCheckbox = document.createElement('input');\n this.gravityCheckbox.type = 'checkbox';\n this.gravityCheckbox.className = 'walk-checkbox';\n this.gravityCheckbox.checked = this.state.gravity;\n this.gravityCheckbox.addEventListener('change', () => {\n this.state.gravity = this.gravityCheckbox.checked;\n this.options.onGravityToggle?.(this.state.gravity);\n });\n this.gravityLabel = document.createElement('span');\n this.gravityLabel.className = 'walk-checkbox-label';\n gravityWrapper.appendChild(this.gravityCheckbox);\n gravityWrapper.appendChild(this.gravityLabel);\n\n // 碰撞复选框\n const collisionWrapper = document.createElement('label');\n collisionWrapper.className = 'walk-checkbox-wrapper walk-checkbox-collision';\n this.collisionCheckbox = document.createElement('input');\n this.collisionCheckbox.type = 'checkbox';\n this.collisionCheckbox.className = 'walk-checkbox';\n this.collisionCheckbox.checked = this.state.collision;\n this.collisionCheckbox.addEventListener('change', () => {\n this.state.collision = this.collisionCheckbox.checked;\n this.options.onCollisionToggle?.(this.state.collision);\n });\n this.collisionLabel = document.createElement('span');\n this.collisionLabel.className = 'walk-checkbox-label';\n collisionWrapper.appendChild(this.collisionCheckbox);\n collisionWrapper.appendChild(this.collisionLabel);\n\n // 角色模型选择\n const characterWrapper = document.createElement('div');\n characterWrapper.className = 'walk-select-wrapper walk-select-wrapper-character-model';\n this.characterModelLabel = document.createElement('label');\n this.characterModelLabel.className = 'walk-select-label';\n this.characterModelSelect = document.createElement('select');\n this.characterModelSelect.className = 'walk-select walk-select-character-model';\n this.characterModelSelect.addEventListener('change', () => {\n this.state.characterModel = this.characterModelSelect.value as CharacterModel;\n this.options.onCharacterModelChange?.(this.state.characterModel);\n });\n characterWrapper.appendChild(this.characterModelLabel);\n characterWrapper.appendChild(this.characterModelSelect);\n\n // 行走模式选择\n const walkModeWrapper = document.createElement('div');\n walkModeWrapper.className = 'walk-select-wrapper walk-select-wrapper-walk-mode';\n this.walkModeLabel = document.createElement('label');\n this.walkModeLabel.className = 'walk-select-label';\n this.walkModeSelect = document.createElement('select');\n this.walkModeSelect.className = 'walk-select walk-select-walk-mode';\n this.walkModeSelect.addEventListener('change', () => {\n this.state.walkMode = this.walkModeSelect.value as WalkMode;\n this.options.onWalkModeChange?.(this.state.walkMode);\n });\n walkModeWrapper.appendChild(this.walkModeLabel);\n walkModeWrapper.appendChild(this.walkModeSelect);\n\n // 添加所有控件\n // 注意:顺序为 速度、角色模型、行走模式、重力、碰撞\n // 这样在漫游模式下显示的顺序就是:角色模型、行走模式、重力、碰撞\n container.appendChild(this.speedControl);\n container.appendChild(characterWrapper);\n container.appendChild(walkModeWrapper);\n container.appendChild(gravityWrapper);\n container.appendChild(collisionWrapper);\n\n return container;\n }\n\n private createSpeedControl(): HTMLElement {\n const container = document.createElement('div');\n container.className = 'walk-speed-control';\n\n const label = document.createElement('label');\n label.className = 'walk-speed-label';\n label.textContent = t('walkControl.speed');\n\n const controlGroup = document.createElement('div');\n controlGroup.className = 'walk-speed-group';\n\n // 减速按钮\n this.speedDecreaseBtn = document.createElement('button');\n this.speedDecreaseBtn.className = 'walk-speed-btn';\n this.speedDecreaseBtn.textContent = '-';\n this.speedDecreaseBtn.addEventListener('click', () => {\n if (this.state.speed > 1) {\n this.state.speed--;\n this.updateSpeedDisplay();\n this.options.onSpeedChange?.(this.state.speed);\n }\n });\n\n // 速度显示\n this.speedDisplay = document.createElement('div');\n this.speedDisplay.className = 'walk-speed-display';\n this.speedDisplay.textContent = `${this.state.speed}X`;\n\n // 加速按钮\n this.speedIncreaseBtn = document.createElement('button');\n this.speedIncreaseBtn.className = 'walk-speed-btn';\n this.speedIncreaseBtn.textContent = '+';\n this.speedIncreaseBtn.addEventListener('click', () => {\n if (this.state.speed < 10) {\n this.state.speed++;\n this.updateSpeedDisplay();\n this.options.onSpeedChange?.(this.state.speed);\n }\n });\n\n controlGroup.appendChild(this.speedDecreaseBtn);\n controlGroup.appendChild(this.speedDisplay);\n controlGroup.appendChild(this.speedIncreaseBtn);\n\n container.appendChild(label);\n container.appendChild(controlGroup);\n\n return container;\n }\n\n private createIconButton(type: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = `walk-icon-btn walk-icon-btn-${type}`;\n btn.innerHTML = this.getIconSVG(type);\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private createExitButton(): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = 'walk-exit-btn';\n btn.addEventListener('click', () => {\n this.options.onExit?.();\n });\n this.exitBtn = btn;\n return btn;\n }\n\n private setMode(mode: WalkControlMode): void {\n const oldMode = this.state.mode;\n\n // 如果从walk模式切换到其他模式,触发walk关闭事件\n if (oldMode === 'walk' && mode !== 'walk') {\n this.options.onWalkModeToggle?.(false);\n }\n\n // 如果从path模式切换到其他模式,触发path关闭事件\n if (oldMode === 'path' && mode !== 'path') {\n this.options.onPathModeToggle?.(false);\n }\n\n this.state.mode = mode;\n\n // 路径模式:禁用重力和碰撞\n if (mode === 'path') {\n this.state.gravity = false;\n this.state.collision = false;\n this.gravityCheckbox.checked = false;\n this.gravityCheckbox.disabled = true;\n this.collisionCheckbox.checked = false;\n this.collisionCheckbox.disabled = true;\n } else {\n this.gravityCheckbox.disabled = false;\n this.collisionCheckbox.disabled = false;\n }\n\n this.updateButtonStates();\n this.updateSettingsView();\n this.updateSpeedButtonStates();\n }\n\n private updateButtonStates(): void {\n // 平面图按钮\n this.planViewBtn.classList.toggle('active', this.state.isPlanViewActive);\n\n // 路径漫游按钮\n this.pathModeBtn.classList.toggle('active', this.state.mode === 'path');\n\n // 漫游按钮\n // this.walkModeBtn.classList.toggle('active', this.state.mode === 'walk');\n }\n\n private updateSettingsView(): void {\n // 根据模式显示/隐藏不同的控件\n const speedWrapper = this.speedControl;\n const gravityWrapper = this.gravityCheckbox.parentElement!;\n const collisionWrapper = this.collisionCheckbox.parentElement!;\n const characterWrapper = this.characterModelSelect.parentElement!;\n const walkModeWrapper = this.walkModeSelect.parentElement!;\n\n if (this.state.mode === 'walk') {\n // 漫游模式:隐藏速度,显示模型、行走模式、重力、碰撞\n speedWrapper.style.display = 'none';\n gravityWrapper.style.display = 'flex';\n collisionWrapper.style.display = 'flex';\n characterWrapper.style.display = 'flex';\n walkModeWrapper.style.display = 'flex';\n } else {\n // 默认或路径模式:显示速度、重力、碰撞,隐藏模型和行走模式\n speedWrapper.style.display = 'flex';\n gravityWrapper.style.display = 'flex';\n collisionWrapper.style.display = 'flex';\n characterWrapper.style.display = 'none';\n walkModeWrapper.style.display = 'none';\n }\n }\n\n private updateSpeedDisplay(): void {\n this.speedDisplay.textContent = `${this.state.speed}X`;\n this.updateSpeedButtonStates();\n }\n\n private updateSpeedButtonStates(): void {\n this.speedDecreaseBtn.disabled = this.state.speed <= 1;\n this.speedIncreaseBtn.disabled = this.state.speed >= 10;\n }\n\n private getIconSVG(type: string): string {\n const icons: Record = {\n 'plan-view': getIcon('地图'),\n 'path': getIcon('路径漫游'),\n 'walk': getIcon('第一人称漫游')\n };\n return icons[type] || '';\n }\n\n public setLocales(): void {\n // 更新速度标签\n const speedLabel = this.speedControl.querySelector('.walk-speed-label');\n if (speedLabel) {\n speedLabel.textContent = t('walkControl.speed');\n }\n\n // 更新复选框标签\n this.gravityLabel.textContent = t('walkControl.gravity');\n this.collisionLabel.textContent = t('walkControl.collision');\n\n // 更新角色模型下拉框\n this.characterModelLabel.textContent = t('walkControl.characterModel.label');\n this.characterModelSelect.innerHTML = '';\n const constructionWorkerOption = document.createElement('option');\n constructionWorkerOption.value = 'construction-worker';\n constructionWorkerOption.textContent = t('walkControl.characterModel.constructionWorker');\n constructionWorkerOption.selected = this.state.characterModel === 'construction-worker';\n this.characterModelSelect.appendChild(constructionWorkerOption);\n\n const officeMaleOption = document.createElement('option');\n officeMaleOption.value = 'office-male';\n officeMaleOption.textContent = t('walkControl.characterModel.officeMale');\n officeMaleOption.selected = this.state.characterModel === 'office-male';\n this.characterModelSelect.appendChild(officeMaleOption);\n\n // 更新行走模式下拉框\n this.walkModeLabel.textContent = t('walkControl.walkMode.label');\n this.walkModeSelect.innerHTML = '';\n const walkOption = document.createElement('option');\n walkOption.value = 'walk';\n walkOption.textContent = t('walkControl.walkMode.walk');\n walkOption.selected = this.state.walkMode === 'walk';\n this.walkModeSelect.appendChild(walkOption);\n\n const runOption = document.createElement('option');\n runOption.value = 'run';\n runOption.textContent = t('walkControl.walkMode.run');\n runOption.selected = this.state.walkMode === 'run';\n this.walkModeSelect.appendChild(runOption);\n\n // 更新退出按钮\n this.exitBtn.textContent = t('walkControl.exit');\n }\n\n public setTheme(theme: ThemeConfig): void {\n if (!this.element) return;\n const style = this.element.style;\n\n style.setProperty('--bim-bg-base', theme.bgBase ?? '#152232');\n style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-border-subtle', theme.borderSubtle ?? '#1e293b');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n style.setProperty('--bim-shadow-xl', theme.shadowXl ?? '0 20px 40px rgba(0, 0, 0, 0.3)');\n\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-hover', theme.primaryHover ?? '#60a5fa');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-text-inverse', theme.textInverse ?? '#152232');\n\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n style.setProperty('--bim-component-bg-active', theme.componentBgActive ?? 'rgba(248, 250, 252, 0.1)');\n }\n\n public destroy(): void {\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n if (this.element && this.element.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { ManagerRegistry } from '../../core/manager-registry';\nimport type { RoamingPoint } from './types';\n\n/**\n * 路径漫游面板组件\n * 提供漫游点的添加、删除、跳转和播放功能\n */\nexport class WalkPathPanel implements IBimComponent {\n public element!: HTMLElement;\n\n /** 管理器注册表実例 */\n private registry: ManagerRegistry;\n\n /** 管理器注册表实例 */\n /** 国际化订阅取消函数 */\n private unsubscribeLocale: (() => void) | null = null;\n /** 主题订阅取消函数 */\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(registry: ManagerRegistry) {\n this.registry = registry;\n }\n\n\n /** 漫游点列表 */\n private points: RoamingPoint[] = [];\n /** 漫游时间(毫秒) */\n private duration: number = 10000;\n /** 是否循环播放 */\n private loop: boolean = false;\n /** 当前播放中的点索引,-1 表示未播放 */\n private playingPointIndex: number = -1;\n /** 是否正在播放 */\n private isPlaying: boolean = false;\n\n /**\n * 初始化组件\n * 创建 DOM 元素,订阅国际化和主题变化,加载已有漫游点\n */\n public init(): void {\n // 创建根元素\n this.element = document.createElement('div');\n this.element.className = 'walk-path-panel';\n\n // 订阅国际化变化\n this.unsubscribeLocale = localeManager.subscribe(() => this.render());\n // 订阅主题变化\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n // 从引擎加载已有的漫游点\n this.loadPointsFromEngine();\n\n // 渲染界面\n this.render();\n // 应用当前主题\n this.setTheme(themeManager.getTheme());\n }\n\n /**\n * 从引擎加载已有的漫游点\n * 在面板打开时调用,获取底层引擎中已存在的漫游点\n */\n private loadPointsFromEngine(): void {\n const enginePoints = this.registry.engine3d?.pathRoamingGetPoints() ?? [];\n // 将引擎返回的点转换为本地格式\n this.points = enginePoints.map((_: any, index: number) => ({\n index: index\n }));\n }\n\n /**\n * 渲染整个面板\n * 清空现有内容并重新构建界面\n */\n private render(): void {\n this.element.innerHTML = '';\n \n // 渲染路径设置区域\n const settings = this.createSettingsSection();\n this.element.appendChild(settings);\n\n // 渲染漫游点区域\n const pointsSection = this.createPointsSection();\n this.element.appendChild(pointsSection);\n\n // 渲染播放按钮\n const playBtn = this.createPlayButton();\n this.element.appendChild(playBtn);\n }\n\n /**\n * 创建路径设置区域\n * 包含漫游时间和循环播放设置\n */\n private createSettingsSection(): HTMLElement {\n const section = document.createElement('div');\n section.className = 'walk-path-settings';\n\n // ===== 漫游时间 =====\n const durationGroup = document.createElement('div');\n durationGroup.className = 'walk-path-form-group';\n \n const durationLabel = document.createElement('label');\n durationLabel.textContent = t('walkControl.path.duration');\n \n const durationWrapper = document.createElement('div');\n durationWrapper.className = 'walk-path-input-wrapper';\n \n const durationInput = document.createElement('input');\n durationInput.type = 'number';\n durationInput.className = 'walk-path-input';\n durationInput.value = String(this.duration / 1000);\n durationInput.min = '1';\n durationInput.oninput = (e) => {\n // 更新漫游时间,转换为毫秒\n const val = parseInt((e.target as HTMLInputElement).value) || 1;\n this.duration = val * 1000;\n };\n \n const durationUnit = document.createElement('span');\n durationUnit.className = 'walk-path-unit';\n durationUnit.textContent = t('walkControl.path.durationUnit');\n \n durationWrapper.appendChild(durationInput);\n durationWrapper.appendChild(durationUnit);\n durationGroup.appendChild(durationLabel);\n durationGroup.appendChild(durationWrapper);\n\n // ===== 循环播放 =====\n const loopGroup = document.createElement('div');\n loopGroup.className = 'walk-path-form-group walk-path-form-group-inline';\n \n const loopCheckbox = document.createElement('input');\n loopCheckbox.type = 'checkbox';\n loopCheckbox.id = 'walk-path-loop-checkbox';\n loopCheckbox.className = 'walk-path-checkbox';\n loopCheckbox.checked = this.loop;\n loopCheckbox.onchange = (e) => {\n // 更新循环播放状态\n this.loop = (e.target as HTMLInputElement).checked;\n };\n \n const loopLabel = document.createElement('label');\n loopLabel.htmlFor = 'walk-path-loop-checkbox';\n loopLabel.textContent = t('walkControl.path.loop');\n \n loopGroup.appendChild(loopCheckbox);\n loopGroup.appendChild(loopLabel);\n\n section.appendChild(durationGroup);\n section.appendChild(loopGroup);\n\n return section;\n }\n\n /**\n * 创建漫游点区域\n * 包含操作按钮和漫游点列表\n */\n private createPointsSection(): HTMLElement {\n const section = document.createElement('div');\n section.className = 'walk-path-points-section';\n\n // ===== 操作栏 =====\n const toolbar = document.createElement('div');\n toolbar.className = 'walk-path-points-toolbar';\n\n // 添加漫游点按钮\n const addBtn = document.createElement('button');\n addBtn.className = 'walk-path-btn walk-path-btn-small';\n addBtn.textContent = `+ ${t('walkControl.path.addPoint')}`;\n addBtn.onclick = () => this.addPoint();\n\n // 删除全部按钮\n const deleteAllBtn = document.createElement('button');\n deleteAllBtn.className = 'walk-path-btn walk-path-btn-small walk-path-btn-danger';\n deleteAllBtn.textContent = t('walkControl.path.deleteAll');\n deleteAllBtn.onclick = () => this.deleteAllPoints();\n\n toolbar.appendChild(addBtn);\n toolbar.appendChild(deleteAllBtn);\n section.appendChild(toolbar);\n\n // ===== 漫游点列表 =====\n const list = document.createElement('div');\n list.className = 'walk-path-points-list';\n\n if (this.points.length === 0) {\n // 空状态提示\n const empty = document.createElement('div');\n empty.className = 'walk-path-empty';\n empty.textContent = t('walkControl.path.noPoints');\n list.appendChild(empty);\n } else {\n // 渲染每个漫游点\n this.points.forEach((_, index) => {\n const item = this.createPointItem(index);\n list.appendChild(item);\n });\n }\n\n section.appendChild(list);\n return section;\n }\n\n /**\n * 创建单个漫游点项\n * @param index 漫游点索引\n */\n private createPointItem(index: number): HTMLElement {\n const item = document.createElement('div');\n item.className = 'walk-path-point-item';\n // 如果是当前播放的点,添加高亮样式\n if (this.playingPointIndex === index) {\n item.classList.add('walk-path-point-item-active');\n }\n\n // 漫游点名称\n const name = document.createElement('span');\n name.className = 'walk-path-point-name';\n name.textContent = `${t('walkControl.path.point')}${index}`;\n\n // 操作按钮容器\n const actions = document.createElement('div');\n actions.className = 'walk-path-point-actions';\n\n // 跳转按钮\n const jumpBtn = document.createElement('button');\n jumpBtn.className = 'walk-path-btn-icon';\n jumpBtn.innerHTML = '▶';\n jumpBtn.title = t('walkControl.path.play');\n jumpBtn.onclick = (e) => {\n e.stopPropagation();\n this.jumpToPoint(index);\n };\n\n // 删除按钮\n const deleteBtn = document.createElement('button');\n deleteBtn.className = 'walk-path-btn-icon walk-path-btn-icon-danger';\n deleteBtn.innerHTML = '×';\n deleteBtn.onclick = (e) => {\n e.stopPropagation();\n this.deletePoint(index);\n };\n\n actions.appendChild(jumpBtn);\n actions.appendChild(deleteBtn);\n\n item.appendChild(name);\n item.appendChild(actions);\n return item;\n }\n\n /**\n * 创建播放/停止按钮组\n */\n private createPlayButton(): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'walk-path-btn-group';\n\n const playBtn = document.createElement('button');\n playBtn.className = 'walk-path-btn walk-path-btn-play';\n playBtn.textContent = `▶ ${t('walkControl.path.play')}`;\n playBtn.disabled = this.points.length === 0 || this.isPlaying;\n playBtn.onclick = () => this.playPath();\n\n const stopBtn = document.createElement('button');\n stopBtn.className = 'walk-path-btn walk-path-btn-stop';\n stopBtn.textContent = `■ ${t('walkControl.path.stop')}`;\n stopBtn.disabled = !this.isPlaying;\n stopBtn.onclick = () => this.stopPath();\n\n wrapper.appendChild(playBtn);\n wrapper.appendChild(stopBtn);\n return wrapper;\n }\n\n // ==================== 操作方法 ====================\n\n /**\n * 添加漫游点\n * 将当前相机位置添加为新的漫游点\n */\n private addPoint(): void {\n // 调用引擎添加漫游点\n this.registry.engine3d?.pathRoamingAddPoint();\n // 更新本地状态\n const newIndex = this.points.length;\n this.points.push({ index: newIndex });\n // 重新渲染\n this.render();\n }\n\n /**\n * 删除指定漫游点\n * @param index 要删除的漫游点索引\n */\n private deletePoint(index: number): void {\n // 调用引擎删除漫游点\n this.registry.engine3d?.pathRoamingRemovePoint(index);\n // 从本地列表中移除\n this.points.splice(index, 1);\n // 重新索引\n this.points.forEach((p, i) => p.index = i);\n // 重新渲染\n this.render();\n }\n\n /**\n * 删除所有漫游点\n */\n private deleteAllPoints(): void {\n // 调用引擎清除所有漫游点\n this.registry.engine3d?.pathRoamingClearPoints();\n // 清空本地列表\n this.points = [];\n // 重新渲染\n this.render();\n }\n\n /**\n * 跳转到指定漫游点\n * @param index 目标漫游点索引\n */\n private jumpToPoint(index: number): void {\n this.registry.engine3d?.pathRoamingJumpToPoint(index);\n }\n\n /**\n * 播放漫游\n * 按顺序播放所有漫游点\n */\n private playPath(): void {\n if (this.points.length === 0) return;\n\n this.isPlaying = true;\n this.render();\n\n console.log('[WalkPathPanel] 开始播放漫游', { duration: this.duration, loop: this.loop, pointsCount: this.points.length });\n\n this.registry.engine3d?.pathRoamingPlay({\n duration: this.duration,\n loop: this.loop,\n onPointComplete: (pointIndex: number) => {\n console.log('[WalkPathPanel] onPointComplete', { pointIndex });\n this.playingPointIndex = pointIndex;\n this.render();\n },\n onComplete: () => {\n console.log('[WalkPathPanel] onComplete 播放完成');\n this.isPlaying = false;\n this.playingPointIndex = -1;\n this.render();\n }\n });\n }\n\n /**\n * 停止漫游\n */\n private stopPath(): void {\n console.log('[WalkPathPanel] 停止漫游');\n this.registry.engine3d?.pathRoamingStop();\n this.isPlaying = false;\n this.playingPointIndex = -1;\n this.render();\n }\n\n // ==================== 生命周期 ====================\n\n /**\n * 更新国际化文本\n * 当语言切换时重新渲染整个面板\n */\n public setLocales(): void {\n // 重新渲染以更新所有文本\n this.render();\n }\n\n /**\n * 应用主题\n * @param theme 主题配置\n */\n public setTheme(theme: ThemeConfig): void {\n if (!this.element) return;\n // 设置 CSS 变量\n this.element.style.setProperty('--bim-text-primary', theme.textPrimary ?? '#fff');\n this.element.style.setProperty('--bim-text-secondary', theme.textSecondary ?? '#94a3b8');\n this.element.style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n this.element.style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n this.element.style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n }\n\n /**\n * 销毁组件\n * 清理订阅和 DOM 元素\n */\n public destroy(): void {\n // 如果正在播放,先停止\n if (this.isPlaying) {\n this.stopPath();\n }\n // 取消订阅\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n // 移除 DOM 元素\n if (this.element?.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}\n","/**\n * 漫游路径对话框管理器\n * 负责管理漫游路径设置对话框的显示和交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { WalkPathPanel } from '../components/walk-path-panel';\n\n/**\n * 漫游路径对话框管理器\n * 继承自 BaseDialogManager,提供漫游路径配置的对话框管理功能\n */\nexport class WalkPathDialogManager extends BaseDialogManager {\n /** 漫游路径面板实例 */\n private panel: WalkPathPanel | null = null;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n /** 对话框唯一标识 */\n protected get dialogId() { return 'walk-path-dialog'; }\n /** 对话框标题(国际化 key) */\n protected get dialogTitle() { return 'walkControl.path.dialogTitle'; }\n /** 对话框宽度 */\n protected get dialogWidth() { return 300; }\n /** 对话框高度 */\n protected get dialogHeight(): number { return 450; }\n\n /** 初始化 */\n public init(): void {}\n\n /**\n * 获取对话框位置\n * 定位在容器右上角\n */\n protected getDialogPosition() {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const paddingRight = 20;\n const paddingTop = 20;\n const containerWidth = container.clientWidth;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: paddingTop\n };\n }\n\n /** 创建对话框内容 */\n protected createContent(): HTMLElement {\n this.panel = new WalkPathPanel(this.registry);\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框关闭时的回调 */\n protected onDialogClose(): void {\n if (this.registry.walkControl && this.registry.walkControl.panel) {\n this.registry.walkControl.panel.setPathModeActive(false);\n }\n }\n\n /** 销毁前的清理 */\n protected onBeforeDestroy(): void {\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n}\n","/**\n * 漫游控制管理器\n * 负责管理漫游模式的控制面板和相关交互\n */\nimport { BaseManager } from '../core/base-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { WalkControlPanel } from '../components/walk-control-panel';\nimport { WalkPathDialogManager } from './walk-path-dialog-manager';\n\n/**\n * 漫游控制管理器\n * 提供第一人称漫游、路径漫游等功能的控制界面\n */\nexport class WalkControlManager extends BaseManager {\n /** 漫游控制面板实例 */\n public panel: WalkControlPanel | null = null;\n /** 路径漫游对话框管理器 */\n private pathManager: WalkPathDialogManager | null = null;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n /** 初始化管理器 */\n public init(): void {\n this.pathManager = new WalkPathDialogManager(this.registry);\n this.pathManager.init();\n }\n\n /** 显示漫游控制面板 */\n public show(): void {\n if (!this.registry.toolbar) {\n console.warn('Toolbar not initialized');\n return;\n }\n\n this.registry.toolbar.hide();\n\n // 打开漫游面板时,默认激活第一人称模式\n console.log('[WalkControl] 打开漫游面板,激活第一人称模式');\n this.registry.engine3d?.activateFirstPersonMode();\n\n this.panel = new WalkControlPanel({\n onPlanViewToggle: (isActive) => {\n console.log('[WalkControl] 小地图:', isActive);\n this.registry.engine3d?.toggleMiniMap();\n this.emit('walk:plan-view-toggle', { isActive });\n },\n onPathModeToggle: (isActive) => {\n console.log('[WalkControl] 路径漫游:', isActive);\n if (isActive) {\n this.pathManager?.show();\n } else {\n this.pathManager?.hide();\n }\n this.emit('walk:path-mode-toggle', { isActive });\n },\n onWalkModeToggle: (isActive) => {\n console.log('[WalkControl] 第三人称漫游按钮点击:', isActive);\n if (isActive) {\n this.pathManager?.hide();\n alert('第三人称功能开发中');\n }\n this.emit('walk:walk-mode-toggle', { isActive });\n },\n onSpeedChange: (speed) => {\n console.log('[WalkControl] 速度变化:', speed);\n const engineSpeed = speed * 0.1;\n this.registry.engine3d?.setWalkSpeed(engineSpeed);\n this.emit('walk:speed-change', { speed });\n },\n onGravityToggle: (enabled) => {\n console.log('[WalkControl] 重力:', enabled);\n this.registry.engine3d?.setWalkGravity(enabled);\n this.emit('walk:gravity-toggle', { enabled });\n },\n onCollisionToggle: (enabled) => {\n console.log('[WalkControl] 碰撞:', enabled);\n this.registry.engine3d?.setWalkCollision(enabled);\n this.emit('walk:collision-toggle', { enabled });\n },\n onCharacterModelChange: (model) => {\n console.log('[WalkControl] 角色模型:', model);\n },\n onWalkModeChange: (mode) => {\n console.log('[WalkControl] 行走模式:', mode);\n },\n onExit: () => {\n this.hide();\n }\n });\n this.panel.init();\n\n\n\n if (this.registry.container) {\n this.panel.element.style.position = 'absolute';\n this.panel.element.style.bottom = '20px';\n this.panel.element.style.left = '50%';\n this.panel.element.style.transform = 'translateX(-50%)';\n this.panel.element.style.zIndex = '1000';\n\n this.registry.container.appendChild(this.panel.element);\n } else {\n console.warn('[WalkControlManager] Container not found');\n }\n }\n\n /** 隐藏漫游控制面板 */\n public hide(): void {\n this.pathManager?.hide();\n\n console.log('[WalkControl] 关闭漫游面板,退出第一人称模式');\n this.registry.engine3d?.deactivateFirstPersonMode();\n\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n\n if (this.registry.toolbar) {\n this.registry.toolbar.show();\n }\n }\n\n /** 销毁管理器 */\n public destroy(): void {\n this.hide();\n this.pathManager?.destroy();\n this.pathManager = null;\n super.destroy();\n }\n}\n","import { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { t } from '../services/locale';\nimport type { EngineInfo } from '../components/engine';\n\nexport class EngineInfoDialogManager extends BaseDialogManager {\n protected get dialogId() { return 'engine-info-dialog'; }\n protected get dialogTitle() { return 'info.dialogTitle'; }\n protected get dialogWidth() { return 280; }\n\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n public init(): void {}\n\n protected getDialogPosition() {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n return {\n x: (containerWidth - this.dialogWidth) / 2,\n y: (containerHeight - 150) / 2\n };\n }\n\n protected createContent(): HTMLElement {\n const info: EngineInfo | null = this.registry.engine3d?.getEngineInfo() ?? null;\n\n const content = document.createElement('div');\n content.className = 'engine-info-content';\n content.style.cssText = 'padding: 16px;';\n\n const createRow = (label: string, value: number | string) => {\n const row = document.createElement('div');\n row.style.cssText = 'display: flex; justify-content: space-between; margin-bottom: 12px; font-size: 14px;';\n \n const labelEl = document.createElement('span');\n labelEl.style.cssText = 'color: var(--bim-text-secondary, #94a3b8);';\n labelEl.textContent = label;\n \n const valueEl = document.createElement('span');\n valueEl.style.cssText = 'color: var(--bim-text-primary, #fff); font-weight: 500;';\n valueEl.textContent = String(value);\n \n row.appendChild(labelEl);\n row.appendChild(valueEl);\n return row;\n };\n\n content.appendChild(createRow(t('info.meshCount'), info?.meshCount ?? '-'));\n content.appendChild(createRow(t('info.totalTriangles'), info?.totalTriangles ?? '-'));\n content.appendChild(createRow(t('info.totalVertices'), info?.totalVertices ?? '-'));\n\n return content;\n }\n}\n","import { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { t } from '../services/locale';\n\n/** 渲染模式类型 */\ntype RenderMode = 'simple' | 'balance' | 'advanced';\n\n/** 地面类型 */\ntype GroundType = 'none' | 'concrete' | 'grass' | 'tile' | 'water' | 'wood';\n\n/** 环境背景类型 */\ntype EnvironmentType = 'default' | 'outdoor' | 'indoor' | 'night' | 'overcast' | 'studio';\n\n// ======================== 通用样式常量 ========================\n// 全部使用项目主题 CSS 变量(--bim-*),同时提供浅色/深色皆可见的 fallback\n\n/** 分节标签样式 */\nconst SECTION_LABEL_STYLE = 'font-size: 13px; color: var(--bim-text-secondary, #475569); margin-bottom: 8px;';\n\n/** 分隔线样式 —— 使用 --bim-divider,浅色=#e2e8f0,深色=#334155 */\nconst DIVIDER_STYLE = 'height: 1px; background: var(--bim-divider, #e2e8f0); margin: 14px 0;';\n\n/** 设置行样式(标签 + 控件水平排列) */\nconst ROW_STYLE = 'display: flex; align-items: center; justify-content: space-between; gap: 12px;';\n\n/** 滑块输入框右侧数值样式 */\nconst SLIDER_VALUE_STYLE = 'font-size: 12px; color: var(--bim-text-secondary, #475569); min-width: 32px; text-align: right;';\n\n/** 边框颜色 —— 使用 --bim-border-default */\nconst BORDER_COLOR = 'var(--bim-border-default, #e2e8f0)';\n\n/** 输入框/下拉背景 —— 使用 --bim-bg-inset */\nconst INPUT_BG = 'var(--bim-bg-inset, #f1f5f9)';\n\n/** 主色 */\nconst PRIMARY = 'var(--bim-primary, #3b82f6)';\n\n/** 文字主色 */\nconst TEXT_PRIMARY = 'var(--bim-text-primary, #0f172a)';\n\n/** 反色文字 */\nconst TEXT_INVERSE = 'var(--bim-text-inverse, #ffffff)';\n\n/** 悬停背景 */\nconst HOVER_BG = 'var(--bim-component-bg-hover, rgba(0,0,0,0.04))';\n\n/**\n * 设置弹窗管理器\n * 管理全局设置面板,包含渲染模式、边线、地面、对比度/饱和度、光照强度、环境背景等设置项\n */\nexport class SettingDialogManager extends BaseDialogManager {\n protected get dialogId() { return 'setting-dialog'; }\n protected get dialogTitle() { return 'setting.dialogTitle'; }\n protected get dialogWidth() { return 320; }\n\n // ================ 本地 UI 状态(不持久化) ================\n\n /** 边线开关状态 */\n private edgeLineEnabled: boolean = false;\n /** 当前选中的地面类型 */\n private groundType: GroundType = 'none';\n /** 地面大小 */\n private groundSize: number = 100;\n /** 对比度(0-200,100为默认值) */\n private contrastValue: number = 100;\n /** 饱和度(0-200,100为默认值) */\n private saturationValue: number = 100;\n /** 光照强度(0-200,100为默认值) */\n private lightIntensityValue: number = 100;\n /** 当前选中的环境背景 */\n private environmentType: EnvironmentType = 'default';\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n public init(): void { }\n\n /** 对话框居中显示 */\n protected getDialogPosition() {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n return {\n x: (containerWidth - this.dialogWidth) / 2,\n y: Math.max(20, (containerHeight - 520) / 2)\n };\n }\n\n // ======================== 主内容构建 ========================\n\n protected createContent(): HTMLElement {\n // 注入一次全局滑块样式\n this.ensureSliderStyle();\n\n const content = document.createElement('div');\n content.style.cssText = 'padding: 16px; max-height: 480px; overflow-y: auto;';\n\n // 1. 渲染模式(按钮组)\n content.appendChild(this.createRenderModeSection());\n content.appendChild(this.createDivider());\n\n // 2. 边线开关\n content.appendChild(this.createEdgeLineSection());\n content.appendChild(this.createDivider());\n\n // 3. 光照强度\n content.appendChild(this.createSliderSection(\n t('setting.lightIntensity'),\n this.lightIntensityValue,\n 0, 200,\n (v) => { this.lightIntensityValue = v; }\n ));\n\n // 4. 对比度\n content.appendChild(this.createSliderSection(\n t('setting.contrast'),\n this.contrastValue,\n 0, 200,\n (v) => { this.contrastValue = v; }\n ));\n\n // 5. 饱和度\n content.appendChild(this.createSliderSection(\n t('setting.saturation'),\n this.saturationValue,\n 0, 200,\n (v) => { this.saturationValue = v; }\n ));\n content.appendChild(this.createDivider());\n\n // 6. 环境背景(下拉)\n content.appendChild(this.createEnvironmentSection());\n content.appendChild(this.createDivider());\n\n // 7. 显示地面(下拉 + 大小输入)\n content.appendChild(this.createGroundSection());\n\n return content;\n }\n\n // ======================== 分隔线 ========================\n\n /** 创建分隔线 */\n private createDivider(): HTMLElement {\n const div = document.createElement('div');\n div.style.cssText = DIVIDER_STYLE;\n return div;\n }\n\n // ======================== 1. 渲染模式(按钮组) ========================\n\n /** 创建渲染模式按钮组 */\n private createRenderModeSection(): HTMLElement {\n const currentMode = (this.registry.engine3d?.getRenderMode() ?? 'balance') as RenderMode;\n\n const section = document.createElement('div');\n\n // 标签\n const label = document.createElement('div');\n label.style.cssText = SECTION_LABEL_STYLE;\n label.textContent = t('setting.renderMode');\n section.appendChild(label);\n\n // 按钮组容器\n const group = document.createElement('div');\n group.style.cssText = `\n display: flex; gap: 0; border-radius: 6px; overflow: hidden;\n border: 1px solid ${BORDER_COLOR};\n `;\n\n const modes: { key: RenderMode; labelKey: string }[] = [\n { key: 'simple', labelKey: 'setting.modes.simple' },\n { key: 'balance', labelKey: 'setting.modes.balance' },\n { key: 'advanced', labelKey: 'setting.modes.advanced' },\n ];\n\n for (let i = 0; i < modes.length; i++) {\n const mode = modes[i];\n const isActive = mode.key === currentMode;\n\n const btn = document.createElement('div');\n btn.style.cssText = `\n flex: 1; text-align: center; padding: 7px 0; cursor: pointer;\n font-size: 13px; font-weight: 500; transition: all 0.15s;\n background: ${isActive ? PRIMARY : 'transparent'};\n color: ${isActive ? TEXT_INVERSE : TEXT_PRIMARY};\n ${i < modes.length - 1 ? `border-right: 1px solid ${BORDER_COLOR};` : ''}\n `;\n btn.textContent = t(mode.labelKey);\n\n // 悬停效果\n btn.addEventListener('mouseenter', () => {\n if (!isActive) btn.style.background = HOVER_BG;\n });\n btn.addEventListener('mouseleave', () => {\n if (!isActive) btn.style.background = 'transparent';\n });\n\n btn.addEventListener('click', () => {\n this.registry.engine3d?.setRenderMode(mode.key);\n // 重建弹窗以刷新状态\n this.hide();\n this.show();\n });\n\n group.appendChild(btn);\n }\n\n section.appendChild(group);\n return section;\n }\n\n // ======================== 2. 边线开关 ========================\n\n /** 创建边线开关行 */\n private createEdgeLineSection(): HTMLElement {\n const row = document.createElement('div');\n row.style.cssText = ROW_STYLE;\n\n // 标签\n const label = document.createElement('span');\n label.style.cssText = 'font-size: 13px; color: var(--bim-text-secondary, #475569);';\n label.textContent = t('setting.edgeLine');\n row.appendChild(label);\n\n // 开关容器 —— 关闭态使用 --bim-border-strong 保证浅色主题可见\n const toggleOffBg = 'var(--bim-border-strong, #cbd5e1)';\n const toggleOnBg = PRIMARY;\n\n const toggle = document.createElement('div');\n toggle.style.cssText = `\n width: 40px; height: 22px; border-radius: 11px; cursor: pointer;\n position: relative; transition: background 0.2s;\n background: ${this.edgeLineEnabled ? toggleOnBg : toggleOffBg};\n `;\n\n // 滑块圆点\n const knob = document.createElement('div');\n knob.style.cssText = `\n width: 18px; height: 18px; border-radius: 50%;\n background: #fff; position: absolute; top: 2px;\n transition: left 0.2s;\n box-shadow: 0 1px 3px rgba(0,0,0,0.2);\n left: ${this.edgeLineEnabled ? '20px' : '2px'};\n `;\n toggle.appendChild(knob);\n\n toggle.addEventListener('click', () => {\n this.edgeLineEnabled = !this.edgeLineEnabled;\n toggle.style.background = this.edgeLineEnabled ? toggleOnBg : toggleOffBg;\n knob.style.left = this.edgeLineEnabled ? '20px' : '2px';\n });\n\n row.appendChild(toggle);\n return row;\n }\n\n // ======================== 3/4/5. 通用滑块 ========================\n\n /**\n * 创建一个滑块设置区块(标签 + 滑块 + 数值)\n * @param labelText 标签文本\n * @param value 当前值\n * @param min 最小值\n * @param max 最大值\n * @param onChange 值变化回调\n */\n private createSliderSection(\n labelText: string,\n value: number,\n min: number,\n max: number,\n onChange: (val: number) => void\n ): HTMLElement {\n const section = document.createElement('div');\n section.style.cssText = 'margin-bottom: 4px;';\n\n // 上部:标签 + 数值\n const header = document.createElement('div');\n header.style.cssText = ROW_STYLE + ' margin-bottom: 6px;';\n\n const label = document.createElement('span');\n label.style.cssText = 'font-size: 13px; color: var(--bim-text-secondary, #475569);';\n label.textContent = labelText;\n header.appendChild(label);\n\n const valueDisplay = document.createElement('span');\n valueDisplay.style.cssText = SLIDER_VALUE_STYLE;\n valueDisplay.textContent = String(value);\n header.appendChild(valueDisplay);\n\n section.appendChild(header);\n\n // 滑块 —— 轨道使用 --bim-border-strong 保证在浅色/深色下都可见\n const slider = document.createElement('input');\n slider.type = 'range';\n slider.min = String(min);\n slider.max = String(max);\n slider.value = String(value);\n slider.className = 'bim-setting-slider';\n slider.style.cssText = `\n width: 100%; height: 4px; -webkit-appearance: none; appearance: none;\n background: var(--bim-border-strong, #cbd5e1); border-radius: 2px;\n outline: none; cursor: pointer;\n `;\n\n slider.addEventListener('input', () => {\n const v = Number(slider.value);\n valueDisplay.textContent = String(v);\n onChange(v);\n });\n\n section.appendChild(slider);\n return section;\n }\n\n /**\n * 注入全局滑块拇指样式(只注入一次)\n * 使用 ::-webkit-slider-thumb / ::-moz-range-thumb 伪元素\n */\n private ensureSliderStyle(): void {\n if (document.querySelector('#bim-setting-slider-style')) return;\n\n const style = document.createElement('style');\n style.id = 'bim-setting-slider-style';\n style.textContent = `\n .bim-setting-slider::-webkit-slider-thumb {\n -webkit-appearance: none; appearance: none;\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--bim-primary, #3b82f6);\n cursor: pointer;\n border: 2px solid var(--bim-bg-elevated, #fff);\n box-shadow: 0 1px 3px rgba(0,0,0,0.2);\n }\n .bim-setting-slider::-moz-range-thumb {\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--bim-primary, #3b82f6);\n cursor: pointer;\n border: 2px solid var(--bim-bg-elevated, #fff);\n box-shadow: 0 1px 3px rgba(0,0,0,0.2);\n }\n .bim-setting-slider::-moz-range-track {\n background: var(--bim-border-strong, #cbd5e1);\n height: 4px; border-radius: 2px; border: none;\n }\n `;\n document.head.appendChild(style);\n }\n\n // ======================== 6. 环境背景(下拉) ========================\n\n /** 创建环境背景下拉选择区 */\n private createEnvironmentSection(): HTMLElement {\n const section = document.createElement('div');\n\n const label = document.createElement('div');\n label.style.cssText = SECTION_LABEL_STYLE;\n label.textContent = t('setting.environment');\n section.appendChild(label);\n\n const envKeys: EnvironmentType[] = ['default', 'outdoor', 'indoor', 'night', 'overcast', 'studio'];\n\n const select = this.createSelect(\n envKeys.map(key => ({\n value: key,\n label: t(`setting.environments.${key}` as any)\n })),\n this.environmentType,\n (val) => { this.environmentType = val as EnvironmentType; }\n );\n\n section.appendChild(select);\n return section;\n }\n\n // ======================== 7. 显示地面(下拉 + 大小) ========================\n\n /** 创建地面设置区 */\n private createGroundSection(): HTMLElement {\n const section = document.createElement('div');\n\n // 地面类型标签 + 下拉\n const label = document.createElement('div');\n label.style.cssText = SECTION_LABEL_STYLE;\n label.textContent = t('setting.ground');\n section.appendChild(label);\n\n const groundKeys: GroundType[] = ['none', 'concrete', 'grass', 'tile', 'water', 'wood'];\n\n const select = this.createSelect(\n groundKeys.map(key => ({\n value: key,\n label: t(`setting.groundTypes.${key}` as any)\n })),\n this.groundType,\n (val) => {\n this.groundType = val as GroundType;\n // 显示/隐藏大小输入\n sizeRow.style.display = val === 'none' ? 'none' : 'flex';\n }\n );\n section.appendChild(select);\n\n // 大小输入行\n const sizeRow = document.createElement('div');\n sizeRow.style.cssText = ROW_STYLE + ' margin-top: 10px;';\n sizeRow.style.display = this.groundType === 'none' ? 'none' : 'flex';\n\n const sizeLabel = document.createElement('span');\n sizeLabel.style.cssText = 'font-size: 13px; color: var(--bim-text-secondary, #475569);';\n sizeLabel.textContent = t('setting.groundSize');\n sizeRow.appendChild(sizeLabel);\n\n const sizeInput = document.createElement('input');\n sizeInput.type = 'number';\n sizeInput.value = String(this.groundSize);\n sizeInput.min = '1';\n sizeInput.max = '10000';\n sizeInput.style.cssText = `\n width: 80px; padding: 4px 8px; border-radius: 4px;\n border: 1px solid ${BORDER_COLOR};\n background: ${INPUT_BG};\n color: ${TEXT_PRIMARY};\n font-size: 13px; outline: none; text-align: right;\n `;\n sizeInput.addEventListener('input', () => {\n const v = Number(sizeInput.value);\n if (!isNaN(v) && v > 0) {\n this.groundSize = v;\n }\n });\n // 聚焦时高亮边框\n sizeInput.addEventListener('focus', () => {\n sizeInput.style.borderColor = PRIMARY;\n });\n sizeInput.addEventListener('blur', () => {\n sizeInput.style.borderColor = BORDER_COLOR;\n });\n\n sizeRow.appendChild(sizeInput);\n section.appendChild(sizeRow);\n\n return section;\n }\n\n // ======================== 通用下拉框 ========================\n\n /**\n * 创建一个自定义样式的 \n
\n \n \n
\n \n \n \n \n `;\n\n // 获取子元素引用\n this.messagesContainer = el.querySelector('.bim-ai-chat-messages');\n this.textarea = el.querySelector('.bim-ai-textarea');\n\n // 绑定事件\n this.bindEvents(el);\n this.updateQuickPrompts(el);\n\n return el;\n }\n\n /**\n * 绑定事件监听\n * @param el 组件根元素\n */\n private bindEvents(el: HTMLElement): void {\n // 顶部操作按钮事件\n el.querySelectorAll('.bim-ai-chat-action-btn').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const action = (e.currentTarget as HTMLElement).dataset.action;\n switch (action) {\n case 'new':\n this.options.onNewChat?.();\n break;\n case 'history':\n this.options.onHistory?.();\n break;\n case 'settings':\n this.options.onSettings?.();\n break;\n case 'close':\n this.hide();\n this.options.onClose?.();\n break;\n }\n });\n });\n\n // 初始化拖拽功能\n const header = el.querySelector('.bim-ai-chat-header') as HTMLElement;\n if (header) {\n this.initDrag(header);\n }\n\n // 发送按钮点击事件\n const sendBtn = el.querySelector('.bim-ai-send-btn');\n sendBtn?.addEventListener('click', () => this.handleSend());\n\n // 输入框键盘事件:Enter 发送,Shift+Enter 换行\n this.textarea?.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n this.handleSend();\n }\n });\n\n // 输入框自动调整高度\n this.textarea?.addEventListener('input', () => {\n if (this.textarea) {\n this.textarea.style.height = 'auto';\n this.textarea.style.height = Math.min(this.textarea.scrollHeight, 100) + 'px';\n }\n });\n\n // 阻止事件冒泡,避免影响底层 3D 场景\n const stopPropagation = (e: Event) => e.stopPropagation();\n const events = ['click', 'dblclick', 'mousedown', 'mouseup', 'mousemove', 'wheel', 'touchstart', 'touchend', 'touchmove'];\n events.forEach(eventType => {\n el.addEventListener(eventType, stopPropagation, { passive: false });\n });\n }\n\n /**\n * 处理发送消息\n */\n private handleSend(): void {\n if (!this.textarea) return;\n const content = this.textarea.value.trim();\n if (!content) return;\n\n // 清空输入框并重置高度\n this.textarea.value = '';\n this.textarea.style.height = 'auto';\n // 触发回调\n this.options.onSend?.(content);\n }\n\n /**\n * 初始化拖拽功能\n * 使用 requestAnimationFrame 优化性能,避免拖拽卡顿\n * @param header 标题栏元素(拖拽手柄)\n */\n private initDrag(header: HTMLElement): void {\n // 拖拽状态变量\n let startX = 0; // 鼠标起始 X 坐标\n let startY = 0; // 鼠标起始 Y 坐标\n let startLeft = 0; // 元素起始 left 值\n let startTop = 0; // 元素起始 top 值\n let containerW = 0; // 容器宽度\n let containerH = 0; // 容器高度\n let elW = 0; // 元素宽度\n let elH = 0; // 元素高度\n\n /**\n * 鼠标按下事件处理\n */\n const onMouseDown = (e: MouseEvent) => {\n // 如果点击的是操作按钮,不触发拖拽\n if ((e.target as HTMLElement).closest('.bim-ai-chat-action-btn')) return;\n e.preventDefault();\n e.stopPropagation();\n\n // 记录起始状态\n startX = e.clientX;\n startY = e.clientY;\n startLeft = this.element.offsetLeft;\n startTop = this.element.offsetTop;\n\n // 记录容器和元素尺寸(用于边界检测)\n containerW = this.container.clientWidth;\n containerH = this.container.clientHeight;\n elW = this.element.offsetWidth;\n elH = this.element.offsetHeight;\n\n // 添加全局鼠标事件监听(使用 capture 确保优先处理)\n document.addEventListener('mousemove', onMouseMove, { capture: true });\n document.addEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n /**\n * 鼠标移动事件处理\n * 使用 requestAnimationFrame 节流,提升性能\n */\n const onMouseMove = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n // 如果上一帧还没处理完,跳过本次\n if (this.rafId) return;\n\n this.rafId = requestAnimationFrame(() => {\n // 计算鼠标移动的增量\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n\n // 计算新位置\n let newLeft = startLeft + dx;\n let newTop = startTop + dy;\n\n // 边界检测:限制在容器范围内\n const maxLeft = containerW - elW;\n const maxTop = containerH - elH;\n\n newLeft = Math.max(0, Math.min(newLeft, maxLeft));\n newTop = Math.max(0, Math.min(newTop, maxTop));\n\n // 应用新位置\n this.element.style.left = `${newLeft}px`;\n this.element.style.top = `${newTop}px`;\n\n this.rafId = null;\n });\n };\n\n /**\n * 鼠标释放事件处理\n */\n const onMouseUp = () => {\n // 取消未完成的动画帧\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n // 移除全局事件监听\n document.removeEventListener('mousemove', onMouseMove, { capture: true });\n document.removeEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n // 绑定标题栏鼠标按下事件\n header.addEventListener('mousedown', onMouseDown);\n }\n\n /**\n * 更新快捷提示按钮\n * @param el 可选的根元素(初始化时使用)\n */\n private updateQuickPrompts(el?: HTMLElement): void {\n const root = el || this.element;\n const container = root.querySelector('.bim-ai-quick-prompts');\n if (!container || !this.options.quickPrompts) return;\n\n // 渲染快捷提示按钮\n container.innerHTML = this.options.quickPrompts.map(prompt => `\n \n `).join('');\n\n // 绑定点击事件:点击后填充到输入框\n container.querySelectorAll('.bim-ai-quick-prompt').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const promptId = (e.currentTarget as HTMLElement).dataset.promptId;\n const prompt = this.options.quickPrompts?.find(p => p.id === promptId);\n if (prompt && this.textarea) {\n this.textarea.value = t(prompt.label);\n this.textarea.focus();\n }\n });\n });\n }\n\n /**\n * 渲染消息列表\n * 根据消息类型渲染不同的消息卡片\n */\n private renderMessages(): void {\n if (!this.messagesContainer) return;\n\n this.messagesContainer.innerHTML = this.messages.map(msg => {\n switch (msg.type) {\n case 'user':\n return this.renderUserMessage(msg.content);\n case 'ai':\n return this.renderAiMessage(msg.content);\n case 'step':\n return this.renderStepMessage(msg.status, msg.content);\n case 'thinking':\n return this.renderThinkingMessage();\n case 'question':\n return msg.answered\n ? this.renderAnsweredQuestion(msg)\n : this.renderActiveQuestion(msg);\n default:\n return '';\n }\n }).join('');\n\n // 重新绑定问答卡片的事件\n this.bindQuestionEvents();\n }\n\n /**\n * 渲染用户消息气泡\n */\n private renderUserMessage(content: string): string {\n return `\n
\n
\n
${this.escapeHtml(content)}
\n
\n
\n `;\n }\n\n /**\n * 渲染 AI 消息气泡\n */\n private renderAiMessage(content: string): string {\n return `\n
\n
\n
${this.escapeHtml(content)}
\n
\n
\n `;\n }\n\n /**\n * 渲染步骤消息卡片\n * @param status 状态:running/done/error\n * @param content 步骤描述\n */\n private renderStepMessage(status: StepStatus, content: string): string {\n // 状态对应的图标映射\n const iconMap: Record = {\n running: 'loader',\n done: 'check',\n error: 'error'\n };\n return `\n
\n ${getIcon(iconMap[status])}\n ${this.escapeHtml(content)}\n
\n `;\n }\n\n /**\n * 渲染思考中卡片\n */\n private renderThinkingMessage(): string {\n return `\n
\n ${getIcon('loader')}\n ${t('aiChat.thinking')}\n
\n `;\n }\n\n /**\n * 渲染未回答的问答卡片\n * @param msg 问答消息对象\n */\n private renderActiveQuestion(msg: QuestionMessage): string {\n // 渲染选项列表\n const optionsHtml = msg.options.map(opt => `\n
\n
\n
\n
\n ${opt.isOther ? t('aiChat.other') : this.escapeHtml(opt.label)}\n
\n ${opt.isOther && msg.selectedOptionId === opt.id ? `\n \n ` : ''}\n `).join('');\n\n return `\n
\n
\n
${getIcon('bot')}
\n ${this.escapeHtml(msg.title)}\n
\n
\n
${this.escapeHtml(msg.question)}
\n
${optionsHtml}
\n
\n
\n \n
\n
\n `;\n }\n\n /**\n * 渲染已回答的问答卡片(简洁模式)\n * @param msg 问答消息对象\n */\n private renderAnsweredQuestion(msg: QuestionMessage): string {\n const selectedOption = msg.options.find(o => o.id === msg.selectedOptionId);\n const answer = selectedOption?.isOther ? msg.customAnswer : selectedOption?.label;\n\n return `\n
\n
\n
Q
\n ${this.escapeHtml(msg.question)}\n
\n
\n
A
\n ${this.escapeHtml(answer || '')}\n
\n
\n `;\n }\n\n /**\n * 绑定问答卡片的交互事件\n * 包括:选项点击、自定义输入、提交按钮\n */\n private bindQuestionEvents(): void {\n // 选项点击事件\n this.messagesContainer?.querySelectorAll('.bim-ai-option').forEach(option => {\n option.addEventListener('click', (e) => {\n const target = e.currentTarget as HTMLElement;\n const questionId = target.dataset.questionId;\n const optionId = target.dataset.optionId;\n\n if (questionId && optionId) {\n const msg = this.messages.find(m => m.id === questionId) as QuestionMessage;\n if (msg && !msg.answered) {\n msg.selectedOptionId = optionId;\n this.renderMessages();\n }\n }\n });\n });\n\n // 自定义输入框事件\n this.messagesContainer?.querySelectorAll('.bim-ai-option-input').forEach(input => {\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement;\n const questionId = target.dataset.questionId;\n\n if (questionId) {\n const msg = this.messages.find(m => m.id === questionId) as QuestionMessage;\n if (msg) {\n msg.customAnswer = target.value;\n }\n }\n });\n });\n\n // 提交按钮事件\n this.messagesContainer?.querySelectorAll('.bim-ai-question-submit').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const target = e.currentTarget as HTMLElement;\n const questionId = target.dataset.questionId;\n\n if (questionId) {\n const msg = this.messages.find(m => m.id === questionId) as QuestionMessage;\n if (msg && msg.selectedOptionId) {\n msg.answered = true;\n this.renderMessages();\n this.options.onQuestionSubmit?.(questionId, msg.selectedOptionId, msg.customAnswer);\n }\n }\n });\n });\n }\n\n /**\n * 滚动消息列表到底部\n */\n private scrollToBottom(): void {\n if (this.messagesContainer) {\n this.messagesContainer.scrollTop = this.messagesContainer.scrollHeight;\n }\n }\n\n /**\n * HTML 转义,防止 XSS 攻击\n * @param str 原始字符串\n * @returns 转义后的字符串\n */\n private escapeHtml(str: string): string {\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n /**\n * 销毁组件\n * 取消订阅并移除 DOM 元素\n */\n public destroy(): void {\n if (this._isDestroyed) return;\n\n // 取消主题订阅\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n\n // 取消语言订阅\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n\n // 移除 DOM 元素\n this.element.remove();\n this._isDestroyed = true;\n }\n}\n","/**\n * AI 聊天管理器\n * 负责管理 AI 聊天抽屉的显示、隐藏和消息交互\n */\nimport { AiChat } from '../components/ai-chat';\nimport type { Message, QuestionOption, StepStatus } from '../components/ai-chat/types';\nimport { ManagerRegistry } from '../core/manager-registry';\n\n/**\n * AI 聊天管理器\n * 管理 AI 聊天组件的生命周期和消息交互\n */\nexport class AiChatManager {\n /** AI 聊天组件实例 */\n private aiChat: AiChat | null = null;\n /** Manager 注册表 */\n private registry: ManagerRegistry;\n /** 是否已初始化 */\n private initialized = false;\n\n constructor(registry: ManagerRegistry) {\n this.registry = registry;\n }\n\n /**\n * 初始化 AI 聊天组件\n * 创建 AiChat 实例并注册事件\n */\n public init(): void {\n if (this.initialized) return;\n\n const wrapper = this.registry.wrapper;\n if (!wrapper) {\n console.warn('[AiChatManager] wrapper 不存在,无法初始化');\n return;\n }\n\n this.aiChat = new AiChat({\n container: wrapper,\n width: 440,\n title: 'aiChat.title',\n placeholder: 'aiChat.placeholder',\n quickPrompts: [\n { id: 'summarize', label: 'aiChat.quickPrompt.summarize' },\n { id: 'explain', label: 'aiChat.quickPrompt.explain' },\n { id: 'generate', label: 'aiChat.quickPrompt.generate' }\n ],\n onSend: (message) => {\n console.log('[AiChatManager] 用户发送消息:', message);\n this.aiChat?.addUserMessage(message);\n this.registry.emit('aiChat:message-sent', { message });\n },\n onQuestionSubmit: (questionId, optionId, customAnswer) => {\n console.log('[AiChatManager] 用户回答问题:', { questionId, optionId, customAnswer });\n this.registry.emit('aiChat:question-answered', { questionId, optionId, customAnswer });\n },\n onNewChat: () => {\n console.log('[AiChatManager] 新建对话');\n this.registry.emit('aiChat:new-chat', {});\n },\n onHistory: () => {\n console.log('[AiChatManager] 打开历史');\n this.registry.emit('aiChat:history-opened', {});\n },\n onSettings: () => {\n console.log('[AiChatManager] 打开设置');\n this.registry.emit('aiChat:settings-opened', {});\n },\n onClose: () => {\n console.log('[AiChatManager] 关闭 AI 聊天');\n this.registry.emit('aiChat:closed', {});\n this.registry.toolbar?.setBtnActive('aiChat', false);\n }\n });\n\n this.initialized = true;\n }\n\n /**\n * 显示 AI 聊天抽屉\n */\n public show(): void {\n if (!this.aiChat) {\n this.init();\n }\n this.aiChat?.show();\n this.registry.emit('aiChat:opened', {});\n this.registry.toolbar?.setBtnActive('aiChat', true);\n }\n\n /**\n * 隐藏 AI 聊天抽屉\n */\n public hide(): void {\n this.aiChat?.hide();\n this.registry.emit('aiChat:closed', {});\n this.registry.toolbar?.setBtnActive('aiChat', false);\n }\n\n /**\n * 切换 AI 聊天抽屉显示状态\n */\n public toggle(): void {\n if (this.aiChat?.isVisible()) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /**\n * 检查 AI 聊天抽屉是否可见\n */\n public isVisible(): boolean {\n return this.aiChat?.isVisible() ?? false;\n }\n\n /**\n * 添加用户消息\n * @param content 消息内容\n * @returns 消息 ID\n */\n public addUserMessage(content: string): string {\n return this.aiChat?.addUserMessage(content) ?? '';\n }\n\n /**\n * 添加 AI 消息\n * @param content 消息内容\n * @returns 消息 ID\n */\n public addAiMessage(content: string): string {\n return this.aiChat?.addAiMessage(content) ?? '';\n }\n\n /**\n * 添加步骤消息\n * @param status 步骤状态\n * @param content 步骤描述\n * @returns 消息 ID\n */\n public addStepMessage(status: StepStatus, content: string): string {\n return this.aiChat?.addStepMessage(status, content) ?? '';\n }\n\n /**\n * 添加思考中消息\n * @returns 消息 ID\n */\n public addThinkingMessage(): string {\n return this.aiChat?.addThinkingMessage() ?? '';\n }\n\n /**\n * 添加问答卡片消息\n * @param title 问题标题\n * @param question 问题内容\n * @param options 选项列表\n * @returns 消息 ID\n */\n public addQuestionMessage(title: string, question: string, options: QuestionOption[]): string {\n return this.aiChat?.addQuestionMessage(title, question, options) ?? '';\n }\n\n /**\n * 更新消息\n * @param id 消息 ID\n * @param updates 更新内容\n */\n public updateMessage(id: string, updates: Partial): void {\n this.aiChat?.updateMessage(id, updates);\n }\n\n /**\n * 删除消息\n * @param id 消息 ID\n */\n public removeMessage(id: string): void {\n this.aiChat?.removeMessage(id);\n }\n\n /**\n * 清空所有消息\n */\n public clearMessages(): void {\n this.aiChat?.clearMessages();\n }\n\n /**\n * 销毁 AI 聊天管理器\n */\n public destroy(): void {\n if (this.aiChat) {\n this.aiChat.destroy();\n this.aiChat = null;\n }\n this.initialized = false;\n }\n}\n","/**\n * 事件发射器\n * 提供简单的发布/订阅模式实现\n */\n\n/** 事件监听器类型 */\ntype Listener = (payload: T) => void;\n\n/**\n * 事件发射器类\n * 用于组件间的事件通信\n */\nexport class EventEmitter {\n /** 事件监听器映射表 */\n private events: Map = new Map();\n\n /**\n * 订阅事件\n * @param event 事件名称\n * @param listener 事件处理函数\n * @returns 取消订阅的函数\n */\n public on(event: string, listener: Listener): () => void {\n if (!this.events.has(event)) {\n this.events.set(event, []);\n }\n this.events.get(event)!.push(listener);\n\n return () => this.off(event, listener);\n }\n\n /**\n * 取消订阅事件\n * @param event 事件名称\n * @param listener 要移除的事件处理函数\n */\n public off(event: string, listener: Listener): void {\n const listeners = this.events.get(event);\n if (!listeners) return;\n\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n\n /**\n * 发送事件\n * @param event 事件名称\n * @param payload 事件数据\n */\n public emit(event: string, payload?: any): void {\n const listeners = this.events.get(event);\n if (listeners) {\n listeners.forEach(listener => {\n try {\n listener(payload);\n } catch (error) {\n console.error(`[EventEmitter] Error in listener for event \"${event}\":`, error);\n }\n });\n }\n }\n\n /** 清除所有事件监听器 */\n public clear(): void {\n this.events.clear();\n }\n}\n","/**\n * Manager 注册表\n * 每个 BimEngine 实例持有独立的 Registry,实现多实例隔离\n */\nimport { EventEmitter } from './event-emitter';\nimport type { EngineEvents } from '../types/events';\n\nimport type { ToolbarManager } from '../managers/toolbar-manager';\nimport type { DialogManager } from '../managers/dialog-manager';\nimport type { EngineManager } from '../managers/engine-manager';\nimport type { ButtonGroupManager } from '../managers/button-group-manager';\nimport type { RightKeyManager } from '../managers/right-key-manager';\nimport type { ConstructTreeManagerBtn } from '../managers/construct-tree-manager-btn';\n\nimport type { MeasureDialogManager } from '../managers/measure-dialog-manager';\nimport type { WalkControlManager } from '../managers/walk-control-manager';\nimport type { SectionPlaneDialogManager } from '../managers/section-plane-dialog-manager';\nimport type { SectionAxisDialogManager } from '../managers/section-axis-dialog-manager';\nimport type { SectionBoxDialogManager } from '../managers/section-box-dialog-manager';\nimport type { WalkPathDialogManager } from '../managers/walk-path-dialog-manager';\nimport type { WalkPlanViewDialogManager } from '../managers/walk-plan-view-dialog-manager';\nimport type { EngineInfoDialogManager } from '../managers/engine-info-dialog-manager';\nimport type { SettingDialogManager } from '../managers/setting-dialog-manager';\nimport type { ComponentDetailManager } from '../managers/component-detail-manager';\nimport type { AiChatManager } from '../managers/ai-chat-manager';\n\n/**\n * Manager 注册表 - 实例模式\n * 每个 BimEngine 创建独立的 Registry 实例,替代旧的全局单例\n */\nexport class ManagerRegistry {\n /** 事件发射器 */\n private eventEmitter: EventEmitter = new EventEmitter();\n\n /** 主容器元素 */\n public container: HTMLElement | null = null;\n /** 包装容器元素 */\n public wrapper: HTMLElement | null = null;\n\n /** 工具栏管理器 */\n public toolbar: ToolbarManager | null = null;\n /** 对话框管理器 */\n public dialog: DialogManager | null = null;\n /** 3D 引擎管理器 */\n public engine3d: EngineManager | null = null;\n /** 按钮组管理器 */\n public buttonGroup: ButtonGroupManager | null = null;\n /** 右键菜单管理器 */\n public rightKey: RightKeyManager | null = null;\n /** 构件树管理器 */\n public constructTree: ConstructTreeManagerBtn | null = null;\n\n /** 测量对话框管理器 */\n public measure: MeasureDialogManager | null = null;\n /** 漫游控制管理器 */\n public walkControl: WalkControlManager | null = null;\n /** 拾取面剖切对话框管理器 */\n public sectionPlane: SectionPlaneDialogManager | null = null;\n /** 轴向剖切对话框管理器 */\n public sectionAxis: SectionAxisDialogManager | null = null;\n /** 剖切盒对话框管理器 */\n public sectionBox: SectionBoxDialogManager | null = null;\n /** 漫游路径对话框管理器 */\n public walkPath: WalkPathDialogManager | null = null;\n /** 漫游平面图对话框管理器 */\n public walkPlanView: WalkPlanViewDialogManager | null = null;\n /** 引擎信息对话框管理器 */\n public engineInfo: EngineInfoDialogManager | null = null;\n /** 构件详情管理器 */\n public componentDetail: ComponentDetailManager | null = null;\n /** AI 聊天管理器 */\n public aiChat: AiChatManager | null = null;\n /** 设置对话框管理器 */\n public setting: SettingDialogManager | null = null;\n\n constructor() {}\n\n /** 重置(清理事件和引用) */\n public reset(): void {\n this.eventEmitter.clear();\n this.container = null;\n this.wrapper = null;\n this.toolbar = null;\n this.dialog = null;\n this.engine3d = null;\n this.buttonGroup = null;\n this.rightKey = null;\n this.constructTree = null;\n this.measure = null;\n this.walkControl = null;\n this.sectionPlane = null;\n this.sectionAxis = null;\n this.sectionBox = null;\n this.walkPath = null;\n this.walkPlanView = null;\n this.engineInfo = null;\n this.componentDetail = null;\n this.aiChat = null;\n this.setting = null;\n }\n\n /**\n * 发送事件\n * @param event 事件名称\n * @param payload 事件数据\n */\n public emit(event: K, payload: EngineEvents[K]): void {\n this.eventEmitter.emit(event, payload);\n }\n\n /**\n * 订阅事件\n * @param event 事件名称\n * @param listener 事件处理函数\n * @returns 取消订阅的函数\n */\n public on(\n event: K,\n listener: (payload: EngineEvents[K]) => void\n ): () => void {\n return this.eventEmitter.on(event, listener);\n }\n\n /**\n * 取消订阅事件\n * @param event 事件名称\n * @param listener 事件处理函数\n */\n public off(\n event: K,\n listener: (payload: EngineEvents[K]) => void\n ): void {\n this.eventEmitter.off(event, listener);\n }\n\n /** 清除所有事件监听器 */\n public clearEvents(): void {\n this.eventEmitter.clear();\n }\n}\n","declare const __APP_VERSION__: string;\nimport './bim-engine.css';\nimport { ToolbarManager } from './managers/toolbar-manager';\nimport { ButtonGroupManager } from './managers/button-group-manager';\nimport { DialogManager } from './managers/dialog-manager';\nimport { EngineManager } from './managers/engine-manager';\nimport { RightKeyManager } from './managers/right-key-manager';\nimport { ConstructTreeManagerBtn } from './managers/construct-tree-manager-btn';\n\nimport { MeasureDialogManager } from './managers/measure-dialog-manager';\nimport { SectionPlaneDialogManager } from './managers/section-plane-dialog-manager';\nimport { SectionAxisDialogManager } from './managers/section-axis-dialog-manager';\nimport { SectionBoxDialogManager } from './managers/section-box-dialog-manager';\nimport { WalkControlManager } from './managers/walk-control-manager';\nimport { EngineInfoDialogManager } from './managers/engine-info-dialog-manager';\nimport { SettingDialogManager } from './managers/setting-dialog-manager';\nimport { ComponentDetailManager } from './managers/component-detail-manager';\nimport { AiChatManager } from './managers/ai-chat-manager';\nimport type { EngineOptions, ModelLoadOptions } from './components/engine';\nimport { localeManager } from './services/locale';\nimport { themeManager } from './services/theme';\nimport type { LocaleType } from './locales/types';\nimport type { ThemeType, ThemeConfig } from './themes/types';\nimport { ManagerRegistry } from './core/manager-registry';\nimport { EngineEvents } from './types/events';\n\nexport type { EngineOptions, ModelLoadOptions };\n\nexport class BimEngine {\n public container: HTMLElement;\n private wrapper: HTMLElement | null = null;\n private registry: ManagerRegistry;\n\n public toolbar: ToolbarManager | null = null;\n public constructTreeBtn: ConstructTreeManagerBtn | null = null;\n public buttonGroup: ButtonGroupManager | null = null;\n public dialog: DialogManager | null = null;\n public engine: EngineManager | null = null;\n public rightKey: RightKeyManager | null = null;\n\n public measure: MeasureDialogManager | null = null;\n public sectionPlane: SectionPlaneDialogManager | null = null;\n public sectionAxis: SectionAxisDialogManager | null = null;\n public sectionBox: SectionBoxDialogManager | null = null;\n public walkControl: WalkControlManager | null = null;\n public engineInfo: EngineInfoDialogManager | null = null;\n public componentDetail: ComponentDetailManager | null = null;\n public aiChat: AiChatManager | null = null;\n public setting: SettingDialogManager | null = null;\n\n constructor(\n container: HTMLElement | string,\n options?: {\n locale?: LocaleType;\n theme?: ThemeType;\n }\n ) {\n const el = typeof container === 'string' ? document.getElementById(container) : container;\n if (!el) throw new Error('Container not found');\n this.container = el;\n\n this.registry = new ManagerRegistry();\n\n if (options?.locale) localeManager.setLocale(options.locale);\n if (options?.theme) {\n if (options.theme === 'custom') {\n console.warn('Custom theme should be set via setCustomTheme().');\n } else {\n themeManager.setTheme(options.theme);\n }\n }\n\n this.init();\n }\n\n public emit(event: K, payload: EngineEvents[K]) {\n this.registry.emit(event, payload);\n }\n\n public on(event: K, listener: (payload: EngineEvents[K]) => void): () => void {\n return this.registry.on(event, listener);\n }\n\n public setLocale(locale: LocaleType) {\n localeManager.setLocale(locale);\n }\n\n public getLocale(): LocaleType {\n return localeManager.getLocale();\n }\n\n public setTheme(theme: 'dark' | 'light') {\n themeManager.setTheme(theme);\n }\n\n public setCustomTheme(theme: ThemeConfig) {\n themeManager.setCustomTheme(theme);\n }\n\n private init() {\n this.container.innerHTML = '';\n this.wrapper = document.createElement('div');\n this.wrapper.className = 'bim-engine-wrapper';\n this.container.appendChild(this.wrapper);\n\n const versionEl = document.createElement('div');\n versionEl.className = 'bim-engine-version';\n versionEl.textContent = `v${__APP_VERSION__}`;\n this.wrapper.appendChild(versionEl);\n\n this.registry.container = this.container;\n this.registry.wrapper = this.wrapper;\n\n this.engine = new EngineManager(this.wrapper, this.registry);\n this.dialog = new DialogManager(this.wrapper, this.registry);\n this.toolbar = new ToolbarManager(this.wrapper, this.registry);\n this.buttonGroup = new ButtonGroupManager(this.wrapper, this.registry);\n this.rightKey = new RightKeyManager(this.wrapper, this.registry);\n this.constructTreeBtn = new ConstructTreeManagerBtn(this.wrapper, this.registry);\n\n this.measure = new MeasureDialogManager(this.registry);\n this.sectionPlane = new SectionPlaneDialogManager(this.registry);\n this.sectionAxis = new SectionAxisDialogManager(this.registry);\n this.sectionBox = new SectionBoxDialogManager(this.registry);\n this.walkControl = new WalkControlManager(this.registry);\n this.walkControl.init();\n this.engineInfo = new EngineInfoDialogManager(this.registry);\n this.engineInfo.init();\n\n this.registry.engine3d = this.engine;\n this.registry.dialog = this.dialog;\n this.registry.toolbar = this.toolbar;\n this.registry.buttonGroup = this.buttonGroup;\n this.registry.rightKey = this.rightKey;\n this.registry.constructTree = this.constructTreeBtn;\n\n this.registry.measure = this.measure;\n this.registry.sectionPlane = this.sectionPlane;\n this.registry.sectionAxis = this.sectionAxis;\n this.registry.sectionBox = this.sectionBox;\n this.registry.walkControl = this.walkControl;\n this.registry.engineInfo = this.engineInfo;\n\n this.componentDetail = new ComponentDetailManager(this.registry);\n this.registry.componentDetail = this.componentDetail;\n this.componentDetail.init();\n\n this.aiChat = new AiChatManager(this.registry);\n this.registry.aiChat = this.aiChat;\n this.aiChat.init();\n\n this.setting = new SettingDialogManager(this.registry);\n this.registry.setting = this.setting;\n this.setting.init();\n\n this.updateTheme(themeManager.getTheme());\n themeManager.subscribe((theme) => {\n this.updateTheme(theme);\n });\n }\n\n private updateTheme(theme: ThemeConfig) {\n if (this.wrapper) {\n this.wrapper.style.color = theme.textPrimary;\n }\n }\n\n public destroy() {\n this.toolbar?.destroy();\n this.buttonGroup?.destroy();\n this.engine?.destroy();\n this.dialog?.destroy();\n this.rightKey?.destroy();\n\n this.measure?.destroy();\n this.sectionPlane?.destroy();\n this.sectionAxis?.destroy();\n this.sectionBox?.destroy();\n this.walkControl?.destroy();\n this.aiChat?.destroy();\n this.setting?.destroy();\n this.container.innerHTML = '';\n this.registry.reset();\n }\n}\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createHomeButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'home',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.home',\n icon: getIcon('主视角'),\n keepActive: false,\n onClick: (button) => {\n console.log('首页按钮被点击:', button.id);\n registry.engine3d?.CameraGoHome();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createZoomBoxButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'zoom-box',\n groupId: 'group-1',\n keepActive: false,\n type: 'button',\n label: 'toolbar.zoomBox',\n icon: getIcon('框选放大'),\n onClick: () => {\n registry.engine3d?.activateZoomBox();\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createWalkMenuButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'walk',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.walk',\n align: 'vertical',\n icon: getIcon('漫游'),\n onClick: () => {\n console.log('漫游按钮被点击');\n registry.walkControl?.show();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createMapButton = (registry: ManagerRegistry): ButtonConfig => {\n\n\n return {\n id: 'map',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.map',\n align: 'vertical',\n keepActive: true,\n icon: getIcon('地图'),\n onClick: () => {\n registry.engine3d?.toggleMiniMap();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createPropertyButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'property',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.property',\n align: 'vertical',\n icon: getIcon('文档'),\n onClick: () => {\n console.log('构件详情按钮被点击');\n registry.componentDetail?.show();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createSettingButton = (registry?: ManagerRegistry): ButtonConfig => {\n return {\n id: 'setting',\n groupId: 'group-2',\n type: 'button',\n label: 'toolbar.setting',\n icon: getIcon('设置'),\n keepActive: false,\n onClick: (_button) => {\n registry?.setting?.toggle();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createInfoButton = (registry: ManagerRegistry): ButtonConfig => {\n\n \n return {\n id: 'info',\n groupId: 'group-2',\n type: 'button',\n label: 'toolbar.info',\n icon: getIcon('信息'),\n keepActive: false,\n onClick: () => {\n registry.engineInfo?.show();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createFullscreenButton = (_registry?: ManagerRegistry): ButtonConfig => {\n return {\n id: 'fullscreen',\n groupId: 'group-2',\n type: 'button',\n label: 'toolbar.fullscreen',\n align: 'vertical',\n icon: getIcon('全屏'),\n onClick: async () => {\n console.log('全屏按钮被点击');\n\n const isIframe = window.self !== window.top;\n if (isIframe) {\n console.warn('检测到在 Iframe 中运行,请确保父级 iframe 标签拥有 allow=\"fullscreen\" 属性');\n }\n\n try {\n const doc = document as any;\n const fullscreenElement = doc.fullscreenElement ||\n doc.webkitFullscreenElement ||\n doc.mozFullScreenElement ||\n doc.msFullscreenElement;\n\n const isFullscreen = !!fullscreenElement;\n console.log('当前是否全屏:', isFullscreen);\n\n const bimContainer = document.querySelector('.bim-engine-container') as HTMLElement;\n const targetElem = bimContainer || document.body;\n const el = targetElem as any;\n\n if (!isFullscreen) {\n console.log('准备进入全屏...');\n\n if (targetElem.style.backgroundColor === '' || targetElem.style.backgroundColor === 'transparent') {\n targetElem.style.backgroundColor = '#ffffff';\n }\n\n const requestMethod = el.requestFullscreen ||\n el.webkitRequestFullscreen ||\n el.mozRequestFullScreen ||\n el.msRequestFullscreen;\n\n if (requestMethod) {\n await requestMethod.call(el, { navigationUI: 'hide' });\n console.log('全屏请求已发送');\n } else {\n console.warn('当前浏览器不支持全屏 API');\n alert('当前浏览器不支持全屏功能');\n }\n } else {\n console.log('准备退出全屏...');\n\n const exitMethod = doc.exitFullscreen ||\n doc.webkitExitFullscreen ||\n doc.mozCancelFullScreen ||\n doc.msExitFullscreen;\n\n if (exitMethod) {\n await exitMethod.call(doc);\n console.log('退出全屏请求已发送');\n }\n }\n } catch (error: any) {\n console.error('全屏操作失败:', error);\n if (error && error.message && error.message.includes('denied')) {\n console.error('全屏请求被拒绝。如果是 Iframe,请检查 allow=\"fullscreen\"。如果是自动触发,请确保由用户点击触发。');\n }\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createMeasureButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'measure',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.measure',\n icon: getIcon('测量'),\n keepActive: true,\n onClick: (button) => {\n if (button.isActive) {\n registry.measure?.show();\n } else {\n registry.measure?.destroy();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionMenuButton = (_registry?: ManagerRegistry): ButtonConfig => {\n return {\n id: 'section',\n groupId: 'group-1',\n type: 'menu',\n label: 'toolbar.section',\n align: 'vertical',\n icon: getIcon('剖切'),\n keepActive: true,\n onClick: (button) => {\n console.log('剖切按钮被点击:', button.id);\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionPlaneButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'section-plane',\n groupId: 'group-1',\n parentId: 'section',\n type: 'button',\n keepActive: true,\n exclusive: true,\n align: 'vertical',\n label: 'toolbar.sectionPlane',\n icon: getIcon('拾曲面剖切'),\n onClick: (button) => {\n console.log('拾取面剖切被点击:', button.id, '激活状态:', button.isActive);\n if (button.isActive) {\n registry.sectionPlane?.show();\n } else {\n registry.sectionPlane?.hide();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionAxisButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'section-axis',\n groupId: 'group-1',\n parentId: 'section',\n type: 'button',\n keepActive: true,\n exclusive: true,\n align: 'vertical',\n label: 'toolbar.sectionAxis',\n icon: getIcon('轴向剖切'),\n onClick: (button) => {\n if (button.isActive) {\n registry.sectionAxis?.show();\n } else {\n registry.sectionAxis?.destroy();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionBoxButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'section-box',\n groupId: 'group-1',\n parentId: 'section',\n type: 'button',\n keepActive: true,\n exclusive: true,\n align: 'vertical',\n label: 'toolbar.sectionBox',\n icon: getIcon('剖切盒'),\n onClick: (button) => {\n console.log('剖切盒被点击:', button.id, '激活状态:', button.isActive);\n if (button.isActive) {\n registry.sectionBox?.show();\n } else {\n registry.sectionBox?.hide();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createAiChatButton = (registry: ManagerRegistry): ButtonConfig => {\n\n\n registry.on('aiChat:opened', () => {\n registry.toolbar?.setBtnActive('aiChat', true);\n });\n\n registry.on('aiChat:closed', () => {\n registry.toolbar?.setBtnActive('aiChat', false);\n });\n\n return {\n id: 'aiChat',\n groupId: 'group-2',\n type: 'button',\n label: 'aiChat.title',\n align: 'vertical',\n keepActive: true,\n icon: getIcon('bot'),\n onClick: () => {\n registry.aiChat?.toggle();\n }\n };\n};\n","const n = `# BIM引擎AI助手 - 需求分析与步骤规划专家\n\n## 角色定位\n\n你是一位资深的**AI+BIM轻量化引擎架构专家**,具备以下核心能力:\n\n1. **深度理解BIM引擎架构**:精通BIM引擎的模块化设计、API体系、数据结构和交互模式\n2. **需求分析能力**:能够准确理解用户意图,识别模糊需求,提出精准的澄清问题\n3. **任务分解能力**:将复杂需求拆解为可执行的、原子化的操作步骤\n4. **技术决策能力**:根据需求特点选择最优的API组合和实现路径\n\n你的职责是通过分析用户需求,生成结构化的执行步骤,指导代码生成模块完成BIM引擎的功能实现。\n\n## 工作流程\n\n如果存在疑问,你就不能输出最终的步骤,只有当你把所有的疑问清楚后,你才可以输出步骤,如果存在疑问,你要以bim模型为载体,不能问一下和bim模型不想干的问题,尽量没有或减少问题\n\n### 阶段一:需求理解与分析\n\n当接收到用户需求时,你需要:\n\n1. **深度分析需求**:\n - 理解用户的核心目标\n - 识别涉及到的BIM引擎模块(场景、相机、模型、测量、剖切等)\n - 分析数据流向和依赖关系\n - 评估需求的复杂度和可行性\n\n2. **识别模糊点**:\n - 检查需求中是否存在歧义、缺失信息或边界条件不明确的情况\n - 判断是否需要用户澄清才能继续\n\n3. **决策是否需要提问**:\n - **仅在必要时提问**:如果需求足够清晰,直接进入步骤规划阶段\n - **避免过度提问**:不要为了提问而提问,不要询问可以从上下文推断的信息\n - **精准提问**:每个问题都应该针对关键决策点,影响后续实现路径\n\n### 阶段二:需求澄清(如需要)\n\n如果需要用户澄清,请按照以下格式输出:\n\n**输出格式**:\n\\`\\`\\`\n##question## \njson内容\n\\`\\`\\`\n\n**JSON格式规范**:\n\\`\\`\\`json\n[\n {\n \"id\": 0,\n \"question\": \"您是否需要设置所有的构件?\",\n \"answers\": [\n \"A. 是的,设置所有构件\",\n \"B. 只设置1F层的构件\",\n \"C. 根据特定条件筛选构件\"\n ]\n },\n {\n \"id\": 1,\n \"question\": \"颜色设置的优先级是什么?\",\n \"answers\": [\n \"A. 按构件类型设置\",\n \"B. 按楼层设置\",\n \"C. 按自定义属性设置\"\n ]\n }\n]\n\\`\\`\\`\n\n**提问原则**:\n- 每个问题必须针对一个明确的决策点\n- 答案选项应该互斥且覆盖主要场景\n- 问题数量控制在3个以内,优先询问最关键的问题\n- 问题描述清晰、具体,避免模糊表述\n- 不要强行提问,尽量减少或不提问题\n### 阶段三:步骤规划\n\n当需求清晰后,你需要将用户意图拆解为一系列可执行的步骤。\n\n**输出格式**:\n\\`\\`\\`\n##steps## \njson内容\n\n\\`\\`\\`\n\n**JSON格式规范**:\n\\`\\`\\`json\n[\n {\n \"id\": 0,\n \"content\": \"获取所有桩基模型\",\n \"description\": \"通过modelTree模块遍历模型树,筛选出类型为'桩基'的所有构件,返回构件ID数组和构件对象数组\",\n \"output\": \"{\\\\\"modelIds\\\\\": [\\\\\"id1\\\\\", \\\\\"id2\\\\\", ...], \\\\\"models\\\\\": [modelObject1, modelObject2, ...]}\",\n \"dependencies\": [],\n \"apiModules\": [\"modelTree\", \"dataModule\"]\n },\n {\n \"id\": 1,\n \"content\": \"设置桩基模型颜色为红色\",\n \"description\": \"使用modelMapperBatch模块的批量设置方法,将上一步获取的所有桩基模型的颜色属性设置为红色(RGB: 255, 0, 0)\",\n \"output\": \"{\\\\\"success\\\\\": true, \\\\\"count\\\\\": 10, \\\\\"failedIds\\\\\": []}\",\n \"dependencies\": [0],\n \"apiModules\": [\"modelMapperBatch\"]\n }\n]\n\\`\\`\\`\n\n**字段说明**:\n- \\`id\\`: 步骤唯一标识符,从0开始递增\n- \\`content\\`: 步骤的简短描述(一句话概括)\n- \\`description\\`: 步骤的详细功能说明,包括:\n - 具体要做什么\n - 使用哪些API模块\n - 如何处理数据\n - 可能的边界情况\n- \\`output\\`: 步骤输出的数据格式说明(JSON Schema格式),用于:\n - 指导代码生成模块返回正确的数据结构\n - 确保步骤间的数据传递正确\n- \\`dependencies\\`: 依赖的步骤ID数组,表示此步骤需要等待哪些步骤完成\n- \\`apiModules\\`: 此步骤涉及到的BIM引擎模块名称数组(如:modelTree, cameraModule, measure等)\n\n**步骤规划原则**:\n1. **原子化**:每个步骤应该只完成一个明确的功能点\n2. **可执行**:每个步骤都应该能够独立生成可执行的代码\n3. **依赖清晰**:明确标注步骤间的依赖关系,确保执行顺序正确\n4. **数据流转**:每个步骤的输出格式要明确,便于后续步骤使用\n5. **模块化**:合理利用BIM引擎的模块化设计,选择最合适的API\n6. **错误处理**:在关键步骤中考虑异常情况的处理\n\n## 硬性要求\n\n### 1. 输出格式规范\n- **必须严格遵循**上述JSON格式,字段名称和类型不能改变\n- JSON必须是有效的、可解析的格式\n- 步骤ID必须连续且从0开始\n- 依赖关系必须正确,不能出现循环依赖\n\n### 2. 需求理解要求\n- **深度理解**:不能停留在表面理解,要理解用户的真实意图和业务场景\n- **上下文感知**:结合BIM引擎的特性,理解每个需求在BIM场景下的实际意义\n- **技术可行性**:确保规划的步骤在BIM引擎API能力范围内\n\n### 3. 步骤质量要求\n- **完整性**:步骤应该覆盖用户需求的所有方面,不能遗漏关键环节\n- **准确性**:步骤描述要准确,不能有歧义或错误\n- **可执行性**:每个步骤都应该能够生成可执行的代码\n- **效率性**:优先选择高效的API组合,避免不必要的中间步骤\n\n### 4. 错误预防\n- 检查步骤间的数据格式是否匹配\n- 确保依赖关系正确,避免执行顺序错误\n- 验证API模块名称是否正确\n- 考虑边界情况和异常处理\n\n### 5. 代码生成友好\n- 步骤描述要足够详细,让代码生成模块能够准确理解意图\n- 输出格式说明要具体,使用JSON Schema或示例数据\n- 明确标注使用的API模块,便于代码生成时快速定位\n\n## 最佳实践\n\n1. **先理解后规划**:充分理解需求后再开始规划步骤,避免返工\n2. **模块优先**:优先使用BIM引擎提供的功能模块,而不是底层API\n3. **数据驱动**:明确每个步骤的输入输出,确保数据流清晰\n4. **可扩展性**:考虑未来可能的扩展需求,设计灵活的步骤结构\n5. **用户友好**:步骤描述要清晰易懂,便于用户理解整个执行流程\n\n\n''`;\nexport {\n n as default\n};\n//# sourceMappingURL=main-2Txx2Vau.mjs.map\n","const n = `# BIM引擎AI助手 - 代码生成专家\n\n## 角色定位\n\n你是一位资深的**BIM引擎代码生成专家**,具备以下核心能力:\n\n1. **BIM引擎API精通**:深度掌握BIM引擎的所有模块API、方法签名、参数类型和返回值\n2. **代码生成能力**:能够根据步骤描述,生成高质量、可执行、符合规范的JavaScript代码\n3. **上下文理解**:能够理解步骤间的数据流转,正确处理前序步骤的输出结果\n4. **错误处理能力**:具备完善的异常处理和边界情况处理能力\n5. **代码质量意识**:生成的代码应该具备良好的可读性、可维护性和性能\n\n你的职责是根据步骤规划模块提供的步骤描述,生成可直接在BIM引擎环境中执行的JavaScript代码片段。\n\n## 工作流程\n\n### 阶段一:理解步骤要求\n\n当接收到步骤执行请求时,你需要:\n\n1. **解析步骤信息**:\n - 理解步骤的\\`content\\`(简短描述)和\\`description\\`(详细说明)\n - 识别步骤涉及到的BIM引擎模块(\\`apiModules\\`字段)\n - 理解步骤的依赖关系(\\`dependencies\\`字段)\n - 明确步骤的预期输出格式(\\`output\\`字段)\n\n2. **分析上下文数据**:\n - 如果有前序步骤的输出结果,分析其数据结构\n - 理解当前步骤需要使用的输入数据\n - 验证数据格式是否匹配步骤要求\n\n3. **确定实现方案**:\n - 根据步骤描述,选择最合适的BIM引擎API\n - 设计数据转换和处理逻辑\n - 规划错误处理策略\n\n### 阶段二:生成代码\n\n根据步骤要求生成可执行的JavaScript代码。\n\n**输出格式**:\n\\`\\`\\`\n##code##\n[可执行的JavaScript代码]\n\\`\\`\\`\n\n**代码生成规范**:\n\n1. **代码结构**:\n - 代码必须是一个完整的、可执行的JavaScript代码片段\n - 可以是函数、立即执行函数(IIFE)或代码块\n - 代码应该能够直接运行,不需要额外的包装\n\n2. **引擎实例访问**:\n - 假设BIM引擎实例通过变量\\`engine\\`访问(全局作用域)\n - 通过\\`engine.moduleName\\`访问各个功能模块\n - 例如:\\`engine.modelTree\\`、\\`engine.cameraModule\\`、\\`engine.measure\\`等\n\n3. **数据输入处理**:\n - 如果步骤有依赖,使用前序步骤的输出数据\n - 假设前序步骤的输出数据存储在变量\\`previousStepOutput\\`中(如果是第一步,则为\\`null\\`)\n - 需要根据\\`output\\`字段的格式说明,正确解析和使用输入数据\n\n4. **API调用规范**:\n - 严格按照BIM引擎API文档使用API\n - 参数类型和数量必须正确\n - 处理API的返回值和可能的异常\n\n5. **数据输出规范**:\n - 代码执行后,必须返回符合步骤\\`output\\`字段要求的数据格式\n - 使用\\`return\\`语句返回结果\n - 返回的数据必须是可序列化的(JSON格式)\n\n6. **错误处理**:\n - 必须包含完善的错误处理逻辑\n - 使用try-catch捕获可能的异常\n - 对于关键操作,添加参数验证\n - 错误信息要清晰,便于调试\n\n7. **代码质量要求**:\n - 代码要有清晰的注释,说明关键逻辑\n - 变量命名要有意义,符合JavaScript命名规范\n - 避免使用过于复杂的嵌套结构\n - 优先使用可读性高的写法,而不是过于\"高级\"的技巧\n\n## 硬性要求\n\n### 1. 代码格式要求\n- **单一代码块**:输出必须且只能包含一个JavaScript代码片段\n- **可执行性**:代码必须能够直接执行,不需要额外的依赖或配置\n- **完整性**:代码必须完整,不能有语法错误或未定义的变量\n\n### 2. 数据格式要求\n- **输入解析**:正确解析和使用前序步骤的输出数据\n- **输出格式**:严格按照步骤\\`output\\`字段的格式要求返回数据\n- **类型安全**:确保数据类型正确,必要时进行类型转换\n\n### 3. API使用要求\n- **准确性**:API调用必须准确,参数必须正确\n- **模块识别**:正确识别和使用BIM引擎的各个模块\n- **方法调用**:使用正确的方法名和参数签名\n\n### 4. 错误处理要求\n- **异常捕获**:所有可能抛出异常的操作都要有try-catch保护\n- **参数验证**:对关键参数进行验证,避免无效输入\n- **错误信息**:错误信息要清晰,包含足够的上下文信息\n- **优雅降级**:在可能的情况下,提供降级方案\n\n### 5. 代码质量要求\n- **可读性**:代码结构清晰,逻辑易懂\n- **注释完整**:关键逻辑要有注释说明\n- **命名规范**:变量和函数命名要有意义\n- **性能考虑**:避免不必要的循环和计算\n\n## 代码生成示例\n\n### 示例1:获取模型数据\n\n**步骤描述**:\n\\`\\`\\`json\n{\n \"id\": 0,\n \"content\": \"获取所有桩基模型\",\n \"description\": \"通过modelTree模块遍历模型树,筛选出类型为'桩基'的所有构件\",\n \"output\": \"{\\\\\"modelIds\\\\\": [\\\\\"id1\\\\\", \\\\\"id2\\\\\"], \\\\\"models\\\\\": [modelObject1, modelObject2]}\",\n \"dependencies\": [],\n \"apiModules\": [\"modelTree\"]\n}\n\\`\\`\\`\n\n**生成代码**:\n\\`\\`\\`javascript\n// 获取所有桩基模型\ntry {\n // 获取模型树模块\n const modelTree = engine.modelTree;\n if (!modelTree) {\n throw new Error('模型树模块未初始化');\n }\n \n // 获取所有模型\n const allModels = modelTree.getAllModels();\n if (!allModels || allModels.length === 0) {\n return {\n modelIds: [],\n models: []\n };\n }\n \n // 筛选桩基模型\n const pileModels = [];\n const pileModelIds = [];\n \n for (let i = 0; i < allModels.length; i++) {\n const model = allModels[i];\n // 根据模型属性判断是否为桩基\n const modelType = model.getProperty('类型') || model.getProperty('category');\n if (modelType && (modelType.includes('桩基') || modelType.includes('Pile'))) {\n pileModels.push(model);\n pileModelIds.push(model.id || model.uuid);\n }\n }\n \n // 返回结果\n return {\n modelIds: pileModelIds,\n models: pileModels\n };\n} catch (error) {\n console.error('获取桩基模型失败:', error);\n return {\n modelIds: [],\n models: [],\n error: error.message\n };\n}\n\\`\\`\\`\n\n### 示例2:使用前序步骤的输出\n\n**步骤描述**:\n\\`\\`\\`json\n{\n \"id\": 1,\n \"content\": \"设置桩基模型颜色为红色\",\n \"description\": \"使用modelMapperBatch模块批量设置上一步获取的桩基模型颜色\",\n \"output\": \"{\\\\\"success\\\\\": true, \\\\\"count\\\\\": 10}\",\n \"dependencies\": [0],\n \"apiModules\": [\"modelMapperBatch\"]\n}\n\\`\\`\\`\n\n**生成代码**:\n\\`\\`\\`javascript\n// 设置桩基模型颜色为红色\ntry {\n // 获取前序步骤的输出数据\n if (!previousStepOutput || !previousStepOutput.modelIds) {\n throw new Error('前序步骤输出数据无效,缺少modelIds字段');\n }\n \n const modelIds = previousStepOutput.modelIds;\n if (modelIds.length === 0) {\n return {\n success: true,\n count: 0,\n message: '没有需要设置的模型'\n };\n }\n \n // 获取批量映射模块\n const modelMapperBatch = engine.modelMapperBatch;\n if (!modelMapperBatch) {\n throw new Error('批量映射模块未初始化');\n }\n \n // 设置颜色为红色 (RGB: 255, 0, 0)\n const redColor = { r: 255, g: 0, b: 0 };\n \n // 批量设置模型颜色\n const result = modelMapperBatch.setModelColor(modelIds, redColor);\n \n return {\n success: result.success !== false,\n count: result.count || modelIds.length,\n failedIds: result.failedIds || []\n };\n} catch (error) {\n console.error('设置模型颜色失败:', error);\n return {\n success: false,\n count: 0,\n error: error.message\n };\n}\n\\`\\`\\`\n\n## 最佳实践\n\n1. **充分理解步骤**:仔细阅读步骤描述,确保理解每个细节\n2. **查阅API文档**:不确定的API用法,参考BIM引擎API文档\n3. **数据验证优先**:在处理数据前,先验证数据的有效性\n4. **错误处理完善**:考虑各种可能的异常情况\n5. **代码可读性**:优先保证代码的可读性,而不是追求\"高级\"写法\n6. **注释清晰**:关键逻辑要有注释,但不要过度注释\n7. **性能考虑**:对于大量数据的处理,考虑性能优化\n8. **测试友好**:生成的代码应该便于测试和调试 `;\nexport {\n n as default\n};\n//# sourceMappingURL=step-CkmZYIvn.mjs.map\n","const n = `# BIM Engine SDK API 文档\n\n本文档为 BIM Engine SDK 的完整 API 参考,适合大模型阅读和理解引擎的功能结构。\n\n## 目录\n\n1. [核心引擎类](#1-核心引擎类)\n2. [基础模块](#2-基础模块)\n3. [功能管理器](#3-功能管理器)\n4. [状态管理](#4-状态管理)\n\n---\n\n## 1. 核心引擎类\n\n### EngineKernelV2\n\n引擎核心组件,负责整合和管理所有模块。\n\n**文件路径**: \\`src/core/v2/EngineKernel.ts\\`\n\n#### 构造函数\n\n\\`\\`\\`typescript\nconstructor(options: any)\n\\`\\`\\`\n\n**参数**:\n- \\`options.containerId\\`: string - 容器元素的 ID\n\n**功能**:\n- 初始化所有基础模块(场景、相机、渲染器、控制器等)\n- 初始化所有功能管理器(测量、剖切、模型树等)\n- 设置渲染循环\n- 添加性能监视器\n\n#### 公共属性\n\n\\`\\`\\`typescript\n// 基础对象\npublic scene: THREE.Scene | null // 三维场景\npublic camera: THREE.Camera | null // 当前使用的相机\npublic renderer: THREE.WebGLRenderer | null // 渲染器\npublic controls: any // 控制器(轨道控制或第一人称)\n\n// 基础模块\npublic sceneModule: SceneModule // 场景模块\npublic cameraModule: CameraModule // 相机模块\npublic deviceModule: DeviceModule // 设备模块\npublic renderModule: RenderModule // 渲染模块\npublic controlModule: ControlModule // 控制模块\npublic composerModule: ComposerModule // 合成器模块\npublic loaderModule: LoaderModule // 加载器模块\npublic lightModule: LightModule // 光照模块\npublic interactionModule: InteractionModule // 交互模块\npublic modelToolModule: ModelToolModule // 模型工具模块\n\n// 功能管理器\npublic viewCube: ViewCube // 视图立方体\npublic rangeScale: RangeScale // 范围缩放\npublic setting: Setting // 设置\npublic measure: Measure // 测量\npublic clipping: Clipping // 剖切\npublic modelTree: ModelTree // 模型树\npublic engineInfo: EngineInfo // 引擎信息统计\npublic modelProperties: ModelProperties // 模型属性\npublic modelMapperBatch: ModelMapperBatch // 模型批量映射\npublic modelEdge: ModelEdge // 模型边线\n\n// 状态管理\npublic engineStatus: EngineStatus // 引擎状态\npublic events: EventModule // 事件模块\n\n// 业务数据\npublic models: any[] // 已加载的模型数组\npublic reactBoundingClientRect: { left: number; top: number } // 容器的边界矩形\n\\`\\`\\`\n\n#### 公共方法\n\n##### pauseRendering()\n\n\\`\\`\\`typescript\npublic pauseRendering(): void\n\\`\\`\\`\n\n**功能**: 暂停渲染循环\n- 停止动画帧请求\n- 禁用控制器\n- 用于性能优化或后台运行\n\n##### resumeRendering()\n\n\\`\\`\\`typescript\npublic resumeRendering(): void\n\\`\\`\\`\n\n**功能**: 恢复渲染循环\n- 重新启动动画帧请求\n- 恢复控制器状态\n\n##### isRenderingPausedState()\n\n\\`\\`\\`typescript\npublic isRenderingPausedState(): boolean\n\\`\\`\\`\n\n**功能**: 检查渲染是否暂停\n\n**返回值**: boolean - true 表示已暂停\n\n##### dispose()\n\n\\`\\`\\`typescript\npublic dispose(): void\n\\`\\`\\`\n\n**功能**: 销毁引擎,释放所有资源\n- 停止渲染循环\n- 清理所有模块\n- 释放几何体、材质、纹理\n- 移除 DOM 元素\n- 清理事件监听器\n\n**注意**: 调用此方法后引擎不可再使用\n\n---\n\n## 2. 基础模块\n\n### 2.1 SceneModule - 场景模块\n\n**文件路径**: \\`src/core/v2/modules/sceneModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic scene: THREE.Scene | null // 三维场景对象\n\\`\\`\\`\n\n**功能**:\n- 创建并管理 THREE.Scene\n- 初始化边线组(groupEdge)用于存储模型边线\n\n---\n\n### 2.2 CameraModule - 相机模块\n\n**文件路径**: \\`src/core/v2/modules/cameraModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic perspectiveCamera: THREE.PerspectiveCamera // 透视相机\npublic orthographicCamera: THREE.OrthographicCamera // 正交相机\n\\`\\`\\`\n\n#### 公共方法\n\n##### switchCurrentCamera()\n\n\\`\\`\\`typescript\npublic switchCurrentCamera(): void\n\\`\\`\\`\n\n**功能**: 切换当前相机类型(透视 ↔ 正交)\n\n##### switchToPerspectiveCamera()\n\n\\`\\`\\`typescript\npublic switchToPerspectiveCamera(): void\n\\`\\`\\`\n\n**功能**: 切换到透视相机\n- 保持当前位置和目标点\n- 更新控制器\n- 重新初始化合成器\n\n##### switchToOrthographicCamera()\n\n\\`\\`\\`typescript\npublic switchToOrthographicCamera(): void\n\\`\\`\\`\n\n**功能**: 切换到正交相机\n- 保持当前位置和目标点\n- 更新控制器\n- 重新初始化合成器\n\n##### getCameraType()\n\n\\`\\`\\`typescript\npublic getCameraType(): CameraType\n\\`\\`\\`\n\n**功能**: 获取当前相机类型\n\n**返回值**:\n- \\`CameraType.PERSPECTIVE\\` - 透视相机\n- \\`CameraType.ORTHOGRAPHIC\\` - 正交相机\n\n##### getCameraPose()\n\n\\`\\`\\`typescript\npublic getCameraPose(): ICameraPose\n\\`\\`\\`\n\n**功能**: 获取当前相机姿态(位置、旋转、目标点、缩放等)\n\n**返回值**: ICameraPose 对象\n\\`\\`\\`typescript\ninterface ICameraPose {\n type: CameraType;\n position: { x: number; y: number; z: number };\n rotation: { x: number; y: number; z: number };\n quaternion: { x: number; y: number; z: number; w: number };\n target?: { x: number; y: number; z: number };\n zoom?: number;\n}\n\\`\\`\\`\n\n##### restoreCameraPose()\n\n\\`\\`\\`typescript\npublic restoreCameraPose(pose: ICameraPose): void\n\\`\\`\\`\n\n**功能**: 通过相机姿态还原相机位置\n- 自动切换相机类型\n- 恢复位置、旋转、目标点\n- 恢复正交相机的缩放值\n\n**参数**:\n- \\`pose\\`: ICameraPose - 相机姿态对象\n\n---\n\n### 2.3 DeviceModule - 设备模块\n\n**文件路径**: \\`src/core/v2/modules/deviceModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic deviceType: string // 设备类型(默认 'PC')\n\\`\\`\\`\n\n#### 公共方法\n\n##### getDeviceType()\n\n\\`\\`\\`typescript\npublic getDeviceType(): string\n\\`\\`\\`\n\n**功能**: 获取设备类型\n\n**返回值**: 'PC' 或其他设备标识\n\n##### getContainerSize()\n\n\\`\\`\\`typescript\npublic getContainerSize(): { width: number; height: number }\n\\`\\`\\`\n\n**功能**: 获取容器尺寸\n\n**返回值**: 容器的宽度和高度\n\n---\n\n### 2.4 RenderModule - 渲染模块\n\n**文件路径**: \\`src/core/v2/modules/renderModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic renderer: THREE.WebGLRenderer | null // WebGL 渲染器\n\\`\\`\\`\n\n#### 公共方法\n\n##### createRenderer()\n\n\\`\\`\\`typescript\npublic createRenderer(): THREE.WebGLRenderer\n\\`\\`\\`\n\n**功能**: 创建并配置 WebGL 渲染器\n- 启用抗锯齿\n- 启用阴影映射(PCFSoftShadowMap)\n- 启用本地裁剪(用于剖切平面)\n- 配置色彩空间和色调映射\n\n**返回值**: 配置好的渲染器实例\n\n##### disposeRenderer()\n\n\\`\\`\\`typescript\npublic disposeRenderer(): void\n\\`\\`\\`\n\n**功能**: 释放渲染器资源\n\n---\n\n### 2.5 ControlModule - 控制模块\n\n**文件路径**: \\`src/core/v2/modules/controlModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic orbitControls: any // 轨道控制器\npublic firstPersonControls: any // 第一人称控制器\npublic isActive: boolean // 控制器是否激活\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化控制器\n- 创建轨道控制器和第一人称控制器\n- 创建旋转中心指示器 UI\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活控制器\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 禁用控制器\n\n##### switchFirstPersonMode()\n\n\\`\\`\\`typescript\npublic switchFirstPersonMode(): void\n\\`\\`\\`\n\n**功能**: 切换到第一人称漫游模式\n- 禁用轨道控制器\n- 启用第一人称控制器\n\n##### switchDefaultMode()\n\n\\`\\`\\`typescript\npublic switchDefaultMode(): void\n\\`\\`\\`\n\n**功能**: 切换到默认模式(轨道控制)\n- 禁用第一人称控制器\n- 启用轨道控制器\n\n##### update()\n\n\\`\\`\\`typescript\npublic update(): void\n\\`\\`\\`\n\n**功能**: 更新控制器状态\n- 更新旋转中心指示器位置\n- 在渲染循环中调用\n\n---\n\n### 2.6 ComposerModule - 合成器模块\n\n**文件路径**: \\`src/core/v2/modules/composerModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic composer: any // 效果合成器\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化后处理管线\n- RenderPass - 基础渲染\n- GTAOPass - 环境光遮蔽(默认禁用)\n- UnrealBloomPass - 辉光效果(默认禁用)\n- SaturationPass - 饱和度和对比度调整\n- OutputPass - 色调映射和颜色校正\n- FXAAPass - 抗锯齿\n\n##### resize()\n\n\\`\\`\\`typescript\npublic resize(): void\n\\`\\`\\`\n\n**功能**: 调整合成器大小\n- 更新所有 pass 的分辨率\n- 更新 FXAA 的分辨率参数\n\n---\n\n### 2.7 LoaderModule - 加载器模块\n\n**文件路径**: \\`src/core/v2/modules/loaderModule.ts\\`\n\n#### 公共方法\n\n##### loadModels()\n\n\\`\\`\\`typescript\nasync loadModels(urls: string[], options?: LoadModelOptions): Promise\n\\`\\`\\`\n\n**功能**: 加载多个模型\n- 支持轻量化模型格式\n- 支持 GLTF/GLB 格式\n- 异步加载\n\n**参数**:\n- \\`urls\\`: string[] - 模型 URL 数组\n- \\`options\\`: LoadModelOptions - 加载选项(可选)\n\n---\n\n### 2.8 EventModule - 事件模块\n\n**文件路径**: \\`src/core/v2/modules/eventModule.ts\\`\n\n#### 公共方法\n\n##### on()\n\n\\`\\`\\`typescript\non(event: EventType, callback: (data: T) => void): void\n\\`\\`\\`\n\n**功能**: 注册事件监听器\n\n**参数**:\n- \\`event\\`: EventType - 事件类型\n- \\`callback\\`: 回调函数\n\n##### off()\n\n\\`\\`\\`typescript\noff(event: EventType, callback: (data: T) => void): void\n\\`\\`\\`\n\n**功能**: 移除事件监听器\n\n**参数**:\n- \\`event\\`: EventType - 事件类型\n- \\`callback\\`: 要移除的回调函数\n\n##### trigger()\n\n\\`\\`\\`typescript\ntrigger(event: EventType, data?: any): void\n\\`\\`\\`\n\n**功能**: 触发事件\n\n**参数**:\n- \\`event\\`: EventType - 事件类型\n- \\`data\\`: 传递给监听器的数据\n\n**常用事件类型**:\n- \\`EventType.Click\\` - 点击事件\n- \\`EventType.ViewportResize\\` - 视口大小改变\n- \\`EventType.EngineFree\\` - 引擎空闲\n- \\`EventType.EngineBusy\\` - 引擎繁忙\n\n---\n\n### 2.9 LightModule - 光照模块\n\n**文件路径**: \\`src/core/v2/modules/lightModule.ts\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化场景基本光照\n- 添加定向光(DirectionalLight)\n - 强度: 2\n - 位置: (10, 20, 10)\n - 阴影贴图: 4096x4096(高质量)\n- 添加环境光(AmbientLight)\n - 强度: 1\n\n---\n\n### 2.10 InteractionModule - 交互模块\n\n**文件路径**: \\`src/core/v2/modules/interactionModule.ts\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化交互行为处理器\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活交互功能\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 禁用交互功能\n\n##### handleMouseClick()\n\n\\`\\`\\`typescript\npublic handleMouseClick(event: any): void\n\\`\\`\\`\n\n**功能**: 处理鼠标单击事件\n- 射线检测点击的模型\n- 高亮选中的模型\n- 设置旋转中心\n- 支持 Ctrl 多选\n\n##### handleMouseDoubleClick()\n\n\\`\\`\\`typescript\npublic handleMouseDoubleClick(event: any): void\n\\`\\`\\`\n\n**功能**: 处理鼠标双击事件\n- 双击模型后缩放到该模型\n- 计算模型包围盒并调整相机视角\n\n##### handleMouseClickInstance()\n\n\\`\\`\\`typescript\npublic handleMouseClickInstance(raycaster: any): any\n\\`\\`\\`\n\n**功能**: 判断点击实例化网格节点\n\n**参数**:\n- \\`raycaster\\`: 射线投射器\n\n**返回值**: 相交结果数组\n\n---\n\n### 2.11 ModelToolModule - 模型工具模块\n\n**文件路径**: \\`src/core/v2/modules/modelToolModule.ts\\`\n\n#### 公共方法\n\n##### highlightModel()\n\n\\`\\`\\`typescript\npublic highlightModel(models: any): void\n\\`\\`\\`\n\n**功能**: 设置模型高亮显示\n\n**参数**:\n- \\`models\\`: 模型数组,格式: \\`[{url: string, ids: string[]}]\\`\n\n##### unhighlightModel()\n\n\\`\\`\\`typescript\npublic unhighlightModel(models: any): void\n\\`\\`\\`\n\n**功能**: 取消模型高亮\n\n**参数**:\n- \\`models\\`: 模型数组\n\n##### unhighlightAllModels()\n\n\\`\\`\\`typescript\npublic unhighlightAllModels(): void\n\\`\\`\\`\n\n**功能**: 取消所有模型高亮\n\n##### hideModel()\n\n\\`\\`\\`typescript\npublic hideModel(models: any): void\n\\`\\`\\`\n\n**功能**: 隐藏模型\n\n**参数**:\n- \\`models\\`: 模型数组,格式: \\`[{url: string, ids: string[]}]\\`\n\n##### showModel()\n\n\\`\\`\\`typescript\npublic showModel(models: any): void\n\\`\\`\\`\n\n**功能**: 显示模型\n\n**参数**:\n- \\`models\\`: 模型数组\n\n##### isolateModel()\n\n\\`\\`\\`typescript\npublic isolateModel(models: any): void\n\\`\\`\\`\n\n**功能**: 隔离模型(只显示指定模型,隐藏其他)\n\n**参数**:\n- \\`models\\`: 要显示的模型数组\n\n##### showAllModels()\n\n\\`\\`\\`typescript\npublic showAllModels(): void\n\\`\\`\\`\n\n**功能**: 显示所有模型\n\n##### getModelsBox()\n\n\\`\\`\\`typescript\npublic getModelsBox(models: any): THREE.Box3\n\\`\\`\\`\n\n**功能**: 获取模型的包围盒\n\n**参数**:\n- \\`models\\`: 模型数组\n\n**返回值**: THREE.Box3 包围盒对象\n\n---\n\n## 3. 功能管理器\n\n### 3.1 ViewCube - 视图立方体\n\n**文件路径**: \\`src/core/v2/managers/viewCube/index.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic cubeTool: any // 视图立方体工具\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化视图立方体\n- 创建 3D 小立方体辅助视图\n- 支持六个面和边角视图切换\n\n##### CameraGoHome()\n\n\\`\\`\\`typescript\npublic CameraGoHome(): void\n\\`\\`\\`\n\n**功能**: 相机回归正位(默认视角)\n\n##### zoomToModel()\n\n\\`\\`\\`typescript\npublic zoomToModel(box: THREE.Box3): void\n\\`\\`\\`\n\n**功能**: 缩放到指定模型包围盒\n\n**参数**:\n- \\`box\\`: THREE.Box3 - 目标包围盒\n\n---\n\n### 3.2 RangeScale - 范围缩放工具\n\n**文件路径**: \\`src/core/v2/managers/rangeScale/index.ts\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化范围缩放工具\n- 创建绘制框 UI 元素\n- 初始化坐标转换工具\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活范围缩放工具\n- 禁用控制器\n- 启用框选功能\n- 鼠标变为十字光标\n\n**使用方式**:\n1. 激活工具\n2. 鼠标拖拽绘制矩形区域\n3. 松开鼠标自动缩放到该区域\n4. 按 ESC 键退出\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 停用范围缩放工具\n- 恢复控制器\n- 移除事件监听\n\n---\n\n### 3.3 Setting - 设置管理器\n\n**文件路径**: \\`src/core/v2/managers/setting/index.ts\\`\n\n#### 公共方法\n\n##### setStatsVisible()\n\n\\`\\`\\`typescript\npublic setStatsVisible(visible: boolean): void\n\\`\\`\\`\n\n**功能**: 显示/隐藏性能监视器\n\n**参数**:\n- \\`visible\\`: true 显示,false 隐藏\n\n##### setAmbientLightIntensity()\n\n\\`\\`\\`typescript\npublic setAmbientLightIntensity(intensity: number): void\n\\`\\`\\`\n\n**功能**: 设置环境光照强度\n\n**参数**:\n- \\`intensity\\`: 光照强度,范围 0-5\n\n##### setAmbientLightColor()\n\n\\`\\`\\`typescript\npublic setAmbientLightColor(color: number | string): void\n\\`\\`\\`\n\n**功能**: 设置环境光照颜色\n\n**参数**:\n- \\`color\\`: 颜色(0xffffff 或 '#ffffff')\n\n##### setDirectionalLightIntensity()\n\n\\`\\`\\`typescript\npublic setDirectionalLightIntensity(intensity: number): void\n\\`\\`\\`\n\n**功能**: 设置定向光源强度\n\n**参数**:\n- \\`intensity\\`: 光照强度,范围 0-5\n\n##### setDirectionalLightColor()\n\n\\`\\`\\`typescript\npublic setDirectionalLightColor(color: number | string): void\n\\`\\`\\`\n\n**功能**: 设置定向光源颜色\n\n**参数**:\n- \\`color\\`: 颜色\n\n##### setShadowQuality()\n\n\\`\\`\\`typescript\npublic setShadowQuality(quality: 'low' | 'medium' | 'high' | 'ultra'): void\n\\`\\`\\`\n\n**功能**: 设置阴影精细度\n\n**参数**:\n- \\`quality\\`: 质量等级\n - 'low': 1024\n - 'medium': 2048\n - 'high': 4096\n - 'ultra': 8192\n\n##### setDirectionalLightShadow()\n\n\\`\\`\\`typescript\npublic setDirectionalLightShadow(enabled: boolean): void\n\\`\\`\\`\n\n**功能**: 开启/关闭定向光阴影\n\n**参数**:\n- \\`enabled\\`: true 开启,false 关闭\n\n##### setGTAOEnabled()\n\n\\`\\`\\`typescript\npublic setGTAOEnabled(enabled: boolean): void\n\\`\\`\\`\n\n**功能**: 开启/关闭 GTAO 环境光遮蔽\n\n**参数**:\n- \\`enabled\\`: true 开启,false 关闭\n\n##### setSceneSaturation()\n\n\\`\\`\\`typescript\npublic setSceneSaturation(saturation: number): void\n\\`\\`\\`\n\n**功能**: 设置场景饱和度\n\n**参数**:\n- \\`saturation\\`: 饱和度值,1.0 为正常,推荐范围 0.5-2.0\n\n##### setSceneContrast()\n\n\\`\\`\\`typescript\npublic setSceneContrast(contrast: number): void\n\\`\\`\\`\n\n**功能**: 设置场景对比度\n\n**参数**:\n- \\`contrast\\`: 对比度值,1.0 为正常,推荐范围 0.5-2.0\n\n##### setGroundEnabled()\n\n\\`\\`\\`typescript\npublic setGroundEnabled(enabled: boolean, options?: {\n size?: number;\n color?: number | string;\n opacity?: number;\n}): void\n\\`\\`\\`\n\n**功能**: 开启/关闭地面\n\n**参数**:\n- \\`enabled\\`: true 开启,false 关闭\n- \\`options\\`: 地面配置选项\n - \\`size\\`: 地面大小(默认 100)\n - \\`color\\`: 地面颜色(默认 0x808080)\n - \\`opacity\\`: 透明度(默认 0.3)\n\n##### setHDRBackground()\n\n\\`\\`\\`typescript\npublic setHDRBackground(hdrTexture: THREE.Texture | null): void\n\\`\\`\\`\n\n**功能**: 设置 HDR 背景\n\n**参数**:\n- \\`hdrTexture\\`: HDR 环境贴图,null 则移除\n\n---\n\n### 3.4 Measure - 测量工具\n\n**文件路径**: \\`src/core/v2/managers/measure/index.ts\\`\n\n#### 公共方法\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活测量工具\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 停用测量工具\n- 清除所有测量\n- 恢复点选功能\n\n##### clearAllPoints()\n\n\\`\\`\\`typescript\npublic clearAllPoints(): void\n\\`\\`\\`\n\n**功能**: 清空所有测量点\n\n##### clearAll()\n\n\\`\\`\\`typescript\npublic clearAll(): void\n\\`\\`\\`\n\n**功能**: 清除所有测量标注\n\n##### update()\n\n\\`\\`\\`typescript\nupdate(): void\n\\`\\`\\`\n\n**功能**: 更新测量标注\n- 在渲染循环中调用\n- 更新屏幕坐标\n\n**测量类型**:\n- 距离测量(DistanceMeasure)\n- 净高测量(ClearHeightMeasure)\n- 净距测量(ClearDistanceMeasure)\n- 标高测量(ElevationMeasure)\n- 点测量(PointMeasure)\n- 角度测量(AngleMeasure)\n- 面积测量(AreaMeasure)\n- 坡度测量(SlopeMeasure)\n\n---\n\n### 3.5 Clipping - 剖切管理器\n\n**文件路径**: \\`src/core/v2/managers/clipping/index.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic sectionPlaneX: any // X 轴剖切平面\npublic sectionPlaneY: any // Y 轴剖切平面\npublic sectionPlaneZ: any // Z 轴剖切平面\npublic sectionBox: any // 剖切盒\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化剖切管理器\n- 创建 6 个剖切平面(前、后、左、右、顶、底)\n- 初始化 X/Y/Z 轴剖切工具\n- 初始化剖切盒工具\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 停用所有剖切工具\n\n---\n\n### 3.6 ModelTree - 模型树\n\n**文件路径**: \\`src/core/v2/managers/modelTree/index.ts\\`\n\n#### 公共方法\n\n##### getTreeData()\n\n\\`\\`\\`typescript\npublic getTreeData(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型树数据\n\n**返回值**: 模型树数组\n\\`\\`\\`typescript\n[{\n name: string, // 模型名称\n children: any[] // 模型层级树\n}]\n\\`\\`\\`\n\n---\n\n### 3.7 EngineInfo - 引擎信息统计\n\n**文件路径**: \\`src/core/v2/managers/engineInfo/index.ts\\`\n\n#### 公共方法\n\n##### getEngineInfo()\n\n\\`\\`\\`typescript\npublic getEngineInfo(): {\n totalVertices: number;\n totalTriangles: number;\n meshCount: number;\n}\n\\`\\`\\`\n\n**功能**: 获取引擎统计信息\n- 统计所有网格的顶点数\n- 统计所有网格的三角面数\n- 统计网格数量\n\n**返回值**:\n- \\`totalVertices\\`: 总顶点数\n- \\`totalTriangles\\`: 总三角面数\n- \\`meshCount\\`: 网格数量\n\n---\n\n### 3.8 ModelProperties - 模型属性\n\n**文件路径**: \\`src/core/v2/managers/modelProperties/index.ts\\`\n\n#### 公共方法\n\n##### getModelProperties()\n\n\\`\\`\\`typescript\npublic getModelProperties(url: string, id: string, callback: (properties: any) => void): void\n\\`\\`\\`\n\n**功能**: 查询构件属性\n- 异步加载属性数据(如果未加载)\n- 从压缩的 JSON 中解析属性\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n- \\`callback\\`: 回调函数,接收属性对象\n\n**返回值格式**:\n\\`\\`\\`typescript\n{\n properties: [{\n name: string, // 分类名称\n children: [{\n name: string, // 属性名\n value: any // 属性值\n }]\n }],\n materials: []\n}\n\\`\\`\\`\n\n---\n\n### 3.9 ModelMapperBatch - 模型批量映射\n\n**文件路径**: \\`src/core/v2/managers/modelMapperBatch/index.ts\\`\n\n#### 公共方法\n\n##### getModelTypes()\n\n\\`\\`\\`typescript\npublic getModelTypes(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型中所有的构件类型\n\n##### getModelMajors()\n\n\\`\\`\\`typescript\npublic getModelMajors(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型中所有的专业\n\n##### getModelLevels()\n\n\\`\\`\\`typescript\npublic getModelLevels(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型中所有的楼层\n\n##### getModelMapper()\n\n\\`\\`\\`typescript\npublic getModelMapper(url: string, id: number): any\n\\`\\`\\`\n\n**功能**: 获取指定构件的映射信息\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n**返回值**: Mapper 对象(包含类型、专业、楼层等信息)\n\n##### getModelSWithType()\n\n\\`\\`\\`typescript\npublic getModelSWithType(type: string, callback: any): any[]\n\\`\\`\\`\n\n**功能**: 获取同类型的所有构件\n\n**参数**:\n- \\`type\\`: 构件类型名称\n- \\`callback\\`: 回调函数\n\n**返回值**: \\`[{url: string, ids: number[]}]\\`\n\n##### getModelSWithLevel()\n\n\\`\\`\\`typescript\npublic getModelSWithLevel(level: string, callback: any): any[]\n\\`\\`\\`\n\n**功能**: 获取同楼层的所有构件\n\n**参数**:\n- \\`level\\`: 楼层名称\n- \\`callback\\`: 回调函数\n\n**返回值**: \\`[{url: string, ids: number[]}]\\`\n\n##### getModelsWithMajor()\n\n\\`\\`\\`typescript\npublic getModelsWithMajor(major: string, callback: any): any[]\n\\`\\`\\`\n\n**功能**: 获取同专业的所有构件\n\n**参数**:\n- \\`major\\`: 专业名称\n- \\`callback\\`: 回调函数\n\n**返回值**: \\`[{url: string, ids: number[]}]\\`\n\n---\n\n### 3.10 ModelEdge - 模型边线管理器\n\n**文件路径**: \\`src/core/v2/managers/modelEdge/index.ts\\`\n\n#### 公共方法\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 启动边线显示\n- 显示所有模型的边线\n- 用于技术制图风格渲染\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 关闭边线显示\n\n##### getModelEdge()\n\n\\`\\`\\`typescript\npublic getModelEdge(url: string, id: Number): any\n\\`\\`\\`\n\n**功能**: 获取指定模型的边线数据\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n**返回值**: 边线数据 \\`[startIndex, endIndex, points]\\`\n\n##### hideModelEdge()\n\n\\`\\`\\`typescript\npublic hideModelEdge(url: string, id: Number): void\n\\`\\`\\`\n\n**功能**: 隐藏指定构件的边线\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n##### showModelEdge()\n\n\\`\\`\\`typescript\npublic showModelEdge(url: string, id: Number): void\n\\`\\`\\`\n\n**功能**: 显示指定构件的边线\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n---\n\n## 4. 状态管理\n\n### 4.1 EngineStatus - 引擎状态\n\n**文件路径**: \\`src/core/v2/status/engineStatus.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic isFree: boolean // 引擎是否空闲\npublic highlightModels: any[] // 高亮的模型数组\npublic hideModels: any[] // 隐藏的模型数组\npublic models: any[] // 已加载的模型数组\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化引擎状态监听\n- 监听 \\`EventType.EngineFree\\` 事件\n- 监听 \\`EventType.EngineBusy\\` 事件\n\n##### updateFree()\n\n\\`\\`\\`typescript\npublic updateFree(status: boolean): void\n\\`\\`\\`\n\n**功能**: 更新引擎空闲状态\n\n**参数**:\n- \\`status\\`: true 表示空闲,false 表示繁忙\n\n##### closeAllFunction()\n\n\\`\\`\\`typescript\npublic closeAllFunction(): void\n\\`\\`\\`\n\n**功能**: 关闭所有功能\n\n---\n\n### 4.2 HandelBehaved - 行为处理器\n\n**文件路径**: \\`src/core/v2/status/handelBehaved.ts\\`\n\n这是一个工厂函数,返回行为处理器对象。\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\ninit(self: any, options: any): void\n\\`\\`\\`\n\n**功能**: 初始化行为处理器\n\n**参数**:\n- \\`self\\`: 当前激活的行为对象\n- \\`options\\`: 行为配置选项\n - \\`showCatch\\`: boolean - 是否显示捕捉点\n\n##### active()\n\n\\`\\`\\`typescript\nactive(): void\n\\`\\`\\`\n\n**功能**: 开启事务(激活事件监听)\n- 监听鼠标事件(mousedown, mouseup, mousemove)\n- 监听键盘事件(keydown, keyup)\n\n##### disActive()\n\n\\`\\`\\`typescript\ndisActive(): void\n\\`\\`\\`\n\n**功能**: 关闭事务(禁用事件监听)\n\n**支持的键盘事件**:\n- Delete / Backspace - 删除\n- Escape - 取消\n- Enter - 确认\n- Space - 空格\n- Ctrl / Control - 控制键\n- Shift - 切换键\n- Alt - 辅助键\n- Meta / Command - 命令键\n\n**支持的鼠标事件**:\n- handleMouseDown - 鼠标按下\n- handleMouseMove - 鼠标移动\n- handleMouseUp - 鼠标弹起\n- handleMouseClick - 鼠标单击\n- handleMouseDoubleClick - 鼠标双击\n\n**捕捉功能**:\n- 点捕捉(距离 < 5 像素)\n- 线捕捉(距离 < 5 像素)\n- 面捕捉(默认)\n\n---\n\n## 使用示例\n\n### 初始化引擎\n\n\\`\\`\\`typescript\nimport { EngineKernelV2 } from './src/core/v2/EngineKernel';\n\nconst engine = new EngineKernelV2({\n containerId: 'canvas-container',\n antialias: true\n});\n\\`\\`\\`\n\n### 加载模型\n\n\\`\\`\\`typescript\nawait engine.loaderModule.loadModels([\n 'https://example.com/model1.light',\n 'https://example.com/model2.light'\n]);\n\\`\\`\\`\n\n### 高亮模型\n\n\\`\\`\\`typescript\nengine.modelToolModule.highlightModel([\n { url: 'model1.light', ids: ['wall-001', 'wall-002'] }\n]);\n\\`\\`\\`\n\n### 切换相机\n\n\\`\\`\\`typescript\n// 切换到正交相机\nengine.cameraModule.switchToOrthographicCamera();\n\n// 或切换当前相机类型\nengine.cameraModule.switchCurrentCamera();\n\\`\\`\\`\n\n### 保存和恢复相机姿态\n\n\\`\\`\\`typescript\n// 保存当前相机姿态\nconst pose = engine.cameraModule.getCameraPose();\n\n// 恢复相机姿态\nengine.cameraModule.restoreCameraPose(pose);\n\\`\\`\\`\n\n### 设置光照和渲染质量\n\n\\`\\`\\`typescript\n// 设置环境光强度\nengine.setting.setAmbientLightIntensity(1.5);\n\n// 设置阴影质量\nengine.setting.setShadowQuality('ultra');\n\n// 开启 GTAO\nengine.setting.setGTAOEnabled(true);\n\n// 调整饱和度和对比度\nengine.setting.setSceneSaturation(1.3);\nengine.setting.setSceneContrast(1.1);\n\\`\\`\\`\n\n### 获取模型属性\n\n\\`\\`\\`typescript\nengine.modelProperties.getModelProperties('model.light', 'wall-001', (data) => {\n console.log('属性:', data.properties);\n});\n\\`\\`\\`\n\n### 按类型筛选构件\n\n\\`\\`\\`typescript\nengine.modelMapperBatch.getModelSWithType('墙', (models) => {\n // 高亮所有墙体\n engine.modelToolModule.highlightModel(models);\n});\n\\`\\`\\`\n\n### 监听事件\n\n\\`\\`\\`typescript\n// 监听点击事件\nengine.events.on(EventType.Click, (hit) => {\n console.log('点击了:', hit.object.name);\n});\n\n// 监听视口大小改变\nengine.events.on(EventType.ViewportResize, ({ width, height }) => {\n console.log('视口大小:', width, height);\n});\n\\`\\`\\`\n\n### 暂停和恢复渲染\n\n\\`\\`\\`typescript\n// 暂停渲染(节省性能)\nengine.pauseRendering();\n\n// 恢复渲染\nengine.resumeRendering();\n\n// 检查渲染状态\nif (engine.isRenderingPausedState()) {\n console.log('渲染已暂停');\n}\n\\`\\`\\`\n\n### 销毁引擎\n\n\\`\\`\\`typescript\n// 释放所有资源\nengine.dispose();\n\\`\\`\\`\n\n---\n\n## 总结\n\nBIM Engine SDK 提供了完整的 3D BIM 模型渲染和交互能力,主要特性包括:\n\n- **完整的相机系统**: 支持透视和正交相机,可保存和恢复相机姿态\n- **强大的模型操作**: 高亮、隐藏、隔离、批量筛选\n- **丰富的测量工具**: 距离、净高、净距、标高、角度、面积、坡度\n- **灵活的剖切功能**: 支持 X/Y/Z 轴剖切和剖切盒\n- **可配置的渲染质量**: 阴影、环境光遮蔽、饱和度、对比度\n- **事件驱动架构**: 支持自定义事件监听和触发\n- **性能优化**: 支持暂停/恢复渲染,八叉树加速\n- **完善的资源管理**: 自动释放几何体、材质、纹理等资源\n\n适用场景:\n- BIM 模型在线浏览\n- 建筑设计审查\n- 施工模拟\n- 运维管理\n- AI 辅助设计\n`;\nexport {\n n as default\n};\n//# sourceMappingURL=API文档-B1v8UcRF.mjs.map\n"],"names":["zhCN","enUS","LocaleManager","locale","key","keys","value","k","listener","l","localeManager","t","lightTheme","darkTheme","ThemeManager","themeName","theme","themeManager","BimButtonGroup","options","el","event","payload","stopPropagation","e","eventType","pos","style","margin","dropdown","dropdownStyle","color","themeColors","colorKey","colors","groupId","beforeGroupId","g","newGroup","index","config","parentId","group","button","parentBtn","buttons","id","btn","found","groupElement","total","groupEl","btnWrapper","wrapper","btnEl","iconSize","minWidth","icon","textWrapper","label","active","newState","siblings","sib","btnRect","expand","currentTheme","subBtn","item","dropdownRect","arrow","buttonId","visible","show","type","Toolbar","registry","createHomeButton","index$d","createZoomBoxButton","index$c","createWalkMenuButton","index$b","createMapButton","index$a","createPropertyButton","index$9","createSettingButton","index$8","createInfoButton","index$7","createFullscreenButton","index$6","createMeasureButton","index$5","createSectionMenuButton","index$4","createSectionPlaneButton","index$3","createSectionAxisButton","index$2","createSectionBoxButton","index$1","createAiChatButton","BaseManager","handler","unsubscribe","unsub","ToolbarManager","container","v","ButtonGroupManager","BimDialog","titleEl","header","title","closeBtn","content","resizeHandle","width","height","recenter","naturalHeight","minHeight","containerHeight","targetHeight","containerW","containerH","elW","elH","bottomOffset","currentLeft","currentTop","maxLeft","maxTop","nextLeft","nextTop","elRect","left","top","pW","pH","startX","startY","startLeft","startTop","onMouseDown","onMouseMove","onMouseUp","dx","dy","newLeft","newTop","handle","startW","startH","newW","newH","DialogManager","dialog","d","REVISION","MOUSE","TOUCH","CullFaceNone","CullFaceBack","CullFaceFront","PCFShadowMap","PCFSoftShadowMap","VSMShadowMap","FrontSide","BackSide","DoubleSide","NoBlending","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","CustomBlending","AddEquation","SubtractEquation","ReverseSubtractEquation","MinEquation","MaxEquation","ZeroFactor","OneFactor","SrcColorFactor","OneMinusSrcColorFactor","SrcAlphaFactor","OneMinusSrcAlphaFactor","DstAlphaFactor","OneMinusDstAlphaFactor","DstColorFactor","OneMinusDstColorFactor","SrcAlphaSaturateFactor","ConstantColorFactor","OneMinusConstantColorFactor","ConstantAlphaFactor","OneMinusConstantAlphaFactor","NeverDepth","AlwaysDepth","LessDepth","LessEqualDepth","EqualDepth","GreaterEqualDepth","GreaterDepth","NotEqualDepth","MultiplyOperation","MixOperation","AddOperation","NoToneMapping","LinearToneMapping","ReinhardToneMapping","CineonToneMapping","ACESFilmicToneMapping","CustomToneMapping","AgXToneMapping","NeutralToneMapping","AttachedBindMode","DetachedBindMode","UVMapping","CubeReflectionMapping","CubeRefractionMapping","EquirectangularReflectionMapping","EquirectangularRefractionMapping","CubeUVReflectionMapping","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipmapNearestFilter","NearestMipmapLinearFilter","LinearFilter","LinearMipmapNearestFilter","LinearMipmapLinearFilter","UnsignedByteType","ByteType","ShortType","UnsignedShortType","IntType","UnsignedIntType","FloatType","HalfFloatType","UnsignedShort4444Type","UnsignedShort5551Type","UnsignedInt248Type","UnsignedInt5999Type","UnsignedInt101111Type","AlphaFormat","RGBFormat","RGBAFormat","DepthFormat","DepthStencilFormat","RedFormat","RedIntegerFormat","RGFormat","RGIntegerFormat","RGBAIntegerFormat","RGB_S3TC_DXT1_Format","RGBA_S3TC_DXT1_Format","RGBA_S3TC_DXT3_Format","RGBA_S3TC_DXT5_Format","RGB_PVRTC_4BPPV1_Format","RGB_PVRTC_2BPPV1_Format","RGBA_PVRTC_4BPPV1_Format","RGBA_PVRTC_2BPPV1_Format","RGB_ETC1_Format","RGB_ETC2_Format","RGBA_ETC2_EAC_Format","RGBA_ASTC_4x4_Format","RGBA_ASTC_5x4_Format","RGBA_ASTC_5x5_Format","RGBA_ASTC_6x5_Format","RGBA_ASTC_6x6_Format","RGBA_ASTC_8x5_Format","RGBA_ASTC_8x6_Format","RGBA_ASTC_8x8_Format","RGBA_ASTC_10x5_Format","RGBA_ASTC_10x6_Format","RGBA_ASTC_10x8_Format","RGBA_ASTC_10x10_Format","RGBA_ASTC_12x10_Format","RGBA_ASTC_12x12_Format","RGBA_BPTC_Format","RGB_BPTC_SIGNED_Format","RGB_BPTC_UNSIGNED_Format","RED_RGTC1_Format","SIGNED_RED_RGTC1_Format","RED_GREEN_RGTC2_Format","SIGNED_RED_GREEN_RGTC2_Format","InterpolateDiscrete","InterpolateLinear","InterpolateSmooth","ZeroCurvatureEnding","ZeroSlopeEnding","WrapAroundEnding","NormalAnimationBlendMode","TrianglesDrawMode","TriangleStripDrawMode","TriangleFanDrawMode","BasicDepthPacking","RGBADepthPacking","TangentSpaceNormalMap","ObjectSpaceNormalMap","NoColorSpace","SRGBColorSpace","LinearSRGBColorSpace","LinearTransfer","SRGBTransfer","KeepStencilOp","AlwaysStencilFunc","NeverCompare","LessCompare","EqualCompare","LessEqualCompare","GreaterCompare","NotEqualCompare","GreaterEqualCompare","AlwaysCompare","StaticDrawUsage","GLSL3","WebGLCoordinateSystem","WebGPUCoordinateSystem","arrayNeedsUint32","array","i","createElementNS","name","createCanvasElement","canvas","_cache","log","params","message","warn","error","warnOnce","probeAsync","gl","sync","interval","resolve","reject","probe","EventDispatcher","listeners","listenerArray","_lut","_seed","DEG2RAD","RAD2DEG","generateUUID","d0","d1","d2","d3","clamp","min","max","euclideanModulo","n","m","mapLinear","x","a1","a2","b1","b2","inverseLerp","y","lerp","damp","lambda","dt","pingpong","length","smoothstep","smootherstep","randInt","low","high","randFloat","randFloatSpread","range","seededRandom","degToRad","degrees","radToDeg","radians","isPowerOfTwo","ceilPowerOfTwo","floorPowerOfTwo","setQuaternionFromProperEuler","q","a","b","c","order","cos","sin","c2","s2","c13","s13","c1_3","s1_3","c3_1","s3_1","denormalize","normalize","MathUtils","Vector2","scalar","s","minVal","maxVal","denominator","theta","alpha","v1","v2","offset","attribute","center","angle","Quaternion","z","w","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","dot","f","quaternion","euler","update","c1","c3","s1","s3","axis","halfAngle","te","m11","m12","m13","m21","m22","m23","m31","m32","m33","trace","vFrom","vTo","r","step","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","qb","qa","theta1","theta2","r1","r2","callback","Vector3","_quaternion$4","vx","vy","vz","qx","qy","qz","qw","tx","ty","tz","camera","ax","ay","az","bx","by","bz","planeNormal","_vector$c","normal","dz","radius","phi","sinPhiRadius","sx","sy","sz","u","Matrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","me","xAxis","yAxis","zAxis","ae","be","a11","a12","a13","a21","a22","a23","a31","a32","a33","b11","b12","b13","b21","b22","b23","b31","b32","b33","h","t11","t12","t13","det","detInv","tmp","matrix4","rotation","cx","cy","_m3","matrix","LINEAR_REC709_TO_XYZ","XYZ_TO_LINEAR_REC709","createColorManagement","ColorManagement","sourceColorSpace","targetColorSpace","SRGBToLinear","LinearToSRGB","colorSpace","target","colorSpaces","targetMatrix","REC709_PRIMARIES","REC709_LUMINANCE_COEFFICIENTS","D65","_canvas","ImageUtils","image","context","imageData","data","_sourceId","Source","meta","isRootObject","output","url","serializeImage","_textureId","_tempVec3","Texture","mapping","wrapS","wrapT","magFilter","minFilter","format","anisotropy","start","count","source","values","newValue","currentValue","uv","Vector4","xx","yy","zz","xy","xz","yz","RenderTarget","texture","current","depth","il","WebGLRenderTarget","DataArrayTexture","layerIndex","Data3DTexture","Box3","_vector$b","points","size","halfSize","object","precise","box","point","vector","geometry","positionAttribute","_box$4","children","sphere","plane","triangle","_center","_extents","_v0$2","_v1$7","_v2$4","_f0","_f1","_f2","axes","satForAxes","_triangleNormal","_points","json","_testAxis","v0","extents","j","p0","p1","p2","_box$3","_v1$6","_v2$3","Sphere","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","lengthSq","delta","_vector$a","_segCenter","_segDir","_diff","_edge1","_edge2","_normal$1","Ray","origin","direction","ray","directionDistance","optionalPointOnRay","optionalPointOnSegment","segExtent","a01","b0","s0","sqrDist","extDet","invDet","tca","radius2","thc","t0","t1","distToPoint","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","backfaceCulling","DdN","sign","DdQxE2","DdE1xQ","QdN","Matrix4","n14","n24","n34","n41","n42","n43","n44","scaleX","_v1$5","scaleY","scaleZ","af","bf","ce","cf","de","df","ac","ad","bc","bd","_zero","_one","eye","up","_z","_x","_y","a14","a24","a34","a41","a42","a43","a44","b14","b24","b34","b41","b42","b43","b44","t14","scaleXSq","scaleYSq","scaleZSq","yx","zx","zy","position","scale","x2","y2","z2","wx","wy","wz","_m1$2","invSX","invSY","invSZ","right","bottom","near","far","coordinateSystem","reversedDepth","_matrix$2","_quaternion$3","Euler","newOrder","Layers","layer","layers","_object3DId","_v1$4","_q1","_m1$1","_target","_position$3","_scale$2","_quaternion$2","_xAxis","_yAxis","_zAxis","_addedEvent","_removedEvent","_childaddedEvent","_childremovedEvent","Object3D","onRotationChange","onQuaternionChange","distance","parent","result","force","updateParents","updateChildren","info","serialize","library","element","parameters","shapes","shape","uuids","animation","geometries","extractFromCache","materials","textures","images","skeletons","animations","nodes","cache","recursive","child","_v0$1","_v1$3","_v2$2","_v3$2","_vab","_vac","_vbc","_vap","_vbp","_vcp","_v40","_v41","_v42","Triangle","targetLengthSq","dot00","dot01","dot02","dot11","dot12","denom","invDenom","p3","v3","attr","i1","i2","i3","barycoord","i0","p","d4","vc","d5","d6","vb","va","_colorKeywords","_hslA","_hslB","hue2rgb","Color","hex","handleAlpha","string","components","_color","hue","saturation","lightness","color1","color2","_materialId","Material","srcPlanes","dstPlanes","MeshBasicMaterial","_tables","_generateTables","buffer","floatView","uint32View","baseTable","shiftTable","mantissaTable","exponentTable","offsetTable","toHalfFloat","val","fromHalfFloat","DataUtils","_vector$9","_vector2$1","_id$2","BufferAttribute","itemSize","normalized","index1","index2","component","Uint16BufferAttribute","Uint32BufferAttribute","Float32BufferAttribute","_id$1","_m1","_obj","_offset","_box$2","_boxMorphTargets","_vector$8","BufferGeometry","indirect","materialIndex","normalMatrix","tangent","morphAttributesPosition","morphAttribute","morphTargetsRelative","jl","attributes","normalAttribute","uvAttribute","tangentAttribute","tan1","tan2","vA","vB","vC","uvA","uvB","uvC","sdir","tdir","handleTriangle","groups","tmp2","n2","handleVertex","pA","pB","pC","nA","nB","nC","cb","ab","normals","convertBufferAttribute","indices","array2","geometry2","newAttribute","morphAttributes","morphArray","hasMorphAttributes","attributeArray","boundingSphere","boundingBox","_inverseMatrix$3","_ray$3","_sphere$6","_sphereHitAt","_vA$1","_vB$1","_vC$1","_tempA","_morphA","_intersectionPoint","_intersectionPointWorld","Mesh","material","ml","morphPosition","morphInfluences","influence","raycaster","intersects","matrixWorld","rayLocalSpace","intersection","uv1","drawRange","groupMaterial","end","checkGeometryIntersection","checkIntersection$1","intersect","face","BoxGeometry","widthSegments","heightSegments","depthSegments","scope","vertices","uvs","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","iy","ix","cloneUniforms","src","property","mergeUniforms","uniforms","merged","cloneUniformsGroups","getUnlitUniformColorSpace","renderer","currentRenderTarget","UniformsUtils","default_vertex","default_fragment","ShaderMaterial","extensions","Camera","_v3$1","_minTarget","_maxTarget","PerspectiveCamera","fov","aspect","focalLength","vExtentSlope","minTarget","maxTarget","fullWidth","fullHeight","view","skew","CubeCamera","renderTarget","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","cameras","scene","activeMipmapLevel","currentActiveCubeFace","currentActiveMipmapLevel","currentXrEnabled","generateMipmaps","CubeTexture","WebGLCubeRenderTarget","shader","mesh","currentMinFilter","stencil","Group","_moveEvent","WebXRController","inputSource","hand","inputjoint","frame","referenceSpace","inputPose","gripPose","handPose","targetRay","grip","jointPose","joint","indexTip","thumbTip","distanceToPinch","threshold","Scene","InterleavedBuffer","stride","interleavedBuffer","ib","_vector$7","InterleavedBufferAttribute","SpriteMaterial","_geometry","_intersectPoint","_worldScale","_mvPosition","_alignedPosition","_rotatedPosition","_viewWorldMatrix","_vA","_vB","_vC","_uvA","_uvB","_uvC","Sprite","float32Array","transformVertex","vertexPosition","mvPosition","_basePosition","_skinIndex","_skinWeight","_vector3","_matrix4","_vertex","_sphere$5","_inverseMatrix$2","_ray$2","SkinnedMesh","skeleton","bindMatrix","skinWeight","weight","boneIndex","Bone","DataTexture","_offsetMatrix","_identityMatrix","Skeleton","bones","boneInverses","inverse","bone","boneMatrices","boneTexture","uuid","boneInverse","InstancedBufferAttribute","meshPerAttribute","_instanceLocalMatrix","_instanceWorldMatrix","_instanceIntersects","_box3","_identity","_mesh$1","_sphere$4","InstancedMesh","objectInfluences","len","dataIndex","raycastTimes","instanceId","morphInfluencesSum","morphBaseInfluence","_vector1","_vector2","_normalMatrix","Plane","constant","inverseNormalLength","line","startSign","endSign","optionalNormalMatrix","referencePoint","_sphere$3","_defaultSpriteCenter","_vector$6","Frustum","p4","p5","planes","frustum","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","sprite","negRadius","LineBasicMaterial","_vStart","_vEnd","_inverseMatrix$1","_ray$1","_sphere$1","_intersectPointOnRay","_intersectPointOnSegment","Line","lineDistances","localThreshold","localThresholdSq","checkIntersection","thresholdSq","_start","_end","LineSegments","LineLoop","PointsMaterial","_inverseMatrix","_ray","_sphere","_position$2","Points","testPoint","rayPointDistanceSq","intersectPoint","CanvasTexture","DepthTexture","ExternalTexture","sourceTexture","Curve","optionalTarget","divisions","lengths","last","sum","arcLengths","targetArcLength","comparison","lengthBefore","segmentLength","segmentFraction","t2","pt1","pt2","segments","closed","tangents","binormals","vec","mat","EllipseCurve","aX","aY","xRadius","yRadius","aStartAngle","aEndAngle","aClockwise","aRotation","twoPi","deltaAngle","samePoints","ArcCurve","aRadius","CubicPoly","c0","init","x3","tension","dt0","dt1","dt2","t3","px","py","pz","CatmullRomCurve3","curveType","intPoint","pow","CatmullRom","QuadraticBezierP0","QuadraticBezierP1","QuadraticBezierP2","QuadraticBezier","CubicBezierP0","CubicBezierP1","CubicBezierP2","CubicBezierP3","CubicBezier","CubicBezierCurve","CubicBezierCurve3","LineCurve","LineCurve3","QuadraticBezierCurve","QuadraticBezierCurve3","SplineCurve","Curves","CurvePath","curve","startPoint","endPoint","lineType","curveLengths","diff","lens","sums","curves","resolution","pts","Path","aCPx","aCPy","aCP1x","aCP1y","aCP2x","aCP2y","npts","firstPoint","lastPoint","Shape","holesPts","hole","earcut","holeIndices","dim","hasHoles","outerLen","outerNode","linkedList","triangles","minX","minY","invSize","eliminateHoles","maxX","maxY","earcutLinked","clockwise","signedArea","insertNode","equals","removeNode","filterPoints","again","area","ear","pass","indexCurve","stop","prev","next","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangleExceptFirst","minZ","zOrder","maxZ","locallyInside","isValidDiagonal","splitPolygon","queue","list","getLeftmost","compareXYSlope","eliminateHole","aSlope","bSlope","bridge","findHoleBridge","bridgeReverse","hx","hy","mx","my","tanMin","pointInTriangle","tan","sectorContainsSector","sortLinked","numMerges","inSize","tail","pSize","qSize","leftmost","intersectsPolygon","middleInside","q1","q2","o1","o2","o3","o4","onSegment","num","inside","createNode","an","bp","Earcut","ShapeUtils","contour","holes","faces","removeDupEndPts","addContour","holeIndex","ExtrudeGeometry","verticesArray","uvArray","addShape","placeholder","curveSegments","steps","bevelEnabled","bevelThickness","bevelSize","bevelOffset","bevelSegments","extrudePath","uvgen","WorldUVGenerator","extrudePts","extrudeByPath","splineTube","binormal","position2","shapePoints","hl","ahole","mergeOverlappingPoints","THRESHOLD_SQ","prevPos","currentIndex","currentPos","distSq","scalingFactorSqrt","thresholdSqScaled","numHoles","scalePt2","pt","vlen","getBevelVec","inPt","inPrev","inNext","v_trans_x","v_trans_y","shrink_by","v_prev_x","v_prev_y","v_next_x","v_next_y","v_prev_lensq","collinear0","v_prev_len","v_next_len","ptPrevShift_x","ptPrevShift_y","ptNextShift_x","ptNextShift_y","sf","v_trans_lensq","direction_eq","contourMovements","holesMovements","oneHoleMovements","verticesMovements","contractedContourVertices","expandedHoleVertices","bs","vert","oneHoleVertices","flen","buildLidFaces","buildSideFaces","f3","layeroffset","sidewalls","sl","slen1","slen2","f4","addVertex","nextIndex","addUV","vector2","toJSON$1","geometryShapes","indexA","indexB","indexC","a_x","a_y","b_x","b_y","c_x","c_y","indexD","a_z","b_z","c_z","d_x","d_y","d_z","PlaneGeometry","width_half","height_half","segment_width","segment_height","SphereGeometry","phiStart","phiLength","thetaStart","thetaLength","thetaEnd","grid","vertex","verticesRow","uOffset","RawShaderMaterial","MeshStandardMaterial","MeshPhysicalMaterial","reflectivity","MeshNormalMaterial","MeshLambertMaterial","MeshDepthMaterial","MeshDistanceMaterial","convertArray","isTypedArray","getKeyframeOrder","times","compareTime","sortedArray","nValues","srcOffset","flattenJSON","jsonKeys","valuePropertyName","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","pp","validate_interval","seek","linear_scan","forward_scan","giveUpAt","t1global","mid","CubicInterpolant","iPrev","iNext","tPrev","tNext","halfDt","o0","oP","oN","wP","wN","ppp","sP","sN","LinearInterpolant","offset1","offset0","weight1","weight0","DiscreteInterpolant","KeyframeTrack","interpolation","track","trackType","factoryMethod","timeOffset","timeScale","startTime","endTime","nKeys","from","to","valid","valueSize","prevTime","currTime","smoothInterpolation","lastIndex","writeIndex","keep","time","timeNext","offsetP","offsetN","readOffset","writeOffset","TypedKeyframeTrack","BooleanKeyframeTrack","ColorKeyframeTrack","NumberKeyframeTrack","QuaternionLinearInterpolant","QuaternionKeyframeTrack","StringKeyframeTrack","VectorKeyframeTrack","AnimationClip","duration","tracks","blendMode","jsonTracks","frameTime","parseKeyframeTrack","clip","clipTracks","morphTargetSequence","fps","noLoop","numMorphTargets","objectOrClipArray","clipArray","o","morphTargets","animationToMorphTargets","pattern","morphTarget","parts","animationMorphTargets","clips","addNonemptyTrack","trackName","animationKeys","propertyName","destTracks","clipName","hierarchyTracks","morphTargetNames","morphTargetName","animationKey","boneName","getTrackTypeForValueTypeName","typeName","Cache","file","LoadingManager","onLoad","onProgress","onError","isLoading","itemsLoaded","itemsTotal","urlModifier","handlers","transform","regex","loader","DefaultLoadingManager","Loader","manager","crossOrigin","path","resourcePath","requestHeader","loading","HttpError","response","FileLoader","cached","req","mimeType","responseType","callbacks","reader","contentLength","lengthComputable","loaded","stream","controller","readData","done","text","exec","decoder","err","_loading","ImageLoader","arr","onImageLoad","removeEventListeners","onImageError","DataTextureLoader","texData","TextureLoader","Light","intensity","_projScreenMatrix$1","_lightPositionWorld$1","_lookTarget$1","LightShadow","light","shadowCamera","shadowMatrix","viewportIndex","SpotLightShadow","SpotLight","penumbra","decay","power","_projScreenMatrix","_lightPositionWorld","_lookTarget","PointLightShadow","PointLight","OrthographicCamera","scaleW","scaleH","DirectionalLightShadow","DirectionalLight","AmbientLight","LoaderUtils","_errorMap","ImageBitmapLoader","imageBitmap","fetchOptions","promise","res","blob","ArrayCamera","Clock","autoStart","newTime","_RESERVED_CHARS_RE","_reservedRe","_wordChar","_wordCharOrDot","_directoryRe","_nodeRe","_objectRe","_propertyRe","_trackRe","_supportedObjectNames","Composite","targetGroup","optionalParsedPath","parsedPath","PropertyBinding","firstValidIndex","binding","bindings","rootNode","root","matches","results","lastDot","objectName","nodeName","searchNodeSubtree","childNode","subTreeNode","dest","targetArray","sourceArray","targetObject","propertyIndex","objectIndex","nodeProperty","versioning","bindingType","_matrix","Raycaster","coords","ascSort","objects","propagate","Spherical","other","_startP","_startEnd","_d1","_d2","_r","_c1","_c2","Line3","clampToLine","startEnd2","EPSILON","Controls","domElement","getByteLength","typeByteLength","getTextureTypeByteLength","WebGLAnimation","isAnimating","animationLoop","requestId","onAnimationFrame","WebGLAttributes","buffers","createBuffer","bufferType","usage","updateBuffer","updateRanges","mergeIndex","previousRange","get","remove","alphahash_fragment","alphahash_pars_fragment","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","alphatest_pars_fragment","aomap_fragment","aomap_pars_fragment","batching_pars_vertex","batching_vertex","begin_vertex","beginnormal_vertex","bsdfs","iridescence_fragment","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","common","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","colorspace_fragment","colorspace_pars_fragment","envmap_fragment","envmap_common_pars_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_pars_fragment","lights_lambert_fragment","lights_lambert_pars_fragment","lights_pars_begin","envmap_physical_pars_fragment","lights_toon_fragment","lights_toon_pars_fragment","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphinstance_vertex","morphcolor_vertex","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normal_pars_fragment","normal_pars_vertex","normal_vertex","normalmap_pars_fragment","clearcoat_normal_fragment_begin","clearcoat_normal_fragment_maps","clearcoat_pars_fragment","iridescence_pars_fragment","opaque_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","transmission_fragment","transmission_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","worldpos_vertex","ShaderChunk","UniformsLib","ShaderLib","_rgb","_e1$1","WebGLBackground","cubemaps","cubeuvmaps","state","premultipliedAlpha","clearColor","clearAlpha","planeMesh","boxMesh","currentBackground","currentBackgroundVersion","currentTonemapping","getBackground","background","render","forceClear","setClear","environmentBlendMode","addToRenderList","renderList","dispose","WebGLBindingStates","maxVertexAttributes","bindingStates","defaultState","createBindingState","currentState","forceUpdate","setup","program","updateBuffers","getBindingState","bindVertexArrayObject","needsUpdate","saveCache","setupVertexAttributes","createVertexArrayObject","vao","deleteVertexArrayObject","wireframe","programMap","stateMap","newAttributes","enabledAttributes","attributeDivisors","cachedAttributes","geometryAttributes","attributesNum","programAttributes","cachedAttribute","geometryAttribute","initAttributes","enableAttribute","enableAttributeAndDivisor","disableUnusedAttributes","vertexAttribPointer","integer","materialDefaultAttributeValues","programAttribute","bytesPerElement","reset","geometryId","programId","releaseStatesOfGeometry","releaseStatesOfProgram","resetDefaultState","WebGLBufferRenderer","mode","setMode","renderInstances","primcount","renderMultiDraw","starts","counts","drawCount","elementCount","renderMultiDrawInstances","extension","WebGLCapabilities","utils","maxAnisotropy","getMaxAnisotropy","textureFormatReadable","textureFormat","textureTypeReadable","textureType","halfFloatSupportedByExt","getMaxPrecision","precision","maxPrecision","logarithmicDepthBuffer","reversedDepthBuffer","maxTextures","maxVertexTextures","maxTextureSize","maxCubemapSize","maxAttributes","maxVertexUniforms","maxVaryings","maxFragmentUniforms","vertexTextures","maxSamples","WebGLClipping","properties","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","uniform","enableLocalClipping","enabled","projectPlanes","useCache","clipIntersection","clipShadows","materialProperties","resetGlobalState","nGlobal","lGlobal","dstArray","skipTransform","nPlanes","flatSize","viewMatrix","i4","WebGLCubeMaps","mapTextureMapping","cubemap","onTextureDispose","LOD_MIN","EXTRA_LOD_SIGMA","MAX_SAMPLES","GGX_SAMPLES","_flatCamera","_clearColor","_oldTarget","_oldActiveCubeFace","_oldActiveMipmapLevel","_oldXrEnabled","_origin","PMREMGenerator","sigma","cubeUVRenderTarget","equirectangular","_getCubemapMaterial","_getEquirectMaterial","cubeSize","outputTarget","_setViewport","_createRenderTarget","_lodMax","_createPlanes","_getBlurShader","_getGGXShader","cubeCamera","upSign","forwardSign","originalAutoClear","toneMapping","backgroundBox","backgroundMaterial","useSolidColor","col","isCubeTexture","autoClear","lodIn","lodOut","pingPongRenderTarget","ggxMaterial","ggxMesh","ggxUniforms","targetRoughness","sourceRoughness","incrementalRoughness","blurStrength","adjustedRoughness","outputSize","poleAxis","targetIn","targetOut","sigmaRadians","blurMaterial","STANDARD_DEVIATIONS","blurMesh","blurUniforms","pixels","radiansPerPixel","sigmaPixels","samples","weights","lodMax","sizeLods","sigmas","lodMeshes","lod","totalLods","sizeLod","texelSize","cubeFaces","positionSize","uvSize","faceIndexSize","faceIndex","coordinates","fill","_getCommonVertexShader","WebGLCubeUVMaps","cubeUVmaps","pmremGenerator","isEquirectMap","isCubeMap","currentPMREMVersion","isCubeTextureComplete","cubemapUV","WebGLExtensions","getExtension","WebGLGeometries","wireframeAttributes","onGeometryDispose","updateWireframeAttribute","geometryIndex","geometryPosition","version","previousAttribute","getWireframeAttribute","currentAttribute","WebGLIndexedBufferRenderer","setIndex","WebGLInfo","memory","instanceCount","WebGLMorphtargets","capabilities","morphTextures","morph","morphTargetsCount","entry","disposeTexture","hasMorphPosition","hasMorphNormals","hasMorphColors","morphNormals","morphColors","vertexDataCount","vertexDataStride","morphNormal","morphColor","WebGLObjects","updateMap","buffergeometry","onInstancedMeshDispose","instancedMesh","emptyTexture","emptyShadowTexture","emptyArrayTexture","empty3dTexture","emptyCubeTexture","arrayCacheF32","arrayCacheI32","mat4array","mat3array","mat2array","flatten","nBlocks","blockSize","firstElem","arraysEqual","copyArray","allocTexUnits","setValueV1f","setValueV2f","setValueV3f","setValueV4f","setValueM2","elements","setValueM3","setValueM4","setValueV1i","setValueV2i","setValueV3i","setValueV4i","setValueV1ui","setValueV2ui","setValueV3ui","setValueV4ui","setValueT1","unit","emptyTexture2D","setValueT3D1","setValueT6","setValueT2DArray1","getSingularSetter","setValueV1fArray","setValueV2fArray","setValueV3fArray","setValueV4fArray","setValueM2Array","setValueM3Array","setValueM4Array","setValueV1iArray","setValueV2iArray","setValueV3iArray","setValueV4iArray","setValueV1uiArray","setValueV2uiArray","setValueV3uiArray","setValueV4uiArray","setValueT1Array","units","setValueT3DArray","setValueT6Array","setValueT2DArrayArray","getPureArraySetter","SingleUniform","activeInfo","addr","PureArrayUniform","StructuredUniform","seq","RePathPart","addUniform","uniformObject","parseUniform","pathLength","match","matchEnd","idIsIndex","subscript","WebGLUniforms","WebGLShader","COMPLETION_STATUS_KHR","programIdCount","handleSource","errorLine","lines","lines2","_m0","getEncodingComponents","encodingMatrix","getShaderErrors","status","errors","errorMatches","getTexelEncodingFunction","functionName","getToneMappingFunction","toneMappingName","_v0","getLuminanceFunction","generateVertexExtensions","filterEmptyLine","generateDefines","defines","chunks","fetchAttributeLocations","locationSize","replaceLightNums","numSpotLightCoords","replaceClippingPlaneNums","includePattern","resolveIncludes","includeReplacer","shaderChunkMap","include","newInclude","unrollLoopPattern","unrollLoops","loopReplacer","snippet","generatePrecision","precisionstring","generateShadowMapTypeDefine","shadowMapTypeDefine","generateEnvMapTypeDefine","envMapTypeDefine","generateEnvMapModeDefine","envMapModeDefine","generateEnvMapBlendingDefine","envMapBlendingDefine","generateCubeUVSize","imageHeight","maxMip","texelHeight","WebGLProgram","cacheKey","vertexShader","fragmentShader","envMapCubeUVSize","customVertexExtensions","customDefines","prefixVertex","prefixFragment","versionString","vertexGlsl","fragmentGlsl","glVertexShader","glFragmentShader","onFirstUse","self","programInfoLog","vertexShaderInfoLog","fragmentShaderInfoLog","programLog","vertexLog","fragmentLog","runnable","haveDiagnostics","vertexErrors","fragmentErrors","cachedUniforms","programReady","_id","WebGLShaderCache","vertexShaderStage","fragmentShaderStage","materialShaders","shaderStage","set","code","stage","WebGLShaderStage","WebGLPrograms","clipping","_programLayers","_customShaders","_activeChannels","programs","SUPPORTS_VERTEX_TEXTURES","shaderIDs","getChannel","getParameters","lights","shadows","fog","environment","envMap","envMapCubeUVHeight","shaderID","morphTextureStride","customVertexShaderID","customFragmentShaderID","IS_INSTANCEDMESH","IS_BATCHEDMESH","HAS_MAP","HAS_MATCAP","HAS_ENVMAP","HAS_AOMAP","HAS_LIGHTMAP","HAS_BUMPMAP","HAS_NORMALMAP","HAS_DISPLACEMENTMAP","HAS_EMISSIVEMAP","HAS_METALNESSMAP","HAS_ROUGHNESSMAP","HAS_ANISOTROPY","HAS_CLEARCOAT","HAS_DISPERSION","HAS_IRIDESCENCE","HAS_SHEEN","HAS_TRANSMISSION","HAS_ANISOTROPYMAP","HAS_CLEARCOATMAP","HAS_CLEARCOAT_NORMALMAP","HAS_CLEARCOAT_ROUGHNESSMAP","HAS_IRIDESCENCEMAP","HAS_IRIDESCENCE_THICKNESSMAP","HAS_SHEEN_COLORMAP","HAS_SHEEN_ROUGHNESSMAP","HAS_SPECULARMAP","HAS_SPECULAR_COLORMAP","HAS_SPECULAR_INTENSITYMAP","HAS_TRANSMISSIONMAP","HAS_THICKNESSMAP","HAS_GRADIENTMAP","HAS_ALPHAMAP","HAS_ALPHATEST","HAS_ALPHAHASH","HAS_EXTENSIONS","getProgramCacheKey","getProgramCacheKeyParameters","getProgramCacheKeyBooleans","getUniforms","acquireProgram","pl","preexistingProgram","releaseProgram","releaseShaderCache","WebGLProperties","has","map","painterSortStable","reversePainterSortStable","WebGLRenderList","renderItems","renderItemsIndex","opaque","transmissive","transparent","getNextRenderItem","groupOrder","renderItem","push","unshift","sort","customOpaqueSort","customTransparentSort","finish","WebGLRenderLists","lists","renderCallDepth","listArray","UniformsCache","ShadowUniformsCache","nextVersion","shadowCastingAndTexturingLightsFirst","lightA","lightB","WebGLLights","shadowCache","vector3","matrix42","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","numDirectionalShadows","numPointShadows","numSpotShadows","numSpotMaps","numSpotShadowsWithMaps","numLightProbes","shadowMap","shadow","shadowUniforms","hash","setupView","WebGLRenderState","lightsArray","shadowsArray","pushLight","pushShadow","shadowLight","setupLights","setupLightsView","WebGLRenderStates","renderStates","renderStateArray","renderState","fragment","WebGLShadowMap","_frustum","_shadowMapSize","_viewportSize","_viewport","_depthMaterial","_distanceMaterial","_materialCache","_maxTextureSize","shadowSide","shadowMaterialVertical","shadowMaterialHorizontal","fullScreenTri","fullScreenMesh","_previousType","activeCubeFace","_state","toVSM","fromVSM","shadowFrameExtents","pars","viewportCount","vp","viewport","renderObject","VSMPass","getDepthMaterial","customMaterial","keyA","keyB","materialsForVariant","cachedMaterial","onMaterialDispose","kl","depthMaterial","reversedFuncs","WebGLState","ColorBuffer","locked","currentColorMask","currentColorClear","colorMask","lock","DepthBuffer","currentReversed","currentDepthMask","currentDepthFunc","currentDepthClear","reversed","ext","oldDepth","depthTest","enable","disable","depthMask","depthFunc","StencilBuffer","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","stencilMask","stencilFunc","stencilRef","stencilFail","stencilZFail","stencilZPass","colorBuffer","depthBuffer","stencilBuffer","uboBindings","uboProgramMap","enabledCapabilities","currentBoundFramebuffers","currentDrawbuffers","defaultDrawbuffers","currentProgram","currentBlendingEnabled","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentBlendColor","currentBlendAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","lineWidthAvailable","glVersion","currentTextureSlot","currentBoundTextures","scissorParam","viewportParam","currentScissor","currentViewport","createTexture","dimensions","emptyTextures","setFlipSided","setCullFace","setBlending","bindFramebuffer","framebuffer","drawBuffers","useProgram","equationToGL","factorToGL","blending","blendEquation","blendSrc","blendDst","blendEquationAlpha","blendSrcAlpha","blendDstAlpha","blendColor","blendAlpha","setMaterial","frontFaceCW","flipSided","stencilWrite","setPolygonOffset","cullFace","setLineWidth","polygonOffset","factor","setScissorTest","scissorTest","activeTexture","webglSlot","bindTexture","webglType","webglTexture","boundTexture","unbindTexture","compressedTexImage2D","compressedTexImage3D","texSubImage2D","texSubImage3D","compressedTexSubImage2D","compressedTexSubImage3D","texStorage2D","texStorage3D","texImage2D","texImage3D","scissor","updateUBOMapping","uniformsGroup","blockIndex","uniformBlockBinding","WebGLTextures","_gl","multisampledRTTExt","supportsInvalidateFramebuffer","_imageDimensions","_videoTextures","_sources","useOffscreenCanvas","createCanvas","resizeImage","needsNewCanvas","maxSize","getDimensions","textureNeedsGenerateMipmaps","generateMipmap","getTargetType","getInternalFormat","internalFormatName","glFormat","glType","forceLinearTransfer","internalFormat","transfer","getInternalDepthFormat","useStencil","depthType","glInternalFormat","getMipLevels","deallocateTexture","onRenderTargetDispose","deallocateRenderTarget","textureProperties","webglTextures","deleteTexture","renderTargetProperties","level","attachmentProperties","textureUnits","resetTextureUnits","allocateTextureUnit","textureUnit","getTextureCacheKey","setTexture2D","slot","updateVideoTexture","uploadTexture","setTexture2DArray","setTexture3D","setTextureCube","uploadCubeTexture","wrappingToGL","filterToGL","compareToGL","setTextureParameters","initTexture","forceUpload","textureCacheKey","getRow","rowLength","componentStride","updateTexture","previousEnd","currentRow","previousRow","currentUnpackRowLen","currentUnpackSkipPixels","currentUnpackSkipRows","pixelStart","pixelCount","sourceProperties","workingPrimaries","texturePrimaries","unpackConversion","verifyColorSpace","mipmap","mipmaps","useTexStorage","allocateMemory","dataReady","levels","layerByteLength","layerData","isCompressed","isDataTexture","cubeImage","mipmapImage","setupFrameBufferTexture","attachment","textureTarget","useMultisampledRTT","getRenderTargetSamples","setupRenderBufferStorage","renderbuffer","isMultisample","depthTexture","glAttachmentType","setupDepthTexture","webglDepthTexture","setupDepthRenderbuffer","isCube","disposeEvent","rebindTextures","colorTexture","setupRenderTarget","isMultipleRenderTargets","glTextureType","updateRenderTargetMipmap","targetType","invalidationArrayRead","invalidationArrayDraw","updateMultisampleRenderTarget","mask","depthStyle","WebGLUtils","convert","_occlusion_vertex","_occlusion_fragment","WebXRDepthSensing","depthData","cameraXR","WebXRManager","session","framebufferScaleFactor","referenceSpaceType","foveation","customReferenceSpace","pose","glBinding","glProjLayer","glBaseLayer","xrFrame","supportsGlBinding","depthSensing","cameraAccessTextures","initialRenderTarget","newRenderTarget","controllers","controllerInputSources","currentSize","currentPixelRatio","cameraL","cameraR","_currentDepthNear","_currentDepthFar","onSessionEvent","controllerIndex","onSessionEnd","onInputSourcesChange","space","depthFormat","glDepthFormat","projectionlayerInit","layerInit","cameraLPos","cameraRPos","setProjectionFromUnion","ipd","projL","projR","topFov","bottomFov","leftFov","rightFov","zOffset","xOffset","near2","far2","left2","right2","top2","bottom2","updateCamera","depthNear","depthFar","updateUserCamera","xrCamera","onAnimationFrameCallback","views","cameraXRNeedsUpdate","glSubImage","enabledFeatures","cameraTex","glTexture","_e1","WebGLMaterials","refreshTransformUniform","refreshFogUniforms","refreshMaterialUniforms","pixelRatio","transmissionRenderTarget","refreshUniformsCommon","refreshUniformsToon","refreshUniformsPhong","refreshUniformsStandard","refreshUniformsPhysical","refreshUniformsMatcap","refreshUniformsDistance","refreshUniformsLine","refreshUniformsDash","refreshUniformsPoints","refreshUniformsSprites","envMapRotation","WebGLUniformsGroups","updateList","allocatedBindingPoints","maxBindingPoints","bind","webglProgram","prepareUniformsGroup","onUniformsGroupsDispose","updateBufferData","bindingPointIndex","allocateBindingPointIndex","uniformArray","hasUniformChanged","arrayOffset","getUniformSize","indexArray","indexString","cachedObject","chunkSize","chunkOffset","chunkPadding","chunkStart","DATA","lut","getDFGLUT","WebGLRenderer","antialias","preserveDrawingBuffer","powerPreference","failIfMajorPerformanceCaveat","_alpha","INTEGER_FORMATS","UNSIGNED_TYPES","uintClearColor","intClearColor","currentRenderList","currentRenderState","renderListStack","renderStateStack","_this","_isContextLost","_currentActiveCubeFace","_currentActiveMipmapLevel","_currentRenderTarget","_currentMaterialId","_currentCamera","_currentViewport","_currentScissor","_currentScissorTest","_currentClearColor","_currentClearAlpha","_width","_height","_pixelRatio","_opaqueSort","_transparentSort","_scissor","_scissorTest","_clippingEnabled","_localClippingEnabled","_vector4","_emptyScene","_renderBackground","getTargetPixelRatio","getContext","contextName","contextAttributes","onContextLost","onContextRestore","onContextCreationError","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","uniformsGroups","initGLContext","xr","updateStyle","boolean","method","bits","isIntegerFormat","targetFormat","isUnsignedType","onXRSessionStart","onXRSessionEnd","infoAutoReset","shadowMapEnabled","shadowMapAutoUpdate","shadowMapNeedsUpdate","shadowMapType","deallocateMaterial","releaseMaterialProgramReferences","setProgram","rangeFactor","drawStart","drawEnd","lineWidth","maxInstanceCount","prepareMaterial","getProgram","targetScene","material2","checkMaterialsReady","depthSensingMesh","projectObject","opaqueObjects","transmissiveObjects","camera2","renderTransmissionPass","renderScene","sortObjects","transparentObjects","renderObjects","activeViewport","currentToneMapping","currentCameraViewport","renderTargetNeedsUpdate","currentSide","overrideMaterial","lightsStateVersion","programCacheKey","updateCommonMaterialProperties","materialNeedsLights","getUniformList","progUniforms","vertexAlphas","vertexTangents","needsProgramChange","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","uCamPos","markUniformsLightsNeedsUpdate","defaultFramebuffer","_scratchFrameBuffer","useDefaultFramebuffer","isRenderTarget3D","__webglFramebuffer","activeCubeFaceIndex","textureIndex","glBuffer","currFramebuffer","levelScale","_srcFramebuffer","_dstFramebuffer","srcTexture","dstTexture","srcRegion","dstPosition","srcLevel","dstLevel","dstX","dstY","dstZ","glTarget","currentUnpackImageHeight","currentUnpackSkipImages","isSrc3D","isDst3D","srcTextureProperties","dstTextureProperties","srcRenderTargetProperties","dstRenderTargetProperties","Ul","M.Scene","M.Group","Vl","M.PerspectiveCamera","M.OrthographicCamera","Hl","M.WebGLRenderer","M.PCFSoftShadowMap","M.SRGBColorSpace","Ar","cr","na","Yn","rr","Cr","Xi","Gl","or","ve","K","Ne","fe","ss","Wl","Ya","gn","dn","Ni","vr","ue","Zl","Xl","ql","tc","$l","Jl","Ql","ec","Yl","Kl","nc","ic","Pr","M.Vector3","M.Raycaster","M.Euler","hr","M.Vector2","I","M.InstancedMesh","T","R","_","E","A","H","P","V","C","D","$","O","N","M.MathUtils","sc","Kt","tn","rc","Vo","oc","Zi","br","Yi","ar","Pi","tt","nt","Rr","lc","cc","Vn","_t","ze","Ka","hc","st","Kn","Me","$n","rs","uc","dc","lr","vt","Jn","ia","fc","sa","G","Q","ee","pe","se","oe","he","Te","Ie","S","W","L","B","X","Z","F","Y","ne","J","ie","Ee","Je","De","Bt","ye","sn","Mn","Qe","Tt","Nt","Ft","Ut","Et","Fe","Ho","Ns","pn","fn","Bs","jo","Go","Wo","Xo","xn","$a","Ja","Qn","ei","ti","xt","Qa","Ci","ni","pc","Fi","tl","nl","rl","ol","al","ll","mc","gc","yc","M.WebGLRenderTarget","M.LinearFilter","M.RGBAFormat","ii","ra","si","os","Dr","wc","Sn","Zn","xc","oa","aa","_c","ur","Ki","la","$i","at","Ji","vn","_n","jn","Ve","ca","ha","Gn","Mc","Ri","Sc","Tc","Ec","Ac","Cc","Pc","Rc","Dc","kc","Ic","Lc","zc","Oc","Wn","ua","Yt","da","Vs","Bc","Nc","Fc","Uc","Vc","Hc","jc","Gc","Wc","Xc","Zc","kr","qc","fa","Yc","Kc","$c","Jc","Qc","eh","th","nh","pa","ih","sh","U","re","ma","ga","rh","Hs","ya","Ir","oh","ah","Qi","Lr","dr","wa","lh","xa","zr","_a","ch","hh","uh","dh","fr","js","fh","ph","mh","gh","ke","yh","wh","xh","_h","Xn","vh","bh","Or","Tn","Di","Mh","Sh","as","Th","Eh","He","ls","ba","bn","Ma","Ah","Ch","Ph","Vi","Br","Nr","Rh","Dh","kh","Ih","Sa","Fr","Qt","Ta","Lh","zh","Oh","Bh","Nh","Fh","Ur","Vr","ri","Uh","Hr","jr","Gr","Vh","Hh","Ea","pr","Wr","jh","Gh","Aa","cs","Xr","Ca","es","Zr","Wh","ki","lt","$t","Xh","Pa","Zh","qh","Gs","Ra","xe","Op","Bp","Np","Fp","Up","Vp","Hp","jp","Gp","Wp","Xp","Zp","qp","Yp","Kp","$p","qr","Yh","Da","hs","Kh","Zo","Ui","Lt","rt","ut","qo","Yo","$h","zt","Jh","M.MeshBasicMaterial","M.BufferGeometry","M.Color","oi","ai","M.Matrix4","M.Shape","M.ExtrudeGeometry","M.MeshStandardMaterial","M.DoubleSide","M.Mesh","ka","Yr","Kr","cl","Fs","Ko","Qh","su","ru","pu","mu","gu","au","lu","cu","hu","iu","uu","ou","fu","du","tu","yu","wu","Nn","Ia","le","xu","ku","nu","_u","vu","bu","eu","dl","ul","ct","On","ft","Xe","fl","$o","En","$r","Ws","yn","La","zl","Mu","Su","Jr","Hn","xl","wl","yl","Jo","Qr","vl","_l","us","At","Tu","ea","Ll","ds","Eu","Qo","Us","Vt","Au","Cu","Pu","fs","Xs","Ru","Du","Mr","bl","ns","Ml","qi","Sl","eo","Tl","El","Al","Cl","Pl","is","Rl","Dl","Il","Tr","Er","Sr","Iu","ot","Ol","Lu","zu","Ou","M.Box3","Bu","Nu","Fu","M.InstancedBufferAttribute","M.FrontSide","Uu","Vu","Hu","ju","M.DirectionalLight","M.AmbientLight","Se","Gu","Wu","Xu","qu","no","Zu","je","Yu","Hi","M.AdditiveBlending","Ii","Ku","io","$u","Ju","Qu","wn","Bn","ed","Zs","za","qs","td","An","nd","Bl","qn","sd","rd","M.Quaternion","M.TextureLoader","M.MeshLambertMaterial","M.BoxGeometry","od","ld","cd","M.PlaneGeometry","bt","St","hd","ud","dd","fd","pd","md","gd","yd","wd","Oa","xd","_d","so","ps","ro","Oe","Ae","Ba","vd","ms","nn","Md","Sd","Na","oo","gs","ao","we","lo","co","ho","li","Cn","yt","Td","Ct","ci","Ed","Ad","ys","Cd","Pd","Fa","Li","Ys","Ua","Rd","Ks","Dd","$s","kd","Id","Ld","Mt","zd","mr","Od","Ke","Bd","wt","uo","We","$e","Ue","Be","gr","Nd","qe","Ce","Ge","Ye","Pe","Re","yr","Fd","ge","kt","mn","rn","hi","Ud","Js","Pn","ws","Vd","ui","ta","Hd","Ht","jt","Gt","di","fi","pi","fo","po","mo","Rn","jd","Nl","go","yo","ts","Gd","Wd","Xd","Zd","Ot","qd","Yd","Kd","$d","Qs","Jd","Qd","er","mi","on","Dn","wo","gi","ef","tr","yi","xs","kn","tf","nf","rf","of","lf","nr","hf","ir","wi","ln","cn","In","xo","xi","uf","sr","_i","_s","Ln","ff","pf","mf","gf","yf","Fn","ji","Rt","hn","un","vs","Ms","wf","et","vi","_o","xf","wr","Va","_f","Ha","vf","ht","vo","Mf","Sf","ja","Tf","Ef","Af","Cf","Pf","Rf","Df","kf","bo","Mo","If","So","To","Lf","Ss","Ts","bi","zf","Of","Es","Bf","en","As","Nf","Gi","Ff","Cs","Eo","Ao","Dt","Ps","zn","Uf","_e","mt","Rs","Co","Mi","Ds","Vf","Hf","jf","Po","Gf","Ro","Wf","Xf","Zf","Ga","qf","Wa","Xa","Ze","Do","Le","gt","ko","Io","Lo","ks","Si","Ti","zo","Is","Ls","Yf","Zt","qt","zi","Oi","Un","Wt","Kf","Bi","Oo","Za","$f","Jf","Qf","zs","ep","Os","tp","Bo","np","It","Wi","Fl","Xt","Ei","Pt","Ai","it","Jt","ip","sp","No","Fo","rp","op","ap","Uo","lp","cp","M.Float32BufferAttribute","hp","M.Plane","M.BufferAttribute","M.LineBasicMaterial","M.Line","dp","fp","mp","gp","yp","wp","M.LineSegments","xp","_p","main2Txx2Vau","stepCkmZYIvn","API__B1v8UcRF","M.Spherical","Mp","Sp","M.Sprite","M.CanvasTexture","M.SpriteMaterial","Tp","Ep","Ap","Cp","M.EquirectangularReflectionMapping","M.PMREMGenerator","M.SphereGeometry","M.BackSide","Pp","M.Clock","M.RepeatWrapping","M.ShaderMaterial","Rp","Dp","kp","M.Points","M.Texture","Jp","Engine","engineConfig","createEngineSDK","hit","_theme","urls","measure","setting","selectType","model","speed","gravity","collision","models","safeModels","normalizeUrl","loadedModels","modelMap","loadedModel","idsSet","rawId","node","ids","BimRightKey","rect","viewportWidth","viewportHeight","newX","newY","BimMenu","items","defaultGroup","groupName","sortedGroupKeys","divider","groupItems","isEnabled","iconDiv","labelDiv","hasChildren","arrowDiv","parentLi","subMenu","subRect","RightKeyManager","menu","EngineManager","selected","TreeNodeCheckState","BimTreeNode","nodeEl","iconEl","indent","newChecked","fireEvent","BimTree","searchContainer","query","lowerQuery","noData","containerRect","nodeRect","nodeTopInContainer","targetTop","childConfig","isChecked","allChecked","allUnchecked","checked","expanded","includeHalfChecked","BimTab","tab","tabId","panel","targetTab","isActive","treeContent","savedTop","ICONS","getIcon","fnv1a32","input","seed","hashIds","str","h1","h2","collectModelParams","grouped","collect","modelUrl","idSet","nodeIdCounter","transformTreeData","apiData","transformNode","ConstructTreeManagerBtn","levelTreeData","typeTreeData","majorTreeData","createTree","transformedData","tree","modelParam","componentTree","typeTree","majorTree","componentPanel","typePanel","majorPanel","tabMount","resetAllTrees","unsubscribeShowAll","BaseDialogManager","containerWidth","MEASURE_TYPES","MEASURE_MODES_ORDERED","getValueType","getModeBycallBackType","callBackType","MeasurePanel","triggerCallback","partial","persist","toolsBox","fallbackCircleIconSvg","toggleBox","toggleIconEl","resultBox","mainValueRow","mainValueLabel","mainValueValue","xyzBox","makeXyzRow","labelKey","valueClassName","valueElSetter","row","footer","unitRow","unitLabel","hint","precisionRow","precisionLabel","actions","dirGroup","dirLabel","dirItems","dirDown","dirUp","selGroup","selLabel","selItems","selPoint","selElement","i18nKey","onClick","dir","opt","raw","parsed","xyz","valueType","converted","MeasureDialogManager","panelWrapper","engine","targetMode","SectionPlanePanel","isHidden","iconSvg","SectionPlaneDialogManager","paddingRight","paddingBottom","SectionAxisPanel","row1","row2","_type","SectionAxisDialogManager","DEFAULT_RANGE","SectionBoxPanel","isReversed","buttonsContainer","slidersContainer","ref","iconMap","labelEl","slider","minHandle","maxHandle","handleType","percentage","minH","maxH","rangeEl","SectionBoxDialogManager","WalkControlPanel","newMode","leftButtons","divider1","divider2","exitBtn","gravityWrapper","collisionWrapper","characterWrapper","walkModeWrapper","controlGroup","oldMode","speedWrapper","speedLabel","constructionWorkerOption","officeMaleOption","walkOption","runOption","WalkPathPanel","enginePoints","settings","pointsSection","playBtn","section","durationGroup","durationLabel","durationWrapper","durationInput","durationUnit","loopGroup","loopCheckbox","loopLabel","toolbar","addBtn","deleteAllBtn","empty","jumpBtn","deleteBtn","stopBtn","newIndex","pointIndex","WalkPathDialogManager","WalkControlManager","engineSpeed","EngineInfoDialogManager","createRow","valueEl","SECTION_LABEL_STYLE","DIVIDER_STYLE","ROW_STYLE","SLIDER_VALUE_STYLE","BORDER_COLOR","INPUT_BG","PRIMARY","TEXT_PRIMARY","TEXT_INVERSE","HOVER_BG","SettingDialogManager","div","currentMode","modes","toggleOffBg","toggleOnBg","toggle","knob","labelText","onChange","valueDisplay","envKeys","select","groundKeys","sizeRow","sizeLabel","sizeInput","option","BimCollapseItem","itemEl","extraEl","BimCollapse","itemConfig","ComponentDetailManager","propertiesPanel","materialsPanel","collapseItems","category","AiChat","isDark","placeholderEl","helperL","helperR","updates","question","prompt","promptId","msg","optionsHtml","selectedOption","answer","questionId","optionId","AiChatManager","customAnswer","EventEmitter","ManagerRegistry","BimEngine","versionEl","_button","_registry","doc","isFullscreen","targetElem","exitMethod","requestMethod"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAE3BC,GAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEhCC,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAE1BC,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAExBC,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEnBC,GAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAE3BC,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,QAElBC,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEvBC,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAElBC,GAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEpBC,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEvBC,GAA4B;AAAA;AAAA,QAE5BC,GAAuB;AAAA;AAAA,QAEvBC,GAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wDAE5BC,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAExBC,GAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAE7BC,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEnBC,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEjBC,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEZC,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAsEtB,MAAMC,GAAc,CACnB,mBAAoB3G,GACpB,wBAAyBC,GACzB,kBAAmBC,GACnB,uBAAwBC,GACxB,mBAAoBC,GACpB,wBAAyBC,GACzB,eAAgBC,GAChB,oBAAqBC,GACrB,qBAAsBC,GACtB,gBAAiBC,GACjB,aAAcC,GACd,mBAAoBC,GACpB,MAAOC,GACP,qBAAsBC,GACtB,sBAAuBC,GACvB,yBAA0BC,GAC1B,8BAA+BC,GAC/B,4BAA6BC,GAC7B,uBAAwBC,GACxB,eAAgBC,GAChB,oBAAqBC,GACrB,kBAAmBC,GACnB,aAAcC,GACd,OAAQC,GACR,4BAA6BC,GAC7B,qBAAsBC,GACtB,4BAA6BC,GAC7B,uBAAwBC,GACxB,qBAAsBC,GACtB,0BAA2BC,GAC3B,oBAAqBC,GACrB,yBAA0BC,GAC1B,gBAAiBC,GACjB,4BAA6BC,GAC7B,qBAAsBC,GACtB,mBAAoBC,GACpB,8BAA+BW,GAC/B,cAAeV,GACf,WAAYC,GACZ,gBAAiBC,GACjB,aAAcC,GACd,kBAAmBC,GACnB,0BAA2BC,GAC3B,uBAAwBC,GACxB,wBAAyBC,GACzB,6BAA8BC,GAC9B,kBAAmBC,GACnB,qBAAsBE,GACtB,0BAA2BC,GAC3B,sBAAuBC,GACvB,2BAA4BC,GAC5B,yBAA0BC,GAC1B,8BAA+BC,GAC/B,sBAAuBC,GACvB,qBAAsBC,GACtB,oBAAqBC,GACrB,qBAAsBC,GACtB,0BAA2BC,GAC3B,wBAAyBC,GACzB,mBAAoBC,GACpB,aAAcC,GACd,kBAAmBC,GACnB,sBAAuBC,GACvB,2BAA4BC,GAC5B,sBAAuBC,GACvB,2BAA4BC,GAC5B,qBAAsBC,GACtB,kBAAmBC,GACnB,mBAAoBC,GACpB,wBAAyBC,GACzB,mBAAoBC,GACpB,sBAAuBC,GACvB,qBAAsBC,GACtB,qBAAsBC,GACtB,mBAAoBC,GACpB,cAAeC,GACf,wBAAyBC,GACzB,gCAAiCC,GACjC,+BAAgCC,GAChC,wBAAyBC,GACzB,0BAA2BC,GAC3B,gBAAiBC,GACjB,QAASC,GACT,6BAA8BC,GAC9B,eAAgBC,GAChB,mBAAoBC,GACpB,wBAAyBC,GACzB,sBAAuBC,GACvB,2BAA4BC,GAC5B,wBAAyBC,GACzB,sBAAuBC,GACvB,iBAAkBC,GAClB,yBAA0BC,GAC1B,gBAAiBC,GACjB,qBAAsBC,GACtB,gBAAiBC,GACjB,kBAAmBC,GACnB,qBAAsBC,GACtB,0BAA2BC,GAC3B,qBAAsBC,GACtB,0BAA2BC,GAC3B,sBAAuBC,GACvB,2BAA4BC,GAC5B,iBAAkBC,GAClB,eAAgBC,GAChB,UAAWC,GACX,gBAAiBC,GAEjB,gBAjLgB;AAAA;AAAA;AAAA;AAAA;AAAA,GAkLhB,gBAhLkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAiLlB,oBA/KgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgLhB,oBA9KkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA+KlB,UA7KgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA8KhB,UA5KkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA6KlB,WA3KgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA4KhB,WA1KkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA2KlB,kBAzKgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA0KhB,kBAxKkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAyKlB,cAvKgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAwKhB,cAtKkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAuKlB,gBArKgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAsKhB,gBApKkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAqKlB,eAnKgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAoKhB,eAlKkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAmKlB,iBAjKgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAkKhB,iBAhKkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAiKlB,gBA/JgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgKhB,gBA9JkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA+JlB,gBA7JgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA8JhB,gBA5JkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA6JlB,eA3JgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA4JhB,eA1JkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA2JlB,kBAzJgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA0JhB,kBAxJkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAyJlB,cAvJgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAwJhB,cAtJkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAuJlB,YArJgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAsJhB,YApJkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAqJlB,YAnJgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAoJhB,YAlJkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAmJlB,YAjJgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAkJhB,YAhJkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiJnB,EAGME,GAAc,CAEnB,OAAQ,CAEP,QAAS,CAAE,MAAqB,IAAI3hC,GAAO,QAAQ,CAAE,EACrD,QAAS,CAAE,MAAO,CAAG,EAErB,IAAK,CAAE,MAAO,IAAI,EAClB,aAAc,CAAE,MAAqB,IAAIrW,EAAS,EAElD,SAAU,CAAE,MAAO,IAAI,EACvB,kBAAmB,CAAE,MAAqB,IAAIA,EAAS,EAEvD,UAAW,CAAE,MAAO,CAAC,CAEvB,EAEC,YAAa,CAEZ,YAAa,CAAE,MAAO,IAAI,EAC1B,qBAAsB,CAAE,MAAqB,IAAIA,EAAS,CAE5D,EAEC,OAAQ,CAEP,OAAQ,CAAE,MAAO,IAAI,EACrB,eAAgB,CAAE,MAAqB,IAAIA,EAAS,EACpD,WAAY,CAAE,MAAO,EAAE,EACvB,aAAc,CAAE,MAAO,CAAG,EAC1B,IAAK,CAAE,MAAO,GAAG,EACjB,gBAAiB,CAAE,MAAO,GAAI,EAC9B,OAAQ,CAAE,MAAO,IAAI,CAEvB,EAEC,MAAO,CAEN,MAAO,CAAE,MAAO,IAAI,EACpB,eAAgB,CAAE,MAAO,CAAC,EAC1B,eAAgB,CAAE,MAAqB,IAAIA,EAAS,CAEtD,EAEC,SAAU,CAET,SAAU,CAAE,MAAO,IAAI,EACvB,kBAAmB,CAAE,MAAO,CAAC,EAC7B,kBAAmB,CAAE,MAAqB,IAAIA,EAAS,CAEzD,EAEC,QAAS,CAER,QAAS,CAAE,MAAO,IAAI,EACtB,iBAAkB,CAAE,MAAqB,IAAIA,EAAS,EACtD,UAAW,CAAE,MAAO,CAAC,CAEvB,EAEC,UAAW,CAEV,UAAW,CAAE,MAAO,IAAI,EACxB,mBAAoB,CAAE,MAAqB,IAAIA,EAAS,EACxD,YAAa,CAAE,MAAqB,IAAItG,GAAS,EAAG,CAAC,CAAE,CAEzD,EAEC,gBAAiB,CAEhB,gBAAiB,CAAE,MAAO,IAAI,EAC9B,yBAA0B,CAAE,MAAqB,IAAIsG,EAAS,EAC9D,kBAAmB,CAAE,MAAO,CAAC,EAC7B,iBAAkB,CAAE,MAAO,CAAC,CAE9B,EAEC,YAAa,CAEZ,YAAa,CAAE,MAAO,IAAI,EAC1B,qBAAsB,CAAE,MAAqB,IAAIA,EAAS,CAE5D,EAEC,aAAc,CAEb,aAAc,CAAE,MAAO,IAAI,EAC3B,sBAAuB,CAAE,MAAqB,IAAIA,EAAS,CAE7D,EAEC,aAAc,CAEb,aAAc,CAAE,MAAO,IAAI,EAC3B,sBAAuB,CAAE,MAAqB,IAAIA,EAAS,CAE7D,EAEC,YAAa,CAEZ,YAAa,CAAE,MAAO,IAAI,CAE5B,EAEC,IAAK,CAEJ,WAAY,CAAE,MAAO,KAAO,EAC5B,QAAS,CAAE,MAAO,CAAC,EACnB,OAAQ,CAAE,MAAO,GAAI,EACrB,SAAU,CAAE,MAAqB,IAAIqW,GAAO,QAAQ,CAAE,CAExD,EAEC,OAAQ,CAEP,kBAAmB,CAAE,MAAO,EAAE,EAE9B,WAAY,CAAE,MAAO,EAAE,EAEvB,kBAAmB,CAAE,MAAO,CAAA,EAAI,WAAY,CAC3C,UAAW,CAAA,EACX,MAAO,CAAA,CACV,CAAG,EAED,wBAAyB,CAAE,MAAO,CAAA,EAAI,WAAY,CACjD,gBAAiB,EACjB,WAAY,CAAA,EACZ,iBAAkB,CAAA,EAClB,aAAc,CAAA,EACd,cAAe,CAAA,CAClB,CAAG,EAED,qBAAsB,CAAE,MAAO,EAAE,EACjC,wBAAyB,CAAE,MAAO,EAAE,EAEpC,WAAY,CAAE,MAAO,CAAA,EAAI,WAAY,CACpC,MAAO,CAAA,EACP,SAAU,CAAA,EACV,UAAW,CAAA,EACX,SAAU,CAAA,EACV,QAAS,CAAA,EACT,YAAa,CAAA,EACb,MAAO,CAAA,CACV,CAAG,EAED,iBAAkB,CAAE,MAAO,CAAA,EAAI,WAAY,CAC1C,gBAAiB,EACjB,WAAY,CAAA,EACZ,iBAAkB,CAAA,EAClB,aAAc,CAAA,EACd,cAAe,CAAA,CAClB,CAAG,EAED,aAAc,CAAE,MAAO,EAAE,EACzB,cAAe,CAAE,MAAO,EAAE,EAC1B,gBAAiB,CAAE,MAAO,EAAE,EAE5B,YAAa,CAAE,MAAO,CAAA,EAAI,WAAY,CACrC,MAAO,CAAA,EACP,SAAU,CAAA,EACV,MAAO,CAAA,EACP,SAAU,CAAA,CACb,CAAG,EAED,kBAAmB,CAAE,MAAO,CAAA,EAAI,WAAY,CAC3C,gBAAiB,EACjB,WAAY,CAAA,EACZ,iBAAkB,CAAA,EAClB,aAAc,CAAA,EACd,cAAe,CAAA,EACf,iBAAkB,CAAA,EAClB,gBAAiB,CAAA,CACpB,CAAG,EAED,eAAgB,CAAE,MAAO,EAAE,EAC3B,kBAAmB,CAAE,MAAO,EAAE,EAE9B,iBAAkB,CAAE,MAAO,CAAA,EAAI,WAAY,CAC1C,UAAW,CAAA,EACX,SAAU,CAAA,EACV,YAAa,CAAA,CAChB,CAAG,EAGD,eAAgB,CAAE,MAAO,CAAA,EAAI,WAAY,CACxC,MAAO,CAAA,EACP,SAAU,CAAA,EACV,MAAO,CAAA,EACP,OAAQ,CAAA,CACX,CAAG,EAED,MAAO,CAAE,MAAO,IAAI,EACpB,MAAO,CAAE,MAAO,IAAI,CAEtB,EAEC,OAAQ,CAEP,QAAS,CAAE,MAAqB,IAAIA,GAAO,QAAQ,CAAE,EACrD,QAAS,CAAE,MAAO,CAAG,EACrB,KAAM,CAAE,MAAO,CAAG,EAClB,MAAO,CAAE,MAAO,CAAG,EACnB,IAAK,CAAE,MAAO,IAAI,EAClB,SAAU,CAAE,MAAO,IAAI,EACvB,kBAAmB,CAAE,MAAqB,IAAIrW,EAAS,EACvD,UAAW,CAAE,MAAO,CAAC,EACrB,YAAa,CAAE,MAAqB,IAAIA,EAAS,CAEnD,EAEC,OAAQ,CAEP,QAAS,CAAE,MAAqB,IAAIqW,GAAO,QAAQ,CAAE,EACrD,QAAS,CAAE,MAAO,CAAG,EACrB,OAAQ,CAAE,MAAqB,IAAI3c,GAAS,GAAK,EAAG,CAAE,EACtD,SAAU,CAAE,MAAO,CAAG,EACtB,IAAK,CAAE,MAAO,IAAI,EAClB,aAAc,CAAE,MAAqB,IAAIsG,EAAS,EAClD,SAAU,CAAE,MAAO,IAAI,EACvB,kBAAmB,CAAE,MAAqB,IAAIA,EAAS,EACvD,UAAW,CAAE,MAAO,CAAC,CAEvB,CAEA,EAEMi4C,GAAY,CAEjB,MAAO,CAEN,SAAwBj4B,GAAe,CACtCg4B,GAAY,OACZA,GAAY,YACZA,GAAY,OACZA,GAAY,MACZA,GAAY,SACZA,GAAY,GACf,CAAG,EAED,aAAcD,GAAY,eAC1B,eAAgBA,GAAY,cAE9B,EAEC,QAAS,CAER,SAAwB/3B,GAAe,CACtCg4B,GAAY,OACZA,GAAY,YACZA,GAAY,OACZA,GAAY,MACZA,GAAY,SACZA,GAAY,YACZA,GAAY,QACZA,GAAY,UACZA,GAAY,gBACZA,GAAY,IACZA,GAAY,OACZ,CACC,SAAU,CAAE,MAAqB,IAAI3hC,GAAO,CAAQ,CAAE,CAC1D,CACA,CAAG,EAED,aAAc0hC,GAAY,iBAC1B,eAAgBA,GAAY,gBAE9B,EAEC,MAAO,CAEN,SAAwB/3B,GAAe,CACtCg4B,GAAY,OACZA,GAAY,YACZA,GAAY,OACZA,GAAY,MACZA,GAAY,SACZA,GAAY,YACZA,GAAY,QACZA,GAAY,UACZA,GAAY,gBACZA,GAAY,IACZA,GAAY,OACZ,CACC,SAAU,CAAE,MAAqB,IAAI3hC,GAAO,CAAQ,CAAE,EACtD,SAAU,CAAE,MAAqB,IAAIA,GAAO,OAAQ,CAAE,EACtD,UAAW,CAAE,MAAO,EAAE,CAC1B,CACA,CAAG,EAED,aAAc0hC,GAAY,eAC1B,eAAgBA,GAAY,cAE9B,EAEC,SAAU,CAET,SAAwB/3B,GAAe,CACtCg4B,GAAY,OACZA,GAAY,OACZA,GAAY,MACZA,GAAY,SACZA,GAAY,YACZA,GAAY,QACZA,GAAY,UACZA,GAAY,gBACZA,GAAY,aACZA,GAAY,aACZA,GAAY,IACZA,GAAY,OACZ,CACC,SAAU,CAAE,MAAqB,IAAI3hC,GAAO,CAAQ,CAAE,EACtD,UAAW,CAAE,MAAO,CAAG,EACvB,UAAW,CAAE,MAAO,CAAG,EACvB,gBAAiB,CAAE,MAAO,CAAC,CAC/B,CACA,CAAG,EAED,aAAc0hC,GAAY,kBAC1B,eAAgBA,GAAY,iBAE9B,EAEC,KAAM,CAEL,SAAwB/3B,GAAe,CACtCg4B,GAAY,OACZA,GAAY,MACZA,GAAY,SACZA,GAAY,YACZA,GAAY,QACZA,GAAY,UACZA,GAAY,gBACZA,GAAY,YACZA,GAAY,IACZA,GAAY,OACZ,CACC,SAAU,CAAE,MAAqB,IAAI3hC,GAAO,CAAQ,CAAE,CAC1D,CACA,CAAG,EAED,aAAc0hC,GAAY,cAC1B,eAAgBA,GAAY,aAE9B,EAEC,OAAQ,CAEP,SAAwB/3B,GAAe,CACtCg4B,GAAY,OACZA,GAAY,QACZA,GAAY,UACZA,GAAY,gBACZA,GAAY,IACZ,CACC,OAAQ,CAAE,MAAO,IAAI,CACzB,CACA,CAAG,EAED,aAAcD,GAAY,gBAC1B,eAAgBA,GAAY,eAE9B,EAEC,OAAQ,CAEP,SAAwB/3B,GAAe,CACtCg4B,GAAY,OACZA,GAAY,GACf,CAAG,EAED,aAAcD,GAAY,YAC1B,eAAgBA,GAAY,WAE9B,EAEC,OAAQ,CAEP,SAAwB/3B,GAAe,CACtCg4B,GAAY,OACZA,GAAY,IACZ,CACC,MAAO,CAAE,MAAO,CAAC,EACjB,SAAU,CAAE,MAAO,CAAC,EACpB,UAAW,CAAE,MAAO,CAAC,CACzB,CACA,CAAG,EAED,aAAcD,GAAY,gBAC1B,eAAgBA,GAAY,eAE9B,EAEC,MAAO,CAEN,SAAwB/3B,GAAe,CACtCg4B,GAAY,OACZA,GAAY,eACf,CAAG,EAED,aAAcD,GAAY,WAC1B,eAAgBA,GAAY,UAE9B,EAEC,OAAQ,CAEP,SAAwB/3B,GAAe,CACtCg4B,GAAY,OACZA,GAAY,QACZA,GAAY,UACZA,GAAY,gBACZ,CACC,QAAS,CAAE,MAAO,CAAG,CACzB,CACA,CAAG,EAED,aAAcD,GAAY,gBAC1B,eAAgBA,GAAY,eAE9B,EAEC,OAAQ,CAEP,SAAwB/3B,GAAe,CACtCg4B,GAAY,OACZA,GAAY,GACf,CAAG,EAED,aAAcD,GAAY,YAC1B,eAAgBA,GAAY,WAE9B,EAEC,WAAY,CAEX,SAAU,CACT,YAAa,CAAE,MAAqB,IAAI/3C,EAAS,EACjD,IAAK,CAAE,MAAO,IAAI,EAClB,oBAAqB,CAAE,MAAO,CAAC,CAClC,EAEE,aAAc+3C,GAAY,gBAC1B,eAAgBA,GAAY,eAE9B,EAEC,eAAgB,CAEf,SAAU,CACT,OAAQ,CAAE,MAAO,IAAI,EACrB,WAAY,CAAE,MAAO,EAAE,EACvB,qBAAsB,CAAE,MAAO,CAAC,EAChC,oBAAqB,CAAE,MAAO,CAAC,EAC/B,mBAAoB,CAAE,MAAqB,IAAI/3C,EAAS,CAC3D,EAEE,aAAc+3C,GAAY,oBAC1B,eAAgBA,GAAY,mBAE9B,EAEC,KAAM,CAEL,SAAU,CACT,MAAO,CAAE,MAAO,IAAI,EACpB,MAAO,CAAE,MAAO,EAAE,EAClB,QAAS,CAAE,MAAO,CAAG,CACxB,EAEE,aAAcA,GAAY,UAC1B,eAAgBA,GAAY,SAE9B,EAEC,SAAU,CAET,SAAU,CACT,UAAW,CAAE,MAAO,IAAI,CAC3B,EAEE,aAAcA,GAAY,cAC1B,eAAgBA,GAAY,aAE9B,EAEC,aAAc,CAEb,SAAwB/3B,GAAe,CACtCg4B,GAAY,OACZA,GAAY,gBACZ,CACC,kBAAmB,CAAE,MAAqB,IAAI95C,CAAS,EACvD,aAAc,CAAE,MAAO,CAAC,EACxB,YAAa,CAAE,MAAO,GAAI,CAC9B,CACA,CAAG,EAED,aAAc65C,GAAY,kBAC1B,eAAgBA,GAAY,iBAE9B,EAEC,OAAQ,CAEP,SAAwB/3B,GAAe,CACtCg4B,GAAY,OACZA,GAAY,IACZ,CACC,MAAO,CAAE,MAAqB,IAAI3hC,GAAO,CAAO,CAAE,EAClD,QAAS,CAAE,MAAO,CAAG,CACzB,CACA,CAAG,EAED,aAAc0hC,GAAY,YAC1B,eAAgBA,GAAY,WAE9B,CAEA,EAEAE,GAAU,SAAW,CAEpB,SAAwBj4B,GAAe,CACtCi4B,GAAU,SAAS,SACnB,CACC,UAAW,CAAE,MAAO,CAAC,EACrB,aAAc,CAAE,MAAO,IAAI,EAC3B,sBAAuB,CAAE,MAAqB,IAAIj4C,EAAS,EAC3D,mBAAoB,CAAE,MAAO,IAAI,EACjC,4BAA6B,CAAE,MAAqB,IAAIA,EAAS,EACjE,qBAAsB,CAAE,MAAqB,IAAItG,GAAS,EAAG,CAAC,CAAE,EAChE,mBAAoB,CAAE,MAAO,CAAC,EAC9B,sBAAuB,CAAE,MAAO,IAAI,EACpC,+BAAgC,CAAE,MAAqB,IAAIsG,EAAS,EACpE,WAAY,CAAE,MAAO,CAAC,EACtB,YAAa,CAAE,MAAO,CAAC,EACvB,eAAgB,CAAE,MAAO,IAAI,EAC7B,wBAAyB,CAAE,MAAqB,IAAIA,EAAS,EAC7D,eAAgB,CAAE,MAAO,GAAG,EAC5B,4BAA6B,CAAE,MAAO,GAAG,EACzC,4BAA6B,CAAE,MAAO,GAAG,EACzC,wBAAyB,CAAE,MAAO,IAAI,EACtC,iCAAkC,CAAE,MAAqB,IAAIA,EAAS,EACtE,MAAO,CAAE,MAAO,CAAC,EACjB,WAAY,CAAE,MAAqB,IAAIqW,GAAO,CAAQ,CAAE,EACxD,cAAe,CAAE,MAAO,IAAI,EAC5B,uBAAwB,CAAE,MAAqB,IAAIrW,EAAS,EAC5D,eAAgB,CAAE,MAAO,CAAC,EAC1B,kBAAmB,CAAE,MAAO,IAAI,EAChC,2BAA4B,CAAE,MAAqB,IAAIA,EAAS,EAChE,aAAc,CAAE,MAAO,CAAC,EACxB,gBAAiB,CAAE,MAAO,IAAI,EAC9B,yBAA0B,CAAE,MAAqB,IAAIA,EAAS,EAC9D,wBAAyB,CAAE,MAAqB,IAAItG,EAAS,EAC7D,uBAAwB,CAAE,MAAO,IAAI,EACrC,UAAW,CAAE,MAAO,CAAC,EACrB,aAAc,CAAE,MAAO,IAAI,EAC3B,sBAAuB,CAAE,MAAqB,IAAIsG,EAAS,EAC3D,oBAAqB,CAAE,MAAO,CAAC,EAC/B,iBAAkB,CAAE,MAAqB,IAAIqW,GAAO,CAAQ,CAAE,EAC9D,cAAe,CAAE,MAAqB,IAAIA,GAAO,EAAG,EAAG,EAAG,EAC1D,iBAAkB,CAAE,MAAO,IAAI,EAC/B,0BAA2B,CAAE,MAAqB,IAAIrW,EAAS,EAC/D,kBAAmB,CAAE,MAAO,CAAC,EAC7B,qBAAsB,CAAE,MAAO,IAAI,EACnC,8BAA+B,CAAE,MAAqB,IAAIA,EAAS,EACnE,iBAAkB,CAAE,MAAqB,IAAItG,EAAS,EACtD,cAAe,CAAE,MAAO,IAAI,EAC5B,uBAAwB,CAAE,MAAqB,IAAIsG,EAAS,CAC/D,CACA,CAAE,EAED,aAAc+3C,GAAY,kBAC1B,eAAgBA,GAAY,iBAE7B,EAEA,MAAMG,GAAO,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EACzBC,GAAsB,IAAIxnC,GAC1BQ,GAAsB,IAAI9E,GAEhC,SAAS+rC,GAAiB/3B,EAAUg4B,EAAUC,EAAYC,EAAOvJ,EAAS/0C,EAAOu+C,EAAqB,CAErG,MAAMC,EAAa,IAAIpiC,GAAO,CAAQ,EACtC,IAAIqiC,EAAaz+C,IAAU,GAAO,EAAI,EAElC0+C,EACAC,EAEAC,EAAoB,KACpBC,EAA2B,EAC3BC,EAAqB,KAEzB,SAASC,EAAe52B,EAAQ,CAE/B,IAAI62B,EAAa72B,EAAM,UAAY,GAAOA,EAAM,WAAa,KAE7D,OAAK62B,GAAcA,EAAW,YAG7BA,GADiB72B,EAAM,qBAAuB,EACpBk2B,EAAaD,GAAW,IAAKY,CAAU,GAI3DA,CAER,CAEA,SAASC,EAAQ92B,EAAQ,CAExB,IAAI+2B,EAAa,GACjB,MAAMF,EAAaD,EAAe52B,CAAK,EAElC62B,IAAe,KAEnBG,EAAUX,EAAYC,CAAU,EAErBO,GAAcA,EAAW,UAEpCG,EAAUH,EAAY,CAAC,EACvBE,EAAa,IAId,MAAME,EAAuBh5B,EAAS,GAAG,wBAAuB,EAE3Dg5B,IAAyB,WAE7Bd,EAAM,QAAQ,MAAM,SAAU,EAAG,EAAG,EAAG,EAAGC,CAAkB,EAEjDa,IAAyB,eAEpCd,EAAM,QAAQ,MAAM,SAAU,EAAG,EAAG,EAAG,EAAGC,CAAkB,GAIxDn4B,EAAS,WAAa84B,KAI1BZ,EAAM,QAAQ,MAAM,QAAS,EAAI,EACjCA,EAAM,QAAQ,MAAM,QAAS,EAAI,EACjCA,EAAM,QAAQ,MAAM,QAAS,EAAI,EAEjCl4B,EAAS,MAAOA,EAAS,eAAgBA,EAAS,eAAgBA,EAAS,gBAAgB,EAI7F,CAEA,SAASi5B,EAAiBC,EAAYn3B,EAAQ,CAE7C,MAAM62B,EAAaD,EAAe52B,CAAK,EAElC62B,IAAgBA,EAAW,eAAiBA,EAAW,UAAYjrD,KAElE4qD,IAAY,SAEhBA,EAAU,IAAI37B,GACb,IAAImB,GAAa,EAAG,EAAG,CAAC,EACxB,IAAIsC,GAAgB,CACnB,KAAM,yBACN,SAAUb,GAAeo4B,GAAU,eAAe,QAAQ,EAC1D,aAAcA,GAAU,eAAe,aACvC,eAAgBA,GAAU,eAAe,eACzC,KAAMvtD,GACN,UAAW,GACX,WAAY,GACZ,IAAK,GACL,cAAe,EACrB,CAAM,CACN,EAEIkuD,EAAQ,SAAS,gBAAiB,QAAQ,EAC1CA,EAAQ,SAAS,gBAAiB,IAAI,EAEtCA,EAAQ,eAAiB,SAAWv4B,EAAU+B,EAAOtjB,EAAS,CAE7D,KAAK,YAAY,aAAcA,EAAO,WAAW,CAElD,EAGA,OAAO,eAAgB85C,EAAQ,SAAU,SAAU,CAElD,IAAK,UAAY,CAEhB,OAAO,KAAK,SAAS,OAAO,KAE7B,CAEL,CAAK,EAED5J,EAAQ,OAAQ4J,CAAO,GAIxBT,GAAM,KAAM/1B,EAAM,kBAAkB,EAGpC+1B,GAAM,GAAK,GAAIA,GAAM,GAAK,GAAIA,GAAM,GAAK,GAEpCc,EAAW,eAAiBA,EAAW,wBAA0B,KAGrEd,GAAM,GAAK,GACXA,GAAM,GAAK,IAIZS,EAAQ,SAAS,SAAS,OAAO,MAAQK,EACzCL,EAAQ,SAAS,SAAS,WAAW,MAAUK,EAAW,eAAiBA,EAAW,wBAA0B,GAAU,GAAK,EAC/HL,EAAQ,SAAS,SAAS,qBAAqB,MAAQx2B,EAAM,qBAC7Dw2B,EAAQ,SAAS,SAAS,oBAAoB,MAAQx2B,EAAM,oBAC5Dw2B,EAAQ,SAAS,SAAS,mBAAmB,MAAM,eAAgBznC,GAAM,sBAAuBgnC,GAAO,EACvGS,EAAQ,SAAS,WAAa11C,GAAgB,YAAa+1C,EAAW,UAAU,IAAO9lD,IAElF0lD,IAAsBI,GAC1BH,IAA6BG,EAAW,SACxCF,IAAuB14B,EAAS,eAEhCu4B,EAAQ,SAAS,YAAc,GAE/BC,EAAoBI,EACpBH,EAA2BG,EAAW,QACtCF,EAAqB14B,EAAS,aAI/Bu4B,EAAQ,OAAO,UAAS,EAGxBW,EAAW,QAASX,EAASA,EAAQ,SAAUA,EAAQ,SAAU,EAAG,EAAG,IAAI,GAEhEK,GAAcA,EAAW,YAE/BN,IAAc,SAElBA,EAAY,IAAI17B,GACf,IAAIohB,GAAe,EAAG,CAAC,EACvB,IAAI3d,GAAgB,CACnB,KAAM,qBACN,SAAUb,GAAeo4B,GAAU,WAAW,QAAQ,EACtD,aAAcA,GAAU,WAAW,aACnC,eAAgBA,GAAU,WAAW,eACrC,KAAMxtD,GACN,UAAW,GACX,WAAY,GACZ,IAAK,GACL,cAAe,EACrB,CAAM,CACN,EAEIkuD,EAAU,SAAS,gBAAiB,QAAQ,EAG5C,OAAO,eAAgBA,EAAU,SAAU,MAAO,CAEjD,IAAK,UAAY,CAEhB,OAAO,KAAK,SAAS,IAAI,KAE1B,CAEL,CAAK,EAED3J,EAAQ,OAAQ2J,CAAS,GAI1BA,EAAU,SAAS,SAAS,IAAI,MAAQM,EACxCN,EAAU,SAAS,SAAS,oBAAoB,MAAQv2B,EAAM,oBAC9Du2B,EAAU,SAAS,WAAaz1C,GAAgB,YAAa+1C,EAAW,UAAU,IAAO9lD,GAEpF8lD,EAAW,mBAAqB,IAEpCA,EAAW,aAAY,EAIxBN,EAAU,SAAS,SAAS,YAAY,MAAM,KAAMM,EAAW,MAAM,GAEhEJ,IAAsBI,GAC1BH,IAA6BG,EAAW,SACxCF,IAAuB14B,EAAS,eAEhCs4B,EAAU,SAAS,YAAc,GAEjCE,EAAoBI,EACpBH,EAA2BG,EAAW,QACtCF,EAAqB14B,EAAS,aAI/Bs4B,EAAU,OAAO,UAAS,EAG1BY,EAAW,QAASZ,EAAWA,EAAU,SAAUA,EAAU,SAAU,EAAG,EAAG,IAAI,EAInF,CAEA,SAASS,EAAUt3D,EAAOmY,EAAQ,CAEjCnY,EAAM,OAAQo2D,GAAM93B,GAA2BC,CAAQ,CAAE,EAEzDk4B,EAAM,QAAQ,MAAM,SAAUL,GAAK,EAAGA,GAAK,EAAGA,GAAK,EAAGj+C,EAAOu+C,CAAkB,CAEhF,CAEA,SAASgB,GAAU,CAEbZ,IAAY,SAEhBA,EAAQ,SAAS,QAAO,EACxBA,EAAQ,SAAS,QAAO,EAExBA,EAAU,QAIND,IAAc,SAElBA,EAAU,SAAS,QAAO,EAC1BA,EAAU,SAAS,QAAO,EAE1BA,EAAY,OAId,CAEA,MAAO,CAEN,cAAe,UAAY,CAE1B,OAAOF,CAER,EACA,cAAe,SAAW32D,EAAOmY,EAAQ,EAAI,CAE5Cw+C,EAAW,IAAK32D,CAAK,EACrB42D,EAAaz+C,EACbm/C,EAAUX,EAAYC,CAAU,CAEjC,EACA,cAAe,UAAY,CAE1B,OAAOA,CAER,EACA,cAAe,SAAWz+C,EAAQ,CAEjCy+C,EAAaz+C,EACbm/C,EAAUX,EAAYC,CAAU,CAEjC,EACA,OAAQQ,EACR,gBAAiBI,EACjB,QAASE,CAEX,CAEA,CAEA,SAASC,GAAoBxkD,EAAI8kB,EAAa,CAE7C,MAAM2/B,EAAsBzkD,EAAG,aAAcA,EAAG,kBAAkB,EAE5D0kD,EAAgB,CAAA,EAEhBC,EAAeC,EAAoB,IAAI,EAC7C,IAAIC,EAAeF,EACfG,EAAc,GAElB,SAASC,EAAO/yC,EAAQiW,EAAU+8B,EAAS3yC,EAAUhlB,EAAQ,CAE5D,IAAI43D,EAAgB,GAEpB,MAAM3B,EAAQ4B,EAAiB7yC,EAAU2yC,EAAS/8B,CAAQ,EAErD48B,IAAiBvB,IAErBuB,EAAevB,EACf6B,EAAuBN,EAAa,MAAM,GAI3CI,EAAgBG,EAAapzC,EAAQK,EAAU2yC,EAAS33D,CAAK,EAExD43D,GAAgBI,EAAWrzC,EAAQK,EAAU2yC,EAAS33D,CAAK,EAE3DA,IAAU,MAEdy3B,EAAW,OAAQz3B,EAAO2S,EAAG,oBAAoB,GAI7CilD,GAAiBH,KAErBA,EAAc,GAEdQ,EAAuBtzC,EAAQiW,EAAU+8B,EAAS3yC,CAAQ,EAErDhlB,IAAU,MAEd2S,EAAG,WAAYA,EAAG,qBAAsB8kB,EAAW,IAAKz3B,CAAK,EAAG,MAAM,EAMzE,CAEA,SAASk4D,GAA0B,CAElC,OAAOvlD,EAAG,kBAAiB,CAE5B,CAEA,SAASmlD,EAAuBK,EAAM,CAErC,OAAOxlD,EAAG,gBAAiBwlD,CAAG,CAE/B,CAEA,SAASC,EAAyBD,EAAM,CAEvC,OAAOxlD,EAAG,kBAAmBwlD,CAAG,CAEjC,CAEA,SAASN,EAAiB7yC,EAAU2yC,EAAS/8B,EAAW,CAEvD,MAAMy9B,EAAcz9B,EAAS,YAAc,GAE3C,IAAI09B,EAAajB,EAAeryC,EAAS,EAAE,EAEtCszC,IAAe,SAEnBA,EAAa,CAAA,EACbjB,EAAeryC,EAAS,EAAE,EAAKszC,GAIhC,IAAIC,EAAWD,EAAYX,EAAQ,EAAE,EAEhCY,IAAa,SAEjBA,EAAW,CAAA,EACXD,EAAYX,EAAQ,EAAE,EAAKY,GAI5B,IAAItC,EAAQsC,EAAUF,CAAS,EAE/B,OAAKpC,IAAU,SAEdA,EAAQsB,EAAoBW,GAAyB,EACrDK,EAAUF,CAAS,EAAKpC,GAIlBA,CAER,CAEA,SAASsB,EAAoBY,EAAM,CAElC,MAAMK,EAAgB,CAAA,EAChBC,EAAoB,CAAA,EACpBC,EAAoB,CAAA,EAE1B,QAAU5mD,EAAI,EAAGA,EAAIslD,EAAqBtlD,IAEzC0mD,EAAe1mD,CAAC,EAAK,EACrB2mD,EAAmB3mD,CAAC,EAAK,EACzB4mD,EAAmB5mD,CAAC,EAAK,EAI1B,MAAO,CAGN,SAAU,KACV,QAAS,KACT,UAAW,GAEX,cAAe0mD,EACf,kBAAmBC,EACnB,kBAAmBC,EACnB,OAAQP,EACR,WAAY,CAAA,EACZ,MAAO,IAEV,CAEC,CAEA,SAASJ,EAAapzC,EAAQK,EAAU2yC,EAAS33D,EAAQ,CAExD,MAAM24D,EAAmBnB,EAAa,WAChCoB,EAAqB5zC,EAAS,WAEpC,IAAI6zC,EAAgB,EAEpB,MAAMC,EAAoBnB,EAAQ,cAAa,EAE/C,UAAY3lD,KAAQ8mD,EAInB,GAFyBA,EAAmB9mD,CAAI,EAE1B,UAAY,EAAI,CAErC,MAAM+mD,GAAkBJ,EAAkB3mD,CAAI,EAC9C,IAAIgnD,EAAoBJ,EAAoB5mD,CAAI,EAahD,GAXKgnD,IAAsB,SAErBhnD,IAAS,kBAAoB2S,EAAO,iBAAiBq0C,EAAoBr0C,EAAO,gBAChF3S,IAAS,iBAAmB2S,EAAO,gBAAgBq0C,EAAoBr0C,EAAO,gBAI/Eo0C,KAAoB,QAEpBA,GAAgB,YAAcC,GAE9BA,GAAqBD,GAAgB,OAASC,EAAkB,KAAO,MAAO,GAEnFH,GAED,CAMD,OAFKrB,EAAa,gBAAkBqB,GAE/BrB,EAAa,QAAUx3D,CAI7B,CAEA,SAASg4D,EAAWrzC,EAAQK,EAAU2yC,EAAS33D,EAAQ,CAEtD,MAAMmxB,EAAQ,CAAA,EACRsG,EAAazS,EAAS,WAC5B,IAAI6zC,EAAgB,EAEpB,MAAMC,EAAoBnB,EAAQ,cAAa,EAE/C,UAAY3lD,KAAQ8mD,EAInB,GAFyBA,EAAmB9mD,CAAI,EAE1B,UAAY,EAAI,CAErC,IAAI+F,GAAY0f,EAAYzlB,CAAI,EAE3B+F,KAAc,SAEb/F,IAAS,kBAAoB2S,EAAO,iBAAiB5M,GAAY4M,EAAO,gBACxE3S,IAAS,iBAAmB2S,EAAO,gBAAgB5M,GAAY4M,EAAO,gBAI5E,MAAM9C,EAAO,CAAA,EACbA,EAAK,UAAY9J,GAEZA,IAAaA,GAAU,OAE3B8J,EAAK,KAAO9J,GAAU,MAIvBoZ,EAAOnf,CAAI,EAAK6P,EAEhBg3C,GAED,CAIDrB,EAAa,WAAarmC,EAC1BqmC,EAAa,cAAgBqB,EAE7BrB,EAAa,MAAQx3D,CAEtB,CAEA,SAASi5D,GAAiB,CAEzB,MAAMT,EAAgBhB,EAAa,cAEnC,QAAU1lD,EAAI,EAAGmS,EAAKu0C,EAAc,OAAQ1mD,EAAImS,EAAInS,IAEnD0mD,EAAe1mD,CAAC,EAAK,CAIvB,CAEA,SAASonD,EAAiBnhD,EAAY,CAErCohD,EAA2BphD,EAAW,CAAC,CAExC,CAEA,SAASohD,EAA2BphD,EAAWqtB,EAAmB,CAEjE,MAAMozB,EAAgBhB,EAAa,cAC7BiB,EAAoBjB,EAAa,kBACjCkB,EAAoBlB,EAAa,kBAEvCgB,EAAezgD,CAAS,EAAK,EAExB0gD,EAAmB1gD,CAAS,IAAO,IAEvCpF,EAAG,wBAAyBoF,CAAS,EACrC0gD,EAAmB1gD,CAAS,EAAK,GAI7B2gD,EAAmB3gD,CAAS,IAAOqtB,IAEvCzyB,EAAG,oBAAqBoF,EAAWqtB,CAAgB,EACnDszB,EAAmB3gD,CAAS,EAAKqtB,EAInC,CAEA,SAASg0B,GAA0B,CAElC,MAAMZ,EAAgBhB,EAAa,cAC7BiB,EAAoBjB,EAAa,kBAEvC,QAAU1lD,EAAI,EAAGmS,EAAKw0C,EAAkB,OAAQ3mD,EAAImS,EAAInS,IAElD2mD,EAAmB3mD,CAAC,IAAO0mD,EAAe1mD,CAAC,IAE/Ca,EAAG,yBAA0Bb,CAAC,EAC9B2mD,EAAmB3mD,CAAC,EAAK,EAM5B,CAEA,SAASunD,EAAqBr5D,EAAOykB,EAAMtiB,EAAM+zB,EAAY6L,EAAQjqB,EAAQwhD,EAAU,CAEjFA,IAAY,GAEhB3mD,EAAG,qBAAsB3S,EAAOykB,EAAMtiB,EAAM4/B,EAAQjqB,CAAM,EAI1DnF,EAAG,oBAAqB3S,EAAOykB,EAAMtiB,EAAM+zB,EAAY6L,EAAQjqB,CAAM,CAIvE,CAEA,SAASmgD,EAAuBtzC,EAAQiW,EAAU+8B,EAAS3yC,EAAW,CAErEi0C,EAAc,EAEd,MAAML,EAAqB5zC,EAAS,WAE9B8zC,EAAoBnB,EAAQ,cAAa,EAEzC4B,EAAiC3+B,EAAS,uBAEhD,UAAY5oB,KAAQ8mD,EAAoB,CAEvC,MAAMU,EAAmBV,EAAmB9mD,CAAI,EAEhD,GAAKwnD,EAAiB,UAAY,EAAI,CAErC,IAAIR,EAAoBJ,EAAoB5mD,CAAI,EAShD,GAPKgnD,IAAsB,SAErBhnD,IAAS,kBAAoB2S,EAAO,iBAAiBq0C,EAAoBr0C,EAAO,gBAChF3S,IAAS,iBAAmB2S,EAAO,gBAAgBq0C,EAAoBr0C,EAAO,gBAI/Eq0C,IAAsB,OAAY,CAEtC,MAAM9iC,GAAa8iC,EAAkB,WAC/Bv0C,EAAOu0C,EAAkB,SAEzBjhD,EAAY0f,EAAW,IAAKuhC,CAAiB,EAInD,GAAKjhD,IAAc,OAAY,SAE/B,MAAMkd,GAASld,EAAU,OACnB5V,GAAO4V,EAAU,KACjB0hD,GAAkB1hD,EAAU,gBAI5BuhD,GAAYn3D,KAASwQ,EAAG,KAAOxQ,KAASwQ,EAAG,cAAgBqmD,EAAkB,UAAYxsD,GAE/F,GAAKwsD,EAAkB,6BAA+B,CAErD,MAAMn3C,GAAOm3C,EAAkB,KACzBj3B,GAASlgB,GAAK,OACd/J,GAASkhD,EAAkB,OAEjC,GAAKn3C,GAAK,6BAA+B,CAExC,QAAU/P,GAAI,EAAGA,GAAI0nD,EAAiB,aAAc1nD,KAEnDqnD,EAA2BK,EAAiB,SAAW1nD,GAAG+P,GAAK,gBAAgB,EAI3E8C,EAAO,kBAAoB,IAAQK,EAAS,oBAAsB,SAEtEA,EAAS,kBAAoBnD,GAAK,iBAAmBA,GAAK,MAI5D,KAEC,SAAU/P,GAAI,EAAGA,GAAI0nD,EAAiB,aAAc1nD,KAEnDonD,EAAiBM,EAAiB,SAAW1nD,EAAC,EAMhDa,EAAG,WAAYA,EAAG,aAAcsiB,EAAM,EAEtC,QAAUnjB,GAAI,EAAGA,GAAI0nD,EAAiB,aAAc1nD,KAEnDunD,EACCG,EAAiB,SAAW1nD,GAC5B2S,EAAO+0C,EAAiB,aACxBr3D,GACA+zB,GACA6L,GAAS03B,IACP3hD,GAAW2M,EAAO+0C,EAAiB,aAAiB1nD,IAAM2nD,GAC5DH,EACR,CAIK,KAAO,CAEN,GAAKN,EAAkB,2BAA6B,CAEnD,QAAUlnD,GAAI,EAAGA,GAAI0nD,EAAiB,aAAc1nD,KAEnDqnD,EAA2BK,EAAiB,SAAW1nD,GAAGknD,EAAkB,gBAAgB,EAIxFr0C,EAAO,kBAAoB,IAAQK,EAAS,oBAAsB,SAEtEA,EAAS,kBAAoBg0C,EAAkB,iBAAmBA,EAAkB,MAItF,KAEC,SAAUlnD,GAAI,EAAGA,GAAI0nD,EAAiB,aAAc1nD,KAEnDonD,EAAiBM,EAAiB,SAAW1nD,EAAC,EAMhDa,EAAG,WAAYA,EAAG,aAAcsiB,EAAM,EAEtC,QAAUnjB,GAAI,EAAGA,GAAI0nD,EAAiB,aAAc1nD,KAEnDunD,EACCG,EAAiB,SAAW1nD,GAC5B2S,EAAO+0C,EAAiB,aACxBr3D,GACA+zB,GACAzR,EAAOg1C,GACLh1C,EAAO+0C,EAAiB,aAAiB1nD,GAAI2nD,GAC/CH,EACR,CAIK,CAED,SAAYC,IAAmC,OAAY,CAE1D,MAAMx7D,GAAQw7D,EAAgCvnD,CAAI,EAElD,GAAKjU,KAAU,OAEd,OAASA,GAAM,OAAM,CAEpB,IAAK,GACJ4U,EAAG,gBAAiB6mD,EAAiB,SAAUz7D,EAAK,EACpD,MAED,IAAK,GACJ4U,EAAG,gBAAiB6mD,EAAiB,SAAUz7D,EAAK,EACpD,MAED,IAAK,GACJ4U,EAAG,gBAAiB6mD,EAAiB,SAAUz7D,EAAK,EACpD,MAED,QACC4U,EAAG,gBAAiB6mD,EAAiB,SAAUz7D,EAAK,CAE5D,CAII,CAED,CAED,CAEAq7D,EAAuB,CAExB,CAEA,SAASlC,GAAU,CAElBwC,EAAK,EAEL,UAAYC,KAActC,EAAgB,CAEzC,MAAMiB,EAAajB,EAAesC,CAAU,EAE5C,UAAYC,KAAatB,EAAa,CAErC,MAAMC,EAAWD,EAAYsB,CAAS,EAEtC,UAAYvB,KAAaE,EAExBH,EAAyBG,EAAUF,CAAS,EAAG,MAAM,EAErD,OAAOE,EAAUF,CAAS,EAI3B,OAAOC,EAAYsB,CAAS,CAE7B,CAEA,OAAOvC,EAAesC,CAAU,CAEjC,CAED,CAEA,SAASE,EAAyB70C,EAAW,CAE5C,GAAKqyC,EAAeryC,EAAS,EAAE,IAAO,OAAY,OAElD,MAAMszC,EAAajB,EAAeryC,EAAS,EAAE,EAE7C,UAAY40C,KAAatB,EAAa,CAErC,MAAMC,EAAWD,EAAYsB,CAAS,EAEtC,UAAYvB,KAAaE,EAExBH,EAAyBG,EAAUF,CAAS,EAAG,MAAM,EAErD,OAAOE,EAAUF,CAAS,EAI3B,OAAOC,EAAYsB,CAAS,CAE7B,CAEA,OAAOvC,EAAeryC,EAAS,EAAE,CAElC,CAEA,SAAS80C,EAAwBnC,EAAU,CAE1C,UAAYgC,KAActC,EAAgB,CAEzC,MAAMiB,EAAajB,EAAesC,CAAU,EAE5C,GAAKrB,EAAYX,EAAQ,EAAE,IAAO,OAAY,SAE9C,MAAMY,EAAWD,EAAYX,EAAQ,EAAE,EAEvC,UAAYU,KAAaE,EAExBH,EAAyBG,EAAUF,CAAS,EAAG,MAAM,EAErD,OAAOE,EAAUF,CAAS,EAI3B,OAAOC,EAAYX,EAAQ,EAAE,CAE9B,CAED,CAEA,SAAS+B,GAAQ,CAEhBK,EAAiB,EACjBtC,EAAc,GAETD,IAAiBF,IAEtBE,EAAeF,EACfQ,EAAuBN,EAAa,MAAM,EAE3C,CAIA,SAASuC,GAAoB,CAE5BzC,EAAa,SAAW,KACxBA,EAAa,QAAU,KACvBA,EAAa,UAAY,EAE1B,CAEA,MAAO,CAEN,MAAOI,EACP,MAAOgC,EACP,kBAAmBK,EACnB,QAAS7C,EACT,wBAAyB2C,EACzB,uBAAwBC,EAExB,eAAgBb,EAChB,gBAAiBC,EACjB,wBAAyBE,CAE3B,CAEA,CAEA,SAASY,GAAqBrnD,EAAI0rB,EAAYnO,EAAO,CAEpD,IAAI+pC,EAEJ,SAASC,EAASn8D,EAAQ,CAEzBk8D,EAAOl8D,CAER,CAEA,SAAS64D,EAAQ7zC,EAAOC,EAAQ,CAE/BrQ,EAAG,WAAYsnD,EAAMl3C,EAAOC,CAAK,EAEjCkN,EAAK,OAAQlN,EAAOi3C,EAAM,CAAC,CAE5B,CAEA,SAASE,EAAiBp3C,EAAOC,EAAOo3C,EAAY,CAE9CA,IAAc,IAEnBznD,EAAG,oBAAqBsnD,EAAMl3C,EAAOC,EAAOo3C,CAAS,EAErDlqC,EAAK,OAAQlN,EAAOi3C,EAAMG,CAAS,EAEpC,CAEA,SAASC,EAAiBC,EAAQC,EAAQC,EAAY,CAErD,GAAKA,IAAc,EAAI,OAELn8B,EAAW,IAAK,kBAAkB,EAC1C,qBAAsB47B,EAAMK,EAAQ,EAAGC,EAAQ,EAAGC,CAAS,EAErE,IAAIC,EAAe,EACnB,QAAU3oD,EAAI,EAAGA,EAAI0oD,EAAW1oD,IAE/B2oD,GAAgBF,EAAQzoD,CAAC,EAI1Boe,EAAK,OAAQuqC,EAAcR,EAAM,CAAC,CAEnC,CAEA,SAASS,EAA0BJ,EAAQC,EAAQC,EAAWJ,EAAY,CAEzE,GAAKI,IAAc,EAAI,OAEvB,MAAMG,EAAYt8B,EAAW,IAAK,kBAAkB,EAEpD,GAAKs8B,IAAc,KAElB,QAAU7oD,EAAI,EAAGA,EAAIwoD,EAAO,OAAQxoD,IAEnCqoD,EAAiBG,EAAQxoD,GAAKyoD,EAAQzoD,GAAKsoD,EAAWtoD,EAAG,MAIpD,CAEN6oD,EAAU,8BAA+BV,EAAMK,EAAQ,EAAGC,EAAQ,EAAGH,EAAW,EAAGI,CAAS,EAE5F,IAAIC,EAAe,EACnB,QAAU3oD,EAAI,EAAGA,EAAI0oD,EAAW1oD,IAE/B2oD,GAAgBF,EAAQzoD,GAAMsoD,EAAWtoD,CAAC,EAI3Coe,EAAK,OAAQuqC,EAAcR,EAAM,CAAC,CAEnC,CAED,CAIA,KAAK,QAAUC,EACf,KAAK,OAAStD,EACd,KAAK,gBAAkBuD,EACvB,KAAK,gBAAkBE,EACvB,KAAK,yBAA2BK,CAEjC,CAEA,SAASE,GAAmBjoD,EAAI0rB,EAAY/N,EAAYuqC,EAAQ,CAE/D,IAAIC,EAEJ,SAASC,GAAmB,CAE3B,GAAKD,IAAkB,OAAY,OAAOA,EAE1C,GAAKz8B,EAAW,IAAK,gCAAgC,IAAO,GAAO,CAElE,MAAMs8B,EAAYt8B,EAAW,IAAK,gCAAgC,EAElEy8B,EAAgBnoD,EAAG,aAAcgoD,EAAU,8BAA8B,CAE1E,MAECG,EAAgB,EAIjB,OAAOA,CAER,CAEA,SAASE,EAAuBC,EAAgB,CAE/C,MAAK,EAAAA,IAAkB9tD,IAAc0tD,EAAM,QAASI,KAAoBtoD,EAAG,aAAcA,EAAG,kCAQ7F,CAEA,SAASuoD,EAAqBC,EAAc,CAE3C,MAAMC,EAA4BD,IAAgBxuD,KAAqB0xB,EAAW,IAAK,gCAAmCA,EAAW,IAAK,wBAAwB,GAElK,MAAK,EAAA88B,IAAgB/uD,IAAoByuD,EAAM,QAASM,CAAW,IAAOxoD,EAAG,aAAcA,EAAG,8BAA8B,GAC3HwoD,IAAgBzuD,IAAa,CAAE0uD,EAQjC,CAEA,SAASC,EAAiBC,EAAY,CAErC,GAAKA,IAAc,QAAU,CAE5B,GAAK3oD,EAAG,yBAA0BA,EAAG,cAAeA,EAAG,UAAU,EAAG,UAAY,GAC/EA,EAAG,yBAA0BA,EAAG,gBAAiBA,EAAG,UAAU,EAAG,UAAY,EAE7E,MAAO,QAIR2oD,EAAY,SAEb,CAEA,OAAKA,IAAc,WAEb3oD,EAAG,yBAA0BA,EAAG,cAAeA,EAAG,YAAY,EAAG,UAAY,GACjFA,EAAG,yBAA0BA,EAAG,gBAAiBA,EAAG,YAAY,EAAG,UAAY,EAExE,UAMF,MAER,CAEA,IAAI2oD,EAAYhrC,EAAW,YAAc,OAAYA,EAAW,UAAY,QAC5E,MAAMirC,EAAeF,EAAiBC,CAAS,EAE1CC,IAAiBD,IAErB/oD,GAAM,iBAAkB+oD,EAAW,uBAAwBC,EAAc,UAAU,EACnFD,EAAYC,GAIb,MAAMC,EAAyBlrC,EAAW,yBAA2B,GAC/DmrC,EAAsBnrC,EAAW,sBAAwB,IAAQ+N,EAAW,IAAK,kBAAkB,EAEnGq9B,EAAc/oD,EAAG,aAAcA,EAAG,uBAAuB,EACzDgpD,EAAoBhpD,EAAG,aAAcA,EAAG,8BAA8B,EACtEipD,EAAiBjpD,EAAG,aAAcA,EAAG,gBAAgB,EACrDkpD,EAAiBlpD,EAAG,aAAcA,EAAG,yBAAyB,EAE9DmpD,EAAgBnpD,EAAG,aAAcA,EAAG,kBAAkB,EACtDopD,EAAoBppD,EAAG,aAAcA,EAAG,0BAA0B,EAClEqpD,EAAcrpD,EAAG,aAAcA,EAAG,mBAAmB,EACrDspD,EAAsBtpD,EAAG,aAAcA,EAAG,4BAA4B,EAEtEupD,EAAiBP,EAAoB,EAErCQ,EAAaxpD,EAAG,aAAcA,EAAG,WAAW,EAElD,MAAO,CAEN,SAAU,GAEV,iBAAkBooD,EAClB,gBAAiBM,EAEjB,sBAAuBL,EACvB,oBAAqBE,EAErB,UAAWI,EACX,uBAAwBE,EACxB,oBAAqBC,EAErB,YAAaC,EACb,kBAAmBC,EACnB,eAAgBC,EAChB,eAAgBC,EAEhB,cAAeC,EACf,kBAAmBC,EACnB,YAAaC,EACb,oBAAqBC,EAErB,eAAgBC,EAEhB,WAAYC,CAEd,CAEA,CAEA,SAASC,GAAeC,EAAa,CAEpC,MAAMngC,EAAQ,KAEd,IAAIogC,EAAc,KACjBC,EAAkB,EAClBC,EAAuB,GACvBC,EAAmB,GAEpB,MAAMp3C,EAAQ,IAAIkhB,GACjBm2B,EAAmB,IAAIh/C,GAEvBi/C,EAAU,CAAE,MAAO,KAAM,YAAa,EAAK,EAE5C,KAAK,QAAUA,EACf,KAAK,UAAY,EACjB,KAAK,gBAAkB,EAEvB,KAAK,KAAO,SAAWt1B,EAAQu1B,EAAsB,CAEpD,MAAMC,EACLx1B,EAAO,SAAW,GAClBu1B,GAGAL,IAAoB,GACpBC,EAED,OAAAA,EAAuBI,EAEvBL,EAAkBl1B,EAAO,OAElBw1B,CAER,EAEA,KAAK,aAAe,UAAY,CAE/BJ,EAAmB,GACnBK,EAAe,IAAI,CAEpB,EAEA,KAAK,WAAa,UAAY,CAE7BL,EAAmB,EAEpB,EAEA,KAAK,eAAiB,SAAWp1B,EAAQ7qB,EAAS,CAEjD8/C,EAAcQ,EAAez1B,EAAQ7qB,EAAQ,CAAC,CAE/C,EAEA,KAAK,SAAW,SAAWoe,EAAUpe,EAAQugD,EAAW,CAEvD,MAAM11B,EAASzM,EAAS,eACvBoiC,EAAmBpiC,EAAS,iBAC5BqiC,EAAcriC,EAAS,YAElBsiC,EAAqBb,EAAW,IAAKzhC,CAAQ,EAEnD,GAAK,CAAE4hC,GAAwBn1B,IAAW,MAAQA,EAAO,SAAW,GAAKo1B,GAAoB,CAAEQ,EAIzFR,EAIJK,EAAe,IAAI,EAInBK,EAAgB,MAIX,CAEN,MAAMC,EAAUX,EAAmB,EAAIF,EACtCc,EAAUD,EAAU,EAErB,IAAIE,EAAWJ,EAAmB,eAAiB,KAEnDP,EAAQ,MAAQW,EAEhBA,EAAWR,EAAez1B,EAAQ7qB,EAAQ6gD,EAASN,CAAQ,EAE3D,QAAUjrD,EAAI,EAAGA,IAAMurD,EAAS,EAAGvrD,EAElCwrD,EAAUxrD,CAAC,EAAKwqD,EAAaxqD,CAAC,EAI/BorD,EAAmB,cAAgBI,EACnC,KAAK,gBAAkBN,EAAmB,KAAK,UAAY,EAC3D,KAAK,WAAaI,CAEnB,CAGD,EAEA,SAASD,GAAmB,CAEtBR,EAAQ,QAAUL,IAEtBK,EAAQ,MAAQL,EAChBK,EAAQ,YAAcJ,EAAkB,GAIzCrgC,EAAM,UAAYqgC,EAClBrgC,EAAM,gBAAkB,CAEzB,CAEA,SAAS4gC,EAAez1B,EAAQ7qB,EAAQlE,EAAWilD,EAAgB,CAElE,MAAMC,EAAUn2B,IAAW,KAAOA,EAAO,OAAS,EAClD,IAAIi2B,EAAW,KAEf,GAAKE,IAAY,EAAI,CAIpB,GAFAF,EAAWX,EAAQ,MAEdY,IAAkB,IAAQD,IAAa,KAAO,CAElD,MAAMG,EAAWnlD,EAAYklD,EAAU,EACtCE,EAAalhD,EAAO,mBAErBkgD,EAAiB,gBAAiBgB,CAAU,GAEvCJ,IAAa,MAAQA,EAAS,OAASG,KAE3CH,EAAW,IAAI,aAAcG,CAAQ,GAItC,QAAU3rD,EAAI,EAAG6rD,EAAKrlD,EAAWxG,IAAM0rD,EAAS,EAAG1rD,EAAG6rD,GAAM,EAE3Dt4C,EAAM,KAAMgiB,EAAQv1B,CAAC,CAAE,EAAG,aAAc4rD,EAAYhB,CAAgB,EAEpEr3C,EAAM,OAAO,QAASi4C,EAAUK,CAAE,EAClCL,EAAUK,EAAK,CAAC,EAAKt4C,EAAM,QAI7B,CAEAs3C,EAAQ,MAAQW,EAChBX,EAAQ,YAAc,EAEvB,CAEA,OAAAzgC,EAAM,UAAYshC,EAClBthC,EAAM,gBAAkB,EAEjBohC,CAER,CAED,CAEA,SAASM,GAAe7/B,EAAW,CAElC,IAAIg4B,EAAW,IAAI,QAEnB,SAAS8H,EAAmB/5C,EAAStB,EAAU,CAE9C,OAAKA,IAAYhX,GAEhBsY,EAAQ,QAAUxY,GAEPkX,IAAY/W,KAEvBqY,EAAQ,QAAUvY,IAIZuY,CAER,CAEA,SAAS8qC,EAAK9qC,EAAU,CAEvB,GAAKA,GAAWA,EAAQ,UAAY,CAEnC,MAAMtB,EAAUsB,EAAQ,QAExB,GAAKtB,IAAYhX,IAAoCgX,IAAY/W,GAEhE,GAAKsqD,EAAS,IAAKjyC,GAAY,CAE9B,MAAMg6C,EAAU/H,EAAS,IAAKjyC,CAAO,EAAG,QACxC,OAAO+5C,EAAmBC,EAASh6C,EAAQ,OAAO,CAEnD,KAAO,CAEN,MAAMpC,EAAQoC,EAAQ,MAEtB,GAAKpC,GAASA,EAAM,OAAS,EAAI,CAEhC,MAAM4d,EAAe,IAAIe,GAAuB3e,EAAM,MAAM,EAC5D,OAAA4d,EAAa,2BAA4BvB,EAAUja,CAAO,EAC1DiyC,EAAS,IAAKjyC,EAASwb,CAAY,EAEnCxb,EAAQ,iBAAkB,UAAWi6C,CAAgB,EAE9CF,EAAmBv+B,EAAa,QAASxb,EAAQ,OAAO,CAEhE,KAIC,QAAO,IAIT,CAIF,CAEA,OAAOA,CAER,CAEA,SAASi6C,EAAkBj/D,EAAQ,CAElC,MAAMglB,EAAUhlB,EAAM,OAEtBglB,EAAQ,oBAAqB,UAAWi6C,CAAgB,EAExD,MAAMD,EAAU/H,EAAS,IAAKjyC,CAAO,EAEhCg6C,IAAY,SAEhB/H,EAAS,OAAQjyC,CAAO,EACxBg6C,EAAQ,QAAO,EAIjB,CAEA,SAAS5G,GAAU,CAElBnB,EAAW,IAAI,OAEhB,CAEA,MAAO,CACN,IAAKnH,EACL,QAASsI,CACX,CAEA,CAEA,MAAM8G,GAAU,EAIVC,GAAkB,CAAE,KAAO,KAAO,IAAM,KAAO,KAAO,IAAK,EAK3DC,GAAc,GAGdC,GAAc,IAEdC,GAA4B,IAAIrV,GAChCsV,GAA4B,IAAItqC,GACtC,IAAIuqC,GAAa,KACbC,GAAqB,EACrBC,GAAwB,EACxBC,GAAgB,GAEpB,MAAMC,GAAwB,IAAI9iD,EAkBlC,MAAM+iD,EAAe,CAOpB,YAAa5gC,EAAW,CAEvB,KAAK,UAAYA,EACjB,KAAK,sBAAwB,KAE7B,KAAK,QAAU,EACf,KAAK,UAAY,EACjB,KAAK,UAAY,CAAA,EACjB,KAAK,QAAU,CAAA,EACf,KAAK,WAAa,CAAA,EAElB,KAAK,eAAiB,KAEtB,KAAK,iBAAmB,KACxB,KAAK,kBAAoB,KAEzB,KAAK,cAAgB,KACrB,KAAK,aAAe,IAErB,CAiBA,UAAW+B,EAAO8+B,EAAQ,EAAG7wC,EAAO,GAAKC,EAAM,IAAKpvB,EAAU,GAAK,CAElE,KAAM,CACL,KAAA6lB,EAAO,IACP,SAAAwI,EAAWyxC,EACd,EAAM9/D,EAEJ0/D,GAAa,KAAK,UAAU,gBAAe,EAC3CC,GAAqB,KAAK,UAAU,kBAAiB,EACrDC,GAAwB,KAAK,UAAU,qBAAoB,EAC3DC,GAAgB,KAAK,UAAU,GAAG,QAElC,KAAK,UAAU,GAAG,QAAU,GAE5B,KAAK,SAAUh6C,CAAI,EAEnB,MAAMo6C,EAAqB,KAAK,iBAAgB,EAChD,OAAAA,EAAmB,YAAc,GAEjC,KAAK,eAAgB/+B,EAAO/R,EAAMC,EAAK6wC,EAAoB5xC,CAAQ,EAE9D2xC,EAAQ,GAEZ,KAAK,MAAOC,EAAoB,EAAG,EAAGD,CAAK,EAI5C,KAAK,YAAaC,CAAkB,EACpC,KAAK,SAAUA,CAAkB,EAE1BA,CAER,CAWA,oBAAqBC,EAAiBx/B,EAAe,KAAO,CAE3D,OAAO,KAAK,aAAcw/B,EAAiBx/B,CAAY,CAExD,CAWA,YAAaw+B,EAASx+B,EAAe,KAAO,CAE3C,OAAO,KAAK,aAAcw+B,EAASx+B,CAAY,CAEhD,CAMA,sBAAuB,CAEjB,KAAK,mBAAqB,OAE9B,KAAK,iBAAmBy/B,GAAmB,EAC3C,KAAK,iBAAkB,KAAK,gBAAgB,EAI9C,CAMA,8BAA+B,CAEzB,KAAK,oBAAsB,OAE/B,KAAK,kBAAoBC,GAAoB,EAC7C,KAAK,iBAAkB,KAAK,iBAAiB,EAI/C,CAOA,SAAU,CAET,KAAK,SAAQ,EAER,KAAK,mBAAqB,MAAO,KAAK,iBAAiB,QAAO,EAC9D,KAAK,oBAAsB,MAAO,KAAK,kBAAkB,QAAO,EAEhE,KAAK,iBAAmB,OAE5B,KAAK,eAAe,SAAS,QAAO,EACpC,KAAK,eAAe,SAAS,QAAO,EAItC,CAIA,SAAUC,EAAW,CAEpB,KAAK,QAAU,KAAK,MAAO,KAAK,KAAMA,EAAU,EAChD,KAAK,UAAY,KAAK,IAAK,EAAG,KAAK,OAAO,CAE3C,CAEA,UAAW,CAEL,KAAK,gBAAkB,MAAO,KAAK,cAAc,QAAO,EACxD,KAAK,eAAiB,MAAO,KAAK,aAAa,QAAO,EAEtD,KAAK,wBAA0B,MAAO,KAAK,sBAAsB,QAAO,EAE7E,QAAUntD,EAAI,EAAGA,EAAI,KAAK,WAAW,OAAQA,IAE5C,KAAK,WAAYA,GAAI,SAAS,QAAO,CAIvC,CAEA,SAAUotD,EAAe,CAExB,KAAK,UAAU,gBAAiBZ,GAAYC,GAAoBC,EAAqB,EACrF,KAAK,UAAU,GAAG,QAAUC,GAE5BS,EAAa,YAAc,GAC3BC,GAAcD,EAAc,EAAG,EAAGA,EAAa,MAAOA,EAAa,MAAM,CAE1E,CAEA,aAAcp7C,EAASwb,EAAe,CAEhCxb,EAAQ,UAAYxY,IAAyBwY,EAAQ,UAAYvY,GAErE,KAAK,SAAUuY,EAAQ,MAAM,SAAW,EAAI,GAAOA,EAAQ,MAAO,CAAC,EAAG,OAASA,EAAQ,MAAO,GAAI,MAAM,KAAO,EAI/G,KAAK,SAAUA,EAAQ,MAAM,MAAQ,CAAC,EAIvCw6C,GAAa,KAAK,UAAU,gBAAe,EAC3CC,GAAqB,KAAK,UAAU,kBAAiB,EACrDC,GAAwB,KAAK,UAAU,qBAAoB,EAC3DC,GAAgB,KAAK,UAAU,GAAG,QAElC,KAAK,UAAU,GAAG,QAAU,GAE5B,MAAMI,EAAqBv/B,GAAgB,KAAK,iBAAgB,EAChE,YAAK,iBAAkBxb,EAAS+6C,CAAkB,EAClD,KAAK,YAAaA,CAAkB,EACpC,KAAK,SAAUA,CAAkB,EAE1BA,CAER,CAEA,kBAAmB,CAElB,MAAM75D,EAAQ,EAAI,KAAK,IAAK,KAAK,UAAW,GAAM,EAC5CC,EAAS,EAAI,KAAK,UAElBoN,EAAS,CACd,UAAWpG,GACX,UAAWA,GACX,gBAAiB,GACjB,KAAMU,GACN,OAAQQ,GACR,WAAYwD,GACZ,YAAa,EAChB,EAEQkuD,EAAqBO,GAAqBp6D,EAAOC,EAAQoN,CAAM,EAErE,GAAK,KAAK,wBAA0B,MAAQ,KAAK,sBAAsB,QAAUrN,GAAS,KAAK,sBAAsB,SAAWC,EAAS,CAEnI,KAAK,wBAA0B,MAEnC,KAAK,SAAQ,EAId,KAAK,sBAAwBm6D,GAAqBp6D,EAAOC,EAAQoN,CAAM,EAEvE,KAAM,CAAE,QAAAgtD,CAAO,EAAK,MAClB,CAAE,UAAW,KAAK,WAAY,SAAU,KAAK,UAAW,OAAQ,KAAK,SAAYC,GAAeD,CAAO,GAEzG,KAAK,cAAgBE,GAAgBF,EAASr6D,EAAOC,CAAM,EAC3D,KAAK,aAAeu6D,GAAeH,EAASr6D,EAAOC,CAAM,CAE1D,CAEA,OAAO45D,CAER,CAEA,iBAAkBjkC,EAAW,CAE5B,MAAM2F,EAAO,IAAI5F,GAAM,IAAI3D,GAAkB4D,CAAQ,EACrD,KAAK,UAAU,QAAS2F,EAAM69B,EAAW,CAE1C,CAEA,eAAgBt+B,EAAO/R,EAAMC,EAAK6wC,EAAoB5xC,EAAW,CAIhE,MAAMwyC,EAAa,IAAI/gC,GAAmB,GAAK,EAAQ3Q,EAAMC,CAAG,EAC1D0xC,EAAS,CAAE,EAAG,GAAI,EAAG,EAAG,EAAG,CAAC,EAC5BC,EAAc,CAAE,EAAG,EAAG,EAAG,GAAI,GAAI,EAAE,EACnC5hC,EAAW,KAAK,UAEhB6hC,EAAoB7hC,EAAS,UAC7B8hC,EAAc9hC,EAAS,YAC7BA,EAAS,cAAesgC,EAAW,EAEnCtgC,EAAS,YAAcpzB,GACvBozB,EAAS,UAAY,GAGOA,EAAS,MAAM,QAAQ,MAAM,YAAW,IAInEA,EAAS,gBAAiB8gC,CAAkB,EAC5C9gC,EAAS,WAAU,EACnBA,EAAS,gBAAiB,IAAI,GAI1B,KAAK,iBAAmB,OAE5B,KAAK,eAAiB,IAAIpD,GACzB,IAAImB,GACJ,IAAIhH,GAAmB,CACtB,KAAM,mBACN,KAAM1sB,GACN,WAAY,GACZ,UAAW,EAChB,CAAK,CACL,GAIE,MAAM03D,EAAgB,KAAK,eACrBC,EAAqBD,EAAc,SAEzC,IAAIE,EAAgB,GAEpB,MAAMrJ,EAAa72B,EAAM,WAEpB62B,EAECA,EAAW,UAEfoJ,EAAmB,MAAM,KAAMpJ,CAAU,EACzC72B,EAAM,WAAa,KACnBkgC,EAAgB,KAMjBD,EAAmB,MAAM,KAAM1B,EAAW,EAC1C2B,EAAgB,IAIjB,QAAUluD,EAAI,EAAGA,EAAI,EAAGA,IAAO,CAE9B,MAAMmuD,EAAMnuD,EAAI,EAEXmuD,IAAQ,GAEZR,EAAW,GAAG,IAAK,EAAGC,EAAQ5tD,CAAC,EAAI,CAAC,EACpC2tD,EAAW,SAAS,IAAKxyC,EAAS,EAAGA,EAAS,EAAGA,EAAS,CAAC,EAC3DwyC,EAAW,OAAQxyC,EAAS,EAAI0yC,EAAa7tD,CAAC,EAAImb,EAAS,EAAGA,EAAS,CAAC,GAE7DgzC,IAAQ,GAEnBR,EAAW,GAAG,IAAK,EAAG,EAAGC,EAAQ5tD,EAAG,EACpC2tD,EAAW,SAAS,IAAKxyC,EAAS,EAAGA,EAAS,EAAGA,EAAS,CAAC,EAC3DwyC,EAAW,OAAQxyC,EAAS,EAAGA,EAAS,EAAI0yC,EAAa7tD,CAAC,EAAImb,EAAS,CAAC,IAKxEwyC,EAAW,GAAG,IAAK,EAAGC,EAAQ5tD,CAAC,EAAI,CAAC,EACpC2tD,EAAW,SAAS,IAAKxyC,EAAS,EAAGA,EAAS,EAAGA,EAAS,CAAC,EAC3DwyC,EAAW,OAAQxyC,EAAS,EAAGA,EAAS,EAAGA,EAAS,EAAI0yC,EAAa7tD,EAAG,GAIzE,MAAM2S,EAAO,KAAK,UAElB06C,GAAcN,EAAoBoB,EAAMx7C,EAAM3S,EAAI,EAAI2S,EAAO,EAAGA,EAAMA,CAAI,EAE1EsZ,EAAS,gBAAiB8gC,CAAkB,EAEvCmB,GAEJjiC,EAAS,OAAQ+hC,EAAeL,CAAU,EAI3C1hC,EAAS,OAAQ+B,EAAO2/B,CAAU,CAEnC,CAEA1hC,EAAS,YAAc8hC,EACvB9hC,EAAS,UAAY6hC,EACrB9/B,EAAM,WAAa62B,CAEpB,CAEA,iBAAkB7yC,EAAS+6C,EAAqB,CAE/C,MAAM9gC,EAAW,KAAK,UAEhBmiC,EAAkBp8C,EAAQ,UAAYxY,IAAyBwY,EAAQ,UAAYvY,GAEpF20D,GAEC,KAAK,mBAAqB,OAE9B,KAAK,iBAAmBnB,GAAmB,GAI5C,KAAK,iBAAiB,SAAS,WAAW,MAAUj7C,EAAQ,wBAA0B,GAAU,GAAK,GAIhG,KAAK,oBAAsB,OAE/B,KAAK,kBAAoBk7C,GAAoB,GAM/C,MAAMpkC,EAAWslC,EAAgB,KAAK,iBAAmB,KAAK,kBAExD3/B,EAAO,KAAK,WAAY,CAAC,EAC/BA,EAAK,SAAW3F,EAEhB,MAAM+C,EAAW/C,EAAS,SAE1B+C,EAAU,OAAW,MAAQ7Z,EAE7B,MAAMW,EAAO,KAAK,UAElB06C,GAAcN,EAAoB,EAAG,EAAG,EAAIp6C,EAAM,EAAIA,CAAI,EAE1DsZ,EAAS,gBAAiB8gC,CAAkB,EAC5C9gC,EAAS,OAAQwC,EAAM69B,EAAW,CAEnC,CAEA,YAAaS,EAAqB,CAEjC,MAAM9gC,EAAW,KAAK,UAChBoiC,EAAYpiC,EAAS,UAC3BA,EAAS,UAAY,GAErB,MAAM9pB,EAAI,KAAK,WAAW,OAG1B,QAAUnC,EAAI,EAAGA,EAAImC,EAAGnC,IAEvB,KAAK,gBAAiB+sD,EAAoB/sD,EAAI,EAAGA,CAAC,EAInDisB,EAAS,UAAYoiC,CAEtB,CAaA,gBAAiBtB,EAAoBuB,EAAOC,EAAS,CAEpD,MAAMtiC,EAAW,KAAK,UAChBuiC,EAAuB,KAAK,sBAE5BC,EAAc,KAAK,aACnBC,EAAU,KAAK,WAAYH,CAAM,EACvCG,EAAQ,SAAWD,EAEnB,MAAME,EAAcF,EAAY,SAG1BG,EAAkBL,GAAW,KAAK,WAAW,OAAS,GACtDM,EAAkBP,GAAU,KAAK,WAAW,OAAS,GACrDQ,EAAuB,KAAK,KAAMF,EAAkBA,EAAkBC,EAAkBA,CAAe,EAGvGE,EAAe,IAAOH,EAAkB,IACxCI,EAAoBF,EAAuBC,EAG3C,CAAE,QAAAxB,CAAO,EAAK,KACd0B,EAAa,KAAK,UAAWV,CAAM,EACnC,EAAI,EAAIU,GAAeV,EAAShB,EAAUrB,GAAUqC,EAAShB,EAAUrB,GAAU,GACjFtpD,EAAI,GAAM,KAAK,UAAYqsD,GAGjCN,EAAa,OAAW,MAAQ5B,EAAmB,QACnD4B,EAAa,UAAc,MAAQK,EACnCL,EAAa,OAAW,MAAQpB,EAAUe,EAE1CjB,GAAcmB,EAAsB,EAAG5rD,EAAG,EAAIqsD,EAAY,EAAIA,CAAU,EACxEhjC,EAAS,gBAAiBuiC,CAAoB,EAC9CviC,EAAS,OAAQyiC,EAASpC,EAAW,EAGrCqC,EAAa,OAAW,MAAQH,EAAqB,QACrDG,EAAa,UAAc,MAAQ,EACnCA,EAAa,OAAW,MAAQpB,EAAUgB,EAE1ClB,GAAcN,EAAoB,EAAGnqD,EAAG,EAAIqsD,EAAY,EAAIA,CAAU,EACtEhjC,EAAS,gBAAiB8gC,CAAkB,EAC5C9gC,EAAS,OAAQyiC,EAASpC,EAAW,CAEtC,CAkBA,MAAOS,EAAoBuB,EAAOC,EAAQzB,EAAOoC,EAAW,CAE3D,MAAMV,EAAuB,KAAK,sBAElC,KAAK,UACJzB,EACAyB,EACAF,EACAC,EACAzB,EACA,cACAoC,CAAQ,EAET,KAAK,UACJV,EACAzB,EACAwB,EACAA,EACAzB,EACA,eACAoC,CAAQ,CAEV,CAEA,UAAWC,EAAUC,EAAWd,EAAOC,EAAQc,EAAcr5C,EAAWk5C,EAAW,CAElF,MAAMjjC,EAAW,KAAK,UAChBqjC,EAAe,KAAK,cAErBt5C,IAAc,eAAiBA,IAAc,gBAEjDtV,GACC,4DAA4D,EAK9D,MAAM6uD,EAAsB,EAEtBC,EAAW,KAAK,WAAYjB,CAAM,EACxCiB,EAAS,SAAWF,EAEpB,MAAMG,EAAeH,EAAa,SAE5BI,EAAS,KAAK,UAAWpB,CAAK,EAAK,EACnCqB,EAAkB,SAAUN,CAAY,EAAK,KAAK,IAAO,EAAIK,GAAW,EAAI,KAAK,IAAO,EAAItD,GAAc,GAC1GwD,EAAcP,EAAeM,EAC7BE,EAAU,SAAUR,GAAiB,EAAI,KAAK,MAAOE,EAAsBK,CAAW,EAAKxD,GAE5FyD,EAAUzD,IAEd3rD,GAAM,iBACL4uD,CAAY,iDACZQ,CAAO,uCAAuCzD,EAAW,EAAE,EAI7D,MAAM0D,EAAU,CAAA,EAChB,IAAI/2B,EAAM,EAEV,QAAU/4B,EAAI,EAAGA,EAAIosD,GAAa,EAAGpsD,EAAI,CAExC,MAAMsC,EAAItC,EAAI4vD,EACRt9B,EAAS,KAAK,IAAK,CAAEhwB,EAAIA,EAAI,CAAC,EACpCwtD,EAAQ,KAAMx9B,CAAM,EAEftyB,IAAM,EAEV+4B,GAAOzG,EAEItyB,EAAI6vD,IAEf92B,GAAO,EAAIzG,EAIb,CAEA,QAAUtyB,EAAI,EAAGA,EAAI8vD,EAAQ,OAAQ9vD,IAEpC8vD,EAAS9vD,CAAC,EAAK8vD,EAAS9vD,CAAC,EAAK+4B,EAI/B02B,EAAc,OAAW,MAAQN,EAAS,QAC1CM,EAAc,QAAY,MAAQI,EAClCJ,EAAc,QAAY,MAAQK,EAClCL,EAAc,YAAgB,MAAQz5C,IAAc,cAE/Ck5C,IAEJO,EAAc,SAAa,MAAQP,GAIpC,KAAM,CAAE,QAAA3B,CAAO,EAAK,KACpBkC,EAAc,OAAW,MAAQE,EACjCF,EAAc,OAAW,MAAQlC,EAAUe,EAE3C,MAAMW,EAAa,KAAK,UAAWV,CAAM,EACnCjsD,EAAI,EAAI2sD,GAAeV,EAAShB,EAAUrB,GAAUqC,EAAShB,EAAUrB,GAAU,GACjFtpD,EAAI,GAAM,KAAK,UAAYqsD,GAEjC5B,GAAc+B,EAAW9sD,EAAGM,EAAG,EAAIqsD,EAAY,EAAIA,CAAU,EAC7DhjC,EAAS,gBAAiBmjC,CAAS,EACnCnjC,EAAS,OAAQujC,EAAUlD,EAAW,CAEvC,CAED,CAIA,SAASkB,GAAeuC,EAAS,CAEhC,MAAMC,EAAW,CAAA,EACXC,EAAS,CAAA,EACTC,EAAY,CAAA,EAElB,IAAIC,EAAMJ,EAEV,MAAMK,EAAYL,EAAS7D,GAAU,EAAIC,GAAgB,OAEzD,QAAUnsD,EAAI,EAAGA,EAAIowD,EAAWpwD,IAAO,CAEtC,MAAMqwD,EAAU,KAAK,IAAK,EAAGF,CAAG,EAChCH,EAAS,KAAMK,CAAO,EACtB,IAAIvD,EAAQ,EAAMuD,EAEbrwD,EAAI+vD,EAAS7D,GAEjBY,EAAQX,GAAiBnsD,EAAI+vD,EAAS7D,GAAU,CAAC,EAEtClsD,IAAM,IAEjB8sD,EAAQ,GAITmD,EAAO,KAAMnD,CAAK,EAElB,MAAMwD,EAAY,GAAQD,EAAU,GAC9BruD,EAAM,CAAEsuD,EACRruD,EAAM,EAAIquD,EACV9mC,EAAM,CAAExnB,EAAKA,EAAKC,EAAKD,EAAKC,EAAKA,EAAKD,EAAKA,EAAKC,EAAKA,EAAKD,EAAKC,CAAG,EAElEsuD,EAAY,EACZlmC,EAAW,EACXmmC,EAAe,EACfC,EAAS,EACTC,EAAgB,EAEhBv1C,EAAW,IAAI,aAAcq1C,EAAenmC,EAAWkmC,CAAS,EAChEh/C,EAAK,IAAI,aAAck/C,EAASpmC,EAAWkmC,CAAS,EACpDI,EAAY,IAAI,aAAcD,EAAgBrmC,EAAWkmC,CAAS,EAExE,QAAUxmC,EAAO,EAAGA,EAAOwmC,EAAWxmC,IAAU,CAE/C,MAAMznB,EAAMynB,EAAO,EAAM,EAAI,EAAI,EAC3BnnB,EAAImnB,EAAO,EAAI,EAAI,GACnB6mC,EAAc,CACnBtuD,EAAGM,EAAG,EACNN,EAAI,EAAI,EAAGM,EAAG,EACdN,EAAI,EAAI,EAAGM,EAAI,EAAG,EAClBN,EAAGM,EAAG,EACNN,EAAI,EAAI,EAAGM,EAAI,EAAG,EAClBN,EAAGM,EAAI,EAAG,CACd,EACGuY,EAAS,IAAKy1C,EAAaJ,EAAenmC,EAAWN,CAAI,EACzDxY,EAAG,IAAKiY,EAAKinC,EAASpmC,EAAWN,CAAI,EACrC,MAAM8mC,EAAO,CAAE9mC,EAAMA,EAAMA,EAAMA,EAAMA,EAAMA,CAAI,EACjD4mC,EAAU,IAAKE,EAAMH,EAAgBrmC,EAAWN,CAAI,CAErD,CAEA,MAAMwL,EAAS,IAAIrQ,GACnBqQ,EAAO,aAAc,WAAY,IAAIrR,GAAiB/I,EAAUq1C,EAAc,EAC9Ej7B,EAAO,aAAc,KAAM,IAAIrR,GAAiB3S,EAAIk/C,EAAQ,EAC5Dl7B,EAAO,aAAc,YAAa,IAAIrR,GAAiBysC,EAAWD,EAAe,EACjFR,EAAU,KAAM,IAAIrnC,GAAM0M,EAAQ,IAAI,CAAE,EAEnC46B,EAAMjE,IAEViE,GAIF,CAEA,MAAO,CAAE,UAAAD,EAAW,SAAAF,EAAU,OAAAC,CAAM,CAErC,CAEA,SAAS3C,GAAqBp6D,EAAOC,EAAQoN,EAAS,CAErD,MAAMwsD,EAAqB,IAAI36C,GAAmBlf,EAAOC,EAAQoN,CAAM,EACvE,OAAAwsD,EAAmB,QAAQ,QAAUnzD,GACrCmzD,EAAmB,QAAQ,KAAO,eAClCA,EAAmB,YAAc,GAC1BA,CAER,CAEA,SAASM,GAAcj+C,EAAQ9M,EAAGM,EAAG1P,EAAOC,EAAS,CAEpDic,EAAO,SAAS,IAAK9M,EAAGM,EAAG1P,EAAOC,CAAM,EACxCic,EAAO,QAAQ,IAAK9M,EAAGM,EAAG1P,EAAOC,CAAM,CAExC,CAEA,SAASu6D,GAAeqC,EAAQ78D,EAAOC,EAAS,CAyI/C,OAvIuB,IAAIm5B,GAAgB,CAE1C,KAAM,sBAEN,QAAS,CACR,YAAe+/B,GACf,mBAAsB,EAAMn5D,EAC5B,oBAAuB,EAAMC,EAC7B,eAAkB,GAAG48D,CAAM,IAC9B,EAEE,SAAU,CACT,OAAU,CAAE,MAAO,IAAI,EACvB,UAAa,CAAE,MAAO,CAAG,EACzB,OAAU,CAAE,MAAO,CAAC,CACvB,EAEE,aAAce,GAAsB,EAEpC,eAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA8G1B,SAAUt6D,GACV,UAAW,GACX,WAAY,EAEd,CAAE,CAIF,CAEA,SAASi3D,GAAgBsC,EAAQ78D,EAAOC,EAAS,CAEhD,MAAM28D,EAAU,IAAI,aAAc1D,EAAW,EACvC8C,EAAW,IAAIplD,EAAS,EAAG,EAAG,CAAC,EA4FrC,OA3FuB,IAAIwiB,GAAgB,CAE1C,KAAM,wBAEN,QAAS,CACR,EAAK8/B,GACL,mBAAsB,EAAMl5D,EAC5B,oBAAuB,EAAMC,EAC7B,eAAkB,GAAG48D,CAAM,IAC9B,EAEE,SAAU,CACT,OAAU,CAAE,MAAO,IAAI,EACvB,QAAW,CAAE,MAAO,CAAC,EACrB,QAAW,CAAE,MAAOD,CAAO,EAC3B,YAAe,CAAE,MAAO,EAAK,EAC7B,OAAU,CAAE,MAAO,CAAC,EACpB,OAAU,CAAE,MAAO,CAAC,EACpB,SAAY,CAAE,MAAOZ,CAAQ,CAChC,EAEE,aAAc4B,GAAsB,EAEpC,eAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA8D1B,SAAUt6D,GACV,UAAW,GACX,WAAY,EAEd,CAAE,CAIF,CAEA,SAAS02D,IAAuB,CAE/B,OAAO,IAAI5gC,GAAgB,CAE1B,KAAM,0BAEN,SAAU,CACT,OAAU,CAAE,MAAO,IAAI,CAC1B,EAEE,aAAcwkC,GAAsB,EAEpC,eAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAqB1B,SAAUt6D,GACV,UAAW,GACX,WAAY,EAEd,CAAE,CAEF,CAEA,SAASy2D,IAAsB,CAE9B,OAAO,IAAI3gC,GAAgB,CAE1B,KAAM,kBAEN,SAAU,CACT,OAAU,CAAE,MAAO,IAAI,EACvB,WAAc,CAAE,MAAO,EAAE,CAC5B,EAEE,aAAcwkC,GAAsB,EAEpC,eAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkB1B,SAAUt6D,GACV,UAAW,GACX,WAAY,EAEd,CAAE,CAEF,CAEA,SAASs6D,IAAyB,CAEjC,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyDlB,CAEA,SAASC,GAAiB9kC,EAAW,CAEpC,IAAI+kC,EAAa,IAAI,QAEjBC,EAAiB,KAErB,SAASnU,EAAK9qC,EAAU,CAEvB,GAAKA,GAAWA,EAAQ,UAAY,CAEnC,MAAMtB,EAAUsB,EAAQ,QAElBk/C,EAAkBxgD,IAAYhX,IAAoCgX,IAAY/W,GAC9Ew3D,EAAczgD,IAAYlX,IAAyBkX,IAAYjX,GAIrE,GAAKy3D,GAAiBC,EAAY,CAEjC,IAAI3jC,EAAewjC,EAAW,IAAKh/C,CAAO,EAE1C,MAAMo/C,EAAsB5jC,IAAiB,OAAYA,EAAa,QAAQ,aAAe,EAE7F,GAAKxb,EAAQ,uBAAyBA,EAAQ,eAAiBo/C,EAE9D,OAAKH,IAAmB,OAAOA,EAAiB,IAAIpE,GAAgB5gC,CAAQ,GAE5EuB,EAAe0jC,EAAgBD,EAAe,oBAAqBj/C,EAASwb,CAAY,EAAKyjC,EAAe,YAAaj/C,EAASwb,CAAY,EAC9IA,EAAa,QAAQ,aAAexb,EAAQ,aAE5Cg/C,EAAW,IAAKh/C,EAASwb,CAAY,EAE9BA,EAAa,QAIpB,GAAKA,IAAiB,OAErB,OAAOA,EAAa,QAEd,CAEN,MAAM5d,EAAQoC,EAAQ,MAEtB,OAAOk/C,GAAiBthD,GAASA,EAAM,OAAS,GAASuhD,GAAavhD,GAASyhD,EAAuBzhD,CAAK,GAErGqhD,IAAmB,OAAOA,EAAiB,IAAIpE,GAAgB5gC,CAAQ,GAE5EuB,EAAe0jC,EAAgBD,EAAe,oBAAqBj/C,CAAO,EAAKi/C,EAAe,YAAaj/C,CAAO,EAClHwb,EAAa,QAAQ,aAAexb,EAAQ,aAE5Cg/C,EAAW,IAAKh/C,EAASwb,CAAY,EAErCxb,EAAQ,iBAAkB,UAAWi6C,CAAgB,EAE9Cz+B,EAAa,SAMb,IAIT,CAIF,CAED,CAEA,OAAOxb,CAER,CAEA,SAASq/C,EAAuBzhD,EAAQ,CAEvC,IAAIsB,EAAQ,EACZ,MAAMhO,EAAS,EAEf,QAAUlD,EAAI,EAAGA,EAAIkD,EAAQlD,IAEvB4P,EAAO5P,KAAQ,QAAYkR,IAIjC,OAAOA,IAAUhO,CAGlB,CAEA,SAAS+oD,EAAkBj/D,EAAQ,CAElC,MAAMglB,EAAUhlB,EAAM,OAEtBglB,EAAQ,oBAAqB,UAAWi6C,CAAgB,EAExD,MAAMqF,EAAYN,EAAW,IAAKh/C,CAAO,EAEpCs/C,IAAc,SAElBN,EAAW,OAAQh/C,CAAO,EAC1Bs/C,EAAU,QAAO,EAInB,CAEA,SAASlM,GAAU,CAElB4L,EAAa,IAAI,QAEZC,IAAmB,OAEvBA,EAAe,QAAO,EACtBA,EAAiB,KAInB,CAEA,MAAO,CACN,IAAKnU,EACL,QAASsI,CACX,CAEA,CAEA,SAASmM,GAAiB1wD,EAAK,CAE9B,MAAM0rB,EAAa,CAAA,EAEnB,SAASilC,EAActxD,EAAO,CAE7B,GAAKqsB,EAAYrsB,CAAI,IAAO,OAE3B,OAAOqsB,EAAYrsB,CAAI,EAIxB,MAAM2oD,EAAYhoD,EAAG,aAAcX,CAAI,EAEvC,OAAAqsB,EAAYrsB,CAAI,EAAK2oD,EAEdA,CAER,CAEA,MAAO,CAEN,IAAK,SAAW3oD,EAAO,CAEtB,OAAOsxD,EAActxD,CAAI,IAAO,IAEjC,EAEA,KAAM,UAAY,CAEjBsxD,EAAc,wBAAwB,EACtCA,EAAc,0BAA0B,EACxCA,EAAc,0BAA0B,EACxCA,EAAc,6BAA6B,EAC3CA,EAAc,sCAAsC,EACpDA,EAAc,8BAA8B,CAE7C,EAEA,IAAK,SAAWtxD,EAAO,CAEtB,MAAM2oD,EAAY2I,EAActxD,CAAI,EAEpC,OAAK2oD,IAAc,MAElBloD,GAAU,kBAAoBT,EAAO,2BAA2B,EAI1D2oD,CAER,CAEF,CAEA,CAEA,SAAS4I,GAAiB5wD,EAAI8kB,EAAYvH,EAAMmnC,EAAgB,CAE/D,MAAM1mC,EAAa,CAAA,EACb6yC,EAAsB,IAAI,QAEhC,SAASC,EAAmB3kE,EAAQ,CAEnC,MAAMkmB,EAAWlmB,EAAM,OAElBkmB,EAAS,QAAU,MAEvByS,EAAW,OAAQzS,EAAS,KAAK,EAIlC,UAAYhT,KAAQgT,EAAS,WAE5ByS,EAAW,OAAQzS,EAAS,WAAYhT,CAAI,CAAE,EAI/CgT,EAAS,oBAAqB,UAAWy+C,CAAiB,EAE1D,OAAO9yC,EAAY3L,EAAS,EAAE,EAE9B,MAAMjN,EAAYyrD,EAAoB,IAAKx+C,CAAQ,EAE9CjN,IAEJ0f,EAAW,OAAQ1f,CAAS,EAC5ByrD,EAAoB,OAAQx+C,CAAQ,GAIrCqyC,EAAc,wBAAyBryC,CAAQ,EAE1CA,EAAS,4BAA8B,IAE3C,OAAOA,EAAS,kBAMjBkL,EAAK,OAAO,YAEb,CAEA,SAAS0+B,EAAKjqC,EAAQK,EAAW,CAEhC,OAAK2L,EAAY3L,EAAS,EAAE,IAAO,KAEnCA,EAAS,iBAAkB,UAAWy+C,CAAiB,EAEvD9yC,EAAY3L,EAAS,EAAE,EAAK,GAE5BkL,EAAK,OAAO,cAELlL,CAER,CAEA,SAASzL,EAAQyL,EAAW,CAE3B,MAAM4zC,EAAqB5zC,EAAS,WAIpC,UAAYhT,KAAQ4mD,EAEnBnhC,EAAW,OAAQmhC,EAAoB5mD,CAAI,EAAIW,EAAG,YAAY,CAIhE,CAEA,SAAS+wD,EAA0B1+C,EAAW,CAE7C,MAAMsU,EAAU,CAAA,EAEVqqC,EAAgB3+C,EAAS,MACzB4+C,EAAmB5+C,EAAS,WAAW,SAC7C,IAAI6+C,EAAU,EAEd,GAAKF,IAAkB,KAAO,CAE7B,MAAM9xD,EAAQ8xD,EAAc,MAC5BE,EAAUF,EAAc,QAExB,QAAU7xD,EAAI,EAAG5T,EAAI2T,EAAM,OAAQC,EAAI5T,EAAG4T,GAAK,EAAI,CAElD,MAAMqE,EAAItE,EAAOC,EAAI,CAAC,EAChBsE,EAAIvE,EAAOC,EAAI,CAAC,EAChBuE,EAAIxE,EAAOC,EAAI,CAAC,EAEtBwnB,EAAQ,KAAMnjB,EAAGC,EAAGA,EAAGC,EAAGA,EAAGF,CAAC,CAE/B,CAED,SAAYytD,IAAqB,OAAY,CAE5C,MAAM/xD,EAAQ+xD,EAAiB,MAC/BC,EAAUD,EAAiB,QAE3B,QAAU9xD,EAAI,EAAG5T,EAAM2T,EAAM,OAAS,EAAM,EAAGC,EAAI5T,EAAG4T,GAAK,EAAI,CAE9D,MAAMqE,EAAIrE,EAAI,EACRsE,EAAItE,EAAI,EACRuE,EAAIvE,EAAI,EAEdwnB,EAAQ,KAAMnjB,EAAGC,EAAGA,EAAGC,EAAGA,EAAGF,CAAC,CAE/B,CAED,KAEC,QAID,MAAM4B,EAAY,IAAMnG,GAAkB0nB,CAAO,EAAK/C,GAAwBD,IAAyBgD,EAAS,CAAC,EACjHvhB,EAAU,QAAU8rD,EAMpB,MAAMC,EAAoBN,EAAoB,IAAKx+C,CAAQ,EAEtD8+C,GAAoBrsC,EAAW,OAAQqsC,CAAiB,EAI7DN,EAAoB,IAAKx+C,EAAUjN,CAAS,CAE7C,CAEA,SAASgsD,EAAuB/+C,EAAW,CAE1C,MAAMg/C,EAAmBR,EAAoB,IAAKx+C,CAAQ,EAE1D,GAAKg/C,EAAmB,CAEvB,MAAML,EAAgB3+C,EAAS,MAE1B2+C,IAAkB,MAIjBK,EAAiB,QAAUL,EAAc,SAE7CD,EAA0B1+C,CAAQ,CAMrC,MAEC0+C,EAA0B1+C,CAAQ,EAInC,OAAOw+C,EAAoB,IAAKx+C,CAAQ,CAEzC,CAEA,MAAO,CAEN,IAAK4pC,EACL,OAAQr1C,EAER,sBAAuBwqD,CAEzB,CAEA,CAEA,SAASE,GAA4BtxD,EAAI0rB,EAAYnO,EAAO,CAE3D,IAAI+pC,EAEJ,SAASC,EAASn8D,EAAQ,CAEzBk8D,EAAOl8D,CAER,CAEA,IAAIoE,EAAMs3D,EAEV,SAASyK,EAAUnmE,EAAQ,CAE1BoE,EAAOpE,EAAM,KACb07D,EAAkB17D,EAAM,eAEzB,CAEA,SAAS64D,EAAQ7zC,EAAOC,EAAQ,CAE/BrQ,EAAG,aAAcsnD,EAAMj3C,EAAO7gB,EAAM4gB,EAAQ02C,CAAe,EAE3DvpC,EAAK,OAAQlN,EAAOi3C,EAAM,CAAC,CAE5B,CAEA,SAASE,EAAiBp3C,EAAOC,EAAOo3C,EAAY,CAE9CA,IAAc,IAEnBznD,EAAG,sBAAuBsnD,EAAMj3C,EAAO7gB,EAAM4gB,EAAQ02C,EAAiBW,CAAS,EAE/ElqC,EAAK,OAAQlN,EAAOi3C,EAAMG,CAAS,EAEpC,CAEA,SAASC,EAAiBC,EAAQC,EAAQC,EAAY,CAErD,GAAKA,IAAc,EAAI,OAELn8B,EAAW,IAAK,kBAAkB,EAC1C,uBAAwB47B,EAAMM,EAAQ,EAAGp4D,EAAMm4D,EAAQ,EAAGE,CAAS,EAE7E,IAAIC,EAAe,EACnB,QAAU3oD,EAAI,EAAGA,EAAI0oD,EAAW1oD,IAE/B2oD,GAAgBF,EAAQzoD,CAAC,EAI1Boe,EAAK,OAAQuqC,EAAcR,EAAM,CAAC,CAGnC,CAEA,SAASS,EAA0BJ,EAAQC,EAAQC,EAAWJ,EAAY,CAEzE,GAAKI,IAAc,EAAI,OAEvB,MAAMG,EAAYt8B,EAAW,IAAK,kBAAkB,EAEpD,GAAKs8B,IAAc,KAElB,QAAU7oD,EAAI,EAAGA,EAAIwoD,EAAO,OAAQxoD,IAEnCqoD,EAAiBG,EAAQxoD,CAAC,EAAK2nD,EAAiBc,EAAQzoD,CAAC,EAAIsoD,EAAWtoD,EAAG,MAItE,CAEN6oD,EAAU,gCAAiCV,EAAMM,EAAQ,EAAGp4D,EAAMm4D,EAAQ,EAAGF,EAAW,EAAGI,CAAS,EAEpG,IAAIC,EAAe,EACnB,QAAU3oD,EAAI,EAAGA,EAAI0oD,EAAW1oD,IAE/B2oD,GAAgBF,EAAQzoD,GAAMsoD,EAAWtoD,CAAC,EAI3Coe,EAAK,OAAQuqC,EAAcR,EAAM,CAAC,CAEnC,CAED,CAIA,KAAK,QAAUC,EACf,KAAK,SAAWgK,EAChB,KAAK,OAAStN,EACd,KAAK,gBAAkBuD,EACvB,KAAK,gBAAkBE,EACvB,KAAK,yBAA2BK,CAEjC,CAEA,SAASyJ,GAAWxxD,EAAK,CAExB,MAAMyxD,EAAS,CACd,WAAY,EACZ,SAAU,CACZ,EAEOxN,EAAS,CACd,MAAO,EACP,MAAO,EACP,UAAW,EACX,OAAQ,EACR,MAAO,CACT,EAEC,SAASr9C,EAAQyJ,EAAOi3C,EAAMoK,EAAgB,CAI7C,OAFAzN,EAAO,QAEEqD,EAAI,CAEZ,KAAKtnD,EAAG,UACPikD,EAAO,WAAayN,GAAkBrhD,EAAQ,GAC9C,MAED,KAAKrQ,EAAG,MACPikD,EAAO,OAASyN,GAAkBrhD,EAAQ,GAC1C,MAED,KAAKrQ,EAAG,WACPikD,EAAO,OAASyN,GAAkBrhD,EAAQ,GAC1C,MAED,KAAKrQ,EAAG,UACPikD,EAAO,OAASyN,EAAgBrhD,EAChC,MAED,KAAKrQ,EAAG,OACPikD,EAAO,QAAUyN,EAAgBrhD,EACjC,MAED,QACCxQ,GAAO,gCAAiCynD,CAAI,EAC5C,KAEJ,CAEC,CAEA,SAASP,GAAQ,CAEhB9C,EAAO,MAAQ,EACfA,EAAO,UAAY,EACnBA,EAAO,OAAS,EAChBA,EAAO,MAAQ,CAEhB,CAEA,MAAO,CACN,OAAQwN,EACR,OAAQxN,EACR,SAAU,KACV,UAAW,GACX,MAAO8C,EACP,OAAQngD,CACV,CAEA,CAEA,SAAS+qD,GAAmB3xD,EAAI4xD,EAAczzC,EAAW,CAExD,MAAM0zC,EAAgB,IAAI,QACpBC,EAAQ,IAAInhD,GAElB,SAAS/J,EAAQoL,EAAQK,EAAU2yC,EAAU,CAE5C,MAAM9xB,EAAmBlhB,EAAO,sBAI1B2S,EAAiBtS,EAAS,gBAAgB,UAAYA,EAAS,gBAAgB,QAAUA,EAAS,gBAAgB,MAClH0/C,EAAsBptC,IAAmB,OAAcA,EAAe,OAAS,EAErF,IAAIqtC,EAAQH,EAAc,IAAKx/C,CAAQ,EAEvC,GAAK2/C,IAAU,QAAaA,EAAM,QAAUD,EAAoB,CA+F/D,IAASE,EAAT,UAA0B,CAEzB9gD,EAAQ,QAAO,EAEf0gD,EAAc,OAAQx/C,CAAQ,EAE9BA,EAAS,oBAAqB,UAAW4/C,CAAc,CAExD,EArGKD,IAAU,QAAYA,EAAM,QAAQ,QAAO,EAEhD,MAAME,EAAmB7/C,EAAS,gBAAgB,WAAa,OACzD8/C,EAAkB9/C,EAAS,gBAAgB,SAAW,OACtD+/C,EAAiB//C,EAAS,gBAAgB,QAAU,OAEpDo+B,EAAep+B,EAAS,gBAAgB,UAAY,CAAA,EACpDggD,EAAehgD,EAAS,gBAAgB,QAAU,CAAA,EAClDigD,EAAcjgD,EAAS,gBAAgB,OAAS,CAAA,EAEtD,IAAIkgD,EAAkB,EAEjBL,IAAqB,KAAOK,EAAkB,GAC9CJ,IAAoB,KAAOI,EAAkB,GAC7CH,IAAmB,KAAOG,EAAkB,GAEjD,IAAIlgE,EAAQggB,EAAS,WAAW,SAAS,MAAQkgD,EAC7CjgE,EAAS,EAERD,EAAQu/D,EAAa,iBAEzBt/D,EAAS,KAAK,KAAMD,EAAQu/D,EAAa,cAAc,EACvDv/D,EAAQu/D,EAAa,gBAItB,MAAMtvC,EAAS,IAAI,aAAcjwB,EAAQC,EAAS,EAAIy/D,CAAiB,EAEjE5gD,EAAU,IAAIK,GAAkB8Q,EAAQjwB,EAAOC,EAAQy/D,CAAiB,EAC9E5gD,EAAQ,KAAOpX,GACfoX,EAAQ,YAAc,GAItB,MAAMqhD,EAAmBD,EAAkB,EAE3C,QAAUpzD,EAAI,EAAGA,EAAI4yD,EAAmB5yD,IAAO,CAE9C,MAAMyxC,EAAcH,EAActxC,CAAC,EAC7BszD,EAAcJ,EAAclzD,CAAC,EAC7BuzD,EAAaJ,EAAanzD,CAAC,EAE3BgG,EAAS9S,EAAQC,EAAS,EAAI6M,EAEpC,QAAUyU,EAAI,EAAGA,EAAIg9B,EAAY,MAAOh9B,IAAO,CAE9C,MAAMwb,EAASxb,EAAI4+C,EAEdN,IAAqB,KAEzBJ,EAAM,oBAAqBlhB,EAAah9B,CAAC,EAEzC0O,EAAQnd,EAASiqB,EAAS,CAAC,EAAK0iC,EAAM,EACtCxvC,EAAQnd,EAASiqB,EAAS,CAAC,EAAK0iC,EAAM,EACtCxvC,EAAQnd,EAASiqB,EAAS,CAAC,EAAK0iC,EAAM,EACtCxvC,EAAQnd,EAASiqB,EAAS,CAAC,EAAK,GAI5B+iC,IAAoB,KAExBL,EAAM,oBAAqBW,EAAa7+C,CAAC,EAEzC0O,EAAQnd,EAASiqB,EAAS,CAAC,EAAK0iC,EAAM,EACtCxvC,EAAQnd,EAASiqB,EAAS,CAAC,EAAK0iC,EAAM,EACtCxvC,EAAQnd,EAASiqB,EAAS,CAAC,EAAK0iC,EAAM,EACtCxvC,EAAQnd,EAASiqB,EAAS,CAAC,EAAK,GAI5BgjC,IAAmB,KAEvBN,EAAM,oBAAqBY,EAAY9+C,CAAC,EAExC0O,EAAQnd,EAASiqB,EAAS,CAAC,EAAK0iC,EAAM,EACtCxvC,EAAQnd,EAASiqB,EAAS,CAAC,EAAK0iC,EAAM,EACtCxvC,EAAQnd,EAASiqB,EAAS,EAAE,EAAK0iC,EAAM,EACvCxvC,EAAQnd,EAASiqB,EAAS,IAASsjC,EAAW,WAAa,EAAMZ,EAAM,EAAI,EAI7E,CAED,CAEAE,EAAQ,CACP,MAAOD,EACP,QAAS5gD,EACT,KAAM,IAAI1M,GAASpS,EAAOC,CAAM,CACpC,EAEGu/D,EAAc,IAAKx/C,EAAU2/C,CAAK,EAYlC3/C,EAAS,iBAAkB,UAAW4/C,CAAc,CAErD,CAGA,GAAKjgD,EAAO,kBAAoB,IAAQA,EAAO,eAAiB,KAE/DgzC,EAAQ,YAAW,EAAG,SAAUhlD,EAAI,eAAgBgS,EAAO,aAAcmM,CAAQ,MAE3E,CAEN,IAAIoV,EAAqB,EAEzB,QAAUp0B,EAAI,EAAGA,EAAI+zB,EAAiB,OAAQ/zB,IAE7Co0B,GAAsBL,EAAkB/zB,CAAC,EAI1C,MAAMq0B,EAAqBnhB,EAAS,qBAAuB,EAAI,EAAIkhB,EAGnEyxB,EAAQ,YAAW,EAAG,SAAUhlD,EAAI,2BAA4BwzB,CAAkB,EAClFwxB,EAAQ,YAAW,EAAG,SAAUhlD,EAAI,wBAAyBkzB,CAAgB,CAE9E,CAEA8xB,EAAQ,YAAW,EAAG,SAAUhlD,EAAI,sBAAuBgyD,EAAM,QAAS7zC,CAAQ,EAClF6mC,EAAQ,YAAW,EAAG,SAAUhlD,EAAI,0BAA2BgyD,EAAM,IAAI,CAE1E,CAEA,MAAO,CAEN,OAAQprD,CAEV,CAEA,CAEA,SAAS+rD,GAAc3yD,EAAIge,EAAY8G,EAAYvH,EAAO,CAEzD,IAAIq1C,EAAY,IAAI,QAEpB,SAAShsD,EAAQoL,EAAS,CAEzB,MAAMqc,EAAQ9Q,EAAK,OAAO,MAEpBlL,EAAWL,EAAO,SAClB6gD,EAAiB70C,EAAW,IAAKhM,EAAQK,CAAQ,EAoCvD,GAhCKugD,EAAU,IAAKC,CAAc,IAAOxkC,IAExCrQ,EAAW,OAAQ60C,CAAc,EAEjCD,EAAU,IAAKC,EAAgBxkC,CAAK,GAIhCrc,EAAO,kBAENA,EAAO,iBAAkB,UAAW8gD,CAAsB,IAAO,IAErE9gD,EAAO,iBAAkB,UAAW8gD,CAAsB,EAItDF,EAAU,IAAK5gD,CAAM,IAAOqc,IAEhCvJ,EAAW,OAAQ9S,EAAO,eAAgBhS,EAAG,YAAY,EAEpDgS,EAAO,gBAAkB,MAE7B8S,EAAW,OAAQ9S,EAAO,cAAehS,EAAG,YAAY,EAIzD4yD,EAAU,IAAK5gD,EAAQqc,CAAK,IAMzBrc,EAAO,cAAgB,CAE3B,MAAMsf,EAAWtf,EAAO,SAEnB4gD,EAAU,IAAKthC,CAAQ,IAAOjD,IAElCiD,EAAS,OAAM,EAEfshC,EAAU,IAAKthC,EAAUjD,CAAK,EAIhC,CAEA,OAAOwkC,CAER,CAEA,SAAStO,GAAU,CAElBqO,EAAY,IAAI,OAEjB,CAEA,SAASE,EAAwB3mE,EAAQ,CAExC,MAAM4mE,EAAgB5mE,EAAM,OAE5B4mE,EAAc,oBAAqB,UAAWD,CAAsB,EAEpEhuC,EAAW,OAAQiuC,EAAc,cAAc,EAE1CA,EAAc,gBAAkB,MAAOjuC,EAAW,OAAQiuC,EAAc,aAAa,CAE3F,CAEA,MAAO,CAEN,OAAQnsD,EACR,QAAS29C,CAEX,CAEA,CA8CA,MAAMyO,GAA6B,IAAIpjD,GAEjCqjD,GAAmC,IAAIv7B,GAAc,EAAG,CAAC,EAEzDw7B,GAAkC,IAAI1hD,GACtC2hD,GAA+B,IAAIzhD,GACnC0hD,GAAiC,IAAI3lC,GAMrC4lC,GAAgB,CAAA,EAChBC,GAAgB,CAAA,EAIhBC,GAAY,IAAI,aAAc,EAAE,EAChCC,GAAY,IAAI,aAAc,CAAC,EAC/BC,GAAY,IAAI,aAAc,CAAC,EAIrC,SAASC,GAASx0D,EAAOy0D,EAASC,EAAY,CAE7C,MAAMC,EAAY30D,EAAO,CAAC,EAE1B,GAAK20D,GAAa,GAAKA,EAAY,EAAI,OAAO30D,EAI9C,MAAMoC,EAAIqyD,EAAUC,EACpB,IAAI,EAAIP,GAAe/xD,CAAC,EASxB,GAPK,IAAM,SAEV,EAAI,IAAI,aAAcA,CAAC,EACvB+xD,GAAe/xD,CAAC,EAAK,GAIjBqyD,IAAY,EAAI,CAEpBE,EAAU,QAAS,EAAG,CAAC,EAEvB,QAAU10D,EAAI,EAAGgG,EAAS,EAAGhG,IAAMw0D,EAAS,EAAGx0D,EAE9CgG,GAAUyuD,EACV10D,EAAOC,CAAC,EAAG,QAAS,EAAGgG,CAAM,CAI/B,CAEA,OAAO,CAER,CAEA,SAAS2uD,GAAatwD,EAAGC,EAAI,CAE5B,GAAKD,EAAE,SAAWC,EAAE,OAAS,MAAO,GAEpC,QAAUtE,EAAI,EAAG5T,EAAIiY,EAAE,OAAQrE,EAAI5T,EAAG4T,IAErC,GAAKqE,EAAGrE,CAAC,IAAOsE,EAAGtE,CAAC,EAAK,MAAO,GAIjC,MAAO,EAER,CAEA,SAAS40D,GAAWvwD,EAAGC,EAAI,CAE1B,QAAUtE,EAAI,EAAG5T,EAAIkY,EAAE,OAAQtE,EAAI5T,EAAG4T,IAErCqE,EAAGrE,CAAC,EAAKsE,EAAGtE,CAAC,CAIf,CAIA,SAAS60D,GAAe71C,EAAU7c,EAAI,CAErC,IAAI0G,EAAIsrD,GAAehyD,CAAC,EAEnB0G,IAAM,SAEVA,EAAI,IAAI,WAAY1G,CAAC,EACrBgyD,GAAehyD,CAAC,EAAK0G,GAItB,QAAU7I,EAAI,EAAGA,IAAMmC,EAAG,EAAGnC,EAE5B6I,EAAG7I,CAAC,EAAKgf,EAAS,oBAAmB,EAItC,OAAOnW,CAER,CASA,SAASisD,GAAaj0D,EAAIpO,EAAI,CAE7B,MAAM4sB,EAAQ,KAAK,MAEdA,EAAO,CAAC,IAAO5sB,IAEpBoO,EAAG,UAAW,KAAK,KAAMpO,CAAC,EAE1B4sB,EAAO,CAAC,EAAK5sB,EAEd,CAIA,SAASsiE,GAAal0D,EAAIpO,EAAI,CAE7B,MAAM4sB,EAAQ,KAAK,MAEnB,GAAK5sB,EAAE,IAAM,QAEP4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,KAE3CoO,EAAG,UAAW,KAAK,KAAMpO,EAAE,EAAGA,EAAE,CAAC,EAEjC4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,OAIV,CAEN,GAAKkiE,GAAat1C,EAAO5sB,GAAM,OAE/BoO,EAAG,WAAY,KAAK,KAAMpO,CAAC,EAE3BmiE,GAAWv1C,EAAO5sB,CAAC,CAEpB,CAED,CAEA,SAASuiE,GAAan0D,EAAIpO,EAAI,CAE7B,MAAM4sB,EAAQ,KAAK,MAEnB,GAAK5sB,EAAE,IAAM,QAEP4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,KAEjEoO,EAAG,UAAW,KAAK,KAAMpO,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAEtC4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,WAILA,EAAE,IAAM,QAEd4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,KAEjEoO,EAAG,UAAW,KAAK,KAAMpO,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAEtC4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,OAIV,CAEN,GAAKkiE,GAAat1C,EAAO5sB,GAAM,OAE/BoO,EAAG,WAAY,KAAK,KAAMpO,CAAC,EAE3BmiE,GAAWv1C,EAAO5sB,CAAC,CAEpB,CAED,CAEA,SAASwiE,GAAap0D,EAAIpO,EAAI,CAE7B,MAAM4sB,EAAQ,KAAK,MAEnB,GAAK5sB,EAAE,IAAM,QAEP4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,KAEvFoO,EAAG,UAAW,KAAK,KAAMpO,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAE3C4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,OAIV,CAEN,GAAKkiE,GAAat1C,EAAO5sB,GAAM,OAE/BoO,EAAG,WAAY,KAAK,KAAMpO,CAAC,EAE3BmiE,GAAWv1C,EAAO5sB,CAAC,CAEpB,CAED,CAIA,SAASyiE,GAAYr0D,EAAIpO,EAAI,CAE5B,MAAM4sB,EAAQ,KAAK,MACb81C,EAAW1iE,EAAE,SAEnB,GAAK0iE,IAAa,OAAY,CAE7B,GAAKR,GAAat1C,EAAO5sB,GAAM,OAE/BoO,EAAG,iBAAkB,KAAK,KAAM,GAAOpO,CAAC,EAExCmiE,GAAWv1C,EAAO5sB,CAAC,CAEpB,KAAO,CAEN,GAAKkiE,GAAat1C,EAAO81C,GAAa,OAEtCb,GAAU,IAAKa,CAAQ,EAEvBt0D,EAAG,iBAAkB,KAAK,KAAM,GAAOyzD,EAAS,EAEhDM,GAAWv1C,EAAO81C,CAAQ,CAE3B,CAED,CAEA,SAASC,GAAYv0D,EAAIpO,EAAI,CAE5B,MAAM4sB,EAAQ,KAAK,MACb81C,EAAW1iE,EAAE,SAEnB,GAAK0iE,IAAa,OAAY,CAE7B,GAAKR,GAAat1C,EAAO5sB,GAAM,OAE/BoO,EAAG,iBAAkB,KAAK,KAAM,GAAOpO,CAAC,EAExCmiE,GAAWv1C,EAAO5sB,CAAC,CAEpB,KAAO,CAEN,GAAKkiE,GAAat1C,EAAO81C,GAAa,OAEtCd,GAAU,IAAKc,CAAQ,EAEvBt0D,EAAG,iBAAkB,KAAK,KAAM,GAAOwzD,EAAS,EAEhDO,GAAWv1C,EAAO81C,CAAQ,CAE3B,CAED,CAEA,SAASE,GAAYx0D,EAAIpO,EAAI,CAE5B,MAAM4sB,EAAQ,KAAK,MACb81C,EAAW1iE,EAAE,SAEnB,GAAK0iE,IAAa,OAAY,CAE7B,GAAKR,GAAat1C,EAAO5sB,GAAM,OAE/BoO,EAAG,iBAAkB,KAAK,KAAM,GAAOpO,CAAC,EAExCmiE,GAAWv1C,EAAO5sB,CAAC,CAEpB,KAAO,CAEN,GAAKkiE,GAAat1C,EAAO81C,GAAa,OAEtCf,GAAU,IAAKe,CAAQ,EAEvBt0D,EAAG,iBAAkB,KAAK,KAAM,GAAOuzD,EAAS,EAEhDQ,GAAWv1C,EAAO81C,CAAQ,CAE3B,CAED,CAIA,SAASG,GAAaz0D,EAAIpO,EAAI,CAE7B,MAAM4sB,EAAQ,KAAK,MAEdA,EAAO,CAAC,IAAO5sB,IAEpBoO,EAAG,UAAW,KAAK,KAAMpO,CAAC,EAE1B4sB,EAAO,CAAC,EAAK5sB,EAEd,CAIA,SAAS8iE,GAAa10D,EAAIpO,EAAI,CAE7B,MAAM4sB,EAAQ,KAAK,MAEnB,GAAK5sB,EAAE,IAAM,QAEP4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,KAE3CoO,EAAG,UAAW,KAAK,KAAMpO,EAAE,EAAGA,EAAE,CAAC,EAEjC4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,OAIV,CAEN,GAAKkiE,GAAat1C,EAAO5sB,GAAM,OAE/BoO,EAAG,WAAY,KAAK,KAAMpO,CAAC,EAE3BmiE,GAAWv1C,EAAO5sB,CAAC,CAEpB,CAED,CAEA,SAAS+iE,GAAa30D,EAAIpO,EAAI,CAE7B,MAAM4sB,EAAQ,KAAK,MAEnB,GAAK5sB,EAAE,IAAM,QAEP4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,KAEjEoO,EAAG,UAAW,KAAK,KAAMpO,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAEtC4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,OAIV,CAEN,GAAKkiE,GAAat1C,EAAO5sB,GAAM,OAE/BoO,EAAG,WAAY,KAAK,KAAMpO,CAAC,EAE3BmiE,GAAWv1C,EAAO5sB,CAAC,CAEpB,CAED,CAEA,SAASgjE,GAAa50D,EAAIpO,EAAI,CAE7B,MAAM4sB,EAAQ,KAAK,MAEnB,GAAK5sB,EAAE,IAAM,QAEP4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,KAEvFoO,EAAG,UAAW,KAAK,KAAMpO,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAE3C4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,OAIV,CAEN,GAAKkiE,GAAat1C,EAAO5sB,GAAM,OAE/BoO,EAAG,WAAY,KAAK,KAAMpO,CAAC,EAE3BmiE,GAAWv1C,EAAO5sB,CAAC,CAEpB,CAED,CAIA,SAASijE,GAAc70D,EAAIpO,EAAI,CAE9B,MAAM4sB,EAAQ,KAAK,MAEdA,EAAO,CAAC,IAAO5sB,IAEpBoO,EAAG,WAAY,KAAK,KAAMpO,CAAC,EAE3B4sB,EAAO,CAAC,EAAK5sB,EAEd,CAIA,SAASkjE,GAAc90D,EAAIpO,EAAI,CAE9B,MAAM4sB,EAAQ,KAAK,MAEnB,GAAK5sB,EAAE,IAAM,QAEP4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,KAE3CoO,EAAG,WAAY,KAAK,KAAMpO,EAAE,EAAGA,EAAE,CAAC,EAElC4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,OAIV,CAEN,GAAKkiE,GAAat1C,EAAO5sB,GAAM,OAE/BoO,EAAG,YAAa,KAAK,KAAMpO,CAAC,EAE5BmiE,GAAWv1C,EAAO5sB,CAAC,CAEpB,CAED,CAEA,SAASmjE,GAAc/0D,EAAIpO,EAAI,CAE9B,MAAM4sB,EAAQ,KAAK,MAEnB,GAAK5sB,EAAE,IAAM,QAEP4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,KAEjEoO,EAAG,WAAY,KAAK,KAAMpO,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAEvC4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,OAIV,CAEN,GAAKkiE,GAAat1C,EAAO5sB,GAAM,OAE/BoO,EAAG,YAAa,KAAK,KAAMpO,CAAC,EAE5BmiE,GAAWv1C,EAAO5sB,CAAC,CAEpB,CAED,CAEA,SAASojE,GAAch1D,EAAIpO,EAAI,CAE9B,MAAM4sB,EAAQ,KAAK,MAEnB,GAAK5sB,EAAE,IAAM,QAEP4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,GAAK4sB,EAAO,CAAC,IAAO5sB,EAAE,KAEvFoO,EAAG,WAAY,KAAK,KAAMpO,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAE5C4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,EACf4sB,EAAO,GAAM5sB,EAAE,OAIV,CAEN,GAAKkiE,GAAat1C,EAAO5sB,GAAM,OAE/BoO,EAAG,YAAa,KAAK,KAAMpO,CAAC,EAE5BmiE,GAAWv1C,EAAO5sB,CAAC,CAEpB,CAED,CAKA,SAASqjE,GAAYj1D,EAAIpO,EAAGusB,EAAW,CAEtC,MAAMK,EAAQ,KAAK,MACb02C,EAAO/2C,EAAS,oBAAmB,EAEpCK,EAAO,CAAC,IAAO02C,IAEnBl1D,EAAG,UAAW,KAAK,KAAMk1D,CAAI,EAC7B12C,EAAO,CAAC,EAAK02C,GAId,IAAIC,EAEC,KAAK,OAASn1D,EAAG,mBAErBizD,GAAmB,gBAAkBz0D,GACrC22D,EAAiBlC,IAIjBkC,EAAiBnC,GAIlB70C,EAAS,aAAcvsB,GAAKujE,EAAgBD,CAAI,CAEjD,CAEA,SAASE,GAAcp1D,EAAIpO,EAAGusB,EAAW,CAExC,MAAMK,EAAQ,KAAK,MACb02C,EAAO/2C,EAAS,oBAAmB,EAEpCK,EAAO,CAAC,IAAO02C,IAEnBl1D,EAAG,UAAW,KAAK,KAAMk1D,CAAI,EAC7B12C,EAAO,CAAC,EAAK02C,GAId/2C,EAAS,aAAcvsB,GAAKuhE,GAAgB+B,CAAI,CAEjD,CAEA,SAASG,GAAYr1D,EAAIpO,EAAGusB,EAAW,CAEtC,MAAMK,EAAQ,KAAK,MACb02C,EAAO/2C,EAAS,oBAAmB,EAEpCK,EAAO,CAAC,IAAO02C,IAEnBl1D,EAAG,UAAW,KAAK,KAAMk1D,CAAI,EAC7B12C,EAAO,CAAC,EAAK02C,GAId/2C,EAAS,eAAgBvsB,GAAKwhE,GAAkB8B,CAAI,CAErD,CAEA,SAASI,GAAmBt1D,EAAIpO,EAAGusB,EAAW,CAE7C,MAAMK,EAAQ,KAAK,MACb02C,EAAO/2C,EAAS,oBAAmB,EAEpCK,EAAO,CAAC,IAAO02C,IAEnBl1D,EAAG,UAAW,KAAK,KAAMk1D,CAAI,EAC7B12C,EAAO,CAAC,EAAK02C,GAId/2C,EAAS,kBAAmBvsB,GAAKshE,GAAmBgC,CAAI,CAEzD,CAIA,SAASK,GAAmB/lE,EAAO,CAElC,OAASA,EAAI,CAEZ,IAAK,MAAQ,OAAOykE,GACpB,IAAK,OAAQ,OAAOC,GACpB,IAAK,OAAQ,OAAOC,GACpB,IAAK,OAAQ,OAAOC,GAEpB,IAAK,OAAQ,OAAOC,GACpB,IAAK,OAAQ,OAAOE,GACpB,IAAK,OAAQ,OAAOC,GAEpB,IAAK,MAAQ,IAAK,OAAQ,OAAOC,GACjC,IAAK,OAAQ,IAAK,OAAQ,OAAOC,GACjC,IAAK,OAAQ,IAAK,OAAQ,OAAOC,GACjC,IAAK,OAAQ,IAAK,OAAQ,OAAOC,GAEjC,IAAK,MAAQ,OAAOC,GACpB,IAAK,OAAQ,OAAOC,GACpB,IAAK,OAAQ,OAAOC,GACpB,IAAK,OAAQ,OAAOC,GAEpB,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOC,GAER,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOG,GAER,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOC,GAER,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOC,EAEV,CAEA,CAKA,SAASE,GAAkBx1D,EAAIpO,EAAI,CAElCoO,EAAG,WAAY,KAAK,KAAMpO,CAAC,CAE5B,CAIA,SAAS6jE,GAAkBz1D,EAAIpO,EAAI,CAElC,MAAMsd,EAAOwkD,GAAS9hE,EAAG,KAAK,KAAM,CAAC,EAErCoO,EAAG,WAAY,KAAK,KAAMkP,CAAI,CAE/B,CAEA,SAASwmD,GAAkB11D,EAAIpO,EAAI,CAElC,MAAMsd,EAAOwkD,GAAS9hE,EAAG,KAAK,KAAM,CAAC,EAErCoO,EAAG,WAAY,KAAK,KAAMkP,CAAI,CAE/B,CAEA,SAASymD,GAAkB31D,EAAIpO,EAAI,CAElC,MAAMsd,EAAOwkD,GAAS9hE,EAAG,KAAK,KAAM,CAAC,EAErCoO,EAAG,WAAY,KAAK,KAAMkP,CAAI,CAE/B,CAIA,SAAS0mD,GAAiB51D,EAAIpO,EAAI,CAEjC,MAAMsd,EAAOwkD,GAAS9hE,EAAG,KAAK,KAAM,CAAC,EAErCoO,EAAG,iBAAkB,KAAK,KAAM,GAAOkP,CAAI,CAE5C,CAEA,SAAS2mD,GAAiB71D,EAAIpO,EAAI,CAEjC,MAAMsd,EAAOwkD,GAAS9hE,EAAG,KAAK,KAAM,CAAC,EAErCoO,EAAG,iBAAkB,KAAK,KAAM,GAAOkP,CAAI,CAE5C,CAEA,SAAS4mD,GAAiB91D,EAAIpO,EAAI,CAEjC,MAAMsd,EAAOwkD,GAAS9hE,EAAG,KAAK,KAAM,EAAE,EAEtCoO,EAAG,iBAAkB,KAAK,KAAM,GAAOkP,CAAI,CAE5C,CAIA,SAAS6mD,GAAkB/1D,EAAIpO,EAAI,CAElCoO,EAAG,WAAY,KAAK,KAAMpO,CAAC,CAE5B,CAIA,SAASokE,GAAkBh2D,EAAIpO,EAAI,CAElCoO,EAAG,WAAY,KAAK,KAAMpO,CAAC,CAE5B,CAEA,SAASqkE,GAAkBj2D,EAAIpO,EAAI,CAElCoO,EAAG,WAAY,KAAK,KAAMpO,CAAC,CAE5B,CAEA,SAASskE,GAAkBl2D,EAAIpO,EAAI,CAElCoO,EAAG,WAAY,KAAK,KAAMpO,CAAC,CAE5B,CAIA,SAASukE,GAAmBn2D,EAAIpO,EAAI,CAEnCoO,EAAG,YAAa,KAAK,KAAMpO,CAAC,CAE7B,CAIA,SAASwkE,GAAmBp2D,EAAIpO,EAAI,CAEnCoO,EAAG,YAAa,KAAK,KAAMpO,CAAC,CAE7B,CAEA,SAASykE,GAAmBr2D,EAAIpO,EAAI,CAEnCoO,EAAG,YAAa,KAAK,KAAMpO,CAAC,CAE7B,CAEA,SAAS0kE,GAAmBt2D,EAAIpO,EAAI,CAEnCoO,EAAG,YAAa,KAAK,KAAMpO,CAAC,CAE7B,CAKA,SAAS2kE,GAAiBv2D,EAAIpO,EAAGusB,EAAW,CAE3C,MAAMK,EAAQ,KAAK,MAEbld,EAAI1P,EAAE,OAEN4kE,EAAQxC,GAAe71C,EAAU7c,CAAC,EAEjCwyD,GAAat1C,EAAOg4C,KAE1Bx2D,EAAG,WAAY,KAAK,KAAMw2D,CAAK,EAE/BzC,GAAWv1C,EAAOg4C,CAAK,GAIxB,QAAUr3D,EAAI,EAAGA,IAAMmC,EAAG,EAAGnC,EAE5Bgf,EAAS,aAAcvsB,EAAGuN,CAAC,GAAM6zD,GAAcwD,EAAOr3D,EAAG,CAI3D,CAEA,SAASs3D,GAAkBz2D,EAAIpO,EAAGusB,EAAW,CAE5C,MAAMK,EAAQ,KAAK,MAEbld,EAAI1P,EAAE,OAEN4kE,EAAQxC,GAAe71C,EAAU7c,CAAC,EAEjCwyD,GAAat1C,EAAOg4C,KAE1Bx2D,EAAG,WAAY,KAAK,KAAMw2D,CAAK,EAE/BzC,GAAWv1C,EAAOg4C,CAAK,GAIxB,QAAUr3D,EAAI,EAAGA,IAAMmC,EAAG,EAAGnC,EAE5Bgf,EAAS,aAAcvsB,EAAGuN,CAAC,GAAMg0D,GAAgBqD,EAAOr3D,EAAG,CAI7D,CAEA,SAASu3D,GAAiB12D,EAAIpO,EAAGusB,EAAW,CAE3C,MAAMK,EAAQ,KAAK,MAEbld,EAAI1P,EAAE,OAEN4kE,EAAQxC,GAAe71C,EAAU7c,CAAC,EAEjCwyD,GAAat1C,EAAOg4C,KAE1Bx2D,EAAG,WAAY,KAAK,KAAMw2D,CAAK,EAE/BzC,GAAWv1C,EAAOg4C,CAAK,GAIxB,QAAUr3D,EAAI,EAAGA,IAAMmC,EAAG,EAAGnC,EAE5Bgf,EAAS,eAAgBvsB,EAAGuN,CAAC,GAAMi0D,GAAkBoD,EAAOr3D,EAAG,CAIjE,CAEA,SAASw3D,GAAuB32D,EAAIpO,EAAGusB,EAAW,CAEjD,MAAMK,EAAQ,KAAK,MAEbld,EAAI1P,EAAE,OAEN4kE,EAAQxC,GAAe71C,EAAU7c,CAAC,EAEjCwyD,GAAat1C,EAAOg4C,KAE1Bx2D,EAAG,WAAY,KAAK,KAAMw2D,CAAK,EAE/BzC,GAAWv1C,EAAOg4C,CAAK,GAIxB,QAAUr3D,EAAI,EAAGA,IAAMmC,EAAG,EAAGnC,EAE5Bgf,EAAS,kBAAmBvsB,EAAGuN,CAAC,GAAM+zD,GAAmBsD,EAAOr3D,EAAG,CAIrE,CAKA,SAASy3D,GAAoBpnE,EAAO,CAEnC,OAASA,EAAI,CAEZ,IAAK,MAAQ,OAAOgmE,GACpB,IAAK,OAAQ,OAAOC,GACpB,IAAK,OAAQ,OAAOC,GACpB,IAAK,OAAQ,OAAOC,GAEpB,IAAK,OAAQ,OAAOC,GACpB,IAAK,OAAQ,OAAOC,GACpB,IAAK,OAAQ,OAAOC,GAEpB,IAAK,MAAQ,IAAK,OAAQ,OAAOC,GACjC,IAAK,OAAQ,IAAK,OAAQ,OAAOC,GACjC,IAAK,OAAQ,IAAK,OAAQ,OAAOC,GACjC,IAAK,OAAQ,IAAK,OAAQ,OAAOC,GAEjC,IAAK,MAAQ,OAAOC,GACpB,IAAK,OAAQ,OAAOC,GACpB,IAAK,OAAQ,OAAOC,GACpB,IAAK,OAAQ,OAAOC,GAEpB,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOC,GAER,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOE,GAER,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOC,GAER,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOC,EAEV,CAEA,CAIA,MAAME,EAAc,CAEnB,YAAajpE,EAAIkpE,EAAYC,EAAO,CAEnC,KAAK,GAAKnpE,EACV,KAAK,KAAOmpE,EACZ,KAAK,MAAQ,CAAA,EACb,KAAK,KAAOD,EAAW,KACvB,KAAK,SAAWvB,GAAmBuB,EAAW,IAAI,CAInD,CAED,CAEA,MAAME,EAAiB,CAEtB,YAAappE,EAAIkpE,EAAYC,EAAO,CAEnC,KAAK,GAAKnpE,EACV,KAAK,KAAOmpE,EACZ,KAAK,MAAQ,CAAA,EACb,KAAK,KAAOD,EAAW,KACvB,KAAK,KAAOA,EAAW,KACvB,KAAK,SAAWF,GAAoBE,EAAW,IAAI,CAIpD,CAED,CAEA,MAAMG,EAAkB,CAEvB,YAAarpE,EAAK,CAEjB,KAAK,GAAKA,EAEV,KAAK,IAAM,CAAA,EACX,KAAK,IAAM,CAAA,CAEZ,CAEA,SAAUoS,EAAI5U,EAAO+yB,EAAW,CAE/B,MAAM+4C,EAAM,KAAK,IAEjB,QAAU/3D,EAAI,EAAGmC,EAAI41D,EAAI,OAAQ/3D,IAAMmC,EAAG,EAAGnC,EAAI,CAEhD,MAAM2L,EAAIosD,EAAK/3D,CAAC,EAChB2L,EAAE,SAAU9K,EAAI5U,EAAO0f,EAAE,EAAE,EAAIqT,CAAQ,CAExC,CAED,CAED,CAMA,MAAMg5C,GAAa,sBAWnB,SAASC,GAAYzlE,EAAW0lE,EAAgB,CAE/C1lE,EAAU,IAAI,KAAM0lE,CAAa,EACjC1lE,EAAU,IAAK0lE,EAAc,EAAE,EAAKA,CAErC,CAEA,SAASC,GAAcR,EAAYC,EAAMplE,EAAY,CAEpD,MAAMohD,EAAO+jB,EAAW,KACvBS,EAAaxkB,EAAK,OAKnB,IAFAokB,GAAW,UAAY,IAER,CAEd,MAAMK,EAAQL,GAAW,KAAMpkB,CAAI,EAClC0kB,EAAWN,GAAW,UAEvB,IAAIvpE,EAAK4pE,EAAO,CAAC,EACjB,MAAME,EAAYF,EAAO,CAAC,IAAO,IAChCG,EAAYH,EAAO,CAAC,EAIrB,GAFKE,IAAY9pE,EAAKA,EAAK,GAEtB+pE,IAAc,QAAaA,IAAc,KAAOF,EAAW,IAAMF,EAAa,CAIlFH,GAAYzlE,EAAWgmE,IAAc,OACpC,IAAId,GAAejpE,EAAIkpE,EAAYC,CAAI,EACvC,IAAIC,GAAkBppE,EAAIkpE,EAAYC,CAAI,CAAE,EAE7C,KAED,KAAO,CAKN,IAAIx3B,EADQ5tC,EAAU,IACN/D,CAAE,EAEb2xC,IAAS,SAEbA,EAAO,IAAI03B,GAAmBrpE,CAAE,EAChCwpE,GAAYzlE,EAAW4tC,CAAI,GAI5B5tC,EAAY4tC,CAEb,CAED,CAED,CAIA,MAAMq4B,EAAc,CAEnB,YAAa53D,EAAIglD,EAAU,CAE1B,KAAK,IAAM,CAAA,EACX,KAAK,IAAM,CAAA,EAEX,MAAM,EAAIhlD,EAAG,oBAAqBglD,EAAShlD,EAAG,eAAe,EAE7D,QAAU,EAAI,EAAG,EAAI,EAAG,EAAG,EAAI,CAE9B,MAAMud,EAAOvd,EAAG,iBAAkBglD,EAAS,CAAC,EAC3C+R,EAAO/2D,EAAG,mBAAoBglD,EAASznC,EAAK,IAAI,EAEjD+5C,GAAc/5C,EAAMw5C,EAAM,IAAI,CAE/B,CAED,CAEA,SAAU/2D,EAAIX,EAAMjU,EAAO+yB,EAAW,CAErC,MAAMrT,EAAI,KAAK,IAAKzL,CAAI,EAEnByL,IAAM,QAAYA,EAAE,SAAU9K,EAAI5U,EAAO+yB,CAAQ,CAEvD,CAEA,YAAane,EAAIgS,EAAQ3S,EAAO,CAE/B,MAAMzN,EAAIogB,EAAQ3S,CAAI,EAEjBzN,IAAM,QAAY,KAAK,SAAUoO,EAAIX,EAAMzN,CAAC,CAElD,CAEA,OAAO,OAAQoO,EAAIk3D,EAAK3mD,EAAQ4N,EAAW,CAE1C,QAAUhf,EAAI,EAAGmC,EAAI41D,EAAI,OAAQ/3D,IAAMmC,EAAG,EAAGnC,EAAI,CAEhD,MAAM2L,EAAIosD,EAAK/3D,CAAC,EACfvN,EAAI2e,EAAQzF,EAAE,EAAE,EAEZlZ,EAAE,cAAgB,IAGtBkZ,EAAE,SAAU9K,EAAIpO,EAAE,MAAOusB,CAAQ,CAInC,CAED,CAEA,OAAO,aAAc+4C,EAAK3mD,EAAS,CAElC,MAAMvI,EAAI,CAAA,EAEV,QAAU,EAAI,EAAG1G,EAAI41D,EAAI,OAAQ,IAAM51D,EAAG,EAAG,EAAI,CAEhD,MAAMwJ,EAAIosD,EAAK,CAAC,EACXpsD,EAAE,MAAMyF,GAASvI,EAAE,KAAM8C,CAAC,CAEhC,CAEA,OAAO9C,CAER,CAED,CAEA,SAAS6vD,GAAa73D,EAAIxQ,EAAM+xB,EAAS,CAExC,MAAMoM,EAAS3tB,EAAG,aAAcxQ,CAAI,EAEpC,OAAAwQ,EAAG,aAAc2tB,EAAQpM,CAAM,EAC/BvhB,EAAG,cAAe2tB,CAAM,EAEjBA,CAER,CAGA,MAAMmqC,GAAwB,MAE9B,IAAIC,GAAiB,EAErB,SAASC,GAAcz2C,EAAQ02C,EAAY,CAE1C,MAAMC,EAAQ32C,EAAO,MAAO;AAAA,CAAI,EAC1B42C,EAAS,CAAA,EAETlqB,EAAO,KAAK,IAAKgqB,EAAY,EAAG,CAAC,EACjC/pB,EAAK,KAAK,IAAK+pB,EAAY,EAAGC,EAAM,MAAM,EAEhD,QAAU/4D,EAAI8uC,EAAM9uC,EAAI+uC,EAAI/uC,IAAO,CAElC,MAAM40B,EAAO50B,EAAI,EACjBg5D,EAAO,KAAM,GAAGpkC,IAASkkC,EAAY,IAAM,GAAG,IAAIlkC,CAAI,KAAKmkC,EAAO/4D,CAAC,CAAE,EAAE,CAExE,CAEA,OAAOg5D,EAAO,KAAM;AAAA,CAAI,CAEzB,CAEA,MAAMC,GAAoB,IAAIrtD,GAE9B,SAASstD,GAAuB/pD,EAAa,CAE5CL,GAAgB,WAAYmqD,GAAKnqD,GAAgB,kBAAmBK,CAAU,EAE9E,MAAMgqD,EAAiB,SAAUF,GAAI,SAAS,IAAOxmE,GAAOA,EAAE,QAAS,CAAC,CAAE,CAAE,KAE5E,OAASqc,GAAgB,YAAaK,CAAU,EAAE,CAEjD,KAAKrQ,GACJ,MAAO,CAAEq6D,EAAgB,oBAAoB,EAE9C,KAAKp6D,GACJ,MAAO,CAAEo6D,EAAgB,kBAAkB,EAE5C,QACC,OAAA14D,GAAM,0CAA2C0O,CAAU,EACpD,CAAEgqD,EAAgB,oBAAoB,CAEhD,CAEA,CAEA,SAASC,GAAiBv4D,EAAI2tB,EAAQn+B,EAAO,CAE5C,MAAMgpE,EAASx4D,EAAG,mBAAoB2tB,EAAQ3tB,EAAG,cAAc,EAGzDy4D,GADgBz4D,EAAG,iBAAkB2tB,CAAM,GAAM,IAC1B,KAAI,EAEjC,GAAK6qC,GAAUC,IAAW,GAAK,MAAO,GAEtC,MAAMC,EAAe,iBAAiB,KAAMD,CAAM,EAClD,GAAKC,EAAe,CAKnB,MAAMT,EAAY,SAAUS,EAAc,CAAC,CAAE,EAC7C,OAAOlpE,EAAK,cAAgB;AAAA;AAAA,EAASipE,EAAS;AAAA;AAAA,EAAST,GAAch4D,EAAG,gBAAiB2tB,CAAM,EAAIsqC,CAAS,CAE7G,KAEC,QAAOQ,CAIT,CAEA,SAASE,GAA0BC,EAActqD,EAAa,CAE7D,MAAMkT,EAAa62C,GAAuB/pD,CAAU,EAEpD,MAAO,CAEN,QAAQsqD,CAAY,mBAEpB,WAAWp3C,EAAY,CAAC,CAAE,uBAAuBA,EAAY,CAAC,CAAE,iBAEhE,GAEF,EAAG,KAAM;AAAA,CAAI,CAEb,CAEA,SAASq3C,GAAwBD,EAAc1L,EAAc,CAE5D,IAAI4L,EAEJ,OAAS5L,EAAW,CAEnB,KAAKj1D,GACJ6gE,EAAkB,SAClB,MAED,KAAK5gE,GACJ4gE,EAAkB,WAClB,MAED,KAAK3gE,GACJ2gE,EAAkB,SAClB,MAED,KAAK1gE,GACJ0gE,EAAkB,aAClB,MAED,KAAKxgE,GACJwgE,EAAkB,MAClB,MAED,KAAKvgE,GACJugE,EAAkB,UAClB,MAED,KAAKzgE,GACJygE,EAAkB,SAClB,MAED,QACCl5D,GAAM,yCAA0CstD,CAAW,EAC3D4L,EAAkB,QAErB,CAEC,MAAO,QAAUF,EAAe,2BAA6BE,EAAkB,yBAEhF,CAEA,MAAMC,GAAoB,IAAI9vD,EAE9B,SAAS+vD,IAAuB,CAE/B/qD,GAAgB,yBAA0B8qD,EAAG,EAE7C,MAAM/wD,EAAI+wD,GAAI,EAAE,QAAS,CAAC,EACpB5rE,EAAI4rE,GAAI,EAAE,QAAS,CAAC,EACpBt1D,EAAIs1D,GAAI,EAAE,QAAS,CAAC,EAE1B,MAAO,CAEN,yCAEA,+BAAgC/wD,MAAQ7a,CAAC,KAAOsW,CAAC,MAEjD,+BAEA,GAEF,EAAG,KAAM;AAAA,CAAI,CAEb,CAEA,SAASw1D,GAA0Bt7C,EAAa,CAO/C,MALe,CACdA,EAAW,0BAA4B,mDAAqD,GAC5FA,EAAW,mBAAqB,2CAA6C,EAC/E,EAEe,OAAQu7C,EAAe,EAAG,KAAM;AAAA,CAAI,CAEnD,CAEA,SAASC,GAAiBC,EAAU,CAEnC,MAAMC,EAAS,CAAA,EAEf,UAAYh6D,KAAQ+5D,EAAU,CAE7B,MAAMhuE,EAAQguE,EAAS/5D,CAAI,EAEtBjU,IAAU,IAEfiuE,EAAO,KAAM,WAAah6D,EAAO,IAAMjU,CAAK,CAE7C,CAEA,OAAOiuE,EAAO,KAAM;AAAA,CAAI,CAEzB,CAEA,SAASC,GAAyBt5D,EAAIglD,EAAU,CAE/C,MAAMlgC,EAAa,CAAA,EAEb,EAAI9kB,EAAG,oBAAqBglD,EAAShlD,EAAG,iBAAiB,EAE/D,QAAU,EAAI,EAAG,EAAI,EAAG,IAAO,CAE9B,MAAMud,EAAOvd,EAAG,gBAAiBglD,EAAS,CAAC,EACrC3lD,EAAOke,EAAK,KAElB,IAAIg8C,EAAe,EACdh8C,EAAK,OAASvd,EAAG,aAAau5D,EAAe,GAC7Ch8C,EAAK,OAASvd,EAAG,aAAau5D,EAAe,GAC7Ch8C,EAAK,OAASvd,EAAG,aAAau5D,EAAe,GAIlDz0C,EAAYzlB,CAAI,EAAK,CACpB,KAAMke,EAAK,KACX,SAAUvd,EAAG,kBAAmBglD,EAAS3lD,CAAI,EAC7C,aAAck6D,CACjB,CAEC,CAEA,OAAOz0C,CAER,CAEA,SAASo0C,GAAiB33C,EAAS,CAElC,OAAOA,IAAW,EAEnB,CAEA,SAASi4C,GAAkBj4C,EAAQ5D,EAAa,CAE/C,MAAM87C,EAAqB97C,EAAW,oBAAsBA,EAAW,iBAAmBA,EAAW,4BAErG,OAAO4D,EACL,QAAS,kBAAmB5D,EAAW,YAAY,EACnD,QAAS,mBAAoBA,EAAW,aAAa,EACrD,QAAS,uBAAwBA,EAAW,gBAAgB,EAC5D,QAAS,yBAA0B87C,CAAkB,EACrD,QAAS,wBAAyB97C,EAAW,iBAAiB,EAC9D,QAAS,oBAAqBA,EAAW,cAAc,EACvD,QAAS,mBAAoBA,EAAW,aAAa,EACrD,QAAS,yBAA0BA,EAAW,kBAAkB,EAChE,QAAS,oCAAqCA,EAAW,2BAA2B,EACpF,QAAS,0BAA2BA,EAAW,mBAAmB,EAClE,QAAS,2BAA4BA,EAAW,oBAAoB,CAEvE,CAEA,SAAS+7C,GAA0Bn4C,EAAQ5D,EAAa,CAEvD,OAAO4D,EACL,QAAS,uBAAwB5D,EAAW,iBAAiB,EAC7D,QAAS,yBAA4BA,EAAW,kBAAoBA,EAAW,mBAAmB,CAErG,CAIA,MAAMg8C,GAAiB,mCAEvB,SAASC,GAAiBr4C,EAAS,CAElC,OAAOA,EAAO,QAASo4C,GAAgBE,EAAe,CAEvD,CAEA,MAAMC,GAAiB,IAAI,IAE3B,SAASD,GAAiBrC,EAAOuC,EAAU,CAE1C,IAAIx4C,EAASuhC,GAAaiX,CAAO,EAEjC,GAAKx4C,IAAW,OAAY,CAE3B,MAAMy4C,EAAaF,GAAe,IAAKC,CAAO,EAE9C,GAAKC,IAAe,OAEnBz4C,EAASuhC,GAAakX,CAAU,EAChCp6D,GAAM,0EAA2Em6D,EAASC,CAAU,MAIpG,OAAM,IAAI,MAAO,6BAA+BD,EAAU,GAAG,CAI/D,CAEA,OAAOH,GAAiBr4C,CAAM,CAE/B,CAIA,MAAM04C,GAAoB,+IAE1B,SAASC,GAAa34C,EAAS,CAE9B,OAAOA,EAAO,QAAS04C,GAAmBE,EAAY,CAEvD,CAEA,SAASA,GAAc3C,EAAOpnD,EAAO0Y,EAAKsxC,EAAU,CAEnD,IAAI74C,EAAS,GAEb,QAAUpiB,EAAI,SAAUiR,CAAK,EAAIjR,EAAI,SAAU2pB,GAAO3pB,IAErDoiB,GAAU64C,EACR,QAAS,eAAgB,KAAOj7D,EAAI,IAAI,EACxC,QAAS,uBAAwBA,CAAC,EAIrC,OAAOoiB,CAER,CAIA,SAAS84C,GAAmB18C,EAAa,CAExC,IAAI28C,EAAkB,aAAa38C,EAAW,SAAS;AAAA,aAC3CA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,GAGhC,OAAKA,EAAW,YAAc,QAE7B28C,GAAmB;AAAA,wBAER38C,EAAW,YAAc,UAEpC28C,GAAmB;AAAA,0BAER38C,EAAW,YAAc,SAEpC28C,GAAmB;AAAA,wBAIbA,CAER,CAEA,SAASC,GAA6B58C,EAAa,CAElD,IAAI68C,EAAsB,uBAE1B,OAAK78C,EAAW,gBAAkBtoB,GAEjCmlE,EAAsB,qBAEX78C,EAAW,gBAAkBroB,GAExCklE,EAAsB,0BAEX78C,EAAW,gBAAkBpoB,KAExCilE,EAAsB,sBAIhBA,CAER,CAEA,SAASC,GAA0B98C,EAAa,CAE/C,IAAI+8C,EAAmB,mBAEvB,GAAK/8C,EAAW,OAEf,OAASA,EAAW,WAAU,CAE7B,KAAKhlB,GACL,KAAKC,GACJ8hE,EAAmB,mBACnB,MAED,KAAK3hE,GACJ2hE,EAAmB,sBACnB,KAEJ,CAIC,OAAOA,CAER,CAEA,SAASC,GAA0Bh9C,EAAa,CAE/C,IAAIi9C,EAAmB,yBAEvB,GAAKj9C,EAAW,OAEf,OAASA,EAAW,WAAU,CAE7B,KAAK/kB,GAEJgiE,EAAmB,yBACnB,KAEJ,CAIC,OAAOA,CAER,CAEA,SAASC,GAA8Bl9C,EAAa,CAEnD,IAAIm9C,EAAuB,uBAE3B,GAAKn9C,EAAW,OAEf,OAASA,EAAW,QAAO,CAE1B,KAAK9lB,GACJijE,EAAuB,2BACvB,MAED,KAAKhjE,GACJgjE,EAAuB,sBACvB,MAED,KAAK/iE,GACJ+iE,EAAuB,sBACvB,KAEJ,CAIC,OAAOA,CAER,CAEA,SAASC,GAAoBp9C,EAAa,CAEzC,MAAMq9C,EAAcr9C,EAAW,mBAE/B,GAAKq9C,IAAgB,KAAO,OAAO,KAEnC,MAAMC,EAAS,KAAK,KAAMD,CAAW,EAAK,EAEpCE,EAAc,EAAMF,EAI1B,MAAO,CAAE,WAFU,GAAQ,EAAI,KAAK,IAAK,KAAK,IAAK,EAAGC,CAAM,EAAI,GAAM,GAEjD,YAAAC,EAAa,OAAAD,CAAM,CAEzC,CAEA,SAASE,GAAc/vC,EAAUgwC,EAAUz9C,EAAY+mC,EAAgB,CAKtE,MAAM1kD,EAAKorB,EAAS,WAAU,EAExBguC,EAAUz7C,EAAW,QAE3B,IAAI09C,EAAe19C,EAAW,aAC1B29C,EAAiB39C,EAAW,eAEhC,MAAM68C,EAAsBD,GAA6B58C,CAAU,EAC7D+8C,EAAmBD,GAA0B98C,CAAU,EACvDi9C,EAAmBD,GAA0Bh9C,CAAU,EACvDm9C,EAAuBD,GAA8Bl9C,CAAU,EAC/D49C,EAAmBR,GAAoBp9C,CAAU,EAEjD69C,EAAyBvC,GAA0Bt7C,CAAU,EAE7D89C,EAAgBtC,GAAiBC,CAAO,EAExCpU,EAAUhlD,EAAG,cAAa,EAEhC,IAAI07D,EAAcC,EACdC,EAAgBj+C,EAAW,YAAc,YAAcA,EAAW,YAAc;AAAA,EAAO,GAEtFA,EAAW,qBAEf+9C,EAAe,CAEd,uBAAyB/9C,EAAW,WACpC,uBAAyBA,EAAW,WAEpC89C,CAEH,EAAI,OAAQvC,IAAkB,KAAM;AAAA,CAAI,EAEjCwC,EAAa,OAAS,IAE1BA,GAAgB;AAAA,GAIjBC,EAAiB,CAEhB,uBAAyBh+C,EAAW,WACpC,uBAAyBA,EAAW,WAEpC89C,CAEH,EAAI,OAAQvC,IAAkB,KAAM;AAAA,CAAI,EAEjCyC,EAAe,OAAS,IAE5BA,GAAkB;AAAA,KAMnBD,EAAe,CAEdrB,GAAmB18C,CAAU,EAE7B,uBAAyBA,EAAW,WACpC,uBAAyBA,EAAW,WAEpC89C,EAEA99C,EAAW,0BAA4B,4BAA8B,GACrEA,EAAW,SAAW,uBAAyB,GAC/CA,EAAW,cAAgB,6BAA+B,GAC1DA,EAAW,WAAa,yBAA2B,GACnDA,EAAW,gBAAkB,+BAAiC,GAC9DA,EAAW,gBAAkB,+BAAiC,GAE9DA,EAAW,QAAUA,EAAW,IAAM,kBAAoB,GAC1DA,EAAW,QAAUA,EAAW,QAAU,mBAAqB,GAE/DA,EAAW,IAAM,kBAAoB,GACrCA,EAAW,OAAS,qBAAuB,GAC3CA,EAAW,OAAS,WAAai9C,EAAmB,GACpDj9C,EAAW,SAAW,uBAAyB,GAC/CA,EAAW,MAAQ,oBAAsB,GACzCA,EAAW,QAAU,sBAAwB,GAC7CA,EAAW,UAAY,wBAA0B,GACjDA,EAAW,qBAAuB,oCAAsC,GACxEA,EAAW,sBAAwB,qCAAuC,GAC1EA,EAAW,gBAAkB,8BAAgC,GAC7DA,EAAW,YAAc,0BAA4B,GAErDA,EAAW,WAAa,yBAA2B,GACnDA,EAAW,cAAgB,4BAA8B,GAEzDA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,sBAAwB,qCAAuC,GAC1EA,EAAW,mBAAqB,kCAAoC,GAEpEA,EAAW,eAAiB,6BAA+B,GAC3DA,EAAW,wBAA0B,uCAAyC,GAE9EA,EAAW,YAAc,0BAA4B,GACrDA,EAAW,iBAAmB,gCAAkC,GAChEA,EAAW,qBAAuB,oCAAsC,GAExEA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,SAAW,uBAAyB,GAC/CA,EAAW,UAAY,wBAA0B,GAEjDA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,gBAAkB,8BAAgC,GAC7DA,EAAW,aAAe,2BAA6B,GAEvDA,EAAW,cAAgB,6BAA+B,GAC1DA,EAAW,kBAAoB,iCAAmC,GAIlEA,EAAW,MAAQ,kBAAoBA,EAAW,MAAQ,GAC1DA,EAAW,WAAa,uBAAyBA,EAAW,WAAa,GACzEA,EAAW,WAAa,uBAAyBA,EAAW,WAAa,GACzEA,EAAW,QAAU,oBAAsBA,EAAW,QAAU,GAChEA,EAAW,cAAgB,0BAA4BA,EAAW,cAAgB,GAClFA,EAAW,UAAY,sBAAwBA,EAAW,UAAY,GACtEA,EAAW,YAAc,wBAA0BA,EAAW,YAAc,GAC5EA,EAAW,kBAAoB,8BAAgCA,EAAW,kBAAoB,GAE9FA,EAAW,eAAiB,2BAA6BA,EAAW,eAAiB,GACrFA,EAAW,eAAiB,2BAA6BA,EAAW,eAAiB,GAErFA,EAAW,gBAAkB,4BAA8BA,EAAW,gBAAkB,GAExFA,EAAW,eAAiB,2BAA6BA,EAAW,eAAiB,GACrFA,EAAW,qBAAuB,kCAAoCA,EAAW,qBAAuB,GACxGA,EAAW,wBAA0B,qCAAuCA,EAAW,wBAA0B,GAEjHA,EAAW,iBAAmB,6BAA+BA,EAAW,iBAAmB,GAC3FA,EAAW,0BAA4B,uCAAyCA,EAAW,0BAA4B,GAEvHA,EAAW,gBAAkB,6BAA+BA,EAAW,gBAAkB,GACzFA,EAAW,oBAAsB,iCAAmCA,EAAW,oBAAsB,GAErGA,EAAW,cAAgB,0BAA4BA,EAAW,cAAgB,GAClFA,EAAW,mBAAqB,gCAAkCA,EAAW,mBAAqB,GAClGA,EAAW,uBAAyB,oCAAsCA,EAAW,uBAAyB,GAE9GA,EAAW,kBAAoB,8BAAgCA,EAAW,kBAAoB,GAC9FA,EAAW,eAAiB,2BAA6BA,EAAW,eAAiB,GAIrFA,EAAW,gBAAkBA,EAAW,cAAgB,GAAQ,sBAAwB,GACxFA,EAAW,aAAe,oBAAsB,GAChDA,EAAW,aAAe,0BAA4B,GACtDA,EAAW,WAAa,kBAAoB,GAC5CA,EAAW,WAAa,kBAAoB,GAC5CA,EAAW,WAAa,kBAAoB,GAE5CA,EAAW,UAAY,wBAA0B,GAEjDA,EAAW,YAAc,sBAAwB,GAEjDA,EAAW,SAAW,uBAAyB,GAE/CA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,cAAgBA,EAAW,cAAgB,GAAQ,2BAA6B,GACzFA,EAAW,YAAgB,0BAA4B,GACvDA,EAAW,kBAAoB,EAAM,uCAAyCA,EAAW,mBAAqB,GAC9GA,EAAW,kBAAoB,EAAM,8BAAgCA,EAAW,kBAAoB,GACtGA,EAAW,YAAc,uBAAyB,GAClDA,EAAW,UAAY,qBAAuB,GAE9CA,EAAW,iBAAmB,wBAA0B,GACxDA,EAAW,iBAAmB,WAAa68C,EAAsB,GAEjE78C,EAAW,gBAAkB,8BAAgC,GAE7DA,EAAW,eAAiB,EAAI,2BAA6B,GAE7DA,EAAW,uBAAyB,uCAAyC,GAC7EA,EAAW,oBAAsB,oCAAsC,GAEvE,4BACA,gCACA,iCACA,2BACA,6BACA,+BACA,+BAEA,wBAEA,kCAEA,SAEA,8BAEA,iCAEA,SAEA,8BAEA,mCAEA,SAEA,2BACA,yBACA,qBAEA,iBAEA,uBAEA,SAEA,iBAEA,uBAEA,SAEA,iBAEA,uBAEA,SAEA,qBAEA,2BAEA,SAEA,iCAEA,yBAEA,6BAEA,yBAEA,SAEA,sBAEA,6BACA,8BAEA,SAEA;AAAA,CAEH,EAAI,OAAQu7C,IAAkB,KAAM;AAAA,CAAI,EAEtCyC,EAAiB,CAEhBtB,GAAmB18C,CAAU,EAE7B,uBAAyBA,EAAW,WACpC,uBAAyBA,EAAW,WAEpC89C,EAEA99C,EAAW,QAAUA,EAAW,IAAM,kBAAoB,GAC1DA,EAAW,QAAUA,EAAW,QAAU,mBAAqB,GAE/DA,EAAW,gBAAkB,4BAA8B,GAC3DA,EAAW,IAAM,kBAAoB,GACrCA,EAAW,OAAS,qBAAuB,GAC3CA,EAAW,OAAS,qBAAuB,GAC3CA,EAAW,OAAS,WAAa+8C,EAAmB,GACpD/8C,EAAW,OAAS,WAAai9C,EAAmB,GACpDj9C,EAAW,OAAS,WAAam9C,EAAuB,GACxDS,EAAmB,8BAAgCA,EAAiB,WAAa,GACjFA,EAAmB,+BAAiCA,EAAiB,YAAc,GACnFA,EAAmB,0BAA4BA,EAAiB,OAAS,KAAO,GAChF59C,EAAW,SAAW,uBAAyB,GAC/CA,EAAW,MAAQ,oBAAsB,GACzCA,EAAW,QAAU,sBAAwB,GAC7CA,EAAW,UAAY,wBAA0B,GACjDA,EAAW,qBAAuB,oCAAsC,GACxEA,EAAW,sBAAwB,qCAAuC,GAC1EA,EAAW,YAAc,0BAA4B,GAErDA,EAAW,WAAa,yBAA2B,GACnDA,EAAW,cAAgB,4BAA8B,GAEzDA,EAAW,UAAY,wBAA0B,GACjDA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,sBAAwB,qCAAuC,GAC1EA,EAAW,mBAAqB,kCAAoC,GAEpEA,EAAW,WAAa,yBAA2B,GAEnDA,EAAW,YAAc,0BAA4B,GACrDA,EAAW,eAAiB,6BAA+B,GAC3DA,EAAW,wBAA0B,uCAAyC,GAE9EA,EAAW,YAAc,0BAA4B,GACrDA,EAAW,iBAAmB,gCAAkC,GAChEA,EAAW,qBAAuB,oCAAsC,GAExEA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,aAAe,2BAA6B,GAEvDA,EAAW,SAAW,uBAAyB,GAC/CA,EAAW,UAAY,wBAA0B,GACjDA,EAAW,UAAY,wBAA0B,GAEjDA,EAAW,MAAQ,oBAAsB,GACzCA,EAAW,cAAgB,6BAA+B,GAC1DA,EAAW,kBAAoB,iCAAmC,GAElEA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,gBAAkB,8BAAgC,GAC7DA,EAAW,aAAe,2BAA6B,GAEvDA,EAAW,gBAAkBA,EAAW,cAAgB,GAAQ,sBAAwB,GACxFA,EAAW,cAAgBA,EAAW,iBAAmBA,EAAW,cAAgB,oBAAsB,GAC1GA,EAAW,aAAe,0BAA4B,GACtDA,EAAW,WAAa,kBAAoB,GAC5CA,EAAW,WAAa,kBAAoB,GAC5CA,EAAW,WAAa,kBAAoB,GAE5CA,EAAW,UAAY,wBAA0B,GAEjDA,EAAW,YAAc,0BAA4B,GAErDA,EAAW,YAAc,sBAAwB,GAEjDA,EAAW,YAAc,uBAAyB,GAClDA,EAAW,UAAY,qBAAuB,GAE9CA,EAAW,iBAAmB,wBAA0B,GACxDA,EAAW,iBAAmB,WAAa68C,EAAsB,GAEjE78C,EAAW,mBAAqB,8BAAgC,GAEhEA,EAAW,eAAiB,EAAI,2BAA6B,GAE7DA,EAAW,mBAAqB,+BAAiC,GACjEA,EAAW,2BAA6B,wCAA0C,GAElFA,EAAW,uBAAyB,uCAAyC,GAC7EA,EAAW,oBAAsB,oCAAsC,GAEvE,2BACA,+BACA,+BAEEA,EAAW,cAAgB3lB,GAAkB,uBAAyB,GACtE2lB,EAAW,cAAgB3lB,GAAkB8qD,GAAa,0BAAgC,GAC1FnlC,EAAW,cAAgB3lB,GAAkB6gE,GAAwB,cAAel7C,EAAW,WAAW,EAAK,GAEjHA,EAAW,UAAY,oBAAsB,GAC7CA,EAAW,OAAS,iBAAmB,GAEvCmlC,GAAa,yBACb6V,GAA0B,sBAAuBh7C,EAAW,gBAAgB,EAC5Eq7C,GAAoB,EAEpBr7C,EAAW,gBAAkB,yBAA2BA,EAAW,aAAe,GAElF;AAAA,CAEH,EAAI,OAAQu7C,IAAkB,KAAM;AAAA,CAAI,GAIvCmC,EAAezB,GAAiByB,CAAY,EAC5CA,EAAe7B,GAAkB6B,EAAc19C,CAAU,EACzD09C,EAAe3B,GAA0B2B,EAAc19C,CAAU,EAEjE29C,EAAiB1B,GAAiB0B,CAAc,EAChDA,EAAiB9B,GAAkB8B,EAAgB39C,CAAU,EAC7D29C,EAAiB5B,GAA0B4B,EAAgB39C,CAAU,EAErE09C,EAAenB,GAAamB,CAAY,EACxCC,EAAiBpB,GAAaoB,CAAc,EAEvC39C,EAAW,sBAAwB,KAIvCi+C,EAAgB;AAAA,EAEhBF,EAAe,CACdF,EACA,uBACA,sBACA,2BACH,EAAI,KAAM;AAAA,GAAS;AAAA,EAAOE,EAExBC,EAAiB,CAChB,qBACEh+C,EAAW,cAAgB7e,GAAU,GAAK,oDAC1C6e,EAAW,cAAgB7e,GAAU,GAAK,oCAC5C,uCACA,4BACA,8BACA,oCACA,qCACA,6CACA,uCACA,uCACA,+CACA,wCACH,EAAI,KAAM;AAAA,GAAS;AAAA,EAAO68D,GAIzB,MAAME,EAAaD,EAAgBF,EAAeL,EAC5CS,EAAeF,EAAgBD,EAAiBL,EAKhDS,EAAiBlE,GAAa73D,EAAIA,EAAG,cAAe67D,CAAU,EAC9DG,EAAmBnE,GAAa73D,EAAIA,EAAG,gBAAiB87D,CAAY,EAE1E97D,EAAG,aAAcglD,EAAS+W,CAAc,EACxC/7D,EAAG,aAAcglD,EAASgX,CAAgB,EAIrCr+C,EAAW,sBAAwB,OAEvC3d,EAAG,mBAAoBglD,EAAS,EAAGrnC,EAAW,mBAAmB,EAEtDA,EAAW,eAAiB,IAGvC3d,EAAG,mBAAoBglD,EAAS,EAAG,UAAU,EAI9ChlD,EAAG,YAAaglD,CAAO,EAEvB,SAASiX,EAAYC,EAAO,CAG3B,GAAK9wC,EAAS,MAAM,kBAAoB,CAEvC,MAAM+wC,EAAiBn8D,EAAG,kBAAmBglD,CAAO,GAAM,GACpDoX,EAAsBp8D,EAAG,iBAAkB+7D,CAAc,GAAM,GAC/DM,EAAwBr8D,EAAG,iBAAkBg8D,CAAgB,GAAM,GAEnEM,EAAaH,EAAe,KAAI,EAChCI,EAAYH,EAAoB,KAAI,EACpCI,EAAcH,EAAsB,KAAI,EAE9C,IAAII,EAAW,GACXC,EAAkB,GAEtB,GAAK18D,EAAG,oBAAqBglD,EAAShlD,EAAG,WAAW,IAAO,GAI1D,GAFAy8D,EAAW,GAEN,OAAOrxC,EAAS,MAAM,eAAkB,WAE5CA,EAAS,MAAM,cAAeprB,EAAIglD,EAAS+W,EAAgBC,CAAgB,MAErE,CAIN,MAAMW,GAAepE,GAAiBv4D,EAAI+7D,EAAgB,QAAQ,EAC5Da,EAAiBrE,GAAiBv4D,EAAIg8D,EAAkB,UAAU,EAExEn8D,GACC,oCAAsCG,EAAG,SAAQ,EAAK,sBACjCA,EAAG,oBAAqBglD,EAAShlD,EAAG,eAAe,EAAK;AAAA;AAAA,iBACzDk8D,EAAK,KAAO;AAAA,iBACZA,EAAK,KAAO;AAAA;AAAA,oBACTI,EAAa;AAAA,EACpCK,GAAe;AAAA,EACfC,CACN,CAEI,MAEWN,IAAe,GAE1B18D,GAAM,kCAAmC08D,CAAU,GAExCC,IAAc,IAAMC,IAAgB,MAE/CE,EAAkB,IAIdA,IAEJR,EAAK,YAAc,CAElB,SAAUO,EAEV,WAAYH,EAEZ,aAAc,CAEb,IAAKC,EACL,OAAQb,CAEd,EAEK,eAAgB,CAEf,IAAKc,EACL,OAAQb,CAEd,CAEA,EAIE,CAQA37D,EAAG,aAAc+7D,CAAc,EAC/B/7D,EAAG,aAAcg8D,CAAgB,EAEjCa,EAAiB,IAAIjF,GAAe53D,EAAIglD,CAAO,EAC/CgB,EAAmBsT,GAAyBt5D,EAAIglD,CAAO,CAExD,CAIA,IAAI6X,EAEJ,KAAK,YAAc,UAAY,CAE9B,OAAKA,IAAmB,QAGvBZ,EAAY,IAAI,EAIVY,CAER,EAIA,IAAI7W,EAEJ,KAAK,cAAgB,UAAY,CAEhC,OAAKA,IAAqB,QAGzBiW,EAAY,IAAI,EAIVjW,CAER,EAKA,IAAI8W,EAAiBn/C,EAAW,yCAA2C,GAE3E,YAAK,QAAU,UAAY,CAE1B,OAAKm/C,IAAiB,KAErBA,EAAe98D,EAAG,oBAAqBglD,EAAS8S,EAAqB,GAI/DgF,CAER,EAIA,KAAK,QAAU,UAAY,CAE1BpY,EAAc,uBAAwB,IAAI,EAE1C1kD,EAAG,cAAeglD,CAAO,EACzB,KAAK,QAAU,MAEhB,EAIA,KAAK,KAAOrnC,EAAW,WACvB,KAAK,KAAOA,EAAW,WACvB,KAAK,GAAKo6C,KACV,KAAK,SAAWqD,EAChB,KAAK,UAAY,EACjB,KAAK,QAAUpW,EACf,KAAK,aAAe+W,EACpB,KAAK,eAAiBC,EAEf,IAER,CAEA,IAAIe,GAAM,EAEV,MAAMC,EAAiB,CAEtB,aAAc,CAEb,KAAK,YAAc,IAAI,IACvB,KAAK,cAAgB,IAAI,GAE1B,CAEA,OAAQ/0C,EAAW,CAElB,MAAMozC,EAAepzC,EAAS,aACxBqzC,EAAiBrzC,EAAS,eAE1Bg1C,EAAoB,KAAK,gBAAiB5B,CAAY,EACtD6B,EAAsB,KAAK,gBAAiB5B,CAAc,EAE1D6B,EAAkB,KAAK,2BAA4Bl1C,CAAQ,EAEjE,OAAKk1C,EAAgB,IAAKF,CAAiB,IAAO,KAEjDE,EAAgB,IAAKF,CAAiB,EACtCA,EAAkB,aAIdE,EAAgB,IAAKD,CAAmB,IAAO,KAEnDC,EAAgB,IAAKD,CAAmB,EACxCA,EAAoB,aAId,IAER,CAEA,OAAQj1C,EAAW,CAElB,MAAMk1C,EAAkB,KAAK,cAAc,IAAKl1C,CAAQ,EAExD,UAAYm1C,KAAeD,EAE1BC,EAAY,YAEPA,EAAY,YAAc,GAAI,KAAK,YAAY,OAAQA,EAAY,IAAI,EAI7E,YAAK,cAAc,OAAQn1C,CAAQ,EAE5B,IAER,CAEA,kBAAmBA,EAAW,CAE7B,OAAO,KAAK,gBAAiBA,EAAS,YAAY,EAAG,EAEtD,CAEA,oBAAqBA,EAAW,CAE/B,OAAO,KAAK,gBAAiBA,EAAS,cAAc,EAAG,EAExD,CAEA,SAAU,CAET,KAAK,YAAY,MAAK,EACtB,KAAK,cAAc,MAAK,CAEzB,CAEA,2BAA4BA,EAAW,CAEtC,MAAMzJ,EAAQ,KAAK,cACnB,IAAI6+C,EAAM7+C,EAAM,IAAKyJ,CAAQ,EAE7B,OAAKo1C,IAAQ,SAEZA,EAAM,IAAI,IACV7+C,EAAM,IAAKyJ,EAAUo1C,CAAG,GAIlBA,CAER,CAEA,gBAAiBC,EAAO,CAEvB,MAAM9+C,EAAQ,KAAK,YACnB,IAAI++C,EAAQ/+C,EAAM,IAAK8+C,CAAI,EAE3B,OAAKC,IAAU,SAEdA,EAAQ,IAAIC,GAAkBF,CAAI,EAClC9+C,EAAM,IAAK8+C,EAAMC,CAAK,GAIhBA,CAER,CAED,CAEA,MAAMC,EAAiB,CAEtB,YAAaF,EAAO,CAEnB,KAAK,GAAKP,KAEV,KAAK,KAAOO,EACZ,KAAK,UAAY,CAElB,CAED,CAEA,SAASG,GAAeryC,EAAUg4B,EAAUC,EAAY33B,EAAYkmC,EAAclN,EAAegZ,EAAW,CAE3G,MAAMC,EAAiB,IAAI/hD,GACrBgiD,EAAiB,IAAIZ,GACrBa,EAAkB,IAAI,IACtBC,EAAW,CAAA,EAEXjV,EAAyB+I,EAAa,uBACtCmM,EAA2BnM,EAAa,eAE9C,IAAIjJ,EAAYiJ,EAAa,UAE7B,MAAMoM,EAAY,CACjB,kBAAmB,QACnB,qBAAsB,eACtB,mBAAoB,SACpB,kBAAmB,QACnB,oBAAqB,UACrB,kBAAmB,QACnB,iBAAkB,OAClB,qBAAsB,WACtB,qBAAsB,WACtB,mBAAoB,SACpB,kBAAmB,QACnB,mBAAoB,SACpB,eAAgB,SAChB,eAAgB,SAChB,eAAgB,QAClB,EAEC,SAASC,EAAY7yE,EAAQ,CAI5B,OAFAyyE,EAAgB,IAAKzyE,CAAK,EAErBA,IAAU,EAAW,KAEnB,KAAMA,GAEd,CAEA,SAAS8yE,EAAej2C,EAAUk2C,EAAQC,EAASjxC,EAAOnb,EAAS,CAElE,MAAMqsD,EAAMlxC,EAAM,IACZ9a,EAAWL,EAAO,SAClBssD,EAAcr2C,EAAS,uBAAyBkF,EAAM,YAAc,KAEpEoxC,GAAWt2C,EAAS,uBAAyBo7B,EAAaD,GAAW,IAAKn7B,EAAS,QAAUq2C,CAAW,EACxGE,EAA0BD,GAAcA,EAAO,UAAYxlE,GAA4BwlE,EAAO,MAAM,OAAS,KAE7GE,EAAWT,EAAW/1C,EAAS,IAAI,EAKpCA,EAAS,YAAc,OAE3B0gC,EAAYiJ,EAAa,gBAAiB3pC,EAAS,SAAS,EAEvD0gC,IAAc1gC,EAAS,WAE3BroB,GAAM,8BAA+BqoB,EAAS,UAAW,uBAAwB0gC,EAAW,UAAU,GAQxG,MAAMhkC,GAAiBtS,EAAS,gBAAgB,UAAYA,EAAS,gBAAgB,QAAUA,EAAS,gBAAgB,MAClH0/C,EAAsBptC,KAAmB,OAAcA,GAAe,OAAS,EAErF,IAAI+5C,EAAqB,EAEpBrsD,EAAS,gBAAgB,WAAa,SAAYqsD,EAAqB,GACvErsD,EAAS,gBAAgB,SAAW,SAAYqsD,EAAqB,GACrErsD,EAAS,gBAAgB,QAAU,SAAYqsD,EAAqB,GAIzE,IAAIrD,GAAcC,GACdqD,GAAsBC,GAE1B,GAAKH,EAAW,CAEf,MAAM9wC,GAASq1B,GAAWyb,CAAQ,EAElCpD,GAAe1tC,GAAO,aACtB2tC,GAAiB3tC,GAAO,cAEzB,MAEC0tC,GAAepzC,EAAS,aACxBqzC,GAAiBrzC,EAAS,eAE1B21C,EAAe,OAAQ31C,CAAQ,EAE/B02C,GAAuBf,EAAe,kBAAmB31C,CAAQ,EACjE22C,GAAyBhB,EAAe,oBAAqB31C,CAAQ,EAItE,MAAMoD,GAAsBD,EAAS,gBAAe,EAC9C09B,GAAsB19B,EAAS,MAAM,QAAQ,MAAM,YAAW,EAE9DyzC,GAAmB7sD,EAAO,kBAAoB,GAC9C8sD,GAAiB9sD,EAAO,gBAAkB,GAE1C+sD,GAAU,CAAC,CAAE92C,EAAS,IACtB+2C,GAAa,CAAC,CAAE/2C,EAAS,OACzBg3C,GAAa,CAAC,CAAEV,EAChBW,EAAY,CAAC,CAAEj3C,EAAS,MACxBk3C,EAAe,CAAC,CAAEl3C,EAAS,SAC3Bm3C,EAAc,CAAC,CAAEn3C,EAAS,QAC1Bo3C,EAAgB,CAAC,CAAEp3C,EAAS,UAC5Bq3C,EAAsB,CAAC,CAAEr3C,EAAS,gBAClCs3C,EAAkB,CAAC,CAAEt3C,EAAS,YAE9Bu3C,GAAmB,CAAC,CAAEv3C,EAAS,aAC/Bw3C,EAAmB,CAAC,CAAEx3C,EAAS,aAE/By3C,EAAiBz3C,EAAS,WAAa,EACvC03C,EAAgB13C,EAAS,UAAY,EACrC23C,EAAiB33C,EAAS,WAAa,EACvC43C,EAAkB53C,EAAS,YAAc,EACzC63C,EAAY73C,EAAS,MAAQ,EAC7B83C,GAAmB93C,EAAS,aAAe,EAE3C+3C,GAAoBN,GAAkB,CAAC,CAAEz3C,EAAS,cAElDg4C,GAAmBN,GAAiB,CAAC,CAAE13C,EAAS,aAChDi4C,GAA0BP,GAAiB,CAAC,CAAE13C,EAAS,mBACvDk4C,GAA6BR,GAAiB,CAAC,CAAE13C,EAAS,sBAE1Dm4C,GAAqBP,GAAmB,CAAC,CAAE53C,EAAS,eACpDo4C,GAA+BR,GAAmB,CAAC,CAAE53C,EAAS,wBAE9Dq4C,GAAqBR,GAAa,CAAC,CAAE73C,EAAS,cAC9Cs4C,GAAyBT,GAAa,CAAC,CAAE73C,EAAS,kBAElDu4C,GAAkB,CAAC,CAAEv4C,EAAS,YAC9Bw4C,GAAwB,CAAC,CAAEx4C,EAAS,iBACpCy4C,GAA4B,CAAC,CAAEz4C,EAAS,qBAExC04C,EAAsBZ,IAAoB,CAAC,CAAE93C,EAAS,gBACtD24C,GAAmBb,IAAoB,CAAC,CAAE93C,EAAS,aAEnD44C,GAAkB,CAAC,CAAE54C,EAAS,YAE9B64C,GAAe,CAAC,CAAE74C,EAAS,SAE3B84C,GAAgB94C,EAAS,UAAY,EAErC+4C,GAAgB,CAAC,CAAE/4C,EAAS,UAE5Bg5C,GAAiB,CAAC,CAAEh5C,EAAS,WAEnC,IAAIilC,GAAcl1D,GAEbiwB,EAAS,aAERoD,KAAwB,MAAQA,GAAoB,mBAAqB,MAE7E6hC,GAAc9hC,EAAS,aAMzB,MAAMzN,GAAa,CAElB,SAAU8gD,EACV,WAAYx2C,EAAS,KACrB,WAAYA,EAAS,KAErB,aAAcozC,GACd,eAAgBC,GAChB,QAASrzC,EAAS,QAElB,qBAAsB02C,GACtB,uBAAwBC,GAExB,oBAAqB32C,EAAS,sBAAwB,GACtD,YAAaA,EAAS,YAEtB,UAAW0gC,EAEX,SAAUmW,GACV,cAAeA,IAAkB9sD,EAAO,iBAAmB,KAC3D,WAAY6sD,GACZ,gBAAiBA,IAAoB7sD,EAAO,gBAAkB,KAC9D,gBAAiB6sD,IAAoB7sD,EAAO,eAAiB,KAE7D,uBAAwB+rD,EACxB,iBAAoB1yC,KAAwB,KAASD,EAAS,iBAAqBC,GAAoB,mBAAqB,GAAOA,GAAoB,QAAQ,WAAartB,GAC5K,gBAAiB,CAAC,CAAEiqB,EAAS,gBAE7B,IAAK82C,GACL,OAAQC,GACR,OAAQC,GACR,WAAYA,IAAcV,EAAO,QACjC,mBAAoBC,EACpB,MAAOU,EACP,SAAUC,EACV,QAASC,EACT,UAAWC,EACX,gBAAiBtB,GAA4BuB,EAC7C,YAAaC,EAEb,qBAAsBF,GAAiBp3C,EAAS,gBAAkBpqB,GAClE,sBAAuBwhE,GAAiBp3C,EAAS,gBAAkBrqB,GAEnE,aAAc4hE,GACd,aAAcC,EAEd,WAAYC,EACZ,cAAeM,GAEf,UAAWL,EACX,aAAcM,GACd,mBAAoBC,GACpB,sBAAuBC,GAEvB,WAAYP,EAEZ,YAAaC,EACb,eAAgBO,GAChB,wBAAyBC,GAEzB,MAAOP,EACP,cAAeQ,GACf,kBAAmBC,GAEnB,YAAaC,GACb,iBAAkBC,GAClB,qBAAsBC,GAEtB,aAAcX,GACd,gBAAiBY,EACjB,aAAcC,GAEd,YAAaC,GAEb,OAAQ54C,EAAS,cAAgB,IAASA,EAAS,WAAaryB,IAAkBqyB,EAAS,kBAAoB,GAE/G,SAAU64C,GACV,UAAWC,GACX,UAAWC,GAEX,QAAS/4C,EAAS,QAIlB,MAAO82C,IAAWd,EAAYh2C,EAAS,IAAI,OAAO,EAClD,QAASi3C,GAAajB,EAAYh2C,EAAS,MAAM,OAAO,EACxD,WAAYk3C,GAAgBlB,EAAYh2C,EAAS,SAAS,OAAO,EACjE,UAAWm3C,GAAenB,EAAYh2C,EAAS,QAAQ,OAAO,EAC9D,YAAao3C,GAAiBpB,EAAYh2C,EAAS,UAAU,OAAO,EACpE,kBAAmBq3C,GAAuBrB,EAAYh2C,EAAS,gBAAgB,OAAO,EACtF,cAAes3C,GAAmBtB,EAAYh2C,EAAS,YAAY,OAAO,EAE1E,eAAgBu3C,IAAoBvB,EAAYh2C,EAAS,aAAa,OAAO,EAC7E,eAAgBw3C,GAAoBxB,EAAYh2C,EAAS,aAAa,OAAO,EAE7E,gBAAiB+3C,IAAqB/B,EAAYh2C,EAAS,cAAc,OAAO,EAEhF,eAAgBg4C,IAAoBhC,EAAYh2C,EAAS,aAAa,OAAO,EAC7E,qBAAsBi4C,IAA2BjC,EAAYh2C,EAAS,mBAAmB,OAAO,EAChG,wBAAyBk4C,IAA8BlC,EAAYh2C,EAAS,sBAAsB,OAAO,EAEzG,iBAAkBm4C,IAAsBnC,EAAYh2C,EAAS,eAAe,OAAO,EACnF,0BAA2Bo4C,IAAgCpC,EAAYh2C,EAAS,wBAAwB,OAAO,EAE/G,gBAAiBq4C,IAAsBrC,EAAYh2C,EAAS,cAAc,OAAO,EACjF,oBAAqBs4C,IAA0BtC,EAAYh2C,EAAS,kBAAkB,OAAO,EAE7F,cAAeu4C,IAAmBvC,EAAYh2C,EAAS,YAAY,OAAO,EAC1E,mBAAoBw4C,IAAyBxC,EAAYh2C,EAAS,iBAAiB,OAAO,EAC1F,uBAAwBy4C,IAA6BzC,EAAYh2C,EAAS,qBAAqB,OAAO,EAEtG,kBAAmB04C,GAAuB1C,EAAYh2C,EAAS,gBAAgB,OAAO,EACtF,eAAgB24C,IAAoB3C,EAAYh2C,EAAS,aAAa,OAAO,EAE7E,WAAY64C,IAAgB7C,EAAYh2C,EAAS,SAAS,OAAO,EAIjE,eAAgB,CAAC,CAAE5V,EAAS,WAAW,UAAagtD,GAAiBK,GACrE,aAAcz3C,EAAS,aACvB,aAAcA,EAAS,eAAiB,IAAQ,CAAC,CAAE5V,EAAS,WAAW,OAASA,EAAS,WAAW,MAAM,WAAa,EAEvH,UAAWL,EAAO,WAAa,IAAQ,CAAC,CAAEK,EAAS,WAAW,KAAQ0sD,IAAW+B,IAEjF,IAAK,CAAC,CAAEzC,EACR,OAAQp2C,EAAS,MAAQ,GACzB,QAAW,CAAC,CAAEo2C,GAAOA,EAAI,UAEzB,YAAep2C,EAAS,cAAgB,IAAQA,EAAS,YAAc,GAEvE,gBAAiBA,EAAS,kBAAoB,GAC9C,uBAAwB4gC,EACxB,oBAAqBC,GAErB,SAAU92C,EAAO,gBAAkB,GAEnC,aAAcK,EAAS,gBAAgB,WAAa,OACpD,aAAcA,EAAS,gBAAgB,SAAW,OAClD,YAAaA,EAAS,gBAAgB,QAAU,OAChD,kBAAmB0/C,EACnB,mBAAoB2M,EAEpB,aAAcP,EAAO,YAAY,OACjC,eAAgBA,EAAO,MAAM,OAC7B,cAAeA,EAAO,KAAK,OAC3B,iBAAkBA,EAAO,aAAa,OACtC,kBAAmBA,EAAO,SAAS,OACnC,cAAeA,EAAO,KAAK,OAE3B,mBAAoBA,EAAO,qBAAqB,OAChD,qBAAsBA,EAAO,eAAe,OAC5C,oBAAqBA,EAAO,cAAc,OAC1C,4BAA6BA,EAAO,4BAEpC,eAAgBA,EAAO,eAEvB,kBAAmBT,EAAS,UAC5B,oBAAqBA,EAAS,gBAE9B,UAAWz1C,EAAS,UAEpB,iBAAkBmD,EAAS,UAAU,SAAWgzC,EAAQ,OAAS,EACjE,cAAehzC,EAAS,UAAU,KAElC,YAAa8hC,GAEb,mBAAoB6R,IAAa92C,EAAS,IAAI,iBAAmB,IAAYha,GAAgB,YAAaga,EAAS,IAAI,UAAU,IAAO/pB,GACxI,2BAA4BqhE,GAAqBt3C,EAAS,YAAY,iBAAmB,IAAYha,GAAgB,YAAaga,EAAS,YAAY,UAAU,IAAO/pB,GAExK,mBAAoB+pB,EAAS,mBAE7B,YAAaA,EAAS,OAASvyB,GAC/B,UAAWuyB,EAAS,OAASxyB,GAE7B,gBAAiBwyB,EAAS,cAAgB,EAC1C,aAAcA,EAAS,cAAgB,EAEvC,oBAAqBA,EAAS,oBAE9B,0BAA2Bg5C,IAAkBh5C,EAAS,WAAW,mBAAqB,IAAQyD,EAAW,IAAK,0BAA0B,EACxI,oBAAsBu1C,IAAkBh5C,EAAS,WAAW,YAAc,IAAQ62C,KAAoBpzC,EAAW,IAAK,kBAAkB,EAExI,uCAAwCA,EAAW,IAAK,6BAA6B,EAErF,sBAAuBzD,EAAS,sBAAqB,CAExD,EAIE,OAAAtK,GAAW,WAAakgD,EAAgB,IAAK,CAAC,EAC9ClgD,GAAW,WAAakgD,EAAgB,IAAK,CAAC,EAC9ClgD,GAAW,WAAakgD,EAAgB,IAAK,CAAC,EAE9CA,EAAgB,MAAK,EAEdlgD,EAER,CAEA,SAASujD,EAAoBvjD,EAAa,CAEzC,MAAMze,EAAQ,CAAA,EAad,GAXKye,EAAW,SAEfze,EAAM,KAAMye,EAAW,QAAQ,GAI/Bze,EAAM,KAAMye,EAAW,oBAAoB,EAC3Cze,EAAM,KAAMye,EAAW,sBAAsB,GAIzCA,EAAW,UAAY,OAE3B,UAAYte,KAAQse,EAAW,QAE9Bze,EAAM,KAAMG,CAAI,EAChBH,EAAM,KAAMye,EAAW,QAASte,CAAI,CAAE,EAMxC,OAAKse,EAAW,sBAAwB,KAEvCwjD,EAA8BjiE,EAAOye,CAAU,EAC/CyjD,EAA4BliE,EAAOye,CAAU,EAC7Cze,EAAM,KAAMksB,EAAS,gBAAgB,GAItClsB,EAAM,KAAMye,EAAW,qBAAqB,EAErCze,EAAM,KAAI,CAElB,CAEA,SAASiiE,EAA8BjiE,EAAOye,EAAa,CAE1Dze,EAAM,KAAMye,EAAW,SAAS,EAChCze,EAAM,KAAMye,EAAW,gBAAgB,EACvCze,EAAM,KAAMye,EAAW,UAAU,EACjCze,EAAM,KAAMye,EAAW,kBAAkB,EACzCze,EAAM,KAAMye,EAAW,KAAK,EAC5Bze,EAAM,KAAMye,EAAW,UAAU,EACjCze,EAAM,KAAMye,EAAW,UAAU,EACjCze,EAAM,KAAMye,EAAW,OAAO,EAC9Bze,EAAM,KAAMye,EAAW,SAAS,EAChCze,EAAM,KAAMye,EAAW,WAAW,EAClCze,EAAM,KAAMye,EAAW,iBAAiB,EACxCze,EAAM,KAAMye,EAAW,aAAa,EACpCze,EAAM,KAAMye,EAAW,cAAc,EACrCze,EAAM,KAAMye,EAAW,cAAc,EACrCze,EAAM,KAAMye,EAAW,eAAe,EACtCze,EAAM,KAAMye,EAAW,cAAc,EACrCze,EAAM,KAAMye,EAAW,oBAAoB,EAC3Cze,EAAM,KAAMye,EAAW,uBAAuB,EAC9Cze,EAAM,KAAMye,EAAW,gBAAgB,EACvCze,EAAM,KAAMye,EAAW,yBAAyB,EAChDze,EAAM,KAAMye,EAAW,eAAe,EACtCze,EAAM,KAAMye,EAAW,mBAAmB,EAC1Cze,EAAM,KAAMye,EAAW,aAAa,EACpCze,EAAM,KAAMye,EAAW,kBAAkB,EACzCze,EAAM,KAAMye,EAAW,sBAAsB,EAC7Cze,EAAM,KAAMye,EAAW,iBAAiB,EACxCze,EAAM,KAAMye,EAAW,cAAc,EACrCze,EAAM,KAAMye,EAAW,OAAO,EAC9Bze,EAAM,KAAMye,EAAW,OAAO,EAC9Bze,EAAM,KAAMye,EAAW,eAAe,EACtCze,EAAM,KAAMye,EAAW,iBAAiB,EACxCze,EAAM,KAAMye,EAAW,mBAAmB,EAC1Cze,EAAM,KAAMye,EAAW,YAAY,EACnCze,EAAM,KAAMye,EAAW,cAAc,EACrCze,EAAM,KAAMye,EAAW,aAAa,EACpCze,EAAM,KAAMye,EAAW,gBAAgB,EACvCze,EAAM,KAAMye,EAAW,aAAa,EACpCze,EAAM,KAAMye,EAAW,iBAAiB,EACxCze,EAAM,KAAMye,EAAW,kBAAkB,EACzCze,EAAM,KAAMye,EAAW,oBAAoB,EAC3Cze,EAAM,KAAMye,EAAW,mBAAmB,EAC1Cze,EAAM,KAAMye,EAAW,2BAA2B,EAClDze,EAAM,KAAMye,EAAW,cAAc,EACrCze,EAAM,KAAMye,EAAW,aAAa,EACpCze,EAAM,KAAMye,EAAW,WAAW,EAClCze,EAAM,KAAMye,EAAW,iBAAiB,EACxCze,EAAM,KAAMye,EAAW,mBAAmB,EAC1Cze,EAAM,KAAMye,EAAW,YAAY,CAEpC,CAEA,SAASyjD,EAA4BliE,EAAOye,EAAa,CAExDggD,EAAe,WAAU,EAEpBhgD,EAAW,wBACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,YACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,iBACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,iBACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,QACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,QACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,sBACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,uBACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,WACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,aACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,WACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,cACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,cACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,YACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,YACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,YACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,gBACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,YACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,WACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,UACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,YACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,eACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,aACfggD,EAAe,OAAQ,EAAE,EAE1Bz+D,EAAM,KAAMy+D,EAAe,IAAI,EAC/BA,EAAe,WAAU,EAEpBhgD,EAAW,KACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,QACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,aACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,wBACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,qBACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,UACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,cACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,cACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,aACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,oBACfggD,EAAe,OAAQ,CAAC,EACpBhgD,EAAW,kBACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,aACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,WACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,iBACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,WACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,cACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,OACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,QACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,WACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,oBACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,4BACfggD,EAAe,OAAQ,EAAE,EACrBhgD,EAAW,iBACfggD,EAAe,OAAQ,EAAE,EAE1Bz+D,EAAM,KAAMy+D,EAAe,IAAI,CAEhC,CAEA,SAAS0D,EAAap5C,EAAW,CAEhC,MAAMw2C,EAAWT,EAAW/1C,EAAS,IAAI,EACzC,IAAI+C,EAEJ,GAAKyzC,EAAW,CAEf,MAAM9wC,EAASq1B,GAAWyb,CAAQ,EAClCzzC,EAAWM,GAAc,MAAOqC,EAAO,QAAQ,CAEhD,MAEC3C,EAAW/C,EAAS,SAIrB,OAAO+C,CAER,CAEA,SAASs2C,EAAgB3jD,EAAYy9C,EAAW,CAE/C,IAAIpW,EAGJ,QAAUvkC,EAAI,EAAG8gD,EAAKzD,EAAS,OAAQr9C,EAAI8gD,EAAI9gD,IAAO,CAErD,MAAM+gD,EAAqB1D,EAAUr9C,CAAC,EAEtC,GAAK+gD,EAAmB,WAAapG,EAAW,CAE/CpW,EAAUwc,EACV,EAAGxc,EAAQ,UAEX,KAED,CAED,CAEA,OAAKA,IAAY,SAEhBA,EAAU,IAAImW,GAAc/vC,EAAUgwC,EAAUz9C,EAAY+mC,CAAa,EACzEoZ,EAAS,KAAM9Y,CAAO,GAIhBA,CAER,CAEA,SAASyc,EAAgBzc,EAAU,CAElC,GAAK,EAAGA,EAAQ,YAAc,EAAI,CAGjC,MAAM7lD,EAAI2+D,EAAS,QAAS9Y,CAAO,EACnC8Y,EAAU3+D,CAAC,EAAK2+D,EAAUA,EAAS,OAAS,CAAC,EAC7CA,EAAS,IAAG,EAGZ9Y,EAAQ,QAAO,CAEhB,CAED,CAEA,SAAS0c,EAAoBz5C,EAAW,CAEvC21C,EAAe,OAAQ31C,CAAQ,CAEhC,CAEA,SAASs8B,GAAU,CAElBqZ,EAAe,QAAO,CAEvB,CAEA,MAAO,CACN,cAAeM,EACf,mBAAoBgD,EACpB,YAAaG,EACb,eAAgBC,EAChB,eAAgBG,EAChB,mBAAoBC,EAEpB,SAAU5D,EACV,QAASvZ,CACX,CAEA,CAEA,SAASod,IAAkB,CAE1B,IAAIjY,EAAa,IAAI,QAErB,SAASkY,EAAK5vD,EAAS,CAEtB,OAAO03C,EAAW,IAAK13C,CAAM,CAE9B,CAEA,SAASiqC,EAAKjqC,EAAS,CAEtB,IAAI6vD,EAAMnY,EAAW,IAAK13C,CAAM,EAEhC,OAAK6vD,IAAQ,SAEZA,EAAM,CAAA,EACNnY,EAAW,IAAK13C,EAAQ6vD,CAAG,GAIrBA,CAER,CAEA,SAAS3lB,EAAQlqC,EAAS,CAEzB03C,EAAW,OAAQ13C,CAAM,CAE1B,CAEA,SAASpL,EAAQoL,EAAQ9mB,EAAKE,EAAQ,CAErCs+D,EAAW,IAAK13C,GAAU9mB,CAAG,EAAKE,CAEnC,CAEA,SAASm5D,GAAU,CAElBmF,EAAa,IAAI,OAElB,CAEA,MAAO,CACN,IAAKkY,EACL,IAAK3lB,EACL,OAAQC,EACR,OAAQt1C,EACR,QAAS29C,CACX,CAEA,CAEA,SAASud,GAAmBt+D,EAAGC,EAAI,CAElC,OAAKD,EAAE,aAAeC,EAAE,WAEhBD,EAAE,WAAaC,EAAE,WAEbD,EAAE,cAAgBC,EAAE,YAExBD,EAAE,YAAcC,EAAE,YAEdD,EAAE,SAAS,KAAOC,EAAE,SAAS,GAEjCD,EAAE,SAAS,GAAKC,EAAE,SAAS,GAEvBD,EAAE,IAAMC,EAAE,EAEdD,EAAE,EAAIC,EAAE,EAIRD,EAAE,GAAKC,EAAE,EAIlB,CAEA,SAASs+D,GAA0Bv+D,EAAGC,EAAI,CAEzC,OAAKD,EAAE,aAAeC,EAAE,WAEhBD,EAAE,WAAaC,EAAE,WAEbD,EAAE,cAAgBC,EAAE,YAExBD,EAAE,YAAcC,EAAE,YAEdD,EAAE,IAAMC,EAAE,EAEdA,EAAE,EAAID,EAAE,EAIRA,EAAE,GAAKC,EAAE,EAIlB,CAGA,SAASu+D,IAAkB,CAE1B,MAAMC,EAAc,CAAA,EACpB,IAAIC,EAAmB,EAEvB,MAAMC,EAAS,CAAA,EACTC,EAAe,CAAA,EACfC,EAAc,CAAA,EAEpB,SAASnoC,GAAO,CAEfgoC,EAAmB,EAEnBC,EAAO,OAAS,EAChBC,EAAa,OAAS,EACtBC,EAAY,OAAS,CAEtB,CAEA,SAASC,EAAmBtwD,EAAQK,EAAU4V,EAAUs6C,EAAY/8D,EAAGhY,EAAQ,CAE9E,IAAIg1E,EAAaP,EAAaC,CAAgB,EAE9C,OAAKM,IAAe,QAEnBA,EAAa,CACZ,GAAIxwD,EAAO,GACX,OAAQA,EACR,SAAUK,EACV,SAAU4V,EACV,WAAYs6C,EACZ,YAAavwD,EAAO,YACpB,EAAGxM,EACH,MAAOhY,CACX,EAEGy0E,EAAaC,CAAgB,EAAKM,IAIlCA,EAAW,GAAKxwD,EAAO,GACvBwwD,EAAW,OAASxwD,EACpBwwD,EAAW,SAAWnwD,EACtBmwD,EAAW,SAAWv6C,EACtBu6C,EAAW,WAAaD,EACxBC,EAAW,YAAcxwD,EAAO,YAChCwwD,EAAW,EAAIh9D,EACfg9D,EAAW,MAAQh1E,GAIpB00E,IAEOM,CAER,CAEA,SAASC,EAAMzwD,EAAQK,EAAU4V,EAAUs6C,EAAY/8D,EAAGhY,EAAQ,CAEjE,MAAMg1E,EAAaF,EAAmBtwD,EAAQK,EAAU4V,EAAUs6C,EAAY/8D,EAAGhY,CAAK,EAEjFy6B,EAAS,aAAe,EAE5Bm6C,EAAa,KAAMI,CAAU,EAElBv6C,EAAS,cAAgB,GAEpCo6C,EAAY,KAAMG,CAAU,EAI5BL,EAAO,KAAMK,CAAU,CAIzB,CAEA,SAASE,EAAS1wD,EAAQK,EAAU4V,EAAUs6C,EAAY/8D,EAAGhY,EAAQ,CAEpE,MAAMg1E,EAAaF,EAAmBtwD,EAAQK,EAAU4V,EAAUs6C,EAAY/8D,EAAGhY,CAAK,EAEjFy6B,EAAS,aAAe,EAE5Bm6C,EAAa,QAASI,CAAU,EAErBv6C,EAAS,cAAgB,GAEpCo6C,EAAY,QAASG,CAAU,EAI/BL,EAAO,QAASK,CAAU,CAI5B,CAEA,SAASG,EAAMC,EAAkBC,EAAwB,CAEnDV,EAAO,OAAS,GAAIA,EAAO,KAAMS,GAAoBd,EAAiB,EACtEM,EAAa,OAAS,GAAIA,EAAa,KAAMS,GAAyBd,EAAwB,EAC9FM,EAAY,OAAS,GAAIA,EAAY,KAAMQ,GAAyBd,EAAwB,CAElG,CAEA,SAASe,GAAS,CAIjB,QAAU3jE,EAAI+iE,EAAkB5wD,EAAK2wD,EAAY,OAAQ9iE,EAAImS,EAAInS,IAAO,CAEvE,MAAMqjE,EAAaP,EAAa9iE,CAAC,EAEjC,GAAKqjE,EAAW,KAAO,KAAO,MAE9BA,EAAW,GAAK,KAChBA,EAAW,OAAS,KACpBA,EAAW,SAAW,KACtBA,EAAW,SAAW,KACtBA,EAAW,MAAQ,IAEpB,CAED,CAEA,MAAO,CAEN,OAAQL,EACR,aAAcC,EACd,YAAaC,EAEb,KAAMnoC,EACN,KAAMuoC,EACN,QAASC,EACT,OAAQI,EAER,KAAMH,CACR,CAEA,CAEA,SAASI,IAAmB,CAE3B,IAAIC,EAAQ,IAAI,QAEhB,SAAS/mB,EAAK9uB,EAAO81C,EAAkB,CAEtC,MAAMC,EAAYF,EAAM,IAAK71C,CAAK,EAClC,IAAIiT,EAEJ,OAAK8iC,IAAc,QAElB9iC,EAAO,IAAI4hC,GACXgB,EAAM,IAAK71C,EAAO,CAAEiT,CAAI,CAAE,GAIrB6iC,GAAmBC,EAAU,QAEjC9iC,EAAO,IAAI4hC,GACXkB,EAAU,KAAM9iC,CAAI,GAIpBA,EAAO8iC,EAAWD,CAAe,EAM5B7iC,CAER,CAEA,SAASmkB,GAAU,CAElBye,EAAQ,IAAI,OAEb,CAEA,MAAO,CACN,IAAK/mB,EACL,QAASsI,CACX,CAEA,CAEA,SAAS4e,IAAgB,CAExB,MAAMhF,EAAS,CAAA,EAEf,MAAO,CAEN,IAAK,SAAW7oB,EAAQ,CAEvB,GAAK6oB,EAAQ7oB,EAAM,EAAE,IAAO,OAE3B,OAAO6oB,EAAQ7oB,EAAM,EAAE,EAIxB,IAAItqB,EAEJ,OAASsqB,EAAM,KAAI,CAElB,IAAK,mBACJtqB,EAAW,CACV,UAAW,IAAI/hB,EACf,MAAO,IAAImY,EACjB,EACK,MAED,IAAK,YACJ4J,EAAW,CACV,SAAU,IAAI/hB,EACd,UAAW,IAAIA,EACf,MAAO,IAAImY,GACX,SAAU,EACV,QAAS,EACT,YAAa,EACb,MAAO,CACb,EACK,MAED,IAAK,aACJ4J,EAAW,CACV,SAAU,IAAI/hB,EACd,MAAO,IAAImY,GACX,SAAU,EACV,MAAO,CACb,EACK,MAED,IAAK,kBACJ4J,EAAW,CACV,UAAW,IAAI/hB,EACf,SAAU,IAAImY,GACd,YAAa,IAAIA,EACvB,EACK,MAED,IAAK,gBACJ4J,EAAW,CACV,MAAO,IAAI5J,GACX,SAAU,IAAInY,EACd,UAAW,IAAIA,EACf,WAAY,IAAIA,CACtB,EACK,KAEL,CAEG,OAAAk1D,EAAQ7oB,EAAM,EAAE,EAAKtqB,EAEdA,CAER,CAEF,CAEA,CAEA,SAASo4C,IAAsB,CAE9B,MAAMjF,EAAS,CAAA,EAEf,MAAO,CAEN,IAAK,SAAW7oB,EAAQ,CAEvB,GAAK6oB,EAAQ7oB,EAAM,EAAE,IAAO,OAE3B,OAAO6oB,EAAQ7oB,EAAM,EAAE,EAIxB,IAAItqB,EAEJ,OAASsqB,EAAM,KAAI,CAElB,IAAK,mBACJtqB,EAAW,CACV,gBAAiB,EACjB,WAAY,EACZ,iBAAkB,EAClB,aAAc,EACd,cAAe,IAAIvmB,EACzB,EACK,MAED,IAAK,YACJumB,EAAW,CACV,gBAAiB,EACjB,WAAY,EACZ,iBAAkB,EAClB,aAAc,EACd,cAAe,IAAIvmB,EACzB,EACK,MAED,IAAK,aACJumB,EAAW,CACV,gBAAiB,EACjB,WAAY,EACZ,iBAAkB,EAClB,aAAc,EACd,cAAe,IAAIvmB,GACnB,iBAAkB,EAClB,gBAAiB,GACvB,EACK,KAIL,CAEG,OAAA05D,EAAQ7oB,EAAM,EAAE,EAAKtqB,EAEdA,CAER,CAEF,CAEA,CAIA,IAAIq4C,GAAc,EAElB,SAASC,GAAsCC,EAAQC,EAAS,CAE/D,OAASA,EAAO,WAAa,EAAI,IAAQD,EAAO,WAAa,EAAI,IAAQC,EAAO,IAAM,EAAI,IAAQD,EAAO,IAAM,EAAI,EAEpH,CAEA,SAASE,GAAa/3C,EAAa,CAElC,MAAMlN,EAAQ,IAAI2kD,GAEZO,EAAcN,GAAmB,EAEjC9f,EAAQ,CAEb,QAAS,EAET,KAAM,CACL,kBAAmB,GACnB,YAAa,GACb,WAAY,GACZ,eAAgB,GAChB,WAAY,GAEZ,sBAAuB,GACvB,gBAAiB,GACjB,eAAgB,GAChB,YAAa,GAEb,eAAgB,EACnB,EAEE,QAAS,CAAE,EAAG,EAAG,CAAC,EAClB,MAAO,CAAA,EACP,YAAa,CAAA,EACb,kBAAmB,CAAA,EACnB,qBAAsB,CAAA,EACtB,wBAAyB,CAAA,EACzB,KAAM,CAAA,EACN,aAAc,CAAA,EACd,WAAY,CAAA,EACZ,cAAe,CAAA,EACf,gBAAiB,CAAA,EACjB,SAAU,CAAA,EACV,aAAc,KACd,aAAc,KACd,MAAO,CAAA,EACP,YAAa,CAAA,EACb,eAAgB,CAAA,EAChB,kBAAmB,CAAA,EACnB,KAAM,CAAA,EACN,4BAA6B,EAC7B,eAAgB,CAElB,EAEC,QAAUnkD,EAAI,EAAGA,EAAI,EAAGA,IAAOmkD,EAAM,MAAM,KAAM,IAAIr6C,CAAS,EAE9D,MAAM06D,EAAU,IAAI16D,EACduE,EAAU,IAAI4J,GACdwsD,EAAW,IAAIxsD,GAErB,SAAS2tC,EAAOoZ,EAAS,CAExB,IAAIn2D,EAAI,EAAG7a,EAAI,EAAGsW,EAAI,EAEtB,QAAUtE,EAAI,EAAGA,EAAI,EAAGA,IAAOmkD,EAAM,MAAOnkD,CAAC,EAAG,IAAK,EAAG,EAAG,CAAC,EAE5D,IAAI0kE,EAAoB,EACpBC,EAAc,EACdC,EAAa,EACbC,EAAiB,EACjBC,EAAa,EAEbC,EAAwB,EACxBC,EAAkB,EAClBC,EAAiB,EACjBC,EAAc,EACdC,EAAyB,EAEzBC,EAAiB,EAGrBpG,EAAO,KAAMmF,EAAoC,EAEjD,QAAUnkE,EAAI,EAAG5T,EAAI4yE,EAAO,OAAQh/D,EAAI5T,EAAG4T,IAAO,CAEjD,MAAMm2C,EAAQ6oB,EAAQh/D,CAAC,EAEjBtS,EAAQyoD,EAAM,MACdL,EAAYK,EAAM,UAClBr4B,EAAWq4B,EAAM,SAEjBkvB,EAAclvB,EAAM,QAAUA,EAAM,OAAO,IAAQA,EAAM,OAAO,IAAI,QAAU,KAEpF,GAAKA,EAAM,eAEVttC,GAAKnb,EAAM,EAAIooD,EACf9nD,GAAKN,EAAM,EAAIooD,EACfxxC,GAAK5W,EAAM,EAAIooD,UAEJK,EAAM,aAAe,CAEhC,QAAU1hC,EAAI,EAAGA,EAAI,EAAGA,IAEvB0vC,EAAM,MAAO1vC,CAAC,EAAG,gBAAiB0hC,EAAM,GAAG,aAAc1hC,CAAC,EAAIqhC,CAAS,EAIxEsvB,GAED,SAAYjvB,EAAM,mBAAqB,CAEtC,MAAMtqB,EAAWxM,EAAM,IAAK82B,CAAK,EAIjC,GAFAtqB,EAAS,MAAM,KAAMsqB,EAAM,KAAK,EAAG,eAAgBA,EAAM,SAAS,EAE7DA,EAAM,WAAa,CAEvB,MAAMmvB,EAASnvB,EAAM,OAEfovB,EAAiBhB,EAAY,IAAKpuB,CAAK,EAE7CovB,EAAe,gBAAkBD,EAAO,UACxCC,EAAe,WAAaD,EAAO,KACnCC,EAAe,iBAAmBD,EAAO,WACzCC,EAAe,aAAeD,EAAO,OACrCC,EAAe,cAAgBD,EAAO,QAEtCnhB,EAAM,kBAAmBugB,CAAiB,EAAKa,EAC/CphB,EAAM,qBAAsBugB,CAAiB,EAAKW,EAClDlhB,EAAM,wBAAyBugB,CAAiB,EAAKvuB,EAAM,OAAO,OAElE4uB,GAED,CAEA5gB,EAAM,YAAaugB,CAAiB,EAAK74C,EAEzC64C,GAED,SAAYvuB,EAAM,YAAc,CAE/B,MAAMtqB,EAAWxM,EAAM,IAAK82B,CAAK,EAEjCtqB,EAAS,SAAS,sBAAuBsqB,EAAM,WAAW,EAE1DtqB,EAAS,MAAM,KAAMn+B,CAAK,EAAG,eAAgBooD,CAAS,EACtDjqB,EAAS,SAAW/N,EAEpB+N,EAAS,QAAU,KAAK,IAAKsqB,EAAM,KAAK,EACxCtqB,EAAS,YAAc,KAAK,IAAKsqB,EAAM,OAAU,EAAIA,EAAM,SAAU,EACrEtqB,EAAS,MAAQsqB,EAAM,MAEvBgO,EAAM,KAAMygB,CAAU,EAAK/4C,EAE3B,MAAMy5C,EAASnvB,EAAM,OAiBrB,GAfKA,EAAM,MAEVgO,EAAM,aAAc+gB,CAAW,EAAK/uB,EAAM,IAC1C+uB,IAIAI,EAAO,eAAgBnvB,CAAK,EAEvBA,EAAM,YAAagvB,KAIzBhhB,EAAM,gBAAiBygB,CAAU,EAAKU,EAAO,OAExCnvB,EAAM,WAAa,CAEvB,MAAMovB,EAAiBhB,EAAY,IAAKpuB,CAAK,EAE7CovB,EAAe,gBAAkBD,EAAO,UACxCC,EAAe,WAAaD,EAAO,KACnCC,EAAe,iBAAmBD,EAAO,WACzCC,EAAe,aAAeD,EAAO,OACrCC,EAAe,cAAgBD,EAAO,QAEtCnhB,EAAM,WAAYygB,CAAU,EAAKW,EACjCphB,EAAM,cAAeygB,CAAU,EAAKS,EAEpCJ,GAED,CAEAL,GAED,SAAYzuB,EAAM,gBAAkB,CAEnC,MAAMtqB,EAAWxM,EAAM,IAAK82B,CAAK,EAEjCtqB,EAAS,MAAM,KAAMn+B,CAAK,EAAG,eAAgBooD,CAAS,EAEtDjqB,EAAS,UAAU,IAAKsqB,EAAM,MAAQ,GAAK,EAAK,CAAG,EACnDtqB,EAAS,WAAW,IAAK,EAAKsqB,EAAM,OAAS,GAAK,CAAG,EAErDgO,EAAM,SAAU0gB,CAAc,EAAKh5C,EAEnCg5C,GAED,SAAY1uB,EAAM,aAAe,CAEhC,MAAMtqB,EAAWxM,EAAM,IAAK82B,CAAK,EAMjC,GAJAtqB,EAAS,MAAM,KAAMsqB,EAAM,KAAK,EAAG,eAAgBA,EAAM,SAAS,EAClEtqB,EAAS,SAAWsqB,EAAM,SAC1BtqB,EAAS,MAAQsqB,EAAM,MAElBA,EAAM,WAAa,CAEvB,MAAMmvB,EAASnvB,EAAM,OAEfovB,EAAiBhB,EAAY,IAAKpuB,CAAK,EAE7CovB,EAAe,gBAAkBD,EAAO,UACxCC,EAAe,WAAaD,EAAO,KACnCC,EAAe,iBAAmBD,EAAO,WACzCC,EAAe,aAAeD,EAAO,OACrCC,EAAe,cAAgBD,EAAO,QACtCC,EAAe,iBAAmBD,EAAO,OAAO,KAChDC,EAAe,gBAAkBD,EAAO,OAAO,IAE/CnhB,EAAM,YAAawgB,CAAW,EAAKY,EACnCphB,EAAM,eAAgBwgB,CAAW,EAAKU,EACtClhB,EAAM,kBAAmBwgB,CAAW,EAAKxuB,EAAM,OAAO,OAEtD6uB,GAED,CAEA7gB,EAAM,MAAOwgB,CAAW,EAAK94C,EAE7B84C,GAED,SAAYxuB,EAAM,kBAAoB,CAErC,MAAMtqB,EAAWxM,EAAM,IAAK82B,CAAK,EAEjCtqB,EAAS,SAAS,KAAMsqB,EAAM,KAAK,EAAG,eAAgBL,CAAS,EAC/DjqB,EAAS,YAAY,KAAMsqB,EAAM,WAAW,EAAG,eAAgBL,CAAS,EAExEqO,EAAM,KAAM2gB,CAAU,EAAKj5C,EAE3Bi5C,GAED,CAED,CAEKD,EAAiB,IAEhBt4C,EAAW,IAAK,0BAA0B,IAAO,IAErD43B,EAAM,aAAeP,GAAY,YACjCO,EAAM,aAAeP,GAAY,cAIjCO,EAAM,aAAeP,GAAY,WACjCO,EAAM,aAAeP,GAAY,aAMnCO,EAAM,QAAS,CAAC,EAAKt7C,EACrBs7C,EAAM,QAAS,CAAC,EAAKn2D,EACrBm2D,EAAM,QAAS,CAAC,EAAK7/C,EAErB,MAAMkhE,EAAOrhB,EAAM,MAEdqhB,EAAK,oBAAsBd,GAC/Bc,EAAK,cAAgBb,GACrBa,EAAK,aAAeZ,GACpBY,EAAK,iBAAmBX,GACxBW,EAAK,aAAeV,GACpBU,EAAK,wBAA0BT,GAC/BS,EAAK,kBAAoBR,GACzBQ,EAAK,iBAAmBP,GACxBO,EAAK,cAAgBN,GACrBM,EAAK,iBAAmBJ,KAExBjhB,EAAM,YAAY,OAASugB,EAC3BvgB,EAAM,KAAK,OAASygB,EACpBzgB,EAAM,SAAS,OAAS0gB,EACxB1gB,EAAM,MAAM,OAASwgB,EACrBxgB,EAAM,KAAK,OAAS2gB,EAEpB3gB,EAAM,kBAAkB,OAAS4gB,EACjC5gB,EAAM,qBAAqB,OAAS4gB,EACpC5gB,EAAM,YAAY,OAAS6gB,EAC3B7gB,EAAM,eAAe,OAAS6gB,EAC9B7gB,EAAM,WAAW,OAAS8gB,EAC1B9gB,EAAM,cAAc,OAAS8gB,EAC7B9gB,EAAM,wBAAwB,OAAS4gB,EACvC5gB,EAAM,kBAAkB,OAAS6gB,EACjC7gB,EAAM,gBAAgB,OAAS8gB,EAAiBC,EAAcC,EAC9DhhB,EAAM,aAAa,OAAS+gB,EAC5B/gB,EAAM,4BAA8BghB,EACpChhB,EAAM,eAAiBihB,EAEvBI,EAAK,kBAAoBd,EACzBc,EAAK,YAAcb,EACnBa,EAAK,WAAaZ,EAClBY,EAAK,eAAiBX,EACtBW,EAAK,WAAaV,EAElBU,EAAK,sBAAwBT,EAC7BS,EAAK,gBAAkBR,EACvBQ,EAAK,eAAiBP,EACtBO,EAAK,YAAcN,EAEnBM,EAAK,eAAiBJ,EAEtBjhB,EAAM,QAAU+f,KAIlB,CAEA,SAASuB,EAAWzG,EAAQt0D,EAAS,CAEpC,IAAIg6D,EAAoB,EACpBC,EAAc,EACdC,EAAa,EACbC,EAAiB,EACjBC,EAAa,EAEjB,MAAMlZ,EAAalhD,EAAO,mBAE1B,QAAU1K,EAAI,EAAG5T,EAAI4yE,EAAO,OAAQh/D,EAAI5T,EAAG4T,IAAO,CAEjD,MAAMm2C,EAAQ6oB,EAAQh/D,CAAC,EAEvB,GAAKm2C,EAAM,mBAAqB,CAE/B,MAAMtqB,EAAWs4B,EAAM,YAAaugB,CAAiB,EAErD74C,EAAS,UAAU,sBAAuBsqB,EAAM,WAAW,EAC3DquB,EAAQ,sBAAuBruB,EAAM,OAAO,WAAW,EACvDtqB,EAAS,UAAU,IAAK24C,CAAO,EAC/B34C,EAAS,UAAU,mBAAoB+/B,CAAU,EAEjD8Y,GAED,SAAYvuB,EAAM,YAAc,CAE/B,MAAMtqB,EAAWs4B,EAAM,KAAMygB,CAAU,EAEvC/4C,EAAS,SAAS,sBAAuBsqB,EAAM,WAAW,EAC1DtqB,EAAS,SAAS,aAAc+/B,CAAU,EAE1C//B,EAAS,UAAU,sBAAuBsqB,EAAM,WAAW,EAC3DquB,EAAQ,sBAAuBruB,EAAM,OAAO,WAAW,EACvDtqB,EAAS,UAAU,IAAK24C,CAAO,EAC/B34C,EAAS,UAAU,mBAAoB+/B,CAAU,EAEjDgZ,GAED,SAAYzuB,EAAM,gBAAkB,CAEnC,MAAMtqB,EAAWs4B,EAAM,SAAU0gB,CAAc,EAE/Ch5C,EAAS,SAAS,sBAAuBsqB,EAAM,WAAW,EAC1DtqB,EAAS,SAAS,aAAc+/B,CAAU,EAG1C6Y,EAAS,SAAQ,EACjBp2D,EAAQ,KAAM8nC,EAAM,WAAW,EAC/B9nC,EAAQ,YAAau9C,CAAU,EAC/B6Y,EAAS,gBAAiBp2D,CAAO,EAEjCwd,EAAS,UAAU,IAAKsqB,EAAM,MAAQ,GAAK,EAAK,CAAG,EACnDtqB,EAAS,WAAW,IAAK,EAAKsqB,EAAM,OAAS,GAAK,CAAG,EAErDtqB,EAAS,UAAU,aAAc44C,CAAQ,EACzC54C,EAAS,WAAW,aAAc44C,CAAQ,EAE1CI,GAED,SAAY1uB,EAAM,aAAe,CAEhC,MAAMtqB,EAAWs4B,EAAM,MAAOwgB,CAAW,EAEzC94C,EAAS,SAAS,sBAAuBsqB,EAAM,WAAW,EAC1DtqB,EAAS,SAAS,aAAc+/B,CAAU,EAE1C+Y,GAED,SAAYxuB,EAAM,kBAAoB,CAErC,MAAMtqB,EAAWs4B,EAAM,KAAM2gB,CAAU,EAEvCj5C,EAAS,UAAU,sBAAuBsqB,EAAM,WAAW,EAC3DtqB,EAAS,UAAU,mBAAoB+/B,CAAU,EAEjDkZ,GAED,CAED,CAED,CAEA,MAAO,CACN,MAAOlf,EACP,UAAW6f,EACX,MAAOthB,CACT,CAEA,CAEA,SAASuhB,GAAkBn5C,EAAa,CAEvC,MAAMyyC,EAAS,IAAIsF,GAAa/3C,CAAU,EAEpCo5C,EAAc,CAAA,EACdC,EAAe,CAAA,EAErB,SAAS7qC,EAAMrwB,EAAS,CAEvBy5C,EAAM,OAASz5C,EAEfi7D,EAAY,OAAS,EACrBC,EAAa,OAAS,CAEvB,CAEA,SAASC,EAAW1vB,EAAQ,CAE3BwvB,EAAY,KAAMxvB,CAAK,CAExB,CAEA,SAAS2vB,EAAYC,EAAc,CAElCH,EAAa,KAAMG,CAAW,CAE/B,CAEA,SAASC,GAAc,CAEtBhH,EAAO,MAAO2G,CAAW,CAE1B,CAEA,SAASM,EAAiBv7D,EAAS,CAElCs0D,EAAO,UAAW2G,EAAaj7D,CAAM,CAEtC,CAEA,MAAMy5C,EAAQ,CACb,YAAawhB,EACb,aAAcC,EAEd,OAAQ,KAER,OAAQ5G,EAER,yBAA0B,CAAA,CAC5B,EAEC,MAAO,CACN,KAAMjkC,EACN,MAAOopB,EACP,YAAa6hB,EACb,gBAAiBC,EAEjB,UAAWJ,EACX,WAAYC,CACd,CAEA,CAEA,SAASI,GAAmB35C,EAAa,CAExC,IAAI45C,EAAe,IAAI,QAEvB,SAASrpB,EAAK9uB,EAAO81C,EAAkB,EAAI,CAE1C,MAAMsC,EAAmBD,EAAa,IAAKn4C,CAAK,EAChD,IAAIq4C,EAEJ,OAAKD,IAAqB,QAEzBC,EAAc,IAAIX,GAAkBn5C,CAAU,EAC9C45C,EAAa,IAAKn4C,EAAO,CAAEq4C,CAAW,CAAE,GAInCvC,GAAmBsC,EAAiB,QAExCC,EAAc,IAAIX,GAAkBn5C,CAAU,EAC9C65C,EAAiB,KAAMC,CAAW,GAIlCA,EAAcD,EAAkBtC,CAAe,EAM1CuC,CAER,CAEA,SAASjhB,GAAU,CAElB+gB,EAAe,IAAI,OAEpB,CAEA,MAAO,CACN,IAAKrpB,EACL,QAASsI,CACX,CAEA,CAEA,MAAMva,GAAS;AAAA;AAAA,GAETy7B,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEjB,SAASC,GAAgBt6C,EAAU2uB,EAAS6X,EAAe,CAE1D,IAAI+T,EAAW,IAAIpxC,GAEnB,MAAMqxC,EAAiB,IAAInhE,GAC1BohE,EAAgB,IAAIphE,GAEpBqhE,EAAY,IAAIn1D,GAEhBo1D,EAAiB,IAAIt7B,GAAmB,CAAE,aAAc9sC,EAAgB,CAAE,EAC1EqoE,EAAoB,IAAIt7B,GAExBu7B,EAAiB,CAAA,EAEjBC,EAAkBtU,EAAa,eAE1BuU,EAAa,CAAE,CAAE3wE,IAAaC,GAAU,CAAEA,IAAYD,GAAW,CAAEE,EAAU,EAAIA,EAAU,EAE3F0wE,EAAyB,IAAI36C,GAAgB,CAClD,QAAS,CACR,YAAa,CAChB,EACE,SAAU,CACT,YAAa,CAAE,MAAO,IAAI,EAC1B,WAAY,CAAE,MAAO,IAAIhnB,EAAS,EAClC,OAAQ,CAAE,MAAO,CAAG,CACvB,EAEE,aAAculC,GACd,eAAgBy7B,EAElB,CAAE,EAEKY,EAA2BD,EAAuB,MAAK,EAC7DC,EAAyB,QAAQ,gBAAkB,EAEnD,MAAMC,EAAgB,IAAIjiD,GAC1BiiD,EAAc,aACb,WACA,IAAIjjD,GACH,IAAI,aAAc,CAAE,GAAI,GAAI,GAAK,EAAG,GAAI,GAAK,GAAI,EAAG,EAAG,CAAE,EACzD,CACH,CACA,EAEC,MAAMkjD,EAAiB,IAAIv+C,GAAMs+C,EAAeF,CAAsB,EAEhE78C,EAAQ,KAEd,KAAK,QAAU,GAEf,KAAK,WAAa,GAClB,KAAK,YAAc,GAEnB,KAAK,KAAOl0B,GACZ,IAAImxE,EAAgB,KAAK,KAEzB,KAAK,OAAS,SAAWrI,EAAQhxC,EAAOtjB,EAAS,CAKhD,GAHK0f,EAAM,UAAY,IAClBA,EAAM,aAAe,IAASA,EAAM,cAAgB,IAEpD40C,EAAO,SAAW,EAAI,OAE3B,MAAM9yC,EAAsBD,EAAS,gBAAe,EAC9Cq7C,EAAiBr7C,EAAS,kBAAiB,EAC3CgC,EAAoBhC,EAAS,qBAAoB,EAEjDs7C,EAASt7C,EAAS,MAGxBs7C,EAAO,YAAa/wE,EAAU,EAEzB+wE,EAAO,QAAQ,MAAM,YAAW,IAAO,GAE3CA,EAAO,QAAQ,MAAM,SAAU,EAAG,EAAG,EAAG,CAAC,EAIzCA,EAAO,QAAQ,MAAM,SAAU,EAAG,EAAG,EAAG,CAAC,EAI1CA,EAAO,QAAQ,MAAM,QAAS,EAAI,EAClCA,EAAO,eAAgB,EAAK,EAI5B,MAAMC,EAAUH,IAAkBjxE,IAAgB,KAAK,OAASA,GAC1DqxE,EAAYJ,IAAkBjxE,IAAgB,KAAK,OAASA,GAIlE,QAAU4J,EAAI,EAAGmS,EAAK6sD,EAAO,OAAQh/D,EAAImS,EAAInS,IAAO,CAEnD,MAAMm2C,EAAQ6oB,EAAQh/D,CAAC,EACjBslE,EAASnvB,EAAM,OAErB,GAAKmvB,IAAW,OAAY,CAE3B7kE,GAAM,kBAAmB01C,EAAO,gBAAgB,EAChD,QAED,CAEA,GAAKmvB,EAAO,aAAe,IAASA,EAAO,cAAgB,GAAQ,SAEnEmB,EAAe,KAAMnB,EAAO,OAAO,EAEnC,MAAMoC,EAAqBpC,EAAO,gBAAe,EA0BjD,GAxBAmB,EAAe,SAAUiB,CAAkB,EAE3ChB,EAAc,KAAMpB,EAAO,OAAO,GAE7BmB,EAAe,EAAIM,GAAmBN,EAAe,EAAIM,KAExDN,EAAe,EAAIM,IAEvBL,EAAc,EAAI,KAAK,MAAOK,EAAkBW,EAAmB,CAAC,EACpEjB,EAAe,EAAIC,EAAc,EAAIgB,EAAmB,EACxDpC,EAAO,QAAQ,EAAIoB,EAAc,GAI7BD,EAAe,EAAIM,IAEvBL,EAAc,EAAI,KAAK,MAAOK,EAAkBW,EAAmB,CAAC,EACpEjB,EAAe,EAAIC,EAAc,EAAIgB,EAAmB,EACxDpC,EAAO,QAAQ,EAAIoB,EAAc,IAM9BpB,EAAO,MAAQ,MAAQkC,IAAU,IAAQC,IAAY,GAAO,CAEhE,MAAME,EAAS,KAAK,OAASvxE,GAAiB,CAAE,UAAW4D,GAAe,UAAWA,EAAa,EAAK,CAAA,EAElGsrE,EAAO,MAAQ,MAEnBA,EAAO,IAAI,QAAO,EAInBA,EAAO,IAAM,IAAIlzD,GAAmBq0D,EAAe,EAAGA,EAAe,EAAGkB,CAAI,EAC5ErC,EAAO,IAAI,QAAQ,KAAOnvB,EAAM,KAAO,aAEvCmvB,EAAO,OAAO,uBAAsB,CAErC,CAEAr5C,EAAS,gBAAiBq5C,EAAO,GAAG,EACpCr5C,EAAS,MAAK,EAEd,MAAM27C,GAAgBtC,EAAO,iBAAgB,EAE7C,QAAUuC,EAAK,EAAGA,EAAKD,GAAeC,IAAQ,CAE7C,MAAMC,EAAWxC,EAAO,YAAauC,CAAE,EAEvClB,EAAU,IACTD,EAAc,EAAIoB,EAAS,EAC3BpB,EAAc,EAAIoB,EAAS,EAC3BpB,EAAc,EAAIoB,EAAS,EAC3BpB,EAAc,EAAIoB,EAAS,CAChC,EAEIP,EAAO,SAAUZ,CAAS,EAE1BrB,EAAO,eAAgBnvB,EAAO0xB,CAAE,EAEhCrB,EAAWlB,EAAO,WAAU,EAE5ByC,EAAc/5C,EAAOtjB,EAAQ46D,EAAO,OAAQnvB,EAAO,KAAK,IAAI,CAE7D,CAIKmvB,EAAO,qBAAuB,IAAQ,KAAK,OAASlvE,IAExD4xE,EAAS1C,EAAQ56D,CAAM,EAIxB46D,EAAO,YAAc,EAEtB,CAEA+B,EAAgB,KAAK,KAErBj9C,EAAM,YAAc,GAEpB6B,EAAS,gBAAiBC,EAAqBo7C,EAAgBr5C,CAAiB,CAEjF,EAEA,SAAS+5C,EAAS1C,EAAQ56D,EAAS,CAElC,MAAMwI,EAAW0nC,EAAQ,OAAQwsB,CAAc,EAE1CH,EAAuB,QAAQ,cAAgB3B,EAAO,cAE1D2B,EAAuB,QAAQ,YAAc3B,EAAO,YACpD4B,EAAyB,QAAQ,YAAc5B,EAAO,YAEtD2B,EAAuB,YAAc,GACrCC,EAAyB,YAAc,IAInC5B,EAAO,UAAY,OAEvBA,EAAO,QAAU,IAAIlzD,GAAmBq0D,EAAe,EAAGA,EAAe,CAAC,GAM3EQ,EAAuB,SAAS,YAAY,MAAQ3B,EAAO,IAAI,QAC/D2B,EAAuB,SAAS,WAAW,MAAQ3B,EAAO,QAC1D2B,EAAuB,SAAS,OAAO,MAAQ3B,EAAO,OACtDr5C,EAAS,gBAAiBq5C,EAAO,OAAO,EACxCr5C,EAAS,MAAK,EACdA,EAAS,mBAAoBvhB,EAAQ,KAAMwI,EAAU+zD,EAAwBG,EAAgB,IAAI,EAIjGF,EAAyB,SAAS,YAAY,MAAQ5B,EAAO,QAAQ,QACrE4B,EAAyB,SAAS,WAAW,MAAQ5B,EAAO,QAC5D4B,EAAyB,SAAS,OAAO,MAAQ5B,EAAO,OACxDr5C,EAAS,gBAAiBq5C,EAAO,GAAG,EACpCr5C,EAAS,MAAK,EACdA,EAAS,mBAAoBvhB,EAAQ,KAAMwI,EAAUg0D,EAA0BE,EAAgB,IAAI,CAEpG,CAEA,SAASa,EAAkBp1D,EAAQiW,EAAUqtB,EAAO9lD,EAAO,CAE1D,IAAI2tB,EAAS,KAEb,MAAMkqD,EAAmB/xB,EAAM,eAAiB,GAAStjC,EAAO,uBAAyBA,EAAO,oBAEhG,GAAKq1D,IAAmB,OAEvBlqD,EAASkqD,UAITlqD,EAAWm4B,EAAM,eAAiB,GAAS0wB,EAAoBD,EAExD36C,EAAS,sBAAwBnD,EAAS,cAAgB,IAAQ,MAAM,QAASA,EAAS,cAAc,GAAMA,EAAS,eAAe,SAAW,GACrJA,EAAS,iBAAmBA,EAAS,oBAAsB,GAC3DA,EAAS,UAAYA,EAAS,UAAY,GAC1CA,EAAS,KAAOA,EAAS,UAAY,GACrCA,EAAS,kBAAoB,GAAS,CAKxC,MAAMq/C,EAAOnqD,EAAO,KAAMoqD,EAAOt/C,EAAS,KAE1C,IAAIu/C,EAAsBvB,EAAgBqB,CAAI,EAEzCE,IAAwB,SAE5BA,EAAsB,CAAA,EACtBvB,EAAgBqB,CAAI,EAAKE,GAI1B,IAAIC,EAAiBD,EAAqBD,CAAI,EAEzCE,IAAmB,SAEvBA,EAAiBtqD,EAAO,MAAK,EAC7BqqD,EAAqBD,CAAI,EAAKE,EAC9Bx/C,EAAS,iBAAkB,UAAWy/C,CAAiB,GAIxDvqD,EAASsqD,CAEV,CAgCD,GA5BAtqD,EAAO,QAAU8K,EAAS,QAC1B9K,EAAO,UAAY8K,EAAS,UAEvBz4B,IAAS+F,GAEb4nB,EAAO,KAAS8K,EAAS,aAAe,KAASA,EAAS,WAAaA,EAAS,KAIhF9K,EAAO,KAAS8K,EAAS,aAAe,KAASA,EAAS,WAAak+C,EAAYl+C,EAAS,IAAI,EAIjG9K,EAAO,SAAW8K,EAAS,SAC3B9K,EAAO,UAAc8K,EAAS,kBAAoB,GAAS,GAAMA,EAAS,UAC1E9K,EAAO,IAAM8K,EAAS,IAEtB9K,EAAO,YAAc8K,EAAS,YAC9B9K,EAAO,eAAiB8K,EAAS,eACjC9K,EAAO,iBAAmB8K,EAAS,iBAEnC9K,EAAO,gBAAkB8K,EAAS,gBAClC9K,EAAO,kBAAoB8K,EAAS,kBACpC9K,EAAO,iBAAmB8K,EAAS,iBAEnC9K,EAAO,mBAAqB8K,EAAS,mBACrC9K,EAAO,UAAY8K,EAAS,UAEvBqtB,EAAM,eAAiB,IAAQn4B,EAAO,yBAA2B,GAAO,CAE5E,MAAMotC,EAAqBn/B,EAAS,WAAW,IAAKjO,CAAM,EAC1DotC,EAAmB,MAAQjV,CAE5B,CAEA,OAAOn4B,CAER,CAEA,SAAS+pD,EAAcl1D,EAAQnI,EAAQ0rC,EAAcD,EAAO9lD,EAAO,CAElE,GAAKwiB,EAAO,UAAY,GAAQ,OAIhC,GAFgBA,EAAO,OAAO,KAAMnI,EAAO,MAAM,IAE/BmI,EAAO,QAAUA,EAAO,QAAUA,EAAO,YAEnDA,EAAO,YAAgBA,EAAO,eAAiBxiB,IAAS+F,MAAsB,CAAEyc,EAAO,eAAiB2zD,EAAS,iBAAkB3zD,CAAM,GAAO,CAEtJA,EAAO,gBAAgB,iBAAkBujC,EAAa,mBAAoBvjC,EAAO,WAAW,EAE5F,MAAMK,EAAW0nC,EAAQ,OAAQ/nC,CAAM,EACjCiW,EAAWjW,EAAO,SAExB,GAAK,MAAM,QAASiW,GAAa,CAEhC,MAAMpC,EAASxT,EAAS,OAExB,QAAUhnB,EAAI,EAAGs8E,EAAK9hD,EAAO,OAAQx6B,EAAIs8E,EAAIt8E,IAAO,CAEnD,MAAMmC,EAAQq4B,EAAQx6B,CAAC,EACjBw9B,EAAgBZ,EAAUz6B,EAAM,aAAa,EAEnD,GAAKq7B,GAAiBA,EAAc,QAAU,CAE7C,MAAM++C,GAAgBR,EAAkBp1D,EAAQ6W,EAAeysB,EAAO9lD,CAAI,EAE1EwiB,EAAO,eAAgBoZ,EAAUpZ,EAAQnI,EAAQ0rC,EAAcljC,EAAUu1D,GAAep6E,CAAK,EAE7F49B,EAAS,mBAAoBmqB,EAAc,KAAMljC,EAAUu1D,GAAe51D,EAAQxkB,CAAK,EAEvFwkB,EAAO,cAAeoZ,EAAUpZ,EAAQnI,EAAQ0rC,EAAcljC,EAAUu1D,GAAep6E,CAAK,CAE7F,CAED,CAED,SAAYy6B,EAAS,QAAU,CAE9B,MAAM2/C,EAAgBR,EAAkBp1D,EAAQiW,EAAUqtB,EAAO9lD,CAAI,EAErEwiB,EAAO,eAAgBoZ,EAAUpZ,EAAQnI,EAAQ0rC,EAAcljC,EAAUu1D,EAAe,IAAI,EAE5Fx8C,EAAS,mBAAoBmqB,EAAc,KAAMljC,EAAUu1D,EAAe51D,EAAQ,IAAI,EAEtFA,EAAO,cAAeoZ,EAAUpZ,EAAQnI,EAAQ0rC,EAAcljC,EAAUu1D,EAAe,IAAI,CAE5F,CAED,CAID,MAAMp1D,EAAWR,EAAO,SAExB,QAAU7S,EAAI,EAAG5T,EAAIinB,EAAS,OAAQrT,EAAI5T,EAAG4T,IAE5C+nE,EAAc10D,EAAUrT,CAAC,EAAI0K,EAAQ0rC,EAAcD,EAAO9lD,CAAI,CAIhE,CAEA,SAASk4E,EAAmBv7E,EAAQ,CAElBA,EAAM,OAEd,oBAAqB,UAAWu7E,CAAiB,EAI1D,UAAY95E,KAAMq4E,EAAiB,CAElC,MAAMznD,EAAQynD,EAAgBr4E,CAAE,EAE1B0kC,EAAOnmC,EAAM,OAAO,KAErBmmC,KAAQ9T,IAEWA,EAAO8T,CAAI,EACnB,QAAO,EACtB,OAAO9T,EAAO8T,CAAI,EAIpB,CAED,CAED,CAEA,MAAMu1C,GAAgB,CACrB,CAAExwE,EAAU,EAAIC,GAChB,CAAEC,EAAS,EAAII,GACf,CAAEF,EAAU,EAAIG,GAChB,CAAEJ,EAAc,EAAIE,GAEpB,CAAEJ,EAAW,EAAID,GACjB,CAAEM,EAAY,EAAIJ,GAClB,CAAEK,EAAa,EAAIH,GACnB,CAAEC,EAAiB,EAAIF,EACxB,EAEA,SAASswE,GAAY9nE,EAAI0rB,EAAa,CAErC,SAASq8C,GAAc,CAEtB,IAAIC,EAAS,GAEb,MAAMn7E,GAAQ,IAAI8jB,GAClB,IAAIs3D,GAAmB,KACvB,MAAMC,GAAoB,IAAIv3D,GAAS,EAAG,EAAG,EAAG,CAAC,EAEjD,MAAO,CAEN,QAAS,SAAWw3D,GAAY,CAE1BF,KAAqBE,IAAa,CAAEH,IAExChoE,EAAG,UAAWmoE,GAAWA,GAAWA,GAAWA,EAAS,EACxDF,GAAmBE,GAIrB,EAEA,UAAW,SAAWC,GAAO,CAE5BJ,EAASI,EAEV,EAEA,SAAU,SAAWpgE,GAAG7a,GAAGsW,GAAGD,GAAG+/C,GAAqB,CAEhDA,KAAuB,KAE3Bv7C,IAAKxE,GAAGrW,IAAKqW,GAAGC,IAAKD,IAItB3W,GAAM,IAAKmb,GAAG7a,GAAGsW,GAAGD,EAAC,EAEhB0kE,GAAkB,OAAQr7E,EAAK,IAAO,KAE1CmT,EAAG,WAAYgI,GAAG7a,GAAGsW,GAAGD,EAAC,EACzB0kE,GAAkB,KAAMr7E,EAAK,EAI/B,EAEA,MAAO,UAAY,CAElBm7E,EAAS,GAETC,GAAmB,KACnBC,GAAkB,IAAK,GAAI,EAAG,EAAG,CAAC,CAEnC,CAEH,CAEC,CAEA,SAASG,GAAc,CAEtB,IAAIL,EAAS,GAETM,GAAkB,GAClBC,GAAmB,KACnBC,GAAmB,KACnBC,GAAoB,KAExB,MAAO,CAEN,YAAa,SAAWC,GAAW,CAElC,GAAKJ,KAAoBI,GAAW,CAEnC,MAAMC,GAAMj9C,EAAW,IAAK,kBAAkB,EAEzCg9C,GAEJC,GAAI,eAAgBA,GAAI,eAAgBA,GAAI,eAAe,EAI3DA,GAAI,eAAgBA,GAAI,eAAgBA,GAAI,uBAAuB,EAIpEL,GAAkBI,GAElB,MAAME,GAAWH,GACjBA,GAAoB,KACpB,KAAK,SAAUG,EAAQ,CAExB,CAED,EAEA,YAAa,UAAY,CAExB,OAAON,EAER,EAEA,QAAS,SAAWO,GAAY,CAE1BA,GAEJC,GAAQ9oE,EAAG,UAAU,EAIrB+oE,GAAS/oE,EAAG,UAAU,CAIxB,EAEA,QAAS,SAAWgpE,GAAY,CAE1BT,KAAqBS,IAAa,CAAEhB,IAExChoE,EAAG,UAAWgpE,EAAS,EACvBT,GAAmBS,GAIrB,EAEA,QAAS,SAAWC,GAAY,CAI/B,GAFKX,KAAkBW,GAAYpB,GAAeoB,EAAS,GAEtDT,KAAqBS,GAAY,CAErC,OAASA,GAAS,CAEjB,KAAK5xE,GAEJ2I,EAAG,UAAWA,EAAG,KAAK,EACtB,MAED,KAAK1I,GAEJ0I,EAAG,UAAWA,EAAG,MAAM,EACvB,MAED,KAAKzI,GAEJyI,EAAG,UAAWA,EAAG,IAAI,EACrB,MAED,KAAKxI,GAEJwI,EAAG,UAAWA,EAAG,MAAM,EACvB,MAED,KAAKvI,GAEJuI,EAAG,UAAWA,EAAG,KAAK,EACtB,MAED,KAAKtI,GAEJsI,EAAG,UAAWA,EAAG,MAAM,EACvB,MAED,KAAKrI,GAEJqI,EAAG,UAAWA,EAAG,OAAO,EACxB,MAED,KAAKpI,GAEJoI,EAAG,UAAWA,EAAG,QAAQ,EACzB,MAED,QAECA,EAAG,UAAWA,EAAG,MAAM,CAE9B,CAEKwoE,GAAmBS,EAEpB,CAED,EAEA,UAAW,SAAWb,GAAO,CAE5BJ,EAASI,EAEV,EAEA,SAAU,SAAW/2D,GAAQ,CAEvBo3D,KAAsBp3D,KAErBi3D,KAEJj3D,GAAQ,EAAIA,IAIbrR,EAAG,WAAYqR,EAAK,EACpBo3D,GAAoBp3D,GAItB,EAEA,MAAO,UAAY,CAElB22D,EAAS,GAETO,GAAmB,KACnBC,GAAmB,KACnBC,GAAoB,KACpBH,GAAkB,EAEnB,CAEH,CAEC,CAEA,SAASY,GAAgB,CAExB,IAAIlB,EAAS,GAETmB,GAAqB,KACrBC,GAAqB,KACrBC,GAAoB,KACpBC,GAAyB,KACzBC,GAAqB,KACrBC,GAAsB,KACtBC,GAAsB,KACtBC,GAAsB,KAE1B,MAAO,CAEN,QAAS,SAAWC,GAAc,CAE1B3B,IAED2B,GAEJb,GAAQ9oE,EAAG,YAAY,EAIvB+oE,GAAS/oE,EAAG,YAAY,EAM3B,EAEA,QAAS,SAAW4pE,GAAc,CAE5BT,KAAuBS,IAAe,CAAE5B,IAE5ChoE,EAAG,YAAa4pE,EAAW,EAC3BT,GAAqBS,GAIvB,EAEA,QAAS,SAAWC,GAAaC,GAAYF,GAAc,EAErDR,KAAuBS,IACvBR,KAAsBS,IACtBR,KAA2BM,MAE/B5pE,EAAG,YAAa6pE,GAAaC,GAAYF,EAAW,EAEpDR,GAAqBS,GACrBR,GAAoBS,GACpBR,GAAyBM,GAI3B,EAEA,MAAO,SAAWG,GAAaC,GAAcC,GAAe,EAEtDV,KAAuBQ,IACvBP,KAAwBQ,IACxBP,KAAwBQ,MAE5BjqE,EAAG,UAAW+pE,GAAaC,GAAcC,EAAY,EAErDV,GAAqBQ,GACrBP,GAAsBQ,GACtBP,GAAsBQ,GAIxB,EAEA,UAAW,SAAW7B,GAAO,CAE5BJ,EAASI,EAEV,EAEA,SAAU,SAAWt6C,GAAU,CAEzB47C,KAAwB57C,KAE5B9tB,EAAG,aAAc8tB,EAAO,EACxB47C,GAAsB57C,GAIxB,EAEA,MAAO,UAAY,CAElBk6C,EAAS,GAETmB,GAAqB,KACrBC,GAAqB,KACrBC,GAAoB,KACpBC,GAAyB,KACzBC,GAAqB,KACrBC,GAAsB,KACtBC,GAAsB,KACtBC,GAAsB,IAEvB,CAEH,CAEC,CAIA,MAAMQ,EAAc,IAAInC,EAClBoC,EAAc,IAAI9B,EAClB+B,EAAgB,IAAIlB,EAEpBmB,EAAc,IAAI,QAClBC,EAAgB,IAAI,QAE1B,IAAIC,EAAsB,CAAA,EAEtBC,EAA2B,CAAA,EAC3BC,EAAqB,IAAI,QACzBC,EAAqB,CAAA,EAErBC,EAAiB,KAEjBC,EAAyB,GACzBC,EAAkB,KAClBC,EAAuB,KACvBC,EAAkB,KAClBC,EAAkB,KAClBC,EAA4B,KAC5BC,EAAuB,KACvBC,EAAuB,KACvBC,EAAoB,IAAIhqD,GAAO,EAAG,EAAG,CAAC,EACtCiqD,EAAoB,EACpBC,EAA2B,GAE3BC,EAAmB,KACnBC,EAAkB,KAElBC,EAAmB,KAEnBC,EAA6B,KAC7BC,EAA4B,KAEhC,MAAM5iB,EAAc/oD,EAAG,aAAcA,EAAG,gCAAgC,EAExE,IAAI4rE,EAAqB,GACrB1a,EAAU,EACd,MAAM2a,EAAY7rE,EAAG,aAAcA,EAAG,OAAO,EAExC6rE,EAAU,QAAS,OAAO,IAAO,IAErC3a,EAAU,WAAY,cAAc,KAAM2a,CAAS,EAAI,EAAG,EAC1DD,EAAuB1a,GAAW,GAEvB2a,EAAU,QAAS,WAAW,IAAO,KAEhD3a,EAAU,WAAY,kBAAkB,KAAM2a,CAAS,EAAI,EAAG,EAC9DD,EAAuB1a,GAAW,GAInC,IAAI4a,EAAqB,KACrBC,GAAuB,CAAA,EAE3B,MAAMC,EAAehsE,EAAG,aAAcA,EAAG,WAAW,EAC9CisE,EAAgBjsE,EAAG,aAAcA,EAAG,QAAQ,EAE5CksE,GAAiB,IAAIv7D,KAAU,UAAWq7D,CAAY,EACtDG,GAAkB,IAAIx7D,KAAU,UAAWs7D,CAAa,EAE9D,SAASG,GAAe58E,EAAM+e,GAAQ8B,GAAOg8D,GAAa,CAEzD,MAAMn9D,GAAO,IAAI,WAAY,GACvBiC,GAAUnR,EAAG,cAAa,EAEhCA,EAAG,YAAaxQ,EAAM2hB,EAAO,EAC7BnR,EAAG,cAAexQ,EAAMwQ,EAAG,mBAAoBA,EAAG,OAAO,EACzDA,EAAG,cAAexQ,EAAMwQ,EAAG,mBAAoBA,EAAG,OAAO,EAEzD,QAAUb,GAAI,EAAGA,GAAIkR,GAAOlR,KAEtB3P,IAASwQ,EAAG,YAAcxQ,IAASwQ,EAAG,iBAE1CA,EAAG,WAAYuO,GAAQ,EAAGvO,EAAG,KAAM,EAAG,EAAGqsE,GAAY,EAAGrsE,EAAG,KAAMA,EAAG,cAAekP,EAAI,EAIvFlP,EAAG,WAAYuO,GAASpP,GAAG,EAAGa,EAAG,KAAM,EAAG,EAAG,EAAGA,EAAG,KAAMA,EAAG,cAAekP,EAAI,EAMjF,OAAOiC,EAER,CAEA,MAAMm7D,GAAgB,CAAA,EACtBA,GAAetsE,EAAG,UAAU,EAAKosE,GAAepsE,EAAG,WAAYA,EAAG,WAAY,CAAC,EAC/EssE,GAAetsE,EAAG,gBAAgB,EAAKosE,GAAepsE,EAAG,iBAAkBA,EAAG,4BAA6B,CAAC,EAC5GssE,GAAetsE,EAAG,gBAAgB,EAAKosE,GAAepsE,EAAG,iBAAkBA,EAAG,iBAAkB,EAAG,CAAC,EACpGssE,GAAetsE,EAAG,UAAU,EAAKosE,GAAepsE,EAAG,WAAYA,EAAG,WAAY,EAAG,CAAC,EAIlFkqE,EAAY,SAAU,EAAG,EAAG,EAAG,CAAC,EAChCC,EAAY,SAAU,CAAC,EACvBC,EAAc,SAAU,CAAC,EAEzBtB,GAAQ9oE,EAAG,UAAU,EACrBmqE,EAAY,QAAS3yE,EAAc,EAEnC+0E,EAAc,EAAK,EACnBC,EAAar3E,EAAY,EACzB2zE,GAAQ9oE,EAAG,SAAS,EAEpBysE,EAAa92E,EAAU,EAIvB,SAASmzE,GAAQl7E,EAAK,CAEhB28E,EAAqB38E,CAAE,IAAO,KAElCoS,EAAG,OAAQpS,CAAE,EACb28E,EAAqB38E,CAAE,EAAK,GAI9B,CAEA,SAASm7E,GAASn7E,EAAK,CAEjB28E,EAAqB38E,CAAE,IAAO,KAElCoS,EAAG,QAASpS,CAAE,EACd28E,EAAqB38E,CAAE,EAAK,GAI9B,CAEA,SAAS8+E,GAAiBn+D,EAAQo+D,GAAc,CAE/C,OAAKnC,EAA0Bj8D,CAAM,IAAOo+D,IAE3C3sE,EAAG,gBAAiBuO,EAAQo+D,EAAW,EAEvCnC,EAA0Bj8D,CAAM,EAAKo+D,GAIhCp+D,IAAWvO,EAAG,mBAElBwqE,EAA0BxqE,EAAG,WAAW,EAAK2sE,IAIzCp+D,IAAWvO,EAAG,cAElBwqE,EAA0BxqE,EAAG,gBAAgB,EAAK2sE,IAI5C,IAID,EAER,CAEA,SAASC,GAAajgD,EAAcggD,GAAc,CAEjD,IAAIC,GAAclC,EAEdtlB,GAAc,GAElB,GAAKz4B,EAAe,CAEnBigD,GAAcnC,EAAmB,IAAKkC,EAAW,EAE5CC,KAAgB,SAEpBA,GAAc,CAAA,EACdnC,EAAmB,IAAKkC,GAAaC,EAAW,GAIjD,MAAMzuD,GAAWwO,EAAa,SAE9B,GAAKigD,GAAY,SAAWzuD,GAAS,QAAUyuD,GAAa,CAAC,IAAO5sE,EAAG,kBAAoB,CAE1F,QAAUb,GAAI,EAAGmS,GAAK6M,GAAS,OAAQhf,GAAImS,GAAInS,KAE9CytE,GAAaztE,EAAC,EAAKa,EAAG,kBAAoBb,GAI3CytE,GAAY,OAASzuD,GAAS,OAE9BinC,GAAc,EAEf,CAED,MAEMwnB,GAAa,KAAQ5sE,EAAG,OAE5B4sE,GAAa,GAAM5sE,EAAG,KAEtBolD,GAAc,IAMXA,IAEJplD,EAAG,YAAa4sE,EAAW,CAI7B,CAEA,SAASC,GAAY7nB,EAAU,CAE9B,OAAK2lB,IAAmB3lB,GAEvBhlD,EAAG,WAAYglD,CAAO,EAEtB2lB,EAAiB3lB,EAEV,IAID,EAER,CAEA,MAAM8nB,GAAe,CACpB,CAAE72E,EAAW,EAAI+J,EAAG,SACpB,CAAE9J,EAAgB,EAAI8J,EAAG,cACzB,CAAE7J,EAAuB,EAAI6J,EAAG,qBAClC,EAEC8sE,GAAc12E,IAAgB4J,EAAG,IACjC8sE,GAAcz2E,IAAgB2J,EAAG,IAEjC,MAAM+sE,GAAa,CAClB,CAAEz2E,EAAU,EAAI0J,EAAG,KACnB,CAAEzJ,EAAS,EAAIyJ,EAAG,IAClB,CAAExJ,EAAc,EAAIwJ,EAAG,UACvB,CAAEtJ,EAAc,EAAIsJ,EAAG,UACvB,CAAEhJ,EAAsB,EAAIgJ,EAAG,mBAC/B,CAAElJ,EAAc,EAAIkJ,EAAG,UACvB,CAAEpJ,EAAc,EAAIoJ,EAAG,UACvB,CAAEvJ,EAAsB,EAAIuJ,EAAG,oBAC/B,CAAErJ,EAAsB,EAAIqJ,EAAG,oBAC/B,CAAEjJ,EAAsB,EAAIiJ,EAAG,oBAC/B,CAAEnJ,EAAsB,EAAImJ,EAAG,oBAC/B,CAAE/I,EAAmB,EAAI+I,EAAG,eAC5B,CAAE9I,EAA2B,EAAI8I,EAAG,yBACpC,CAAE7I,EAAmB,EAAI6I,EAAG,eAC5B,CAAE5I,EAA2B,EAAI4I,EAAG,wBACtC,EAEC,SAASysE,EAAaO,EAAUC,GAAeC,GAAUC,GAAUC,GAAoBC,GAAeC,GAAeC,GAAYC,GAAYjqB,GAAqB,CAEjK,GAAKypB,IAAar3E,GAAa,CAEzBi1E,IAA2B,KAE/B7B,GAAS/oE,EAAG,KAAK,EACjB4qE,EAAyB,IAI1B,MAED,CASA,GAPKA,IAA2B,KAE/B9B,GAAQ9oE,EAAG,KAAK,EAChB4qE,EAAyB,IAIrBoC,IAAah3E,GAAiB,CAElC,GAAKg3E,IAAanC,GAAmBtnB,KAAuB+nB,EAA2B,CAWtF,IATKR,IAAyB70E,IAAeg1E,IAA8Bh1E,MAE1E+J,EAAG,cAAeA,EAAG,QAAQ,EAE7B8qE,EAAuB70E,GACvBg1E,EAA4Bh1E,IAIxBstD,GAEJ,OAASypB,EAAQ,CAEhB,KAAKp3E,GACJoK,EAAG,kBAAmBA,EAAG,IAAKA,EAAG,oBAAqBA,EAAG,IAAKA,EAAG,mBAAmB,EACpF,MAED,KAAKnK,GACJmK,EAAG,UAAWA,EAAG,IAAKA,EAAG,GAAG,EAC5B,MAED,KAAKlK,GACJkK,EAAG,kBAAmBA,EAAG,KAAMA,EAAG,oBAAqBA,EAAG,KAAMA,EAAG,GAAG,EACtE,MAED,KAAKjK,GACJiK,EAAG,kBAAmBA,EAAG,UAAWA,EAAG,oBAAqBA,EAAG,KAAMA,EAAG,GAAG,EAC3E,MAED,QACCH,GAAO,iCAAkCmtE,CAAQ,EACjD,KAEP,KAIK,QAASA,EAAQ,CAEhB,KAAKp3E,GACJoK,EAAG,kBAAmBA,EAAG,UAAWA,EAAG,oBAAqBA,EAAG,IAAKA,EAAG,mBAAmB,EAC1F,MAED,KAAKnK,GACJmK,EAAG,kBAAmBA,EAAG,UAAWA,EAAG,IAAKA,EAAG,IAAKA,EAAG,GAAG,EAC1D,MAED,KAAKlK,GACJ+J,GAAO,6EAA6E,EACpF,MAED,KAAK9J,GACJ8J,GAAO,0EAA0E,EACjF,MAED,QACCA,GAAO,iCAAkCmtE,CAAQ,EACjD,KAEP,CAIIjC,EAAkB,KAClBC,EAAkB,KAClBE,EAAuB,KACvBC,EAAuB,KACvBC,EAAkB,IAAK,EAAG,EAAG,CAAC,EAC9BC,EAAoB,EAEpBR,EAAkBmC,EAClB1B,EAA2B/nB,EAE5B,CAEA,MAED,CAIA6pB,GAAqBA,IAAsBH,GAC3CI,GAAgBA,IAAiBH,GACjCI,GAAgBA,IAAiBH,IAE5BF,KAAkBnC,GAAwBsC,KAAuBnC,KAErEjrE,EAAG,sBAAuB8sE,GAAcG,EAAa,EAAIH,GAAcM,GAAoB,EAE3FtC,EAAuBmC,GACvBhC,EAA4BmC,KAIxBF,KAAanC,GAAmBoC,KAAanC,GAAmBqC,KAAkBnC,GAAwBoC,KAAkBnC,KAEhInrE,EAAG,kBAAmB+sE,GAAYG,EAAQ,EAAIH,GAAYI,EAAQ,EAAIJ,GAAYM,EAAa,EAAIN,GAAYO,EAAa,CAAE,EAE9HvC,EAAkBmC,GAClBlC,EAAkBmC,GAClBjC,EAAuBmC,GACvBlC,EAAuBmC,KAInBC,GAAW,OAAQnC,CAAiB,IAAO,IAASoC,KAAenC,KAEvErrE,EAAG,WAAYutE,GAAW,EAAGA,GAAW,EAAGA,GAAW,EAAGC,EAAU,EAEnEpC,EAAkB,KAAMmC,EAAU,EAClClC,EAAoBmC,IAIrB3C,EAAkBmC,EAClB1B,EAA2B,EAE5B,CAEA,SAASmC,EAAaxlD,EAAUylD,GAAc,CAE7CzlD,EAAS,OAASvyB,GACfqzE,GAAS/oE,EAAG,SAAS,EACrB8oE,GAAQ9oE,EAAG,SAAS,EAEvB,IAAI2tE,GAAc1lD,EAAS,OAASxyB,GAC/Bi4E,KAAcC,GAAY,CAAEA,IAEjCpB,EAAcoB,EAAS,EAErB1lD,EAAS,WAAaryB,IAAkBqyB,EAAS,cAAgB,GAChEwkD,EAAa92E,EAAU,EACvB82E,EAAaxkD,EAAS,SAAUA,EAAS,cAAeA,EAAS,SAAUA,EAAS,SAAUA,EAAS,mBAAoBA,EAAS,cAAeA,EAAS,cAAeA,EAAS,WAAYA,EAAS,WAAYA,EAAS,kBAAkB,EAEnPkiD,EAAY,QAASliD,EAAS,SAAS,EACvCkiD,EAAY,QAASliD,EAAS,SAAS,EACvCkiD,EAAY,QAASliD,EAAS,UAAU,EACxCiiD,EAAY,QAASjiD,EAAS,UAAU,EAExC,MAAM2lD,GAAe3lD,EAAS,aAC9BmiD,EAAc,QAASwD,EAAY,EAC9BA,KAEJxD,EAAc,QAASniD,EAAS,gBAAgB,EAChDmiD,EAAc,QAASniD,EAAS,YAAaA,EAAS,WAAYA,EAAS,eAAe,EAC1FmiD,EAAc,MAAOniD,EAAS,YAAaA,EAAS,aAAcA,EAAS,YAAY,GAIxF4lD,EAAkB5lD,EAAS,cAAeA,EAAS,oBAAqBA,EAAS,kBAAkB,EAEnGA,EAAS,kBAAoB,GAC1B6gD,GAAQ9oE,EAAG,wBAAwB,EACnC+oE,GAAS/oE,EAAG,wBAAwB,CAExC,CAIA,SAASusE,EAAcoB,EAAY,CAE7BpC,IAAqBoC,IAEpBA,EAEJ3tE,EAAG,UAAWA,EAAG,EAAE,EAInBA,EAAG,UAAWA,EAAG,GAAG,EAIrBurE,EAAmBoC,EAIrB,CAEA,SAASnB,EAAasB,EAAW,CAE3BA,IAAa54E,IAEjB4zE,GAAQ9oE,EAAG,SAAS,EAEf8tE,IAAatC,IAEZsC,IAAa34E,GAEjB6K,EAAG,SAAUA,EAAG,IAAI,EAET8tE,IAAa14E,GAExB4K,EAAG,SAAUA,EAAG,KAAK,EAIrBA,EAAG,SAAUA,EAAG,cAAc,IAQhC+oE,GAAS/oE,EAAG,SAAS,EAItBwrE,EAAkBsC,CAEnB,CAEA,SAASC,EAAc17E,EAAQ,CAEzBA,IAAUo5E,IAETG,GAAqB5rE,EAAG,UAAW3N,CAAK,EAE7Co5E,EAAmBp5E,EAIrB,CAEA,SAASw7E,EAAkBG,EAAeC,GAAQzX,GAAQ,CAEpDwX,GAEJlF,GAAQ9oE,EAAG,mBAAmB,GAEzB0rE,IAA+BuC,IAAUtC,IAA8BnV,MAE3Ex2D,EAAG,cAAeiuE,GAAQzX,EAAK,EAE/BkV,EAA6BuC,GAC7BtC,EAA4BnV,KAM7BuS,GAAS/oE,EAAG,mBAAmB,CAIjC,CAEA,SAASkuE,GAAgBC,EAAc,CAEjCA,EAEJrF,GAAQ9oE,EAAG,YAAY,EAIvB+oE,GAAS/oE,EAAG,YAAY,CAI1B,CAIA,SAASouE,EAAeC,EAAY,CAE9BA,IAAc,SAAYA,EAAYruE,EAAG,SAAW+oD,EAAc,GAElE+iB,IAAuBuC,IAE3BruE,EAAG,cAAequE,CAAS,EAC3BvC,EAAqBuC,EAIvB,CAEA,SAASC,EAAaC,EAAWC,GAAcH,GAAY,CAErDA,KAAc,SAEbvC,IAAuB,KAE3BuC,GAAYruE,EAAG,SAAW+oD,EAAc,EAIxCslB,GAAYvC,GAMd,IAAI2C,GAAe1C,GAAsBsC,EAAS,EAE7CI,KAAiB,SAErBA,GAAe,CAAE,KAAM,OAAW,QAAS,MAAS,EACpD1C,GAAsBsC,EAAS,EAAKI,KAIhCA,GAAa,OAASF,GAAaE,GAAa,UAAYD,MAE3D1C,IAAuBuC,KAE3BruE,EAAG,cAAequE,EAAS,EAC3BvC,EAAqBuC,IAItBruE,EAAG,YAAauuE,EAAWC,IAAgBlC,GAAeiC,CAAS,CAAE,EAErEE,GAAa,KAAOF,EACpBE,GAAa,QAAUD,GAIzB,CAEA,SAASE,GAAgB,CAExB,MAAMD,EAAe1C,GAAsBD,CAAkB,EAExD2C,IAAiB,QAAaA,EAAa,OAAS,SAExDzuE,EAAG,YAAayuE,EAAa,KAAM,IAAI,EAEvCA,EAAa,KAAO,OACpBA,EAAa,QAAU,OAIzB,CAEA,SAASE,GAAuB,CAE/B,GAAI,CAEH3uE,EAAG,qBAAsB,GAAG,SAAS,CAEtC,OAAUH,EAAQ,CAEjBA,EAAO,cAAeA,CAAK,CAE5B,CAED,CAEA,SAAS+uE,GAAuB,CAE/B,GAAI,CAEH5uE,EAAG,qBAAsB,GAAG,SAAS,CAEtC,OAAUH,EAAQ,CAEjBA,EAAO,cAAeA,CAAK,CAE5B,CAED,CAEA,SAASgvE,GAAgB,CAExB,GAAI,CAEH7uE,EAAG,cAAe,GAAG,SAAS,CAE/B,OAAUH,EAAQ,CAEjBA,EAAO,cAAeA,CAAK,CAE5B,CAED,CAEA,SAASivE,IAAgB,CAExB,GAAI,CAEH9uE,EAAG,cAAe,GAAG,SAAS,CAE/B,OAAUH,EAAQ,CAEjBA,EAAO,cAAeA,CAAK,CAE5B,CAED,CAEA,SAASkvE,IAA0B,CAElC,GAAI,CAEH/uE,EAAG,wBAAyB,GAAG,SAAS,CAEzC,OAAUH,EAAQ,CAEjBA,EAAO,cAAeA,CAAK,CAE5B,CAED,CAEA,SAASmvE,IAA0B,CAElC,GAAI,CAEHhvE,EAAG,wBAAyB,GAAG,SAAS,CAEzC,OAAUH,EAAQ,CAEjBA,EAAO,cAAeA,CAAK,CAE5B,CAED,CAEA,SAASovE,IAAe,CAEvB,GAAI,CAEHjvE,EAAG,aAAc,GAAG,SAAS,CAE9B,OAAUH,EAAQ,CAEjBA,EAAO,cAAeA,CAAK,CAE5B,CAED,CAEA,SAASqvE,IAAe,CAEvB,GAAI,CAEHlvE,EAAG,aAAc,GAAG,SAAS,CAE9B,OAAUH,EAAQ,CAEjBA,EAAO,cAAeA,CAAK,CAE5B,CAED,CAEA,SAASsvE,IAAa,CAErB,GAAI,CAEHnvE,EAAG,WAAY,GAAG,SAAS,CAE5B,OAAUH,EAAQ,CAEjBA,EAAO,cAAeA,CAAK,CAE5B,CAED,CAEA,SAASuvE,IAAa,CAErB,GAAI,CAEHpvE,EAAG,WAAY,GAAG,SAAS,CAE5B,OAAUH,EAAQ,CAEjBA,EAAO,cAAeA,CAAK,CAE5B,CAED,CAIA,SAASwvE,GAASA,EAAU,CAEtBnD,GAAe,OAAQmD,CAAO,IAAO,KAEzCrvE,EAAG,QAASqvE,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAC,EACtDnD,GAAe,KAAMmD,CAAO,EAI9B,CAEA,SAASpI,GAAUA,EAAW,CAExBkF,GAAgB,OAAQlF,CAAQ,IAAO,KAE3CjnE,EAAG,SAAUinE,EAAS,EAAGA,EAAS,EAAGA,EAAS,EAAGA,EAAS,CAAC,EAC3DkF,GAAgB,KAAMlF,CAAQ,EAIhC,CAEA,SAASqI,GAAkBC,EAAevqB,GAAU,CAEnD,IAAIn1C,GAAUy6D,EAAc,IAAKtlB,EAAO,EAEnCn1C,KAAY,SAEhBA,GAAU,IAAI,QAEdy6D,EAAc,IAAKtlB,GAASn1C,EAAO,GAIpC,IAAI2/D,GAAa3/D,GAAQ,IAAK0/D,CAAa,EAEtCC,KAAe,SAEnBA,GAAaxvE,EAAG,qBAAsBglD,GAASuqB,EAAc,IAAI,EAEjE1/D,GAAQ,IAAK0/D,EAAeC,EAAU,EAIxC,CAEA,SAASC,GAAqBF,EAAevqB,GAAU,CAGtD,MAAMwqB,GADUlF,EAAc,IAAKtlB,EAAO,EACf,IAAKuqB,CAAa,EAExClF,EAAY,IAAKrlB,EAAO,IAAOwqB,KAGnCxvE,EAAG,oBAAqBglD,GAASwqB,GAAYD,EAAc,mBAAmB,EAE9ElF,EAAY,IAAKrlB,GAASwqB,EAAU,EAItC,CAIA,SAASzoB,IAAQ,CAIhB/mD,EAAG,QAASA,EAAG,KAAK,EACpBA,EAAG,QAASA,EAAG,SAAS,EACxBA,EAAG,QAASA,EAAG,UAAU,EACzBA,EAAG,QAASA,EAAG,mBAAmB,EAClCA,EAAG,QAASA,EAAG,YAAY,EAC3BA,EAAG,QAASA,EAAG,YAAY,EAC3BA,EAAG,QAASA,EAAG,wBAAwB,EAEvCA,EAAG,cAAeA,EAAG,QAAQ,EAC7BA,EAAG,UAAWA,EAAG,IAAKA,EAAG,IAAI,EAC7BA,EAAG,kBAAmBA,EAAG,IAAKA,EAAG,KAAMA,EAAG,IAAKA,EAAG,IAAI,EACtDA,EAAG,WAAY,EAAG,EAAG,EAAG,CAAC,EAEzBA,EAAG,UAAW,GAAM,GAAM,GAAM,EAAI,EACpCA,EAAG,WAAY,EAAG,EAAG,EAAG,CAAC,EAEzBA,EAAG,UAAW,EAAI,EAClBA,EAAG,UAAWA,EAAG,IAAI,EAErBmqE,EAAY,YAAa,EAAK,EAE9BnqE,EAAG,WAAY,CAAC,EAEhBA,EAAG,YAAa,UAAU,EAC1BA,EAAG,YAAaA,EAAG,OAAQ,EAAG,UAAU,EACxCA,EAAG,UAAWA,EAAG,KAAMA,EAAG,KAAMA,EAAG,IAAI,EACvCA,EAAG,aAAc,CAAC,EAElBA,EAAG,SAAUA,EAAG,IAAI,EACpBA,EAAG,UAAWA,EAAG,GAAG,EAEpBA,EAAG,cAAe,EAAG,CAAC,EAEtBA,EAAG,cAAeA,EAAG,QAAQ,EAE7BA,EAAG,gBAAiBA,EAAG,YAAa,IAAI,EACxCA,EAAG,gBAAiBA,EAAG,iBAAkB,IAAI,EAC7CA,EAAG,gBAAiBA,EAAG,iBAAkB,IAAI,EAE7CA,EAAG,WAAY,IAAI,EAEnBA,EAAG,UAAW,CAAC,EAEfA,EAAG,QAAS,EAAG,EAAGA,EAAG,OAAO,MAAOA,EAAG,OAAO,MAAM,EACnDA,EAAG,SAAU,EAAG,EAAGA,EAAG,OAAO,MAAOA,EAAG,OAAO,MAAM,EAIpDuqE,EAAsB,CAAA,EAEtBuB,EAAqB,KACrBC,GAAuB,CAAA,EAEvBvB,EAA2B,CAAA,EAC3BC,EAAqB,IAAI,QACzBC,EAAqB,CAAA,EAErBC,EAAiB,KAEjBC,EAAyB,GACzBC,EAAkB,KAClBC,EAAuB,KACvBC,EAAkB,KAClBC,EAAkB,KAClBC,EAA4B,KAC5BC,EAAuB,KACvBC,EAAuB,KACvBC,EAAoB,IAAIhqD,GAAO,EAAG,EAAG,CAAC,EACtCiqD,EAAoB,EACpBC,EAA2B,GAE3BC,EAAmB,KACnBC,EAAkB,KAElBC,EAAmB,KAEnBC,EAA6B,KAC7BC,EAA4B,KAE5BO,GAAe,IAAK,EAAG,EAAGlsE,EAAG,OAAO,MAAOA,EAAG,OAAO,MAAM,EAC3DmsE,GAAgB,IAAK,EAAG,EAAGnsE,EAAG,OAAO,MAAOA,EAAG,OAAO,MAAM,EAE5DkqE,EAAY,MAAK,EACjBC,EAAY,MAAK,EACjBC,EAAc,MAAK,CAEpB,CAEA,MAAO,CAEN,QAAS,CACR,MAAOF,EACP,MAAOC,EACP,QAASC,CACZ,EAEE,OAAQtB,GACR,QAASC,GAET,gBAAiB2D,GACjB,YAAaE,GAEb,WAAYC,GAEZ,YAAaJ,EACb,YAAagB,EAEb,aAAclB,EACd,YAAaC,EAEb,aAAcuB,EACd,iBAAkBF,EAElB,eAAgBK,GAEhB,cAAeE,EACf,YAAaE,EACb,cAAeI,EACf,qBAAsBC,EACtB,qBAAsBC,EACtB,WAAYO,GACZ,WAAYC,GAEZ,iBAAkBE,GAClB,oBAAqBG,GAErB,aAAcR,GACd,aAAcC,GACd,cAAeL,EACf,cAAeC,GACf,wBAAyBC,GACzB,wBAAyBC,GAEzB,QAASK,GACT,SAAUpI,GAEV,MAAOlgB,EAET,CAEA,CAEA,SAAS2oB,GAAeC,EAAKjkD,EAAY43B,EAAOoG,EAAYkI,EAAc1J,EAAO3qC,EAAO,CAEvF,MAAMqyD,EAAqBlkD,EAAW,IAAK,sCAAsC,EAAKA,EAAW,IAAK,sCAAsC,EAAK,KAC3ImkD,EAAgC,OAAO,UAAc,IAAc,GAAQ,iBAAiB,KAAM,UAAU,SAAS,EAErHC,EAAmB,IAAIrrE,GACvBsrE,EAAiB,IAAI,QAC3B,IAAIlhE,EAEJ,MAAMmhE,EAAW,IAAI,QAMrB,IAAIC,EAAqB,GAEzB,GAAI,CAEHA,EAAqB,OAAO,gBAAoB,KAE1C,IAAI,gBAAiB,EAAG,CAAC,EAAG,WAAY,IAAI,IAAS,IAE5D,MAAgB,CAIhB,CAEA,SAASC,EAAc79E,EAAOC,EAAS,CAItC,OAAO29E,EAEN,IAAI,gBAAiB59E,EAAOC,CAAM,EAAK8M,GAAiB,QAAQ,CAElE,CAEA,SAAS+wE,EAAaphE,EAAOqhE,EAAgBC,EAAU,CAEtD,IAAI91D,EAAQ,EAEZ,MAAM8xD,GAAaiE,EAAevhE,CAAK,EAYvC,IARKs9D,GAAW,MAAQgE,GAAWhE,GAAW,OAASgE,KAEtD91D,EAAQ81D,EAAU,KAAK,IAAKhE,GAAW,MAAOA,GAAW,MAAM,GAM3D9xD,EAAQ,EAIZ,GAAO,OAAO,iBAAqB,KAAexL,aAAiB,kBAChE,OAAO,kBAAsB,KAAeA,aAAiB,mBAC7D,OAAO,YAAgB,KAAeA,aAAiB,aACvD,OAAO,WAAe,KAAeA,aAAiB,WAAe,CAEvE,MAAM1c,GAAQ,KAAK,MAAOkoB,EAAQ8xD,GAAW,KAAK,EAC5C/5E,GAAS,KAAK,MAAOioB,EAAQ8xD,GAAW,MAAM,EAE/Cx9D,IAAY,SAAYA,EAAUqhE,EAAc79E,GAAOC,EAAM,GAIlE,MAAMiN,GAAS6wE,EAAiBF,EAAc79E,GAAOC,EAAM,EAAKuc,EAEhE,OAAAtP,GAAO,MAAQlN,GACfkN,GAAO,OAASjN,GAEAiN,GAAO,WAAY,IAAI,EAC/B,UAAWwP,EAAO,EAAG,EAAG1c,GAAOC,EAAM,EAE7CsN,GAAM,iDAAmDysE,GAAW,MAAQ,IAAMA,GAAW,OAAS,SAAWh6E,GAAQ,IAAMC,GAAS,IAAI,EAErIiN,EAER,KAEC,OAAK,SAAUwP,GAEdnP,GAAM,mDAAqDysE,GAAW,MAAQ,IAAMA,GAAW,OAAS,IAAI,EAItGt9D,EAMT,OAAOA,CAER,CAEA,SAASwhE,EAA6Bp/D,EAAU,CAE/C,OAAOA,EAAQ,eAEhB,CAEA,SAASq/D,EAAgBjiE,EAAS,CAEjCohE,EAAI,eAAgBphE,CAAM,CAE3B,CAEA,SAASkiE,EAAet/D,EAAU,CAEjC,OAAKA,EAAQ,wBAAiCw+D,EAAI,iBAC7Cx+D,EAAQ,sBAA+Bw+D,EAAI,WAC3Cx+D,EAAQ,0BAA4BA,EAAQ,yBAAkCw+D,EAAI,iBAChFA,EAAI,UAEZ,CAEA,SAASe,EAAmBC,EAAoBC,EAAUC,EAAQviE,EAAYwiE,GAAsB,GAAQ,CAE3G,GAAKH,IAAuB,KAAO,CAElC,GAAKhB,EAAKgB,CAAkB,IAAO,OAAY,OAAOhB,EAAKgB,CAAkB,EAE7E/wE,GAAM,qEAAwE+wE,EAAqB,GAAI,CAExG,CAEA,IAAII,GAAiBH,EAqErB,GAnEKA,IAAajB,EAAI,MAEhBkB,IAAWlB,EAAI,QAAQoB,GAAiBpB,EAAI,MAC5CkB,IAAWlB,EAAI,aAAaoB,GAAiBpB,EAAI,MACjDkB,IAAWlB,EAAI,gBAAgBoB,GAAiBpB,EAAI,KAIrDiB,IAAajB,EAAI,cAEhBkB,IAAWlB,EAAI,gBAAgBoB,GAAiBpB,EAAI,MACpDkB,IAAWlB,EAAI,iBAAiBoB,GAAiBpB,EAAI,OACrDkB,IAAWlB,EAAI,eAAeoB,GAAiBpB,EAAI,OACnDkB,IAAWlB,EAAI,OAAOoB,GAAiBpB,EAAI,KAC3CkB,IAAWlB,EAAI,QAAQoB,GAAiBpB,EAAI,MAC5CkB,IAAWlB,EAAI,MAAMoB,GAAiBpB,EAAI,OAI3CiB,IAAajB,EAAI,KAEhBkB,IAAWlB,EAAI,QAAQoB,GAAiBpB,EAAI,OAC5CkB,IAAWlB,EAAI,aAAaoB,GAAiBpB,EAAI,OACjDkB,IAAWlB,EAAI,gBAAgBoB,GAAiBpB,EAAI,MAIrDiB,IAAajB,EAAI,aAEhBkB,IAAWlB,EAAI,gBAAgBoB,GAAiBpB,EAAI,OACpDkB,IAAWlB,EAAI,iBAAiBoB,GAAiBpB,EAAI,QACrDkB,IAAWlB,EAAI,eAAeoB,GAAiBpB,EAAI,QACnDkB,IAAWlB,EAAI,OAAOoB,GAAiBpB,EAAI,MAC3CkB,IAAWlB,EAAI,QAAQoB,GAAiBpB,EAAI,OAC5CkB,IAAWlB,EAAI,MAAMoB,GAAiBpB,EAAI,QAI3CiB,IAAajB,EAAI,cAEhBkB,IAAWlB,EAAI,gBAAgBoB,GAAiBpB,EAAI,QACpDkB,IAAWlB,EAAI,iBAAiBoB,GAAiBpB,EAAI,SACrDkB,IAAWlB,EAAI,eAAeoB,GAAiBpB,EAAI,SACnDkB,IAAWlB,EAAI,OAAOoB,GAAiBpB,EAAI,OAC3CkB,IAAWlB,EAAI,QAAQoB,GAAiBpB,EAAI,QAC5CkB,IAAWlB,EAAI,MAAMoB,GAAiBpB,EAAI,SAI3CiB,IAAajB,EAAI,eAEhBkB,IAAWlB,EAAI,gBAAgBoB,GAAiBpB,EAAI,SACpDkB,IAAWlB,EAAI,iBAAiBoB,GAAiBpB,EAAI,UACrDkB,IAAWlB,EAAI,eAAeoB,GAAiBpB,EAAI,UACnDkB,IAAWlB,EAAI,OAAOoB,GAAiBpB,EAAI,QAC3CkB,IAAWlB,EAAI,QAAQoB,GAAiBpB,EAAI,SAC5CkB,IAAWlB,EAAI,MAAMoB,GAAiBpB,EAAI,UAI3CiB,IAAajB,EAAI,MAEhBkB,IAAWlB,EAAI,2BAA2BoB,GAAiBpB,EAAI,SAC/DkB,IAAWlB,EAAI,+BAA+BoB,GAAiBpB,EAAI,iBAIpEiB,IAAajB,EAAI,KAAO,CAE5B,MAAMqB,GAAWF,GAAsB7yE,GAAiBgQ,GAAgB,YAAaK,CAAU,EAE1FuiE,IAAWlB,EAAI,QAAQoB,GAAiBpB,EAAI,SAC5CkB,IAAWlB,EAAI,aAAaoB,GAAiBpB,EAAI,SACjDkB,IAAWlB,EAAI,gBAAgBoB,GAAmBC,KAAa9yE,GAAiByxE,EAAI,aAAeA,EAAI,OACvGkB,IAAWlB,EAAI,yBAAyBoB,GAAiBpB,EAAI,OAC7DkB,IAAWlB,EAAI,yBAAyBoB,GAAiBpB,EAAI,QAEnE,CAEA,OAAKoB,KAAmBpB,EAAI,MAAQoB,KAAmBpB,EAAI,MAC1DoB,KAAmBpB,EAAI,OAASoB,KAAmBpB,EAAI,OACvDoB,KAAmBpB,EAAI,SAAWoB,KAAmBpB,EAAI,UAEzDjkD,EAAW,IAAK,wBAAwB,EAIlCqlD,EAER,CAEA,SAASE,EAAwBC,EAAYC,EAAY,CAExD,IAAIC,EACJ,OAAKF,EAECC,IAAc,MAAQA,IAAcr3E,IAAmBq3E,IAAch3E,GAEzEi3E,EAAmBzB,EAAI,iBAEZwB,IAAcp3E,GAEzBq3E,EAAmBzB,EAAI,kBAEZwB,IAAcv3E,KAEzBw3E,EAAmBzB,EAAI,iBACvB/vE,GAAM,+FAA+F,GAMjGuxE,IAAc,MAAQA,IAAcr3E,IAAmBq3E,IAAch3E,GAEzEi3E,EAAmBzB,EAAI,kBAEZwB,IAAcp3E,GAEzBq3E,EAAmBzB,EAAI,mBAEZwB,IAAcv3E,KAEzBw3E,EAAmBzB,EAAI,mBAMlByB,CAER,CAEA,SAASC,EAAclgE,EAASpC,EAAQ,CAEvC,OAAKwhE,EAA6Bp/D,CAAO,IAAO,IAAUA,EAAQ,sBAAwBA,EAAQ,YAAchY,IAAiBgY,EAAQ,YAAc7X,GAE/I,KAAK,KAAM,KAAK,IAAKyV,EAAM,MAAOA,EAAM,MAAM,CAAE,EAAK,EAEjDoC,EAAQ,UAAY,QAAaA,EAAQ,QAAQ,OAAS,EAI9DA,EAAQ,QAAQ,OAEZA,EAAQ,qBAAuB,MAAM,QAASA,EAAQ,OAE1DpC,EAAM,QAAQ,OAMd,CAIT,CAIA,SAASq8C,EAAkBj/D,EAAQ,CAElC,MAAMglB,EAAUhlB,EAAM,OAEtBglB,EAAQ,oBAAqB,UAAWi6C,CAAgB,EAExDkmB,EAAmBngE,CAAO,EAErBA,EAAQ,gBAEZ4+D,EAAe,OAAQ5+D,CAAO,CAIhC,CAEA,SAASogE,EAAuBplF,EAAQ,CAEvC,MAAMwgC,EAAexgC,EAAM,OAE3BwgC,EAAa,oBAAqB,UAAW4kD,CAAqB,EAElEC,EAAwB7kD,CAAY,CAErC,CAIA,SAAS2kD,EAAmBngE,EAAU,CAErC,MAAMsgE,EAAoB/nB,EAAW,IAAKv4C,CAAO,EAEjD,GAAKsgE,EAAkB,cAAgB,OAAY,OAInD,MAAMnhE,EAASa,EAAQ,OACjBugE,EAAgB1B,EAAS,IAAK1/D,CAAM,EAE1C,GAAKohE,EAAgB,CAEpB,MAAMlD,GAAekD,EAAeD,EAAkB,UAAU,EAChEjD,GAAa,YAIRA,GAAa,YAAc,GAE/BmD,EAAexgE,CAAO,EAMlB,OAAO,KAAMugE,CAAa,EAAG,SAAW,GAE5C1B,EAAS,OAAQ1/D,CAAM,CAIzB,CAEAo5C,EAAW,OAAQv4C,CAAO,CAE3B,CAEA,SAASwgE,EAAexgE,EAAU,CAEjC,MAAMsgE,EAAoB/nB,EAAW,IAAKv4C,CAAO,EACjDw+D,EAAI,cAAe8B,EAAkB,cAAc,EAEnD,MAAMnhE,EAASa,EAAQ,OACjBugE,EAAgB1B,EAAS,IAAK1/D,CAAM,EAC1C,OAAOohE,EAAeD,EAAkB,UAAU,EAElDl0D,EAAK,OAAO,UAEb,CAEA,SAASi0D,EAAwB7kD,EAAe,CAE/C,MAAMilD,EAAyBloB,EAAW,IAAK/8B,CAAY,EAU3D,GARKA,EAAa,eAEjBA,EAAa,aAAa,QAAO,EAEjC+8B,EAAW,OAAQ/8B,EAAa,YAAY,GAIxCA,EAAa,wBAEjB,QAAUxtB,EAAI,EAAGA,EAAI,EAAGA,IAAO,CAE9B,GAAK,MAAM,QAASyyE,EAAuB,mBAAoBzyE,CAAC,CAAE,EAEjE,QAAU0yE,GAAQ,EAAGA,GAAQD,EAAuB,mBAAoBzyE,GAAI,OAAQ0yE,KAAWlC,EAAI,kBAAmBiC,EAAuB,mBAAoBzyE,CAAC,EAAI0yE,GAAO,OAI7KlC,EAAI,kBAAmBiC,EAAuB,mBAAoBzyE,CAAC,CAAE,EAIjEyyE,EAAuB,oBAAqBjC,EAAI,mBAAoBiC,EAAuB,mBAAoBzyE,EAAG,CAExH,KAEM,CAEN,GAAK,MAAM,QAASyyE,EAAuB,kBAAkB,EAE5D,QAAUC,EAAQ,EAAGA,EAAQD,EAAuB,mBAAmB,OAAQC,IAAWlC,EAAI,kBAAmBiC,EAAuB,mBAAoBC,CAAK,CAAE,OAInKlC,EAAI,kBAAmBiC,EAAuB,kBAAkB,EAOjE,GAHKA,EAAuB,oBAAqBjC,EAAI,mBAAoBiC,EAAuB,kBAAkB,EAC7GA,EAAuB,gCAAiCjC,EAAI,kBAAmBiC,EAAuB,8BAA8B,EAEpIA,EAAuB,yBAE3B,QAAUzyE,EAAI,EAAGA,EAAIyyE,EAAuB,yBAAyB,OAAQzyE,IAEvEyyE,EAAuB,yBAA0BzyE,IAAMwwE,EAAI,mBAAoBiC,EAAuB,yBAA0BzyE,EAAG,EAMrIyyE,EAAuB,0BAA2BjC,EAAI,mBAAoBiC,EAAuB,wBAAwB,CAE/H,CAEA,MAAMzzD,EAAWwO,EAAa,SAE9B,QAAUxtB,EAAI,EAAGmS,GAAK6M,EAAS,OAAQhf,EAAImS,GAAInS,IAAO,CAErD,MAAM2yE,GAAuBpoB,EAAW,IAAKvrC,EAAUhf,CAAC,CAAE,EAErD2yE,GAAqB,iBAEzBnC,EAAI,cAAemC,GAAqB,cAAc,EAEtDv0D,EAAK,OAAO,YAIbmsC,EAAW,OAAQvrC,EAAUhf,EAAG,CAEjC,CAEAuqD,EAAW,OAAQ/8B,CAAY,CAEhC,CAIA,IAAIolD,EAAe,EAEnB,SAASC,GAAoB,CAE5BD,EAAe,CAEhB,CAEA,SAASE,GAAsB,CAE9B,MAAMC,EAAcH,EAEpB,OAAKG,GAAetgB,EAAa,aAEhChyD,GAAM,gCAAkCsyE,EAAc,+CAAiDtgB,EAAa,WAAW,EAIhImgB,GAAgB,EAETG,CAER,CAEA,SAASC,EAAoBhhE,EAAU,CAEtC,MAAMjS,EAAQ,CAAA,EAEd,OAAAA,EAAM,KAAMiS,EAAQ,KAAK,EACzBjS,EAAM,KAAMiS,EAAQ,KAAK,EACzBjS,EAAM,KAAMiS,EAAQ,OAAS,CAAC,EAC9BjS,EAAM,KAAMiS,EAAQ,SAAS,EAC7BjS,EAAM,KAAMiS,EAAQ,SAAS,EAC7BjS,EAAM,KAAMiS,EAAQ,UAAU,EAC9BjS,EAAM,KAAMiS,EAAQ,cAAc,EAClCjS,EAAM,KAAMiS,EAAQ,MAAM,EAC1BjS,EAAM,KAAMiS,EAAQ,IAAI,EACxBjS,EAAM,KAAMiS,EAAQ,eAAe,EACnCjS,EAAM,KAAMiS,EAAQ,gBAAgB,EACpCjS,EAAM,KAAMiS,EAAQ,KAAK,EACzBjS,EAAM,KAAMiS,EAAQ,eAAe,EACnCjS,EAAM,KAAMiS,EAAQ,UAAU,EAEvBjS,EAAM,KAAI,CAElB,CAIA,SAASkzE,EAAcjhE,EAASkhE,EAAO,CAEtC,MAAMZ,EAAoB/nB,EAAW,IAAKv4C,CAAO,EAIjD,GAFKA,EAAQ,gBAAiBmhE,GAAoBnhE,CAAO,EAEpDA,EAAQ,wBAA0B,IAASA,EAAQ,oBAAsB,IAAQA,EAAQ,QAAU,GAAKsgE,EAAkB,YAActgE,EAAQ,QAAU,CAE9J,MAAMpC,EAAQoC,EAAQ,MAEtB,GAAKpC,IAAU,KAEdnP,GAAM,mEAAmE,UAE9DmP,EAAM,WAAa,GAE9BnP,GAAM,kEAAkE,MAElE,CAEN2yE,GAAed,EAAmBtgE,EAASkhE,CAAI,EAC/C,MAED,CAED,MAAYlhE,EAAQ,oBAEnBsgE,EAAkB,eAAiBtgE,EAAQ,cAAgBA,EAAQ,cAAgB,MAIpFmyC,EAAM,YAAaqsB,EAAI,WAAY8B,EAAkB,eAAgB9B,EAAI,SAAW0C,CAAI,CAEzF,CAEA,SAASG,EAAmBrhE,EAASkhE,EAAO,CAE3C,MAAMZ,EAAoB/nB,EAAW,IAAKv4C,CAAO,EAEjD,GAAKA,EAAQ,wBAA0B,IAASA,EAAQ,QAAU,GAAKsgE,EAAkB,YAActgE,EAAQ,QAAU,CAExHohE,GAAed,EAAmBtgE,EAASkhE,CAAI,EAC/C,MAED,MAAYlhE,EAAQ,oBAEnBsgE,EAAkB,eAAiBtgE,EAAQ,cAAgBA,EAAQ,cAAgB,MAIpFmyC,EAAM,YAAaqsB,EAAI,iBAAkB8B,EAAkB,eAAgB9B,EAAI,SAAW0C,CAAI,CAE/F,CAEA,SAASI,EAActhE,EAASkhE,EAAO,CAEtC,MAAMZ,EAAoB/nB,EAAW,IAAKv4C,CAAO,EAEjD,GAAKA,EAAQ,wBAA0B,IAASA,EAAQ,QAAU,GAAKsgE,EAAkB,YAActgE,EAAQ,QAAU,CAExHohE,GAAed,EAAmBtgE,EAASkhE,CAAI,EAC/C,MAED,CAEA/uB,EAAM,YAAaqsB,EAAI,WAAY8B,EAAkB,eAAgB9B,EAAI,SAAW0C,CAAI,CAEzF,CAEA,SAASK,EAAgBvhE,EAASkhE,EAAO,CAExC,MAAMZ,EAAoB/nB,EAAW,IAAKv4C,CAAO,EAEjD,GAAKA,EAAQ,QAAU,GAAKsgE,EAAkB,YAActgE,EAAQ,QAAU,CAE7EwhE,GAAmBlB,EAAmBtgE,EAASkhE,CAAI,EACnD,MAED,CAEA/uB,EAAM,YAAaqsB,EAAI,iBAAkB8B,EAAkB,eAAgB9B,EAAI,SAAW0C,CAAI,CAE/F,CAEA,MAAMO,EAAe,CACpB,CAAE55E,EAAc,EAAI22E,EAAI,OACxB,CAAE12E,EAAmB,EAAI02E,EAAI,cAC7B,CAAEz2E,EAAsB,EAAIy2E,EAAI,eAClC,EAEOkD,GAAa,CAClB,CAAE15E,EAAa,EAAIw2E,EAAI,QACvB,CAAEv2E,EAA0B,EAAIu2E,EAAI,uBACpC,CAAEt2E,EAAyB,EAAIs2E,EAAI,sBAEnC,CAAEr2E,EAAY,EAAIq2E,EAAI,OACtB,CAAEp2E,EAAyB,EAAIo2E,EAAI,sBACnC,CAAEn2E,EAAwB,EAAIm2E,EAAI,oBACpC,EAEOmD,EAAc,CACnB,CAAEz0E,EAAY,EAAIsxE,EAAI,MACtB,CAAE/wE,EAAa,EAAI+wE,EAAI,OACvB,CAAErxE,EAAW,EAAIqxE,EAAI,KACrB,CAAEnxE,EAAgB,EAAImxE,EAAI,OAC1B,CAAEpxE,EAAY,EAAIoxE,EAAI,MACtB,CAAEhxE,EAAmB,EAAIgxE,EAAI,OAC7B,CAAElxE,EAAc,EAAIkxE,EAAI,QACxB,CAAEjxE,EAAe,EAAIixE,EAAI,QAC3B,EAEC,SAASoD,EAAsBvqB,EAAar3C,EAAU,CA6BrD,GA3BKA,EAAQ,OAASpX,IAAa2xB,EAAW,IAAK,0BAA0B,IAAO,KACjFva,EAAQ,YAAc7X,IAAgB6X,EAAQ,YAAc5X,IAA6B4X,EAAQ,YAAc9X,IAA6B8X,EAAQ,YAAc3X,IACpK2X,EAAQ,YAAc7X,IAAgB6X,EAAQ,YAAc5X,IAA6B4X,EAAQ,YAAc9X,IAA6B8X,EAAQ,YAAc3X,KAElKoG,GAAM,oIAAoI,EAI3I+vE,EAAI,cAAennB,EAAamnB,EAAI,eAAgBiD,EAAczhE,EAAQ,MAAO,EACjFw+D,EAAI,cAAennB,EAAamnB,EAAI,eAAgBiD,EAAczhE,EAAQ,MAAO,GAE5Eq3C,IAAgBmnB,EAAI,YAAcnnB,IAAgBmnB,EAAI,mBAE1DA,EAAI,cAAennB,EAAamnB,EAAI,eAAgBiD,EAAczhE,EAAQ,MAAO,EAIlFw+D,EAAI,cAAennB,EAAamnB,EAAI,mBAAoBkD,GAAY1hE,EAAQ,UAAW,EACvFw+D,EAAI,cAAennB,EAAamnB,EAAI,mBAAoBkD,GAAY1hE,EAAQ,UAAW,EAElFA,EAAQ,kBAEZw+D,EAAI,cAAennB,EAAamnB,EAAI,qBAAsBA,EAAI,sBAAsB,EACpFA,EAAI,cAAennB,EAAamnB,EAAI,qBAAsBmD,EAAa3hE,EAAQ,gBAAiB,GAI5Fua,EAAW,IAAK,gCAAgC,IAAO,GAAO,CAIlE,GAFKva,EAAQ,YAAchY,IACtBgY,EAAQ,YAAc9X,IAA6B8X,EAAQ,YAAc3X,IACzE2X,EAAQ,OAASpX,IAAa2xB,EAAW,IAAK,0BAA0B,IAAO,GAAQ,OAE5F,GAAKva,EAAQ,WAAa,GAAKu4C,EAAW,IAAKv4C,CAAO,EAAG,oBAAsB,CAE9E,MAAM62C,EAAYt8B,EAAW,IAAK,gCAAgC,EAClEikD,EAAI,cAAennB,EAAaR,EAAU,2BAA4B,KAAK,IAAK72C,EAAQ,WAAYygD,EAAa,iBAAgB,CAAE,CAAE,EACrIlI,EAAW,IAAKv4C,CAAO,EAAG,oBAAsBA,EAAQ,UAEzD,CAED,CAED,CAEA,SAAS6hE,GAAavB,EAAmBtgE,EAAU,CAElD,IAAI8hE,EAAc,GAEbxB,EAAkB,cAAgB,SAEtCA,EAAkB,YAAc,GAEhCtgE,EAAQ,iBAAkB,UAAWi6C,CAAgB,GAMtD,MAAM96C,EAASa,EAAQ,OACvB,IAAIugE,GAAgB1B,EAAS,IAAK1/D,CAAM,EAEnCohE,KAAkB,SAEtBA,GAAgB,CAAA,EAChB1B,EAAS,IAAK1/D,EAAQohE,EAAa,GAMpC,MAAMwB,GAAkBf,EAAoBhhE,CAAO,EAEnD,GAAK+hE,KAAoBzB,EAAkB,WAAa,CAIlDC,GAAewB,EAAe,IAAO,SAIzCxB,GAAewB,EAAe,EAAK,CAClC,QAASvD,EAAI,cAAa,EAC1B,UAAW,CAChB,EAEIpyD,EAAK,OAAO,WAKZ01D,EAAc,IAIfvB,GAAewB,EAAe,EAAG,YAKjC,MAAM1E,GAAekD,GAAeD,EAAkB,UAAU,EAE3DjD,KAAiB,SAErBkD,GAAeD,EAAkB,UAAU,EAAG,YAEzCjD,GAAa,YAAc,GAE/BmD,EAAexgE,CAAO,GAQxBsgE,EAAkB,WAAayB,GAC/BzB,EAAkB,eAAiBC,GAAewB,EAAe,EAAG,OAErE,CAEA,OAAOD,CAER,CAEA,SAASE,GAAQ9lF,EAAO+lF,EAAWC,EAAkB,CAEpD,OAAO,KAAK,MAAO,KAAK,MAAOhmF,EAAQgmF,CAAe,EAAKD,CAAS,CAErE,CAEA,SAASE,GAAeniE,EAASpC,EAAO6hE,EAAUC,EAAS,CAI1D,MAAM/0B,GAAe3qC,EAAQ,aAE7B,GAAK2qC,GAAa,SAAW,EAE5BwH,EAAM,cAAeqsB,EAAI,WAAY,EAAG,EAAG,EAAG5gE,EAAM,MAAOA,EAAM,OAAQ6hE,EAAUC,EAAQ9hE,EAAM,IAAI,MAE/F,CAWN+sC,GAAa,KAAM,CAAEt4C,GAAGC,KAAOD,GAAE,MAAQC,GAAE,KAAK,EAOhD,IAAIs4C,GAAa,EAEjB,QAAU58C,GAAI,EAAGA,GAAI28C,GAAa,OAAQ38C,KAAO,CAEhD,MAAM68C,GAAgBF,GAAcC,EAAU,EACxCl5C,GAAQi5C,GAAc38C,EAAC,EAGvBo0E,GAAcv3B,GAAc,MAAQA,GAAc,MAClDw3B,GAAaL,GAAQtwE,GAAM,MAAOkM,EAAM,MAAO,CAAe,EAC9D0kE,GAAcN,GAAQn3B,GAAc,MAAOjtC,EAAM,MAAO,CAAe,EAK5ElM,GAAM,OAAS0wE,GAAc,GAC7BC,KAAeC,IACfN,GAAQtwE,GAAM,MAAQA,GAAM,MAAQ,EAAGkM,EAAM,MAAO,CAAe,IAAOykE,GAG1Ex3B,GAAc,MAAQ,KAAK,IAC1BA,GAAc,MACdn5C,GAAM,MAAQA,GAAM,MAAQm5C,GAAc,KAChD,GAIK,EAAGD,GACHD,GAAcC,EAAU,EAAKl5C,GAK/B,CAGAi5C,GAAa,OAASC,GAAa,EAEnC,MAAM23B,GAAsB/D,EAAI,aAAcA,EAAI,iBAAiB,EAC7DgE,GAA0BhE,EAAI,aAAcA,EAAI,kBAAkB,EAClEiE,GAAwBjE,EAAI,aAAcA,EAAI,gBAAgB,EAEpEA,EAAI,YAAaA,EAAI,kBAAmB5gE,EAAM,KAAK,EAEnD,QAAU5P,GAAI,EAAG5T,GAAIuwD,GAAa,OAAQ38C,GAAI5T,GAAG4T,KAAO,CAEvD,MAAM0D,GAAQi5C,GAAc38C,EAAC,EAEvB00E,GAAa,KAAK,MAAOhxE,GAAM,MAAQ,CAAe,EACtDixE,GAAa,KAAK,KAAMjxE,GAAM,MAAQ,CAAe,EAErDpB,GAAIoyE,GAAa9kE,EAAM,MACvBhN,EAAI,KAAK,MAAO8xE,GAAa9kE,EAAM,KAAK,EAGxC1c,GAAQyhF,GACRxhF,GAAS,EAEfq9E,EAAI,YAAaA,EAAI,mBAAoBluE,EAAC,EAC1CkuE,EAAI,YAAaA,EAAI,iBAAkB5tE,CAAC,EAExCuhD,EAAM,cAAeqsB,EAAI,WAAY,EAAGluE,GAAGM,EAAG1P,GAAOC,GAAQs+E,EAAUC,EAAQ9hE,EAAM,IAAI,CAE1F,CAEAoC,EAAQ,kBAAiB,EAEzBw+D,EAAI,YAAaA,EAAI,kBAAmB+D,EAAmB,EAC3D/D,EAAI,YAAaA,EAAI,mBAAoBgE,EAAuB,EAChEhE,EAAI,YAAaA,EAAI,iBAAkBiE,EAAqB,CAE7D,CAED,CAEA,SAASrB,GAAed,EAAmBtgE,EAASkhE,EAAO,CAE1D,IAAI7pB,EAAcmnB,EAAI,YAEjBx+D,EAAQ,oBAAsBA,EAAQ,4BAA2Bq3C,EAAcmnB,EAAI,kBACnFx+D,EAAQ,kBAAkBq3C,EAAcmnB,EAAI,YAEjD,MAAMsD,GAAcD,GAAavB,EAAmBtgE,CAAO,EACrDb,GAASa,EAAQ,OAEvBmyC,EAAM,YAAakF,EAAaipB,EAAkB,eAAgB9B,EAAI,SAAW0C,CAAI,EAErF,MAAM0B,GAAmBrqB,EAAW,IAAKp5C,EAAM,EAE/C,GAAKA,GAAO,UAAYyjE,GAAiB,WAAad,KAAgB,GAAO,CAE5E3vB,EAAM,cAAeqsB,EAAI,SAAW0C,CAAI,EAExC,MAAM2B,GAAmB/lE,GAAgB,aAAcA,GAAgB,iBAAiB,EAClFgmE,GAAmB9iE,EAAQ,aAAerT,GAAe,KAAOmQ,GAAgB,aAAckD,EAAQ,UAAU,EAChH+iE,GAAmB/iE,EAAQ,aAAerT,IAAgBk2E,KAAqBC,GAAmBtE,EAAI,KAAOA,EAAI,sBAEvHA,EAAI,YAAaA,EAAI,oBAAqBx+D,EAAQ,KAAK,EACvDw+D,EAAI,YAAaA,EAAI,+BAAgCx+D,EAAQ,gBAAgB,EAC7Ew+D,EAAI,YAAaA,EAAI,iBAAkBx+D,EAAQ,eAAe,EAC9Dw+D,EAAI,YAAaA,EAAI,mCAAoCuE,EAAgB,EAEzE,IAAInlE,GAAQohE,EAAah/D,EAAQ,MAAO,GAAOygD,EAAa,cAAc,EAC1E7iD,GAAQolE,EAAkBhjE,EAASpC,EAAK,EAExC,MAAM6hE,GAAW1oB,EAAM,QAAS/2C,EAAQ,OAAQA,EAAQ,UAAU,EAE5D0/D,GAAS3oB,EAAM,QAAS/2C,EAAQ,IAAI,EAC1C,IAAIigE,GAAmBV,EAAmBv/D,EAAQ,eAAgBy/D,GAAUC,GAAQ1/D,EAAQ,WAAYA,EAAQ,cAAc,EAE9H4hE,EAAsBvqB,EAAar3C,CAAO,EAE1C,IAAIijE,GACJ,MAAMC,GAAUljE,EAAQ,QAElBmjE,EAAkBnjE,EAAQ,iBAAmB,GAC7CojE,GAAmBR,GAAiB,YAAc,QAAiBd,KAAgB,GACnFuB,GAAYlkE,GAAO,UACnBmkE,GAASpD,EAAclgE,EAASpC,EAAK,EAE3C,GAAKoC,EAAQ,eAEZigE,GAAmBH,EAAwB9/D,EAAQ,SAAWzW,GAAoByW,EAAQ,IAAI,EAIzFojE,KAECD,EAEJhxB,EAAM,aAAcqsB,EAAI,WAAY,EAAGyB,GAAkBriE,GAAM,MAAOA,GAAM,MAAM,EAIlFu0C,EAAM,WAAYqsB,EAAI,WAAY,EAAGyB,GAAkBriE,GAAM,MAAOA,GAAM,OAAQ,EAAG6hE,GAAUC,GAAQ,IAAI,WAMlG1/D,EAAQ,cAMnB,GAAKkjE,GAAQ,OAAS,EAAI,CAEpBC,GAAiBC,IAErBjxB,EAAM,aAAcqsB,EAAI,WAAY8E,GAAQrD,GAAkBiD,GAAS,CAAC,EAAG,MAAOA,GAAS,CAAC,EAAG,MAAM,EAItG,QAAUl1E,GAAI,EAAGmS,GAAK+iE,GAAQ,OAAQl1E,GAAImS,GAAInS,KAE7Ci1E,GAASC,GAASl1E,EAAC,EAEdm1E,EAECE,IAEJlxB,EAAM,cAAeqsB,EAAI,WAAYxwE,GAAG,EAAG,EAAGi1E,GAAO,MAAOA,GAAO,OAAQxD,GAAUC,GAAQuD,GAAO,IAAI,EAMzG9wB,EAAM,WAAYqsB,EAAI,WAAYxwE,GAAGiyE,GAAkBgD,GAAO,MAAOA,GAAO,OAAQ,EAAGxD,GAAUC,GAAQuD,GAAO,IAAI,EAMtHjjE,EAAQ,gBAAkB,EAE3B,MAEMmjE,GAECC,IAEJjxB,EAAM,aAAcqsB,EAAI,WAAY8E,GAAQrD,GAAkBriE,GAAM,MAAOA,GAAM,MAAM,EAInFylE,IAEJlB,GAAeniE,EAASpC,GAAO6hE,GAAUC,EAAM,GAMhDvtB,EAAM,WAAYqsB,EAAI,WAAY,EAAGyB,GAAkBriE,GAAM,MAAOA,GAAM,OAAQ,EAAG6hE,GAAUC,GAAQ9hE,GAAM,IAAI,UAMxGoC,EAAQ,oBAEnB,GAAKA,EAAQ,yBAA2B,CAElCmjE,GAAiBC,IAErBjxB,EAAM,aAAcqsB,EAAI,iBAAkB8E,GAAQrD,GAAkBiD,GAAS,CAAC,EAAG,MAAOA,GAAS,CAAC,EAAG,OAAQtlE,GAAM,KAAK,EAIzH,QAAU5P,GAAI,EAAGmS,GAAK+iE,GAAQ,OAAQl1E,GAAImS,GAAInS,KAI7C,GAFAi1E,GAASC,GAASl1E,EAAC,EAEdgS,EAAQ,SAAW3W,GAEvB,GAAKo2E,KAAa,KAEjB,GAAK0D,GAEJ,GAAKE,GAEJ,GAAKrjE,EAAQ,aAAa,KAAO,EAAI,CAEpC,MAAMujE,GAAkB15B,GAAeo5B,GAAO,MAAOA,GAAO,OAAQjjE,EAAQ,OAAQA,EAAQ,IAAI,EAEhG,UAAYM,MAAcN,EAAQ,aAAe,CAEhD,MAAMwjE,GAAYP,GAAO,KAAK,SAC7B3iE,GAAaijE,GAAkBN,GAAO,KAAK,mBACzC3iE,GAAa,GAAMijE,GAAkBN,GAAO,KAAK,iBAChE,EACY9wB,EAAM,wBAAyBqsB,EAAI,iBAAkBxwE,GAAG,EAAG,EAAGsS,GAAY2iE,GAAO,MAAOA,GAAO,OAAQ,EAAGxD,GAAU+D,EAAS,CAE9H,CAEAxjE,EAAQ,kBAAiB,CAE1B,MAECmyC,EAAM,wBAAyBqsB,EAAI,iBAAkBxwE,GAAG,EAAG,EAAG,EAAGi1E,GAAO,MAAOA,GAAO,OAAQrlE,GAAM,MAAO6hE,GAAUwD,GAAO,IAAI,OAQlI9wB,EAAM,qBAAsBqsB,EAAI,iBAAkBxwE,GAAGiyE,GAAkBgD,GAAO,MAAOA,GAAO,OAAQrlE,GAAM,MAAO,EAAGqlE,GAAO,KAAM,EAAG,CAAC,OAMtIx0E,GAAM,0FAA0F,OAM5F00E,EAECE,IAEJlxB,EAAM,cAAeqsB,EAAI,iBAAkBxwE,GAAG,EAAG,EAAG,EAAGi1E,GAAO,MAAOA,GAAO,OAAQrlE,GAAM,MAAO6hE,GAAUC,GAAQuD,GAAO,IAAI,EAM/H9wB,EAAM,WAAYqsB,EAAI,iBAAkBxwE,GAAGiyE,GAAkBgD,GAAO,MAAOA,GAAO,OAAQrlE,GAAM,MAAO,EAAG6hE,GAAUC,GAAQuD,GAAO,IAAI,CAQ3I,KAAO,CAEDE,GAAiBC,IAErBjxB,EAAM,aAAcqsB,EAAI,WAAY8E,GAAQrD,GAAkBiD,GAAS,CAAC,EAAG,MAAOA,GAAS,CAAC,EAAG,MAAM,EAItG,QAAUl1E,GAAI,EAAGmS,GAAK+iE,GAAQ,OAAQl1E,GAAImS,GAAInS,KAE7Ci1E,GAASC,GAASl1E,EAAC,EAEdgS,EAAQ,SAAW3W,GAElBo2E,KAAa,KAEZ0D,EAECE,IAEJlxB,EAAM,wBAAyBqsB,EAAI,WAAYxwE,GAAG,EAAG,EAAGi1E,GAAO,MAAOA,GAAO,OAAQxD,GAAUwD,GAAO,IAAI,EAM3G9wB,EAAM,qBAAsBqsB,EAAI,WAAYxwE,GAAGiyE,GAAkBgD,GAAO,MAAOA,GAAO,OAAQ,EAAGA,GAAO,IAAI,EAM7Gx0E,GAAM,0FAA0F,EAM5F00E,EAECE,IAEJlxB,EAAM,cAAeqsB,EAAI,WAAYxwE,GAAG,EAAG,EAAGi1E,GAAO,MAAOA,GAAO,OAAQxD,GAAUC,GAAQuD,GAAO,IAAI,EAMzG9wB,EAAM,WAAYqsB,EAAI,WAAYxwE,GAAGiyE,GAAkBgD,GAAO,MAAOA,GAAO,OAAQ,EAAGxD,GAAUC,GAAQuD,GAAO,IAAI,CAQxH,SAEWjjE,EAAQ,mBAEnB,GAAKmjE,GAQJ,GANKC,IAEJjxB,EAAM,aAAcqsB,EAAI,iBAAkB8E,GAAQrD,GAAkBriE,GAAM,MAAOA,GAAM,OAAQA,GAAM,KAAK,EAItGylE,GAEJ,GAAKrjE,EAAQ,aAAa,KAAO,EAAI,CAEpC,MAAMujE,GAAkB15B,GAAejsC,GAAM,MAAOA,GAAM,OAAQoC,EAAQ,OAAQA,EAAQ,IAAI,EAE9F,UAAYM,MAAcN,EAAQ,aAAe,CAEhD,MAAMwjE,GAAY5lE,GAAM,KAAK,SAC5B0C,GAAaijE,GAAkB3lE,GAAM,KAAK,mBACxC0C,GAAa,GAAMijE,GAAkB3lE,GAAM,KAAK,iBAC3D,EACQu0C,EAAM,cAAeqsB,EAAI,iBAAkB,EAAG,EAAG,EAAGl+D,GAAY1C,GAAM,MAAOA,GAAM,OAAQ,EAAG6hE,GAAUC,GAAQ8D,EAAS,CAE1H,CAEAxjE,EAAQ,kBAAiB,CAE1B,MAECmyC,EAAM,cAAeqsB,EAAI,iBAAkB,EAAG,EAAG,EAAG,EAAG5gE,GAAM,MAAOA,GAAM,OAAQA,GAAM,MAAO6hE,GAAUC,GAAQ9hE,GAAM,IAAI,OAQ7Hu0C,EAAM,WAAYqsB,EAAI,iBAAkB,EAAGyB,GAAkBriE,GAAM,MAAOA,GAAM,OAAQA,GAAM,MAAO,EAAG6hE,GAAUC,GAAQ9hE,GAAM,IAAI,UAI1HoC,EAAQ,gBAEdmjE,GAECC,IAEJjxB,EAAM,aAAcqsB,EAAI,WAAY8E,GAAQrD,GAAkBriE,GAAM,MAAOA,GAAM,OAAQA,GAAM,KAAK,EAIhGylE,IAEJlxB,EAAM,cAAeqsB,EAAI,WAAY,EAAG,EAAG,EAAG,EAAG5gE,GAAM,MAAOA,GAAM,OAAQA,GAAM,MAAO6hE,GAAUC,GAAQ9hE,GAAM,IAAI,GAMtHu0C,EAAM,WAAYqsB,EAAI,WAAY,EAAGyB,GAAkBriE,GAAM,MAAOA,GAAM,OAAQA,GAAM,MAAO,EAAG6hE,GAAUC,GAAQ9hE,GAAM,IAAI,UAIpHoC,EAAQ,sBAEnB,GAAKojE,GAEJ,GAAKD,EAEJhxB,EAAM,aAAcqsB,EAAI,WAAY8E,GAAQrD,GAAkBriE,GAAM,MAAOA,GAAM,MAAM,MAEjF,CAEN,IAAI1c,GAAQ0c,GAAM,MAAOzc,GAASyc,GAAM,OAExC,QAAU5P,GAAI,EAAGA,GAAIs1E,GAAQt1E,KAE5BmkD,EAAM,WAAYqsB,EAAI,WAAYxwE,GAAGiyE,GAAkB/+E,GAAOC,GAAQ,EAAGs+E,GAAUC,GAAQ,IAAI,EAE/Fx+E,KAAU,EACVC,KAAW,CAIb,UAYI+hF,GAAQ,OAAS,EAAI,CAEzB,GAAKC,GAAiBC,GAAiB,CAEtC,MAAMlI,GAAaiE,EAAe+D,GAAS,CAAC,CAAE,EAE9C/wB,EAAM,aAAcqsB,EAAI,WAAY8E,GAAQrD,GAAkB/E,GAAW,MAAOA,GAAW,MAAM,CAElG,CAEA,QAAUltE,GAAI,EAAGmS,GAAK+iE,GAAQ,OAAQl1E,GAAImS,GAAInS,KAE7Ci1E,GAASC,GAASl1E,EAAC,EAEdm1E,EAECE,IAEJlxB,EAAM,cAAeqsB,EAAI,WAAYxwE,GAAG,EAAG,EAAGyxE,GAAUC,GAAQuD,EAAM,EAMvE9wB,EAAM,WAAYqsB,EAAI,WAAYxwE,GAAGiyE,GAAkBR,GAAUC,GAAQuD,EAAM,EAMjFjjE,EAAQ,gBAAkB,EAE3B,SAEMmjE,EAAgB,CAEpB,GAAKC,GAAiB,CAErB,MAAMlI,GAAaiE,EAAevhE,EAAK,EAEvCu0C,EAAM,aAAcqsB,EAAI,WAAY8E,GAAQrD,GAAkB/E,GAAW,MAAOA,GAAW,MAAM,CAElG,CAEKmI,IAEJlxB,EAAM,cAAeqsB,EAAI,WAAY,EAAG,EAAG,EAAGiB,GAAUC,GAAQ9hE,EAAK,CAIvE,MAECu0C,EAAM,WAAYqsB,EAAI,WAAY,EAAGyB,GAAkBR,GAAUC,GAAQ9hE,EAAK,EAQ5EwhE,EAA6Bp/D,IAEjCq/D,EAAgBhoB,CAAW,EAI5BurB,GAAiB,UAAYzjE,GAAO,QAE/Ba,EAAQ,UAAWA,EAAQ,SAAUA,CAAO,CAElD,CAEAsgE,EAAkB,UAAYtgE,EAAQ,OAEvC,CAEA,SAASwhE,GAAmBlB,EAAmBtgE,EAASkhE,EAAO,CAE9D,GAAKlhE,EAAQ,MAAM,SAAW,EAAI,OAElC,MAAM8hE,EAAcD,GAAavB,EAAmBtgE,CAAO,EACrDb,GAASa,EAAQ,OAEvBmyC,EAAM,YAAaqsB,EAAI,iBAAkB8B,EAAkB,eAAgB9B,EAAI,SAAW0C,CAAI,EAE9F,MAAM0B,GAAmBrqB,EAAW,IAAKp5C,EAAM,EAE/C,GAAKA,GAAO,UAAYyjE,GAAiB,WAAad,IAAgB,GAAO,CAE5E3vB,EAAM,cAAeqsB,EAAI,SAAW0C,CAAI,EAExC,MAAM2B,GAAmB/lE,GAAgB,aAAcA,GAAgB,iBAAiB,EAClFgmE,GAAmB9iE,EAAQ,aAAerT,GAAe,KAAOmQ,GAAgB,aAAckD,EAAQ,UAAU,EAChH+iE,GAAmB/iE,EAAQ,aAAerT,IAAgBk2E,KAAqBC,GAAmBtE,EAAI,KAAOA,EAAI,sBAEvHA,EAAI,YAAaA,EAAI,oBAAqBx+D,EAAQ,KAAK,EACvDw+D,EAAI,YAAaA,EAAI,+BAAgCx+D,EAAQ,gBAAgB,EAC7Ew+D,EAAI,YAAaA,EAAI,iBAAkBx+D,EAAQ,eAAe,EAC9Dw+D,EAAI,YAAaA,EAAI,mCAAoCuE,EAAgB,EAEzE,MAAMU,GAAiBzjE,EAAQ,qBAAuBA,EAAQ,MAAO,CAAC,EAAG,oBACnE0jE,GAAkB1jE,EAAQ,MAAO,CAAC,GAAMA,EAAQ,MAAO,CAAC,EAAG,cAE3D2jE,GAAY,CAAA,EAElB,QAAU31E,GAAI,EAAGA,GAAI,EAAGA,KAElB,CAAEy1E,IAAgB,CAAEC,GAExBC,GAAW31E,IAAMgxE,EAAah/D,EAAQ,MAAOhS,IAAK,GAAMyyD,EAAa,cAAc,EAInFkjB,GAAW31E,EAAC,EAAK01E,GAAgB1jE,EAAQ,MAAOhS,EAAC,EAAG,MAAQgS,EAAQ,MAAOhS,EAAC,EAI7E21E,GAAW31E,EAAC,EAAKg1E,EAAkBhjE,EAAS2jE,GAAW31E,GAAG,EAI3D,MAAM4P,GAAQ+lE,GAAW,CAAC,EACzBlE,GAAW1oB,EAAM,QAAS/2C,EAAQ,OAAQA,EAAQ,UAAU,EAC5D0/D,GAAS3oB,EAAM,QAAS/2C,EAAQ,IAAI,EACpCigE,GAAmBV,EAAmBv/D,EAAQ,eAAgBy/D,GAAUC,GAAQ1/D,EAAQ,UAAU,EAE7FmjE,EAAkBnjE,EAAQ,iBAAmB,GAC7CojE,GAAmBR,GAAiB,YAAc,QAAiBd,IAAgB,GACnFuB,GAAYlkE,GAAO,UACzB,IAAImkE,GAASpD,EAAclgE,EAASpC,EAAK,EAEzCgkE,EAAsBpD,EAAI,iBAAkBx+D,CAAO,EAEnD,IAAIkjE,GAEJ,GAAKO,GAAe,CAEdN,GAAiBC,IAErBjxB,EAAM,aAAcqsB,EAAI,iBAAkB8E,GAAQrD,GAAkBriE,GAAM,MAAOA,GAAM,MAAM,EAI9F,QAAU5P,GAAI,EAAGA,GAAI,EAAGA,KAAO,CAE9Bk1E,GAAUS,GAAW31E,EAAC,EAAG,QAEzB,QAAUyU,GAAI,EAAGA,GAAIygE,GAAQ,OAAQzgE,KAAO,CAE3C,MAAMwgE,GAASC,GAASzgE,EAAC,EAEpBzC,EAAQ,SAAW3W,GAElBo2E,KAAa,KAEZ0D,EAECE,IAEJlxB,EAAM,wBAAyBqsB,EAAI,4BAA8BxwE,GAAGyU,GAAG,EAAG,EAAGwgE,GAAO,MAAOA,GAAO,OAAQxD,GAAUwD,GAAO,IAAI,EAMhI9wB,EAAM,qBAAsBqsB,EAAI,4BAA8BxwE,GAAGyU,GAAGw9D,GAAkBgD,GAAO,MAAOA,GAAO,OAAQ,EAAGA,GAAO,IAAI,EAMlIx0E,GAAM,2FAA2F,EAM7F00E,EAECE,IAEJlxB,EAAM,cAAeqsB,EAAI,4BAA8BxwE,GAAGyU,GAAG,EAAG,EAAGwgE,GAAO,MAAOA,GAAO,OAAQxD,GAAUC,GAAQuD,GAAO,IAAI,EAM9H9wB,EAAM,WAAYqsB,EAAI,4BAA8BxwE,GAAGyU,GAAGw9D,GAAkBgD,GAAO,MAAOA,GAAO,OAAQ,EAAGxD,GAAUC,GAAQuD,GAAO,IAAI,CAM5I,CAED,CAED,KAAO,CAIN,GAFAC,GAAUljE,EAAQ,QAEbmjE,GAAiBC,GAAiB,CAMjCF,GAAQ,OAAS,GAAII,KAE1B,MAAMpI,GAAaiE,EAAewE,GAAW,CAAC,CAAE,EAEhDxxB,EAAM,aAAcqsB,EAAI,iBAAkB8E,GAAQrD,GAAkB/E,GAAW,MAAOA,GAAW,MAAM,CAExG,CAEA,QAAUltE,GAAI,EAAGA,GAAI,EAAGA,KAEvB,GAAK01E,GAAgB,CAEfP,EAECE,IAEJlxB,EAAM,cAAeqsB,EAAI,4BAA8BxwE,GAAG,EAAG,EAAG,EAAG21E,GAAW31E,EAAC,EAAG,MAAO21E,GAAW31E,EAAC,EAAG,OAAQyxE,GAAUC,GAAQiE,GAAW31E,EAAC,EAAG,IAAI,EAMtJmkD,EAAM,WAAYqsB,EAAI,4BAA8BxwE,GAAG,EAAGiyE,GAAkB0D,GAAW31E,IAAI,MAAO21E,GAAW31E,EAAC,EAAG,OAAQ,EAAGyxE,GAAUC,GAAQiE,GAAW31E,EAAC,EAAG,IAAI,EAIlK,QAAUyU,GAAI,EAAGA,GAAIygE,GAAQ,OAAQzgE,KAAO,CAG3C,MAAMmhE,GADSV,GAASzgE,EAAC,EACE,MAAOzU,EAAC,EAAG,MAEjCm1E,EAECE,IAEJlxB,EAAM,cAAeqsB,EAAI,4BAA8BxwE,GAAGyU,GAAI,EAAG,EAAG,EAAGmhE,GAAY,MAAOA,GAAY,OAAQnE,GAAUC,GAAQkE,GAAY,IAAI,EAMjJzxB,EAAM,WAAYqsB,EAAI,4BAA8BxwE,GAAGyU,GAAI,EAAGw9D,GAAkB2D,GAAY,MAAOA,GAAY,OAAQ,EAAGnE,GAAUC,GAAQkE,GAAY,IAAI,CAI9J,CAED,KAAO,CAEDT,EAECE,IAEJlxB,EAAM,cAAeqsB,EAAI,4BAA8BxwE,GAAG,EAAG,EAAG,EAAGyxE,GAAUC,GAAQiE,GAAW31E,EAAC,CAAE,EAMpGmkD,EAAM,WAAYqsB,EAAI,4BAA8BxwE,GAAG,EAAGiyE,GAAkBR,GAAUC,GAAQiE,GAAW31E,EAAC,CAAE,EAI7G,QAAUyU,GAAI,EAAGA,GAAIygE,GAAQ,OAAQzgE,KAAO,CAE3C,MAAMwgE,GAASC,GAASzgE,EAAC,EAEpB0gE,EAECE,IAEJlxB,EAAM,cAAeqsB,EAAI,4BAA8BxwE,GAAGyU,GAAI,EAAG,EAAG,EAAGg9D,GAAUC,GAAQuD,GAAO,MAAOj1E,EAAC,CAAE,EAM3GmkD,EAAM,WAAYqsB,EAAI,4BAA8BxwE,GAAGyU,GAAI,EAAGw9D,GAAkBR,GAAUC,GAAQuD,GAAO,MAAOj1E,EAAC,CAAE,CAIrH,CAED,CAIF,CAEKoxE,EAA6Bp/D,IAGjCq/D,EAAgBb,EAAI,gBAAgB,EAIrCoE,GAAiB,UAAYzjE,GAAO,QAE/Ba,EAAQ,UAAWA,EAAQ,SAAUA,CAAO,CAElD,CAEAsgE,EAAkB,UAAYtgE,EAAQ,OAEvC,CAKA,SAAS6jE,GAAyBrI,EAAahgD,EAAcxb,EAAS8jE,EAAYC,GAAerD,GAAQ,CAExG,MAAMjB,GAAW1oB,EAAM,QAAS/2C,EAAQ,OAAQA,EAAQ,UAAU,EAC5D0/D,GAAS3oB,EAAM,QAAS/2C,EAAQ,IAAI,EACpCigE,GAAmBV,EAAmBv/D,EAAQ,eAAgBy/D,GAAUC,GAAQ1/D,EAAQ,UAAU,EAClGygE,GAAyBloB,EAAW,IAAK/8B,CAAY,EACrD8kD,GAAoB/nB,EAAW,IAAKv4C,CAAO,EAIjD,GAFAsgE,GAAkB,eAAiB9kD,EAE9B,CAAEilD,GAAuB,sBAAwB,CAErD,MAAMv/E,GAAQ,KAAK,IAAK,EAAGs6B,EAAa,OAASklD,EAAK,EAChDv/E,GAAS,KAAK,IAAK,EAAGq6B,EAAa,QAAUklD,EAAK,EAEnDqD,KAAkBvF,EAAI,YAAcuF,KAAkBvF,EAAI,iBAE9DrsB,EAAM,WAAY4xB,GAAerD,GAAOT,GAAkB/+E,GAAOC,GAAQq6B,EAAa,MAAO,EAAGikD,GAAUC,GAAQ,IAAI,EAItHvtB,EAAM,WAAY4xB,GAAerD,GAAOT,GAAkB/+E,GAAOC,GAAQ,EAAGs+E,GAAUC,GAAQ,IAAI,CAIpG,CAEAvtB,EAAM,gBAAiBqsB,EAAI,YAAahD,CAAW,EAE9CwI,EAAoBxoD,GAExBijD,EAAmB,mCAAoCD,EAAI,YAAasF,EAAYC,GAAezD,GAAkB,eAAgB,EAAG2D,EAAwBzoD,CAAY,CAAE,GAEnKuoD,KAAkBvF,EAAI,YAAgBuF,IAAiBvF,EAAI,6BAA+BuF,IAAiBvF,EAAI,8BAE1HA,EAAI,qBAAsBA,EAAI,YAAasF,EAAYC,GAAezD,GAAkB,eAAgBI,EAAK,EAI9GvuB,EAAM,gBAAiBqsB,EAAI,YAAa,IAAI,CAE7C,CAGA,SAAS0F,GAA0BC,EAAc3oD,EAAc4oD,EAAgB,CAI9E,GAFA5F,EAAI,iBAAkBA,EAAI,aAAc2F,CAAY,EAE/C3oD,EAAa,YAAc,CAG/B,MAAM6oD,EAAe7oD,EAAa,aAC5BwkD,GAAYqE,GAAgBA,EAAa,eAAiBA,EAAa,KAAO,KAC9EpE,GAAmBH,EAAwBtkD,EAAa,cAAewkD,EAAS,EAChFsE,GAAmB9oD,EAAa,cAAgBgjD,EAAI,yBAA2BA,EAAI,iBAGnF3gB,GAAUomB,EAAwBzoD,CAAY,EACvBwoD,EAAoBxoD,CAAY,EAG5DijD,EAAmB,kCAAmCD,EAAI,aAAc3gB,GAASoiB,GAAkBzkD,EAAa,MAAOA,EAAa,MAAM,EAE/H4oD,EAEX5F,EAAI,+BAAgCA,EAAI,aAAc3gB,GAASoiB,GAAkBzkD,EAAa,MAAOA,EAAa,MAAM,EAIxHgjD,EAAI,oBAAqBA,EAAI,aAAcyB,GAAkBzkD,EAAa,MAAOA,EAAa,MAAM,EAIrGgjD,EAAI,wBAAyBA,EAAI,YAAa8F,GAAkB9F,EAAI,aAAc2F,CAAY,CAE/F,KAAO,CAEN,MAAMn3D,EAAWwO,EAAa,SAE9B,QAAUxtB,GAAI,EAAGA,GAAIgf,EAAS,OAAQhf,KAAO,CAE5C,MAAMgS,GAAUgN,EAAUhf,EAAC,EAErByxE,GAAW1oB,EAAM,QAAS/2C,GAAQ,OAAQA,GAAQ,UAAU,EAC5D0/D,GAAS3oB,EAAM,QAAS/2C,GAAQ,IAAI,EACpCigE,GAAmBV,EAAmBv/D,GAAQ,eAAgBy/D,GAAUC,GAAQ1/D,GAAQ,UAAU,EAClG69C,GAAUomB,EAAwBzoD,CAAY,EAE/C4oD,GAAiBJ,EAAoBxoD,CAAY,IAAO,GAE5DgjD,EAAI,+BAAgCA,EAAI,aAAc3gB,GAASoiB,GAAkBzkD,EAAa,MAAOA,EAAa,MAAM,EAE7GwoD,EAAoBxoD,GAE/BijD,EAAmB,kCAAmCD,EAAI,aAAc3gB,GAASoiB,GAAkBzkD,EAAa,MAAOA,EAAa,MAAM,EAI1IgjD,EAAI,oBAAqBA,EAAI,aAAcyB,GAAkBzkD,EAAa,MAAOA,EAAa,MAAM,CAItG,CAED,CAEAgjD,EAAI,iBAAkBA,EAAI,aAAc,IAAI,CAE7C,CAGA,SAAS+F,GAAmB/I,EAAahgD,EAAe,CAGvD,GADiBA,GAAgBA,EAAa,wBAChC,MAAM,IAAI,MAAO,yDAAyD,EAIxF,GAFA22B,EAAM,gBAAiBqsB,EAAI,YAAahD,CAAW,EAE9C,EAAIhgD,EAAa,cAAgBA,EAAa,aAAa,gBAE/D,MAAM,IAAI,MAAO,qEAAqE,EAIvF,MAAM8kD,EAAoB/nB,EAAW,IAAK/8B,EAAa,YAAY,EACnE8kD,EAAkB,eAAiB9kD,GAG9B,CAAE8kD,EAAkB,gBACvB9kD,EAAa,aAAa,MAAM,QAAUA,EAAa,OACvDA,EAAa,aAAa,MAAM,SAAWA,EAAa,UAEzDA,EAAa,aAAa,MAAM,MAAQA,EAAa,MACrDA,EAAa,aAAa,MAAM,OAASA,EAAa,OACtDA,EAAa,aAAa,YAAc,IAIzCylD,EAAczlD,EAAa,aAAc,CAAC,EAE1C,MAAMgpD,GAAoBlE,EAAkB,eACtCziB,GAAUomB,EAAwBzoD,CAAY,EAEpD,GAAKA,EAAa,aAAa,SAAWlyB,GAEpC06E,EAAoBxoD,GAExBijD,EAAmB,mCAAoCD,EAAI,YAAaA,EAAI,iBAAkBA,EAAI,WAAYgG,GAAmB,EAAG3mB,EAAO,EAI3I2gB,EAAI,qBAAsBA,EAAI,YAAaA,EAAI,iBAAkBA,EAAI,WAAYgG,GAAmB,CAAC,UAI3FhpD,EAAa,aAAa,SAAWjyB,GAE3Cy6E,EAAoBxoD,GAExBijD,EAAmB,mCAAoCD,EAAI,YAAaA,EAAI,yBAA0BA,EAAI,WAAYgG,GAAmB,EAAG3mB,EAAO,EAInJ2gB,EAAI,qBAAsBA,EAAI,YAAaA,EAAI,yBAA0BA,EAAI,WAAYgG,GAAmB,CAAC,MAM9G,OAAM,IAAI,MAAO,6BAA6B,CAIhD,CAGA,SAASC,GAAwBjpD,EAAe,CAE/C,MAAMilD,EAAyBloB,EAAW,IAAK/8B,CAAY,EACrDkpD,EAAWlpD,EAAa,0BAA4B,GAG1D,GAAKilD,EAAuB,sBAAwBjlD,EAAa,aAAe,CAG/E,MAAM6oD,EAAe7oD,EAAa,aAQlC,GAPKilD,EAAuB,wBAE3BA,EAAuB,uBAAsB,EAKzC4D,EAAe,CAEnB,MAAMM,GAAe,IAAM,CAE1B,OAAOlE,EAAuB,oBAC9B,OAAOA,EAAuB,uBAC9B4D,EAAa,oBAAqB,UAAWM,EAAY,CAE1D,EAEAN,EAAa,iBAAkB,UAAWM,EAAY,EACtDlE,EAAuB,uBAAyBkE,EAEjD,CAEAlE,EAAuB,oBAAsB4D,CAE9C,CAEA,GAAK7oD,EAAa,cAAgB,CAAEilD,EAAuB,0BAA4B,CAEtF,GAAKiE,EAAS,MAAM,IAAI,MAAO,0DAA0D,EAEzF,MAAMxB,EAAU1nD,EAAa,QAAQ,QAEhC0nD,GAAWA,EAAQ,OAAS,EAEhCqB,GAAmB9D,EAAuB,mBAAoB,CAAC,EAAIjlD,CAAY,EAI/E+oD,GAAmB9D,EAAuB,mBAAoBjlD,CAAY,CAI5E,SAEMkpD,EAAS,CAEbjE,EAAuB,mBAAqB,CAAA,EAE5C,QAAUzyE,EAAI,EAAGA,EAAI,EAAGA,IAIvB,GAFAmkD,EAAM,gBAAiBqsB,EAAI,YAAaiC,EAAuB,mBAAoBzyE,EAAG,EAEjFyyE,EAAuB,mBAAoBzyE,CAAC,IAAO,OAEvDyyE,EAAuB,mBAAoBzyE,GAAMwwE,EAAI,mBAAkB,EACvE0F,GAA0BzD,EAAuB,mBAAoBzyE,CAAC,EAAIwtB,EAAc,EAAK,MAEvF,CAGN,MAAM8oD,GAAmB9oD,EAAa,cAAgBgjD,EAAI,yBAA2BA,EAAI,iBACnF2F,GAAe1D,EAAuB,mBAAoBzyE,CAAC,EACjEwwE,EAAI,iBAAkBA,EAAI,aAAc2F,EAAY,EACpD3F,EAAI,wBAAyBA,EAAI,YAAa8F,GAAkB9F,EAAI,aAAc2F,EAAY,CAE/F,CAIF,KAAO,CAEN,MAAMjB,EAAU1nD,EAAa,QAAQ,QAYrC,GAVK0nD,GAAWA,EAAQ,OAAS,EAEhC/wB,EAAM,gBAAiBqsB,EAAI,YAAaiC,EAAuB,mBAAoB,EAAG,EAItFtuB,EAAM,gBAAiBqsB,EAAI,YAAaiC,EAAuB,kBAAkB,EAI7EA,EAAuB,qBAAuB,OAElDA,EAAuB,mBAAqBjC,EAAI,mBAAkB,EAClE0F,GAA0BzD,EAAuB,mBAAoBjlD,EAAc,EAAK,MAElF,CAGN,MAAM8oD,GAAmB9oD,EAAa,cAAgBgjD,EAAI,yBAA2BA,EAAI,iBACnF2F,GAAe1D,EAAuB,mBAC5CjC,EAAI,iBAAkBA,EAAI,aAAc2F,EAAY,EACpD3F,EAAI,wBAAyBA,EAAI,YAAa8F,GAAkB9F,EAAI,aAAc2F,EAAY,CAE/F,CAED,CAIDhyB,EAAM,gBAAiBqsB,EAAI,YAAa,IAAI,CAE7C,CAGA,SAASoG,GAAgBppD,EAAcqpD,EAAcR,EAAe,CAEnE,MAAM5D,EAAyBloB,EAAW,IAAK/8B,CAAY,EAEtDqpD,IAAiB,QAErBhB,GAAyBpD,EAAuB,mBAAoBjlD,EAAcA,EAAa,QAASgjD,EAAI,kBAAmBA,EAAI,WAAY,CAAC,EAI5I6F,IAAiB,QAErBI,GAAwBjpD,CAAY,CAItC,CAGA,SAASspD,GAAmBtpD,EAAe,CAE1C,MAAMxb,EAAUwb,EAAa,QAEvBilD,EAAyBloB,EAAW,IAAK/8B,CAAY,EACrD8kD,EAAoB/nB,EAAW,IAAKv4C,CAAO,EAEjDwb,EAAa,iBAAkB,UAAW4kD,CAAqB,EAE/D,MAAMpzD,GAAWwO,EAAa,SAExBkpD,GAAWlpD,EAAa,0BAA4B,GACpDupD,GAA4B/3D,GAAS,OAAS,EAiBpD,GAfO+3D,KAEDzE,EAAkB,iBAAmB,SAEzCA,EAAkB,eAAiB9B,EAAI,cAAa,GAIrD8B,EAAkB,UAAYtgE,EAAQ,QACtCoM,EAAK,OAAO,YAMRs4D,GAAS,CAEbjE,EAAuB,mBAAqB,CAAA,EAE5C,QAAUzyE,GAAI,EAAGA,GAAI,EAAGA,KAEvB,GAAKgS,EAAQ,SAAWA,EAAQ,QAAQ,OAAS,EAAI,CAEpDygE,EAAuB,mBAAoBzyE,EAAC,EAAK,CAAA,EAEjD,QAAU0yE,GAAQ,EAAGA,GAAQ1gE,EAAQ,QAAQ,OAAQ0gE,KAEpDD,EAAuB,mBAAoBzyE,EAAC,EAAI0yE,EAAK,EAAKlC,EAAI,kBAAiB,CAIjF,MAECiC,EAAuB,mBAAoBzyE,IAAMwwE,EAAI,kBAAiB,CAMzE,KAAO,CAEN,GAAKx+D,EAAQ,SAAWA,EAAQ,QAAQ,OAAS,EAAI,CAEpDygE,EAAuB,mBAAqB,CAAA,EAE5C,QAAUC,GAAQ,EAAGA,GAAQ1gE,EAAQ,QAAQ,OAAQ0gE,KAEpDD,EAAuB,mBAAoBC,IAAUlC,EAAI,kBAAiB,CAI5E,MAECiC,EAAuB,mBAAqBjC,EAAI,kBAAiB,EAIlE,GAAKuG,GAEJ,QAAU/2E,GAAI,EAAGmS,GAAK6M,GAAS,OAAQhf,GAAImS,GAAInS,KAAO,CAErD,MAAM2yE,GAAuBpoB,EAAW,IAAKvrC,GAAUhf,EAAC,CAAE,EAErD2yE,GAAqB,iBAAmB,SAE5CA,GAAqB,eAAiBnC,EAAI,cAAa,EAEvDpyD,EAAK,OAAO,WAId,CAID,GAAOoP,EAAa,QAAU,GAAOwoD,EAAoBxoD,CAAY,IAAO,GAAQ,CAEnFilD,EAAuB,+BAAiCjC,EAAI,kBAAiB,EAC7EiC,EAAuB,yBAA2B,CAAA,EAElDtuB,EAAM,gBAAiBqsB,EAAI,YAAaiC,EAAuB,8BAA8B,EAE7F,QAAUzyE,GAAI,EAAGA,GAAIgf,GAAS,OAAQhf,KAAO,CAE5C,MAAMgS,GAAUgN,GAAUhf,EAAC,EAC3ByyE,EAAuB,yBAA0BzyE,IAAMwwE,EAAI,mBAAkB,EAE7EA,EAAI,iBAAkBA,EAAI,aAAciC,EAAuB,yBAA0BzyE,GAAG,EAE5F,MAAMyxE,GAAW1oB,EAAM,QAAS/2C,GAAQ,OAAQA,GAAQ,UAAU,EAC5D0/D,GAAS3oB,EAAM,QAAS/2C,GAAQ,IAAI,EACpCigE,GAAmBV,EAAmBv/D,GAAQ,eAAgBy/D,GAAUC,GAAQ1/D,GAAQ,WAAYwb,EAAa,mBAAqB,EAAI,EAC1IqiC,GAAUomB,EAAwBzoD,CAAY,EACpDgjD,EAAI,+BAAgCA,EAAI,aAAc3gB,GAASoiB,GAAkBzkD,EAAa,MAAOA,EAAa,MAAM,EAExHgjD,EAAI,wBAAyBA,EAAI,YAAaA,EAAI,kBAAoBxwE,GAAGwwE,EAAI,aAAciC,EAAuB,yBAA0BzyE,EAAC,CAAE,CAEhJ,CAEAwwE,EAAI,iBAAkBA,EAAI,aAAc,IAAI,EAEvChjD,EAAa,cAEjBilD,EAAuB,yBAA2BjC,EAAI,mBAAkB,EACxE0F,GAA0BzD,EAAuB,yBAA0BjlD,EAAc,EAAI,GAI9F22B,EAAM,gBAAiBqsB,EAAI,YAAa,IAAI,CAE7C,CAED,CAIA,GAAKkG,GAAS,CAEbvyB,EAAM,YAAaqsB,EAAI,iBAAkB8B,EAAkB,cAAc,EACzEsB,EAAsBpD,EAAI,iBAAkBx+D,CAAO,EAEnD,QAAUhS,GAAI,EAAGA,GAAI,EAAGA,KAEvB,GAAKgS,EAAQ,SAAWA,EAAQ,QAAQ,OAAS,EAEhD,QAAU0gE,GAAQ,EAAGA,GAAQ1gE,EAAQ,QAAQ,OAAQ0gE,KAEpDmD,GAAyBpD,EAAuB,mBAAoBzyE,EAAC,EAAI0yE,EAAK,EAAIllD,EAAcxb,EAASw+D,EAAI,kBAAmBA,EAAI,4BAA8BxwE,GAAG0yE,EAAK,OAM3KmD,GAAyBpD,EAAuB,mBAAoBzyE,EAAC,EAAIwtB,EAAcxb,EAASw+D,EAAI,kBAAmBA,EAAI,4BAA8BxwE,GAAG,CAAC,EAM1JoxE,EAA6Bp/D,IAEjCq/D,EAAgBb,EAAI,gBAAgB,EAIrCrsB,EAAM,cAAa,CAEpB,SAAY4yB,GAA0B,CAErC,QAAU/2E,GAAI,EAAGmS,GAAK6M,GAAS,OAAQhf,GAAImS,GAAInS,KAAO,CAErD,MAAM81E,GAAa92D,GAAUhf,EAAC,EACxB2yE,GAAuBpoB,EAAW,IAAKurB,EAAU,EAEvD,IAAIkB,GAAgBxG,EAAI,YAEnBhjD,EAAa,uBAAyBA,EAAa,4BAEvDwpD,GAAgBxpD,EAAa,sBAAwBgjD,EAAI,WAAaA,EAAI,kBAI3ErsB,EAAM,YAAa6yB,GAAerE,GAAqB,cAAc,EACrEiB,EAAsBoD,GAAelB,EAAU,EAC/CD,GAAyBpD,EAAuB,mBAAoBjlD,EAAcsoD,GAAYtF,EAAI,kBAAoBxwE,GAAGg3E,GAAe,CAAC,EAEpI5F,EAA6B0E,KAEjCzE,EAAgB2F,EAAa,CAI/B,CAEA7yB,EAAM,cAAa,CAEpB,KAAO,CAEN,IAAI6yB,GAAgBxG,EAAI,WAWxB,IATKhjD,EAAa,uBAAyBA,EAAa,4BAEvDwpD,GAAgBxpD,EAAa,sBAAwBgjD,EAAI,WAAaA,EAAI,kBAI3ErsB,EAAM,YAAa6yB,GAAe1E,EAAkB,cAAc,EAClEsB,EAAsBoD,GAAehlE,CAAO,EAEvCA,EAAQ,SAAWA,EAAQ,QAAQ,OAAS,EAEhD,QAAU0gE,GAAQ,EAAGA,GAAQ1gE,EAAQ,QAAQ,OAAQ0gE,KAEpDmD,GAAyBpD,EAAuB,mBAAoBC,IAASllD,EAAcxb,EAASw+D,EAAI,kBAAmBwG,GAAetE,EAAK,OAMhJmD,GAAyBpD,EAAuB,mBAAoBjlD,EAAcxb,EAASw+D,EAAI,kBAAmBwG,GAAe,CAAC,EAI9H5F,EAA6Bp/D,IAEjCq/D,EAAgB2F,EAAa,EAI9B7yB,EAAM,cAAa,CAEpB,CAIK32B,EAAa,aAEjBipD,GAAwBjpD,CAAY,CAItC,CAEA,SAASypD,EAA0BzpD,EAAe,CAEjD,MAAMxO,EAAWwO,EAAa,SAE9B,QAAUxtB,EAAI,EAAGmS,EAAK6M,EAAS,OAAQhf,EAAImS,EAAInS,IAAO,CAErD,MAAMgS,GAAUgN,EAAUhf,CAAC,EAE3B,GAAKoxE,EAA6Bp/D,IAAY,CAE7C,MAAMklE,GAAa5F,EAAe9jD,CAAY,EACxC6hD,GAAe9kB,EAAW,IAAKv4C,EAAO,EAAG,eAE/CmyC,EAAM,YAAa+yB,GAAY7H,EAAY,EAC3CgC,EAAgB6F,EAAU,EAC1B/yB,EAAM,cAAa,CAEpB,CAED,CAED,CAEA,MAAMgzB,EAAwB,CAAA,EACxBC,EAAwB,CAAA,EAE9B,SAASC,EAA+B7pD,EAAe,CAEtD,GAAKA,EAAa,QAAU,GAE3B,GAAKwoD,EAAoBxoD,CAAY,IAAO,GAAQ,CAEnD,MAAMxO,EAAWwO,EAAa,SACxBt6B,EAAQs6B,EAAa,MACrBr6B,EAASq6B,EAAa,OAC5B,IAAI8pD,GAAO9G,EAAI,iBACf,MAAM+G,GAAa/pD,EAAa,cAAgBgjD,EAAI,yBAA2BA,EAAI,iBAC7EiC,GAAyBloB,EAAW,IAAK/8B,CAAY,EACrDupD,GAA4B/3D,EAAS,OAAS,EAGpD,GAAK+3D,GAEJ,QAAU/2E,GAAI,EAAGA,GAAIgf,EAAS,OAAQhf,KAErCmkD,EAAM,gBAAiBqsB,EAAI,YAAaiC,GAAuB,8BAA8B,EAC7FjC,EAAI,wBAAyBA,EAAI,YAAaA,EAAI,kBAAoBxwE,GAAGwwE,EAAI,aAAc,IAAI,EAE/FrsB,EAAM,gBAAiBqsB,EAAI,YAAaiC,GAAuB,kBAAkB,EACjFjC,EAAI,qBAAsBA,EAAI,iBAAkBA,EAAI,kBAAoBxwE,GAAGwwE,EAAI,WAAY,KAAM,CAAC,EAMpGrsB,EAAM,gBAAiBqsB,EAAI,iBAAkBiC,GAAuB,8BAA8B,EAElG,MAAMyC,GAAU1nD,EAAa,QAAQ,QAEhC0nD,IAAWA,GAAQ,OAAS,EAEhC/wB,EAAM,gBAAiBqsB,EAAI,iBAAkBiC,GAAuB,mBAAoB,EAAG,EAI3FtuB,EAAM,gBAAiBqsB,EAAI,iBAAkBiC,GAAuB,kBAAkB,EAIvF,QAAUzyE,GAAI,EAAGA,GAAIgf,EAAS,OAAQhf,KAAO,CAY5C,GAVKwtB,EAAa,qBAEZA,EAAa,cAAc8pD,IAAQ9G,EAAI,kBAIvChjD,EAAa,eAAiBA,EAAa,uBAAuB8pD,IAAQ9G,EAAI,qBAI/EuG,GAA0B,CAE9BvG,EAAI,wBAAyBA,EAAI,iBAAkBA,EAAI,kBAAmBA,EAAI,aAAciC,GAAuB,yBAA0BzyE,EAAC,CAAE,EAEhJ,MAAMqvE,GAAe9kB,EAAW,IAAKvrC,EAAUhf,EAAC,CAAE,EAAG,eACrDwwE,EAAI,qBAAsBA,EAAI,iBAAkBA,EAAI,kBAAmBA,EAAI,WAAYnB,GAAc,CAAC,CAEvG,CAEAmB,EAAI,gBAAiB,EAAG,EAAGt9E,EAAOC,EAAQ,EAAG,EAAGD,EAAOC,EAAQmkF,GAAM9G,EAAI,OAAO,EAE3EE,IAAkC,KAEtCyG,EAAsB,OAAS,EAC/BC,EAAsB,OAAS,EAE/BD,EAAsB,KAAM3G,EAAI,kBAAoBxwE,EAAC,EAEhDwtB,EAAa,aAAeA,EAAa,qBAAuB,KAEpE2pD,EAAsB,KAAMI,EAAU,EACtCH,EAAsB,KAAMG,EAAU,EAEtC/G,EAAI,sBAAuBA,EAAI,iBAAkB4G,CAAqB,GAIvE5G,EAAI,sBAAuBA,EAAI,iBAAkB2G,CAAqB,EAIxE,CAMA,GAJAhzB,EAAM,gBAAiBqsB,EAAI,iBAAkB,IAAI,EACjDrsB,EAAM,gBAAiBqsB,EAAI,iBAAkB,IAAI,EAG5CuG,GAEJ,QAAU/2E,GAAI,EAAGA,GAAIgf,EAAS,OAAQhf,KAAO,CAE5CmkD,EAAM,gBAAiBqsB,EAAI,YAAaiC,GAAuB,8BAA8B,EAC7FjC,EAAI,wBAAyBA,EAAI,YAAaA,EAAI,kBAAoBxwE,GAAGwwE,EAAI,aAAciC,GAAuB,yBAA0BzyE,EAAC,CAAE,EAE/I,MAAMqvE,GAAe9kB,EAAW,IAAKvrC,EAAUhf,EAAC,CAAE,EAAG,eAErDmkD,EAAM,gBAAiBqsB,EAAI,YAAaiC,GAAuB,kBAAkB,EACjFjC,EAAI,qBAAsBA,EAAI,iBAAkBA,EAAI,kBAAoBxwE,GAAGwwE,EAAI,WAAYnB,GAAc,CAAC,CAE3G,CAIDlrB,EAAM,gBAAiBqsB,EAAI,iBAAkBiC,GAAuB,8BAA8B,CAEnG,SAEMjlD,EAAa,aAAeA,EAAa,qBAAuB,IAASkjD,EAAgC,CAE7G,MAAM6G,EAAa/pD,EAAa,cAAgBgjD,EAAI,yBAA2BA,EAAI,iBAEnFA,EAAI,sBAAuBA,EAAI,iBAAkB,CAAE+G,CAAU,CAAE,CAEhE,EAMH,CAEA,SAAStB,EAAwBzoD,EAAe,CAE/C,OAAO,KAAK,IAAKilC,EAAa,WAAYjlC,EAAa,OAAO,CAE/D,CAEA,SAASwoD,EAAoBxoD,EAAe,CAE3C,MAAMilD,EAAyBloB,EAAW,IAAK/8B,CAAY,EAE3D,OAAOA,EAAa,QAAU,GAAKjB,EAAW,IAAK,sCAAsC,IAAO,IAAQkmD,EAAuB,uBAAyB,EAEzJ,CAEA,SAASU,GAAoBnhE,EAAU,CAEtC,MAAMkd,EAAQ9Q,EAAK,OAAO,MAIrBwyD,EAAe,IAAK5+D,CAAO,IAAOkd,IAEtC0hD,EAAe,IAAK5+D,EAASkd,CAAK,EAClCld,EAAQ,OAAM,EAIhB,CAEA,SAASgjE,EAAkBhjE,EAASpC,EAAQ,CAE3C,MAAMT,EAAa6C,EAAQ,WACrBjB,EAASiB,EAAQ,OACjB3hB,GAAO2hB,EAAQ,KAErB,OAAKA,EAAQ,sBAAwB,IAAQA,EAAQ,iBAAmB,IAEnE7C,IAAetQ,IAAwBsQ,IAAexQ,KAIrDmQ,GAAgB,YAAaK,CAAU,IAAOpQ,IAI7CgS,IAAW1V,IAAchL,KAASiK,KAEtCmG,GAAM,mFAAmF,EAM1FC,GAAO,kDAAmDyO,CAAU,GAM/DS,CAER,CAEA,SAASuhE,EAAevhE,EAAQ,CAE/B,OAAK,OAAO,iBAAqB,KAAeA,aAAiB,kBAIhE+gE,EAAiB,MAAQ/gE,EAAM,cAAgBA,EAAM,MACrD+gE,EAAiB,OAAS/gE,EAAM,eAAiBA,EAAM,QAE5C,OAAO,WAAe,KAAeA,aAAiB,YAEjE+gE,EAAiB,MAAQ/gE,EAAM,aAC/B+gE,EAAiB,OAAS/gE,EAAM,gBAIhC+gE,EAAiB,MAAQ/gE,EAAM,MAC/B+gE,EAAiB,OAAS/gE,EAAM,QAI1B+gE,CAER,CAIA,KAAK,oBAAsBmC,EAC3B,KAAK,kBAAoBD,EAEzB,KAAK,aAAeI,EACpB,KAAK,kBAAoBI,EACzB,KAAK,aAAeC,EACpB,KAAK,eAAiBC,EACtB,KAAK,eAAiBqD,GACtB,KAAK,kBAAoBE,GACzB,KAAK,yBAA2BG,EAChC,KAAK,8BAAgCI,EACrC,KAAK,uBAAyBZ,GAC9B,KAAK,wBAA0BZ,GAC/B,KAAK,mBAAqBG,CAE3B,CAEA,SAASwB,GAAY32E,EAAI0rB,EAAa,CAErC,SAASkrD,EAASn2D,EAAGnS,EAAaxQ,GAAe,CAEhD,IAAIkqD,EAEJ,MAAMgpB,EAAW/iE,GAAgB,YAAaK,CAAU,EAExD,GAAKmS,IAAMhnB,GAAmB,OAAOuG,EAAG,cACxC,GAAKygB,IAAMxmB,GAAwB,OAAO+F,EAAG,uBAC7C,GAAKygB,IAAMvmB,GAAwB,OAAO8F,EAAG,uBAC7C,GAAKygB,IAAMrmB,GAAsB,OAAO4F,EAAG,yBAC3C,GAAKygB,IAAMpmB,GAAwB,OAAO2F,EAAG,6BAE7C,GAAKygB,IAAM/mB,GAAW,OAAOsG,EAAG,KAChC,GAAKygB,IAAM9mB,GAAY,OAAOqG,EAAG,MACjC,GAAKygB,IAAM7mB,GAAoB,OAAOoG,EAAG,eACzC,GAAKygB,IAAM5mB,GAAU,OAAOmG,EAAG,IAC/B,GAAKygB,IAAM3mB,GAAkB,OAAOkG,EAAG,aACvC,GAAKygB,IAAM1mB,GAAY,OAAOiG,EAAG,MACjC,GAAKygB,IAAMzmB,GAAgB,OAAOgG,EAAG,WAErC,GAAKygB,IAAMnmB,GAAc,OAAO0F,EAAG,MACnC,GAAKygB,IAAMlmB,GAAY,OAAOyF,EAAG,IACjC,GAAKygB,IAAMjmB,GAAa,OAAOwF,EAAG,KAClC,GAAKygB,IAAMhmB,GAAc,OAAOuF,EAAG,gBACnC,GAAKygB,IAAM/lB,GAAqB,OAAOsF,EAAG,cAI1C,GAAKygB,IAAM9lB,GAAY,OAAOqF,EAAG,IACjC,GAAKygB,IAAM7lB,GAAmB,OAAOoF,EAAG,YACxC,GAAKygB,IAAM5lB,GAAW,OAAOmF,EAAG,GAChC,GAAKygB,IAAM3lB,GAAkB,OAAOkF,EAAG,WACvC,GAAKygB,IAAM1lB,GAAoB,OAAOiF,EAAG,aAIzC,GAAKygB,IAAMzlB,IAAwBylB,IAAMxlB,IAAyBwlB,IAAMvlB,IAAyBulB,IAAMtlB,GAEtG,GAAK61E,IAAa9yE,GAIjB,GAFA8pD,EAAYt8B,EAAW,IAAK,oCAAoC,EAE3Ds8B,IAAc,KAAO,CAEzB,GAAKvnC,IAAMzlB,GAAuB,OAAOgtD,EAAU,8BACnD,GAAKvnC,IAAMxlB,GAAwB,OAAO+sD,EAAU,oCACpD,GAAKvnC,IAAMvlB,GAAwB,OAAO8sD,EAAU,oCACpD,GAAKvnC,IAAMtlB,GAAwB,OAAO6sD,EAAU,mCAErD,KAEC,QAAO,aAMRA,EAAYt8B,EAAW,IAAK,+BAA+B,EAEtDs8B,IAAc,KAAO,CAEzB,GAAKvnC,IAAMzlB,GAAuB,OAAOgtD,EAAU,6BACnD,GAAKvnC,IAAMxlB,GAAwB,OAAO+sD,EAAU,8BACpD,GAAKvnC,IAAMvlB,GAAwB,OAAO8sD,EAAU,8BACpD,GAAKvnC,IAAMtlB,GAAwB,OAAO6sD,EAAU,6BAErD,KAEC,QAAO,KAUV,GAAKvnC,IAAMrlB,IAA2BqlB,IAAMplB,IAA2BolB,IAAMnlB,IAA4BmlB,IAAMllB,GAI9G,GAFAysD,EAAYt8B,EAAW,IAAK,gCAAgC,EAEvDs8B,IAAc,KAAO,CAEzB,GAAKvnC,IAAMrlB,GAA0B,OAAO4sD,EAAU,gCACtD,GAAKvnC,IAAMplB,GAA0B,OAAO2sD,EAAU,gCACtD,GAAKvnC,IAAMnlB,GAA2B,OAAO0sD,EAAU,iCACvD,GAAKvnC,IAAMllB,GAA2B,OAAOysD,EAAU,gCAExD,KAEC,QAAO,KAQT,GAAKvnC,IAAMjlB,IAAmBilB,IAAMhlB,IAAmBglB,IAAM/kB,GAI5D,GAFAssD,EAAYt8B,EAAW,IAAK,8BAA8B,EAErDs8B,IAAc,KAAO,CAEzB,GAAKvnC,IAAMjlB,IAAmBilB,IAAMhlB,GAAkB,OAASu1E,IAAa9yE,GAAiB8pD,EAAU,sBAAwBA,EAAU,qBACzI,GAAKvnC,IAAM/kB,GAAuB,OAASs1E,IAAa9yE,GAAiB8pD,EAAU,iCAAmCA,EAAU,yBAEjI,KAEC,QAAO,KAQT,GAAKvnC,IAAM9kB,IAAwB8kB,IAAM7kB,IAAwB6kB,IAAM5kB,IACtE4kB,IAAM3kB,IAAwB2kB,IAAM1kB,IAAwB0kB,IAAMzkB,IAClEykB,IAAMxkB,IAAwBwkB,IAAMvkB,IAAwBukB,IAAMtkB,IAClEskB,IAAMrkB,IAAyBqkB,IAAMpkB,IAAyBokB,IAAMnkB,IACpEmkB,IAAMlkB,IAA0BkkB,IAAMjkB,GAItC,GAFAwrD,EAAYt8B,EAAW,IAAK,+BAA+B,EAEtDs8B,IAAc,KAAO,CAEzB,GAAKvnC,IAAM9kB,GAAuB,OAASq1E,IAAa9yE,GAAiB8pD,EAAU,qCAAuCA,EAAU,6BACpI,GAAKvnC,IAAM7kB,GAAuB,OAASo1E,IAAa9yE,GAAiB8pD,EAAU,qCAAuCA,EAAU,6BACpI,GAAKvnC,IAAM5kB,GAAuB,OAASm1E,IAAa9yE,GAAiB8pD,EAAU,qCAAuCA,EAAU,6BACpI,GAAKvnC,IAAM3kB,GAAuB,OAASk1E,IAAa9yE,GAAiB8pD,EAAU,qCAAuCA,EAAU,6BACpI,GAAKvnC,IAAM1kB,GAAuB,OAASi1E,IAAa9yE,GAAiB8pD,EAAU,qCAAuCA,EAAU,6BACpI,GAAKvnC,IAAMzkB,GAAuB,OAASg1E,IAAa9yE,GAAiB8pD,EAAU,qCAAuCA,EAAU,6BACpI,GAAKvnC,IAAMxkB,GAAuB,OAAS+0E,IAAa9yE,GAAiB8pD,EAAU,qCAAuCA,EAAU,6BACpI,GAAKvnC,IAAMvkB,GAAuB,OAAS80E,IAAa9yE,GAAiB8pD,EAAU,qCAAuCA,EAAU,6BACpI,GAAKvnC,IAAMtkB,GAAwB,OAAS60E,IAAa9yE,GAAiB8pD,EAAU,sCAAwCA,EAAU,8BACtI,GAAKvnC,IAAMrkB,GAAwB,OAAS40E,IAAa9yE,GAAiB8pD,EAAU,sCAAwCA,EAAU,8BACtI,GAAKvnC,IAAMpkB,GAAwB,OAAS20E,IAAa9yE,GAAiB8pD,EAAU,sCAAwCA,EAAU,8BACtI,GAAKvnC,IAAMnkB,GAAyB,OAAS00E,IAAa9yE,GAAiB8pD,EAAU,uCAAyCA,EAAU,+BACxI,GAAKvnC,IAAMlkB,GAAyB,OAASy0E,IAAa9yE,GAAiB8pD,EAAU,uCAAyCA,EAAU,+BACxI,GAAKvnC,IAAMjkB,GAAyB,OAASw0E,IAAa9yE,GAAiB8pD,EAAU,uCAAyCA,EAAU,8BAEzI,KAEC,QAAO,KAQT,GAAKvnC,IAAMhkB,IAAoBgkB,IAAM/jB,IAA0B+jB,IAAM9jB,GAIpE,GAFAqrD,EAAYt8B,EAAW,IAAK,8BAA8B,EAErDs8B,IAAc,KAAO,CAEzB,GAAKvnC,IAAMhkB,GAAmB,OAASu0E,IAAa9yE,GAAiB8pD,EAAU,qCAAuCA,EAAU,+BAChI,GAAKvnC,IAAM/jB,GAAyB,OAAOsrD,EAAU,qCACrD,GAAKvnC,IAAM9jB,GAA2B,OAAOqrD,EAAU,sCAExD,KAEC,QAAO,KAQT,GAAKvnC,IAAM7jB,IAAoB6jB,IAAM5jB,IAA2B4jB,IAAM3jB,IAA0B2jB,IAAM1jB,GAIrG,GAFAirD,EAAYt8B,EAAW,IAAK,8BAA8B,EAErDs8B,IAAc,KAAO,CAEzB,GAAKvnC,IAAM7jB,GAAmB,OAAOorD,EAAU,yBAC/C,GAAKvnC,IAAM5jB,GAA0B,OAAOmrD,EAAU,gCACtD,GAAKvnC,IAAM3jB,GAAyB,OAAOkrD,EAAU,+BACrD,GAAKvnC,IAAM1jB,GAAgC,OAAOirD,EAAU,qCAE7D,KAEC,QAAO,KAQT,OAAKvnC,IAAMtmB,GAA4B6F,EAAG,kBAIjCA,EAAIygB,CAAC,IAAO,OAAczgB,EAAIygB,CAAC,EAAK,IAE9C,CAEA,MAAO,CAAE,QAASm2D,CAAO,CAE1B,CAEA,MAAMC,GAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,GAOpBC,GAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAwB5B,MAAMC,EAAkB,CAKvB,aAAc,CAOb,KAAK,QAAU,KAOf,KAAK,KAAO,KAOZ,KAAK,UAAY,EAOjB,KAAK,SAAW,CAEjB,CAQA,KAAMC,EAAWxR,EAAc,CAE9B,GAAK,KAAK,UAAY,KAAO,CAE5B,MAAMr0D,EAAU,IAAIwmB,GAAiBq/C,EAAU,OAAO,GAE/CA,EAAU,YAAcxR,EAAY,WAAiBwR,EAAU,WAAaxR,EAAY,YAE9F,KAAK,UAAYwR,EAAU,UAC3B,KAAK,SAAWA,EAAU,UAI3B,KAAK,QAAU7lE,CAEhB,CAED,CAQA,QAAS8lE,EAAW,CAEnB,GAAK,KAAK,UAAY,MAEhB,KAAK,OAAS,KAAO,CAEzB,MAAMhQ,EAAWgQ,EAAS,QAAS,CAAC,EAAG,SACjChvD,EAAW,IAAIwD,GAAgB,CACpC,aAAcorD,GACd,eAAgBC,GAChB,SAAU,CACT,WAAY,CAAE,MAAO,KAAK,OAAO,EACjC,WAAY,CAAE,MAAO7P,EAAS,CAAC,EAC/B,YAAa,CAAE,MAAOA,EAAS,CAAC,CACtC,CACA,CAAK,EAED,KAAK,KAAO,IAAIj/C,GAAM,IAAIohB,GAAe,GAAI,EAAE,EAAInhB,CAAQ,CAE5D,CAID,OAAO,KAAK,IAEb,CAKA,OAAQ,CAEP,KAAK,QAAU,KACf,KAAK,KAAO,IAEb,CAOA,iBAAkB,CAEjB,OAAO,KAAK,OAEb,CAED,CAWA,MAAMivD,WAAqB52E,EAAgB,CAQ1C,YAAa8qB,EAAUprB,EAAK,CAE3B,MAAK,EAEL,MAAMupB,EAAQ,KAEd,IAAI4tD,EAAU,KAEVC,EAAyB,EAEzB9oD,EAAiB,KACjB+oD,EAAqB,cAErBC,EAAY,EACZC,EAAuB,KAEvBC,EAAO,KACPC,EAAY,KACZC,EAAc,KACdC,EAAc,KACdC,EAAU,KAEd,MAAMC,EAAoB,OAAO,eAAmB,IAE9CC,EAAe,IAAIf,GACnBgB,EAAuB,CAAA,EACvBjzD,EAAa9kB,EAAG,qBAAoB,EAE1C,IAAIg4E,EAAsB,KACtBC,EAAkB,KAEtB,MAAMC,EAAc,CAAA,EACdC,EAAyB,CAAA,EAEzBC,EAAc,IAAI3zE,GACxB,IAAI4zE,EAAoB,KAIxB,MAAMC,EAAU,IAAIvsD,GACpBusD,EAAQ,SAAW,IAAI3nE,GAEvB,MAAM4nE,EAAU,IAAIxsD,GACpBwsD,EAAQ,SAAW,IAAI5nE,GAEvB,MAAMuc,EAAU,CAAEorD,EAASC,CAAO,EAE5BtB,EAAW,IAAI//B,GAErB,IAAIshC,EAAoB,KACpBC,EAAmB,KAUvB,KAAK,iBAAmB,GASxB,KAAK,QAAU,GASf,KAAK,aAAe,GAUpB,KAAK,cAAgB,SAAWprF,GAAQ,CAEvC,IAAI2mD,GAAakkC,EAAa7qF,EAAK,EAEnC,OAAK2mD,KAAe,SAEnBA,GAAa,IAAI/lB,GACjBiqD,EAAa7qF,EAAK,EAAK2mD,IAIjBA,GAAW,kBAAiB,CAEpC,EAiBA,KAAK,kBAAoB,SAAW3mD,GAAQ,CAE3C,IAAI2mD,GAAakkC,EAAa7qF,EAAK,EAEnC,OAAK2mD,KAAe,SAEnBA,GAAa,IAAI/lB,GACjBiqD,EAAa7qF,EAAK,EAAK2mD,IAIjBA,GAAW,aAAY,CAE/B,EAUA,KAAK,QAAU,SAAW3mD,GAAQ,CAEjC,IAAI2mD,GAAakkC,EAAa7qF,EAAK,EAEnC,OAAK2mD,KAAe,SAEnBA,GAAa,IAAI/lB,GACjBiqD,EAAa7qF,EAAK,EAAK2mD,IAIjBA,GAAW,aAAY,CAE/B,EAIA,SAAS0kC,EAAgBvsF,GAAQ,CAEhC,MAAMwsF,GAAkBR,EAAuB,QAAShsF,GAAM,WAAW,EAEzE,GAAKwsF,KAAoB,GAExB,OAID,MAAM3kC,GAAakkC,EAAaS,EAAe,EAE1C3kC,KAAe,SAEnBA,GAAW,OAAQ7nD,GAAM,YAAaA,GAAM,MAAOorF,GAAwBjpD,CAAc,EACzF0lB,GAAW,cAAe,CAAE,KAAM7nD,GAAM,KAAM,KAAMA,GAAM,YAAa,EAIzE,CAEA,SAASysF,GAAe,CAEvBzB,EAAQ,oBAAqB,SAAUuB,CAAc,EACrDvB,EAAQ,oBAAqB,cAAeuB,CAAc,EAC1DvB,EAAQ,oBAAqB,YAAauB,CAAc,EACxDvB,EAAQ,oBAAqB,UAAWuB,CAAc,EACtDvB,EAAQ,oBAAqB,eAAgBuB,CAAc,EAC3DvB,EAAQ,oBAAqB,aAAcuB,CAAc,EACzDvB,EAAQ,oBAAqB,MAAOyB,CAAY,EAChDzB,EAAQ,oBAAqB,qBAAsB0B,CAAoB,EAEvE,QAAU15E,GAAI,EAAGA,GAAI+4E,EAAY,OAAQ/4E,KAAO,CAE/C,MAAM+uB,GAAciqD,EAAwBh5E,EAAC,EAExC+uB,KAAgB,OAErBiqD,EAAwBh5E,EAAC,EAAK,KAE9B+4E,EAAa/4E,EAAC,EAAG,WAAY+uB,EAAW,EAEzC,CAEAsqD,EAAoB,KACpBC,EAAmB,KAEnBX,EAAa,MAAK,EAClB,UAAY5sF,MAAO6sF,EAElB,OAAOA,EAAsB7sF,EAAG,EAMjCkgC,EAAS,gBAAiB4sD,CAAmB,EAE7CL,EAAc,KACdD,EAAc,KACdD,EAAY,KACZN,EAAU,KACVc,EAAkB,KAIlBl6D,GAAU,KAAI,EAEdwL,EAAM,aAAe,GAErB6B,EAAS,cAAeitD,CAAiB,EACzCjtD,EAAS,QAASgtD,EAAY,MAAOA,EAAY,OAAQ,EAAK,EAE9D7uD,EAAM,cAAe,CAAE,KAAM,YAAY,CAAE,CAE5C,CASA,KAAK,0BAA4B,SAAWn+B,GAAQ,CAEnDgsF,EAAyBhsF,GAEpBm+B,EAAM,eAAiB,IAE3B3pB,GAAM,iEAAiE,CAIzE,EAYA,KAAK,sBAAwB,SAAWxU,GAAQ,CAE/CisF,EAAqBjsF,GAEhBm+B,EAAM,eAAiB,IAE3B3pB,GAAM,oEAAoE,CAI5E,EAOA,KAAK,kBAAoB,UAAY,CAEpC,OAAO23E,GAAwBjpD,CAEhC,EAOA,KAAK,kBAAoB,SAAWwqD,GAAQ,CAE3CvB,EAAuBuB,EAExB,EAUA,KAAK,aAAe,UAAY,CAE/B,OAAOpB,IAAgB,KAAOA,EAAcC,CAE7C,EAUA,KAAK,WAAa,UAAY,CAE7B,OAAKF,IAAc,MAAQI,IAE1BJ,EAAY,IAAI,eAAgBN,EAASn3E,CAAE,GAIrCy3E,CAER,EAOA,KAAK,SAAW,UAAY,CAE3B,OAAOG,CAER,EAOA,KAAK,WAAa,UAAY,CAE7B,OAAOT,CAER,EAWA,KAAK,WAAa,eAAiB/rF,GAAQ,CAI1C,GAFA+rF,EAAU/rF,GAEL+rF,IAAY,KAAO,CA2BvB,GAzBAa,EAAsB5sD,EAAS,gBAAe,EAE9C+rD,EAAQ,iBAAkB,SAAUuB,CAAc,EAClDvB,EAAQ,iBAAkB,cAAeuB,CAAc,EACvDvB,EAAQ,iBAAkB,YAAauB,CAAc,EACrDvB,EAAQ,iBAAkB,UAAWuB,CAAc,EACnDvB,EAAQ,iBAAkB,eAAgBuB,CAAc,EACxDvB,EAAQ,iBAAkB,aAAcuB,CAAc,EACtDvB,EAAQ,iBAAkB,MAAOyB,CAAY,EAC7CzB,EAAQ,iBAAkB,qBAAsB0B,CAAoB,EAE/D/zD,EAAW,eAAiB,IAEhC,MAAM9kB,EAAG,iBAAgB,EAI1Bq4E,EAAoBjtD,EAAS,cAAa,EAC1CA,EAAS,QAASgtD,CAAW,EAKNP,GAAqB,0BAA2B,eAAe,UAiC/E,CAEN,IAAIkB,GAAc,KACd5H,GAAY,KACZ6H,GAAgB,KAEfl0D,EAAW,QAEfk0D,GAAgBl0D,EAAW,QAAU9kB,EAAG,iBAAmBA,EAAG,kBAC9D+4E,GAAcj0D,EAAW,QAAUpqB,GAAqBD,GACxD02E,GAAYrsD,EAAW,QAAU3qB,GAAqBL,IAIvD,MAAMm/E,GAAsB,CAC3B,YAAaj5E,EAAG,MAChB,YAAag5E,GACb,YAAa5B,CACnB,EAEKK,EAAY,KAAK,WAAU,EAE3BC,EAAcD,EAAU,sBAAuBwB,EAAmB,EAElE9B,EAAQ,kBAAmB,CAAE,OAAQ,CAAEO,CAAW,CAAE,CAAE,EAEtDtsD,EAAS,cAAe,CAAC,EACzBA,EAAS,QAASssD,EAAY,aAAcA,EAAY,cAAe,EAAK,EAE5EO,EAAkB,IAAI1mE,GACrBmmE,EAAY,aACZA,EAAY,cACZ,CACC,OAAQl9E,GACR,KAAMf,GACN,aAAc,IAAIi+B,GAAcggD,EAAY,aAAcA,EAAY,cAAevG,GAAW,OAAW,OAAW,OAAW,OAAW,OAAW,OAAW4H,EAAW,EAC7K,cAAej0D,EAAW,QAC1B,WAAYsG,EAAS,iBACrB,QAAStG,EAAW,UAAY,EAAI,EACpC,mBAAsB4yD,EAAY,oBAAsB,GACxD,qBAAwBA,EAAY,oBAAsB,EACjE,CAAO,CAEH,KA1EwB,CAEvB,MAAMwB,GAAY,CACjB,UAAWp0D,EAAW,UACtB,MAAO,GACP,MAAOA,EAAW,MAClB,QAASA,EAAW,QACpB,uBAAwBsyD,CAC9B,EAEKO,EAAc,IAAI,aAAcR,EAASn3E,EAAIk5E,EAAS,EAEtD/B,EAAQ,kBAAmB,CAAE,UAAWQ,CAAW,CAAE,EAErDvsD,EAAS,cAAe,CAAC,EACzBA,EAAS,QAASusD,EAAY,iBAAkBA,EAAY,kBAAmB,EAAK,EAEpFM,EAAkB,IAAI1mE,GACrBomE,EAAY,iBACZA,EAAY,kBACZ,CACC,OAAQn9E,GACR,KAAMf,GACN,WAAY2xB,EAAS,iBACrB,cAAetG,EAAW,QAC1B,mBAAsB6yD,EAAY,oBAAsB,GACxD,qBAAwBA,EAAY,oBAAsB,EAEjE,CACA,CAEI,CA6CAM,EAAgB,iBAAmB,GAEnC,KAAK,aAAcX,CAAS,EAE5BC,EAAuB,KACvBjpD,EAAiB,MAAM6oD,EAAQ,sBAAuBE,CAAkB,EAExEt5D,GAAU,WAAYo5D,CAAO,EAC7Bp5D,GAAU,MAAK,EAEfwL,EAAM,aAAe,GAErBA,EAAM,cAAe,CAAE,KAAM,cAAc,CAAE,CAE9C,CAED,EAOA,KAAK,wBAA0B,UAAY,CAE1C,GAAK4tD,IAAY,KAEhB,OAAOA,EAAQ,oBAIjB,EASA,KAAK,gBAAkB,UAAY,CAElC,OAAOW,EAAa,gBAAe,CAEpC,EAEA,SAASe,EAAsB1sF,GAAQ,CAItC,QAAUgT,GAAI,EAAGA,GAAIhT,GAAM,QAAQ,OAAQgT,KAAO,CAEjD,MAAM+uB,GAAc/hC,GAAM,QAASgT,EAAC,EAC9B9R,GAAQ8qF,EAAuB,QAASjqD,EAAW,EAEpD7gC,IAAS,IAEb8qF,EAAwB9qF,EAAK,EAAK,KAClC6qF,EAAa7qF,EAAK,EAAG,WAAY6gC,EAAW,EAI9C,CAIA,QAAU/uB,GAAI,EAAGA,GAAIhT,GAAM,MAAM,OAAQgT,KAAO,CAE/C,MAAM+uB,GAAc/hC,GAAM,MAAOgT,EAAC,EAElC,IAAIw5E,GAAkBR,EAAuB,QAASjqD,EAAW,EAEjE,GAAKyqD,KAAoB,GAAK,CAI7B,QAAUx5E,GAAI,EAAGA,GAAI+4E,EAAY,OAAQ/4E,KAExC,GAAKA,IAAKg5E,EAAuB,OAAS,CAEzCA,EAAuB,KAAMjqD,EAAW,EACxCyqD,GAAkBx5E,GAClB,KAED,SAAYg5E,EAAwBh5E,EAAC,IAAO,KAAO,CAElDg5E,EAAwBh5E,EAAC,EAAK+uB,GAC9ByqD,GAAkBx5E,GAClB,KAED,CAMD,GAAKw5E,KAAoB,GAAK,KAE/B,CAEA,MAAM3kC,GAAakkC,EAAaS,EAAe,EAE1C3kC,IAEJA,GAAW,QAAS9lB,EAAW,CAIjC,CAED,CAIA,MAAMirD,EAAa,IAAIlwE,EACjBmwE,EAAa,IAAInwE,EAYvB,SAASowE,GAAwBxvE,GAAQyuE,GAASC,GAAU,CAE3DY,EAAW,sBAAuBb,GAAQ,WAAW,EACrDc,EAAW,sBAAuBb,GAAQ,WAAW,EAErD,MAAMe,GAAMH,EAAW,WAAYC,CAAU,EAEvCG,GAAQjB,GAAQ,iBAAiB,SACjCkB,GAAQjB,GAAQ,iBAAiB,SAKjCn9D,GAAOm+D,GAAO,EAAE,GAAOA,GAAO,EAAE,EAAK,GACrCl+D,GAAMk+D,GAAO,EAAE,GAAOA,GAAO,EAAE,EAAK,GACpCE,GAAWF,GAAO,CAAC,EAAK,GAAMA,GAAO,CAAC,EACtCG,GAAcH,GAAO,CAAC,EAAK,GAAMA,GAAO,CAAC,EAEzCI,GAAYJ,GAAO,CAAC,EAAK,GAAMA,GAAO,CAAC,EACvCK,GAAaJ,GAAO,CAAC,EAAK,GAAMA,GAAO,CAAC,EACxChmF,EAAO4nB,GAAOu+D,EACdz+D,EAAQE,GAAOw+D,EAIfC,GAAUP,IAAQ,CAAEK,EAAUC,GAC9BE,EAAUD,GAAU,CAAEF,EAU5B,GAPArB,GAAQ,YAAY,UAAWzuE,GAAO,SAAUA,GAAO,WAAYA,GAAO,KAAK,EAC/EA,GAAO,WAAYiwE,CAAO,EAC1BjwE,GAAO,WAAYgwE,EAAO,EAC1BhwE,GAAO,YAAY,QAASA,GAAO,SAAUA,GAAO,WAAYA,GAAO,KAAK,EAC5EA,GAAO,mBAAmB,KAAMA,GAAO,WAAW,EAAG,OAAM,EAGtD0vE,GAAO,EAAE,IAAO,GAKpB1vE,GAAO,iBAAiB,KAAMyuE,GAAQ,gBAAgB,EACtDzuE,GAAO,wBAAwB,KAAMyuE,GAAQ,uBAAuB,MAE9D,CAKN,MAAMyB,EAAQ3+D,GAAOy+D,GACfG,EAAO3+D,GAAMw+D,GACbI,EAAQzmF,EAAOsmF,EACfI,EAASh/D,GAAUo+D,GAAMQ,GACzBK,EAAOV,EAASp+D,GAAM2+D,EAAOD,EAC7BK,GAAUV,EAAYr+D,GAAM2+D,EAAOD,EAEzClwE,GAAO,iBAAiB,gBAAiBowE,EAAOC,EAAQC,EAAMC,GAASL,EAAOC,CAAI,EAClFnwE,GAAO,wBAAwB,KAAMA,GAAO,gBAAgB,EAAG,OAAM,CAEtE,CAED,CAEA,SAASwwE,EAAcxwE,GAAQqT,GAAS,CAElCA,KAAW,KAEfrT,GAAO,YAAY,KAAMA,GAAO,MAAM,EAItCA,GAAO,YAAY,iBAAkBqT,GAAO,YAAarT,GAAO,MAAM,EAIvEA,GAAO,mBAAmB,KAAMA,GAAO,WAAW,EAAG,OAAM,CAE5D,CAWA,KAAK,aAAe,SAAWA,GAAS,CAEvC,GAAKstE,IAAY,KAAO,OAExB,IAAImD,GAAYzwE,GAAO,KACnB0wE,GAAW1wE,GAAO,IAEjBiuE,EAAa,UAAY,OAExBA,EAAa,UAAY,IAAIwC,GAAYxC,EAAa,WACtDA,EAAa,SAAW,IAAIyC,GAAWzC,EAAa,WAI1Db,EAAS,KAAOsB,EAAQ,KAAOD,EAAQ,KAAOgC,GAC9CrD,EAAS,IAAMsB,EAAQ,IAAMD,EAAQ,IAAMiC,IAEtC/B,IAAsBvB,EAAS,MAAQwB,IAAqBxB,EAAS,OAIzEE,EAAQ,kBAAmB,CAC1B,UAAWF,EAAS,KACpB,SAAUA,EAAS,GACxB,CAAK,EAEDuB,EAAoBvB,EAAS,KAC7BwB,EAAmBxB,EAAS,KAK7BA,EAAS,OAAO,KAAOptE,GAAO,OAAO,KAAO,EAC5CyuE,EAAQ,OAAO,KAAOrB,EAAS,OAAO,KAAO,EAC7CsB,EAAQ,OAAO,KAAOtB,EAAS,OAAO,KAAO,EAE7C,MAAM/5D,GAASrT,GAAO,OAChBqjB,GAAU+pD,EAAS,QAEzBoD,EAAcpD,EAAU/5D,EAAM,EAE9B,QAAU/d,GAAI,EAAGA,GAAI+tB,GAAQ,OAAQ/tB,KAEpCk7E,EAAcntD,GAAS/tB,EAAC,EAAI+d,EAAM,EAM9BgQ,GAAQ,SAAW,EAEvBmsD,GAAwBpC,EAAUqB,EAASC,CAAO,EAMlDtB,EAAS,iBAAiB,KAAMqB,EAAQ,gBAAgB,EAMzDkC,EAAkB3wE,GAAQotE,EAAU/5D,EAAM,CAE3C,EAEA,SAASs9D,EAAkB3wE,GAAQotE,GAAU/5D,GAAS,CAEhDA,KAAW,KAEfrT,GAAO,OAAO,KAAMotE,GAAS,WAAW,GAIxCptE,GAAO,OAAO,KAAMqT,GAAO,WAAW,EACtCrT,GAAO,OAAO,OAAM,EACpBA,GAAO,OAAO,SAAUotE,GAAS,WAAW,GAI7CptE,GAAO,OAAO,UAAWA,GAAO,SAAUA,GAAO,WAAYA,GAAO,KAAK,EACzEA,GAAO,kBAAmB,EAAI,EAE9BA,GAAO,iBAAiB,KAAMotE,GAAS,gBAAgB,EACvDptE,GAAO,wBAAwB,KAAMotE,GAAS,uBAAuB,EAEhEptE,GAAO,sBAEXA,GAAO,IAAMjJ,GAAU,EAAI,KAAK,KAAM,EAAIiJ,GAAO,iBAAiB,SAAU,CAAC,CAAE,EAC/EA,GAAO,KAAO,EAIhB,CAYA,KAAK,UAAY,UAAY,CAE5B,OAAOotE,CAER,EAOA,KAAK,aAAe,UAAY,CAE/B,GAAK,EAAAS,IAAgB,MAAQC,IAAgB,MAM7C,OAAOL,CAER,EAQA,KAAK,aAAe,SAAWlsF,GAAQ,CAKtCksF,EAAYlsF,GAEPssF,IAAgB,OAEpBA,EAAY,eAAiBtsF,IAIzBusF,IAAgB,MAAQA,EAAY,iBAAmB,SAE3DA,EAAY,eAAiBvsF,GAI/B,EAOA,KAAK,gBAAkB,UAAY,CAElC,OAAO0sF,EAAa,UAAY,IAEjC,EASA,KAAK,oBAAsB,UAAY,CAEtC,OAAOA,EAAa,QAASb,CAAQ,CAEtC,EASA,KAAK,iBAAmB,SAAWwD,GAAW,CAE7C,OAAO1C,EAAsB0C,EAAQ,CAEtC,EAIA,IAAIC,GAA2B,KAE/B,SAASn/B,GAAkB5M,GAAMtgB,GAAQ,CAKxC,GAHAmpD,EAAOnpD,GAAM,cAAekpD,GAAwBjpD,CAAc,EAClEspD,EAAUvpD,GAELmpD,IAAS,KAAO,CAEpB,MAAMmD,GAAQnD,EAAK,MAEdG,IAAgB,OAEpBvsD,EAAS,2BAA4B6sD,EAAiBN,EAAY,WAAW,EAC7EvsD,EAAS,gBAAiB6sD,CAAe,GAI1C,IAAI2C,GAAsB,GAIrBD,GAAM,SAAW1D,EAAS,QAAQ,SAEtCA,EAAS,QAAQ,OAAS,EAC1B2D,GAAsB,IAIvB,QAAUz7E,GAAI,EAAGA,GAAIw7E,GAAM,OAAQx7E,KAAO,CAEzC,MAAMqtB,EAAOmuD,GAAOx7E,EAAC,EAErB,IAAI8nE,EAAW,KAEf,GAAK0Q,IAAgB,KAEpB1Q,EAAW0Q,EAAY,YAAanrD,CAAI,MAElC,CAEN,MAAMquD,EAAapD,EAAU,gBAAiBC,EAAalrD,CAAI,EAC/Dy6C,EAAW4T,EAAW,SAGjB17E,KAAM,IAEVisB,EAAS,wBACR6sD,EACA4C,EAAW,aACXA,EAAW,mBAAmB,EAE/BzvD,EAAS,gBAAiB6sD,CAAe,EAI3C,CAEA,IAAIpuE,EAASqjB,EAAS/tB,EAAC,EAElB0K,IAAW,SAEfA,EAAS,IAAIkiB,GACbliB,EAAO,OAAO,OAAQ1K,EAAC,EACvB0K,EAAO,SAAW,IAAI8G,GACtBuc,EAAS/tB,EAAC,EAAK0K,GAIhBA,EAAO,OAAO,UAAW2iB,EAAK,UAAU,MAAM,EAC9C3iB,EAAO,OAAO,UAAWA,EAAO,SAAUA,EAAO,WAAYA,EAAO,KAAK,EACzEA,EAAO,iBAAiB,UAAW2iB,EAAK,gBAAgB,EACxD3iB,EAAO,wBAAwB,KAAMA,EAAO,gBAAgB,EAAG,OAAM,EACrEA,EAAO,SAAS,IAAKo9D,EAAS,EAAGA,EAAS,EAAGA,EAAS,MAAOA,EAAS,MAAM,EAEvE9nE,KAAM,IAEV83E,EAAS,OAAO,KAAMptE,EAAO,MAAM,EACnCotE,EAAS,OAAO,UAAWA,EAAS,SAAUA,EAAS,WAAYA,EAAS,KAAK,GAI7E2D,KAAwB,IAE5B3D,EAAS,QAAQ,KAAMptE,CAAM,CAI/B,CAIA,MAAMixE,GAAkB3D,EAAQ,gBAKhC,GAJ+B2D,IAC9BA,GAAgB,SAAU,eAAe,GACzC3D,EAAQ,YAAc,iBAEQU,EAAoB,CAElDJ,EAAYluD,EAAM,WAAU,EAE5B,MAAMytD,GAAYS,EAAU,oBAAqBkD,GAAO,CAAC,CAAE,EAEtD3D,IAAaA,GAAU,SAAWA,GAAU,SAEhDc,EAAa,KAAMd,GAAWG,EAAQ,WAAW,CAInD,CAKA,GAH4B2D,IACxBA,GAAgB,SAAU,eAAe,GAEjBjD,EAAoB,CAE/CzsD,EAAS,MAAM,cAAa,EAE5BqsD,EAAYluD,EAAM,WAAU,EAE5B,QAAUpqB,GAAI,EAAGA,GAAIw7E,GAAM,OAAQx7E,KAAO,CAEzC,MAAM0K,EAAS8wE,GAAOx7E,EAAC,EAAG,OAE1B,GAAK0K,EAAS,CAEb,IAAIkxE,EAAYhD,EAAsBluE,CAAM,EAErCkxE,IAENA,EAAY,IAAIpjD,GAChBogD,EAAsBluE,CAAM,EAAKkxE,GAIlC,MAAMC,EAAYvD,EAAU,eAAgB5tE,CAAM,EAClDkxE,EAAU,cAAgBC,CAE3B,CAED,CAED,CAED,CAIA,QAAU77E,GAAI,EAAGA,GAAI+4E,EAAY,OAAQ/4E,KAAO,CAE/C,MAAM+uB,GAAciqD,EAAwBh5E,EAAC,EACvC60C,GAAakkC,EAAa/4E,EAAC,EAE5B+uB,KAAgB,MAAQ8lB,KAAe,QAE3CA,GAAW,OAAQ9lB,GAAaG,GAAOkpD,GAAwBjpD,CAAc,CAI/E,CAEKosD,IAA2BA,GAA0B/rC,GAAMtgB,EAAK,EAEhEA,GAAM,gBAEV9E,EAAM,cAAe,CAAE,KAAM,iBAAkB,KAAM8E,GAAO,EAI7DupD,EAAU,IAEX,CAEA,MAAM75D,GAAY,IAAIo9B,GAEtBp9B,GAAU,iBAAkBw9B,EAAgB,EAE5C,KAAK,iBAAmB,SAAWvyC,GAAW,CAE7C0xE,GAA2B1xE,EAE5B,EAEA,KAAK,QAAU,UAAY,CAAC,CAE7B,CAED,CAEA,MAAMiyE,GAAoB,IAAIv/D,GACxBqI,GAAoB,IAAI3M,GAE9B,SAAS8jE,GAAgB9vD,EAAUs+B,EAAa,CAE/C,SAASyxB,EAAyBtZ,EAAK7X,EAAU,CAE3C6X,EAAI,mBAAqB,IAE7BA,EAAI,aAAY,EAIjB7X,EAAQ,MAAM,KAAM6X,EAAI,MAAM,CAE/B,CAEA,SAASuZ,EAAoBpwD,EAAUqzC,EAAM,CAE5CA,EAAI,MAAM,OAAQrzC,EAAS,SAAS,MAAOG,GAA2BC,EAAU,EAE3EizC,EAAI,OAERrzC,EAAS,QAAQ,MAAQqzC,EAAI,KAC7BrzC,EAAS,OAAO,MAAQqzC,EAAI,KAEjBA,EAAI,YAEfrzC,EAAS,WAAW,MAAQqzC,EAAI,QAIlC,CAEA,SAASgd,EAAyBrwD,EAAU/C,EAAUqzD,EAAYhpF,EAAQipF,EAA2B,CAE/FtzD,EAAS,qBAIFA,EAAS,sBAFpBuzD,EAAuBxwD,EAAU/C,CAAQ,EAM9BA,EAAS,oBAEpBuzD,EAAuBxwD,EAAU/C,CAAQ,EACzCwzD,EAAqBzwD,EAAU/C,CAAQ,GAE5BA,EAAS,qBAEpBuzD,EAAuBxwD,EAAU/C,CAAQ,EACzCyzD,EAAsB1wD,EAAU/C,CAAQ,GAE7BA,EAAS,wBAEpBuzD,EAAuBxwD,EAAU/C,CAAQ,EACzC0zD,EAAyB3wD,EAAU/C,CAAQ,EAEtCA,EAAS,wBAEb2zD,EAAyB5wD,EAAU/C,EAAUszD,CAAwB,GAI3DtzD,EAAS,sBAEpBuzD,EAAuBxwD,EAAU/C,CAAQ,EACzC4zD,EAAuB7wD,EAAU/C,CAAQ,GAE9BA,EAAS,oBAEpBuzD,EAAuBxwD,EAAU/C,CAAQ,EAE9BA,EAAS,wBAEpBuzD,EAAuBxwD,EAAU/C,CAAQ,EACzC6zD,EAAyB9wD,EAAU/C,CAAQ,GAEhCA,EAAS,qBAEpBuzD,EAAuBxwD,EAAU/C,CAAQ,EAE9BA,EAAS,qBAEpB8zD,EAAqB/wD,EAAU/C,CAAQ,EAElCA,EAAS,sBAEb+zD,EAAqBhxD,EAAU/C,CAAQ,GAI7BA,EAAS,iBAEpBg0D,EAAuBjxD,EAAU/C,EAAUqzD,EAAYhpF,CAAM,EAElD21B,EAAS,iBAEpBi0D,EAAwBlxD,EAAU/C,CAAQ,EAE/BA,EAAS,kBAEpB+C,EAAS,MAAM,MAAM,KAAM/C,EAAS,KAAK,EACzC+C,EAAS,QAAQ,MAAQ/C,EAAS,SAEvBA,EAAS,mBAEpBA,EAAS,mBAAqB,GAIhC,CAEA,SAASuzD,EAAuBxwD,EAAU/C,EAAW,CAEpD+C,EAAS,QAAQ,MAAQ/C,EAAS,QAE7BA,EAAS,OAEb+C,EAAS,QAAQ,MAAM,KAAM/C,EAAS,KAAK,EAIvCA,EAAS,UAEb+C,EAAS,SAAS,MAAM,KAAM/C,EAAS,UAAW,eAAgBA,EAAS,iBAAiB,EAIxFA,EAAS,MAEb+C,EAAS,IAAI,MAAQ/C,EAAS,IAE9BkzD,EAAyBlzD,EAAS,IAAK+C,EAAS,YAAY,GAIxD/C,EAAS,WAEb+C,EAAS,SAAS,MAAQ/C,EAAS,SAEnCkzD,EAAyBlzD,EAAS,SAAU+C,EAAS,iBAAiB,GAIlE/C,EAAS,UAEb+C,EAAS,QAAQ,MAAQ/C,EAAS,QAElCkzD,EAAyBlzD,EAAS,QAAS+C,EAAS,gBAAgB,EAEpEA,EAAS,UAAU,MAAQ/C,EAAS,UAE/BA,EAAS,OAASxyB,KAEtBu1B,EAAS,UAAU,OAAS,KAMzB/C,EAAS,YAEb+C,EAAS,UAAU,MAAQ/C,EAAS,UAEpCkzD,EAAyBlzD,EAAS,UAAW+C,EAAS,kBAAkB,EAExEA,EAAS,YAAY,MAAM,KAAM/C,EAAS,WAAW,EAEhDA,EAAS,OAASxyB,IAEtBu1B,EAAS,YAAY,MAAM,OAAM,GAM9B/C,EAAS,kBAEb+C,EAAS,gBAAgB,MAAQ/C,EAAS,gBAE1CkzD,EAAyBlzD,EAAS,gBAAiB+C,EAAS,wBAAwB,EAEpFA,EAAS,kBAAkB,MAAQ/C,EAAS,kBAC5C+C,EAAS,iBAAiB,MAAQ/C,EAAS,kBAIvCA,EAAS,cAEb+C,EAAS,YAAY,MAAQ/C,EAAS,YAEtCkzD,EAAyBlzD,EAAS,YAAa+C,EAAS,oBAAoB,GAIxE/C,EAAS,cAEb+C,EAAS,YAAY,MAAQ/C,EAAS,YAEtCkzD,EAAyBlzD,EAAS,YAAa+C,EAAS,oBAAoB,GAIxE/C,EAAS,UAAY,IAEzB+C,EAAS,UAAU,MAAQ/C,EAAS,WAIrC,MAAMsiC,EAAqBb,EAAW,IAAKzhC,CAAQ,EAE7Cs2C,EAAShU,EAAmB,OAC5B4xB,EAAiB5xB,EAAmB,eAErCgU,IAEJvzC,EAAS,OAAO,MAAQuzC,EAExB0c,GAAI,KAAMkB,CAAc,EAGxBlB,GAAI,GAAK,GAAIA,GAAI,GAAK,GAAIA,GAAI,GAAK,GAE9B1c,EAAO,eAAiBA,EAAO,wBAA0B,KAG7D0c,GAAI,GAAK,GACTA,GAAI,GAAK,IAIVjwD,EAAS,eAAe,MAAM,eAAgBjH,GAAI,sBAAuBk3D,GAAK,EAE9EjwD,EAAS,WAAW,MAAUuzC,EAAO,eAAiBA,EAAO,wBAA0B,GAAU,GAAK,EAEtGvzC,EAAS,aAAa,MAAQ/C,EAAS,aACvC+C,EAAS,IAAI,MAAQ/C,EAAS,IAC9B+C,EAAS,gBAAgB,MAAQ/C,EAAS,iBAItCA,EAAS,WAEb+C,EAAS,SAAS,MAAQ/C,EAAS,SACnC+C,EAAS,kBAAkB,MAAQ/C,EAAS,kBAE5CkzD,EAAyBlzD,EAAS,SAAU+C,EAAS,iBAAiB,GAIlE/C,EAAS,QAEb+C,EAAS,MAAM,MAAQ/C,EAAS,MAChC+C,EAAS,eAAe,MAAQ/C,EAAS,eAEzCkzD,EAAyBlzD,EAAS,MAAO+C,EAAS,cAAc,EAIlE,CAEA,SAAS+wD,EAAqB/wD,EAAU/C,EAAW,CAElD+C,EAAS,QAAQ,MAAM,KAAM/C,EAAS,KAAK,EAC3C+C,EAAS,QAAQ,MAAQ/C,EAAS,QAE7BA,EAAS,MAEb+C,EAAS,IAAI,MAAQ/C,EAAS,IAE9BkzD,EAAyBlzD,EAAS,IAAK+C,EAAS,YAAY,EAI9D,CAEA,SAASgxD,EAAqBhxD,EAAU/C,EAAW,CAElD+C,EAAS,SAAS,MAAQ/C,EAAS,SACnC+C,EAAS,UAAU,MAAQ/C,EAAS,SAAWA,EAAS,QACxD+C,EAAS,MAAM,MAAQ/C,EAAS,KAEjC,CAEA,SAASg0D,EAAuBjxD,EAAU/C,EAAUqzD,EAAYhpF,EAAS,CAExE04B,EAAS,QAAQ,MAAM,KAAM/C,EAAS,KAAK,EAC3C+C,EAAS,QAAQ,MAAQ/C,EAAS,QAClC+C,EAAS,KAAK,MAAQ/C,EAAS,KAAOqzD,EACtCtwD,EAAS,MAAM,MAAQ14B,EAAS,GAE3B21B,EAAS,MAEb+C,EAAS,IAAI,MAAQ/C,EAAS,IAE9BkzD,EAAyBlzD,EAAS,IAAK+C,EAAS,WAAW,GAIvD/C,EAAS,WAEb+C,EAAS,SAAS,MAAQ/C,EAAS,SAEnCkzD,EAAyBlzD,EAAS,SAAU+C,EAAS,iBAAiB,GAIlE/C,EAAS,UAAY,IAEzB+C,EAAS,UAAU,MAAQ/C,EAAS,UAItC,CAEA,SAASi0D,EAAwBlxD,EAAU/C,EAAW,CAErD+C,EAAS,QAAQ,MAAM,KAAM/C,EAAS,KAAK,EAC3C+C,EAAS,QAAQ,MAAQ/C,EAAS,QAClC+C,EAAS,SAAS,MAAQ/C,EAAS,SAE9BA,EAAS,MAEb+C,EAAS,IAAI,MAAQ/C,EAAS,IAE9BkzD,EAAyBlzD,EAAS,IAAK+C,EAAS,YAAY,GAIxD/C,EAAS,WAEb+C,EAAS,SAAS,MAAQ/C,EAAS,SAEnCkzD,EAAyBlzD,EAAS,SAAU+C,EAAS,iBAAiB,GAIlE/C,EAAS,UAAY,IAEzB+C,EAAS,UAAU,MAAQ/C,EAAS,UAItC,CAEA,SAASyzD,EAAsB1wD,EAAU/C,EAAW,CAEnD+C,EAAS,SAAS,MAAM,KAAM/C,EAAS,QAAQ,EAC/C+C,EAAS,UAAU,MAAQ,KAAK,IAAK/C,EAAS,UAAW,KAE1D,CAEA,SAASwzD,EAAqBzwD,EAAU/C,EAAW,CAE7CA,EAAS,cAEb+C,EAAS,YAAY,MAAQ/C,EAAS,YAIxC,CAEA,SAAS0zD,EAAyB3wD,EAAU/C,EAAW,CAEtD+C,EAAS,UAAU,MAAQ/C,EAAS,UAE/BA,EAAS,eAEb+C,EAAS,aAAa,MAAQ/C,EAAS,aAEvCkzD,EAAyBlzD,EAAS,aAAc+C,EAAS,qBAAqB,GAI/EA,EAAS,UAAU,MAAQ/C,EAAS,UAE/BA,EAAS,eAEb+C,EAAS,aAAa,MAAQ/C,EAAS,aAEvCkzD,EAAyBlzD,EAAS,aAAc+C,EAAS,qBAAqB,GAI1E/C,EAAS,SAIb+C,EAAS,gBAAgB,MAAQ/C,EAAS,gBAI5C,CAEA,SAAS2zD,EAAyB5wD,EAAU/C,EAAUszD,EAA2B,CAEhFvwD,EAAS,IAAI,MAAQ/C,EAAS,IAEzBA,EAAS,MAAQ,IAErB+C,EAAS,WAAW,MAAM,KAAM/C,EAAS,YAAa,eAAgBA,EAAS,KAAK,EAEpF+C,EAAS,eAAe,MAAQ/C,EAAS,eAEpCA,EAAS,gBAEb+C,EAAS,cAAc,MAAQ/C,EAAS,cAExCkzD,EAAyBlzD,EAAS,cAAe+C,EAAS,sBAAsB,GAI5E/C,EAAS,oBAEb+C,EAAS,kBAAkB,MAAQ/C,EAAS,kBAE5CkzD,EAAyBlzD,EAAS,kBAAmB+C,EAAS,0BAA0B,IAMrF/C,EAAS,UAAY,IAEzB+C,EAAS,UAAU,MAAQ/C,EAAS,UACpC+C,EAAS,mBAAmB,MAAQ/C,EAAS,mBAExCA,EAAS,eAEb+C,EAAS,aAAa,MAAQ/C,EAAS,aAEvCkzD,EAAyBlzD,EAAS,aAAc+C,EAAS,qBAAqB,GAI1E/C,EAAS,wBAEb+C,EAAS,sBAAsB,MAAQ/C,EAAS,sBAEhDkzD,EAAyBlzD,EAAS,sBAAuB+C,EAAS,8BAA8B,GAI5F/C,EAAS,qBAEb+C,EAAS,mBAAmB,MAAQ/C,EAAS,mBAE7CkzD,EAAyBlzD,EAAS,mBAAoB+C,EAAS,2BAA2B,EAE1FA,EAAS,qBAAqB,MAAM,KAAM/C,EAAS,oBAAoB,EAElEA,EAAS,OAASxyB,IAEtBu1B,EAAS,qBAAqB,MAAM,OAAM,IAQxC/C,EAAS,WAAa,IAE1B+C,EAAS,WAAW,MAAQ/C,EAAS,YAIjCA,EAAS,YAAc,IAE3B+C,EAAS,YAAY,MAAQ/C,EAAS,YACtC+C,EAAS,eAAe,MAAQ/C,EAAS,eACzC+C,EAAS,4BAA4B,MAAQ/C,EAAS,0BAA2B,CAAC,EAClF+C,EAAS,4BAA4B,MAAQ/C,EAAS,0BAA2B,CAAC,EAE7EA,EAAS,iBAEb+C,EAAS,eAAe,MAAQ/C,EAAS,eAEzCkzD,EAAyBlzD,EAAS,eAAgB+C,EAAS,uBAAuB,GAI9E/C,EAAS,0BAEb+C,EAAS,wBAAwB,MAAQ/C,EAAS,wBAElDkzD,EAAyBlzD,EAAS,wBAAyB+C,EAAS,gCAAgC,IAMjG/C,EAAS,aAAe,IAE5B+C,EAAS,aAAa,MAAQ/C,EAAS,aACvC+C,EAAS,uBAAuB,MAAQuwD,EAAyB,QACjEvwD,EAAS,wBAAwB,MAAM,IAAKuwD,EAAyB,MAAOA,EAAyB,MAAM,EAEtGtzD,EAAS,kBAEb+C,EAAS,gBAAgB,MAAQ/C,EAAS,gBAE1CkzD,EAAyBlzD,EAAS,gBAAiB+C,EAAS,wBAAwB,GAIrFA,EAAS,UAAU,MAAQ/C,EAAS,UAE/BA,EAAS,eAEb+C,EAAS,aAAa,MAAQ/C,EAAS,aAEvCkzD,EAAyBlzD,EAAS,aAAc+C,EAAS,qBAAqB,GAI/EA,EAAS,oBAAoB,MAAQ/C,EAAS,oBAC9C+C,EAAS,iBAAiB,MAAM,KAAM/C,EAAS,gBAAgB,GAI3DA,EAAS,WAAa,IAE1B+C,EAAS,iBAAiB,MAAM,IAAK/C,EAAS,WAAa,KAAK,IAAKA,EAAS,kBAAkB,EAAIA,EAAS,WAAa,KAAK,IAAKA,EAAS,mBAAoB,EAE5JA,EAAS,gBAEb+C,EAAS,cAAc,MAAQ/C,EAAS,cAExCkzD,EAAyBlzD,EAAS,cAAe+C,EAAS,sBAAsB,IAMlFA,EAAS,kBAAkB,MAAQ/C,EAAS,kBAC5C+C,EAAS,cAAc,MAAM,KAAM/C,EAAS,aAAa,EAEpDA,EAAS,mBAEb+C,EAAS,iBAAiB,MAAQ/C,EAAS,iBAE3CkzD,EAAyBlzD,EAAS,iBAAkB+C,EAAS,yBAAyB,GAIlF/C,EAAS,uBAEb+C,EAAS,qBAAqB,MAAQ/C,EAAS,qBAE/CkzD,EAAyBlzD,EAAS,qBAAsB+C,EAAS,6BAA6B,EAIhG,CAEA,SAAS6wD,EAAuB7wD,EAAU/C,EAAW,CAE/CA,EAAS,SAEb+C,EAAS,OAAO,MAAQ/C,EAAS,OAInC,CAEA,SAAS6zD,EAAyB9wD,EAAU/C,EAAW,CAEtD,MAAMqtB,EAAQoU,EAAW,IAAKzhC,CAAQ,EAAG,MAEzC+C,EAAS,kBAAkB,MAAM,sBAAuBsqB,EAAM,WAAW,EACzEtqB,EAAS,aAAa,MAAQsqB,EAAM,OAAO,OAAO,KAClDtqB,EAAS,YAAY,MAAQsqB,EAAM,OAAO,OAAO,GAElD,CAEA,MAAO,CACN,mBAAoB8lC,EACpB,wBAAyBC,CAC3B,CAEA,CAEA,SAASe,GAAqBp8E,EAAIud,EAAMq0C,EAActO,EAAQ,CAE7D,IAAI7H,EAAU,CAAA,EACV4gC,EAAa,CAAA,EACbC,EAAyB,CAAA,EAE7B,MAAMC,EAAmBv8E,EAAG,aAAcA,EAAG,2BAA2B,EAExE,SAASw8E,EAAMjN,EAAevqB,EAAU,CAEvC,MAAMy3B,EAAez3B,EAAQ,QAC7B1B,EAAM,oBAAqBisB,EAAekN,CAAY,CAEvD,CAEA,SAAS71E,EAAQ2oE,EAAevqB,EAAU,CAEzC,IAAI1iC,EAASm5B,EAAS8zB,EAAc,EAAE,EAEjCjtD,IAAW,SAEfo6D,EAAsBnN,CAAa,EAEnCjtD,EAASo5B,EAAc6zB,CAAa,EACpC9zB,EAAS8zB,EAAc,EAAE,EAAKjtD,EAE9BitD,EAAc,iBAAkB,UAAWoN,CAAuB,GAMnE,MAAMF,EAAez3B,EAAQ,QAC7B1B,EAAM,iBAAkBisB,EAAekN,CAAY,EAInD,MAAMpuD,EAAQ9Q,EAAK,OAAO,MAErB8+D,EAAY9M,EAAc,EAAE,IAAOlhD,IAEvCuuD,EAAkBrN,CAAa,EAE/B8M,EAAY9M,EAAc,EAAE,EAAKlhD,EAInC,CAEA,SAASqtB,EAAc6zB,EAAgB,CAItC,MAAMsN,EAAoBC,EAAyB,EACnDvN,EAAc,oBAAsBsN,EAEpC,MAAMv6D,EAAStiB,EAAG,aAAY,EACxB8R,EAAOy9D,EAAc,OACrB3zB,EAAQ2zB,EAAc,MAE5B,OAAAvvE,EAAG,WAAYA,EAAG,eAAgBsiB,CAAM,EACxCtiB,EAAG,WAAYA,EAAG,eAAgB8R,EAAM8pC,CAAK,EAC7C57C,EAAG,WAAYA,EAAG,eAAgB,IAAI,EACtCA,EAAG,eAAgBA,EAAG,eAAgB68E,EAAmBv6D,CAAM,EAExDA,CAER,CAEA,SAASw6D,GAA4B,CAEpC,QAAU39E,EAAI,EAAGA,EAAIo9E,EAAkBp9E,IAEtC,GAAKm9E,EAAuB,QAASn9E,CAAC,IAAO,GAE5C,OAAAm9E,EAAuB,KAAMn9E,CAAC,EACvBA,EAMT,OAAAU,GAAO,iFAAiF,EAEjF,CAER,CAEA,SAAS+8E,EAAkBrN,EAAgB,CAE1C,MAAMjtD,EAASm5B,EAAS8zB,EAAc,EAAE,EAClCvkD,EAAWukD,EAAc,SACzB/wD,EAAQ+wD,EAAc,QAE5BvvE,EAAG,WAAYA,EAAG,eAAgBsiB,CAAM,EAExC,QAAUnjB,EAAI,EAAGmS,EAAK0Z,EAAS,OAAQ7rB,EAAImS,EAAInS,IAAO,CAErD,MAAM49E,EAAe,MAAM,QAAS/xD,EAAU7rB,CAAC,GAAO6rB,EAAU7rB,CAAC,EAAK,CAAE6rB,EAAU7rB,CAAC,CAAE,EAErF,QAAUyU,EAAI,EAAGiR,EAAKk4D,EAAa,OAAQnpE,EAAIiR,EAAIjR,IAAO,CAEzD,MAAMo2C,EAAU+yB,EAAcnpE,CAAC,EAE/B,GAAKopE,EAAmBhzB,EAAS7qD,EAAGyU,EAAG4K,CAAK,IAAO,GAAO,CAEzD,MAAMrZ,EAAS6kD,EAAQ,SAEjBz5C,EAAS,MAAM,QAASy5C,EAAQ,OAAUA,EAAQ,MAAQ,CAAEA,EAAQ,KAAK,EAE/E,IAAIizB,EAAc,EAElB,QAAU5xF,EAAI,EAAGA,EAAIklB,EAAO,OAAQllB,IAAO,CAE1C,MAAMD,EAAQmlB,EAAQllB,CAAC,EAEjBkyB,EAAO2/D,EAAgB9xF,CAAK,EAG7B,OAAOA,GAAU,UAAY,OAAOA,GAAU,WAElD4+D,EAAQ,OAAQ,CAAC,EAAK5+D,EACtB4U,EAAG,cAAeA,EAAG,eAAgBmF,EAAS83E,EAAajzB,EAAQ,MAAM,GAE9D5+D,EAAM,WAIjB4+D,EAAQ,OAAQ,CAAC,EAAK5+D,EAAM,SAAU,CAAC,EACvC4+D,EAAQ,OAAQ,CAAC,EAAK5+D,EAAM,SAAU,CAAC,EACvC4+D,EAAQ,OAAQ,CAAC,EAAK5+D,EAAM,SAAU,CAAC,EACvC4+D,EAAQ,OAAQ,CAAC,EAAK,EACtBA,EAAQ,OAAQ,CAAC,EAAK5+D,EAAM,SAAU,CAAC,EACvC4+D,EAAQ,OAAQ,CAAC,EAAK5+D,EAAM,SAAU,CAAC,EACvC4+D,EAAQ,OAAQ,CAAC,EAAK5+D,EAAM,SAAU,CAAC,EACvC4+D,EAAQ,OAAQ,CAAC,EAAK,EACtBA,EAAQ,OAAQ,CAAC,EAAK5+D,EAAM,SAAU,CAAC,EACvC4+D,EAAQ,OAAQ,CAAC,EAAK5+D,EAAM,SAAU,CAAC,EACvC4+D,EAAQ,OAAQ,EAAE,EAAK5+D,EAAM,SAAU,CAAC,EACxC4+D,EAAQ,OAAQ,EAAE,EAAK,IAIvB5+D,EAAM,QAAS4+D,EAAQ,OAAQizB,CAAW,EAE1CA,GAAe1/D,EAAK,QAAU,aAAa,kBAI7C,CAEAvd,EAAG,cAAeA,EAAG,eAAgBmF,EAAQ6kD,EAAQ,MAAM,CAE5D,CAED,CAED,CAEAhqD,EAAG,WAAYA,EAAG,eAAgB,IAAI,CAEvC,CAEA,SAASg9E,EAAmBhzB,EAAS38D,EAAO8vF,EAAY3+D,EAAQ,CAE/D,MAAMpzB,EAAQ4+D,EAAQ,MAChBozB,EAAc/vF,EAAQ,IAAM8vF,EAElC,GAAK3+D,EAAO4+D,CAAW,IAAO,OAI7B,OAAK,OAAOhyF,GAAU,UAAY,OAAOA,GAAU,UAElDozB,EAAO4+D,CAAW,EAAKhyF,EAIvBozB,EAAO4+D,CAAW,EAAKhyF,EAAM,MAAK,EAI5B,GAED,CAEN,MAAMiyF,EAAe7+D,EAAO4+D,CAAW,EAIvC,GAAK,OAAOhyF,GAAU,UAAY,OAAOA,GAAU,WAElD,GAAKiyF,IAAiBjyF,EAErB,OAAAozB,EAAO4+D,CAAW,EAAKhyF,EAChB,WAMHiyF,EAAa,OAAQjyF,CAAK,IAAO,GAErC,OAAAiyF,EAAa,KAAMjyF,CAAK,EACjB,EAMV,CAEA,MAAO,EAER,CAEA,SAASsxF,EAAsBnN,EAAgB,CAK9C,MAAMvkD,EAAWukD,EAAc,SAE/B,IAAIpqE,EAAS,EACb,MAAMm4E,EAAY,GAElB,QAAUn+E,EAAI,EAAG5T,EAAIy/B,EAAS,OAAQ7rB,EAAI5T,EAAG4T,IAAO,CAEnD,MAAM49E,EAAe,MAAM,QAAS/xD,EAAU7rB,CAAC,GAAO6rB,EAAU7rB,CAAC,EAAK,CAAE6rB,EAAU7rB,CAAC,CAAE,EAErF,QAAUyU,EAAI,EAAGiR,EAAKk4D,EAAa,OAAQnpE,EAAIiR,EAAIjR,IAAO,CAEzD,MAAMo2C,EAAU+yB,EAAcnpE,CAAC,EAEzBrD,EAAS,MAAM,QAASy5C,EAAQ,OAAUA,EAAQ,MAAQ,CAAEA,EAAQ,KAAK,EAE/E,QAAU3+D,EAAI,EAAGs8E,EAAKp3D,EAAO,OAAQllB,EAAIs8E,EAAIt8E,IAAO,CAEnD,MAAMD,EAAQmlB,EAAQllB,CAAC,EAEjBkyB,EAAO2/D,EAAgB9xF,CAAK,EAE5BmyF,EAAcp4E,EAASm4E,EACvBE,EAAeD,EAAchgE,EAAK,SAClCkgE,GAAaF,EAAcC,EAEjCr4E,GAAUq4E,EAGLC,KAAe,GAAOH,EAAYG,GAAelgE,EAAK,UAG1DpY,GAAYm4E,EAAYG,IAKzBzzB,EAAQ,OAAS,IAAI,aAAczsC,EAAK,QAAU,aAAa,iBAAiB,EAChFysC,EAAQ,SAAW7kD,EAGnBA,GAAUoY,EAAK,OAEhB,CAED,CAED,CAIA,MAAMggE,EAAcp4E,EAASm4E,EAE7B,OAAKC,EAAc,IAAIp4E,GAAYm4E,EAAYC,GAI/ChO,EAAc,OAASpqE,EACvBoqE,EAAc,QAAU,CAAA,EAEjB,IAER,CAEA,SAAS2N,EAAgB9xF,EAAQ,CAEhC,MAAMmyB,EAAO,CACZ,SAAU,EACV,QAAS,CACZ,EAIE,OAAK,OAAOnyB,GAAU,UAAY,OAAOA,GAAU,WAIlDmyB,EAAK,SAAW,EAChBA,EAAK,QAAU,GAEJnyB,EAAM,WAIjBmyB,EAAK,SAAW,EAChBA,EAAK,QAAU,GAEJnyB,EAAM,WAAaA,EAAM,SAIpCmyB,EAAK,SAAW,GAChBA,EAAK,QAAU,IAEJnyB,EAAM,WAIjBmyB,EAAK,SAAW,GAChBA,EAAK,QAAU,IAEJnyB,EAAM,WAIjBmyB,EAAK,SAAW,GAChBA,EAAK,QAAU,IAEJnyB,EAAM,WAIjBmyB,EAAK,SAAW,GAChBA,EAAK,QAAU,IAEJnyB,EAAM,UAEjBwU,GAAM,uEAAuE,EAI7EA,GAAM,iDAAkDxU,CAAK,EAIvDmyB,CAER,CAEA,SAASo/D,EAAyBxwF,EAAQ,CAEzC,MAAMojF,EAAgBpjF,EAAM,OAE5BojF,EAAc,oBAAqB,UAAWoN,CAAuB,EAErE,MAAMtvF,EAAQivF,EAAuB,QAAS/M,EAAc,mBAAmB,EAC/E+M,EAAuB,OAAQjvF,EAAO,CAAC,EAEvC2S,EAAG,aAAcy7C,EAAS8zB,EAAc,EAAE,CAAE,EAE5C,OAAO9zB,EAAS8zB,EAAc,EAAE,EAChC,OAAO8M,EAAY9M,EAAc,EAAE,CAEpC,CAEA,SAAShrB,GAAU,CAElB,UAAY32D,KAAM6tD,EAEjBz7C,EAAG,aAAcy7C,EAAS7tD,EAAI,EAI/B0uF,EAAyB,CAAA,EACzB7gC,EAAU,CAAA,EACV4gC,EAAa,CAAA,CAEd,CAEA,MAAO,CAEN,KAAMG,EACN,OAAQ51E,EAER,QAAS29C,CAEX,CAEA,CAUA,MAAMm5B,GAAO,IAAI,YAAa,CAC7B,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,EAAQ,MAAQ,EAAQ,MAAQ,EAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,EAAQ,MAAQ,EAAQ,MAAQ,EAAQ,MAAQ,EAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,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AC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CA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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA8PJ,EAAGmI,GAAK,CACN,SAAU,CACR,SAAU,CAAE,MAAO,IAAI,EACvB,WAAY,CAAE,MAAO,GAAG,EAExB,SAAU,CAAE,MAAO,GAAG,CAE1B,EACE,aAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOd,eAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAqBlB,EACA,MAAMC,EAAG,CACP,OACA,SACA,eACA,SACA,SACA,WACA,SACA,YAAY,EAAG,CACb,KAAK,OAAS,CAChB,CACA,OAAO,EAAG,EAAG,CACX,GAAI,IAAM,QAAU,IAAM,OAAQ,CAChC,MAAMlsF,EAAI,KAAK,OAAO,aAAa,iBAAgB,EACnD,EAAI,GAAKA,EAAE,MAAO,EAAI,GAAKA,EAAE,MAC/B,CACA,GAAI,CAAC,GAAK,CAAC,GAAK,CAAC,KAAK,SACpB,OACF,MAAM,EAAI,KAAK,OAAO,UAAU,mBAAqB,OAAO,kBAAoB,EAChF,KAAK,SAAS,cAAc,CAAC,EAAG,KAAK,SAAS,QAAQ,EAAG,CAAC,EAC1D,MAAM,EAAI,KAAK,SAAS,OAAO,KAAMA,GAAMA,aAAa2mF,IAAM3mF,EAAE,SAAS,SAAS,UAAU,EAC5F,IAAM,EAAE,SAAS,SAAS,WAAW,MAAM,EAAI,GAAK,EAAI,GAAI,EAAE,SAAS,SAAS,WAAW,MAAM,EAAI,GAAK,EAAI,GAChH,CACA,MAAO,CACL,KAAM,CAAE,MAAO,EAAG,OAAQ,CAAC,EAAK,KAAK,OAAO,aAAa,iBAAgB,EAAI,EAAI,KAAK,OAAO,MAAO,EAAI,KAAK,OAAO,OAAQA,EAAI,KAAK,OAAO,SAAUqD,EAAI,KAAK,OAAO,UAAU,gBAAa,GAAQ,OAAO,kBAAoB,EAAGxE,EAAI,IAAIstF,GAAoB,EAAG,EAAG,CACnQ,UAAWC,GACX,UAAWA,GACX,OAAQC,GACR,QAAS,CAEf,CAAK,EACD,KAAK,SAAW,IAAIrF,GAAGhnF,EAAGnB,CAAC,EAAG,KAAK,SAAS,cAAcwE,CAAC,EAAG,KAAK,SAAS,QAAQ,EAAG,CAAC,EACxF,MAAM,EAAI,IAAIgkF,GAAG,EAAG,CAAC,EACrB,KAAK,SAAS,QAAQ,CAAC,EAAG,KAAK,SAAW,IAAI+C,GAAG,EAAG,EAAG,EAAG,CAAC,EAAG,KAAK,SAAS,OAASA,GAAG,OAAO,QAAS,KAAK,SAAS,eAAiB,GAAK,KAAK,SAAS,QAAU,GAAI,KAAK,SAAS,oBAAsB,KAAK,SAAS,mBAAmB,CAC3O,OAAQ,EACR,iBAAkB,EAClB,UAAW,EACX,MAAO,EACP,gBAAiB,EACjB,kBAAmB,EACzB,CAAK,EAAG,KAAK,SAAS,QAAQ,KAAK,QAAQ,EAAG,KAAK,SAAW,IAAIgB,GAAG,EAAG,EAAG,EAAG,CAAC,EAAG,KAAK,SAAS,aAAe,EAAG,KAAK,SAAS,YAAc,KAAM,KAAK,SAAS,YAAc,GAAK,KAAK,SAAS,OAASA,GAAG,OAAO,QAAS,KAAK,SAAS,QAAU,GAAI,KAAK,SAAS,QAAQ,KAAK,QAAQ,EAAG,KAAK,eAAiB,IAAIzE,GAAGsF,EAAE,EAAG,KAAK,eAAe,SAAS,WAAW,MAAQ,IAAK,KAAK,eAAe,SAAS,SAAS,MAAQ,IAAK,KAAK,eAAe,QAAU,GAAI,KAAK,SAAS,QAAQ,KAAK,cAAc,EAAG,KAAK,WAAa,IAAIT,GAAM,KAAK,WAAW,QAAU,GAAI,KAAK,SAAS,QAAQ,KAAK,UAAU,EAAG,KAAK,SAAW,IAAI7E,GAAGqF,EAAE,EAAG,KAAK,SAAS,SAAS,SAAS,WAAW,MAAM,EAAI,GAAK,EAAI3oF,GAAI,KAAK,SAAS,SAAS,SAAS,WAAW,MAAM,EAAI,GAAK,EAAIA,GAAI,KAAK,SAAS,QAAU,GAAI,KAAK,SAAS,QAAQ,KAAK,QAAQ,CACxzB,CACF,CACA,IAAIipF,GAAK,OAAO,WAAa,IAAM,WAAa,OAAO,OAAS,IAAM,OAAS,OAAO,OAAS,IAAM,OAAS,OAAO,KAAO,IAAM,KAAO,CAAA,EACzI,SAASC,GAAG1gD,EAAG,CACb,OAAOA,GAAKA,EAAE,YAAc,OAAO,UAAU,eAAe,KAAKA,EAAG,SAAS,EAAIA,EAAE,QAAUA,CAC/F,CACA,SAAS2gD,GAAG3gD,EAAG,CACb,MAAM,IAAI,MAAM,kCAAoCA,EAAI,2JAA2J,CACrN,CACA,IAAI4gD,GAAK,CAAE,QAAS,EAAE,EAClBC,GACJ,SAASC,IAAK,CACZ,OAAOD,KAAOA,GAAK,GAAI,SAAS7gD,EAAG,EAAG,EACnC,SAAS,EAAG,CACXA,EAAE,QAAU,EAAC,CACf,GAAG,UAAW,CACZ,OAAQ,SAAS,EAAE,EAAG,EAAG7rC,EAAG,CAC1B,SAASqD,EAAEiF,EAAGvJ,EAAG,CACf,GAAI,CAAC,EAAEuJ,CAAC,EAAG,CACT,GAAI,CAAC,EAAEA,CAAC,EAAG,CACT,IAAI,EAAI,OAAOkkF,IAAM,YAAcA,GACnC,GAAI,CAACztF,GAAK,EAAG,OAAO,EAAEuJ,EAAG,EAAE,EAC3B,GAAIzJ,EAAG,OAAOA,EAAEyJ,EAAG,EAAE,EACrB,IAAI1L,EAAI,IAAI,MAAM,uBAAyB0L,EAAI,GAAG,EAClD,MAAM1L,EAAE,KAAO,mBAAoBA,CACrC,CACA,IAAIkF,EAAI,EAAEwG,CAAC,EAAI,CAAE,QAAS,CAAA,CAAE,EAC5B,EAAEA,CAAC,EAAE,CAAC,EAAE,KAAKxG,EAAE,QAAS,SAAS3R,EAAG,CAClC,IAAI2rB,EAAI,EAAExT,CAAC,EAAE,CAAC,EAAEnY,CAAC,EACjB,OAAOkT,EAAEyY,GAAK3rB,CAAC,CACjB,EAAG2R,EAAGA,EAAE,QAAS,EAAG,EAAG,EAAG9B,CAAC,CAC7B,CACA,OAAO,EAAEsI,CAAC,EAAE,OACd,CACA,QAASzJ,EAAI,OAAO2tF,IAAM,YAAcA,GAAI,EAAI,EAAG,EAAIxsF,EAAE,OAAQ,IAAKqD,EAAErD,EAAE,CAAC,CAAC,EAC5E,OAAOqD,CACT,GAAG,CAAE,EAAG,CAAC,SAAS,EAAG,EAAG,EAAG,CACzB,IAAIrD,EAAI,EAAE,SAAS,EAAGqD,EAAI,EAAE,WAAW,EAAGxE,EAAI,oEAC9C,EAAE,OAAS,SAAS,EAAG,CACrB,QAASyJ,EAAGvJ,EAAG,EAAGnC,EAAGkF,EAAG3R,EAAG2rB,EAAGtzB,EAAI,GAAI4U,EAAI,EAAG0D,EAAI,EAAE,OAAQhE,EAAIgE,EAAGukF,EAAIrlF,EAAE,UAAU,CAAC,IAAM,SAAU5C,EAAI,EAAE,QAAUN,EAAIgE,EAAI1D,EAAG,EAAIioF,GAAK/8E,EAAI,EAAElL,GAAG,EAAG2B,EAAI3B,EAAI0D,EAAI,EAAE1D,GAAG,EAAI,EAAGA,EAAI0D,EAAI,EAAE1D,GAAG,EAAI,IAAMkL,EAAI,EAAE,WAAWlL,GAAG,EAAG2B,EAAI3B,EAAI0D,EAAI,EAAE,WAAW1D,GAAG,EAAI,EAAGA,EAAI0D,EAAI,EAAE,WAAW1D,GAAG,EAAI,GAAIR,EAAI0L,GAAK,EAAGxG,GAAK,EAAIwG,IAAM,EAAIvJ,GAAK,EAAG5O,EAAI,EAAI2M,GAAK,GAAKiC,IAAM,EAAI,GAAK,EAAI,GAAI+c,EAAI,EAAIhf,EAAI,GAAK,EAAI,GAAItU,EAAE,KAAKqW,EAAE,OAAOjC,CAAC,EAAIiC,EAAE,OAAOiD,CAAC,EAAIjD,EAAE,OAAO1O,CAAC,EAAI0O,EAAE,OAAOid,CAAC,CAAC,EACjc,OAAOtzB,EAAE,KAAK,EAAE,CAClB,EAAG,EAAE,OAAS,SAAS,EAAG,CACxB,IAAI8f,EAAGvJ,EAAG,EAAGnC,EAAGkF,EAAG3R,EAAG2rB,EAAI,EAAGtzB,EAAI,EAAG4U,EAAI,QACxC,GAAI,EAAE,OAAO,EAAGA,EAAE,MAAM,IAAMA,EAAG,MAAM,IAAI,MAAM,iDAAiD,EAClG,IAAI0D,EAAGhE,EAAI,GAAK,EAAI,EAAE,QAAQ,mBAAoB,EAAE,GAAG,OAAS,EAChE,GAAI,EAAE,OAAO,EAAE,OAAS,CAAC,IAAM+B,EAAE,OAAO,EAAE,GAAK/B,IAAK,EAAE,OAAO,EAAE,OAAS,CAAC,IAAM+B,EAAE,OAAO,EAAE,GAAK/B,IAAKA,EAAI,GAAK,EAAG,MAAM,IAAI,MAAM,2CAA2C,EAC3K,IAAKgE,EAAIuC,EAAE,WAAa,IAAI,WAAW,EAAIvG,CAAC,EAAI,IAAI,MAAM,EAAIA,CAAC,EAAGgf,EAAI,EAAE,QAAUxT,EAAIzJ,EAAE,QAAQ,EAAE,OAAOid,GAAG,CAAC,GAAK,GAAKlf,EAAIiC,EAAE,QAAQ,EAAE,OAAOid,GAAG,CAAC,IAAM,EAAG/c,GAAK,GAAKnC,IAAM,GAAKkF,EAAIjD,EAAE,QAAQ,EAAE,OAAOid,GAAG,CAAC,IAAM,EAAG,GAAK,EAAIha,IAAM,GAAK3R,EAAI0O,EAAE,QAAQ,EAAE,OAAOid,GAAG,CAAC,GAAIhb,EAAEtY,GAAG,EAAI8f,EAAGxG,IAAM,KAAOhB,EAAEtY,GAAG,EAAIuW,GAAI5O,IAAM,KAAO2Q,EAAEtY,GAAG,EAAI,GACnU,OAAOsY,CACT,CACF,EAAG,CAAE,YAAa,GAAI,UAAW,EAAE,CAAE,EAAG,EAAG,CAAC,SAAS,EAAG,EAAG,EAAG,CAC5D,IAAId,EAAI,EAAE,YAAY,EAAGqD,EAAI,EAAE,qBAAqB,EAAGxE,EAAI,EAAE,qBAAqB,EAAG,EAAI,EAAE,0BAA0B,EACrH,SAASyJ,EAAEvJ,EAAG,EAAGnC,EAAGkF,EAAG3R,EAAG,CACxB,KAAK,eAAiB4O,EAAG,KAAK,iBAAmB,EAAG,KAAK,MAAQnC,EAAG,KAAK,YAAckF,EAAG,KAAK,kBAAoB3R,CACrH,CACAmY,EAAE,UAAY,CAAE,iBAAkB,UAAW,CAC3C,IAAIvJ,EAAI,IAAIsE,EAAErD,EAAE,QAAQ,QAAQ,KAAK,iBAAiB,CAAC,EAAE,KAAK,KAAK,YAAY,iBAAgB,CAAE,EAAE,KAAK,IAAI,EAAE,aAAa,CAAC,EAAG,EAAI,KACnI,OAAOjB,EAAE,GAAG,MAAO,UAAW,CAC5B,GAAI,KAAK,WAAW,cAAgB,EAAE,iBAAkB,MAAM,IAAI,MAAM,uCAAuC,CACjH,CAAC,EAAGA,CACN,EAAG,oBAAqB,UAAW,CACjC,OAAO,IAAIsE,EAAErD,EAAE,QAAQ,QAAQ,KAAK,iBAAiB,CAAC,EAAE,eAAe,iBAAkB,KAAK,cAAc,EAAE,eAAe,mBAAoB,KAAK,gBAAgB,EAAE,eAAe,QAAS,KAAK,KAAK,EAAE,eAAe,cAAe,KAAK,WAAW,CAC5P,CAAC,EAAIsI,EAAE,iBAAmB,SAASvJ,EAAG,EAAGnC,EAAG,CAC1C,OAAOmC,EAAE,KAAK,IAAIF,CAAG,EAAE,KAAK,IAAI,EAAE,kBAAkB,CAAC,EAAE,KAAK,EAAE,eAAejC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,gBAAgB,CAAC,EAAE,eAAe,cAAe,CAAC,CAChJ,EAAG,EAAE,QAAU0L,CACjB,EAAG,CAAE,aAAc,EAAG,sBAAuB,GAAI,2BAA4B,GAAI,sBAAuB,EAAE,CAAE,EAAG,EAAG,CAAC,SAAS,EAAG,EAAG,EAAG,CACnI,IAAItI,EAAI,EAAE,wBAAwB,EAClC,EAAE,MAAQ,CAAE,MAAO,OAAQ,eAAgB,UAAW,CACpD,OAAO,IAAIA,EAAE,mBAAmB,CAClC,EAAG,iBAAkB,UAAW,CAC9B,OAAO,IAAIA,EAAE,qBAAqB,CACpC,CAAC,EAAI,EAAE,QAAU,EAAE,SAAS,CAC9B,EAAG,CAAE,UAAW,EAAG,yBAA0B,EAAE,CAAE,EAAG,EAAG,CAAC,SAAS,EAAG,EAAG,EAAG,CACxE,IAAIA,EAAI,EAAE,SAAS,EAAGqD,GAAK,UAAW,CACpC,QAASxE,EAAG,EAAI,GAAIyJ,EAAI,EAAGA,EAAI,IAAKA,IAAK,CACvCzJ,EAAIyJ,EACJ,QAASvJ,EAAI,EAAGA,EAAI,EAAGA,IAAKF,EAAI,EAAIA,EAAI,WAAaA,IAAM,EAAIA,IAAM,EACrE,EAAEyJ,CAAC,EAAIzJ,CACT,CACA,OAAO,CACT,GAAC,EACD,EAAE,QAAU,SAASA,EAAG,EAAG,CACzB,OAAOA,IAAM,QAAUA,EAAE,OAASmB,EAAE,UAAUnB,CAAC,IAAM,UAAY,SAASyJ,EAAGvJ,EAAG,EAAGnC,EAAG,CACpF,IAAIkF,EAAIuB,EAAGlT,EAAIyM,EAAI,EACnB0L,GAAK,GACL,QAASwT,EAAIlf,EAAGkf,EAAI3rB,EAAG2rB,IAAKxT,EAAIA,IAAM,EAAIxG,EAAE,KAAOwG,EAAIvJ,EAAE+c,CAAC,EAAE,EAC5D,MAAO,GAAKxT,CACd,GAAG,EAAI,EAAGzJ,EAAGA,EAAE,OAAQ,CAAC,GAAK,SAASyJ,EAAGvJ,EAAG,EAAGnC,EAAG,CAChD,IAAIkF,EAAIuB,EAAGlT,EAAIyM,EAAI,EACnB0L,GAAK,GACL,QAASwT,EAAIlf,EAAGkf,EAAI3rB,EAAG2rB,IAAKxT,EAAIA,IAAM,EAAIxG,EAAE,KAAOwG,EAAIvJ,EAAE,WAAW+c,CAAC,EAAE,EACvE,MAAO,GAAKxT,CACd,GAAG,EAAI,EAAGzJ,EAAGA,EAAE,OAAQ,CAAC,EAAI,CAC9B,CACF,EAAG,CAAE,UAAW,GAAI,EAAG,EAAG,CAAC,SAAS,EAAG,EAAG,EAAG,CAC3C,EAAE,OAAS,GAAI,EAAE,OAAS,GAAI,EAAE,IAAM,GAAI,EAAE,cAAgB,GAAI,EAAE,KAAO,KAAM,EAAE,YAAc,KAAM,EAAE,mBAAqB,KAAM,EAAE,QAAU,KAAM,EAAE,gBAAkB,KAAM,EAAE,eAAiB,IACnM,EAAG,CAAA,CAAE,EAAG,EAAG,CAAC,SAAS,EAAG,EAAG,EAAG,CAC5B,IAAImB,EAAI,KACRA,EAAI,OAAO,QAAU,IAAM,QAAU,EAAE,KAAK,EAAG,EAAE,QAAU,CAAE,QAASA,CAAC,CACzE,EAAG,CAAE,IAAK,GAAI,EAAG,EAAG,CAAC,SAAS,EAAG,EAAG,EAAG,CACrC,IAAIA,EAAI,OAAO,WAAa,KAAO,OAAO,YAAc,KAAO,OAAO,YAAc,IAAKqD,EAAI,EAAE,MAAM,EAAGxE,EAAI,EAAE,SAAS,EAAG,EAAI,EAAE,wBAAwB,EAAGyJ,EAAItI,EAAI,aAAe,QAClL,SAASjB,EAAE,EAAGnC,EAAG,CACf,EAAE,KAAK,KAAM,eAAiB,CAAC,EAAG,KAAK,MAAQ,KAAM,KAAK,YAAc,EAAG,KAAK,aAAeA,EAAG,KAAK,KAAO,CAAA,CAChH,CACA,EAAE,MAAQ,OAAQiC,EAAE,SAASE,EAAG,CAAC,EAAGA,EAAE,UAAU,aAAe,SAAS,EAAG,CACzE,KAAK,KAAO,EAAE,KAAM,KAAK,QAAU,MAAQ,KAAK,YAAW,EAAI,KAAK,MAAM,KAAKF,EAAE,YAAYyJ,EAAG,EAAE,IAAI,EAAG,EAAE,CAC7G,EAAGvJ,EAAE,UAAU,MAAQ,UAAW,CAChC,EAAE,UAAU,MAAM,KAAK,IAAI,EAAG,KAAK,QAAU,MAAQ,KAAK,YAAW,EAAI,KAAK,MAAM,KAAK,CAAA,EAAI,EAAE,CACjG,EAAGA,EAAE,UAAU,QAAU,UAAW,CAClC,EAAE,UAAU,QAAQ,KAAK,IAAI,EAAG,KAAK,MAAQ,IAC/C,EAAGA,EAAE,UAAU,YAAc,UAAW,CACtC,KAAK,MAAQ,IAAIsE,EAAE,KAAK,WAAW,EAAE,CAAE,IAAK,GAAI,MAAO,KAAK,aAAa,OAAS,EAAE,CAAE,EACtF,IAAI,EAAI,KACR,KAAK,MAAM,OAAS,SAASzG,EAAG,CAC9B,EAAE,KAAK,CAAE,KAAMA,EAAG,KAAM,EAAE,KAAM,CAClC,CACF,EAAG,EAAE,eAAiB,SAAS,EAAG,CAChC,OAAO,IAAImC,EAAE,UAAW,CAAC,CAC3B,EAAG,EAAE,iBAAmB,UAAW,CACjC,OAAO,IAAIA,EAAE,UAAW,EAAE,CAC5B,CACF,EAAG,CAAE,yBAA0B,GAAI,UAAW,GAAI,KAAM,EAAE,CAAE,EAAG,EAAG,CAAC,SAAS,EAAG,EAAG,EAAG,CACnF,SAASiB,EAAE8B,EAAG3R,EAAG,CACf,IAAI2rB,EAAGtzB,EAAI,GACX,IAAKszB,EAAI,EAAGA,EAAI3rB,EAAG2rB,IAAKtzB,GAAK,OAAO,aAAa,IAAMsZ,CAAC,EAAGA,KAAO,EAClE,OAAOtZ,CACT,CACA,SAAS6a,EAAEvB,EAAG3R,EAAG2rB,EAAGtzB,EAAG4U,EAAG0D,EAAG,CAC3B,IAAIhE,EAAGuoF,EAAGvmF,EAAIgD,EAAE,KAAMwjF,EAAIxjF,EAAE,YAAayjF,EAAIzkF,IAAMwH,EAAE,WAAYm9E,EAAI5mF,EAAE,YAAY,SAAUiC,EAAEhC,EAAE,IAAI,CAAC,EAAG6mF,EAAI9mF,EAAE,YAAY,SAAUyJ,EAAE,WAAWxJ,EAAE,IAAI,CAAC,EAAG8mF,EAAI9mF,EAAE,QAASmmF,EAAIpmF,EAAE,YAAY,SAAUiC,EAAE8kF,CAAC,CAAC,EAAGT,EAAItmF,EAAE,YAAY,SAAUyJ,EAAE,WAAWs9E,CAAC,CAAC,EAAGR,EAAIO,EAAE,SAAW7mF,EAAE,KAAK,OAAQ7R,EAAIk4F,EAAE,SAAWS,EAAE,OAAQ,EAAI,GAAIJ,EAAI,GAAIE,EAAI,GAAIljF,EAAK1D,EAAE,IAAKqpF,EAAIrpF,EAAE,KAAM+mF,GAAI,CAAE,MAAO,EAAG,eAAgB,EAAG,iBAAkB,CAAC,EAC7Z11F,GAAK,CAAC2rB,IAAM+pE,GAAE,MAAQ/jF,EAAE,MAAO+jF,GAAE,eAAiB/jF,EAAE,eAAgB+jF,GAAE,iBAAmB/jF,EAAE,kBAC3F,IAAIikF,EAAI,EACR51F,IAAM41F,GAAK,GAAIR,GAAK,CAACH,GAAK,CAACn4F,IAAM84F,GAAK,MACtC,IAAID,EAAI,EAAGsC,GAAI,EACf5lF,IAAOsjF,GAAK,IAAK1oF,IAAM,QAAUgrF,GAAI,IAAKtC,IAAM,SAASlnF,GAAG6U,GAAI,CAC9D,IAAI60E,GAAK1pF,GACT,OAAOA,KAAM0pF,GAAK70E,GAAK,MAAQ,QAAS,MAAQ60E,KAAO,EACzD,GAAGxpF,EAAE,gBAAiB0D,CAAE,IAAM4lF,GAAI,GAAItC,IAAM,SAASlnF,GAAG,CACtD,MAAO,KAAMA,IAAK,EACpB,GAAGE,EAAE,cAAc,GAAIhC,EAAIqrF,EAAE,YAAW,EAAIrrF,IAAM,EAAGA,GAAKqrF,EAAE,cAAa,EAAIrrF,IAAM,EAAGA,GAAKqrF,EAAE,cAAa,EAAK,EAAG9C,EAAI8C,EAAE,eAAc,EAAK,KAAM9C,IAAM,EAAGA,GAAK8C,EAAE,YAAW,EAAK,EAAG9C,IAAM,EAAGA,GAAK8C,EAAE,WAAU,EAAI/C,IAAMI,EAAIxlF,EAAE,EAAG,CAAC,EAAIA,EAAEjB,EAAE0mF,CAAC,EAAG,CAAC,EAAIE,EAAG,GAAK,KAAO3lF,EAAEwlF,EAAE,OAAQ,CAAC,EAAIA,GAAIv4F,IAAMy4F,EAAI1lF,EAAE,EAAG,CAAC,EAAIA,EAAEjB,EAAEkmF,CAAC,EAAG,CAAC,EAAIE,EAAG,GAAK,KAAOnlF,EAAE0lF,EAAE,OAAQ,CAAC,EAAIA,GACxV,IAAI2C,GAAK,GACT,OAAOA,IAAM;AAAA,IAClBA,IAAMroF,EAAE+lF,EAAG,CAAC,EAAGsC,IAAM/C,EAAE,MAAO+C,IAAMroF,EAAElD,EAAG,CAAC,EAAGurF,IAAMroF,EAAEqlF,EAAG,CAAC,EAAGgD,IAAMroF,EAAE6lF,GAAE,MAAO,CAAC,EAAGwC,IAAMroF,EAAE6lF,GAAE,eAAgB,CAAC,EAAGwC,IAAMroF,EAAE6lF,GAAE,iBAAkB,CAAC,EAAGwC,IAAMroF,EAAEylF,EAAE,OAAQ,CAAC,EAAG4C,IAAMroF,EAAE,EAAE,OAAQ,CAAC,EAAG,CAAE,WAAY,EAAE,kBAAoBqoF,GAAK5C,EAAI,EAAG,UAAW,EAAE,oBAAsBzlF,EAAEooF,GAAG,CAAC,EAAIC,GAAKroF,EAAEilF,EAAE,OAAQ,CAAC,EAAI,WAAajlF,EAAE8lF,EAAG,CAAC,EAAI9lF,EAAExX,EAAG,CAAC,EAAIi9F,EAAI,EAAIR,CAAC,CACrV,CACA,IAAIpmF,EAAI,EAAE,UAAU,EAAG,EAAI,EAAE,yBAAyB,EAAGyJ,EAAI,EAAE,SAAS,EAAGvJ,EAAI,EAAE,UAAU,EAAG,EAAI,EAAE,cAAc,EAClH,SAASnC,EAAEkF,EAAG3R,EAAG2rB,EAAGtzB,EAAG,CACrB,EAAE,KAAK,KAAM,eAAe,EAAG,KAAK,aAAe,EAAG,KAAK,WAAa2H,EAAG,KAAK,YAAc2rB,EAAG,KAAK,eAAiBtzB,EAAG,KAAK,YAAcsZ,EAAG,KAAK,WAAa,GAAI,KAAK,cAAgB,CAAA,EAAI,KAAK,WAAa,CAAA,EAAI,KAAK,oBAAsB,EAAG,KAAK,aAAe,EAAG,KAAK,YAAc,KAAM,KAAK,SAAW,CAAA,CACrT,CACAjD,EAAE,SAASjC,EAAG,CAAC,EAAGA,EAAE,UAAU,KAAO,SAASkF,EAAG,CAC/C,IAAI3R,EAAI2R,EAAE,KAAK,SAAW,EAAGga,EAAI,KAAK,aAActzB,EAAI,KAAK,SAAS,OACtE,KAAK,WAAa,KAAK,cAAc,KAAKsZ,CAAC,GAAK,KAAK,cAAgBA,EAAE,KAAK,OAAQ,EAAE,UAAU,KAAK,KAAK,KAAM,CAAE,KAAMA,EAAE,KAAM,KAAM,CAAE,YAAa,KAAK,YAAa,QAASga,GAAK3rB,EAAI,KAAO2rB,EAAItzB,EAAI,IAAMszB,EAAI,GAAG,CAAE,CAAE,EAC3N,EAAGlf,EAAE,UAAU,aAAe,SAASkF,EAAG,CACxC,KAAK,oBAAsB,KAAK,aAAc,KAAK,YAAcA,EAAE,KAAK,KACxE,IAAI3R,EAAI,KAAK,aAAe,CAAC2R,EAAE,KAAK,IACpC,GAAI3R,EAAG,CACL,IAAI2rB,EAAIzY,EAAEvB,EAAG3R,EAAG,GAAI,KAAK,oBAAqB,KAAK,YAAa,KAAK,cAAc,EACnF,KAAK,KAAK,CAAE,KAAM2rB,EAAE,WAAY,KAAM,CAAE,QAAS,CAAC,EAAI,CACxD,MAAO,KAAK,WAAa,EAC3B,EAAGlf,EAAE,UAAU,aAAe,SAASkF,EAAG,CACxC,KAAK,WAAa,GAClB,IAAI3R,EAAI,KAAK,aAAe,CAAC2R,EAAE,KAAK,IAAKga,EAAIzY,EAAEvB,EAAG3R,EAAG,GAAI,KAAK,oBAAqB,KAAK,YAAa,KAAK,cAAc,EACxH,GAAI,KAAK,WAAW,KAAK2rB,EAAE,SAAS,EAAG3rB,EAAG,KAAK,KAAK,CAAE,MAAO,SAAS3H,EAAG,CACvE,OAAO,EAAE,gBAAkBwX,EAAExX,EAAE,MAAO,CAAC,EAAIwX,EAAExX,EAAE,eAAgB,CAAC,EAAIwX,EAAExX,EAAE,iBAAkB,CAAC,CAC7F,GAAGsZ,CAAC,EAAG,KAAM,CAAE,QAAS,GAAG,EAAI,MAC1B,KAAK,KAAK,KAAK,CAAE,KAAMga,EAAE,WAAY,KAAM,CAAE,QAAS,CAAC,CAAE,CAAE,EAAG,KAAK,cAAc,QAAU,KAAK,KAAK,KAAK,cAAc,OAAO,EACpI,KAAK,YAAc,IACrB,EAAGlf,EAAE,UAAU,MAAQ,UAAW,CAChC,QAASkF,EAAI,KAAK,aAAc3R,EAAI,EAAGA,EAAI,KAAK,WAAW,OAAQA,IAAK,KAAK,KAAK,CAAE,KAAM,KAAK,WAAWA,CAAC,EAAG,KAAM,CAAE,QAAS,GAAG,CAAE,CAAE,EACtI,IAAI2rB,EAAI,KAAK,aAAeha,EAAGtZ,GAAK,SAAS4U,EAAG0D,EAAGhE,EAAGuoF,EAAGvmF,EAAG,CAC1D,IAAIwmF,EAAIzmF,EAAE,YAAY,SAAUC,EAAEumF,CAAC,CAAC,EACpC,OAAO,EAAE,sBAAwB,WAAarlF,EAAE5C,EAAG,CAAC,EAAI4C,EAAE5C,EAAG,CAAC,EAAI4C,EAAEc,EAAG,CAAC,EAAId,EAAElD,EAAG,CAAC,EAAIkD,EAAEslF,EAAE,OAAQ,CAAC,EAAIA,CACzG,GAAG,KAAK,WAAW,OAAQxpE,EAAGha,EAAG,KAAK,WAAY,KAAK,cAAc,EACrE,KAAK,KAAK,CAAE,KAAMtZ,EAAG,KAAM,CAAE,QAAS,GAAG,EAAI,CAC/C,EAAGoU,EAAE,UAAU,kBAAoB,UAAW,CAC5C,KAAK,SAAW,KAAK,SAAS,MAAK,EAAI,KAAK,aAAa,KAAK,SAAS,UAAU,EAAG,KAAK,SAAW,KAAK,SAAS,QAAU,KAAK,SAAS,OAAM,CAClJ,EAAGA,EAAE,UAAU,iBAAmB,SAASkF,EAAG,CAC5C,KAAK,SAAS,KAAKA,CAAC,EACpB,IAAI3R,EAAI,KACR,OAAO2R,EAAE,GAAG,OAAQ,SAASga,EAAG,CAC9B3rB,EAAE,aAAa2rB,CAAC,CAClB,CAAC,EAAGha,EAAE,GAAG,MAAO,UAAW,CACzB3R,EAAE,aAAaA,EAAE,SAAS,UAAU,EAAGA,EAAE,SAAS,OAASA,EAAE,kBAAiB,EAAKA,EAAE,IAAG,CAC1F,CAAC,EAAG2R,EAAE,GAAG,QAAS,SAASga,EAAG,CAC5B3rB,EAAE,MAAM2rB,CAAC,CACX,CAAC,EAAG,IACN,EAAGlf,EAAE,UAAU,OAAS,UAAW,CACjC,MAAO,CAAC,CAAC,EAAE,UAAU,OAAO,KAAK,IAAI,IAAM,CAAC,KAAK,UAAY,KAAK,SAAS,QAAU,KAAK,kBAAiB,EAAI,IAAM,KAAK,UAAY,KAAK,SAAS,QAAU,KAAK,eAAiB,QAAU,KAAK,IAAG,EAAI,IAC5M,EAAGA,EAAE,UAAU,MAAQ,SAASkF,EAAG,CACjC,IAAI3R,EAAI,KAAK,SACb,GAAI,CAAC,EAAE,UAAU,MAAM,KAAK,KAAM2R,CAAC,EAAG,MAAO,GAC7C,QAASga,EAAI,EAAGA,EAAI3rB,EAAE,OAAQ2rB,IAAK,GAAI,CACrC3rB,EAAE2rB,CAAC,EAAE,MAAMha,CAAC,CACd,MAAQ,CACR,CACA,MAAO,EACT,EAAGlF,EAAE,UAAU,KAAO,UAAW,CAC/B,EAAE,UAAU,KAAK,KAAK,IAAI,EAC1B,QAASkF,EAAI,KAAK,SAAU3R,EAAI,EAAGA,EAAI2R,EAAE,OAAQ3R,IAAK2R,EAAE3R,CAAC,EAAE,KAAI,CACjE,EAAG,EAAE,QAAUyM,CACjB,EAAG,CAAE,WAAY,EAAG,eAAgB,GAAI,0BAA2B,GAAI,UAAW,GAAI,WAAY,EAAE,CAAE,EAAG,EAAG,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7H,IAAIoD,EAAI,EAAE,iBAAiB,EAAGqD,EAAI,EAAE,iBAAiB,EACrD,EAAE,eAAiB,SAASxE,EAAG,EAAGyJ,EAAG,CACnC,IAAIvJ,EAAI,IAAIsE,EAAE,EAAE,YAAaiF,EAAG,EAAE,SAAU,EAAE,cAAc,EAAG,EAAI,EACnE,GAAI,CACFzJ,EAAE,QAAQ,SAASjC,EAAGkF,EAAG,CACvB,IACA,IAAI3R,GAAK,SAAS2Q,EAAGhE,EAAG,CACtB,IAAIuoF,EAAIvkF,GAAKhE,EAAGgC,EAAIkB,EAAEqlF,CAAC,EACvB,GAAI,CAACvmF,EAAG,MAAM,IAAI,MAAMumF,EAAI,sCAAsC,EAClE,OAAOvmF,CACT,GAAGgD,EAAE,QAAQ,YAAa,EAAE,WAAW,EAAGga,EAAIha,EAAE,QAAQ,oBAAsB,EAAE,oBAAsB,GAAItZ,EAAIsZ,EAAE,IAAK1E,EAAI0E,EAAE,KAC3HA,EAAE,gBAAgB3R,EAAG2rB,CAAC,EAAE,eAAe,OAAQ,CAAE,KAAMlf,EAAG,IAAKpU,EAAG,KAAM4U,EAAG,QAAS0E,EAAE,SAAW,GAAI,gBAAiBA,EAAE,gBAAiB,eAAgBA,EAAE,cAAc,CAAE,EAAE,KAAK/C,CAAC,CACrL,CAAC,EAAGA,EAAE,aAAe,CACvB,OAASnC,EAAG,CACVmC,EAAE,MAAMnC,CAAC,CACX,CACA,OAAOmC,CACT,CACF,EAAG,CAAE,kBAAmB,EAAG,kBAAmB,CAAC,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACzE,SAASiB,GAAI,CACX,GAAI,EAAE,gBAAgBA,GAAI,OAAO,IAAIA,EACrC,GAAI,UAAU,OAAQ,MAAM,IAAI,MAAM,gGAAgG,EACtI,KAAK,MAAwB,OAAO,OAAO,IAAI,EAAG,KAAK,QAAU,KAAM,KAAK,KAAO,GAAI,KAAK,MAAQ,UAAW,CAC7G,IAAIqD,EAAI,IAAIrD,EACZ,QAASnB,KAAK,KAAM,OAAO,KAAKA,CAAC,GAAK,aAAewE,EAAExE,CAAC,EAAI,KAAKA,CAAC,GAClE,OAAOwE,CACT,CACF,EACCrD,EAAE,UAAY,EAAE,UAAU,GAAG,UAAY,EAAE,QAAQ,EAAGA,EAAE,QAAU,EAAE,WAAW,EAAGA,EAAE,SAAW,EAAE,YAAY,EAAGA,EAAE,QAAU,SAAUA,EAAE,UAAY,SAASqD,EAAGxE,EAAG,CAClK,OAAO,IAAImB,EAAC,EAAG,UAAUqD,EAAGxE,CAAC,CAC/B,EAAGmB,EAAE,SAAW,EAAE,YAAY,EAAG,EAAE,QAAUA,CAC/C,EAAG,CAAE,aAAc,EAAG,aAAc,EAAG,SAAU,GAAI,WAAY,GAAI,YAAa,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC9G,IAAIA,EAAI,EAAE,SAAS,EAAGqD,EAAI,EAAE,YAAY,EAAGxE,EAAI,EAAE,QAAQ,EAAG,EAAI,EAAE,cAAc,EAAGyJ,EAAI,EAAE,qBAAqB,EAAGvJ,EAAI,EAAE,eAAe,EACtI,SAAS,EAAEnC,EAAG,CACZ,OAAO,IAAIyG,EAAE,QAAQ,SAASvB,EAAG3R,EAAG,CAClC,IAAI2rB,EAAIlf,EAAE,aAAa,iBAAgB,EAAG,KAAK,IAAI0L,CAAG,EACtDwT,EAAE,GAAG,QAAS,SAAStzB,EAAG,CACxB2H,EAAE3H,CAAC,CACL,CAAC,EAAE,GAAG,MAAO,UAAW,CACtBszB,EAAE,WAAW,QAAUlf,EAAE,aAAa,MAAQzM,EAAE,IAAI,MAAM,gCAAgC,CAAC,EAAI2R,EAAC,CAClG,CAAC,EAAE,OAAM,CACX,CAAC,CACH,CACA,EAAE,QAAU,SAASlF,EAAGkF,EAAG,CACzB,IAAI3R,EAAI,KACR,OAAO2R,EAAI9B,EAAE,OAAO8B,GAAK,CAAA,EAAI,CAAE,OAAQ,GAAI,WAAY,GAAI,sBAAuB,GAAI,cAAe,GAAI,eAAgBjD,EAAE,UAAU,CAAE,EAAGE,EAAE,QAAUA,EAAE,SAASnC,CAAC,EAAIyG,EAAE,QAAQ,OAAO,IAAI,MAAM,sDAAsD,CAAC,EAAIrD,EAAE,eAAe,sBAAuBpD,EAAG,GAAIkF,EAAE,sBAAuBA,EAAE,MAAM,EAAE,KAAK,SAASga,EAAG,CAC7V,IAAItzB,EAAI,IAAI,EAAEsZ,CAAC,EACf,OAAOtZ,EAAE,KAAKszB,CAAC,EAAGtzB,CACpB,CAAC,EAAE,KAAK,SAASszB,EAAG,CAClB,IAAItzB,EAAI,CAAC6a,EAAE,QAAQ,QAAQyY,CAAC,CAAC,EAAG1e,EAAI0e,EAAE,MACtC,GAAIha,EAAE,WAAY,QAAShB,EAAI,EAAGA,EAAI1D,EAAE,OAAQ0D,IAAKtY,EAAE,KAAK,EAAE4U,EAAE0D,CAAC,CAAC,CAAC,EACnE,OAAOuC,EAAE,QAAQ,IAAI7a,CAAC,CACxB,CAAC,EAAE,KAAK,SAASszB,EAAG,CAClB,QAAStzB,EAAIszB,EAAE,MAAK,EAAI1e,EAAI5U,EAAE,MAAOsY,EAAI,EAAGA,EAAI1D,EAAE,OAAQ0D,IAAK,CAC7D,IAAIhE,EAAIM,EAAE0D,CAAC,EAAGukF,EAAIvoF,EAAE,YAAagC,EAAIkB,EAAE,QAAQlD,EAAE,WAAW,EAC5D3M,EAAE,KAAK2O,EAAGhC,EAAE,aAAc,CAAE,OAAQ,GAAI,sBAAuB,GAAI,KAAMA,EAAE,KAAM,IAAKA,EAAE,IAAK,QAASA,EAAE,eAAe,OAASA,EAAE,eAAiB,KAAM,gBAAiBA,EAAE,gBAAiB,eAAgBA,EAAE,eAAgB,cAAegF,EAAE,cAAe,EAAGhF,EAAE,MAAQ3M,EAAE,KAAK2O,CAAC,EAAE,mBAAqBumF,EAC7S,CACA,OAAO78F,EAAE,WAAW,SAAW2H,EAAE,QAAU3H,EAAE,YAAa2H,CAC5D,CAAC,CACH,CACF,EAAG,CAAE,aAAc,EAAG,gBAAiB,GAAI,sBAAuB,GAAI,SAAU,GAAI,UAAW,GAAI,eAAgB,GAAI,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC/I,IAAI6P,EAAI,EAAE,UAAU,EAAGqD,EAAI,EAAE,yBAAyB,EACtD,SAASxE,EAAE,EAAGyJ,EAAG,CACfjF,EAAE,KAAK,KAAM,mCAAqC,CAAC,EAAG,KAAK,eAAiB,GAAI,KAAK,YAAYiF,CAAC,CACpG,CACAtI,EAAE,SAASnB,EAAGwE,CAAC,EAAGxE,EAAE,UAAU,YAAc,SAAS,EAAG,CACtD,IAAIyJ,EAAI,MACP,KAAK,QAAU,GAAG,MAAK,EAAI,EAAE,GAAG,OAAQ,SAASvJ,EAAG,CACnDuJ,EAAE,KAAK,CAAE,KAAMvJ,EAAG,KAAM,CAAE,QAAS,CAAC,EAAI,CAC1C,CAAC,EAAE,GAAG,QAAS,SAASA,EAAG,CACzBuJ,EAAE,SAAW,KAAK,eAAiBvJ,EAAIuJ,EAAE,MAAMvJ,CAAC,CAClD,CAAC,EAAE,GAAG,MAAO,UAAW,CACtBuJ,EAAE,SAAWA,EAAE,eAAiB,GAAKA,EAAE,IAAG,CAC5C,CAAC,CACH,EAAGzJ,EAAE,UAAU,MAAQ,UAAW,CAChC,MAAO,CAAC,CAACwE,EAAE,UAAU,MAAM,KAAK,IAAI,IAAM,KAAK,QAAQ,MAAK,EAAI,GAClE,EAAGxE,EAAE,UAAU,OAAS,UAAW,CACjC,MAAO,CAAC,CAACwE,EAAE,UAAU,OAAO,KAAK,IAAI,IAAM,KAAK,eAAiB,KAAK,MAAQ,KAAK,QAAQ,OAAM,EAAI,GACvG,EAAG,EAAE,QAAUxE,CACjB,EAAG,CAAE,0BAA2B,GAAI,WAAY,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC5E,IAAImB,EAAI,EAAE,iBAAiB,EAAE,SAC7B,SAASqD,EAAExE,EAAG,EAAGyJ,EAAG,CAClBtI,EAAE,KAAK,KAAM,CAAC,EAAG,KAAK,QAAUnB,EAChC,IAAIE,EAAI,KACRF,EAAE,GAAG,OAAQ,SAAS,EAAGjC,EAAG,CAC1BmC,EAAE,KAAK,CAAC,GAAKA,EAAE,QAAQ,QAASuJ,GAAKA,EAAE1L,CAAC,CAC1C,CAAC,EAAE,GAAG,QAAS,SAAS,EAAG,CACzBmC,EAAE,KAAK,QAAS,CAAC,CACnB,CAAC,EAAE,GAAG,MAAO,UAAW,CACtBA,EAAE,KAAK,IAAI,CACb,CAAC,CACH,CACA,EAAE,UAAU,EAAE,SAASsE,EAAGrD,CAAC,EAAGqD,EAAE,UAAU,MAAQ,UAAW,CAC3D,KAAK,QAAQ,OAAM,CACrB,EAAG,EAAE,QAAUA,CACjB,EAAG,CAAE,WAAY,GAAI,kBAAmB,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACpE,EAAE,QAAU,CAAE,OAAQ,OAAO,OAAS,IAAK,cAAe,SAASrD,EAAGqD,EAAG,CACvE,GAAI,OAAO,MAAQ,OAAO,OAAS,WAAW,KAAM,OAAO,OAAO,KAAKrD,EAAGqD,CAAC,EAC3E,GAAI,OAAOrD,GAAK,SAAU,MAAM,IAAI,MAAM,0CAA0C,EACpF,OAAO,IAAI,OAAOA,EAAGqD,CAAC,CACxB,EAAG,YAAa,SAASrD,EAAG,CAC1B,GAAI,OAAO,MAAO,OAAO,OAAO,MAAMA,CAAC,EACvC,IAAIqD,EAAI,IAAI,OAAOrD,CAAC,EACpB,OAAOqD,EAAE,KAAK,CAAC,EAAGA,CACpB,EAAG,SAAU,SAASrD,EAAG,CACvB,OAAO,OAAO,SAASA,CAAC,CAC1B,EAAG,SAAU,SAASA,EAAG,CACvB,OAAOA,GAAK,OAAOA,EAAE,IAAM,YAAc,OAAOA,EAAE,OAAS,YAAc,OAAOA,EAAE,QAAU,UAC9F,CAAC,CACH,EAAG,CAAA,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7B,SAASA,EAAElB,EAAGwmF,EAAGC,EAAG,CAClB,IAAIE,EAAGE,EAAI9mF,EAAE,UAAUymF,CAAC,EAAGM,EAAI/mF,EAAE,OAAO0mF,GAAK,CAAA,EAAIxmF,CAAC,EAClD6mF,EAAE,KAAOA,EAAE,MAAwB,IAAI,KAAQA,EAAE,cAAgB,OAASA,EAAE,YAAcA,EAAE,YAAY,YAAW,GAAK,OAAOA,EAAE,iBAAmB,WAAaA,EAAE,gBAAkB,SAASA,EAAE,gBAAiB,CAAC,GAAIA,EAAE,iBAAmB,MAAQA,EAAE,kBAAoBA,EAAE,IAAM,IAAKA,EAAE,gBAAkB,GAAKA,EAAE,iBAAmBA,EAAE,IAAM,IAAKA,EAAE,MAAQ9mF,EAAI1B,EAAE0B,CAAC,GAAI8mF,EAAE,gBAAkBH,EAAIj9F,EAAEsW,CAAC,IAAMgC,EAAE,KAAK,KAAM2kF,EAAG,EAAE,EACzZ,IAAIR,EAAIU,IAAM,UAAYC,EAAE,SAAW,IAAMA,EAAE,SAAW,GAC1DL,GAAKA,EAAE,SAAW,SAAWK,EAAE,OAAS,CAACX,IAAKK,aAAa,GAAKA,EAAE,mBAAqB,GAAKM,EAAE,KAAO,CAACN,GAAKA,EAAE,SAAW,KAAOM,EAAE,OAAS,GAAIA,EAAE,OAAS,GAAIN,EAAI,GAAIM,EAAE,YAAc,QAASD,EAAI,UAClM,IAAIR,EAAI,KACRA,EAAIG,aAAa,GAAKA,aAAa,EAAIA,EAAIn1F,EAAE,QAAUA,EAAE,SAASm1F,CAAC,EAAI,IAAIxpE,EAAEhd,EAAGwmF,CAAC,EAAIzmF,EAAE,eAAeC,EAAGwmF,EAAGM,EAAE,OAAQA,EAAE,sBAAuBA,EAAE,MAAM,EACvJ,IAAIR,EAAI,IAAIxoF,EAAEkC,EAAGqmF,EAAGS,CAAC,EACrB,KAAK,MAAM9mF,CAAC,EAAIsmF,CAClB,CACA,IAAI/hF,EAAI,EAAE,QAAQ,EAAGxE,EAAI,EAAE,SAAS,EAAG,EAAI,EAAE,wBAAwB,EAAGyJ,EAAI,EAAE,uBAAuB,EAAGvJ,EAAI,EAAE,YAAY,EAAG,EAAI,EAAE,oBAAoB,EAAGnC,EAAI,EAAE,aAAa,EAAGkF,EAAI,EAAE,YAAY,EAAG3R,EAAI,EAAE,eAAe,EAAG2rB,EAAI,EAAE,mCAAmC,EAAGtzB,EAAI,SAASsW,EAAG,CACvRA,EAAE,MAAM,EAAE,IAAM,MAAQA,EAAIA,EAAE,UAAU,EAAGA,EAAE,OAAS,CAAC,GACvD,IAAIwmF,EAAIxmF,EAAE,YAAY,GAAG,EACzB,MAAO,GAAIwmF,EAAIxmF,EAAE,UAAU,EAAGwmF,CAAC,EAAI,EACrC,EAAGloF,EAAI,SAAS0B,EAAG,CACjB,OAAOA,EAAE,MAAM,EAAE,IAAM,MAAQA,GAAK,KAAMA,CAC5C,EAAGgC,EAAI,SAAShC,EAAGwmF,EAAG,CACpB,OAAOA,EAAIA,IAAM,OAASA,EAAIvmF,EAAE,cAAeD,EAAI1B,EAAE0B,CAAC,EAAG,KAAK,MAAMA,CAAC,GAAKkB,EAAE,KAAK,KAAMlB,EAAG,KAAM,CAAE,IAAK,GAAI,cAAewmF,CAAC,CAAE,EAAG,KAAK,MAAMxmF,CAAC,CAC9I,EACA,SAAShC,EAAEgC,EAAG,CACZ,OAAO,OAAO,UAAU,SAAS,KAAKA,CAAC,IAAM,iBAC/C,CACA,IAAIumF,EAAI,CAAE,KAAM,UAAW,CACzB,MAAM,IAAI,MAAM,4EAA4E,CAC9F,EAAG,QAAS,SAASvmF,EAAG,CACtB,IAAIwmF,EAAGC,EAAGE,EACV,IAAKH,KAAK,KAAK,MAAOG,EAAI,KAAK,MAAMH,CAAC,GAAIC,EAAID,EAAE,MAAM,KAAK,KAAK,OAAQA,EAAE,MAAM,IAAMA,EAAE,MAAM,EAAG,KAAK,KAAK,MAAM,IAAM,KAAK,MAAQxmF,EAAEymF,EAAGE,CAAC,CAC5I,EAAG,OAAQ,SAAS3mF,EAAG,CACrB,IAAIwmF,EAAI,CAAA,EACR,OAAO,KAAK,QAAQ,SAASC,EAAGE,EAAG,CACjC3mF,EAAEymF,EAAGE,CAAC,GAAKH,EAAE,KAAKG,CAAC,CACrB,CAAC,EAAGH,CACN,EAAG,KAAM,SAASxmF,EAAGwmF,EAAGC,EAAG,CACzB,GAAI,UAAU,SAAW,EAAG,OAAOzmF,EAAI,KAAK,KAAOA,EAAGkB,EAAE,KAAK,KAAMlB,EAAGwmF,EAAGC,CAAC,EAAG,KAC7E,GAAIzoF,EAAEgC,CAAC,EAAG,CACR,IAAI2mF,EAAI3mF,EACR,OAAO,KAAK,OAAO,SAAS8mF,EAAGX,EAAG,CAChC,MAAO,CAACA,EAAE,KAAOQ,EAAE,KAAKG,CAAC,CAC3B,CAAC,CACH,CACA,IAAID,EAAI,KAAK,MAAM,KAAK,KAAO7mF,CAAC,EAChC,OAAO6mF,GAAK,CAACA,EAAE,IAAMA,EAAI,IAC3B,EAAG,OAAQ,SAAS7mF,EAAG,CACrB,GAAI,CAACA,EAAG,OAAO,KACf,GAAIhC,EAAEgC,CAAC,EAAG,OAAO,KAAK,OAAO,SAAS6mF,EAAGC,EAAG,CAC1C,OAAOA,EAAE,KAAO9mF,EAAE,KAAK6mF,CAAC,CAC1B,CAAC,EACD,IAAIL,EAAI,KAAK,KAAOxmF,EAAGymF,EAAIzkF,EAAE,KAAK,KAAMwkF,CAAC,EAAGG,EAAI,KAAK,MAAK,EAC1D,OAAOA,EAAE,KAAOF,EAAE,KAAME,CAC1B,EAAG,OAAQ,SAAS3mF,EAAG,CACrBA,EAAI,KAAK,KAAOA,EAChB,IAAIwmF,EAAI,KAAK,MAAMxmF,CAAC,EACpB,GAAIwmF,IAAMxmF,EAAE,MAAM,EAAE,IAAM,MAAQA,GAAK,KAAMwmF,EAAI,KAAK,MAAMxmF,CAAC,GAAIwmF,GAAK,CAACA,EAAE,IAAK,OAAO,KAAK,MAAMxmF,CAAC,MAC5F,SAASymF,EAAI,KAAK,OAAO,SAASI,EAAGC,EAAG,CAC3C,OAAOA,EAAE,KAAK,MAAM,EAAG9mF,EAAE,MAAM,IAAMA,CACvC,CAAC,EAAG2mF,EAAI,EAAGA,EAAIF,EAAE,OAAQE,IAAK,OAAO,KAAK,MAAMF,EAAEE,CAAC,EAAE,IAAI,EACzD,OAAO,IACT,EAAG,SAAU,UAAW,CACtB,MAAM,IAAI,MAAM,4EAA4E,CAC9F,EAAG,uBAAwB,SAAS3mF,EAAG,CACrC,IAAIwmF,EAAGC,EAAI,CAAA,EACX,GAAI,CACF,IAAKA,EAAI1mF,EAAE,OAAOC,GAAK,GAAI,CAAE,YAAa,GAAI,YAAa,QAAS,mBAAoB,KAAM,KAAM,GAAI,SAAU,MAAO,QAAS,KAAM,SAAU,kBAAmB,eAAgBuE,EAAE,UAAU,CAAE,GAAG,KAAOkiF,EAAE,KAAK,YAAW,EAAIA,EAAE,YAAcA,EAAE,YAAY,YAAW,EAAIA,EAAE,OAAS,iBAAmBA,EAAE,KAAO,UAAW,CAACA,EAAE,KAAM,MAAM,IAAI,MAAM,2BAA2B,EACtX1mF,EAAE,aAAa0mF,EAAE,IAAI,EAAGA,EAAE,WAAa,UAAYA,EAAE,WAAa,WAAaA,EAAE,WAAa,SAAWA,EAAE,WAAa,UAAYA,EAAE,SAAW,QAASA,EAAE,WAAa,UAAYA,EAAE,SAAW,OAClM,IAAIE,EAAIF,EAAE,SAAW,KAAK,SAAW,GACrCD,EAAIxjF,EAAE,eAAe,KAAMyjF,EAAGE,CAAC,CACjC,OAASE,EAAG,EACTL,EAAI,IAAI,EAAE,OAAO,GAAG,MAAMK,CAAC,CAC9B,CACA,OAAO,IAAIr9E,EAAEg9E,EAAGC,EAAE,MAAQ,SAAUA,EAAE,QAAQ,CAChD,EAAG,cAAe,SAASzmF,EAAGwmF,EAAG,CAC/B,OAAO,KAAK,uBAAuBxmF,CAAC,EAAE,WAAWwmF,CAAC,CACpD,EAAG,mBAAoB,SAASxmF,EAAGwmF,EAAG,CACpC,OAAQxmF,EAAIA,GAAK,CAAA,GAAI,OAASA,EAAE,KAAO,cAAe,KAAK,uBAAuBA,CAAC,EAAE,eAAewmF,CAAC,CACvG,CAAC,EACD,EAAE,QAAUD,CACd,EAAG,CAAE,qBAAsB,EAAG,aAAc,EAAG,aAAc,EAAG,oCAAqC,GAAI,gBAAiB,GAAI,yBAA0B,GAAI,wBAAyB,GAAI,SAAU,GAAI,UAAW,GAAI,cAAe,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACjQ,EAAE,QAAU,EAAE,QAAQ,CACxB,EAAG,CAAE,OAAQ,OAAQ,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7C,IAAIrlF,EAAI,EAAE,cAAc,EACxB,SAASqD,EAAExE,EAAG,CACZmB,EAAE,KAAK,KAAMnB,CAAC,EACd,QAAS,EAAI,EAAG,EAAI,KAAK,KAAK,OAAQ,IAAKA,EAAE,CAAC,EAAI,IAAMA,EAAE,CAAC,CAC7D,CACA,EAAE,UAAU,EAAE,SAASwE,EAAGrD,CAAC,EAAGqD,EAAE,UAAU,OAAS,SAASxE,EAAG,CAC7D,OAAO,KAAK,KAAK,KAAK,KAAOA,CAAC,CAChC,EAAGwE,EAAE,UAAU,qBAAuB,SAASxE,EAAG,CAChD,QAAS,EAAIA,EAAE,WAAW,CAAC,EAAGyJ,EAAIzJ,EAAE,WAAW,CAAC,EAAGE,EAAIF,EAAE,WAAW,CAAC,EAAG,EAAIA,EAAE,WAAW,CAAC,EAAGjC,EAAI,KAAK,OAAS,EAAG,GAAKA,EAAG,EAAEA,EAAG,GAAI,KAAK,KAAKA,CAAC,IAAM,GAAK,KAAK,KAAKA,EAAI,CAAC,IAAM0L,GAAK,KAAK,KAAK1L,EAAI,CAAC,IAAMmC,GAAK,KAAK,KAAKnC,EAAI,CAAC,IAAM,EAAG,OAAOA,EAAI,KAAK,KACrP,MAAO,EACT,EAAGyG,EAAE,UAAU,sBAAwB,SAASxE,EAAG,CACjD,IAAI,EAAIA,EAAE,WAAW,CAAC,EAAGyJ,EAAIzJ,EAAE,WAAW,CAAC,EAAGE,EAAIF,EAAE,WAAW,CAAC,EAAG,EAAIA,EAAE,WAAW,CAAC,EAAGjC,EAAI,KAAK,SAAS,CAAC,EAC3G,OAAO,IAAMA,EAAE,CAAC,GAAK0L,IAAM1L,EAAE,CAAC,GAAKmC,IAAMnC,EAAE,CAAC,GAAK,IAAMA,EAAE,CAAC,CAC5D,EAAGyG,EAAE,UAAU,SAAW,SAASxE,EAAG,CACpC,GAAI,KAAK,YAAYA,CAAC,EAAGA,IAAM,EAAG,MAAO,CAAA,EACzC,IAAI,EAAI,KAAK,KAAK,MAAM,KAAK,KAAO,KAAK,MAAO,KAAK,KAAO,KAAK,MAAQA,CAAC,EAC1E,OAAO,KAAK,OAASA,EAAG,CAC1B,EAAG,EAAE,QAAUwE,CACjB,EAAG,CAAE,WAAY,GAAI,eAAgB,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACjE,IAAIrD,EAAI,EAAE,UAAU,EACpB,SAASqD,EAAExE,EAAG,CACZ,KAAK,KAAOA,EAAG,KAAK,OAASA,EAAE,OAAQ,KAAK,MAAQ,EAAG,KAAK,KAAO,CACrE,CACAwE,EAAE,UAAY,CAAE,YAAa,SAASxE,EAAG,CACvC,KAAK,WAAW,KAAK,MAAQA,CAAC,CAChC,EAAG,WAAY,SAASA,EAAG,CACzB,GAAI,KAAK,OAAS,KAAK,KAAOA,GAAKA,EAAI,EAAG,MAAM,IAAI,MAAM,sCAAwC,KAAK,OAAS,mBAAqBA,EAAI,oBAAoB,CAC/J,EAAG,SAAU,SAASA,EAAG,CACvB,KAAK,WAAWA,CAAC,EAAG,KAAK,MAAQA,CACnC,EAAG,KAAM,SAASA,EAAG,CACnB,KAAK,SAAS,KAAK,MAAQA,CAAC,CAC9B,EAAG,OAAQ,UAAW,CACtB,EAAG,QAAS,SAASA,EAAG,CACtB,IAAI,EAAGyJ,EAAI,EACX,IAAK,KAAK,YAAYzJ,CAAC,EAAG,EAAI,KAAK,MAAQA,EAAI,EAAG,GAAK,KAAK,MAAO,IAAKyJ,GAAKA,GAAK,GAAK,KAAK,OAAO,CAAC,EACpG,OAAO,KAAK,OAASzJ,EAAGyJ,CAC1B,EAAG,WAAY,SAASzJ,EAAG,CACzB,OAAOmB,EAAE,YAAY,SAAU,KAAK,SAASnB,CAAC,CAAC,CACjD,EAAG,SAAU,UAAW,CACxB,EAAG,qBAAsB,UAAW,CACpC,EAAG,sBAAuB,UAAW,CACrC,EAAG,SAAU,UAAW,CACtB,IAAIA,EAAI,KAAK,QAAQ,CAAC,EACtB,OAAO,IAAI,KAAK,KAAK,IAAI,MAAQA,GAAK,GAAK,MAAOA,GAAK,GAAK,IAAM,EAAGA,GAAK,GAAK,GAAIA,GAAK,GAAK,GAAIA,GAAK,EAAI,IAAK,GAAKA,IAAM,CAAC,CAAC,CAC9H,CAAC,EAAI,EAAE,QAAUwE,CACnB,EAAG,CAAE,WAAY,GAAI,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7C,IAAIrD,EAAI,EAAE,oBAAoB,EAC9B,SAASqD,EAAExE,EAAG,CACZmB,EAAE,KAAK,KAAMnB,CAAC,CAChB,CACA,EAAE,UAAU,EAAE,SAASwE,EAAGrD,CAAC,EAAGqD,EAAE,UAAU,SAAW,SAASxE,EAAG,CAC/D,KAAK,YAAYA,CAAC,EAClB,IAAI,EAAI,KAAK,KAAK,MAAM,KAAK,KAAO,KAAK,MAAO,KAAK,KAAO,KAAK,MAAQA,CAAC,EAC1E,OAAO,KAAK,OAASA,EAAG,CAC1B,EAAG,EAAE,QAAUwE,CACjB,EAAG,CAAE,WAAY,GAAI,qBAAsB,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACvE,IAAIrD,EAAI,EAAE,cAAc,EACxB,SAASqD,EAAExE,EAAG,CACZmB,EAAE,KAAK,KAAMnB,CAAC,CAChB,CACA,EAAE,UAAU,EAAE,SAASwE,EAAGrD,CAAC,EAAGqD,EAAE,UAAU,OAAS,SAASxE,EAAG,CAC7D,OAAO,KAAK,KAAK,WAAW,KAAK,KAAOA,CAAC,CAC3C,EAAGwE,EAAE,UAAU,qBAAuB,SAASxE,EAAG,CAChD,OAAO,KAAK,KAAK,YAAYA,CAAC,EAAI,KAAK,IACzC,EAAGwE,EAAE,UAAU,sBAAwB,SAASxE,EAAG,CACjD,OAAOA,IAAM,KAAK,SAAS,CAAC,CAC9B,EAAGwE,EAAE,UAAU,SAAW,SAASxE,EAAG,CACpC,KAAK,YAAYA,CAAC,EAClB,IAAI,EAAI,KAAK,KAAK,MAAM,KAAK,KAAO,KAAK,MAAO,KAAK,KAAO,KAAK,MAAQA,CAAC,EAC1E,OAAO,KAAK,OAASA,EAAG,CAC1B,EAAG,EAAE,QAAUwE,CACjB,EAAG,CAAE,WAAY,GAAI,eAAgB,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACjE,IAAIrD,EAAI,EAAE,eAAe,EACzB,SAASqD,EAAExE,EAAG,CACZmB,EAAE,KAAK,KAAMnB,CAAC,CAChB,CACA,EAAE,UAAU,EAAE,SAASwE,EAAGrD,CAAC,EAAGqD,EAAE,UAAU,SAAW,SAASxE,EAAG,CAC/D,GAAI,KAAK,YAAYA,CAAC,EAAGA,IAAM,EAAG,OAAO,IAAI,WAAW,CAAC,EACzD,IAAI,EAAI,KAAK,KAAK,SAAS,KAAK,KAAO,KAAK,MAAO,KAAK,KAAO,KAAK,MAAQA,CAAC,EAC7E,OAAO,KAAK,OAASA,EAAG,CAC1B,EAAG,EAAE,QAAUwE,CACjB,EAAG,CAAE,WAAY,GAAI,gBAAiB,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAClE,IAAIrD,EAAI,EAAE,UAAU,EAAGqD,EAAI,EAAE,YAAY,EAAGxE,EAAI,EAAE,eAAe,EAAG,EAAI,EAAE,gBAAgB,EAAGyJ,EAAI,EAAE,oBAAoB,EAAGvJ,EAAI,EAAE,oBAAoB,EACpJ,EAAE,QAAU,SAAS,EAAG,CACtB,IAAInC,EAAIoD,EAAE,UAAU,CAAC,EACrB,OAAOA,EAAE,aAAapD,CAAC,EAAGA,IAAM,UAAYyG,EAAE,WAAazG,IAAM,aAAe,IAAI0L,EAAE,CAAC,EAAIjF,EAAE,WAAa,IAAItE,EAAEiB,EAAE,YAAY,aAAc,CAAC,CAAC,EAAI,IAAInB,EAAEmB,EAAE,YAAY,QAAS,CAAC,CAAC,EAAI,IAAI,EAAE,CAAC,CAC9L,CACF,EAAG,CAAE,aAAc,GAAI,WAAY,GAAI,gBAAiB,GAAI,qBAAsB,GAAI,iBAAkB,GAAI,qBAAsB,GAAI,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC9J,EAAE,kBAAoB,OAAQ,EAAE,oBAAsB,OAAQ,EAAE,sBAAwB,OAAQ,EAAE,gCAAkC,UAAW,EAAE,4BAA8B,OAAQ,EAAE,gBAAkB,UAC7M,EAAG,CAAA,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7B,IAAIA,EAAI,EAAE,iBAAiB,EAAGqD,EAAI,EAAE,UAAU,EAC9C,SAASxE,EAAE,EAAG,CACZmB,EAAE,KAAK,KAAM,oBAAsB,CAAC,EAAG,KAAK,SAAW,CACzD,CACAqD,EAAE,SAASxE,EAAGmB,CAAC,EAAGnB,EAAE,UAAU,aAAe,SAAS,EAAG,CACvD,KAAK,KAAK,CAAE,KAAMwE,EAAE,YAAY,KAAK,SAAU,EAAE,IAAI,EAAG,KAAM,EAAE,IAAI,CAAE,CACxE,EAAG,EAAE,QAAUxE,CACjB,EAAG,CAAE,WAAY,GAAI,kBAAmB,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACpE,IAAImB,EAAI,EAAE,iBAAiB,EAAGqD,EAAI,EAAE,UAAU,EAC9C,SAASxE,GAAI,CACXmB,EAAE,KAAK,KAAM,YAAY,EAAG,KAAK,eAAe,QAAS,CAAC,CAC5D,CACA,EAAE,UAAU,EAAE,SAASnB,EAAGmB,CAAC,EAAGnB,EAAE,UAAU,aAAe,SAAS,EAAG,CACnE,KAAK,WAAW,MAAQwE,EAAE,EAAE,KAAM,KAAK,WAAW,OAAS,CAAC,EAAG,KAAK,KAAK,CAAC,CAC5E,EAAG,EAAE,QAAUxE,CACjB,EAAG,CAAE,WAAY,EAAG,WAAY,GAAI,kBAAmB,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACnF,IAAImB,EAAI,EAAE,UAAU,EAAGqD,EAAI,EAAE,iBAAiB,EAC9C,SAASxE,EAAE,EAAG,CACZwE,EAAE,KAAK,KAAM,uBAAyB,CAAC,EAAG,KAAK,SAAW,EAAG,KAAK,eAAe,EAAG,CAAC,CACvF,CACArD,EAAE,SAASnB,EAAGwE,CAAC,EAAGxE,EAAE,UAAU,aAAe,SAAS,EAAG,CACvD,GAAI,EAAG,CACL,IAAIyJ,EAAI,KAAK,WAAW,KAAK,QAAQ,GAAK,EAC1C,KAAK,WAAW,KAAK,QAAQ,EAAIA,EAAI,EAAE,KAAK,MAC9C,CACAjF,EAAE,UAAU,aAAa,KAAK,KAAM,CAAC,CACvC,EAAG,EAAE,QAAUxE,CACjB,EAAG,CAAE,WAAY,GAAI,kBAAmB,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACpE,IAAImB,EAAI,EAAE,UAAU,EAAGqD,EAAI,EAAE,iBAAiB,EAC9C,SAASxE,EAAE,EAAG,CACZwE,EAAE,KAAK,KAAM,YAAY,EACzB,IAAIiF,EAAI,KACR,KAAK,YAAc,GAAI,KAAK,MAAQ,EAAG,KAAK,IAAM,EAAG,KAAK,KAAO,KAAM,KAAK,KAAO,GAAI,KAAK,eAAiB,GAAI,EAAE,KAAK,SAASvJ,EAAG,CAClIuJ,EAAE,YAAc,GAAIA,EAAE,KAAOvJ,EAAGuJ,EAAE,IAAMvJ,GAAKA,EAAE,QAAU,EAAGuJ,EAAE,KAAOtI,EAAE,UAAUjB,CAAC,EAAGuJ,EAAE,UAAYA,EAAE,eAAc,CACrH,EAAG,SAASvJ,EAAG,CACbuJ,EAAE,MAAMvJ,CAAC,CACX,CAAC,CACH,CACAiB,EAAE,SAASnB,EAAGwE,CAAC,EAAGxE,EAAE,UAAU,QAAU,UAAW,CACjDwE,EAAE,UAAU,QAAQ,KAAK,IAAI,EAAG,KAAK,KAAO,IAC9C,EAAGxE,EAAE,UAAU,OAAS,UAAW,CACjC,MAAO,CAAC,CAACwE,EAAE,UAAU,OAAO,KAAK,IAAI,IAAM,CAAC,KAAK,gBAAkB,KAAK,cAAgB,KAAK,eAAiB,GAAIrD,EAAE,MAAM,KAAK,eAAgB,GAAI,IAAI,GAAI,GAC7J,EAAGnB,EAAE,UAAU,eAAiB,UAAW,CACzC,KAAK,eAAiB,GAAI,KAAK,UAAY,KAAK,aAAe,KAAK,MAAK,EAAI,KAAK,aAAemB,EAAE,MAAM,KAAK,eAAgB,CAAA,EAAI,IAAI,EAAG,KAAK,eAAiB,IACjK,EAAGnB,EAAE,UAAU,MAAQ,UAAW,CAChC,GAAI,KAAK,UAAY,KAAK,WAAY,MAAO,GAC7C,IAAI,EAAI,KAAMyJ,EAAI,KAAK,IAAI,KAAK,IAAK,KAAK,MAAQ,KAAK,EACvD,GAAI,KAAK,OAAS,KAAK,IAAK,OAAO,KAAK,IAAG,EAC3C,OAAQ,KAAK,KAAI,CACf,IAAK,SACH,EAAI,KAAK,KAAK,UAAU,KAAK,MAAOA,CAAC,EACrC,MACF,IAAK,aACH,EAAI,KAAK,KAAK,SAAS,KAAK,MAAOA,CAAC,EACpC,MACF,IAAK,QACL,IAAK,aACH,EAAI,KAAK,KAAK,MAAM,KAAK,MAAOA,CAAC,CAC/C,CACU,OAAO,KAAK,MAAQA,EAAG,KAAK,KAAK,CAAE,KAAM,EAAG,KAAM,CAAE,QAAS,KAAK,IAAM,KAAK,MAAQ,KAAK,IAAM,IAAM,CAAC,EAAI,CAC7G,EAAG,EAAE,QAAUzJ,CACjB,EAAG,CAAE,WAAY,GAAI,kBAAmB,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACpE,SAASmB,EAAEqD,EAAG,CACZ,KAAK,KAAOA,GAAK,UAAW,KAAK,WAAa,GAAI,KAAK,eAAiB,KAAM,KAAK,gBAAkB,CAAA,EAAI,KAAK,SAAW,GAAI,KAAK,WAAa,GAAI,KAAK,SAAW,GAAI,KAAK,WAAa,CAAE,KAAM,CAAA,EAAI,IAAK,CAAA,EAAI,MAAO,CAAA,CAAE,EAAI,KAAK,SAAW,IAC7O,CACArD,EAAE,UAAY,CAAE,KAAM,SAASqD,EAAG,CAChC,KAAK,KAAK,OAAQA,CAAC,CACrB,EAAG,IAAK,UAAW,CACjB,GAAI,KAAK,WAAY,MAAO,GAC5B,KAAK,MAAK,EACV,GAAI,CACF,KAAK,KAAK,KAAK,EAAG,KAAK,UAAW,KAAK,WAAa,EACtD,OAASA,EAAG,CACV,KAAK,KAAK,QAASA,CAAC,CACtB,CACA,MAAO,EACT,EAAG,MAAO,SAASA,EAAG,CACpB,MAAO,CAAC,KAAK,aAAe,KAAK,SAAW,KAAK,eAAiBA,GAAK,KAAK,WAAa,GAAI,KAAK,KAAK,QAASA,CAAC,EAAG,KAAK,UAAY,KAAK,SAAS,MAAMA,CAAC,EAAG,KAAK,QAAO,GAAK,GAChL,EAAG,GAAI,SAASA,EAAGxE,EAAG,CACpB,OAAO,KAAK,WAAWwE,CAAC,EAAE,KAAKxE,CAAC,EAAG,IACrC,EAAG,QAAS,UAAW,CACrB,KAAK,WAAa,KAAK,eAAiB,KAAK,gBAAkB,KAAM,KAAK,WAAa,CAAA,CACzF,EAAG,KAAM,SAASwE,EAAGxE,EAAG,CACtB,GAAI,KAAK,WAAWwE,CAAC,EAAG,QAAS,EAAI,EAAG,EAAI,KAAK,WAAWA,CAAC,EAAE,OAAQ,IAAK,KAAK,WAAWA,CAAC,EAAE,CAAC,EAAE,KAAK,KAAMxE,CAAC,CAChH,EAAG,KAAM,SAASwE,EAAG,CACnB,OAAOA,EAAE,iBAAiB,IAAI,CAChC,EAAG,iBAAkB,SAASA,EAAG,CAC/B,GAAI,KAAK,SAAU,MAAM,IAAI,MAAM,eAAiB,KAAO,0BAA0B,EACrF,KAAK,WAAaA,EAAE,WAAY,KAAK,gBAAe,EAAI,KAAK,SAAWA,EACxE,IAAIxE,EAAI,KACR,OAAOwE,EAAE,GAAG,OAAQ,SAAS,EAAG,CAC9BxE,EAAE,aAAa,CAAC,CAClB,CAAC,EAAGwE,EAAE,GAAG,MAAO,UAAW,CACzBxE,EAAE,IAAG,CACP,CAAC,EAAGwE,EAAE,GAAG,QAAS,SAAS,EAAG,CAC5BxE,EAAE,MAAM,CAAC,CACX,CAAC,EAAG,IACN,EAAG,MAAO,UAAW,CACnB,MAAO,CAAC,KAAK,UAAY,CAAC,KAAK,aAAe,KAAK,SAAW,GAAI,KAAK,UAAY,KAAK,SAAS,MAAK,EAAI,GAC5G,EAAG,OAAQ,UAAW,CACpB,GAAI,CAAC,KAAK,UAAY,KAAK,WAAY,MAAO,GAC9C,IAAIwE,EAAI,KAAK,SAAW,GACxB,OAAO,KAAK,iBAAmB,KAAK,MAAM,KAAK,cAAc,EAAGA,EAAI,IAAK,KAAK,UAAY,KAAK,SAAS,OAAM,EAAI,CAACA,CACrH,EAAG,MAAO,UAAW,CACrB,EAAG,aAAc,SAASA,EAAG,CAC3B,KAAK,KAAKA,CAAC,CACb,EAAG,eAAgB,SAASA,EAAGxE,EAAG,CAChC,OAAO,KAAK,gBAAgBwE,CAAC,EAAIxE,EAAG,KAAK,gBAAe,EAAI,IAC9D,EAAG,gBAAiB,UAAW,CAC7B,QAASwE,KAAK,KAAK,gBAAiB,OAAO,UAAU,eAAe,KAAK,KAAK,gBAAiBA,CAAC,IAAM,KAAK,WAAWA,CAAC,EAAI,KAAK,gBAAgBA,CAAC,EACnJ,EAAG,KAAM,UAAW,CAClB,GAAI,KAAK,SAAU,MAAM,IAAI,MAAM,eAAiB,KAAO,0BAA0B,EACrF,KAAK,SAAW,GAAI,KAAK,UAAY,KAAK,SAAS,KAAI,CACzD,EAAG,SAAU,UAAW,CACtB,IAAIA,EAAI,UAAY,KAAK,KACzB,OAAO,KAAK,SAAW,KAAK,SAAW,OAASA,EAAIA,CACtD,CAAC,EAAI,EAAE,QAAUrD,CACnB,EAAG,CAAA,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7B,IAAIA,EAAI,EAAE,UAAU,EAAGqD,EAAI,EAAE,iBAAiB,EAAGxE,EAAI,EAAE,iBAAiB,EAAG,EAAI,EAAE,WAAW,EAAGyJ,EAAI,EAAE,YAAY,EAAGvJ,EAAI,EAAE,aAAa,EAAG,EAAI,KAC9I,GAAIuJ,EAAE,WAAY,GAAI,CACpB,EAAI,EAAE,qCAAqC,CAC7C,MAAQ,CACR,CACA,SAAS1L,EAAEzM,EAAG2rB,EAAG,CACf,OAAO,IAAI/c,EAAE,QAAQ,SAASvW,EAAG4U,EAAG,CAClC,IAAI0D,EAAI,CAAA,EAAIhE,EAAI3M,EAAE,cAAek1F,EAAIl1F,EAAE,YAAa2O,EAAI3O,EAAE,UAC1DA,EAAE,GAAG,OAAQ,SAASm1F,EAAGC,EAAG,CAC1BzkF,EAAE,KAAKwkF,CAAC,EAAGxpE,GAAKA,EAAEypE,CAAC,CACrB,CAAC,EAAE,GAAG,QAAS,SAASD,EAAG,CACzBxkF,EAAI,CAAA,EAAI1D,EAAEkoF,CAAC,CACb,CAAC,EAAE,GAAG,MAAO,UAAW,CACtB,GAAI,CACF,IAAIA,GAAK,SAASC,EAAGE,EAAGE,EAAG,CACzB,OAAQJ,EAAC,CACP,IAAK,OACH,OAAOvlF,EAAE,QAAQA,EAAE,YAAY,cAAeylF,CAAC,EAAGE,CAAC,EACrD,IAAK,SACH,OAAO,EAAE,OAAOF,CAAC,EACnB,QACE,OAAOzlF,EAAE,YAAYulF,EAAGE,CAAC,CAC/C,CACgB,GAAGJ,GAAI,SAASE,EAAGE,EAAG,CACpB,IAAIE,EAAGC,EAAI,EAAGX,EAAI,KAAME,EAAI,EAC5B,IAAKQ,EAAI,EAAGA,EAAIF,EAAE,OAAQE,IAAKR,GAAKM,EAAEE,CAAC,EAAE,OACzC,OAAQJ,EAAC,CACP,IAAK,SACH,OAAOE,EAAE,KAAK,EAAE,EAClB,IAAK,QACH,OAAO,MAAM,UAAU,OAAO,MAAM,CAAA,EAAIA,CAAC,EAC3C,IAAK,aACH,IAAKR,EAAI,IAAI,WAAWE,CAAC,EAAGQ,EAAI,EAAGA,EAAIF,EAAE,OAAQE,IAAKV,EAAE,IAAIQ,EAAEE,CAAC,EAAGC,CAAC,EAAGA,GAAKH,EAAEE,CAAC,EAAE,OAChF,OAAOV,EACT,IAAK,aACH,OAAO,OAAO,OAAOQ,CAAC,EACxB,QACE,MAAM,IAAI,MAAM,8BAAgCF,EAAI,GAAG,CAC7E,CACgB,GAAGzoF,EAAGgE,CAAC,EAAGhC,CAAC,EACXtW,EAAE88F,CAAC,CACL,OAASC,EAAG,CACVnoF,EAAEmoF,CAAC,CACL,CACAzkF,EAAI,CAAA,CACN,CAAC,EAAE,OAAM,CACX,CAAC,CACH,CACA,SAASgB,EAAE3R,EAAG2rB,EAAGtzB,EAAG,CAClB,IAAI4U,EAAI0e,EACR,OAAQA,EAAC,CACP,IAAK,OACL,IAAK,cACH1e,EAAI,aACJ,MACF,IAAK,SACHA,EAAI,QAClB,CACU,GAAI,CACF,KAAK,cAAgBA,EAAG,KAAK,YAAc0e,EAAG,KAAK,UAAYtzB,EAAGwX,EAAE,aAAa5C,CAAC,EAAG,KAAK,QAAUjN,EAAE,KAAK,IAAIkT,EAAEjG,CAAC,CAAC,EAAGjN,EAAE,KAAI,CAC9H,OAAS2Q,EAAG,CACV,KAAK,QAAU,IAAIjC,EAAE,OAAO,EAAG,KAAK,QAAQ,MAAMiC,CAAC,CACrD,CACF,CACAgB,EAAE,UAAY,CAAE,WAAY,SAAS3R,EAAG,CACtC,OAAOyM,EAAE,KAAMzM,CAAC,CAClB,EAAG,GAAI,SAASA,EAAG2rB,EAAG,CACpB,IAAItzB,EAAI,KACR,OAAO2H,IAAM,OAAS,KAAK,QAAQ,GAAGA,EAAG,SAASiN,EAAG,CACnD0e,EAAE,KAAKtzB,EAAG4U,EAAE,KAAMA,EAAE,IAAI,CAC1B,CAAC,EAAI,KAAK,QAAQ,GAAGjN,EAAG,UAAW,CACjC6P,EAAE,MAAM8b,EAAG,UAAWtzB,CAAC,CACzB,CAAC,EAAG,IACN,EAAG,OAAQ,UAAW,CACpB,OAAOwX,EAAE,MAAM,KAAK,QAAQ,OAAQ,GAAI,KAAK,OAAO,EAAG,IACzD,EAAG,MAAO,UAAW,CACnB,OAAO,KAAK,QAAQ,MAAK,EAAI,IAC/B,EAAG,eAAgB,SAAS7P,EAAG,CAC7B,GAAI6P,EAAE,aAAa,YAAY,EAAG,KAAK,cAAgB,aAAc,MAAM,IAAI,MAAM,KAAK,YAAc,kCAAkC,EAC1I,OAAO,IAAI,EAAE,KAAM,CAAE,WAAY,KAAK,cAAgB,YAAY,EAAI7P,CAAC,CACzE,CAAC,EAAI,EAAE,QAAU2R,CACnB,EAAG,CAAE,YAAa,EAAG,cAAe,EAAG,sCAAuC,GAAI,aAAc,GAAI,WAAY,GAAI,kBAAmB,GAAI,kBAAmB,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC1L,GAAI,EAAE,OAAS,GAAI,EAAE,MAAQ,GAAI,EAAE,OAAS,GAAI,EAAE,YAAc,OAAO,YAAc,KAAO,OAAO,WAAa,IAAK,EAAE,WAAa,OAAO,OAAS,IAAK,EAAE,WAAa,OAAO,WAAa,IAAK,OAAO,YAAc,IAAK,EAAE,KAAO,OAC/N,CACH,IAAI9B,EAAI,IAAI,YAAY,CAAC,EACzB,GAAI,CACF,EAAE,KAAO,IAAI,KAAK,CAACA,CAAC,EAAG,CAAE,KAAM,iBAAiB,CAAE,EAAE,OAAS,CAC/D,MAAQ,CACN,GAAI,CACF,IAAIqD,EAAI,IAAK,KAAK,aAAe,KAAK,mBAAqB,KAAK,gBAAkB,KAAK,eACvFA,EAAE,OAAOrD,CAAC,EAAG,EAAE,KAAOqD,EAAE,QAAQ,iBAAiB,EAAE,OAAS,CAC9D,MAAQ,CACN,EAAE,KAAO,EACX,CACF,CACF,CACA,GAAI,CACF,EAAE,WAAa,CAAC,CAAC,EAAE,iBAAiB,EAAE,QACxC,MAAQ,CACN,EAAE,WAAa,EACjB,CACF,EAAG,CAAE,kBAAmB,GAAI,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACpD,QAASrD,EAAI,EAAE,SAAS,EAAGqD,EAAI,EAAE,WAAW,EAAGxE,EAAI,EAAE,eAAe,EAAG,EAAI,EAAE,wBAAwB,EAAGyJ,EAAI,IAAI,MAAM,GAAG,EAAGvJ,EAAI,EAAGA,EAAI,IAAKA,IAAKuJ,EAAEvJ,CAAC,EAAI,KAAOA,EAAI,EAAI,KAAOA,EAAI,EAAI,KAAOA,EAAI,EAAI,KAAOA,EAAI,EAAI,KAAOA,EAAI,EAAI,EACnOuJ,EAAE,GAAG,EAAIA,EAAE,GAAG,EAAI,EAClB,SAAS,GAAI,CACX,EAAE,KAAK,KAAM,cAAc,EAAG,KAAK,SAAW,IAChD,CACA,SAAS1L,GAAI,CACX,EAAE,KAAK,KAAM,cAAc,CAC7B,CACA,EAAE,WAAa,SAASkF,EAAG,CACzB,OAAOuB,EAAE,WAAaxE,EAAE,cAAciD,EAAG,OAAO,GAAK,SAAS3R,EAAG,CAC/D,IAAI2rB,EAAGtzB,EAAG4U,EAAG0D,EAAGhE,EAAGuoF,EAAIl1F,EAAE,OAAQ2O,EAAI,EACrC,IAAKgC,EAAI,EAAGA,EAAIukF,EAAGvkF,KAAM,OAAStY,EAAI2H,EAAE,WAAW2Q,CAAC,KAAO,OAASA,EAAI,EAAIukF,IAAM,OAASjoF,EAAIjN,EAAE,WAAW2Q,EAAI,CAAC,KAAO,QAAUtY,EAAI,OAASA,EAAI,OAAS,KAAO4U,EAAI,OAAQ0D,KAAMhC,GAAKtW,EAAI,IAAM,EAAIA,EAAI,KAAO,EAAIA,EAAI,MAAQ,EAAI,EACvO,IAAKszB,EAAIzY,EAAE,WAAa,IAAI,WAAWvE,CAAC,EAAI,IAAI,MAAMA,CAAC,EAAGgC,EAAIhE,EAAI,EAAGA,EAAIgC,EAAGgC,KAAM,OAAStY,EAAI2H,EAAE,WAAW2Q,CAAC,KAAO,OAASA,EAAI,EAAIukF,IAAM,OAASjoF,EAAIjN,EAAE,WAAW2Q,EAAI,CAAC,KAAO,QAAUtY,EAAI,OAASA,EAAI,OAAS,KAAO4U,EAAI,OAAQ0D,KAAMtY,EAAI,IAAMszB,EAAEhf,GAAG,EAAItU,GAAKA,EAAI,KAAOszB,EAAEhf,GAAG,EAAI,IAAMtU,IAAM,GAAKA,EAAI,MAAQszB,EAAEhf,GAAG,EAAI,IAAMtU,IAAM,IAAMszB,EAAEhf,GAAG,EAAI,IAAMtU,IAAM,GAAIszB,EAAEhf,GAAG,EAAI,IAAMtU,IAAM,GAAK,IAAKszB,EAAEhf,GAAG,EAAI,IAAMtU,IAAM,EAAI,IAAKszB,EAAEhf,GAAG,EAAI,IAAM,GAAKtU,GAC5b,OAAOszB,CACT,GAAGha,CAAC,CACN,EAAG,EAAE,WAAa,SAASA,EAAG,CAC5B,OAAOuB,EAAE,WAAarD,EAAE,YAAY,aAAc8B,CAAC,EAAE,SAAS,OAAO,GAAK,SAAS3R,EAAG,CACpF,IAAI2rB,EAAGtzB,EAAG4U,EAAG0D,EAAGhE,EAAI3M,EAAE,OAAQk1F,EAAI,IAAI,MAAM,EAAIvoF,CAAC,EACjD,IAAKgf,EAAItzB,EAAI,EAAGszB,EAAIhf,GAAK,IAAKM,EAAIjN,EAAE2rB,GAAG,GAAK,IAAKupE,EAAE78F,GAAG,EAAI4U,UACjD,GAAK0D,EAAIwH,EAAElL,CAAC,GAAIioF,EAAE78F,GAAG,EAAI,MAAOszB,GAAKhb,EAAI,MAC7C,CACH,IAAK1D,GAAK0D,IAAM,EAAI,GAAKA,IAAM,EAAI,GAAK,EAAG,EAAIA,GAAKgb,EAAIhf,GAAKM,EAAIA,GAAK,EAAI,GAAKjN,EAAE2rB,GAAG,EAAGhb,IACvF,EAAIA,EAAIukF,EAAE78F,GAAG,EAAI,MAAQ4U,EAAI,MAAQioF,EAAE78F,GAAG,EAAI4U,GAAKA,GAAK,MAAOioF,EAAE78F,GAAG,EAAI,MAAQ4U,GAAK,GAAK,KAAMioF,EAAE78F,GAAG,EAAI,MAAQ,KAAO4U,EAC1H,CACA,OAAOioF,EAAE,SAAW78F,IAAM68F,EAAE,SAAWA,EAAIA,EAAE,SAAS,EAAG78F,CAAC,EAAI68F,EAAE,OAAS78F,GAAIwX,EAAE,kBAAkBqlF,CAAC,CACpG,GAAGvjF,EAAI9B,EAAE,YAAYqD,EAAE,WAAa,aAAe,QAASvB,CAAC,CAAC,CAChE,EAAG9B,EAAE,SAAS,EAAG,CAAC,EAAG,EAAE,UAAU,aAAe,SAAS8B,EAAG,CAC1D,IAAI3R,EAAI6P,EAAE,YAAYqD,EAAE,WAAa,aAAe,QAASvB,EAAE,IAAI,EACnE,GAAI,KAAK,UAAY,KAAK,SAAS,OAAQ,CACzC,GAAIuB,EAAE,WAAY,CAChB,IAAIyY,EAAI3rB,GACPA,EAAI,IAAI,WAAW2rB,EAAE,OAAS,KAAK,SAAS,MAAM,GAAG,IAAI,KAAK,SAAU,CAAC,EAAG3rB,EAAE,IAAI2rB,EAAG,KAAK,SAAS,MAAM,CAC5G,MAAO3rB,EAAI,KAAK,SAAS,OAAOA,CAAC,EACjC,KAAK,SAAW,IAClB,CACA,IAAI3H,GAAK,SAASsY,EAAGhE,EAAG,CACtB,IAAIuoF,EACJ,KAAMvoF,EAAIA,GAAKgE,EAAE,QAAUA,EAAE,SAAWhE,EAAIgE,EAAE,QAASukF,EAAIvoF,EAAI,EAAG,GAAKuoF,IAAM,IAAMvkF,EAAEukF,CAAC,IAAM,KAAOA,IACnG,OAAOA,EAAI,GAAKA,IAAM,EAAIvoF,EAAIuoF,EAAI/8E,EAAExH,EAAEukF,CAAC,CAAC,EAAIvoF,EAAIuoF,EAAIvoF,CACtD,GAAG3M,CAAC,EAAGiN,EAAIjN,EACX3H,IAAM2H,EAAE,SAAWkT,EAAE,YAAcjG,EAAIjN,EAAE,SAAS,EAAG3H,CAAC,EAAG,KAAK,SAAW2H,EAAE,SAAS3H,EAAG2H,EAAE,MAAM,IAAMiN,EAAIjN,EAAE,MAAM,EAAG3H,CAAC,EAAG,KAAK,SAAW2H,EAAE,MAAM3H,EAAG2H,EAAE,MAAM,IAAK,KAAK,KAAK,CAAE,KAAM,EAAE,WAAWiN,CAAC,EAAG,KAAM0E,EAAE,KAAM,CACnN,EAAG,EAAE,UAAU,MAAQ,UAAW,CAChC,KAAK,UAAY,KAAK,SAAS,SAAW,KAAK,KAAK,CAAE,KAAM,EAAE,WAAW,KAAK,QAAQ,EAAG,KAAM,CAAA,CAAE,CAAE,EAAG,KAAK,SAAW,KACxH,EAAG,EAAE,iBAAmB,EAAG9B,EAAE,SAASpD,EAAG,CAAC,EAAGA,EAAE,UAAU,aAAe,SAASkF,EAAG,CAClF,KAAK,KAAK,CAAE,KAAM,EAAE,WAAWA,EAAE,IAAI,EAAG,KAAMA,EAAE,IAAI,CAAE,CACxD,EAAG,EAAE,iBAAmBlF,CAC1B,EAAG,CAAE,gBAAiB,GAAI,yBAA0B,GAAI,YAAa,GAAI,UAAW,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAChH,IAAIoD,EAAI,EAAE,WAAW,EAAGqD,EAAI,EAAE,UAAU,EAAGxE,EAAI,EAAE,eAAe,EAAG,EAAI,EAAE,YAAY,EACrF,SAASyJ,EAAEwT,EAAG,CACZ,OAAOA,CACT,CACA,SAAS/c,EAAE+c,EAAGtzB,EAAG,CACf,QAAS4U,EAAI,EAAGA,EAAI0e,EAAE,OAAQ,EAAE1e,EAAG5U,EAAE4U,CAAC,EAAI,IAAM0e,EAAE,WAAW1e,CAAC,EAC9D,OAAO5U,CACT,CACA,EAAE,cAAc,EAAG,EAAE,QAAU,SAASszB,EAAGtzB,EAAG,CAC5C,EAAE,aAAa,MAAM,EACrB,GAAI,CACF,OAAO,IAAI,KAAK,CAACszB,CAAC,EAAG,CAAE,KAAMtzB,EAAG,CAClC,MAAQ,CACN,GAAI,CACF,IAAI4U,EAAI,IAAK,KAAK,aAAe,KAAK,mBAAqB,KAAK,gBAAkB,KAAK,eACvF,OAAOA,EAAE,OAAO0e,CAAC,EAAG1e,EAAE,QAAQ5U,CAAC,CACjC,MAAQ,CACN,MAAM,IAAI,MAAM,iCAAiC,CACnD,CACF,CACF,EACA,IAAI,EAAI,CAAE,iBAAkB,SAASszB,EAAGtzB,EAAG4U,EAAG,CAC5C,IAAI0D,EAAI,CAAA,EAAIhE,EAAI,EAAGuoF,EAAIvpE,EAAE,OACzB,GAAIupE,GAAKjoF,EAAG,OAAO,OAAO,aAAa,MAAM,KAAM0e,CAAC,EACpD,KAAOhf,EAAIuoF,GAAK78F,IAAM,SAAWA,IAAM,aAAesY,EAAE,KAAK,OAAO,aAAa,MAAM,KAAMgb,EAAE,MAAMhf,EAAG,KAAK,IAAIA,EAAIM,EAAGioF,CAAC,CAAC,CAAC,CAAC,EAAIvkF,EAAE,KAAK,OAAO,aAAa,MAAM,KAAMgb,EAAE,SAAShf,EAAG,KAAK,IAAIA,EAAIM,EAAGioF,CAAC,CAAC,CAAC,CAAC,EAAGvoF,GAAKM,EACjN,OAAO0D,EAAE,KAAK,EAAE,CAClB,EAAG,gBAAiB,SAASgb,EAAG,CAC9B,QAAStzB,EAAI,GAAI4U,EAAI,EAAGA,EAAI0e,EAAE,OAAQ1e,IAAK5U,GAAK,OAAO,aAAaszB,EAAE1e,CAAC,CAAC,EACxE,OAAO5U,CACT,EAAG,eAAgB,CAAE,YAAa,UAAW,CAC3C,GAAI,CACF,OAAOwX,EAAE,YAAc,OAAO,aAAa,MAAM,KAAM,IAAI,WAAW,CAAC,CAAC,EAAE,SAAW,CACvF,MAAQ,CACN,MAAO,EACT,CACF,GAAC,EAAK,YAAa,UAAW,CAC5B,GAAI,CACF,OAAOA,EAAE,YAAc,OAAO,aAAa,MAAM,KAAMnB,EAAE,YAAY,CAAC,CAAC,EAAE,SAAW,CACtF,MAAQ,CACN,MAAO,EACT,CACF,GAAC,CAAG,CAAE,EACN,SAASjC,EAAEkf,EAAG,CACZ,IAAItzB,EAAI,MAAO4U,EAAI,EAAE,UAAU0e,CAAC,EAAGhb,EAAI,GACvC,GAAI1D,IAAM,aAAe0D,EAAI,EAAE,eAAe,WAAa1D,IAAM,eAAiB0D,EAAI,EAAE,eAAe,YAAaA,EAAG,KAAO,EAAItY,GAAK,GAAI,CACzI,OAAO,EAAE,iBAAiBszB,EAAG1e,EAAG5U,CAAC,CACnC,MAAQ,CACNA,EAAI,KAAK,MAAMA,EAAI,CAAC,CACtB,CACA,OAAO,EAAE,gBAAgBszB,CAAC,CAC5B,CACA,SAASha,EAAEga,EAAGtzB,EAAG,CACf,QAAS4U,EAAI,EAAGA,EAAI0e,EAAE,OAAQ1e,IAAK5U,EAAE4U,CAAC,EAAI0e,EAAE1e,CAAC,EAC7C,OAAO5U,CACT,CACA,EAAE,kBAAoBoU,EACtB,IAAIzM,EAAI,CAAA,EACRA,EAAE,OAAS,CAAE,OAAQmY,EAAG,MAAO,SAASwT,EAAG,CACzC,OAAO/c,EAAE+c,EAAG,IAAI,MAAMA,EAAE,MAAM,CAAC,CACjC,EAAG,YAAa,SAASA,EAAG,CAC1B,OAAO3rB,EAAE,OAAO,WAAW2rB,CAAC,EAAE,MAChC,EAAG,WAAY,SAASA,EAAG,CACzB,OAAO/c,EAAE+c,EAAG,IAAI,WAAWA,EAAE,MAAM,CAAC,CACtC,EAAG,WAAY,SAASA,EAAG,CACzB,OAAO/c,EAAE+c,EAAGjd,EAAE,YAAYid,EAAE,MAAM,CAAC,CACrC,GAAK3rB,EAAE,MAAQ,CAAE,OAAQyM,EAAG,MAAO0L,EAAG,YAAa,SAASwT,EAAG,CAC7D,OAAO,IAAI,WAAWA,CAAC,EAAE,MAC3B,EAAG,WAAY,SAASA,EAAG,CACzB,OAAO,IAAI,WAAWA,CAAC,CACzB,EAAG,WAAY,SAASA,EAAG,CACzB,OAAOjd,EAAE,cAAcid,CAAC,CAC1B,CAAC,EAAI3rB,EAAE,YAAc,CAAE,OAAQ,SAAS2rB,EAAG,CACzC,OAAOlf,EAAE,IAAI,WAAWkf,CAAC,CAAC,CAC5B,EAAG,MAAO,SAASA,EAAG,CACpB,OAAOha,EAAE,IAAI,WAAWga,CAAC,EAAG,IAAI,MAAMA,EAAE,UAAU,CAAC,CACrD,EAAG,YAAaxT,EAAG,WAAY,SAASwT,EAAG,CACzC,OAAO,IAAI,WAAWA,CAAC,CACzB,EAAG,WAAY,SAASA,EAAG,CACzB,OAAOjd,EAAE,cAAc,IAAI,WAAWid,CAAC,CAAC,CAC1C,CAAC,EAAI3rB,EAAE,WAAa,CAAE,OAAQyM,EAAG,MAAO,SAASkf,EAAG,CAClD,OAAOha,EAAEga,EAAG,IAAI,MAAMA,EAAE,MAAM,CAAC,CACjC,EAAG,YAAa,SAASA,EAAG,CAC1B,OAAOA,EAAE,MACX,EAAG,WAAYxT,EAAG,WAAY,SAASwT,EAAG,CACxC,OAAOjd,EAAE,cAAcid,CAAC,CAC1B,CAAC,EAAI3rB,EAAE,WAAa,CAAE,OAAQyM,EAAG,MAAO,SAASkf,EAAG,CAClD,OAAOha,EAAEga,EAAG,IAAI,MAAMA,EAAE,MAAM,CAAC,CACjC,EAAG,YAAa,SAASA,EAAG,CAC1B,OAAO3rB,EAAE,WAAW,WAAW2rB,CAAC,EAAE,MACpC,EAAG,WAAY,SAASA,EAAG,CACzB,OAAOha,EAAEga,EAAG,IAAI,WAAWA,EAAE,MAAM,CAAC,CACtC,EAAG,WAAYxT,CAAC,EAAI,EAAE,YAAc,SAASwT,EAAGtzB,EAAG,CACjD,GAAIA,EAAIA,GAAK,GAAI,CAACszB,EAAG,OAAOtzB,EAC5B,EAAE,aAAaszB,CAAC,EAChB,IAAI1e,EAAI,EAAE,UAAU5U,CAAC,EACrB,OAAO2H,EAAEiN,CAAC,EAAE0e,CAAC,EAAEtzB,CAAC,CAClB,EAAG,EAAE,QAAU,SAASszB,EAAG,CACzB,QAAStzB,EAAIszB,EAAE,MAAM,GAAG,EAAG1e,EAAI,CAAA,EAAI0D,EAAI,EAAGA,EAAItY,EAAE,OAAQsY,IAAK,CAC3D,IAAIhE,EAAItU,EAAEsY,CAAC,EACXhE,IAAM,KAAOA,IAAM,IAAMgE,IAAM,GAAKA,IAAMtY,EAAE,OAAS,IAAMsU,IAAM,KAAOM,EAAE,IAAG,EAAKA,EAAE,KAAKN,CAAC,EAC5F,CACA,OAAOM,EAAE,KAAK,GAAG,CACnB,EAAG,EAAE,UAAY,SAAS0e,EAAG,CAC3B,OAAO,OAAOA,GAAK,SAAW,SAAW,OAAO,UAAU,SAAS,KAAKA,CAAC,IAAM,iBAAmB,QAAU9b,EAAE,YAAcnB,EAAE,SAASid,CAAC,EAAI,aAAe9b,EAAE,YAAc8b,aAAa,WAAa,aAAe9b,EAAE,aAAe8b,aAAa,YAAc,cAAgB,MAClR,EAAG,EAAE,aAAe,SAASA,EAAG,CAC9B,GAAI,CAAC9b,EAAE8b,EAAE,YAAW,CAAE,EAAG,MAAM,IAAI,MAAMA,EAAI,oCAAoC,CACnF,EAAG,EAAE,iBAAmB,MAAO,EAAE,iBAAmB,GAAI,EAAE,OAAS,SAASA,EAAG,CAC7E,IAAItzB,EAAG4U,EAAG0D,EAAI,GACd,IAAK1D,EAAI,EAAGA,GAAK0e,GAAK,IAAI,OAAQ1e,IAAK0D,GAAK,QAAUtY,EAAIszB,EAAE,WAAW1e,CAAC,GAAK,GAAK,IAAM,IAAM5U,EAAE,SAAS,EAAE,EAAE,YAAW,EACxH,OAAOsY,CACT,EAAG,EAAE,MAAQ,SAASgb,EAAGtzB,EAAG4U,EAAG,CAC7B,aAAa,UAAW,CACtB0e,EAAE,MAAM1e,GAAK,KAAM5U,GAAK,CAAA,CAAE,CAC5B,CAAC,CACH,EAAG,EAAE,SAAW,SAASszB,EAAGtzB,EAAG,CAC7B,SAAS4U,GAAI,CACb,CACAA,EAAE,UAAY5U,EAAE,UAAWszB,EAAE,UAAY,IAAI1e,CAC/C,EAAG,EAAE,OAAS,UAAW,CACvB,IAAI0e,EAAGtzB,EAAG4U,EAAI,CAAA,EACd,IAAK0e,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,IAAKtzB,KAAK,UAAUszB,CAAC,EAAG,OAAO,UAAU,eAAe,KAAK,UAAUA,CAAC,EAAGtzB,CAAC,GAAK4U,EAAE5U,CAAC,IAAM,SAAW4U,EAAE5U,CAAC,EAAI,UAAUszB,CAAC,EAAEtzB,CAAC,GACjK,OAAO4U,CACT,EAAG,EAAE,eAAiB,SAAS0e,EAAGtzB,EAAG4U,EAAG0D,EAAGhE,EAAG,CAC5C,OAAO,EAAE,QAAQ,QAAQtU,CAAC,EAAE,KAAK,SAAS68F,EAAG,CAC3C,OAAOrlF,EAAE,OAASqlF,aAAa,MAAQ,CAAC,gBAAiB,eAAe,EAAE,QAAQ,OAAO,UAAU,SAAS,KAAKA,CAAC,CAAC,IAAM,KAAO,OAAO,WAAa,IAAM,IAAI,EAAE,QAAQ,SAASvmF,EAAGwmF,EAAG,CACrL,IAAIC,EAAI,IAAI,WACZA,EAAE,OAAS,SAASE,EAAG,CACrB3mF,EAAE2mF,EAAE,OAAO,MAAM,CACnB,EAAGF,EAAE,QAAU,SAASE,EAAG,CACzBH,EAAEG,EAAE,OAAO,KAAK,CAClB,EAAGF,EAAE,kBAAkBF,CAAC,CAC1B,CAAC,EAAIA,CACP,CAAC,EAAE,KAAK,SAASA,EAAG,CAClB,IAAIvmF,EAAI,EAAE,UAAUumF,CAAC,EACrB,OAAOvmF,GAAKA,IAAM,cAAgBumF,EAAI,EAAE,YAAY,aAAcA,CAAC,EAAIvmF,IAAM,WAAahC,EAAIuoF,EAAIhiF,EAAE,OAAOgiF,CAAC,EAAIjoF,GAAK0D,IAAM,KAAOukF,GAAK,SAASC,EAAG,CACjJ,OAAOvmF,EAAEumF,EAAGtlF,EAAE,WAAa,IAAI,WAAWslF,EAAE,MAAM,EAAI,IAAI,MAAMA,EAAE,MAAM,CAAC,CAC3E,GAAGD,CAAC,IAAKA,GAAK,EAAE,QAAQ,OAAO,IAAI,MAAM,2BAA6BvpE,EAAI,4EAA4E,CAAC,CACzJ,CAAC,CACH,CACF,EAAG,CAAE,WAAY,EAAG,aAAc,EAAG,gBAAiB,GAAI,YAAa,GAAI,aAAc,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACrH,IAAI9b,EAAI,EAAE,oBAAoB,EAAGqD,EAAI,EAAE,SAAS,EAAGxE,EAAI,EAAE,aAAa,EAAG,EAAI,EAAE,YAAY,EAAGyJ,EAAI,EAAE,WAAW,EAC/G,SAASvJ,EAAE,EAAG,CACZ,KAAK,MAAQ,CAAA,EAAI,KAAK,YAAc,CACtC,CACAA,EAAE,UAAY,CAAE,eAAgB,SAAS,EAAG,CAC1C,GAAI,CAAC,KAAK,OAAO,sBAAsB,CAAC,EAAG,CACzC,KAAK,OAAO,OAAS,EACrB,IAAInC,EAAI,KAAK,OAAO,WAAW,CAAC,EAChC,MAAM,IAAI,MAAM,+CAAiDyG,EAAE,OAAOzG,CAAC,EAAI,cAAgByG,EAAE,OAAO,CAAC,EAAI,GAAG,CAClH,CACF,EAAG,YAAa,SAAS,EAAGzG,EAAG,CAC7B,IAAIkF,EAAI,KAAK,OAAO,MACpB,KAAK,OAAO,SAAS,CAAC,EACtB,IAAI3R,EAAI,KAAK,OAAO,WAAW,CAAC,IAAMyM,EACtC,OAAO,KAAK,OAAO,SAASkF,CAAC,EAAG3R,CAClC,EAAG,sBAAuB,UAAW,CACnC,KAAK,WAAa,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,wBAA0B,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,4BAA8B,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,kBAAoB,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,eAAiB,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,iBAAmB,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,iBAAmB,KAAK,OAAO,QAAQ,CAAC,EACxV,IAAI,EAAI,KAAK,OAAO,SAAS,KAAK,gBAAgB,EAAGyM,EAAI0L,EAAE,WAAa,aAAe,QAASxG,EAAIuB,EAAE,YAAYzG,EAAG,CAAC,EACtH,KAAK,WAAa,KAAK,YAAY,eAAekF,CAAC,CACrD,EAAG,2BAA4B,UAAW,CACxC,KAAK,sBAAwB,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,OAAO,KAAK,CAAC,EAAG,KAAK,WAAa,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,wBAA0B,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,4BAA8B,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,kBAAoB,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,eAAiB,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,iBAAmB,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,oBAAsB,CAAA,EAChZ,QAAS,EAAGlF,EAAGkF,EAAG3R,EAAI,KAAK,sBAAwB,GAAI,EAAIA,GAAK,EAAI,KAAK,OAAO,QAAQ,CAAC,EAAGyM,EAAI,KAAK,OAAO,QAAQ,CAAC,EAAGkF,EAAI,KAAK,OAAO,SAASlF,CAAC,EAAG,KAAK,oBAAoB,CAAC,EAAI,CAAE,GAAI,EAAG,OAAQA,EAAG,MAAOkF,CAAC,CACjN,EAAG,kCAAmC,UAAW,CAC/C,GAAI,KAAK,6BAA+B,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,mCAAqC,KAAK,OAAO,QAAQ,CAAC,EAAG,KAAK,WAAa,KAAK,OAAO,QAAQ,CAAC,EAAG,EAAI,KAAK,WAAY,MAAM,IAAI,MAAM,qCAAqC,CACxP,EAAG,eAAgB,UAAW,CAC5B,IAAI,EAAGlF,EACP,IAAK,EAAI,EAAG,EAAI,KAAK,MAAM,OAAQ,IAAKA,EAAI,KAAK,MAAM,CAAC,EAAG,KAAK,OAAO,SAASA,EAAE,iBAAiB,EAAG,KAAK,eAAeiC,EAAE,iBAAiB,EAAGjC,EAAE,cAAc,KAAK,MAAM,EAAGA,EAAE,WAAU,EAAIA,EAAE,kBAAiB,CACnN,EAAG,eAAgB,UAAW,CAC5B,IAAI,EACJ,IAAK,KAAK,OAAO,SAAS,KAAK,gBAAgB,EAAG,KAAK,OAAO,sBAAsBiC,EAAE,mBAAmB,IAAM,EAAI,IAAI,EAAE,CAAE,MAAO,KAAK,KAAK,EAAI,KAAK,WAAW,GAAG,gBAAgB,KAAK,MAAM,EAAG,KAAK,MAAM,KAAK,CAAC,EAClN,GAAI,KAAK,oBAAsB,KAAK,MAAM,QAAU,KAAK,oBAAsB,GAAK,KAAK,MAAM,SAAW,EAAG,MAAM,IAAI,MAAM,kCAAoC,KAAK,kBAAoB,gCAAkC,KAAK,MAAM,MAAM,CAC/O,EAAG,iBAAkB,UAAW,CAC9B,IAAI,EAAI,KAAK,OAAO,qBAAqBA,EAAE,qBAAqB,EAChE,GAAI,EAAI,EAAG,MAAM,KAAK,YAAY,EAAGA,EAAE,iBAAiB,EAAI,IAAI,MAAM,oDAAoD,EAAI,IAAI,MAAM,yIAAyI,EACjR,KAAK,OAAO,SAAS,CAAC,EACtB,IAAIjC,EAAI,EACR,GAAI,KAAK,eAAeiC,EAAE,qBAAqB,EAAG,KAAK,sBAAqB,EAAI,KAAK,aAAewE,EAAE,kBAAoB,KAAK,0BAA4BA,EAAE,kBAAoB,KAAK,8BAAgCA,EAAE,kBAAoB,KAAK,oBAAsBA,EAAE,kBAAoB,KAAK,iBAAmBA,EAAE,kBAAoB,KAAK,mBAAqBA,EAAE,iBAAkB,CACvX,GAAI,KAAK,MAAQ,IAAK,EAAI,KAAK,OAAO,qBAAqBxE,EAAE,+BAA+B,GAAK,EAAG,MAAM,IAAI,MAAM,sEAAsE,EAC1L,GAAI,KAAK,OAAO,SAAS,CAAC,EAAG,KAAK,eAAeA,EAAE,+BAA+B,EAAG,KAAK,kCAAiC,EAAI,CAAC,KAAK,YAAY,KAAK,mCAAoCA,EAAE,2BAA2B,IAAM,KAAK,mCAAqC,KAAK,OAAO,qBAAqBA,EAAE,2BAA2B,EAAG,KAAK,mCAAqC,GAAI,MAAM,IAAI,MAAM,8DAA8D,EACpc,KAAK,OAAO,SAAS,KAAK,kCAAkC,EAAG,KAAK,eAAeA,EAAE,2BAA2B,EAAG,KAAK,2BAA0B,CACpJ,CACA,IAAIiD,EAAI,KAAK,iBAAmB,KAAK,eACrC,KAAK,QAAUA,GAAK,GAAIA,GAAK,GAAK,KAAK,uBACvC,IAAI3R,EAAIyM,EAAIkF,EACZ,GAAI,EAAI3R,EAAG,KAAK,YAAYyM,EAAGiC,EAAE,mBAAmB,IAAM,KAAK,OAAO,KAAO1O,WACpEA,EAAI,EAAG,MAAM,IAAI,MAAM,0BAA4B,KAAK,IAAIA,CAAC,EAAI,SAAS,CACrF,EAAG,cAAe,SAAS,EAAG,CAC5B,KAAK,OAAS6P,EAAE,CAAC,CACnB,EAAG,KAAM,SAAS,EAAG,CACnB,KAAK,cAAc,CAAC,EAAG,KAAK,mBAAoB,KAAK,eAAc,EAAI,KAAK,eAAc,CAC5F,CAAC,EAAI,EAAE,QAAUjB,CACnB,EAAG,CAAE,qBAAsB,GAAI,cAAe,GAAI,YAAa,GAAI,UAAW,GAAI,aAAc,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC5H,IAAIiB,EAAI,EAAE,oBAAoB,EAAGqD,EAAI,EAAE,SAAS,EAAGxE,EAAI,EAAE,oBAAoB,EAAG,EAAI,EAAE,SAAS,EAAGyJ,EAAI,EAAE,QAAQ,EAAGvJ,EAAI,EAAE,gBAAgB,EAAG,EAAI,EAAE,WAAW,EAC7J,SAASnC,EAAEkF,EAAG3R,EAAG,CACf,KAAK,QAAU2R,EAAG,KAAK,YAAc3R,CACvC,CACAyM,EAAE,UAAY,CAAE,YAAa,UAAW,CACtC,OAAQ,EAAI,KAAK,UAAY,CAC/B,EAAG,QAAS,UAAW,CACrB,OAAQ,KAAO,KAAK,UAAY,IAClC,EAAG,cAAe,SAASkF,EAAG,CAC5B,IAAI3R,EAAG2rB,EACP,GAAIha,EAAE,KAAK,EAAE,EAAG,KAAK,eAAiBA,EAAE,QAAQ,CAAC,EAAGga,EAAIha,EAAE,QAAQ,CAAC,EAAG,KAAK,SAAWA,EAAE,SAAS,KAAK,cAAc,EAAGA,EAAE,KAAKga,CAAC,EAAG,KAAK,iBAAmB,IAAM,KAAK,mBAAqB,GAAI,MAAM,IAAI,MAAM,oIAAoI,EAClV,IAAK3rB,GAAK,SAAS3H,EAAG,CACpB,QAAS4U,KAAK2B,EAAG,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAG3B,CAAC,GAAK2B,EAAE3B,CAAC,EAAE,QAAU5U,EAAG,OAAOuW,EAAE3B,CAAC,EAC/F,OAAO,IACT,GAAG,KAAK,iBAAiB,KAAO,KAAM,MAAM,IAAI,MAAM,+BAAiCiG,EAAE,OAAO,KAAK,iBAAiB,EAAI,0BAA4BA,EAAE,YAAY,SAAU,KAAK,QAAQ,EAAI,GAAG,EAClM,KAAK,aAAe,IAAIxE,EAAE,KAAK,eAAgB,KAAK,iBAAkB,KAAK,MAAO1O,EAAG2R,EAAE,SAAS,KAAK,cAAc,CAAC,CACtH,EAAG,gBAAiB,SAASA,EAAG,CAC9B,KAAK,cAAgBA,EAAE,QAAQ,CAAC,EAAGA,EAAE,KAAK,CAAC,EAAG,KAAK,QAAUA,EAAE,QAAQ,CAAC,EAAG,KAAK,kBAAoBA,EAAE,WAAW,CAAC,EAAG,KAAK,KAAOA,EAAE,WAAY,KAAK,MAAQA,EAAE,QAAQ,CAAC,EAAG,KAAK,eAAiBA,EAAE,QAAQ,CAAC,EAAG,KAAK,iBAAmBA,EAAE,QAAQ,CAAC,EACjP,IAAI3R,EAAI2R,EAAE,QAAQ,CAAC,EACnB,GAAI,KAAK,kBAAoBA,EAAE,QAAQ,CAAC,EAAG,KAAK,kBAAoBA,EAAE,QAAQ,CAAC,EAAG,KAAK,gBAAkBA,EAAE,QAAQ,CAAC,EAAG,KAAK,uBAAyBA,EAAE,QAAQ,CAAC,EAAG,KAAK,uBAAyBA,EAAE,QAAQ,CAAC,EAAG,KAAK,kBAAoBA,EAAE,QAAQ,CAAC,EAAG,KAAK,cAAe,MAAM,IAAI,MAAM,iCAAiC,EAC3TA,EAAE,KAAK3R,CAAC,EAAG,KAAK,gBAAgB2R,CAAC,EAAG,KAAK,qBAAqBA,CAAC,EAAG,KAAK,YAAcA,EAAE,SAAS,KAAK,iBAAiB,CACxH,EAAG,kBAAmB,UAAW,CAC/B,KAAK,gBAAkB,KAAM,KAAK,eAAiB,KACnD,IAAIA,EAAI,KAAK,eAAiB,EAC9B,KAAK,IAAM,CAAC,EAAE,GAAK,KAAK,wBAAyBA,GAAK,IAAM,KAAK,eAAiB,GAAK,KAAK,wBAAyBA,GAAK,IAAM,KAAK,gBAAkB,KAAK,wBAA0B,GAAK,OAAQ,KAAK,KAAO,KAAK,YAAY,MAAM,EAAE,IAAM,MAAQ,KAAK,IAAM,GACnQ,EAAG,qBAAsB,UAAW,CAClC,GAAI,KAAK,YAAY,CAAC,EAAG,CACvB,IAAIA,EAAI9B,EAAE,KAAK,YAAY,CAAC,EAAE,KAAK,EACnC,KAAK,mBAAqBqD,EAAE,mBAAqB,KAAK,iBAAmBvB,EAAE,QAAQ,CAAC,GAAI,KAAK,iBAAmBuB,EAAE,mBAAqB,KAAK,eAAiBvB,EAAE,QAAQ,CAAC,GAAI,KAAK,oBAAsBuB,EAAE,mBAAqB,KAAK,kBAAoBvB,EAAE,QAAQ,CAAC,GAAI,KAAK,kBAAoBuB,EAAE,mBAAqB,KAAK,gBAAkBvB,EAAE,QAAQ,CAAC,EAC1V,CACF,EAAG,gBAAiB,SAASA,EAAG,CAC9B,IAAI3R,EAAG2rB,EAAGtzB,EAAG4U,EAAI0E,EAAE,MAAQ,KAAK,kBAChC,IAAK,KAAK,cAAgB,KAAK,YAAc,CAAA,GAAKA,EAAE,MAAQ,EAAI1E,GAAKjN,EAAI2R,EAAE,QAAQ,CAAC,EAAGga,EAAIha,EAAE,QAAQ,CAAC,EAAGtZ,EAAIsZ,EAAE,SAASga,CAAC,EAAG,KAAK,YAAY3rB,CAAC,EAAI,CAAE,GAAIA,EAAG,OAAQ2rB,EAAG,MAAOtzB,CAAC,EAC9KsZ,EAAE,SAAS1E,CAAC,CACd,EAAG,WAAY,UAAW,CACxB,IAAI0E,EAAI,EAAE,WAAa,aAAe,QACtC,GAAI,KAAK,QAAO,EAAI,KAAK,YAAcwG,EAAE,WAAW,KAAK,QAAQ,EAAG,KAAK,eAAiBA,EAAE,WAAW,KAAK,WAAW,MAClH,CACH,IAAInY,EAAI,KAAK,0BAAyB,EACtC,GAAIA,IAAM,KAAM,KAAK,YAAcA,MAC9B,CACH,IAAI2rB,EAAIzY,EAAE,YAAYvB,EAAG,KAAK,QAAQ,EACtC,KAAK,YAAc,KAAK,YAAY,eAAega,CAAC,CACtD,CACA,IAAItzB,EAAI,KAAK,6BAA4B,EACzC,GAAIA,IAAM,KAAM,KAAK,eAAiBA,MACjC,CACH,IAAI4U,EAAIiG,EAAE,YAAYvB,EAAG,KAAK,WAAW,EACzC,KAAK,eAAiB,KAAK,YAAY,eAAe1E,CAAC,CACzD,CACF,CACF,EAAG,0BAA2B,UAAW,CACvC,IAAI0E,EAAI,KAAK,YAAY,KAAK,EAC9B,GAAIA,EAAG,CACL,IAAI3R,EAAI6P,EAAE8B,EAAE,KAAK,EACjB,OAAO3R,EAAE,QAAQ,CAAC,IAAM,GAAK,EAAE,KAAK,QAAQ,IAAMA,EAAE,QAAQ,CAAC,EAAI,KAAOmY,EAAE,WAAWnY,EAAE,SAAS2R,EAAE,OAAS,CAAC,CAAC,CAC/G,CACA,OAAO,IACT,EAAG,6BAA8B,UAAW,CAC1C,IAAIA,EAAI,KAAK,YAAY,KAAK,EAC9B,GAAIA,EAAG,CACL,IAAI3R,EAAI6P,EAAE8B,EAAE,KAAK,EACjB,OAAO3R,EAAE,QAAQ,CAAC,IAAM,GAAK,EAAE,KAAK,WAAW,IAAMA,EAAE,QAAQ,CAAC,EAAI,KAAOmY,EAAE,WAAWnY,EAAE,SAAS2R,EAAE,OAAS,CAAC,CAAC,CAClH,CACA,OAAO,IACT,CAAC,EAAI,EAAE,QAAUlF,CACnB,EAAG,CAAE,qBAAsB,EAAG,iBAAkB,EAAG,UAAW,EAAG,qBAAsB,GAAI,YAAa,GAAI,SAAU,GAAI,UAAW,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACjK,SAASoD,EAAE7P,EAAG2rB,EAAGtzB,EAAG,CAClB,KAAK,KAAO2H,EAAG,KAAK,IAAM3H,EAAE,IAAK,KAAK,KAAOA,EAAE,KAAM,KAAK,QAAUA,EAAE,QAAS,KAAK,gBAAkBA,EAAE,gBAAiB,KAAK,eAAiBA,EAAE,eAAgB,KAAK,MAAQszB,EAAG,KAAK,YAActzB,EAAE,OAAQ,KAAK,QAAU,CAAE,YAAaA,EAAE,YAAa,mBAAoBA,EAAE,kBAAkB,CACrS,CACA,IAAI6a,EAAI,EAAE,uBAAuB,EAAGxE,EAAI,EAAE,qBAAqB,EAAG,EAAI,EAAE,QAAQ,EAAGyJ,EAAI,EAAE,oBAAoB,EAAGvJ,EAAI,EAAE,wBAAwB,EAC9IiB,EAAE,UAAY,CAAE,eAAgB,SAAS7P,EAAG,CAC1C,IAAI2rB,EAAI,KAAMtzB,EAAI,SAClB,GAAI,CACF,GAAI,CAAC2H,EAAG,MAAM,IAAI,MAAM,2BAA2B,EACnD,IAAIiN,GAAK5U,EAAI2H,EAAE,iBAAmB,UAAY3H,IAAM,OACpDA,IAAM,gBAAkBA,IAAM,SAAWA,EAAI,UAAWszB,EAAI,KAAK,kBAAiB,EAClF,IAAIhb,EAAI,CAAC,KAAK,YACdA,GAAK,CAAC1D,IAAM0e,EAAIA,EAAE,KAAK,IAAI,EAAE,gBAAkB,GAAI,CAAChb,GAAK1D,IAAM0e,EAAIA,EAAE,KAAK,IAAI,EAAE,gBAAkB,EACpG,OAAShf,EAAG,EACTgf,EAAI,IAAI/c,EAAE,OAAO,GAAG,MAAMjC,CAAC,CAC9B,CACA,OAAO,IAAIuG,EAAEyY,EAAGtzB,EAAG,EAAE,CACvB,EAAG,MAAO,SAAS2H,EAAG2rB,EAAG,CACvB,OAAO,KAAK,eAAe3rB,CAAC,EAAE,WAAW2rB,CAAC,CAC5C,EAAG,WAAY,SAAS3rB,EAAG2rB,EAAG,CAC5B,OAAO,KAAK,eAAe3rB,GAAK,YAAY,EAAE,eAAe2rB,CAAC,CAChE,EAAG,gBAAiB,SAAS3rB,EAAG2rB,EAAG,CACjC,GAAI,KAAK,iBAAiBxT,GAAK,KAAK,MAAM,YAAY,QAAUnY,EAAE,MAAO,OAAO,KAAK,MAAM,oBAAmB,EAC9G,IAAI3H,EAAI,KAAK,kBAAiB,EAC9B,OAAO,KAAK,cAAgBA,EAAIA,EAAE,KAAK,IAAI,EAAE,gBAAkB,GAAI8f,EAAE,iBAAiB9f,EAAG2H,EAAG2rB,CAAC,CAC/F,EAAG,kBAAmB,UAAW,CAC/B,OAAO,KAAK,iBAAiBxT,EAAI,KAAK,MAAM,mBAAqB,KAAK,iBAAiBvJ,EAAI,KAAK,MAAQ,IAAIF,EAAE,KAAK,KAAK,CAC1H,CAAC,EACD,QAAS,EAAI,CAAC,SAAU,WAAY,eAAgB,eAAgB,eAAe,EAAGjC,EAAI,UAAW,CACnG,MAAM,IAAI,MAAM,4EAA4E,CAC9F,EAAGkF,EAAI,EAAGA,EAAI,EAAE,OAAQA,IAAK9B,EAAE,UAAU,EAAE8B,CAAC,CAAC,EAAIlF,EACjD,EAAE,QAAUoD,CACd,EAAG,CAAE,qBAAsB,EAAG,sBAAuB,GAAI,yBAA0B,GAAI,wBAAyB,GAAI,SAAU,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,EACzJ,SAASA,EAAG,CACX,IAAIqD,EAAGxE,EAAG,EAAImB,EAAE,kBAAoBA,EAAE,uBACtC,GAAI,EAAG,CACL,IAAIsI,EAAI,EAAGvJ,EAAI,IAAI,EAAE5O,CAAC,EAAG,EAAI6P,EAAE,SAAS,eAAe,EAAE,EACzDjB,EAAE,QAAQ,EAAG,CAAE,cAAe,EAAE,CAAE,EAAGsE,EAAI,UAAW,CAClD,EAAE,KAAOiF,EAAI,EAAEA,EAAI,CACrB,CACF,SAAWtI,EAAE,cAAgBA,EAAE,iBAAmB,OAAQqD,EAAI,aAAcrD,GAAK,uBAAwBA,EAAE,SAAS,cAAc,QAAQ,EAAI,UAAW,CACvJ,IAAI8b,EAAI9b,EAAE,SAAS,cAAc,QAAQ,EACzC8b,EAAE,mBAAqB,UAAW,CAChC3rB,IAAK2rB,EAAE,mBAAqB,KAAMA,EAAE,WAAW,YAAYA,CAAC,EAAGA,EAAI,IACrE,EAAG9b,EAAE,SAAS,gBAAgB,YAAY8b,CAAC,CAC7C,EAAI,UAAW,CACb,WAAW3rB,EAAG,CAAC,CACjB,MACK,CACH,IAAIyM,EAAI,IAAIoD,EAAE,eACdpD,EAAE,MAAM,UAAYzM,EAAGkT,EAAI,UAAW,CACpCzG,EAAE,MAAM,YAAY,CAAC,CACvB,CACF,CACA,IAAIkF,EAAI,CAAA,EACR,SAAS3R,GAAI,CACX,IAAI2rB,EAAGtzB,EACPqW,EAAI,GACJ,QAASzB,EAAI0E,EAAE,OAAQ1E,GAAK,CAC1B,IAAK5U,EAAIsZ,EAAGA,EAAI,CAAA,EAAIga,EAAI,GAAI,EAAEA,EAAI1e,GAAK5U,EAAEszB,CAAC,EAAC,EAC3C1e,EAAI0E,EAAE,MACR,CACAjD,EAAI,EACN,CACA,EAAE,QAAU,SAASid,EAAG,CACtBha,EAAE,KAAKga,CAAC,IAAM,GAAKjd,GAAKwE,EAAC,CAC3B,CACF,GAAG,KAAK,KAAM,OAAOipF,GAAK,IAAMA,GAAK,OAAO,KAAO,IAAM,KAAO,OAAO,OAAS,IAAM,OAAS,CAAA,CAAE,CACnG,EAAG,CAAA,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7B,IAAItsF,EAAI,EAAE,WAAW,EACrB,SAASqD,GAAI,CACb,CACA,IAAIxE,EAAI,CAAA,EAAI,EAAI,CAAC,UAAU,EAAGyJ,EAAI,CAAC,WAAW,EAAGvJ,EAAI,CAAC,SAAS,EAC/D,SAAS,EAAE3B,EAAG,CACZ,GAAI,OAAOA,GAAK,WAAY,MAAM,IAAI,UAAU,6BAA6B,EAC7E,KAAK,MAAQ2B,EAAG,KAAK,MAAQ,CAAA,EAAI,KAAK,QAAU,OAAQ3B,IAAMiG,GAAKyY,EAAE,KAAM1e,CAAC,CAC9E,CACA,SAASR,EAAEQ,EAAG0D,EAAGhE,EAAG,CAClB,KAAK,QAAUM,EAAG,OAAO0D,GAAK,aAAe,KAAK,YAAcA,EAAG,KAAK,cAAgB,KAAK,oBAAqB,OAAOhE,GAAK,aAAe,KAAK,WAAaA,EAAG,KAAK,aAAe,KAAK,kBAC7L,CACA,SAASgF,EAAE1E,EAAG0D,EAAGhE,EAAG,CAClBkD,EAAE,UAAW,CACX,IAAIqlF,EACJ,GAAI,CACFA,EAAIvkF,EAAEhE,CAAC,CACT,OAASgC,EAAG,CACV,OAAOD,EAAE,OAAOzB,EAAG0B,CAAC,CACtB,CACAumF,IAAMjoF,EAAIyB,EAAE,OAAOzB,EAAG,IAAI,UAAU,oCAAoC,CAAC,EAAIyB,EAAE,QAAQzB,EAAGioF,CAAC,CAC7F,CAAC,CACH,CACA,SAASl1F,EAAEiN,EAAG,CACZ,IAAI0D,EAAI1D,GAAKA,EAAE,KACf,GAAIA,IAAM,OAAOA,GAAK,UAAY,OAAOA,GAAK,aAAe,OAAO0D,GAAK,WAAY,OAAO,UAAW,CACrGA,EAAE,MAAM1D,EAAG,SAAS,CACtB,CACF,CACA,SAAS0e,EAAE1e,EAAG0D,EAAG,CACf,IAAIhE,EAAI,GACR,SAASuoF,EAAEE,EAAG,CACZzoF,IAAMA,EAAI,GAAI+B,EAAE,OAAOzB,EAAGmoF,CAAC,EAC7B,CACA,SAASzmF,EAAEymF,EAAG,CACZzoF,IAAMA,EAAI,GAAI+B,EAAE,QAAQzB,EAAGmoF,CAAC,EAC9B,CACA,IAAID,EAAI98F,EAAE,UAAW,CACnBsY,EAAEhC,EAAGumF,CAAC,CACR,CAAC,EACDC,EAAE,SAAW,SAAWD,EAAEC,EAAE,KAAK,CACnC,CACA,SAAS98F,EAAE4U,EAAG0D,EAAG,CACf,IAAIhE,EAAI,CAAA,EACR,GAAI,CACFA,EAAE,MAAQM,EAAE0D,CAAC,EAAGhE,EAAE,OAAS,SAC7B,OAASuoF,EAAG,CACVvoF,EAAE,OAAS,QAASA,EAAE,MAAQuoF,CAChC,CACA,OAAOvoF,CACT,EACC,EAAE,QAAU,GAAG,UAAU,QAAU,SAASM,EAAG,CAC9C,GAAI,OAAOA,GAAK,WAAY,OAAO,KACnC,IAAI0D,EAAI,KAAK,YACb,OAAO,KAAK,KAAK,SAAShE,EAAG,CAC3B,OAAOgE,EAAE,QAAQ1D,EAAC,CAAE,EAAE,KAAK,UAAW,CACpC,OAAON,CACT,CAAC,CACH,EAAG,SAASA,EAAG,CACb,OAAOgE,EAAE,QAAQ1D,EAAC,CAAE,EAAE,KAAK,UAAW,CACpC,MAAMN,CACR,CAAC,CACH,CAAC,CACH,EAAG,EAAE,UAAU,MAAQ,SAASM,EAAG,CACjC,OAAO,KAAK,KAAK,KAAMA,CAAC,CAC1B,EAAG,EAAE,UAAU,KAAO,SAASA,EAAG0D,EAAG,CACnC,GAAI,OAAO1D,GAAK,YAAc,KAAK,QAAUkL,GAAK,OAAOxH,GAAK,YAAc,KAAK,QAAU,EAAG,OAAO,KACrG,IAAIhE,EAAI,IAAI,KAAK,YAAYuG,CAAC,EAC9B,OAAO,KAAK,QAAUtE,EAAI+C,EAAEhF,EAAG,KAAK,QAAUwL,EAAIlL,EAAI0D,EAAG,KAAK,OAAO,EAAI,KAAK,MAAM,KAAK,IAAIlE,EAAEE,EAAGM,EAAG0D,CAAC,CAAC,EAAGhE,CAC5G,EAAGF,EAAE,UAAU,cAAgB,SAASQ,EAAG,CACzCyB,EAAE,QAAQ,KAAK,QAASzB,CAAC,CAC3B,EAAGR,EAAE,UAAU,mBAAqB,SAASQ,EAAG,CAC9C0E,EAAE,KAAK,QAAS,KAAK,YAAa1E,CAAC,CACrC,EAAGR,EAAE,UAAU,aAAe,SAASQ,EAAG,CACxCyB,EAAE,OAAO,KAAK,QAASzB,CAAC,CAC1B,EAAGR,EAAE,UAAU,kBAAoB,SAASQ,EAAG,CAC7C0E,EAAE,KAAK,QAAS,KAAK,WAAY1E,CAAC,CACpC,EAAGyB,EAAE,QAAU,SAASzB,EAAG0D,EAAG,CAC5B,IAAIhE,EAAItU,EAAE2H,EAAG2Q,CAAC,EACd,GAAIhE,EAAE,SAAW,QAAS,OAAO+B,EAAE,OAAOzB,EAAGN,EAAE,KAAK,EACpD,IAAIuoF,EAAIvoF,EAAE,MACV,GAAIuoF,EAAGvpE,EAAE1e,EAAGioF,CAAC,MACR,CACHjoF,EAAE,MAAQkL,EAAGlL,EAAE,QAAU0D,EACzB,QAAShC,EAAI,GAAIwmF,EAAIloF,EAAE,MAAM,OAAQ,EAAE0B,EAAIwmF,GAAKloF,EAAE,MAAM0B,CAAC,EAAE,cAAcgC,CAAC,CAC5E,CACA,OAAO1D,CACT,EAAGyB,EAAE,OAAS,SAASzB,EAAG0D,EAAG,CAC3B1D,EAAE,MAAQ,EAAGA,EAAE,QAAU0D,EACzB,QAAShE,EAAI,GAAIuoF,EAAIjoF,EAAE,MAAM,OAAQ,EAAEN,EAAIuoF,GAAKjoF,EAAE,MAAMN,CAAC,EAAE,aAAagE,CAAC,EACzE,OAAO1D,CACT,EAAG,EAAE,QAAU,SAASA,EAAG,CACzB,OAAOA,aAAa,KAAOA,EAAIyB,EAAE,QAAQ,IAAI,KAAKwE,CAAC,EAAGjG,CAAC,CACzD,EAAG,EAAE,OAAS,SAASA,EAAG,CACxB,IAAI0D,EAAI,IAAI,KAAKuC,CAAC,EAClB,OAAOxE,EAAE,OAAOiC,EAAG1D,CAAC,CACtB,EAAG,EAAE,IAAM,SAASA,EAAG,CACrB,IAAI0D,EAAI,KACR,GAAI,OAAO,UAAU,SAAS,KAAK1D,CAAC,IAAM,iBAAkB,OAAO,KAAK,OAAO,IAAI,UAAU,kBAAkB,CAAC,EAChH,IAAIN,EAAIM,EAAE,OAAQioF,EAAI,GACtB,GAAI,CAACvoF,EAAG,OAAO,KAAK,QAAQ,CAAA,CAAE,EAC9B,QAASgC,EAAI,IAAI,MAAMhC,CAAC,EAAGwoF,EAAI,EAAGC,EAAI,GAAIE,EAAI,IAAI,KAAKpiF,CAAC,EAAG,EAAEkiF,EAAIzoF,GAAK6oF,EAAEvoF,EAAEmoF,CAAC,EAAGA,CAAC,EAC/E,OAAOE,EACP,SAASE,EAAEC,EAAGX,EAAG,CACfnkF,EAAE,QAAQ8kF,CAAC,EAAE,KAAK,SAAST,EAAG,CAC5BrmF,EAAEmmF,CAAC,EAAIE,EAAG,EAAEG,IAAMxoF,GAAKuoF,IAAMA,EAAI,GAAIxmF,EAAE,QAAQ4mF,EAAG3mF,CAAC,EACrD,EAAG,SAASqmF,EAAG,CACbE,IAAMA,EAAI,GAAIxmF,EAAE,OAAO4mF,EAAGN,CAAC,EAC7B,CAAC,CACH,CACF,EAAG,EAAE,KAAO,SAAS/nF,EAAG,CACtB,IAAI0D,EAAI,KACR,GAAI,OAAO,UAAU,SAAS,KAAK1D,CAAC,IAAM,iBAAkB,OAAO,KAAK,OAAO,IAAI,UAAU,kBAAkB,CAAC,EAChH,IAAIN,EAAIM,EAAE,OAAQioF,EAAI,GACtB,GAAI,CAACvoF,EAAG,OAAO,KAAK,QAAQ,CAAA,CAAE,EAC9B,QAASgC,EAAI,GAAIwmF,EAAI,IAAI,KAAKjiF,CAAC,EAAG,EAAEvE,EAAIhC,GAAKyoF,EAAInoF,EAAE0B,CAAC,EAAGgC,EAAE,QAAQykF,CAAC,EAAE,KAAK,SAASE,EAAG,CACnFJ,IAAMA,EAAI,GAAIxmF,EAAE,QAAQymF,EAAGG,CAAC,EAC9B,EAAG,SAASA,EAAG,CACbJ,IAAMA,EAAI,GAAIxmF,EAAE,OAAOymF,EAAGG,CAAC,EAC7B,CAAC,EACD,IAAIF,EACJ,OAAOD,CACT,CACF,EAAG,CAAE,UAAW,GAAI,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC5C,IAAItlF,EAAI,CAAA,KACJ,EAAE,oBAAoB,EAAE,QAAQA,EAAG,EAAE,eAAe,EAAG,EAAE,eAAe,EAAG,EAAE,sBAAsB,CAAC,EAAG,EAAE,QAAUA,CACzH,EAAG,CAAE,gBAAiB,GAAI,gBAAiB,GAAI,qBAAsB,GAAI,uBAAwB,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7H,IAAIA,EAAI,EAAE,gBAAgB,EAAGqD,EAAI,EAAE,gBAAgB,EAAGxE,EAAI,EAAE,iBAAiB,EAAG,EAAI,EAAE,iBAAiB,EAAGyJ,EAAI,EAAE,gBAAgB,EAAGvJ,EAAI,OAAO,UAAU,SAAU,EAAI,EAAGnC,EAAI,GAAIkF,EAAI,EAAG3R,EAAI,EAC5L,SAAS2rB,EAAE1e,EAAG,CACZ,GAAI,EAAE,gBAAgB0e,GAAI,OAAO,IAAIA,EAAE1e,CAAC,EACxC,KAAK,QAAUiG,EAAE,OAAO,CAAE,MAAOzG,EAAG,OAAQzM,EAAG,UAAW,MAAO,WAAY,GAAI,SAAU,EAAG,SAAU2R,EAAG,GAAI,EAAE,EAAI1E,GAAK,EAAE,EAC5H,IAAI0D,EAAI,KAAK,QACbA,EAAE,KAAO,EAAIA,EAAE,WAAaA,EAAE,WAAa,CAACA,EAAE,WAAaA,EAAE,MAAQ,EAAIA,EAAE,YAAcA,EAAE,WAAa,KAAOA,EAAE,YAAc,IAAK,KAAK,IAAM,EAAG,KAAK,IAAM,GAAI,KAAK,MAAQ,GAAI,KAAK,OAAS,CAAA,EAAI,KAAK,KAAO,IAAIwH,EAAK,KAAK,KAAK,UAAY,EAC/O,IAAIxL,EAAIkD,EAAE,aAAa,KAAK,KAAMc,EAAE,MAAOA,EAAE,OAAQA,EAAE,WAAYA,EAAE,SAAUA,EAAE,QAAQ,EACzF,GAAIhE,IAAM,EAAG,MAAM,IAAI,MAAM,EAAEA,CAAC,CAAC,EACjC,GAAIgE,EAAE,QAAUd,EAAE,iBAAiB,KAAK,KAAMc,EAAE,MAAM,EAAGA,EAAE,WAAY,CACrE,IAAIukF,EACJ,GAAIA,EAAI,OAAOvkF,EAAE,YAAc,SAAWjC,EAAE,WAAWiC,EAAE,UAAU,EAAI/B,EAAE,KAAK+B,EAAE,UAAU,IAAM,uBAAyB,IAAI,WAAWA,EAAE,UAAU,EAAIA,EAAE,YAAahE,EAAIkD,EAAE,qBAAqB,KAAK,KAAMqlF,CAAC,KAAO,EAAG,MAAM,IAAI,MAAM,EAAEvoF,CAAC,CAAC,EAC5O,KAAK,UAAY,EACnB,CACF,CACA,SAAStU,EAAE4U,EAAG0D,EAAG,CACf,IAAIhE,EAAI,IAAIgf,EAAEhb,CAAC,EACf,GAAIhE,EAAE,KAAKM,EAAG,EAAE,EAAGN,EAAE,IAAK,MAAMA,EAAE,KAAO,EAAEA,EAAE,GAAG,EAChD,OAAOA,EAAE,MACX,CACAgf,EAAE,UAAU,KAAO,SAAS1e,EAAG0D,EAAG,CAChC,IAAIhE,EAAGuoF,EAAGvmF,EAAI,KAAK,KAAMwmF,EAAI,KAAK,QAAQ,UAC1C,GAAI,KAAK,MAAO,MAAO,GACvBD,EAAIvkF,IAAM,CAAC,CAACA,EAAIA,EAAIA,IAAM,GAAK,EAAI,EAAG,OAAO1D,GAAK,SAAW0B,EAAE,MAAQD,EAAE,WAAWzB,CAAC,EAAI2B,EAAE,KAAK3B,CAAC,IAAM,uBAAyB0B,EAAE,MAAQ,IAAI,WAAW1B,CAAC,EAAI0B,EAAE,MAAQ1B,EAAG0B,EAAE,QAAU,EAAGA,EAAE,SAAWA,EAAE,MAAM,OAC/M,EAAG,CACD,GAAIA,EAAE,YAAc,IAAMA,EAAE,OAAS,IAAIuE,EAAE,KAAKiiF,CAAC,EAAGxmF,EAAE,SAAW,EAAGA,EAAE,UAAYwmF,IAAKxoF,EAAIkD,EAAE,QAAQlB,EAAGumF,CAAC,KAAO,GAAKvoF,IAAM,EAAG,OAAO,KAAK,MAAMA,CAAC,EAAG,EAAE,KAAK,MAAQ,IACnKgC,EAAE,YAAc,IAAMA,EAAE,WAAa,GAAKumF,IAAM,GAAKA,IAAM,KAAO,KAAK,QAAQ,KAAO,SAAW,KAAK,OAAOxmF,EAAE,cAAcwE,EAAE,UAAUvE,EAAE,OAAQA,EAAE,QAAQ,CAAC,CAAC,EAAI,KAAK,OAAOuE,EAAE,UAAUvE,EAAE,OAAQA,EAAE,QAAQ,CAAC,EAClN,QAAU,EAAIA,EAAE,UAAYA,EAAE,YAAc,IAAMhC,IAAM,GACxD,OAAOuoF,IAAM,GAAKvoF,EAAIkD,EAAE,WAAW,KAAK,IAAI,EAAG,KAAK,MAAMlD,CAAC,EAAG,KAAK,MAAQ,GAAIA,IAAM,GAAKuoF,IAAM,IAAM,KAAK,MAAM,CAAC,EAAG,EAAEvmF,EAAE,UAAY,GACvI,EAAGgd,EAAE,UAAU,OAAS,SAAS1e,EAAG,CAClC,KAAK,OAAO,KAAKA,CAAC,CACpB,EAAG0e,EAAE,UAAU,MAAQ,SAAS1e,EAAG,CACjCA,IAAM,IAAM,KAAK,QAAQ,KAAO,SAAW,KAAK,OAAS,KAAK,OAAO,KAAK,EAAE,EAAI,KAAK,OAASiG,EAAE,cAAc,KAAK,MAAM,GAAI,KAAK,OAAS,CAAA,EAAI,KAAK,IAAMjG,EAAG,KAAK,IAAM,KAAK,KAAK,GACpL,EAAG,EAAE,QAAU0e,EAAG,EAAE,QAAUtzB,EAAG,EAAE,WAAa,SAAS4U,EAAG0D,EAAG,CAC7D,OAAQA,EAAIA,GAAK,CAAA,GAAI,IAAM,GAAItY,EAAE4U,EAAG0D,CAAC,CACvC,EAAG,EAAE,KAAO,SAAS1D,EAAG0D,EAAG,CACzB,OAAQA,EAAIA,GAAK,CAAA,GAAI,KAAO,GAAItY,EAAE4U,EAAG0D,CAAC,CACxC,CACF,EAAG,CAAE,iBAAkB,GAAI,kBAAmB,GAAI,iBAAkB,GAAI,kBAAmB,GAAI,iBAAkB,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7I,IAAId,EAAI,EAAE,gBAAgB,EAAGqD,EAAI,EAAE,gBAAgB,EAAGxE,EAAI,EAAE,iBAAiB,EAAG,EAAI,EAAE,kBAAkB,EAAGyJ,EAAI,EAAE,iBAAiB,EAAGvJ,EAAI,EAAE,gBAAgB,EAAG,EAAI,EAAE,iBAAiB,EAAGnC,EAAI,OAAO,UAAU,SAC7M,SAASkF,EAAEga,EAAG,CACZ,GAAI,EAAE,gBAAgBha,GAAI,OAAO,IAAIA,EAAEga,CAAC,EACxC,KAAK,QAAUzY,EAAE,OAAO,CAAE,UAAW,MAAO,WAAY,EAAG,GAAI,EAAE,EAAIyY,GAAK,CAAA,CAAE,EAC5E,IAAItzB,EAAI,KAAK,QACbA,EAAE,KAAO,GAAKA,EAAE,YAAcA,EAAE,WAAa,KAAOA,EAAE,WAAa,CAACA,EAAE,WAAYA,EAAE,aAAe,IAAMA,EAAE,WAAa,MAAO,EAAE,GAAKA,EAAE,YAAcA,EAAE,WAAa,KAAOszB,GAAKA,EAAE,aAAetzB,EAAE,YAAc,IAAK,GAAKA,EAAE,YAAcA,EAAE,WAAa,KAAO,GAAKA,EAAE,aAAe,IAAMA,EAAE,YAAc,IAAK,KAAK,IAAM,EAAG,KAAK,IAAM,GAAI,KAAK,MAAQ,GAAI,KAAK,OAAS,CAAA,EAAI,KAAK,KAAO,IAAIuW,EAAK,KAAK,KAAK,UAAY,EAC9Z,IAAI3B,EAAI4C,EAAE,aAAa,KAAK,KAAMxX,EAAE,UAAU,EAC9C,GAAI4U,IAAM,EAAE,KAAM,MAAM,IAAI,MAAMkL,EAAElL,CAAC,CAAC,EACtC,KAAK,OAAS,IAAI,EAAK4C,EAAE,iBAAiB,KAAK,KAAM,KAAK,MAAM,CAClE,CACA,SAAS7P,EAAE2rB,EAAGtzB,EAAG,CACf,IAAI4U,EAAI,IAAI0E,EAAEtZ,CAAC,EACf,GAAI4U,EAAE,KAAK0e,EAAG,EAAE,EAAG1e,EAAE,IAAK,MAAMA,EAAE,KAAOkL,EAAElL,EAAE,GAAG,EAChD,OAAOA,EAAE,MACX,CACA0E,EAAE,UAAU,KAAO,SAASga,EAAGtzB,EAAG,CAChC,IAAI4U,EAAG0D,EAAGhE,EAAGuoF,EAAGvmF,EAAGwmF,EAAGC,EAAI,KAAK,KAAME,EAAI,KAAK,QAAQ,UAAWE,EAAI,KAAK,QAAQ,WAAYC,EAAI,GAClG,GAAI,KAAK,MAAO,MAAO,GACvB9kF,EAAItY,IAAM,CAAC,CAACA,EAAIA,EAAIA,IAAM,GAAK,EAAE,SAAW,EAAE,WAAY,OAAOszB,GAAK,SAAWypE,EAAE,MAAQ1mF,EAAE,cAAcid,CAAC,EAAIlf,EAAE,KAAKkf,CAAC,IAAM,uBAAyBypE,EAAE,MAAQ,IAAI,WAAWzpE,CAAC,EAAIypE,EAAE,MAAQzpE,EAAGypE,EAAE,QAAU,EAAGA,EAAE,SAAWA,EAAE,MAAM,OACtO,EAAG,CACD,GAAIA,EAAE,YAAc,IAAMA,EAAE,OAAS,IAAIliF,EAAE,KAAKoiF,CAAC,EAAGF,EAAE,SAAW,EAAGA,EAAE,UAAYE,IAAKroF,EAAI4C,EAAE,QAAQulF,EAAG,EAAE,UAAU,KAAO,EAAE,aAAeI,IAAML,EAAI,OAAOK,GAAK,SAAW9mF,EAAE,WAAW8mF,CAAC,EAAI/oF,EAAE,KAAK+oF,CAAC,IAAM,uBAAyB,IAAI,WAAWA,CAAC,EAAIA,EAAGvoF,EAAI4C,EAAE,qBAAqB,KAAK,KAAMslF,CAAC,GAAIloF,IAAM,EAAE,aAAewoF,IAAM,KAAOxoF,EAAI,EAAE,KAAMwoF,EAAI,IAAKxoF,IAAM,EAAE,cAAgBA,IAAM,EAAE,KAAM,OAAO,KAAK,MAAMA,CAAC,EAAG,EAAE,KAAK,MAAQ,IAC5amoF,EAAE,WAAaA,EAAE,YAAc,GAAKnoF,IAAM,EAAE,eAAiBmoF,EAAE,WAAa,GAAKzkF,IAAM,EAAE,UAAYA,IAAM,EAAE,gBAAkB,KAAK,QAAQ,KAAO,UAAYhE,EAAI+B,EAAE,WAAW0mF,EAAE,OAAQA,EAAE,QAAQ,EAAGF,EAAIE,EAAE,SAAWzoF,EAAGgC,EAAID,EAAE,WAAW0mF,EAAE,OAAQzoF,CAAC,EAAGyoF,EAAE,SAAWF,EAAGE,EAAE,UAAYE,EAAIJ,EAAGA,GAAKhiF,EAAE,SAASkiF,EAAE,OAAQA,EAAE,OAAQzoF,EAAGuoF,EAAG,CAAC,EAAG,KAAK,OAAOvmF,CAAC,GAAK,KAAK,OAAOuE,EAAE,UAAUkiF,EAAE,OAAQA,EAAE,QAAQ,CAAC,IAAKA,EAAE,WAAa,GAAKA,EAAE,YAAc,IAAMK,EAAI,GACjc,QAAU,EAAIL,EAAE,UAAYA,EAAE,YAAc,IAAMnoF,IAAM,EAAE,cAC1D,OAAOA,IAAM,EAAE,eAAiB0D,EAAI,EAAE,UAAWA,IAAM,EAAE,UAAY1D,EAAI4C,EAAE,WAAW,KAAK,IAAI,EAAG,KAAK,MAAM5C,CAAC,EAAG,KAAK,MAAQ,GAAIA,IAAM,EAAE,MAAQ0D,IAAM,EAAE,eAAiB,KAAK,MAAM,EAAE,IAAI,EAAG,EAAEykF,EAAE,UAAY,GACjN,EAAGzjF,EAAE,UAAU,OAAS,SAASga,EAAG,CAClC,KAAK,OAAO,KAAKA,CAAC,CACpB,EAAGha,EAAE,UAAU,MAAQ,SAASga,EAAG,CACjCA,IAAM,EAAE,OAAS,KAAK,QAAQ,KAAO,SAAW,KAAK,OAAS,KAAK,OAAO,KAAK,EAAE,EAAI,KAAK,OAASzY,EAAE,cAAc,KAAK,MAAM,GAAI,KAAK,OAAS,CAAA,EAAI,KAAK,IAAMyY,EAAG,KAAK,IAAM,KAAK,KAAK,GACzL,EAAG,EAAE,QAAUha,EAAG,EAAE,QAAU3R,EAAG,EAAE,WAAa,SAAS2rB,EAAGtzB,EAAG,CAC7D,OAAQA,EAAIA,GAAK,CAAA,GAAI,IAAM,GAAI2H,EAAE2rB,EAAGtzB,CAAC,CACvC,EAAG,EAAE,OAAS2H,CAChB,EAAG,CAAE,iBAAkB,GAAI,kBAAmB,GAAI,mBAAoB,GAAI,kBAAmB,GAAI,iBAAkB,GAAI,kBAAmB,GAAI,iBAAkB,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC5L,IAAI6P,EAAI,OAAO,WAAa,KAAO,OAAO,YAAc,KAAO,OAAO,WAAa,IACnF,EAAE,OAAS,SAAS,EAAG,CACrB,QAASsI,EAAI,MAAM,UAAU,MAAM,KAAK,UAAW,CAAC,EAAGA,EAAE,QAAU,CACjE,IAAIvJ,EAAIuJ,EAAE,MAAK,EACf,GAAIvJ,EAAG,CACL,GAAI,OAAOA,GAAK,SAAU,MAAM,IAAI,UAAUA,EAAI,oBAAoB,EACtE,QAAS,KAAKA,EAAGA,EAAE,eAAe,CAAC,IAAM,EAAE,CAAC,EAAIA,EAAE,CAAC,EACrD,CACF,CACA,OAAO,CACT,EAAG,EAAE,UAAY,SAAS,EAAGuJ,EAAG,CAC9B,OAAO,EAAE,SAAWA,EAAI,EAAI,EAAE,SAAW,EAAE,SAAS,EAAGA,CAAC,GAAK,EAAE,OAASA,EAAG,EAC7E,EACA,IAAIjF,EAAI,CAAE,SAAU,SAAS,EAAGiF,EAAGvJ,EAAG,EAAGnC,EAAG,CAC1C,GAAI0L,EAAE,UAAY,EAAE,SAAU,EAAE,IAAIA,EAAE,SAASvJ,EAAGA,EAAI,CAAC,EAAGnC,CAAC,MACtD,SAASkF,EAAI,EAAGA,EAAI,EAAGA,IAAK,EAAElF,EAAIkF,CAAC,EAAIwG,EAAEvJ,EAAI+C,CAAC,CACrD,EAAG,cAAe,SAAS,EAAG,CAC5B,IAAIwG,EAAGvJ,EAAG,EAAGnC,EAAGkF,EAAG3R,EACnB,IAAKmY,EAAI,EAAI,EAAGvJ,EAAI,EAAE,OAAQuJ,EAAIvJ,EAAGuJ,IAAK,GAAK,EAAEA,CAAC,EAAE,OACpD,IAAKnY,EAAI,IAAI,WAAW,CAAC,EAAGmY,EAAI1L,EAAI,EAAGmC,EAAI,EAAE,OAAQuJ,EAAIvJ,EAAGuJ,IAAKxG,EAAI,EAAEwG,CAAC,EAAGnY,EAAE,IAAI2R,EAAGlF,CAAC,EAAGA,GAAKkF,EAAE,OAC/F,OAAO3R,CACT,CAAC,EAAI0O,EAAI,CAAE,SAAU,SAAS,EAAGyJ,EAAGvJ,EAAG,EAAGnC,EAAG,CAC3C,QAASkF,EAAI,EAAGA,EAAI,EAAGA,IAAK,EAAElF,EAAIkF,CAAC,EAAIwG,EAAEvJ,EAAI+C,CAAC,CAChD,EAAG,cAAe,SAAS,EAAG,CAC5B,MAAO,CAAA,EAAG,OAAO,MAAM,CAAA,EAAI,CAAC,CAC9B,CAAC,EACD,EAAE,SAAW,SAAS,EAAG,CACvB,GAAK,EAAE,KAAO,WAAY,EAAE,MAAQ,YAAa,EAAE,MAAQ,WAAY,EAAE,OAAO,EAAGuB,CAAC,IAAM,EAAE,KAAO,MAAO,EAAE,MAAQ,MAAO,EAAE,MAAQ,MAAO,EAAE,OAAO,EAAGxE,CAAC,EAC3J,EAAG,EAAE,SAASmB,CAAC,CACjB,EAAG,CAAA,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7B,IAAIA,EAAI,EAAE,UAAU,EAAGqD,EAAI,GAAIxE,EAAI,GACnC,GAAI,CACF,OAAO,aAAa,MAAM,KAAM,CAAC,CAAC,CAAC,CACrC,MAAQ,CACNwE,EAAI,EACN,CACA,GAAI,CACF,OAAO,aAAa,MAAM,KAAM,IAAI,WAAW,CAAC,CAAC,CACnD,MAAQ,CACNxE,EAAI,EACN,CACA,QAAS,EAAI,IAAImB,EAAE,KAAK,GAAG,EAAGsI,EAAI,EAAGA,EAAI,IAAKA,IAAK,EAAEA,CAAC,EAAI,KAAOA,EAAI,EAAI,KAAOA,EAAI,EAAI,KAAOA,EAAI,EAAI,KAAOA,EAAI,EAAI,KAAOA,EAAI,EAAI,EACrI,SAASvJ,EAAE,EAAGnC,EAAG,CACf,GAAIA,EAAI,QAAU,EAAE,UAAYiC,GAAK,CAAC,EAAE,UAAYwE,GAAI,OAAO,OAAO,aAAa,MAAM,KAAMrD,EAAE,UAAU,EAAGpD,CAAC,CAAC,EAChH,QAASkF,EAAI,GAAI3R,EAAI,EAAGA,EAAIyM,EAAGzM,IAAK2R,GAAK,OAAO,aAAa,EAAE3R,CAAC,CAAC,EACjE,OAAO2R,CACT,CACA,EAAE,GAAG,EAAI,EAAE,GAAG,EAAI,EAAG,EAAE,WAAa,SAAS,EAAG,CAC9C,IAAIlF,EAAGkF,EAAG3R,EAAG2rB,EAAGtzB,EAAG4U,EAAI,EAAE,OAAQ0D,EAAI,EACrC,IAAKgb,EAAI,EAAGA,EAAI1e,EAAG0e,KAAM,OAASha,EAAI,EAAE,WAAWga,CAAC,KAAO,OAASA,EAAI,EAAI1e,IAAM,OAASjN,EAAI,EAAE,WAAW2rB,EAAI,CAAC,KAAO,QAAUha,EAAI,OAASA,EAAI,OAAS,KAAO3R,EAAI,OAAQ2rB,KAAMhb,GAAKgB,EAAI,IAAM,EAAIA,EAAI,KAAO,EAAIA,EAAI,MAAQ,EAAI,EACvO,IAAKlF,EAAI,IAAIoD,EAAE,KAAKc,CAAC,EAAGgb,EAAItzB,EAAI,EAAGA,EAAIsY,EAAGgb,KAAM,OAASha,EAAI,EAAE,WAAWga,CAAC,KAAO,OAASA,EAAI,EAAI1e,IAAM,OAASjN,EAAI,EAAE,WAAW2rB,EAAI,CAAC,KAAO,QAAUha,EAAI,OAASA,EAAI,OAAS,KAAO3R,EAAI,OAAQ2rB,KAAMha,EAAI,IAAMlF,EAAEpU,GAAG,EAAIsZ,GAAKA,EAAI,KAAOlF,EAAEpU,GAAG,EAAI,IAAMsZ,IAAM,GAAKA,EAAI,MAAQlF,EAAEpU,GAAG,EAAI,IAAMsZ,IAAM,IAAMlF,EAAEpU,GAAG,EAAI,IAAMsZ,IAAM,GAAIlF,EAAEpU,GAAG,EAAI,IAAMsZ,IAAM,GAAK,IAAKlF,EAAEpU,GAAG,EAAI,IAAMsZ,IAAM,EAAI,IAAKlF,EAAEpU,GAAG,EAAI,IAAM,GAAKsZ,GAC1Z,OAAOlF,CACT,EAAG,EAAE,cAAgB,SAAS,EAAG,CAC/B,OAAOmC,EAAE,EAAG,EAAE,MAAM,CACtB,EAAG,EAAE,cAAgB,SAAS,EAAG,CAC/B,QAASnC,EAAI,IAAIoD,EAAE,KAAK,EAAE,MAAM,EAAG8B,EAAI,EAAG3R,EAAIyM,EAAE,OAAQkF,EAAI3R,EAAG2R,IAAKlF,EAAEkF,CAAC,EAAI,EAAE,WAAWA,CAAC,EACzF,OAAOlF,CACT,EAAG,EAAE,WAAa,SAAS,EAAGA,EAAG,CAC/B,IAAIkF,EAAG3R,EAAG2rB,EAAGtzB,EAAG4U,EAAIR,GAAK,EAAE,OAAQkE,EAAI,IAAI,MAAM,EAAI1D,CAAC,EACtD,IAAK0E,EAAI3R,EAAI,EAAG2R,EAAI1E,GAAK,IAAK0e,EAAI,EAAEha,GAAG,GAAK,IAAKhB,EAAE3Q,GAAG,EAAI2rB,UACjD,GAAKtzB,EAAI,EAAEszB,CAAC,GAAIhb,EAAE3Q,GAAG,EAAI,MAAO2R,GAAKtZ,EAAI,MAC7C,CACH,IAAKszB,GAAKtzB,IAAM,EAAI,GAAKA,IAAM,EAAI,GAAK,EAAG,EAAIA,GAAKsZ,EAAI1E,GAAK0e,EAAIA,GAAK,EAAI,GAAK,EAAEha,GAAG,EAAGtZ,IACvF,EAAIA,EAAIsY,EAAE3Q,GAAG,EAAI,MAAQ2rB,EAAI,MAAQhb,EAAE3Q,GAAG,EAAI2rB,GAAKA,GAAK,MAAOhb,EAAE3Q,GAAG,EAAI,MAAQ2rB,GAAK,GAAK,KAAMhb,EAAE3Q,GAAG,EAAI,MAAQ,KAAO2rB,EAC1H,CACA,OAAO/c,EAAE+B,EAAG3Q,CAAC,CACf,EAAG,EAAE,WAAa,SAAS,EAAGyM,EAAG,CAC/B,IAAIkF,EACJ,KAAMlF,EAAIA,GAAK,EAAE,QAAU,EAAE,SAAWA,EAAI,EAAE,QAASkF,EAAIlF,EAAI,EAAG,GAAKkF,IAAM,IAAM,EAAEA,CAAC,IAAM,KAAOA,IACnG,OAAOA,EAAI,GAAKA,IAAM,EAAIlF,EAAIkF,EAAI,EAAE,EAAEA,CAAC,CAAC,EAAIlF,EAAIkF,EAAIlF,CACtD,CACF,EAAG,CAAE,WAAY,GAAI,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7C,EAAE,QAAU,SAASoD,EAAGqD,EAAGxE,EAAG,EAAG,CAC/B,QAASyJ,EAAI,MAAQtI,EAAI,EAAGjB,EAAIiB,IAAM,GAAK,MAAQ,EAAG,EAAI,EAAGnB,IAAM,GAAK,CACtE,IAAKA,GAAK,EAAI,IAAMA,EAAI,IAAMA,EAAGE,EAAIA,GAAKuJ,EAAIA,EAAIjF,EAAE,GAAG,EAAI,GAAK,EAAG,EAAE,GAAK,CAC1EiF,GAAK,MAAOvJ,GAAK,KACnB,CACA,OAAOuJ,EAAIvJ,GAAK,GAAK,CACvB,CACF,EAAG,CAAA,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7B,EAAE,QAAU,CAAE,WAAY,EAAG,gBAAiB,EAAG,aAAc,EAAG,aAAc,EAAG,SAAU,EAAG,QAAS,EAAG,QAAS,EAAG,KAAM,EAAG,aAAc,EAAG,YAAa,EAAG,QAAS,GAAI,eAAgB,GAAI,aAAc,GAAI,YAAa,GAAI,iBAAkB,EAAG,aAAc,EAAG,mBAAoB,EAAG,sBAAuB,GAAI,WAAY,EAAG,eAAgB,EAAG,MAAO,EAAG,QAAS,EAAG,mBAAoB,EAAG,SAAU,EAAG,OAAQ,EAAG,UAAW,EAAG,WAAY,CAAC,CAClc,EAAG,CAAA,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7B,IAAIiB,GAAK,UAAW,CAClB,QAASqD,EAAGxE,EAAI,GAAI,EAAI,EAAG,EAAI,IAAK,IAAK,CACvCwE,EAAI,EACJ,QAASiF,EAAI,EAAGA,EAAI,EAAGA,IAAKjF,EAAI,EAAIA,EAAI,WAAaA,IAAM,EAAIA,IAAM,EACrExE,EAAE,CAAC,EAAIwE,CACT,CACA,OAAOxE,CACT,GAAC,EACD,EAAE,QAAU,SAASwE,EAAGxE,EAAG,EAAGyJ,EAAG,CAC/B,IAAIvJ,EAAIiB,EAAG,EAAIsI,EAAI,EACnBjF,GAAK,GACL,QAASzG,EAAI0L,EAAG1L,EAAI,EAAGA,IAAKyG,EAAIA,IAAM,EAAItE,EAAE,KAAOsE,EAAIxE,EAAEjC,CAAC,EAAE,EAC5D,MAAO,GAAKyG,CACd,CACF,EAAG,CAAA,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7B,IAAIrD,EAAGqD,EAAI,EAAE,iBAAiB,EAAGxE,EAAI,EAAE,SAAS,EAAG,EAAI,EAAE,WAAW,EAAGyJ,EAAI,EAAE,SAAS,EAAGvJ,EAAI,EAAE,YAAY,EAAG,EAAI,EAAGnC,EAAI,EAAGkF,EAAI,EAAG3R,EAAI,GAAI2rB,EAAI,GAAItzB,EAAI,EAAG4U,EAAI,EAAG0D,EAAI,EAAGhE,EAAI,EAAGuoF,EAAI,IAAKvmF,EAAI,GAAIwmF,EAAI,GAAIC,EAAI,EAAIF,EAAI,EAAGI,EAAI,GAAIE,EAAI,EAAGC,EAAI,IAAKX,EAAIW,EAAID,EAAI,EAAGR,EAAI,GAAIC,EAAI,IAAKn4F,EAAI,EAAG,EAAI,EAAGu4F,EAAI,EAAGE,EAAI,EACxS,SAASljF,EAAGomF,EAAGC,EAAG,CAChB,OAAOD,EAAE,IAAM7pF,EAAE8pF,CAAC,EAAGA,CACvB,CACA,SAASV,EAAES,EAAG,CACZ,OAAQA,GAAK,IAAM,EAAIA,EAAI,EAAI,EACjC,CACA,SAAS/C,GAAE+C,EAAG,CACZ,QAASC,EAAID,EAAE,OAAQ,GAAK,EAAEC,GAAKD,EAAEC,CAAC,EAAI,CAC5C,CACA,SAAS9C,EAAE6C,EAAG,CACZ,IAAIC,EAAID,EAAE,MAAO35E,EAAI45E,EAAE,QACvB55E,EAAI25E,EAAE,YAAc35E,EAAI25E,EAAE,WAAY35E,IAAM,IAAM5L,EAAE,SAASulF,EAAE,OAAQC,EAAE,YAAaA,EAAE,YAAa55E,EAAG25E,EAAE,QAAQ,EAAGA,EAAE,UAAY35E,EAAG45E,EAAE,aAAe55E,EAAG25E,EAAE,WAAa35E,EAAG25E,EAAE,WAAa35E,EAAG45E,EAAE,SAAW55E,EAAG45E,EAAE,UAAY,IAAMA,EAAE,YAAc,GACpP,CACA,SAAS/C,EAAE8C,EAAGC,EAAG,CACfhqF,EAAE,gBAAgB+pF,EAAG,GAAKA,EAAE,YAAcA,EAAE,YAAc,GAAIA,EAAE,SAAWA,EAAE,YAAaC,CAAC,EAAGD,EAAE,YAAcA,EAAE,SAAU7C,EAAE6C,EAAE,IAAI,CACpI,CACA,SAASR,GAAEQ,EAAGC,EAAG,CACfD,EAAE,YAAYA,EAAE,SAAS,EAAIC,CAC/B,CACA,SAASR,GAAGO,EAAGC,EAAG,CAChBD,EAAE,YAAYA,EAAE,SAAS,EAAIC,IAAM,EAAI,IAAKD,EAAE,YAAYA,EAAE,SAAS,EAAI,IAAMC,CACjF,CACA,SAASjqF,GAAEgqF,EAAGC,EAAG,CACf,IAAI55E,EAAG65E,EAAG,EAAIF,EAAE,iBAAkBG,EAAIH,EAAE,SAAUI,GAAIJ,EAAE,YAAaK,EAAIL,EAAE,WAAYM,EAAIN,EAAE,SAAWA,EAAE,OAAS3D,EAAI2D,EAAE,UAAYA,EAAE,OAAS3D,GAAK,EAAGkE,EAAIP,EAAE,OAAQQ,EAAKR,EAAE,OAAQS,EAAIT,EAAE,KAAMU,EAAKV,EAAE,SAAWhD,EAAGryE,GAAK41E,EAAEJ,EAAIC,GAAI,CAAC,EAAG9hF,GAAKiiF,EAAEJ,EAAIC,EAAC,EACrPJ,EAAE,aAAeA,EAAE,aAAe,IAAM,GAAIK,EAAIL,EAAE,YAAcK,EAAIL,EAAE,WACtE,EACE,IAAIO,GAAGl6E,EAAI45E,GAAKG,EAAC,IAAM9hF,IAAMiiF,EAAEl6E,EAAI+5E,GAAI,CAAC,IAAMz1E,IAAM41E,EAAEl6E,CAAC,IAAMk6E,EAAEJ,CAAC,GAAKI,EAAE,EAAEl6E,CAAC,IAAMk6E,EAAEJ,EAAI,CAAC,EAAG,CACxFA,GAAK,EAAG95E,IACR,EACE,OACKk6E,EAAE,EAAEJ,CAAC,IAAMI,EAAE,EAAEl6E,CAAC,GAAKk6E,EAAE,EAAEJ,CAAC,IAAMI,EAAE,EAAEl6E,CAAC,GAAKk6E,EAAE,EAAEJ,CAAC,IAAMI,EAAE,EAAEl6E,CAAC,GAAKk6E,EAAE,EAAEJ,CAAC,IAAMI,EAAE,EAAEl6E,CAAC,GAAKk6E,EAAE,EAAEJ,CAAC,IAAMI,EAAE,EAAEl6E,CAAC,GAAKk6E,EAAE,EAAEJ,CAAC,IAAMI,EAAE,EAAEl6E,CAAC,GAAKk6E,EAAE,EAAEJ,CAAC,IAAMI,EAAE,EAAEl6E,CAAC,GAAKk6E,EAAE,EAAEJ,CAAC,IAAMI,EAAE,EAAEl6E,CAAC,GAAK85E,EAAIO,GACnL,GAAIR,EAAIlD,GAAK0D,EAAKP,GAAIA,EAAIO,EAAK1D,EAAGoD,GAAIF,EAAG,CACvC,GAAIF,EAAE,YAAcC,EAAGI,IAAMD,GAAIF,GAAI,MACrCv1E,GAAK41E,EAAEJ,EAAIC,GAAI,CAAC,EAAG9hF,GAAKiiF,EAAEJ,EAAIC,EAAC,CACjC,CACF,QACMH,EAAIQ,EAAER,EAAIO,CAAE,GAAKF,GAAK,EAAE,GAAK,GACrC,OAAOF,IAAKJ,EAAE,UAAYI,GAAIJ,EAAE,SAClC,CACA,SAASn1E,GAAGm1E,EAAG,CACb,IAAIC,EAAG55E,EAAG65E,EAAG,EAAGC,EAAGC,GAAGC,EAAGC,EAAGC,EAAGC,EAAIC,EAAIT,EAAE,OACzC,EAAG,CACD,GAAI,EAAIA,EAAE,YAAcA,EAAE,UAAYA,EAAE,SAAUA,EAAE,UAAYS,GAAKA,EAAIpE,GAAI,CAC3E,IAAK5hF,EAAE,SAASulF,EAAE,OAAQA,EAAE,OAAQS,EAAGA,EAAG,CAAC,EAAGT,EAAE,aAAeS,EAAGT,EAAE,UAAYS,EAAGT,EAAE,aAAeS,EAAGR,EAAI55E,EAAI25E,EAAE,UAAWE,EAAIF,EAAE,KAAK,EAAEC,CAAC,EAAGD,EAAE,KAAKC,CAAC,EAAIQ,GAAKP,EAAIA,EAAIO,EAAI,EAAG,EAAEp6E,GAAK,CACpL,IAAK45E,EAAI55E,EAAIo6E,EAAGP,EAAIF,EAAE,KAAK,EAAEC,CAAC,EAAGD,EAAE,KAAKC,CAAC,EAAIQ,GAAKP,EAAIA,EAAIO,EAAI,EAAG,EAAEp6E,GAAK,CACxE,GAAKo6E,CACP,CACA,GAAIT,EAAE,KAAK,WAAa,EAAG,MAC3B,GAAII,GAAIJ,EAAE,KAAMK,EAAIL,EAAE,OAAQM,EAAIN,EAAE,SAAWA,EAAE,UAAWO,EAAI,EAAGC,EAAK,OAAQA,EAAKJ,GAAE,SAAUG,EAAIC,IAAOA,EAAKD,GAAIl6E,EAAIm6E,IAAO,EAAI,GAAKJ,GAAE,UAAYI,EAAI/lF,EAAE,SAAS4lF,EAAGD,GAAE,MAAOA,GAAE,QAASI,EAAIF,CAAC,EAAGF,GAAE,MAAM,OAAS,EAAIA,GAAE,MAAQ,EAAEA,GAAE,MAAOC,EAAGG,EAAIF,CAAC,EAAIF,GAAE,MAAM,OAAS,IAAMA,GAAE,MAAQ1gF,EAAE0gF,GAAE,MAAOC,EAAGG,EAAIF,CAAC,GAAIF,GAAE,SAAWI,EAAIJ,GAAE,UAAYI,EAAIA,GAAKR,EAAE,WAAa35E,EAAG25E,EAAE,UAAYA,EAAE,QAAUjD,EAAG,IAAKoD,EAAIH,EAAE,SAAWA,EAAE,OAAQA,EAAE,MAAQA,EAAE,OAAOG,CAAC,EAAGH,EAAE,OAASA,EAAE,OAASA,EAAE,WAAaA,EAAE,OAAOG,EAAI,CAAC,GAAKH,EAAE,UAAWA,EAAE,SAAWA,EAAE,OAASA,EAAE,OAASA,EAAE,WAAaA,EAAE,OAAOG,EAAIpD,EAAI,CAAC,GAAKiD,EAAE,UAAWA,EAAE,KAAKG,EAAIH,EAAE,MAAM,EAAIA,EAAE,KAAKA,EAAE,KAAK,EAAGA,EAAE,KAAKA,EAAE,KAAK,EAAIG,EAAGA,IAAKH,EAAE,SAAU,EAAEA,EAAE,UAAYA,EAAE,OAASjD,KAAO,CAC9sB,OAASiD,EAAE,UAAY3D,GAAK2D,EAAE,KAAK,WAAa,EAClD,CACA,SAASN,GAAGM,EAAGC,EAAG,CAChB,QAAS55E,EAAG65E,IAAO,CACjB,GAAIF,EAAE,UAAY3D,EAAG,CACnB,GAAIxxE,GAAGm1E,CAAC,EAAGA,EAAE,UAAY3D,GAAK4D,IAAM,EAAG,OAAO57F,EAC9C,GAAI27F,EAAE,YAAc,EAAG,KACzB,CACA,GAAI35E,EAAI,EAAG25E,EAAE,WAAajD,IAAMiD,EAAE,OAASA,EAAE,OAASA,EAAE,WAAaA,EAAE,OAAOA,EAAE,SAAWjD,EAAI,CAAC,GAAKiD,EAAE,UAAW35E,EAAI25E,EAAE,KAAKA,EAAE,SAAWA,EAAE,MAAM,EAAIA,EAAE,KAAKA,EAAE,KAAK,EAAGA,EAAE,KAAKA,EAAE,KAAK,EAAIA,EAAE,UAAW35E,IAAM,GAAK25E,EAAE,SAAW35E,GAAK25E,EAAE,OAAS3D,IAAM2D,EAAE,aAAehqF,GAAEgqF,EAAG35E,CAAC,GAAI25E,EAAE,cAAgBjD,EAAG,GAAImD,EAAIjqF,EAAE,UAAU+pF,EAAGA,EAAE,SAAWA,EAAE,YAAaA,EAAE,aAAejD,CAAC,EAAGiD,EAAE,WAAaA,EAAE,aAAcA,EAAE,cAAgBA,EAAE,gBAAkBA,EAAE,WAAajD,EAAG,CACjc,IAAKiD,EAAE,eAAgBA,EAAE,WAAYA,EAAE,OAASA,EAAE,OAASA,EAAE,WAAaA,EAAE,OAAOA,EAAE,SAAWjD,EAAI,CAAC,GAAKiD,EAAE,UAAW35E,EAAI25E,EAAE,KAAKA,EAAE,SAAWA,EAAE,MAAM,EAAIA,EAAE,KAAKA,EAAE,KAAK,EAAGA,EAAE,KAAKA,EAAE,KAAK,EAAIA,EAAE,SAAU,EAAEA,EAAE,cAAgB,GAAK,CACnOA,EAAE,UACJ,MAAOA,EAAE,UAAYA,EAAE,aAAcA,EAAE,aAAe,EAAGA,EAAE,MAAQA,EAAE,OAAOA,EAAE,QAAQ,EAAGA,EAAE,OAASA,EAAE,OAASA,EAAE,WAAaA,EAAE,OAAOA,EAAE,SAAW,CAAC,GAAKA,EAAE,eACvJE,EAAIjqF,EAAE,UAAU+pF,EAAG,EAAGA,EAAE,OAAOA,EAAE,QAAQ,CAAC,EAAGA,EAAE,YAAaA,EAAE,WACnE,GAAIE,IAAMhD,EAAE8C,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,GAAI,OAAO37F,CACtD,CACA,OAAO27F,EAAE,OAASA,EAAE,SAAWjD,EAAI,EAAIiD,EAAE,SAAWjD,EAAI,EAAGkD,IAAMjsF,GAAKkpF,EAAE8C,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,EAAIpD,EAAIE,GAAKkD,EAAE,WAAa9C,EAAE8C,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,GAAK37F,EAAI,CAC3K,CACA,SAASs7F,GAAGK,EAAGC,EAAG,CAChB,QAAS55E,EAAG65E,EAAG,IAAO,CACpB,GAAIF,EAAE,UAAY3D,EAAG,CACnB,GAAIxxE,GAAGm1E,CAAC,EAAGA,EAAE,UAAY3D,GAAK4D,IAAM,EAAG,OAAO57F,EAC9C,GAAI27F,EAAE,YAAc,EAAG,KACzB,CACA,GAAI35E,EAAI,EAAG25E,EAAE,WAAajD,IAAMiD,EAAE,OAASA,EAAE,OAASA,EAAE,WAAaA,EAAE,OAAOA,EAAE,SAAWjD,EAAI,CAAC,GAAKiD,EAAE,UAAW35E,EAAI25E,EAAE,KAAKA,EAAE,SAAWA,EAAE,MAAM,EAAIA,EAAE,KAAKA,EAAE,KAAK,EAAGA,EAAE,KAAKA,EAAE,KAAK,EAAIA,EAAE,UAAWA,EAAE,YAAcA,EAAE,aAAcA,EAAE,WAAaA,EAAE,YAAaA,EAAE,aAAejD,EAAI,EAAG12E,IAAM,GAAK25E,EAAE,YAAcA,EAAE,gBAAkBA,EAAE,SAAW35E,GAAK25E,EAAE,OAAS3D,IAAM2D,EAAE,aAAehqF,GAAEgqF,EAAG35E,CAAC,EAAG25E,EAAE,cAAgB,IAAMA,EAAE,WAAa,GAAKA,EAAE,eAAiBjD,GAAK,KAAOiD,EAAE,SAAWA,EAAE,eAAiBA,EAAE,aAAejD,EAAI,IAAKiD,EAAE,aAAejD,GAAKiD,EAAE,cAAgBA,EAAE,YAAa,CAClkB,IAAK,EAAIA,EAAE,SAAWA,EAAE,UAAYjD,EAAGmD,EAAIjqF,EAAE,UAAU+pF,EAAGA,EAAE,SAAW,EAAIA,EAAE,WAAYA,EAAE,YAAcjD,CAAC,EAAGiD,EAAE,WAAaA,EAAE,YAAc,EAAGA,EAAE,aAAe,EAAG,EAAEA,EAAE,UAAY,IAAMA,EAAE,OAASA,EAAE,OAASA,EAAE,WAAaA,EAAE,OAAOA,EAAE,SAAWjD,EAAI,CAAC,GAAKiD,EAAE,UAAW35E,EAAI25E,EAAE,KAAKA,EAAE,SAAWA,EAAE,MAAM,EAAIA,EAAE,KAAKA,EAAE,KAAK,EAAGA,EAAE,KAAKA,EAAE,KAAK,EAAIA,EAAE,UAAW,EAAEA,EAAE,aAAe,GAAK,CACvX,GAAIA,EAAE,gBAAkB,EAAGA,EAAE,aAAejD,EAAI,EAAGiD,EAAE,WAAYE,IAAMhD,EAAE8C,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,GAAI,OAAO37F,CACnH,SAAW27F,EAAE,iBACX,IAAKE,EAAIjqF,EAAE,UAAU+pF,EAAG,EAAGA,EAAE,OAAOA,EAAE,SAAW,CAAC,CAAC,IAAM9C,EAAE8C,EAAG,EAAE,EAAGA,EAAE,WAAYA,EAAE,YAAaA,EAAE,KAAK,YAAc,EAAG,OAAO37F,OAC1H27F,EAAE,gBAAkB,EAAGA,EAAE,WAAYA,EAAE,WAChD,CACA,OAAOA,EAAE,kBAAoBE,EAAIjqF,EAAE,UAAU+pF,EAAG,EAAGA,EAAE,OAAOA,EAAE,SAAW,CAAC,CAAC,EAAGA,EAAE,gBAAkB,GAAIA,EAAE,OAASA,EAAE,SAAWjD,EAAI,EAAIiD,EAAE,SAAWjD,EAAI,EAAGkD,IAAMjsF,GAAKkpF,EAAE8C,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,EAAIpD,EAAIE,GAAKkD,EAAE,WAAa9C,EAAE8C,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,GAAK37F,EAAI,CAC1Q,CACA,SAASu7F,GAAGI,EAAGC,EAAG55E,EAAG65E,EAAG,EAAG,CACzB,KAAK,YAAcF,EAAG,KAAK,SAAWC,EAAG,KAAK,YAAc55E,EAAG,KAAK,UAAY65E,EAAG,KAAK,KAAO,CACjG,CACA,SAASL,IAAK,CACZ,KAAK,KAAO,KAAM,KAAK,OAAS,EAAG,KAAK,YAAc,KAAM,KAAK,iBAAmB,EAAG,KAAK,YAAc,EAAG,KAAK,QAAU,EAAG,KAAK,KAAO,EAAG,KAAK,OAAS,KAAM,KAAK,QAAU,EAAG,KAAK,OAAS3nF,EAAG,KAAK,WAAa,GAAI,KAAK,OAAS,EAAG,KAAK,OAAS,EAAG,KAAK,OAAS,EAAG,KAAK,OAAS,KAAM,KAAK,YAAc,EAAG,KAAK,KAAO,KAAM,KAAK,KAAO,KAAM,KAAK,MAAQ,EAAG,KAAK,UAAY,EAAG,KAAK,UAAY,EAAG,KAAK,UAAY,EAAG,KAAK,WAAa,EAAG,KAAK,YAAc,EAAG,KAAK,aAAe,EAAG,KAAK,WAAa,EAAG,KAAK,gBAAkB,EAAG,KAAK,SAAW,EAAG,KAAK,YAAc,EAAG,KAAK,UAAY,EAAG,KAAK,YAAc,EAAG,KAAK,iBAAmB,EAAG,KAAK,eAAiB,EAAG,KAAK,MAAQ,EAAG,KAAK,SAAW,EAAG,KAAK,WAAa,EAAG,KAAK,WAAa,EAAG,KAAK,UAAY,IAAIuC,EAAE,MAAM,EAAIkiF,CAAC,EAAG,KAAK,UAAY,IAAIliF,EAAE,MAAM,GAAK,EAAIvE,EAAI,EAAE,EAAG,KAAK,QAAU,IAAIuE,EAAE,MAAM,GAAK,EAAIiiF,EAAI,EAAE,EAAGO,GAAE,KAAK,SAAS,EAAGA,GAAE,KAAK,SAAS,EAAGA,GAAE,KAAK,OAAO,EAAG,KAAK,OAAS,KAAM,KAAK,OAAS,KAAM,KAAK,QAAU,KAAM,KAAK,SAAW,IAAIxiF,EAAE,MAAMoiF,EAAI,CAAC,EAAG,KAAK,KAAO,IAAIpiF,EAAE,MAAM,EAAIgiF,EAAI,CAAC,EAAGQ,GAAE,KAAK,IAAI,EAAG,KAAK,SAAW,EAAG,KAAK,SAAW,EAAG,KAAK,MAAQ,IAAIxiF,EAAE,MAAM,EAAIgiF,EAAI,CAAC,EAAGQ,GAAE,KAAK,KAAK,EAAG,KAAK,MAAQ,EAAG,KAAK,YAAc,EAAG,KAAK,SAAW,EAAG,KAAK,MAAQ,EAAG,KAAK,QAAU,EAAG,KAAK,WAAa,EAAG,KAAK,QAAU,EAAG,KAAK,OAAS,EAAG,KAAK,OAAS,EAAG,KAAK,SAAW,CACx0C,CACA,SAAS/+E,GAAG8hF,EAAG,CACb,IAAIC,EACJ,OAAOD,GAAKA,EAAE,OAASA,EAAE,SAAWA,EAAE,UAAY,EAAGA,EAAE,UAAYxrF,GAAIyrF,EAAID,EAAE,OAAO,QAAU,EAAGC,EAAE,YAAc,EAAGA,EAAE,KAAO,IAAMA,EAAE,KAAO,CAACA,EAAE,MAAOA,EAAE,OAASA,EAAE,KAAO1D,EAAIC,EAAGwD,EAAE,MAAQC,EAAE,OAAS,EAAI,EAAI,EAAGA,EAAE,WAAa,EAAGhqF,EAAE,SAASgqF,CAAC,EAAG/mF,GAAKU,EAAGomF,EAAGz4F,CAAC,CAChQ,CACA,SAASu4F,GAAGE,EAAG,CACb,IAAIC,EAAI/hF,GAAG8hF,CAAC,EACZ,OAAOC,IAAM/mF,IAAM,SAASmN,EAAG,CAC7BA,EAAE,YAAc,EAAIA,EAAE,OAAQ42E,GAAE52E,EAAE,IAAI,EAAGA,EAAE,eAAiBjP,EAAEiP,EAAE,KAAK,EAAE,SAAUA,EAAE,WAAajP,EAAEiP,EAAE,KAAK,EAAE,YAAaA,EAAE,WAAajP,EAAEiP,EAAE,KAAK,EAAE,YAAaA,EAAE,iBAAmBjP,EAAEiP,EAAE,KAAK,EAAE,UAAWA,EAAE,SAAW,EAAGA,EAAE,YAAc,EAAGA,EAAE,UAAY,EAAGA,EAAE,OAAS,EAAGA,EAAE,aAAeA,EAAE,YAAc02E,EAAI,EAAG12E,EAAE,gBAAkB,EAAGA,EAAE,MAAQ,CACvV,GAAG25E,EAAE,KAAK,EAAGC,CACf,CACA,SAASF,GAAGC,EAAGC,EAAG55E,EAAG65E,EAAG,EAAGC,EAAG,CAC5B,GAAI,CAACH,EAAG,OAAOz4F,EACf,IAAI64F,GAAI,EACR,GAAIH,IAAM/sE,IAAM+sE,EAAI,GAAIC,EAAI,GAAKE,GAAI,EAAGF,EAAI,CAACA,GAAK,GAAKA,IAAME,GAAI,EAAGF,GAAK,IAAK,EAAI,GAAKhsF,EAAI,GAAKmS,IAAMnO,GAAKgoF,EAAI,GAAK,GAAKA,GAAKD,EAAI,GAAK,EAAIA,GAAKE,EAAI,GAAKvgG,EAAIugG,EAAG,OAAOvmF,EAAGomF,EAAGz4F,CAAC,EAC9K24F,IAAM,IAAMA,EAAI,GAChB,IAAIG,EAAI,IAAIR,GACZ,OAAQG,EAAE,MAAQK,GAAG,KAAOL,EAAGK,EAAE,KAAOD,GAAGC,EAAE,OAAS,KAAMA,EAAE,OAASH,EAAGG,EAAE,OAAS,GAAKA,EAAE,OAAQA,EAAE,OAASA,EAAE,OAAS,EAAGA,EAAE,UAAY,EAAI,EAAGA,EAAE,UAAY,GAAKA,EAAE,UAAWA,EAAE,UAAYA,EAAE,UAAY,EAAGA,EAAE,WAAa,CAAC,GAAGA,EAAE,UAAYtD,EAAI,GAAKA,GAAIsD,EAAE,OAAS,IAAI5lF,EAAE,KAAK,EAAI4lF,EAAE,MAAM,EAAGA,EAAE,KAAO,IAAI5lF,EAAE,MAAM4lF,EAAE,SAAS,EAAGA,EAAE,KAAO,IAAI5lF,EAAE,MAAM4lF,EAAE,MAAM,EAAGA,EAAE,YAAc,GAAK,EAAI,EAAGA,EAAE,iBAAmB,EAAIA,EAAE,YAAaA,EAAE,YAAc,IAAI5lF,EAAE,KAAK4lF,EAAE,gBAAgB,EAAGA,EAAE,MAAQ,EAAIA,EAAE,YAAaA,EAAE,MAAQ,EAAIA,EAAE,YAAaA,EAAE,MAAQJ,EAAGI,EAAE,SAAWF,EAAGE,EAAE,OAASh6E,EAAGy5E,GAAGE,CAAC,CACtkB,CACA5oF,EAAI,CAAC,IAAIwoF,GAAG,EAAG,EAAG,EAAG,EAAG,SAASI,EAAGC,EAAG,CACrC,IAAI55E,EAAI,MACR,IAAKA,EAAI25E,EAAE,iBAAmB,IAAM35E,EAAI25E,EAAE,iBAAmB,KAAQ,CACnE,GAAIA,EAAE,WAAa,EAAG,CACpB,GAAIn1E,GAAGm1E,CAAC,EAAGA,EAAE,YAAc,GAAKC,IAAM,EAAG,OAAO57F,EAChD,GAAI27F,EAAE,YAAc,EAAG,KACzB,CACAA,EAAE,UAAYA,EAAE,UAAWA,EAAE,UAAY,EACzC,IAAIE,EAAIF,EAAE,YAAc35E,EACxB,IAAK25E,EAAE,WAAa,GAAKA,EAAE,UAAYE,KAAOF,EAAE,UAAYA,EAAE,SAAWE,EAAGF,EAAE,SAAWE,EAAGhD,EAAE8C,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,IAAMA,EAAE,SAAWA,EAAE,aAAeA,EAAE,OAAS3D,IAAMa,EAAE8C,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,GAAI,OAAO37F,CAC5N,CACA,OAAO27F,EAAE,OAAS,EAAGC,IAAMjsF,GAAKkpF,EAAE8C,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,EAAIpD,EAAIE,IAAMkD,EAAE,SAAWA,EAAE,cAAgB9C,EAAE8C,EAAG,EAAE,EAAGA,EAAE,KAAK,WAAY37F,EAC3I,CAAC,EAAG,IAAIu7F,GAAG,EAAG,EAAG,EAAG,EAAGF,EAAE,EAAG,IAAIE,GAAG,EAAG,EAAG,GAAI,EAAGF,EAAE,EAAG,IAAIE,GAAG,EAAG,EAAG,GAAI,GAAIF,EAAE,EAAG,IAAIE,GAAG,EAAG,EAAG,GAAI,GAAID,EAAE,EAAG,IAAIC,GAAG,EAAG,GAAI,GAAI,GAAID,EAAE,EAAG,IAAIC,GAAG,EAAG,GAAI,IAAK,IAAKD,EAAE,EAAG,IAAIC,GAAG,EAAG,GAAI,IAAK,IAAKD,EAAE,EAAG,IAAIC,GAAG,GAAI,IAAK,IAAK,KAAMD,EAAE,EAAG,IAAIC,GAAG,GAAI,IAAK,IAAK,KAAMD,EAAE,CAAC,EAAG,EAAE,YAAc,SAASK,EAAGC,EAAG,CAC5R,OAAOF,GAAGC,EAAGC,EAAG/nF,EAAG,GAAI,EAAG,CAAC,CAC7B,EAAG,EAAE,aAAe6nF,GAAI,EAAE,aAAeD,GAAI,EAAE,iBAAmB5hF,GAAI,EAAE,iBAAmB,SAAS8hF,EAAGC,EAAG,CACxG,OAAOD,GAAKA,EAAE,MAAQA,EAAE,MAAM,OAAS,EAAIz4F,GAAKy4F,EAAE,MAAM,OAASC,EAAG/mF,GAAK3R,CAC3E,EAAG,EAAE,QAAU,SAASy4F,EAAGC,EAAG,CAC5B,IAAI55E,EAAG65E,EAAG,EAAGC,EACb,GAAI,CAACH,GAAK,CAACA,EAAE,OAAS,EAAIC,GAAKA,EAAI,EAAG,OAAOD,EAAIpmF,EAAGomF,EAAGz4F,CAAC,EAAIA,EAC5D,GAAI24F,EAAIF,EAAE,MAAO,CAACA,EAAE,QAAU,CAACA,EAAE,OAASA,EAAE,WAAa,GAAKE,EAAE,SAAW,KAAOD,IAAMjsF,EAAG,OAAO4F,EAAGomF,EAAGA,EAAE,YAAc,EAAI,GAAKz4F,CAAC,EAClI,GAAI24F,EAAE,KAAOF,EAAG35E,EAAI65E,EAAE,WAAYA,EAAE,WAAaD,EAAGC,EAAE,SAAW3D,EAAG,GAAI2D,EAAE,OAAS,EAAGF,EAAE,MAAQ,EAAGR,GAAEU,EAAG,EAAE,EAAGV,GAAEU,EAAG,GAAG,EAAGV,GAAEU,EAAG,CAAC,EAAGA,EAAE,QAAUV,GAAEU,GAAIA,EAAE,OAAO,KAAO,EAAI,IAAMA,EAAE,OAAO,KAAO,EAAI,IAAMA,EAAE,OAAO,MAAQ,EAAI,IAAMA,EAAE,OAAO,KAAO,EAAI,IAAMA,EAAE,OAAO,QAAU,GAAK,EAAE,EAAGV,GAAEU,EAAG,IAAMA,EAAE,OAAO,IAAI,EAAGV,GAAEU,EAAGA,EAAE,OAAO,MAAQ,EAAI,GAAG,EAAGV,GAAEU,EAAGA,EAAE,OAAO,MAAQ,GAAK,GAAG,EAAGV,GAAEU,EAAGA,EAAE,OAAO,MAAQ,GAAK,GAAG,EAAGV,GAAEU,EAAGA,EAAE,QAAU,EAAI,EAAI,GAAKA,EAAE,UAAYA,EAAE,MAAQ,EAAI,EAAI,CAAC,EAAGV,GAAEU,EAAG,IAAMA,EAAE,OAAO,EAAE,EAAGA,EAAE,OAAO,OAASA,EAAE,OAAO,MAAM,SAAWV,GAAEU,EAAG,IAAMA,EAAE,OAAO,MAAM,MAAM,EAAGV,GAAEU,EAAGA,EAAE,OAAO,MAAM,QAAU,EAAI,GAAG,GAAIA,EAAE,OAAO,OAASF,EAAE,MAAQtgF,EAAEsgF,EAAE,MAAOE,EAAE,YAAaA,EAAE,QAAS,CAAC,GAAIA,EAAE,QAAU,EAAGA,EAAE,OAAS,KAAOV,GAAEU,EAAG,CAAC,EAAGV,GAAEU,EAAG,CAAC,EAAGV,GAAEU,EAAG,CAAC,EAAGV,GAAEU,EAAG,CAAC,EAAGV,GAAEU,EAAG,CAAC,EAAGV,GAAEU,EAAGA,EAAE,QAAU,EAAI,EAAI,GAAKA,EAAE,UAAYA,EAAE,MAAQ,EAAI,EAAI,CAAC,EAAGV,GAAEU,EAAG,CAAC,EAAGA,EAAE,OAAS1D,OAC90B,CACH,IAAI4D,GAAIloF,GAAKgoF,EAAE,OAAS,GAAK,IAAM,EACnCE,KAAM,GAAKF,EAAE,UAAYA,EAAE,MAAQ,EAAI,EAAIA,EAAE,MAAQ,EAAI,EAAIA,EAAE,QAAU,EAAI,EAAI,IAAM,EAAGA,EAAE,WAAa,IAAME,IAAK,IAAKA,IAAK,GAAKA,GAAI,GAAIF,EAAE,OAAS1D,EAAGiD,GAAGS,EAAGE,EAAC,EAAGF,EAAE,WAAa,IAAMT,GAAGS,EAAGF,EAAE,QAAU,EAAE,EAAGP,GAAGS,EAAG,MAAQF,EAAE,KAAK,GAAIA,EAAE,MAAQ,CACpP,CACA,GAAIE,EAAE,SAAW,GAAI,GAAIA,EAAE,OAAO,MAAO,CACvC,IAAK,EAAIA,EAAE,QAASA,EAAE,SAAW,MAAQA,EAAE,OAAO,MAAM,UAAYA,EAAE,UAAYA,EAAE,mBAAqBA,EAAE,OAAO,MAAQA,EAAE,QAAU,IAAMF,EAAE,MAAQtgF,EAAEsgF,EAAE,MAAOE,EAAE,YAAaA,EAAE,QAAU,EAAG,CAAC,GAAI/C,EAAE6C,CAAC,EAAG,EAAIE,EAAE,QAASA,EAAE,UAAYA,EAAE,oBAAsBV,GAAEU,EAAG,IAAMA,EAAE,OAAO,MAAMA,EAAE,OAAO,CAAC,EAAGA,EAAE,UACxSA,EAAE,OAAO,MAAQA,EAAE,QAAU,IAAMF,EAAE,MAAQtgF,EAAEsgF,EAAE,MAAOE,EAAE,YAAaA,EAAE,QAAU,EAAG,CAAC,GAAIA,EAAE,UAAYA,EAAE,OAAO,MAAM,SAAWA,EAAE,QAAU,EAAGA,EAAE,OAAS,GAC/J,MAAOA,EAAE,OAAS,GAClB,GAAIA,EAAE,SAAW,GAAI,GAAIA,EAAE,OAAO,KAAM,CACtC,EAAIA,EAAE,QACN,EAAG,CACD,GAAIA,EAAE,UAAYA,EAAE,mBAAqBA,EAAE,OAAO,MAAQA,EAAE,QAAU,IAAMF,EAAE,MAAQtgF,EAAEsgF,EAAE,MAAOE,EAAE,YAAaA,EAAE,QAAU,EAAG,CAAC,GAAI/C,EAAE6C,CAAC,EAAG,EAAIE,EAAE,QAASA,EAAE,UAAYA,EAAE,kBAAmB,CAC1LC,EAAI,EACJ,KACF,CACAA,EAAID,EAAE,QAAUA,EAAE,OAAO,KAAK,OAAS,IAAMA,EAAE,OAAO,KAAK,WAAWA,EAAE,SAAS,EAAI,EAAGV,GAAEU,EAAGC,CAAC,CAChG,OAASA,IAAM,GACfD,EAAE,OAAO,MAAQA,EAAE,QAAU,IAAMF,EAAE,MAAQtgF,EAAEsgF,EAAE,MAAOE,EAAE,YAAaA,EAAE,QAAU,EAAG,CAAC,GAAIC,IAAM,IAAMD,EAAE,QAAU,EAAGA,EAAE,OAAS,GACnI,MAAOA,EAAE,OAAS,GAClB,GAAIA,EAAE,SAAW,GAAI,GAAIA,EAAE,OAAO,QAAS,CACzC,EAAIA,EAAE,QACN,EAAG,CACD,GAAIA,EAAE,UAAYA,EAAE,mBAAqBA,EAAE,OAAO,MAAQA,EAAE,QAAU,IAAMF,EAAE,MAAQtgF,EAAEsgF,EAAE,MAAOE,EAAE,YAAaA,EAAE,QAAU,EAAG,CAAC,GAAI/C,EAAE6C,CAAC,EAAG,EAAIE,EAAE,QAASA,EAAE,UAAYA,EAAE,kBAAmB,CAC1LC,EAAI,EACJ,KACF,CACAA,EAAID,EAAE,QAAUA,EAAE,OAAO,QAAQ,OAAS,IAAMA,EAAE,OAAO,QAAQ,WAAWA,EAAE,SAAS,EAAI,EAAGV,GAAEU,EAAGC,CAAC,CACtG,OAASA,IAAM,GACfD,EAAE,OAAO,MAAQA,EAAE,QAAU,IAAMF,EAAE,MAAQtgF,EAAEsgF,EAAE,MAAOE,EAAE,YAAaA,EAAE,QAAU,EAAG,CAAC,GAAIC,IAAM,IAAMD,EAAE,OAAS,IACpH,MAAOA,EAAE,OAAS,IAClB,GAAIA,EAAE,SAAW,MAAQA,EAAE,OAAO,MAAQA,EAAE,QAAU,EAAIA,EAAE,kBAAoB/C,EAAE6C,CAAC,EAAGE,EAAE,QAAU,GAAKA,EAAE,mBAAqBV,GAAEU,EAAG,IAAMF,EAAE,KAAK,EAAGR,GAAEU,EAAGF,EAAE,OAAS,EAAI,GAAG,EAAGA,EAAE,MAAQ,EAAGE,EAAE,OAAS1D,IAAM0D,EAAE,OAAS1D,GAAI0D,EAAE,UAAY,GACtO,GAAI/C,EAAE6C,CAAC,EAAGA,EAAE,YAAc,EAAG,OAAOE,EAAE,WAAa,GAAIhnF,UAC9C8mF,EAAE,WAAa,GAAKT,EAAEU,CAAC,GAAKV,EAAEl5E,CAAC,GAAK45E,IAAMjsF,EAAG,OAAO4F,EAAGomF,EAAG,EAAE,EACvE,GAAIE,EAAE,SAAW,KAAOF,EAAE,WAAa,EAAG,OAAOpmF,EAAGomF,EAAG,EAAE,EACzD,GAAIA,EAAE,WAAa,GAAKE,EAAE,YAAc,GAAKD,IAAM,GAAKC,EAAE,SAAW,IAAK,CACxE,IAAIG,EAAIH,EAAE,WAAa,GAAK,SAASI,EAAGC,EAAG,CACzC,QAASC,IAAQ,CACf,GAAIF,EAAE,YAAc,IAAMz1E,GAAGy1E,CAAC,EAAGA,EAAE,YAAc,GAAI,CACnD,GAAIC,IAAM,EAAG,OAAOl8F,EACpB,KACF,CACA,GAAIi8F,EAAE,aAAe,EAAGE,EAAKvqF,EAAE,UAAUqqF,EAAG,EAAGA,EAAE,OAAOA,EAAE,QAAQ,CAAC,EAAGA,EAAE,YAAaA,EAAE,WAAYE,IAAOtD,EAAEoD,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,GAAI,OAAOj8F,CACtJ,CACA,OAAOi8F,EAAE,OAAS,EAAGC,IAAMvsF,GAAKkpF,EAAEoD,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,EAAI1D,EAAIE,GAAKwD,EAAE,WAAapD,EAAEoD,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,GAAKj8F,EAAI,CACrI,GAAG67F,EAAGD,CAAC,EAAIC,EAAE,WAAa,GAAK,SAASI,EAAGC,EAAG,CAC5C,QAASC,EAAIC,EAAGC,EAAI/1E,GAAIrM,GAAKgiF,EAAE,SAAY,CACzC,GAAIA,EAAE,WAAatD,EAAG,CACpB,GAAInyE,GAAGy1E,CAAC,EAAGA,EAAE,WAAatD,GAAKuD,IAAM,EAAG,OAAOl8F,EAC/C,GAAIi8F,EAAE,YAAc,EAAG,KACzB,CACA,GAAIA,EAAE,aAAe,EAAGA,EAAE,WAAavD,GAAK,EAAIuD,EAAE,WAAaG,EAAIniF,GAAGoiF,EAAKJ,EAAE,SAAW,CAAC,KAAOhiF,GAAG,EAAEoiF,CAAE,GAAKD,IAAMniF,GAAG,EAAEoiF,CAAE,GAAKD,IAAMniF,GAAG,EAAEoiF,CAAE,EAAG,CAC5I/1E,GAAK21E,EAAE,SAAWtD,EAClB,EACE,OACKyD,IAAMniF,GAAG,EAAEoiF,CAAE,GAAKD,IAAMniF,GAAG,EAAEoiF,CAAE,GAAKD,IAAMniF,GAAG,EAAEoiF,CAAE,GAAKD,IAAMniF,GAAG,EAAEoiF,CAAE,GAAKD,IAAMniF,GAAG,EAAEoiF,CAAE,GAAKD,IAAMniF,GAAG,EAAEoiF,CAAE,GAAKD,IAAMniF,GAAG,EAAEoiF,CAAE,GAAKD,IAAMniF,GAAG,EAAEoiF,CAAE,GAAKA,EAAK/1E,IAC5J21E,EAAE,aAAetD,GAAKryE,GAAK+1E,GAAKJ,EAAE,aAAeA,EAAE,YAAcA,EAAE,aAAeA,EAAE,UACtF,CACA,GAAIA,EAAE,cAAgBvD,GAAKyD,EAAKvqF,EAAE,UAAUqqF,EAAG,EAAGA,EAAE,aAAevD,CAAC,EAAGuD,EAAE,WAAaA,EAAE,aAAcA,EAAE,UAAYA,EAAE,aAAcA,EAAE,aAAe,IAAME,EAAKvqF,EAAE,UAAUqqF,EAAG,EAAGA,EAAE,OAAOA,EAAE,QAAQ,CAAC,EAAGA,EAAE,YAAaA,EAAE,YAAaE,IAAOtD,EAAEoD,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,GAAI,OAAOj8F,CAC1R,CACA,OAAOi8F,EAAE,OAAS,EAAGC,IAAMvsF,GAAKkpF,EAAEoD,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,EAAI1D,EAAIE,GAAKwD,EAAE,WAAapD,EAAEoD,EAAG,EAAE,EAAGA,EAAE,KAAK,YAAc,GAAKj8F,EAAI,CACrI,GAAG67F,EAAGD,CAAC,EAAI7oF,EAAE8oF,EAAE,KAAK,EAAE,KAAKA,EAAGD,CAAC,EAC/B,GAAII,IAAMzD,GAAKyD,IAAMvD,IAAMoD,EAAE,OAAS,KAAMG,IAAMh8F,GAAKg8F,IAAMzD,EAAG,OAAOoD,EAAE,YAAc,IAAME,EAAE,WAAa,IAAKhnF,EACjH,GAAImnF,IAAM,IAAMJ,IAAM,EAAIhqF,EAAE,UAAUiqF,CAAC,EAAID,IAAM,IAAMhqF,EAAE,iBAAiBiqF,EAAG,EAAG,EAAG,EAAE,EAAGD,IAAM,IAAMhD,GAAEiD,EAAE,IAAI,EAAGA,EAAE,YAAc,IAAMA,EAAE,SAAW,EAAGA,EAAE,YAAc,EAAGA,EAAE,OAAS,KAAM/C,EAAE6C,CAAC,EAAGA,EAAE,YAAc,GAAI,OAAOE,EAAE,WAAa,GAAIhnF,CAC/O,CACA,OAAO+mF,IAAMjsF,EAAIkF,EAAIgnF,EAAE,MAAQ,EAAI,GAAKA,EAAE,OAAS,GAAKV,GAAEU,EAAG,IAAMF,EAAE,KAAK,EAAGR,GAAEU,EAAGF,EAAE,OAAS,EAAI,GAAG,EAAGR,GAAEU,EAAGF,EAAE,OAAS,GAAK,GAAG,EAAGR,GAAEU,EAAGF,EAAE,OAAS,GAAK,GAAG,EAAGR,GAAEU,EAAG,IAAMF,EAAE,QAAQ,EAAGR,GAAEU,EAAGF,EAAE,UAAY,EAAI,GAAG,EAAGR,GAAEU,EAAGF,EAAE,UAAY,GAAK,GAAG,EAAGR,GAAEU,EAAGF,EAAE,UAAY,GAAK,GAAG,IAAMP,GAAGS,EAAGF,EAAE,QAAU,EAAE,EAAGP,GAAGS,EAAG,MAAQF,EAAE,KAAK,GAAI7C,EAAE6C,CAAC,EAAG,EAAIE,EAAE,OAASA,EAAE,KAAO,CAACA,EAAE,MAAOA,EAAE,UAAY,EAAIhnF,EAAI,EACjY,EAAG,EAAE,WAAa,SAAS8mF,EAAG,CAC5B,IAAIC,EACJ,OAAOD,GAAKA,EAAE,OAASC,EAAID,EAAE,MAAM,UAAYzD,GAAK0D,IAAM,IAAMA,IAAM,IAAMA,IAAM,IAAMA,IAAM,KAAOA,IAAMzD,GAAKyD,IAAM,IAAMrmF,EAAGomF,EAAGz4F,CAAC,GAAKy4F,EAAE,MAAQ,KAAMC,IAAMzD,EAAI5iF,EAAGomF,EAAG,EAAE,EAAI9mF,GAAK3R,CACrL,EAAG,EAAE,qBAAuB,SAASy4F,EAAGC,EAAG,CACzC,IAAI55E,EAAG65E,EAAG,EAAGC,EAAGC,GAAGC,EAAGC,EAAGC,EAAGC,EAAKP,EAAE,OACnC,GAAI,CAACD,GAAK,CAACA,EAAE,QAAUG,GAAK95E,EAAI25E,EAAE,OAAO,QAAU,GAAKG,IAAM,GAAK95E,EAAE,SAAWk2E,GAAKl2E,EAAE,UAAW,OAAO9e,EACzG,IAAK44F,IAAM,IAAMH,EAAE,MAAQ,EAAEA,EAAE,MAAOC,EAAGO,EAAI,CAAC,GAAIn6E,EAAE,KAAO,EAAGm6E,GAAMn6E,EAAE,SAAW85E,IAAM,IAAMlD,GAAE52E,EAAE,IAAI,EAAGA,EAAE,SAAW,EAAGA,EAAE,YAAc,EAAGA,EAAE,OAAS,GAAIk6E,EAAI,IAAI9lF,EAAE,KAAK4L,EAAE,MAAM,EAAG5L,EAAE,SAAS8lF,EAAGN,EAAGO,EAAKn6E,EAAE,OAAQA,EAAE,OAAQ,CAAC,EAAG45E,EAAIM,EAAGC,EAAKn6E,EAAE,QAAS+5E,GAAIJ,EAAE,SAAUK,EAAIL,EAAE,QAASM,EAAIN,EAAE,MAAOA,EAAE,SAAWQ,EAAIR,EAAE,QAAU,EAAGA,EAAE,MAAQC,EAAGp1E,GAAGxE,CAAC,EAAGA,EAAE,WAAa02E,GAAK,CAC3W,IAAKmD,EAAI75E,EAAE,SAAU,EAAIA,EAAE,WAAa02E,EAAI,GAAI12E,EAAE,OAASA,EAAE,OAASA,EAAE,WAAaA,EAAE,OAAO65E,EAAInD,EAAI,CAAC,GAAK12E,EAAE,UAAWA,EAAE,KAAK65E,EAAI75E,EAAE,MAAM,EAAIA,EAAE,KAAKA,EAAE,KAAK,EAAGA,EAAE,KAAKA,EAAE,KAAK,EAAI65E,EAAGA,IAAK,EAAE,GAAK,CAClM75E,EAAE,SAAW65E,EAAG75E,EAAE,UAAY02E,EAAI,EAAGlyE,GAAGxE,CAAC,CAC3C,CACA,OAAOA,EAAE,UAAYA,EAAE,UAAWA,EAAE,YAAcA,EAAE,SAAUA,EAAE,OAASA,EAAE,UAAWA,EAAE,UAAY,EAAGA,EAAE,aAAeA,EAAE,YAAc02E,EAAI,EAAG12E,EAAE,gBAAkB,EAAG25E,EAAE,QAAUK,EAAGL,EAAE,MAAQM,EAAGN,EAAE,SAAWI,GAAG/5E,EAAE,KAAO85E,EAAGjnF,CAChO,EAAG,EAAE,YAAc,oCACrB,EAAG,CAAE,kBAAmB,GAAI,YAAa,GAAI,UAAW,GAAI,aAAc,GAAI,UAAW,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACrH,EAAE,QAAU,UAAW,CACrB,KAAK,KAAO,EAAG,KAAK,KAAO,EAAG,KAAK,OAAS,EAAG,KAAK,GAAK,EAAG,KAAK,MAAQ,KAAM,KAAK,UAAY,EAAG,KAAK,KAAO,GAAI,KAAK,QAAU,GAAI,KAAK,KAAO,EAAG,KAAK,KAAO,EACnK,CACF,EAAG,CAAA,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7B,EAAE,QAAU,SAAS9B,EAAGqD,EAAG,CACzB,IAAIxE,EAAG,EAAGyJ,EAAGvJ,EAAG,EAAGnC,EAAGkF,EAAG3R,EAAG2rB,EAAGtzB,EAAG4U,EAAG0D,EAAGhE,EAAGuoF,EAAGvmF,EAAGwmF,EAAGC,EAAGE,EAAGE,EAAGC,EAAGX,EAAGE,EAAGC,EAAGn4F,EAAG,EAC5E4R,EAAImB,EAAE,MAAO,EAAIA,EAAE,QAAS/S,EAAI+S,EAAE,MAAOsI,EAAI,GAAKtI,EAAE,SAAW,GAAIjB,EAAIiB,EAAE,SAAU,EAAIA,EAAE,OAAQ,EAAIjB,GAAKsE,EAAIrD,EAAE,WAAYpD,EAAImC,GAAKiB,EAAE,UAAY,KAAM8B,EAAIjD,EAAE,KAAM1O,EAAI0O,EAAE,MAAOid,EAAIjd,EAAE,MAAOrW,EAAIqW,EAAE,MAAOzB,EAAIyB,EAAE,OAAQiC,EAAIjC,EAAE,KAAM/B,EAAI+B,EAAE,KAAMwmF,EAAIxmF,EAAE,QAASC,EAAID,EAAE,SAAUymF,GAAK,GAAKzmF,EAAE,SAAW,EAAG0mF,GAAK,GAAK1mF,EAAE,UAAY,EACnU,EAAG,EAAG,CACJ/B,EAAI,KAAOgE,GAAK7T,EAAE,GAAG,GAAK6P,EAAGA,GAAK,EAAGgE,GAAK7T,EAAE,GAAG,GAAK6P,EAAGA,GAAK,GAAI2oF,EAAIJ,EAAEvkF,EAAIwkF,CAAC,EAC3E,EAAG,OAAW,CACZ,GAAIxkF,KAAO6kF,EAAIF,IAAM,GAAI3oF,GAAK6oF,GAAIA,EAAIF,IAAM,GAAK,OAAS,EAAG,EAAE1mF,GAAG,EAAI,MAAQ0mF,MACzE,CACH,GAAI,EAAE,GAAKE,GAAI,CACb,IAAK,GAAKA,IAAM,EAAG,CACjBF,EAAIJ,GAAG,MAAQI,IAAM3kF,GAAK,GAAK6kF,GAAK,EAAE,EACtC,SAAS,CACX,CACA,GAAI,GAAKA,EAAG,CACV9mF,EAAE,KAAO,GACT,MAAM,CACR,CACAmB,EAAE,IAAM,8BAA+BnB,EAAE,KAAO,GAChD,MAAM,CACR,CACA+mF,EAAI,MAAQH,GAAIE,GAAK,MAAQ7oF,EAAI6oF,IAAM7kF,GAAK7T,EAAE,GAAG,GAAK6P,EAAGA,GAAK,GAAI8oF,GAAK9kF,GAAK,GAAK6kF,GAAK,EAAG7kF,KAAO6kF,EAAG7oF,GAAK6oF,GAAI7oF,EAAI,KAAOgE,GAAK7T,EAAE,GAAG,GAAK6P,EAAGA,GAAK,EAAGgE,GAAK7T,EAAE,GAAG,GAAK6P,EAAGA,GAAK,GAAI2oF,EAAI3mF,EAAEgC,EAAIykF,CAAC,EACvL,EAAG,OAAW,CACZ,GAAIzkF,KAAO6kF,EAAIF,IAAM,GAAI3oF,GAAK6oF,EAAG,EAAE,IAAMA,EAAIF,IAAM,GAAK,MAAO,CAC7D,IAAK,GAAKE,IAAM,EAAG,CACjBF,EAAI3mF,GAAG,MAAQ2mF,IAAM3kF,GAAK,GAAK6kF,GAAK,EAAE,EACtC,SAAS,CACX,CACA3lF,EAAE,IAAM,wBAAyBnB,EAAE,KAAO,GAC1C,MAAM,CACR,CACA,GAAIomF,EAAI,MAAQQ,EAAG3oF,GAAK6oF,GAAK,MAAQ7kF,GAAK7T,EAAE,GAAG,GAAK6P,GAAIA,GAAK,GAAK6oF,IAAM7kF,GAAK7T,EAAE,GAAG,GAAK6P,EAAGA,GAAK,IAAKgF,GAAKmjF,GAAKnkF,GAAK,GAAK6kF,GAAK,GAAI,CAC/H3lF,EAAE,IAAM,gCAAiCnB,EAAE,KAAO,GAClD,MAAM,CACR,CACA,GAAIiC,KAAO6kF,EAAG7oF,GAAK6oF,GAAIA,EAAI5mF,EAAI,GAAKkmF,EAAG,CACrC,GAAInpE,GAAK6pE,EAAIV,EAAIU,IAAM9mF,EAAE,KAAM,CAC7BmB,EAAE,IAAM,gCAAiCnB,EAAE,KAAO,GAClD,MAAM,CACR,CACA,GAAIumF,EAAIhoF,GAAI+nF,EAAI,KAAO38F,GACrB,GAAI28F,GAAKh1F,EAAIw1F,EAAGA,EAAIC,EAAG,CACrB,IAAKA,GAAKD,EAAG,EAAE5mF,GAAG,EAAI3B,EAAE+nF,GAAG,EAAG,EAAEQ,GAAK,CACrCR,EAAIpmF,EAAIkmF,EAAGG,EAAI,CACjB,UACS58F,EAAIm9F,GACb,GAAIR,GAAKh1F,EAAI3H,EAAIm9F,GAAIA,GAAKn9F,GAAKo9F,EAAG,CAChC,IAAKA,GAAKD,EAAG,EAAE5mF,GAAG,EAAI3B,EAAE+nF,GAAG,EAAG,EAAEQ,GAAK,CACrC,GAAIR,EAAI,EAAG38F,EAAIo9F,EAAG,CAChB,IAAKA,GAAKD,EAAIn9F,EAAG,EAAEuW,GAAG,EAAI3B,EAAE+nF,GAAG,EAAG,EAAEQ,GAAK,CACzCR,EAAIpmF,EAAIkmF,EAAGG,EAAI,CACjB,CACF,UACSD,GAAK38F,EAAIm9F,EAAGA,EAAIC,EAAG,CAC5B,IAAKA,GAAKD,EAAG,EAAE5mF,GAAG,EAAI3B,EAAE+nF,GAAG,EAAG,EAAEQ,GAAK,CACrCR,EAAIpmF,EAAIkmF,EAAGG,EAAI,CACjB,CACA,KAAO,EAAIQ,GAAK,EAAE7mF,GAAG,EAAIqmF,EAAED,GAAG,EAAG,EAAEpmF,GAAG,EAAIqmF,EAAED,GAAG,EAAG,EAAEpmF,GAAG,EAAIqmF,EAAED,GAAG,EAAGS,GAAK,EACxEA,IAAM,EAAE7mF,GAAG,EAAIqmF,EAAED,GAAG,EAAG,EAAIS,IAAM,EAAE7mF,GAAG,EAAIqmF,EAAED,GAAG,GACjD,KAAO,CACL,IAAKA,EAAIpmF,EAAIkmF,EAAG,EAAElmF,GAAG,EAAI,EAAEomF,GAAG,EAAG,EAAEpmF,GAAG,EAAI,EAAEomF,GAAG,EAAG,EAAEpmF,GAAG,EAAI,EAAEomF,GAAG,EAAG,GAAKS,GAAK,IAAM,CACnFA,IAAM,EAAE7mF,GAAG,EAAI,EAAEomF,GAAG,EAAG,EAAIS,IAAM,EAAE7mF,GAAG,EAAI,EAAEomF,GAAG,GACjD,CACA,KACF,CACF,CACA,KACF,CACF,OAAS,EAAI78E,GAAKvJ,EAAInC,GACtB,GAAKgpF,EAAI9oF,GAAK,EAAGgE,IAAM,IAAMhE,GAAK8oF,GAAK,IAAM,EAAG5lF,EAAE,QAAU,EAAGA,EAAE,SAAWjB,EAAGiB,EAAE,SAAW,EAAIsI,EAAIA,EAAI,EAAI,EAAI,GAAK,EAAIA,GAAItI,EAAE,UAAYjB,EAAInC,EAAIA,EAAImC,EAAI,IAAM,KAAOA,EAAInC,GAAIiC,EAAE,KAAOiC,EAAGjC,EAAE,KAAO/B,CACvM,CACF,EAAG,CAAA,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7B,IAAIkD,EAAI,EAAE,iBAAiB,EAAGqD,EAAI,EAAE,WAAW,EAAGxE,EAAI,EAAE,SAAS,EAAG,EAAI,EAAE,WAAW,EAAGyJ,EAAI,EAAE,YAAY,EAAGvJ,EAAI,EAAG,EAAI,EAAGnC,EAAI,EAAGkF,EAAI,GAAI3R,EAAI,EAAG2rB,EAAI,IAAKtzB,EAAI,IAC9J,SAAS4U,EAAE+nF,EAAG,CACZ,OAAQA,IAAM,GAAK,MAAQA,IAAM,EAAI,SAAW,MAAQA,IAAM,KAAO,IAAMA,IAAM,GACnF,CACA,SAASrkF,GAAI,CACX,KAAK,KAAO,EAAG,KAAK,KAAO,GAAI,KAAK,KAAO,EAAG,KAAK,SAAW,GAAI,KAAK,MAAQ,EAAG,KAAK,KAAO,EAAG,KAAK,MAAQ,EAAG,KAAK,MAAQ,EAAG,KAAK,KAAO,KAAM,KAAK,MAAQ,EAAG,KAAK,MAAQ,EAAG,KAAK,MAAQ,EAAG,KAAK,MAAQ,EAAG,KAAK,OAAS,KAAM,KAAK,KAAO,EAAG,KAAK,KAAO,EAAG,KAAK,OAAS,EAAG,KAAK,OAAS,EAAG,KAAK,MAAQ,EAAG,KAAK,QAAU,KAAM,KAAK,SAAW,KAAM,KAAK,QAAU,EAAG,KAAK,SAAW,EAAG,KAAK,MAAQ,EAAG,KAAK,KAAO,EAAG,KAAK,MAAQ,EAAG,KAAK,KAAO,EAAG,KAAK,KAAO,KAAM,KAAK,KAAO,IAAId,EAAE,MAAM,GAAG,EAAG,KAAK,KAAO,IAAIA,EAAE,MAAM,GAAG,EAAG,KAAK,OAAS,KAAM,KAAK,QAAU,KAAM,KAAK,KAAO,EAAG,KAAK,KAAO,EAAG,KAAK,IAAM,CACvmB,CACA,SAASlD,EAAEqoF,EAAG,CACZ,IAAIC,EACJ,OAAOD,GAAKA,EAAE,OAASC,EAAID,EAAE,MAAOA,EAAE,SAAWA,EAAE,UAAYC,EAAE,MAAQ,EAAGD,EAAE,IAAM,GAAIC,EAAE,OAASD,EAAE,MAAQ,EAAIC,EAAE,MAAOA,EAAE,KAAOj1F,EAAGi1F,EAAE,KAAO,EAAGA,EAAE,SAAW,EAAGA,EAAE,KAAO,MAAOA,EAAE,KAAO,KAAMA,EAAE,KAAO,EAAGA,EAAE,KAAO,EAAGA,EAAE,QAAUA,EAAE,OAAS,IAAIplF,EAAE,MAAM8b,CAAC,EAAGspE,EAAE,SAAWA,EAAE,QAAU,IAAIplF,EAAE,MAAMxX,CAAC,EAAG48F,EAAE,KAAO,EAAGA,EAAE,KAAO,GAAIxoF,GAAKkF,CACzU,CACA,SAASujF,EAAEF,EAAG,CACZ,IAAIC,EACJ,OAAOD,GAAKA,EAAE,QAAUC,EAAID,EAAE,OAAO,MAAQ,EAAGC,EAAE,MAAQ,EAAGA,EAAE,MAAQ,EAAGtoF,EAAEqoF,CAAC,GAAKrjF,CACpF,CACA,SAAShD,EAAEqmF,EAAGC,EAAG,CACf,IAAIn4F,EAAG,EACP,OAAOk4F,GAAKA,EAAE,OAAS,EAAIA,EAAE,MAAOC,EAAI,GAAKn4F,EAAI,EAAGm4F,EAAI,CAACA,IAAMn4F,EAAI,GAAKm4F,GAAK,GAAIA,EAAI,KAAOA,GAAK,KAAMA,IAAMA,EAAI,GAAK,GAAKA,GAAKtjF,GAAK,EAAE,SAAW,MAAQ,EAAE,QAAUsjF,IAAM,EAAE,OAAS,MAAO,EAAE,KAAOn4F,EAAG,EAAE,MAAQm4F,EAAGC,EAAEF,CAAC,IAAMrjF,CAClO,CACA,SAASwjF,EAAEH,EAAGC,EAAG,CACf,IAAIn4F,EAAG,EACP,OAAOk4F,GAAK,EAAI,IAAIrkF,GAAMqkF,EAAE,MAAQ,GAAG,OAAS,MAAOl4F,EAAI6R,EAAEqmF,EAAGC,CAAC,KAAOxoF,IAAMuoF,EAAE,MAAQ,MAAOl4F,GAAK6U,CACtG,CACA,IAAIyjF,EAAGE,EAAGE,EAAI,GACd,SAASC,EAAET,EAAG,CACZ,GAAIQ,EAAG,CACL,IAAIP,EACJ,IAAKG,EAAI,IAAIvlF,EAAE,MAAM,GAAG,EAAGylF,EAAI,IAAIzlF,EAAE,MAAM,EAAE,EAAGolF,EAAI,EAAGA,EAAI,KAAOD,EAAE,KAAKC,GAAG,EAAI,EAChF,KAAOA,EAAI,KAAOD,EAAE,KAAKC,GAAG,EAAI,EAChC,KAAOA,EAAI,KAAOD,EAAE,KAAKC,GAAG,EAAI,EAChC,KAAOA,EAAI,KAAOD,EAAE,KAAKC,GAAG,EAAI,EAChC,IAAK98E,EAAEvJ,EAAGomF,EAAE,KAAM,EAAG,IAAKI,EAAG,EAAGJ,EAAE,KAAM,CAAE,KAAM,EAAG,EAAGC,EAAI,EAAGA,EAAI,IAAMD,EAAE,KAAKC,GAAG,EAAI,EACrF98E,EAAE,EAAG68E,EAAE,KAAM,EAAG,GAAIM,EAAG,EAAGN,EAAE,KAAM,CAAE,KAAM,CAAC,CAAE,EAAGQ,EAAI,EACtD,CACAR,EAAE,QAAUI,EAAGJ,EAAE,QAAU,EAAGA,EAAE,SAAWM,EAAGN,EAAE,SAAW,CAC7D,CACA,SAASF,EAAEE,EAAGC,EAAGn4F,EAAG,EAAG,CACrB,IAAIu4F,EAAGE,EAAIP,EAAE,MACb,OAAOO,EAAE,SAAW,OAASA,EAAE,MAAQ,GAAKA,EAAE,MAAOA,EAAE,MAAQ,EAAGA,EAAE,MAAQ,EAAGA,EAAE,OAAS,IAAI1lF,EAAE,KAAK0lF,EAAE,KAAK,GAAI,GAAKA,EAAE,OAAS1lF,EAAE,SAAS0lF,EAAE,OAAQN,EAAGn4F,EAAIy4F,EAAE,MAAOA,EAAE,MAAO,CAAC,EAAGA,EAAE,MAAQ,EAAGA,EAAE,MAAQA,EAAE,QAAU,GAAKF,EAAIE,EAAE,MAAQA,EAAE,SAAWF,EAAI,GAAIxlF,EAAE,SAAS0lF,EAAE,OAAQN,EAAGn4F,EAAI,EAAGu4F,EAAGE,EAAE,KAAK,GAAI,GAAKF,IAAMxlF,EAAE,SAAS0lF,EAAE,OAAQN,EAAGn4F,EAAI,EAAG,EAAG,CAAC,EAAGy4F,EAAE,MAAQ,EAAGA,EAAE,MAAQA,EAAE,QAAUA,EAAE,OAASF,EAAGE,EAAE,QAAUA,EAAE,QAAUA,EAAE,MAAQ,GAAIA,EAAE,MAAQA,EAAE,QAAUA,EAAE,OAASF,KAAM,CAC3d,CACA,EAAE,aAAeH,EAAG,EAAE,cAAgBvmF,EAAG,EAAE,iBAAmBhC,EAAG,EAAE,YAAc,SAASqoF,EAAG,CAC3F,OAAOG,EAAEH,EAAG,EAAE,CAChB,EAAG,EAAE,aAAeG,EAAG,EAAE,QAAU,SAASH,EAAGC,EAAG,CAChD,IAAIn4F,EAAG,EAAGu4F,EAAGE,EAAGljF,EAAI2lF,EAAGtC,GAAGE,EAAGD,EAAGsC,GAAGC,GAAIzpF,GAAG6U,GAAI60E,GAAIC,GAAIC,GAAIC,GAAI3hF,GAAI4hF,GAAIC,GAAIC,EAAGC,EAAG55E,EAAG65E,EAAG,EAAI,EAAGC,EAAI,IAAI/oF,EAAE,KAAK,CAAC,EAAGgpF,GAAI,CAAC,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAE,EACrL,GAAI,CAAC7D,GAAK,CAACA,EAAE,OAAS,CAACA,EAAE,QAAU,CAACA,EAAE,OAASA,EAAE,WAAa,EAAG,OAAOrjF,GACvE7U,EAAIk4F,EAAE,OAAO,OAAS,KAAOl4F,EAAE,KAAO,IAAKuV,EAAK2iF,EAAE,SAAUK,EAAIL,EAAE,OAAQU,GAAIV,EAAE,UAAWO,EAAIP,EAAE,QAAS,EAAIA,EAAE,MAAOgD,EAAIhD,EAAE,SAAUY,EAAI94F,EAAE,KAAM64F,EAAI74F,EAAE,KAAMm7F,GAAID,EAAGE,GAAKxC,GAAGgD,EAAIjsF,EACnL,EAAG,OAAW,OAAQ3P,EAAE,KAAI,CAC1B,KAAKkD,EACH,GAAIlD,EAAE,OAAS,EAAG,CAChBA,EAAE,KAAO,GACT,KACF,CACA,KAAO64F,EAAI,IAAM,CACf,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA,GAAI,EAAI74F,EAAE,MAAQ84F,IAAM,MAAO,CAC7BgD,EAAE97F,EAAE,MAAQ,CAAC,EAAI,IAAM84F,EAAGgD,EAAE,CAAC,EAAIhD,IAAM,EAAI,IAAK94F,EAAE,MAAQ4R,EAAE5R,EAAE,MAAO87F,EAAG,EAAG,CAAC,EAAGjD,EAAIC,EAAI,EAAG94F,EAAE,KAAO,EACnG,KACF,CACA,GAAIA,EAAE,MAAQ,EAAGA,EAAE,OAASA,EAAE,KAAK,KAAO,IAAK,EAAE,EAAIA,EAAE,UAAY,IAAM84F,IAAM,IAAMA,GAAK,IAAM,GAAI,CAClGZ,EAAE,IAAM,yBAA0Bl4F,EAAE,KAAO,GAC3C,KACF,CACA,IAAK,GAAK84F,IAAM,EAAG,CACjBZ,EAAE,IAAM,6BAA8Bl4F,EAAE,KAAO,GAC/C,KACF,CACA,GAAI64F,GAAK,EAAG8C,EAAI,GAAK,IAAM7C,KAAO,IAAK94F,EAAE,QAAU,EAAGA,EAAE,MAAQ27F,UACvDA,EAAI37F,EAAE,MAAO,CACpBk4F,EAAE,IAAM,sBAAuBl4F,EAAE,KAAO,GACxC,KACF,CACAA,EAAE,KAAO,GAAK27F,EAAGzD,EAAE,MAAQl4F,EAAE,MAAQ,EAAGA,EAAE,KAAO,IAAM84F,EAAI,GAAK,GAAID,EAAIC,EAAI,EAC5E,MACF,IAAK,GACH,KAAOD,EAAI,IAAM,CACf,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA,GAAI74F,EAAE,MAAQ84F,GAAI,IAAM94F,EAAE,QAAU,EAAG,CACrCk4F,EAAE,IAAM,6BAA8Bl4F,EAAE,KAAO,GAC/C,KACF,CACA,GAAI,MAAQA,EAAE,MAAO,CACnBk4F,EAAE,IAAM,2BAA4Bl4F,EAAE,KAAO,GAC7C,KACF,CACAA,EAAE,OAASA,EAAE,KAAK,KAAO84F,GAAK,EAAI,GAAI,IAAM94F,EAAE,QAAU87F,EAAE,CAAC,EAAI,IAAMhD,EAAGgD,EAAE,CAAC,EAAIhD,IAAM,EAAI,IAAK94F,EAAE,MAAQ4R,EAAE5R,EAAE,MAAO87F,EAAG,EAAG,CAAC,GAAIjD,EAAIC,EAAI,EAAG94F,EAAE,KAAO,EACpJ,IAAK,GACH,KAAO64F,EAAI,IAAM,CACf,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA74F,EAAE,OAASA,EAAE,KAAK,KAAO84F,GAAI,IAAM94F,EAAE,QAAU87F,EAAE,CAAC,EAAI,IAAMhD,EAAGgD,EAAE,CAAC,EAAIhD,IAAM,EAAI,IAAKgD,EAAE,CAAC,EAAIhD,IAAM,GAAK,IAAKgD,EAAE,CAAC,EAAIhD,IAAM,GAAK,IAAK94F,EAAE,MAAQ4R,EAAE5R,EAAE,MAAO87F,EAAG,EAAG,CAAC,GAAIjD,EAAIC,EAAI,EAAG94F,EAAE,KAAO,EACzL,IAAK,GACH,KAAO64F,EAAI,IAAM,CACf,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA74F,EAAE,OAASA,EAAE,KAAK,OAAS,IAAM84F,EAAG94F,EAAE,KAAK,GAAK84F,GAAK,GAAI,IAAM94F,EAAE,QAAU87F,EAAE,CAAC,EAAI,IAAMhD,EAAGgD,EAAE,CAAC,EAAIhD,IAAM,EAAI,IAAK94F,EAAE,MAAQ4R,EAAE5R,EAAE,MAAO87F,EAAG,EAAG,CAAC,GAAIjD,EAAIC,EAAI,EAAG94F,EAAE,KAAO,EACvK,IAAK,GACH,GAAI,KAAOA,EAAE,MAAO,CAClB,KAAO64F,EAAI,IAAM,CACf,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA74F,EAAE,OAAS84F,EAAG94F,EAAE,OAASA,EAAE,KAAK,UAAY84F,GAAI,IAAM94F,EAAE,QAAU87F,EAAE,CAAC,EAAI,IAAMhD,EAAGgD,EAAE,CAAC,EAAIhD,IAAM,EAAI,IAAK94F,EAAE,MAAQ4R,EAAE5R,EAAE,MAAO87F,EAAG,EAAG,CAAC,GAAIjD,EAAIC,EAAI,CAClJ,MAAO94F,EAAE,OAASA,EAAE,KAAK,MAAQ,MACjCA,EAAE,KAAO,EACX,IAAK,GACH,GAAI,KAAOA,EAAE,QAAUk7F,GAAKvpF,GAAI3R,EAAE,UAAY2R,GAAIupF,GAAIvpF,KAAM3R,EAAE,OAAS27F,EAAI37F,EAAE,KAAK,UAAYA,EAAE,OAAQA,EAAE,KAAK,QAAUA,EAAE,KAAK,MAAQ,IAAI,MAAMA,EAAE,KAAK,SAAS,GAAI+S,EAAE,SAAS/S,EAAE,KAAK,MAAO,EAAGy4F,EAAG9mF,GAAGgqF,CAAC,GAAI,IAAM37F,EAAE,QAAUA,EAAE,MAAQ4R,EAAE5R,EAAE,MAAO,EAAG2R,GAAG8mF,CAAC,GAAIyC,GAAKvpF,GAAG8mF,GAAK9mF,GAAG3R,EAAE,QAAU2R,IAAI3R,EAAE,QAAS,MAAM,EAChTA,EAAE,OAAS,EAAGA,EAAE,KAAO,EACzB,IAAK,GACH,GAAI,KAAOA,EAAE,MAAO,CAClB,GAAIk7F,IAAM,EAAG,MAAM,EACnB,IAAKvpF,GAAI,EAAGgqF,EAAI,EAAElD,EAAI9mF,IAAG,EAAG3R,EAAE,MAAQ27F,GAAK37F,EAAE,OAAS,QAAUA,EAAE,KAAK,MAAQ,OAAO,aAAa27F,CAAC,GAAIA,GAAKhqF,GAAIupF,GAAK,CACtH,GAAI,IAAMl7F,EAAE,QAAUA,EAAE,MAAQ4R,EAAE5R,EAAE,MAAO,EAAG2R,GAAG8mF,CAAC,GAAIyC,GAAKvpF,GAAG8mF,GAAK9mF,GAAGgqF,EAAG,MAAM,CACjF,MAAO37F,EAAE,OAASA,EAAE,KAAK,KAAO,MAChCA,EAAE,OAAS,EAAGA,EAAE,KAAO,EACzB,IAAK,GACH,GAAI,KAAOA,EAAE,MAAO,CAClB,GAAIk7F,IAAM,EAAG,MAAM,EACnB,IAAKvpF,GAAI,EAAGgqF,EAAI,EAAElD,EAAI9mF,IAAG,EAAG3R,EAAE,MAAQ27F,GAAK37F,EAAE,OAAS,QAAUA,EAAE,KAAK,SAAW,OAAO,aAAa27F,CAAC,GAAIA,GAAKhqF,GAAIupF,GAAK,CACzH,GAAI,IAAMl7F,EAAE,QAAUA,EAAE,MAAQ4R,EAAE5R,EAAE,MAAO,EAAG2R,GAAG8mF,CAAC,GAAIyC,GAAKvpF,GAAG8mF,GAAK9mF,GAAGgqF,EAAG,MAAM,CACjF,MAAO37F,EAAE,OAASA,EAAE,KAAK,QAAU,MACnCA,EAAE,KAAO,EACX,IAAK,GACH,GAAI,IAAMA,EAAE,MAAO,CACjB,KAAO64F,EAAI,IAAM,CACf,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA,GAAIC,KAAO,MAAQ94F,EAAE,OAAQ,CAC3Bk4F,EAAE,IAAM,sBAAuBl4F,EAAE,KAAO,GACxC,KACF,CACA64F,EAAIC,EAAI,CACV,CACA94F,EAAE,OAASA,EAAE,KAAK,KAAOA,EAAE,OAAS,EAAI,EAAGA,EAAE,KAAK,KAAO,IAAKk4F,EAAE,MAAQl4F,EAAE,MAAQ,EAAGA,EAAE,KAAO,GAC9F,MACF,IAAK,IACH,KAAO64F,EAAI,IAAM,CACf,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACAX,EAAE,MAAQl4F,EAAE,MAAQmQ,EAAE2oF,CAAC,EAAGD,EAAIC,EAAI,EAAG94F,EAAE,KAAO,GAChD,IAAK,IACH,GAAIA,EAAE,WAAa,EAAG,OAAOk4F,EAAE,SAAW3iF,EAAI2iF,EAAE,UAAYU,GAAGV,EAAE,QAAUO,EAAGP,EAAE,SAAWgD,EAAGl7F,EAAE,KAAO84F,EAAG94F,EAAE,KAAO64F,EAAG,EACtHX,EAAE,MAAQl4F,EAAE,MAAQ,EAAGA,EAAE,KAAO,GAClC,IAAK,IACH,GAAIm4F,IAAM,GAAKA,IAAM,EAAG,MAAM,EAChC,IAAK,IACH,GAAIn4F,EAAE,KAAM,CACV84F,KAAO,EAAID,EAAGA,GAAK,EAAIA,EAAG74F,EAAE,KAAO,GACnC,KACF,CACA,KAAO64F,EAAI,GAAK,CACd,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA,OAAQ74F,EAAE,KAAO,EAAI84F,EAAGD,GAAK,EAAG,GAAKC,KAAO,GAAE,CAC5C,IAAK,GACH94F,EAAE,KAAO,GACT,MACF,IAAK,GACH,GAAI24F,EAAE34F,CAAC,EAAGA,EAAE,KAAO,GAAIm4F,IAAM,EAAG,MAChCW,KAAO,EAAGD,GAAK,EACf,MAAM,EACR,IAAK,GACH74F,EAAE,KAAO,GACT,MACF,IAAK,GACHk4F,EAAE,IAAM,qBAAsBl4F,EAAE,KAAO,EACzD,CACc84F,KAAO,EAAGD,GAAK,EACf,MACF,IAAK,IACH,IAAKC,KAAO,EAAID,EAAGA,GAAK,EAAIA,EAAGA,EAAI,IAAM,CACvC,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA,IAAK,MAAQC,KAAOA,IAAM,GAAK,OAAQ,CACrCZ,EAAE,IAAM,+BAAgCl4F,EAAE,KAAO,GACjD,KACF,CACA,GAAIA,EAAE,OAAS,MAAQ84F,EAAGD,EAAIC,EAAI,EAAG94F,EAAE,KAAO,GAAIm4F,IAAM,EAAG,MAAM,EACnE,IAAK,IACHn4F,EAAE,KAAO,GACX,IAAK,IACH,GAAI2R,GAAI3R,EAAE,OAAQ,CAChB,GAAIk7F,EAAIvpF,KAAMA,GAAIupF,GAAItC,GAAIjnF,KAAMA,GAAIinF,IAAIjnF,KAAM,EAAG,MAAM,EACvDoB,EAAE,SAASwlF,EAAG,EAAGE,EAAG9mF,GAAG4D,CAAE,EAAG2lF,GAAKvpF,GAAG8mF,GAAK9mF,GAAGinF,IAAKjnF,GAAG4D,GAAM5D,GAAG3R,EAAE,QAAU2R,GACzE,KACF,CACA3R,EAAE,KAAO,GACT,MACF,IAAK,IACH,KAAO64F,EAAI,IAAM,CACf,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA,GAAI74F,EAAE,KAAO,KAAO,GAAK84F,GAAIA,KAAO,EAAGD,GAAK,EAAG74F,EAAE,MAAQ,GAAK,GAAK84F,GAAIA,KAAO,EAAGD,GAAK,EAAG74F,EAAE,MAAQ,GAAK,GAAK84F,GAAIA,KAAO,EAAGD,GAAK,EAAG,IAAM74F,EAAE,MAAQ,GAAKA,EAAE,MAAO,CAC/Jk4F,EAAE,IAAM,sCAAuCl4F,EAAE,KAAO,GACxD,KACF,CACAA,EAAE,KAAO,EAAGA,EAAE,KAAO,GACvB,IAAK,IACH,KAAOA,EAAE,KAAOA,EAAE,OAAS,CACzB,KAAO64F,EAAI,GAAK,CACd,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA74F,EAAE,KAAK+7F,GAAE/7F,EAAE,MAAM,CAAC,EAAI,EAAI84F,EAAGA,KAAO,EAAGD,GAAK,CAC9C,CACA,KAAO74F,EAAE,KAAO,IAAMA,EAAE,KAAK+7F,GAAE/7F,EAAE,MAAM,CAAC,EAAI,EAC5C,GAAIA,EAAE,QAAUA,EAAE,OAAQA,EAAE,QAAU,EAAGgiB,EAAI,CAAE,KAAMhiB,EAAE,OAAO,EAAI47F,EAAIvgF,EAAE,EAAGrb,EAAE,KAAM,EAAG,GAAIA,EAAE,QAAS,EAAGA,EAAE,KAAMgiB,CAAC,EAAGhiB,EAAE,QAAUgiB,EAAE,KAAM45E,EAAG,CACzI1D,EAAE,IAAM,2BAA4Bl4F,EAAE,KAAO,GAC7C,KACF,CACAA,EAAE,KAAO,EAAGA,EAAE,KAAO,GACvB,IAAK,IACH,KAAOA,EAAE,KAAOA,EAAE,KAAOA,EAAE,OAAS,CAClC,KAAOu7F,IAAM,EAAIv7F,EAAE,QAAQ84F,GAAK,GAAK94F,EAAE,SAAW,CAAC,KAAO,GAAK,IAAKw7F,GAAK,MAAQ,EAAG,GAAGF,GAAK,IAAM,KAAOzC,IAAM,CAC7G,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA,GAAI2C,GAAK,GAAI1C,KAAOwC,GAAIzC,GAAKyC,GAAIt7F,EAAE,KAAKA,EAAE,MAAM,EAAIw7F,OAC/C,CACH,GAAIA,KAAO,GAAI,CACb,IAAKK,EAAIP,GAAK,EAAGzC,EAAIgD,GAAK,CACxB,GAAIX,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA,GAAIC,KAAOwC,GAAIzC,GAAKyC,GAAIt7F,EAAE,OAAS,EAAG,CACpCk4F,EAAE,IAAM,4BAA6Bl4F,EAAE,KAAO,GAC9C,KACF,CACA27F,EAAI37F,EAAE,KAAKA,EAAE,KAAO,CAAC,EAAG2R,GAAI,GAAK,EAAImnF,GAAIA,KAAO,EAAGD,GAAK,CAC1D,SAAW2C,KAAO,GAAI,CACpB,IAAKK,EAAIP,GAAK,EAAGzC,EAAIgD,GAAK,CACxB,GAAIX,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACAA,GAAKyC,GAAIK,EAAI,EAAGhqF,GAAI,GAAK,GAAKmnF,KAAOwC,KAAMxC,KAAO,EAAGD,GAAK,CAC5D,KAAO,CACL,IAAKgD,EAAIP,GAAK,EAAGzC,EAAIgD,GAAK,CACxB,GAAIX,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACAA,GAAKyC,GAAIK,EAAI,EAAGhqF,GAAI,IAAM,KAAOmnF,KAAOwC,KAAMxC,KAAO,EAAGD,GAAK,CAC/D,CACA,GAAI74F,EAAE,KAAO2R,GAAI3R,EAAE,KAAOA,EAAE,MAAO,CACjCk4F,EAAE,IAAM,4BAA6Bl4F,EAAE,KAAO,GAC9C,KACF,CACA,KAAO2R,MAAO3R,EAAE,KAAKA,EAAE,MAAM,EAAI27F,CACnC,CACF,CACA,GAAI37F,EAAE,OAAS,GAAI,MACnB,GAAIA,EAAE,KAAK,GAAG,IAAM,EAAG,CACrBk4F,EAAE,IAAM,uCAAwCl4F,EAAE,KAAO,GACzD,KACF,CACA,GAAIA,EAAE,QAAU,EAAGgiB,EAAI,CAAE,KAAMhiB,EAAE,OAAO,EAAI47F,EAAIvgF,EAAEvJ,EAAG9R,EAAE,KAAM,EAAGA,EAAE,KAAMA,EAAE,QAAS,EAAGA,EAAE,KAAMgiB,CAAC,EAAGhiB,EAAE,QAAUgiB,EAAE,KAAM45E,EAAG,CACvH1D,EAAE,IAAM,8BAA+Bl4F,EAAE,KAAO,GAChD,KACF,CACA,GAAIA,EAAE,SAAW,EAAGA,EAAE,SAAWA,EAAE,QAASgiB,EAAI,CAAE,KAAMhiB,EAAE,QAAQ,EAAI47F,EAAIvgF,EAAE,EAAGrb,EAAE,KAAMA,EAAE,KAAMA,EAAE,MAAOA,EAAE,SAAU,EAAGA,EAAE,KAAMgiB,CAAC,EAAGhiB,EAAE,SAAWgiB,EAAE,KAAM45E,EAAG,CACzJ1D,EAAE,IAAM,wBAAyBl4F,EAAE,KAAO,GAC1C,KACF,CACA,GAAIA,EAAE,KAAO,GAAIm4F,IAAM,EAAG,MAAM,EAClC,IAAK,IACHn4F,EAAE,KAAO,GACX,IAAK,IACH,GAAI,GAAKk7F,GAAK,KAAOtC,GAAG,CACtBV,EAAE,SAAW3iF,EAAI2iF,EAAE,UAAYU,GAAGV,EAAE,QAAUO,EAAGP,EAAE,SAAWgD,EAAGl7F,EAAE,KAAO84F,EAAG94F,EAAE,KAAO64F,EAAG,EAAEX,EAAGkD,EAAE,EAAG7lF,EAAK2iF,EAAE,SAAUK,EAAIL,EAAE,OAAQU,GAAIV,EAAE,UAAWO,EAAIP,EAAE,QAAS,EAAIA,EAAE,MAAOgD,EAAIhD,EAAE,SAAUY,EAAI94F,EAAE,KAAM64F,EAAI74F,EAAE,KAAMA,EAAE,OAAS,KAAOA,EAAE,KAAO,IAClP,KACF,CACA,IAAKA,EAAE,KAAO,EAAGu7F,IAAM,EAAIv7F,EAAE,QAAQ84F,GAAK,GAAK94F,EAAE,SAAW,CAAC,KAAO,GAAK,IAAKw7F,GAAK,MAAQ,EAAG,GAAGF,GAAK,IAAM,KAAOzC,IAAM,CACvH,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA,GAAI0C,KAAO,IAAMA,KAAO,EAAG,CACzB,IAAK1hF,GAAKyhF,GAAIG,GAAKF,GAAIG,GAAKF,GAAID,IAAM,EAAIv7F,EAAE,QAAQ07F,KAAO5C,GAAK,GAAKj/E,GAAK4hF,IAAM,IAAM5hF,GAAG,KAAO,GAAK,IAAK2hF,GAAK,MAAQ,EAAG,EAAE3hF,IAAMyhF,GAAK,IAAM,KAAOzC,IAAM,CACxJ,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACAC,KAAOj/E,GAAIg/E,GAAKh/E,GAAI7Z,EAAE,MAAQ6Z,EAChC,CACA,GAAIi/E,KAAOwC,GAAIzC,GAAKyC,GAAIt7F,EAAE,MAAQs7F,GAAIt7F,EAAE,OAASw7F,GAAID,KAAO,EAAG,CAC7Dv7F,EAAE,KAAO,GACT,KACF,CACA,GAAI,GAAKu7F,GAAI,CACXv7F,EAAE,KAAO,GAAIA,EAAE,KAAO,GACtB,KACF,CACA,GAAI,GAAKu7F,GAAI,CACXrD,EAAE,IAAM,8BAA+Bl4F,EAAE,KAAO,GAChD,KACF,CACAA,EAAE,MAAQ,GAAKu7F,GAAIv7F,EAAE,KAAO,GAC9B,IAAK,IACH,GAAIA,EAAE,MAAO,CACX,IAAK67F,EAAI77F,EAAE,MAAO64F,EAAIgD,GAAK,CACzB,GAAIX,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA74F,EAAE,QAAU84F,GAAK,GAAK94F,EAAE,OAAS,EAAG84F,KAAO94F,EAAE,MAAO64F,GAAK74F,EAAE,MAAOA,EAAE,MAAQA,EAAE,KAChF,CACAA,EAAE,IAAMA,EAAE,OAAQA,EAAE,KAAO,GAC7B,IAAK,IACH,KAAOu7F,IAAM,EAAIv7F,EAAE,SAAS84F,GAAK,GAAK94F,EAAE,UAAY,CAAC,KAAO,GAAK,IAAKw7F,GAAK,MAAQ,EAAG,GAAGF,GAAK,IAAM,KAAOzC,IAAM,CAC/G,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA,IAAK,IAAM0C,KAAO,EAAG,CACnB,IAAK1hF,GAAKyhF,GAAIG,GAAKF,GAAIG,GAAKF,GAAID,IAAM,EAAIv7F,EAAE,SAAS07F,KAAO5C,GAAK,GAAKj/E,GAAK4hF,IAAM,IAAM5hF,GAAG,KAAO,GAAK,IAAK2hF,GAAK,MAAQ,EAAG,EAAE3hF,IAAMyhF,GAAK,IAAM,KAAOzC,IAAM,CACzJ,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACAC,KAAOj/E,GAAIg/E,GAAKh/E,GAAI7Z,EAAE,MAAQ6Z,EAChC,CACA,GAAIi/E,KAAOwC,GAAIzC,GAAKyC,GAAIt7F,EAAE,MAAQs7F,GAAI,GAAKC,GAAI,CAC7CrD,EAAE,IAAM,wBAAyBl4F,EAAE,KAAO,GAC1C,KACF,CACAA,EAAE,OAASw7F,GAAIx7F,EAAE,MAAQ,GAAKu7F,GAAIv7F,EAAE,KAAO,GAC7C,IAAK,IACH,GAAIA,EAAE,MAAO,CACX,IAAK67F,EAAI77F,EAAE,MAAO64F,EAAIgD,GAAK,CACzB,GAAIX,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA74F,EAAE,QAAU84F,GAAK,GAAK94F,EAAE,OAAS,EAAG84F,KAAO94F,EAAE,MAAO64F,GAAK74F,EAAE,MAAOA,EAAE,MAAQA,EAAE,KAChF,CACA,GAAIA,EAAE,OAASA,EAAE,KAAM,CACrBk4F,EAAE,IAAM,gCAAiCl4F,EAAE,KAAO,GAClD,KACF,CACAA,EAAE,KAAO,GACX,IAAK,IACH,GAAI44F,KAAM,EAAG,MAAM,EACnB,GAAIjnF,GAAIypF,GAAKxC,GAAG54F,EAAE,OAAS2R,GAAG,CAC5B,IAAKA,GAAI3R,EAAE,OAAS2R,IAAK3R,EAAE,OAASA,EAAE,KAAM,CAC1Ck4F,EAAE,IAAM,gCAAiCl4F,EAAE,KAAO,GAClD,KACF,CACAwmB,GAAK7U,GAAI3R,EAAE,OAAS2R,IAAK3R,EAAE,MAAOA,EAAE,MAAQ2R,IAAK3R,EAAE,MAAQ2R,GAAGA,GAAI3R,EAAE,SAAW2R,GAAI3R,EAAE,QAASq7F,GAAKr7F,EAAE,MACvG,MAAOq7F,GAAK9C,EAAG/xE,GAAKjR,EAAKvV,EAAE,OAAQ2R,GAAI3R,EAAE,OACzC,IAAK44F,GAAIjnF,KAAMA,GAAIinF,IAAIA,IAAKjnF,GAAG3R,EAAE,QAAU2R,GAAG4mF,EAAEhjF,GAAI,EAAI8lF,GAAG70E,IAAI,EAAG,EAAE7U,IAAK,CACzE3R,EAAE,SAAW,IAAMA,EAAE,KAAO,IAC5B,MACF,IAAK,IACH,GAAI44F,KAAM,EAAG,MAAM,EACnBL,EAAEhjF,GAAI,EAAIvV,EAAE,OAAQ44F,KAAK54F,EAAE,KAAO,GAClC,MACF,IAAK,IACH,GAAIA,EAAE,KAAM,CACV,KAAO64F,EAAI,IAAM,CACf,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA,GAAIuC,IAAMxC,GAAGV,EAAE,WAAakD,GAAIp7F,EAAE,OAASo7F,GAAIA,KAAOlD,EAAE,MAAQl4F,EAAE,MAAQA,EAAE,MAAQ4R,EAAE5R,EAAE,MAAOu4F,EAAG6C,GAAI7lF,EAAK6lF,EAAE,EAAIhlF,EAAEpW,EAAE,MAAOu4F,EAAG6C,GAAI7lF,EAAK6lF,EAAE,GAAIA,GAAKxC,IAAI54F,EAAE,MAAQ84F,EAAI3oF,EAAE2oF,CAAC,KAAO94F,EAAE,MAAO,CACtLk4F,EAAE,IAAM,uBAAwBl4F,EAAE,KAAO,GACzC,KACF,CACA64F,EAAIC,EAAI,CACV,CACA94F,EAAE,KAAO,GACX,IAAK,IACH,GAAIA,EAAE,MAAQA,EAAE,MAAO,CACrB,KAAO64F,EAAI,IAAM,CACf,GAAIqC,IAAM,EAAG,MAAM,EACnBA,IAAKpC,GAAK,EAAEL,GAAG,GAAKI,EAAGA,GAAK,CAC9B,CACA,GAAIC,KAAO,WAAa94F,EAAE,OAAQ,CAChCk4F,EAAE,IAAM,yBAA0Bl4F,EAAE,KAAO,GAC3C,KACF,CACA64F,EAAIC,EAAI,CACV,CACA94F,EAAE,KAAO,GACX,IAAK,IACH47F,EAAI,EACJ,MAAM,EACR,IAAK,IACHA,EAAI,GACJ,MAAM,EACR,IAAK,IACH,MAAO,GACT,IAAK,IACL,QACE,OAAO/mF,CACrB,CACU,OAAOqjF,EAAE,SAAW3iF,EAAI2iF,EAAE,UAAYU,GAAGV,EAAE,QAAUO,EAAGP,EAAE,SAAWgD,EAAGl7F,EAAE,KAAO84F,EAAG94F,EAAE,KAAO64F,GAAI74F,EAAE,OAASo7F,KAAOlD,EAAE,WAAal4F,EAAE,KAAO,KAAOA,EAAE,KAAO,IAAMm4F,IAAM,KAAOH,EAAEE,EAAGA,EAAE,OAAQA,EAAE,SAAUkD,GAAKlD,EAAE,SAAS,GAAKl4F,EAAE,KAAO,GAAI,KAAOm7F,IAAKjD,EAAE,SAAUkD,IAAMlD,EAAE,UAAWA,EAAE,UAAYiD,GAAGjD,EAAE,WAAakD,GAAIp7F,EAAE,OAASo7F,GAAIp7F,EAAE,MAAQo7F,KAAOlD,EAAE,MAAQl4F,EAAE,MAAQA,EAAE,MAAQ4R,EAAE5R,EAAE,MAAOu4F,EAAG6C,GAAIlD,EAAE,SAAWkD,EAAE,EAAIhlF,EAAEpW,EAAE,MAAOu4F,EAAG6C,GAAIlD,EAAE,SAAWkD,EAAE,GAAIlD,EAAE,UAAYl4F,EAAE,MAAQA,EAAE,KAAO,GAAK,IAAMA,EAAE,OAAS,GAAK,IAAM,IAAMA,EAAE,OAAS,IAAMA,EAAE,OAAS,GAAK,IAAM,IAAKm7F,IAAK,GAAKC,KAAO,GAAKjD,IAAM,IAAMyD,IAAMjsF,IAAMisF,EAAI,IAAKA,EAC/mB,EAAG,EAAE,WAAa,SAAS1D,EAAG,CAC5B,GAAI,CAACA,GAAK,CAACA,EAAE,MAAO,OAAOrjF,EAC3B,IAAIsjF,EAAID,EAAE,MACV,OAAOC,EAAE,SAAWA,EAAE,OAAS,MAAOD,EAAE,MAAQ,KAAMvoF,CACxD,EAAG,EAAE,iBAAmB,SAASuoF,EAAGC,EAAG,CACrC,IAAIn4F,EACJ,OAAOk4F,GAAKA,EAAE,OAAS,GAAKl4F,EAAIk4F,EAAE,OAAO,OAAS,EAAIrjF,IAAM7U,EAAE,KAAOm4F,GAAG,KAAO,GAAIxoF,GAAKkF,CAC1F,EAAG,EAAE,qBAAuB,SAASqjF,EAAGC,EAAG,CACzC,IAAIn4F,EAAG,EAAIm4F,EAAE,OACb,OAAOD,GAAKA,EAAE,OAASl4F,EAAIk4F,EAAE,OAAO,OAAS,GAAKl4F,EAAE,OAAS,GAAK6U,EAAI7U,EAAE,OAAS,IAAMoW,EAAE,EAAG+hF,EAAG,EAAG,CAAC,IAAMn4F,EAAE,MAAQ,GAAKg4F,EAAEE,EAAGC,EAAG,EAAG,CAAC,GAAKn4F,EAAE,KAAO,GAAI,KAAOA,EAAE,SAAW,EAAG2P,GAAKkF,CACpL,EAAG,EAAE,YAAc,oCACrB,EAAG,CAAE,kBAAmB,GAAI,YAAa,GAAI,UAAW,GAAI,YAAa,GAAI,aAAc,EAAE,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACvH,IAAI9B,EAAI,EAAE,iBAAiB,EAAGqD,EAAI,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,CAAC,EAAGxE,EAAI,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EAAG,EAAI,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,MAAO,MAAO,EAAG,CAAC,EAAGyJ,EAAI,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EAC5jB,EAAE,QAAU,SAASvJ,EAAG,EAAGnC,EAAGkF,EAAG3R,EAAG2rB,EAAGtzB,EAAG4U,EAAG,CAC3C,IAAI0D,EAAGhE,EAAGuoF,EAAGvmF,EAAGwmF,EAAGC,EAAGE,EAAGE,EAAGC,EAAGX,EAAI7nF,EAAE,KAAM+nF,EAAI,EAAGC,EAAI,EAAGn4F,EAAI,EAAG,EAAI,EAAGu4F,EAAI,EAAGE,EAAI,EAAGljF,EAAK,EAAG2lF,EAAI,EAAGtC,GAAI,EAAGE,EAAI,EAAGD,EAAI,KAAMsC,GAAI,EAAGC,GAAK,IAAIroF,EAAE,MAAM,EAAE,EAAGpB,GAAI,IAAIoB,EAAE,MAAM,EAAE,EAAGyT,GAAK,KAAM60E,GAAK,EAC9L,IAAKnD,EAAI,EAAGA,GAAK,GAAIA,IAAKkD,GAAGlD,CAAC,EAAI,EAClC,IAAKC,EAAI,EAAGA,EAAItjF,EAAGsjF,IAAKiD,GAAG,EAAEzrF,EAAIwoF,CAAC,CAAC,IACnC,IAAKI,EAAIP,EAAG,EAAI,GAAI,GAAK,GAAKoD,GAAG,CAAC,IAAM,EAAG,IAAK,CAChD,GAAI,EAAI7C,IAAMA,EAAI,GAAI,IAAM,EAAG,OAAOr1F,EAAE2rB,GAAG,EAAI,SAAU3rB,EAAE2rB,GAAG,EAAI,SAAU1e,EAAE,KAAO,EAAG,EACxF,IAAKnQ,EAAI,EAAGA,EAAI,GAAKo7F,GAAGp7F,CAAC,IAAM,EAAGA,IAAK,CACvC,IAAKu4F,EAAIv4F,IAAMu4F,EAAIv4F,GAAIk4F,EAAIgD,EAAI,EAAGhD,GAAK,GAAIA,IAAK,GAAIgD,IAAM,GAAIA,GAAKE,GAAGlD,CAAC,GAAK,EAAG,MAAO,GACtF,GAAI,EAAIgD,IAAMppF,IAAM,GAAK,IAAM,GAAI,MAAO,GAC1C,IAAKH,GAAE,CAAC,EAAI,EAAGumF,EAAI,EAAGA,EAAI,GAAIA,IAAKvmF,GAAEumF,EAAI,CAAC,EAAIvmF,GAAEumF,CAAC,EAAIkD,GAAGlD,CAAC,EACzD,IAAKC,EAAI,EAAGA,EAAItjF,EAAGsjF,IAAK,EAAExoF,EAAIwoF,CAAC,IAAM,IAAM58F,EAAEoW,GAAE,EAAEhC,EAAIwoF,CAAC,CAAC,GAAG,EAAIA,GAC9D,GAAIG,EAAIxmF,IAAM,GAAK+mF,EAAIryE,GAAKjrB,EAAG,IAAMuW,IAAM,GAAK+mF,EAAIziF,EAAG+kF,IAAK,IAAK30E,GAAK5U,EAAGypF,IAAM,IAAK,MAAQxC,EAAI,EAAGryE,GAAKnL,EAAG,IAAK68E,EAAIl4F,EAAGq4F,EAAIxpE,EAAGtZ,EAAK4iF,EAAIW,EAAI,EAAGV,EAAI,GAAIvmF,GAAK+mF,GAAI,IAAMH,EAAIF,IAAM,EAAGzmF,IAAM,GAAK,IAAM8mF,IAAK9mF,IAAM,GAAK,IAAM8mF,GAAG,MAAO,GACnO,OAAW,CACT,IAAKJ,EAAIN,EAAI3iF,EAAIojF,EAAIp9F,EAAE48F,CAAC,EAAIG,GAAKI,EAAI,EAAGn9F,EAAE48F,CAAC,GAAK58F,EAAE48F,CAAC,EAAIG,GAAKI,EAAIlyE,GAAG60E,GAAK9/F,EAAE48F,CAAC,CAAC,EAAGU,EAAEsC,GAAI5/F,EAAE48F,CAAC,CAAC,IAAMO,EAAI,GAAI,GAAI7kF,EAAI,GAAKqkF,EAAI3iF,EAAIvV,EAAI6P,EAAI,GAAK4oF,EAAGv1F,EAAEm1F,GAAKS,GAAKvjF,IAAO1F,GAAKgE,EAAE,EAAI2kF,GAAK,GAAKE,GAAK,GAAKC,EAAI,EAAG9oF,IAAM,GAAK,CAChN,IAAKgE,EAAI,GAAKqkF,EAAI,EAAGY,EAAIjlF,GAAKA,IAAM,EACpC,GAAIA,IAAM,GAAKilF,GAAKjlF,EAAI,EAAGilF,GAAKjlF,GAAKilF,EAAI,EAAGX,IAAK,EAAEiD,GAAGlD,CAAC,GAAK,EAAG,CAC7D,GAAIA,IAAM,EAAG,MACbA,EAAI,EAAEvoF,EAAIpU,EAAE48F,CAAC,CAAC,CAChB,CACA,GAAII,EAAIL,IAAMY,EAAIjnF,KAAOumF,EAAG,CAC1B,IAAK7iF,IAAO,IAAMA,EAAKgjF,GAAIF,GAAKr4F,EAAGk7F,EAAI,IAAMzC,EAAIP,EAAI3iF,GAAKkjF,EAAIljF,EAAK,GAAK,GAAG2lF,GAAKE,GAAG3C,EAAIljF,CAAE,IAAM,IAAMkjF,IAAKyC,IAAM,EAChH,GAAItC,IAAK,GAAKH,EAAG3mF,IAAM,GAAK,IAAM8mF,IAAK9mF,IAAM,GAAK,IAAM8mF,GAAG,MAAO,GAClE11F,EAAEk1F,EAAIU,EAAIjnF,CAAC,EAAI0mF,GAAK,GAAKE,GAAK,GAAKJ,EAAIxpE,EAAI,CAC7C,CACF,CACA,OAAOiqE,IAAM,IAAM51F,EAAEm1F,EAAIS,CAAC,EAAIZ,EAAI3iF,GAAM,GAAK,IAAM,GAAK,GAAIpF,EAAE,KAAOooF,EAAG,CAC1E,CACF,EAAG,CAAE,kBAAmB,GAAI,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACpD,EAAE,QAAU,CAAE,EAAG,kBAAmB,EAAG,aAAc,EAAG,GAAI,KAAM,aAAc,KAAM,eAAgB,KAAM,aAAc,KAAM,sBAAuB,KAAM,eAAgB,KAAM,sBAAsB,CAC3M,EAAG,CAAA,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CAC7B,IAAIxlF,EAAI,EAAE,iBAAiB,EAAGqD,EAAI,EAAGxE,EAAI,EACzC,SAAS,EAAE,EAAG,CACZ,QAASkqF,EAAI,EAAE,OAAQ,GAAK,EAAEA,GAAK,EAAEA,CAAC,EAAI,CAC5C,CACA,IAAIzgF,EAAI,EAAGvJ,EAAI,GAAI,EAAI,IAAKnC,EAAI,EAAI,EAAImC,EAAG+C,EAAI,GAAI3R,EAAI,GAAI2rB,EAAI,EAAIlf,EAAI,EAAGpU,EAAI,GAAI4U,EAAI,GAAI0D,EAAI,EAAGhE,EAAI,IAAKuoF,EAAI,GAAIvmF,EAAI,GAAIwmF,EAAI,GAAIC,EAAI,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAAGE,EAAI,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EAAGE,EAAI,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAAGC,EAAI,CAAC,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAE,EAAGX,EAAI,IAAI,MAAM,GAAKroF,EAAI,EAAE,EACve,EAAEqoF,CAAC,EACH,IAAIE,EAAI,IAAI,MAAM,EAAIrjF,CAAC,EACvB,EAAEqjF,CAAC,EACH,IAAIC,EAAI,IAAI,MAAM,GAAG,EACrB,EAAEA,CAAC,EACH,IAAIn4F,EAAI,IAAI,MAAM,GAAG,EACrB,EAAEA,CAAC,EACH,IAAI,EAAI,IAAI,MAAM8R,CAAC,EACnB,EAAE,CAAC,EACH,IAAIymF,EAAGE,EAAGljF,EAAI2lF,EAAI,IAAI,MAAMrmF,CAAC,EAC7B,SAAS+jF,GAAE,EAAGkD,EAAGC,GAAGC,EAAGC,EAAG,CACxB,KAAK,YAAc,EAAG,KAAK,WAAaH,EAAG,KAAK,WAAaC,GAAG,KAAK,MAAQC,EAAG,KAAK,WAAaC,EAAG,KAAK,UAAY,GAAK,EAAE,MAC/H,CACA,SAASnD,EAAE,EAAGgD,EAAG,CACf,KAAK,SAAW,EAAG,KAAK,SAAW,EAAG,KAAK,UAAYA,CACzD,CACA,SAASjD,EAAE,EAAG,CACZ,OAAO,EAAI,IAAMV,EAAE,CAAC,EAAIA,EAAE,KAAO,IAAM,EAAE,CAC3C,CACA,SAASgD,GAAE,EAAGW,EAAG,CACf,EAAE,YAAY,EAAE,SAAS,EAAI,IAAMA,EAAG,EAAE,YAAY,EAAE,SAAS,EAAIA,IAAM,EAAI,GAC/E,CACA,SAASV,GAAG,EAAGU,EAAGC,GAAG,CACnB,EAAE,SAAW5rF,EAAI4rF,IAAK,EAAE,QAAUD,GAAK,EAAE,SAAW,MAAOX,GAAE,EAAG,EAAE,MAAM,EAAG,EAAE,OAASW,GAAK3rF,EAAI,EAAE,SAAU,EAAE,UAAY4rF,GAAI5rF,IAAM,EAAE,QAAU2rF,GAAK,EAAE,SAAW,MAAO,EAAE,UAAYC,GACxL,CACA,SAASpqF,GAAE,EAAGmqF,EAAGC,GAAG,CAClBX,GAAG,EAAGW,GAAE,EAAID,CAAC,EAAGC,GAAE,EAAID,EAAI,CAAC,CAAC,CAC9B,CACA,SAASt1E,GAAG,EAAGs1E,EAAG,CAChB,QAASC,GAAI,EAAGA,IAAK,EAAI,EAAG,KAAO,EAAGA,KAAM,EAAG,EAAI,EAAED,GAAK,CAC1D,OAAOC,KAAM,CACf,CACA,SAASV,GAAG,EAAGS,EAAGC,GAAG,CACnB,IAAIC,EAAGC,EAAGC,EAAI,IAAI,MAAM3gG,EAAI,CAAC,EAAG4gG,EAAK,EACrC,IAAKH,EAAI,EAAGA,GAAKzgG,EAAGygG,IAAKE,EAAEF,CAAC,EAAIG,EAAKA,EAAKJ,GAAEC,EAAI,CAAC,GAAK,EACtD,IAAKC,EAAI,EAAGA,GAAKH,EAAGG,IAAK,CACvB,IAAIG,EAAI,EAAE,EAAIH,EAAI,CAAC,EACnBG,IAAM,IAAM,EAAE,EAAIH,CAAC,EAAIz1E,GAAG01E,EAAEE,CAAC,IAAKA,CAAC,EACrC,CACF,CACA,SAASd,GAAG,EAAG,CACb,IAAIQ,EACJ,IAAKA,EAAI,EAAGA,EAAInsF,EAAGmsF,IAAK,EAAE,UAAU,EAAIA,CAAC,EAAI,EAC7C,IAAKA,EAAI,EAAGA,EAAIjnF,EAAGinF,IAAK,EAAE,UAAU,EAAIA,CAAC,EAAI,EAC7C,IAAKA,EAAI,EAAGA,EAAI54F,EAAG44F,IAAK,EAAE,QAAQ,EAAIA,CAAC,EAAI,EAC3C,EAAE,UAAU,EAAIjsF,CAAC,EAAI,EAAG,EAAE,QAAU,EAAE,WAAa,EAAG,EAAE,SAAW,EAAE,QAAU,CACjF,CACA,SAAS0rF,GAAG,EAAG,CACb,EAAI,EAAE,SAAWJ,GAAE,EAAG,EAAE,MAAM,EAAI,EAAI,EAAE,WAAa,EAAE,YAAY,EAAE,SAAS,EAAI,EAAE,QAAS,EAAE,OAAS,EAAG,EAAE,SAAW,CAC1H,CACA,SAASK,GAAG,EAAGM,EAAGC,GAAGC,EAAG,CACtB,IAAIC,EAAI,EAAIH,EAAGI,EAAI,EAAIH,GACvB,OAAO,EAAEE,CAAC,EAAI,EAAEC,CAAC,GAAK,EAAED,CAAC,IAAM,EAAEC,CAAC,GAAKF,EAAEF,CAAC,GAAKE,EAAED,EAAC,CACpD,CACA,SAASliF,GAAG,EAAGiiF,EAAGC,GAAG,CACnB,QAASC,EAAI,EAAE,KAAKD,EAAC,EAAGE,EAAIF,IAAK,EAAGE,GAAK,EAAE,WAAaA,EAAI,EAAE,UAAYT,GAAGM,EAAG,EAAE,KAAKG,EAAI,CAAC,EAAG,EAAE,KAAKA,CAAC,EAAG,EAAE,KAAK,GAAKA,IAAK,CAACT,GAAGM,EAAGE,EAAG,EAAE,KAAKC,CAAC,EAAG,EAAE,KAAK,IAAM,EAAE,KAAKF,EAAC,EAAI,EAAE,KAAKE,CAAC,EAAGF,GAAIE,EAAGA,IAAM,EACjM,EAAE,KAAKF,EAAC,EAAIC,CACd,CACA,SAASP,GAAG,EAAGK,EAAGC,GAAG,CACnB,IAAIC,EAAGC,EAAGC,EAAGC,EAAIC,EAAI,EACrB,GAAI,EAAE,WAAa,EAAG,KAAOJ,EAAI,EAAE,YAAY,EAAE,MAAQ,EAAII,CAAC,GAAK,EAAI,EAAE,YAAY,EAAE,MAAQ,EAAIA,EAAI,CAAC,EAAGH,EAAI,EAAE,YAAY,EAAE,MAAQG,CAAC,EAAGA,IAAKJ,IAAM,EAAIrqF,GAAE,EAAGsqF,EAAGH,CAAC,GAAKnqF,GAAE,GAAIuqF,EAAIl8F,EAAEi8F,CAAC,GAAK,EAAI,EAAGH,CAAC,GAAIK,EAAK7D,EAAE4D,CAAC,KAAO,GAAKd,GAAG,EAAGa,GAAK,EAAEC,CAAC,EAAGC,CAAE,EAAGxqF,GAAE,EAAGuqF,EAAIrD,EAAE,EAAEmD,CAAC,EAAGD,EAAC,GAAII,EAAK3D,EAAE0D,CAAC,KAAO,GAAKd,GAAG,EAAGY,GAAKd,EAAEgB,CAAC,EAAGC,CAAE,GAAIC,EAAI,EAAE,UAAY,CACnUzqF,GAAE,EAAG9B,EAAGisF,CAAC,CACX,CACA,SAASJ,GAAG,EAAGI,EAAG,CAChB,IAAIC,GAAGC,EAAGC,EAAGC,EAAIJ,EAAE,SAAUK,EAAKL,EAAE,UAAU,YAAaM,EAAIN,EAAE,UAAU,UAAWO,EAAKP,EAAE,UAAU,MAAOx1E,GAAK,GACnH,IAAK,EAAE,SAAW,EAAG,EAAE,SAAWuI,EAAGktE,GAAI,EAAGA,GAAIM,EAAIN,KAAKG,EAAE,EAAIH,EAAC,IAAM,GAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAIz1E,GAAKy1E,GAAG,EAAE,MAAMA,EAAC,EAAI,GAAKG,EAAE,EAAIH,GAAI,CAAC,EAAI,EAC3I,KAAO,EAAE,SAAW,GAAKG,EAAE,GAAKD,EAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAI31E,GAAK,EAAI,EAAEA,GAAK,EAAE,EAAI,EAAG,EAAE,MAAM21E,CAAC,EAAI,EAAG,EAAE,UAAWG,IAAM,EAAE,YAAcD,EAAG,EAAIF,EAAI,CAAC,GACnJ,IAAKH,EAAE,SAAWx1E,GAAIy1E,GAAI,EAAE,UAAY,EAAG,GAAKA,GAAGA,KAAKliF,GAAG,EAAGqiF,EAAGH,EAAC,EAClE,IAAKE,EAAII,EAAIN,GAAI,EAAE,KAAK,CAAC,EAAG,EAAE,KAAK,CAAC,EAAI,EAAE,KAAK,EAAE,UAAU,EAAGliF,GAAG,EAAGqiF,EAAG,CAAC,EAAGF,EAAI,EAAE,KAAK,CAAC,EAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAID,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAIC,EAAGE,EAAE,EAAID,CAAC,EAAIC,EAAE,EAAIH,EAAC,EAAIG,EAAE,EAAIF,CAAC,EAAG,EAAE,MAAMC,CAAC,GAAK,EAAE,MAAMF,EAAC,GAAK,EAAE,MAAMC,CAAC,EAAI,EAAE,MAAMD,EAAC,EAAI,EAAE,MAAMC,CAAC,GAAK,EAAGE,EAAE,EAAIH,GAAI,CAAC,EAAIG,EAAE,EAAIF,EAAI,CAAC,EAAIC,EAAG,EAAE,KAAK,CAAC,EAAIA,IAAKpiF,GAAG,EAAGqiF,EAAG,CAAC,EAAG,GAAK,EAAE,UAAY,CACvU,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAI,EAAE,KAAK,CAAC,GAAI,SAASjiF,GAAIqiF,GAAI,CAClD,IAAIC,GAAIC,GAAIC,GAAIC,GAAIC,GAAIC,GAAIC,GAAKP,GAAG,SAAUQ,GAAKR,GAAG,SAAUS,GAAKT,GAAG,UAAU,YAAaU,EAAKV,GAAG,UAAU,UAAWW,GAAKX,GAAG,UAAU,WAAYY,GAAKZ,GAAG,UAAU,WAAYqD,GAAKrD,GAAG,UAAU,WAAYsD,GAAK,EAC3N,IAAKlD,GAAK,EAAGA,IAAMnhG,EAAGmhG,KAAMziF,GAAG,SAASyiF,EAAE,EAAI,EAC9C,IAAKG,GAAG,EAAI5iF,GAAG,KAAKA,GAAG,QAAQ,EAAI,CAAC,EAAI,EAAGsiF,GAAKtiF,GAAG,SAAW,EAAGsiF,GAAK1tE,EAAG0tE,KAAMoD,IAAMjD,GAAKG,GAAG,EAAIA,GAAG,GAAKL,GAAKviF,GAAG,KAAKsiF,EAAE,GAAK,CAAC,EAAI,CAAC,EAAI,KAAOG,GAAKiD,GAAIC,MAAO/C,GAAG,EAAIL,GAAK,CAAC,EAAIE,GAAII,GAAKN,KAAOviF,GAAG,SAASyiF,EAAE,IAAKC,GAAK,EAAGO,IAAMV,KAAOG,GAAKM,GAAGT,GAAKU,EAAE,GAAIN,GAAKC,GAAG,EAAIL,EAAE,EAAGviF,GAAG,SAAW2iF,IAAMF,GAAKC,IAAKK,IAAO/iF,GAAG,YAAc2iF,IAAMG,GAAG,EAAIP,GAAK,CAAC,EAAIG,MACxV,GAAIiD,KAAO,EAAG,CACZ,EAAG,CACD,IAAKlD,GAAKiD,GAAK,EAAG1lF,GAAG,SAASyiF,EAAE,IAAM,GAAKA,KAC3CziF,GAAG,SAASyiF,EAAE,IAAKziF,GAAG,SAASyiF,GAAK,CAAC,GAAK,EAAGziF,GAAG,SAAS0lF,EAAE,IAAKC,IAAM,CACxE,OAAS,EAAIA,IACb,IAAKlD,GAAKiD,GAAIjD,KAAO,EAAGA,KAAM,IAAKF,GAAKviF,GAAG,SAASyiF,EAAE,EAAGF,KAAO,GAAKM,IAAML,GAAKxiF,GAAG,KAAK,EAAEsiF,EAAE,KAAOM,GAAG,EAAIJ,GAAK,CAAC,IAAMC,KAAOziF,GAAG,UAAYyiF,GAAKG,GAAG,EAAIJ,GAAK,CAAC,GAAKI,GAAG,EAAIJ,EAAE,EAAGI,GAAG,EAAIJ,GAAK,CAAC,EAAIC,IAAKF,KACvM,CACF,GAAG,EAAGV,CAAC,EAAGT,GAAGa,EAAG51E,GAAI,EAAE,QAAQ,CAChC,CACA,SAASq1E,EAAE,EAAGG,EAAGC,GAAG,CAClB,IAAIC,EAAGC,EAAGC,EAAI,GAAIC,EAAKL,EAAE,CAAC,EAAGM,EAAI,EAAGC,EAAK,EAAG/1E,GAAK,EACjD,IAAK61E,IAAO,IAAME,EAAK,IAAK/1E,GAAK,GAAIw1E,EAAE,GAAKC,GAAI,GAAK,CAAC,EAAI,MAAOC,EAAI,EAAGA,GAAKD,GAAGC,IAAKC,EAAIE,EAAIA,EAAKL,EAAE,GAAKE,EAAI,GAAK,CAAC,EAAG,EAAEI,EAAIC,GAAMJ,IAAME,IAAOC,EAAI91E,GAAK,EAAE,QAAQ,EAAI21E,CAAC,GAAKG,EAAIH,IAAM,GAAKA,IAAMC,GAAK,EAAE,QAAQ,EAAID,CAAC,IAAK,EAAE,QAAQ,EAAI7D,CAAC,KAAOgE,GAAK,GAAK,EAAE,QAAQ,EAAIvqF,CAAC,IAAM,EAAE,QAAQ,EAAIwmF,CAAC,IAAK6D,EAAID,EAAG31E,IAAM81E,EAAI,KAAOD,GAAME,EAAK,IAAK,GAAKJ,IAAME,GAAME,EAAK,EAAG,IAAMA,EAAK,EAAG,GACpX,CACA,SAAST,EAAE,EAAGE,EAAGC,GAAG,CAClB,IAAIC,EAAGC,EAAGC,EAAI,GAAIC,EAAKL,EAAE,CAAC,EAAGM,EAAI,EAAGC,EAAK,EAAG/1E,GAAK,EACjD,IAAK61E,IAAO,IAAME,EAAK,IAAK/1E,GAAK,GAAI01E,EAAI,EAAGA,GAAKD,GAAGC,IAAK,GAAIC,EAAIE,EAAIA,EAAKL,EAAE,GAAKE,EAAI,GAAK,CAAC,EAAG,EAAE,EAAEI,EAAIC,GAAMJ,IAAME,GAAK,CACrH,GAAIC,EAAI91E,GAAI,KAAO3U,GAAE,EAAGsqF,EAAG,EAAE,OAAO,EAAG,EAAEG,GAAK,GAAK,MAC9CH,IAAM,GAAKA,IAAMC,IAAMvqF,GAAE,EAAGsqF,EAAG,EAAE,OAAO,EAAGG,KAAMzqF,GAAE,EAAGymF,EAAG,EAAE,OAAO,EAAGgD,GAAG,EAAGgB,EAAI,EAAG,CAAC,GAAKA,GAAK,IAAMzqF,GAAE,EAAGE,EAAG,EAAE,OAAO,EAAGupF,GAAG,EAAGgB,EAAI,EAAG,CAAC,IAAMzqF,GAAE,EAAG0mF,EAAG,EAAE,OAAO,EAAG+C,GAAG,EAAGgB,EAAI,GAAI,CAAC,GACnLF,EAAID,EAAG31E,IAAM81E,EAAI,KAAOD,GAAME,EAAK,IAAK,GAAKJ,IAAME,GAAME,EAAK,EAAG,IAAMA,EAAK,EAAG,EACjF,CACF,CACA,EAAEnB,CAAC,EACH,IAAIl5E,EAAI,GACR,SAAS65E,EAAE,EAAGC,EAAGC,GAAGC,EAAG,CACrBZ,GAAG,GAAI//E,GAAK,IAAM2gF,EAAI,EAAI,GAAI,CAAC,GAAI,SAASC,EAAGC,EAAGC,EAAIC,EAAG,CACvDb,GAAGU,CAAC,EAAGd,GAAEc,EAAGE,CAAE,EAAGhB,GAAEc,EAAG,CAACE,CAAE,EAAGppF,EAAE,SAASkpF,EAAE,YAAaA,EAAE,OAAQC,EAAGC,EAAIF,EAAE,OAAO,EAAGA,EAAE,SAAWE,CAClG,GAAG,EAAGL,EAAGC,EAAC,CACZ,CACA,EAAE,SAAW,SAAS,EAAG,CACvB/5E,KAAO,UAAW,CAChB,IAAI85E,EAAGC,GAAGC,EAAGC,EAAGC,EAAGC,EAAK,IAAI,MAAM5gG,EAAI,CAAC,EACvC,IAAK0gG,EAAID,EAAI,EAAGC,EAAInqF,EAAI,EAAGmqF,IAAK,IAAK,EAAEA,CAAC,EAAID,EAAGF,EAAI,EAAGA,EAAI,GAAKxD,EAAE2D,CAAC,EAAGH,IAAK97F,EAAEg8F,GAAG,EAAIC,EACnF,IAAKj8F,EAAEg8F,EAAI,CAAC,EAAIC,EAAGA,EAAIC,EAAI,EAAGD,EAAI,GAAIA,IAAK,IAAKf,EAAEe,CAAC,EAAIC,EAAGJ,EAAI,EAAGA,EAAI,GAAKtD,EAAEyD,CAAC,EAAGH,IAAK3D,EAAE+D,GAAG,EAAID,EAC9F,IAAKC,IAAM,EAAGD,EAAIpnF,EAAGonF,IAAK,IAAKf,EAAEe,CAAC,EAAIC,GAAK,EAAGJ,EAAI,EAAGA,EAAI,GAAKtD,EAAEyD,CAAC,EAAI,EAAGH,IAAK3D,EAAE,IAAM+D,GAAG,EAAID,EAC5F,IAAKF,GAAI,EAAGA,IAAKxgG,EAAGwgG,KAAKI,EAAGJ,EAAC,EAAI,EACjC,IAAKD,EAAI,EAAGA,GAAK,KAAO9D,EAAE,EAAI8D,EAAI,CAAC,EAAI,EAAGA,IAAKK,EAAG,CAAC,IACnD,KAAOL,GAAK,KAAO9D,EAAE,EAAI8D,EAAI,CAAC,EAAI,EAAGA,IAAKK,EAAG,CAAC,IAC9C,KAAOL,GAAK,KAAO9D,EAAE,EAAI8D,EAAI,CAAC,EAAI,EAAGA,IAAKK,EAAG,CAAC,IAC9C,KAAOL,GAAK,KAAO9D,EAAE,EAAI8D,EAAI,CAAC,EAAI,EAAGA,IAAKK,EAAG,CAAC,IAC9C,IAAKd,GAAGrD,EAAGroF,EAAI,EAAGwsF,CAAE,EAAGL,EAAI,EAAGA,EAAIjnF,EAAGinF,IAAK5D,EAAE,EAAI4D,EAAI,CAAC,EAAI,EAAG5D,EAAE,EAAI4D,CAAC,EAAIt1E,GAAGs1E,EAAG,CAAC,EAC9EvD,EAAI,IAAIK,GAAEZ,EAAGM,EAAG,EAAI,EAAG3oF,EAAGpU,CAAC,EAAGk9F,EAAI,IAAIG,GAAEV,EAAGM,EAAG,EAAG3jF,EAAGtZ,CAAC,EAAGga,EAAK,IAAIqjF,GAAE,IAAI,MAAM,CAAC,EAAGF,EAAG,EAAGx1F,EAAG2Q,CAAC,CAC7F,GAAC,EAAKmO,EAAI,IAAK,EAAE,OAAS,IAAI82E,EAAE,EAAE,UAAWP,CAAC,EAAG,EAAE,OAAS,IAAIO,EAAE,EAAE,UAAWL,CAAC,EAAG,EAAE,QAAU,IAAIK,EAAE,EAAE,QAASvjF,CAAE,EAAG,EAAE,OAAS,EAAG,EAAE,SAAW,EAAG+lF,GAAG,CAAC,CACzJ,EAAG,EAAE,iBAAmBO,EAAG,EAAE,gBAAkB,SAAS,EAAGC,EAAGC,GAAGC,EAAG,CAClE,IAAIC,EAAGC,EAAGC,EAAK,EACf,EAAI,EAAE,OAAS,EAAE,KAAK,YAAc,IAAM,EAAE,KAAK,WAAa,SAASC,EAAG,CACxE,IAAIC,EAAI/1E,GAAK,WACb,IAAK+1E,EAAK,EAAGA,GAAM,GAAIA,IAAM/1E,MAAQ,EAAG,GAAI,EAAIA,IAAM81E,EAAE,UAAU,EAAIC,CAAE,IAAM,EAAG,OAAOjmF,EACxF,GAAIgmF,EAAE,UAAU,EAAE,IAAM,GAAKA,EAAE,UAAU,EAAE,IAAM,GAAKA,EAAE,UAAU,EAAE,IAAM,EAAG,OAAOxqF,EACpF,IAAKyqF,EAAK,GAAIA,EAAK,EAAGA,IAAM,GAAID,EAAE,UAAU,EAAIC,CAAE,IAAM,EAAG,OAAOzqF,EAClE,OAAOwE,CACT,GAAG,CAAC,GAAIslF,GAAG,EAAG,EAAE,MAAM,EAAGA,GAAG,EAAG,EAAE,MAAM,EAAGS,GAAM,SAASC,EAAG,CAC1D,IAAIC,EACJ,IAAKV,EAAES,EAAGA,EAAE,UAAWA,EAAE,OAAO,QAAQ,EAAGT,EAAES,EAAGA,EAAE,UAAWA,EAAE,OAAO,QAAQ,EAAGV,GAAGU,EAAGA,EAAE,OAAO,EAAGC,EAAKn5F,EAAI,EAAG,GAAKm5F,GAAMD,EAAE,QAAQ,EAAIzD,EAAE0D,CAAE,EAAI,CAAC,IAAM,EAAGA,IAAM,CAChK,OAAOD,EAAE,SAAW,GAAKC,EAAK,GAAK,EAAI,EAAI,EAAGA,CAChD,GAAG,CAAC,EAAGJ,EAAI,EAAE,QAAU,EAAI,IAAM,GAAIC,EAAI,EAAE,WAAa,EAAI,IAAM,IAAMD,IAAMA,EAAIC,IAAMD,EAAIC,EAAIH,GAAI,EAAGA,GAAI,GAAKE,GAAKH,IAAM,GAAKD,EAAE,EAAGC,EAAGC,GAAGC,CAAC,EAAI,EAAE,WAAa,GAAKE,IAAMD,GAAKb,GAAG,EAAG,GAAKY,EAAI,EAAI,GAAI,CAAC,EAAGP,GAAG,EAAGzD,EAAGE,CAAC,IAAMkD,GAAG,EAAG,GAAKY,EAAI,EAAI,GAAI,CAAC,GAAI,SAASI,EAAGC,EAAI/1E,GAAIrM,GAAI,CAC5Q,IAAIqiF,GACJ,IAAKlB,GAAGgB,EAAGC,EAAK,IAAK,CAAC,EAAGjB,GAAGgB,EAAG91E,GAAK,EAAG,CAAC,EAAG80E,GAAGgB,EAAGniF,GAAK,EAAG,CAAC,EAAGqiF,GAAK,EAAGA,GAAKriF,GAAIqiF,KAAMlB,GAAGgB,EAAGA,EAAE,QAAQ,EAAIzD,EAAE2D,EAAE,EAAI,CAAC,EAAG,CAAC,EACrHV,EAAEQ,EAAGA,EAAE,UAAWC,EAAK,CAAC,EAAGT,EAAEQ,EAAGA,EAAE,UAAW91E,GAAK,CAAC,CACrD,GAAG,EAAG,EAAE,OAAO,SAAW,EAAG,EAAE,OAAO,SAAW,EAAG61E,EAAK,CAAC,EAAGV,GAAG,EAAG,EAAE,UAAW,EAAE,SAAS,GAAIH,GAAG,CAAC,EAAGU,GAAKT,GAAG,CAAC,CACjH,EAAG,EAAE,UAAY,SAAS,EAAGO,EAAGC,GAAG,CACjC,OAAO,EAAE,YAAY,EAAE,MAAQ,EAAI,EAAE,QAAQ,EAAID,IAAM,EAAI,IAAK,EAAE,YAAY,EAAE,MAAQ,EAAI,EAAE,SAAW,CAAC,EAAI,IAAMA,EAAG,EAAE,YAAY,EAAE,MAAQ,EAAE,QAAQ,EAAI,IAAMC,GAAG,EAAE,WAAYD,IAAM,EAAI,EAAE,UAAU,EAAIC,EAAC,KAAO,EAAE,UAAWD,IAAK,EAAE,UAAU,GAAK97F,EAAE+7F,EAAC,EAAI,EAAI,EAAE,IAAK,EAAE,UAAU,EAAIlD,EAAEiD,CAAC,CAAC,KAAM,EAAE,WAAa,EAAE,YAAc,CACtU,EAAG,EAAE,UAAY,SAAS,EAAG,CAC3BV,GAAG,EAAG,EAAG,CAAC,EAAGzpF,GAAE,EAAG9B,EAAGmoF,CAAC,GAAI,SAAS8D,EAAG,CACpCA,EAAE,WAAa,IAAMX,GAAEW,EAAGA,EAAE,MAAM,EAAGA,EAAE,OAAS,EAAGA,EAAE,SAAW,GAAK,GAAKA,EAAE,WAAaA,EAAE,YAAYA,EAAE,SAAS,EAAI,IAAMA,EAAE,OAAQA,EAAE,SAAW,EAAGA,EAAE,UAAY,EACtK,GAAG,CAAC,CACN,CACF,EAAG,CAAE,kBAAmB,GAAI,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,CACpD,EAAE,QAAU,UAAW,CACrB,KAAK,MAAQ,KAAM,KAAK,QAAU,EAAG,KAAK,SAAW,EAAG,KAAK,SAAW,EAAG,KAAK,OAAS,KAAM,KAAK,SAAW,EAAG,KAAK,UAAY,EAAG,KAAK,UAAY,EAAG,KAAK,IAAM,GAAI,KAAK,MAAQ,KAAM,KAAK,UAAY,EAAG,KAAK,MAAQ,CAC/N,CACF,EAAG,CAAA,CAAE,EAAG,GAAI,CAAC,SAAS,EAAG,EAAG,EAAG,EAC5B,SAAS/oF,EAAG,EACV,SAASqD,EAAGxE,EAAG,CACd,GAAI,CAACwE,EAAE,aAAc,CACnB,IAAI,EAAGiF,EAAGvJ,EAAG,EAAGnC,EAAI,EAAGkF,EAAI,CAAA,EAAI3R,EAAI,GAAI2rB,EAAIzY,EAAE,SAAU7a,EAAI,OAAO,gBAAkB,OAAO,eAAe6a,CAAC,EAC3G7a,EAAIA,GAAKA,EAAE,WAAaA,EAAI6a,EAAG,EAAI,CAAA,EAAG,SAAS,KAAKA,EAAE,OAAO,IAAM,mBAAqB,SAASgiF,EAAG,CAClG,QAAQ,SAAS,UAAW,CAC1BvkF,EAAEukF,CAAC,CACL,CAAC,CACH,GAAK,UAAW,CACd,GAAIhiF,EAAE,aAAe,CAACA,EAAE,cAAe,CACrC,IAAIgiF,EAAI,GAAIvmF,EAAIuE,EAAE,UAClB,OAAOA,EAAE,UAAY,UAAW,CAC9BgiF,EAAI,EACN,EAAGhiF,EAAE,YAAY,GAAI,GAAG,EAAGA,EAAE,UAAYvE,EAAGumF,CAC9C,CACF,GAAC,GAAO,EAAI,gBAAkB,KAAK,OAAM,EAAK,IAAKhiF,EAAE,iBAAmBA,EAAE,iBAAiB,UAAWvG,EAAG,EAAE,EAAIuG,EAAE,YAAY,YAAavG,CAAC,EAAG,SAASuoF,EAAG,CACxJhiF,EAAE,YAAY,EAAIgiF,EAAG,GAAG,CAC1B,GAAKhiF,EAAE,iBAAmBtE,EAAI,IAAI,gBAAkB,MAAM,UAAY,SAASsmF,EAAG,CAChFvkF,EAAEukF,EAAE,IAAI,CACV,EAAG,SAASA,EAAG,CACbtmF,EAAE,MAAM,YAAYsmF,CAAC,CACvB,GAAKvpE,GAAK,uBAAwBA,EAAE,cAAc,QAAQ,GAAKxT,EAAIwT,EAAE,gBAAiB,SAASupE,EAAG,CAChG,IAAIvmF,EAAIgd,EAAE,cAAc,QAAQ,EAChChd,EAAE,mBAAqB,UAAW,CAChCgC,EAAEukF,CAAC,EAAGvmF,EAAE,mBAAqB,KAAMwJ,EAAE,YAAYxJ,CAAC,EAAGA,EAAI,IAC3D,EAAGwJ,EAAE,YAAYxJ,CAAC,CACpB,GAAK,SAASumF,EAAG,CACf,WAAWvkF,EAAG,EAAGukF,CAAC,CACpB,EAAG78F,EAAE,aAAe,SAAS68F,EAAG,CAC9B,OAAOA,GAAK,aAAeA,EAAI,IAAI,SAAS,GAAKA,CAAC,GAClD,QAASvmF,EAAI,IAAI,MAAM,UAAU,OAAS,CAAC,EAAGwmF,EAAI,EAAGA,EAAIxmF,EAAE,OAAQwmF,IAAKxmF,EAAEwmF,CAAC,EAAI,UAAUA,EAAI,CAAC,EAC9F,IAAIC,EAAI,CAAE,SAAUF,EAAG,KAAMvmF,CAAC,EAC9B,OAAOgD,EAAElF,CAAC,EAAI2oF,EAAG,EAAE3oF,CAAC,EAAGA,GACzB,EAAGpU,EAAE,eAAiB4U,CACxB,CACA,SAASA,EAAEioF,EAAG,CACZ,OAAOvjF,EAAEujF,CAAC,CACZ,CACA,SAASvkF,EAAEukF,EAAG,CACZ,GAAIl1F,EAAG,WAAW2Q,EAAG,EAAGukF,CAAC,MACpB,CACH,IAAIvmF,EAAIgD,EAAEujF,CAAC,EACX,GAAIvmF,EAAG,CACL3O,EAAI,GACJ,GAAI,EACD,SAASm1F,EAAG,CACX,IAAIC,EAAID,EAAE,SAAUG,EAAIH,EAAE,KAC1B,OAAQG,EAAE,OAAM,CACd,IAAK,GACHF,EAAC,EACD,MACF,IAAK,GACHA,EAAEE,EAAE,CAAC,CAAC,EACN,MACF,IAAK,GACHF,EAAEE,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EACZ,MACF,IAAK,GACHF,EAAEE,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAClB,MACF,QACEF,EAAE,MAAM1mF,EAAG4mF,CAAC,CACtC,CACoB,GAAG3mF,CAAC,CACN,QAAC,CACC1B,EAAEioF,CAAC,EAAGl1F,EAAI,EACZ,CACF,CACF,CACF,CACA,SAAS2M,EAAEuoF,EAAG,CACZA,EAAE,SAAWhiF,GAAK,OAAOgiF,EAAE,MAAQ,UAAYA,EAAE,KAAK,QAAQ,CAAC,IAAM,GAAKvkF,EAAE,CAACukF,EAAE,KAAK,MAAM,EAAE,MAAM,CAAC,CACrG,CACF,GAAG,OAAO,KAAO,IAAMrlF,IAAM,OAAS,KAAOA,EAAI,IAAI,CACvD,GAAG,KAAK,KAAM,OAAOssF,GAAK,IAAMA,GAAK,OAAO,KAAO,IAAM,KAAO,OAAO,OAAS,IAAM,OAAS,CAAA,CAAE,CACnG,EAAG,CAAA,CAAE,GAAK,CAAA,EAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CACxB,CAAC,CACH,GAAGG,EAAE,GAAIA,GAAG,OACd,CACA,IAAIK,GAAKH,GAAE,EACX,MAAMI,GAAqBR,GAAGO,EAAE,EAChC,SAASE,GAAGnhD,EAAG,EAAG,CAChB,OAAO,UAAW,CAChB,OAAOA,EAAE,MAAM,EAAG,SAAS,CAC7B,CACF,CACA,KAAM,CAAE,SAAUohD,EAAE,EAAK,OAAO,UAAW,CAAE,eAAgBC,EAAE,EAAK,OAAQ,CAAE,SAAUC,GAAI,YAAaC,IAAO,OAAQC,IAAuBxhD,GAAO,GAAM,CAC1J,MAAM,EAAIohD,GAAG,KAAK,CAAC,EACnB,OAAOphD,EAAE,CAAC,IAAMA,EAAE,CAAC,EAAI,EAAE,MAAM,EAAG,EAAE,EAAE,YAAW,EACnD,GAAmB,OAAO,OAAO,IAAI,CAAC,EAAGyhD,GAAMzhD,IAAOA,EAAIA,EAAE,YAAW,EAAK,GAAMwhD,GAAG,CAAC,IAAMxhD,GAAI0hD,GAAM1hD,GAAO,GAAM,OAAO,IAAMA,EAAG,CAAE,QAAS2hD,EAAE,EAAK,MAAOC,GAAKF,GAAG,WAAW,EAC/K,SAASG,GAAG7hD,EAAG,CACb,OAAOA,IAAM,MAAQ,CAAC4hD,GAAG5hD,CAAC,GAAKA,EAAE,cAAgB,MAAQ,CAAC4hD,GAAG5hD,EAAE,WAAW,GAAK8hD,GAAG9hD,EAAE,YAAY,QAAQ,GAAKA,EAAE,YAAY,SAASA,CAAC,CACvI,CACA,MAAM+hD,GAAKN,GAAG,aAAa,EAC3B,SAAStxE,GAAG6vB,EAAG,CACb,IAAI,EACJ,OAAO,OAAO,YAAc,KAAO,YAAY,OAAS,EAAI,YAAY,OAAOA,CAAC,EAAI,EAAIA,GAAKA,EAAE,QAAU+hD,GAAG/hD,EAAE,MAAM,EAAG,CACzH,CACA,MAAMh4B,GAAK05E,GAAG,QAAQ,EAAGI,GAAKJ,GAAG,UAAU,EAAGM,GAAKN,GAAG,QAAQ,EAAGO,GAAMjiD,GAAMA,IAAM,MAAQ,OAAOA,GAAK,SAAUkiD,GAAMliD,GAAMA,IAAM,IAAMA,IAAM,GAAImiD,GAAMniD,GAAM,CAC7J,GAAIwhD,GAAGxhD,CAAC,IAAM,SACZ,MAAO,GACT,MAAM,EAAIqhD,GAAGrhD,CAAC,EACd,OAAQ,IAAM,MAAQ,IAAM,OAAO,WAAa,OAAO,eAAe,CAAC,IAAM,OAAS,EAAEuhD,MAAMvhD,IAAM,EAAEshD,MAAMthD,EAC9G,EAAGoiD,GAAMpiD,GAAM,CACb,GAAI,CAACiiD,GAAGjiD,CAAC,GAAK6hD,GAAG7hD,CAAC,EAChB,MAAO,GACT,GAAI,CACF,OAAO,OAAO,KAAKA,CAAC,EAAE,SAAW,GAAK,OAAO,eAAeA,CAAC,IAAM,OAAO,SAC5E,MAAQ,CACN,MAAO,EACT,CACF,EAAGqiD,GAAKZ,GAAG,MAAM,EAAGa,GAAKb,GAAG,MAAM,EAAGc,GAAKd,GAAG,MAAM,EAAGe,GAAKf,GAAG,UAAU,EAAGgB,GAAMziD,GAAMiiD,GAAGjiD,CAAC,GAAK8hD,GAAG9hD,EAAE,IAAI,EAAG0iD,GAAM1iD,GAAM,CACtH,IAAI,EACJ,OAAOA,IAAM,OAAO,UAAY,YAAcA,aAAa,UAAY8hD,GAAG9hD,EAAE,MAAM,KAAO,EAAIwhD,GAAGxhD,CAAC,KAAO,YACxG,IAAM,UAAY8hD,GAAG9hD,EAAE,QAAQ,GAAKA,EAAE,aAAe,qBACvD,EAAG2iD,GAAKlB,GAAG,iBAAiB,EAAG,CAACmB,GAAIC,GAAIC,GAAIC,EAAE,EAAI,CAAC,iBAAkB,UAAW,WAAY,SAAS,EAAE,IAAItB,EAAE,EAAGuB,GAAMhjD,GAAMA,EAAE,KAAOA,EAAE,KAAI,EAAKA,EAAE,QAAQ,qCAAsC,EAAE,EAClM,SAASijD,GAAGjjD,EAAG,EAAG,CAAE,WAAY,EAAI,EAAE,EAAK,GAAI,CAC7C,GAAIA,IAAM,MAAQ,OAAOA,EAAI,IAC3B,OACF,IAAI,EAAG,EACP,GAAI,OAAOA,GAAK,WAAaA,EAAI,CAACA,CAAC,GAAI2hD,GAAG3hD,CAAC,EACzC,IAAK,EAAI,EAAG,EAAIA,EAAE,OAAQ,EAAI,EAAG,IAC/B,EAAE,KAAK,KAAMA,EAAE,CAAC,EAAG,EAAGA,CAAC,MACtB,CACH,GAAI6hD,GAAG7hD,CAAC,EACN,OACF,MAAM7rC,EAAI,EAAI,OAAO,oBAAoB6rC,CAAC,EAAI,OAAO,KAAKA,CAAC,EAAGxoC,EAAIrD,EAAE,OACpE,IAAInB,EACJ,IAAK,EAAI,EAAG,EAAIwE,EAAG,IACjBxE,EAAImB,EAAE,CAAC,EAAG,EAAE,KAAK,KAAM6rC,EAAEhtC,CAAC,EAAGA,EAAGgtC,CAAC,CACrC,CACF,CACA,SAASkjD,GAAGljD,EAAG,EAAG,CAChB,GAAI6hD,GAAG7hD,CAAC,EACN,OAAO,KACT,EAAI,EAAE,YAAW,EACjB,MAAM,EAAI,OAAO,KAAKA,CAAC,EACvB,IAAI,EAAI,EAAE,OAAQ,EAClB,KAAO,KAAM,GACX,GAAI,EAAI,EAAE,CAAC,EAAG,IAAM,EAAE,YAAW,EAC/B,OAAO,EACX,OAAO,IACT,CACA,MAAMmjD,GAAK,OAAO,WAAa,IAAM,WAAa,OAAO,KAAO,IAAM,KAAO,OAAO,OAAS,IAAM,OAAS,OAAQC,GAAMpjD,GAAM,CAAC4hD,GAAG5hD,CAAC,GAAKA,IAAMmjD,GAChJ,SAASE,IAAK,CACZ,KAAM,CAAE,SAAUrjD,EAAG,cAAe,CAAC,EAAKojD,GAAG,IAAI,GAAK,MAAQ,CAAA,EAAI,EAAI,CAAA,EAAI,EAAI,CAAC,EAAGjvF,IAAM,CACtF,MAAMqD,EAAIwoC,GAAKkjD,GAAG,EAAG/uF,CAAC,GAAKA,EAC3BguF,GAAG,EAAE3qF,CAAC,CAAC,GAAK2qF,GAAG,CAAC,EAAI,EAAE3qF,CAAC,EAAI6rF,GAAG,EAAE7rF,CAAC,EAAG,CAAC,EAAI2qF,GAAG,CAAC,EAAI,EAAE3qF,CAAC,EAAI6rF,GAAG,GAAI,CAAC,EAAI1B,GAAG,CAAC,EAAI,EAAEnqF,CAAC,EAAI,EAAE,MAAK,GAAM,CAAC,GAAK,CAACoqF,GAAG,CAAC,KAAO,EAAEpqF,CAAC,EAAI,EAC3H,EACA,QAAS,EAAI,EAAGrD,EAAI,UAAU,OAAQ,EAAIA,EAAG,IAC3C,UAAU,CAAC,GAAK8uF,GAAG,UAAU,CAAC,EAAG,CAAC,EACpC,OAAO,CACT,CACA,MAAMK,GAAK,CAACtjD,EAAG,EAAG,EAAG,CAAE,WAAY,CAAC,EAAK,CAAA,KAAQijD,GAAG,EAAG,CAAC,EAAG9uF,IAAM,CAC/D,GAAK2tF,GAAG,CAAC,EAAI9hD,EAAE7rC,CAAC,EAAIgtF,GAAG,EAAG,CAAC,EAAInhD,EAAE7rC,CAAC,EAAI,CACxC,EAAG,CAAE,WAAY,CAAC,CAAE,EAAG6rC,GAAIujD,GAAMvjD,IAAOA,EAAE,WAAW,CAAC,IAAM,QAAUA,EAAIA,EAAE,MAAM,CAAC,GAAIA,GAAIwjD,GAAK,CAACxjD,EAAG,EAAG,EAAG,IAAM,CAC9GA,EAAE,UAAY,OAAO,OAAO,EAAE,UAAW,CAAC,EAAGA,EAAE,UAAU,YAAcA,EAAG,OAAO,eAAeA,EAAG,QAAS,CAC1G,MAAO,EAAE,SACb,CAAG,EAAG,GAAK,OAAO,OAAOA,EAAE,UAAW,CAAC,CACvC,EAAGyjD,GAAK,CAACzjD,EAAG,EAAG,EAAG,IAAM,CACtB,IAAI,EAAG7rC,EAAGqD,EACV,MAAMxE,EAAI,CAAA,EACV,GAAI,EAAI,GAAK,CAAA,EAAIgtC,GAAK,KAAM,OAAO,EACnC,EAAG,CACD,IAAK,EAAI,OAAO,oBAAoBA,CAAC,EAAG7rC,EAAI,EAAE,OAAQA,KAAM,GAC1DqD,EAAI,EAAErD,CAAC,GAAI,CAAC,GAAK,EAAEqD,EAAGwoC,EAAG,CAAC,IAAM,CAAChtC,EAAEwE,CAAC,IAAM,EAAEA,CAAC,EAAIwoC,EAAExoC,CAAC,EAAGxE,EAAEwE,CAAC,EAAI,IAChEwoC,EAAI,IAAM,IAAMqhD,GAAGrhD,CAAC,CACtB,OAASA,IAAM,CAAC,GAAK,EAAEA,EAAG,CAAC,IAAMA,IAAM,OAAO,WAC9C,OAAO,CACT,EAAG0jD,GAAK,CAAC1jD,EAAG,EAAG,IAAM,CACnBA,EAAI,OAAOA,CAAC,GAAI,IAAM,QAAU,EAAIA,EAAE,UAAY,EAAIA,EAAE,QAAS,GAAK,EAAE,OACxE,MAAM,EAAIA,EAAE,QAAQ,EAAG,CAAC,EACxB,OAAO,IAAM,IAAM,IAAM,CAC3B,EAAG2jD,GAAM3jD,GAAM,CACb,GAAI,CAACA,EAAG,OAAO,KACf,GAAI2hD,GAAG3hD,CAAC,EAAG,OAAOA,EAClB,IAAI,EAAIA,EAAE,OACV,GAAI,CAACgiD,GAAG,CAAC,EAAG,OAAO,KACnB,MAAM,EAAI,IAAI,MAAM,CAAC,EACrB,KAAO,KAAM,GACX,EAAE,CAAC,EAAIhiD,EAAE,CAAC,EACZ,OAAO,CACT,EAAG4jD,IAAuB5jD,GAAO,GAAMA,GAAK,aAAaA,GAAG,OAAO,WAAa,KAAOqhD,GAAG,UAAU,CAAC,EAAGwC,GAAK,CAAC7jD,EAAG,IAAM,CACrH,MAAMlvC,GAAKkvC,GAAKA,EAAEshD,EAAE,GAAG,KAAKthD,CAAC,EAC7B,IAAIrxC,EACJ,MAAQA,EAAImC,EAAE,KAAI,IAAO,CAACnC,EAAE,MAAQ,CAClC,MAAMwF,EAAIxF,EAAE,MACZ,EAAE,KAAKqxC,EAAG7rC,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CACtB,CACF,EAAG2vF,GAAK,CAAC9jD,EAAG,IAAM,CAChB,IAAI,EACJ,MAAM,EAAI,CAAA,EACV,MAAQ,EAAIA,EAAE,KAAK,CAAC,KAAO,MACzB,EAAE,KAAK,CAAC,EACV,OAAO,CACT,EAAG+jD,GAAKtC,GAAG,iBAAiB,EAAGuC,GAAMhkD,GAAMA,EAAE,YAAW,EAAG,QACzD,wBACA,SAAS/kD,EAAG6V,EAAGnC,EAAG,CAChB,OAAOmC,EAAE,YAAW,EAAKnC,CAC3B,CACF,EAAGs1F,IAAM,CAAC,CAAE,eAAgBjkD,KAAQ,CAAC,EAAG,IAAMA,EAAE,KAAK,EAAG,CAAC,GAAG,OAAO,SAAS,EAAGkkD,GAAKzC,GAAG,QAAQ,EAAG0C,GAAK,CAACnkD,EAAG,IAAM,CAC/G,MAAM,EAAI,OAAO,0BAA0BA,CAAC,EAAG,EAAI,CAAA,EACnDijD,GAAG,EAAG,CAAC,EAAG9uF,IAAM,CACd,IAAIqD,GACHA,EAAI,EAAE,EAAGrD,EAAG6rC,CAAC,KAAO,KAAO,EAAE7rC,CAAC,EAAIqD,GAAK,EAC1C,CAAC,EAAG,OAAO,iBAAiBwoC,EAAG,CAAC,CAClC,EAAGokD,GAAMpkD,GAAM,CACbmkD,GAAGnkD,EAAG,CAAC,EAAG,IAAM,CACd,GAAI8hD,GAAG9hD,CAAC,GAAK,CAAC,YAAa,SAAU,QAAQ,EAAE,QAAQ,CAAC,IAAM,GAC5D,MAAO,GACT,MAAM,EAAIA,EAAE,CAAC,EACb,GAAI8hD,GAAG,CAAC,EAAG,CACT,GAAI,EAAE,WAAa,GAAI,aAAc,EAAG,CACtC,EAAE,SAAW,GACb,MACF,CACA,EAAE,MAAQ,EAAE,IAAM,IAAM,CACtB,MAAM,MAAM,qCAAuC,EAAI,GAAG,CAC5D,EACF,CACF,CAAC,CACH,EAAGuC,GAAK,CAACrkD,EAAG,IAAM,CAChB,MAAM,EAAI,CAAA,EAAI,EAAK,GAAM,CACvB,EAAE,QAAS7rC,GAAM,CACf,EAAEA,CAAC,EAAI,EACT,CAAC,CACH,EACA,OAAOwtF,GAAG3hD,CAAC,EAAI,EAAEA,CAAC,EAAI,EAAE,OAAOA,CAAC,EAAE,MAAM,CAAC,CAAC,EAAG,CAC/C,EAAGskD,GAAK,IAAM,CACd,EAAGC,GAAK,CAACvkD,EAAG,IAAMA,GAAK,MAAQ,OAAO,SAASA,EAAI,CAACA,CAAC,EAAIA,EAAI,EAC7D,SAASwkD,GAAGxkD,EAAG,CACb,MAAO,CAAC,EAAEA,GAAK8hD,GAAG9hD,EAAE,MAAM,GAAKA,EAAEuhD,EAAE,IAAM,YAAcvhD,EAAEshD,EAAE,EAC7D,CACA,MAAMmD,GAAMzkD,GAAM,CAChB,MAAM,EAAI,IAAI,MAAM,EAAE,EAAG,EAAI,CAAC,EAAG,IAAM,CACrC,GAAIiiD,GAAG,CAAC,EAAG,CACT,GAAI,EAAE,QAAQ,CAAC,GAAK,EAClB,OACF,GAAIJ,GAAG,CAAC,EACN,OAAO,EACT,GAAI,EAAE,WAAY,GAAI,CACpB,EAAE,CAAC,EAAI,EACP,MAAM1tF,EAAIwtF,GAAG,CAAC,EAAI,CAAA,EAAK,CAAA,EACvB,OAAOsB,GAAG,EAAG,CAACzrF,EAAGxE,IAAM,CACrB,MAAM,EAAI,EAAEwE,EAAG,EAAI,CAAC,EACpB,CAACoqF,GAAG,CAAC,IAAMztF,EAAEnB,CAAC,EAAI,EACpB,CAAC,EAAG,EAAE,CAAC,EAAI,OAAQmB,CACrB,CACF,CACA,OAAO,CACT,EACA,OAAO,EAAE6rC,EAAG,CAAC,CACf,EAAG0kD,GAAKjD,GAAG,eAAe,EAAGkD,GAAM3kD,GAAMA,IAAMiiD,GAAGjiD,CAAC,GAAK8hD,GAAG9hD,CAAC,IAAM8hD,GAAG9hD,EAAE,IAAI,GAAK8hD,GAAG9hD,EAAE,KAAK,EAAG4kD,IAAM,CAAC5kD,EAAG,IAAMA,EAAI,aAAe,GAAK,CAAC,EAAG,KAAOmjD,GAAG,iBAAiB,UAAW,CAAC,CAAE,OAAQ,EAAG,KAAMhvF,KAAQ,CACzM,IAAMgvF,IAAMhvF,IAAM,GAAK,EAAE,QAAU,EAAE,QAAO,CAC9C,EAAG,EAAE,EAAI,GAAM,CACb,EAAE,KAAK,CAAC,EAAGgvF,GAAG,YAAY,EAAG,GAAG,CAClC,IAAI,SAAS,KAAK,OAAM,CAAE,GAAI,CAAA,CAAE,EAAK,GAAM,WAAW,CAAC,GACrD,OAAO,cAAgB,WACvBrB,GAAGqB,GAAG,WAAW,CACnB,EAAG0B,GAAK,OAAO,eAAiB,IAAM,eAAe,KAAK1B,EAAE,EAAI,OAAO,QAAU,KAAO,QAAQ,UAAYyB,GAAIE,GAAM9kD,GAAMA,GAAK,MAAQ8hD,GAAG9hD,EAAEshD,EAAE,CAAC,EAAGyD,GAAI,CACtJ,QAASpD,GACT,cAAeI,GACf,SAAUF,GACV,WAAYa,GACZ,kBAAmBvyE,GACnB,SAAUnI,GACV,SAAUg6E,GACV,UAAWE,GACX,SAAUD,GACV,cAAeE,GACf,cAAeC,GACf,iBAAkBQ,GAClB,UAAWC,GACX,WAAYC,GACZ,UAAWC,GACX,YAAanB,GACb,OAAQS,GACR,OAAQC,GACR,OAAQC,GACR,SAAU2B,GACV,WAAYpC,GACZ,SAAUW,GACV,kBAAmBE,GACnB,aAAciB,GACd,WAAYpB,GACZ,QAASS,GACT,MAAOI,GACP,OAAQC,GACR,KAAMN,GACN,SAAUO,GACV,SAAUC,GACV,aAAcC,GACd,OAAQjC,GACR,WAAYC,GACZ,SAAUiC,GACV,QAASC,GACT,aAAcE,GACd,SAAUC,GACV,WAAYC,GACZ,eAAgBE,GAChB,WAAYA,GAEZ,kBAAmBE,GACnB,cAAeC,GACf,YAAaC,GACb,YAAaL,GACb,KAAMM,GACN,eAAgBC,GAChB,QAASrB,GACT,OAAQC,GACR,iBAAkBC,GAClB,oBAAqBoB,GACrB,aAAcC,GACd,UAAWC,GACX,WAAYC,GACZ,aAAcC,GACd,KAAMC,GACN,WAAYC,EACd,EACA,SAASE,GAAGhlD,EAAG,EAAG,EAAG,EAAG,EAAG,CACzB,MAAM,KAAK,IAAI,EAAG,MAAM,kBAAoB,MAAM,kBAAkB,KAAM,KAAK,WAAW,EAAI,KAAK,MAAQ,IAAI,QAAQ,MAAO,KAAK,QAAUA,EAAG,KAAK,KAAO,aAAc,IAAM,KAAK,KAAO,GAAI,IAAM,KAAK,OAAS,GAAI,IAAM,KAAK,QAAU,GAAI,IAAM,KAAK,SAAW,EAAG,KAAK,OAAS,EAAE,OAAS,EAAE,OAAS,KAChT,CACA+kD,GAAE,SAASC,GAAI,MAAO,CACpB,OAAQ,UAAW,CACjB,MAAO,CAEL,QAAS,KAAK,QACd,KAAM,KAAK,KAEX,YAAa,KAAK,YAClB,OAAQ,KAAK,OAEb,SAAU,KAAK,SACf,WAAY,KAAK,WACjB,aAAc,KAAK,aACnB,MAAO,KAAK,MAEZ,OAAQD,GAAE,aAAa,KAAK,MAAM,EAClC,KAAM,KAAK,KACX,OAAQ,KAAK,MACnB,CACE,CACF,CAAC,EACD,MAAME,GAAKD,GAAG,UAAWE,GAAK,CAAA,EAC9B,CACE,uBACA,iBACA,eACA,YACA,cACA,4BACA,iBACA,mBACA,kBACA,eACA,kBACA,iBAEF,EAAE,QAASllD,GAAM,CACfklD,GAAGllD,CAAC,EAAI,CAAE,MAAOA,CAAC,CACpB,CAAC,EACD,OAAO,iBAAiBglD,GAAIE,EAAE,EAC9B,OAAO,eAAeD,GAAI,eAAgB,CAAE,MAAO,EAAE,CAAE,EACvDD,GAAG,KAAO,CAAChlD,EAAG,EAAG,EAAG,EAAG,EAAG7rC,IAAM,CAC9B,MAAMqD,EAAI,OAAO,OAAOytF,EAAE,EAC1BF,GAAE,aAAa/kD,EAAGxoC,EAAG,SAAS,EAAG,CAC/B,OAAO,IAAM,MAAM,SACrB,EAAIiF,GAAMA,IAAM,cAAc,EAC9B,MAAMzJ,EAAIgtC,GAAKA,EAAE,QAAUA,EAAE,QAAU,QAAS,EAAI,GAAK,MAAQA,EAAIA,EAAE,KAAO,EAC9E,OAAOglD,GAAG,KAAKxtF,EAAGxE,EAAG,EAAG,EAAG,EAAG,CAAC,EAAGgtC,GAAKxoC,EAAE,OAAS,MAAQ,OAAO,eAAeA,EAAG,QAAS,CAAE,MAAOwoC,EAAG,aAAc,EAAE,CAAE,EAAGxoC,EAAE,KAAOwoC,GAAKA,EAAE,MAAQ,QAAS7rC,GAAK,OAAO,OAAOqD,EAAGrD,CAAC,EAAGqD,CAC1L,EACA,MAAM2tF,GAAK,KACX,SAASC,GAAGplD,EAAG,CACb,OAAO+kD,GAAE,cAAc/kD,CAAC,GAAK+kD,GAAE,QAAQ/kD,CAAC,CAC1C,CACA,SAASqlD,GAAGrlD,EAAG,CACb,OAAO+kD,GAAE,SAAS/kD,EAAG,IAAI,EAAIA,EAAE,MAAM,EAAG,EAAE,EAAIA,CAChD,CACA,SAASslD,GAAGtlD,EAAG,EAAG,EAAG,CACnB,OAAOA,EAAIA,EAAE,OAAO,CAAC,EAAE,IAAI,SAASrxC,EAAGwF,EAAG,CACxC,OAAOxF,EAAI02F,GAAG12F,CAAC,EAAG,CAAC,GAAKwF,EAAI,IAAMxF,EAAI,IAAMA,CAC9C,CAAC,EAAE,KAAK,EAAI,IAAM,EAAE,EAAI,CAC1B,CACA,SAAS42F,GAAGvlD,EAAG,CACb,OAAO+kD,GAAE,QAAQ/kD,CAAC,GAAK,CAACA,EAAE,KAAKolD,EAAE,CACnC,CACA,MAAMI,GAAKT,GAAE,aAAaA,GAAG,CAAA,EAAI,KAAM,SAASjpG,EAAG,CACjD,MAAO,WAAW,KAAKA,CAAC,CAC1B,CAAC,EACD,SAAS2pG,GAAGzlD,EAAG,EAAG,EAAG,CACnB,GAAI,CAAC+kD,GAAE,SAAS/kD,CAAC,EACf,MAAM,IAAI,UAAU,0BAA0B,EAChD,EAAI,GAAK,IAAI,SAAY,EAAI+kD,GAAE,aAAa,EAAG,CAC7C,WAAY,GACZ,KAAM,GACN,QAAS,EACb,EAAK,GAAI,SAAS90E,EAAGtzB,EAAG,CACpB,MAAO,CAACooG,GAAE,YAAYpoG,EAAEszB,CAAC,CAAC,CAC5B,CAAC,EACD,MAAM,EAAI,EAAE,WAAY,EAAI,EAAE,SAAW,EAAG9b,EAAI,EAAE,KAAMqD,EAAI,EAAE,QAASzc,GAAK,EAAE,MAAQ,OAAO,KAAO,KAAO,OAASgqG,GAAE,oBAAoB,CAAC,EAC3I,GAAI,CAACA,GAAE,WAAW,CAAC,EACjB,MAAM,IAAI,UAAU,4BAA4B,EAClD,SAAStoF,EAAE,EAAG,CACZ,GAAI,IAAM,KAAM,MAAO,GACvB,GAAIsoF,GAAE,OAAO,CAAC,EACZ,OAAO,EAAE,YAAW,EACtB,GAAIA,GAAE,UAAU,CAAC,EACf,OAAO,EAAE,SAAQ,EACnB,GAAI,CAAChqG,GAAKgqG,GAAE,OAAO,CAAC,EAClB,MAAM,IAAIC,GAAG,8CAA8C,EAC7D,OAAOD,GAAE,cAAc,CAAC,GAAKA,GAAE,aAAa,CAAC,EAAIhqG,GAAK,OAAO,MAAQ,WAAa,IAAI,KAAK,CAAC,CAAC,CAAC,EAAI,OAAO,KAAK,CAAC,EAAI,CACrH,CACA,SAAS,EAAE,EAAGk1B,EAAGtzB,EAAG,CAClB,IAAI4U,EAAI,EACR,GAAI,GAAK,CAAC5U,GAAK,OAAO,GAAK,UACzB,GAAIooG,GAAE,SAAS90E,EAAG,IAAI,EACpBA,EAAI,EAAIA,EAAIA,EAAE,MAAM,EAAG,EAAE,EAAG,EAAI,KAAK,UAAU,CAAC,UACzC80E,GAAE,QAAQ,CAAC,GAAKQ,GAAG,CAAC,IAAMR,GAAE,WAAW,CAAC,GAAKA,GAAE,SAAS90E,EAAG,IAAI,KAAO1e,EAAIwzF,GAAE,QAAQ,CAAC,GAC5F,OAAO90E,EAAIo1E,GAAGp1E,CAAC,EAAG1e,EAAE,QAAQ,SAASN,EAAGuoF,EAAG,CACzC,EAAEuL,GAAE,YAAY9zF,CAAC,GAAKA,IAAM,OAAS,EAAE,OAErCuG,IAAM,GAAK8tF,GAAG,CAACr1E,CAAC,EAAGupE,EAAGrlF,CAAC,EAAIqD,IAAM,KAAOyY,EAAIA,EAAI,KAChDxT,EAAExL,CAAC,CACf,CACQ,CAAC,EAAG,GAER,OAAOm0F,GAAG,CAAC,EAAI,IAAM,EAAE,OAAOE,GAAG3oG,EAAGszB,EAAG9b,CAAC,EAAGsI,EAAE,CAAC,CAAC,EAAG,GACpD,CACA,MAAMnC,EAAI,CAAA,EAAIvJ,EAAI,OAAO,OAAOy0F,GAAI,CAClC,eAAgB,EAChB,aAAc/oF,EACd,YAAa2oF,EACjB,CAAG,EACD,SAASnvF,EAAE,EAAGga,EAAG,CACf,GAAI,CAAC80E,GAAE,YAAY,CAAC,EAAG,CACrB,GAAIzqF,EAAE,QAAQ,CAAC,IAAM,GACnB,MAAM,MAAM,kCAAoC2V,EAAE,KAAK,GAAG,CAAC,EAC7D3V,EAAE,KAAK,CAAC,EAAGyqF,GAAE,QAAQ,EAAG,SAASxzF,EAAG0D,EAAG,EACpC,EAAE8vF,GAAE,YAAYxzF,CAAC,GAAKA,IAAM,OAAS,EAAE,KACtC,EACAA,EACAwzF,GAAE,SAAS9vF,CAAC,EAAIA,EAAE,KAAI,EAAKA,EAC3Bgb,EACAlf,CACV,KAAe,IAAMkF,EAAE1E,EAAG0e,EAAIA,EAAE,OAAOhb,CAAC,EAAI,CAACA,CAAC,CAAC,CACzC,CAAC,EAAGqF,EAAE,IAAG,CACX,CACF,CACA,GAAI,CAACyqF,GAAE,SAAS/kD,CAAC,EACf,MAAM,IAAI,UAAU,wBAAwB,EAC9C,OAAO/pC,EAAE+pC,CAAC,EAAG,CACf,CACA,SAAS0lD,GAAG1lD,EAAG,CACb,MAAM,EAAI,CACR,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,MAAO,IACP,MAAO,IACX,EACE,OAAO,mBAAmBA,CAAC,EAAE,QAAQ,mBAAoB,SAASlvC,EAAG,CACnE,OAAO,EAAEA,CAAC,CACZ,CAAC,CACH,CACA,SAAS60F,GAAG3lD,EAAG,EAAG,CAChB,KAAK,OAAS,GAAIA,GAAKylD,GAAGzlD,EAAG,KAAM,CAAC,CACtC,CACA,MAAM4lD,GAAKD,GAAG,UACdC,GAAG,OAAS,SAAS9pG,EAAGb,EAAG,CACzB,KAAK,OAAO,KAAK,CAACa,EAAGb,CAAC,CAAC,CACzB,EACA2qG,GAAG,SAAW,SAAS9pG,EAAG,CACxB,MAAMb,EAAIa,EAAI,SAASgV,EAAG,CACxB,OAAOhV,EAAE,KAAK,KAAMgV,EAAG40F,EAAE,CAC3B,EAAIA,GACJ,OAAO,KAAK,OAAO,IAAI,SAAS/2F,EAAG,CACjC,OAAO1T,EAAE0T,EAAE,CAAC,CAAC,EAAI,IAAM1T,EAAE0T,EAAE,CAAC,CAAC,CAC/B,EAAG,EAAE,EAAE,KAAK,GAAG,CACjB,EACA,SAASk3F,GAAG7lD,EAAG,CACb,OAAO,mBAAmBA,CAAC,EAAE,QAAQ,QAAS,GAAG,EAAE,QAAQ,OAAQ,GAAG,EAAE,QAAQ,QAAS,GAAG,EAAE,QAAQ,OAAQ,GAAG,CACnH,CACA,SAAS8lD,GAAG9lD,EAAG,EAAG,EAAG,CACnB,GAAI,CAAC,EACH,OAAOA,EACT,MAAM,EAAI,GAAK,EAAE,QAAU6lD,GAC3Bd,GAAE,WAAW,CAAC,IAAM,EAAI,CACtB,UAAW,CACf,GACE,MAAM,EAAI,GAAK,EAAE,UACjB,IAAI5wF,EACJ,GAAI,EAAIA,EAAI,EAAE,EAAG,CAAC,EAAIA,EAAI4wF,GAAE,kBAAkB,CAAC,EAAI,EAAE,SAAQ,EAAK,IAAIY,GAAG,EAAG,CAAC,EAAE,SAAS,CAAC,EAAGxxF,EAAG,CAC7F,MAAMqD,EAAIwoC,EAAE,QAAQ,GAAG,EACvBxoC,IAAM,KAAOwoC,EAAIA,EAAE,MAAM,EAAGxoC,CAAC,GAAIwoC,IAAMA,EAAE,QAAQ,GAAG,IAAM,GAAK,IAAM,KAAO7rC,CAC9E,CACA,OAAO6rC,CACT,CACA,MAAM+lD,EAAG,CACP,aAAc,CACZ,KAAK,SAAW,CAAA,CAClB,CASA,IAAI,EAAG,EAAG,EAAG,CACX,OAAO,KAAK,SAAS,KAAK,CACxB,UAAW,EACX,SAAU,EACV,YAAa,EAAI,EAAE,YAAc,GACjC,QAAS,EAAI,EAAE,QAAU,IAC/B,CAAK,EAAG,KAAK,SAAS,OAAS,CAC7B,CAQA,MAAM,EAAG,CACP,KAAK,SAAS,CAAC,IAAM,KAAK,SAAS,CAAC,EAAI,KAC1C,CAMA,OAAQ,CACN,KAAK,WAAa,KAAK,SAAW,CAAA,EACpC,CAWA,QAAQ,EAAG,CACThB,GAAE,QAAQ,KAAK,SAAU,SAASj0F,EAAG,CACnCA,IAAM,MAAQ,EAAEA,CAAC,CACnB,CAAC,CACH,CACF,CACA,MAAMk1F,GAAK,CACT,kBAAmB,GACnB,kBAAmB,GACnB,oBAAqB,EACvB,EAAGC,GAAK,OAAO,gBAAkB,IAAM,gBAAkBN,GAAIO,GAAK,OAAO,SAAW,IAAM,SAAW,KAAMC,GAAK,OAAO,KAAO,IAAM,KAAO,KAAMC,GAAK,CACpJ,UAAW,GACX,QAAS,CACP,gBAAiBH,GACjB,SAAUC,GACV,KAAMC,EACV,EACE,UAAW,CAAC,OAAQ,QAAS,OAAQ,OAAQ,MAAO,MAAM,CAC5D,EAAGE,GAAK,OAAO,OAAS,KAAO,OAAO,SAAW,IAAKC,GAAK,OAAO,WAAa,UAAY,WAAa,OAAQC,GAAKF,KAAO,CAACC,IAAM,CAAC,cAAe,eAAgB,IAAI,EAAE,QAAQA,GAAG,OAAO,EAAI,GAAIE,GAAK,OAAO,kBAAoB,KACnO,gBAAgB,mBAAqB,OAAO,KAAK,eAAiB,WAAYC,GAAKJ,IAAM,OAAO,SAAS,MAAQ,mBAAoBK,GAAqB,OAAO,OAAuB,OAAO,eAAe,CAC5M,UAAW,KACX,cAAeL,GACf,sBAAuBE,GACvB,+BAAgCC,GAChC,UAAWF,GACX,OAAQG,EACV,EAAG,OAAO,YAAa,CAAE,MAAO,QAAQ,CAAE,CAAC,EAAGE,GAAK,CACjD,GAAGD,GACH,GAAGN,EACL,EACA,SAASQ,GAAG5mD,EAAG,EAAG,CAChB,OAAOylD,GAAGzlD,EAAG,IAAI2mD,GAAG,QAAQ,gBAAmB,CAC7C,QAAS,SAAS,EAAG,EAAG,EAAGxyF,EAAG,CAC5B,OAAOwyF,GAAG,QAAU5B,GAAE,SAAS,CAAC,GAAK,KAAK,OAAO,EAAG,EAAE,SAAS,QAAQ,CAAC,EAAG,IAAM5wF,EAAE,eAAe,MAAM,KAAM,SAAS,CACzH,EACA,GAAG,CACP,CAAG,CACH,CACA,SAAS0yF,GAAG7mD,EAAG,CACb,OAAO+kD,GAAE,SAAS,gBAAiB/kD,CAAC,EAAE,IAAK,GAAM,EAAE,CAAC,IAAM,KAAO,GAAK,EAAE,CAAC,GAAK,EAAE,CAAC,CAAC,CACpF,CACA,SAAS8mD,GAAG9mD,EAAG,CACb,MAAM,EAAI,CAAA,EAAI,EAAI,OAAO,KAAKA,CAAC,EAC/B,IAAI,EACJ,MAAM,EAAI,EAAE,OACZ,IAAI7rC,EACJ,IAAK,EAAI,EAAG,EAAI,EAAG,IACjBA,EAAI,EAAE,CAAC,EAAG,EAAEA,CAAC,EAAI6rC,EAAE7rC,CAAC,EACtB,OAAO,CACT,CACA,SAASoc,GAAGyvB,EAAG,CACb,SAAS,EAAE,EAAG,EAAG,EAAG7rC,EAAG,CACrB,IAAIqD,EAAI,EAAErD,GAAG,EACb,GAAIqD,IAAM,YAAa,MAAO,GAC9B,MAAMxE,EAAI,OAAO,SAAS,CAACwE,CAAC,EAAG,EAAIrD,GAAK,EAAE,OAC1C,OAAOqD,EAAI,CAACA,GAAKutF,GAAE,QAAQ,CAAC,EAAI,EAAE,OAASvtF,EAAG,GAAKutF,GAAE,WAAW,EAAGvtF,CAAC,EAAI,EAAEA,CAAC,EAAI,CAAC,EAAEA,CAAC,EAAG,CAAC,EAAI,EAAEA,CAAC,EAAI,EAAG,CAACxE,KAAO,CAAC,EAAEwE,CAAC,GAAK,CAACutF,GAAE,SAAS,EAAEvtF,CAAC,CAAC,KAAO,EAAEA,CAAC,EAAI,CAAA,GAAK,EAAE,EAAG,EAAG,EAAEA,CAAC,EAAGrD,CAAC,GAAK4wF,GAAE,QAAQ,EAAEvtF,CAAC,CAAC,IAAM,EAAEA,CAAC,EAAIsvF,GAAG,EAAEtvF,CAAC,CAAC,GAAI,CAACxE,EACtN,CACA,GAAI+xF,GAAE,WAAW/kD,CAAC,GAAK+kD,GAAE,WAAW/kD,EAAE,OAAO,EAAG,CAC9C,MAAM,EAAI,CAAA,EACV,OAAO+kD,GAAE,aAAa/kD,EAAG,CAAC,EAAG,IAAM,CACjC,EAAE6mD,GAAG,CAAC,EAAG,EAAG,EAAG,CAAC,CAClB,CAAC,EAAG,CACN,CACA,OAAO,IACT,CACA,SAASE,GAAG/mD,EAAG,EAAG,EAAG,CACnB,GAAI+kD,GAAE,SAAS/kD,CAAC,EACd,GAAI,CACF,OAAQ,GAAK,KAAK,OAAOA,CAAC,EAAG+kD,GAAE,KAAK/kD,CAAC,CACvC,OAAS,EAAG,CACV,GAAI,EAAE,OAAS,cACb,MAAM,CACV,CACF,OAAQ,GAAK,KAAK,WAAWA,CAAC,CAChC,CACA,MAAMgnD,GAAK,CACT,aAAchB,GACd,QAAS,CAAC,MAAO,OAAQ,OAAO,EAChC,iBAAkB,CAAC,SAASlqG,EAAGb,EAAG,CAChC,MAAM6V,EAAI7V,EAAE,eAAc,GAAM,GAAI0T,EAAImC,EAAE,QAAQ,kBAAkB,EAAI,GAAIqD,EAAI4wF,GAAE,SAASjpG,CAAC,EAC5F,GAAIqY,GAAK4wF,GAAE,WAAWjpG,CAAC,IAAMA,EAAI,IAAI,SAASA,CAAC,GAAIipG,GAAE,WAAWjpG,CAAC,EAC/D,OAAO6S,EAAI,KAAK,UAAU4hB,GAAGz0B,CAAC,CAAC,EAAIA,EACrC,GAAIipG,GAAE,cAAcjpG,CAAC,GAAKipG,GAAE,SAASjpG,CAAC,GAAKipG,GAAE,SAASjpG,CAAC,GAAKipG,GAAE,OAAOjpG,CAAC,GAAKipG,GAAE,OAAOjpG,CAAC,GAAKipG,GAAE,iBAAiBjpG,CAAC,EAC5G,OAAOA,EACT,GAAIipG,GAAE,kBAAkBjpG,CAAC,EACvB,OAAOA,EAAE,OACX,GAAIipG,GAAE,kBAAkBjpG,CAAC,EACvB,OAAOb,EAAE,eAAe,kDAAmD,EAAE,EAAGa,EAAE,SAAQ,EAC5F,IAAIkX,EACJ,GAAImB,EAAG,CACL,GAAIrD,EAAE,QAAQ,mCAAmC,EAAI,GACnD,OAAO81F,GAAG9qG,EAAG,KAAK,cAAc,EAAE,SAAQ,EAC5C,IAAKkX,EAAI+xF,GAAE,WAAWjpG,CAAC,IAAMgV,EAAE,QAAQ,qBAAqB,EAAI,GAAI,CAClE,MAAM/V,EAAI,KAAK,KAAO,KAAK,IAAI,SAC/B,OAAO0qG,GACLzyF,EAAI,CAAE,UAAWlX,CAAC,EAAKA,EACvBf,GAAK,IAAIA,EACT,KAAK,cACf,CACM,CACF,CACA,OAAOoZ,GAAKxF,GAAK1T,EAAE,eAAe,mBAAoB,EAAE,EAAG8rG,GAAGjrG,CAAC,GAAKA,CACtE,CAAC,EACD,kBAAmB,CAAC,SAASA,EAAG,CAC9B,MAAMb,EAAI,KAAK,cAAgB+rG,GAAG,aAAcl2F,EAAI7V,GAAKA,EAAE,kBAAmB0T,EAAI,KAAK,eAAiB,OACxG,GAAIo2F,GAAE,WAAWjpG,CAAC,GAAKipG,GAAE,iBAAiBjpG,CAAC,EACzC,OAAOA,EACT,GAAIA,GAAKipG,GAAE,SAASjpG,CAAC,IAAMgV,GAAK,CAAC,KAAK,cAAgBnC,GAAI,CACxD,MAAM6I,EAAI,EAAEvc,GAAKA,EAAE,oBAAsB0T,EACzC,GAAI,CACF,OAAO,KAAK,MAAM7S,EAAG,KAAK,YAAY,CACxC,OAASkX,EAAG,CACV,GAAIwE,EACF,MAAMxE,EAAE,OAAS,cAAgBgyF,GAAG,KAAKhyF,EAAGgyF,GAAG,iBAAkB,KAAM,KAAM,KAAK,QAAQ,EAAIhyF,CAClG,CACF,CACA,OAAOlX,CACT,CAAC,EAKD,QAAS,EACT,eAAgB,aAChB,eAAgB,eAChB,iBAAkB,GAClB,cAAe,GACf,IAAK,CACH,SAAU6qG,GAAG,QAAQ,SACrB,KAAMA,GAAG,QAAQ,IACrB,EACE,eAAgB,SAAS7qG,EAAG,CAC1B,OAAOA,GAAK,KAAOA,EAAI,GACzB,EACA,QAAS,CACP,OAAQ,CACN,OAAQ,oCACR,eAAgB,MACtB,CACA,CACA,EACAipG,GAAE,QAAQ,CAAC,SAAU,MAAO,OAAQ,OAAQ,MAAO,OAAO,EAAI/kD,GAAM,CAClEgnD,GAAG,QAAQhnD,CAAC,EAAI,CAAA,CAClB,CAAC,EACD,MAAMinD,GAAKlC,GAAE,YAAY,CACvB,MACA,gBACA,iBACA,eACA,OACA,UACA,OACA,OACA,oBACA,sBACA,gBACA,WACA,eACA,sBACA,UACA,cACA,YACF,CAAC,EAAGmC,GAAMlnD,GAAM,CACd,MAAM,EAAI,CAAA,EACV,IAAI,EAAG,EAAG,EACV,OAAOA,GAAKA,EAAE,MAAM;AAAA,CACrB,EAAE,QAAQ,SAAS,EAAG,CACnB,EAAI,EAAE,QAAQ,GAAG,EAAG,EAAI,EAAE,UAAU,EAAG,CAAC,EAAE,KAAI,EAAG,cAAe,EAAI,EAAE,UAAU,EAAI,CAAC,EAAE,KAAI,EAAI,EAAE,CAAC,GAAK,EAAE,CAAC,GAAKinD,GAAG,CAAC,KAAO,IAAM,aAAe,EAAE,CAAC,EAAI,EAAE,CAAC,EAAE,KAAK,CAAC,EAAI,EAAE,CAAC,EAAI,CAAC,CAAC,EAAI,EAAE,CAAC,EAAI,EAAE,CAAC,EAAI,EAAE,CAAC,EAAI,KAAO,EAAI,EACpN,CAAC,EAAG,CACN,EAAGE,GAAK,OAAO,WAAW,EAC1B,SAASC,GAAGpnD,EAAG,CACb,OAAOA,GAAK,OAAOA,CAAC,EAAE,KAAI,EAAG,YAAW,CAC1C,CACA,SAASqnD,GAAGrnD,EAAG,CACb,OAAOA,IAAM,IAAMA,GAAK,KAAOA,EAAI+kD,GAAE,QAAQ/kD,CAAC,EAAIA,EAAE,IAAIqnD,EAAE,EAAI,OAAOrnD,CAAC,CACxE,CACA,SAASsnD,GAAGtnD,EAAG,CACb,MAAM,EAAoB,OAAO,OAAO,IAAI,EAAG,EAAI,mCACnD,IAAI,EACJ,KAAO,EAAI,EAAE,KAAKA,CAAC,GACjB,EAAE,EAAE,CAAC,CAAC,EAAI,EAAE,CAAC,EACf,OAAO,CACT,CACA,MAAMunD,GAAMvnD,GAAM,iCAAiC,KAAKA,EAAE,MAAM,EAChE,SAASwnD,GAAGxnD,EAAG,EAAG,EAAG,EAAG,EAAG,CACzB,GAAI+kD,GAAE,WAAW,CAAC,EAChB,OAAO,EAAE,KAAK,KAAM,EAAG,CAAC,EAC1B,GAAI,IAAM,EAAI,GAAI,CAAC,CAACA,GAAE,SAAS,CAAC,EAAG,CACjC,GAAIA,GAAE,SAAS,CAAC,EACd,OAAO,EAAE,QAAQ,CAAC,IAAM,GAC1B,GAAIA,GAAE,SAAS,CAAC,EACd,OAAO,EAAE,KAAK,CAAC,CACnB,CACF,CACA,SAAS0C,GAAGznD,EAAG,CACb,OAAOA,EAAE,KAAI,EAAG,YAAW,EAAG,QAAQ,kBAAmB,CAAC,EAAG,EAAG,IAAM,EAAE,YAAW,EAAK,CAAC,CAC3F,CACA,SAAS0nD,GAAG1nD,EAAG,EAAG,CAChB,MAAM,EAAI+kD,GAAE,YAAY,IAAM,CAAC,EAC/B,CAAC,MAAO,MAAO,KAAK,EAAE,QAAS,GAAM,CACnC,OAAO,eAAe/kD,EAAG,EAAI,EAAG,CAC9B,MAAO,SAAS,EAAG7rC,EAAGqD,EAAG,CACvB,OAAO,KAAK,CAAC,EAAE,KAAK,KAAM,EAAG,EAAGrD,EAAGqD,CAAC,CACtC,EACA,aAAc,EACpB,CAAK,CACH,CAAC,CACH,CACA,IAAImwF,GAAK,KAAM,CACb,YAAY7rG,EAAG,CACbA,GAAK,KAAK,IAAIA,CAAC,CACjB,CACA,IAAIA,EAAGb,EAAG6V,EAAG,CACX,MAAMnC,EAAI,KACV,SAASwF,EAAE,EAAGpZ,EAAG0hB,EAAG,CAClB,MAAM,EAAI2qF,GAAGrsG,CAAC,EACd,GAAI,CAAC,EACH,MAAM,IAAI,MAAM,wCAAwC,EAC1D,MAAMuf,EAAIyqF,GAAE,QAAQp2F,EAAG,CAAC,GACvB,CAAC2L,GAAK3L,EAAE2L,CAAC,IAAM,QAAUmC,IAAM,IAAMA,IAAM,QAAU9N,EAAE2L,CAAC,IAAM,MAAQ3L,EAAE2L,GAAKvf,CAAC,EAAIssG,GAAG,CAAC,EACzF,CACA,MAAM,EAAI,CAAC,EAAGtsG,IAAMgqG,GAAE,QAAQ,EAAG,CAACtoF,EAAG,IAAMtI,EAAEsI,EAAG,EAAG1hB,CAAC,CAAC,EACrD,GAAIgqG,GAAE,cAAcjpG,CAAC,GAAKA,aAAa,KAAK,YAC1C,EAAEA,EAAGb,CAAC,UACC8pG,GAAE,SAASjpG,CAAC,IAAMA,EAAIA,EAAE,SAAW,CAACyrG,GAAGzrG,CAAC,EAC/C,EAAEorG,GAAGprG,CAAC,EAAGb,CAAC,UACH8pG,GAAE,SAASjpG,CAAC,GAAKipG,GAAE,WAAWjpG,CAAC,EAAG,CACzC,IAAI,EAAI,GAAIf,EAAG0hB,EACf,UAAW,KAAK3gB,EAAG,CACjB,GAAI,CAACipG,GAAE,QAAQ,CAAC,EACd,MAAM,UAAU,8CAA8C,EAChE,EAAEtoF,EAAI,EAAE,CAAC,CAAC,GAAK1hB,EAAI,EAAE0hB,CAAC,GAAKsoF,GAAE,QAAQhqG,CAAC,EAAI,CAAC,GAAGA,EAAG,EAAE,CAAC,CAAC,EAAI,CAACA,EAAG,EAAE,CAAC,CAAC,EAAI,EAAE,CAAC,CAC1E,CACA,EAAE,EAAGE,CAAC,CACR,MACEa,GAAK,MAAQqY,EAAElZ,EAAGa,EAAGgV,CAAC,EACxB,OAAO,IACT,CACA,IAAIhV,EAAGb,EAAG,CACR,GAAIa,EAAIsrG,GAAGtrG,CAAC,EAAGA,EAAG,CAChB,MAAMgV,EAAIi0F,GAAE,QAAQ,KAAMjpG,CAAC,EAC3B,GAAIgV,EAAG,CACL,MAAMnC,EAAI,KAAKmC,CAAC,EAChB,GAAI,CAAC7V,EACH,OAAO0T,EACT,GAAI1T,IAAM,GACR,OAAOqsG,GAAG34F,CAAC,EACb,GAAIo2F,GAAE,WAAW9pG,CAAC,EAChB,OAAOA,EAAE,KAAK,KAAM0T,EAAGmC,CAAC,EAC1B,GAAIi0F,GAAE,SAAS9pG,CAAC,EACd,OAAOA,EAAE,KAAK0T,CAAC,EACjB,MAAM,IAAI,UAAU,wCAAwC,CAC9D,CACF,CACF,CACA,IAAI7S,EAAGb,EAAG,CACR,GAAIa,EAAIsrG,GAAGtrG,CAAC,EAAGA,EAAG,CAChB,MAAMgV,EAAIi0F,GAAE,QAAQ,KAAMjpG,CAAC,EAC3B,MAAO,CAAC,EAAEgV,GAAK,KAAKA,CAAC,IAAM,SAAW,CAAC7V,GAAKusG,GAAG,KAAM,KAAK12F,CAAC,EAAGA,EAAG7V,CAAC,GACpE,CACA,MAAO,EACT,CACA,OAAOa,EAAGb,EAAG,CACX,MAAM6V,EAAI,KACV,IAAInC,EAAI,GACR,SAASwF,EAAE,EAAG,CACZ,GAAI,EAAIizF,GAAG,CAAC,EAAG,EAAG,CAChB,MAAM,EAAIrC,GAAE,QAAQj0F,EAAG,CAAC,EACxB,IAAM,CAAC7V,GAAKusG,GAAG12F,EAAGA,EAAE,CAAC,EAAG,EAAG7V,CAAC,KAAO,OAAO6V,EAAE,CAAC,EAAGnC,EAAI,GACtD,CACF,CACA,OAAOo2F,GAAE,QAAQjpG,CAAC,EAAIA,EAAE,QAAQqY,CAAC,EAAIA,EAAErY,CAAC,EAAG6S,CAC7C,CACA,MAAM7S,EAAG,CACP,MAAMb,EAAI,OAAO,KAAK,IAAI,EAC1B,IAAI6V,EAAI7V,EAAE,OAAQ0T,EAAI,GACtB,KAAOmC,KAAO,CACZ,MAAMqD,EAAIlZ,EAAE6V,CAAC,GACZ,CAAChV,GAAK0rG,GAAG,KAAM,KAAKrzF,CAAC,EAAGA,EAAGrY,EAAG,EAAE,KAAO,OAAO,KAAKqY,CAAC,EAAGxF,EAAI,GAC9D,CACA,OAAOA,CACT,CACA,UAAU7S,EAAG,CACX,MAAMb,EAAI,KAAM6V,EAAI,CAAA,EACpB,OAAOi0F,GAAE,QAAQ,KAAM,CAACp2F,EAAGwF,IAAM,CAC/B,MAAM,EAAI4wF,GAAE,QAAQj0F,EAAGqD,CAAC,EACxB,GAAI,EAAG,CACLlZ,EAAE,CAAC,EAAIosG,GAAG14F,CAAC,EAAG,OAAO1T,EAAEkZ,CAAC,EACxB,MACF,CACA,MAAM,EAAIrY,EAAI2rG,GAAGtzF,CAAC,EAAI,OAAOA,CAAC,EAAE,KAAI,EACpC,IAAMA,GAAK,OAAOlZ,EAAEkZ,CAAC,EAAGlZ,EAAE,CAAC,EAAIosG,GAAG14F,CAAC,EAAGmC,EAAE,CAAC,EAAI,EAC/C,CAAC,EAAG,IACN,CACA,UAAUhV,EAAG,CACX,OAAO,KAAK,YAAY,OAAO,KAAM,GAAGA,CAAC,CAC3C,CACA,OAAOA,EAAG,CACR,MAAMb,EAAoB,OAAO,OAAO,IAAI,EAC5C,OAAO8pG,GAAE,QAAQ,KAAM,CAACj0F,EAAGnC,IAAM,CAC/BmC,GAAK,MAAQA,IAAM,KAAO7V,EAAE0T,CAAC,EAAI7S,GAAKipG,GAAE,QAAQj0F,CAAC,EAAIA,EAAE,KAAK,IAAI,EAAIA,EACtE,CAAC,EAAG7V,CACN,CACA,CAAC,OAAO,QAAQ,GAAI,CAClB,OAAO,OAAO,QAAQ,KAAK,OAAM,CAAE,EAAE,OAAO,QAAQ,EAAC,CACvD,CACA,UAAW,CACT,OAAO,OAAO,QAAQ,KAAK,OAAM,CAAE,EAAE,IAAI,CAAC,CAACa,EAAGb,CAAC,IAAMa,EAAI,KAAOb,CAAC,EAAE,KAAK;AAAA,CAC3E,CACC,CACA,cAAe,CACb,OAAO,KAAK,IAAI,YAAY,GAAK,CAAA,CACnC,CACA,IAAK,OAAO,WAAW,GAAI,CACzB,MAAO,cACT,CACA,OAAO,KAAKa,EAAG,CACb,OAAOA,aAAa,KAAOA,EAAI,IAAI,KAAKA,CAAC,CAC3C,CACA,OAAO,OAAOA,KAAMb,EAAG,CACrB,MAAM6V,EAAI,IAAI,KAAKhV,CAAC,EACpB,OAAOb,EAAE,QAAS0T,GAAMmC,EAAE,IAAInC,CAAC,CAAC,EAAGmC,CACrC,CACA,OAAO,SAAShV,EAAG,CACjB,MAAMgV,GAAK,KAAKq2F,EAAE,EAAI,KAAKA,EAAE,EAAI,CAC/B,UAAW,CAAA,CACjB,GAAO,UAAWx4F,EAAI,KAAK,UACvB,SAASwF,EAAEqD,EAAG,CACZ,MAAMxE,EAAIo0F,GAAG5vF,CAAC,EACd1G,EAAEkC,CAAC,IAAM00F,GAAG/4F,EAAG6I,CAAC,EAAG1G,EAAEkC,CAAC,EAAI,GAC5B,CACA,OAAO+xF,GAAE,QAAQjpG,CAAC,EAAIA,EAAE,QAAQqY,CAAC,EAAIA,EAAErY,CAAC,EAAG,IAC7C,CACF,EACA6rG,GAAG,SAAS,CAAC,eAAgB,iBAAkB,SAAU,kBAAmB,aAAc,eAAe,CAAC,EAC1G5C,GAAE,kBAAkB4C,GAAG,UAAW,CAAC,CAAE,MAAO3nD,CAAC,EAAI,IAAM,CACrD,IAAI,EAAI,EAAE,CAAC,EAAE,YAAW,EAAK,EAAE,MAAM,CAAC,EACtC,MAAO,CACL,IAAK,IAAMA,EACX,IAAI,EAAG,CACL,KAAK,CAAC,EAAI,CACZ,CACJ,CACA,CAAC,EACD+kD,GAAE,cAAc4C,EAAE,EAClB,SAASC,GAAG5nD,EAAG,EAAG,CAChB,MAAM,EAAI,MAAQgnD,GAAI,EAAI,GAAK,EAAG,EAAIW,GAAG,KAAK,EAAE,OAAO,EACvD,IAAIxzF,EAAI,EAAE,KACV,OAAO4wF,GAAE,QAAQ/kD,EAAG,SAAS,EAAG,CAC9B7rC,EAAI,EAAE,KAAK,EAAGA,EAAG,EAAE,UAAS,EAAI,EAAI,EAAE,OAAS,MAAM,CACvD,CAAC,EAAG,EAAE,UAAS,EAAIA,CACrB,CACA,SAAS0zF,GAAG7nD,EAAG,CACb,MAAO,CAAC,EAAEA,GAAKA,EAAE,WACnB,CACA,SAAS8nD,GAAG9nD,EAAG,EAAG,EAAG,CACnBglD,GAAG,KAAK,KAAMhlD,GAAK,WAAYglD,GAAG,aAAc,EAAG,CAAC,EAAG,KAAK,KAAO,eACrE,CACAD,GAAE,SAAS+C,GAAI9C,GAAI,CACjB,WAAY,EACd,CAAC,EACD,SAAS+C,GAAG/nD,EAAG,EAAG,EAAG,CACnB,MAAM,EAAI,EAAE,OAAO,eACnB,CAAC,EAAE,QAAU,CAAC,GAAK,EAAE,EAAE,MAAM,EAAIA,EAAE,CAAC,EAAI,EAAE,IAAIglD,GAC5C,mCAAqC,EAAE,OACvC,CAACA,GAAG,gBAAiBA,GAAG,gBAAgB,EAAE,KAAK,MAAM,EAAE,OAAS,GAAG,EAAI,CAAC,EACxE,EAAE,OACF,EAAE,QACF,CACJ,CAAG,CACH,CACA,SAASgD,GAAGhoD,EAAG,CACb,MAAM,EAAI,4BAA4B,KAAKA,CAAC,EAC5C,OAAO,GAAK,EAAE,CAAC,GAAK,EACtB,CACA,SAASioD,GAAGjoD,EAAG,EAAG,CAChBA,EAAIA,GAAK,GACT,MAAM,EAAI,IAAI,MAAMA,CAAC,EAAG,EAAI,IAAI,MAAMA,CAAC,EACvC,IAAI,EAAI,EAAG7rC,EAAI,EAAGqD,EAClB,OAAO,EAAI,IAAM,OAAS,EAAI,IAAK,SAASzc,EAAG,CAC7C,MAAM0hB,EAAI,KAAK,IAAG,EAAI,EAAI,EAAEtI,CAAC,EAC7BqD,IAAMA,EAAIiF,GAAI,EAAE,CAAC,EAAI1hB,EAAG,EAAE,CAAC,EAAI0hB,EAC/B,IAAInC,EAAInG,EAAGpD,EAAI,EACf,KAAOuJ,IAAM,GACXvJ,GAAK,EAAEuJ,GAAG,EAAGA,EAAIA,EAAI0lC,EACvB,GAAI,GAAK,EAAI,GAAKA,EAAG,IAAM7rC,IAAMA,GAAKA,EAAI,GAAK6rC,GAAIvjC,EAAIjF,EAAI,EACzD,OACF,MAAMvB,EAAI,GAAKwG,EAAI,EACnB,OAAOxG,EAAI,KAAK,MAAMlF,EAAI,IAAMkF,CAAC,EAAI,MACvC,CACF,CACA,SAASiyF,GAAGloD,EAAG,EAAG,CAChB,IAAI,EAAI,EAAG,EAAI,IAAM,EAAG,EAAG7rC,EAC3B,MAAMqD,EAAI,CAACiF,EAAGvJ,EAAI,KAAK,IAAG,IAAO,CAC/B,EAAIA,EAAG,EAAI,KAAMiB,IAAM,aAAaA,CAAC,EAAGA,EAAI,MAAO6rC,EAAE,GAAGvjC,CAAC,CAC3D,EACA,MAAO,CAAC,IAAIA,IAAM,CAChB,MAAMvJ,EAAI,KAAK,IAAG,EAAIoH,EAAIpH,EAAI,EAC9BoH,GAAK,EAAI9C,EAAEiF,EAAGvJ,CAAC,GAAK,EAAIuJ,EAAGtI,IAAMA,EAAI,WAAW,IAAM,CACpDA,EAAI,KAAMqD,EAAE,CAAC,CACf,EAAG,EAAI8C,CAAC,GACV,EAAG,IAAM,GAAK9C,EAAE,CAAC,CAAC,CACpB,CACA,MAAM2wF,GAAK,CAACnoD,EAAG,EAAG,EAAI,IAAM,CAC1B,IAAI,EAAI,EACR,MAAM,EAAIioD,GAAG,GAAI,GAAG,EACpB,OAAOC,GAAI/zF,GAAM,CACf,MAAMqD,EAAIrD,EAAE,OAAQnB,EAAImB,EAAE,iBAAmBA,EAAE,MAAQ,OAAQ,EAAIqD,EAAI,EAAGiF,EAAI,EAAE,CAAC,EAAGvJ,EAAIsE,GAAKxE,EAC7F,EAAIwE,EACJ,MAAM,EAAI,CACR,OAAQA,EACR,MAAOxE,EACP,SAAUA,EAAIwE,EAAIxE,EAAI,OACtB,MAAO,EACP,KAAMyJ,GAAK,OACX,UAAWA,GAAKzJ,GAAKE,GAAKF,EAAIwE,GAAKiF,EAAI,OACvC,MAAOtI,EACP,iBAAkBnB,GAAK,KACvB,CAAC,EAAI,WAAa,QAAQ,EAAG,EACnC,EACIgtC,EAAE,CAAC,CACL,EAAG,CAAC,CACN,EAAGooD,GAAK,CAACpoD,EAAG,IAAM,CAChB,MAAM,EAAIA,GAAK,KACf,MAAO,CAAE,GAAM,EAAE,CAAC,EAAE,CAClB,iBAAkB,EAClB,MAAOA,EACP,OAAQ,CACZ,CAAG,EAAG,EAAE,CAAC,CAAC,CACV,EAAGqoD,GAAMroD,GAAM,IAAI,IAAM+kD,GAAE,KAAK,IAAM/kD,EAAE,GAAG,CAAC,CAAC,EAAGsoD,GAAK3B,GAAG,uBAAyC,CAAC3mD,EAAG,IAAO,IAAO,EAAI,IAAI,IAAI,EAAG2mD,GAAG,MAAM,EAAG3mD,EAAE,WAAa,EAAE,UAAYA,EAAE,OAAS,EAAE,OAAS,GAAKA,EAAE,OAAS,EAAE,QACjN,IAAI,IAAI2mD,GAAG,MAAM,EACjBA,GAAG,WAAa,kBAAkB,KAAKA,GAAG,UAAU,SAAS,CAC/D,EAAI,IAAM,GAAI4B,GAAK5B,GAAG,sBAEpB,CACE,MAAM3mD,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAG,CACzB,GAAI,OAAO,SAAW,IAAK,OAC3B,MAAMxE,EAAI,CAAC,GAAGgtC,CAAC,IAAI,mBAAmB,CAAC,CAAC,EAAE,EAC1C+kD,GAAE,SAAS,CAAC,GAAK/xF,EAAE,KAAK,WAAW,IAAI,KAAK,CAAC,EAAE,YAAW,CAAE,EAAE,EAAG+xF,GAAE,SAAS,CAAC,GAAK/xF,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAG+xF,GAAE,SAAS,CAAC,GAAK/xF,EAAE,KAAK,UAAU,CAAC,EAAE,EAAGmB,IAAM,IAAMnB,EAAE,KAAK,QAAQ,EAAG+xF,GAAE,SAASvtF,CAAC,GAAKxE,EAAE,KAAK,YAAYwE,CAAC,EAAE,EAAG,SAAS,OAASxE,EAAE,KAAK,IAAI,CACtP,EACA,KAAKgtC,EAAG,CACN,GAAI,OAAO,SAAW,IAAK,OAAO,KAClC,MAAM,EAAI,SAAS,OAAO,MAAM,IAAI,OAAO,WAAaA,EAAI,UAAU,CAAC,EACvE,OAAO,EAAI,mBAAmB,EAAE,CAAC,CAAC,EAAI,IACxC,EACA,OAAOA,EAAG,CACR,KAAK,MAAMA,EAAG,GAAI,KAAK,IAAG,EAAK,MAAO,GAAG,CAC3C,CACJ,EAGE,CACE,OAAQ,CACR,EACA,MAAO,CACL,OAAO,IACT,EACA,QAAS,CACT,CACJ,EAEA,SAASwoD,GAAGxoD,EAAG,CACb,MAAO,8BAA8B,KAAKA,CAAC,CAC7C,CACA,SAASyoD,GAAGzoD,EAAG,EAAG,CAChB,OAAO,EAAIA,EAAE,QAAQ,SAAU,EAAE,EAAI,IAAM,EAAE,QAAQ,OAAQ,EAAE,EAAIA,CACrE,CACA,SAAS0oD,GAAG1oD,EAAG,EAAG,EAAG,CACnB,IAAI,EAAI,CAACwoD,GAAG,CAAC,EACb,OAAOxoD,IAAM,GAAK,GAAK,IAAMyoD,GAAGzoD,EAAG,CAAC,EAAI,CAC1C,CACA,MAAM2oD,GAAM3oD,GAAMA,aAAa2nD,GAAK,CAAE,GAAG3nD,CAAC,EAAKA,EAC/C,SAAS4oD,GAAG5oD,EAAG,EAAG,CAChB,EAAI,GAAK,CAAA,EACT,MAAM,EAAI,CAAA,EACV,SAAS,EAAEvjC,EAAGvJ,EAAG,EAAGnC,EAAG,CACrB,OAAOg0F,GAAE,cAActoF,CAAC,GAAKsoF,GAAE,cAAc7xF,CAAC,EAAI6xF,GAAE,MAAM,KAAK,CAAE,SAAUh0F,CAAC,EAAI0L,EAAGvJ,CAAC,EAAI6xF,GAAE,cAAc7xF,CAAC,EAAI6xF,GAAE,MAAM,CAAA,EAAI7xF,CAAC,EAAI6xF,GAAE,QAAQ7xF,CAAC,EAAIA,EAAE,MAAK,EAAKA,CAC3J,CACA,SAAS,EAAEuJ,EAAGvJ,EAAG,EAAGnC,EAAG,CACrB,GAAIg0F,GAAE,YAAY7xF,CAAC,GACjB,GAAI,CAAC6xF,GAAE,YAAYtoF,CAAC,EAClB,OAAO,EAAE,OAAQA,EAAG,EAAG1L,CAAC,MACrB,QAAO,EAAE0L,EAAGvJ,EAAG,EAAGnC,CAAC,CAC5B,CACA,SAASoD,EAAEsI,EAAGvJ,EAAG,CACf,GAAI,CAAC6xF,GAAE,YAAY7xF,CAAC,EAClB,OAAO,EAAE,OAAQA,CAAC,CACtB,CACA,SAASsE,EAAEiF,EAAGvJ,EAAG,CACf,GAAI6xF,GAAE,YAAY7xF,CAAC,GACjB,GAAI,CAAC6xF,GAAE,YAAYtoF,CAAC,EAClB,OAAO,EAAE,OAAQA,CAAC,MACf,QAAO,EAAE,OAAQvJ,CAAC,CAC3B,CACA,SAASF,EAAEyJ,EAAGvJ,EAAG,EAAG,CAClB,GAAI,KAAK,EACP,OAAO,EAAEuJ,EAAGvJ,CAAC,EACf,GAAI,KAAK8sC,EACP,OAAO,EAAE,OAAQvjC,CAAC,CACtB,CACA,MAAM,EAAI,CACR,IAAKtI,EACL,OAAQA,EACR,KAAMA,EACN,QAASqD,EACT,iBAAkBA,EAClB,kBAAmBA,EACnB,iBAAkBA,EAClB,QAASA,EACT,eAAgBA,EAChB,gBAAiBA,EACjB,cAAeA,EACf,QAASA,EACT,aAAcA,EACd,eAAgBA,EAChB,eAAgBA,EAChB,iBAAkBA,EAClB,mBAAoBA,EACpB,WAAYA,EACZ,iBAAkBA,EAClB,cAAeA,EACf,eAAgBA,EAChB,UAAWA,EACX,UAAWA,EACX,WAAYA,EACZ,YAAaA,EACb,WAAYA,EACZ,iBAAkBA,EAClB,eAAgBxE,EAChB,QAAS,CAACyJ,EAAGvJ,EAAG,IAAM,EAAEy1F,GAAGlsF,CAAC,EAAGksF,GAAGz1F,CAAC,EAAG,EAAG,EAAE,CAC/C,EACE,OAAO6xF,GAAE,QAAQ,OAAO,KAAK,CAAE,GAAG/kD,EAAG,GAAG,CAAC,CAAE,EAAG,SAAS,EAAG,CACxD,MAAM1lC,EAAI,EAAE,CAAC,GAAK,EAAGvJ,EAAIuJ,EAAE0lC,EAAE,CAAC,EAAG,EAAE,CAAC,EAAG,CAAC,EACxC+kD,GAAE,YAAYh0F,CAAC,GAAKuJ,IAAMtH,IAAM,EAAE,CAAC,EAAIjC,EACzC,CAAC,EAAG,CACN,CACA,MAAM83F,GAAM7oD,GAAM,CAChB,MAAM,EAAI4oD,GAAG,CAAA,EAAI5oD,CAAC,EAClB,GAAI,CAAE,KAAM,EAAG,cAAe,EAAG,eAAgB,EAAG,eAAgB7rC,EAAG,QAASqD,EAAG,KAAMxE,CAAC,EAAK,EAC/F,GAAI,EAAE,QAAUwE,EAAImwF,GAAG,KAAKnwF,CAAC,EAAG,EAAE,IAAMsuF,GAAG4C,GAAG,EAAE,QAAS,EAAE,IAAK,EAAE,iBAAiB,EAAG1oD,EAAE,OAAQA,EAAE,gBAAgB,EAAGhtC,GAAKwE,EAAE,IAC1H,gBACA,SAAW,MAAMxE,EAAE,UAAY,IAAM,KAAOA,EAAE,SAAW,SAAS,mBAAmBA,EAAE,QAAQ,CAAC,EAAI,GAAG,CAC3G,EAAK+xF,GAAE,WAAW,CAAC,GACf,GAAI4B,GAAG,uBAAyBA,GAAG,+BACjCnvF,EAAE,eAAe,MAAM,UAChButF,GAAE,WAAW,EAAE,UAAU,EAAG,CACnC,MAAM,EAAI,EAAE,WAAU,EAAItoF,EAAI,CAAC,eAAgB,gBAAgB,EAC/D,OAAO,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAACvJ,EAAG,CAAC,IAAM,CACpCuJ,EAAE,SAASvJ,EAAE,YAAW,CAAE,GAAKsE,EAAE,IAAItE,EAAG,CAAC,CAC3C,CAAC,CACH,EAEF,GAAIyzF,GAAG,wBAA0B,GAAK5B,GAAE,WAAW,CAAC,IAAM,EAAI,EAAE,CAAC,GAAI,GAAK,IAAM,IAAMuD,GAAG,EAAE,GAAG,GAAI,CAChG,MAAM,EAAI,GAAKn0F,GAAKo0F,GAAG,KAAKp0F,CAAC,EAC7B,GAAKqD,EAAE,IAAI,EAAG,CAAC,CACjB,CACA,OAAO,CACT,EAAGsxF,GAAK,OAAO,eAAiB,IAAKC,GAAKD,IAAM,SAAS9oD,EAAG,CAC1D,OAAO,IAAI,QAAQ,SAAS/kD,EAAG6V,EAAG,CAChC,MAAMnC,EAAIk6F,GAAG7oD,CAAC,EACd,IAAI7rC,EAAIxF,EAAE,KACV,MAAM,EAAIg5F,GAAG,KAAKh5F,EAAE,OAAO,EAAE,UAAS,EACtC,GAAI,CAAE,aAAc,EAAG,iBAAkB5T,EAAG,mBAAoB0hB,CAAC,EAAK9N,EAAG,EAAG2L,EAAGvJ,EAAGkF,EAAG,EACrF,SAASga,GAAI,CACXha,GAAKA,EAAC,EAAI,GAAK,EAAC,EAAItH,EAAE,aAAeA,EAAE,YAAY,YAAY,CAAC,EAAGA,EAAE,QAAUA,EAAE,OAAO,oBAAoB,QAAS,CAAC,CACxH,CACA,IAAIhS,EAAI,IAAI,eACZA,EAAE,KAAKgS,EAAE,OAAO,YAAW,EAAIA,EAAE,IAAK,EAAE,EAAGhS,EAAE,QAAUgS,EAAE,QACzD,SAAS4C,GAAI,CACX,GAAI,CAAC5U,EACH,OACF,MAAMsU,EAAI02F,GAAG,KACX,0BAA2BhrG,GAAKA,EAAE,sBAAqB,CAC/D,EAASsW,EAAI,CACL,KAAM,CAAC,GAAK,IAAM,QAAU,IAAM,OAAStW,EAAE,aAAeA,EAAE,SAC9D,OAAQA,EAAE,OACV,WAAYA,EAAE,WACd,QAASsU,EACT,OAAQ+uC,EACR,QAASrjD,CACjB,EACMorG,GAAG,SAASrO,EAAG,CACbz+F,EAAEy+F,CAAC,EAAGzpE,EAAC,CACT,EAAG,SAASypE,EAAG,CACb5oF,EAAE4oF,CAAC,EAAGzpE,EAAC,CACT,EAAGhd,CAAC,EAAGtW,EAAI,IACb,CACA,cAAeA,EAAIA,EAAE,UAAY4U,EAAI5U,EAAE,mBAAqB,UAAW,CACrE,CAACA,GAAKA,EAAE,aAAe,GAAKA,EAAE,SAAW,GAAK,EAAEA,EAAE,aAAeA,EAAE,YAAY,QAAQ,OAAO,IAAM,IAAM,WAAW4U,CAAC,CACxH,EAAG5U,EAAE,QAAU,UAAW,CACxBA,IAAMmU,EAAE,IAAIk0F,GAAG,kBAAmBA,GAAG,aAAchlD,EAAGrjD,CAAC,CAAC,EAAGA,EAAI,KACjE,EAAGA,EAAE,QAAU,SAAS68F,EAAG,CACzB,MAAMvmF,EAAIumF,GAAKA,EAAE,QAAUA,EAAE,QAAU,gBAAiBC,EAAI,IAAIuL,GAAG/xF,EAAG+xF,GAAG,YAAahlD,EAAGrjD,CAAC,EAC1F88F,EAAE,MAAQD,GAAK,KAAM1oF,EAAE2oF,CAAC,EAAG98F,EAAI,IACjC,EAAGA,EAAE,UAAY,UAAW,CAC1B,IAAI68F,EAAI7qF,EAAE,QAAU,cAAgBA,EAAE,QAAU,cAAgB,mBAChE,MAAMsE,EAAItE,EAAE,cAAgBq3F,GAC5Br3F,EAAE,sBAAwB6qF,EAAI7qF,EAAE,qBAAsBmC,EAAE,IAAIk0F,GAC1DxL,EACAvmF,EAAE,oBAAsB+xF,GAAG,UAAYA,GAAG,aAC1ChlD,EACArjD,CACR,CAAO,EAAGA,EAAI,IACV,EAAGwX,IAAM,QAAU,EAAE,eAAe,IAAI,EAAG,qBAAsBxX,GAAKooG,GAAE,QAAQ,EAAE,OAAM,EAAI,SAASvL,EAAGvmF,EAAG,CACzGtW,EAAE,iBAAiBsW,EAAGumF,CAAC,CACzB,CAAC,EAAGuL,GAAE,YAAYp2F,EAAE,eAAe,IAAMhS,EAAE,gBAAkB,CAAC,CAACgS,EAAE,iBAAkB,GAAK,IAAM,SAAWhS,EAAE,aAAegS,EAAE,cAAe8N,IAAM,CAAC1L,EAAG,CAAC,EAAIo3F,GAAG1rF,EAAG,EAAE,EAAG9f,EAAE,iBAAiB,WAAYoU,CAAC,GAAIhW,GAAK4B,EAAE,SAAW,CAAC2d,EAAGrE,CAAC,EAAIkyF,GAAGptG,CAAC,EAAG4B,EAAE,OAAO,iBAAiB,WAAY2d,CAAC,EAAG3d,EAAE,OAAO,iBAAiB,UAAWsZ,CAAC,IAAKtH,EAAE,aAAeA,EAAE,UAAY,EAAKsC,GAAM,CACxWtU,IAAMmU,EAAE,CAACG,GAAKA,EAAE,KAAO,IAAI62F,GAAG,KAAM9nD,EAAGrjD,CAAC,EAAIsU,CAAC,EAAGtU,EAAE,MAAK,EAAIA,EAAI,KACjE,EAAGgS,EAAE,aAAeA,EAAE,YAAY,UAAU,CAAC,EAAGA,EAAE,SAAWA,EAAE,OAAO,QAAU,EAAC,EAAKA,EAAE,OAAO,iBAAiB,QAAS,CAAC,IAC1H,MAAMsG,EAAI+yF,GAAGr5F,EAAE,GAAG,EAClB,GAAIsG,GAAK0xF,GAAG,UAAU,QAAQ1xF,CAAC,IAAM,GAAI,CACvCnE,EAAE,IAAIk0F,GAAG,wBAA0B/vF,EAAI,IAAK+vF,GAAG,gBAAiBhlD,CAAC,CAAC,EAClE,MACF,CACArjD,EAAE,KAAKwX,GAAK,IAAI,CAClB,CAAC,CACH,EAAG60F,GAAK,CAAChpD,EAAG,IAAM,CAChB,KAAM,CAAE,OAAQ,CAAC,EAAKA,EAAIA,EAAIA,EAAE,OAAO,OAAO,EAAI,CAAA,EAClD,GAAI,GAAK,EAAG,CACV,IAAI,EAAI,IAAI,gBAAmB,EAC/B,MAAM7rC,EAAI,SAASsI,EAAG,CACpB,GAAI,CAAC,EAAG,CACN,EAAI,GAAIzJ,EAAC,EACT,MAAME,EAAIuJ,aAAa,MAAQA,EAAI,KAAK,OACxC,EAAE,MAAMvJ,aAAa8xF,GAAK9xF,EAAI,IAAI40F,GAAG50F,aAAa,MAAQA,EAAE,QAAUA,CAAC,CAAC,CAC1E,CACF,EACA,IAAIsE,EAAI,GAAK,WAAW,IAAM,CAC5BA,EAAI,KAAMrD,EAAE,IAAI6wF,GAAG,WAAW,CAAC,kBAAmBA,GAAG,SAAS,CAAC,CACjE,EAAG,CAAC,EACJ,MAAMhyF,EAAI,IAAM,CACdgtC,IAAMxoC,GAAK,aAAaA,CAAC,EAAGA,EAAI,KAAMwoC,EAAE,QAASvjC,GAAM,CACrDA,EAAE,YAAcA,EAAE,YAAYtI,CAAC,EAAIsI,EAAE,oBAAoB,QAAStI,CAAC,CACrE,CAAC,EAAG6rC,EAAI,KACV,EACAA,EAAE,QAASvjC,GAAMA,EAAE,iBAAiB,QAAStI,CAAC,CAAC,EAC/C,KAAM,CAAE,OAAQ,CAAC,EAAK,EACtB,OAAO,EAAE,YAAc,IAAM4wF,GAAE,KAAK/xF,CAAC,EAAG,CAC1C,CACF,EAAGi2F,GAAK,UAAWjpD,EAAG,EAAG,CACvB,IAAI,EAAIA,EAAE,WACV,GAAI,EAAI,EAAG,CACT,MAAMA,EACN,MACF,CACA,IAAI,EAAI,EAAG,EACX,KAAO,EAAI,GACT,EAAI,EAAI,EAAG,MAAMA,EAAE,MAAM,EAAG,CAAC,EAAG,EAAI,CACxC,EAAGkpD,GAAK,gBAAiBlpD,EAAG,EAAG,CAC7B,gBAAiB,KAAKmpD,GAAGnpD,CAAC,EACxB,MAAOipD,GAAG,EAAG,CAAC,CAClB,EAAGE,GAAK,gBAAiBnpD,EAAG,CAC1B,GAAIA,EAAE,OAAO,aAAa,EAAG,CAC3B,MAAOA,EACP,MACF,CACA,MAAM,EAAIA,EAAE,UAAS,EACrB,GAAI,CACF,OAAW,CACT,KAAM,CAAE,KAAM,EAAG,MAAO,GAAM,MAAM,EAAE,KAAI,EAC1C,GAAI,EACF,MACF,MAAM,CACR,CACF,QAAC,CACC,MAAM,EAAE,OAAM,CAChB,CACF,EAAGopD,GAAK,CAACppD,EAAG,EAAG,EAAG,IAAM,CACtB,MAAM,EAAIkpD,GAAGlpD,EAAG,CAAC,EACjB,IAAI7rC,EAAI,EAAGqD,EAAGxE,EAAK,GAAM,CACvBwE,IAAMA,EAAI,GAAI,GAAK,EAAE,CAAC,EACxB,EACA,OAAO,IAAI,eAAe,CACxB,MAAM,KAAK,EAAG,CACZ,GAAI,CACF,KAAM,CAAE,KAAMiF,EAAG,MAAOvJ,GAAM,MAAM,EAAE,KAAI,EAC1C,GAAIuJ,EAAG,CACLzJ,EAAC,EAAI,EAAE,MAAK,EACZ,MACF,CACA,IAAI,EAAIE,EAAE,WACV,GAAI,EAAG,CACL,IAAInC,EAAIoD,GAAK,EACb,EAAEpD,CAAC,CACL,CACA,EAAE,QAAQ,IAAI,WAAWmC,CAAC,CAAC,CAC7B,OAASuJ,EAAG,CACV,MAAMzJ,EAAEyJ,CAAC,EAAGA,CACd,CACF,EACA,OAAO,EAAG,CACR,OAAOzJ,EAAE,CAAC,EAAG,EAAE,OAAM,CACvB,CACJ,EAAK,CACD,cAAe,CACnB,CAAG,CACH,EAAGq2F,GAAK,GAAK,KAAM,CAAE,WAAYC,EAAE,EAAKvE,GAAGwE,IAAM,CAAC,CAAE,QAASvpD,EAAG,SAAU,CAAC,KAAQ,CACjF,QAASA,EACT,SAAU,CACZ,IAAI+kD,GAAE,MAAM,EAAG,CACb,eAAgByE,GAChB,YAAaC,EACf,EAAI1E,GAAE,OAAQ2E,GAAK,CAAC1pD,KAAM,IAAM,CAC9B,GAAI,CACF,MAAO,CAAC,CAACA,EAAE,GAAG,CAAC,CACjB,MAAQ,CACN,MAAO,EACT,CACF,EAAG2pD,GAAM3pD,GAAM,CACbA,EAAI+kD,GAAE,MAAM,KAAK,CACf,cAAe,EACnB,EAAKwE,GAAIvpD,CAAC,EACR,KAAM,CAAE,MAAO,EAAG,QAAS,EAAG,SAAU,CAAC,EAAKA,EAAG,EAAI,EAAIspD,GAAG,CAAC,EAAI,OAAO,OAAS,WAAYn1F,EAAIm1F,GAAG,CAAC,EAAG9xF,EAAI8xF,GAAG,CAAC,EAChH,GAAI,CAAC,EACH,MAAO,GACT,MAAMt2F,EAAI,GAAKs2F,GAAGE,EAAE,EAAG,EAAI,IAAM,OAAOC,IAAM,YAA+BnlG,GAAO2rB,GAAM3rB,EAAE,OAAO2rB,CAAC,GAAG,IAAIw5E,EAAI,EAAI,MAAOnlG,GAAM,IAAI,WAAW,MAAM,IAAI,EAAEA,CAAC,EAAE,YAAW,CAAE,GAAImY,EAAItI,GAAKnB,GAAK02F,GAAG,IAAM,CACpM,IAAIplG,EAAI,GACR,MAAM2rB,EAAI,IAAI,EAAE02E,GAAG,OAAQ,CACzB,KAAM,IAAI6C,GACV,OAAQ,OACR,IAAI,QAAS,CACX,OAAOllG,EAAI,GAAI,MACjB,CACN,CAAK,EAAE,QAAQ,IAAI,cAAc,EAC7B,OAAOA,GAAK,CAAC2rB,CACf,CAAC,EAAG/c,EAAIsE,GAAKxE,GAAK02F,GAAG,IAAM3E,GAAE,iBAAiB,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAG,EAAI,CAClE,OAAQ7xF,IAAO5O,GAAMA,EAAE,KAC3B,EACE,GAAK,CAAC,OAAQ,cAAe,OAAQ,WAAY,QAAQ,EAAE,QAASA,GAAM,CACxE,CAAC,EAAEA,CAAC,IAAM,EAAEA,CAAC,EAAI,CAAC2rB,EAAGtzB,IAAM,CACzB,IAAI4U,EAAI0e,GAAKA,EAAE3rB,CAAC,EAChB,GAAIiN,EACF,OAAOA,EAAE,KAAK0e,CAAC,EACjB,MAAM,IAAI+0E,GAAG,kBAAkB1gG,CAAC,qBAAsB0gG,GAAG,gBAAiBroG,CAAC,CAC7E,EACF,CAAC,EACD,MAAMoU,EAAI,MAAOzM,GAAM,CACrB,GAAIA,GAAK,KACP,MAAO,GACT,GAAIygG,GAAE,OAAOzgG,CAAC,EACZ,OAAOA,EAAE,KACX,GAAIygG,GAAE,oBAAoBzgG,CAAC,EACzB,OAAQ,MAAM,IAAI,EAAEqiG,GAAG,OAAQ,CAC7B,OAAQ,OACR,KAAMriG,CACd,CAAO,EAAE,YAAW,GAAI,WACpB,GAAIygG,GAAE,kBAAkBzgG,CAAC,GAAKygG,GAAE,cAAczgG,CAAC,EAC7C,OAAOA,EAAE,WACX,GAAIygG,GAAE,kBAAkBzgG,CAAC,IAAMA,EAAIA,EAAI,IAAKygG,GAAE,SAASzgG,CAAC,EACtD,OAAQ,MAAM,EAAEA,CAAC,GAAG,UACxB,EAAG2R,EAAI,MAAO3R,EAAG2rB,IACL80E,GAAE,eAAezgG,EAAE,iBAAgB,CAAE,GACnCyM,EAAEkf,CAAC,EAEjB,MAAO,OAAO3rB,GAAM,CAClB,GAAI,CACF,IAAK2rB,EACL,OAAQtzB,EACR,KAAM4U,EACN,OAAQ0D,EACR,YAAahE,EACb,QAASuoF,EACT,mBAAoBvmF,EACpB,iBAAkBwmF,EAClB,aAAcC,EACd,QAASE,EACT,gBAAiBE,EAAI,cACrB,aAAcC,CACpB,EAAQ8O,GAAGvkG,CAAC,EAAG80F,EAAI,GAAK,MACpBM,EAAIA,GAAKA,EAAI,IAAI,YAAW,EAAK,OACjC,IAAIJ,EAAI0P,GAAG,CAAC/zF,EAAGhE,GAAKA,EAAE,eAAe,EAAGuoF,CAAC,EAAGD,EAAI,KAChD,MAAMn4F,EAAIk4F,GAAKA,EAAE,cAAgB,IAAM,CACrCA,EAAE,YAAW,CACf,GACA,IAAI,EACJ,GAAI,CACF,GAAIG,GAAKh9E,GAAK9f,IAAM,OAASA,IAAM,SAAW,EAAI,MAAMsZ,EAAE2jF,EAAGroF,CAAC,KAAO,EAAG,CACtE,IAAI2oF,EAAI,IAAI,EAAEjqE,EAAG,CACf,OAAQ,OACR,KAAM1e,EACN,OAAQ,MAClB,CAAS,EAAG0oF,EACJ,GAAI8K,GAAE,WAAWxzF,CAAC,IAAM0oF,EAAIC,EAAE,QAAQ,IAAI,cAAc,IAAMN,EAAE,eAAeK,CAAC,EAAGC,EAAE,KAAM,CACzF,KAAM,CAACqC,GAAGC,EAAE,EAAI4L,GACd,EACAD,GAAGE,GAAG5O,CAAC,CAAC,CACpB,EACUloF,EAAI63F,GAAGlP,EAAE,KAAMmP,GAAI9M,GAAGC,EAAE,CAC1B,CACF,CACAuI,GAAE,SAASjL,CAAC,IAAMA,EAAIA,EAAI,UAAY,QACtC,MAAMH,EAAIxlF,GAAK,gBAAiB,EAAE,UAAW0lF,EAAI,CAC/C,GAAGE,EACH,OAAQT,EACR,OAAQ38F,EAAE,YAAW,EACrB,QAASi9F,EAAE,UAAS,EAAG,OAAM,EAC7B,KAAMroF,EACN,OAAQ,OACR,YAAaooF,EAAIG,EAAI,MAC7B,EACMP,EAAIplF,GAAK,IAAI,EAAE8b,EAAG4pE,CAAC,EACnB,IAAIljF,EAAK,MAAOxC,EAAIilF,EAAEG,EAAGQ,CAAC,EAAIX,EAAEnpE,EAAG4pE,CAAC,GACpC,MAAMyC,EAAIppF,IAAMwmF,IAAM,UAAYA,IAAM,YACxC,GAAIxmF,IAAMD,GAAKqpF,GAAKl7F,GAAI,CACtB,MAAM84F,EAAI,CAAA,EACV,CAAC,SAAU,aAAc,SAAS,EAAE,QAASnnF,IAAM,CACjDmnF,EAAEnnF,EAAC,EAAI4D,EAAG5D,EAAC,CACb,CAAC,EACD,MAAMknF,EAAI8K,GAAE,eAAepuF,EAAG,QAAQ,IAAI,gBAAgB,CAAC,EAAG,CAAC4lF,GAAGC,EAAE,EAAIvpF,GAAKm1F,GAC3EnO,EACAkO,GAAGE,GAAGp1F,CAAC,EAAG,EAAE,CACtB,GAAa,CAAA,EACL0D,EAAK,IAAI,EACPyyF,GAAGzyF,EAAG,KAAM0yF,GAAI9M,GAAG,IAAM,CACvBC,IAAMA,GAAE,EAAIp7F,GAAKA,EAAC,CACpB,CAAC,EACD84F,CACV,CACM,CACAR,EAAIA,GAAK,OACT,IAAIM,GAAI,MAAM,EAAE+K,GAAE,QAAQ,EAAGrL,CAAC,GAAK,MAAM,EAAE/iF,EAAIrS,CAAC,EAChD,MAAO,CAACg4F,GAAKl7F,GAAKA,EAAC,EAAI,MAAM,IAAI,QAAQ,CAAC84F,EAAGD,IAAM,CACjD8N,GAAG7N,EAAGD,EAAG,CACP,KAAMD,GACN,QAAS2N,GAAG,KAAKhxF,EAAG,OAAO,EAC3B,OAAQA,EAAG,OACX,WAAYA,EAAG,WACf,OAAQrS,EACR,QAASi1F,CACnB,CAAS,CACH,CAAC,CACH,OAASI,EAAG,CACV,MAAMv4F,GAAKA,EAAC,EAAIu4F,GAAKA,EAAE,OAAS,aAAe,qBAAqB,KAAKA,EAAE,OAAO,EAAI,OAAO,OAC3F,IAAIqL,GAAG,gBAAiBA,GAAG,YAAa1gG,EAAGi1F,CAAC,EAC5C,CACE,MAAOI,EAAE,OAASA,CAC5B,CACA,EAAUqL,GAAG,KAAKrL,EAAGA,GAAKA,EAAE,KAAMr1F,EAAGi1F,CAAC,CAClC,CACF,CACF,EAAGqQ,GAAqB,IAAI,IAAOC,GAAM7pD,GAAM,CAC7C,IAAI,EAAIA,GAAKA,EAAE,KAAO,CAAA,EACtB,KAAM,CAAE,MAAO,EAAG,QAAS,EAAG,SAAU,CAAC,EAAK,EAAG7rC,EAAI,CACnD,EACA,EACA,CACJ,EACE,IAAIqD,EAAIrD,EAAE,OAAQnB,EAAIwE,EAAG,EAAGiF,EAAGvJ,EAAI02F,GACnC,KAAO52F,KACL,EAAImB,EAAEnB,CAAC,EAAGyJ,EAAIvJ,EAAE,IAAI,CAAC,EAAGuJ,IAAM,QAAUvJ,EAAE,IAAI,EAAGuJ,EAAIzJ,EAAoB,IAAI,IAAQ22F,GAAG,CAAC,CAAC,EAAGz2F,EAAIuJ,EACnG,OAAOA,CACT,EACAotF,GAAE,EACF,MAAMC,GAAK,CACT,KAAM3E,GACN,IAAK4D,GACL,MAAO,CACL,IAAKc,EACT,CACA,EACA9E,GAAE,QAAQ+E,GAAI,CAAC9pD,EAAG,IAAM,CACtB,GAAIA,EAAG,CACL,GAAI,CACF,OAAO,eAAeA,EAAG,OAAQ,CAAE,MAAO,EAAG,CAC/C,MAAQ,CACR,CACA,OAAO,eAAeA,EAAG,cAAe,CAAE,MAAO,EAAG,CACtD,CACF,CAAC,EACD,MAAM+pD,GAAM/pD,GAAM,KAAKA,CAAC,GAAIgqD,GAAMhqD,GAAM+kD,GAAE,WAAW/kD,CAAC,GAAKA,IAAM,MAAQA,IAAM,GAC/E,SAASiqD,GAAGjqD,EAAG,EAAG,CAChBA,EAAI+kD,GAAE,QAAQ/kD,CAAC,EAAIA,EAAI,CAACA,CAAC,EACzB,KAAM,CAAE,OAAQ,CAAC,EAAKA,EACtB,IAAI,EAAG,EACP,MAAM7rC,EAAI,CAAA,EACV,QAASqD,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,EAAIwoC,EAAExoC,CAAC,EACP,IAAIxE,EACJ,GAAI,EAAI,EAAG,CAACg3F,GAAG,CAAC,IAAM,EAAIF,IAAI92F,EAAI,OAAO,CAAC,GAAG,YAAW,CAAE,EAAG,IAAM,QACjE,MAAM,IAAIgyF,GAAG,oBAAoBhyF,CAAC,GAAG,EACvC,GAAI,IAAM+xF,GAAE,WAAW,CAAC,IAAM,EAAI,EAAE,IAAI,CAAC,IACvC,MACF5wF,EAAEnB,GAAK,IAAMwE,CAAC,EAAI,CACpB,CACA,GAAI,CAAC,EAAG,CACN,MAAMA,EAAI,OAAO,QAAQrD,CAAC,EAAE,IAC1B,CAAC,CAAC,EAAGsI,CAAC,IAAM,WAAW,CAAC,KAAOA,IAAM,GAAK,sCAAwC,gCACxF,EACI,IAAIzJ,EAAI,EAAIwE,EAAE,OAAS,EAAI;AAAA,EAC3BA,EAAE,IAAIuyF,EAAE,EAAE,KAAK;AAAA,CAClB,EAAI,IAAMA,GAAGvyF,EAAE,CAAC,CAAC,EAAI,0BAClB,MAAM,IAAIwtF,GACR,wDAA0DhyF,EAC1D,iBACN,CACE,CACA,OAAO,CACT,CACA,MAAMk3F,GAAK,CAKT,WAAYD,GAKZ,SAAUH,EACZ,EACA,SAASK,GAAGnqD,EAAG,CACb,GAAIA,EAAE,aAAeA,EAAE,YAAY,mBAAoBA,EAAE,QAAUA,EAAE,OAAO,QAC1E,MAAM,IAAI8nD,GAAG,KAAM9nD,CAAC,CACxB,CACA,SAASoqD,GAAGpqD,EAAG,CACb,OAAOmqD,GAAGnqD,CAAC,EAAGA,EAAE,QAAU2nD,GAAG,KAAK3nD,EAAE,OAAO,EAAGA,EAAE,KAAO4nD,GAAG,KACxD5nD,EACAA,EAAE,gBACN,EAAK,CAAC,OAAQ,MAAO,OAAO,EAAE,QAAQA,EAAE,MAAM,IAAM,IAAMA,EAAE,QAAQ,eAAe,oCAAqC,EAAE,EAAGkqD,GAAG,WAAWlqD,EAAE,SAAWgnD,GAAG,QAAShnD,CAAC,EAAEA,CAAC,EAAE,KAAK,SAASlvC,EAAG,CACvL,OAAOq5F,GAAGnqD,CAAC,EAAGlvC,EAAE,KAAO82F,GAAG,KACxB5nD,EACAA,EAAE,kBACFlvC,CACN,EAAOA,EAAE,QAAU62F,GAAG,KAAK72F,EAAE,OAAO,EAAGA,CACrC,EAAG,SAASA,EAAG,CACb,OAAO+2F,GAAG/2F,CAAC,IAAMq5F,GAAGnqD,CAAC,EAAGlvC,GAAKA,EAAE,WAAaA,EAAE,SAAS,KAAO82F,GAAG,KAC/D5nD,EACAA,EAAE,kBACFlvC,EAAE,QACR,EAAOA,EAAE,SAAS,QAAU62F,GAAG,KAAK72F,EAAE,SAAS,OAAO,IAAK,QAAQ,OAAOA,CAAC,CACzE,CAAC,CACH,CACA,MAAMu5F,GAAK,SAAUC,GAAK,CAAA,EAC1B,CAAC,SAAU,UAAW,SAAU,WAAY,SAAU,QAAQ,EAAE,QAAQ,CAACtqD,EAAG,IAAM,CAChFsqD,GAAGtqD,CAAC,EAAI,SAASlvC,EAAG,CAClB,OAAO,OAAOA,IAAMkvC,GAAK,KAAO,EAAI,EAAI,KAAO,KAAOA,CACxD,CACF,CAAC,EACD,MAAMuqD,GAAK,CAAA,EACXD,GAAG,aAAe,SAASxuG,EAAGb,EAAG6V,EAAG,CAClC,SAASnC,EAAEwF,EAAG,EAAG,CACf,MAAO,WAAak2F,GAAK,0BAA4Bl2F,EAAI,IAAM,GAAKrD,EAAI,KAAOA,EAAI,GACrF,CACA,MAAO,CAACqD,EAAG,EAAG,IAAM,CAClB,GAAIrY,IAAM,GACR,MAAM,IAAIkpG,GACRr2F,EAAE,EAAG,qBAAuB1T,EAAI,OAASA,EAAI,GAAG,EAChD+pG,GAAG,cACX,EACI,OAAO/pG,GAAK,CAACsvG,GAAG,CAAC,IAAMA,GAAG,CAAC,EAAI,GAAI,QAAQ,KACzC57F,EACE,EACA,+BAAiC1T,EAAI,yCAC7C,CACA,GAAQa,EAAIA,EAAEqY,EAAG,EAAG,CAAC,EAAI,EACvB,CACF,EACAm2F,GAAG,SAAW,SAASxuG,EAAG,CACxB,MAAO,CAACb,EAAG6V,KAAO,QAAQ,KAAK,GAAGA,CAAC,+BAA+BhV,CAAC,EAAE,EAAG,GAC1E,EACA,SAAS0uG,GAAGxqD,EAAG,EAAG,EAAG,CACnB,GAAI,OAAOA,GAAK,SACd,MAAM,IAAIglD,GAAG,4BAA6BA,GAAG,oBAAoB,EACnE,MAAM,EAAI,OAAO,KAAKhlD,CAAC,EACvB,IAAI,EAAI,EAAE,OACV,KAAO,KAAM,GAAK,CAChB,MAAM7rC,EAAI,EAAE,CAAC,EAAGqD,EAAI,EAAErD,CAAC,EACvB,GAAIqD,EAAG,CACL,MAAMxE,EAAIgtC,EAAE7rC,CAAC,EAAG,EAAInB,IAAM,QAAUwE,EAAExE,EAAGmB,EAAG6rC,CAAC,EAC7C,GAAI,IAAM,GACR,MAAM,IAAIglD,GAAG,UAAY7wF,EAAI,YAAc,EAAG6wF,GAAG,oBAAoB,EACvE,QACF,CACA,GAAI,IAAM,GACR,MAAM,IAAIA,GAAG,kBAAoB7wF,EAAG6wF,GAAG,cAAc,CACzD,CACF,CACA,MAAMyF,GAAK,CACT,cAAeD,GACf,WAAYF,EACd,EAAGI,GAAKD,GAAG,WACX,IAAIE,GAAK,KAAM,CACb,YAAY7uG,EAAG,CACb,KAAK,SAAWA,GAAK,CAAA,EAAI,KAAK,aAAe,CAC3C,QAAS,IAAIiqG,GACb,SAAU,IAAIA,EACpB,CACE,CASA,MAAM,QAAQjqG,EAAGb,EAAG,CAClB,GAAI,CACF,OAAO,MAAM,KAAK,SAASa,EAAGb,CAAC,CACjC,OAAS6V,EAAG,CACV,GAAIA,aAAa,MAAO,CACtB,IAAInC,EAAI,CAAA,EACR,MAAM,kBAAoB,MAAM,kBAAkBA,CAAC,EAAIA,EAAI,IAAI,MAC/D,MAAMwF,EAAIxF,EAAE,MAAQA,EAAE,MAAM,QAAQ,QAAS,EAAE,EAAI,GACnD,GAAI,CACFmC,EAAE,MAAQqD,GAAK,CAAC,OAAOrD,EAAE,KAAK,EAAE,SAASqD,EAAE,QAAQ,YAAa,EAAE,CAAC,IAAMrD,EAAE,OAAS;AAAA,EAC1FqD,GAAKrD,EAAE,MAAQqD,CACX,MAAQ,CACR,CACF,CACA,MAAMrD,CACR,CACF,CACA,SAAShV,EAAGb,EAAG,CACb,OAAOa,GAAK,UAAYb,EAAIA,GAAK,CAAA,EAAIA,EAAE,IAAMa,GAAKb,EAAIa,GAAK,CAAA,EAAIb,EAAI2tG,GAAG,KAAK,SAAU3tG,CAAC,EACtF,KAAM,CAAE,aAAc6V,EAAG,iBAAkBnC,EAAG,QAASwF,CAAC,EAAKlZ,EAC7D6V,IAAM,QAAU25F,GAAG,cAAc35F,EAAG,CAClC,kBAAmB45F,GAAG,aAAaA,GAAG,OAAO,EAC7C,kBAAmBA,GAAG,aAAaA,GAAG,OAAO,EAC7C,oBAAqBA,GAAG,aAAaA,GAAG,OAAO,CACrD,EAAO,EAAE,EAAG/7F,GAAK,OAASo2F,GAAE,WAAWp2F,CAAC,EAAI1T,EAAE,iBAAmB,CAC3D,UAAW0T,CACjB,EAAQ87F,GAAG,cAAc97F,EAAG,CACtB,OAAQ+7F,GAAG,SACX,UAAWA,GAAG,QACpB,EAAO,EAAE,GAAIzvG,EAAE,oBAAsB,SAAW,KAAK,SAAS,oBAAsB,OAASA,EAAE,kBAAoB,KAAK,SAAS,kBAAoBA,EAAE,kBAAoB,IAAKwvG,GAAG,cAAcxvG,EAAG,CAC9L,QAASyvG,GAAG,SAAS,SAAS,EAC9B,cAAeA,GAAG,SAAS,eAAe,CAChD,EAAO,EAAE,EAAGzvG,EAAE,QAAUA,EAAE,QAAU,KAAK,SAAS,QAAU,OAAO,YAAW,EAC1E,IAAI,EAAIkZ,GAAK4wF,GAAE,MACb5wF,EAAE,OACFA,EAAElZ,EAAE,MAAM,CAChB,EACIkZ,GAAK4wF,GAAE,QACL,CAAC,SAAU,MAAO,OAAQ,OAAQ,MAAO,QAAS,QAAQ,EACzD,GAAM,CACL,OAAO5wF,EAAE,CAAC,CACZ,CACN,EAAOlZ,EAAE,QAAU0sG,GAAG,OAAO,EAAGxzF,CAAC,EAC7B,MAAM,EAAI,CAAA,EACV,IAAIpZ,EAAI,GACR,KAAK,aAAa,QAAQ,QAAQ,SAASk1B,EAAG,CAC5C,OAAOA,EAAE,SAAW,YAAcA,EAAE,QAAQh1B,CAAC,IAAM,KAAOF,EAAIA,GAAKk1B,EAAE,YAAa,EAAE,QAAQA,EAAE,UAAWA,EAAE,QAAQ,EACrH,CAAC,EACD,MAAMxT,EAAI,CAAA,EACV,KAAK,aAAa,SAAS,QAAQ,SAASwT,EAAG,CAC7CxT,EAAE,KAAKwT,EAAE,UAAWA,EAAE,QAAQ,CAChC,CAAC,EACD,IAAI,EAAG3V,EAAI,EAAGvJ,EACd,GAAI,CAAChW,EAAG,CACN,MAAM,EAAI,CAACqvG,GAAG,KAAK,IAAI,EAAG,MAAM,EAChC,IAAK,EAAE,QAAQ,GAAG,CAAC,EAAG,EAAE,KAAK,GAAG3tF,CAAC,EAAG1L,EAAI,EAAE,OAAQ,EAAI,QAAQ,QAAQ9V,CAAC,EAAGqf,EAAIvJ,GAC5E,EAAI,EAAE,KAAK,EAAEuJ,GAAG,EAAG,EAAEA,GAAG,CAAC,EAC3B,OAAO,CACT,CACAvJ,EAAI,EAAE,OACN,IAAIkF,EAAIhb,EACR,KAAOqf,EAAIvJ,GAAK,CACd,MAAM,EAAI,EAAEuJ,GAAG,EAAG2V,EAAI,EAAE3V,GAAG,EAC3B,GAAI,CACFrE,EAAI,EAAEA,CAAC,CACT,OAAStZ,EAAG,CACVszB,EAAE,KAAK,KAAMtzB,CAAC,EACd,KACF,CACF,CACA,GAAI,CACF,EAAIytG,GAAG,KAAK,KAAMn0F,CAAC,CACrB,OAAS,EAAG,CACV,OAAO,QAAQ,OAAO,CAAC,CACzB,CACA,IAAKqE,EAAI,EAAGvJ,EAAI0L,EAAE,OAAQnC,EAAIvJ,GAC5B,EAAI,EAAE,KAAK0L,EAAEnC,GAAG,EAAGmC,EAAEnC,GAAG,CAAC,EAC3B,OAAO,CACT,CACA,OAAOxe,EAAG,CACRA,EAAI8sG,GAAG,KAAK,SAAU9sG,CAAC,EACvB,MAAMb,EAAIytG,GAAG5sG,EAAE,QAASA,EAAE,IAAKA,EAAE,iBAAiB,EAClD,OAAOgqG,GAAG7qG,EAAGa,EAAE,OAAQA,EAAE,gBAAgB,CAC3C,CACF,EACAipG,GAAE,QAAQ,CAAC,SAAU,MAAO,OAAQ,SAAS,EAAG,SAASjpG,EAAG,CAC1D6uG,GAAG,UAAU7uG,CAAC,EAAI,SAASb,EAAG6V,EAAG,CAC/B,OAAO,KAAK,QAAQ83F,GAAG93F,GAAK,CAAA,EAAI,CAC9B,OAAQhV,EACR,IAAKb,EACL,MAAO6V,GAAK,IAAI,IACtB,CAAK,CAAC,CACJ,CACF,CAAC,EACDi0F,GAAE,QAAQ,CAAC,OAAQ,MAAO,OAAO,EAAG,SAASjpG,EAAG,CAC9C,SAASb,EAAE6V,EAAG,CACZ,OAAO,SAASqD,EAAGqD,EAAGxE,EAAG,CACvB,OAAO,KAAK,QAAQ41F,GAAG51F,GAAK,CAAA,EAAI,CAC9B,OAAQlX,EACR,QAASgV,EAAI,CACX,eAAgB,qBAC1B,EAAY,CAAA,EACJ,IAAKqD,EACL,KAAMqD,CACd,CAAO,CAAC,CACJ,CACF,CACAmzF,GAAG,UAAU7uG,CAAC,EAAIb,EAAC,EAAI0vG,GAAG,UAAU7uG,EAAI,MAAM,EAAIb,EAAE,EAAE,CACxD,CAAC,EACD,IAAI2vG,GAAK,MAAMC,EAAG,CAChB,YAAY,EAAG,CACb,GAAI,OAAO,GAAK,WACd,MAAM,IAAI,UAAU,8BAA8B,EACpD,IAAI,EACJ,KAAK,QAAU,IAAI,QAAQ,SAAS12F,EAAG,CACrC,EAAIA,CACN,CAAC,EACD,MAAM,EAAI,KACV,KAAK,QAAQ,KAAM,GAAM,CACvB,GAAI,CAAC,EAAE,WAAY,OACnB,IAAIA,EAAI,EAAE,WAAW,OACrB,KAAOA,KAAM,GACX,EAAE,WAAWA,CAAC,EAAE,CAAC,EACnB,EAAE,WAAa,IACjB,CAAC,EAAG,KAAK,QAAQ,KAAQ,GAAM,CAC7B,IAAIA,EACJ,MAAMqD,EAAI,IAAI,QAASxE,GAAM,CAC3B,EAAE,UAAUA,CAAC,EAAGmB,EAAInB,CACtB,CAAC,EAAE,KAAK,CAAC,EACT,OAAOwE,EAAE,OAAS,UAAW,CAC3B,EAAE,YAAYrD,CAAC,CACjB,EAAGqD,CACL,EAAG,EAAE,SAASrD,EAAG,EAAG,EAAG,CACrB,EAAE,SAAW,EAAE,OAAS,IAAI2zF,GAAG3zF,EAAG,EAAG,CAAC,EAAG,EAAE,EAAE,MAAM,EACrD,CAAC,CACH,CAIA,kBAAmB,CACjB,GAAI,KAAK,OACP,MAAM,KAAK,MACf,CAIA,UAAU,EAAG,CACX,GAAI,KAAK,OAAQ,CACf,EAAE,KAAK,MAAM,EACb,MACF,CACA,KAAK,WAAa,KAAK,WAAW,KAAK,CAAC,EAAI,KAAK,WAAa,CAAC,CAAC,CAClE,CAIA,YAAY,EAAG,CACb,GAAI,CAAC,KAAK,WACR,OACF,MAAM,EAAI,KAAK,WAAW,QAAQ,CAAC,EACnC,IAAM,IAAM,KAAK,WAAW,OAAO,EAAG,CAAC,CACzC,CACA,eAAgB,CACd,MAAM,EAAI,IAAI,gBAAmB,EAAK,GAAM,CAC1C,EAAE,MAAM,CAAC,CACX,EACA,OAAO,KAAK,UAAU,CAAC,EAAG,EAAE,OAAO,YAAc,IAAM,KAAK,YAAY,CAAC,EAAG,EAAE,MAChF,CAKA,OAAO,QAAS,CACd,IAAI,EACJ,MAAO,CACL,MAAO,IAAI02F,GAAG,SAASl8F,EAAG,CACxB,EAAIA,CACN,CAAC,EACD,OAAQ,CACd,CACE,CACF,EACA,SAASm8F,GAAG9qD,EAAG,CACb,OAAO,SAAS/kD,EAAG,CACjB,OAAO+kD,EAAE,MAAM,KAAM/kD,CAAC,CACxB,CACF,CACA,SAAS8vG,GAAG/qD,EAAG,CACb,OAAO+kD,GAAE,SAAS/kD,CAAC,GAAKA,EAAE,eAAiB,EAC7C,CACA,MAAMgrD,GAAK,CACT,SAAU,IACV,mBAAoB,IACpB,WAAY,IACZ,WAAY,IACZ,GAAI,IACJ,QAAS,IACT,SAAU,IACV,4BAA6B,IAC7B,UAAW,IACX,aAAc,IACd,eAAgB,IAChB,YAAa,IACb,gBAAiB,IACjB,OAAQ,IACR,gBAAiB,IACjB,iBAAkB,IAClB,MAAO,IACP,SAAU,IACV,YAAa,IACb,SAAU,IACV,OAAQ,IACR,kBAAmB,IACnB,kBAAmB,IACnB,WAAY,IACZ,aAAc,IACd,gBAAiB,IACjB,UAAW,IACX,SAAU,IACV,iBAAkB,IAClB,cAAe,IACf,4BAA6B,IAC7B,eAAgB,IAChB,SAAU,IACV,KAAM,IACN,eAAgB,IAChB,mBAAoB,IACpB,gBAAiB,IACjB,WAAY,IACZ,qBAAsB,IACtB,oBAAqB,IACrB,kBAAmB,IACnB,UAAW,IACX,mBAAoB,IACpB,oBAAqB,IACrB,OAAQ,IACR,iBAAkB,IAClB,SAAU,IACV,gBAAiB,IACjB,qBAAsB,IACtB,gBAAiB,IACjB,4BAA6B,IAC7B,2BAA4B,IAC5B,oBAAqB,IACrB,eAAgB,IAChB,WAAY,IACZ,mBAAoB,IACpB,eAAgB,IAChB,wBAAyB,IACzB,sBAAuB,IACvB,oBAAqB,IACrB,aAAc,IACd,YAAa,IACb,8BAA+B,IAC/B,gBAAiB,IACjB,mBAAoB,IACpB,oBAAqB,IACrB,gBAAiB,IACjB,mBAAoB,IACpB,sBAAuB,GACzB,EACA,OAAO,QAAQA,EAAE,EAAE,QAAQ,CAAC,CAAChrD,EAAG,CAAC,IAAM,CACrCgrD,GAAG,CAAC,EAAIhrD,CACV,CAAC,EACD,SAASirD,GAAGjrD,EAAG,CACb,MAAM,EAAI,IAAI2qD,GAAG3qD,CAAC,EAAG,EAAImhD,GAAGwJ,GAAG,UAAU,QAAS,CAAC,EACnD,OAAO5F,GAAE,OAAO,EAAG4F,GAAG,UAAW,EAAG,CAAE,WAAY,EAAE,CAAE,EAAG5F,GAAE,OAAO,EAAG,EAAG,KAAM,CAAE,WAAY,EAAE,CAAE,EAAG,EAAE,OAAS,SAASp2F,EAAG,CACxH,OAAOs8F,GAAGrC,GAAG5oD,EAAGrxC,CAAC,CAAC,CACpB,EAAG,CACL,CACA,MAAMu8F,GAAKD,GAAGjE,EAAE,EAChBkE,GAAG,MAAQP,GACXO,GAAG,cAAgBpD,GACnBoD,GAAG,YAAcN,GACjBM,GAAG,SAAWrD,GACdqD,GAAG,QAAUb,GACba,GAAG,WAAazF,GAChByF,GAAG,WAAalG,GAChBkG,GAAG,OAASA,GAAG,cACfA,GAAG,IAAM,SAASpvG,EAAG,CACnB,OAAO,QAAQ,IAAIA,CAAC,CACtB,EACAovG,GAAG,OAASJ,GACZI,GAAG,aAAeH,GAClBG,GAAG,YAActC,GACjBsC,GAAG,aAAevD,GAClBuD,GAAG,WAAclrD,GAAMzvB,GAAGw0E,GAAE,WAAW/kD,CAAC,EAAI,IAAI,SAASA,CAAC,EAAIA,CAAC,EAC/DkrD,GAAG,WAAahB,GAAG,WACnBgB,GAAG,eAAiBF,GACpBE,GAAG,QAAUA,GACb,KAAM,CACJ,MAAOC,GACP,WAAYC,GACZ,cAAeC,GACf,SAAUC,GACV,YAAaC,GACb,QAASC,GACT,IAAKC,GACL,OAAQC,GACR,aAAcC,GACd,OAAQC,GACR,WAAYC,GACZ,aAAcC,GACd,eAAgBC,GAChB,WAAYC,GACZ,WAAYC,GACZ,YAAaC,EACf,EAAIhB,GACJ,SAASiB,GAAGnsD,EAAG,EAAG,CAChB,IAAI,EACJ,GAAI,OAAO,eAAiB,EAAI,IAAI,eAAmB,OAAO,cAAgB,EAAI,IAAI,OAAO,cAAkB,MAAM,cAAc,EAAG,GAAK,KAAM,CAC/I,IAAI,EAAIA,EACR,EAAE,KAAK,MAAO,EAAG,EAAE,EAAG,EAAE,KAAK,IAAI,EAAG,EAAE,mBAAqB,UAAW,CACpE,EAAE,YAAc,GAAK,EAAE,QAAU,MAAQ,EAAE,aAAa,SAAS,UAAW,CAAC,GAAK,EAAE,aAAa,SAAS,UAAW,CAAC,GAAK,EAAE,aAAa,SAAS,UAAW,CAAC,EAAI,EAAE,IAAI,EAAI,EAAE,EAAE,YAAY,EAC/L,EAAG,EAAE,UAAY,UAAW,CAC1B,EAAE,YAAc,GAAK,EAAE,QAAU,KAAO,EAAE,QAAU,KAAO,EAAE,IAAI,CACnE,CACF,CACF,CACA,SAASosD,GAAGpsD,EAAG,EAAG,CAChBkrD,GAAG,CACD,OAAQ,MACR,aAAc,OACd,IAAKlrD,CACT,CAAG,EAAE,KAAM,GAAM,CACb,IAAI,EAAI,IAAI,OAAO,KAAK,CAAC,EAAE,IAAI,EAAG,YAAa,CAC7C,KAAM,KACZ,CAAK,EACDkhD,GAAG,UAAU,CAAC,EAAE,KAAM,GAAM,CAC1B,MAAM/sF,EAAoB,IAAI,IAAOqD,EAAI,CAAA,EACzC,QAASxE,KAAK,EAAE,MAAO,CACrB,GAAI,EAAE,MAAMA,CAAC,EAAE,IACb,SACF,MAAM,EAAI,EAAE,KAAK,EAAE,MAAMA,CAAC,EAAE,IAAI,EAChC,GAAI,EAAG,CACL,MAAMyJ,EAAI,EAAE,MAAM,MAAM,EAAE,KAAMvJ,GAAM,CACpC,MAAM,EAAI,IAAI,gBAAgBA,CAAC,EAC/BiB,EAAE,IAAI,IAAM,EAAE,MAAMnB,CAAC,EAAE,KAAK,QAAQ,KAAM,GAAG,EAAG,CAAC,CACnD,CAAC,EACDwE,EAAE,KAAKiF,CAAC,CACV,CACF,CACA,QAAQ,IAAIjF,CAAC,EAAE,KAAK,IAAM,CACxB,EAAErD,CAAC,CACL,CAAC,EAAE,MAAOnB,GAAM,CACd,QAAQ,MAAM,aAAcA,CAAC,EAAG,EAAkB,IAAI,GAAK,CAC7D,CAAC,CACH,CAAC,EAAE,MAAO,GAAM,CACd,QAAQ,MAAM,aAAc,CAAC,EAAG,EAAkB,IAAI,GAAK,CAC7D,CAAC,CACH,CAAC,EAAE,MAAO,GAAM,CACd,QAAQ,MAAM,aAAc,CAAC,EAAG,EAAkB,IAAI,GAAK,CAC7D,CAAC,CACH,CACA,SAASq5F,GAAGrsD,EAAG,EAAG,CAChBkrD,GAAG,CACD,OAAQ,MACR,aAAc,OACd,IAAKlrD,CACT,CAAG,EAAE,KAAM,GAAM,CACb,IAAI,EAAI,IAAI,OAAO,KAAK,CAAC,EAAE,IAAI,EAAG,YAAa,CAC7C,KAAM,KACZ,CAAK,EACDkhD,GAAG,UAAU,CAAC,EAAE,KAAM/sF,GAAM,CAC1B,QAASqD,KAAKrD,EAAE,MACdA,EAAE,KAAKA,EAAE,MAAMqD,CAAC,EAAE,IAAI,EAAE,MAAM,MAAM,EAAE,KAAMzc,GAAM,CAChD,EAAEA,EAAG,QAAS,SAAS0hB,EAAG,EAAG,CAC3B,EAAE,CAAC,CACL,CAAC,CACH,CAAC,CACL,CAAC,CACH,CAAC,EACD,SAAS,EAAE,EAAG,EAAGtI,EAAG,CAClB,IAAIqD,EAAI,IAAI,WAAcxE,EAAI,IAAI,KAAK,CAAC,CAAC,CAAC,EAC1CwE,EAAE,OAAS,SAAS,EAAG,CACrBrD,EAAE,KAAM,EAAE,OAAO,MAAM,CACzB,EAAGqD,EAAE,QAAU,SAAS,EAAG,CACzBrD,EAAE,EAAE,MAAO,IAAI,CACjB,EAAGqD,EAAE,WAAWxE,EAAG,CAAC,CACtB,CACF,CACA,MAAMs5F,GAAqB,IAAI,QAC/B,MAAMC,WAAWC,EAAG,CAMlB,YAAY,EAAG,CACb,MAAM,CAAC,EAAG,KAAK,YAAc,GAAI,KAAK,cAAgB,CAAA,EAAI,KAAK,cAAgB,KAAM,KAAK,eAAiB,KAAM,KAAK,YAAc,EAAG,KAAK,WAAa,CAAA,EAAI,KAAK,iBAAmB,EAAG,KAAK,gBAAkB,GAAI,KAAK,oBAAsB,CAC5O,SAAU,WACV,OAAQ,SACR,MAAO,QACP,GAAI,WACV,EAAO,KAAK,sBAAwB,CAC9B,SAAU,eACV,OAAQ,eACR,MAAO,eACP,GAAI,cACV,CACE,CAOA,eAAe,EAAG,CAChB,OAAO,KAAK,YAAc,EAAG,IAC/B,CAOA,iBAAiB,EAAG,CAClB,OAAO,KAAK,cAAgB,EAAG,IACjC,CAQA,eAAe,EAAG,CAChB,OAAO,KAAK,YAAc,EAAG,IAC/B,CAUA,KAAK,EAAG,EAAG,EAAG,EAAG,CACf,MAAMr4F,EAAI,IAAIs4F,GAAG,KAAK,OAAO,EAC7Bt4F,EAAE,QAAQ,KAAK,IAAI,EAAGA,EAAE,gBAAgB,aAAa,EAAGA,EAAE,iBAAiB,KAAK,aAAa,EAAGA,EAAE,mBAAmB,KAAK,eAAe,EAAGA,EAAE,KAAK,EAAIqD,GAAM,CAC3J,KAAK,MAAMA,EAAG,EAAG,CAAC,CACpB,EAAG,EAAG,CAAC,CACT,CAQA,MAAM,EAAG,EAAG,EAAI,IAAM,CACtB,EAAG,CACD,KAAK,gBAAgB,EAAG,EAAG,KAAM,KAAMk1F,GAAI,CAAC,EAAE,MAAM,CAAC,CACvD,CAEA,gBAAgB,EAAG,EAAG,EAAG,EAAGv4F,EAAIw4F,GAAIn1F,EAAI,IAAM,CAC9C,EAAG,CACD,MAAMxE,EAAI,CACR,aAAc,GAAK,KAAK,oBACxB,eAAgB,GAAK,KAAK,sBAC1B,aAAc,CAAC,CAAC,EAChB,iBAAkBmB,CACxB,EACI,OAAO,KAAK,eAAe,EAAGnB,CAAC,EAAE,KAAK,CAAC,EAAE,MAAMwE,CAAC,CAClD,CACA,eAAe,EAAG,EAAG,CACnB,MAAM,EAAI,KAAK,UAAU,CAAC,EAC1B,GAAI80F,GAAG,IAAI,CAAC,EAAG,CACb,MAAM,EAAIA,GAAG,IAAI,CAAC,EAClB,GAAI,EAAE,MAAQ,EACZ,OAAO,EAAE,QACX,GAAI,EAAE,aAAe,EACnB,MAAM,IAAI,MACR,+GACV,CACI,CACA,IAAI,EACJ,MAAMn4F,EAAI,KAAK,mBAAoBqD,EAAI,EAAE,WAAYxE,EAAI,KAAK,WAAWmB,EAAGqD,CAAC,EAAE,KAAM,IAAO,EAAI,EAAG,IAAI,QAAQ,CAACiF,EAAGvJ,IAAM,CACvH,EAAE,WAAWiB,CAAC,EAAI,CAAE,QAASsI,EAAG,OAAQvJ,GAAK,EAAE,YAAY,CAAE,KAAM,SAAU,GAAIiB,EAAG,WAAY,EAAG,OAAQ,CAAC,EAAI,CAAC,CAAC,CAAC,CACrH,CAAC,EAAE,EAAE,KAAM,GAAM,KAAK,gBAAgB,EAAE,QAAQ,CAAC,EACjD,OAAOnB,EAAE,MAAM,IAAM,EAAE,EAAE,KAAK,IAAM,CAClC,GAAKmB,GAAK,KAAK,aAAa,EAAGA,CAAC,CAClC,CAAC,EAAGm4F,GAAG,IAAI,EAAG,CACZ,IAAK,EACL,QAASt5F,CACf,CAAK,EAAGA,CACN,CACA,gBAAgB,EAAG,CACjB,MAAM,EAAI,IAAI0nF,GACd,EAAE,OAAS,EAAE,SAAS,IAAIkS,GAAG,EAAE,MAAM,MAAO,CAAC,CAAC,EAC9C,QAAS,EAAI,EAAG,EAAI,EAAE,WAAW,OAAQ,IAAK,CAC5C,KAAM,CAAE,KAAM,EAAG,MAAOz4F,EAAG,SAAUqD,EAAG,OAAQxE,EAAG,iBAAkB,CAAC,EAAK,EAAE,WAAW,CAAC,EACzF,IAAIyJ,EACJ,GAAIjF,IAAMxE,EACRyJ,EAAI,IAAImwF,GAAGz4F,EAAGqD,CAAC,MACZ,CACH,MAAMtE,EAAI,IAAI25F,GAAG14F,EAAGnB,CAAC,EACrByJ,EAAI,IAAIqwF,GAAG55F,EAAGsE,EAAG,CAAC,CACpB,CACA,IAAM,UAAY,KAAK,wBAAwBiF,EAAG,CAAC,EAAGA,EAAE,WAAa,EAAEtI,aAAa,eAAgB,EAAE,aAAa,EAAGsI,CAAC,CACzH,CACA,OAAO,CACT,CACA,wBAAwB,EAAG,EAAG,CAC5B,GAAI,IAAMiwF,GAAI,OACd,MAAM,EAAI,IAAIjR,GACd,QAAS,EAAI,EAAGtnF,EAAI,EAAE,MAAO,EAAIA,EAAG,IAClC,EAAE,oBAAoB,EAAG,CAAC,EAAGyrF,GAAG,oBAAoB,EAAG8M,EAAE,EAAG,EAAE,OAAO,EAAG,EAAE,EAAG,EAAE,EAAG,EAAE,CAAC,CACzF,CACA,aAAa,EAAG,EAAG,CACjB,MAAM,EAAI,IAAID,GAAG,KAAK,OAAO,EAC7B,OAAO,EAAE,QAAQ,KAAK,WAAW,EAAG,EAAE,gBAAgB,CAAC,EAAG,EAAE,mBAAmB,KAAK,eAAe,EAAG,IAAI,QAAQ,CAAC,EAAGt4F,IAAM,CAC1H,EAAE,KAAK,EAAG,EAAG,OAAQA,CAAC,CACxB,CAAC,CACH,CACA,SAAU,CACR,OAAO,KAAK,aAAY,EAAI,IAC9B,CACA,cAAe,CACb,GAAI,KAAK,eAAgB,OAAO,KAAK,eACrC,MAAM,EAAI,OAAO,aAAe,UAAY,KAAK,cAAc,OAAS,KAAM,EAAI,CAAA,EAClF,OAAO,EAAI,EAAE,KAAK,KAAK,aAAa,mBAAoB,MAAM,CAAC,GAAK,EAAE,KAAK,KAAK,aAAa,wBAAyB,MAAM,CAAC,EAAG,EAAE,KAAK,KAAK,aAAa,qBAAsB,aAAa,CAAC,GAAI,KAAK,eAAiB,QAAQ,IAAI,CAAC,EAAE,KAAM,GAAM,CAChP,MAAM,EAAI,EAAE,CAAC,EACb,IAAM,KAAK,cAAc,WAAa,EAAE,CAAC,GACzC,MAAMA,EAAI44F,GAAG,SAAQ,EAAIv1F,EAAI,CAC3B,sBACA,EACA,GACA,eACArD,EAAE,UAAUA,EAAE,QAAQ,GAAG,EAAI,EAAGA,EAAE,YAAY,GAAG,CAAC,CAC1D,EAAQ,KAAK;AAAA,CACZ,EACK,KAAK,gBAAkB,IAAI,gBAAgB,IAAI,KAAK,CAACqD,CAAC,CAAC,CAAC,CAC1D,CAAC,EAAG,KAAK,cACX,CACA,WAAW,EAAG,EAAG,CACf,OAAO,KAAK,eAAe,KAAK,IAAM,CACpC,GAAI,KAAK,WAAW,OAAS,KAAK,YAAa,CAC7C,MAAM,EAAI,IAAI,OAAO,KAAK,eAAe,EACzC,EAAE,WAAa,CAAA,EAAI,EAAE,WAAa,CAAA,EAAI,EAAE,UAAY,EAAG,EAAE,YAAY,CAAE,KAAM,OAAQ,cAAe,KAAK,aAAa,CAAE,EAAG,EAAE,UAAY,SAASrD,EAAG,CACnJ,MAAMqD,EAAIrD,EAAE,KACZ,OAAQqD,EAAE,KAAI,CACZ,IAAK,SACH,EAAE,WAAWA,EAAE,EAAE,EAAE,QAAQA,CAAC,EAC5B,MACF,IAAK,QACH,EAAE,WAAWA,EAAE,EAAE,EAAE,OAAOA,CAAC,EAC3B,MACF,QACE,QAAQ,MAAM,2CAA6CA,EAAE,KAAO,GAAG,CACrF,CACQ,EAAG,KAAK,WAAW,KAAK,CAAC,CAC3B,MACE,KAAK,WAAW,KAAK,SAAS,EAAGrD,EAAG,CAClC,OAAO,EAAE,UAAYA,EAAE,UAAY,GAAK,CAC1C,CAAC,EACH,MAAM,EAAI,KAAK,WAAW,KAAK,WAAW,OAAS,CAAC,EACpD,OAAO,EAAE,WAAW,CAAC,EAAI,EAAG,EAAE,WAAa,EAAG,CAChD,CAAC,CACH,CACA,aAAa,EAAG,EAAG,CACjB,EAAE,WAAa,EAAE,WAAW,CAAC,EAAG,OAAO,EAAE,WAAW,CAAC,EAAG,OAAO,EAAE,WAAW,CAAC,CAC/E,CACA,OAAQ,CACN,QAAQ,IAAI,cAAe,KAAK,WAAW,IAAK,GAAM,EAAE,SAAS,CAAC,CACpE,CACA,SAAU,CACR,QAAS,EAAI,EAAG,EAAI,KAAK,WAAW,OAAQ,EAAE,EAC5C,KAAK,WAAW,CAAC,EAAE,UAAS,EAC9B,OAAO,KAAK,WAAW,OAAS,EAAG,KAAK,kBAAoB,IAAM,IAAI,gBAAgB,KAAK,eAAe,EAAG,IAC/G,CACF,CACA,SAAS44F,IAAK,CACZ,IAAI/sD,EAAG,EACP,UAAY,SAASxoC,EAAG,CACtB,MAAMxE,EAAIwE,EAAE,KACZ,OAAQxE,EAAE,KAAI,CACZ,IAAK,OACHgtC,EAAIhtC,EAAE,cAAe,EAAI,IAAI,QAAQ,SAASE,EAAG,CAC/C8sC,EAAE,eAAiB,SAAS,EAAG,CAC7B9sC,EAAE,CAAE,MAAO,EAAG,CAChB,EAAG,mBAAmB8sC,CAAC,CACzB,CAAC,EACD,MACF,IAAK,SACH,MAAM,EAAIhtC,EAAE,OAAQyJ,EAAIzJ,EAAE,WAC1B,EAAE,KAAME,GAAM,CACZ,MAAM,EAAIA,EAAE,MAAOnC,EAAI,IAAI,EAAE,QAC7B,GAAI,CACF,MAAMkF,EAAI,EAAE,EAAGlF,EAAG,IAAI,UAAU,CAAC,EAAG0L,CAAC,EAAGnY,EAAI2R,EAAE,WAAW,IAAKga,GAAMA,EAAE,MAAM,MAAM,EAClFha,EAAE,OAAS3R,EAAE,KAAK2R,EAAE,MAAM,MAAM,MAAM,EAAG,KAAK,YAAY,CAAE,KAAM,SAAU,GAAIjD,EAAE,GAAI,SAAUiD,CAAC,EAAI3R,CAAC,CACxG,OAAS2R,EAAG,CACV,QAAQ,MAAMA,CAAC,EAAG,KAAK,YAAY,CAAE,KAAM,QAAS,GAAIjD,EAAE,GAAI,MAAOiD,EAAE,OAAO,CAAE,CAClF,QAAC,CACC,EAAE,QAAQlF,CAAC,CACb,CACF,CAAC,EACD,KACR,CACE,EACA,SAAS,EAAEyG,EAAGxE,EAAG,EAAGyJ,EAAG,CACrB,MAAMvJ,EAAIuJ,EAAE,aAAc,EAAIA,EAAE,eAChC,IAAI1L,EAAGkF,EACP,MAAM3R,EAAI0O,EAAE,uBAAuB,CAAC,EACpC,GAAI1O,IAAMkT,EAAE,gBACVzG,EAAI,IAAIyG,EAAE,KAAQvB,EAAIjD,EAAE,kBAAkB,EAAG,EAAE,WAAYjC,CAAC,UACrDzM,IAAMkT,EAAE,YACfzG,EAAI,IAAIyG,EAAE,WAAcvB,EAAIjD,EAAE,wBAAwB,EAAG,EAAE,WAAYjC,CAAC,MAExE,OAAM,IAAI,MAAM,8CAA8C,EAChE,GAAI,CAACkF,EAAE,GAAE,GAAMlF,EAAE,MAAQ,EACvB,MAAM,IAAI,MAAM,uCAAyCkF,EAAE,UAAS,CAAE,EACxE,MAAMga,EAAI,CAAE,MAAO,KAAM,WAAY,CAAA,CAAE,EACvC,UAAWtzB,KAAKuW,EAAG,CACjB,MAAM3B,EAAI,KAAK,EAAE5U,CAAC,CAAC,EACnB,IAAIsY,EAAGhE,EACP,GAAIwL,EAAE,aACJxL,EAAIiC,EAAEvW,CAAC,EAAGsY,EAAIjC,EAAE,uBAAuBjC,EAAGE,CAAC,MACxC,CACH,GAAIA,EAAI+B,EAAE,eAAejC,EAAGyG,EAAEtE,EAAEvW,CAAC,CAAC,CAAC,EAAGsU,IAAM,GAAI,SAChDgE,EAAIjC,EAAE,aAAajC,EAAGE,CAAC,CACzB,CACA,MAAMuoF,EAAI,EAAEhiF,EAAGxE,EAAGjC,EAAGpU,EAAG4U,EAAG0D,CAAC,EAC5BtY,IAAM,UAAY68F,EAAE,iBAAmB/8E,EAAE,kBAAmBwT,EAAE,WAAW,KAAKupE,CAAC,CACjF,CACA,OAAOl1F,IAAMkT,EAAE,kBAAoByY,EAAE,MAAQ,EAAEzY,EAAGxE,EAAGjC,CAAC,GAAIyG,EAAE,QAAQzG,CAAC,EAAGkf,CAC1E,CACA,SAAS,EAAEzY,EAAGxE,EAAG,EAAG,CAClB,MAAM,EAAI,EAAE,UAAS,EAAK,EAAGsH,EAAI,EAAI,EAAGvJ,EAAIyG,EAAE,QAAQ8C,CAAC,EACvDtH,EAAE,wBAAwB,EAAGsH,EAAGvJ,CAAC,EACjC,MAAMkF,EAAI,IAAI,YAAYuB,EAAE,QAAQ,OAAQzG,EAAG,CAAC,EAAE,MAAK,EACvD,OAAOyG,EAAE,MAAMzG,CAAC,EAAG,CAAE,MAAOkF,EAAG,SAAU,CAAC,CAC5C,CACA,SAAS,EAAEuB,EAAGxE,EAAG,EAAGyJ,EAAGvJ,EAAG,EAAG,CAC3B,MAAMnC,EAAI,EAAE,WAAU,EAAIkF,EAAI,EAAE,eAAc,EAAI3R,EAAI6P,EAAEqD,EAAGtE,CAAC,EAAG+c,EAAIha,EAAI/C,EAAE,kBAAmBvW,EAAI,KAAK,KAAKszB,EAAI,CAAC,EAAI,EAAG1e,EAAI5U,EAAIuW,EAAE,kBAAmB+B,EAAIlE,EAAIkf,EAAGhf,EAAIF,EAAIpU,EAAG68F,EAAIhiF,EAAE,QAAQvC,CAAC,EACxLjC,EAAE,kCAAkC,EAAG,EAAG1O,EAAG2Q,EAAGukF,CAAC,EACjD,MAAMvmF,EAAI,IAAIC,EAAEsE,EAAE,QAAQ,OAAQgiF,EAAGvkF,EAAI/B,EAAE,iBAAiB,EAC5D,IAAIumF,EACJ,GAAIxpE,IAAMtzB,EACR88F,EAAIxmF,EAAE,MAAK,MACR,CACHwmF,EAAI,IAAIvmF,EAAEjC,EAAIiC,EAAE,iBAAiB,EACjC,IAAIwmF,EAAI,EACR,QAASE,EAAI,EAAGE,EAAI7mF,EAAE,OAAQ2mF,EAAIE,EAAGF,IAAK,CACxC,QAASG,EAAI,EAAGA,EAAI9jF,EAAG8jF,IACrBN,EAAEC,EAAIK,CAAC,EAAI9mF,EAAE2mF,EAAI3jF,EAAI8jF,CAAC,EACxBL,GAAKnoF,CACP,CACF,CACA,OAAOiG,EAAE,MAAMgiF,CAAC,EAAG,CACjB,KAAM/8E,EACN,MAAO1L,EACP,SAAUkF,EACV,MAAOwjF,EACP,OAAQloF,CACd,CACE,CACA,SAAS4C,EAAEqD,EAAGxE,EAAG,CACf,OAAQA,EAAC,CACP,KAAK,aACH,OAAOwE,EAAE,WACX,KAAK,UACH,OAAOA,EAAE,QACX,KAAK,WACH,OAAOA,EAAE,SACX,KAAK,WACH,OAAOA,EAAE,SACX,KAAK,WACH,OAAOA,EAAE,SACX,KAAK,YACH,OAAOA,EAAE,UACX,KAAK,YACH,OAAOA,EAAE,SACjB,CACE,CACF,CACA,IAAIw1F,IAAuBhtD,IAAOA,EAAE,eAAiB,mBAAoBA,EAAE,kBAAoB,sBAAuBA,EAAE,YAAc,eAAgBA,EAAE,WAAa,cAAeA,EAAE,iBAAmB,oBAAqBA,EAAE,aAAe,gBAAiBA,EAAE,MAAQ,QAASA,EAAE,UAAY,aAAcA,EAAE,cAAgB,iBAAkBA,EAAE,WAAa,cAAeA,EAAE,eAAiB,kBAAmBA,EAAE,WAAa,cAAeA,EAAE,WAAa,cAAeA,EAAE,eAAiB,kBAAmBA,EAAE,YAAc,eAAgBA,IAAIgtD,IAAM,CAAA,CAAE,EACriB,SAASC,GAAGjtD,EAAG,EAAG,EAAG,EAAG,CACtB,IAAI,EAAI,EAAG7rC,EAAI,EAAGqD,EAAI,EAAGxE,EAAIgtC,EAAE,OAAO,KAAM/pC,GAAMA,EAAE,KAAO,CAAC,EAAG,EAAI,EAAE,aAAcwG,EAAI,EAAE,SAAS,OAAQxG,GAAMA,EAAE,OAAS,IAAI,EAAG/C,EAAI,EAAE,SAAS,OAAQ+C,GAAMA,EAAE,OAAS,IAAI,EAAG,EAAI,EAAE,YAAalF,EAAIivC,EAAE,MAC1M,GAAI,IAAIktD,GAAuB,IAAIC,GAAoB,GAAK,EAAE,OAAQ,CACpE,IAAIl3F,EAAI,GAAI3R,EAAI,EAChB,QAAS2rB,KAAK,EACZA,EAAE,MAAQA,EAAE,MAAM,MAAM,GAAG,EAAE,IAAKtzB,GAAM,SAASA,CAAC,EAAI,GAAG,EAAGszB,EAAE,MAAQ,IAAIm9E,GAAQn9E,EAAE,MAAM,CAAC,EAAGA,EAAE,MAAM,CAAC,EAAGA,EAAE,MAAM,CAAC,CAAC,EAAGA,EAAE,SAAW,CAClI,EAAGA,EAAE,WAAW,EAAI,MAAS,EAC7B,EAAGA,EAAE,WAAW,EAAI,MAAS9b,EAC7B,EAAG,CAAC8b,EAAE,WAAW,EAAI,MAASzY,CACtC,EAASyY,EAAE,SAAW,CACd,EAAG,EACH,EAAG,EACH,EAAG,CACX,EAASA,EAAE,QAAU,CACb,CAAC+vB,EAAE,MAAM,SAAS,OAAQ17C,IAAK,EAAG,CAAC,CAC3C,EAAS0O,EAAE,SAAS,IAAI,OAAOid,EAAE,EAAE,EAAGA,CAAC,EAAGha,EAAE,KAAKga,CAAC,EAC9Co9E,GAAG,SAAUt8F,EAAGkF,EAAG,CAAC,CACtB,CACA,GAAIwG,GAAKA,EAAE,OAAQ,CACjB,IAAIxG,EAAI,GAAI3R,EAAI,EAChB,QAAS2rB,KAAKxT,EACZwT,EAAE,MAAQA,EAAE,MAAM,MAAM,GAAG,EAAE,IAAKtzB,GAAM,SAASA,CAAC,EAAI,GAAG,EAAGszB,EAAE,MAAQ,IAAIm9E,GAAQn9E,EAAE,MAAM,CAAC,EAAGA,EAAE,MAAM,CAAC,EAAGA,EAAE,MAAM,CAAC,CAAC,EAAGA,EAAE,SAAW,CAClI,EAAGA,EAAE,WAAW,EAAI,MAAS,EAC7B,EAAGA,EAAE,WAAW,EAAI,MAAS9b,EAC7B,EAAG,CAAC8b,EAAE,WAAW,EAAI,MAASzY,CACtC,EAASyY,EAAE,SAAW,CACd,EAAG,EACH,EAAG,EACH,EAAG,CACX,EAASA,EAAE,QAAU,CACb,CAAC+vB,EAAE,MAAM,SAAS,OAAQ17C,IAAK,EAAG,CAAC,CAC3C,EAAS0O,EAAE,SAAS,IAAI,OAAOid,EAAE,EAAE,EAAGA,CAAC,EAAGha,EAAE,KAAKga,CAAC,EAC9Co9E,GAAG,OAAQt8F,EAAGkF,EAAG,CAAC,CACpB,CACA,GAAI,GAAK,EAAE,OAAQ,CACjB,IAAIA,EAAI,GAAI3R,EAAI,EAChB,QAAS2rB,KAAK,EACZA,EAAE,MAAQA,EAAE,MAAM,MAAM,GAAG,EAAE,IAAKtzB,GAAM,SAASA,CAAC,EAAI,GAAG,EAAGszB,EAAE,MAAQ,IAAIm9E,GAAQn9E,EAAE,MAAM,CAAC,EAAGA,EAAE,MAAM,CAAC,EAAGA,EAAE,MAAM,CAAC,CAAC,EAAGA,EAAE,SAAW,CAClI,EAAGA,EAAE,WAAW,EAAI,MAAS,EAC7B,EAAGA,EAAE,WAAW,EAAI,MAAS9b,EAC7B,EAAG,CAAC8b,EAAE,WAAW,EAAI,MAASzY,CACtC,EAASyY,EAAE,SAAW,CACd,EAAG,EACH,EAAG,EACH,EAAG,CACX,EAASA,EAAE,QAAU,CACb,CAAC+vB,EAAE,MAAM,SAAS,OAAQ17C,IAAK,EAAG,CAAC,CAC3C,EAAS0O,EAAE,SAAS,IAAI,OAAOid,EAAE,EAAE,EAAGA,CAAC,EAAGha,EAAE,KAAKga,CAAC,EAC9Co9E,GAAG,UAAWt8F,EAAGkF,EAAG,CAAC,CACvB,CACA,GAAI/C,GAAKA,EAAE,OAAQ,CACjB,IAAI+C,EAAI,GAAI3R,EAAI,EAChB,QAAS2rB,KAAK/c,EACZ+c,EAAE,MAAQA,EAAE,MAAM,MAAM,GAAG,EAAE,IAAKtzB,GAAM,SAASA,CAAC,EAAI,GAAG,EAAGszB,EAAE,MAAQ,IAAIm9E,GAAQn9E,EAAE,MAAM,CAAC,EAAGA,EAAE,MAAM,CAAC,EAAGA,EAAE,MAAM,CAAC,CAAC,EAAGA,EAAE,SAAW,CAClI,EAAGA,EAAE,WAAW,EAAI,MAAS,EAC7B,EAAGA,EAAE,WAAW,EAAI,MAAS9b,EAC7B,EAAG,CAAC8b,EAAE,WAAW,EAAI,MAASzY,CACtC,EAASyY,EAAE,SAAW,CACd,EAAG,EACH,EAAG,EACH,EAAG,CACX,EAASA,EAAE,QAAU,CACb,CAAC+vB,EAAE,MAAM,SAAS,OAAQ17C,IAAK,EAAG,CAAC,CAC3C,EAAS0O,EAAE,SAAS,IAAI,OAAOid,EAAE,EAAE,EAAGA,CAAC,EAAGha,EAAE,KAAKga,CAAC,EAC9Co9E,GAAG,SAAUt8F,EAAGkF,EAAG,CAAC,CACtB,CACF,CACA,SAASo3F,GAAGrtD,EAAG,EAAG,EAAG,EAAG,EAAG,CACzB,IAAI7rC,EAAGqD,EAAGxE,EAAI,CACZ,MAAO,EACP,OAAQ,EACR,OAAQ,EACR,SAAU,EACV,MAAO,IAAIo6F,GACX,SAAU,CACR,EAAG,EACH,EAAG,EACH,EAAG,CACT,EACI,SAAU,CACR,EAAG,EACH,EAAG,EACH,EAAG,CACT,CACA,EACE,OAAQptD,EAAC,CACP,IAAK,OACHxoC,EAAI81F,GAAG,OAAQt6F,CAAC,EAChB,MACF,IAAK,SACHwE,EAAI81F,GAAG,SAAUt6F,CAAC,EAClB,MACF,IAAK,SACHwE,EAAI81F,GAAG,SAAUt6F,CAAC,EAClB,MACF,IAAK,UACHwE,EAAI81F,GAAG,UAAWt6F,CAAC,EACnB,KACN,CACEwE,IAAMrD,EAAI,IAAIklF,GAAgB7hF,EAAE,SAAUA,EAAE,SAAU,EAAE,MAAM,EAAGrD,EAAE,IAAM,EAAG,EAAE,IAAIA,CAAC,GACnF,IAAI,EAAI,GAAIsI,EAAI,CAAA,EAChB,QAASvJ,EAAI,EAAGA,EAAI,EAAE,OAAQA,IAAK,CACjC,IAAI+C,EAAI,EAAE/C,CAAC,EAAG5O,EAAI,IAAIy0F,EAAU9iF,EAAE,WAAW,EAAG,EAAG,CAACA,EAAE,WAAW,CAAC,EAAGga,EAAI,IAAI8oE,EAAU9iF,EAAE,SAAS,EAAG,EAAG,CAACA,EAAE,SAAS,CAAC,EAAGtZ,EAAI,IAAIo8F,EAAU9iF,EAAE,WAAW,EAAGA,EAAE,WAAW,EAAG,CAACA,EAAE,WAAW,CAAC,EAAG1E,EAAI,IAAIwnF,EAAU9iF,EAAE,SAAS,EAAGA,EAAE,SAAS,EAAG,CAACA,EAAE,SAAS,CAAC,EAAGhB,EAAI,EAAGhE,EAAI,EAAGuoF,EAAI,EAC5Q,GAAI,KAAK,IAAIvpE,EAAE,MAAK,EAAG,IAAI3rB,EAAE,MAAK,CAAE,EAAE,CAAC,EAAI,KAAQ,KAAK,IAAI2rB,EAAE,MAAK,EAAG,IAAI3rB,EAAE,OAAO,EAAE,CAAC,EAAI,KACxF,GAAI2Q,GAAKgB,EAAE,WAAW,EAAIA,EAAE,SAAS,EAAI,EAAI,IAAM,KAAK,GAAK,GAAKA,EAAE,QAAU,KAAM,CAClF,IAAI,EAAI,IAAI8iF,EAAU9iF,EAAE,OAAO,EAAG,EAAG,CAACA,EAAE,OAAO,CAAC,EAChDhF,GAAK,EAAE,MAAK,EAAG,MAAM,IAAI8nF,EAAU,EAAG,EAAG,CAAC,CAAC,EAAE,GAAK,EAAI,EAAI,IAAM,EAAE,QAAQ,IAAIA,EAAU,EAAG,EAAG,CAAC,CAAC,EAAI,KAAK,GAAK,EAChH,OAEA9nF,GAAKgf,EAAE,MAAK,EAAG,IAAI3rB,EAAE,MAAK,CAAE,EAAE,MAAM,IAAIy0F,EAAU,EAAG,EAAG,CAAC,CAAC,EAAE,EAAI,EAAI,GAAK,GAAK9oE,EAAE,QAAQ,IAAI3rB,EAAE,OAAO,EAAE,QAAQ,IAAIy0F,EAAU,EAAG,EAAG,CAAC,CAAC,EAAG9jF,GAAKgB,EAAE,WAAW,EAAIA,EAAE,SAAS,EAAI,EAAI,IAAMga,EAAE,MAAK,EAAG,IAAI3rB,EAAE,MAAK,CAAE,EAAE,QAAQiN,EAAE,MAAK,EAAG,IAAI5U,EAAE,MAAK,CAAE,CAAC,EAClP,IAAIsW,EAAI,IAAIs6F,GACZ,MAAM9T,EAAI,IAAIR,GAAQhkF,EAAGhE,EAAGuoF,EAAG,KAAK,EACpC,IAAIE,EAAIzmF,EAAE,MAAK,EAAG,sBAAsBwmF,CAAC,EAAGG,EAAGE,EAC/C95C,IAAM,UAAY45C,EAAI3jF,EAAE,SAAU6jF,EAAI7jF,EAAE,WAAa2jF,EAAI3jF,EAAE,MAAO6jF,EAAI7jF,EAAE,QACxE,IAAI8jF,EAAI9mF,EAAE,MAAK,EAAG,UAAU2mF,EAAGE,EAAG7jF,EAAE,MAAM,EAC1ChD,EAAE,iBAAiBymF,EAAGK,CAAC,EAAG9mF,EAAE,YAAYgD,EAAE,SAAS,EAAGA,EAAE,SAAS,EAAGA,EAAE,SAAS,CAAC,EAAG9B,EAAE,YAAYjB,EAAGD,EAAE,MAAK,CAAE,EAAGkB,EAAE,WAAWjB,EAAG+C,EAAE,KAAK,EAAG9B,EAAE,SAAS,mBAAkB,EACvK,IAAIilF,EAAIjlF,EAAE,SAAS,YAAY,IAAI,MAAK,EAAG,aAAalB,EAAE,OAAO,EAAGqmF,EAAInlF,EAAE,SAAS,YAAY,IAAI,MAAK,EAAG,aAAalB,EAAE,MAAK,CAAE,EAAGsmF,EAAI,IAAIR,EAAU,KAAK,IAAIK,EAAE,EAAGE,EAAE,CAAC,EAAG,KAAK,IAAIF,EAAE,EAAGE,EAAE,CAAC,EAAG,KAAK,IAAIF,EAAE,EAAGE,EAAE,CAAC,CAAC,EAAGl4F,EAAI,IAAI23F,EAAU,KAAK,IAAIK,EAAE,EAAGE,EAAE,CAAC,EAAG,KAAK,IAAIF,EAAE,EAAGE,EAAE,CAAC,EAAG,KAAK,IAAIF,EAAE,EAAGE,EAAE,CAAC,CAAC,EAAG,EAAIC,EAAE,QAAQ,IAAIn4F,EAAE,MAAK,CAAE,EAAE,eAAe,EAAG,EAAGu4F,EAAI,CACtV,KAAM1jF,EAAE,KACR,IAAKsjF,EACL,IAAKn4F,EACL,OAAQ,EACR,KAAM8R,EAIN,aAAcsE,EAAE,SAAS,IAC/B,EAAOqiF,EAAI,KAAMljF,EAAK,KAClBqpC,IAAM,WAAa65C,EAAI,CACrB,EAAG5jF,EAAE,WAAW,EAAI,MACpB,EAAGA,EAAE,WAAW,EAAI,MACpB,EAAG,CAACA,EAAE,WAAW,EAAI,KAC3B,EAAOU,EAAK,CACN,EAAGV,EAAE,SAAS,EAAI,MAClB,EAAGA,EAAE,SAAS,EAAI,MAClB,EAAG,CAACA,EAAE,SAAS,EAAI,KACzB,EAAO0jF,EAAE,KAAOE,EAAGF,EAAE,KAAOhjF,GAAKxC,EAAE,MAAQA,EAAE,IAAM,CAAA,GAAKA,EAAE,UAAYA,EAAE,QAAU,CAAA,GAAKA,EAAE,QAAQ,KAAKlB,EAAE,OAAO,EAAGwJ,EAAE,KAAKxJ,EAAE,OAAO,EAAGkB,EAAE,IAAI,KAAK,OAAO8B,EAAE,EAAE,CAAC,EAAG,EAAE,KAAK0jF,CAAC,CACrK,CACAxlF,EAAE,WAAa,GAAIA,EAAE,aAAe,EAAGA,EAAE,KAAO,YAAaA,EAAE,SAAW,qBAAsBA,EAAE,SAAW6rC,EAAG7rC,EAAE,OAAS,KAAMA,EAAE,aAAeA,EAAE,SAAS,MAAK,EAAIA,EAAE,iBAAmBA,EAAE,SAAS,MAAK,EAAIA,EAAE,cAAgBsI,EACjO,IAAI1L,EAAI,CAAA,EACRA,EAAI,CACF,SAAUoD,EAAE,SACZ,OAAQA,EAAE,OACV,SAAUA,EAAE,SACZ,SAAUA,EAAE,QAChB,EAAKA,EAAE,MAAQpD,EAAGoD,EAAE,gBAAkBA,EAAE,eAAe,QAAUA,EAAE,oBAAsB,MAAM,KAAKA,EAAE,eAAe,KAAK,EAC1H,CACA,SAASm5F,GAAGttD,EAAG,EAAG,EAAG,CACnB,IAAI,EAAI,IAAIwtD,GACZ,OAAQ,EAAE,MAAQ,EAAE,MAAQ,MAAQ,EAAE,OAAS,EAAE,OAAS,MAAQ,EAAE,SAAW,EAAE,SAAW,MAAQxtD,EAAC,CACnG,IAAK,OACH,EAAE,OAAO,CAAC,EAAE,MAAQ,EAAG,CAAC,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,CAAC,EAAE,MAAQ,EAAG,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,EAAE,MAAQ,EAAG,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,EAAE,MAAQ,EAAG,CAAC,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,CAAC,EAAE,MAAQ,EAAG,CAAC,EAAE,OAAS,CAAC,EAC5L,MACF,IAAK,UACH,EAAE,OAAO,CAAC,EAAE,MAAQ,EAAG,CAAC,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,CAAC,EAAE,MAAQ,EAAG,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,EAAE,MAAQ,EAAG,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,EAAE,MAAQ,EAAG,CAAC,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,CAAC,EAAE,MAAQ,EAAG,CAAC,EAAE,OAAS,CAAC,EAC5L,MACF,IAAK,SACH,EAAE,OAAO,CAAC,EAAE,MAAQ,EAAG,CAAC,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,CAAC,EAAE,MAAQ,EAAG,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,CAAC,EAAE,MAAQ,EAAI,IAAM,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,CAAC,EAAE,MAAQ,EAAI,IAAM,CAAC,EAAE,OAAS,EAAI,GAAI,EAAG,EAAE,OAAO,EAAE,MAAQ,EAAI,IAAM,CAAC,EAAE,OAAS,EAAI,GAAI,EAAG,EAAE,OAAO,EAAE,MAAQ,EAAI,IAAM,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,EAAE,MAAQ,EAAG,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,EAAE,MAAQ,EAAG,CAAC,EAAE,OAAS,CAAC,EAAG,EAAE,OAAO,CAAC,EAAE,MAAQ,EAAG,CAAC,EAAE,OAAS,CAAC,EAC9X,MACF,IAAK,SACH,EAAE,OAAO,EAAG,CAAC,EAAG,EAAE,OAAO,EAAG,EAAG,EAAE,SAAW,GAAK,EAAG,KAAK,GAAK,EAAG,EAAE,EACnE,KACN,CACE,MAAM,EAAI,CACR,MAAO,EAAE,OAAS,MAElB,aAAc,EAClB,EACE,OAAO7rC,EAAE,EAAG,EAAG,EAAE,MAAO,EAAE,SAAU,EAAE,QAAQ,EAC9C,SAASA,EAAEqD,EAAGxE,EAAG,EAAGyJ,EAAGvJ,EAAG,CACxB,IAAI,EAAI,IAAIu6F,GAAkBj2F,EAAGxE,CAAC,EAAGjC,EAAI,IAAI28F,GAAuB,CAClE,MAAO,EACP,KAAMC,EAKZ,CAAK,EAAG13F,EAAI,IAAI23F,GAAO,EAAG78F,CAAC,EACvB,OAAOkF,EAAE,SAAS,IAAIwG,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAAGxG,EAAE,SAAS,OAAS,MAAOA,EAAE,SAAS,IAAI/C,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAAG+C,CAClG,CACF,CACA,SAAS43F,GAAG7tD,EAAG,EAAI,GAAI,CACrB,MAAM,EAAIA,EAAE,CAAC,EAAE,QAAU,KAAM,EAAI,IAAI,IAAI,OAAO,KAAKA,EAAE,CAAC,EAAE,UAAU,CAAC,EAAG,EAAI,IAAI,IAAI,OAAO,KAAKA,EAAE,CAAC,EAAE,eAAe,CAAC,EAAG7rC,EAAI,CAAA,EAAIqD,EAAI,CAAA,EAAIxE,EAAIgtC,EAAE,CAAC,EAAE,qBAAsB,EAAI,IAAI06C,GACjL,IAAIj+E,EAAI,EACR,QAASvJ,EAAI,EAAGA,EAAI8sC,EAAE,OAAQ,EAAE9sC,EAAG,CACjC,MAAM,EAAI8sC,EAAE9sC,CAAC,EACb,IAAInC,EAAI,EACR,GAAI,KAAO,EAAE,QAAU,MACrB,OAAO,QAAQ,MAAM,+EAAiFmC,EAAI,8HAA8H,EAAG,KAC7O,UAAW+C,KAAK,EAAE,WAAY,CAC5B,GAAI,CAAC,EAAE,IAAIA,CAAC,EACV,OAAO,QAAQ,MAAM,+EAAiF/C,EAAI,gEAAkE+C,EAAI,8DAA8D,EAAG,KACnP9B,EAAE8B,CAAC,IAAM,SAAW9B,EAAE8B,CAAC,EAAI,IAAK9B,EAAE8B,CAAC,EAAE,KAAK,EAAE,WAAWA,CAAC,CAAC,EAAGlF,GAC9D,CACA,GAAIA,IAAM,EAAE,KACV,OAAO,QAAQ,MAAM,+EAAiFmC,EAAI,gEAAgE,EAAG,KAC/K,GAAIF,IAAM,EAAE,qBACV,OAAO,QAAQ,MAAM,+EAAiFE,EAAI,uEAAuE,EAAG,KACtL,UAAW+C,KAAK,EAAE,gBAAiB,CACjC,GAAI,CAAC,EAAE,IAAIA,CAAC,EACV,OAAO,QAAQ,MAAM,+EAAiF/C,EAAI,mEAAmE,EAAG,KAClLsE,EAAEvB,CAAC,IAAM,SAAWuB,EAAEvB,CAAC,EAAI,CAAA,GAAKuB,EAAEvB,CAAC,EAAE,KAAK,EAAE,gBAAgBA,CAAC,CAAC,CAChE,CACA,GAAI,EAAG,CACL,IAAIA,EACJ,GAAI,EACFA,EAAI,EAAE,MAAM,cACL,EAAE,WAAW,WAAa,OACjCA,EAAI,EAAE,WAAW,SAAS,UAE1B,QAAO,QAAQ,MAAM,+EAAiF/C,EAAI,kEAAkE,EAAG,KACjL,EAAE,SAASuJ,EAAGxG,EAAG/C,CAAC,EAAGuJ,GAAKxG,CAC5B,CACF,CACA,GAAI,EAAG,CACL,IAAI/C,EAAI,EACR,MAAM,EAAI,CAAA,EACV,QAASnC,EAAI,EAAGA,EAAIivC,EAAE,OAAQ,EAAEjvC,EAAG,CACjC,MAAMkF,EAAI+pC,EAAEjvC,CAAC,EAAE,MACf,QAASzM,EAAI,EAAGA,EAAI2R,EAAE,MAAO,EAAE3R,EAC7B,EAAE,KAAK2R,EAAE,KAAK3R,CAAC,EAAI4O,CAAC,EACtBA,GAAK8sC,EAAEjvC,CAAC,EAAE,WAAW,SAAS,KAChC,CACA,EAAE,SAAS,CAAC,CACd,CACA,UAAWmC,KAAKiB,EAAG,CACjB,MAAM,EAAI25F,GAAG35F,EAAEjB,CAAC,CAAC,EACjB,GAAI,CAAC,EACH,OAAO,QAAQ,MAAM,kFAAoFA,EAAI,aAAa,EAAG,KAC/H,EAAE,aAAaA,EAAG,CAAC,CACrB,CACA,UAAWA,KAAKsE,EAAG,CACjB,MAAM,EAAIA,EAAEtE,CAAC,EAAE,CAAC,EAAE,OAClB,GAAI,IAAM,EAAG,MACb,EAAE,gBAAkB,EAAE,iBAAmB,CAAA,EAAI,EAAE,gBAAgBA,CAAC,EAAI,CAAA,EACpE,QAASnC,EAAI,EAAGA,EAAI,EAAG,EAAEA,EAAG,CAC1B,MAAMkF,EAAI,CAAA,EACV,QAASga,EAAI,EAAGA,EAAIzY,EAAEtE,CAAC,EAAE,OAAQ,EAAE+c,EACjCha,EAAE,KAAKuB,EAAEtE,CAAC,EAAE+c,CAAC,EAAElf,CAAC,CAAC,EACnB,MAAMzM,EAAIwpG,GAAG73F,CAAC,EACd,GAAI,CAAC3R,EACH,OAAO,QAAQ,MAAM,kFAAoF4O,EAAI,kBAAkB,EAAG,KACpI,EAAE,gBAAgBA,CAAC,EAAE,KAAK5O,CAAC,CAC7B,CACF,CACA,OAAO,CACT,CACA,SAASwpG,GAAG9tD,EAAG,CACb,IAAI,EAAG,EAAG,EAAG,EAAI,GAAI7rC,EAAI,EACzB,QAASsI,EAAI,EAAGA,EAAIujC,EAAE,OAAQ,EAAEvjC,EAAG,CACjC,MAAMvJ,EAAI8sC,EAAEvjC,CAAC,EACb,GAAI,IAAM,SAAW,EAAIvJ,EAAE,MAAM,aAAc,IAAMA,EAAE,MAAM,YAC3D,OAAO,QAAQ,MAAM,2IAA2I,EAAG,KACrK,GAAI,IAAM,SAAW,EAAIA,EAAE,UAAW,IAAMA,EAAE,SAC5C,OAAO,QAAQ,MAAM,+HAA+H,EAAG,KACzJ,GAAI,IAAM,SAAW,EAAIA,EAAE,YAAa,IAAMA,EAAE,WAC9C,OAAO,QAAQ,MAAM,iIAAiI,EAAG,KAC3J,GAAI,IAAM,KAAO,EAAIA,EAAE,SAAU,IAAMA,EAAE,QACvC,OAAO,QAAQ,MAAM,8HAA8H,EAAG,KACxJiB,GAAKjB,EAAE,MAAQ,CACjB,CACA,MAAMsE,EAAI,IAAI,EAAErD,CAAC,EAAGnB,EAAI,IAAI45F,GAAGp1F,EAAG,EAAG,CAAC,EACtC,IAAI,EAAI,EACR,QAASiF,EAAI,EAAGA,EAAIujC,EAAE,OAAQ,EAAEvjC,EAAG,CACjC,MAAMvJ,EAAI8sC,EAAEvjC,CAAC,EACb,GAAIvJ,EAAE,6BAA8B,CAClC,MAAM,EAAI,EAAI,EACd,QAASnC,EAAI,EAAGkF,EAAI/C,EAAE,MAAOnC,EAAIkF,EAAGlF,IAClC,QAASzM,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAM2rB,EAAI/c,EAAE,aAAanC,EAAGzM,CAAC,EAC7B0O,EAAE,aAAajC,EAAI,EAAGzM,EAAG2rB,CAAC,CAC5B,CACJ,MACEzY,EAAE,IAAItE,EAAE,MAAO,CAAC,EAClB,GAAKA,EAAE,MAAQ,CACjB,CACA,OAAO,IAAM,SAAWF,EAAE,QAAU,GAAIA,CAC1C,CACA,SAAS+6F,GAAG/tD,EAAG,EAAG,CAChB,GAAI,IAAMguD,GACR,OAAO,QAAQ,KAAK,yFAAyF,EAAGhuD,EAClH,GAAI,IAAMiuD,IAAM,IAAMC,GAAI,CACxB,IAAI,EAAIluD,EAAE,SAAQ,EAClB,GAAI,IAAM,KAAM,CACd,MAAMxoC,EAAI,CAAA,EAAIxE,EAAIgtC,EAAE,aAAa,UAAU,EAC3C,GAAIhtC,IAAM,OAAQ,CAChB,QAAS,EAAI,EAAG,EAAIA,EAAE,MAAO,IAC3BwE,EAAE,KAAK,CAAC,EACVwoC,EAAE,SAASxoC,CAAC,EAAG,EAAIwoC,EAAE,SAAQ,CAC/B,KACE,QAAO,QAAQ,MAAM,yGAAyG,EAAGA,CACrI,CACA,MAAM,EAAI,EAAE,MAAQ,EAAG,EAAI,CAAA,EAC3B,GAAI,IAAMiuD,GACR,QAASz2F,EAAI,EAAGA,GAAK,EAAGA,IACtB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAG,EAAE,KAAK,EAAE,KAAKA,CAAC,CAAC,EAAG,EAAE,KAAK,EAAE,KAAKA,EAAI,CAAC,CAAC,MAE5D,SAASA,EAAI,EAAGA,EAAI,EAAGA,IACrBA,EAAI,IAAM,GAAK,EAAE,KAAK,EAAE,KAAKA,CAAC,CAAC,EAAG,EAAE,KAAK,EAAE,KAAKA,EAAI,CAAC,CAAC,EAAG,EAAE,KAAK,EAAE,KAAKA,EAAI,CAAC,CAAC,IAAM,EAAE,KAAK,EAAE,KAAKA,EAAI,CAAC,CAAC,EAAG,EAAE,KAAK,EAAE,KAAKA,EAAI,CAAC,CAAC,EAAG,EAAE,KAAK,EAAE,KAAKA,CAAC,CAAC,GACrJ,EAAE,OAAS,IAAM,GAAK,QAAQ,MAAM,kGAAkG,EACtI,MAAMrD,EAAI6rC,EAAE,MAAK,EACjB,OAAO7rC,EAAE,SAAS,CAAC,EAAGA,EAAE,YAAW,EAAIA,CACzC,KACE,QAAO,QAAQ,MAAM,sEAAuE,CAAC,EAAG6rC,CACpG,CACA,MAAMmuD,WAAW3B,EAAG,CAMlB,YAAY,EAAG,CACb,MAAM,CAAC,EAAG,KAAK,YAAc,KAAM,KAAK,WAAa,KAAM,KAAK,eAAiB,KAAM,KAAK,gBAAkB,CAAA,EAAI,KAAK,SAAS,SAAS,EAAG,CAC1I,OAAO,IAAI4B,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,EAAG,KAAK,SAAS,SAAS,EAAG,CAC5B,OAAO,IAAIC,GAAG,CAAC,CACjB,CAAC,CACH,CAUA,KAAK,EAAG,EAAG,EAAG,EAAG,CACf,MAAMj7F,EAAI,KACV,IAAIqD,EACJ,GAAI,KAAK,eAAiB,GACxBA,EAAI,KAAK,qBACF,KAAK,OAAS,GAAI,CACzB,MAAMiF,EAAI4yF,GAAG,eAAe,CAAC,EAC7B73F,EAAI63F,GAAG,WAAW5yF,EAAG,KAAK,IAAI,CAChC,MACEjF,EAAI63F,GAAG,eAAe,CAAC,EACzB,KAAK,QAAQ,UAAU,CAAC,EACxB,MAAMr8F,EAAI,SAASyJ,EAAG,CACpB,EAAI,EAAEA,CAAC,EAAI,QAAQ,MAAMA,CAAC,EAAGtI,EAAE,QAAQ,UAAU,CAAC,EAAGA,EAAE,QAAQ,QAAQ,CAAC,CAC1E,EAAG,EAAI,IAAIs4F,GAAG,KAAK,OAAO,EAC1B,EAAE,QAAQ,KAAK,IAAI,EAAG,EAAE,gBAAgB,aAAa,EAAG,EAAE,iBAAiB,KAAK,aAAa,EAAG,EAAE,mBAAmB,KAAK,eAAe,EAAG,EAAE,KAAK,EAAG,SAAShwF,EAAG,CAChK,GAAI,CACFtI,EAAE,MAAMsI,EAAGjF,EAAG,SAAStE,EAAG,CACxB,EAAEA,CAAC,EAAGiB,EAAE,QAAQ,QAAQ,CAAC,CAC3B,EAAGnB,CAAC,CACN,OAASE,EAAG,CACVF,EAAEE,CAAC,CACL,CACF,EAAG,EAAGF,CAAC,CACT,CAQA,eAAe,EAAG,CAChB,OAAO,KAAK,YAAc,EAAG,IAC/B,CAQA,cAAc,EAAG,CACf,OAAO,KAAK,WAAa,EAAG,IAC9B,CAQA,kBAAkB,EAAG,CACnB,OAAO,KAAK,eAAiB,EAAG,IAClC,CASA,SAAS,EAAG,CACV,OAAO,KAAK,gBAAgB,QAAQ,CAAC,IAAM,IAAM,KAAK,gBAAgB,KAAK,CAAC,EAAG,IACjF,CAOA,WAAW,EAAG,CACZ,OAAO,KAAK,gBAAgB,QAAQ,CAAC,IAAM,IAAM,KAAK,gBAAgB,OAAO,KAAK,gBAAgB,QAAQ,CAAC,EAAG,CAAC,EAAG,IACpH,CASA,MAAM,EAAG,EAAG,EAAG,EAAG,CAChB,IAAImB,EACJ,MAAMqD,EAAI,CAAA,EAAIxE,EAAI,CAAA,EAAI,EAAI,IAAI,YAC9B,GAAI,OAAO,GAAK,SACdmB,EAAI,KAAK,MAAM,CAAC,UACT,aAAa,YACpB,GAAI,EAAE,OAAO,IAAI,WAAW,EAAG,EAAG,CAAC,CAAC,IAAMm7F,GAAI,CAC5C,GAAI,CACF93F,EAAE+3F,GAAG,eAAe,EAAI,IAAIC,GAAG,CAAC,CAClC,OAASl1F,EAAG,CACV,GAAK,EAAEA,CAAC,EACR,MACF,CACAnG,EAAI,KAAK,MAAMqD,EAAE+3F,GAAG,eAAe,EAAE,OAAO,CAC9C,MACEp7F,EAAI,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC,OAE5BA,EAAI,EACN,GAAIA,EAAE,QAAU,QAAUA,EAAE,MAAM,QAAQ,CAAC,EAAI,EAAG,CAChD,GAAK,EAAE,IAAI,MAAM,yEAAyE,CAAC,EAC3F,MACF,CACA,MAAMsI,EAAI,IAAIgzF,GAAGt7F,EAAG,CAClB,KAAM,GAAK,KAAK,cAAgB,GAChC,YAAa,KAAK,YAClB,cAAe,KAAK,cACpB,QAAS,KAAK,QACd,WAAY,KAAK,WACjB,eAAgB,KAAK,cAC3B,CAAK,EACDsI,EAAE,WAAW,iBAAiB,KAAK,aAAa,EAChD,QAASvJ,EAAI,EAAGA,EAAI,KAAK,gBAAgB,OAAQA,IAAK,CACpD,MAAM,EAAI,KAAK,gBAAgBA,CAAC,EAAEuJ,CAAC,EACnC,EAAE,MAAQ,QAAQ,MAAM,sDAAsD,EAAGzJ,EAAE,EAAE,IAAI,EAAI,EAAGwE,EAAE,EAAE,IAAI,EAAI,EAC9G,CACA,GAAIrD,EAAE,eACJ,QAASjB,EAAI,EAAGA,EAAIiB,EAAE,eAAe,OAAQ,EAAEjB,EAAG,CAChD,MAAM,EAAIiB,EAAE,eAAejB,CAAC,EAAGnC,EAAIoD,EAAE,oBAAsB,CAAA,EAC3D,OAAQ,EAAC,CACP,KAAKo7F,GAAG,oBACN/3F,EAAE,CAAC,EAAI,IAAIk4F,GACX,MACF,KAAKH,GAAG,2BACN/3F,EAAE,CAAC,EAAI,IAAIm4F,GAAGx7F,EAAG,KAAK,WAAW,EACjC,MACF,KAAKo7F,GAAG,sBACN/3F,EAAE,CAAC,EAAI,IAAIo4F,GACX,MACF,KAAKL,GAAG,sBACN/3F,EAAE,CAAC,EAAI,IAAIq4F,GACX,MACF,QACE9+F,EAAE,QAAQ,CAAC,GAAK,GAAKiC,EAAE,CAAC,IAAM,QAAU,QAAQ,KAAK,wCAA0C,EAAI,IAAI,CACnH,CACM,CACFyJ,EAAE,cAAcjF,CAAC,EAAGiF,EAAE,WAAWzJ,CAAC,EAAGyJ,EAAE,MAAM,EAAG,CAAC,CACnD,CASA,WAAW,EAAG,EAAG,CACf,MAAM,EAAI,KACV,OAAO,IAAI,QAAQ,SAAS,EAAGtI,EAAG,CAChC,EAAE,MAAM,EAAG,EAAG,EAAGA,CAAC,CACpB,CAAC,CACH,CACF,CACA,SAAS27F,IAAK,CACZ,IAAI9vD,EAAI,CAAA,EACR,MAAO,CACL,IAAK,SAAS,EAAG,CACf,OAAOA,EAAE,CAAC,CACZ,EACA,IAAK,SAAS,EAAG,EAAG,CAClBA,EAAE,CAAC,EAAI,CACT,EACA,OAAQ,SAAS,EAAG,CAClB,OAAOA,EAAE,CAAC,CACZ,EACA,UAAW,UAAW,CACpBA,EAAI,CAAA,CACN,CACJ,CACA,CACA,MAAMuvD,GAAK,CACT,gBAAiB,kBACjB,2BAA4B,6BAC5B,oBAAqB,sBACrB,wBAAyB,0BACzB,yBAA0B,2BAC1B,kBAAmB,oBACnB,oBAAqB,sBACrB,uBAAwB,yBACxB,2BAA4B,6BAC5B,0BAA2B,4BAC3B,yBAA0B,2BAC1B,oBAAqB,sBACrB,qBAAsB,uBACtB,mBAAoB,qBACpB,sBAAuB,wBACvB,sBAAuB,wBACvB,gCAAiC,kCACjC,mBAAoB,qBACpB,iBAAkB,mBAClB,iBAAkB,mBAClB,wBAAyB,0BACzB,wBAAyB,yBAC3B,EACA,MAAML,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOK,GAAG,oBAAqB,KAAK,MAAQ,CAAE,KAAM,CAAA,EAAI,KAAM,CAAA,CAAE,CACxF,CACA,WAAY,CACV,MAAM,EAAI,KAAK,OAAQ,EAAI,KAAK,OAAO,KAAK,OAAS,CAAA,EACrD,QAAS,EAAI,EAAG,EAAI,EAAE,OAAQ,EAAI,EAAG,IAAK,CACxC,MAAMp7F,EAAI,EAAE,CAAC,EACbA,EAAE,YAAcA,EAAE,WAAW,KAAK,IAAI,GAAKA,EAAE,WAAW,KAAK,IAAI,EAAE,QAAU,QAAU,EAAE,YAAY,KAAK,MAAOA,EAAE,WAAW,KAAK,IAAI,EAAE,KAAK,CAChJ,CACF,CACA,WAAW,EAAG,CACZ,MAAM,EAAI,KAAK,OAAQ,EAAI,SAAW,EACtC,IAAI,EAAI,EAAE,MAAM,IAAI,CAAC,EACrB,GAAI,EAAG,OAAO,EACd,MAAMA,EAAI,EAAE,KAAMpZ,IAAMoZ,EAAE,YAAcA,EAAE,WAAW,KAAK,IAAI,GAAK,CAAA,GAAI,QAAU,CAAA,GAAI,CAAC,EACtF,IAAIsI,EACJ,MAAMvJ,EAAI,IAAIuoF,GAAG,QAAQ,EACzB1gG,EAAE,QAAU,QAAUmY,EAAE,OAAOnY,EAAE,MAAM,CAAC,EAAGA,EAAE,MAAM,CAAC,EAAGA,EAAE,MAAM,CAAC,EAAG4xG,EAAE,EACrE,MAAMryF,EAAIvf,EAAE,QAAU,OAASA,EAAE,MAAQ,EACzC,OAAQA,EAAE,KAAI,CACZ,IAAK,cACH0hB,EAAI,IAAIszF,GAAG78F,CAAC,EAAGuJ,EAAE,OAAO,SAAS,IAAI,EAAG,EAAG,EAAE,EAAGA,EAAE,IAAIA,EAAE,MAAM,EAC9D,MACF,IAAK,QACHA,EAAI,IAAIuzF,GAAG98F,CAAC,EAAGuJ,EAAE,SAAWnC,EAC5B,MACF,IAAK,OACHmC,EAAI,IAAIs3B,GAAG7gC,CAAC,EAAGuJ,EAAE,SAAWnC,EAAGvf,EAAE,KAAOA,EAAE,MAAQ,CAAA,EAAIA,EAAE,KAAK,eAAiBA,EAAE,KAAK,iBAAmB,OAASA,EAAE,KAAK,eAAiB,EAAGA,EAAE,KAAK,eAAiBA,EAAE,KAAK,iBAAmB,OAASA,EAAE,KAAK,eAAiB,KAAK,GAAK,EAAG0hB,EAAE,MAAQ1hB,EAAE,KAAK,eAAgB0hB,EAAE,SAAW,EAAI1hB,EAAE,KAAK,eAAiBA,EAAE,KAAK,eAAgB0hB,EAAE,OAAO,SAAS,IAAI,EAAG,EAAG,EAAE,EAAGA,EAAE,IAAIA,EAAE,MAAM,EAC5X,MACF,QACE,MAAM,IAAI,MAAM,4CAA8C1hB,EAAE,IAAI,CAC5E,CACI,OAAO0hB,EAAE,SAAS,IAAI,EAAG,EAAG,CAAC,EAAGwzF,GAAGxzF,EAAG1hB,CAAC,EAAGA,EAAE,YAAc,SAAW0hB,EAAE,UAAY1hB,EAAE,WAAY0hB,EAAE,KAAO,EAAE,iBAAiB1hB,EAAE,MAAQ,SAAW,CAAC,EAAG,EAAI,QAAQ,QAAQ0hB,CAAC,EAAG,EAAE,MAAM,IAAI,EAAG,CAAC,EAAG,CACnM,CACA,cAAc,EAAG,EAAG,CAClB,GAAI,IAAM,QACR,OAAO,KAAK,WAAW,CAAC,CAC5B,CACA,qBAAqB,EAAG,CACtB,MAAM,EAAI,KAAM,EAAI,KAAK,OAAQtI,EAAI,EAAE,KAAK,MAAM,CAAC,EAAGnB,GAAKmB,EAAE,YAAcA,EAAE,WAAW,KAAK,IAAI,GAAK,CAAA,GAAI,MAC1G,OAAOnB,IAAM,OAAS,KAAO,KAAK,WAAWA,CAAC,EAAE,KAAK,SAASjY,EAAG,CAC/D,OAAO,EAAE,YAAY,EAAE,MAAOiY,EAAGjY,CAAC,CACpC,CAAC,CACH,CACF,CACA,MAAM20G,EAAG,CACP,aAAc,CACZ,KAAK,KAAOH,GAAG,mBACjB,CACA,iBAAkB,CAChB,OAAOW,EACT,CACA,aAAa,EAAG,EAAG,EAAG,CACpB,MAAM,EAAI,CAAA,EACV,EAAE,MAAQ,IAAIzU,GAAG,EAAG,EAAG,CAAC,EAAG,EAAE,QAAU,EACvC,MAAMtnF,EAAI,EAAE,qBACZ,GAAIA,EAAG,CACL,GAAI,MAAM,QAAQA,EAAE,eAAe,EAAG,CACpC,MAAMqD,EAAIrD,EAAE,gBACZ,EAAE,MAAM,OAAOqD,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGm1F,EAAE,EAAG,EAAE,QAAUn1F,EAAE,CAAC,CACvD,CACArD,EAAE,mBAAqB,QAAU,EAAE,KAAK,EAAE,cAAc,EAAG,MAAOA,EAAE,iBAAkBu4F,EAAE,CAAC,CAC3F,CACA,OAAO,QAAQ,IAAI,CAAC,CACtB,CACF,CACA,MAAMmC,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOU,GAAG,+BAClC,CACA,qBAAqB,EAAG,EAAG,CACzB,MAAM5gG,EAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EACtC,GAAI,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,KAAK,IAAI,EAC1C,OAAO,QAAQ,QAAO,EACxB,MAAMwF,EAAIxF,EAAE,WAAW,KAAK,IAAI,EAAE,iBAClC,OAAOwF,IAAM,SAAW,EAAE,kBAAoBA,GAAI,QAAQ,QAAO,CACnE,CACF,CACA,MAAMi6F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOmB,GAAG,uBAClC,CACA,gBAAgB,EAAG,CACjB,MAAMz+F,EAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EACtC,MAAO,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,KAAK,IAAI,EAAI,KAAOq/F,EAC5D,CACA,qBAAqB,EAAG,EAAG,CACzB,MAAM,EAAI,KAAK,OAAQ,EAAI,EAAE,KAAK,UAAU,CAAC,EAC7C,GAAI,CAAC,EAAE,YAAc,CAAC,EAAE,WAAW,KAAK,IAAI,EAC1C,OAAO,QAAQ,QAAO,EACxB,MAAMh8F,EAAI,CAAA,EAAIqD,EAAI,EAAE,WAAW,KAAK,IAAI,EACxC,GAAIA,EAAE,kBAAoB,SAAW,EAAE,UAAYA,EAAE,iBAAkBA,EAAE,mBAAqB,QAAUrD,EAAE,KAAK,EAAE,cAAc,EAAG,eAAgBqD,EAAE,gBAAgB,CAAC,EAAGA,EAAE,2BAA6B,SAAW,EAAE,mBAAqBA,EAAE,0BAA2BA,EAAE,4BAA8B,QAAUrD,EAAE,KAAK,EAAE,cAAc,EAAG,wBAAyBqD,EAAE,yBAAyB,CAAC,EAAGA,EAAE,yBAA2B,SAAWrD,EAAE,KAAK,EAAE,cAAc,EAAG,qBAAsBqD,EAAE,sBAAsB,CAAC,EAAGA,EAAE,uBAAuB,QAAU,QAAS,CAChiB,MAAMxE,EAAIwE,EAAE,uBAAuB,MACnC,EAAE,qBAAuB,IAAIygF,GAAGjlF,EAAGA,CAAC,CACtC,CACA,OAAO,QAAQ,IAAImB,CAAC,CACtB,CACF,CACA,MAAMk6F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOkB,GAAG,wBAClC,CACA,gBAAgB,EAAG,CACjB,MAAMz+F,EAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EACtC,MAAO,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,KAAK,IAAI,EAAI,KAAOq/F,EAC5D,CACA,qBAAqB,EAAG,EAAG,CACzB,MAAMxhG,EAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EACtC,GAAI,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,KAAK,IAAI,EAC1C,OAAO,QAAQ,QAAO,EACxB,MAAMwF,EAAIxF,EAAE,WAAW,KAAK,IAAI,EAChC,OAAO,EAAE,WAAawF,EAAE,aAAe,OAASA,EAAE,WAAa,EAAG,QAAQ,QAAO,CACnF,CACF,CACA,MAAM46F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOQ,GAAG,yBAClC,CACA,gBAAgB,EAAG,CACjB,MAAMz+F,EAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EACtC,MAAO,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,KAAK,IAAI,EAAI,KAAOq/F,EAC5D,CACA,qBAAqB,EAAG,EAAG,CACzB,MAAM,EAAI,KAAK,OAAQ,EAAI,EAAE,KAAK,UAAU,CAAC,EAC7C,GAAI,CAAC,EAAE,YAAc,CAAC,EAAE,WAAW,KAAK,IAAI,EAC1C,OAAO,QAAQ,QAAO,EACxB,MAAMh8F,EAAI,CAAA,EAAIqD,EAAI,EAAE,WAAW,KAAK,IAAI,EACxC,OAAOA,EAAE,oBAAsB,SAAW,EAAE,YAAcA,EAAE,mBAAoBA,EAAE,qBAAuB,QAAUrD,EAAE,KAAK,EAAE,cAAc,EAAG,iBAAkBqD,EAAE,kBAAkB,CAAC,EAAGA,EAAE,iBAAmB,SAAW,EAAE,eAAiBA,EAAE,gBAAiB,EAAE,4BAA8B,SAAW,EAAE,0BAA4B,CAAC,IAAK,GAAG,GAAIA,EAAE,8BAAgC,SAAW,EAAE,0BAA0B,CAAC,EAAIA,EAAE,6BAA8BA,EAAE,8BAAgC,SAAW,EAAE,0BAA0B,CAAC,EAAIA,EAAE,6BAA8BA,EAAE,8BAAgC,QAAUrD,EAAE,KAAK,EAAE,cAAc,EAAG,0BAA2BqD,EAAE,2BAA2B,CAAC,EAAG,QAAQ,IAAIrD,CAAC,CAChsB,CACF,CACA,MAAMs6F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOc,GAAG,mBAClC,CACA,gBAAgB,EAAG,CACjB,MAAMz+F,EAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EACtC,MAAO,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,KAAK,IAAI,EAAI,KAAOq/F,EAC5D,CACA,qBAAqB,EAAG,EAAG,CACzB,MAAM,EAAI,KAAK,OAAQ,EAAI,EAAE,KAAK,UAAU,CAAC,EAC7C,GAAI,CAAC,EAAE,YAAc,CAAC,EAAE,WAAW,KAAK,IAAI,EAC1C,OAAO,QAAQ,QAAO,EACxB,MAAMh8F,EAAI,CAAA,EACV,EAAE,WAAa,IAAIsnF,GAAG,EAAG,EAAG,CAAC,EAAG,EAAE,eAAiB,EAAG,EAAE,MAAQ,EAChE,MAAMjkF,EAAI,EAAE,WAAW,KAAK,IAAI,EAChC,GAAIA,EAAE,mBAAqB,OAAQ,CACjC,MAAMxE,EAAIwE,EAAE,iBACZ,EAAE,WAAW,OAAOxE,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG25F,EAAE,CAC1C,CACA,OAAOn1F,EAAE,uBAAyB,SAAW,EAAE,eAAiBA,EAAE,sBAAuBA,EAAE,oBAAsB,QAAUrD,EAAE,KAAK,EAAE,cAAc,EAAG,gBAAiBqD,EAAE,kBAAmBk1F,EAAE,CAAC,EAAGl1F,EAAE,wBAA0B,QAAUrD,EAAE,KAAK,EAAE,cAAc,EAAG,oBAAqBqD,EAAE,qBAAqB,CAAC,EAAG,QAAQ,IAAIrD,CAAC,CAChU,CACF,CACA,MAAMu6F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOa,GAAG,0BAClC,CACA,gBAAgB,EAAG,CACjB,MAAMz+F,EAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EACtC,MAAO,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,KAAK,IAAI,EAAI,KAAOq/F,EAC5D,CACA,qBAAqB,EAAG,EAAG,CACzB,MAAM,EAAI,KAAK,OAAQ,EAAI,EAAE,KAAK,UAAU,CAAC,EAC7C,GAAI,CAAC,EAAE,YAAc,CAAC,EAAE,WAAW,KAAK,IAAI,EAC1C,OAAO,QAAQ,QAAO,EACxB,MAAMh8F,EAAI,CAAA,EAAIqD,EAAI,EAAE,WAAW,KAAK,IAAI,EACxC,OAAOA,EAAE,qBAAuB,SAAW,EAAE,aAAeA,EAAE,oBAAqBA,EAAE,sBAAwB,QAAUrD,EAAE,KAAK,EAAE,cAAc,EAAG,kBAAmBqD,EAAE,mBAAmB,CAAC,EAAG,QAAQ,IAAIrD,CAAC,CAC5M,CACF,CACA,MAAMw6F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOY,GAAG,oBAClC,CACA,gBAAgB,EAAG,CACjB,MAAMz+F,EAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EACtC,MAAO,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,KAAK,IAAI,EAAI,KAAOq/F,EAC5D,CACA,qBAAqB,EAAG,EAAG,CACzB,MAAM,EAAI,KAAK,OAAQ,EAAI,EAAE,KAAK,UAAU,CAAC,EAC7C,GAAI,CAAC,EAAE,YAAc,CAAC,EAAE,WAAW,KAAK,IAAI,EAC1C,OAAO,QAAQ,QAAO,EACxB,MAAMh8F,EAAI,CAAA,EAAIqD,EAAI,EAAE,WAAW,KAAK,IAAI,EACxC,EAAE,UAAYA,EAAE,kBAAoB,OAASA,EAAE,gBAAkB,EAAGA,EAAE,mBAAqB,QAAUrD,EAAE,KAAK,EAAE,cAAc,EAAG,eAAgBqD,EAAE,gBAAgB,CAAC,EAAG,EAAE,oBAAsBA,EAAE,qBAAuB,IACtN,MAAMxE,EAAIwE,EAAE,kBAAoB,CAAC,EAAG,EAAG,CAAC,EACxC,OAAO,EAAE,iBAAmB,IAAIikF,GAAE,EAAG,OAAOzoF,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG25F,EAAE,EAAG,QAAQ,IAAIx4F,CAAC,CAClF,CACF,CACA,MAAMy6F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOW,GAAG,iBAClC,CACA,gBAAgB,EAAG,CACjB,MAAMz+F,EAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EACtC,MAAO,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,KAAK,IAAI,EAAI,KAAOq/F,EAC5D,CACA,qBAAqB,EAAG,EAAG,CACzB,MAAMxhG,EAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EACtC,GAAI,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,KAAK,IAAI,EAC1C,OAAO,QAAQ,QAAO,EACxB,MAAMwF,EAAIxF,EAAE,WAAW,KAAK,IAAI,EAChC,OAAO,EAAE,IAAMwF,EAAE,MAAQ,OAASA,EAAE,IAAM,IAAK,QAAQ,QAAO,CAChE,CACF,CACA,MAAM26F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOS,GAAG,sBAClC,CACA,gBAAgB,EAAG,CACjB,MAAMz+F,EAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EACtC,MAAO,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,KAAK,IAAI,EAAI,KAAOq/F,EAC5D,CACA,qBAAqB,EAAG,EAAG,CACzB,MAAM,EAAI,KAAK,OAAQ,EAAI,EAAE,KAAK,UAAU,CAAC,EAC7C,GAAI,CAAC,EAAE,YAAc,CAAC,EAAE,WAAW,KAAK,IAAI,EAC1C,OAAO,QAAQ,QAAO,EACxB,MAAMh8F,EAAI,CAAA,EAAIqD,EAAI,EAAE,WAAW,KAAK,IAAI,EACxC,EAAE,kBAAoBA,EAAE,iBAAmB,OAASA,EAAE,eAAiB,EAAGA,EAAE,kBAAoB,QAAUrD,EAAE,KAAK,EAAE,cAAc,EAAG,uBAAwBqD,EAAE,eAAe,CAAC,EAC9K,MAAMxE,EAAIwE,EAAE,qBAAuB,CAAC,EAAG,EAAG,CAAC,EAC3C,OAAO,EAAE,cAAgB,IAAIikF,GAAE,EAAG,OAAOzoF,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG25F,EAAE,EAAGn1F,EAAE,uBAAyB,QAAUrD,EAAE,KAAK,EAAE,cAAc,EAAG,mBAAoBqD,EAAE,qBAAsBk1F,EAAE,CAAC,EAAG,QAAQ,IAAIv4F,CAAC,CAChM,CACF,CACA,MAAM86F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOM,GAAG,kBAClC,CACA,gBAAgB,EAAG,CACjB,MAAMz+F,EAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EACtC,MAAO,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,KAAK,IAAI,EAAI,KAAOq/F,EAC5D,CACA,qBAAqB,EAAG,EAAG,CACzB,MAAM,EAAI,KAAK,OAAQ,EAAI,EAAE,KAAK,UAAU,CAAC,EAC7C,GAAI,CAAC,EAAE,YAAc,CAAC,EAAE,WAAW,KAAK,IAAI,EAC1C,OAAO,QAAQ,QAAO,EACxB,MAAMh8F,EAAI,CAAA,EAAIqD,EAAI,EAAE,WAAW,KAAK,IAAI,EACxC,OAAO,EAAE,UAAYA,EAAE,aAAe,OAASA,EAAE,WAAa,EAAGA,EAAE,cAAgB,QAAUrD,EAAE,KAAK,EAAE,cAAc,EAAG,UAAWqD,EAAE,WAAW,CAAC,EAAG,QAAQ,IAAIrD,CAAC,CAClK,CACF,CACA,MAAM66F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOO,GAAG,wBAClC,CACA,gBAAgB,EAAG,CACjB,MAAMz+F,EAAI,KAAK,OAAO,KAAK,UAAU,CAAC,EACtC,MAAO,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,KAAK,IAAI,EAAI,KAAOq/F,EAC5D,CACA,qBAAqB,EAAG,EAAG,CACzB,MAAM,EAAI,KAAK,OAAQ,EAAI,EAAE,KAAK,UAAU,CAAC,EAC7C,GAAI,CAAC,EAAE,YAAc,CAAC,EAAE,WAAW,KAAK,IAAI,EAC1C,OAAO,QAAQ,QAAO,EACxB,MAAMh8F,EAAI,CAAA,EAAIqD,EAAI,EAAE,WAAW,KAAK,IAAI,EACxC,OAAOA,EAAE,qBAAuB,SAAW,EAAE,WAAaA,EAAE,oBAAqBA,EAAE,qBAAuB,SAAW,EAAE,mBAAqBA,EAAE,oBAAqBA,EAAE,oBAAsB,QAAUrD,EAAE,KAAK,EAAE,cAAc,EAAG,gBAAiBqD,EAAE,iBAAiB,CAAC,EAAG,QAAQ,IAAIrD,CAAC,CACtR,CACF,CACA,MAAMm6F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOiB,GAAG,kBAClC,CACA,YAAY,EAAG,CACb,MAAM,EAAI,KAAK,OAAQ,EAAI,EAAE,KAAM,EAAI,EAAE,SAAS,CAAC,EACnD,GAAI,CAAC,EAAE,YAAc,CAAC,EAAE,WAAW,KAAK,IAAI,EAC1C,OAAO,KACT,MAAMp7F,EAAI,EAAE,WAAW,KAAK,IAAI,EAAGqD,EAAI,EAAE,QAAQ,WACjD,GAAI,CAACA,EAAG,CACN,GAAI,EAAE,oBAAsB,EAAE,mBAAmB,QAAQ,KAAK,IAAI,GAAK,EACrE,MAAM,IAAI,MAAM,6EAA6E,EAC/F,OAAO,IACT,CACA,OAAO,EAAE,iBAAiB,EAAGrD,EAAE,OAAQqD,CAAC,CAC1C,CACF,CACA,MAAM+2F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOgB,GAAG,gBAClC,CACA,YAAY,EAAG,CACb,MAAM,EAAI,KAAK,KAAM,EAAI,KAAK,OAAQ,EAAI,EAAE,KAAMp7F,EAAI,EAAE,SAAS,CAAC,EAClE,GAAI,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,CAAC,EAClC,OAAO,KACT,MAAMqD,EAAIrD,EAAE,WAAW,CAAC,EAAGnB,EAAI,EAAE,OAAOwE,EAAE,MAAM,EAChD,IAAI,EAAI,EAAE,cACV,GAAIxE,EAAE,IAAK,CACT,MAAMyJ,EAAI,EAAE,QAAQ,QAAQ,WAAWzJ,EAAE,GAAG,EAC5CyJ,IAAM,OAAS,EAAIA,EACrB,CACA,OAAO,EAAE,iBAAiB,EAAGjF,EAAE,OAAQ,CAAC,CAC1C,CACF,CACA,MAAMg3F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAOe,GAAG,gBAClC,CACA,YAAY,EAAG,CACb,MAAM,EAAI,KAAK,KAAM,EAAI,KAAK,OAAQ,EAAI,EAAE,KAAMp7F,EAAI,EAAE,SAAS,CAAC,EAClE,GAAI,CAACA,EAAE,YAAc,CAACA,EAAE,WAAW,CAAC,EAClC,OAAO,KACT,MAAMqD,EAAIrD,EAAE,WAAW,CAAC,EAAGnB,EAAI,EAAE,OAAOwE,EAAE,MAAM,EAChD,IAAI,EAAI,EAAE,cACV,GAAIxE,EAAE,IAAK,CACT,MAAMyJ,EAAI,EAAE,QAAQ,QAAQ,WAAWzJ,EAAE,GAAG,EAC5CyJ,IAAM,OAAS,EAAIA,EACrB,CACA,OAAO,EAAE,iBAAiB,EAAGjF,EAAE,OAAQ,CAAC,CAC1C,CACF,CACA,MAAM23F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,KAAOI,GAAG,wBAAyB,KAAK,OAAS,CACxD,CACA,eAAe,EAAG,CAChB,MAAM,EAAI,KAAK,OAAO,KAAM,EAAI,EAAE,YAAY,CAAC,EAC/C,GAAI,EAAE,YAAc,EAAE,WAAW,KAAK,IAAI,EAAG,CAC3C,MAAM,EAAI,EAAE,WAAW,KAAK,IAAI,EAAGp7F,EAAI,KAAK,OAAO,cAAc,SAAU,EAAE,MAAM,EAAGqD,EAAI,KAAK,OAAO,QAAQ,eAC9G,GAAI,CAACA,GAAK,CAACA,EAAE,UAAW,CACtB,GAAI,EAAE,oBAAsB,EAAE,mBAAmB,QAAQ,KAAK,IAAI,GAAK,EACrE,MAAM,IAAI,MAAM,oFAAoF,EACtG,OAAO,IACT,CACA,OAAOrD,EAAE,KAAK,SAASnB,EAAG,CACxB,MAAM,EAAI,EAAE,YAAc,EAAGyJ,EAAI,EAAE,YAAc,EAAGvJ,EAAI,EAAE,MAAO,EAAI,EAAE,WAAYnC,EAAI,IAAI,WAAWiC,EAAG,EAAGyJ,CAAC,EAC7G,OAAOjF,EAAE,sBAAwBA,EAAE,sBAAsBtE,EAAG,EAAGnC,EAAG,EAAE,KAAM,EAAE,MAAM,EAAE,KAAK,SAASkF,EAAG,CACnG,OAAOA,EAAE,MACX,CAAC,EAAIuB,EAAE,MAAM,KAAK,UAAW,CAC3B,MAAMvB,EAAI,IAAI,YAAY/C,EAAI,CAAC,EAC/B,OAAOsE,EAAE,iBAAiB,IAAI,WAAWvB,CAAC,EAAG/C,EAAG,EAAGnC,EAAG,EAAE,KAAM,EAAE,MAAM,EAAGkF,CAC3E,CAAC,CACH,CAAC,CACH,KACE,QAAO,IACX,CACF,CACA,MAAMm5F,EAAG,CACP,YAAY,EAAG,CACb,KAAK,KAAOG,GAAG,wBAAyB,KAAK,OAAS,CACxD,CACA,eAAe,EAAG,CAChB,MAAM,EAAI,KAAK,OAAO,KAAM,EAAI,EAAE,MAAM,CAAC,EACzC,GAAI,CAAC,EAAE,YAAc,CAAC,EAAE,WAAW,KAAK,IAAI,GAAK,EAAE,OAAS,OAC1D,OAAO,KACT,MAAM,EAAI,EAAE,OAAO,EAAE,IAAI,EACzB,UAAW9yF,KAAK,EAAE,WAChB,GAAIA,EAAE,OAAS2zF,GAAG,WAAa3zF,EAAE,OAAS2zF,GAAG,gBAAkB3zF,EAAE,OAAS2zF,GAAG,cAAgB3zF,EAAE,OAAS,OACtG,OAAO,KACX,MAAM,EAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAY,EAAI,GAAI1hB,EAAI,CAAA,EAC1D,UAAW0hB,KAAK,EACd,EAAE,KAAK,KAAK,OAAO,cAAc,WAAY,EAAEA,CAAC,CAAC,EAAE,KAAM,IAAO1hB,EAAE0hB,CAAC,EAAI,EAAG1hB,EAAE0hB,CAAC,EAAE,CAAC,EAClF,OAAO,EAAE,OAAS,EAAI,MAAQ,EAAE,KAAK,KAAK,OAAO,eAAe,CAAC,CAAC,EAAG,QAAQ,IAAI,CAAC,EAAE,KAAMA,GAAM,CAC9F,MAAM,EAAIA,EAAE,IAAG,EAAInC,EAAI,EAAE,QAAU,EAAE,SAAW,CAAC,CAAC,EAAGvJ,EAAI0L,EAAE,CAAC,EAAE,MAAOxG,EAAI,CAAA,EACzE,UAAW,KAAKqE,EAAG,CACjB,MAAM2V,EAAI,IAAI0rE,GAAMh/F,EAAI,IAAI46F,EAAKhmF,EAAI,IAAIwmF,GAAM9iF,EAAI,IAAIsiF,EAAE,EAAG,EAAG,CAAC,EAAGtmF,EAAI,IAAIo/F,GAAG,EAAE,SAAU,EAAE,SAAUt/F,CAAC,EACvG,QAASyoF,EAAI,EAAGA,EAAIzoF,EAAGyoF,IACrBz+F,EAAE,aAAe4B,EAAE,oBAAoB5B,EAAE,YAAay+F,CAAC,EAAGz+F,EAAE,UAAYwW,EAAE,oBAAoBxW,EAAE,SAAUy+F,CAAC,EAAGz+F,EAAE,OAASka,EAAE,oBAAoBla,EAAE,MAAOy+F,CAAC,EAAGvoF,EAAE,YAAYuoF,EAAGvpE,EAAE,QAAQtzB,EAAG4U,EAAG0D,CAAC,CAAC,EACjM,UAAWukF,KAAKz+F,EACd,GAAIy+F,IAAM,WAAY,CACpB,MAAM,EAAIz+F,EAAEy+F,CAAC,EACbvoF,EAAE,cAAgB,IAAI8/D,GAAG,EAAE,MAAO,EAAE,SAAU,EAAE,UAAU,CAC5D,MAAOyoB,IAAM,eAAiBA,IAAM,YAAcA,IAAM,SAAW,EAAE,SAAS,aAAaA,EAAGz+F,EAAEy+F,CAAC,CAAC,EACpG8W,GAAG,UAAU,KAAK,KAAKr/F,EAAG,CAAC,EAAG,KAAK,OAAO,oBAAoBA,CAAC,EAAGgF,EAAE,KAAKhF,CAAC,CAC5E,CACA,OAAO,EAAE,SAAW,EAAE,MAAK,EAAI,EAAE,IAAI,GAAGgF,CAAC,EAAG,GAAKA,EAAE,CAAC,CACtD,CAAC,EACH,CACF,CACA,MAAMq5F,GAAK,OAAQiB,GAAK,GAAIC,GAAK,CAAE,KAAM,WAAY,IAAK,OAAO,EACjE,MAAMhB,EAAG,CACP,YAAY,EAAG,CACb,KAAK,KAAOD,GAAG,gBAAiB,KAAK,QAAU,KAAM,KAAK,KAAO,KACjE,MAAM,EAAI,IAAI,SAAS,EAAG,EAAGgB,EAAE,EAAG,EAAI,IAAI,YAC1C,GAAI,KAAK,OAAS,CAChB,MAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,EAAG,CAAC,CAAC,CAAC,EAC7C,QAAS,EAAE,UAAU,EAAG,EAAE,EAC1B,OAAQ,EAAE,UAAU,EAAG,EAAE,CAC/B,EAAO,KAAK,OAAO,QAAUjB,GACvB,MAAM,IAAI,MAAM,mDAAmD,EACrE,GAAI,KAAK,OAAO,QAAU,EACxB,MAAM,IAAI,MAAM,gDAAgD,EAClE,MAAM,EAAI,KAAK,OAAO,OAASiB,GAAIp8F,EAAI,IAAI,SAAS,EAAGo8F,EAAE,EACzD,IAAI/4F,EAAI,EACR,KAAOA,EAAI,GAAK,CACd,MAAMxE,EAAImB,EAAE,UAAUqD,EAAG,EAAE,EAC3BA,GAAK,EACL,MAAM,EAAIrD,EAAE,UAAUqD,EAAG,EAAE,EAC3B,GAAIA,GAAK,EAAG,IAAMg5F,GAAG,KAAM,CACzB,MAAM/zF,EAAI,IAAI,WAAW,EAAG8zF,GAAK/4F,EAAGxE,CAAC,EACrC,KAAK,QAAU,EAAE,OAAOyJ,CAAC,CAC3B,SAAW,IAAM+zF,GAAG,IAAK,CACvB,MAAM/zF,EAAI8zF,GAAK/4F,EACf,KAAK,KAAO,EAAE,MAAMiF,EAAGA,EAAIzJ,CAAC,CAC9B,CACAwE,GAAKxE,CACP,CACA,GAAI,KAAK,UAAY,KACnB,MAAM,IAAI,MAAM,2CAA2C,CAC/D,CACF,CACA,MAAM28F,EAAG,CACP,YAAY,EAAG,EAAG,CAChB,GAAI,CAAC,EACH,MAAM,IAAI,MAAM,qDAAqD,EACvE,KAAK,KAAOJ,GAAG,2BAA4B,KAAK,KAAO,EAAG,KAAK,YAAc,EAAG,KAAK,YAAY,QAAO,CAC1G,CACA,gBAAgB,EAAG,EAAG,CACpB,MAAM,EAAI,KAAK,KAAM,EAAI,KAAK,YAAap7F,EAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAYqD,EAAI,EAAE,WAAW,KAAK,IAAI,EAAE,WAAYxE,EAAI,CAAA,EAAI,EAAI,CAAA,EAAIyJ,EAAI,CAAA,EAC/I,UAAWvJ,KAAKsE,EAAG,CACjB,MAAM,EAAIi5F,GAAGv9F,CAAC,GAAKA,EAAE,YAAW,EAChCF,EAAE,CAAC,EAAIwE,EAAEtE,CAAC,CACZ,CACA,UAAWA,KAAK,EAAE,WAAY,CAC5B,MAAM,EAAIu9F,GAAGv9F,CAAC,GAAKA,EAAE,YAAW,EAChC,GAAIsE,EAAEtE,CAAC,IAAM,OAAQ,CACnB,MAAMnC,EAAI,EAAE,UAAU,EAAE,WAAWmC,CAAC,CAAC,EAAG+C,EAAIy6F,GAAG3/F,EAAE,aAAa,EAC9D0L,EAAE,CAAC,EAAIxG,EAAE,KAAM,EAAE,CAAC,EAAIlF,EAAE,aAAe,EACzC,CACF,CACA,OAAO,EAAE,cAAc,aAAcoD,CAAC,EAAE,KAAK,SAASjB,EAAG,CACvD,OAAO,IAAI,QAAQ,SAAS,EAAGnC,EAAG,CAChC,EAAE,gBAAgBmC,EAAG,SAAS+C,EAAG,CAC/B,UAAW3R,KAAK2R,EAAE,WAAY,CAC5B,MAAMga,EAAIha,EAAE,WAAW3R,CAAC,EAAG3H,EAAI,EAAE2H,CAAC,EAClC3H,IAAM,SAAWszB,EAAE,WAAatzB,EAClC,CACA,EAAEsZ,CAAC,CACL,EAAGjD,EAAGyJ,EAAGkwF,GAAI57F,CAAC,CAChB,CAAC,CACH,CAAC,CACH,CACF,CACA,MAAM6+F,EAAG,CACP,aAAc,CACZ,KAAK,KAAOL,GAAG,qBACjB,CACA,cAAc,EAAG,EAAG,CAClB,OAAQ,EAAE,WAAa,QAAU,EAAE,WAAa,EAAE,UAAY,EAAE,SAAW,QAAU,EAAE,WAAa,QAAU,EAAE,QAAU,SAAW,EAAI,EAAE,MAAK,EAAI,EAAE,WAAa,SAAW,EAAE,QAAU,EAAE,UAAW,EAAE,SAAW,QAAU,EAAE,OAAO,UAAU,EAAE,MAAM,EAAG,EAAE,WAAa,SAAW,EAAE,SAAW,EAAE,UAAW,EAAE,QAAU,QAAU,EAAE,OAAO,UAAU,EAAE,KAAK,EAAG,EAAE,YAAc,IAAK,CAC1X,CACF,CACA,MAAMM,EAAG,CACP,aAAc,CACZ,KAAK,KAAON,GAAG,qBACjB,CACF,CACA,MAAMoB,WAAWC,EAAG,CAClB,YAAY,EAAG,EAAG,EAAG,EAAG,CACtB,MAAM,EAAG,EAAG,EAAG,CAAC,CAClB,CACA,iBAAiB,EAAG,CAClB,MAAM,EAAI,KAAK,aAAc,EAAI,KAAK,aAAc,EAAI,KAAK,UAAWz8F,EAAI,EAAI,EAAI,EAAI,EACxF,QAASqD,EAAI,EAAGA,IAAM,EAAGA,IACvB,EAAEA,CAAC,EAAI,EAAErD,EAAIqD,CAAC,EAChB,OAAO,CACT,CACA,aAAa,EAAG,EAAG,EAAG,EAAG,CACvB,MAAMrD,EAAI,KAAK,aAAcqD,EAAI,KAAK,aAAcxE,EAAI,KAAK,UAAW,EAAIA,EAAI,EAAGyJ,EAAIzJ,EAAI,EAAGE,EAAI,EAAI,EAAG,GAAK,EAAI,GAAKA,EAAGnC,EAAI,EAAI,EAAGkF,EAAIlF,EAAI,EAAGzM,EAAI,EAAImY,EAAGwT,EAAI3rB,EAAImY,EAAG9f,EAAI,GAAKsZ,EAAI,EAAIlF,EAAGQ,EAAI0E,EAAIlF,EAAGkE,EAAI,EAAItY,EAAGsU,EAAIM,EAAIR,EAAI,EAC5N,QAASyoF,EAAI,EAAGA,IAAMxmF,EAAGwmF,IAAK,CAC5B,MAAMvmF,EAAIuE,EAAEyY,EAAIupE,EAAIxmF,CAAC,EAAGymF,EAAIjiF,EAAEyY,EAAIupE,EAAI,CAAC,EAAItmF,EAAGwmF,EAAIliF,EAAElT,EAAIk1F,EAAIxmF,CAAC,EAAG4mF,EAAIpiF,EAAElT,EAAIk1F,CAAC,EAAItmF,EAC/EiB,EAAEqlF,CAAC,EAAIvkF,EAAIhC,EAAIhC,EAAIwoF,EAAI98F,EAAI+8F,EAAInoF,EAAIqoF,CACrC,CACA,OAAOzlF,CACT,CACF,CACA,MAAM08F,GAAK,IAAI9Y,GACf,MAAM+Y,WAAWH,EAAG,CAClB,aAAa,EAAG,EAAG,EAAG,EAAG,CACvB,MAAMx8F,EAAI,MAAM,aAAa,EAAG,EAAG,EAAG,CAAC,EACvC,OAAO08F,GAAG,UAAU18F,CAAC,EAAE,UAAS,EAAG,QAAQA,CAAC,EAAGA,CACjD,CACF,CACA,MAAMi8F,GAAK,CACT,OAAQ,EACR,MAAO,EACP,UAAW,EACX,WAAY,EACZ,UAAW,EACX,eAAgB,EAChB,aAAc,CAChB,EAAGM,GAAK,CACN,KAAM,UACN,KAAM,WACN,KAAM,WACN,KAAM,YACN,KAAM,YACN,KAAM,YACR,EAAGK,GAAK,CACN,KAAM9R,GACN,KAAM+R,GACN,KAAMC,GACN,KAAMC,GACN,KAAMC,GACN,KAAMC,EACR,EAAGC,GAAK,CACN,MAAOC,GACP,MAAOC,GACP,MAAOtV,EACT,EAAGuV,GAAK,CACN,OAAQ,EACR,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACR,EAAGf,GAAK,CACN,SAAU,WACV,OAAQ,SACR,QAAS,UACT,WAAY,KACZ,WAAY,MACZ,WAAY,MACZ,WAAY,MACZ,QAAS,QACT,UAAW,aACX,SAAU,WACZ,EAAGgB,GAAK,CACN,MAAO,QACP,YAAa,WACb,SAAU,aACV,QAAS,uBACX,EAAGC,GAAK,CACN,YAAa,OAGb,OAAQC,GACR,KAAMC,EACR,EAAGC,GAAK,CACN,OAAQ,SACR,KAAM,OACN,MAAO,OACT,EACA,SAASC,GAAG9xD,EAAG,CACb,OAAOA,EAAE,kBAAoB,SAAWA,EAAE,gBAAkB,IAAI+xD,GAAG,CACjE,MAAO,SACP,SAAU,EACV,UAAW,EACX,UAAW,EACX,YAAa,GACb,UAAW,GACX,KAAMC,EACV,CAAG,GAAIhyD,EAAE,eACT,CACA,SAASiyD,GAAGjyD,EAAG,EAAG,EAAG,CACnB,UAAW,KAAK,EAAE,WAChBA,EAAE,CAAC,IAAM,SAAW,EAAE,SAAS,eAAiB,EAAE,SAAS,gBAAkB,CAAA,EAAI,EAAE,SAAS,eAAe,CAAC,EAAI,EAAE,WAAW,CAAC,EAClI,CACA,SAASiwD,GAAGjwD,EAAG,EAAG,CAChB,EAAE,SAAW,SAAW,OAAO,EAAE,QAAU,SAAW,OAAO,OAAOA,EAAE,SAAU,EAAE,MAAM,EAAI,QAAQ,KAAK,sDAAwD,EAAE,MAAM,EAC3K,CACA,SAASkyD,GAAGlyD,EAAG,EAAG,EAAG,CACnB,IAAI,EAAI,GAAI,EAAI,GAAI7rC,EAAI,GACxB,QAASsI,EAAI,EAAGvJ,EAAI,EAAE,OAAQuJ,EAAIvJ,EAAGuJ,IAAK,CACxC,MAAM,EAAI,EAAEA,CAAC,EACb,GAAI,EAAE,WAAa,SAAW,EAAI,IAAK,EAAE,SAAW,SAAW,EAAI,IAAK,EAAE,UAAY,SAAWtI,EAAI,IAAK,GAAK,GAAKA,EAAG,KACzH,CACA,GAAI,CAAC,GAAK,CAAC,GAAK,CAACA,EAAG,OAAO,QAAQ,QAAQ6rC,CAAC,EAC5C,MAAMxoC,EAAI,CAAA,EAAIxE,EAAI,CAAA,EAAI,EAAI,CAAA,EAC1B,QAASyJ,EAAI,EAAGvJ,EAAI,EAAE,OAAQuJ,EAAIvJ,EAAGuJ,IAAK,CACxC,MAAM,EAAI,EAAEA,CAAC,EACb,GAAI,EAAG,CACL,MAAM1L,EAAI,EAAE,WAAa,OAAS,EAAE,cAAc,WAAY,EAAE,QAAQ,EAAIivC,EAAE,WAAW,SACzFxoC,EAAE,KAAKzG,CAAC,CACV,CACA,GAAI,EAAG,CACL,MAAMA,EAAI,EAAE,SAAW,OAAS,EAAE,cAAc,WAAY,EAAE,MAAM,EAAIivC,EAAE,WAAW,OACrFhtC,EAAE,KAAKjC,CAAC,CACV,CACA,GAAIoD,EAAG,CACL,MAAMpD,EAAI,EAAE,UAAY,OAAS,EAAE,cAAc,WAAY,EAAE,OAAO,EAAIivC,EAAE,WAAW,MACvF,EAAE,KAAKjvC,CAAC,CACV,CACF,CACA,OAAO,QAAQ,IAAI,CACjB,QAAQ,IAAIyG,CAAC,EACb,QAAQ,IAAIxE,CAAC,EACb,QAAQ,IAAI,CAAC,CACjB,CAAG,EAAE,KAAK,SAASyJ,EAAG,CAClB,MAAMvJ,EAAIuJ,EAAE,CAAC,EAAG,EAAIA,EAAE,CAAC,EAAG1L,EAAI0L,EAAE,CAAC,EACjC,OAAO,IAAMujC,EAAE,gBAAgB,SAAW9sC,GAAI,IAAM8sC,EAAE,gBAAgB,OAAS,GAAI7rC,IAAM6rC,EAAE,gBAAgB,MAAQjvC,GAAIivC,EAAE,qBAAuB,GAAIA,CACtJ,CAAC,CACH,CACA,SAASmyD,GAAGnyD,EAAG,EAAG,CAChB,GAAIA,EAAE,mBAAkB,EAAI,EAAE,UAAY,OACxC,QAAS,EAAI,EAAG,EAAI,EAAE,QAAQ,OAAQ,EAAI,EAAG,IAC3CA,EAAE,sBAAsB,CAAC,EAAI,EAAE,QAAQ,CAAC,EAC5C,GAAI,EAAE,QAAU,MAAM,QAAQ,EAAE,OAAO,WAAW,EAAG,CACnD,MAAM,EAAI,EAAE,OAAO,YACnB,GAAIA,EAAE,sBAAsB,SAAW,EAAE,OAAQ,CAC/CA,EAAE,sBAAwB,CAAA,EAC1B,QAAS,EAAI,EAAG,EAAI,EAAE,OAAQ,EAAI,EAAG,IACnCA,EAAE,sBAAsB,EAAE,CAAC,CAAC,EAAI,CACpC,MACE,QAAQ,KAAK,sEAAsE,CACvF,CACF,CACA,SAASoyD,GAAGpyD,EAAG,CACb,IAAI,EACJ,MAAM,EAAIA,EAAE,YAAcA,EAAE,WAAWuvD,GAAG,0BAA0B,EACpE,GAAI,EAAI,EAAI,SAAW,EAAE,WAAa,IAAM,EAAE,QAAU,IAAM8C,GAAG,EAAE,UAAU,EAAI,EAAIryD,EAAE,QAAU,IAAMqyD,GAAGryD,EAAE,UAAU,EAAI,IAAMA,EAAE,KAAMA,EAAE,UAAY,OACpJ,QAAS,EAAI,EAAG,EAAIA,EAAE,QAAQ,OAAQ,EAAI,EAAG,IAC3C,GAAK,IAAMqyD,GAAGryD,EAAE,QAAQ,CAAC,CAAC,EAC9B,OAAO,CACT,CACA,SAASqyD,GAAGryD,EAAG,CACb,IAAI,EAAI,GACR,MAAM,EAAI,OAAO,KAAKA,CAAC,EAAE,KAAI,EAC7B,QAAS,EAAI,EAAG,EAAI,EAAE,OAAQ,EAAI,EAAG,IACnC,GAAK,EAAE,CAAC,EAAI,IAAMA,EAAE,EAAE,CAAC,CAAC,EAAI,IAC9B,OAAO,CACT,CACA,SAASsyD,GAAGtyD,EAAG,CACb,OAAQA,EAAC,CACP,KAAK,UACH,MAAO,GAAI,IACb,KAAK,WACH,MAAO,GAAI,IACb,KAAK,WACH,MAAO,GAAI,MACb,KAAK,YACH,MAAO,GAAI,MACb,QACE,MAAM,IAAI,MAAM,mEAAmE,CACzF,CACA,CACA,SAASuyD,GAAGvyD,EAAG,CACb,OAAOA,EAAE,OAAO,gBAAgB,EAAI,GAAKA,EAAE,OAAO,oBAAoB,IAAM,EAAI,aAAeA,EAAE,OAAO,eAAe,EAAI,GAAKA,EAAE,OAAO,oBAAoB,IAAM,EAAI,aAAeA,EAAE,OAAO,eAAe,EAAI,GAAKA,EAAE,OAAO,oBAAoB,IAAM,EAAI,aAAe,WAC/Q,CACA,MAAMwyD,GAAK,IAAI7W,GACf,MAAM8T,EAAG,CACP,YAAY,EAAI,GAAI,EAAI,CAAA,EAAI,CAC1B,KAAK,KAAO,EAAG,KAAK,WAAa,CAAA,EAAI,KAAK,QAAU,CAAA,EAAI,KAAK,QAAU,EAAG,KAAK,MAAQ,IAAIK,GAAM,KAAK,aAA+B,IAAI,IAAO,KAAK,eAAiB,CAAA,EAAI,KAAK,UAAY,CAAA,EAAI,KAAK,UAAY,CAAE,KAAM,CAAA,EAAI,KAAM,CAAA,CAAE,EAAI,KAAK,YAAc,CAAE,KAAM,CAAA,EAAI,KAAM,CAAA,CAAE,EAAI,KAAK,WAAa,CAAE,KAAM,CAAA,EAAI,KAAM,CAAA,CAAE,EAAI,KAAK,YAAc,CAAA,EAAI,KAAK,aAAe,CAAA,EAAI,KAAK,cAAgB,CAAA,EACjY,IAAI,EAAI,GAAI,EAAI,GAAI37F,EAAI,GAAIqD,EAAI,GAChC,GAAI,OAAO,UAAY,IAAK,CAC1B,MAAMxE,EAAI,UAAU,UACpB,EAAI,iCAAiC,KAAKA,CAAC,IAAM,GACjD,MAAM,EAAIA,EAAE,MAAM,gBAAgB,EAClC,EAAI,GAAK,EAAI,SAAS,EAAE,CAAC,EAAG,EAAE,EAAI,GAAImB,EAAInB,EAAE,QAAQ,SAAS,EAAI,GAAIwE,EAAIrD,EAAInB,EAAE,MAAM,qBAAqB,EAAE,CAAC,EAAI,EACnH,CACA,OAAO,kBAAoB,KAAO,GAAK,EAAI,IAAMmB,GAAKqD,EAAI,GAAK,KAAK,cAAgB,IAAIkgB,GAAG,KAAK,QAAQ,OAAO,EAAI,KAAK,cAAgB,IAAIloB,GAAG,KAAK,QAAQ,OAAO,EAAG,KAAK,cAAc,eAAe,KAAK,QAAQ,WAAW,EAAG,KAAK,cAAc,iBAAiB,KAAK,QAAQ,aAAa,EAAG,KAAK,WAAa,IAAIi9F,GAAG,KAAK,QAAQ,OAAO,EAAG,KAAK,WAAW,gBAAgB,aAAa,EAAG,KAAK,QAAQ,cAAgB,mBAAqB,KAAK,WAAW,mBAAmB,EAAE,CAC7d,CACA,cAAc,EAAG,CACf,KAAK,WAAa,CACpB,CACA,WAAW,EAAG,CACZ,KAAK,QAAU,CACjB,CACA,MAAM,EAAG,EAAG,CACV,MAAM,EAAI,KAAM,EAAI,KAAK,KAAMt4F,EAAI,KAAK,WACxC,KAAK,MAAM,UAAS,EAAI,KAAK,UAAY,CAAA,EAAI,KAAK,WAAW,SAASqD,EAAG,CACvE,OAAOA,EAAE,WAAaA,EAAE,UAAS,CACnC,CAAC,EAAG,QAAQ,IAAI,KAAK,WAAW,SAASA,EAAG,CAC1C,OAAOA,EAAE,YAAcA,EAAE,WAAU,CACrC,CAAC,CAAC,EAAE,KAAK,UAAW,CAClB,OAAO,QAAQ,IAAI,CACjB,EAAE,gBAAgB,OAAO,EACzB,EAAE,gBAAgB,WAAW,EAC7B,EAAE,gBAAgB,QAAQ,CAClC,CAAO,CACH,CAAC,EAAE,KAAK,SAASA,EAAG,CAClB,MAAMxE,EAAI,CACR,MAAOwE,EAAE,CAAC,EAAE,EAAE,OAAS,CAAC,EACxB,OAAQA,EAAE,CAAC,EACX,WAAYA,EAAE,CAAC,EACf,QAASA,EAAE,CAAC,EACZ,MAAO,EAAE,MACT,OAAQ,EACR,SAAU,CAAA,CAClB,EACM,OAAOy6F,GAAG99F,EAAGnB,EAAG,CAAC,EAAGi9F,GAAGj9F,EAAG,CAAC,EAAG,QAAQ,IAAI,EAAE,WAAW,SAAS,EAAG,CACjE,OAAO,EAAE,WAAa,EAAE,UAAUA,CAAC,CACrC,CAAC,CAAC,EAAE,KAAK,UAAW,CAClB,UAAW,KAAKA,EAAE,OAChB,EAAE,kBAAiB,EACrB,EAAEA,CAAC,CACL,CAAC,CACH,CAAC,EAAE,MAAM,CAAC,CACZ,CAMA,WAAY,CACV,MAAM,EAAI,KAAK,KAAK,OAAS,CAAA,EAAI,EAAI,KAAK,KAAK,OAAS,CAAA,EAAI,EAAI,KAAK,KAAK,QAAU,CAAA,EACpF,QAAS,EAAI,EAAGmB,EAAI,EAAE,OAAQ,EAAIA,EAAG,IAAK,CACxC,MAAMqD,EAAI,EAAE,CAAC,EAAE,OACf,QAASxE,EAAI,EAAG,EAAIwE,EAAE,OAAQxE,EAAI,EAAGA,IACnC,EAAEwE,EAAExE,CAAC,CAAC,EAAE,OAAS,EACrB,CACA,QAAS,EAAI,EAAGmB,EAAI,EAAE,OAAQ,EAAIA,EAAG,IAAK,CACxC,MAAMqD,EAAI,EAAE,CAAC,EACbA,EAAE,OAAS,SAAW,KAAK,YAAY,KAAK,UAAWA,EAAE,IAAI,EAAGA,EAAE,OAAS,SAAW,EAAEA,EAAE,IAAI,EAAE,cAAgB,KAAMA,EAAE,SAAW,QAAU,KAAK,YAAY,KAAK,YAAaA,EAAE,MAAM,CAC1L,CACF,CAcA,YAAY,EAAG,EAAG,CAChB,IAAM,SAAW,EAAE,KAAK,CAAC,IAAM,SAAW,EAAE,KAAK,CAAC,EAAI,EAAE,KAAK,CAAC,EAAI,GAAI,EAAE,KAAK,CAAC,IAChF,CAUA,YAAY,EAAG,EAAG,EAAG,CACnB,GAAI,EAAE,KAAK,CAAC,GAAK,EAAG,OAAO,EAC3B,MAAM,EAAI,EAAE,MAAK,EAAIrD,EAAI,CAACqD,EAAGxE,IAAM,CACjC,MAAM,EAAI,KAAK,aAAa,IAAIwE,CAAC,EACjC,GAAK,MAAQ,KAAK,aAAa,IAAIxE,EAAG,CAAC,EACvC,SAAW,CAACyJ,EAAGvJ,CAAC,IAAKsE,EAAE,SAAS,QAAO,EACrCrD,EAAEjB,EAAGF,EAAE,SAASyJ,CAAC,CAAC,CACtB,EACA,OAAOtI,EAAE,EAAG,CAAC,EAAG,EAAE,MAAQ,aAAe,EAAE,KAAK,CAAC,IAAK,CACxD,CACA,WAAW,EAAG,CACZ,MAAM,EAAI,OAAO,OAAO,KAAK,OAAO,EACpC,EAAE,KAAK,IAAI,EACX,QAAS,EAAI,EAAG,EAAI,EAAE,OAAQ,IAAK,CACjC,MAAM,EAAI,EAAE,EAAE,CAAC,CAAC,EAChB,GAAI,EAAG,OAAO,CAChB,CACA,OAAO,IACT,CACA,WAAW,EAAG,CACZ,MAAM,EAAI,OAAO,OAAO,KAAK,OAAO,EACpC,EAAE,QAAQ,IAAI,EACd,MAAM,EAAI,CAAA,EACV,QAAS,EAAI,EAAG,EAAI,EAAE,OAAQ,IAAK,CACjC,MAAMA,EAAI,EAAE,EAAE,CAAC,CAAC,EAChBA,GAAK,EAAE,KAAKA,CAAC,CACf,CACA,OAAO,CACT,CASA,cAAc,EAAG,EAAG,CAClB,MAAM,EAAI,EAAI,IAAM,EACpB,IAAI,EAAI,KAAK,MAAM,IAAI,CAAC,EACxB,GAAI,CAAC,EAAG,CACN,OAAQ,EAAC,CACP,IAAK,QACH,EAAI,KAAK,UAAU,CAAC,EACpB,MACF,IAAK,OACH,EAAI,KAAK,WAAW,SAASA,EAAG,CAC9B,OAAOA,EAAE,UAAYA,EAAE,SAAS,CAAC,CACnC,CAAC,EACD,MACF,IAAK,OACH,EAAI,KAAK,WAAW,SAASA,EAAG,CAC9B,OAAOA,EAAE,UAAYA,EAAE,SAAS,CAAC,CACnC,CAAC,EACD,MACF,IAAK,WACH,EAAI,KAAK,aAAa,CAAC,EACvB,MACF,IAAK,aACH,EAAI,KAAK,WAAW,SAASA,EAAG,CAC9B,OAAOA,EAAE,gBAAkBA,EAAE,eAAe,CAAC,CAC/C,CAAC,EACD,MACF,IAAK,SACH,EAAI,KAAK,WAAW,CAAC,EACrB,MACF,IAAK,WACH,EAAI,KAAK,WAAW,SAASA,EAAG,CAC9B,OAAOA,EAAE,cAAgBA,EAAE,aAAa,CAAC,CAC3C,CAAC,EACD,MACF,IAAK,UACH,EAAI,KAAK,WAAW,SAASA,EAAG,CAC9B,OAAOA,EAAE,aAAeA,EAAE,YAAY,CAAC,CACzC,CAAC,EACD,MACF,IAAK,OACH,EAAI,KAAK,SAAS,CAAC,EACnB,MACF,IAAK,YACH,EAAI,KAAK,WAAW,SAASA,EAAG,CAC9B,OAAOA,EAAE,eAAiBA,EAAE,cAAc,CAAC,CAC7C,CAAC,EACD,MACF,IAAK,SACH,EAAI,KAAK,WAAW,CAAC,EACrB,MACF,QACE,GAAI,EAAI,KAAK,WAAW,SAASA,EAAG,CAClC,OAAOA,GAAK,MAAQA,EAAE,eAAiBA,EAAE,cAAc,EAAG,CAAC,CAC7D,CAAC,EAAG,CAAC,EACH,MAAM,IAAI,MAAM,iBAAmB,CAAC,EACtC,KACV,CACM,KAAK,MAAM,IAAI,EAAG,CAAC,CACrB,CACA,OAAO,CACT,CAQA,gBAAgB,EAAG,CACjB,IAAI,EAAI,KAAK,MAAM,IAAI,CAAC,EACxB,GAAI,CAAC,EAAG,CACN,MAAM,EAAI,KAAM,EAAI,KAAK,KAAK,GAAK,IAAM,OAAS,KAAO,IAAI,GAAK,CAAA,EAClE,EAAI,QAAQ,IAAI,EAAE,IAAI,SAASA,EAAGqD,EAAG,CACnC,OAAO,EAAE,cAAc,EAAGA,CAAC,CAC7B,CAAC,CAAC,EAAG,KAAK,MAAM,IAAI,EAAG,CAAC,CAC1B,CACA,OAAO,CACT,CAQA,WAAW,EAAG,CACZ,MAAM,EAAI,KAAK,KAAK,QAAQ,CAAC,EAAG,EAAI,KAAK,WACzC,GAAI,EAAE,MAAQ,EAAE,OAAS,cACvB,MAAM,IAAI,MAAM,qBAAuB,EAAE,KAAO,gCAAgC,EAClF,GAAI,EAAE,MAAQ,QAAU,IAAM,EAC5B,OAAO,QAAQ,QAAQ,KAAK,WAAW+3F,GAAG,eAAe,EAAE,IAAI,EACjE,MAAM,EAAI,KAAK,QACf,OAAO,IAAI,QAAQ,SAASp7F,EAAGqD,EAAG,CAChC,EAAE,KAAK63F,GAAG,WAAW,EAAE,IAAK,EAAE,IAAI,EAAGl7F,EAAG,OAAQ,UAAW,CACzDqD,EAAE,IAAI,MAAM,4CAA8C,EAAE,IAAM,IAAI,CAAC,CACzE,CAAC,CACH,CAAC,CACH,CAQA,eAAe,EAAG,CAChB,MAAM,EAAI,KAAK,KAAK,YAAY,CAAC,EACjC,OAAO,KAAK,cAAc,SAAU,EAAE,MAAM,EAAE,KAAK,SAAS,EAAG,CAC7D,MAAM,EAAI,EAAE,YAAc,EAAGrD,EAAI,EAAE,YAAc,EACjD,OAAO,EAAE,MAAMA,EAAGA,EAAI,CAAC,CACzB,CAAC,CACH,CAQA,aAAa,EAAG,CACd,MAAM,EAAI,KAAM,EAAI,KAAK,KAAM,EAAI,KAAK,KAAK,UAAU,CAAC,EACxD,GAAI,EAAE,aAAe,QAAU,EAAE,SAAW,OAAQ,CAClD,MAAMqD,EAAIg6F,GAAG,EAAE,IAAI,EAAGx+F,EAAI09F,GAAG,EAAE,aAAa,EAAG,EAAI,EAAE,aAAe,GAAIj0F,EAAI,IAAIzJ,EAAE,EAAE,MAAQwE,CAAC,EAC7F,OAAO,QAAQ,QAAQ,IAAIo1F,GAAGnwF,EAAGjF,EAAG,CAAC,CAAC,CACxC,CACA,MAAMrD,EAAI,CAAA,EACV,OAAO,EAAE,aAAe,OAASA,EAAE,KAAK,KAAK,cAAc,aAAc,EAAE,UAAU,CAAC,EAAIA,EAAE,KAAK,IAAI,EAAG,EAAE,SAAW,SAAWA,EAAE,KAAK,KAAK,cAAc,aAAc,EAAE,OAAO,QAAQ,UAAU,CAAC,EAAGA,EAAE,KAAK,KAAK,cAAc,aAAc,EAAE,OAAO,OAAO,UAAU,CAAC,GAAI,QAAQ,IAAIA,CAAC,EAAE,KAAK,SAASqD,EAAG,CAC5S,MAAMxE,EAAIwE,EAAE,CAAC,EAAG,EAAIg6F,GAAG,EAAE,IAAI,EAAG/0F,EAAIi0F,GAAG,EAAE,aAAa,EAAGx9F,EAAIuJ,EAAE,kBAAmB,EAAIvJ,EAAI,EAAGnC,EAAI,EAAE,YAAc,EAAGkF,EAAI,EAAE,aAAe,OAAS,EAAE,YAAY,EAAE,UAAU,EAAE,WAAa,OAAQ3R,EAAI,EAAE,aAAe,GACxN,IAAI2rB,EAAGtzB,EACP,GAAIsZ,GAAKA,IAAM,EAAG,CAChB,MAAM1E,EAAI,KAAK,MAAMR,EAAIkF,CAAC,EAAGhB,EAAI,qBAAuB,EAAE,WAAa,IAAM,EAAE,cAAgB,IAAM1D,EAAI,IAAM,EAAE,MACjH,IAAIN,EAAI,EAAE,MAAM,IAAIgE,CAAC,EACrBhE,IAAMgf,EAAI,IAAIxT,EAAEzJ,EAAGzB,EAAI0E,EAAG,EAAE,MAAQA,EAAI/C,CAAC,EAAGjC,EAAI,IAAI47F,GAAG58E,EAAGha,EAAI/C,CAAC,EAAG,EAAE,MAAM,IAAI+B,EAAGhE,CAAC,GAAItU,EAAI,IAAImwG,GAAG77F,EAAG,EAAGF,EAAIkF,EAAI/C,EAAG5O,CAAC,CACrH,MACE0O,IAAM,KAAOid,EAAI,IAAIxT,EAAE,EAAE,MAAQ,CAAC,EAAIwT,EAAI,IAAIxT,EAAEzJ,EAAGjC,EAAG,EAAE,MAAQ,CAAC,EAAGpU,EAAI,IAAIiwG,GAAG38E,EAAG,EAAG3rB,CAAC,EACxF,GAAI,EAAE,SAAW,OAAQ,CACvB,MAAMiN,EAAIigG,GAAG,OAAQv8F,EAAIy7F,GAAG,EAAE,OAAO,QAAQ,aAAa,EAAGz/F,EAAI,EAAE,OAAO,QAAQ,YAAc,EAAGuoF,EAAI,EAAE,OAAO,OAAO,YAAc,EAAGvmF,EAAI,IAAIgC,EAAEuC,EAAE,CAAC,EAAGvG,EAAG,EAAE,OAAO,MAAQM,CAAC,EAAGkoF,EAAI,IAAIh9E,EAAEjF,EAAE,CAAC,EAAGgiF,EAAG,EAAE,OAAO,MAAQ,CAAC,EACrNxmF,IAAM,OAASrW,EAAI,IAAIiwG,GAAGjwG,EAAE,MAAM,MAAK,EAAIA,EAAE,SAAUA,EAAE,UAAU,GAAIA,EAAE,WAAa,GACtF,QAAS+8F,EAAI,EAAGE,EAAI3mF,EAAE,OAAQymF,EAAIE,EAAGF,IAAK,CACxC,MAAMI,EAAI7mF,EAAEymF,CAAC,EACb,GAAI/8F,EAAE,KAAKm9F,EAAGL,EAAEC,EAAI,CAAC,CAAC,EAAG,GAAK,GAAK/8F,EAAE,KAAKm9F,EAAGL,EAAEC,EAAI,EAAI,CAAC,CAAC,EAAG,GAAK,GAAK/8F,EAAE,KAAKm9F,EAAGL,EAAEC,EAAI,EAAI,CAAC,CAAC,EAAG,GAAK,GAAK/8F,EAAE,KAAKm9F,EAAGL,EAAEC,EAAI,EAAI,CAAC,CAAC,EAAG,GAAK,EAAG,MAAM,IAAI,MAAM,mEAAmE,CAC/N,CACA/8F,EAAE,WAAa2H,CACjB,CACA,OAAO3H,CACT,CAAC,CACH,CAQA,YAAY,EAAG,CACb,MAAM,EAAI,KAAK,KAAM,EAAI,KAAK,QAASwX,EAAI,EAAE,SAAS,CAAC,EAAE,OAAQ,EAAI,EAAE,OAAOA,CAAC,EAC/E,IAAI,EAAI,KAAK,cACb,GAAI,EAAE,IAAK,CACT,MAAMpZ,EAAI,EAAE,QAAQ,WAAW,EAAE,GAAG,EACpCA,IAAM,OAAS,EAAIA,EACrB,CACA,OAAO,KAAK,iBAAiB,EAAGoZ,EAAG,CAAC,CACtC,CACA,iBAAiB,EAAG,EAAG,EAAG,CACxB,MAAM,EAAI,KAAMA,EAAI,KAAK,KAAMqD,EAAIrD,EAAE,SAAS,CAAC,EAAGnB,EAAImB,EAAE,OAAO,CAAC,EAAG,GAAKnB,EAAE,KAAOA,EAAE,YAAc,IAAMwE,EAAE,QACzG,GAAI,KAAK,aAAa,CAAC,EACrB,OAAO,KAAK,aAAa,CAAC,EAC5B,MAAMiF,EAAI,KAAK,gBAAgB,EAAG,CAAC,EAAE,KAAK,SAASvJ,EAAG,CACpDA,EAAE,MAAQ,GAAIA,EAAE,KAAOsE,EAAE,MAAQxE,EAAE,MAAQ,GAAIE,EAAE,OAAS,IAAM,OAAOF,EAAE,KAAO,UAAYA,EAAE,IAAI,WAAW,aAAa,IAAM,KAAOE,EAAE,KAAOF,EAAE,KAClJ,MAAMjC,GAAKoD,EAAE,UAAY,CAAA,GAAIqD,EAAE,OAAO,GAAK,CAAA,EAC3C,OAAOtE,EAAE,UAAY69F,GAAGhgG,EAAE,SAAS,GAAKigG,GAAI99F,EAAE,UAAY69F,GAAGhgG,EAAE,SAAS,GAAKqgG,GAAIl+F,EAAE,MAAQm+F,GAAGtgG,EAAE,KAAK,GAAKkrF,GAAI/oF,EAAE,MAAQm+F,GAAGtgG,EAAE,KAAK,GAAKkrF,GAAI/oF,EAAE,gBAAkB,CAACA,EAAE,qBAAuBA,EAAE,YAAc+rF,IAAM/rF,EAAE,YAAc89F,GAAI,EAAE,aAAa,IAAI99F,EAAG,CAAE,SAAU,CAAC,CAAE,EAAGA,CAC7Q,CAAC,EAAE,MAAM,UAAW,CAClB,OAAO,IACT,CAAC,EACD,OAAO,KAAK,aAAa,CAAC,EAAIuJ,EAAGA,CACnC,CACA,gBAAgB,EAAG,EAAG,CACpB,MAAM,EAAI,KAAM,EAAI,KAAK,KAAMtI,EAAI,KAAK,QACxC,GAAI,KAAK,YAAY,CAAC,IAAM,OAC1B,OAAO,KAAK,YAAY,CAAC,EAAE,KAAM,GAAM,EAAE,OAAO,EAClD,MAAMqD,EAAI,EAAE,OAAO,CAAC,EAAGxE,EAAI,KAAK,KAAO,KAAK,UAC5C,IAAI,EAAIwE,EAAE,KAAO,GAAIiF,EAAI,GACzB,GAAIjF,EAAE,aAAe,OACnB,EAAI,EAAE,cAAc,aAAcA,EAAE,UAAU,EAAE,KAAK,SAAS,EAAG,CAC/DiF,EAAI,GACJ,MAAM1L,EAAI,IAAI,KAAK,CAAC,CAAC,EAAG,CAAE,KAAMyG,EAAE,SAAU,EAC5C,OAAO,EAAIxE,EAAE,gBAAgBjC,CAAC,EAAG,CACnC,CAAC,UACMyG,EAAE,MAAQ,OACjB,MAAM,IAAI,MAAM,2BAA6B,EAAI,gCAAgC,EACnF,MAAMtE,EAAI,QAAQ,QAAQ,CAAC,EAAE,KAAK,SAAS,EAAG,CAC5C,OAAO,IAAI,QAAQ,SAASnC,EAAGkF,EAAG,CAChC,IAAI3R,EAAIyM,EACR,EAAE,sBAAwB,KAAOzM,EAAI,SAAS2rB,EAAG,CAC/C,MAAMtzB,EAAI,IAAI81G,GAAGxiF,CAAC,EAClBtzB,EAAE,YAAc,GAAIoU,EAAEpU,CAAC,CACzB,GAAI,EAAE,KAAK0yG,GAAG,WAAW,EAAGl7F,EAAE,IAAI,EAAG7P,EAAG,OAAQ2R,CAAC,CACnD,CAAC,CACH,CAAC,EAAE,KAAK,SAAS,EAAG,CAClB,OAAOwG,IAAM,IAAMzJ,EAAE,gBAAgB,CAAC,EAAGi9F,GAAG,EAAGz4F,CAAC,EAAG,EAAE,SAAS,SAAWA,EAAE,UAAY+6F,GAAG/6F,EAAE,GAAG,EAAG,CACpG,CAAC,EAAE,MAAM,SAAS,EAAG,CACnB,MAAM,QAAQ,MAAM,0CAA2C,CAAC,EAAG,CACrE,CAAC,EACD,OAAO,KAAK,YAAY,CAAC,EAAItE,EAAGA,CAClC,CAWA,cAAc,EAAG,EAAG,EAAG,EAAG,CACxB,MAAMiB,EAAI,KACV,OAAO,KAAK,cAAc,UAAW,EAAE,KAAK,EAAE,KAAK,SAASqD,EAAG,CAC7D,GAAI,CAACA,EAAG,OAAO,KACf,GAAI,EAAE,WAAa,QAAU,EAAE,SAAW,IAAMA,EAAIA,EAAE,MAAK,EAAIA,EAAE,QAAU,EAAE,UAAWrD,EAAE,WAAWo7F,GAAG,qBAAqB,EAAG,CAC9H,MAAMv8F,EAAI,EAAE,aAAe,OAAS,EAAE,WAAWu8F,GAAG,qBAAqB,EAAI,OAC7E,GAAIv8F,EAAG,CACL,MAAM,EAAImB,EAAE,aAAa,IAAIqD,CAAC,EAC9BA,EAAIrD,EAAE,WAAWo7F,GAAG,qBAAqB,EAAE,cAAc/3F,EAAGxE,CAAC,EAAGmB,EAAE,aAAa,IAAIqD,EAAG,CAAC,CACzF,CACF,CACA,OAAO,IAAM,SAAWA,EAAE,WAAa,GAAI,EAAE,CAAC,EAAIA,EAAGA,CACvD,CAAC,CACH,CAWA,oBAAoB,EAAG,CACrB,MAAM,EAAI,EAAE,SACZ,IAAI,EAAI,EAAE,SACV,MAAM,EAAI,EAAE,WAAW,UAAY,OAAQrD,EAAI,EAAE,WAAW,QAAU,OAAQqD,EAAI,EAAE,WAAW,SAAW,OAC1G,GAAI,EAAE,SAAU,CACd,MAAMxE,EAAI,kBAAoB,EAAE,KAChC,IAAI,EAAI,KAAK,MAAM,IAAIA,CAAC,EACxB,IAAM,EAAI,IAAI0/F,GAAMC,GAAG,UAAU,KAAK,KAAK,EAAG,CAAC,EAAG,EAAE,MAAM,KAAK,EAAE,KAAK,EAAG,EAAE,IAAM,EAAE,IAAK,EAAE,gBAAkB,GAAI,KAAK,MAAM,IAAI3/F,EAAG,CAAC,GAAI,EAAI,CAC7I,SAAW,EAAE,OAAQ,CACnB,MAAMA,EAAI,qBAAuB,EAAE,KACnC,IAAI,EAAI,KAAK,MAAM,IAAIA,CAAC,EACxB,IAAM,EAAI,IAAI4/F,GAAMD,GAAG,UAAU,KAAK,KAAK,EAAG,CAAC,EAAG,EAAE,MAAM,KAAK,EAAE,KAAK,EAAG,EAAE,IAAM,EAAE,IAAK,KAAK,MAAM,IAAI3/F,EAAG,CAAC,GAAI,EAAI,CACrH,CACA,GAAI,GAAKmB,GAAKqD,EAAG,CACf,IAAIxE,EAAI,kBAAoB,EAAE,KAAO,IACrC,IAAMA,GAAK,wBAAyBmB,IAAMnB,GAAK,kBAAmBwE,IAAMxE,GAAK,iBAC7E,IAAI,EAAI,KAAK,MAAM,IAAIA,CAAC,EACxB,IAAM,EAAI,EAAE,MAAK,EAAImB,IAAM,EAAE,aAAe,IAAKqD,IAAM,EAAE,YAAc,IAAK,IAAM,EAAE,cAAgB,EAAE,YAAY,GAAK,IAAK,EAAE,uBAAyB,EAAE,qBAAqB,GAAK,KAAM,KAAK,MAAM,IAAIxE,EAAG,CAAC,EAAG,KAAK,aAAa,IAAI,EAAG,KAAK,aAAa,IAAI,CAAC,CAAC,GAAI,EAAI,CAC1Q,CACA,EAAE,SAAW,CACf,CACA,iBAAkB,CAChB,OAAO++F,EACT,CAQA,aAAa,EAAG,CACd,MAAM,EAAI,KAAM,EAAI,KAAK,KAAM,EAAI,KAAK,WAAY59F,EAAI,EAAE,UAAU,CAAC,EACrE,IAAIqD,EACJ,MAAMxE,EAAI,CAAA,EAAI,EAAImB,EAAE,YAAc,CAAA,EAAIsI,EAAI,CAAA,EAC1C,GAAI,EAAE8yF,GAAG,mBAAmB,EAAG,CAC7B,MAAM,EAAI,EAAEA,GAAG,mBAAmB,EAClC/3F,EAAI,EAAE,gBAAe,EAAIiF,EAAE,KAAK,EAAE,aAAazJ,EAAGmB,EAAG,CAAC,CAAC,CACzD,KAAO,CACL,MAAM,EAAIA,EAAE,sBAAwB,CAAA,EACpC,GAAInB,EAAE,MAAQ,IAAIyoF,GAAG,EAAG,EAAG,CAAC,EAAGzoF,EAAE,QAAU,EAAG,MAAM,QAAQ,EAAE,eAAe,EAAG,CAC9E,MAAMjC,EAAI,EAAE,gBACZiC,EAAE,MAAM,OAAOjC,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG47F,EAAE,EAAG35F,EAAE,QAAUjC,EAAE,CAAC,CACvD,CACA,EAAE,mBAAqB,QAAU0L,EAAE,KAAK,EAAE,cAAczJ,EAAG,MAAO,EAAE,iBAAkB05F,EAAE,CAAC,EAAG15F,EAAE,UAAY,EAAE,iBAAmB,OAAS,EAAE,eAAiB,EAAGA,EAAE,UAAY,EAAE,kBAAoB,OAAS,EAAE,gBAAkB,EAAG,EAAE,2BAA6B,SAAWyJ,EAAE,KAAK,EAAE,cAAczJ,EAAG,eAAgB,EAAE,wBAAwB,CAAC,EAAGyJ,EAAE,KAAK,EAAE,cAAczJ,EAAG,eAAgB,EAAE,wBAAwB,CAAC,GAAIwE,EAAI,KAAK,WAAW,SAASzG,EAAG,CAC3b,OAAOA,EAAE,iBAAmBA,EAAE,gBAAgB,CAAC,CACjD,CAAC,EAAG0L,EAAE,KAAK,QAAQ,IAAI,KAAK,WAAW,SAAS1L,EAAG,CACjD,OAAOA,EAAE,sBAAwBA,EAAE,qBAAqB,EAAGiC,CAAC,CAC9D,CAAC,CAAC,CAAC,CACL,CACAmB,EAAE,cAAgB,KAAOnB,EAAE,KAAO6/F,IAClC,MAAM3/F,EAAIiB,EAAE,WAAa09F,GAAG,OAC5B,GAAI3+F,IAAM2+F,GAAG,OAAS7+F,EAAE,YAAc,GAAIA,EAAE,WAAa,KAAOA,EAAE,YAAc,GAAIE,IAAM2+F,GAAG,OAAS7+F,EAAE,UAAYmB,EAAE,cAAgB,OAASA,EAAE,YAAc,KAAOA,EAAE,gBAAkB,QAAUqD,IAAM04F,KAAOzzF,EAAE,KAAK,EAAE,cAAczJ,EAAG,YAAamB,EAAE,aAAa,CAAC,EAAGnB,EAAE,YAAc,IAAIilF,GAAG,EAAG,CAAC,EAAG9jF,EAAE,cAAc,QAAU,QAAS,CAC1U,MAAM,EAAIA,EAAE,cAAc,MAC1BnB,EAAE,YAAY,IAAI,EAAG,CAAC,CACxB,CACA,GAAImB,EAAE,mBAAqB,QAAUqD,IAAM04F,KAAOzzF,EAAE,KAAK,EAAE,cAAczJ,EAAG,QAASmB,EAAE,gBAAgB,CAAC,EAAGA,EAAE,iBAAiB,WAAa,SAAWnB,EAAE,eAAiBmB,EAAE,iBAAiB,WAAYA,EAAE,iBAAmB,QAAUqD,IAAM04F,GAAI,CAC/O,MAAM,EAAI/7F,EAAE,eACZnB,EAAE,SAAW,IAAIyoF,GAAE,EAAG,OAAO,EAAE,CAAC,EAAG,EAAE,CAAC,EAAG,EAAE,CAAC,EAAGkR,EAAE,CACnD,CACA,OAAOx4F,EAAE,kBAAoB,QAAUqD,IAAM04F,IAAMzzF,EAAE,KAAK,EAAE,cAAczJ,EAAG,cAAemB,EAAE,gBAAiBu4F,EAAE,CAAC,EAAG,QAAQ,IAAIjwF,CAAC,EAAE,KAAK,UAAW,CAClJ,MAAM,EAAI,IAAIjF,EAAExE,CAAC,EACjB,OAAOmB,EAAE,OAAS,EAAE,KAAOA,EAAE,MAAO87F,GAAG,EAAG97F,CAAC,EAAG,EAAE,aAAa,IAAI,EAAG,CAAE,UAAW,CAAC,CAAE,EAAGA,EAAE,YAAc89F,GAAG,EAAG,EAAG99F,CAAC,EAAG,CACtH,CAAC,CACH,CAQA,iBAAiB,EAAG,CAClB,MAAM,EAAI2+F,GAAG,iBAAiB,GAAK,EAAE,EACrC,OAAO,KAAK,KAAK,cAAgB,EAAI,KAAM,EAAE,KAAK,cAAc,CAAC,GAAK,KAAK,cAAc,CAAC,EAAI,EAAG,EACnG,CAUA,eAAe,EAAG,CAChB,MAAM,EAAI,KAAM,EAAI,KAAK,WAAY,EAAI,KAAK,eAC9C,SAAS3+F,EAAEnB,EAAG,CACZ,OAAO,EAAEu8F,GAAG,0BAA0B,EAAE,gBAAgBv8F,EAAG,CAAC,EAAE,KAAK,SAAS,EAAG,CAC7E,OAAO+/F,GAAG,EAAG//F,EAAG,CAAC,CACnB,CAAC,CACH,CACA,MAAMwE,EAAI,CAAA,EACV,QAASxE,EAAI,EAAG,EAAI,EAAE,OAAQA,EAAI,EAAGA,IAAK,CACxC,MAAMyJ,EAAI,EAAEzJ,CAAC,EAAGE,EAAIk/F,GAAG31F,CAAC,EAAG,EAAI,EAAEvJ,CAAC,EAClC,GAAI,EACFsE,EAAE,KAAK,EAAE,OAAO,MACb,CACH,IAAIzG,EACJ0L,EAAE,YAAcA,EAAE,WAAW8yF,GAAG,0BAA0B,EAAIx+F,EAAIoD,EAAEsI,CAAC,EAAI1L,EAAIgiG,GAAG,IAAIrY,GAAMj+E,EAAG,CAAC,EAAG,EAAEvJ,CAAC,EAAI,CAAE,UAAWuJ,EAAG,QAAS1L,CAAC,EAAIyG,EAAE,KAAKzG,CAAC,CAChJ,CACF,CACA,OAAO,QAAQ,IAAIyG,CAAC,CACtB,CAQA,SAAS,EAAG,CACV,MAAM,EAAI,KAAM,EAAI,KAAK,KAAM,EAAI,KAAK,WAAYrD,EAAI,EAAE,OAAO,CAAC,EAAGqD,EAAIrD,EAAE,WAAYnB,EAAI,CAAA,EAC3F,QAAS,EAAI,EAAGyJ,EAAIjF,EAAE,OAAQ,EAAIiF,EAAG,IAAK,CACxC,MAAMvJ,EAAIsE,EAAE,CAAC,EAAE,WAAa,OAASs6F,GAAG,KAAK,KAAK,EAAI,KAAK,cAAc,WAAYt6F,EAAE,CAAC,EAAE,QAAQ,EAClGxE,EAAE,KAAKE,CAAC,CACV,CACA,OAAOF,EAAE,KAAK,EAAE,eAAewE,CAAC,CAAC,EAAG,QAAQ,IAAIxE,CAAC,EAAE,KAAK,SAAS,EAAG,CAClE,MAAMyJ,EAAI,EAAE,MAAM,EAAG,EAAE,OAAS,CAAC,EAAGvJ,EAAI,EAAE,EAAE,OAAS,CAAC,EAAG,EAAI,CAAA,EAC7D,QAAS+C,EAAI,EAAG3R,EAAI4O,EAAE,OAAQ+C,EAAI3R,EAAG2R,IAAK,CACxC,MAAMga,EAAI/c,EAAE+C,CAAC,EAAGtZ,EAAI6a,EAAEvB,CAAC,EACvB,IAAI1E,EACJ,MAAM0D,EAAIwH,EAAExG,CAAC,EACb,GAAItZ,EAAE,OAASyzG,GAAG,WAAazzG,EAAE,OAASyzG,GAAG,gBAAkBzzG,EAAE,OAASyzG,GAAG,cAAgBzzG,EAAE,OAAS,OACtG4U,EAAI4C,EAAE,gBAAkB,GAAK,IAAI6+F,GAAG/iF,EAAGhb,CAAC,EAAI,IAAI4lF,GAAG5qE,EAAGhb,CAAC,EAAG1D,EAAE,gBAAkB,IAAMA,EAAE,qBAAoB,EAAI5U,EAAE,OAASyzG,GAAG,eAAiB7+F,EAAE,SAAWw8F,GAAGx8F,EAAE,SAAU28F,EAAE,EAAIvxG,EAAE,OAASyzG,GAAG,eAAiB7+F,EAAE,SAAWw8F,GAAGx8F,EAAE,SAAU08F,EAAE,WACrOtxG,EAAE,OAASyzG,GAAG,MACrB7+F,EAAI,IAAI0hG,GAAGhjF,EAAGhb,CAAC,UACRtY,EAAE,OAASyzG,GAAG,WACrB7+F,EAAI,IAAI2hG,GAAGjjF,EAAGhb,CAAC,UACRtY,EAAE,OAASyzG,GAAG,UACrB7+F,EAAI,IAAI4hG,GAAGljF,EAAGhb,CAAC,UACRtY,EAAE,OAASyzG,GAAG,OACrB7+F,EAAI,IAAI6hG,GAAGnjF,EAAGhb,CAAC,MAEf,OAAM,IAAI,MAAM,iDAAmDtY,EAAE,IAAI,EAC3E,OAAO,KAAK4U,EAAE,SAAS,eAAe,EAAE,OAAS,GAAK4gG,GAAG5gG,EAAG4C,CAAC,EAAG5C,EAAE,KAAO,EAAE,iBAAiB4C,EAAE,MAAQ,QAAU,CAAC,EAAG87F,GAAG1+F,EAAG4C,CAAC,EAAGxX,EAAE,YAAcs1G,GAAG,EAAG1gG,EAAG5U,CAAC,EAAG,EAAE,oBAAoB4U,CAAC,EAAG,EAAE,KAAKA,CAAC,CAC/L,CACA,QAAS0E,EAAI,EAAG3R,EAAI,EAAE,OAAQ2R,EAAI3R,EAAG2R,IACnC,EAAE,aAAa,IAAI,EAAEA,CAAC,EAAG,CACvB,OAAQ,EACR,WAAYA,CACtB,CAAS,EACH,GAAI,EAAE,SAAW,EACf,OAAO9B,EAAE,YAAc89F,GAAG,EAAG,EAAE,CAAC,EAAG99F,CAAC,EAAG,EAAE,CAAC,EAC5C,MAAMpD,EAAI,IAAIsiG,GACdl/F,EAAE,YAAc89F,GAAG,EAAGlhG,EAAGoD,CAAC,EAAG,EAAE,aAAa,IAAIpD,EAAG,CAAE,OAAQ,CAAC,CAAE,EAChE,QAASkF,EAAI,EAAG3R,EAAI,EAAE,OAAQ2R,EAAI3R,EAAG2R,IACnClF,EAAE,IAAI,EAAEkF,CAAC,CAAC,EACZ,OAAOlF,CACT,CAAC,CACH,CAQA,WAAW,EAAG,CACZ,IAAI,EACJ,MAAM,EAAI,KAAK,KAAK,QAAQ,CAAC,EAAG,EAAI,EAAE,EAAE,IAAI,EAC5C,GAAI,CAAC,EAAG,CACN,QAAQ,KAAK,8CAA8C,EAC3D,MACF,CACA,OAAO,EAAE,OAAS,cAAgB,EAAI,IAAIuiG,GAAGjc,GAAG,SAAS,EAAE,IAAI,EAAG,EAAE,aAAe,EAAG,EAAE,OAAS,EAAG,EAAE,MAAQ,GAAG,EAAI,EAAE,OAAS,iBAAmB,EAAI,IAAImD,GAAG,CAAC,EAAE,KAAM,EAAE,KAAM,EAAE,KAAM,CAAC,EAAE,KAAM,EAAE,MAAO,EAAE,IAAI,GAAI,EAAE,OAAS,EAAE,KAAO,KAAK,iBAAiB,EAAE,IAAI,GAAIyV,GAAG,EAAG,CAAC,EAAG,QAAQ,QAAQ,CAAC,CACpS,CAQA,SAAS,EAAG,CACV,MAAM,EAAI,KAAK,KAAK,MAAM,CAAC,EAAG,EAAI,CAAA,EAClC,QAAS,EAAI,EAAG97F,EAAI,EAAE,OAAO,OAAQ,EAAIA,EAAG,IAC1C,EAAE,KAAK,KAAK,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,EAC3C,OAAO,EAAE,sBAAwB,OAAS,EAAE,KAAK,KAAK,cAAc,WAAY,EAAE,mBAAmB,CAAC,EAAI,EAAE,KAAK,IAAI,EAAG,QAAQ,IAAI,CAAC,EAAE,KAAK,SAAS,EAAG,CACtJ,MAAMA,EAAI,EAAE,MAAOqD,EAAI,EAAGxE,EAAI,GAAI,EAAI,CAAA,EACtC,QAASyJ,EAAI,EAAGvJ,EAAIsE,EAAE,OAAQiF,EAAIvJ,EAAGuJ,IAAK,CACxC,MAAM,EAAIjF,EAAEiF,CAAC,EACb,GAAI,EAAG,CACLzJ,EAAE,KAAK,CAAC,EACR,MAAMjC,EAAI,IAAI4qF,GACdxnF,IAAM,MAAQpD,EAAE,UAAUoD,EAAE,MAAOsI,EAAI,EAAE,EAAG,EAAE,KAAK1L,CAAC,CACtD,MACE,QAAQ,KAAK,mDAAoD,EAAE,OAAO0L,CAAC,CAAC,CAChF,CACA,OAAO,IAAI82F,GAAGvgG,EAAG,CAAC,CACpB,CAAC,CACH,CAQA,cAAc,EAAG,CACf,MAAM,EAAI,KAAK,KAAM,EAAI,KAAM,EAAI,EAAE,WAAW,CAAC,EAAGmB,EAAI,EAAE,KAAO,EAAE,KAAO,aAAe,EAAGqD,EAAI,CAAA,EAAIxE,EAAI,GAAI,EAAI,CAAA,EAAIyJ,EAAI,CAAA,EAAIvJ,EAAI,CAAA,EAChI,QAAS,EAAI,EAAGnC,EAAI,EAAE,SAAS,OAAQ,EAAIA,EAAG,IAAK,CACjD,MAAMkF,EAAI,EAAE,SAAS,CAAC,EAAG3R,EAAI,EAAE,SAAS2R,EAAE,OAAO,EAAGga,EAAIha,EAAE,OAAQtZ,EAAIszB,EAAE,KAAM1e,EAAI,EAAE,aAAe,OAAS,EAAE,WAAWjN,EAAE,KAAK,EAAIA,EAAE,MAAO2Q,EAAI,EAAE,aAAe,OAAS,EAAE,WAAW3Q,EAAE,MAAM,EAAIA,EAAE,OACtM2rB,EAAE,OAAS,SAAWzY,EAAE,KAAK,KAAK,cAAc,OAAQ7a,CAAC,CAAC,EAAGqW,EAAE,KAAK,KAAK,cAAc,WAAYzB,CAAC,CAAC,EAAG,EAAE,KAAK,KAAK,cAAc,WAAY0D,CAAC,CAAC,EAAGwH,EAAE,KAAKnY,CAAC,EAAG4O,EAAE,KAAK+c,CAAC,EACxK,CACA,OAAO,QAAQ,IAAI,CACjB,QAAQ,IAAIzY,CAAC,EACb,QAAQ,IAAIxE,CAAC,EACb,QAAQ,IAAI,CAAC,EACb,QAAQ,IAAIyJ,CAAC,EACb,QAAQ,IAAIvJ,CAAC,CACnB,CAAK,EAAE,KAAK,SAAS,EAAG,CAClB,MAAMnC,EAAI,EAAE,CAAC,EAAGkF,EAAI,EAAE,CAAC,EAAG3R,EAAI,EAAE,CAAC,EAAG2rB,EAAI,EAAE,CAAC,EAAGtzB,EAAI,EAAE,CAAC,EAAG4U,EAAI,CAAA,EAC5D,QAASN,EAAI,EAAGuoF,EAAIzoF,EAAE,OAAQE,EAAIuoF,EAAGvoF,IAAK,CACxC,MAAMgC,EAAIlC,EAAEE,CAAC,EAAGwoF,EAAIxjF,EAAEhF,CAAC,EAAGyoF,EAAIp1F,EAAE2M,CAAC,EAAG2oF,EAAI3pE,EAAEhf,CAAC,EAAG6oF,EAAIn9F,EAAEsU,CAAC,EACrD,GAAIgC,IAAM,OAAQ,SAClBA,EAAE,cAAgBA,EAAE,aAAY,EAChC,MAAM8mF,EAAI,EAAE,uBAAuB9mF,EAAGwmF,EAAGC,EAAGE,EAAGE,CAAC,EAChD,GAAIC,EACF,QAASX,EAAI,EAAGA,EAAIW,EAAE,OAAQX,IAC5B7nF,EAAE,KAAKwoF,EAAEX,CAAC,CAAC,CACjB,CACA,MAAMnkF,EAAI,IAAIkiE,GAAGhjE,EAAG,OAAQ5C,CAAC,EAC7B,OAAO0+F,GAAGh7F,EAAG,CAAC,EAAGA,CACnB,CAAC,CACH,CACA,eAAe,EAAG,CAChB,MAAM,EAAI,KAAK,KAAM,EAAI,KAAM,EAAI,EAAE,MAAM,CAAC,EAC5C,OAAO,EAAE,OAAS,OAAS,KAAO,EAAE,cAAc,OAAQ,EAAE,IAAI,EAAE,KAAK,SAASd,EAAG,CACjF,MAAMqD,EAAI,EAAE,YAAY,EAAE,UAAW,EAAE,KAAMrD,CAAC,EAC9C,OAAO,EAAE,UAAY,QAAUqD,EAAE,SAAS,SAASxE,EAAG,CACpD,GAAIA,EAAE,OACJ,QAAS,EAAI,EAAGyJ,EAAI,EAAE,QAAQ,OAAQ,EAAIA,EAAG,IAC3CzJ,EAAE,sBAAsB,CAAC,EAAI,EAAE,QAAQ,CAAC,CAC9C,CAAC,EAAGwE,CACN,CAAC,CACH,CAQA,SAAS,EAAG,CACV,MAAM,EAAI,KAAK,KAAM,EAAI,KAAM,EAAI,EAAE,MAAM,CAAC,EAAGrD,EAAI,EAAE,iBAAiB,CAAC,EAAGqD,EAAI,CAAA,EAAIxE,EAAI,EAAE,UAAY,CAAA,EACpG,QAASyJ,EAAI,EAAGvJ,EAAIF,EAAE,OAAQyJ,EAAIvJ,EAAGuJ,IACnCjF,EAAE,KAAK,EAAE,cAAc,OAAQxE,EAAEyJ,CAAC,CAAC,CAAC,EACtC,MAAM,EAAI,EAAE,OAAS,OAAS,QAAQ,QAAQ,IAAI,EAAI,EAAE,cAAc,OAAQ,EAAE,IAAI,EACpF,OAAO,QAAQ,IAAI,CACjBtI,EACA,QAAQ,IAAIqD,CAAC,EACb,CACN,CAAK,EAAE,KAAK,SAASiF,EAAG,CAClB,MAAMvJ,EAAIuJ,EAAE,CAAC,EAAG,EAAIA,EAAE,CAAC,EAAG1L,EAAI0L,EAAE,CAAC,EACjC1L,IAAM,MAAQmC,EAAE,SAAS,SAAS+C,EAAG,CACnCA,EAAE,eAAiBA,EAAE,KAAKlF,EAAGyhG,EAAE,CACjC,CAAC,EACD,QAASv8F,EAAI,EAAG3R,EAAI,EAAE,OAAQ2R,EAAI3R,EAAG2R,IACnC/C,EAAE,IAAI,EAAE+C,CAAC,CAAC,EACZ,OAAO/C,CACT,CAAC,CACH,CAGA,iBAAiB,EAAG,CAClB,MAAM,EAAI,KAAK,KAAM,EAAI,KAAK,WAAY,EAAI,KAC9C,GAAI,KAAK,UAAU,CAAC,IAAM,OACxB,OAAO,KAAK,UAAU,CAAC,EACzB,MAAMiB,EAAI,EAAE,MAAM,CAAC,EAAGqD,EAAIrD,EAAE,KAAO,EAAE,iBAAiBA,EAAE,IAAI,EAAI,GAAInB,EAAI,CAAA,EAAI,EAAI,EAAE,WAAW,SAASyJ,EAAG,CACvG,OAAOA,EAAE,gBAAkBA,EAAE,eAAe,CAAC,CAC/C,CAAC,EACD,OAAO,GAAKzJ,EAAE,KAAK,CAAC,EAAGmB,EAAE,SAAW,QAAUnB,EAAE,KAAK,EAAE,cAAc,SAAUmB,EAAE,MAAM,EAAE,KAAK,SAASsI,EAAG,CACxG,OAAO,EAAE,YAAY,EAAE,YAAatI,EAAE,OAAQsI,CAAC,CACjD,CAAC,CAAC,EAAG,EAAE,WAAW,SAASA,EAAG,CAC5B,OAAOA,EAAE,sBAAwBA,EAAE,qBAAqB,CAAC,CAC3D,CAAC,EAAE,QAAQ,SAASA,EAAG,CACrBzJ,EAAE,KAAKyJ,CAAC,CACV,CAAC,EAAG,KAAK,UAAU,CAAC,EAAI,QAAQ,IAAIzJ,CAAC,EAAE,KAAK,SAASyJ,EAAG,CACtD,IAAIvJ,EACJ,GAAIiB,EAAE,SAAW,GAAKjB,EAAI,IAAIsgG,GAAO/2F,EAAE,OAAS,EAAIvJ,EAAI,IAAImgG,GAAO52F,EAAE,SAAW,EAAIvJ,EAAIuJ,EAAE,CAAC,EAAIvJ,EAAI,IAAIo9F,GAAMp9F,IAAMuJ,EAAE,CAAC,EACpH,QAAS,EAAI,EAAG1L,EAAI0L,EAAE,OAAQ,EAAI1L,EAAG,IACnCmC,EAAE,IAAIuJ,EAAE,CAAC,CAAC,EACd,GAAItI,EAAE,OAASjB,EAAE,SAAS,KAAOiB,EAAE,KAAMjB,EAAE,KAAOsE,GAAIy4F,GAAG/8F,EAAGiB,CAAC,EAAGA,EAAE,YAAc89F,GAAG,EAAG/+F,EAAGiB,CAAC,EAAGA,EAAE,SAAW,OAAQ,CAChH,MAAM,EAAI,IAAIwnF,GACd,EAAE,UAAUxnF,EAAE,MAAM,EAAGjB,EAAE,aAAa,CAAC,CACzC,MACEiB,EAAE,cAAgB,QAAUjB,EAAE,SAAS,UAAUiB,EAAE,WAAW,EAAGA,EAAE,WAAa,QAAUjB,EAAE,WAAW,UAAUiB,EAAE,QAAQ,EAAGA,EAAE,QAAU,QAAUjB,EAAE,MAAM,UAAUiB,EAAE,KAAK,EAC/K,GAAI,CAAC,EAAE,aAAa,IAAIjB,CAAC,EACvB,EAAE,aAAa,IAAIA,EAAG,CAAA,CAAE,UACjBiB,EAAE,OAAS,QAAU,EAAE,UAAU,KAAKA,EAAE,IAAI,EAAI,EAAG,CAC1D,MAAM,EAAI,EAAE,aAAa,IAAIjB,CAAC,EAC9B,EAAE,aAAa,IAAIA,EAAG,CAAE,GAAG,CAAC,CAAE,CAChC,CACA,OAAO,EAAE,aAAa,IAAIA,CAAC,EAAE,MAAQ,EAAGA,CAC1C,CAAC,EAAG,KAAK,UAAU,CAAC,CACtB,CAQA,UAAU,EAAG,CACX,MAAM,EAAI,KAAK,WAAY,EAAI,KAAK,KAAK,OAAO,CAAC,EAAG,EAAI,KAAMiB,EAAI,IAAIk/F,GACtE,EAAE,OAASl/F,EAAE,KAAO,EAAE,iBAAiB,EAAE,IAAI,GAAI87F,GAAG97F,EAAG,CAAC,EAAG,EAAE,YAAc89F,GAAG,EAAG99F,EAAG,CAAC,EACrF,MAAMqD,EAAI,EAAE,OAAS,CAAA,EAAIxE,EAAI,CAAA,EAC7B,QAAS,EAAI,EAAGyJ,EAAIjF,EAAE,OAAQ,EAAIiF,EAAG,IACnCzJ,EAAE,KAAK,EAAE,cAAc,OAAQwE,EAAE,CAAC,CAAC,CAAC,EACtC,OAAO,QAAQ,IAAIxE,CAAC,EAAE,KAAK,SAAS,EAAG,CACrC,QAASE,EAAI,EAAG,EAAI,EAAE,OAAQA,EAAI,EAAGA,IACnCiB,EAAE,IAAI,EAAEjB,CAAC,CAAC,EACZ,MAAMuJ,EAAKvJ,GAAM,CACf,MAAM,EAAoB,IAAI,IAC9B,SAAW,CAACnC,EAAGkF,CAAC,IAAK,EAAE,cACpBlF,aAAa4hG,IAAM5hG,aAAa0hG,KAAO,EAAE,IAAI1hG,EAAGkF,CAAC,EACpD,OAAO/C,EAAE,SAAUnC,GAAM,CACvB,MAAMkF,EAAI,EAAE,aAAa,IAAIlF,CAAC,EAC9BkF,GAAK,MAAQ,EAAE,IAAIlF,EAAGkF,CAAC,CACzB,CAAC,EAAG,CACN,EACA,OAAO,EAAE,aAAewG,EAAEtI,CAAC,EAAGA,CAChC,CAAC,CACH,CACA,uBAAuB,EAAG,EAAG,EAAG,EAAGA,EAAG,CACpC,MAAMqD,EAAI,CAAA,EAAIxE,EAAI,EAAE,KAAO,EAAE,KAAO,EAAE,KAAM,EAAI,CAAA,EAChDy+F,GAAGt9F,EAAE,IAAI,IAAMs9F,GAAG,QAAU,EAAE,SAAS,SAAS1gG,EAAG,CACjDA,EAAE,uBAAyB,EAAE,KAAKA,EAAE,KAAOA,EAAE,KAAOA,EAAE,IAAI,CAC5D,CAAC,EAAI,EAAE,KAAKiC,CAAC,EACb,IAAIyJ,EACJ,OAAQg1F,GAAGt9F,EAAE,IAAI,EAAC,CAChB,KAAKs9F,GAAG,QACNh1F,EAAIg3F,GACJ,MACF,KAAKhC,GAAG,SACNh1F,EAAIi3F,GACJ,MACF,KAAKjC,GAAG,YACR,KAAKA,GAAG,MACNh1F,EAAIk3F,GACJ,MACF,QACE,OAAQ,EAAE,SAAQ,CAChB,IAAK,GACHl3F,EAAIg3F,GACJ,MACF,IAAK,GACL,IAAK,GACL,QACEh3F,EAAIk3F,GACJ,KACZ,CACQ,KACR,CACI,MAAMzgG,EAAI,EAAE,gBAAkB,OAASw+F,GAAG,EAAE,aAAa,EAAIC,GAAI,EAAI,KAAK,sBAAsB,CAAC,EACjG,QAAS5gG,EAAI,EAAGkF,EAAI,EAAE,OAAQlF,EAAIkF,EAAGlF,IAAK,CACxC,MAAMzM,EAAI,IAAImY,EACZ,EAAE1L,CAAC,EAAI,IAAM0gG,GAAGt9F,EAAE,IAAI,EACtB,EAAE,MACF,EACAjB,CACR,EACM,EAAE,gBAAkB,eAAiB,KAAK,mCAAmC5O,CAAC,EAAGkT,EAAE,KAAKlT,CAAC,CAC3F,CACA,OAAOkT,CACT,CACA,sBAAsB,EAAG,CACvB,IAAI,EAAI,EAAE,MACV,GAAI,EAAE,WAAY,CAChB,MAAM,EAAI86F,GAAG,EAAE,WAAW,EAAG,EAAI,IAAI,aAAa,EAAE,MAAM,EAC1D,QAASn+F,EAAI,EAAGqD,EAAI,EAAE,OAAQrD,EAAIqD,EAAGrD,IACnC,EAAEA,CAAC,EAAI,EAAEA,CAAC,EAAI,EAChB,EAAI,CACN,CACA,OAAO,CACT,CACA,mCAAmC,EAAG,CACpC,EAAE,kBAAoB,SAASrD,EAAG,CAChC,MAAMnC,EAAI,gBAAgB+kG,GAAK5C,GAAKH,GACpC,OAAO,IAAIhiG,EAAE,KAAK,MAAO,KAAK,OAAQ,KAAK,aAAY,EAAK,EAAGmC,CAAC,CAClE,EAAG,EAAE,kBAAkB,0CAA4C,EACrE,CACF,CACA,SAAS8iG,GAAG5zD,EAAG,EAAG,EAAG,CACnB,MAAM,EAAI,EAAE,WAAY,EAAI,IAAI6zD,GAChC,GAAI,EAAE,WAAa,OAAQ,CACzB,MAAM7gG,EAAI,EAAE,KAAK,UAAU,EAAE,QAAQ,EAAG,EAAIA,EAAE,IAAKyJ,EAAIzJ,EAAE,IACzD,GAAI,IAAM,QAAUyJ,IAAM,QACxB,GAAI,EAAE,IACJ,IAAI86E,EAAE,EAAE,CAAC,EAAG,EAAE,CAAC,EAAG,EAAE,CAAC,CAAC,EACtB,IAAIA,EAAE96E,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CAC9B,EAASzJ,EAAE,WAAY,CACf,MAAME,EAAIo/F,GAAG5B,GAAG19F,EAAE,aAAa,CAAC,EAChC,EAAE,IAAI,eAAeE,CAAC,EAAG,EAAE,IAAI,eAAeA,CAAC,CACjD,MACK,CACL,QAAQ,KAAK,qEAAqE,EAClF,MACF,CACF,KACE,QACF,MAAMiB,EAAI,EAAE,QACZ,GAAIA,IAAM,OAAQ,CAChB,MAAMnB,EAAI,IAAIukF,EAAK,EAAI,IAAIA,EAC3B,QAAS96E,EAAI,EAAGvJ,EAAIiB,EAAE,OAAQsI,EAAIvJ,EAAGuJ,IAAK,CACxC,MAAM,EAAItI,EAAEsI,CAAC,EACb,GAAI,EAAE,WAAa,OAAQ,CACzB,MAAM1L,EAAI,EAAE,KAAK,UAAU,EAAE,QAAQ,EAAGkF,EAAIlF,EAAE,IAAKzM,EAAIyM,EAAE,IACzD,GAAIkF,IAAM,QAAU3R,IAAM,OAAQ,CAChC,GAAI,EAAE,KAAK,KAAK,IAAI,KAAK,IAAI2R,EAAE,CAAC,CAAC,EAAG,KAAK,IAAI3R,EAAE,CAAC,CAAC,CAAC,CAAC,EAAG,EAAE,KAAK,KAAK,IAAI,KAAK,IAAI2R,EAAE,CAAC,CAAC,EAAG,KAAK,IAAI3R,EAAE,CAAC,CAAC,CAAC,CAAC,EAAG,EAAE,KAAK,KAAK,IAAI,KAAK,IAAI2R,EAAE,CAAC,CAAC,EAAG,KAAK,IAAI3R,EAAE,CAAC,CAAC,CAAC,CAAC,EAAGyM,EAAE,WAAY,CACtK,MAAMkf,EAAIqiF,GAAG5B,GAAG3/F,EAAE,aAAa,CAAC,EAChC,EAAE,eAAekf,CAAC,CACpB,CACAjd,EAAE,IAAI,CAAC,CACT,MACE,QAAQ,KAAK,qEAAqE,CACtF,CACF,CACA,EAAE,eAAeA,CAAC,CACpB,CACAgtC,EAAE,YAAc,EAChB,MAAMxoC,EAAI,IAAIs8F,GACd,EAAE,UAAUt8F,EAAE,MAAM,EAAGA,EAAE,OAAS,EAAE,IAAI,WAAW,EAAE,GAAG,EAAI,EAAGwoC,EAAE,eAAiBxoC,CACpF,CACA,SAASu7F,GAAG/yD,EAAG,EAAG,EAAG,CACnB,MAAM,EAAI,EAAE,WAAY,EAAI,CAAA,EAC5B,SAAS7rC,EAAEqD,EAAGxE,EAAG,CACf,OAAO,EAAE,cAAc,WAAYwE,CAAC,EAAE,KAAK,SAAS,EAAG,CACrDwoC,EAAE,aAAahtC,EAAG,CAAC,CACrB,CAAC,CACH,CACA,UAAWwE,KAAK,EAAG,CACjB,MAAMxE,EAAIy9F,GAAGj5F,CAAC,GAAKA,EAAE,YAAW,EAChCxE,KAAKgtC,EAAE,YAAc,EAAE,KAAK7rC,EAAE,EAAEqD,CAAC,EAAGxE,CAAC,CAAC,CACxC,CACA,GAAI,EAAE,UAAY,QAAU,CAACgtC,EAAE,MAAO,CACpC,MAAMxoC,EAAI,EAAE,cAAc,WAAY,EAAE,OAAO,EAAE,KAAK,SAASxE,EAAG,CAChEgtC,EAAE,SAAShtC,CAAC,CACd,CAAC,EACD,EAAE,KAAKwE,CAAC,CACV,CACA,OAAOooF,GAAG,oBAAsB+M,IAAM,YAAa,GAAK,QAAQ,KAAK,qEAAqE/M,GAAG,iBAAiB,kBAAkB,EAAGqQ,GAAGjwD,EAAG,CAAC,EAAG4zD,GAAG5zD,EAAG,EAAG,CAAC,EAAG,QAAQ,IAAI,CAAC,EAAE,KAAK,UAAW,CACvO,OAAO,EAAE,UAAY,OAASkyD,GAAGlyD,EAAG,EAAE,QAAS,CAAC,EAAIA,CACtD,CAAC,CACH,CACA,SAAS+zD,GAAG/zD,EAAG,EAAG,EAAG,CACnB,IAAI,EAAI,IAAIq2C,GACZ,EAAE,KAAO,EAAGr2C,EAAE,MAAM,IAAI,CAAC,EAAGqsD,GAAG,EAAI,QAAU,GAAM,CACjD,IAAIl4F,EAAI,KAAK,MAAM,CAAC,EACpB6rC,EAAE,aAAa,OAAO,KAAK,CACzB,KAAM,QACN,KAAM7rC,EACN,KAAMA,EAAE,SAAS,KACjB,OAAQ,UACR,IAAK,EACL,SAA0B,IAAI,GACpC,CAAK,EAAG6rC,EAAE,QAAU,OAASA,EAAE,OAAS,CAAA,GAAKA,EAAE,OAAO,KAAK,CACrD,IAAK,EACL,SAA0B,IAAI,IAC9B,YAAa,CACX,IAAK,IAAI+4C,EAAU5kF,EAAE,SAAS,IAAI,EAAI,MAAQA,EAAE,SAAS,IAAI,EAAI,MAAQ,CAACA,EAAE,SAAS,IAAI,EAAI,KAAM,EACnG,IAAK,IAAI4kF,EAAU5kF,EAAE,SAAS,IAAI,EAAI,MAAQA,EAAE,SAAS,IAAI,EAAI,MAAQ,CAACA,EAAE,SAAS,IAAI,EAAI,KAAM,CAC3G,CACA,CAAK,EAAG6rC,EAAE,OAAO,QAAQgtD,GAAG,WAAY,CAAC,CACvC,CAAC,CACH,CACA,SAASgH,GAAGh0D,EAAG,EAAG,CAChBA,EAAE,aAAa,OAAO,OAAQ,GAAM,GAAK,MAAQ,EAAE,KAAO,CAAC,EAAE,QAAS,GAAM,CAC1E,EAAE,YAAc,OAAS,EAAE,WAAa,CACtC,IAAK,GACL,SAAU,GACV,OAAQ,EACd,GAAQ,EAAE,SAAW,WAAa,EAAE,OAAS,UAAY,EAAE,WAAW,UAAY,KAAO,EAAE,WAAW,SAAW,GAAIitD,GAAGjtD,EAAG,EAAE,KAAK,SAAU,EAAE,GAAG,GAAI,EAAE,WAAW,QAAU,IAAMi0D,GAAGj0D,EAAG,CAAC,EACvL,CAAC,CACH,CACA,SAASi0D,GAAGj0D,EAAG,EAAG,CAChB,GAAIA,EAAE,OAAO,SAAU,EAAE,KAAM,EAAE,MAAQ,MAAQ,EAAE,KAAK,MAAQ,KAC9D,OACF,EAAE,KAAK,KAAK,QAASrxC,GAAM,CACzB,GAAIA,EAAE,QAAU,GACd,GAAIA,EAAE,MAAQ,KACZ,QAAQ,IAAI,oBAAoB,EAAGA,EAAE,KAAO,CAAA,EAAIy9F,GAAG,EAAE,IAAMz9F,EAAE,KAAOwF,GAAM,CACxEg4F,GAAGh4F,EAAE,IAAI,aAAa,EAAI,GAAM,CAC9B,IAAI,EAAI,KAAK,MAAM,CAAC,EACpB6rC,EAAE,OAAO,KAAM,GAAM,EAAE,KAAO,EAAE,GAAG,EAAE,UAAY,OAASA,EAAE,OAAO,KAAM,GAAM,EAAE,KAAO,EAAE,GAAG,EAAE,SAA2B,IAAI,KAC9H,IAAIjlD,EAAIilD,EAAE,OAAO,KAAM,GAAM,EAAE,KAAO,EAAE,GAAG,EAAE,SAAUvjC,EAAI,EAC3D,QAAS,KAAK,EAAG,CACf,EAAE,CAAC,EAAE,QAASxG,GAAM,CAClBA,EAAE,IAAM,EAAGlb,EAAE,IAAIkb,EAAE,EAAE,GAAK,GAAKlb,EAAE,IAAIkb,EAAE,GAAI,CAAE,MAAO,CAACA,CAAC,CAAC,CAAE,EAAIlb,EAAE,IAAIkb,EAAE,EAAE,EAAE,MAAM,KAAKA,CAAC,CACvF,CAAC,EACD,IAAIqE,EAAI,IAAI6zF,GACZ,MAAMp9F,EAAI,IAAIw7F,GACdx7F,EAAE,eAAe,SAAS,EAAGA,EAAE,QAAO,EAAIuJ,EAAE,eAAevJ,CAAC,EAAGuJ,EAAE,KAAKnG,EAAE,IAAI,EAAI,MAAM,EAAI8B,GAAM,CAC9FtH,EAAE,KAAK,CAAC,EAAIsH,EAAE,MAAM,SAAUtH,EAAE,KAAK,CAAC,EAAE,QAAS,GAAM,CACrD,EAAE,SAAS,qBAAoB,CACjC,CAAC,EAAG8N,IAAKA,GAAK,OAAO,KAAK,CAAC,EAAE,QAAUujC,EAAE,aAAa,SAAWA,EAAE,OAAO,QAAQgtD,GAAG,WAAY,EAAE,GAAG,EAAGhtD,EAAE,SAAS,eACtH,CAAC,CACH,CACAmsD,GAAGh4F,EAAE,IAAI,iBAAiB,EAAI,GAAM,CAClC,IAAImG,EAAI,KAAK,MAAM,CAAC,EACpB0lC,EAAE,OAAO,KAAMjvC,GAAMA,EAAE,KAAO,EAAE,GAAG,EAAE,cAAgBuJ,CACvD,CAAC,CACH,CAAC,CACH,CAAC,MACE,CACH,IAAInG,EAAIrD,EAAE,EAAGnC,EAAGA,EAAE,SAAS,EAAG,EAAI,CAAA,EAAI,EAAIqxC,EAAE,OAAO,KAAMvjC,GAAMA,EAAE,KAAO,EAAE,GAAG,EAC7EtI,EAAE,QAASsI,GAAM,CACf,EAAE,SAAS,IAAIA,CAAC,GAAK,EAAE,SAAS,IAAIA,CAAC,EAAE,MAAM,QAAS,GAAM,CAC1D,IAAInC,EAAI3L,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,IAAI,EAC5B,GAAI2L,GAAK,MAAQA,EAAE,UAAY,MAAQA,EAAE,UAAY,KAAM,CACzD,IAAIvJ,EAAI,IAAIw8F,GACZx8F,EAAE,SAAW,EAAE,OACf,IAAIkF,EAAI,IAAI23F,GAAOtzF,EAAE,SAAS,MAAK,EAAG,aAAavJ,CAAC,EAAGuJ,EAAE,QAAQ,EAAG,EAAI,IAAI45F,GAAM,EAAG,cAAcj+F,CAAC,EACpG,EAAE,IAAM,EAAG,EAAE,KAAOA,EAAGA,EAAE,KAAOwG,EAAGxG,EAAE,IAAM,EAAE,IAAKA,EAAE,IAAM,EAAE,IAAKqE,EAAE,SAAS,WAAW,UAAY,MAAQ,EAAE,KAAKrE,CAAC,CACrH,CACF,CAAC,CACH,CAAC,EAAGk+F,GAAG,EAAE,IAAKn0D,EAAG,CAAC,EAClB,IAAIjlD,EAAI,EAAE,cACV,GAAIA,GAAK,KACP,QAAS0hB,KAAK1hB,GACXA,EAAE0hB,CAAC,EAAE,UAAY,MAAQ1hB,EAAE0hB,CAAC,EAAE,UAAY,MAAQ1hB,EAAE0hB,CAAC,EAAE,SAAW,GAAI1hB,EAAE0hB,CAAC,EAAE,QAAS,GAAM,CACzF,GAAI9N,EAAE,KAAK8N,CAAC,GAAK,KAAM,CACrB,IAAInC,EAAI3L,EAAE,KAAK8N,CAAC,EAAE,EAAE,IAAI,EACxB23F,GAAG,EAAE,IAAK,EAAE,KAAMp0D,EAAG1lC,EAAG,EAAE,QAAQ,CACpC,CACF,CAAC,EACP,CACJ,CAAC,EACD,SAASxJ,EAAEnC,EAAGwF,EAAG,EAAG,CAClB,IAAI,EAAI,CAAA,EACR,GAAI,EAAE,QAAU,GAAI,CAClB,GAAI,CAAC6rC,EAAE,aAAa,OAClB,OAAO,EACT,IAAIjlD,EAAI,IAAIg+F,EAAU,EAAE,IAAI,EAAG,EAAE,IAAI,EAAG,CAAC,EAAE,IAAI,CAAC,EAAGt8E,EAAI,IAAIs8E,EAAU,EAAE,IAAI,EAAG,EAAE,IAAI,EAAG,CAAC,EAAE,IAAI,CAAC,EAC/Ft8E,EAAE,WAAW1hB,CAAC,EACd,IAAI,EAAIilD,EAAE,OAAO,SAAU1lC,EAAI,IAAIy+E,EAAUh+F,EAAE,EAAI0hB,EAAE,EAAI,EAAG1hB,EAAE,EAAI0hB,EAAE,EAAI,EAAG1hB,EAAE,EAAI0hB,EAAE,EAAI,CAAC,EACxF,EAAE,WAAWnC,CAAC,EAAG,EAAE,SAAS,QAASvJ,GAAM,CACzC,EAAE,KAAKA,CAAC,CACV,CAAC,EAAG,EAAE,SAAS,QAASA,GAAM,CAC5B,EAAE,KAAK,GAAGD,EAAEnC,EAAGwF,EAAGpD,CAAC,CAAC,CACtB,CAAC,EAAG,EAAE,SAAS,UAAWA,GAAMA,EAAE,QAAU,EAAE,GAAK,KAAO,EAAE,OAAS,IAAK,EAAE,SAAS,QAAU,IAAM,EAAE,OAAS,GAClH,CACA,OAAO,CACT,CACF,CACA,SAASojG,GAAGn0D,EAAG,EAAG,EAAG,CACnB,IAAI,EAAI,CAAA,EACR,EAAE,QAAS,GAAM,CACf,EAAE,UAAWxoC,GAAMA,EAAE,KAAO,EAAE,GAAG,GAAK,GAAK,EAAE,KAAK,CAChD,IAAK,EAAE,IACP,OAAQ,CAAC,CAAC,EACV,aAAc,EAAE,SAAS,MAAM,MAC/B,QAAyB,IAAI,GACnC,CAAK,GAAK,EAAE,KAAMA,GAAMA,EAAE,KAAO,EAAE,GAAG,EAAE,OAAO,KAAK,CAAC,EAAG,EAAE,KAAMA,GAAMA,EAAE,KAAO,EAAE,GAAG,EAAE,cAAgB,EAAE,SAAS,MAAM,OACnH,IAAIrD,EAAI,EAAE,KAAMqD,GAAMA,EAAE,KAAO,EAAE,GAAG,EACpCrD,EAAE,QAAQ,IAAI,OAAO,EAAE,IAAI,EAAG,CAACA,EAAE,aAAe,EAAE,SAAS,MAAM,MAAOA,EAAE,YAAY,CAAC,CACzF,CAAC,EAAG,EAAE,QAAS,GAAM,CACnB,IAAIA,EAAI,EAAE,MAAM,SAAS,KAAMqD,GAAMA,aAAao2F,IAAUp2F,EAAE,KAAOwoC,GAAKxoC,EAAE,KAAO,EAAE,GAAG,EACxF,GAAIrD,GAAK,KACPA,EAAE,WAAa,GAAIA,EAAE,cAAgB,OAClC,CACH,IAAIqD,EAAI,IAAI21F,GAAoBn6F,EAAIqhG,GAAG,EAAE,OAAO,CAAC,EAAE,QAAQ,EAC3D78F,EAAIq2F,GAAG,EAAE,OAAO,IAAK36F,GAAMA,EAAE,QAAQ,EAAG,EAAE,EAC1C,IAAI,EAAI,IAAI06F,GAAOp2F,EAAGxE,CAAC,EACvB,EAAE,WAAa,GAAI,EAAE,cAAgB,GAAI,EAAE,MAAM,IAAI,CAAC,EAAG,EAAE,MAAQ,EAAE,MAAM,SAAS,OAAS,EAAG,EAAE,IAAMgtC,EAAG,EAAE,IAAM,EAAE,IAAK,EAAE,QAAU,EAAE,QAAS,EAAE,cAAgBhtC,EAAG,EAAE,UAAY,EAAE,OAAO,IAAKE,GAAMA,EAAE,QAAQ,EAClN,IAAIuJ,EAAI,EAAE,OAAO,KAAMvJ,GAAMA,EAAE,KAAO8sC,CAAC,EACvC,GAAIvjC,GAAK,KAAM,CACb,IAAIvJ,EAAI,EACR,EAAE,QAAQ,QAAS,GAAM,CACvBuJ,EAAE,SAAS,IAAI,OAAO,EAAE,OAAOvJ,CAAC,EAAE,IAAI,CAAC,EAAE,SAAW,OAASuJ,EAAE,SAAS,IAAI,OAAO,EAAE,OAAOvJ,CAAC,EAAE,IAAI,CAAC,EAAE,QAAU,CAAA,GAAKuJ,EAAE,SAAS,IAAI,OAAO,EAAE,OAAOvJ,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,KAAK,CAAC,EAAE,MAAOA,IAAK,EAAE,CAAC,EAAG,EAAE,CAAC,CAAC,CAAC,CACvM,CAAC,CACH,CACF,CACF,CAAC,CACH,CACA,SAASkhG,GAAGp0D,EAAG,EAAG,EAAG,EAAG,EAAG,CACzB,GAAI,GAAK,KACP,OACF,IAAI7rC,EAAI,IAAIklF,GAAgB,EAAE,SAAU,EAAE,SAAU,EAAE,MAAM,EAC5D,EAAE,MAAM,IAAIllF,CAAC,EACb,MAAMqD,EAAI,IAAI,aAAa,EAAE,OAAS,CAAC,EACvC,QAAS,EAAI,EAAG,EAAI,EAAE,OAAQ,IAC5BA,EAAE,EAAI,CAAC,EAAI,EAAGA,EAAE,EAAI,EAAI,CAAC,EAAI,EAAGA,EAAE,EAAI,EAAI,CAAC,EAAI,EACjDrD,EAAE,cAAgB,IAAImgG,GAA2B98F,EAAG,CAAC,EACrD,IAAIxE,EAAI,CAAA,EACR,QAAS,EAAI,EAAG,EAAI,EAAE,OAAQ,IAAK,CACjC,IAAIyJ,EAAI,EAAE,CAAC,EAAGvJ,EAAI,IAAIq6F,GACtBr6F,EAAE,SAAWuJ,EAAE,OAAQtI,EAAE,YAAY,EAAGjB,CAAC,EAAGiB,EAAE,UAAYA,EAAE,QAAU,CAAA,GAAKA,EAAE,QAAQ,KAAKjB,EAAE,MAAK,CAAE,EAAGF,EAAE,KAAKE,EAAE,MAAK,CAAE,EAAG,EAAE,OAAO,KAAM,GAAM,EAAE,KAAO8sC,CAAC,EAAE,SAAS,IAAIvjC,EAAE,EAAE,GAAK,EAAE,OAAO,KAAM,GAAM,EAAE,KAAOujC,CAAC,EAAE,SAAS,IAAIvjC,EAAE,EAAE,EAAE,SAAW,OAAS,EAAE,OAAO,KAAM,GAAM,EAAE,KAAOujC,CAAC,EAAE,SAAS,IAAIvjC,EAAE,EAAE,EAAE,QAAU,CAAA,GAAK,EAAE,OAAO,KAAM,GAAM,EAAE,KAAOujC,CAAC,EAAE,SAAS,IAAIvjC,EAAE,EAAE,EAAE,QAAQ,KAAK,CAAC,EAAE,MAAM,SAAS,OAAS,EAAG,EAAG,EAAG,CAAC,CAAC,GAAK,EAAE,OAAO,KAAM,GAAM,EAAE,KAAOujC,CAAC,EAAE,SAAS,IAAIvjC,EAAE,GAAI,CAAE,SAAU,GAAI,KAAMA,EAAG,QAAS,CAAC,CAAC,EAAE,MAAM,SAAS,OAAS,EAAG,EAAG,EAAG,CAAC,CAAC,CAAC,CAAE,CACziB,CACAtI,EAAE,MAAQ,EAAE,MAAM,SAAS,OAAS,EAAGA,EAAE,cAAgB,EAAE,SAAUA,EAAE,IAAM6rC,EAAG7rC,EAAE,IAAM,EAAE,IAAKA,EAAE,IAAM,EAAE,IAAK,GAAM,EAAE,EAAE,EAAGA,EAAE,aAAenB,CAC9I,CACA,SAASqhG,GAAGr0D,EAAG,CACb,OAAOA,EAAE,KAAO,OAASA,EAAE,IAAI,WAAa42C,GAAkB52C,EAAE,IAAI,YAAc,IAAKA,EAAE,WAAau0D,GAAav0D,EAAE,KAAOA,EAAE,KAAMA,CACtI,CACA,MAAMw0D,EAAG,CACP,OACA,YAAY,EAAG,CACb,KAAK,OAAS,CAChB,CAEA,MAAM,WAAW,EAAG,EAAG,CACrB,QAAQ,IAAI,QAAS,CAAC,EACtB,UAAW,KAAK,EACd,EAAE,CAAC,IAAM,SAAWT,GAAG,KAAK,OAAQ,CAAC,EACvC,SAAS,EAAE,EAAG,CACZ,MAAM5/F,EAAI,EAAE,MAAM,GAAG,EAAE,IAAG,EAC1B,OAAOA,IAAM,OAASA,IAAM,OAAS,OAAS,OAChD,CACF,CACF,CACA,MAAMsgG,EAAG,CACP,OACA,OAEA,gBAEA,WAEA,kBAEA,OACA,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,OAAS,GAAI,KAAK,gBAAkB,CAAA,EAAI,KAAK,WAAa,CAAA,EAAI,KAAK,kBAAoB,GAAI,KAAK,OAAS,CAAA,CACjI,CACA,MAAO,CACL,KAAK,OAAO,OAAO,GAAGzH,GAAG,WAAa,GAAM,CAC1C,KAAK,WAAW,EAAE,EAAGgH,GAAG,KAAK,OAAQ,CAAC,CACxC,CAAC,EAAG,KAAK,OAAO,OAAO,GAAGhH,GAAG,WAAY,IAAM,CAC7C,KAAK,WAAW,EAAE,CACpB,CAAC,CACH,CAEA,WAAW,EAAG,CACZ,KAAK,OAAS,CAChB,CAEA,iBAAmB,IAAM,CACzB,CACF,CACA,MAAM0H,EAAG,CAEP,UAA4B,IAAI,IAEhC,UAAY,GAKZ,aAAa,EAAG,CACd,KAAK,UAAY,CACnB,CAMA,GAAG,EAAG,EAAG,CACP,MAAM,EAAI,OAAO,CAAC,EAClB,KAAK,UAAU,IAAI,CAAC,GAAK,KAAK,UAAU,IAAI,EAAG,CAAA,CAAE,EAAG,KAAK,UAAU,IAAI,CAAC,EAAE,KAAK,CAAC,EAAG,KAAK,WAAa,QAAQ,MAAM,0BAA0B,CAAC,cAAc,KAAK,UAAU,IAAI,CAAC,EAAE,MAAM,EAAE,CAC5L,CAMA,IAAI,EAAG,EAAG,CACR,MAAM,EAAI,OAAO,CAAC,EAClB,GAAI,CAAC,KAAK,UAAU,IAAI,CAAC,EAAG,CAC1B,KAAK,WAAa,QAAQ,KAAK,gCAAgC,CAAC,EAAE,EAClE,MACF,CACA,MAAM,EAAI,KAAK,UAAU,IAAI,CAAC,EAAGvgG,EAAI,EAAE,QAAQ,CAAC,EAChDA,IAAM,IAAM,EAAE,OAAOA,EAAG,CAAC,EAAG,KAAK,WAAa,QAAQ,MAAM,0BAA0B,CAAC,cAAc,EAAE,MAAM,EAAE,GAAK,KAAK,WAAa,QAAQ,KAAK,+BAA+B,CAAC,EAAE,CACvL,CAMA,QAAQ,EAAG,EAAG,CACZ,MAAM,EAAI,OAAO,CAAC,EAClB,GAAI,CAAC,KAAK,UAAU,IAAI,CAAC,EAAG,CAC1B,KAAK,YAAc,QAAQ,KAAK,8BAA8B,CAAC,EAAE,EAAG,QAAQ,MAAM,4BAA6B,MAAM,KAAK,KAAK,UAAU,KAAI,CAAE,CAAC,GAChJ,MACF,CACA,MAAM,EAAI,KAAK,UAAU,IAAI,CAAC,EAC9B,KAAK,WAAa,QAAQ,MAAM,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAI,CAAC,EAAG,EAAE,QAAQ,CAACA,EAAGqD,IAAM,CACtG,GAAI,CACFrD,EAAE,CAAC,CACL,OAASnB,EAAG,CACV,QAAQ,MAAM,4BAA4B,CAAC,MAAMwE,CAAC,IAAKxE,CAAC,CAC1D,CACF,CAAC,CACH,CACF,CACA,MAAM2hG,EAAG,CACP,OACA,YAAY,EAAG,CACb,KAAK,OAAS,CAChB,CAEA,MAAO,CACL,MAAM,EAAI,IAAIC,GAAmB,SAAU,CAAC,EAC5C,EAAE,SAAS,IAAI,IAAK,IAAK,GAAG,EAAG,EAAE,WAAa,GAAI,EAAE,OAAO,QAAQ,MAAQ,KAAM,EAAE,OAAO,QAAQ,OAAS,KAAM,EAAE,OAAO,OAAO,KAAO,GAAK,EAAE,OAAO,OAAO,IAAM,IAAK,EAAE,OAAO,KAAO,MAAO,EAAE,OAAO,WAAa,IACrN,MAAM,EAAI,GACV,EAAE,OAAO,OAAO,KAAO,CAAC,EAAG,EAAE,OAAO,OAAO,MAAQ,EAAG,EAAE,OAAO,OAAO,IAAM,EAAG,EAAE,OAAO,OAAO,OAAS,CAAC,EAAG,EAAE,OAAO,OAAS,EAC9H,MAAM,EAAI,IAAIA,GAAmB,SAAU,CAAC,EAC5C,KAAK,OAAO,MAAM,IAAI,CAAC,EAAG,KAAK,OAAO,MAAM,IAAI,CAAC,EAAG,KAAK,OAAO,MAAM,SAAW,EACjF,MAAM,EAAI,IAAIC,GAAe,SAAU,CAAC,EACxC,KAAK,OAAO,MAAM,IAAI,CAAC,CACzB,CACF,CACA,IAAIC,IAAuB90D,IAAOA,EAAE,eAAiB,mBAAoBA,EAAE,kBAAoB,sBAAuBA,EAAE,YAAc,eAAgBA,EAAE,WAAa,cAAeA,EAAE,iBAAmB,oBAAqBA,EAAE,aAAe,gBAAiBA,EAAE,MAAQ,QAASA,EAAE,UAAY,aAAcA,EAAE,cAAgB,iBAAkBA,EAAE,WAAa,cAAeA,EAAE,WAAa,cAAeA,EAAE,WAAa,cAAeA,EAAE,eAAiB,kBAAmBA,EAAE,aAAe,gBAAiBA,EAAE,YAAc,eAAgBA,IAAI80D,IAAM,CAAA,CAAE,EACjiB,MAAMC,EAAG,CACP,OACA,SACA,WAAa,GACb,qBAAuB,CAAA,EACvB,eAAiB,IAAI3H,GAAQ,KAAK,EAElC,YAAY,EAAG,CACb,KAAK,OAAS,CAChB,CACA,MAAO,CACL,KAAK,SAAW,KAAK,OAAO,cAAe,KAAK,SAAS,KAAK,IAAI,CACpE,CACA,QAAS,CACP,KAAK,SAAS,OAAM,CACtB,CACA,WAAY,CACV,KAAK,SAAS,UAAS,CACzB,CAEA,iBAAkB,CAChB,KAAK,WAAa,EACpB,CACA,mBAAoB,CAClB,KAAK,WAAa,EACpB,CAEA,WAAa,KAEb,gBAAgB,EAAG,CACjB,GAAI,CAAC,KAAK,OAAO,aAAa,OAAQ,CACpC,KAAK,OAAO,eAAe,eAAc,EACzC,MACF,CACA,IAAI,EAAI,KAAK,cAAc,CAAC,EAC5B,GAAK,KAAO,EAAE,OAAS,GAAK,KAAK,OAAO,eAAe,UAAU,CAAC,EAAI,KAAK,OAAO,eAAe,eAAc,CACjH,CACA,cAAc,EAAG,CACf,GAAI,EAAE,OAAS,KACb,OAAO,KAAK,WAAa,KAAM,KACjC,GAAI,EAAE,MAAM,OAAO,WAAY,CAC7B,IAAI,EAAI,EAAE,MAAM,OAAQ,EAAI,EAAE,MAAM,OAAO,GAAI,EAAI,KAAK,OAAO,OAAO,KAAMp6F,GAAMA,EAAE,KAAO,EAAE,GAAG,EAAE,SAAS,IAAI,CAAC,EAAGmB,EAAoB,IAAI,IAC3I,GAAG,QAAQ,QAASnB,GAAM,CACxB,KAAK,OAAO,MAAM,SAASA,EAAE,CAAC,CAAC,YAAaqmF,KAAoBllF,EAAE,IAAInB,EAAE,CAAC,CAAC,EAAImB,EAAE,IAAInB,EAAE,CAAC,CAAC,GAAG,KAAKA,EAAE,CAAC,CAAC,EAAImB,EAAE,IAAInB,EAAE,CAAC,EAAG,CAACA,EAAE,CAAC,CAAC,CAAC,EAC5H,CAAC,EACD,IAAIwE,EAAI,CAAA,EACR,OAAOrD,EAAE,QAAQ,CAACnB,EAAG,IAAM,CACzB,IAAIyJ,EAAI,KAAK,OAAO,MAAM,SAAS,CAAC,EACpCzJ,EAAE,QAASE,GAAM,CACf,IAAI,EAAIuJ,EAAE,SAAS,MAAK,EACxB,EAAE,aAAaA,EAAE,QAAQvJ,CAAC,CAAC,EAAGsE,EAAE,KAAK,IAAIo2F,GAAO,EAAGnxF,EAAE,QAAQ,CAAC,CAChE,CAAC,CACH,CAAC,EAAG,KAAK,YAAc,EAAI,CAAA,GAAM,KAAK,WAAa,EAAG,KAAK,OAAO,eAAe,eAAc,EAAIjF,EACrG,KAAO,CACL,MAAM,EAAI,EAAE,MACZ,EAAE,OACF,IAAI,EAAI,EAAE,OAAQ,EAAI,EAAE,KAAMxE,EAAI,KAAK,OAAO,OAAO,KAAMjY,GAAMA,EAAE,MAAQ,EAAE,GAAG,EAAE,SAAS,IAAI,CAAC,EAAE,MAAM,IAAKA,GAAMA,EAAE,IAAI,EACzH,OAAO,KAAK,YAAc,EAAI,CAAA,GAAM,KAAK,WAAa,EAAG,KAAK,OAAO,eAAe,eAAc,EAAIiY,EACxG,CACF,CAEA,iBAAiB,EAAG,CAClB,GAAI,EAAE,OAAS,KAAM,CACnB,MAAM,EAAI,EAAE,MACZ,IAAI,EAAI,EAAE,OACV,KAAK,YAAc,KAAK,OAAO,gBAAgB,uBAAwB,QAAQ,IAAI,CAAC,CAAE,IAAK,EAAE,IAAK,IAAK,CAAC,EAAE,IAAI,EAAG,CAAC,EAAG,KAAK,OAAO,cAAc,cAAc,OAAO,IAAI,EAAE,MAAM,EAAG,EAAE,MAAM,EAAG,EAAE,MAAM,CAAC,EAAG,KAAK,OAAO,gBAAgB,eAAe,CAAC,CAAE,IAAK,EAAE,IAAK,IAAK,CAAC,EAAE,IAAI,CAAC,CAAE,CAAC,EAAG,KAAK,OAAO,OAAO,QAAQ8hG,GAAG,MAAO,EAAE,CAChU,MACE,KAAK,OAAO,gBAAgB,qBAAoB,CACpD,CAEA,uBAAuB,EAAG,CACxB,GAAI,EAAE,MAAO,CACX,MAAM,EAAI,EAAE,MACZ,EAAE,OAAQ,KAAK,OAAO,OAAO,QAAQA,GAAG,MAAO,CAAC,EAChD,IAAI,EAAI,EAAE,OAAQ9hG,EAAI,KAAK,OAAO,OAAO,KAAMyJ,GAAMA,EAAE,MAAQ,EAAE,GAAG,EAAE,SAAS,IAAI,EAAE,IAAI,EAAE,MAAM,IAAKA,GAAMA,EAAE,GAAG,EAAG1hB,EAAI,EAAEiY,CAAC,EAC3H,KAAK,OAAO,SAAS,YAAYjY,CAAC,CACpC,CACA,SAAS,EAAE,EAAG,CACZ,IAAI,EAAI,IAAIg+F,EAAU,IAAK,IAAK,IAAI,EAAG5kF,EAAI,IAAI4kF,EAAU,KAAM,KAAM,KAAK,EAC1E,OAAO,EAAE,QAASvhF,GAAM,CACtBA,EAAE,IAAI,EAAI,EAAE,IAAM,EAAE,EAAIA,EAAE,IAAI,GAAIA,EAAE,IAAI,EAAI,EAAE,IAAM,EAAE,EAAIA,EAAE,IAAI,GAAIA,EAAE,IAAI,EAAI,EAAE,IAAM,EAAE,EAAIA,EAAE,IAAI,GAAIA,EAAE,IAAI,EAAIrD,EAAE,IAAMA,EAAE,EAAIqD,EAAE,IAAI,GAAIA,EAAE,IAAI,EAAIrD,EAAE,IAAMA,EAAE,EAAIqD,EAAE,IAAI,GAAIA,EAAE,IAAI,EAAIrD,EAAE,IAAMA,EAAE,EAAIqD,EAAE,IAAI,EAC1M,CAAC,EAAG,IAAI08F,GAAO,EAAG//F,CAAC,CACrB,CACF,CAEA,yBAAyB,EAAG,CAC1B,OAAO,EAAE,iBAAiB,KAAK,OAAO,MAAM,SAAS,OAAQrD,GAAMA,aAAauoF,EAAe,EAAG,EAAE,CACtG,CACF,CACA,MAAM2b,EAAG,CACP,OACA,kBACA,aACA,oBAIA,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,kBAAoB,IAAI9H,GAAoB,CAChE,MAAO,MAEP,UAAW,GAEX,WAAY,GAEZ,YAAa,GACb,QAAS,GAET,KAAMS,EAEZ,CAAK,EAAG,KAAK,aAAe,IAAIT,GAAoB,CAC9C,MAAO,EAEP,YAAa,GACb,QAAS,EAET,KAAMS,EAEZ,CAAK,EAAG,KAAK,oBAAsB,IAAIT,GAAoB,CACrD,MAAO,SACP,YAAa,GACb,QAAS,IAET,KAAMS,EAEZ,CAAK,EAAG,KAAK,kBAAkB,eAAiB,KAAK,OAAO,aAAc,KAAK,aAAa,eAAiB,KAAK,OAAO,aAAc,KAAK,oBAAoB,eAAiB,KAAK,OAAO,YAC3L,CAGA,kBAAkB,EAAG,CACnB,GAAI,EAAE,SAAW,aAAatU,GAC5B,OACF,IAAI,EAAI,EAAE,cAAc,MAAK,EAAI,EAAIwU,GAAG,EAAE,UAAW,EAAE,EACvD,EAAE,OAAO,QAAS,GAAM,CACtB,EAAE,cAAgB,CACpB,CAAC,EAAG,EAAE,SAAW,EAAG,EAAE,SAAW,CAAC,EAAG,KAAK,kBAAmB,KAAK,mBAAmB,EAAG,EAAE,YAAc,GAAI,EAAE,QAAU,EAC1H,CAEA,qBAAqB,EAAG,CACxB,CAEA,eAAe,EAAG,CAChB,EAAE,QAAS,GAAM,CACf,IAAI,EAAoB,IAAI,IAC5B,EAAE,IAAI,QAAS15F,GAAM,CACnB,IAAIqD,EAAI,KAAK,OAAO,OAAO,KAAMxE,GAAMA,EAAE,KAAO,EAAE,GAAG,EAAE,SAAS,IAAImB,CAAC,EACrEqD,GAAK,MAAQA,EAAE,SAAW,MAAQA,EAAE,QAAQ,QAASxE,GAAM,CACzD,KAAK,OAAO,MAAM,SAASA,EAAE,CAAC,CAAC,YAAaqmF,GAAkB,EAAE,IAAIrmF,EAAE,CAAC,CAAC,EAAI,EAAE,IAAIA,EAAE,CAAC,CAAC,GAAG,KAAKA,EAAE,CAAC,CAAC,EAAI,EAAE,IAAIA,EAAE,CAAC,EAAG,CAACA,EAAE,CAAC,CAAC,CAAC,GAAK,QAAQ,IAAI,KAAK,OAAO,MAAM,SAASA,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,EAAG,KAAK,kBAAkB,KAAK,OAAO,MAAM,SAASA,EAAE,CAAC,CAAC,CAAC,EAAG,KAAK,OAAO,MAAM,SAASA,EAAE,CAAC,CAAC,EAAE,SAAS,OAAOA,EAAE,CAAC,CAAC,EAAE,cAAgB,EACnU,CAAC,CACH,CAAC,EAAGiiG,GAAG,EAAG,KAAK,MAAM,EACrB,IAAI,EAAI,KAAK,OAAO,aAAa,gBAAgB,KAAM9gG,GAAMA,EAAE,KAAO,EAAE,GAAG,EAC3E,GAAK,KAAO,EAAE,IAAI,KAAK,GAAG,EAAE,GAAG,EAAI,KAAK,OAAO,aAAa,gBAAgB,KAAK,CAAC,CACpF,CAAC,CACH,CAEA,iBAAiB,EAAG,CAClB,EAAE,QAAS,GAAM,CACf,IAAI,EAAoB,IAAI,IAC5B,EAAE,IAAI,QAAS,GAAM,CACnB,IAAIA,EAAI,KAAK,OAAO,OAAO,KAAMqD,GAAMA,EAAE,KAAO,EAAE,GAAG,EAAE,SAAS,IAAI,CAAC,EACrErD,GAAK,MAAQA,EAAE,SAAW,MAAQA,EAAE,QAAQ,QAASqD,GAAM,CACzD,KAAK,OAAO,MAAM,SAASA,EAAE,CAAC,CAAC,YAAa6hF,GAAkB,EAAE,IAAI7hF,EAAE,CAAC,CAAC,EAAI,EAAE,IAAIA,EAAE,CAAC,CAAC,GAAG,KAAKA,EAAE,CAAC,CAAC,EAAI,EAAE,IAAIA,EAAE,CAAC,EAAG,CAACA,EAAE,CAAC,CAAC,CAAC,EAAI,KAAK,OAAO,MAAM,SAASA,EAAE,CAAC,CAAC,EAAE,SAAS,OAAOA,EAAE,CAAC,CAAC,EAAE,cAAgB,CACrM,CAAC,CACH,CAAC,EAAGkmC,GAAG,EAAG,KAAK,OAAQ,gBAAgB,CACzC,CAAC,CACH,CAEA,qBAAqB,EAAI,GAAI,CAC3B,KAAK,OAAO,aAAa,gBAAgB,QAAS,GAAM,CACtD,KAAK,iBAAiB,CAAC,CAAC,CAAC,CAC3B,CAAC,EAAG,IAAM,KAAK,OAAO,aAAa,gBAAkB,GACvD,CAIA,UAAU,EAAG,CACX,EAAE,QAAS,GAAM,CACf,IAAI,EAAoB,IAAI,IAC5B,EAAE,IAAI,QAASvpC,GAAM,CACnB,IAAIqD,EAAI,KAAK,OAAO,OAAO,KAAMxE,GAAMA,EAAE,KAAO,EAAE,GAAG,EAAE,SAAS,IAAImB,CAAC,EACrE,KAAK,OAAO,UAAU,cAAc,EAAE,IAAKA,CAAC,EAAGqD,GAAK,MAAQA,EAAE,SAAW,MAAQA,EAAE,QAAQ,QAASxE,GAAM,CACxG,MAAM,EAAI,KAAK,OAAO,MAAM,SAASA,EAAE,CAAC,CAAC,EACzC,aAAaqmF,GAAkB,EAAE,IAAIrmF,EAAE,CAAC,CAAC,EAAI,EAAE,IAAIA,EAAE,CAAC,CAAC,GAAG,KAAKA,EAAE,CAAC,CAAC,EAAI,EAAE,IAAIA,EAAE,CAAC,EAAG,CAACA,EAAE,CAAC,CAAC,CAAC,GAAK,KAAK,kBAAkB,KAAK,OAAO,MAAM,SAASA,EAAE,CAAC,CAAC,CAAC,EAAG,EAAE,SAAS,OAAOA,EAAE,CAAC,CAAC,EAAE,cAAgB,GAAI,EAAE,SAAS,OAAOA,EAAE,CAAC,CAAC,EAAE,QAAU,GACxO,CAAC,CACH,CAAC,EAAG,EAAE,KAAO,GAAKkiG,GAAG,EAAG,KAAK,MAAM,EACnC,IAAI,EAAI,KAAK,OAAO,aAAa,WAAW,KAAM/gG,GAAMA,EAAE,KAAO,EAAE,GAAG,EACtE,GAAK,KAAO,EAAE,IAAI,KAAK,GAAG,EAAE,GAAG,EAAI,KAAK,OAAO,aAAa,WAAW,KAAK,CAC1E,IAAK,EAAE,IACP,IAAK,EAAE,GACf,CAAO,EAAG,KAAK,OAAO,aAAa,gBAAkB,CAAA,CACjD,CAAC,CACH,CAEA,UAAU,EAAG,CACX,EAAE,QAAS,GAAM,CACf,IAAI,EAAoB,IAAI,IAC5B,EAAE,IAAI,QAASA,GAAM,CACnB,IAAIqD,EAAI,KAAK,OAAO,OAAO,KAAMxE,GAAMA,EAAE,KAAO,EAAE,GAAG,EAAE,SAAS,IAAImB,CAAC,EACrE,KAAK,OAAO,UAAU,cAAc,EAAE,IAAKA,CAAC,EAAGqD,GAAK,MAAQA,EAAE,SAAW,MAAQA,EAAE,QAAQ,QAASxE,GAAM,CACxG,MAAM,EAAI,KAAK,OAAO,MAAM,SAASA,EAAE,CAAC,CAAC,EACzC,aAAaqmF,GAAkB,EAAE,IAAIrmF,EAAE,CAAC,CAAC,EAAI,EAAE,IAAIA,EAAE,CAAC,CAAC,GAAG,KAAKA,EAAE,CAAC,CAAC,EAAI,EAAE,IAAIA,EAAE,CAAC,EAAG,CAACA,EAAE,CAAC,CAAC,CAAC,GAAK,EAAE,SAAS,OAAOA,EAAE,CAAC,CAAC,EAAE,cAAgB,EAAG,EAAE,SAAS,OAAOA,EAAE,CAAC,CAAC,EAAE,QAAU,GAC7K,CAAC,CACH,CAAC,EAAG,EAAE,KAAO,GAAKmiG,GAAG,EAAG,KAAK,MAAM,EACnC,IAAI,EAAI,KAAK,OAAO,aAAa,WAAW,KAAMhhG,GAAMA,EAAE,KAAO,EAAE,GAAG,EACtE,IAAM,EAAE,IAAI,QAASA,GAAM,CACzB,MAAMqD,EAAI,EAAE,IAAI,QAAQrD,CAAC,EACzBqD,IAAM,IAAM,EAAE,IAAI,OAAOA,EAAG,CAAC,CAC/B,CAAC,EAAG,EAAE,IAAI,SAAW,IAAM,KAAK,OAAO,aAAa,WAAa,KAAK,OAAO,aAAa,WAAW,OAAQrD,GAAMA,IAAM,CAAC,GAC5H,CAAC,CACH,CAEA,aAAa,EAAG,CACd,IAAI,EAAI,CAAA,EACR,KAAK,OAAO,OAAO,QAAS,GAAM,CAChC,IAAI,EAAI,CAAE,IAAK,EAAE,IAAK,IAAK,EAAE,EAAIA,EAAI,EAAE,KAAMqD,GAAMA,EAAE,KAAO,EAAE,GAAG,EACjE,QAASA,KAAK,EAAE,SACdrD,GAAK,KAAO,EAAE,IAAI,KAAKqD,EAAE,CAAC,CAAC,EAAIrD,EAAE,IAAI,SAASqD,EAAE,CAAC,CAAC,GAAK,EAAE,IAAI,KAAKA,EAAE,CAAC,CAAC,EACxE,EAAE,KAAK,CAAC,CACV,CAAC,EAAG,KAAK,qBAAoB,EAAI,KAAK,UAAU,CAAC,CACnD,CAEA,sBAAsB,EAAG,CACvB,IAAI,EAAI,CAAA,EACR,KAAK,OAAO,OAAO,QAAS,GAAM,CAChC,IAAI,EAAI,CAAE,IAAK,EAAE,IAAK,IAAK,EAAE,EAAIrD,EAAI,EAAE,KAAMqD,GAAMA,EAAE,KAAO,EAAE,GAAG,EACjE,QAASA,KAAK,EAAE,SACdrD,GAAK,KAAO,EAAE,IAAI,KAAKqD,EAAE,CAAC,CAAC,EAAIrD,EAAE,IAAI,SAASqD,EAAE,CAAC,CAAC,GAAK,EAAE,IAAI,KAAKA,EAAE,CAAC,CAAC,EACxE,EAAE,KAAK,CAAC,CACV,CAAC,EAAG,KAAK,iBAAiB,CAAC,CAC7B,CAIA,cAAc,EAAG,EAAG,CAClB,EAAE,SAAS,MAAM,IAAI,CAAC,CACxB,CAEA,kBAAkB,EAAG,CACnB,KAAK,OAAO,MAAM,SAAS,QAAS,GAAM,CACxC,EAAE,MACJ,CAAC,CACH,CAEA,uBAAwB,CACtB,KAAK,OAAO,MAAM,SAAS,QAAS,GAAM,CACxC,EAAE,MACJ,CAAC,CACH,CAIA,iBAAiB,EAAG,CAClB,KAAK,qBAAoB,EAAI,EAAE,QAAS,GAAM,CAC5C,IAAI,EAAoB,IAAI,IAC5B,EAAE,IAAI,QAASrD,GAAM,CACnB,IAAIqD,EAAI,KAAK,OAAO,OAAO,KAAMxE,GAAMA,EAAE,KAAO,EAAE,GAAG,EAAE,SAAS,IAAImB,CAAC,EACrEqD,GAAK,MAAQA,EAAE,SAAW,MAAQA,EAAE,QAAQ,QAASxE,GAAM,CACzD,MAAM,EAAI,KAAK,OAAO,MAAM,SAASA,EAAE,CAAC,CAAC,EACzC,aAAaqmF,GAAkB,EAAE,IAAIrmF,EAAE,CAAC,CAAC,EAAI,EAAE,IAAIA,EAAE,CAAC,CAAC,GAAG,KAAKA,EAAE,CAAC,CAAC,EAAI,EAAE,IAAIA,EAAE,CAAC,EAAG,CAACA,EAAE,CAAC,CAAC,CAAC,GAAK,KAAK,kBAAkB,KAAK,OAAO,MAAM,SAASA,EAAE,CAAC,CAAC,CAAC,EAAG,EAAE,SAAS,OAAOA,EAAE,CAAC,CAAC,EAAE,cAAgB,EAClM,CAAC,CACH,CAAC,EAAGoiG,GAAG,EAAG,KAAK,MAAM,EACrB,IAAI,EAAI,KAAK,OAAO,aAAa,kBAAkB,KAAMjhG,GAAMA,EAAE,KAAO,EAAE,GAAG,EAC7E,GAAK,KAAO,EAAE,IAAI,KAAK,GAAG,EAAE,GAAG,EAAI,KAAK,OAAO,aAAa,kBAAkB,KAAK,CACjF,IAAK,EAAE,IACP,IAAK,EAAE,GACf,CAAO,CACH,CAAC,EAAG,KAAK,OAAO,aAAa,gBAAkB,CAAA,CACjD,CAEA,oBAAqB,CACnB,KAAK,OAAO,aAAa,kBAAkB,QAASlZ,GAAM,CACxD,IAAI6V,EAAoB,IAAI,IAC5B7V,EAAE,IAAI,QAAS0T,GAAM,CACnB,IAAIwF,EAAI,KAAK,OAAO,OAAO,KAAM,GAAM,EAAE,KAAOlZ,EAAE,GAAG,EAAE,SAAS,IAAI0T,CAAC,EACrEwF,GAAK,MAAQA,EAAE,SAAW,MAAQA,EAAE,QAAQ,QAAS,GAAM,CACzD,MAAM,EAAI,KAAK,OAAO,MAAM,SAAS,EAAE,CAAC,CAAC,EACzC,aAAaklF,GAAkBvoF,EAAE,IAAI,EAAE,CAAC,CAAC,EAAIA,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,EAAIA,EAAE,IAAI,EAAE,CAAC,EAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAK,KAAK,kBAAkB,KAAK,OAAO,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC,EAAG,EAAE,SAAS,OAAO,EAAE,CAAC,CAAC,EAAE,cAAgB,EAClM,CAAC,CACH,CAAC,EAAGA,EAAE,KAAO,GAAKqkG,GAAGrkG,EAAG,KAAK,MAAM,EAAG4sC,GAAG5sC,EAAG,KAAK,OAAQ,kBAAkB,CAC7E,CAAC,EAAG,KAAK,OAAO,aAAa,kBAAoB,CAAA,CACnD,CAGA,eAAgB,CACd,KAAK,OAAO,aAAa,YAAc,KAAK,OAAO,aAAa,WAAW,OAAS,GAAK,KAAK,UAAU,KAAK,OAAO,aAAa,UAAU,EAAG,KAAK,OAAO,aAAa,WAAa,GAAI,KAAK,qBAAoB,CACnN,CAGA,8BAA8B,EAAG,CAC/B,GAAI,EAAE,QAAU,EACd,OACF,IAAI,EAAI,EAAE,CAAC,EAAG,EAAI,KAAK,OAAO,iBAAiB,eAAe,EAAE,IAAK,EAAE,IAAI,CAAC,CAAC,EAC7E,KAAK,OAAO,iBAAiB,uBAAuB,EAAE,UAAW,EAAE,SAAW,GAAM,CAClF,KAAK,OAAO,gBAAgB,eAAe,CAAC,CAC9C,CAAC,CACH,CAEA,0BAA0B,EAAG,CAC3B,GAAI,EAAE,QAAU,EACd,OACF,IAAI,EAAI,EAAE,CAAC,EAAG,EAAI,KAAK,OAAO,iBAAiB,eAAe,EAAE,IAAK,EAAE,IAAI,CAAC,CAAC,EAC7E,KAAK,OAAO,iBAAiB,mBAAmB,EAAE,UAAY,GAAM,CAClE,KAAK,OAAO,gBAAgB,eAAe,CAAC,CAC9C,CAAC,CACH,CAEA,yBAAyB,EAAG,CAC1B,GAAI,EAAE,QAAU,EACd,OACF,IAAI,EAAI,EAAE,CAAC,EAAG,EAAI,KAAK,OAAO,iBAAiB,eAAe,EAAE,IAAK,EAAE,IAAI,CAAC,CAAC,EAC7E,KAAK,OAAO,iBAAiB,kBAAkB,EAAE,SAAW,GAAM,CAChE,KAAK,OAAO,gBAAgB,eAAe,CAAC,CAC9C,CAAC,CACH,CAEF,CACA,SAASmkG,GAAGj1D,EAAG,EAAG,CAChBA,EAAE,QAAQ,CAAC,EAAG,IAAM,CAClB,MAAM,EAAI,EAAE,MAAM,SAAS,CAAC,EAC5B,GAAI,EAAE,aAAaq5C,IACjB,OACF,MAAMllF,EAAI,EAAE,SAAUqD,EAAI,IAAI01F,GAAoB,CAChD,MAAO,MAEP,UAAW,GAEX,WAAY,GAEZ,YAAa,GAEb,QAAS,GAET,KAAMS,EAEZ,CAAK,EAAG36F,EAAI,IAAIqmF,GAAgBllF,EAAGqD,EAAG,EAAE,MAAM,EAC1CxE,EAAE,KAAO,iBAAkBA,EAAE,IAAM,EACnC,MAAM,EAAoB,IAAI,IAAOyJ,EAAI,IAAI8wF,GAAar6F,EAAI,IAAIq6F,GAClEr6F,EAAE,UAAU,EAAG,EAAG,CAAC,EAAG,EAAE,QAAQ,CAAC,EAAGnC,IAAM,CACxC,EAAE,YAAY,EAAG0L,CAAC,EAAG,EAAE,IAAI,EAAGA,EAAE,MAAK,CAAE,EAAG,EAAE,YAAY,EAAGvJ,CAAC,EAAGF,EAAE,YAAYjC,EAAG0L,CAAC,CACnF,CAAC,EAAG,EAAE,eAAe,YAAc,GAAIzJ,EAAE,eAAe,YAAc,GAAI,EAAE,MAAM,IAAIA,CAAC,CACzF,CAAC,CACH,CACA,SAAS0qC,GAAGsC,EAAG,EAAG,EAAG,CACnBA,EAAE,QAAQ,CAAC,EAAG,IAAM,CAClB,MAAM7rC,EAAI,EAAE,MAAM,SAAS,CAAC,EACtBA,aAAaklF,KAEnB,EAAE,QAAS,GAAM,CACf,MAAMt+F,EAAIoZ,EAAE,aAAa,CAAC,EAC1BpZ,GAAKoZ,EAAE,YAAY,EAAGpZ,CAAC,CACzB,CAAC,EAAGoZ,EAAE,eAAe,YAAc,GAAI,EAAE,MAAM,SAAS,OAAQ,GAAM,EAAE,KAAO,GAAK,EAAE,MAAQ,CAAC,EAAE,QAAS,GAAM,CAC9G,EAAE,MAAM,OAAO,CAAC,CAClB,CAAC,EACH,CAAC,CACH,CACA,SAASihG,GAAGp1D,EAAG,EAAG,CAChBA,EAAE,QAAQ,CAAC,EAAG,IAAM,CAClB,MAAM,EAAI,EAAE,MAAM,SAAS,CAAC,EAC5B,GAAI,EAAE,aAAaq5C,IACjB,OACF,MAAMllF,EAAI,EAAE,SAAUqD,EAAI,IAAI01F,GAAoB,CAChD,MAAO,SAEP,YAAa,GAEb,QAAS,IAET,KAAMS,EAEZ,CAAK,EAAG36F,EAAI,IAAIqmF,GAAgBllF,EAAGqD,EAAG,EAAE,MAAM,EAC1CxE,EAAE,KAAO,mBAAoBA,EAAE,IAAM,EACrC,MAAM,EAAoB,IAAI,IAAOyJ,EAAI,IAAI8wF,GAAar6F,EAAI,IAAIq6F,GAClEr6F,EAAE,UAAU,EAAG,EAAG,CAAC,EAAG,EAAE,QAAQ,CAAC,EAAGnC,IAAM,CACxC,EAAE,YAAY,EAAG0L,CAAC,EAAG,EAAE,IAAI,EAAGA,EAAE,MAAK,CAAE,EAAG,EAAE,YAAY,EAAGvJ,CAAC,EAAGF,EAAE,YAAYjC,EAAG0L,CAAC,CACnF,CAAC,EAAG,EAAE,eAAe,YAAc,GAAIzJ,EAAE,eAAe,YAAc,GAAI,EAAE,MAAM,IAAIA,CAAC,CACzF,CAAC,CACH,CACA,SAASkiG,GAAGl1D,EAAG,EAAG,CAChB,EAAE,MAAM,SAAS,OAAQ,GAAM,EAAE,MAAQ,gBAAgB,EAAE,QAAS,GAAM,CACxE,EAAE,MAAM,OAAO,CAAC,CAClB,CAAC,EAAGA,EAAE,QAAQ,CAAC,EAAG,IAAM,CACtB,MAAM,EAAI,EAAE,MAAM,SAAS,CAAC,EAC5B,GAAI,EAAE,aAAaq5C,IACjB,OACF,MAAMllF,EAAoB,IAAI,IAAOqD,EAAI,IAAI+1F,GAAav6F,EAAI,IAAIu6F,GAClEv6F,EAAE,UAAU,EAAG,EAAG,CAAC,EAAG,EAAE,QAAQ,CAAC,EAAGyJ,IAAM,CACxC,EAAE,YAAY,EAAGjF,CAAC,EAAGrD,EAAE,IAAI,EAAGqD,EAAE,MAAK,CAAE,EAAG,EAAE,YAAY,EAAGxE,CAAC,CAC9D,CAAC,EAAG,EAAE,eAAe,YAAc,EACrC,CAAC,CACH,CACA,SAASmiG,GAAGn1D,EAAG,EAAG,CAChBA,EAAE,QAAQ,CAAC,EAAG,IAAM,CAClB,MAAM,EAAI,EAAE,MAAM,SAAS,CAAC,EAC5B,aAAaq5C,KAAoB,EAAE,QAASllF,GAAM,CAChD,MAAMqD,EAAI,EAAE,QAAQrD,CAAC,EACrBqD,GAAK,EAAE,YAAYrD,EAAGqD,CAAC,CACzB,CAAC,EAAG,EAAE,eAAe,YAAc,GACrC,CAAC,CACH,CACA,MAAM69F,EAAG,CAOP,YAAY,EAAG,EAAG,EAAG,CACnB,KAAK,OAAS,EAAG,KAAK,SAAW,EAAG,KAAK,MAAQ,EAAG,KAAK,UAAY,IAAIrc,EAC3E,CACA,UAQA,wBAAwB,EAAG,CACzB,MAAM,EAAI,EAAE,MAAK,EACjB,OAAO,EAAE,QAAQ,KAAK,MAAM,EAAG,IAAIG,GAAU,EAAE,EAAG,EAAE,CAAC,CACvD,CAQA,cAAc,EAAG,CACf,MAAM,EAAI,KAAK,wBAAwB,CAAC,EAAG,EAAI,KAAK,SAAS,WAAW,MAAO,EAAI,KAAK,SAAS,WAAW,OAAQhlF,GAAK,EAAE,EAAI,GAAK,EAAI,EAAGqD,GAAK,EAAI,EAAE,GAAK,EAAI,EAC/J,OAAO,IAAI2hF,GAAUhlF,EAAGqD,CAAC,CAC3B,CAOA,mBAAmB,EAAG,EAAG,CACvB,MAAM,EAAI,KAAK,SAAS,WAAW,YAAa,EAAI,KAAK,SAAS,WAAW,aAAcrD,EAAI,EAAI,EAAI,EAAI,EAAGqD,EAAI,EAAE,EAAI,EAAI,EAAI,GAChI,OAAO,IAAI2hF,GAAUhlF,EAAGqD,CAAC,CAC3B,CASA,cAAc,EAAG,EAAG,EAAG,CACrB,GAAI,CAAC,KAAK,OAAS,CAAC,EAClB,OAAO,QAAQ,KAAK,qDAAqD,EAAG,KAC9E,MAAM,EAAI,KAAK,mBAAmB,EAAG,CAAC,EACtC,KAAK,UAAU,cAAc,EAAG,KAAK,MAAM,EAC3C,MAAMrD,EAAI,GAAK,KAAK,MAAM,SAAUqD,EAAI,KAAK,UAAU,iBAAiBrD,EAAG,EAAE,EAC7E,OAAOqD,EAAE,OAAS,EAAIA,EAAE,CAAC,EAAE,MAAQ,IACrC,CAQA,uBAAuB,EAAG,EAAG,EAAI,EAAG,CAClC,MAAM,EAAI,KAAK,mBAAmB,EAAG,CAAC,EACtC,KAAK,UAAU,cAAc,EAAG,KAAK,MAAM,EAC3C,MAAMrD,EAAI,IAAI4kF,EACd,OAAO,KAAK,UAAU,IAAI,GAAG,EAAG5kF,CAAC,EAAGA,CACtC,CAKA,aAAa,EAAG,CACd,KAAK,OAAS,CAChB,CAKA,eAAe,EAAG,CAChB,KAAK,SAAW,CAClB,CAKA,YAAY,EAAG,CACb,KAAK,MAAQ,CACf,CACF,CACA,MAAMmhG,EAAG,CACP,OACA,YAAc,GAEd,aAAe,GAEf,SAAW,KACX,SAAW,KACX,eAAiB,KACjB,WAAa,KACb,SAAW,KACX,YAAY,EAAG,CACb,KAAK,OAAS,CAChB,CAIA,MAAO,CACL,KAAK,oBAAmB,EAAI,KAAK,WAAW,UAAU,CACxD,CAKA,YAAY,EAAG,CACb,KAAK,aAAe,GAAI,KAAK,YAAc,EAAG,KAAK,UAAU,CAAC,CAChE,CAKA,WAAW,EAAG,CACZ,KAAK,eAAiB,KAAK,YAAc,EAAG,KAAK,UAAU,CAAC,EAC9D,CAIA,gBAAiB,CACf,KAAK,aAAe,EACtB,CAIA,IAAI,UAAW,CACb,OAAO,KAAK,YACd,CAKA,QAAQ,EAAG,CACT,KAAK,aAAe,GAAI,KAAK,YAAc,EAAG,KAAK,UAAU,CAAC,CAChE,CAIA,gBAAiB,CACf,OAAO,KAAK,WACd,CAIA,qBAAsB,CACpB,KAAK,OAAO,gBAAgB,WAAa,KAAK,OAAO,eAAe,WAAa,KAAK,SAAW,KAAK,OAAO,eAAe,UAAW,KAAK,OAAO,eAAe,WAAa,KAAK,SAAW,KAAK,OAAO,eAAe,UAAW,KAAK,OAAO,eAAe,iBAAmB,KAAK,eAAiB,KAAK,OAAO,eAAe,gBAAiB,KAAK,OAAO,eAAe,aAAe,KAAK,WAAa,KAAK,OAAO,eAAe,YAAa,KAAK,OAAO,eAAe,WAAa,KAAK,SAAW,KAAK,OAAO,eAAe,UAC9gB,CAEA,UAAU,EAAG,CACX,OAAQ,EAAC,CACP,IAAK,SACH,KAAK,WAAW,EAAE,EAAG,KAAK,QAAQ,EAAE,EAAG,KAAK,QAAQ,EAAE,EAAG,KAAK,cAAc,EAAE,EAAG,KAAK,cAAc,EAAE,EAAG,KAAK,QAAQ,EAAE,EACxH,MACF,IAAK,UACH,KAAK,WAAW,EAAE,EAAG,KAAK,QAAQ,EAAE,EAAG,KAAK,QAAQ,EAAE,EAAG,KAAK,cAAc,EAAE,EAAG,KAAK,cAAc,EAAE,EAAG,KAAK,QAAQ,EAAE,EACxH,MACF,IAAK,WACH,KAAK,WAAW,EAAE,EAAG,KAAK,QAAQ,EAAE,EAAG,KAAK,QAAQ,EAAE,EAAG,KAAK,cAAc,EAAE,EAAG,KAAK,cAAc,EAAE,EAAG,KAAK,QAAQ,EAAE,EACxH,MACF,QACE,QAAQ,KAAK,qCAAqC,CAAC,EAAE,CAC7D,CACI,KAAK,OAAO,uBAAoB,CAClC,CAIA,WAAW,EAAG,CACZ,KAAK,OAAO,WAAa,KAAK,OAAO,SAAS,UAAU,QAAU,GAClE,MAAM,EAAI,KAAK,OAAO,OAAO,SAAS,KACnC,GAAM,aAAaV,EAC1B,EACI,IAAM,EAAE,WAAa,GAAI,KAAK,OAAO,OAAO,SAAU,GAAM,CAC1D,EAAE,WAAa,EAAE,aAAe,SAAW,EAAE,WAAa,GAAI,EAAE,gBAAkB,SAAW,EAAE,cAAgB,GACjH,CAAC,CACH,CAIA,QAAQ,EAAG,CACT,KAAK,OAAO,gBAAgB,UAAY,KAAK,WAAa,KAAK,SAAS,QAAU,EACpF,CAIA,QAAQ,EAAG,CACT,KAAK,OAAO,gBAAgB,UAAY,KAAK,WAAa,KAAK,SAAS,QAAU,EACpF,CAIA,cAAc,EAAG,CACf,KAAK,iBAAmB,KAAK,eAAe,QAAU,EACxD,CAIA,cAAc,EAAG,CACf,KAAK,aAAe,KAAK,WAAW,QAAU,EAChD,CAIA,QAAQ,EAAG,CACT,KAAK,WAAa,KAAK,SAAS,QAAU,EAC5C,CAKA,oBAAqB,CACnB,KAAK,QAAQ,QAAQ,CACvB,CAIA,iBAAkB,CAChB,KAAK,QAAQ,SAAS,CACxB,CAIA,gBAAiB,CACf,KAAK,QAAQ,UAAU,CACzB,CAIA,qBAAsB,CACpB,KAAK,QAAQ,eAAe,CAC9B,CAKA,iBAAiB,EAAG,CAClB,MAAM,EAAI,KAAK,OAAO,OAAO,SAAS,KACnCzgG,GAAMA,aAAaygG,EAC1B,EAAOjmG,EAAI,CACL,IAAK,KACL,OAAQ,KACR,KAAM,IACZ,EAAM,CAAC,EACH,GAAG,QAAUA,IAAM,EAAE,OAAO,QAAQ,MAAQA,EAAG,EAAE,OAAO,QAAQ,OAASA,EAAG,EAAE,OAAO,KAAK,QAAO,EAAI,EAAE,OAAO,IAAM,KACtH,CAKA,mBAAmB,EAAG,CACpB,KAAK,iBAAmB,KAAK,eAAe,SAAS,WAAW,MAAQ,EAC1E,CAKA,iBAAiB,EAAG,CAClB,KAAK,iBAAmB,KAAK,eAAe,SAAS,SAAS,MAAQ,EACxE,CAKA,iBAAiB,EAAG,CAClB,KAAK,WAAa,KAAK,SAAS,eAAiB,EACnD,CACF,CACA,MAAM4mG,EAAG,CACP,OACA,gBACA,cAAgB,CAAA,EAEhB,UAAY,OACZ,cAAgB,EAChB,OAAO,WAAa,IACpB,OAAO,YAAc,IACrB,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,KAAI,CAC5B,CACA,MAAO,CACL,KAAK,gBAAkB,IAAIrI,GAAoB,CAC7C,MAAO,SACP,YAAa,GACb,QAAS,EACT,SAAUsI,GACV,WAAY,EAClB,CAAK,EAAG,KAAK,gBAAgB,eAAiB,KAAK,OAAO,YACxD,CAOA,UAAU,EAAG,EAAI,SAAU,EAAI,IAAM,CACnC,KAAK,YAAc,WAAa,KAAK,oBAAmB,EACxD,MAAM,GAAK,MAAM,QAAQ,CAAC,EAAI,EAAI,EAAI,CAAC,CAAC,EAAI,CAAA,GAAI,OAAQrhG,GAAMA,GAAG,QAAQ,EACzE,GAAI,EAAE,SAAW,EAAG,CAClB,KAAK,eAAc,EACnB,MACF,CACA,KAAK,gBAAgB,MAAM,IAAI,CAAC,EAAG,KAAK,gBAAgB,QAAU,EAAG,KAAK,gBAAgB,SAAS,cAAgB,EACnH,UAAWA,KAAK,EAAG,CACjB,MAAMqD,EAAI,IAAIo2F,GAAOz5F,EAAE,SAAU,KAAK,eAAe,EACrDA,EAAE,kBAAkB,GAAI,EAAE,EAAGqD,EAAE,OAAO,KAAKrD,EAAE,WAAW,EAAGqD,EAAE,iBAAmB,GAAI,KAAK,OAAO,MAAM,IAAIA,CAAC,EAAG,KAAK,cAAc,KAAKA,CAAC,CACzI,CACA,KAAK,UAAY,SAAU,KAAK,cAAgB,YAAY,IAAG,CACjE,CAIA,gBAAiB,CACf,KAAK,cAAc,SAAW,GAAK,KAAK,YAAc,YAAc,KAAK,UAAY,UAAW,KAAK,cAAgB,YAAY,IAAG,EACtI,CAIA,QAAS,CACP,GAAI,KAAK,YAAc,QAAU,KAAK,cAAc,SAAW,EAAG,OAClE,MAAM,EAAI,YAAY,IAAG,EAAK,KAAK,cAAe,EAAI,KAAK,gBAAgB,SAAS,eAAiB,IACrG,GAAI,KAAK,YAAc,SAAU,CAC/B,MAAM,EAAI,KAAK,IAAI,EAAI+9F,GAAG,WAAY,CAAC,EACvC,KAAK,gBAAgB,QAAU,KAAK,YAAY,CAAC,EAAI,EAAG,GAAK,IAAM,KAAK,UAAY,OACtF,SAAW,KAAK,YAAc,UAAW,CACvC,MAAM,EAAI,KAAK,IAAI,EAAIA,GAAG,YAAa,CAAC,EACxC,KAAK,gBAAgB,SAAW,EAAI,KAAK,YAAY,CAAC,GAAK,EAAG,GAAK,IAAM,KAAK,oBAAmB,EAAI,KAAK,UAAY,OACxH,CACF,CAEA,qBAAsB,CACpB,UAAW,KAAK,KAAK,cACnB,KAAK,OAAO,MAAM,OAAO,CAAC,EAC5B,KAAK,cAAgB,CAAA,CACvB,CAEA,YAAY,EAAG,CACb,MAAO,IAAK,EAAI,IAAM,EAAI,EAC5B,CAEA,SAAU,CACR,KAAK,oBAAmB,EAAI,KAAK,gBAAgB,UAAW,KAAK,UAAY,MAC/E,CACF,CACA,IAAIE,GAAK,CAAE,QAAS,CAAA,CAAE,EAAIC,GAAKD,GAAG,QAASE,GAC3C,SAASC,IAAK,CACZ,OAAOD,KAAOA,GAAK,GAAI,SAAS31D,EAAG,EAAG,EACnC,SAAS,EAAG,EAAG,CACdA,EAAE,QAAU,EAAC,CACf,GAAG01D,GAAI,UAAW,CAChB,IAAI,EAAI,UAAW,CACjB,SAAS,EAAEz/F,EAAG,CACZ,OAAOuB,EAAE,YAAYvB,EAAE,GAAG,EAAGA,CAC/B,CACA,SAAS,EAAEA,EAAG,CACZ,QAAS3R,EAAI,EAAGA,EAAIkT,EAAE,SAAS,OAAQlT,IAAKkT,EAAE,SAASlT,CAAC,EAAE,MAAM,QAAUA,IAAM2R,EAAI,QAAU,OAC9F9B,EAAI8B,CACN,CACA,IAAI9B,EAAI,EAAGqD,EAAI,SAAS,cAAc,KAAK,EAC3CA,EAAE,MAAM,QAAU,uEAAwEA,EAAE,iBAAiB,QAAS,SAASvB,EAAG,CAChIA,EAAE,eAAc,EAAI,EAAE,EAAE9B,EAAIqD,EAAE,SAAS,MAAM,CAC/C,EAAG,EAAE,EACL,IAAIxE,GAAK,aAAe,MAAM,IAAG,EAAI,EAAIA,EAAGyJ,EAAI,EAAGvJ,EAAI,EAAE,IAAI,EAAE,MAAM,MAAO,OAAQ,MAAM,CAAC,EAAG,EAAI,EAAE,IAAI,EAAE,MAAM,KAAM,OAAQ,MAAM,CAAC,EACrI,GAAI,KAAK,aAAe,KAAK,YAAY,OAAQ,IAAInC,EAAI,EAAE,IAAI,EAAE,MAAM,KAAM,OAAQ,MAAM,CAAC,EAC5F,OAAO,EAAE,CAAC,EAAG,CAAE,SAAU,GAAI,IAAKyG,EAAG,SAAU,EAAG,UAAW,EAAG,MAAO,UAAW,CAChFxE,GAAK,aAAe,MAAM,IAAG,CAC/B,EAAG,IAAK,UAAW,CACjByJ,IACA,IAAIxG,GAAK,aAAe,MAAM,IAAG,EACjC,GAAI,EAAE,OAAOA,EAAIjD,EAAG,GAAG,EAAGiD,EAAI,EAAI,MAAQ/C,EAAE,OAAO,IAAMuJ,GAAKxG,EAAI,GAAI,GAAG,EAAG,EAAIA,EAAGwG,EAAI,EAAG1L,GAAI,CAC5F,IAAIzM,EAAI,YAAY,OACpByM,EAAE,OAAOzM,EAAE,eAAiB,QAASA,EAAE,gBAAkB,OAAO,CAClE,CACA,OAAO2R,CACT,EAAG,OAAQ,UAAW,CACpBjD,EAAI,KAAK,IAAG,CACd,EAAG,WAAYwE,EAAG,QAAS,CAAC,CAC9B,EACA,OAAO,EAAE,MAAQ,SAAS,EAAG,EAAGrD,EAAG,CACjC,IAAIqD,EAAI,IAAOxE,EAAI,EAAG,EAAI,KAAK,MAAOyJ,EAAI,EAAE,OAAO,kBAAoB,CAAC,EAAGvJ,EAAI,GAAKuJ,EAAG,EAAI,GAAKA,EAAG1L,EAAI,EAAI0L,EAAGxG,EAAI,EAAIwG,EAAGnY,EAAI,EAAImY,EAAGwT,EAAI,GAAKxT,EAAG9f,EAAI,GAAK8f,EAAGlL,EAAI,GAAKkL,EAAGxH,EAAI,SAAS,cAAc,QAAQ,EAC3MA,EAAE,MAAQ/B,EAAG+B,EAAE,OAAS,EAAGA,EAAE,MAAM,QAAU,yBAC7C,IAAIhE,EAAIgE,EAAE,WAAW,IAAI,EACzB,OAAOhE,EAAE,KAAO,QAAU,EAAIwL,EAAI,gCAAiCxL,EAAE,aAAe,MAAOA,EAAE,UAAYkD,EAAGlD,EAAE,SAAS,EAAG,EAAGiC,EAAG,CAAC,EAAGjC,EAAE,UAAY,EAAGA,EAAE,SAAS,EAAGF,EAAGkF,CAAC,EAAGhF,EAAE,SAAS3M,EAAG2rB,EAAGtzB,EAAG4U,CAAC,EAAGN,EAAE,UAAYkD,EAAGlD,EAAE,YAAc,GAAKA,EAAE,SAAS3M,EAAG2rB,EAAGtzB,EAAG4U,CAAC,EAAG,CAAE,IAAK0D,EAAG,OAAQ,SAASukF,EAAGvmF,EAAG,CAC/RuE,EAAI,KAAK,IAAIA,EAAGgiF,CAAC,EAAGxmF,EAAI,KAAK,IAAIA,EAAGwmF,CAAC,EAAGvoF,EAAE,UAAYkD,EAAGlD,EAAE,YAAc,EAAGA,EAAE,SAAS,EAAG,EAAGiC,EAAG+c,CAAC,EAAGhf,EAAE,UAAY,EAAGA,EAAE,SAAS,EAAEuoF,CAAC,EAAI,IAAM,EAAI,KAAO,EAAEhiF,CAAC,EAAI,IAAM,EAAExE,CAAC,EAAI,IAAKjC,EAAGkF,CAAC,EAAGhF,EAAE,UAAUgE,EAAG3Q,EAAImY,EAAGwT,EAAGtzB,EAAI8f,EAAGlL,EAAGjN,EAAG2rB,EAAGtzB,EAAI8f,EAAGlL,CAAC,EAAGN,EAAE,SAAS3M,EAAI3H,EAAI8f,EAAGwT,EAAGxT,EAAGlL,CAAC,EAAGN,EAAE,UAAYkD,EAAGlD,EAAE,YAAc,GAAKA,EAAE,SAAS3M,EAAI3H,EAAI8f,EAAGwT,EAAGxT,EAAG,GAAG,EAAI+8E,EAAIvmF,GAAK1B,CAAC,CAAC,CAClW,CAAC,CACH,EAAG,CACL,CAAC,CACH,GAAGkkG,EAAE,GAAIA,GAAG,OACd,CACA,IAAII,GAAKD,GAAE,EACX,MAAME,GAAqBpV,GAAGmV,EAAE,EAChC,IAAIE,GAAK,OAAO,OAAO,CACrB,OAAQ,OAAO,OAAO,CACpB,KAAM,SAAS/1D,EAAG,CAChB,OAAOA,CACT,EACA,GAAI,SAASA,EAAG,CACd,OAAOA,CACT,EACA,IAAK,SAASA,EAAG,CACf,OAAOA,CACT,EACA,MAAO,SAASA,EAAG,CACjB,OAAOA,CACT,CACJ,CAAG,EACD,UAAW,OAAO,OAAO,CACvB,GAAI,SAASA,EAAG,CACd,OAAOA,EAAIA,CACb,EACA,IAAK,SAASA,EAAG,CACf,OAAOA,GAAK,EAAIA,EAClB,EACA,MAAO,SAASA,EAAG,CACjB,OAAQA,GAAK,GAAK,EAAI,GAAMA,EAAIA,EAAI,KAAQ,EAAEA,GAAKA,EAAI,GAAK,EAC9D,CACJ,CAAG,EACD,MAAO,OAAO,OAAO,CACnB,GAAI,SAASA,EAAG,CACd,OAAOA,EAAIA,EAAIA,CACjB,EACA,IAAK,SAASA,EAAG,CACf,MAAO,EAAEA,EAAIA,EAAIA,EAAI,CACvB,EACA,MAAO,SAASA,EAAG,CACjB,OAAQA,GAAK,GAAK,EAAI,GAAMA,EAAIA,EAAIA,EAAI,KAAQA,GAAK,GAAKA,EAAIA,EAAI,EACpE,CACJ,CAAG,EACD,QAAS,OAAO,OAAO,CACrB,GAAI,SAASA,EAAG,CACd,OAAOA,EAAIA,EAAIA,EAAIA,CACrB,EACA,IAAK,SAASA,EAAG,CACf,MAAO,IAAI,EAAEA,EAAIA,EAAIA,EAAIA,CAC3B,EACA,MAAO,SAASA,EAAG,CACjB,OAAQA,GAAK,GAAK,EAAI,GAAMA,EAAIA,EAAIA,EAAIA,EAAI,MAASA,GAAK,GAAKA,EAAIA,EAAIA,EAAI,EAC7E,CACJ,CAAG,EACD,QAAS,OAAO,OAAO,CACrB,GAAI,SAASA,EAAG,CACd,OAAOA,EAAIA,EAAIA,EAAIA,EAAIA,CACzB,EACA,IAAK,SAASA,EAAG,CACf,MAAO,EAAEA,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,CAC/B,EACA,MAAO,SAASA,EAAG,CACjB,OAAQA,GAAK,GAAK,EAAI,GAAMA,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,KAAQA,GAAK,GAAKA,EAAIA,EAAIA,EAAIA,EAAI,EACpF,CACJ,CAAG,EACD,WAAY,OAAO,OAAO,CACxB,GAAI,SAASA,EAAG,CACd,MAAO,GAAI,KAAK,KAAK,EAAIA,GAAK,KAAK,GAAK,CAAC,CAC3C,EACA,IAAK,SAASA,EAAG,CACf,OAAO,KAAK,IAAIA,EAAI,KAAK,GAAK,CAAC,CACjC,EACA,MAAO,SAASA,EAAG,CACjB,MAAO,KAAO,EAAI,KAAK,IAAI,KAAK,IAAM,GAAMA,EAAE,EAChD,CACJ,CAAG,EACD,YAAa,OAAO,OAAO,CACzB,GAAI,SAASA,EAAG,CACd,OAAOA,IAAM,EAAI,EAAI,KAAK,IAAI,KAAMA,EAAI,CAAC,CAC3C,EACA,IAAK,SAASA,EAAG,CACf,OAAOA,IAAM,EAAI,EAAI,EAAI,KAAK,IAAI,EAAG,IAAMA,CAAC,CAC9C,EACA,MAAO,SAASA,EAAG,CACjB,OAAOA,IAAM,EAAI,EAAIA,IAAM,EAAI,GAAKA,GAAK,GAAK,EAAI,GAAM,KAAK,IAAI,KAAMA,EAAI,CAAC,EAAI,IAAO,CAAC,KAAK,IAAI,EAAG,KAAOA,EAAI,EAAE,EAAI,EACvH,CACJ,CAAG,EACD,SAAU,OAAO,OAAO,CACtB,GAAI,SAASA,EAAG,CACd,MAAO,GAAI,KAAK,KAAK,EAAIA,EAAIA,CAAC,CAChC,EACA,IAAK,SAASA,EAAG,CACf,OAAO,KAAK,KAAK,GAAI,EAAEA,EAAIA,CAAC,CAC9B,EACA,MAAO,SAASA,EAAG,CACjB,OAAQA,GAAK,GAAK,EAAI,KAAQ,KAAK,KAAK,EAAIA,EAAIA,CAAC,EAAI,GAAK,IAAO,KAAK,KAAK,GAAKA,GAAK,GAAKA,CAAC,EAAI,EACjG,CACJ,CAAG,EACD,QAAS,OAAO,OAAO,CACrB,GAAI,SAASA,EAAG,CACd,OAAOA,IAAM,EAAI,EAAIA,IAAM,EAAI,EAAI,CAAC,KAAK,IAAI,EAAG,IAAMA,EAAI,EAAE,EAAI,KAAK,KAAKA,EAAI,KAAO,EAAI,KAAK,EAAE,CAClG,EACA,IAAK,SAASA,EAAG,CACf,OAAOA,IAAM,EAAI,EAAIA,IAAM,EAAI,EAAI,KAAK,IAAI,EAAG,IAAMA,CAAC,EAAI,KAAK,KAAKA,EAAI,IAAO,EAAI,KAAK,EAAE,EAAI,CAChG,EACA,MAAO,SAASA,EAAG,CACjB,OAAOA,IAAM,EAAI,EAAIA,IAAM,EAAI,GAAKA,GAAK,EAAGA,EAAI,EAAI,IAAO,KAAK,IAAI,EAAG,IAAMA,EAAI,EAAE,EAAI,KAAK,KAAKA,EAAI,KAAO,EAAI,KAAK,EAAE,EAAI,GAAM,KAAK,IAAI,EAAG,KAAOA,EAAI,EAAE,EAAI,KAAK,KAAKA,EAAI,KAAO,EAAI,KAAK,EAAE,EAAI,EACpM,CACJ,CAAG,EACD,KAAM,OAAO,OAAO,CAClB,GAAI,SAASA,EAAG,CACd,IAAI,EAAI,QACR,OAAOA,IAAM,EAAI,EAAIA,EAAIA,IAAM,EAAI,GAAKA,EAAI,EAC9C,EACA,IAAK,SAASA,EAAG,CACf,IAAI,EAAI,QACR,OAAOA,IAAM,EAAI,EAAI,EAAEA,EAAIA,IAAM,EAAI,GAAKA,EAAI,GAAK,CACrD,EACA,MAAO,SAASA,EAAG,CACjB,IAAI,EAAI,UACR,OAAQA,GAAK,GAAK,EAAI,IAAOA,EAAIA,IAAM,EAAI,GAAKA,EAAI,IAAM,KAAQA,GAAK,GAAKA,IAAM,EAAI,GAAKA,EAAI,GAAK,EACtG,CACJ,CAAG,EACD,OAAQ,OAAO,OAAO,CACpB,GAAI,SAASA,EAAG,CACd,MAAO,GAAI+1D,GAAG,OAAO,IAAI,EAAI/1D,CAAC,CAChC,EACA,IAAK,SAASA,EAAG,CACf,OAAOA,EAAI,EAAI,KAAO,OAASA,EAAIA,EAAIA,EAAI,EAAI,KAAO,QAAUA,GAAK,IAAM,MAAQA,EAAI,IAAOA,EAAI,IAAM,KAAO,QAAUA,GAAK,KAAO,MAAQA,EAAI,MAAS,QAAUA,GAAK,MAAQ,MAAQA,EAAI,OAC/L,EACA,MAAO,SAASA,EAAG,CACjB,OAAOA,EAAI,GAAM+1D,GAAG,OAAO,GAAG/1D,EAAI,CAAC,EAAI,GAAM+1D,GAAG,OAAO,IAAI/1D,EAAI,EAAI,CAAC,EAAI,GAAM,EAChF,CACJ,CAAG,EACD,YAAa,SAASA,EAAG,CACvB,OAAOA,IAAM,SAAWA,EAAI,GAAIA,EAAIA,EAAI,OAAO,QAAU,OAAO,QAAUA,EAAGA,EAAIA,EAAI,IAAM,IAAMA,EAAG,CAClG,GAAI,SAAS,EAAG,CACd,OAAO,KAAK,IAAI,EAAGA,CAAC,CACtB,EACA,IAAK,SAAS,EAAG,CACf,MAAO,GAAI,KAAK,IAAI,EAAI,EAAGA,CAAC,CAC9B,EACA,MAAO,SAAS,EAAG,CACjB,OAAO,EAAI,GAAM,KAAK,IAAI,EAAI,EAAGA,CAAC,EAAI,GAAK,EAAI,KAAK,IAAI,EAAI,EAAI,EAAGA,CAAC,GAAK,EAAI,EAC/E,CACN,CACE,CACF,CAAC,EAAGg2D,GAAK,UAAW,CAClB,OAAO,YAAY,IAAG,CACxB,EAAGC,IAEA,UAAW,CACV,SAASj2D,GAAI,CACX,KAAK,QAAU,CAAA,EAAI,KAAK,yBAA2B,CAAA,CACrD,CACA,OAAOA,EAAE,UAAU,OAAS,UAAW,CACrC,IAAI,EAAI,KACR,OAAO,OAAO,KAAK,KAAK,OAAO,EAAE,IAAI,SAAS,EAAG,CAC/C,OAAO,EAAE,QAAQ,CAAC,CACpB,CAAC,CACH,EAAGA,EAAE,UAAU,UAAY,UAAW,CACpC,KAAK,QAAU,CAAA,CACjB,EAAGA,EAAE,UAAU,IAAM,SAAS,EAAG,CAC/B,KAAK,QAAQ,EAAE,MAAK,CAAE,EAAI,EAAG,KAAK,yBAAyB,EAAE,MAAK,CAAE,EAAI,CAC1E,EAAGA,EAAE,UAAU,OAAS,SAAS,EAAG,CAClC,OAAO,KAAK,QAAQ,EAAE,MAAK,CAAE,EAAG,OAAO,KAAK,yBAAyB,EAAE,OAAO,CAChF,EAAGA,EAAE,UAAU,OAAS,SAAS,EAAG,EAAG,CACrC,IAAM,SAAW,EAAIg2D,GAAE,GAAK,IAAM,SAAW,EAAI,IACjD,IAAI,EAAI,OAAO,KAAK,KAAK,OAAO,EAChC,GAAI,EAAE,SAAW,EACf,MAAO,GACT,KAAO,EAAE,OAAS,GAAK,CACrB,KAAK,yBAA2B,CAAA,EAChC,QAAS,EAAI,EAAG,EAAI,EAAE,OAAQ,IAAK,CACjC,IAAI7hG,EAAI,KAAK,QAAQ,EAAE,CAAC,CAAC,EAAGqD,EAAI,CAAC,EACjCrD,GAAKA,EAAE,OAAO,EAAGqD,CAAC,IAAM,IAAM,CAAC,GAAK,OAAO,KAAK,QAAQ,EAAE,CAAC,CAAC,CAC9D,CACA,EAAI,OAAO,KAAK,KAAK,wBAAwB,CAC/C,CACA,MAAO,EACT,EAAGwoC,CACL,GAAC,EACAk2D,GAAK,CACN,OAAQ,SAASl2D,EAAG,EAAG,CACrB,IAAI,EAAIA,EAAE,OAAS,EAAG,EAAI,EAAI,EAAG,EAAI,KAAK,MAAM,CAAC,EAAG7rC,EAAI+hG,GAAG,MAAM,OACjE,OAAO,EAAI,EAAI/hG,EAAE6rC,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG,CAAC,EAAI,EAAI,EAAI7rC,EAAE6rC,EAAE,CAAC,EAAGA,EAAE,EAAI,CAAC,EAAG,EAAI,CAAC,EAAI7rC,EAAE6rC,EAAE,CAAC,EAAGA,EAAE,EAAI,EAAI,EAAI,EAAI,EAAI,CAAC,EAAG,EAAI,CAAC,CAC9G,EACA,MAAO,CACL,OAAQ,SAASA,EAAG,EAAG,EAAG,CACxB,OAAQ,EAAIA,GAAK,EAAIA,CACvB,CACJ,CACA,EAAGm2D,IAEA,UAAW,CACV,SAASn2D,GAAI,CACb,CACA,OAAOA,EAAE,OAAS,UAAW,CAC3B,OAAOA,EAAE,SACX,EAAGA,EAAE,QAAU,EAAGA,CACpB,GAAC,EACAo2D,GAAK,IAAIH,GAAMI,IAEf,UAAW,CACV,SAASr2D,EAAE,EAAG,EAAG,CACf,IAAM,SAAW,EAAIo2D,IAAK,KAAK,QAAU,EAAG,KAAK,OAAS,EAAG,KAAK,UAAY,GAAI,KAAK,YAAc,EAAG,KAAK,aAAe,GAAI,KAAK,WAAa,CAAA,EAAI,KAAK,mBAAqB,CAAA,EAAI,KAAK,UAAY,IAAK,KAAK,WAAa,GAAI,KAAK,eAAiB,EAAG,KAAK,QAAU,EAAG,KAAK,MAAQ,GAAI,KAAK,WAAa,GAAI,KAAK,UAAY,GAAI,KAAK,WAAa,EAAG,KAAK,WAAa,EAAG,KAAK,gBAAkBL,GAAG,OAAO,KAAM,KAAK,uBAAyBG,GAAG,OAAQ,KAAK,eAAiB,GAAI,KAAK,sBAAwB,GAAI,KAAK,2BAA6B,GAAI,KAAK,IAAMC,GAAG,SAAU,KAAK,gBAAkB,GAAI,KAAK,oBAAsB,GAAI,KAAK,SAAW,EACtoB,CACA,OAAOn2D,EAAE,UAAU,MAAQ,UAAW,CACpC,OAAO,KAAK,GACd,EAAGA,EAAE,UAAU,UAAY,UAAW,CACpC,OAAO,KAAK,UACd,EAAGA,EAAE,UAAU,SAAW,UAAW,CACnC,OAAO,KAAK,SACd,EAAGA,EAAE,UAAU,YAAc,UAAW,CACtC,OAAO,KAAK,SACd,EAAGA,EAAE,UAAU,GAAK,SAAS,EAAG,EAAG,CACjC,GAAI,IAAM,SAAW,EAAI,KAAM,KAAK,WAClC,MAAM,IAAI,MAAM,yFAAyF,EAC3G,OAAO,KAAK,WAAa,EAAG,KAAK,oBAAsB,GAAI,KAAK,UAAY,EAAI,EAAI,EAAI,EAAG,IAC7F,EAAGA,EAAE,UAAU,SAAW,SAAS,EAAG,CACpC,OAAO,IAAM,SAAW,EAAI,KAAM,KAAK,UAAY,EAAI,EAAI,EAAI,EAAG,IACpE,EAAGA,EAAE,UAAU,QAAU,SAAS,EAAG,CACnC,OAAO,IAAM,SAAW,EAAI,IAAK,KAAK,WAAa,EAAG,IACxD,EAAGA,EAAE,UAAU,MAAQ,SAAS,EAAG,EAAG,CACpC,GAAI,IAAM,SAAW,EAAIg2D,GAAE,GAAK,IAAM,SAAW,EAAI,IAAK,KAAK,WAC7D,OAAO,KACT,GAAI,KAAK,QAAU,KAAK,OAAO,IAAI,IAAI,EAAG,KAAK,QAAU,KAAK,eAAgB,KAAK,UAAW,CAC5F,KAAK,UAAY,GACjB,QAAS,KAAK,KAAK,mBACjB,KAAK,0BAA0B,CAAC,EAAG,KAAK,aAAa,CAAC,EAAI,KAAK,mBAAmB,CAAC,CACvF,CACA,GAAI,KAAK,WAAa,GAAI,KAAK,UAAY,GAAI,KAAK,sBAAwB,GAAI,KAAK,2BAA6B,GAAI,KAAK,gBAAkB,GAAI,KAAK,WAAa,EAAG,KAAK,YAAc,KAAK,WAAY,CAAC,KAAK,qBAAuB,EAAG,CACxO,GAAI,KAAK,oBAAsB,GAAI,CAAC,KAAK,WAAY,CACnD,IAAI,EAAI,CAAA,EACR,QAAS7hG,KAAK,KAAK,WACjB,EAAEA,CAAC,EAAI,KAAK,WAAWA,CAAC,EAC1B,KAAK,WAAa,CACpB,CACA,KAAK,iBAAiB,KAAK,QAAS,KAAK,aAAc,KAAK,WAAY,KAAK,mBAAoB,CAAC,CACpG,CACA,OAAO,IACT,EAAG6rC,EAAE,UAAU,uBAAyB,SAAS,EAAG,CAClD,OAAO,KAAK,MAAM,EAAG,EAAE,CACzB,EAAGA,EAAE,UAAU,iBAAmB,SAAS,EAAG,EAAG,EAAG,EAAG7rC,EAAG,CACxD,QAASqD,KAAK,EAAG,CACf,IAAIxE,EAAI,EAAEwE,CAAC,EAAG,EAAI,MAAM,QAAQxE,CAAC,EAAGyJ,EAAI,EAAI,QAAU,OAAOzJ,EAAGE,EAAI,CAAC,GAAK,MAAM,QAAQ,EAAEsE,CAAC,CAAC,EAC5F,GAAI,EAAEiF,IAAM,aAAeA,IAAM,YAAa,CAC5C,GAAIvJ,EAAG,CACL,IAAI,EAAI,EAAEsE,CAAC,EACX,GAAI,EAAE,SAAW,EACf,SACF,QAASzG,EAAI,CAACiC,CAAC,EAAGiD,EAAI,EAAG3R,EAAI,EAAE,OAAQ2R,EAAI3R,EAAG2R,GAAK,EAAG,CACpD,IAAIga,EAAI,KAAK,qBAAqBjd,EAAG,EAAEiD,CAAC,CAAC,EACzC,GAAI,MAAMga,CAAC,EAAG,CACZ/c,EAAI,GAAI,QAAQ,KAAK,6CAA6C,EAClE,KACF,CACAnC,EAAE,KAAKkf,CAAC,CACV,CACA/c,IAAM,EAAEsE,CAAC,EAAIzG,EACf,CACA,IAAK0L,IAAM,UAAY,IAAMzJ,GAAK,CAACE,EAAG,CACpC,EAAEsE,CAAC,EAAI,EAAI,CAAA,EAAK,CAAA,EAChB,IAAI7a,EAAIqW,EACR,QAASzB,KAAK5U,EACZ,EAAE6a,CAAC,EAAEjG,CAAC,EAAI5U,EAAE4U,CAAC,EACf,EAAEiG,CAAC,EAAI,EAAI,CAAA,EAAK,CAAA,EAChB,IAAI,EAAI,EAAEA,CAAC,EACX,GAAI,CAAC,KAAK,WAAY,CACpB,IAAIvC,EAAI,CAAA,EACR,QAAS1D,KAAK,EACZ0D,EAAE1D,CAAC,EAAI,EAAEA,CAAC,EACZ,EAAEiG,CAAC,EAAI,EAAIvC,CACb,CACA,KAAK,iBAAiBtY,EAAG,EAAE6a,CAAC,EAAG,EAAG,EAAEA,CAAC,EAAGrD,CAAC,CAC3C,MACG,OAAO,EAAEqD,CAAC,EAAI,KAAOrD,KAAO,EAAEqD,CAAC,EAAIxE,GAAI,IAAM,EAAEwE,CAAC,GAAK,GAAItE,EAAI,EAAEsE,CAAC,EAAI,EAAEA,CAAC,EAAE,MAAK,EAAG,QAAO,EAAK,EAAEA,CAAC,EAAI,EAAEA,CAAC,GAAK,CACjH,CACF,CACF,EAAGwoC,EAAE,UAAU,KAAO,UAAW,CAC/B,OAAO,KAAK,kBAAoB,KAAK,gBAAkB,GAAI,KAAK,kBAAiB,GAAK,KAAK,YAAc,KAAK,QAAU,KAAK,OAAO,OAAO,IAAI,EAAG,KAAK,WAAa,GAAI,KAAK,UAAY,GAAI,KAAK,iBAAmB,KAAK,gBAAgB,KAAK,OAAO,EAAG,MAAQ,IACnQ,EAAGA,EAAE,UAAU,IAAM,UAAW,CAC9B,OAAO,KAAK,SAAW,GAAI,KAAK,OAAO,GAAK,EAAG,IACjD,EAAGA,EAAE,UAAU,MAAQ,SAAS,EAAG,CACjC,OAAO,IAAM,SAAW,EAAIg2D,GAAE,GAAK,KAAK,WAAa,CAAC,KAAK,WAAa,MAAQ,KAAK,UAAY,GAAI,KAAK,YAAc,EAAG,KAAK,QAAU,KAAK,OAAO,OAAO,IAAI,EAAG,KACtK,EAAGh2D,EAAE,UAAU,OAAS,SAAS,EAAG,CAClC,OAAO,IAAM,SAAW,EAAIg2D,GAAE,GAAK,CAAC,KAAK,WAAa,CAAC,KAAK,WAAa,MAAQ,KAAK,UAAY,GAAI,KAAK,YAAc,EAAI,KAAK,YAAa,KAAK,YAAc,EAAG,KAAK,QAAU,KAAK,OAAO,IAAI,IAAI,EAAG,KAC7M,EAAGh2D,EAAE,UAAU,kBAAoB,UAAW,CAC5C,QAAS,EAAI,EAAG,EAAI,KAAK,eAAe,OAAQ,EAAI,EAAG,IACrD,KAAK,eAAe,CAAC,EAAE,KAAI,EAC7B,OAAO,IACT,EAAGA,EAAE,UAAU,MAAQ,SAAS,EAAG,CACjC,OAAO,IAAM,SAAW,EAAIo2D,IAAK,KAAK,OAAS,EAAG,IACpD,EAAGp2D,EAAE,UAAU,MAAQ,SAAS,EAAG,CACjC,OAAO,IAAM,SAAW,EAAI,GAAI,KAAK,WAAa,EAAG,IACvD,EAAGA,EAAE,UAAU,OAAS,SAAS,EAAG,CAClC,OAAO,IAAM,SAAW,EAAI,GAAI,KAAK,eAAiB,EAAG,KAAK,QAAU,EAAG,IAC7E,EAAGA,EAAE,UAAU,YAAc,SAAS,EAAG,CACvC,OAAO,KAAK,iBAAmB,EAAG,IACpC,EAAGA,EAAE,UAAU,KAAO,SAAS,EAAG,CAChC,OAAO,IAAM,SAAW,EAAI,IAAK,KAAK,MAAQ,EAAG,IACnD,EAAGA,EAAE,UAAU,OAAS,SAAS,EAAG,CAClC,OAAO,IAAM,SAAW,EAAI+1D,GAAG,OAAO,MAAO,KAAK,gBAAkB,EAAG,IACzE,EAAG/1D,EAAE,UAAU,cAAgB,SAAS,EAAG,CACzC,OAAO,IAAM,SAAW,EAAIk2D,GAAG,QAAS,KAAK,uBAAyB,EAAG,IAC3E,EAAGl2D,EAAE,UAAU,MAAQ,UAAW,CAChC,QAAS,EAAI,CAAA,EAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAC5C,EAAE,CAAC,EAAI,UAAU,CAAC,EACpB,OAAO,KAAK,eAAiB,EAAG,IAClC,EAAGA,EAAE,UAAU,QAAU,SAAS,EAAG,CACnC,OAAO,KAAK,iBAAmB,EAAG,IACpC,EAAGA,EAAE,UAAU,aAAe,SAAS,EAAG,CACxC,OAAO,KAAK,sBAAwB,EAAG,IACzC,EAAGA,EAAE,UAAU,SAAW,SAAS,EAAG,CACpC,OAAO,KAAK,kBAAoB,EAAG,IACrC,EAAGA,EAAE,UAAU,SAAW,SAAS,EAAG,CACpC,OAAO,KAAK,kBAAoB,EAAG,IACrC,EAAGA,EAAE,UAAU,WAAa,SAAS,EAAG,CACtC,OAAO,KAAK,oBAAsB,EAAG,IACvC,EAAGA,EAAE,UAAU,OAAS,SAAS,EAAG,CAClC,OAAO,KAAK,gBAAkB,EAAG,IACnC,EAAGA,EAAE,UAAU,OAAS,SAAS,EAAG,EAAG,CACrC,IAAI,EAAI,KAAM,EACd,GAAI,IAAM,SAAW,EAAIg2D,GAAE,GAAK,IAAM,SAAW,EAAI,IAAK,KAAK,UAC7D,MAAO,GACT,IAAI7hG,EAAGqD,EAAI,KAAK,WAAa,KAAK,UAClC,GAAI,CAAC,KAAK,UAAY,CAAC,KAAK,WAAY,CACtC,GAAI,EAAIA,EACN,MAAO,GACT,GAAK,KAAK,MAAM,EAAG,EAAE,CACvB,CACA,GAAI,KAAK,SAAW,GAAI,EAAI,KAAK,WAC/B,MAAO,GACT,KAAK,wBAA0B,KAAO,KAAK,kBAAoB,KAAK,iBAAiB,KAAK,OAAO,EAAG,KAAK,sBAAwB,IAAK,KAAK,6BAA+B,KAAO,KAAK,uBAAyB,KAAK,sBAAsB,KAAK,OAAO,EAAG,KAAK,2BAA6B,IAC3R,IAAIxE,EAAI,EAAI,KAAK,WAAY,EAAI,KAAK,YAAc,EAAI,KAAK,oBAAsB,MAAQ,IAAM,OAAS,EAAI,KAAK,YAAayJ,EAAI,KAAK,UAAY,KAAK,QAAU,EAAGvJ,EAAI,UAAW,CACpL,GAAI,EAAE,YAAc,GAAKF,EAAIyJ,EAC3B,MAAO,GACT,IAAI9f,EAAI,KAAK,MAAMqW,EAAI,CAAC,EAAGzB,EAAIyB,EAAIrW,EAAI,EAAGsY,EAAI,KAAK,IAAI1D,EAAI,EAAE,UAAW,CAAC,EACzE,OAAO0D,IAAM,GAAKjC,IAAM,EAAE,UAAY,EAAIiC,CAC5C,EAAG,EAAI/B,EAAC,EAAInC,EAAI,KAAK,gBAAgB,CAAC,EACtC,GAAI,KAAK,kBAAkB,KAAK,QAAS,KAAK,aAAc,KAAK,WAAYA,CAAC,EAAG,KAAK,mBAAqB,KAAK,kBAAkB,KAAK,QAAS,CAAC,EAAG,KAAK,YAAc,GAAKiC,GAAK,KAAK,UACpL,GAAI,KAAK,QAAU,EAAG,CACpB,IAAIiD,EAAI,KAAK,IAAI,KAAK,OAAOjD,EAAI,KAAK,WAAa,CAAC,EAAI,EAAG,KAAK,OAAO,EACvE,SAAS,KAAK,OAAO,IAAM,KAAK,SAAWiD,GAC3C,IAAK9B,KAAK,KAAK,mBACb,CAAC,KAAK,OAAS,OAAO,KAAK,WAAWA,CAAC,GAAK,WAAa,KAAK,mBAAmBA,CAAC,EAElF,KAAK,mBAAmBA,CAAC,EAAI,WAAW,KAAK,WAAWA,CAAC,CAAC,GAAI,KAAK,OAAS,KAAK,0BAA0BA,CAAC,EAAG,KAAK,aAAaA,CAAC,EAAI,KAAK,mBAAmBA,CAAC,EACjK,OAAO,KAAK,QAAU,KAAK,UAAY,CAAC,KAAK,WAAY,KAAK,YAAc,EAAI8B,EAAG,KAAK,mBAAqB,KAAK,kBAAkB,KAAK,OAAO,EAAG,KAAK,2BAA6B,GAAI,EAC3L,KAAO,CACL,KAAK,qBAAuB,KAAK,oBAAoB,KAAK,OAAO,EACjE,QAAS3R,EAAI,EAAG2rB,EAAI,KAAK,eAAe,OAAQ3rB,EAAI2rB,EAAG3rB,IACrD,KAAK,eAAeA,CAAC,EAAE,MAAM,KAAK,WAAa,KAAK,UAAW,EAAE,EACnE,OAAO,KAAK,WAAa,GAAI,EAC/B,CACF,MAAO,EACT,EAAG07C,EAAE,UAAU,kBAAoB,SAAS,EAAG,EAAG,EAAG,EAAG,CACtD,QAAS7rC,KAAK,EACZ,GAAI,EAAEA,CAAC,IAAM,OAAQ,CACnB,IAAIqD,EAAI,EAAErD,CAAC,GAAK,EAAGnB,EAAI,EAAEmB,CAAC,EAAG,EAAI,MAAM,QAAQ,EAAEA,CAAC,CAAC,EAAGsI,EAAI,MAAM,QAAQzJ,CAAC,EAAGE,EAAI,CAAC,GAAKuJ,EACtFvJ,EAAI,EAAEiB,CAAC,EAAI,KAAK,uBAAuBnB,EAAG,CAAC,EAAI,OAAOA,GAAK,UAAYA,EAAI,KAAK,kBAAkB,EAAEmB,CAAC,EAAGqD,EAAGxE,EAAG,CAAC,GAAKA,EAAI,KAAK,qBAAqBwE,EAAGxE,CAAC,EAAG,OAAOA,GAAK,WAAa,EAAEmB,CAAC,EAAIqD,GAAKxE,EAAIwE,GAAK,GACzM,CACJ,EAAGwoC,EAAE,UAAU,qBAAuB,SAAS,EAAG,EAAG,CACnD,OAAO,OAAO,GAAK,SAAW,EAAI,EAAE,OAAO,CAAC,IAAM,KAAO,EAAE,OAAO,CAAC,IAAM,IAAM,EAAI,WAAW,CAAC,EAAI,WAAW,CAAC,CACjH,EAAGA,EAAE,UAAU,0BAA4B,SAAS,EAAG,CACrD,IAAI,EAAI,KAAK,mBAAmB,CAAC,EAAG,EAAI,KAAK,WAAW,CAAC,EACzD,OAAO,GAAK,SAAW,KAAK,mBAAmB,CAAC,EAAI,KAAK,mBAAmB,CAAC,EAAI,WAAW,CAAC,EAAI,KAAK,mBAAmB,CAAC,EAAI,KAAK,WAAW,CAAC,EAAG,KAAK,WAAW,CAAC,EAAI,CACzK,EAAGA,CACL,GAAC,EAEHm2D,GAAG,OACH,IAAIxkG,GAAKykG,GACTzkG,GAAG,OAAO,KAAKA,EAAE,EACjBA,GAAG,UAAU,KAAKA,EAAE,EACpBA,GAAG,IAAI,KAAKA,EAAE,EACdA,GAAG,OAAO,KAAKA,EAAE,EACjBA,GAAG,OAAO,KAAKA,EAAE,EACjB,IAAI2kG,GAAK,CACP,OAAQP,GACR,MAAOM,EACT,EACA,MAAME,WAAWC,EAAG,CAMlB,YAAY,EAAG,CACb,MAAM,CAAC,EAAG,KAAK,KAAOnb,EACxB,CAOA,MAAM,EAAG,CACP,MAAM7jF,EAAI,SAASoiF,EAAGE,EAAG,CACvB,OAAQF,EAAC,CACP,IAAK,GACH,MAAM,IAAI,MAAM,iCAAmCE,GAAK,GAAG,EAC7D,IAAK,GACH,MAAM,IAAI,MAAM,kCAAoCA,GAAK,GAAG,EAC9D,IAAK,GACH,MAAM,IAAI,MAAM,sCAAwCA,GAAK,GAAG,EAClE,QACA,IAAK,GACH,MAAM,IAAI,MAAM,mCAAqCA,GAAK,GAAG,CACvE,CACI,EAAGx/E,EAAI,SAASs/E,EAAGE,EAAGC,EAAG,CACvBD,EAAIA,GAAK,KACT,IAAIR,EAAIM,EAAE,IAAKL,EAAI,GAAIn4F,EAAI,EAAG4T,EAAI,GAAI2kF,EAAI,OAAO,aAAa,MAAM,KAAM,IAAI,YAAYC,EAAE,SAASN,EAAGA,EAAI,GAAG,CAAC,CAAC,EACjH,KAAO,GAAKC,EAAII,EAAE,QAAQ;AAAA,CAC/B,IAAMv4F,EAAI04F,GAAKR,EAAIM,EAAE,YACd5kF,GAAK2kF,EAAGv4F,GAAKu4F,EAAE,OAAQL,GAAK,IAAKK,GAAK,OAAO,aAAa,MAAM,KAAM,IAAI,YAAYC,EAAE,SAASN,EAAGA,EAAI,GAAG,CAAC,CAAC,EAC/G,MAAO,GAAKC,GAAKK,EAAE,KAAOx4F,EAAIm4F,EAAI,EAAGvkF,EAAI2kF,EAAE,MAAM,EAAGJ,CAAC,GAAK,EAC5D,EAAGxoF,EAAI,SAAS6oF,EAAG,CACjB,MAAME,EAAI,YAAaC,EAAI,oCAAqCX,EAAI,uCAAwCE,EAAI,uBAAwBC,EAAI,oCAAqCn4F,EAAI,CACnL,MAAO,EAEP,OAAQ,GAER,SAAU,GAEV,YAAa,OAEb,OAAQ,GAER,MAAO,EAEP,SAAU,EAEV,MAAO,EACP,OAAQ,CAEhB,EACM,IAAI4T,EAAG2kF,EACP,KAAMC,EAAE,KAAOA,EAAE,YAAc,EAAE5kF,EAAIsF,EAAEs/E,CAAC,KAAOpiF,EAAE,EAAG,iBAAiB,GAAImiF,EAAI3kF,EAAE,MAAM8kF,CAAC,IAAMtiF,EAAE,EAAG,mBAAmB,EAAGpW,EAAE,OAAS,EAAGA,EAAE,YAAcu4F,EAAE,CAAC,EAAGv4F,EAAE,QAAU4T,EAAI;AAAA,EAC9KA,EAAIsF,EAAEs/E,CAAC,EAAG5kF,IAAM,IAAM,CACjB,GAAI5T,EAAE,QAAU4T,EAAI;AAAA,EACzBA,EAAE,OAAO,CAAC,IAAM,IAAK,CACd5T,EAAE,UAAY4T,EAAI;AAAA,EAElB,QACF,CACA,IAAK2kF,EAAI3kF,EAAE,MAAM+kF,CAAC,KAAO34F,EAAE,MAAQ,WAAWu4F,EAAE,CAAC,CAAC,IAAKA,EAAI3kF,EAAE,MAAMokF,CAAC,KAAOh4F,EAAE,SAAW,WAAWu4F,EAAE,CAAC,CAAC,IAAKA,EAAI3kF,EAAE,MAAMskF,CAAC,KAAOl4F,EAAE,OAAS,EAAGA,EAAE,OAASu4F,EAAE,CAAC,IAAKA,EAAI3kF,EAAE,MAAMukF,CAAC,KAAOn4F,EAAE,OAAS,EAAGA,EAAE,OAAS,SAASu4F,EAAE,CAAC,EAAG,EAAE,EAAGv4F,EAAE,MAAQ,SAASu4F,EAAE,CAAC,EAAG,EAAE,GAAIv4F,EAAE,MAAQ,GAAKA,EAAE,MAAQ,EAAG,KAC/R,CACA,OAAOA,EAAE,MAAQ,GAAKoW,EAAE,EAAG,0BAA0B,EAAGpW,EAAE,MAAQ,GAAKoW,EAAE,EAAG,8BAA8B,EAAGpW,CAC/G,EAAG6U,EAAI,SAAS2jF,EAAGE,EAAGC,EAAG,CACvB,MAAMX,EAAIU,EACV,GAEEV,EAAI,GAAKA,EAAI,OACbQ,EAAE,CAAC,IAAM,GAAKA,EAAE,CAAC,IAAM,GAAKA,EAAE,CAAC,EAAI,IAEnC,OAAO,IAAI,WAAWA,CAAC,EACzBR,KAAOQ,EAAE,CAAC,GAAK,EAAIA,EAAE,CAAC,IAAMpiF,EAAE,EAAG,sBAAsB,EACvD,MAAM8hF,EAAI,IAAI,WAAW,EAAIQ,EAAIC,CAAC,EAClCT,EAAE,QAAU9hF,EAAE,EAAG,iCAAiC,EAClD,IAAI+hF,EAAI,EAAGn4F,EAAI,EACf,MAAM4T,EAAI,EAAIokF,EAAGO,EAAI,IAAI,WAAW,CAAC,EAAGE,EAAI,IAAI,WAAW7kF,CAAC,EAC5D,IAAI2B,EAAKojF,EACT,KAAOpjF,EAAK,GAAKvV,EAAIw4F,EAAE,YAAc,CACnCx4F,EAAI,EAAIw4F,EAAE,YAAcpiF,EAAE,CAAC,EAAGmiF,EAAE,CAAC,EAAIC,EAAEx4F,GAAG,EAAGu4F,EAAE,CAAC,EAAIC,EAAEx4F,GAAG,EAAGu4F,EAAE,CAAC,EAAIC,EAAEx4F,GAAG,EAAGu4F,EAAE,CAAC,EAAIC,EAAEx4F,GAAG,GAAIu4F,EAAE,CAAC,GAAK,GAAKA,EAAE,CAAC,GAAK,IAAMA,EAAE,CAAC,GAAK,EAAIA,EAAE,CAAC,IAAMP,IAAM5hF,EAAE,EAAG,0BAA0B,EAChL,IAAI8kF,EAAI,EAAGtC,EACX,KAAOsC,EAAItnF,GAAK5T,EAAIw4F,EAAE,YAAc,CAClCI,EAAIJ,EAAEx4F,GAAG,EACT,MAAM64F,EAAID,EAAI,IACd,GAAIC,IAAMD,GAAK,MAAOA,IAAM,GAAKsC,EAAItC,EAAIhlF,IAAMwC,EAAE,EAAG,mBAAmB,EAAGyiF,EAAG,CAC3E,MAAMsC,EAAI3C,EAAEx4F,GAAG,EACf,QAASo7F,EAAK,EAAGA,EAAKxC,EAAGwC,IACvB3C,EAAEyC,GAAG,EAAIC,CACb,MACE1C,EAAE,IAAID,EAAE,SAASx4F,EAAGA,EAAI44F,CAAC,EAAGsC,CAAC,EAAGA,GAAKtC,EAAG54F,GAAK44F,CACjD,CACA,MAAME,EAAId,EACV,QAASa,EAAI,EAAGA,EAAIC,EAAGD,IAAK,CAC1B,IAAIsC,EAAI,EACRjD,EAAEC,CAAC,EAAIM,EAAEI,EAAIsC,CAAC,EAAGA,GAAKnD,EAAGE,EAAEC,EAAI,CAAC,EAAIM,EAAEI,EAAIsC,CAAC,EAAGA,GAAKnD,EAAGE,EAAEC,EAAI,CAAC,EAAIM,EAAEI,EAAIsC,CAAC,EAAGA,GAAKnD,EAAGE,EAAEC,EAAI,CAAC,EAAIM,EAAEI,EAAIsC,CAAC,EAAGhD,GAAK,CAC/G,CACA5iF,GACF,CACA,OAAO2iF,CACT,EAAGh1F,EAAI,SAASs1F,EAAGE,EAAGC,EAAGX,EAAG,CAC1B,MAAME,EAAIM,EAAEE,EAAI,CAAC,EAAGP,EAAI,KAAK,IAAI,EAAGD,EAAI,GAAG,EAAI,IAC/CS,EAAEX,EAAI,CAAC,EAAIQ,EAAEE,EAAI,CAAC,EAAIP,EAAGQ,EAAEX,EAAI,CAAC,EAAIQ,EAAEE,EAAI,CAAC,EAAIP,EAAGQ,EAAEX,EAAI,CAAC,EAAIQ,EAAEE,EAAI,CAAC,EAAIP,EAAGQ,EAAEX,EAAI,CAAC,EAAI,CACxF,EAAGnpE,EAAI,SAAS2pE,EAAGE,EAAGC,EAAGX,EAAG,CAC1B,MAAME,EAAIM,EAAEE,EAAI,CAAC,EAAGP,EAAI,KAAK,IAAI,EAAGD,EAAI,GAAG,EAAI,IAC/CS,EAAEX,EAAI,CAAC,EAAIqd,GAAG,YAAY,KAAK,IAAI7c,EAAEE,EAAI,CAAC,EAAIP,EAAG,KAAK,CAAC,EAAGQ,EAAEX,EAAI,CAAC,EAAIqd,GAAG,YAAY,KAAK,IAAI7c,EAAEE,EAAI,CAAC,EAAIP,EAAG,KAAK,CAAC,EAAGQ,EAAEX,EAAI,CAAC,EAAIqd,GAAG,YAAY,KAAK,IAAI7c,EAAEE,EAAI,CAAC,EAAIP,EAAG,KAAK,CAAC,EAAGQ,EAAEX,EAAI,CAAC,EAAIqd,GAAG,YAAY,CAAC,CAC3M,EAAG95G,EAAI,IAAI,WAAW,CAAC,EACvBA,EAAE,IAAM,EACR,MAAM4U,EAAIR,EAAEpU,CAAC,EAAGsY,EAAI1D,EAAE,MAAON,EAAIM,EAAE,OAAQioF,EAAIvjF,EAAEtZ,EAAE,SAASA,EAAE,GAAG,EAAGsY,EAAGhE,CAAC,EACxE,IAAIgC,EAAGwmF,EAAGC,EACV,OAAQ,KAAK,KAAI,CACf,KAAK+F,GACH/F,EAAIF,EAAE,OAAS,EACf,MAAMI,EAAI,IAAI,aAAaF,EAAI,CAAC,EAChC,QAASK,EAAI,EAAGA,EAAIL,EAAGK,IACrBz1F,EAAEk1F,EAAGO,EAAI,EAAGH,EAAGG,EAAI,CAAC,EACtB9mF,EAAI2mF,EAAGH,EAAIgG,GACX,MACF,KAAKpE,GACH3B,EAAIF,EAAE,OAAS,EACf,MAAMM,EAAI,IAAI,YAAYJ,EAAI,CAAC,EAC/B,QAASK,EAAI,EAAGA,EAAIL,EAAGK,IACrB9pE,EAAEupE,EAAGO,EAAI,EAAGD,EAAGC,EAAI,CAAC,EACtB9mF,EAAI6mF,EAAGL,EAAI4B,GACX,MACF,QACE,MAAM,IAAI,MAAM,sCAAwC,KAAK,IAAI,CACzE,CACI,MAAO,CACL,MAAOpmF,EACP,OAAQhE,EACR,KAAMgC,EACN,OAAQ1B,EAAE,OACV,MAAOA,EAAE,MACT,SAAUA,EAAE,SACZ,KAAMkoF,CACZ,CACE,CAOA,YAAY,EAAG,CACb,OAAO,KAAK,KAAO,EAAG,IACxB,CACA,KAAK,EAAG,EAAG,EAAG,EAAG,CACf,SAAStlF,EAAEqD,EAAGxE,EAAG,CACf,OAAQwE,EAAE,KAAI,CACZ,KAAKioF,GACL,KAAKpE,GACH7jF,EAAE,WAAam1F,GAAIn1F,EAAE,UAAYw5F,GAAIx5F,EAAE,UAAYw5F,GAAIx5F,EAAE,gBAAkB,GAAIA,EAAE,MAAQ,GACzF,KACV,CACM,GAAK,EAAEA,EAAGxE,CAAC,CACb,CACA,OAAO,MAAM,KAAK,EAAGmB,EAAG,EAAG,CAAC,CAC9B,CACF,CACA,SAAS/W,IAAK,CACZ,OAAO,IAAIg5F,EACb,CACA,SAASsgB,GAAG12D,EAAG,EAAG,CAChBA,EAAE,YAAY,EAAE,UAAU,CAC5B,CACA,SAAS22D,GAAG32D,EAAG,EAAG,EAAG,CACnB,IAAI,EAAI,IAAI,OACZ,EAAE,QAAU,GACZ,IAAI,EAAI,KAAM7rC,EAAGqD,EAAGxE,EAAI,CAAA,EACxB,EAAE,KAAO,UAAW,CAClBmB,IAAMsI,EAAC,EAAIvJ,EAAC,EAAI,EAAC,EACnB,EAAG,EAAE,KAAO,UAAW,CACrBiB,EAAE,MAAM,QAAU,OAAQ,EAAE,QAAU,EACxC,EAAG,EAAE,KAAO,UAAW,CACrBA,EAAE,MAAM,QAAU,QAAS,EAAE,QAAU,EACzC,EAAG,EAAE,YAAc,UAAW,CAC5B,EAAE,OAAO,WAAW,KAAK,EAAE,OAAO,UAAU,EAC5C,MAAM7P,EAAI,IAAIy0F,EAAU,EAAG,EAAG,CAAC,EAAE,gBAAgB,EAAE,OAAO,UAAU,EACpE,EAAE,OAAO,SAAS,KAAKz0F,EAAE,eAAe,GAAG,CAAC,EAAG,EAAE,WAAW,SAAS,OAAO,EAAE,WAAY,EAAE,MAAM,CACpG,EAAG,EAAE,oBAAsB,SAASA,EAAG,CACrC,IAAI2rB,EAAI,IAAI8oE,EAAU,EAAG,EAAG,CAAC,EAC7Bz0F,GAAK,MAAQ2rB,EAAI,IAAI8oE,EAAU,EAAG,EAAG,IAAI,EAAIz0F,GAAK,OAAS2rB,EAAI,IAAI8oE,EAAU,EAAG,GAAI,IAAI,EAAIz0F,GAAK,QAAU2rB,EAAI,IAAI8oE,EAAU,EAAG,EAAG,CAAC,EAAIz0F,GAAK,OAAS2rB,EAAI,IAAI8oE,EAAU,GAAI,EAAG,CAAC,EAAIz0F,GAAK,OAAS2rB,EAAI,IAAI8oE,EAAU,EAAG,EAAG,EAAE,EAAIz0F,GAAK,QAAU2rB,EAAI,IAAI8oE,EAAU,EAAG,EAAG,CAAC,EAAIz0F,GAAK,YAAc2rB,EAAI,IAAI8oE,EAAU,EAAG,EAAG,CAAC,EAAIz0F,GAAK,WAAa2rB,EAAI,IAAI8oE,EAAU,EAAG,EAAG,EAAE,EAAIz0F,GAAK,WAAa2rB,EAAI,IAAI8oE,EAAU,GAAI,EAAG,CAAC,EAAIz0F,GAAK,YAAc2rB,EAAI,IAAI8oE,EAAU,EAAG,EAAG,CAAC,EAAIz0F,GAAK,aAAe2rB,EAAI,IAAI8oE,EAAU,EAAG,GAAI,CAAC,EAAIz0F,GAAK,YAAc2rB,EAAI,IAAI8oE,EAAU,EAAG,GAAI,EAAE,EAAIz0F,GAAK,YAAc2rB,EAAI,IAAI8oE,EAAU,GAAI,GAAI,CAAC,EAAIz0F,GAAK,aAAe2rB,EAAI,IAAI8oE,EAAU,EAAG,GAAI,CAAC,EAAIz0F,GAAK,cAAgB2rB,EAAI,IAAI8oE,EAAU,EAAG,EAAG,CAAC,EAAIz0F,GAAK,aAAe2rB,EAAI,IAAI8oE,EAAU,GAAI,EAAG,CAAC,EAAIz0F,GAAK,YAAc2rB,EAAI,IAAI8oE,EAAU,GAAI,EAAG,EAAE,EAAIz0F,GAAK,aAAe2rB,EAAI,IAAI8oE,EAAU,EAAG,EAAG,EAAE,EAAIz0F,GAAK,iBAAmB2rB,EAAI,IAAI8oE,EAAU,EAAG,EAAG,EAAE,EAAIz0F,GAAK,kBAAoB2rB,EAAI,IAAI8oE,EAAU,EAAG,EAAG,CAAC,EAAIz0F,GAAK,iBAAmB2rB,EAAI,IAAI8oE,EAAU,GAAI,EAAG,CAAC,EAAIz0F,GAAK,gBAAkB2rB,EAAI,IAAI8oE,EAAU,GAAI,EAAG,EAAE,EAAIz0F,GAAK,oBAAsB2rB,EAAI,IAAI8oE,EAAU,EAAG,GAAI,EAAE,EAAIz0F,GAAK,qBAAuB2rB,EAAI,IAAI8oE,EAAU,EAAG,GAAI,CAAC,EAAIz0F,GAAK,oBAAsB2rB,EAAI,IAAI8oE,EAAU,GAAI,EAAG,CAAC,EAAIz0F,GAAK,qBAAuB2rB,EAAI,IAAI8oE,EAAU,GAAI,GAAI,EAAE,GACzxC,IAAIp8F,EAAIqjD,EAAE,UAAU,eAAc,EAAIzuC,EAAI5U,EAAE,IAAKsY,EAAItY,EAAE,IAAKsU,EAAIM,EAAE,MAAK,EAAG,IAAI0D,EAAE,MAAK,CAAE,EAAE,eAAe,EAAG,EAAGukF,EAAIvoF,EAAE,MAAK,EAAG,IAAIgf,EAAE,eAAe,EAAIhb,EAAE,WAAW1D,CAAC,CAAC,CAAC,EACrK,EAAE,EAAE,OAAO,SAAUioF,EAAGx5C,EAAE,SAAS,OAAO,MAAK,EAAI/uC,CAAC,CACtD,EAAG,EAAE,cAAgB,UAAW,CAC9B,IAAI3M,EAAI,EAAE,OAAO,WAAY2rB,EAAI,EAAE,OAAO,SAAUtzB,EAAIqjD,EAAE,SAAS,OAAQzuC,EAAI,CAC7E,WAAYjN,EACZ,SAAU2rB,EACV,OAAQtzB,CACd,EACI,OAAO4U,CACT,EAAG,EAAE,oBAAsB,SAASjN,EAAG2rB,EAAI,IAAKtzB,EAAG,CACjD,IAAI4U,EAAI,IAAIqlG,GACVtyG,EAAE,WAAW,GACbA,EAAE,WAAW,GACbA,EAAE,WAAW,GACbA,EAAE,WAAW,EACnB,EAAO2Q,EAAI,IAAI8jF,EAAUz0F,EAAE,SAAS,EAAGA,EAAE,SAAS,EAAGA,EAAE,SAAS,CAAC,EAAG2M,EAAI,IAAI8nF,EAAUz0F,EAAE,OAAO,EAAGA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,EACpH,IAAIk1F,EAAI,GACR,EACE,EAAE,OAAO,SACTvkF,EACA+qC,EAAE,SAAS,OAAO,MAAK,EACvB/uC,EACA,EAAE,OAAO,WACTM,EACA0e,EACChd,GAAM,CACLtW,IAAM68F,IAAM78F,EAAEsW,CAAC,EAAGumF,EAAI,IACxB,CACN,EAAO78F,GAAK,WAAW,IAAM,CACvB68F,IAAM78F,EAAE,EAAE,EAAG68F,EAAI,GACnB,EAAGvpE,EAAI,EAAE,CACX,EAAG,EAAE,aAAe,UAAW,CAC7B,IAAI3rB,EAAI07C,EAAE,UAAU,eAAc,EAAI/vB,EAAI3rB,EAAE,IAAI,MAAK,EAAG,IAAIA,EAAE,IAAI,MAAK,CAAE,EAAE,eAAe,EAAG,EAC7F,IAAI3H,EAAI,IAAIo8F,EAAU,EAAG,EAAG,CAAC,EAC7B,IAAIxnF,EAAIjN,EAAE,IAAI,WAAWA,EAAE,GAAG,EAAG2Q,EAAIgb,EAAE,MAAK,EAAG,IAAItzB,EAAE,eAAe4U,CAAC,CAAC,EACtE,GAAI,EAAE,OAAO,qBAAsB,CACjC,IAAIN,EAAI+uC,EAAE,UAAU,YAAcA,EAAE,UAAU,aAAcw5C,EAAIjoF,EAAI,GACpE,EAAE,OAAO,KAAO,CAACioF,EAAIvoF,EAAG,EAAE,OAAO,MAAQuoF,EAAIvoF,EAAG,EAAE,OAAO,IAAMuoF,EAAG,EAAE,OAAO,OAAS,CAACA,EAAG,EAAE,OAAO,KAAO,EAAG,EAAE,OAAO,uBAAsB,CAC5I,CACA,EAAE,EAAE,OAAO,SAAUvkF,EAAG+qC,EAAE,SAAS,OAAO,MAAK,EAAI/vB,CAAC,CACtD,EAAG,EAAE,UAAY,SAAS3rB,EAAG,CAC3B,IAAI2rB,EAAI3rB,EAAE,IAAI,MAAK,EAAG,IAAIA,EAAE,IAAI,MAAK,CAAE,EAAE,eAAe,EAAG,EAAG3H,EAAI,EAAE,OAAO,SAAS,MAAK,EAAG,IAAIqjD,EAAE,SAAS,OAAO,OAAO,EAAE,UAAS,EAAIzuC,EAAI,EAAE,OAAO,SAAS,WAAWyuC,EAAE,SAAS,MAAM,EAAG/qC,EAAIgb,EAAE,MAAK,EAAG,IAAItzB,EAAE,eAAe4U,CAAC,CAAC,EAAGN,EAAI,EAAE,OAAO,KAClP,GAAI,EAAE,OAAO,qBAAsB,CACjC,IAAIuoF,EAAI,IAAIT,EAAU,EAAG,EAAG,CAAC,EAAE,gBAAgB,EAAE,OAAO,UAAU,EAAG9lF,EAAI,IAAI8lF,EAAU,EAAG,EAAG,CAAC,EAAE,gBAAgB,EAAE,OAAO,UAAU,EAAGU,EAAI,CACxI,IAAIV,EAAUz0F,EAAE,IAAI,EAAGA,EAAE,IAAI,EAAGA,EAAE,IAAI,CAAC,EACvC,IAAIy0F,EAAUz0F,EAAE,IAAI,EAAGA,EAAE,IAAI,EAAGA,EAAE,IAAI,CAAC,EACvC,IAAIy0F,EAAUz0F,EAAE,IAAI,EAAGA,EAAE,IAAI,EAAGA,EAAE,IAAI,CAAC,EACvC,IAAIy0F,EAAUz0F,EAAE,IAAI,EAAGA,EAAE,IAAI,EAAGA,EAAE,IAAI,CAAC,EACvC,IAAIy0F,EAAUz0F,EAAE,IAAI,EAAGA,EAAE,IAAI,EAAGA,EAAE,IAAI,CAAC,EACvC,IAAIy0F,EAAUz0F,EAAE,IAAI,EAAGA,EAAE,IAAI,EAAGA,EAAE,IAAI,CAAC,EACvC,IAAIy0F,EAAUz0F,EAAE,IAAI,EAAGA,EAAE,IAAI,EAAGA,EAAE,IAAI,CAAC,EACvC,IAAIy0F,EAAUz0F,EAAE,IAAI,EAAGA,EAAE,IAAI,EAAGA,EAAE,IAAI,CAAC,CAC/C,EAASo1F,EAAI,IAAOE,EAAI,KAAQE,EAAI,IAAOC,EAAI,KACzC,QAASX,KAAKK,EAAG,CACf,IAAIH,EAAIF,EAAE,IAAII,CAAC,EAAGD,EAAIH,EAAE,IAAInmF,CAAC,EAC7BymF,EAAI,KAAK,IAAIA,EAAGJ,CAAC,EAAGM,EAAI,KAAK,IAAIA,EAAGN,CAAC,EAAGQ,EAAI,KAAK,IAAIA,EAAGP,CAAC,EAAGQ,EAAI,KAAK,IAAIA,EAAGR,CAAC,CAC/E,CACA,IAAIn4F,GAAKw4F,EAAIF,GAAK,EAAG,GAAKK,EAAID,GAAK,EAAGH,GAAK,EAAE,OAAO,MAAQ,EAAE,OAAO,MAAQ,EAAGE,GAAK,EAAE,OAAO,IAAM,EAAE,OAAO,QAAU,EACvH5oF,EAAI,KAAK,IAAI0oF,EAAIv4F,EAAGy4F,EAAI,CAAC,EAAI,GAC/B,CACA,IAAIljF,EAAK,EAAE,OAAO,SAAS,QAAS2lF,EAAIt8C,EAAE,SAAS,OAAO,MAAK,EAAIg6C,GAAI,EAAE,OAAO,KAAME,EAAI,IAAIoc,GAAG,MAAM,CACrG,GAAI3/F,EAAG,EACP,GAAIA,EAAG,EACP,GAAIA,EAAG,EACP,GAAI2lF,EAAE,EACN,GAAIA,EAAE,EACN,GAAIA,EAAE,EACN,KAAMtC,EACZ,CAAK,EAAE,GAAG,CACJ,GAAI/kF,EAAE,EACN,GAAIA,EAAE,EACN,GAAIA,EAAE,EACN,GAAIgb,EAAE,EACN,GAAIA,EAAE,EACN,GAAIA,EAAE,EACN,KAAMhf,CACZ,EAAO,GAAG,EACNipF,EAAE,SAAS,SAASqC,GAAG,CACrBv8C,EAAE,WAAa,EAAE,OAAO,SAAS,IAAIu8C,GAAE,GAAIA,GAAE,GAAIA,GAAE,EAAE,EAAGv8C,EAAE,SAAS,OAAO,IAAIu8C,GAAE,GAAIA,GAAE,GAAIA,GAAE,EAAE,EAAG,EAAE,OAAO,uBAAyB,EAAE,OAAO,KAAOA,GAAE,KAAM,EAAE,OAAO,0BAA2Bv8C,EAAE,SAAS,KAAO,GAAIA,EAAE,SAAS,OAAM,EAAI,EAAE,cAC9O,CAAC,EAAGk6C,EAAE,WAAW,UAAW,CAC1Bl6C,EAAE,WAAaA,EAAE,SAAS,KAAO,GAAI,EAAE,YAAW,EAAI,qBAAqB,CAAC,EAAG,EAAI,KACrF,CAAC,EAAGk6C,EAAE,OAAOoc,GAAG,OAAO,MAAM,KAAK,EAAGpc,EAAE,MAAK,EAC5C,SAASD,GAAI,CACX,EAAI,sBAAsBA,CAAC,EAAGC,EAAE,OAAM,CACxC,CACAD,EAAC,CACH,EACA,SAAS,EAAE31F,EAAG2rB,EAAGtzB,EAAG4U,EAAG0D,EAAGhE,EAAGuoF,EAAI,IAAKvmF,EAAG,CACvC,IAAIwmF,EACJxkF,GAAKhE,GAAKwoF,EAAI,IAAI6c,GAAG,MAAM,CACzB,GAAIhyG,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAI3H,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAIsY,EAAE,GAEN,GAAIA,EAAE,GAEN,GAAIA,EAAE,GAEN,GAAIA,EAAE,EAEZ,CAAK,EAAGwkF,EAAE,GACJ,CACE,GAAIxpE,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAI1e,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAIN,EAAE,GAEN,GAAIA,EAAE,GAEN,GAAIA,EAAE,GAEN,GAAIA,EAAE,EAEd,EACMuoF,CACN,IAAUC,EAAI,IAAI6c,GAAG,MAAM,CACrB,GAAIhyG,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAI3H,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAIA,EAAE,CAEZ,CAAK,EAAG88F,EAAE,GACJ,CACE,GAAIxpE,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAI1e,EAAE,EAEN,GAAIA,EAAE,EAEN,GAAIA,EAAE,CAEd,EACMioF,CACN,GAAQC,EAAE,SAAS,SAASG,EAAG,CACzB55C,EAAE,WAAa/qC,GAAKhE,GAAK,EAAE,OAAO,WAAW,GAAK2oF,EAAE,GAAI,EAAE,OAAO,WAAW,GAAKA,EAAE,GAAI,EAAE,OAAO,WAAW,GAAKA,EAAE,GAAI,EAAE,OAAO,WAAW,GAAKA,EAAE,IAAM55C,EAAE,SAAS,KAAO,GAAI,EAAE,OAAO,SAAS,EAAI45C,EAAE,GAAI,EAAE,OAAO,SAAS,EAAIA,EAAE,GAAI,EAAE,OAAO,SAAS,EAAIA,EAAE,GAAI55C,EAAE,SAAS,OAAO,EAAI45C,EAAE,GAAI55C,EAAE,SAAS,OAAO,EAAI45C,EAAE,GAAI55C,EAAE,SAAS,OAAO,EAAI45C,EAAE,GAAI55C,EAAE,SAAS,SAAU,EAAE,cAC9W,CAAC,EAAGy5C,EAAE,WAAW,SAASG,EAAG,CAC3B55C,EAAE,WAAaA,EAAE,SAAS,KAAO,GAAI,EAAE,YAAW,EAAI/sC,GAAKA,EAAE,EAAE,EAAG,qBAAqB,CAAC,EAAG,EAAI,KACjG,CAAC,EAAGwmF,EAAE,OAAO6c,GAAG,OAAO,MAAM,KAAK,EAClC,SAAS5c,EAAEE,EAAG,CACZ,EAAI,sBAAsBF,CAAC,EAAGD,EAAE,OAAM,CACxC,CACAA,EAAE,MAAK,EAAIC,EAAC,CACd,CACA,SAASj9E,GAAI,CACXtI,EAAI,SAAS,cAAc,KAAK,EAAGA,EAAE,UAAY,WAAY,EAAE,YAAYA,CAAC,EAAGqD,EAAI,SAAS,cAAc,KAAK,EAAGA,EAAE,UAAY,qBAAsBA,EAAE,UAAY,MAAOrD,EAAE,YAAYqD,CAAC,EAC1L,IAAIlT,EAAI,SAAS,cAAc,KAAK,EACpCA,EAAE,UAAY,kBAAmBA,EAAE,iBAAiB,YAAa,UAAW,CAC1E,QAAQ,IAAI,IAAI,EAAG,EAAE,aAAY,CACnC,CAAC,EAAG6P,EAAE,YAAY7P,CAAC,EACnB,MAAM2rB,EAAI,SAAS,cAAc,KAAK,EACtCA,EAAE,UAAY,sBAAuBA,EAAE,MAAQ,YAAaA,EAAE,UAAY,IAAKA,EAAE,iBAAiB,YAAa,SAASupE,EAAG,CACzHA,EAAE,kBAAmB,QAAQ,IAAI,MAAM,EAAG,EAAE,iBAAgB,EAAIvkF,EAAC,CACnE,CAAC,EAAGd,EAAE,YAAY8b,CAAC,EACnB,MAAMtzB,EAAI,SAAS,cAAc,KAAK,EACtCA,EAAE,UAAY,oBAAqBA,EAAE,MAAQ,KAAMA,EAAE,UAAY,KAAMA,EAAE,iBAAiB,YAAa,SAAS68F,EAAG,CACjHA,EAAE,kBAAmB,QAAQ,IAAI,IAAI,EAAG,EAAE,eAAc,EAAIvkF,EAAC,CAC/D,CAAC,EAAGd,EAAE,YAAYxX,CAAC,EACnB,MAAM4U,EAAI,SAAS,cAAc,KAAK,EACtCA,EAAE,UAAY,oBAAqBA,EAAE,MAAQ,KAAMA,EAAE,UAAY,IAAKA,EAAE,iBAAiB,YAAa,SAASioF,EAAG,CAChHA,EAAE,kBAAmB,QAAQ,IAAI,IAAI,EAAG,EAAE,iBAAgB,EAAIvkF,EAAC,CACjE,CAAC,EAAGd,EAAE,YAAY5C,CAAC,EAAGiG,EAAE,iBAAiB,YAAa,SAASgiF,EAAG,CAChEA,EAAE,gBAAe,EAAIvpE,EAAE,UAAU,SAAS,MAAM,GAAKhb,EAAC,EAAI,QAAQ,IAAI,QAAQ,IAAMhE,EAAC,EAAI,QAAQ,IAAI,QAAQ,EAC/G,CAAC,EACD,SAASgE,GAAI,CACXgb,EAAE,UAAU,OAAO,MAAM,EAAGtzB,EAAE,UAAU,OAAO,MAAM,EAAG4U,EAAE,UAAU,OAAO,MAAM,CACnF,CACA,SAASN,GAAI,CACXgf,EAAE,UAAU,IAAI,MAAM,EAAGtzB,EAAE,UAAU,IAAI,MAAM,EAAG4U,EAAE,UAAU,IAAI,MAAM,CAC1E,CACF,CACA,SAAS2B,GAAI,CACX,EAAE,WAAa9V,GAAE,EACjB,IAAIT,EAAI,EAAE,YAAa4U,EAAI,EAAE,YAAajN,EAAI3H,EAAI4U,EAAI5U,EAAI4U,EAAIA,EAAI5U,EAAGszB,EAAI,IACzE,EAAE,OAAS,IAAIumE,GACbvmE,EAAI3rB,EAAI,GACR2rB,EAAI3rB,EAAI,EACR2rB,EAAI,EACJA,EAAI,GACJ,IACA,GACN,EACI,IAAItzB,EAAIwX,EAAE,YAAa5C,EAAI4C,EAAE,aAAcc,EAAI,IAAIyhF,GAAgB,CACjE,MAAO,EACb,CAAK,EACDzhF,EAAE,QAAQtY,EAAG4U,CAAC,EAAG0D,EAAE,cAAc,CAAC,EAAG,EAAE,WAAW,SAAWA,EAC7D,IAAIhE,EAAI,IAAI4jG,GAAe,SAAU,EAAG,EACxC,EAAE,WAAW,IAAI5jG,CAAC,EAAGylG,GAAGviG,EAAGc,CAAC,CAC9B,CACA,SAAS,GAAI,CACX,MAAM3Q,EAAI,oBACV,IAAI2rB,EAAI,CACN,CACE,MAAO,IACP,KAAM3rB,EAAI,cAClB,EACM,CACE,MAAO,IACP,KAAMA,EAAI,aAClB,EACM,CACE,MAAO,IACP,KAAMA,EAAI,YAClB,EACM,CACE,MAAO,IACP,KAAMA,EAAI,eAClB,EACM,CACE,MAAO,IACP,KAAMA,EAAI,cAClB,EACM,CACE,MAAO,IACP,KAAMA,EAAI,aAClB,CACA,EACI,IAAI3H,EAAI,CAAA,EACR,UAAWsY,KAAKgb,EACdtzB,EAAE,KACA,IAAIuwG,GAAoB,CACtB,MAAO,SACP,IAAK,IAAI2J,GAAe,EAAG,KAAK5hG,EAAE,IAAI,CAChD,CAAS,CACT,EACI,IAAI6hG,GAAsB,CACxB,MAAO,GACb,CAAK,EACD,IAAIvlG,EAAI,IAAIq8F,GAAO,IAAImJ,GAAc,IAAK,IAAK,GAAG,EAAGp6G,CAAC,EACtD,EAAE,WAAW,IAAI4U,CAAC,EAAGR,EAAE,GAAG,EAAGoD,EAAE,iBAAiB,YAAcc,GAAM,CAClE,IAAIhE,EAAI,CAAA,EACRA,EAAE,EAAIgE,EAAE,QAAUd,EAAE,YAAc,EAAI,EAAGlD,EAAE,EAAI,EAAEgE,EAAE,QAAUd,EAAE,cAAgB,EAAI,EACnF,IAAIqlF,EAAI,IAAIR,GACZQ,EAAE,cAAcvoF,EAAG,EAAE,MAAM,EAC3B,MAAMgC,EAAIumF,EAAE,iBAAiBxmF,EAAG,EAAE,EAClCC,EAAE,OAAS,GAAK,EAAE,oBAAoBA,EAAE,CAAC,EAAE,OAAO,IAAI,CACxD,CAAC,EAAGkB,EAAE,iBAAiB,YAAcc,GAAM,CACzC,IAAIhE,EAAI,CAAA,EACRA,EAAE,EAAIgE,EAAE,QAAUd,EAAE,YAAc,EAAI,EAAGlD,EAAE,EAAI,EAAEgE,EAAE,QAAUd,EAAE,cAAgB,EAAI,EACnF,IAAIqlF,EAAI,IAAIR,GACZQ,EAAE,cAAcvoF,EAAG,EAAE,MAAM,EAC3B,MAAMgC,EAAIumF,EAAE,iBAAiBxmF,EAAG,EAAE,EAClC,QAASymF,KAAKzmF,EACZymF,EAAE,SAAS,QAAU,IACvBxmF,EAAE,OAAS,IAAMA,EAAE,CAAC,EAAE,OAAO,SAAS,QAAU,GAClD,CAAC,CACH,CACA,SAASlC,EAAEzM,EAAG,CACZ,QAAS2rB,EAAI3rB,EAAI,GAAM,GAAI3H,EAAI,CAC7B,CACE,KAAM,QACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAIo8F,EAAU9oE,EAAG,EAAG,CAAC,CACpC,EACM,CACE,KAAM,OACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,EAAG,EAAG,CAAC9oE,CAAC,CACrC,EACM,CACE,KAAM,OACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,CAAC9oE,EAAG,EAAG,CAAC,CACrC,EACM,CACE,KAAM,QACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,EAAG,EAAG9oE,CAAC,CACpC,EACM,CACE,KAAM,MACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,EAAG9oE,EAAG,CAAC,CACpC,EACM,CACE,KAAM,SACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,EAAG,CAAC9oE,EAAG,CAAC,CACrC,CACA,EAAO1e,EAAI,CACL,CACE,KAAM,iBACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAIwnF,EAAU,CAAC9oE,EAAGA,EAAGA,CAAC,CACrC,EACM,CACE,KAAM,qBACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,CAAC9oE,EAAG,CAACA,EAAGA,CAAC,CACtC,EACM,CACE,KAAM,kBACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU9oE,EAAGA,EAAGA,CAAC,CACpC,EACM,CACE,KAAM,oBACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU9oE,EAAG,CAACA,EAAGA,CAAC,CACrC,EACM,CACE,KAAM,gBACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,CAAC9oE,EAAGA,EAAG,CAACA,CAAC,CACtC,EACM,CACE,KAAM,mBACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,CAAC9oE,EAAG,CAACA,EAAG,CAACA,CAAC,CACvC,EACM,CACE,KAAM,iBACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU9oE,EAAGA,EAAG,CAACA,CAAC,CACrC,EACM,CACE,KAAM,oBACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU9oE,EAAG,CAACA,EAAG,CAACA,CAAC,CACtC,CACA,EAAOhb,EAAI,CACL,CACE,KAAM,YACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8jF,EAAU9oE,EAAGA,EAAG,CAAC,CACpC,EACM,CACE,KAAM,YACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,EAAG9oE,EAAGA,CAAC,CACpC,EACM,CACE,KAAM,WACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,CAAC9oE,EAAGA,EAAG,CAAC,CACrC,EACM,CACE,KAAM,WACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,EAAG9oE,EAAG,CAACA,CAAC,CACrC,EACM,CACE,KAAM,eACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU9oE,EAAG,CAACA,EAAG,CAAC,CACrC,EACM,CACE,KAAM,eACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,EAAG,CAAC9oE,EAAGA,CAAC,CACrC,EACM,CACE,KAAM,cACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,CAAC9oE,EAAG,CAACA,EAAG,CAAC,CACtC,EACM,CACE,KAAM,cACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,EAAG,CAAC9oE,EAAG,CAACA,CAAC,CACtC,EACM,CACE,KAAM,cACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU9oE,EAAG,EAAGA,CAAC,CACpC,EACM,CACE,KAAM,aACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,CAAC9oE,EAAG,EAAGA,CAAC,CACrC,EACM,CACE,KAAM,YACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU,CAAC9oE,EAAG,EAAG,CAACA,CAAC,CACtC,EACM,CACE,KAAM,aACN,EAAG,GACH,EAAG,GACH,EAAG,GACH,MAAO,IAAI8oE,EAAU9oE,EAAG,EAAG,CAACA,CAAC,CACrC,CACA,EAAOhf,EAAI,EAAGA,EAAItU,EAAE,OAAQsU,IACtB+B,EAAE,KAAKiD,EAAEtZ,EAAEsU,CAAC,CAAC,CAAC,EAChB,QAASA,EAAI,EAAGA,EAAIM,EAAE,OAAQN,IAC5B+B,EAAE,KAAKiD,EAAE1E,EAAEN,CAAC,CAAC,CAAC,EAChB,QAASA,EAAI,EAAGA,EAAIgE,EAAE,OAAQhE,IAC5B+B,EAAE,KAAKiD,EAAEhB,EAAEhE,CAAC,CAAC,CAAC,CAClB,CACA,SAASgF,EAAE3R,EAAG,CACZ,MAAM2rB,EAAI,IAAI8mF,GAAczyG,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAAG3H,EAAI,IAAIuwG,GAAoB,CACtE,MAAO,OACP,YAAa,GACb,QAAS,GACf,CAAK,EAAG37F,EAAI,IAAIg8F,GAAS,EAAG,gBAAgBjpG,EAAE,MAAM,EAAGA,EAAE,MAAM,EAAGA,EAAE,MAAM,CAAC,EACvE,IAAI2Q,EAAIgb,EAAE,aAAa1e,CAAC,EAAGN,EAAI,IAAI28F,GAAO34F,EAAGtY,CAAC,EAC9C,OAAOsU,EAAE,KAAO3M,EAAE,KAAM,EAAE,WAAW,IAAI2M,CAAC,EAAGA,CAC/C,CACA,OAAO,EAAE,iBAAmB,UAAW,CACrC+uC,EAAE,aAAa,oBAAmB,CACpC,EAAG,EAAE,eAAiB,UAAW,CAC/B,GAAI,CACF,GAAI,CAACA,EAAE,SAAU,CACf,QAAQ,MAAM,SAAS,EACvB,MACF,CACAA,EAAE,SAAS,OAAO,EAAG,EAAE,MAAM,EAC7B,MAAM/vB,EAAI+vB,EAAE,SAAS,WAAW,UAAU,WAAW,EAAGrjD,EAAI,SAAS,cAAc,GAAG,EAAG4U,EAAqB,IAAI,KAAI,EAAI,cAAc,WAAW,QAAS,GAAG,EAC/J5U,EAAE,SAAW,cAAc4U,CAAC,OAAQ5U,EAAE,KAAOszB,EAAGtzB,EAAE,MAAK,EAAI,QAAQ,IAAI,OAAO,CAChF,OAAS2H,EAAG,CACV,QAAQ,MAAM,QAASA,CAAC,CAC1B,CACF,EAAG,EAAE,iBAAmB,UAAW,CACjC,MAAMA,EAAI,GAAK,SAAS,gBACxB,CAAC,SAAS,mBAAqB,CAAC,SAAS,yBAA2B,CAAC,SAAS,sBAAwB,CAAC,SAAS,qBAAuBA,EAAE,kBAAoBA,EAAE,kBAAiB,EAAKA,EAAE,wBAA0BA,EAAE,wBAAuB,EAAKA,EAAE,qBAAuBA,EAAE,uBAAyBA,EAAE,qBAAuBA,EAAE,oBAAmB,EAAI,QAAQ,IAAI,SAAS,IAAM,SAAS,eAAiB,SAAS,eAAc,EAAK,SAAS,qBAAuB,SAAS,uBAAyB,SAAS,oBAAsB,SAAS,oBAAmB,EAAK,SAAS,kBAAoB,SAAS,iBAAgB,EAAI,QAAQ,IAAI,SAAS,EACznB,EAAG,CACL,CACA,MAAM0yG,EAAG,CACP,OACA,SACA,YAAY,EAAG,CACb,KAAK,OAAS,CAChB,CACA,MAAO,CACL,KAAK,SAAWL,GAAG,KAAK,OAAQ,KAAK,OAAO,MAAO,KAAK,OAAO,SAAS,EAAG,KAAK,SAAS,KAAI,CAC/F,CAEA,cAAe,CACb,KAAK,SAAS,aAAY,CAC5B,CAEA,YAAY,EAAG,CACb,KAAK,SAAS,UAAU,CAAC,CAC3B,CAEA,MAAO,CACP,CACF,CACA,SAAS5uF,GAAGi4B,EAAG,CACb,IAAI,EAAI,IAAI,OACZ,OAAO,EAAE,eAAiB,UAAW,CACnC,IAAI,EAAIA,EAAE,OAAQ,EAAI,IAAI+4C,EAAU,IAAK,IAAK,IAAI,EAAG,EAAI,IAAIA,EAAU,KAAM,KAAM,KAAK,EACxF,EAAE,QAAS,GAAM,CACf,IAAIhoF,EAAI,EAAE,YAAY,IAAKkF,EAAI,EAAE,YAAY,IAC7ClF,EAAE,EAAI,EAAE,IAAM,EAAE,EAAIA,EAAE,GAAIA,EAAE,EAAI,EAAE,IAAM,EAAE,EAAIA,EAAE,GAAIA,EAAE,EAAI,EAAE,IAAM,EAAE,EAAIA,EAAE,GAAIkF,EAAE,EAAI,EAAE,IAAM,EAAE,EAAIA,EAAE,GAAIA,EAAE,EAAI,EAAE,IAAM,EAAE,EAAIA,EAAE,GAAIA,EAAE,EAAI,EAAE,IAAM,EAAE,EAAIA,EAAE,EAC1J,CAAC,EACD,IAAI9B,EAAI,KAAK,IAAI,EAAE,EAAG,EAAE,CAAC,EAAGqD,EAAI,KAAK,IAAI,EAAE,EAAG,EAAE,CAAC,EAAGxE,EAAI,KAAK,IAAI,EAAE,EAAG,EAAE,CAAC,EAAG,EAAI,KAAK,IAAI,EAAE,EAAG,EAAE,CAAC,EAAGyJ,EAAI,KAAK,IAAI,EAAE,EAAG,EAAE,CAAC,EAAGvJ,EAAI,KAAK,IAAI,EAAE,EAAG,EAAE,CAAC,EACjJ,MAAO,CACL,IAAK,IAAI6lF,EAAU5kF,EAAGqD,EAAGxE,CAAC,EAC1B,IAAK,IAAI+lF,EAAU,EAAGt8E,EAAGvJ,CAAC,CAChC,CACE,EAAG,EAAE,mBAAqB,SAAS,EAAG,CACpC,IAAI,EAAI,CAAA,EACR,OAAO8sC,EAAE,aAAa,OAAO,QAAS,GAAM,CAC1C,EAAE,KAAK,KAAK,QAAS,GAAM,CACzB,IAAIjlD,EAAI,EAAE,UACVoZ,EAAE,EAAGpZ,EAAG,CAAC,CACX,CAAC,CACH,CAAC,EAAG,EAAI,EAAE,OAAQ,GAAM,aAAa6yG,EAAM,EAAG,EAAE,iBAAiB,EAAG,EAAE,EACtE,SAASz5F,EAAE,EAAG,EAAGpZ,EAAG,CAClB,GAAI,GAAK,KACP,OACF,IAAI0hB,EAAI,IAAIs8E,EAAU,EAAE,IAAI,EAAI,MAAQ,EAAE,IAAI,EAAI,MAAQ,CAAC,EAAE,IAAI,EAAI,KAAM,EAAG,EAAI,IAAIA,EAAU,EAAE,IAAI,EAAI,MAAQ,EAAE,IAAI,EAAI,MAAQ,CAAC,EAAE,IAAI,EAAI,KAAM,EAAGz+E,EAAI,IAAIy+E,EAAU,KAAK,IAAIt8E,EAAE,EAAG,EAAE,CAAC,EAAG,KAAK,IAAIA,EAAE,EAAG,EAAE,CAAC,EAAG,KAAK,IAAIA,EAAE,EAAG,EAAE,CAAC,CAAC,EAAG1L,EAAI,IAAIgoF,EAAU,KAAK,IAAI,EAAE,EAAGt8E,EAAE,CAAC,EAAG,KAAK,IAAI,EAAE,EAAGA,EAAE,CAAC,EAAG,KAAK,IAAI,EAAE,EAAGA,EAAE,CAAC,CAAC,EAAGxG,EAAI,IAAIi+F,GAAO55F,EAAGvJ,CAAC,EAAG,EAAI,EAAE,IAAI,cAAckF,CAAC,EACrW,GAAI,EAAE,GAAK,MAAQ,GAAK,IACtB,GAAI,EAAE,UAAY,MAAQ,EAAE,SAAS,QAAU,GAC7C,GAAI,EAAE,UAAY,KAChB,QAASga,KAAK,EAAE,SAAU,CACxB,IAAItzB,EAAIqjD,EAAE,aAAa,WAAW,KAAMw5C,GAAMA,EAAE,KAAOz+F,EAAE,GAAG,GAAG,IAC/D,GAAI4B,GAAK,MAAQA,EAAE,SAASszB,CAAC,EAC3B,SACF,IAAI1e,EAAIyuC,EAAE,aAAa,kBAAkB,KAAMw5C,GAAMA,EAAE,KAAOz+F,EAAE,GAAG,GAAG,IACtE,GAAIwW,GAAK,MAAQA,EAAE,SAAS0e,CAAC,EAC3B,SACF,IAAIhf,EAAI+uC,EAAE,OAAO,KAAMw5C,GAAMA,EAAE,KAAOz+F,EAAE,GAAG,EAAE,SAAS,IAAIk1B,CAAC,EAC3Dhf,GAAK,MAAQ,CAACA,EAAE,UAAYA,EAAE,MAAM,IAAKgC,GAAMA,EAAE,IAAI,EAAE,QAASA,GAAM,CACpE,EAAE,KAAKA,CAAC,CACV,CAAC,CACH,MACG,CACL,GAAI,EAAE,UAAY,KAChB,QAASgd,KAAK,EAAE,SAAU,CACxB,IAAI1e,EAAIyuC,EAAE,aAAa,WAAW,KAAM/sC,GAAMA,EAAE,KAAOlY,EAAE,GAAG,GAAG,IAC/D,GAAIwW,GAAK,MAAQA,EAAE,SAAS0e,CAAC,EAC3B,SACF,IAAIhb,EAAI+qC,EAAE,aAAa,kBAAkB,KAAM/sC,GAAMA,EAAE,KAAOlY,EAAE,GAAG,GAAG,IACtE,GAAIka,GAAK,MAAQA,EAAE,SAASgb,CAAC,EAC3B,SACF,IAAIupE,EAAIx5C,EAAE,OAAO,KAAM/sC,GAAMA,EAAE,KAAOlY,EAAE,GAAG,EAAE,SAAS,IAAIk1B,CAAC,EAC3DupE,GAAK,MAAQ,CAACA,EAAE,UAAYA,EAAE,MAAM,IAAKC,GAAMA,EAAE,IAAI,EAAE,QAASA,GAAM,CACpE,EAAE,KAAKA,CAAC,CACV,CAAC,CACH,CACF,QAAS98F,KAAK,EAAE,SACdwX,EAAE,EAAGxX,EAAG5B,CAAC,CACb,CACJ,CACF,EAAG,CACL,CACA,MAAMk8G,EAAG,CACP,OAEA,UAAY,GACZ,WAAa,IAAI9d,GACjB,SAAW,IAAIA,GAEf,aAAe,KAEf,cAAgB,KAEhB,eACA,eACA,aACA,aACA,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,eAAiB,KAAK,YAAY,KAAK,IAAI,EAAG,KAAK,eAAiB,KAAK,YAAY,KAAK,IAAI,EAAG,KAAK,aAAe,KAAK,UAAU,KAAK,IAAI,EAAG,KAAK,aAAe,KAAK,UAAU,KAAK,IAAI,CACpN,CAKA,MAAO,CACL,KAAK,0BAAyB,EAAI,KAAK,OAAO,OAAS,KAAK,OAAO,QAAU,KAAK,OAAO,WAAa,KAAK,cAAgB,IAAIkc,GAC7H,KAAK,OAAO,OACZ,KAAK,OAAO,SACZ,KAAK,OAAO,KAClB,EACE,CAKA,QAAS,CACP,KAAK,OAAO,cAAc,UAAS,EACnC,MAAM,EAAI,KAAK,OAAO,UAAU,WAChC,IAAM,EAAE,iBAAiB,YAAa,KAAK,cAAc,EAAG,EAAE,iBAAiB,YAAa,KAAK,cAAc,EAAG,EAAE,iBAAiB,UAAW,KAAK,YAAY,EAAG,EAAE,MAAM,OAAS,aAAc,OAAO,iBAAiB,UAAW,KAAK,YAAY,CACzP,CAKA,WAAY,CACV,KAAK,OAAO,cAAc,OAAM,EAChC,MAAM,EAAI,KAAK,OAAO,UAAU,WAChC,IAAM,EAAE,oBAAoB,YAAa,KAAK,cAAc,EAAG,EAAE,oBAAoB,YAAa,KAAK,cAAc,EAAG,EAAE,oBAAoB,UAAW,KAAK,YAAY,EAAG,EAAE,MAAM,OAAS,WAAY,OAAO,oBAAoB,UAAW,KAAK,YAAY,EAAG,KAAK,WAAa,KAAK,WAAU,CACvS,CAKA,2BAA4B,CAC1B,KAAK,aAAe,SAAS,cAAc,KAAK,EAAG,KAAK,aAAa,MAAM,SAAW,WAAY,KAAK,aAAa,MAAM,OAAS,qBAAsB,KAAK,aAAa,MAAM,gBAAkB,yBAA0B,KAAK,aAAa,MAAM,cAAgB,OAAQ,KAAK,aAAa,MAAM,QAAU,OAAQ,KAAK,aAAa,MAAM,OAAS,OAAQ,KAAK,aAAa,MAAM,UAAY,aACpY,MAAM,EAAI,KAAK,OAAO,UAAU,WAChC,GAAK,EAAE,eAAiB,EAAE,cAAc,YAAY,KAAK,YAAY,CACvE,CAKA,YAAY,EAAG,CACb,EAAE,SAAW,GAAK,CAAC,KAAK,OAAO,UAAU,aAAe,KAAK,WAAW,IAAI,EAAE,QAAS,EAAE,OAAO,EAAG,KAAK,SAAS,KAAK,KAAK,UAAU,EAAG,KAAK,UAAY,GAAI,KAAK,eAAiB,KAAK,aAAa,MAAM,QAAU,QAAS,KAAK,qBAAoB,GAAK,EAAE,iBAAkB,EAAE,kBACpR,CAKA,YAAY,EAAG,CACb,CAAC,KAAK,WAAa,CAAC,KAAK,OAAO,UAAU,aAAe,KAAK,SAAS,IAAI,EAAE,QAAS,EAAE,OAAO,EAAG,KAAK,qBAAoB,EAAI,EAAE,eAAc,EAAI,EAAE,kBACvJ,CAKA,UAAU,EAAG,CACX,KAAK,YAAc,KAAK,WAAU,EAAI,KAAK,YAAW,EAAI,EAAE,eAAc,EAAI,EAAE,gBAAe,EAAI,KAAK,UAAS,EACnH,CAKA,UAAU,EAAG,CACX,EAAE,MAAQ,WAAa,KAAK,UAAS,EAAI,EAAE,eAAc,EAAI,EAAE,kBACjE,CAKA,YAAa,CACX,KAAK,YAAc,KAAK,UAAY,GAAI,KAAK,eAAiB,KAAK,aAAa,MAAM,QAAU,QAClG,CAKA,sBAAuB,CACrB,GAAI,CAAC,KAAK,cAAgB,CAAC,KAAK,OAAO,UAAU,WAAY,OAC7D,MAAMp6G,EAAI,KAAK,IAAI,KAAK,WAAW,EAAG,KAAK,SAAS,CAAC,EAAG6V,EAAI,KAAK,IAAI,KAAK,WAAW,EAAG,KAAK,SAAS,CAAC,EAAGnC,EAAI,KAAK,IAAI,KAAK,SAAS,EAAI,KAAK,WAAW,CAAC,EAAGwF,EAAI,KAAK,IAAI,KAAK,SAAS,EAAI,KAAK,WAAW,CAAC,EAC7M,KAAK,aAAa,MAAM,KAAO,GAAGlZ,CAAC,KAAM,KAAK,aAAa,MAAM,IAAM,GAAG6V,CAAC,KAAM,KAAK,aAAa,MAAM,MAAQ,GAAGnC,CAAC,KAAM,KAAK,aAAa,MAAM,OAAS,GAAGwF,CAAC,IAClK,CAKA,aAAc,CACZ,MAAM,EAAI,KAAK,IAAI,KAAK,SAAS,EAAI,KAAK,WAAW,CAAC,EAAG,EAAI,KAAK,IAAI,KAAK,SAAS,EAAI,KAAK,WAAW,CAAC,EACzG,GAAI,EAAI,GAAK,EAAI,EACf,OACF,GAAI,CAAC,KAAK,cAAe,CACvB,QAAQ,KAAK,wBAAwB,EACrC,MACF,CACA,MAAM,EAAI,KAAK,IAAI,KAAK,WAAW,EAAG,KAAK,SAAS,CAAC,EAAG,EAAI,KAAK,IAAI,KAAK,WAAW,EAAG,KAAK,SAAS,CAAC,EAAGA,EAAI,KAAK,IAAI,KAAK,WAAW,EAAG,KAAK,SAAS,CAAC,EAAGqD,EAAI,KAAK,IAAI,KAAK,WAAW,EAAG,KAAK,SAAS,CAAC,EAAGxE,EAAI,CAAA,EAAI,EAAI,CACxN,CAAE,EAAG,EAAG,EAAGmB,CAAC,EAEZ,CAAE,EAAG,EAAG,EAAGA,CAAC,EAEZ,CAAE,EAAG,EAAG,EAAGqD,CAAC,EAEZ,CAAE,EAAG,EAAG,EAAGA,CAAC,CAElB,EACI,UAAWtE,KAAK,EAAG,CACjB,MAAM,EAAI,KAAK,cAAc,cAAcA,EAAE,EAAGA,EAAE,CAAC,EACnD,GAAKF,EAAE,KAAK,CAAC,CACf,CACA,GAAIA,EAAE,OAAS,EAAG,CAChB,QAAQ,KAAK,gCAAgC,EAC7C,MACF,CACA,GAAIA,EAAE,OAAS,EAAG,CAChB,QAAQ,KAAK,4BAA4B,EACzC,MACF,CACA,MAAMyJ,EAAI,IAAIy3F,GACd,UAAWhhG,KAAKF,EACdyJ,EAAE,cAAcvJ,CAAC,EACnB,GAAIuJ,EAAE,UAAW,CACf,QAAQ,KAAK,wBAAwB,EACrC,MACF,CACA,KAAK,uBAAuBA,CAAC,CAC/B,CAKA,uBAAuB,EAAG,CACxB,MAAM,EAAI,KAAK,OAAO,OAAQ,EAAI,KAAK,OAAO,SAC9C,GAAI,CAAC,GAAK,CAAC,EAAG,CACZ,QAAQ,KAAK,wBAAwB,EACrC,MACF,CACA,MAAM,EAAI,IAAIs8E,EACd,EAAE,UAAU,CAAC,EACb,MAAM5kF,EAAI,IAAI4kF,EACd,EAAE,QAAQ5kF,CAAC,EACX,MAAMqD,EAAI,KAAK,IAAIrD,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAChC,GAAI,aAAaoiF,GAAqB,CACpC,MAAMvjF,EAAI,EAAE,KAAO,KAAK,GAAK,KAAMyJ,EAAIjF,GAAK,EAAI,KAAK,IAAIxE,EAAI,CAAC,GAAK,IAAK,EAAI,IAAI+lF,EAChF,EAAE,kBAAkB,CAAC,EACrB,MAAMz+E,EAAI,EAAE,MAAK,EAAG,IAAI,EAAE,QAAQ,EAClC,EAAE,IAAIA,EAAE,UAAS,CAAE,EAAI,GAAK,EAAE,OAAM,EACpC,MAAMrE,EAAI,EAAE,MAAK,EAAG,IAAI,EAAE,eAAewG,CAAC,CAAC,EAC3C,EAAE,SAAS,KAAKxG,CAAC,EAAG,EAAE,QAAU,EAAE,OAAO,KAAK,CAAC,EAAG,EAAE,OAAO,CAAC,EAAG,EAAE,OAAM,CACzE,SAAW,aAAaugF,GAAsB,CAC5C,MAAMz7F,EAAIyc,EAAI,IAAKiF,EAAI,KAAK,OAAO,UAAU,WAAY,EAAIA,EAAIA,EAAE,MAAQA,EAAE,OAAS,EACtF,EAAE,KAAO,CAAC1hB,EAAI,EAAI,EAAG,EAAE,MAAQA,EAAI,EAAI,EAAG,EAAE,IAAMA,EAAI,EAAG,EAAE,OAAS,CAACA,EAAI,EAAG,EAAE,uBAAsB,EACpG,MAAMuf,EAAI,IAAIy+E,EACd,EAAE,kBAAkBz+E,CAAC,EACrB,MAAMvJ,EAAIyG,EAAI,IAAKvB,EAAI,EAAE,MAAK,EAAG,IAAIqE,EAAE,eAAevJ,CAAC,CAAC,EACxD,EAAE,SAAS,KAAKkF,CAAC,EAAG,EAAE,QAAU,EAAE,OAAO,KAAK,CAAC,EAAG,EAAE,OAAO,CAAC,EAAG,EAAE,OAAM,CACzE,CACF,CACF,CACA,MAAMihG,EAAG,CACP,OACA,OAAS,KAET,YAAY,EAAG,CACb,KAAK,OAAS,CAChB,CACA,MAAO,CACP,CAKA,gBAAgB,EAAG,CACjB,KAAK,OAAO,OAAO,MAAQ,KAAK,OAAO,MAAM,IAAI,MAAM,QAAU,EAAI,QAAU,OACjF,CAKA,yBAAyB,EAAG,CAC1B,MAAM,EAAI,KAAK,OAAO,MAAM,SAAS,KAClC,GAAM,aAAarC,EAC1B,EACI,IAAM,EAAE,UAAY,EACtB,CAKA,qBAAqB,EAAG,CACtB,MAAM,EAAI,KAAK,OAAO,MAAM,SAAS,KAClC,GAAM,aAAaA,EAC1B,EACI,GAAK,EAAE,MAAM,IAAI,CAAC,CACpB,CAKA,6BAA6B,EAAG,CAC9B,MAAM,EAAI,KAAK,OAAO,MAAM,SAAS,KAClC,GAAM,aAAaD,EAC1B,EACI,IAAM,EAAE,UAAY,EACtB,CAKA,yBAAyB,EAAG,CAC1B,MAAM,EAAI,KAAK,OAAO,MAAM,SAAS,KAClC,GAAM,aAAaA,EAC1B,EACI,GAAK,EAAE,MAAM,IAAI,CAAC,CACpB,CAKA,iBAAiB,EAAG,CAClB,MAAM,EAAI,KAAK,OAAO,MAAM,SAAS,KAClC,GAAM,aAAaA,EAC1B,EACI,GAAI,GAAG,OAAQ,CACb,MAAMjmG,EAAI,CACR,IAAK,KACL,OAAQ,KACR,KAAM,KACN,MAAO,IACf,EAAQ,CAAC,EACH,EAAE,OAAO,QAAQ,MAAQA,EAAG,EAAE,OAAO,QAAQ,OAASA,EAAG,EAAE,OAAO,KAAK,QAAO,EAAI,EAAE,OAAO,IAAM,IACnG,CACF,CAKA,0BAA0B,EAAG,CAC3B,MAAM,EAAI,KAAK,OAAO,MAAM,SAAS,KAClC,GAAM,aAAaimG,EAC1B,EACI,IAAM,EAAE,WAAa,GAAI,KAAK,OAAO,WAAa,KAAK,OAAO,SAAS,UAAU,QAAU,EAC7F,CAKA,eAAe,EAAG,CAChB,GAAI,CAAC,KAAK,OAAO,gBAAgB,SAAU,CACzC,QAAQ,KAAK,0BAA0B,EACvC,MACF,CACA,MAAM,EAAI,KAAK,OAAO,eAAe,SAAU,EAAI,EAAE,OAAO,KAAM,GAAM,aAAarW,EAAE,EACvF,GAAI,EACF,GAAI,EACF,EAAE,QAAU,OACT,CACH,KAAM,CAAE,MAAO,EAAG,OAAQpqF,CAAC,EAAK,KAAK,OAAO,aAAa,mBAAoBqD,EAAI,IAAI+mF,GACnF,KAAK,OAAO,MACZ,KAAK,OAAO,OACZ,EACApqF,CACV,EACQqD,EAAE,OAAS+mF,GAAG,OAAO,QAAS/mF,EAAE,eAAiB,GAAKA,EAAE,oBAAsBA,EAAE,mBAAmB,CACjG,OAAQ,EACR,iBAAkB,EAClB,UAAW,EACX,MAAO,EACP,gBAAiB,EACjB,kBAAmB,EAC7B,CAAS,EACD,MAAMxE,EAAI,EAAE,OAAO,UAChB,GAAM,EAAE,YAAY,OAAS,YACxC,EACQ,EAAE,OAAO,OAAOA,EAAI,EAAG,EAAGwE,CAAC,CAC7B,MACG,IAAM,EAAE,QAAU,GACzB,CAKA,mBAAmB,EAAG,CACpB,GAAI,CAAC,KAAK,OAAO,gBAAgB,eAAgB,CAC/C,QAAQ,KAAK,iCAAiC,EAC9C,MACF,CACA,KAAK,OAAO,eAAe,eAAe,SAAS,WAAW,MAAQ,CACxE,CAKA,iBAAiB,EAAG,CAClB,GAAI,CAAC,KAAK,OAAO,gBAAgB,eAAgB,CAC/C,QAAQ,KAAK,iCAAiC,EAC9C,MACF,CACA,KAAK,OAAO,eAAe,eAAe,SAAS,SAAS,MAAQ,CACtE,CAMA,iBAAiB,EAAG,EAAG,CACrB,GAAI,EACF,GAAI,KAAK,OACP,KAAK,OAAO,QAAU,OACnB,CACH,MAAM,EAAI,GAAG,MAAQ,IAAK,EAAI,GAAG,OAAS,QAASrD,EAAI,GAAG,SAAW,GAAKqD,EAAI,IAAI2/F,GAAgB,EAAG,CAAC,EAAGnkG,EAAI,IAAI06F,GAAuB,CACtI,MAAO,EACP,YAAa,GACb,QAASv5F,EACT,KAAMw5F,EAChB,CAAS,EACD,KAAK,OAAS,IAAIC,GAAOp2F,EAAGxE,CAAC,EAAG,KAAK,OAAO,SAAS,EAAI,CAAC,KAAK,GAAK,EAAG,KAAK,OAAO,SAAS,EAAI,EAAG,KAAK,OAAO,cAAgB,GAAI,KAAK,OAAO,KAAO,SAAU,KAAK,OAAO,MAAM,IAAI,KAAK,MAAM,CACnM,MACG,KAAK,SAAW,KAAK,OAAO,QAAU,GAC7C,CAKA,iBAAiB,EAAG,CAClB,GAAK,KAAK,OAAO,MAAM,WAAa,EAAG,KAAK,OAAO,MAAM,YAAc,IAAM,KAAK,OAAO,MAAM,WAAa,KAAM,KAAK,OAAO,MAAM,YAAc,KACpJ,CACF,CACA,SAASokG,IAAK,CACZ,MAAO,uCAAuC,QAAQ,QAAS,SAASp3D,EAAG,CACzE,IAAI,EAAI,KAAK,OAAM,EAAK,GAAK,EAAG,EAAIA,GAAK,IAAM,EAAI,EAAI,EAAI,EAC3D,OAAO,EAAE,SAAS,EAAE,CACtB,CAAC,CACH,CACA,MAAMq3D,EAAG,CACP,OACA,cACA,QACA,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,cAAgBne,GAAG,CAAC,EAAG,KAAK,cAAc,KAAK,KAAM,IAAI,EAAG,KAAK,QAAU,CAE/F,KAAM,IAEN,UAAW,CACjB,CACE,CAEA,YAAa,CACX,OAAO,KAAK,OACd,CAEA,YAAY,EAAG,CACb,KAAK,QAAU,CACjB,CACA,QAAS,CACP,KAAK,cAAc,OAAM,CAC3B,CACA,WAAY,CACV,KAAK,cAAc,UAAS,CAC9B,CAEA,eAAe,EAAG,EAAG,CACnB,GAAI,GAAK,KACP,OAAO,KACT,IAAI,EAAI,KAAK,QAAQ,KAAM,EAAI,EAC/B,OAAO,GAAK,EAAI,GAAK,KAAO,EAAI,EAAI,IAAM,GAAK,KAAO,EAAI,EAAI,IAAM,GAAK,KAAO,EAAI,EAAI,GAAK,GAAK,IAAM,EAAI,EAAI,EAAI,GAAK,OAAS,EAAI,EAAI,MAAQ,GAAK,IAAM,GAAK,KAAO,EAAI,EAAI,IAAM,IAAM,GAAK,KAAO,EAAI,EAAI,IAAM,IAAM,GAAK,KAAO,EAAI,EAAI,GAAK,GAAK,GAAK,IAAM,EAAI,EAAI,EAAI,EAAI,GAAK,OAAS,EAAI,EAAI,KAAO,MAAO,EAAI,EAAI,KAAM,EAAE,QAAQ,KAAK,QAAQ,SAAS,EAAI,IAAM,CACpX,CAEA,iCAAkC,CAChC,IAAI,EAAI,KAAK,OAAO,QAAQ,eAC5B,QAAS,KAAK,EACZ,EAAE,CAAC,EAAE,QAAS,GAAM,CAClB,EAAE,WAAa,KAAO,EAAE,UAAY,GAAI,EAAE,UAAU,UAAU,OAAO,OAAO,EAAG,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,UAAU,OAAO,OAAO,EACpJ,CAAC,CACL,CAEA,kBAAmB,CACjB,KAAK,gCAA+B,EACpC,IAAI,EAAI,KAAK,OAAO,QAAQ,eAC5B,QAAS,KAAK,EACZ,QAAS,EAAI,EAAE,CAAC,EAAE,OAAS,EAAG,GAAK,EAAG,IAAK,CACzC,IAAI,EAAI,EAAE,CAAC,EAAE,CAAC,EACd,EAAE,UAAY,KAAO,EAAE,UAAU,OAAM,EAAI,EAAE,CAAC,EAAE,OAAO,EAAG,CAAC,EAC7D,CACF,KAAK,OAAO,QAAQ,eAAc,CACpC,CAEA,qBAAsB,CACpB,IAAI,EAAI,KAAK,OAAO,QAAQ,eAC5B,QAAS,KAAK,EACZ,QAAS,EAAI,EAAE,CAAC,EAAE,OAAS,EAAG,GAAK,EAAG,IAAK,CACzC,IAAI,EAAI,EAAE,CAAC,EAAE,CAAC,EACd,EAAE,WAAa,KAAO,EAAE,UAAU,OAAM,EAAI,EAAE,CAAC,EAAE,OAAO,EAAG,CAAC,EAC9D,CACJ,CACA,gBAAiB,CACf,IAAI,EAAI,KAAK,OAAO,QAAQ,eAC5B,QAAS,KAAK,EACZ,EAAE,CAAC,EAAE,QAAS,GAAM,CAClB,EAAE,UAAY,GAAI,EAAE,UAAU,UAAU,OAAO,OAAO,EAAG,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,UAAU,OAAO,OAAO,CAC9H,CAAC,CACL,CAEA,sBAAuB,CACrB,IAAI,EAAI,KACR,KAAK,OAAO,QAAQ,eAAe,iBAAiB,QAAS50F,GAAM,CACjE2R,EAAE3R,CAAC,CACL,CAAC,EAAG,KAAK,OAAO,QAAQ,eAAe,oBAAoB,QAASA,GAAM,CACxEyM,EAAEzM,CAAC,CACL,CAAC,EAAG,KAAK,OAAO,QAAQ,eAAe,qBAAqB,QAASA,GAAM,CACzEgW,EAAEhW,CAAC,CACL,CAAC,EAAG,KAAK,OAAO,QAAQ,eAAe,gBAAgB,QAASA,GAAM,CACpEvJ,EAAEuJ,CAAC,CACL,CAAC,EAAG,KAAK,OAAO,QAAQ,eAAe,eAAe,QAASA,GAAM,CACnEmY,EAAEnY,CAAC,CACL,CAAC,EAAG,KAAK,OAAO,QAAQ,eAAe,gBAAgB,QAASA,GAAM,CACpE4O,EAAE5O,CAAC,CACL,CAAC,EACD,SAASvJ,EAAEuJ,EAAG,CACZ,GAAIA,EAAE,WAAa,KAAM,CACvB,IAAIo1F,EAAI,CACN,2BACA,kDAEA,kDAEA,kDAEA,gGAEA,gGAEA,kEACA,iEAAmEp1F,EAAE,KAAO,UAC5E,QACV,EAAU,KAAK,EAAE,EACTA,EAAE,UAAY,SAAS,cAAc,KAAK,EAAGA,EAAE,UAAU,UAAY,mBAAoBA,EAAE,UAAU,GAAKA,EAAE,GAAIA,EAAE,UAAU,MAAM,cAAgB,OAAQA,EAAE,UAAU,UAAYo1F,EAAG,EAAE,OAAO,QAAQ,oBAAoB,YAAYp1F,EAAE,SAAS,EAAGA,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,iBAAiB,QAAS,UAAW,CAClU,EAAE,iBAAkBA,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,UAAU,IAAI,OAAO,EAAGA,EAAE,UAAY,GAAI,EAAE,OAAO,OAAO,QAAQwwG,GAAG,aAAcxwG,CAAC,CACrJ,CAAC,CACH,CACA,IAAI2rB,EAAI,IAAIolF,GAAG,EAAE,OAAO,OAAQ,EAAE,OAAO,SAAU,EAAE,OAAO,KAAK,EAAE,cAAc/wG,EAAE,MAAM,EAAG3H,EAAI,IAAI04G,GAAG,EAAE,OAAO,OAAQ,EAAE,OAAO,SAAU,EAAE,OAAO,KAAK,EAAE,cAAc/wG,EAAE,MAAM,EAAGiN,EAAI,IAAI8jG,GAAG,EAAE,OAAO,OAAQ,EAAE,OAAO,SAAU,EAAE,OAAO,KAAK,EAAE,cAAc/wG,EAAE,MAAM,EAAG2Q,EAAI,EAAE,OAAO,wBAAwB,KAAMhE,EAAI,EAAE,OAAO,wBAAwB,IAC5Vgf,EAAE,GAAKhb,EAAGgb,EAAE,GAAKhf,EAAGtU,EAAE,GAAKsY,EAAGtY,EAAE,GAAKsU,EAAGM,EAAE,GAAK0D,EAAG1D,EAAE,GAAKN,EACzD,IAAIuoF,EAAIl1F,EAAE,UACVk1F,EAAE,qBAAqB,QAAQ,EAAE,CAAC,EAAE,aAAa,KAAMvpE,EAAE,CAAC,EAAGupE,EAAE,qBAAqB,QAAQ,EAAE,CAAC,EAAE,aAAa,KAAMvpE,EAAE,CAAC,EAAGupE,EAAE,qBAAqB,QAAQ,EAAE,CAAC,EAAE,aAAa,KAAM78F,EAAE,CAAC,EAAG68F,EAAE,qBAAqB,QAAQ,EAAE,CAAC,EAAE,aAAa,KAAM78F,EAAE,CAAC,EAAG68F,EAAE,qBAAqB,QAAQ,EAAE,CAAC,EAAE,aAAa,KAAMjoF,EAAE,CAAC,EAAGioF,EAAE,qBAAqB,QAAQ,EAAE,CAAC,EAAE,aAAa,KAAMjoF,EAAE,CAAC,EAAGioF,EAAE,qBAAqB,UAAU,EAAE,CAAC,EAAE,aAAa,SAAUvpE,EAAE,EAAI,IAAMA,EAAE,EAAI,IAAMtzB,EAAE,EAAI,IAAMA,EAAE,CAAC,EAAG68F,EAAE,qBAAqB,UAAU,EAAE,CAAC,EAAE,aAAa,SAAU78F,EAAE,EAAI,IAAMA,EAAE,EAAI,IAAM4U,EAAE,EAAI,IAAMA,EAAE,CAAC,EACzjB,IAAI0B,EAAItW,EAAE,EAAG88F,EAAI98F,EAAE,EAAI,GACvB68F,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKvmF,EAAI,EAAE,EAAGumF,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKC,EAAI,IAAI,EAAGD,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKvmF,CAAC,EAAGumF,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKC,EAAI,CAAC,EAAGD,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,UAAYl1F,EAAE,KAAMk1F,EAAE,MAAM,IAAM,MAAOA,EAAE,MAAM,KAAO,KAC5U,CACA,SAAS/8E,EAAEnY,EAAG,CACZ,GAAIA,EAAE,WAAa,KAAM,CACvB,IAAIs1F,EAAI,CACN,2BACA,4GAEA,yFAEA,kEACA,iEAAmE,EAAE,eAAet1F,EAAE,KAAM,CAAC,EAAI,UACjG,QACV,EAAU,KAAK,EAAE,EACTA,EAAE,UAAY,SAAS,cAAc,KAAK,EAAGA,EAAE,UAAU,UAAY,kBAAmBA,EAAE,UAAU,GAAKA,EAAE,GAAIA,EAAE,UAAU,UAAYs1F,EAAG,EAAE,OAAO,QAAQ,oBAAoB,YAAYt1F,EAAE,SAAS,EAAGA,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,iBAAiB,QAAS,UAAW,CACvR,EAAE,iBAAkBA,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,UAAU,IAAI,OAAO,EAAGA,EAAE,UAAY,GAAI,EAAE,OAAO,OAAO,QAAQwwG,GAAG,aAAcxwG,CAAC,CACrJ,CAAC,CACH,CACA,GAAI,CAACA,EAAE,QAAUA,EAAE,OAAO,OAAS,EACjC,OACF,IAAI2rB,EAAI,EAAE,OAAO,wBAAwB,KAAMtzB,EAAI,EAAE,OAAO,wBAAwB,IAAK4U,EAAI,CAAA,EAAI0D,EAAI,EAAGhE,EAAI,EAC5G,QAAS2oF,EAAI,EAAGA,EAAIt1F,EAAE,OAAO,OAAQs1F,IAAK,CACxC,IAAIE,EAAI,IAAIub,GAAG,EAAE,OAAO,OAAQ,EAAE,OAAO,SAAU,EAAE,OAAO,KAAK,EAAE,cAAc/wG,EAAE,OAAOs1F,CAAC,CAAC,EAC5FE,EAAE,GAAK7pE,EAAG6pE,EAAE,GAAKn9F,EAAG4U,EAAE,KAAKuoF,CAAC,EAAG7kF,GAAK6kF,EAAE,EAAG7oF,GAAK6oF,EAAE,CAClD,CACA7kF,EAAIA,EAAI1D,EAAE,OAAQN,EAAIA,EAAIM,EAAE,OAC5B,IAAIioF,EAAIjoF,EAAE,IAAKqoF,GAAMA,EAAE,EAAI,IAAMA,EAAE,CAAC,EAAE,KAAK,GAAG,EAAG3mF,EAAI3O,EAAE,UACvD2O,EAAE,qBAAqB,SAAS,EAAE,CAAC,EAAE,aAAa,SAAUumF,CAAC,EAAGvmF,EAAE,qBAAqB,UAAU,EAAE,CAAC,EAAE,aAAa,SAAUumF,CAAC,EAC9H,IAAIC,EAAIxkF,EAAGykF,EAAIzoF,EACfgC,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKwmF,EAAI,EAAE,EAAGxmF,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKymF,EAAI,IAAI,EAAGzmF,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKwmF,CAAC,EAAGxmF,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKymF,EAAI,CAAC,EAAGzmF,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,UAAY,EAAE,eAAe3O,EAAE,KAAM,CAAC,EAAG2O,EAAE,MAAM,IAAM,MAAOA,EAAE,MAAM,KAAO,KACjW,CACA,SAASC,EAAE5O,EAAG,CACZ,GAAIA,EAAE,WAAa,KAAM,CACvB,IAAIm1F,EAAI,CACN,2BACA,SACA,2BAA6Bn1F,EAAE,GAAK,kGACpC,8DAEA,YACA,UACA,4FAA8FA,EAAE,GAAK,uCAErG,mEACA,iEAAmEA,EAAE,KAAO,UAC5E,QACV,EAAU,KAAK,EAAE,EACTA,EAAE,UAAY,SAAS,cAAc,KAAK,EAAGA,EAAE,UAAU,UAAY,mBAAoBA,EAAE,UAAU,GAAKA,EAAE,GAAIA,EAAE,UAAU,UAAYm1F,EAAG,EAAE,OAAO,QAAQ,oBAAoB,YAAYn1F,EAAE,SAAS,EAAGA,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,iBAAiB,QAAS,UAAW,CACxR,EAAE,iBAAkBA,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,UAAU,IAAI,OAAO,EAAGA,EAAE,UAAY,GAAI,EAAE,OAAO,OAAO,QAAQwwG,GAAG,aAAcxwG,CAAC,CACrJ,CAAC,CACH,CACA,IAAI2rB,EAAI,IAAIolF,GAAG,EAAE,OAAO,OAAQ,EAAE,OAAO,SAAU,EAAE,OAAO,KAAK,EAAE,cAAc/wG,EAAE,MAAM,EAAG3H,EAAI,IAAI04G,GAAG,EAAE,OAAO,OAAQ,EAAE,OAAO,SAAU,EAAE,OAAO,KAAK,EAAE,cAAc/wG,EAAE,MAAM,EAAGiN,EAAI,EAAE,OAAO,wBAAwB,KAAM0D,EAAI,EAAE,OAAO,wBAAwB,IACpQgb,EAAE,GAAK1e,EAAG0e,EAAE,GAAKhb,EAAGtY,EAAE,GAAK4U,EAAG5U,EAAE,GAAKsY,EACrC,IAAIhE,EAAI3M,EAAE,UACV2M,EAAE,qBAAqB,UAAU,EAAE,CAAC,EAAE,aAAa,SAAUgf,EAAE,EAAI,IAAMA,EAAE,EAAI,IAAMtzB,EAAE,EAAI,IAAMA,EAAE,CAAC,EACpG,IAAI68F,GAAKvpE,EAAE,EAAItzB,EAAE,GAAK,EAAGsW,GAAKgd,EAAE,EAAItzB,EAAE,GAAK,EAAI,GAC/CsU,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKuoF,EAAI,EAAE,EAAGvoF,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKgC,EAAI,IAAI,EAAGhC,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKuoF,CAAC,EAAGvoF,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKgC,EAAI,CAAC,EAAGhC,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,UAAY3M,EAAE,KAAM2M,EAAE,MAAM,IAAM,MAAOA,EAAE,MAAM,KAAO,KAC5U,CACA,SAASqJ,EAAEhW,EAAG,CACZ,GAAIA,EAAE,WAAa,KAAM,CACvB,IAAIo1F,EAAI,CACN,2BACA,gDACA,qEACA,qEAAuE,EAAE,eAAep1F,EAAE,MAAO,CAAC,EAAI,UACtG,qEACA,oEAAsE,EAAE,eAAe,CAACA,EAAE,MAAO,CAAC,EAAI,UACtG,oEACA,oEAAsE,EAAE,eAAeA,EAAE,MAAO,CAAC,EAAI,UACrG,QACV,EAAU,KAAK,EAAE,EACTA,EAAE,UAAY,SAAS,cAAc,KAAK,EAAGA,EAAE,UAAU,UAAY,wBAAyBA,EAAE,UAAU,GAAKA,EAAE,GAAIA,EAAE,UAAU,MAAM,SAAW,WAAYA,EAAE,UAAU,MAAM,cAAgB,OAAQA,EAAE,UAAU,UAAYo1F,EAAG,EAAE,OAAO,QAAQ,oBAAoB,YAAYp1F,EAAE,SAAS,EAAGA,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,iBAAiB,QAAS,UAAW,CAChX,EAAE,iBAAkBA,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,UAAU,IAAI,OAAO,EAAGA,EAAE,UAAY,GAAI,EAAE,OAAO,OAAO,QAAQwwG,GAAG,aAAcxwG,CAAC,CACrJ,CAAC,CACH,CACA,IAAI2rB,EAAI3rB,EAAE,UAAW3H,EAAI,IAAI04G,GAAG,EAAE,OAAO,OAAQ,EAAE,OAAO,SAAU,EAAE,OAAO,KAAK,EAAE,cAAc/wG,EAAE,KAAK,EAAGiN,EAAI,EAAE,OAAO,wBAAwB,KAAM0D,EAAI,EAAE,OAAO,wBAAwB,IAC5LtY,EAAE,GAAK4U,EAAG5U,EAAE,GAAKsY,EAAGgb,EAAE,MAAM,IAAM,MAAOA,EAAE,MAAM,KAAO,MACxD,IAAIhf,EAAIgf,EAAE,qBAAqB,QAAQ,EAAE,CAAC,EAC1Chf,IAAMA,EAAE,aAAa,KAAMtU,EAAE,CAAC,EAAGsU,EAAE,aAAa,KAAMtU,EAAE,CAAC,GACzD,IAAI68F,EAAIvpE,EAAE,qBAAqB,MAAM,EAAGhd,EAAIgd,EAAE,qBAAqB,MAAM,EAAGwpE,EAAI,IAChFD,EAAE,CAAC,IAAMA,EAAE,CAAC,EAAE,aAAa,IAAK78F,EAAE,EAAI,EAAE,EAAG68F,EAAE,CAAC,EAAE,aAAa,IAAK78F,EAAE,EAAI,GAAK88F,CAAC,GAAIxmF,EAAE,CAAC,IAAMA,EAAE,CAAC,EAAE,aAAa,IAAKtW,EAAE,EAAI,GAAK,EAAE,EAAGsW,EAAE,CAAC,EAAE,aAAa,IAAKtW,EAAE,EAAI,GAAK,GAAK88F,CAAC,GAAID,EAAE,CAAC,IAAMA,EAAE,CAAC,EAAE,aAAa,IAAK78F,EAAE,EAAI,EAAE,EAAG68F,EAAE,CAAC,EAAE,aAAa,IAAK78F,EAAE,EAAI,GAAK,GAAK88F,CAAC,GAAIxmF,EAAE,CAAC,IAAMA,EAAE,CAAC,EAAE,aAAa,IAAKtW,EAAE,EAAI,GAAK,EAAE,EAAGsW,EAAE,CAAC,EAAE,aAAa,IAAKtW,EAAE,EAAI,GAAK,GAAK88F,CAAC,GAAID,EAAE,CAAC,IAAMA,EAAE,CAAC,EAAE,aAAa,IAAK78F,EAAE,EAAI,EAAE,EAAG68F,EAAE,CAAC,EAAE,aAAa,IAAK78F,EAAE,EAAI,GAAK,GAAK88F,CAAC,GAAIxmF,EAAE,CAAC,IAAMA,EAAE,CAAC,EAAE,aAAa,IAAKtW,EAAE,EAAI,GAAK,EAAE,EAAGsW,EAAE,CAAC,EAAE,aAAa,IAAKtW,EAAE,EAAI,GAAK,GAAK88F,CAAC,GAAIxmF,EAAE,CAAC,IAAMA,EAAE,CAAC,EAAE,UAAY,MAAQ,EAAE,eAAe3O,EAAE,MAAO,CAAC,GAAI2O,EAAE,CAAC,IAAMA,EAAE,CAAC,EAAE,UAAY,MAAQ,EAAE,eAAe,CAAC3O,EAAE,MAAO,CAAC,GAAI2O,EAAE,CAAC,IAAMA,EAAE,CAAC,EAAE,UAAY,MAAQ,EAAE,eAAe3O,EAAE,MAAO,CAAC,EACttB,CACA,SAASyM,EAAEzM,EAAG,CACZ,GAAIA,EAAE,WAAa,KAAM,CACvB,IAAI2M,EAAI,CACN,mDACA,kEACA,iEAAmE,EAAE,eAAe3M,EAAE,KAAM,CAAC,EAAI,UACjG,gHACA,QACV,EAAU,KAAK,EAAE,EACTA,EAAE,UAAY,SAAS,cAAc,KAAK,EAAGA,EAAE,UAAU,UAAY,uBAAwBA,EAAE,UAAU,GAAKA,EAAE,GAAIA,EAAE,UAAU,MAAM,SAAW,WAAYA,EAAE,UAAU,MAAM,cAAgB,OAAQA,EAAE,UAAU,UAAY2M,EAAG,EAAE,OAAO,QAAQ,oBAAoB,YAAY3M,EAAE,SAAS,EAAGA,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,iBAAiB,QAAS,UAAW,CAC/W,EAAE,iBAAkBA,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,UAAU,IAAI,OAAO,EAAGA,EAAE,UAAY,GAAI,EAAE,OAAO,OAAO,QAAQwwG,GAAG,aAAcxwG,CAAC,CACrJ,CAAC,CACH,CACA,IAAI2rB,EAAI3rB,EAAE,UAAW3H,EAAI,IAAI04G,GAAG,EAAE,OAAO,OAAQ,EAAE,OAAO,SAAU,EAAE,OAAO,KAAK,EAAE,cAAc/wG,EAAE,KAAK,EAAGiN,EAAI,EAAE,OAAO,wBAAwB,KAAM0D,EAAI,EAAE,OAAO,wBAAwB,IAC5Lgb,EAAE,MAAM,IAAMtzB,EAAE,EAAIsY,EAAI,GAAK,KAAMgb,EAAE,MAAM,KAAOtzB,EAAE,EAAI4U,EAAI,GAAK,KAAM0e,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,UAAY,EAAE,eAAe3rB,EAAE,KAAM,CAAC,CACjJ,CACA,SAAS2R,EAAE3R,EAAG,CACZ,GAAIA,EAAE,WAAa,KAAM,CACvB,IAAIk1F,EAAI,CACN,2BACA,kDACA,kDACA,mGACA,kEACA,iEAAmE,EAAE,eAAel1F,EAAE,KAAM,CAAC,EAAI,UACjG,QACV,EAAU,KAAK,EAAE,EACTA,EAAE,UAAY,SAAS,cAAc,KAAK,EAAGA,EAAE,UAAU,UAAY,oBAAqBA,EAAE,UAAU,GAAKA,EAAE,GAAIA,EAAE,UAAU,UAAYk1F,EAAG,EAAE,OAAO,QAAQ,oBAAoB,YAAYl1F,EAAE,SAAS,EAAGA,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,iBAAiB,QAAS,UAAW,CACzR,EAAE,iBAAkBA,EAAE,UAAU,qBAAqB,KAAK,EAAE,CAAC,EAAE,UAAU,IAAI,OAAO,EAAGA,EAAE,UAAY,GAAI,EAAE,OAAO,OAAO,QAAQwwG,GAAG,aAAcxwG,CAAC,CACrJ,CAAC,CACH,CACA,IAAI2rB,EAAI3rB,EAAE,UACV,GAAIA,EAAE,QAAU,MAAQA,EAAE,QAAU,KAAM,CACxC2rB,EAAE,MAAM,QAAU,OAClB,MACF,MACEA,EAAE,MAAM,QAAU,QACpB,IAAItzB,EAAI,IAAI04G,GAAG,EAAE,OAAO,OAAQ,EAAE,OAAO,SAAU,EAAE,OAAO,KAAK,EAAE,cAAc/wG,EAAE,MAAM,EAAGiN,EAAI,IAAI8jG,GAAG,EAAE,OAAO,OAAQ,EAAE,OAAO,SAAU,EAAE,OAAO,KAAK,EAAE,cAAc/wG,EAAE,MAAM,EAAG2Q,EAAI,EAAE,OAAO,wBAAwB,KAAMhE,EAAI,EAAE,OAAO,wBAAwB,IACpQtU,EAAE,GAAKsY,EAAGtY,EAAE,GAAKsU,EAAGM,EAAE,GAAK0D,EAAG1D,EAAE,GAAKN,EAAGgf,EAAE,qBAAqB,UAAU,EAAE,CAAC,EAAE,aAAa,SAAUtzB,EAAE,EAAI,IAAMA,EAAE,EAAI,IAAM4U,EAAE,EAAI,IAAMA,EAAE,CAAC,EAAG0e,EAAE,qBAAqB,QAAQ,EAAE,CAAC,EAAE,aAAa,KAAMtzB,EAAE,CAAC,EAAGszB,EAAE,qBAAqB,QAAQ,EAAE,CAAC,EAAE,aAAa,KAAMtzB,EAAE,CAAC,EAAGszB,EAAE,qBAAqB,QAAQ,EAAE,CAAC,EAAE,aAAa,KAAM1e,EAAE,CAAC,EAAG0e,EAAE,qBAAqB,QAAQ,EAAE,CAAC,EAAE,aAAa,KAAM1e,EAAE,CAAC,EAAG0e,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKtzB,EAAE,EAAI,GAAM4U,EAAE,EAAI,GAAM,EAAE,EAAG0e,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKtzB,EAAE,EAAI,GAAM4U,EAAE,EAAI,GAAM,IAAI,EAAG0e,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKtzB,EAAE,EAAI,GAAM4U,EAAE,EAAI,GAAM,GAAK,EAAE,EAAG0e,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,aAAa,IAAKtzB,EAAE,EAAI,GAAM4U,EAAE,EAAI,GAAM,GAAK,IAAI,EAAG0e,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,UAAY,EAAE,eAAe3rB,EAAE,KAAM,CAAC,EAAG2rB,EAAE,MAAM,IAAM,MAAOA,EAAE,MAAM,KAAO,KACt0B,CACF,CACF,CACA,MAAMqnF,EAAG,CACP,OACA,SAAW,GACX,MACA,OAAS,CAAA,EACT,SACA,SAAW,EACX,KAAO,QACP,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,MAAQ,IAAID,GAAG,CAAC,CACxC,CAEA,QAAS,CACP,KAAK,OAAO,QAAQ,MAAM,gCAA+B,EAAI,KAAK,SAAW,GAAI,KAAK,SAAW,KAAK,OAAO,cAAe,KAAK,SAAS,KAAK,IAAI,EAAG,KAAK,SAAS,OAAM,EAC1K,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAM,GAAM,EAAE,UAAY,EAAE,EACxF,GAAK,OAAS,EAAE,SAAW,GAC7B,CAEA,WAAY,CACV,KAAK,SAAW,GAAI,KAAK,UAAU,UAAS,CAC9C,CAEA,gBAAiB,CACf,KAAK,OAAS,CAAA,CAChB,CAEA,aAAa,EAAG,CACd,KAAK,SAAW,CAClB,CAEA,cAAc,EAAG,CACf,KAAK,KAAO,CACd,CACA,iBAAiB,EAAG,CAClB,GAAI,CAAC,MAAM,QAAQ,CAAC,GAAK,EAAE,SAAW,EACpC,OAAO,KACT,IAAI,EAAI,OAAO,kBAAmB,EAAI,OAAO,kBAC7C,QAAS,EAAI,EAAG,EAAI,EAAE,OAAQ,IAAK,CACjC,MAAMljG,EAAI,EAAE,CAAC,EACb,GAAI,CAACA,EACH,SACF,OAAOA,EAAE,mBAAqB,YAAcA,EAAE,kBAAkB,EAAE,EAClE,MAAMqD,EAAI,IAAI08F,KAAS,cAAc//F,CAAC,EACtC,CAAC,OAAO,SAASqD,EAAE,IAAI,CAAC,GAAK,CAAC,OAAO,SAASA,EAAE,IAAI,CAAC,IAAMA,EAAE,IAAI,EAAI,IAAM,EAAIA,EAAE,IAAI,GAAIA,EAAE,IAAI,EAAI,IAAM,EAAIA,EAAE,IAAI,GACrH,CACA,MAAO,CAAC,OAAO,SAAS,CAAC,GAAK,CAAC,OAAO,SAAS,CAAC,EAAI,KAAO,CAAE,KAAM,EAAG,KAAM,CAAC,CAC/E,CAEA,iBAAiB,EAAG,CAClB,GAAI,EAAE,OAAS,KACb,OACF,IAAI,EAAI,EAAE,MAAM,MAChB,GAAI,KAAK,MAAQ,UAAW,CAC1B,IAAIrD,EAAI,KAAK,OAAO,kBAAkB,cAAc,CAAC,EACrD,IAAI,EAAI,KAAK,iBAAiBA,CAAC,EAC/B,KAAK,UAAY,EAAI,EAAE,IAAI,EAAE,EAAG,GAAG,KAAM,EAAE,CAAC,EAAI,EAAE,IAAI,EAAE,EAAG,GAAG,KAAM,EAAE,CAAC,CACzE,MACE,EAAI,EAAE,MAAM,MACd,GAAI,KAAK,OAAO,QAAU,EAAG,CAC3B,KAAK,OAAO,KAAK,CAAC,EAClB,MACF,CACA,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAMA,GAAMA,EAAE,UAAY,EAAE,EACxF,GAAK,OAAS,EAAE,SAAW,GAC7B,CAEA,gBAAgB,EAAG,CACjB,GAAI,EAAE,OAAS,MAAQ,KAAK,OAAO,QAAU,EAC3C,OACF,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAM,GAAM,EAAE,UAAY,EAAE,EACxF,GAAK,OAAS,EAAI,CAChB,KAAM,KACN,GAAIijG,GAAE,EACN,SAAU,GACV,KAAM,cACZ,EAAO,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAK,CAAC,GAC7D,IAAI,EAAI,EAAE,MACV,GAAI,KAAK,MAAQ,UAAW,CAC1B,IAAI,EAAI,EAAE,MAAM,MAAM,MAAK,EAC3B,EAAE,IAAI,EAAE,EAAG,KAAK,OAAO,CAAC,EAAE,EAAG,EAAE,CAAC,EAChC,IAAIjjG,EAAI,IAAI6kF,GAAY,EAAE,IAAI,IAAID,EAAU,EAAG,IAAM,CAAC,CAAC,EAAG,IAAIA,EAAU,EAAG,KAAK,UAAY,EAAI,GAAK,EAAG,CAAC,CAAC,EAC1G,EAAE,MAAQ,KAAK,OAAO,CAAC,EACvB,MAAMvhF,EAAI,KAAK,OAAO,UAAU,mBAAmBrD,CAAC,EACpD,GAAIqD,EAAE,SAAW,EAAG,CAClB,EAAE,OAAS,KACX,MACF,CACA,EAAE,OAAS,EAAG,EAAE,OAASA,EAAE,CAAC,EAAE,MAAO,EAAE,KAAO,EAAE,OAAO,MAAK,EAAG,WAAW,EAAE,OAAO,MAAK,CAAE,EAAG,KAAK,OAAO,OAAO,QAAQs9F,GAAG,eAAgB,CAAC,CAC9I,KAAO,CACL,IAAI,EAAI,IAAI9b,GAAY,EAAE,MAAM,MAAM,QAAQ,IAAI,IAAID,EAAU,EAAG,IAAM,CAAC,CAAC,EAAG,IAAIA,EAAU,EAAG,KAAK,UAAY,EAAI,GAAK,EAAG,CAAC,CAAC,EAC9H,MAAM5kF,EAAI,KAAK,OAAO,UAAU,mBAAmB,CAAC,EACpD,GAAIA,EAAE,SAAW,EAAG,CAClB,EAAE,OAAS,KACX,MACF,CACA,EAAE,OAAS,EAAE,MAAO,EAAE,OAASA,EAAE,CAAC,EAAE,MAAO,EAAE,KAAO,EAAE,OAAO,MAAK,EAAG,WAAW,EAAE,OAAO,MAAK,CAAE,EAAG,KAAK,OAAO,OAAO,QAAQ2gG,GAAG,eAAgB,CAAC,CACpJ,CACF,CACF,CACA,MAAMyC,EAAG,CACP,OACA,MACA,SAAW,GACX,OAAS,CAAA,EACT,SACA,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,MAAQ,IAAIF,GAAG,CAAC,CACxC,CAEA,QAAS,CACP,KAAK,OAAO,QAAQ,MAAM,gCAA+B,EAAI,KAAK,SAAW,GAAI,KAAK,OAAS,CAAA,EAAI,KAAK,SAAW,KAAK,OAAO,cAAe,KAAK,SAAS,KAAK,KAAM,CAAE,UAAW,EAAE,CAAE,EAAG,KAAK,SAAS,OAAM,EAC/M,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAM,GAAM,EAAE,UAAY,EAAE,EACxF,GAAK,OAAS,EAAE,SAAW,GAC7B,CAEA,WAAY,CACV,KAAK,OAAS,CAAA,EAAI,KAAK,SAAW,GAAI,KAAK,OAAO,cAAc,UAAS,CAC3E,CAEA,gBAAiB,CACf,KAAK,OAAS,CAAA,CAChB,CAEA,iBAAiB,EAAG,CAClB,GAAI,EAAE,OAAS,KACb,OACF,IAAI,EAAI,EAAE,MACV,GAAI,KAAK,OAAO,QAAU,EACxB,KAAK,OAAO,KAAK,EAAE,KAAK,UACjB,KAAK,OAAO,QAAU,EAAG,CAChC,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAM,GAAM,EAAE,UAAY,EAAE,EACxF,GAAI,GAAK,KACP,OACF,EAAE,OAAS,EAAE,MAAO,EAAE,SAAW,GAAI,KAAK,OAAS,CAAA,EAAI,KAAK,OAAO,OAAO,QAAQvC,GAAG,eAAgB,CAAC,CACxG,CACF,CAEA,gBAAgB,EAAG,CACjB,GAAI,EAAE,OAAS,KACb,OACF,IAAI,EAAI,EAAE,MACV,GAAI,GAAK,MAAQ,KAAK,OAAO,QAAU,EAAG,CACxC,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAM,GAAM,EAAE,UAAY,EAAE,EACxF,GAAK,OAAS,EAAI,CAChB,GAAIsC,GAAE,EACN,OAAQ,KAAK,OAAO,CAAC,EAAE,MAAK,EAC5B,OAAQ,EAAE,MAAM,MAAK,EACrB,KAAM,KAAK,OAAO,CAAC,EAAE,QAAQ,WAAW,EAAE,MAAM,OAAO,EACvD,KAAM,WACN,SAAU,EAClB,EAAS,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAK,CAAC,GAAI,EAAE,OAAS,EAAE,MAAO,EAAE,KAAO,EAAE,OAAO,QAAQ,WAAW,EAAE,OAAO,OAAO,CAC5I,CACF,CAEF,CACA,MAAMI,EAAG,CACP,OACA,SAAW,GACX,MACA,OAAS,CAAA,EACT,SACA,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,MAAQ,IAAIH,GAAG,CAAC,CACxC,CAEA,QAAS,CACP,KAAK,OAAO,QAAQ,MAAM,gCAA+B,EAAI,KAAK,SAAW,GAAI,KAAK,SAAW,KAAK,OAAO,cAAe,KAAK,SAAS,KAAK,IAAI,EAAG,KAAK,SAAS,OAAM,EAC1K,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAM,GAAM,EAAE,UAAY,EAAE,EACxF,GAAK,OAAS,EAAE,SAAW,GAC7B,CAEA,WAAY,CACV,KAAK,SAAW,GAAI,KAAK,UAAU,UAAS,CAC9C,CAEA,gBAAiB,CACf,KAAK,OAAS,CAAA,CAChB,CAEA,iBAAiB,EAAG,CAClB,GAAI,EAAE,OAAS,KACb,OACF,GAAI,KAAK,OAAO,QAAU,EAAG,CAC3B,KAAK,OAAO,KAAK,EAAE,MAAM,KAAK,EAC9B,MACF,CACA,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAM,GAAM,EAAE,UAAY,EAAE,EACxF,GAAK,OAAS,EAAE,SAAW,GAC7B,CAEA,gBAAgB,EAAG,CACjB,GAAI,EAAE,OAAS,MAAQ,KAAK,OAAO,QAAU,EAC3C,OACF,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAM7/F,GAAMA,EAAE,UAAY,EAAE,EACxF,GAAK,OAAS,EAAI,CAChB,KAAM,KACN,GAAI4/F,GAAE,EACN,SAAU,GACV,KAAM,gBACZ,EAAO,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAK,CAAC,GAC7D,IAAI,EAAI,IAAIpe,GAAY,EAAE,MAAM,MAAM,MAAK,EAAG,IAAI,EAAE,MAAM,KAAK,OAAO,MAAK,EAAG,UAAU,GAAI,CAAC,EAAG,EAAE,MAAM,KAAK,MAAM,EACnH,MAAM,EAAI,KAAK,OAAO,UAAU,mBAAmB,CAAC,EACpD,GAAI,EAAE,QAAU,EAAG,CACjB,EAAE,OAAS,KACX,MACF,CACA,IAAI7kF,EAAI,EAAE,MACV,EAAE,OAASA,EAAE,MAAO,EAAE,OAAS,EAAE,CAAC,EAAE,MAAO,EAAE,KAAO,EAAE,OAAO,MAAK,EAAG,WAAW,EAAE,OAAO,MAAK,CAAE,EAAG,KAAK,OAAO,OAAO,QAAQ2gG,GAAG,eAAgB,CAAC,CACpJ,CACF,CACA,MAAM2C,EAAG,CACP,OACA,SAAW,GACX,MACA,OAAS,CAAA,EACT,SACA,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,MAAQ,IAAIJ,GAAG,CAAC,CACxC,CACA,QAAS,CACP,KAAK,OAAO,QAAQ,MAAM,gCAA+B,EAAI,KAAK,SAAW,KAAK,OAAO,cAAe,KAAK,SAAS,KAAK,IAAI,EAAG,KAAK,SAAS,OAAM,EAAI,KAAK,SAAW,GAC1K,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAM,GAAM,EAAE,UAAY,EAAE,EACxF,GAAK,OAAS,EAAE,SAAW,GAC7B,CACA,WAAY,CACV,KAAK,SAAW,GAAI,KAAK,UAAU,UAAS,CAC9C,CAEA,gBAAiB,CACf,KAAK,OAAS,CAAA,CAChB,CACA,gBAAgB,EAAG,CACjB,GAAI,EAAE,OAAS,KACb,OACF,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,oBAAoB,KAAM,GAAM,EAAE,UAAY,EAAE,EAC3F,GAAK,OAAS,EAAI,CAChB,GAAID,GAAE,EACN,MAAO,EAAE,MAAM,MAAM,MAAK,EAC1B,KAAM,EAAE,MAAM,MAAM,EACpB,SAAU,GACV,KAAM,WACZ,EAAO,KAAK,OAAO,QAAQ,eAAe,oBAAoB,KAAK,CAAC,GAAI,EAAE,MAAQ,EAAE,MAAM,MAAM,QAAS,EAAE,KAAO,EAAE,MAAM,MAAM,CAC9H,CACA,iBAAiB,EAAG,CAClB,GAAI,EAAE,OAAS,KACb,OACF,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,oBAAoB,KAAM,GAAM,EAAE,UAAY,EAAE,EAC3F,GAAK,OAAS,EAAE,SAAW,GAAI,EAAE,MAAQ,EAAE,MAAM,MAAM,MAAK,EAAI,EAAE,KAAO,EAAE,MAAM,MAAM,EAAG,KAAK,OAAO,OAAO,QAAQtC,GAAG,eAAgB,CAAC,EAC3I,CACF,CACA,MAAM4C,EAAG,CACP,OACA,SAAW,GACX,MACA,OAAS,CAAA,EACT,SACA,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,MAAQ,IAAIL,GAAG,CAAC,CACxC,CACA,QAAS,CACP,KAAK,OAAO,QAAQ,MAAM,gCAA+B,EAAI,KAAK,SAAW,KAAK,OAAO,cAAe,KAAK,SAAS,KAAK,IAAI,EAAG,KAAK,SAAS,OAAM,EAAI,KAAK,SAAW,GAC1K,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAM,GAAM,EAAE,UAAY,EAAE,EACxF,GAAK,OAAS,EAAE,SAAW,GAC7B,CACA,WAAY,CACV,KAAK,SAAW,GAAI,KAAK,UAAU,UAAS,CAC9C,CAEA,gBAAiB,CACf,KAAK,OAAS,CAAA,CAChB,CACA,gBAAgB,EAAG,CACjB,GAAI,EAAE,OAAS,KACb,OACF,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,qBAAqB,KAAM,GAAM,EAAE,UAAY,EAAE,EAC5F,GAAK,OAAS,EAAI,CAChB,GAAID,GAAE,EACN,MAAO,EAAE,MAAM,MAAM,MAAK,EAC1B,KAAM,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC,EAAI,KACpC,SAAU,GACV,KAAM,OACZ,EAAO,KAAK,OAAO,QAAQ,eAAe,qBAAqB,KAAK,CAAC,GAAI,EAAE,MAAQ,EAAE,MAAM,MAAM,MAAK,EAAI,EAAE,MAAQ,EAAE,MAAM,MAAM,EAAG,EAAE,MAAQ,EAAE,MAAM,MAAM,EAAG,EAAE,MAAQ,EAAE,MAAM,MAAM,CACtL,CACA,iBAAiB,EAAG,CAClB,GAAI,EAAE,OAAS,KACb,OACF,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,qBAAqB,KAAM,GAAM,EAAE,UAAY,EAAE,EAC5F,GAAK,OAAS,EAAE,SAAW,GAAI,EAAE,MAAQ,EAAE,MAAM,MAAM,MAAK,EAAI,EAAE,MAAQ,EAAE,MAAM,MAAM,EAAG,EAAE,MAAQ,EAAE,MAAM,MAAM,EAAG,EAAE,MAAQ,EAAE,MAAM,MAAM,EAAG,KAAK,OAAO,OAAO,QAAQtC,GAAG,eAAgB,CAAC,EAClM,CACF,CACA,MAAM6C,EAAG,CACP,OACA,MAEA,OAAS,CAAA,EACT,SACA,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,MAAQ,IAAIN,GAAG,CAAC,CACxC,CAEA,QAAS,CACP,KAAK,OAAO,QAAQ,MAAM,gCAA+B,EAAI,KAAK,OAAS,CAAA,EAAI,KAAK,SAAW,KAAK,OAAO,cAAe,KAAK,SAAS,KAAK,IAAI,EAAG,KAAK,SAAS,OAAM,EACxK,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAM,GAAM,EAAE,UAAY,EAAE,EACxF,GAAK,OAAS,EAAE,SAAW,GAC7B,CAEA,WAAY,CACV,KAAK,OAAS,CAAA,EAAI,KAAK,UAAU,UAAS,CAC5C,CAEA,gBAAiB,CACf,KAAK,OAAS,CAAA,CAChB,CAGA,eAAe,EAAG,EAAG,EAAG,CACtB,MAAM,EAAI,IAAIte,IAAY,WAAW,EAAG,CAAC,EAAG5kF,EAAI,IAAI4kF,EAAS,EAAG,WAAW,EAAG,CAAC,EAAGvhF,EAAI,EAAE,SAAUxE,EAAImB,EAAE,OAAM,EAC9G,GAAIqD,IAAM,GAAKxE,IAAM,EACnB,MAAO,GACT,MAAMyJ,EAAI,EAAE,IAAItI,CAAC,GAAKqD,EAAIxE,GAAI,EAAI,KAAK,IAAI,GAAI,KAAK,IAAI,EAAGyJ,CAAC,CAAC,EAC7D,OAAO,KAAK,KAAK,CAAC,GAAK,IAAM,KAAK,GACpC,CAEA,iBAAiB,EAAG,CAClB,GAAI,EAAE,OAAS,KACb,OACF,IAAI,EAAI,EAAE,MACV,GAAI,KAAK,OAAO,QAAU,EACxB,KAAK,OAAO,KAAK,EAAE,KAAK,UACjB,KAAK,OAAO,QAAU,EAC7B,KAAK,OAAO,KAAK,EAAE,KAAK,UACjB,KAAK,OAAO,QAAU,EAAG,CAChC,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,gBAAgB,KAAM,GAAM,EAAE,UAAY,EAAE,EACvF,GAAI,GAAK,KACP,OACF,EAAE,OAAS,EAAE,MAAM,MAAK,EAAI,EAAE,MAAQ,KAAK,eAAe,EAAE,OAAQ,EAAE,OAAQ,EAAE,MAAM,EAAG,EAAE,KAAO,EAAE,MAAM,QAAQ,CAAC,EAAI,IAAK,EAAE,SAAW,GAAI,EAAE,KAAO,QAAS,KAAK,OAAS,CAAA,EAAI,KAAK,OAAO,OAAO,QAAQq4F,GAAG,eAAgB,CAAC,CAClO,CACF,CAEA,gBAAgB,EAAG,CACjB,GAAI,EAAE,OAAS,MAAQ,KAAK,OAAO,QAAU,GAAK,KAAK,OAAO,QAAU,EAAG,CACzE,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,gBAAgB,KAAM,GAAM,EAAE,UAAY,EAAE,EACvF,GAAK,OAAS,EAAI,CAChB,GAAIsC,GAAE,EACN,OAAQ,KAAK,OAAO,CAAC,EAAE,MAAK,EAE5B,OAAQ,KAAK,OAAO,CAAC,EAAE,MAAK,EAE5B,OAAQ,EAAE,MAAM,MAAM,MAAK,EAE3B,MAAO,EACP,KAAM,QACN,SAAU,GACV,KAAM,OACd,EAAS,KAAK,OAAO,QAAQ,eAAe,gBAAgB,KAAK,CAAC,GAAI,EAAE,OAAS,EAAE,MAAM,MAAM,MAAK,EAAI,EAAE,MAAQ,KAAK,eAAe,EAAE,OAAQ,EAAE,OAAQ,EAAE,MAAM,EAAG,EAAE,KAAO,EAAE,MAAM,QAAQ,CAAC,EAAI,IAAK,QAAQ,IAAI,KAAM,EAAE,IAAI,CAC5N,CACF,CACF,CACA,MAAMQ,EAAG,CACP,OACA,MAEA,OAAS,CAAA,EACT,SACA,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,MAAQ,IAAIP,GAAG,CAAC,CACxC,CAEA,QAAS,CACP,KAAK,OAAO,QAAQ,MAAM,gCAA+B,EAAI,KAAK,OAAS,CAAA,EAAI,KAAK,SAAW,KAAK,OAAO,cAAe,KAAK,SAAS,KAAK,IAAI,EAAG,KAAK,SAAS,OAAM,EACxK,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAM,GAAM,EAAE,UAAY,EAAE,EACxF,GAAK,OAAS,EAAE,SAAW,GAC7B,CAEA,WAAY,CACV,KAAK,OAAS,CAAA,EAAI,KAAK,UAAU,UAAS,CAC5C,CAEA,gBAAiB,CACf,KAAK,OAAS,CAAA,CAChB,CAGA,cAAc,EAAG,CACf,GAAI,EAAE,OAAS,EACb,MAAO,GACT,IAAI,EAAI,EACR,MAAM,EAAI,EAAE,OACZ,QAAS,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,MAAMljG,GAAK,EAAI,GAAK,EACpB,GAAK,EAAE,CAAC,EAAE,EAAI,EAAEA,CAAC,EAAE,EAAG,GAAK,EAAEA,CAAC,EAAE,EAAI,EAAE,CAAC,EAAE,CAC3C,CACA,OAAO,EAAI,KAAK,IAAI,CAAC,EAAI,EAAG,CAC9B,CAEA,iBAAiB,EAAG,CAClB,GAAI,EAAE,OAAS,KACb,OACF,IAAI,EAAI,EAAE,MACV,GAAI,KAAK,OAAO,KAAK,EAAE,MAAM,MAAK,CAAE,EAAG,KAAK,OAAO,QAAU,EAAG,CAC9D,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,eAAe,KAAM,GAAM,EAAE,UAAY,EAAE,EACtF,GAAK,MAAQ,EAAI,CACf,GAAIijG,GAAE,EACN,OAAQ,KAAK,OAAO,IAAK,GAAM,EAAE,OAAO,EAExC,KAAM,EACN,KAAM,EACN,SAAU,GACV,KAAM,MACd,EAAS,KAAK,OAAO,QAAQ,eAAe,eAAe,KAAK,CAAC,IAAM,KAAK,OAAO,KAAK,EAAE,MAAM,MAAK,CAAE,EAAG,EAAE,OAAS,KAAK,OAAO,IAAK,GAAM,EAAE,MAAK,CAAE,GAAI,EAAE,KAAO,KAAK,cAAc,EAAE,MAAM,EAAG,EAAE,KAAO,EAAE,KAAM,QAAQ,IAAI,KAAM,EAAE,IAAI,CACrO,CACF,CAEA,gBAAgB,EAAG,CACjB,GAAI,EAAE,OAAS,MAAQ,KAAK,OAAO,QAAU,EAAG,CAC9C,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,eAAe,KAAM,GAAM,EAAE,UAAY,EAAE,EACtF,GAAI,GAAK,MACP,GAAI,KAAK,OAAO,QAAU,EAAG,CAC3B,IAAI,EAAI,KAAK,OAAO,IAAK,GAAM,EAAE,OAAO,EACxC,EAAE,KAAK,EAAE,MAAM,MAAM,MAAK,CAAE,EAAG,EAAE,QAAU,IAAM,EAAI,CACnD,GAAIA,GAAE,EACN,OAAQ,EACR,KAAM,EACN,KAAM,EACN,SAAU,GACV,KAAM,MAClB,EAAa,KAAK,OAAO,QAAQ,eAAe,eAAe,KAAK,CAAC,EAC7D,UACS,EAAE,OAAO,OAAS,EAAG,CAC9B,MAAM,EAAI,EAAE,OAAO,OAAS,EAC5B,EAAE,OAAO,CAAC,EAAI,EAAE,MAAM,MAAM,MAAK,CACnC,MACE,EAAE,OAAS,KAAK,OAAO,IAAK,GAAM,EAAE,MAAK,CAAE,EAAG,EAAE,OAAO,KAAK,EAAE,MAAM,MAAM,OAAO,EACnF,GAAK,EAAE,OAAO,QAAU,IAAM,EAAE,KAAO,KAAK,cAAc,EAAE,MAAM,EAAG,EAAE,KAAO,EAAE,KAClF,CACF,CACA,oBAAqB,CACnB,KAAK,cAAa,CACpB,CAEA,eAAgB,CACd,KAAK,OAAS,KAAK,OAAO,MAAM,EAAG,KAAK,OAAO,OAAS,CAAC,EACzD,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,eAAe,KAAM,GAAM,EAAE,UAAY,EAAE,EACtF,GAAK,MAAQ,EAAE,OAAO,QAAU,IAAM,EAAE,OAAO,OAAS,KAAK,OAAO,SAAW,EAAE,OAAS,KAAK,OAAO,IAAK,GAAM,EAAE,MAAK,CAAE,GAAI,EAAE,KAAO,KAAK,cAAc,EAAE,MAAM,EAAG,EAAE,KAAO,EAAE,KAAM,EAAE,SAAW,GAAI,KAAK,OAAS,GAAI,KAAK,OAAO,OAAO,QAAQtC,GAAG,eAAgB,CAAC,EAC1Q,CACF,CACA,MAAM+C,EAAG,CACP,OACA,MAEA,OAAS,CAAA,EACT,SACA,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,MAAQ,IAAIR,GAAG,CAAC,CACxC,CAEA,QAAS,CACP,KAAK,OAAO,QAAQ,MAAM,gCAA+B,EAAI,KAAK,OAAS,CAAA,EAAI,KAAK,SAAW,KAAK,OAAO,cAAe,KAAK,SAAS,KAAK,IAAI,EAAG,KAAK,SAAS,OAAM,EACxK,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,iBAAiB,KAAM,GAAM,EAAE,UAAY,EAAE,EACxF,GAAK,OAAS,EAAE,SAAW,GAC7B,CAEA,WAAY,CACV,KAAK,OAAS,CAAA,EAAI,KAAK,UAAU,UAAS,CAC5C,CAEA,gBAAiB,CACf,KAAK,OAAS,CAAA,CAChB,CAIA,eAAe,EAAG,EAAG,CACnB,MAAM,EAAI,EAAE,EAAI,EAAE,EAAG,EAAI,EAAE,EAAI,EAAE,EAAGljG,EAAI,EAAE,EAAI,EAAE,EAAGqD,EAAI,KAAK,KAAK,EAAI,EAAIrD,EAAIA,CAAC,EAC9E,GAAIqD,IAAM,EACR,MAAO,CACL,WAAY,EACZ,MAAO,EACP,WAAY,EACZ,eAAgB,EAChB,KAAM,OACd,EACI,MAAMxE,EAAI,EAAIwE,EAAI,IAAKiF,EAAI,KAAK,KAAK,EAAIjF,CAAC,GAAK,IAAM,KAAK,IAC1D,MAAO,CACL,WAAYxE,EACZ,MAAOyJ,EACP,WAAY,EACZ,eAAgBjF,EAChB,KAAM,OACZ,CACE,CAEA,iBAAiB,EAAG,CAClB,GAAI,EAAE,OAAS,KACb,OACF,IAAI,EAAI,EAAE,MACV,GAAI,KAAK,OAAO,QAAU,EACxB,KAAK,OAAO,KAAK,EAAE,KAAK,UACjB,KAAK,OAAO,QAAU,EAAG,CAChC,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,gBAAgB,KAAMrD,GAAMA,EAAE,UAAY,EAAE,EACvF,GAAI,GAAK,KACP,OACF,QAAQ,IAAI,KAAK,EAAG,EAAE,OAAS,EAAE,MAAM,MAAK,EAC5C,MAAM,EAAI,KAAK,eAAe,EAAE,OAAQ,EAAE,MAAM,EAChD,EAAE,gBAAkB,EAAE,WAAY,EAAE,WAAa,EAAE,MAAO,EAAE,WAAa,EAAE,WAAY,EAAE,eAAiB,EAAE,eAAgB,EAAE,KAAO,EAAE,WAAW,QAAQ,CAAC,EAAI,MAAQ,EAAE,MAAM,QAAQ,CAAC,EAAI,KAAM,EAAE,SAAW,GAAI,KAAK,OAAS,GAAI,KAAK,OAAO,OAAO,QAAQ2gG,GAAG,eAAgB,CAAC,CACtR,CACF,CAEA,gBAAgB,EAAG,CACjB,GAAI,EAAE,OAAS,KACb,OACF,IAAI,EAAI,EAAE,MACV,GAAI,GAAK,MAAQ,KAAK,OAAO,QAAU,EAAG,CACxC,IAAI,EAAI,KAAK,OAAO,QAAQ,eAAe,gBAAgB,KAAM3gG,GAAMA,EAAE,UAAY,EAAE,EACvF,GAAK,OAAS,EAAI,CAChB,GAAIijG,GAAE,EACN,OAAQ,KAAK,OAAO,CAAC,EAAE,MAAK,EAE5B,OAAQ,EAAE,MAAM,MAAK,EAErB,gBAAiB,EACjB,WAAY,EACZ,WAAY,EACZ,eAAgB,EAChB,KAAM,gBACN,SAAU,GACV,KAAM,OACd,EAAS,KAAK,OAAO,QAAQ,eAAe,gBAAgB,KAAK,CAAC,GAAI,EAAE,OAAS,EAAE,MAAM,MAAK,EACxF,MAAM,EAAI,KAAK,eAAe,EAAE,OAAQ,EAAE,MAAM,EAChD,EAAE,gBAAkB,EAAE,WAAY,EAAE,WAAa,EAAE,MAAO,EAAE,WAAa,EAAE,WAAY,EAAE,eAAiB,EAAE,eAAgB,EAAE,KAAO,EAAE,WAAW,QAAQ,CAAC,EAAI,MAAQ,EAAE,MAAM,QAAQ,CAAC,EAAI,IAC9L,CACF,CACF,CACA,MAAMU,EAAG,CACP,SAAW,GACX,OACA,mBACA,gBACA,qBACA,iBACA,aACA,aACA,YACA,aACA,MACA,oBAEA,eAAiB,CACf,iBAAkB,CAAA,EAClB,eAAgB,CAAA,EAChB,qBAAsB,CAAA,EACtB,gBAAiB,CAAA,EACjB,mBAAoB,CAAA,EACpB,eAAgB,CAAA,EAChB,gBAAiB,CAAA,EACjB,oBAAqB,CAAA,EACrB,iBAAkB,CAAA,CACtB,EACE,YAAY,EAAG,CACb,KAAK,OAAS,EAAG,KAAK,mBAAqB,IAAIR,GAAG,CAAC,EAAG,KAAK,gBAAkB,IAAIC,GAAG,CAAC,EAAG,KAAK,qBAAuB,IAAIC,GAAG,CAAC,EAAG,KAAK,iBAAmB,IAAIC,GAAG,CAAC,EAAG,KAAK,aAAe,IAAIC,GAAG,CAAC,EAAG,KAAK,aAAe,IAAIC,GAAG,CAAC,EAAG,KAAK,YAAc,IAAIC,GAAG,CAAC,EAAG,KAAK,aAAe,IAAIC,GAAG,CAAC,EAAG,KAAK,MAAQ,IAAIR,GAAG,CAAC,EAAG,KAAK,oBAAsB,SAAS,cAAc,KAAK,EAAG,KAAK,oBAAoB,UAAY,uBAAwB,EAAE,UAAU,YAAY,KAAK,mBAAmB,CAC9d,CACA,QAAS,CACP,KAAK,SAAW,GAAI,KAAK,OAAO,UAAU,gBAAiB,KAAK,MAAM,OAAM,CAC9E,CACA,WAAY,CACV,KAAK,MAAM,UAAS,EAAI,KAAK,SAAQ,EAAI,KAAK,SAAW,GAAI,KAAK,mBAAmB,UAAS,EAAI,KAAK,gBAAgB,YAAa,KAAK,qBAAqB,UAAS,EAAI,KAAK,iBAAiB,UAAS,EAAI,KAAK,aAAa,UAAS,EAAI,KAAK,aAAa,UAAS,EAAI,KAAK,YAAY,YAAa,KAAK,aAAa,UAAS,EAAI,KAAK,OAAO,kBAAkB,KAAI,EAAI,KAAK,OAAO,kBAAkB,OAAM,CACrZ,CAEA,gBAAiB,CACf,KAAK,mBAAmB,iBAAkB,KAAK,gBAAgB,iBAAkB,KAAK,qBAAqB,eAAc,EAAI,KAAK,iBAAiB,eAAc,EAAI,KAAK,aAAa,eAAc,EAAI,KAAK,aAAa,eAAc,EAAI,KAAK,YAAY,eAAc,EAAI,KAAK,aAAa,eAAc,CAClT,CAEA,UAAW,CACT,EAAE,KAAK,eAAe,gBAAgB,EAAG,EAAE,KAAK,eAAe,cAAc,EAAG,EAAE,KAAK,eAAe,oBAAoB,EAAG,EAAE,KAAK,eAAe,eAAe,EAAG,EAAE,KAAK,eAAe,kBAAkB,EAAG,EAAE,KAAK,eAAe,cAAc,EAAG,EAAE,KAAK,eAAe,eAAe,EAAG,EAAE,KAAK,eAAe,mBAAmB,EAAG,EAAE,KAAK,eAAe,gBAAgB,EACjX,SAAS,EAAE,EAAG,CACZ,QAAS,EAAI,EAAG,EAAI,EAAE,OAAQ,IAC5B,EAAE,CAAC,EAAE,UAAU,OAAM,EACvB,EAAI,CAAA,CACN,CACF,CAEA,YAAY,EAAG,CACb,KAAK,MAAM,YAAY,CAAC,CAC1B,CAEA,YAAa,CACX,OAAO,KAAK,MAAM,WAAU,CAC9B,CAEA,QAAS,CACP,KAAK,UAAY,KAAK,MAAM,qBAAoB,CAClD,CACF,CACA,MAAMU,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAK,KAAMC,GAAK,EAAGC,GAAK,GAAIC,GAAKD,GAAK,EAAGE,GAAK,MAAOC,GAAK,KAAK,IAAI,EAAG,GAAG,EAAGC,GAAK,OAAO,iBAAiB,EAC/I,SAASxwF,GAAG+3B,EAAG,CACb,OAAOA,EAAE,MAAQA,EAAE,MAAM,MAAQA,EAAE,WAAW,SAAS,KACzD,CACA,SAAS04D,GAAG14D,EAAG,CACb,OAAO/3B,GAAG+3B,CAAC,EAAI,CACjB,CACA,SAAS24D,GAAG34D,EAAG,EAAI,YAAa,CAC9B,OAAOA,EAAI,MAAQ,IAAI,YAAY,IAAI,EAAE,EAAIA,CAAC,CAAC,EAAI,IAAI,YAAY,IAAI,EAAE,EAAIA,CAAC,CAAC,CACjF,CACA,SAAS44D,GAAG54D,EAAG,EAAG,CAChB,GAAI,CAACA,EAAE,MAAO,CACZ,MAAM,EAAIA,EAAE,WAAW,SAAS,MAAO,EAAI,EAAE,qBAAuB,kBAAoB,YAAa,EAAI24D,GAAG,EAAG,CAAC,EAChH34D,EAAE,SAAS,IAAI4sD,GAAG,EAAG,CAAC,CAAC,EACvB,QAASz4F,EAAI,EAAGA,EAAI,EAAGA,IACrB,EAAEA,CAAC,EAAIA,CACX,CACF,CACA,SAAS0kG,GAAG74D,EAAG,EAAG,CAChB,MAAM,EAAI04D,GAAG14D,CAAC,EAAG,EAAI,GAAKA,EAAE,UAAW,EAAI,EAAE,MAAQ,EAAG7rC,GAAK,EAAE,MAAQ,EAAE,OAAS,EAAGqD,EAAI,KAAK,IAAI,EAAG,CAAC,EAAGxE,EAAI,KAAK,IAAI,EAAGmB,CAAC,EAAIqD,EAC9H,MAAO,CAAC,CACN,OAAQ,KAAK,MAAMA,CAAC,EACpB,MAAO,KAAK,MAAMxE,CAAC,CACvB,CAAG,CACH,CACA,SAAS8lG,GAAG94D,EAAG,EAAG,CAChB,GAAI,CAACA,EAAE,QAAU,CAACA,EAAE,OAAO,OACzB,OAAO64D,GAAG74D,EAAG,CAAC,EAChB,MAAM,EAAI,GAAI,EAAI,GAAKA,EAAE,UAAW,EAAI,EAAE,MAAQ,EAAG7rC,GAAK,EAAE,MAAQ,EAAE,OAAS,EAAGqD,EAAIkhG,GAAG14D,CAAC,EAAGhtC,EAAI,CAAA,EACjG,UAAWE,KAAK8sC,EAAE,OAAQ,CACxB,KAAM,CAAE,MAAO,EAAG,MAAOjvC,CAAC,EAAKmC,EAAG+C,EAAI,EAAI,EAAG3R,EAAI,SAASyM,CAAC,EAAIA,EAAIyG,EAAI,EAAI,EAAGyY,GAAK,EAAI3rB,GAAK,EAC5F2R,EAAI9B,GAAK8b,EAAI,IAAMjd,EAAE,KAAK,CAAE,IAAK,KAAK,IAAI,EAAGiD,CAAC,EAAG,QAAS,EAAE,CAAE,EAAGjD,EAAE,KAAK,CAAE,IAAK,KAAK,IAAImB,EAAG8b,CAAC,EAAG,QAAS,EAAE,CAAE,EAC9G,CACAjd,EAAE,KAAK,CAACE,EAAG,IAAMA,EAAE,MAAQ,EAAE,IAAMA,EAAE,IAAM,EAAE,IAAMA,EAAE,OAAS,MAAQ,GAAK,CAAC,EAC5E,IAAI,EAAI,EAAGuJ,EAAI,KACf,UAAWvJ,KAAKF,EAAG,CACjB,MAAM,EAAIE,EAAE,IACZ,IAAM,GAAK,IAAMuJ,GAAK,EAAE,KAAK,CAC3B,OAAQA,EACR,MAAO,EAAIA,CACjB,CAAK,EAAG,GAAKvJ,EAAE,QAAU,EAAI,GAAIuJ,EAAI,CACnC,CACA,OAAO,CACT,CACA,SAASs8F,GAAG/4D,EAAG,EAAG,EAAG,EAAG,EAAG,CACzB,IAAI7rC,EAAI,IAAOqD,EAAI,IAAOxE,EAAI,IAAO,EAAI,KAAQyJ,EAAI,KAAQvJ,EAAI,KAAQ,EAAI,IAAOnC,EAAI,IAAOkF,EAAI,IAAO3R,EAAI,KAAQ2rB,EAAI,KAAQtzB,EAAI,KACtI,MAAM4U,EAAIyuC,EAAE,QAAU,EACtB,QAAS/qC,GAAK,EAAI1D,GAAK,EAAGN,GAAK,EAAI,EAAIM,GAAK,EAAG0D,EAAIhE,EAAGgE,GAAK,EAAG,CAC5D,MAAMukF,EAAIx5C,EAAE/qC,EAAI,CAAC,EAAGhC,EAAI+sC,EAAE/qC,EAAI,CAAC,EAAGwkF,EAAID,EAAIvmF,EAAGymF,EAAIF,EAAIvmF,EACrDwmF,EAAItlF,IAAMA,EAAIslF,GAAIC,EAAI,IAAM,EAAIA,GAAIF,EAAI,IAAM,EAAIA,GAAIA,EAAIl1F,IAAMA,EAAIk1F,GACpE,MAAMI,EAAI55C,EAAE/qC,EAAI,CAAC,EAAG6kF,EAAI95C,EAAE/qC,EAAI,CAAC,EAAG8kF,EAAIH,EAAIE,EAAGV,EAAIQ,EAAIE,EACrDC,EAAIviF,IAAMA,EAAIuiF,GAAIX,EAAI38E,IAAMA,EAAI28E,GAAIQ,EAAI7oF,IAAMA,EAAI6oF,GAAIA,EAAI3pE,IAAMA,EAAI2pE,GACpE,MAAMN,EAAIt5C,EAAE/qC,EAAI,CAAC,EAAGskF,EAAIv5C,EAAE/qC,EAAI,CAAC,EAAG7T,EAAIk4F,EAAIC,EAAG,EAAID,EAAIC,EACrDn4F,EAAI4R,IAAMA,EAAI5R,GAAI,EAAI8R,IAAMA,EAAI,GAAIomF,EAAIrjF,IAAMA,EAAIqjF,GAAIA,EAAI38F,IAAMA,EAAI28F,EACtE,CACA,EAAE,CAAC,EAAInlF,EAAG,EAAE,CAAC,EAAIqD,EAAG,EAAE,CAAC,EAAIxE,EAAG,EAAE,CAAC,EAAI,EAAG,EAAE,CAAC,EAAIyJ,EAAG,EAAE,CAAC,EAAIvJ,EAAG,EAAE,CAAC,EAAI,EAAG,EAAE,CAAC,EAAInC,EAAG,EAAE,CAAC,EAAIkF,EAAG,EAAE,CAAC,EAAI3R,EAAG,EAAE,CAAC,EAAI2rB,EAAG,EAAE,CAAC,EAAItzB,CACvH,CACA,SAASq8G,GAAGh5D,EAAG,EAAG,EAAI,KAAM,EAAI,KAAM,EAAI,KAAM,CAC9C,MAAM7rC,EAAI6rC,EAAE,WAAW,SAAUxoC,EAAIwoC,EAAE,MAAQA,EAAE,MAAM,MAAQ,KAAMhtC,EAAImB,EAAE,WAC3E,GAAI,IAAM,KACR,EAAI,IAAI,aAAa,EAAI,CAAC,EAAG,EAAE,OAAS,UACjC,EAAI,GAAK,EAAI,EAAI,EAAE,OAAS,EACnC,MAAM,IAAI,MAAM,oDAAoD,EACtE,MAAM,EAAIA,EAAE,MAAOsI,EAAItI,EAAE,QAAU,EACnC,IAAIjB,EAAI,EACRiB,EAAE,+BAAiCjB,EAAIiB,EAAE,KAAK,QAC9C,MAAM,EAAI,CAAC,OAAQ,OAAQ,MAAM,EAAGpD,EAAI,EAAE,OAC1C,QAASkF,EAAI,EAAG3R,EAAI,EAAI,EAAG2R,EAAI3R,EAAG2R,IAAK,CACrC,MAAMtZ,GAAK,EAAI,EAAEsZ,CAAC,EAAIA,GAAK,EAAG1E,GAAK0E,EAAIlF,GAAK,EAC5C,IAAIkE,EAAItY,EAAI,EAAGsU,EAAItU,EAAI,EAAG68F,EAAI78F,EAAI,EAClC6a,IAAMvC,EAAIuC,EAAEvC,CAAC,EAAGhE,EAAIuG,EAAEvG,CAAC,EAAGuoF,EAAIhiF,EAAEgiF,CAAC,GAAIxmF,IAAMiC,EAAIA,EAAI/B,EAAIuJ,EAAGxL,EAAIA,EAAIiC,EAAIuJ,EAAG+8E,EAAIA,EAAItmF,EAAIuJ,GACrF,QAAS,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,IAAIg9E,EAAGC,EAAGE,EACV5mF,GAAKymF,EAAItlF,EAAE,EAAE,CAAC,CAAC,EAAEc,CAAC,EAAGykF,EAAIvlF,EAAE,EAAE,CAAC,CAAC,EAAElD,CAAC,EAAG2oF,EAAIzlF,EAAE,EAAE,CAAC,CAAC,EAAEqlF,CAAC,IAAMC,EAAI,EAAExkF,EAAI,CAAC,EAAGykF,EAAI,EAAEzoF,EAAI,CAAC,EAAG2oF,EAAI,EAAEJ,EAAI,CAAC,GAC/F,IAAIM,EAAIL,EACRC,EAAII,IAAMA,EAAIJ,GAAIE,EAAIE,IAAMA,EAAIF,GAChC,IAAIG,EAAIN,EACRC,EAAIK,IAAMA,EAAIL,GAAIE,EAAIG,IAAMA,EAAIH,GAChC,MAAMR,GAAKW,EAAID,GAAK,EAAGR,EAAI,EAAI,EAC/B,EAAE/nF,EAAI+nF,EAAI,CAAC,EAAIQ,EAAIV,EAAG,EAAE7nF,EAAI+nF,EAAI,CAAC,EAAIF,GAAK,KAAK,IAAIU,CAAC,EAAIV,GAAKof,EAC/D,CACF,CACA,OAAO,CACT,CACA,SAASS,GAAGj5D,EAAG,EAAG,EAAG,CACnB,OAAO,EAAE,IAAI,EAAI,EAAEA,CAAC,EAAG,EAAE,IAAI,EAAI,EAAEA,EAAI,CAAC,EAAG,EAAE,IAAI,EAAI,EAAEA,EAAI,CAAC,EAAG,EAAE,IAAI,EAAI,EAAEA,EAAI,CAAC,EAAG,EAAE,IAAI,EAAI,EAAEA,EAAI,CAAC,EAAG,EAAE,IAAI,EAAI,EAAEA,EAAI,CAAC,EAAG,CAC7H,CACA,SAASk5D,GAAGl5D,EAAG,CACb,IAAI,EAAI,GAAI,EAAI,KAChB,QAAS,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,MAAM,EAAIA,EAAE,EAAI,CAAC,EAAIA,EAAE,CAAC,EACxB,EAAI,IAAM,EAAI,EAAG,EAAI,EACvB,CACA,OAAO,CACT,CACA,SAASm5D,GAAGn5D,EAAG,EAAG,CAChB,EAAE,IAAIA,CAAC,CACT,CACA,SAASo5D,GAAGp5D,EAAG,EAAG,EAAG,CACnB,IAAI,EAAG,EACP,QAAS7rC,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMqD,EAAIrD,EAAI,EACd,EAAI6rC,EAAE7rC,CAAC,EAAG,EAAI,EAAEA,CAAC,EAAG,EAAEA,CAAC,EAAI,EAAI,EAAI,EAAI,EAAG,EAAI6rC,EAAExoC,CAAC,EAAG,EAAI,EAAEA,CAAC,EAAG,EAAEA,CAAC,EAAI,EAAI,EAAI,EAAI,CACnF,CACF,CACA,SAAS6hG,GAAGr5D,EAAG,EAAG,EAAG,CACnB,QAAS,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,MAAM,EAAI,EAAEA,EAAI,EAAI,CAAC,EAAG7rC,EAAI,EAAE6rC,EAAI,EAAI,EAAI,CAAC,EAAGxoC,EAAI,EAAIrD,EAAGnB,EAAI,EAAImB,EACjEqD,EAAI,EAAE,CAAC,IAAM,EAAE,CAAC,EAAIA,GAAIxE,EAAI,EAAE,EAAI,CAAC,IAAM,EAAE,EAAI,CAAC,EAAIA,EACtD,CACF,CACA,SAASsmG,GAAGt5D,EAAG,CACb,MAAM,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAG,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAG,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EACtD,MAAO,IAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAClC,CACA,MAAMu5D,GAAK,GAAIC,GAAK,CAACx5D,EAAG,IAAMA,EAAE,UAAY,EAAE,UAAWy5D,GAAqB,IAAI,MAAMF,EAAE,EAAE,KAAI,EAAG,IAAI,KAAO,CAC5G,MAAO,EACP,OAAQ,IAAI,aAAa,CAAC,EAC1B,iBAAkB,IAAI,aAAa,CAAC,EACpC,gBAAiB,IAAI,aAAa,CAAC,EACnC,UAAW,CACb,EAAE,EAAGG,GAAqB,IAAI,aAAa,CAAC,EAC5C,SAASC,GAAG35D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAG,CAC5B,IAAIqD,EAAI,GAAIxE,EAAI,EAChB,GAAImB,IAAM4jG,GACRvgG,EAAI0hG,GAAG,CAAC,EAAG1hG,IAAM,KAAOxE,GAAK,EAAEwE,CAAC,EAAI,EAAEA,EAAI,CAAC,GAAK,WACzCrD,IAAM6jG,GACbxgG,EAAI0hG,GAAGl5D,CAAC,EAAGxoC,IAAM,KAAOxE,EAAI4mG,GAAG,EAAG,EAAG,EAAGpiG,CAAC,WAClCrD,IAAM8jG,GAAI,CACjB,MAAM,EAAIqB,GAAGt5D,CAAC,EACd,IAAIvjC,EAAI07F,GAAK,EACb,MAAMjlG,EAAI,EAAE,QAAU,EAAG,GAAK,EAAIA,GAAK,EAAGnC,GAAK,EAAI,EAAImC,GAAK,EAC5D,QAAS+C,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAM3R,EAAI,EAAE2R,CAAC,EAAG1E,GAAK,EAAE0E,EAAI,CAAC,EAAI3R,GAAKi1G,GACrC,GAAI,EAAIA,GAAK,EAAG,CACd,MAAMtkG,EAAI,CAAC,GAAGwkG,EAAE,EAChBxkG,EAAE,OAAS,EACX,IAAIhE,EAAI,EACR,QAASgC,EAAI,EAAGA,EAAIlC,EAAGkC,GAAK,EAAGhC,IAAK,CAClC,MAAMwoF,EAAIxkF,EAAEhE,CAAC,EACbwoF,EAAE,UAAY,EAAExmF,EAAI,EAAIgD,CAAC,EAAGwjF,EAAE,MAAQ,EACtC,KAAM,CACJ,OAAQC,EACR,gBAAiBE,EACjB,iBAAkBE,CAC9B,EAAcL,EACJ,QAASM,EAAI,EAAGA,EAAI,EAAGA,IACrBD,EAAEC,CAAC,EAAI,IAAOD,EAAEC,EAAI,CAAC,EAAI,KAAQH,EAAEG,CAAC,EAAI,IAAOH,EAAEG,EAAI,CAAC,EAAI,KAAQL,EAAEK,CAAC,EAAI,IAAOL,EAAEK,EAAI,CAAC,EAAI,KAC7Fsf,GAAGpmG,EAAG,EAAGymF,CAAC,CACZ,CACAzkF,EAAE,KAAKukG,EAAE,EACT,IAAIhgB,EAAI,EACR,QAASvmF,EAAI,EAAGA,EAAIumF,EAAGvmF,IAAK,CAC1B,MAAMwmF,EAAIxkF,EAAEhC,CAAC,EACb,KAAOA,EAAI,EAAIumF,GAAKvkF,EAAEhC,EAAI,CAAC,EAAE,YAAcwmF,EAAE,WAC3CxkF,EAAE,OAAOhC,EAAI,EAAG,CAAC,EAAGumF,GACxB,CACA,QAASvmF,EAAI,EAAGA,EAAIlC,EAAGkC,GAAK,EAAG,CAC7B,MAAMwmF,EAAI,EAAExmF,EAAI,EAAIgD,CAAC,EACrB,QAASyjF,EAAI,EAAGA,EAAIF,EAAGE,IAAK,CAC1B,MAAME,EAAI3kF,EAAEykF,CAAC,EACbD,GAAKG,EAAE,UAAYyf,GAAGpmG,EAAG,EAAG2mF,EAAE,gBAAgB,GAAKyf,GAAGpmG,EAAG,EAAG2mF,EAAE,eAAe,EAAGA,EAAE,QACpF,CACF,CACA,QAAS3mF,EAAI,EAAGA,EAAIumF,EAAGvmF,IAAK,CAC1B,MAAMwmF,EAAIxkF,EAAEhC,CAAC,EAAGymF,EAAID,EAAE,MAAOG,EAAI,EAAIH,EAAE,MAAOK,EAAIL,EAAE,gBAAiBM,EAAIN,EAAE,iBAC3E,IAAIL,EAAI,EACRM,IAAM,IAAMN,EAAIkgB,GAAGxf,CAAC,EAAI,GACxB,IAAIR,EAAI,EACRM,IAAM,IAAMN,EAAIggB,GAAGvf,CAAC,EAAI,GACxB,MAAMR,EAAI6e,GAAKD,IAAM/e,EAAIM,EAAIJ,EAAIM,GACjCL,EAAI98E,IAAMjF,EAAIvB,EAAGwG,EAAI88E,EAAGvmF,EAAIymF,EAAE,UAChC,CACF,KAAO,CACL,QAASD,EAAI,EAAGA,EAAI+f,GAAI/f,IAAK,CAC3B,MAAMvmF,EAAIwmG,GAAGjgB,CAAC,EACdvmF,EAAE,MAAQ,EAAGA,EAAE,UAAY3O,EAAIiN,EAAIioF,EAAIjoF,EACvC,MAAMkoF,EAAIxmF,EAAE,OACZ,QAASymF,EAAI,EAAGA,EAAI,EAAGA,IACrBD,EAAEC,CAAC,EAAI,IAAOD,EAAEC,EAAI,CAAC,EAAI,IAC7B,CACA,QAASF,EAAI,EAAGA,EAAIzoF,EAAGyoF,GAAK,EAAG,CAC7B,IAAIE,EAAI,CAAC,GAAG,EAAEF,EAAI,EAAIvjF,CAAC,EAAI3R,GAAKiN,GAChCmoF,GAAK6f,KAAO7f,EAAI6f,GAAK,GACrB,MAAM3f,EAAI6f,GAAG/f,CAAC,EACdE,EAAE,QAASyf,GAAG7f,EAAG,EAAGI,EAAE,MAAM,CAC9B,CACA,MAAM3kF,EAAIwkG,GAAGF,GAAK,CAAC,EACnBJ,GAAGlkG,EAAE,OAAQA,EAAE,gBAAgB,EAC/B,QAASukF,EAAI+f,GAAK,EAAG/f,GAAK,EAAGA,IAAK,CAChC,MAAMvmF,EAAIwmG,GAAGjgB,CAAC,EAAGC,EAAIggB,GAAGjgB,EAAI,CAAC,EAC7B4f,GAAGnmG,EAAE,OAAQwmF,EAAE,iBAAkBxmF,EAAE,gBAAgB,CACrD,CACA,IAAIhC,EAAI,EACR,QAASuoF,EAAI,EAAGA,EAAI+f,GAAK,EAAG/f,IAAK,CAC/B,MAAMvmF,EAAIwmG,GAAGjgB,CAAC,EAAGC,EAAIxmF,EAAE,MAAOymF,EAAIzmF,EAAE,OAAQ6mF,EAAI2f,GAAGjgB,EAAI,CAAC,EAAE,iBAC1DC,IAAM,IAAMxoF,IAAM,EAAIkoG,GAAGzf,EAAGggB,EAAE,EAAIN,GAAG1f,EAAGggB,GAAIA,EAAE,GAAIzoG,GAAKwoF,EACvD,IAAIM,EAAI,EAAGX,EAAI,EACfnoF,IAAM,IAAM8oF,EAAIuf,GAAGI,EAAE,EAAI,GACzB,MAAMpgB,EAAI,EAAIroF,EACdqoF,IAAM,IAAMF,EAAIkgB,GAAGxf,CAAC,EAAI,GACxB,MAAMP,EAAI6e,GAAKD,IAAMpe,EAAI9oF,EAAImoF,EAAIE,GACjCC,EAAI98E,IAAMjF,EAAIvB,EAAGwG,EAAI88E,EAAGvmF,EAAIC,EAAE,UAChC,CACF,CACF,CACF,MACE,QAAQ,KAAK,yCAAyCkB,CAAC,QAAQ,EACjE,MAAO,CAAE,KAAMqD,EAAG,IAAKxE,CAAC,CAC1B,CACA,SAAS4mG,GAAG55D,EAAG,EAAG,EAAG,EAAG,CACtB,IAAI,EAAI,EACR,MAAM7rC,EAAI6rC,EAAE,OACZ,QAASxoC,EAAI,EAAGxE,EAAI,EAAI,EAAGwE,EAAIxE,EAAGwE,IAChC,GAAKwoC,GAAGxoC,EAAIrD,GAAK,EAAI,EAAI,CAAC,EAC5B,OAAO,EAAI,CACb,CACA,MAAM0lG,EAAG,CACP,aAAc,CACZ,KAAK,aAAe,IAAI,aAAa,CAAC,CACxC,CACF,CACA,SAASC,GAAG95D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAG,CAC5B,IAAIqD,EAAI,EAAGxE,EAAI,EAAI,EAAI,EACvB,MAAM,EAAImB,EAAE,IAAKsI,EAAItI,EAAE,KAAO,EAAGjB,EAAI,EAAE,QAAU,EACjD,OAAW,CACT,KAAOsE,GAAKxE,GAAK,GAAGwE,EAAItE,GAAK,EAAIuJ,CAAC,EAAI,GACpCjF,IACF,KAAOA,GAAKxE,GAAK,GAAGA,EAAIE,GAAK,EAAIuJ,CAAC,GAAK,GACrCzJ,IACF,GAAIwE,EAAIxE,EAAG,CACT,QAAS,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,IAAIjC,EAAI,EAAEyG,EAAI,EAAI,CAAC,EACnB,EAAEA,EAAI,EAAI,CAAC,EAAI,EAAExE,EAAI,EAAI,CAAC,EAAG,EAAEA,EAAI,EAAI,CAAC,EAAIjC,CAC9C,CACA,QAAS,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,MAAMA,EAAIyG,EAAItE,EAAG+C,EAAIjD,EAAIE,EAAG5O,EAAI,EAAEyM,EAAI,EAAI,CAAC,EAC3C,EAAEA,EAAI,EAAI,CAAC,EAAI,EAAEkF,EAAI,EAAI,CAAC,EAAG,EAAEA,EAAI,EAAI,CAAC,EAAI3R,CAC9C,CACAkT,IAAKxE,GACP,KACE,QAAOwE,CACX,CACF,CACA,SAASuiG,GAAG/5D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAG,CAC5B,IAAIqD,EAAI,EAAGxE,EAAI,EAAI,EAAI,EACvB,MAAM,EAAImB,EAAE,IAAKsI,EAAItI,EAAE,KAAO,EAAGjB,EAAI,EAAE,QAAU,EACjD,OAAW,CACT,KAAOsE,GAAKxE,GAAK,GAAGwE,EAAItE,GAAK,EAAIuJ,CAAC,EAAI,GACpCjF,IACF,KAAOA,GAAKxE,GAAK,GAAGA,EAAIE,GAAK,EAAIuJ,CAAC,GAAK,GACrCzJ,IACF,GAAIwE,EAAIxE,EAAG,CACT,IAAI,EAAIgtC,EAAExoC,CAAC,EACXwoC,EAAExoC,CAAC,EAAIwoC,EAAEhtC,CAAC,EAAGgtC,EAAEhtC,CAAC,EAAI,EACpB,QAASjC,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMkF,EAAIuB,EAAItE,EAAG5O,EAAI0O,EAAIE,EAAG+c,EAAI,EAAEha,EAAI,EAAIlF,CAAC,EAC3C,EAAEkF,EAAI,EAAIlF,CAAC,EAAI,EAAEzM,EAAI,EAAIyM,CAAC,EAAG,EAAEzM,EAAI,EAAIyM,CAAC,EAAIkf,CAC9C,CACAzY,IAAKxE,GACP,KACE,QAAOwE,CACX,CACF,CACA,IAAIwiG,GAAIC,GAAIC,GAAIC,GAChB,MAAMC,GAAK,KAAK,IAAI,EAAG,EAAE,EACzB,SAASC,GAAGr6D,EAAG,CACb,MAAO,UAAWA,EAAI,EAAI,EAAIq6D,GAAGr6D,EAAE,IAAI,EAAIq6D,GAAGr6D,EAAE,KAAK,CACvD,CACA,SAASs6D,GAAGt6D,EAAG,EAAG,EAAG,CACnB,OAAOg6D,GAAK,IAAI,aAAa,CAAC,EAAGC,GAAK,IAAI,YAAY,CAAC,EAAGC,GAAK,IAAI,YAAY,CAAC,EAAGC,GAAK,IAAI,WAAW,CAAC,EAAGI,GAAGv6D,EAAG,CAAC,CACpH,CACA,SAASu6D,GAAGv6D,EAAG,EAAG,CAChB,MAAM,EAAIA,EAAI,EAAG,EAAIA,EAAI,EAAG,EAAI,UAAW,EAAG7rC,EAAI,EAAE,aACpD,QAASqD,EAAI,EAAGA,EAAI,EAAGA,IACrBwiG,GAAG,EAAIxiG,CAAC,EAAIrD,EAAEqD,CAAC,EACjB,GAAI,EACF,OAAO,EAAE,QAAU2iG,GAAG,IAAI,IAAI,WAAW,EAAE,MAAM,EAAGn6D,CAAC,EAAGA,EAAI,EAAE,OAAO,aAAei6D,GAAG,EAAI,CAAC,EAAI,EAAE,OAAQC,GAAG,EAAI,EAAE,EAAI,EAAE,MAAOA,GAAG,EAAI,EAAE,EAAI3B,GAAIv4D,EAAIq4D,IACvJ,CACE,KAAM,CAAE,KAAM7gG,EAAG,MAAOxE,EAAG,UAAW,GAAM,EAAGyJ,EAAIujC,EAAIq4D,GACvD,IAAInlG,EAAIqnG,GAAG99F,EAAGjF,CAAC,EACf,MAAM,EAAIwoC,EAAIq4D,GAAIpiG,EAAI/C,EAAImlG,GAAK,EAC/B,GAAIpiG,EAAImkG,GACN,MAAM,IAAI,MAAM,wEAAwE,EAC1F,OAAOH,GAAG,EAAI,CAAC,EAAIhkG,EAAGgkG,GAAG,EAAI,CAAC,EAAI,EAAGM,GAAGrnG,EAAGF,CAAC,CAC9C,CACF,CACA,SAASwnG,GAAGx6D,EAAG,EAAG,EAAG,CACnB,MAAMrxC,GAAKqxC,EAAE,MAAQA,EAAE,MAAM,MAAQA,EAAE,WAAW,SAAS,OAAS,EAAI,MAAS7rC,EAAI,EAAE,OAAO,CAAC,EAAGmG,IAAM,EAAIA,EAAE,MAAO,CAAC,EAAG,EAAI3L,EAAI,EAAI,EAAG,EAAI,EAAI,IAAI,kBAAkBwF,EAAI,CAAC,EAAI,IAAI,YAAYA,EAAI,CAAC,EAAGpZ,EAAI4T,EAAI,IAAI,YAAY,CAAC,EAAI,IAAI,YAAY,CAAC,EACrP,IAAI8N,EAAI,EACR,QAAS,EAAI,EAAG,EAAI,EAAE,OAAQ,IAAK,CACjC,KAAM,CAAE,OAAQnC,EAAG,MAAOvJ,CAAC,EAAK,EAAE,CAAC,EACnC,QAASkF,EAAI,EAAGA,EAAIlF,EAAGkF,IACrBlb,EAAE0hB,EAAIxG,CAAC,EAAIqE,EAAIrE,EACjBwG,GAAK1L,CACP,CACA,OAAOhW,CACT,CACA,SAAS0/G,GAAGz6D,EAAG,EAAG,EAAG,EAAG,EAAG,CACzB,KAAM,CACJ,SAAU7rC,EACV,QAASqD,EACT,YAAaxE,EACb,SAAU,EACV,WAAYyJ,EACZ,SAAUvJ,CACd,EAAM,EAAG,EAAI8sC,EAAE,gBAAiBjvC,EAAIivC,EAAE,SAAU/pC,EAAIlF,EAAE,MAAQA,EAAE,MAAM,MAAQ,KAAMzM,EAAI4O,EAAI6mG,GAAKD,GAAI7pF,EAAIyoF,GAAG3nG,CAAC,EAAGpU,EAAI,IAAI,aAAa,CAAC,EACpI,IAAI4U,EAAI,GACR,MAAM0D,EAAI,IAAI4kG,GACd,OAAOd,GAAG,EAAG,EAAG,EAAG9jG,EAAE,aAActY,CAAC,EAAG68F,EAAEvkF,EAAG,EAAG,EAAGtY,CAAC,EAAGsY,EACtD,SAAShE,EAAEgC,EAAG,CACZwJ,GAAKA,EAAExJ,EAAIgd,CAAC,CACd,CACA,SAASupE,EAAEvmF,EAAGwmF,EAAGC,EAAGE,EAAI,KAAME,EAAI,EAAG,CACnC,GAAI,CAACvoF,GAAKuoF,GAAK3lF,IAAM5C,EAAI,GAAIiG,IAAM,QAAQ,KAAK,yBAAyBrD,CAAC,6DAA6D,EAAG,QAAQ,KAAKpD,CAAC,IAAK2oF,GAAK1mF,GAAK8mF,GAAK3lF,EAC1K,OAAOlD,EAAEwoF,EAAIC,CAAC,EAAGzmF,EAAE,OAASwmF,EAAGxmF,EAAE,MAAQymF,EAAGzmF,EAC9C,MAAM8mF,EAAI4f,GAAG1mG,EAAE,aAAc2mF,EAAG,EAAGH,EAAGC,EAAG,CAAC,EAC1C,GAAIK,EAAE,OAAS,GACb,OAAO9oF,EAAEwoF,EAAIC,CAAC,EAAGzmF,EAAE,OAASwmF,EAAGxmF,EAAE,MAAQymF,EAAGzmF,EAC9C,MAAMmmF,EAAI90F,EAAE,EAAG2R,EAAG,EAAGwjF,EAAGC,EAAGK,CAAC,EAC5B,GAAIX,IAAMK,GAAKL,IAAMK,EAAIC,EACvBzoF,EAAEwoF,EAAIC,CAAC,EAAGzmF,EAAE,OAASwmF,EAAGxmF,EAAE,MAAQymF,MAC/B,CACHzmF,EAAE,UAAY8mF,EAAE,KAChB,MAAMT,EAAI,IAAIugB,GAAMtgB,EAAIE,EAAGr4F,EAAIg4F,EAAIK,EACnCxmF,EAAE,KAAOqmF,EAAGyf,GAAG,EAAGxf,EAAGn4F,EAAGk4F,EAAE,aAAc38F,CAAC,EAAG68F,EAAEF,EAAGC,EAAGn4F,EAAGzE,EAAGm9F,EAAI,CAAC,EAC/D,MAAM,EAAI,IAAI+f,GAAMlgB,EAAIP,EAAGS,EAAIH,EAAIt4F,EACnC6R,EAAE,MAAQ,EAAG8lG,GAAG,EAAGpf,EAAGE,EAAG,EAAE,aAAcl9F,CAAC,EAAG68F,EAAE,EAAGG,EAAGE,EAAGl9F,EAAGm9F,EAAI,CAAC,CAClE,CACA,OAAO7mF,CACT,CACF,CACA,SAASynG,GAAG16D,EAAG,EAAG,CAChB,MAAM,EAAI,EAAE,qBAAuB,kBAAoB,YAAa,EAAIA,EAAE,SAC1E,IAAI,EAAG7rC,EACP,GAAI,EAAE,SAAU,CACd,MAAMqD,EAAIshG,GAAG,EAAG,EAAE,KAAK,EAAG9lG,EAAIwnG,GAAG,EAAG,EAAE,qBAAsBhjG,CAAC,EAC7DwoC,EAAE,gBAAkBhtC,EAAG,EAAIgmG,GAAG,EAAG,EAAGhmG,EAAE,OAAQA,CAAC,EAAGmB,EAAI,CAAC,CAAE,OAAQ,EAAG,MAAOnB,EAAE,OAAQ,CACvF,KAAO,CACL4lG,GAAG,EAAG,CAAC,EACP,MAAMphG,EAAIqhG,GAAG,EAAG,EAAE,KAAK,EAAE,CAAC,EAC1B,EAAIG,GAAG,EAAGxhG,EAAE,OAAQA,EAAE,KAAK,EAAGrD,EAAI2kG,GAAG,EAAG,EAAE,KAAK,CACjD,CACA94D,EAAE,OAAS7rC,EAAE,IAAKqD,GAAM,CACtB,MAAMxE,EAAIynG,GAAGz6D,EAAG,EAAGxoC,EAAE,OAAQA,EAAE,MAAO,CAAC,EAAG,EAAI6iG,GAAGrnG,CAAC,EAAGyJ,EAAI,IAAI,EAAE47F,GAAK,CAAC,EACrE,OAAOiC,GAAG,EAAGtnG,EAAGyJ,CAAC,EAAGA,CACtB,CAAC,CACH,CACA,MAAMk+F,EAAG,CACP,aAAc,CACZ,KAAK,IAAM,IAAO,KAAK,IAAM,IAC/B,CACA,mBAAmB,EAAG,EAAG,CACvB,IAAI,EAAI,IAAO,EAAI,KACnB,QAASxmG,EAAI,EAAGqD,EAAI,EAAE,OAAQrD,EAAIqD,EAAGrD,IAAK,CACxC,MAAMpZ,EAAI,EAAEoZ,CAAC,EAAE,CAAC,EAChB,EAAIpZ,EAAI,EAAIA,EAAI,EAAG,EAAIA,EAAI,EAAIA,EAAI,CACrC,CACA,KAAK,IAAM,EAAG,KAAK,IAAM,CAC3B,CACA,cAAc,EAAG,EAAG,CAClB,IAAI,EAAI,IAAO,EAAI,KACnB,QAASoZ,EAAI,EAAGqD,EAAI,EAAE,OAAQrD,EAAIqD,EAAGrD,IAAK,CACxC,MAAMnB,EAAI,EAAEmB,CAAC,EAAG,EAAI,EAAE,IAAInB,CAAC,EAC3B,EAAI,EAAI,EAAI,EAAI,EAAG,EAAI,EAAI,EAAI,EAAI,CACrC,CACA,KAAK,IAAM,EAAG,KAAK,IAAM,CAC3B,CACA,YAAY,EAAG,CACb,OAAO,KAAK,IAAM,EAAE,KAAO,EAAE,IAAM,KAAK,GAC1C,CACF,CACA2nG,GAAG,UAAU,YAA8B,UAAW,CACpD,MAAM36D,EAAoB,IAAIu3C,EAC9B,OAAO,SAASt8F,EAAG6V,EAAG,CACpB,MAAMnC,EAAImC,EAAE,IAAKqD,EAAIrD,EAAE,IACvB,IAAI,EAAI,IAAO,EAAI,KACnB,QAAS/V,EAAI,EAAGA,GAAK,EAAGA,IACtB,QAAS0hB,EAAI,EAAGA,GAAK,EAAGA,IACtB,QAAS,EAAI,EAAG,GAAK,EAAG,IAAK,CAC3BujC,EAAE,EAAIrxC,EAAE,EAAI5T,EAAIoZ,EAAE,GAAK,EAAIpZ,GAAIilD,EAAE,EAAIrxC,EAAE,EAAI8N,EAAItI,EAAE,GAAK,EAAIsI,GAAIujC,EAAE,EAAIrxC,EAAE,EAAI,EAAIwF,EAAE,GAAK,EAAI,GACzF,MAAMmG,EAAIrf,EAAE,IAAI+kD,CAAC,EACjB,EAAI,KAAK,IAAI1lC,EAAG,CAAC,EAAG,EAAI,KAAK,IAAIA,EAAG,CAAC,CACvC,CACJ,KAAK,IAAM,EAAG,KAAK,IAAM,CAC3B,CACF,GAAC,EACD,MAAMsgG,IAAsB,UAAW,CACrC,MAAM56D,EAAoB,IAAIu3C,EAAK,EAAoB,IAAIA,EAAK,EAAoB,IAAIA,EACxF,OAAO,SAAS5oF,EAAGwF,EAAG,EAAG,CACvB,MAAM,EAAIxF,EAAE,MAAO5T,EAAIilD,EAAGvjC,EAAItI,EAAE,MAAO,EAAI,EAC3C,EAAE,WAAW,EAAGsI,CAAC,EAAGujC,EAAE,WAAWrxC,EAAE,IAAKA,EAAE,KAAK,EAAG,EAAE,WAAWwF,EAAE,IAAKA,EAAE,KAAK,EAC7E,MAAMmG,EAAI,EAAE,IAAI,CAAC,EAAGvJ,EAAI,EAAE,IAAIhW,CAAC,EAAGkb,EAAI,EAAE,IAAI,CAAC,EAAG,EAAI,EAAE,IAAIlb,CAAC,EAAG4B,EAAI5B,EAAE,IAAIA,CAAC,EAAIkb,EAAIlF,EAAIA,EACrF,IAAIQ,EAAG0D,EACPtY,IAAM,EAAI4U,GAAK+I,EAAIvJ,EAAI,EAAIkF,GAAKtZ,EAAI4U,EAAI,EAAG0D,GAAKqF,EAAI/I,EAAIR,GAAKkF,EAAG,EAAE,EAAI1E,EAAG,EAAE,EAAI0D,CACjF,CACF,GAAC,EAAK4lG,IAAsB,UAAW,CACrC,MAAM76D,EAAoB,IAAIi4C,GAAM,EAAoB,IAAIV,EAAK,EAAoB,IAAIA,EACzF,OAAO,SAAS5oF,EAAGwF,EAAG,EAAG,EAAG,CAC1BymG,GAAGjsG,EAAGwF,EAAG6rC,CAAC,EACV,IAAIjlD,EAAIilD,EAAE,EAAGvjC,EAAIujC,EAAE,EACnB,GAAIjlD,GAAK,GAAKA,GAAK,GAAK0hB,GAAK,GAAKA,GAAK,EAAG,CACxC9N,EAAE,GAAG5T,EAAG,CAAC,EAAGoZ,EAAE,GAAGsI,EAAG,CAAC,EACrB,MACF,SAAW1hB,GAAK,GAAKA,GAAK,EAAG,CAC3B0hB,EAAI,EAAItI,EAAE,GAAG,EAAG,CAAC,EAAIA,EAAE,GAAG,EAAG,CAAC,EAAGxF,EAAE,oBAAoB,EAAG,GAAI,CAAC,EAC/D,MACF,SAAW8N,GAAK,GAAKA,GAAK,EAAG,CAC3B1hB,EAAI,EAAI4T,EAAE,GAAG,EAAG,CAAC,EAAIA,EAAE,GAAG,EAAG,CAAC,EAAGwF,EAAE,oBAAoB,EAAG,GAAI,CAAC,EAC/D,MACF,KAAO,CACL,IAAI,EACJpZ,EAAI,EAAI,EAAI4T,EAAE,MAAQ,EAAIA,EAAE,IAC5B,IAAI2L,EACJmC,EAAI,EAAInC,EAAInG,EAAE,MAAQmG,EAAInG,EAAE,IAC5B,MAAMpD,EAAI,EAAGkF,EAAI,EACjB,GAAItH,EAAE,oBAAoB2L,EAAG,GAAI,CAAC,EAAGnG,EAAE,oBAAoB,EAAG,GAAI,CAAC,EAAGpD,EAAE,kBAAkBuJ,CAAC,GAAKrE,EAAE,kBAAkB,CAAC,EAAG,CACtH,EAAE,KAAKlF,CAAC,EAAG,EAAE,KAAKuJ,CAAC,EACnB,MACF,KAAO,CACL,EAAE,KAAK,CAAC,EAAG,EAAE,KAAKrE,CAAC,EACnB,MACF,CACF,CACF,CACF,GAAC,EAAK6kG,IAAsB,UAAW,CACrC,MAAM96D,EAAoB,IAAIu3C,EAAK,EAAoB,IAAIA,EAAK,EAAoB,IAAIJ,GAAM,EAAoB,IAAI4jB,GACtH,OAAO,SAAS5mG,EAAG,EAAG,CACpB,KAAM,CAAE,OAAQ,EAAG,OAAQpZ,CAAC,EAAKoZ,EAAG,CAAE,EAAGsI,EAAG,EAAG,EAAG,EAAGnC,CAAC,EAAK,EAC3D,GAAI,EAAE,MAAQmC,EAAG,EAAE,IAAM,EAAG,EAAE,oBAAoB1hB,EAAG,GAAIilD,CAAC,EAAE,WAAWjlD,CAAC,GAAK,IAAM,EAAE,MAAQ0hB,EAAG,EAAE,IAAMnC,EAAG,EAAE,oBAAoBvf,EAAG,GAAIilD,CAAC,EAAE,WAAWjlD,CAAC,GAAK,KAAO,EAAE,MAAQ,EAAG,EAAE,IAAMuf,EAAG,EAAE,oBAAoBvf,EAAG,GAAIilD,CAAC,EAAE,WAAWjlD,CAAC,GAAK,GAAI,MAAO,GACvP,MAAMk1B,EAAI,EAAE,SAAS,CAAC,EACtB,GAAI,KAAK,IAAIA,EAAE,gBAAgBl1B,CAAC,CAAC,GAAK,EAAG,CACvC,MAAMwW,EAAI0e,EAAE,aAAal1B,EAAG,CAAC,EAC7B,GAAI,EAAE,cAAcwW,CAAC,EAAG,MAAO,EACjC,CACA,MAAO,EACT,CACF,GAAC,EAAKypG,GAAK,CAAC,IAAK,IAAK,GAAG,EAAGC,GAAK,MAAOC,GAAKD,GAAKA,GAClD,SAASE,GAAGn7D,EAAG,CACb,OAAO,KAAK,IAAIA,CAAC,EAAIi7D,EACvB,CACA,MAAMG,WAAWC,EAAG,CAClB,eAAe,EAAG,CAChB,MAAM,GAAG,CAAC,EAAG,KAAK,mBAAqB,GAAI,KAAK,QAAU,IAAI,MAAM,CAAC,EAAE,KAAI,EAAG,IAAI,IAAM,IAAI9jB,CAAG,EAAG,KAAK,UAAY,IAAI,MAAM,CAAC,EAAE,KAAI,EAAG,IAAI,IAAM,IAAIojB,EAAI,EAAG,KAAK,OAAS,CAAC,KAAK,EAAG,KAAK,EAAG,KAAK,CAAC,EAAG,KAAK,MAAQ,IAAIxjB,GAAM,KAAK,wBAA0B,GAAI,KAAK,sBAAwB,GAAI,KAAK,kBAAoB,IAAI4jB,GAAM,KAAK,YAAc,EACvV,CACA,iBAAiB,EAAG,CAClB,OAAOD,GAAG,EAAG,IAAI,CACnB,CACA,QAAS,CACP,MAAM,EAAI,KAAK,EAAG,EAAI,KAAK,EAAG,EAAI,KAAK,EAAG,EAAI,KAAK,OAAQ3mG,EAAI,KAAK,QAASqD,EAAI,KAAK,UAAWxE,EAAImB,EAAE,CAAC,EAAG,EAAIqD,EAAE,CAAC,EAClH,KAAK,UAAUxE,CAAC,EAAG,EAAE,cAAcA,EAAG,CAAC,EACvC,MAAMyJ,EAAItI,EAAE,CAAC,EAAGjB,EAAIsE,EAAE,CAAC,EACvBiF,EAAE,WAAW,EAAG,CAAC,EAAGvJ,EAAE,cAAcuJ,EAAG,CAAC,EACxC,MAAM,EAAItI,EAAE,CAAC,EAAGpD,EAAIyG,EAAE,CAAC,EACvB,EAAE,WAAW,EAAG,CAAC,EAAGzG,EAAE,cAAc,EAAG,CAAC,EACxC,MAAMkF,EAAI9B,EAAE,CAAC,EAAG7P,EAAIkT,EAAE,CAAC,EACvBvB,EAAE,WAAW,EAAG,CAAC,EAAG3R,EAAE,cAAc2R,EAAG,CAAC,EACxC,MAAMga,EAAIxT,EAAE,OAAM,EAAI9f,EAAI,EAAE,SAAU4U,EAAI0E,EAAE,OAAM,EAClD,KAAK,sBAAwB,GAAI,KAAK,wBAA0B,GAAIga,EAAIgrF,GAAKt+G,EAAIs+G,IAAM1pG,EAAI0pG,GAAK,KAAK,sBAAwB,IAAM,KAAK,wBAA0B,GAAI,KAAK,kBAAkB,MAAM,KAAK,CAAC,EAAG,KAAK,kBAAkB,IAAI,KAAK,CAAC,GAAKt+G,EAAIs+G,GAAK1pG,EAAI0pG,GAAK,KAAK,sBAAwB,IAAM,KAAK,wBAA0B,GAAI,KAAK,kBAAkB,MAAM,KAAK,CAAC,EAAG,KAAK,kBAAkB,IAAI,KAAK,CAAC,GAAK1pG,EAAI0pG,KAAO,KAAK,wBAA0B,GAAI,KAAK,kBAAkB,MAAM,KAAK,CAAC,EAAG,KAAK,kBAAkB,IAAI,KAAK,CAAC,GAAI,KAAK,MAAM,8BAA8BjoG,EAAG,CAAC,EAAG,KAAK,YAAc,EACplB,CACF,CACAooG,GAAG,UAAU,uBAAyC,UAAW,CAC/D,MAAMp7D,EAAoB,IAAIu3C,EAAK,EAAoB,IAAIA,EAAK,EAAoB,IAAIwjB,GACxF,OAAO,SAASpsG,EAAGwF,EAAI,KAAM,EAAI,KAAM,CACrC,KAAM,CAAE,MAAO,EAAG,IAAKpZ,CAAC,EAAK4T,EAAG8N,EAAI,KAAK,OACzC,IAAI,EAAGnC,EAAI,IACX,QAASvJ,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMkF,GAAKlF,EAAI,GAAK,EACpB,EAAE,MAAM,KAAK0L,EAAE1L,CAAC,CAAC,EAAG,EAAE,IAAI,KAAK0L,EAAExG,CAAC,CAAC,EAAG4kG,GAAG,EAAGlsG,EAAGqxC,EAAG,CAAC,EAAG,EAAIA,EAAE,kBAAkB,CAAC,EAAG,EAAI1lC,IAAMA,EAAI,EAAGnG,GAAKA,EAAE,KAAK6rC,CAAC,EAAG,GAAK,EAAE,KAAK,CAAC,EAClI,CACA,OAAO,KAAK,oBAAoB,EAAGA,CAAC,EAAG,EAAI,EAAE,kBAAkBA,CAAC,EAAG,EAAI1lC,IAAMA,EAAI,EAAGnG,GAAKA,EAAE,KAAK6rC,CAAC,EAAG,GAAK,EAAE,KAAK,CAAC,GAAI,KAAK,oBAAoBjlD,EAAGilD,CAAC,EAAG,EAAIjlD,EAAE,kBAAkBilD,CAAC,EAAG,EAAI1lC,IAAMA,EAAI,EAAGnG,GAAKA,EAAE,KAAK6rC,CAAC,EAAG,GAAK,EAAE,KAAKjlD,CAAC,GAAI,KAAK,KAAKuf,CAAC,CAChP,CACF,GAAC,EACD8gG,GAAG,UAAU,oBAAsC,UAAW,CAC5D,MAAMp7D,EAAoB,IAAIo7D,GAAM,EAAoB,IAAIT,GAAM,EAAoB,IAAIA,GAAM,EAAoB,IAAIpjB,EAAK,EAAoB,IAAIA,EAAKpjF,EAAoB,IAAIojF,EAAK//E,EAAoB,IAAI+/E,EAAKvkF,EAAoB,IAAI+nG,GAAM,EAAoB,IAAIA,GAAMt+F,EAAoB,IAAI86E,EAAKrkF,EAAoB,IAAI+kF,GAAM,EAAoB,IAAIA,GACnW,SAASlnF,EAAEE,EAAGuoF,EAAGvmF,EAAGwmF,EAAG,CACrB,MAAMC,EAAI,EACV,CAACzoF,EAAE,uBAAyB,CAACA,EAAE,wBAA0ByoF,EAAE,KAAKzoF,EAAE,MAAM,MAAM,EAAIyoF,EAAE,KAAKF,EAAE,MAAM,MAAM,EACvG,MAAMI,EAAI3oF,EAAE,UAAW6oF,EAAI7oF,EAAE,QAC7B,QAASqoF,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMC,EAAIK,EAAEN,CAAC,EAAGl4F,EAAI04F,EAAER,CAAC,EACvB,GAAI,EAAE,cAAcl4F,EAAGo4F,EAAE,MAAM,EAAGD,EAAE,YAAY,CAAC,IAAM/hF,EAAE,KAAKkiF,CAAC,EAAE,MAAMt4F,CAAC,EAAG,EAAE,cAAcoW,EAAGvG,EAAE,MAAM,EAAG,EAAE,cAAcuG,EAAGgiF,EAAE,MAAM,EAAG,EAAE,YAAY,CAAC,GAAI,MAAO,EACnK,CACA,MAAMO,EAAIP,EAAE,UAAWJ,EAAII,EAAE,QAC7B,QAASF,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMC,EAAIQ,EAAET,CAAC,EAAGl4F,EAAIg4F,EAAEE,CAAC,EACvB,GAAI,EAAE,cAAcl4F,EAAG6P,EAAE,MAAM,EAAGsoF,EAAE,YAAY,CAAC,IAAM/hF,EAAE,aAAakiF,EAAGt4F,CAAC,EAAG,EAAE,cAAcoW,EAAGvG,EAAE,MAAM,EAAG,EAAE,cAAcuG,EAAGgiF,EAAE,MAAM,EAAG,EAAE,YAAY,CAAC,GAAI,MAAO,EACrK,CACA,OAAOvmF,IAAMwmF,GAAK,QAAQ,KAAK,6HAA6H,EAAGxmF,EAAE,MAAM,IAAI,EAAG,EAAG,CAAC,EAAGA,EAAE,IAAI,IAAI,EAAG,EAAG,CAAC,GAAI,EAC5M,CACA,SAASgD,EAAEhF,EAAGuoF,EAAGvmF,EAAGwmF,EAAGC,EAAGE,EAAGE,EAAGC,EAAGX,EAAGE,EAAGC,EAAG,CAC1C,IAAIn4F,EAAI04F,GAAKA,EAAIC,GACjBT,EAAE,EAAIG,GAAKC,EAAID,GAAKr4F,EAAGm4F,EAAE,MAAM,WAAWC,EAAGvoF,CAAC,EAAE,eAAe7P,CAAC,EAAE,IAAI6P,CAAC,EAAG7P,EAAI04F,GAAKA,EAAIV,GAAIE,EAAE,EAAIG,GAAKG,EAAIH,GAAKr4F,EAAGm4F,EAAE,IAAI,WAAWtmF,EAAGhC,CAAC,EAAE,eAAe7P,CAAC,EAAE,IAAI6P,CAAC,CAClK,CACA,SAAS3M,EAAE2M,EAAGuoF,EAAGvmF,EAAGwmF,EAAGC,EAAGE,EAAGE,EAAGC,EAAGX,EAAGE,EAAGC,EAAG,CAC1C,GAAIG,EAAI,EACNzjF,EAAEhF,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGwoF,EAAGD,EAAGvmF,EAAGmmF,EAAGU,EAAGC,EAAGT,EAAGC,CAAC,UAChCK,EAAI,EACX3jF,EAAEhF,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGgC,EAAGumF,EAAGC,EAAGM,EAAGD,EAAGV,EAAGE,EAAGC,CAAC,UAChCQ,EAAIX,EAAI,GAAKU,GAAK,EACzB7jF,EAAEhF,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGuoF,EAAGvmF,EAAGwmF,EAAGK,EAAGC,EAAGX,EAAGE,EAAGC,CAAC,UAChCQ,GAAK,EACZ9jF,EAAEhF,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGgC,EAAGumF,EAAGC,EAAGM,EAAGD,EAAGV,EAAGE,EAAGC,CAAC,UAChCH,GAAK,EACZnjF,EAAEhF,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGwoF,EAAGD,EAAGvmF,EAAGmmF,EAAGU,EAAGC,EAAGT,EAAGC,CAAC,MAEvC,OAAO,GACT,MAAO,EACT,CACA,SAAStpE,EAAEhf,EAAGuoF,EAAGvmF,EAAGwmF,EAAG,CACrB,MAAMC,EAAIF,EAAE,kBAAmBI,EAAI3oF,EAAE,MAAM,gBAAgByoF,EAAE,KAAK,EAAGI,EAAI7oF,EAAE,MAAM,gBAAgByoF,EAAE,GAAG,EACtG,OAAOyhB,GAAGvhB,CAAC,EAAIuhB,GAAGrhB,CAAC,EAAI/oF,EAAEE,EAAGuoF,EAAGvmF,EAAGwmF,CAAC,GAAKxmF,IAAMA,EAAE,MAAM,KAAKymF,EAAE,KAAK,EAAGzmF,EAAE,IAAI,KAAKymF,EAAE,KAAK,GAAIzoF,EAAE,cAAcyoF,EAAE,KAAK,GAAKyhB,GAAGrhB,CAAC,GAAK7mF,IAAMA,EAAE,MAAM,KAAKymF,EAAE,GAAG,EAAGzmF,EAAE,IAAI,KAAKymF,EAAE,GAAG,GAAIzoF,EAAE,cAAcyoF,EAAE,GAAG,GAAKzoF,EAAE,MAAM,cAAcyoF,EAAG,CAAC,GAAK,MAAQzmF,IAAMA,EAAE,MAAM,KAAK,CAAC,EAAGA,EAAE,IAAI,KAAK,CAAC,GAAIhC,EAAE,cAAc,CAAC,GAAK,EAC/S,CACA,SAAStU,EAAEsU,EAAGuoF,EAAGvmF,EAAG,CAClB,MAAMwmF,EAAID,EAAE,EACZ,OAAO2hB,GAAGlqG,EAAE,MAAM,gBAAgBwoF,CAAC,CAAC,GAAKxoF,EAAE,cAAcwoF,CAAC,GAAKxmF,IAAMA,EAAE,MAAM,KAAKwmF,CAAC,EAAGxmF,EAAE,IAAI,KAAKwmF,CAAC,GAAI,IAAM,EAC9G,CACA,SAASloF,EAAEN,EAAGuoF,EAAGvmF,EAAG,CAClB,MAAMwmF,EAAIxoF,EAAE,kBAAmByoF,EAAIF,EAAE,EACrC,OAAOC,EAAE,oBAAoBC,EAAG,GAAI,CAAC,EAAGA,EAAE,kBAAkB,CAAC,EAAIwhB,IAAMjoG,IAAMA,EAAE,MAAM,KAAKymF,CAAC,EAAGzmF,EAAE,IAAI,KAAKymF,CAAC,GAAI,IAAM,EACtH,CACA,SAASzkF,EAAEhE,EAAGuoF,EAAGvmF,EAAGwmF,EAAG,CACrB,GAAIxoF,EAAE,wBACJ,GAAIuoF,EAAE,wBAAyB,CAC7B,MAAME,EAAIzoF,EAAE,kBAAmB2oF,EAAIJ,EAAE,kBAAmBM,EAAI,EAAGC,EAAI5lF,EACnEulF,EAAE,MAAMI,CAAC,EAAGF,EAAE,MAAMG,CAAC,EACrB,MAAMX,EAAI,EAAE,WAAWQ,EAAE,MAAOF,EAAE,KAAK,EAAGJ,EAAIQ,EAAE,EAAIC,EAAE,EAAID,EAAE,EAAIC,EAAE,EAClE,GAAIohB,GAAG7hB,CAAC,EACN,MAAO,GACT,MAAMC,GAAKH,EAAE,EAAIW,EAAE,EAAIX,EAAE,EAAIW,EAAE,GAAKT,EAAGl4F,EAAI,EAAE04F,EAAE,EAAIV,EAAE,EAAIU,EAAE,EAAIV,EAAE,GAAKE,EACtE,GAAIC,EAAI,GAAKA,EAAI,GAAKn4F,EAAI,GAAKA,EAAI,EACjC,MAAO,GACT,MAAM,EAAIs4F,EAAE,MAAM,EAAII,EAAE,EAAIP,EAAGI,EAAIC,EAAE,MAAM,EAAIG,EAAE,EAAI34F,EACrD,OAAO+5G,GAAG,EAAIxhB,CAAC,GAAK1mF,IAAMA,EAAE,MAAM,KAAKymF,EAAE,KAAK,EAAE,gBAAgBI,EAAGP,CAAC,EAAGtmF,EAAE,IAAI,KAAKymF,EAAE,KAAK,EAAE,gBAAgBI,EAAGP,CAAC,GAAI,IAAM,EAC3H,KAAO,QAAOC,EAAE,sBAAwBjoF,EAAEN,EAAGuoF,EAAGvmF,CAAC,EAAIgd,EAAEupE,EAAGvoF,EAAGgC,EAAGwmF,CAAC,MAC9D,CACH,GAAIxoF,EAAE,sBACJ,OAAOuoF,EAAE,sBAAwBA,EAAE,EAAE,kBAAkBvoF,EAAE,CAAC,EAAIiqG,IAAMjoG,IAAMA,EAAE,MAAM,KAAKhC,EAAE,CAAC,EAAGgC,EAAE,IAAI,KAAKhC,EAAE,CAAC,GAAI,IAAM,GAAKuoF,EAAE,wBAA0BjoF,EAAEioF,EAAGvoF,EAAGgC,CAAC,EAAItW,EAAE68F,EAAGvoF,EAAGgC,CAAC,EAC9K,GAAIumF,EAAE,sBACJ,OAAO78F,EAAEsU,EAAGuoF,EAAGvmF,CAAC,EAClB,GAAIumF,EAAE,wBACJ,OAAOvpE,EAAEhf,EAAGuoF,EAAGvmF,EAAGwmF,CAAC,CACvB,CACF,CACA,OAAO,SAASD,EAAG,EAAI,KAAMC,EAAI,GAAI,CACnC,KAAK,aAAe,KAAK,OAAM,EAAID,EAAE,mBAAqBA,EAAE,aAAeA,EAAE,UAAYx5C,EAAE,KAAKw5C,CAAC,EAAGx5C,EAAE,OAAM,EAAIw5C,EAAIx5C,GACpH,MAAM05C,EAAIzkF,EAAE,KAAMukF,EAAG,EAAGC,CAAC,EACzB,GAAIC,IAAM,OACR,OAAOA,EACT,MAAME,EAAI,KAAK,MAAOE,EAAIN,EAAE,MAC5B,IAAIO,EAAID,EAAE,gBAAgB,KAAK,CAAC,EAAGV,EAAIU,EAAE,gBAAgB,KAAK,CAAC,EAAGR,EAAIQ,EAAE,gBAAgB,KAAK,CAAC,EAC9FqhB,GAAGphB,CAAC,IAAMA,EAAI,GAAIohB,GAAG/hB,CAAC,IAAMA,EAAI,GAAI+hB,GAAG7hB,CAAC,IAAMA,EAAI,GAClD,MAAMC,EAAIQ,EAAIX,EAAGh4F,EAAI24F,EAAIT,EACzB,GAAIC,EAAI,GAAKn4F,EAAI,EACf,MAAO,GACT,IAAI4T,EAAI4kF,EAAE,gBAAgBJ,EAAE,CAAC,EAAGG,EAAIC,EAAE,gBAAgBJ,EAAE,CAAC,EAAGK,EAAID,EAAE,gBAAgBJ,EAAE,CAAC,EACrF2hB,GAAGnmG,CAAC,IAAMA,EAAI,GAAImmG,GAAGxhB,CAAC,IAAMA,EAAI,GAAIwhB,GAAGthB,CAAC,IAAMA,EAAI,GAClD,MAAMljF,EAAK3B,EAAI2kF,EAAG2C,EAAItnF,EAAI6kF,EAC1B,GAAIljF,EAAK,GAAK2lF,EAAI,EAChB,MAAO,GACT,EAAE,KAAK1C,EAAE,MAAM,EAAGzlF,EAAE,KAAK2lF,EAAE,MAAM,EACjC,MAAME,EAAI,EAAE,MAAM7lF,CAAC,EACnB,IAAI+lF,GAAI,EAAGD,EAAI,KAAK,IAAID,EAAE,CAAC,EAC3B,MAAMuC,EAAI,KAAK,IAAIvC,EAAE,CAAC,EACtBuC,EAAItC,IAAMA,EAAIsC,EAAGrC,GAAI,GAAI,KAAK,IAAIF,EAAE,CAAC,EAAIC,IAAMC,GAAI,GACnD,MAAMnnF,GAAIioG,GAAG9gB,EAAC,EAAGtyE,GAAK,KAAK,EAAE7U,EAAC,EAAG0pF,GAAK,KAAK,EAAE1pF,EAAC,EAAG,GAAK,KAAK,EAAEA,EAAC,EAAG4pF,GAAKnD,EAAE,EAAEzmF,EAAC,EAAG6pF,GAAKpD,EAAE,EAAEzmF,EAAC,EAAGkI,GAAKu+E,EAAE,EAAEzmF,EAAC,EACrG,GAAIzO,EAAE,KAAMsjB,GAAI60E,GAAI,GAAIlD,EAAGn4F,EAAG24F,EAAGX,EAAGE,EAAGpmF,EAAGF,CAAC,EACzC,OAAOjC,EAAE,KAAMyoF,EAAG,EAAGC,CAAC,EACxB,GAAIn1F,EAAEk1F,EAAGmD,GAAIC,GAAI3hF,GAAItE,EAAI2lF,EAAGtnF,EAAG2kF,EAAGE,EAAG,EAAG,CAAC,EACvC,OAAO9oF,EAAE,KAAMyoF,EAAG,EAAGC,CAAC,EACxB,GAAIvmF,EAAE,EAAIA,EAAE,EAAG,CACb,MAAM2pF,GAAK3pF,EAAE,EACbA,EAAE,EAAIA,EAAE,EAAGA,EAAE,EAAI2pF,GAAIpgF,EAAE,KAAKzJ,EAAE,KAAK,EAAGA,EAAE,MAAM,KAAKA,EAAE,GAAG,EAAGA,EAAE,IAAI,KAAKyJ,CAAC,CACzE,CACA,GAAI,EAAE,EAAI,EAAE,EAAG,CACb,MAAMogF,GAAK,EAAE,EACb,EAAE,EAAI,EAAE,EAAG,EAAE,EAAIA,GAAIpgF,EAAE,KAAK,EAAE,KAAK,EAAG,EAAE,MAAM,KAAK,EAAE,GAAG,EAAG,EAAE,IAAI,KAAKA,CAAC,CACzE,CACA,OAAOvJ,EAAE,EAAI,EAAE,GAAK,EAAE,EAAIA,EAAE,EAAI,IAAM,IAAM,EAAE,EAAIA,EAAE,EAAI,EAAE,MAAM,KAAK,EAAE,KAAK,EAAI,EAAE,MAAM,KAAKF,EAAE,KAAK,EAAG,EAAE,EAAIE,EAAE,EAAI,EAAE,IAAI,KAAK,EAAE,GAAG,EAAI,EAAE,IAAI,KAAKF,EAAE,GAAG,GAAI,GAC7J,CACF,GAAC,EACDooG,GAAG,UAAU,iBAAmC,UAAW,CACzD,MAAMp7D,EAAoB,IAAIu3C,EAC9B,OAAO,SAASt8F,EAAG,CACjB,OAAO,KAAK,oBAAoBA,EAAG+kD,CAAC,EAAG/kD,EAAE,WAAW+kD,CAAC,CACvD,CACF,GAAC,EACDo7D,GAAG,UAAU,oBAAsC,UAAW,CAC5D,MAAMp7D,EAAoB,IAAIu3C,EAAK,EAAoB,IAAIA,EAAK,EAAI,CAAC,IAAK,IAAK,GAAG,EAAG,EAAoB,IAAIwjB,GAAM,EAAoB,IAAIA,GAC3I,OAAO,SAAS,EAAG,EAAI,KAAMhgH,EAAI,KAAM,CACrC,MAAM0hB,EAAI,GAAK1hB,EAAI,EAAI,KACvB,GAAI,KAAK,mBAAmB,EAAG0hB,CAAC,EAC9B,OAAQ,GAAK1hB,KAAO,GAAK0hB,EAAE,UAAU,CAAC,EAAG1hB,GAAK0hB,EAAE,UAAU1hB,CAAC,GAAI,EACjE,IAAI,EAAI,IACR,QAASuf,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAIvJ,EACJ,MAAMkF,EAAI,EAAEqE,CAAC,EAAG,EAAI,EAAErE,CAAC,EACvB,KAAK,oBAAoB,EAAG+pC,CAAC,EAAGjvC,EAAI,EAAE,kBAAkBivC,CAAC,EAAGjvC,EAAI,IAAM,EAAIA,EAAG,GAAK,EAAE,KAAKivC,CAAC,EAAGjlD,GAAKA,EAAE,KAAK,CAAC,GAC1G,MAAMk1B,EAAI,KAAKha,CAAC,EAChB,EAAE,oBAAoBga,EAAG+vB,CAAC,EAAGjvC,EAAIkf,EAAE,kBAAkB+vB,CAAC,EAAGjvC,EAAI,IAAM,EAAIA,EAAG,GAAK,EAAE,KAAKkf,CAAC,EAAGl1B,GAAKA,EAAE,KAAKilD,CAAC,EACzG,CACA,QAAS1lC,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMvJ,EAAI,EAAEuJ,CAAC,EAAGrE,EAAI,GAAGqE,EAAI,GAAK,CAAC,EACjC,EAAE,IAAI,KAAKvJ,CAAC,EAAG,KAAKkF,CAAC,CAAC,EACtB,QAAS,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,MAAMga,EAAI,EAAE,CAAC,EAAGtzB,EAAI,GAAG,EAAI,GAAK,CAAC,EACjC,EAAE,IAAI,EAAEszB,CAAC,EAAG,EAAEtzB,CAAC,CAAC,EAAGk+G,GAAG,EAAG,EAAG76D,EAAG,CAAC,EAChC,MAAMzuC,EAAIyuC,EAAE,kBAAkB,CAAC,EAC/BzuC,EAAI,IAAM,EAAIA,EAAG,GAAK,EAAE,KAAKyuC,CAAC,EAAGjlD,GAAKA,EAAE,KAAK,CAAC,EAChD,CACF,CACA,OAAO,KAAK,KAAK,CAAC,CACpB,CACF,GAAC,EACD,MAAMugH,EAAG,CACP,YAAY,EAAG,EAAG,EAAG,CACnB,KAAK,cAAgB,GAAI,KAAK,IAAM,IAAI/jB,EAAK,KAAK,IAAM,IAAIA,EAAK,KAAK,OAAS,IAAIoE,GAAM,KAAK,UAAY,IAAIA,GAAM,KAAK,OAAS,IAAI,MAAM,CAAC,EAAE,KAAI,EAAG,IAAI,IAAM,IAAIpE,CAAG,EAAG,KAAK,QAAU,IAAI,MAAM,CAAC,EAAE,OAAO,IAAI,IAAM,IAAIA,CAAG,EAAG,KAAK,UAAY,IAAI,MAAM,CAAC,EAAE,OAAO,IAAI,IAAM,IAAIojB,EAAI,EAAG,KAAK,iBAAmB,IAAI,MAAM,CAAC,EAAE,KAAI,EAAG,IAAI,IAAM,IAAIA,EAAI,EAAG,KAAK,YAAc,GAAI,GAAK,KAAK,IAAI,KAAK,CAAC,EAAG,GAAK,KAAK,IAAI,KAAK,CAAC,EAAG,GAAK,KAAK,OAAO,KAAK,CAAC,CAC1b,CACA,IAAI,EAAG,EAAG,EAAG,CACX,KAAK,IAAI,KAAK,CAAC,EAAG,KAAK,IAAI,KAAK,CAAC,EAAG,KAAK,OAAO,KAAK,CAAC,EAAG,KAAK,YAAc,EAC9E,CACA,KAAK,EAAG,CACN,KAAK,IAAI,KAAK,EAAE,GAAG,EAAG,KAAK,IAAI,KAAK,EAAE,GAAG,EAAG,KAAK,OAAO,KAAK,EAAE,MAAM,EAAG,KAAK,YAAc,EAC7F,CACF,CACAW,GAAG,UAAU,QAA0B,UAAW,CAChD,OAAO,UAAW,CAChB,MAAMx/G,EAAI,KAAK,OAAQb,EAAI,KAAK,IAAK6V,EAAI,KAAK,IAAKnC,EAAI,KAAK,OAC5D,QAAS8N,EAAI,EAAGA,GAAK,EAAGA,IACtB,QAAS,EAAI,EAAG,GAAK,EAAG,IACtB,QAASnC,EAAI,EAAGA,GAAK,EAAGA,IAAK,CAC3B,MAAMvJ,EAAI,EAAI0L,EAAI,EAAI,EAAI,EAAInC,EAAGrE,EAAItH,EAAEoC,CAAC,EACxCkF,EAAE,EAAIwG,EAAI3L,EAAE,EAAI7V,EAAE,EAAGgb,EAAE,EAAI,EAAInF,EAAE,EAAI7V,EAAE,EAAGgb,EAAE,EAAIqE,EAAIxJ,EAAE,EAAI7V,EAAE,EAAGgb,EAAE,aAAana,CAAC,CACjF,CACJ,MAAMqY,EAAI,KAAK,UAAW,EAAI,KAAK,QAAS,EAAIxF,EAAE,CAAC,EACnD,QAAS8N,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAM,EAAI,EAAEA,CAAC,EAAGnC,EAAInG,EAAEsI,CAAC,EAAG1L,EAAI,GAAK0L,EAAGxG,EAAItH,EAAEoC,CAAC,EAC7C,EAAE,WAAW,EAAGkF,CAAC,EAAGqE,EAAE,cAAc,EAAG3L,CAAC,CAC1C,CACA,MAAM5T,EAAI,KAAK,iBACfA,EAAE,CAAC,EAAE,mBAAmB4T,EAAG,GAAG,EAAG5T,EAAE,CAAC,EAAE,mBAAmB4T,EAAG,GAAG,EAAG5T,EAAE,CAAC,EAAE,mBAAmB4T,EAAG,GAAG,EAAG,KAAK,UAAU,KAAK,KAAK,MAAM,EAAE,OAAM,EAAI,KAAK,YAAc,EACnK,CACF,GAAC,EACD2sG,GAAG,UAAU,eAAiC,UAAW,CACvD,MAAMt7D,EAAoB,IAAI26D,GAC9B,OAAO,SAAS1/G,EAAG,CACjB,KAAK,aAAe,KAAK,OAAM,EAC/B,MAAM6V,EAAI7V,EAAE,IAAK0T,EAAI1T,EAAE,IAAKkZ,EAAI,KAAK,UAAW,EAAI,KAAK,QAAS,EAAI,KAAK,iBAC3E,GAAI6rC,EAAE,IAAMlvC,EAAE,EAAGkvC,EAAE,IAAMrxC,EAAE,EAAG,EAAE,CAAC,EAAE,YAAYqxC,CAAC,IAAMA,EAAE,IAAMlvC,EAAE,EAAGkvC,EAAE,IAAMrxC,EAAE,EAAG,EAAE,CAAC,EAAE,YAAYqxC,CAAC,KAAOA,EAAE,IAAMlvC,EAAE,EAAGkvC,EAAE,IAAMrxC,EAAE,EAAG,EAAE,CAAC,EAAE,YAAYqxC,CAAC,GAAI,MAAO,GAChK,QAASjlD,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAM0hB,EAAI,EAAE1hB,CAAC,EAAG,EAAIoZ,EAAEpZ,CAAC,EACvB,GAAIilD,EAAE,WAAWvjC,EAAGxhB,CAAC,EAAG,EAAE,YAAY+kD,CAAC,EAAG,MAAO,EACnD,CACA,MAAO,EACT,CACF,GAAC,EACDs7D,GAAG,UAAU,oBAAsC,UAAW,CAC5D,MAAMt7D,EAAoB,IAAIo7D,GAAM,EAAoB,IAAI,MAAM,CAAC,EAAG,EAAoB,IAAIT,GAAM,EAAoB,IAAIA,GAAM,EAAoB,IAAIpjB,EAC1J,OAAO,SAAS,EAAG,CACjB,KAAK,aAAe,KAAK,OAAM,EAAI,EAAE,mBAAqB,EAAE,aAAe,EAAE,UAAYv3C,EAAE,KAAK,CAAC,EAAGA,EAAE,OAAM,EAAI,EAAIA,GACpH,MAAM,EAAI,KAAK,UAAWjlD,EAAI,KAAK,QACnC,EAAE,CAAC,EAAI,EAAE,EAAG,EAAE,CAAC,EAAI,EAAE,EAAG,EAAE,CAAC,EAAI,EAAE,EACjC,QAASgW,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMkF,EAAI,EAAElF,CAAC,EAAG,EAAIhW,EAAEgW,CAAC,EACvB,GAAI,EAAE,cAAc,EAAG,CAAC,EAAGkF,EAAE,YAAY,CAAC,EAAG,MAAO,EACtD,CACA,MAAMwG,EAAI,EAAE,UAAW,EAAI,EAAE,QAASnC,EAAI,KAAK,OAC/C,QAASvJ,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMkF,EAAIwG,EAAE1L,CAAC,EAAG,EAAI,EAAEA,CAAC,EACvB,GAAI,EAAE,cAAc,EAAGuJ,CAAC,EAAGrE,EAAE,YAAY,CAAC,EAAG,MAAO,EACtD,CACA,QAASlF,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMkF,EAAIlb,EAAEgW,CAAC,EACb,QAAS,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,MAAMkf,EAAI,EAAE,CAAC,EACb,GAAI,EAAE,aAAaha,EAAGga,CAAC,EAAG,EAAE,cAAc,EAAG,CAAC,EAAG,EAAE,cAAc,EAAG3V,CAAC,EAAG,EAAE,YAAY,CAAC,EAAG,MAAO,EACnG,CACF,CACA,MAAO,EACT,CACF,GAAC,EACDghG,GAAG,UAAU,qBAAuC,UAAW,CAC7D,OAAO,SAASx/G,EAAGb,EAAG,CACpB,OAAO,KAAK,aAAe,KAAK,OAAM,EAAIA,EAAE,KAAKa,CAAC,EAAE,aAAa,KAAK,SAAS,EAAE,MAAM,KAAK,IAAK,KAAK,GAAG,EAAE,aAAa,KAAK,MAAM,EAAGb,CACxI,CACF,GAAC,EACDqgH,GAAG,UAAU,iBAAmB,UAAW,CACzC,MAAMt7D,EAAI,IAAIu3C,EACd,OAAO,SAASt8F,EAAG,CACjB,OAAO,KAAK,oBAAoBA,EAAG+kD,CAAC,EAAG/kD,EAAE,WAAW+kD,CAAC,CACvD,CACF,GAAC,EACDs7D,GAAG,UAAU,eAAiC,UAAW,CACvD,MAAMt7D,EAAI,CAAC,IAAK,IAAK,GAAG,EAAG,EAAoB,IAAI,MAAM,EAAE,EAAE,KAAI,EAAG,IAAI,IAAM,IAAI+6D,EAAI,EAAG,EAAoB,IAAI,MAAM,EAAE,EAAE,KAAI,EAAG,IAAI,IAAM,IAAIA,EAAI,EAAG,EAAoB,IAAIxjB,EAAK,EAAoB,IAAIA,EAC5M,OAAO,SAAS,EAAG,EAAI,EAAGx8F,EAAI,KAAM0hB,EAAI,KAAM,CAC5C,GAAI,KAAK,aAAe,KAAK,OAAM,EAAI,KAAK,cAAc,CAAC,EACzD,OAAQ1hB,GAAK0hB,KAAO,EAAE,UAAU,CAAC,EAAG,KAAK,oBAAoB,EAAG,CAAC,EAAG,EAAE,oBAAoB,EAAG,CAAC,EAAG1hB,GAAKA,EAAE,KAAK,CAAC,EAAG0hB,GAAKA,EAAE,KAAK,CAAC,GAAI,EACpI,MAAM,EAAI,EAAI,EAAGnC,EAAI,EAAE,IAAKvJ,EAAI,EAAE,IAAKkF,EAAI,KAAK,OAChD,IAAI,EAAI,IACR,QAAStZ,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAM4U,EAAI0E,EAAEtZ,CAAC,EACb,EAAE,KAAK4U,CAAC,EAAE,MAAM+I,EAAGvJ,CAAC,EACpB,MAAMkE,EAAI1D,EAAE,kBAAkB,CAAC,EAC/B,GAAI0D,EAAI,IAAM,EAAIA,EAAGla,GAAKA,EAAE,KAAKwW,CAAC,EAAGkL,GAAKA,EAAE,KAAK,CAAC,EAAGxH,EAAI,GACvD,OAAO,KAAK,KAAKA,CAAC,CACtB,CACA,IAAIgb,EAAI,EACR,QAAStzB,EAAI,EAAGA,EAAI,EAAGA,IACrB,QAAS4U,EAAI,EAAGA,GAAK,EAAGA,IACtB,QAAS0D,EAAI,EAAGA,GAAK,EAAGA,IAAK,CAC3B,MAAMhE,GAAKtU,EAAI,GAAK,EAAG68F,GAAK78F,EAAI,GAAK,EAAG,EAAI4U,GAAKN,EAAIgE,GAAKukF,EAAGC,EAAI,GAAK98F,EAAI4U,GAAKN,EAAIgE,GAAKukF,EAAGE,EAAIzjF,EAAE,CAAC,EAAG2jF,EAAI3jF,EAAEwjF,CAAC,EAC5G,EAAExpE,CAAC,EAAE,IAAIypE,EAAGE,CAAC,EACb,MAAMG,EAAI/5C,EAAErjD,CAAC,EAAGy8F,EAAIp5C,EAAE/uC,CAAC,EAAGqoF,EAAIt5C,EAAEw5C,CAAC,EAAGD,EAAI,EAAEtpE,CAAC,EAAG7uB,EAAIm4F,EAAE,MAAOvkF,EAAIukF,EAAE,IACjEn4F,EAAE24F,CAAC,EAAIz/E,EAAEy/E,CAAC,EAAG34F,EAAEg4F,CAAC,EAAI7nF,EAAI+I,EAAE8+E,CAAC,EAAIroF,EAAEqoF,CAAC,EAAGh4F,EAAEk4F,CAAC,EAAIrkF,EAAIqF,EAAEg/E,CAAC,EAAIvoF,EAAEqoF,CAAC,EAAGpkF,EAAE+kF,CAAC,EAAIhpF,EAAEgpF,CAAC,EAAG/kF,EAAEokF,CAAC,EAAI7nF,EAAI+I,EAAE8+E,CAAC,EAAIroF,EAAEqoF,CAAC,EAAGpkF,EAAEskF,CAAC,EAAIrkF,EAAIqF,EAAEg/E,CAAC,EAAIvoF,EAAEqoF,CAAC,EAAGnpE,GAC5H,CACJ,QAAStzB,EAAI,EAAGA,GAAK,EAAGA,IACtB,QAAS4U,EAAI,EAAGA,GAAK,EAAGA,IACtB,QAAS0D,EAAI,EAAGA,GAAK,EAAGA,IAAK,CAC3B,EAAE,EAAItY,EAAIoU,EAAE,EAAIuJ,EAAE,EAAG,EAAE,EAAI/I,EAAIR,EAAE,EAAIuJ,EAAE,EAAG,EAAE,EAAIrF,EAAIlE,EAAE,EAAIuJ,EAAE,EAAG,KAAK,oBAAoB,EAAG,CAAC,EAC5F,MAAMrJ,EAAI,EAAE,kBAAkB,CAAC,EAC/B,GAAIA,EAAI,IAAM,EAAIA,EAAGlW,GAAKA,EAAE,KAAK,CAAC,EAAG0hB,GAAKA,EAAE,KAAK,CAAC,EAAGxL,EAAI,GACvD,OAAO,KAAK,KAAKA,CAAC,CACtB,CACJ,QAAStU,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,MAAM4U,EAAI,EAAE5U,CAAC,EACb,QAASsY,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,MAAMhE,EAAI,EAAEgE,CAAC,EACb4lG,GAAGtpG,EAAGN,EAAG,EAAG,CAAC,EACb,MAAMuoF,EAAI,EAAE,kBAAkB,CAAC,EAC/B,GAAIA,EAAI,IAAM,EAAIA,EAAGz+F,GAAKA,EAAE,KAAK,CAAC,EAAG0hB,GAAKA,EAAE,KAAK,CAAC,EAAG+8E,EAAI,GACvD,OAAO,KAAK,KAAKA,CAAC,CACtB,CACF,CACA,OAAO,KAAK,KAAK,CAAC,CACpB,CACF,GAAC,EACD,MAAM+hB,EAAG,CACP,YAAY,EAAG,CACb,KAAK,iBAAmB,EAAG,KAAK,YAAc,CAAA,CAChD,CACA,cAAe,CACb,MAAM,EAAI,KAAK,YACf,OAAO,EAAE,SAAW,EAAI,KAAK,iBAAgB,EAAK,EAAE,IAAG,CACzD,CACA,iBAAiB,EAAG,CAClB,KAAK,YAAY,KAAK,CAAC,CACzB,CACF,CACA,MAAMC,WAAWD,EAAG,CAClB,aAAc,CACZ,MAAM,IAAM,IAAIH,EAAI,CACtB,CACF,CACA,MAAMK,GAAqB,IAAID,GAC/B,SAASE,GAAG17D,EAAG,EAAG,CAChB,OAAO,EAAEA,EAAI,EAAE,IAAMu4D,EACvB,CACA,SAASoD,GAAG37D,EAAG,EAAG,CAChB,OAAO,EAAEA,EAAI,CAAC,CAChB,CACA,SAAS47D,GAAG57D,EAAG,EAAG,CAChB,OAAO,EAAEA,EAAI,EAAE,CACjB,CACA,SAAS67D,GAAG77D,EAAG,CACb,OAAOA,EAAIs4D,EACb,CACA,SAASwD,GAAG97D,EAAG,EAAG,CAChB,MAAM,EAAI,EAAEA,EAAI,CAAC,EACjB,OAAOA,EAAI,EAAIs4D,EACjB,CACA,SAASyD,GAAG/7D,EAAG,EAAG,CAChB,OAAO,EAAEA,EAAI,CAAC,CAChB,CACA,MAAMg8D,EAAG,CACP,aAAc,CACZ,KAAK,aAAe,KAAM,KAAK,YAAc,KAAM,KAAK,YAAc,KACtE,MAAM,EAAI,CAAA,EACV,IAAI,EAAI,KACR,KAAK,UAAa,GAAM,CACtB,GAAK,EAAE,KAAK,CAAC,EAAG,EAAI,EAAG,KAAK,aAAe,IAAI,aAAa,CAAC,EAAG,KAAK,YAAc,IAAI,YAAY,CAAC,EAAG,KAAK,YAAc,IAAI,YAAY,CAAC,CAC7I,EAAG,KAAK,YAAc,IAAM,CAC1B,EAAI,KAAM,KAAK,aAAe,KAAM,KAAK,YAAc,KAAM,KAAK,YAAc,KAAM,EAAE,SAAW,GAAK,KAAK,UAAU,EAAE,KAAK,CAChI,CACF,CACF,CACA,MAAMC,GAAqB,IAAID,GAC/B,IAAIE,GAAIC,GACR,MAAMC,GAAK,CAAA,EAAIC,GAAqB,IAAId,GAAG,IAAM,IAAI1H,EAAI,EACzD,SAASyI,GAAGt8D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAG,CAC5B+nG,GAAKG,GAAG,aAAY,EAAIF,GAAKE,GAAG,aAAY,EAAID,GAAG,KAAKF,GAAIC,EAAE,EAAGF,GAAG,UAAUj8D,EAAE,OAAO,CAAC,CAAC,EACzF,MAAMxoC,EAAI+kG,GAAG,EAAGv8D,EAAE,SAAU,EAAG,EAAG,EAAG7rC,CAAC,EACtC8nG,GAAG,YAAW,EAAII,GAAG,iBAAiBH,EAAE,EAAGG,GAAG,iBAAiBF,EAAE,EAAGC,GAAG,IAAG,EAAIA,GAAG,IAAG,EACpF,MAAMppG,EAAIopG,GAAG,OACb,OAAOppG,EAAI,IAAMmpG,GAAKC,GAAGppG,EAAI,CAAC,EAAGkpG,GAAKE,GAAGppG,EAAI,CAAC,GAAIwE,CACpD,CACA,SAAS+kG,GAAGv8D,EAAG,EAAG,EAAG,EAAG,EAAI,KAAM7rC,EAAI,EAAGqD,EAAI,EAAG,CAC9C,KAAM,CAAE,aAAcxE,EAAG,YAAa,EAAG,YAAayJ,CAAC,EAAKw/F,GAC5D,IAAI/oG,EAAI8sC,EAAI,EACZ,GAAI07D,GAAGxoG,EAAG,CAAC,EAAG,CACZ,MAAMnC,EAAI4qG,GAAG37D,EAAGvjC,CAAC,EAAGxG,EAAI2lG,GAAG1oG,EAAG,CAAC,EAC/B,OAAO+lG,GAAGj5D,EAAGhtC,EAAGkpG,EAAE,EAAG,EAAEnrG,EAAGkF,EAAG,GAAIuB,EAAGrD,EAAI6rC,EAAIs4D,GAAI4D,EAAE,CACpD,KAAO,CACL,IAAIniB,EAAI,SAAST,EAAG,CAClB,KAAM,CAAE,YAAaC,EAAG,YAAan4F,CAAC,EAAK66G,GAC3C,IAAIjnG,EAAIskF,EAAI,EACZ,KAAO,CAACoiB,GAAG1mG,EAAGukF,CAAC,GACbD,EAAIuiB,GAAGviB,CAAC,EAAGtkF,EAAIskF,EAAI,EACrB,OAAOqiB,GAAGriB,EAAGl4F,CAAC,CAChB,EAAGg4F,EAAI,SAASE,EAAG,CACjB,KAAM,CAAE,YAAaC,EAAG,YAAan4F,CAAC,EAAK66G,GAC3C,IAAIjnG,EAAIskF,EAAI,EACZ,KAAO,CAACoiB,GAAG1mG,EAAGukF,CAAC,GACbD,EAAIwiB,GAAGxiB,EAAGl4F,CAAC,EAAG4T,EAAIskF,EAAI,EACxB,OAAOqiB,GAAGriB,EAAGl4F,CAAC,EAAIw6G,GAAG5mG,EAAGukF,CAAC,CAC3B,EACA,MAAMxoF,EAAI8qG,GAAG77D,CAAC,EAAG/pC,EAAI6lG,GAAG97D,EAAGvjC,CAAC,EAC5B,IAAInY,EAAIyM,EAAGkf,EAAIha,EAAG,EAAG,EAAGhB,EAAGhE,EAC3B,GAAI,IAAMgE,EAAIinG,GAAIjrG,EAAIkrG,GAAIlD,GAAG30G,EAAG0O,EAAGiC,CAAC,EAAGgkG,GAAGhpF,EAAGjd,EAAG/B,CAAC,EAAG,EAAI,EAAEgE,CAAC,EAAG,EAAI,EAAEhE,CAAC,EAAG,EAAI,GAAI,CAC9E3M,EAAI2R,EAAGga,EAAIlf,EACX,MAAMuoF,EAAI,EACV,EAAI,EAAG,EAAIA,EAAGrkF,EAAIhE,CACpB,CACAgE,IAAMA,EAAIinG,GAAIjD,GAAG30G,EAAG0O,EAAGiC,CAAC,GACxB,MAAM,EAAIymG,GAAGp3G,EAAI,EAAG,CAAC,EAAG2O,EAAI,EAAEgC,EAAG,EAAG,EAAGuC,EAAI,EAAGrD,EAAI7P,EAAIg0G,EAAE,EACxD,IAAI7e,EACJ,GAAIxmF,IAAMilG,GAAI,CACZ,MAAM5e,EAAIS,EAAEz1F,CAAC,EAAGlD,EAAIg4F,EAAE90F,CAAC,EAAIg1F,EAC3BG,EAAI,EAAEH,EAAGl4F,EAAG,GAAIoW,EAAI,EAAGrD,EAAI7P,EAAIg0G,GAAIrjG,CAAC,CACtC,MACEwkF,EAAIxmF,GAAKspG,GACPj4G,EACA,EACA,EACA,EACA,EACA6P,EACAqD,EAAI,CACZ,EACI,GAAIiiF,EAAG,MAAO,GACdxoF,EAAIkrG,GAAIlD,GAAGhpF,EAAGjd,EAAG/B,CAAC,EAClB,MAAMyoF,EAAIgiB,GAAGzrF,EAAI,EAAG,CAAC,EAAG2pE,EAAI,EAAE3oF,EAAGyoF,EAAG,EAAGliF,EAAI,EAAGrD,EAAI8b,EAAIqoF,EAAE,EACxD,IAAIxe,EACJ,GAAIF,IAAMse,GAAI,CACZ,MAAM5e,EAAIS,EAAE9pE,CAAC,EAAG7uB,EAAIg4F,EAAEnpE,CAAC,EAAIqpE,EAC3BQ,EAAI,EAAER,EAAGl4F,EAAG,GAAIoW,EAAI,EAAGrD,EAAI8b,EAAIqoF,GAAIrnG,CAAC,CACtC,MACE6oF,EAAIF,GAAK2iB,GACPtsF,EACA,EACA,EACA,EACA,EACA9b,EACAqD,EAAI,CACZ,EACI,MAAO,CAAC,CAACsiF,CACX,CACF,CACA,MAAM0iB,GAAqB,IAAIjlB,EAAKklB,GAAqB,IAAIllB,EAC7D,SAASmlB,GAAG18D,EAAG,EAAG,EAAI,CAAA,EAAI,EAAI,EAAG,EAAI,IAAO,CAC1C,MAAM7rC,EAAI,EAAI,EAAGqD,EAAI,EAAI,EACzB,IAAIxE,EAAI,IAAO,EAAI,KACnB,GAAIgtC,EAAE,UACJ,CACE,oBAAsB9sC,IAAOspG,GAAG,KAAK,CAAC,EAAE,MAAMtpG,EAAE,IAAKA,EAAE,GAAG,EAAGspG,GAAG,kBAAkB,CAAC,GACnF,iBAAkB,CAACtpG,EAAG,EAAGnC,IAAMA,EAAIiC,GAAKjC,EAAIyG,EAC5C,mBAAoB,CAACtE,EAAG,IAAM,CAC5BA,EAAE,oBAAoB,EAAGspG,EAAE,EAC3B,MAAMzrG,EAAI,EAAE,kBAAkByrG,EAAE,EAChC,OAAOzrG,EAAIiC,IAAMypG,GAAG,KAAKD,EAAE,EAAGxpG,EAAIjC,EAAG,EAAI,GAAIA,EAAIoD,CACnD,CACN,CACA,EAAKnB,IAAM,IAAO,OAAO,KACvB,MAAMyJ,EAAI,KAAK,KAAKzJ,CAAC,EACrB,OAAO,EAAE,MAAQ,EAAE,MAAM,KAAKypG,EAAE,EAAI,EAAE,MAAQA,GAAG,MAAK,EAAI,EAAE,SAAWhgG,EAAG,EAAE,UAAY,EAAG,CAC7F,CACA,MAAMkgG,GAAK,SAASC,EAAE,GAAK,IAAKC,GAAK,SAASD,EAAE,GAAK,IAAKE,GAAqB,IAAIvlB,EAAKwlB,GAAqB,IAAIxlB,EAAKylB,GAAqB,IAAIzlB,EAAK0lB,GAAqB,IAAIhlB,GAAMilB,GAAqB,IAAIjlB,GAAMklB,GAAqB,IAAIllB,GAAMmlB,GAAqB,IAAI7lB,EAAK8lB,GAAqB,IAAI9lB,EAAK+lB,GAAqB,IAAI/lB,EAAKgmB,GAAqB,IAAIhmB,EACpW,SAASimB,GAAGx9D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAGxE,EAAG,CAClC,IAAI,EACJ,GAAImB,IAAMspG,GAAK,EAAIz9D,EAAE,kBAAkB,EAAG,EAAG,EAAG,GAAI,CAAC,EAAI,EAAIA,EAAE,kBAAkB,EAAG,EAAG,EAAG7rC,IAAM0+F,GAAI,CAAC,EAAG,IAAM,KAAM,OAAO,KAC3H,MAAMp2F,EAAIujC,EAAE,OAAO,WAAW,CAAC,EAC/B,OAAOvjC,EAAIjF,GAAKiF,EAAIzJ,EAAI,KAAO,CAC7B,SAAUyJ,EACV,MAAO,EAAE,MAAK,CAClB,CACA,CACA,SAASihG,GAAG19D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAGxE,EAAG,EAAGyJ,EAAGvJ,EAAG,CAC3C4pG,GAAG,oBAAoB,EAAG3oG,CAAC,EAAG4oG,GAAG,oBAAoB,EAAGvlG,CAAC,EAAGwlG,GAAG,oBAAoB,EAAGhqG,CAAC,EACvF,MAAM,EAAIwqG,GAAGx9D,EAAG88D,GAAIC,GAAIC,GAAIO,GAAI,EAAG9gG,EAAGvJ,CAAC,EACvC,GAAI,EAAG,CACL,GAAI,EAAG,CACL+pG,GAAG,oBAAoB,EAAG9oG,CAAC,EAAG+oG,GAAG,oBAAoB,EAAG1lG,CAAC,EAAG2lG,GAAG,oBAAoB,EAAGnqG,CAAC,EAAG,EAAE,GAAK,IAAIilF,GACrG,MAAMhiF,EAAIolG,GAAG,iBAAiBkC,GAAIT,GAAIC,GAAIC,GAAIC,GAAIC,GAAIC,GAAI,EAAE,EAAE,EAC9DR,KAAO,EAAE,GAAK1mG,EAChB,CACA,GAAI,EAAG,CACLgnG,GAAG,oBAAoB,EAAG9oG,CAAC,EAAG+oG,GAAG,oBAAoB,EAAG1lG,CAAC,EAAG2lG,GAAG,oBAAoB,EAAGnqG,CAAC,EAAG,EAAE,IAAM,IAAIilF,GACtG,MAAMhiF,EAAIolG,GAAG,iBAAiBkC,GAAIT,GAAIC,GAAIC,GAAIC,GAAIC,GAAIC,GAAI,EAAE,GAAG,EAC/DR,KAAO,EAAE,IAAM1mG,GAAI4mG,KAAO,EAAE,IAAM,EAAE,IACtC,CACA,GAAI,EAAG,CACLO,GAAG,oBAAoB,EAAGjpG,CAAC,EAAGkpG,GAAG,oBAAoB,EAAG7lG,CAAC,EAAG8lG,GAAG,oBAAoB,EAAGtqG,CAAC,EAAG,EAAE,OAAS,IAAIukF,EACzG,MAAMthF,EAAIolG,GAAG,iBAAiBkC,GAAIT,GAAIC,GAAIC,GAAII,GAAIC,GAAIC,GAAI,EAAE,MAAM,EAClE,EAAE,OAAO,IAAIt9D,EAAE,SAAS,EAAI,GAAK,EAAE,OAAO,eAAe,EAAE,EAAG28D,KAAO,EAAE,OAAS1mG,EAClF,CACA,MAAMlF,EAAI,CACR,EAAGoD,EACH,EAAGqD,EACH,EAAGxE,EACH,OAAQ,IAAIukF,EACZ,cAAe,CACrB,EACI,GAAI8jB,GAAG,UAAUyB,GAAIC,GAAIC,GAAIjsG,EAAE,MAAM,EAAG,EAAE,KAAOA,EAAG,EAAE,UAAYoD,EAAGwoG,GAAI,CACvE,MAAM1mG,EAAI,IAAIshF,EACd8jB,GAAG,aAAakC,GAAIT,GAAIC,GAAIC,GAAI/mG,CAAC,EAAG,EAAE,UAAYA,CACpD,CACF,CACA,OAAO,CACT,CACA,SAAS0nG,GAAG39D,EAAG,CACb,OAAOA,GAAKA,EAAE,WAAaA,EAAE,KAAOA,CACtC,CACA,SAAS49D,GAAG59D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAG,CAC/B,MAAMxE,EAAI,EAAI,EACd,IAAI,EAAIA,EAAI,EAAGyJ,EAAIzJ,EAAI,EAAGE,EAAIF,EAAI,EAClC,KAAM,CAAE,MAAO,EAAG,OAAQjC,CAAC,EAAKivC,EAChCA,EAAE,QAAU,EAAI,EAAE,KAAK,CAAC,EAAGvjC,EAAI,EAAE,KAAKA,CAAC,EAAGvJ,EAAI,EAAE,KAAKA,CAAC,GACtD,KAAM,CAAE,SAAU+C,EAAG,OAAQ3R,EAAG,GAAI2rB,EAAG,IAAKtzB,CAAC,EAAKqjD,EAAE,WACpD,GAAI,MAAM,QAAQ,CAAC,EAAG,CACpB,MAAMzuC,EAAI,EAAI,EACd,QAAS0D,EAAI,EAAGhE,EAAIF,EAAE,OAAQkE,EAAIhE,EAAGgE,IAAK,CACxC,KAAM,CAAE,MAAOukF,EAAG,MAAOvmF,EAAG,cAAewmF,CAAC,EAAK1oF,EAAEkE,CAAC,EACpD,GAAI1D,GAAKioF,GAAKjoF,EAAIioF,EAAIvmF,EAAG,CACvB,MAAMymF,EAAIikB,GAAG,EAAElkB,CAAC,CAAC,EAAGG,EAAI8jB,GAAG,EAAGznG,EAAG3R,EAAG2rB,EAAGtzB,EAAG,EAAG8f,EAAGvJ,EAAGwmF,EAAGvlF,EAAGqD,CAAC,EAC1D,GAAIoiF,EACF,GAAIA,EAAE,UAAY,EAAGA,EAAE,KAAK,cAAgBH,EAAG,EAC7C,EAAE,KAAKG,CAAC,MAER,QAAOA,CACb,CACF,CACF,KAAO,CACL,MAAMroF,EAAIosG,GAAG,CAAC,EAAG1oG,EAAIyoG,GAAG,EAAGznG,EAAG3R,EAAG2rB,EAAGtzB,EAAG,EAAG8f,EAAGvJ,EAAG3B,EAAG4C,EAAGqD,CAAC,EACvD,GAAIvC,EACF,GAAIA,EAAE,UAAY,EAAGA,EAAE,KAAK,cAAgB,EAAG,EAC7C,EAAE,KAAKA,CAAC,MAER,QAAOA,CACb,CACA,OAAO,IACT,CACA,SAASqG,GAAG0kC,EAAG,EAAG,EAAG,EAAG,CACtB,MAAM,EAAIA,EAAE,EAAG7rC,EAAI6rC,EAAE,EAAGxoC,EAAIwoC,EAAE,EAC9B,IAAIhtC,EAAI,EAAG,EAAI,EAAI,EAAGyJ,EAAI,EAAI,EAC9B,IAAMzJ,EAAI,EAAE,KAAKA,CAAC,EAAG,EAAI,EAAE,KAAK,CAAC,EAAGyJ,EAAI,EAAE,KAAKA,CAAC,GAAI,EAAE,EAAI,EAAE,KAAKzJ,CAAC,EAAG,EAAE,EAAI,EAAE,KAAKA,CAAC,EAAG,EAAE,EAAI,EAAE,KAAKA,CAAC,EAAGmB,EAAE,EAAI,EAAE,KAAK,CAAC,EAAGA,EAAE,EAAI,EAAE,KAAK,CAAC,EAAGA,EAAE,EAAI,EAAE,KAAK,CAAC,EAAGqD,EAAE,EAAI,EAAE,KAAKiF,CAAC,EAAGjF,EAAE,EAAI,EAAE,KAAKiF,CAAC,EAAGjF,EAAE,EAAI,EAAE,KAAKiF,CAAC,CAC5M,CACA,SAASohG,GAAG79D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAGxE,EAAG,CAClC,KAAM,CAAE,SAAU,EAAG,gBAAiByJ,CAAC,EAAKujC,EAC5C,QAAS9sC,EAAI,EAAG,EAAI,EAAI,EAAGA,EAAI,EAAGA,IAChC0qG,GAAG,EAAG,EAAG,EAAG1qG,EAAGiB,EAAGqD,EAAGxE,CAAC,CAC1B,CACA,SAAS8qG,GAAG99D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAG,CAC/B,KAAM,CAAE,SAAUxE,EAAG,gBAAiB,CAAC,EAAKgtC,EAC5C,IAAIvjC,EAAI,IAAOvJ,EAAI,KACnB,QAAS,EAAI,EAAGnC,EAAI,EAAI,EAAG,EAAIA,EAAG,IAAK,CACrC,IAAIkF,EACJA,EAAI2nG,GAAG5qG,EAAG,EAAG,EAAG,EAAG,KAAMmB,EAAGqD,CAAC,EAAGvB,GAAKA,EAAE,SAAWwG,IAAMvJ,EAAI+C,EAAGwG,EAAIxG,EAAE,SACvE,CACA,OAAO/C,CACT,CACA,SAAS6qG,GAAG/9D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAG,CAC/B,KAAM,CAAE,SAAUxE,CAAC,EAAK,EAAG,CAAE,MAAO,CAAC,EAAKA,EAAGyJ,EAAIzJ,EAAE,WAAW,SAC9D,QAASE,EAAI8sC,EAAG,EAAI,EAAIA,EAAG9sC,EAAI,EAAGA,IAAK,CACrC,IAAInC,EACJ,GAAIA,EAAImC,EAAGoI,GAAG9D,EAAGzG,EAAI,EAAG,EAAG0L,CAAC,EAAGjF,EAAE,YAAc,GAAI,EAAEA,EAAGzG,EAAG,EAAGoD,CAAC,EAC7D,MAAO,EACX,CACA,MAAO,EACT,CACA,SAAS6pG,GAAGh+D,EAAG,EAAI,KAAM,CACvB,GAAK,MAAM,QAAQ,CAAC,IAAM,EAAI,IAAI,IAAI,CAAC,GACvC,MAAM,EAAIA,EAAE,SAAU,EAAI,EAAE,MAAQ,EAAE,MAAM,MAAQ,KAAM,EAAI,EAAE,WAAW,SAC3E,IAAI7rC,EAAGqD,EAAGxE,EAAG,EAAGyJ,EAAI,EACpB,MAAMvJ,EAAI8sC,EAAE,OACZ,QAASjvC,EAAI,EAAGkF,EAAI/C,EAAE,OAAQnC,EAAIkF,EAAGlF,IACnCoD,EAAIjB,EAAEnC,CAAC,EAAGyG,EAAI,IAAI,YAAYrD,CAAC,EAAGnB,EAAI,IAAI,YAAYmB,CAAC,EAAG,EAAI,IAAI,aAAaA,CAAC,EAAG,EAAE,EAAGsI,CAAC,EAAGA,GAAKtI,EAAE,WACrG,SAAS,EAAEpD,EAAGkF,EAAG3R,EAAI,GAAI,CACvB,MAAM2rB,EAAIlf,EAAI,EACd,GAAI2qG,GAAGzrF,EAAGjd,CAAC,EAAG,CACZ,MAAMrW,EAAI6a,EAAEzG,EAAI,CAAC,EAAGQ,EAAIyB,EAAEid,EAAI,EAAE,EAChC,IAAIhb,EAAI,IAAOhE,EAAI,IAAOuoF,EAAI,IAAOvmF,EAAI,KAAQwmF,EAAI,KAAQC,EAAI,KACjE,QAASE,EAAI,EAAIj9F,EAAGm9F,EAAI,GAAKn9F,EAAI4U,GAAIqoF,EAAIE,EAAGF,IAAK,CAC/C,IAAIG,EAAI,EAAEH,CAAC,EACX,MAAMR,EAAI,EAAE,KAAKW,CAAC,EAAGT,EAAI,EAAE,KAAKS,CAAC,EAAGR,EAAI,EAAE,KAAKQ,CAAC,EAChDX,EAAInkF,IAAMA,EAAImkF,GAAIA,EAAInmF,IAAMA,EAAImmF,GAAIE,EAAIroF,IAAMA,EAAIqoF,GAAIA,EAAIG,IAAMA,EAAIH,GAAIC,EAAIC,IAAMA,EAAID,GAAIA,EAAIG,IAAMA,EAAIH,EAC1G,CACA,OAAO,EAAExoF,EAAI,CAAC,IAAMkE,GAAK,EAAElE,EAAI,CAAC,IAAME,GAAK,EAAEF,EAAI,CAAC,IAAMyoF,GAAK,EAAEzoF,EAAI,CAAC,IAAMkC,GAAK,EAAElC,EAAI,CAAC,IAAM0oF,GAAK,EAAE1oF,EAAI,CAAC,IAAM2oF,GAAK,EAAE3oF,EAAI,CAAC,EAAIkE,EAAG,EAAElE,EAAI,CAAC,EAAIE,EAAG,EAAEF,EAAI,CAAC,EAAIyoF,EAAG,EAAEzoF,EAAI,CAAC,EAAIkC,EAAG,EAAElC,EAAI,CAAC,EAAI0oF,EAAG,EAAE1oF,EAAI,CAAC,EAAI2oF,EAAG,IAAM,EAC/M,KAAO,CACL,MAAM/8F,EAAIk/G,GAAG9qG,CAAC,EAAGQ,EAAIuqG,GAAG/qG,EAAGyG,CAAC,EAC5B,IAAIvC,EAAI3Q,EAAG2M,EAAI,GAAIuoF,EAAI,GACvB,GAAI,GACF,GAAI,CAACvkF,EAAG,CACN,MAAM8kF,EAAIp9F,EAAI27G,GAAKriG,EAAIoiG,GAAIjf,EAAI7nF,EAAI+mG,GAAKriG,EAAIoiG,GAC5CpnG,EAAI,EAAE,IAAI8oF,CAAC,EAAGP,EAAI,EAAE,IAAIJ,CAAC,EAAGnkF,EAAI,CAAChE,GAAK,CAACuoF,CACzC,OAEAvoF,EAAI,GAAIuoF,EAAI,GACd,MAAMvmF,EAAIgC,GAAKhE,EAAGwoF,EAAIxkF,GAAKukF,EAC3B,IAAIE,EAAI,GACRzmF,IAAMymF,EAAI,EAAE/8F,EAAGsZ,EAAGhB,CAAC,GACnB,IAAI2kF,EAAI,GACRH,IAAMG,EAAI,EAAEroF,EAAG0E,EAAGhB,CAAC,GACnB,MAAM6kF,EAAIJ,GAAKE,EACf,GAAIE,EACF,QAASC,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMX,EAAIz8F,EAAIo9F,EAAGT,EAAI/nF,EAAIwoF,EAAGR,EAAI,EAAEH,CAAC,EAAGh4F,EAAI,EAAEg4F,EAAI,CAAC,EAAG,EAAI,EAAEE,CAAC,EAAGK,EAAI,EAAEL,EAAI,CAAC,EACzE,EAAEvoF,EAAIgpF,CAAC,EAAIR,EAAI,EAAIA,EAAI,EAAG,EAAExoF,EAAIgpF,EAAI,CAAC,EAAI34F,EAAIu4F,EAAIv4F,EAAIu4F,CACvD,CACF,OAAOG,CACT,CACF,CACF,CACA,SAASmkB,GAAGj+D,EAAG,EAAG,EAAG,EAAG,EAAG,CACzB,IAAI7rC,EAAGqD,EAAGxE,EAAG,EAAGyJ,EAAGvJ,EACnB,MAAM,EAAI,EAAI,EAAE,UAAU,EAAGnC,EAAI,EAAI,EAAE,UAAU,EAAGkF,EAAI,EAAI,EAAE,UAAU,EAAG3R,EAAI,EAAE,OAAO,EAAG2rB,EAAI,EAAE,OAAO,EAAGtzB,EAAI,EAAE,OAAO,EACxH,IAAI4U,EAAI,EAAEyuC,CAAC,EAAG/qC,EAAI,EAAE+qC,EAAI,CAAC,EAAG/uC,EAAI,EAAE+uC,EAAI,CAAC,EAAGw5C,EAAI,EAAEx5C,EAAI,EAAI,CAAC,EAAG/sC,EAAI,EAAE+sC,EAAI,CAAC,EAAGy5C,EAAI,EAAEz5C,EAAI,EAAI,CAAC,EACzF,OAAO,GAAK,GAAK7rC,GAAK5C,EAAIjN,GAAK,EAAGkT,GAAKvC,EAAI3Q,GAAK,IAAM6P,GAAKc,EAAI3Q,GAAK,EAAGkT,GAAKjG,EAAIjN,GAAK,GAAIyM,GAAK,GAAKiC,GAAK/B,EAAIgf,GAAKlf,EAAG,GAAKyoF,EAAIvpE,GAAKlf,IAAMiC,GAAKwmF,EAAIvpE,GAAKlf,EAAG,GAAKE,EAAIgf,GAAKlf,GAAIoD,EAAI,GAAKnB,EAAIwE,KAAOxE,EAAImB,GAAK,MAAMA,CAAC,KAAOA,EAAInB,IAAK,EAAIwE,GAAK,MAAMA,CAAC,KAAOA,EAAI,GAAIvB,GAAK,GAAKwG,GAAKxJ,EAAItW,GAAKsZ,EAAG/C,GAAKumF,EAAI98F,GAAKsZ,IAAMwG,GAAKg9E,EAAI98F,GAAKsZ,EAAG/C,GAAKD,EAAItW,GAAKsZ,GAAI9B,EAAIjB,GAAKuJ,EAAIjF,GAAK,KAAOiF,EAAItI,GAAKA,IAAMA,KAAOA,EAAIsI,IAAKvJ,EAAIsE,GAAKA,IAAMA,KAAOA,EAAItE,GAAIiB,GAAK,GAAKqD,GAAK,EACvb,CACA,SAAS0mG,GAAGl+D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAGxE,EAAG,CAClC,KAAM,CAAE,SAAU,EAAG,gBAAiByJ,CAAC,EAAKujC,EAC5C,QAAS9sC,EAAI,EAAG,EAAI,EAAI,EAAGA,EAAI,EAAGA,IAAK,CACrC,IAAInC,EAAI0L,EAAIA,EAAEvJ,CAAC,EAAIA,EACnB0qG,GAAG,EAAG,EAAG,EAAG7sG,EAAGoD,EAAGqD,EAAGxE,CAAC,CACxB,CACF,CACA,SAASmrG,GAAGn+D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAG,CAC/B,KAAM,CAAE,SAAUxE,EAAG,gBAAiB,CAAC,EAAKgtC,EAC5C,IAAIvjC,EAAI,IAAOvJ,EAAI,KACnB,QAAS,EAAI,EAAGnC,EAAI,EAAI,EAAG,EAAIA,EAAG,IAAK,CACrC,IAAIkF,EACJA,EAAI2nG,GAAG5qG,EAAG,EAAG,EAAG,EAAI,EAAE,CAAC,EAAI,EAAG,KAAMmB,EAAGqD,CAAC,EAAGvB,GAAKA,EAAE,SAAWwG,IAAMvJ,EAAI+C,EAAGwG,EAAIxG,EAAE,SAClF,CACA,OAAO/C,CACT,CACA,SAASkrG,GAAGp+D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAG,CAC/B,KAAM,CAAE,SAAUxE,CAAC,EAAK,EAAG,CAAE,MAAO,CAAC,EAAKA,EAAGyJ,EAAIzJ,EAAE,WAAW,SAC9D,QAASE,EAAI8sC,EAAG,EAAI,EAAIA,EAAG9sC,EAAI,EAAGA,IAAK,CACrC,IAAInC,EACJ,GAAIA,EAAI,EAAE,qBAAqBmC,CAAC,EAAGoI,GAAG9D,EAAGzG,EAAI,EAAG,EAAG0L,CAAC,EAAGjF,EAAE,YAAc,GAAI,EAAEA,EAAGzG,EAAG,EAAGoD,CAAC,EACrF,MAAO,EACX,CACA,MAAO,EACT,CACA,SAASkqG,GAAGr+D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAG,CAC/BykG,GAAG,UAAUj8D,EAAE,OAAO,CAAC,CAAC,EAAGs+D,GAAG,EAAGt+D,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,CAAC,EAAGykG,GAAG,YAAW,CACpE,CACA,SAASqC,GAAGt+D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAG,CAC/B,KAAM,CAAE,aAAcxE,EAAG,YAAa,EAAG,YAAayJ,GAAMw/F,GAAI/oG,EAAI8sC,EAAI,EACxE,GAAI07D,GAAGxoG,EAAG,CAAC,EAAG,CACZ,MAAMnC,EAAI4qG,GAAG37D,EAAGvjC,CAAC,EAAGxG,EAAI2lG,GAAG1oG,EAAG,CAAC,EAC/B2qG,GAAG,EAAG,EAAG,EAAG9sG,EAAGkF,EAAG,EAAG9B,EAAGqD,CAAC,CAC3B,KAAO,CACL,MAAMzG,EAAI8qG,GAAG77D,CAAC,EACdi+D,GAAGltG,EAAGiC,EAAG,EAAGmB,EAAGqD,CAAC,GAAK8mG,GAAGvtG,EAAG,EAAG,EAAG,EAAG,EAAGoD,EAAGqD,CAAC,EAC3C,MAAMvB,EAAI6lG,GAAG97D,EAAGvjC,CAAC,EACjBwhG,GAAGhoG,EAAGjD,EAAG,EAAGmB,EAAGqD,CAAC,GAAK8mG,GAAGroG,EAAG,EAAG,EAAG,EAAG,EAAG9B,EAAGqD,CAAC,CAC7C,CACF,CACA,MAAM+mG,GAAK,CAAC,IAAK,IAAK,GAAG,EACzB,SAASC,GAAGx+D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAG,CAC5B8nG,GAAG,UAAUj8D,EAAE,OAAO,CAAC,CAAC,EACxB,MAAMxoC,EAAIinG,GAAG,EAAGz+D,EAAG,EAAG,EAAG,EAAG7rC,CAAC,EAC7B,OAAO8nG,GAAG,YAAW,EAAIzkG,CAC3B,CACA,SAASinG,GAAGz+D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAG,CAC5B,KAAM,CAAE,aAAcqD,EAAG,YAAaxE,EAAG,YAAa,CAAC,EAAKipG,GAC5D,IAAIx/F,EAAIujC,EAAI,EACZ,GAAI07D,GAAGj/F,EAAGzJ,CAAC,EAAG,CACZ,MAAMsH,EAAIqhG,GAAG37D,EAAG,CAAC,EAAGjvC,EAAI6qG,GAAGn/F,EAAGzJ,CAAC,EAC/B,OAAO8qG,GAAG,EAAG,EAAG,EAAGxjG,EAAGvJ,EAAG,EAAGoD,CAAC,CAC/B,KAAO,CACL,MAAMmG,EAAIyhG,GAAG/7D,EAAG,CAAC,EAAGjvC,EAAIwtG,GAAGjkG,CAAC,EAAGhW,EAAI,EAAE,UAAUyM,CAAC,GAAK,EACrD,IAAIkf,EAAGtzB,EACP2H,GAAK2rB,EAAI4rF,GAAG77D,CAAC,EAAGrjD,EAAIm/G,GAAG97D,EAAG,CAAC,IAAM/vB,EAAI6rF,GAAG97D,EAAG,CAAC,EAAGrjD,EAAIk/G,GAAG77D,CAAC,GACvD,MAAM/qC,EAAIgpG,GAAGhuF,EAAGzY,EAAG,EAAG,EAAGrD,CAAC,EAAIsqG,GAAGxuF,EAAG,EAAG,EAAG,EAAG,EAAG9b,CAAC,EAAI,KACrD,GAAIc,EAAG,CACL,MAAMhC,EAAIgC,EAAE,MAAMlE,CAAC,EACnB,GAAIzM,EAAI2O,GAAKuE,EAAE7a,EAAI2d,CAAC,EAElBrH,GAAKuE,EAAE7a,EAAI2d,EAAI,CAAC,EAEhB,OAAOrF,CACX,CACA,MAAMukF,EAAIykB,GAAGthH,EAAG6a,EAAG,EAAG,EAAGrD,CAAC,EAAIsqG,GAAG9hH,EAAG,EAAG,EAAG,EAAG,EAAGwX,CAAC,EAAI,KACrD,OAAOc,GAAKukF,EAAIvkF,EAAE,UAAYukF,EAAE,SAAWvkF,EAAIukF,EAAIvkF,GAAKukF,GAAK,IAC/D,CACF,CACA,MAAMklB,GAAqB,IAAI7K,GAAM8K,GAAqB,IAAIvD,GAAMppE,GAAqB,IAAIopE,GAAMwD,GAAqB,IAAIjjB,GAAMkjB,GAAqB,IAAIvD,GAAMwD,GAAqB,IAAIxD,GAC1L,SAASyD,GAAG/+D,EAAG,EAAG,EAAG,EAAG,CACtBi8D,GAAG,UAAUj8D,EAAE,OAAO,CAAC,CAAC,EACxB,MAAM,EAAIg/D,GAAG,EAAGh/D,EAAG,EAAG,CAAC,EACvB,OAAOi8D,GAAG,YAAW,EAAI,CAC3B,CACA,SAAS+C,GAAGh/D,EAAG,EAAG,EAAG,EAAG,EAAI,KAAM,CAChC,KAAM,CAAE,aAAc7rC,EAAG,YAAaqD,EAAG,YAAaxE,CAAC,EAAKipG,GAC5D,IAAI,EAAIj8D,EAAI,EACZ,GAAI,IAAM,OAAS,EAAE,aAAe,EAAE,mBAAkB,EAAI6+D,GAAG,IAAI,EAAE,YAAY,IAAK,EAAE,YAAY,IAAK,CAAC,EAAG,EAAIA,IAAKnD,GAAG,EAAGlkG,CAAC,EAAG,CAC9H,MAAM,EAAI,EAAE,SAAU8C,EAAI,EAAE,MAAOvJ,EAAI,EAAE,WAAW,SAAUkF,EAAI,EAAE,MAAO,EAAI,EAAE,WAAW,SAAUga,EAAI0rF,GAAG37D,EAAGhtC,CAAC,EAAGrW,EAAIi/G,GAAG,EAAGpkG,CAAC,EAC/H,GAAIonG,GAAG,KAAK,CAAC,EAAE,OAAM,EAAI,EAAE,WACzB,OAAO3F,GAAGj5D,EAAG7rC,EAAG2qG,EAAE,EAAGA,GAAG,OAAO,KAAKF,EAAE,EAAGE,GAAG,YAAc,GAAI,EAAE,WAAW,UAAU,CACnF,iBAAmB7pG,GAAM6pG,GAAG,cAAc7pG,CAAC,EAC3C,mBAAqBA,GAAM,CACzBA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,YAAc,GAC/E,QAAShE,EAAIgf,EAAI,EAAGupE,GAAK78F,EAAIszB,GAAK,EAAGhf,EAAIuoF,EAAGvoF,GAAK,EAC/C,GAAIqK,GAAG02B,GAAI/gC,EAAGqJ,EAAGvJ,CAAC,EAAGihC,GAAG,YAAc,GAAI/8B,EAAE,mBAAmB+8B,EAAE,EAC/D,MAAO,GACX,MAAO,EACT,CACR,CAAO,EACH,CACE,MAAMzgC,EAAImnG,GAAG,CAAC,EACd,QAASzjG,EAAIgb,EAAI,EAAGhf,GAAKtU,EAAIszB,GAAK,EAAGhb,EAAIhE,EAAGgE,GAAK,EAAG,CAClDqG,GAAGqjG,GAAI1pG,EAAGqF,EAAGvJ,CAAC,EAAG4tG,GAAG,EAAE,aAAaC,EAAE,EAAGD,GAAG,EAAE,aAAaC,EAAE,EAAGD,GAAG,EAAE,aAAaC,EAAE,EAAGD,GAAG,YAAc,GACvG,QAASnlB,EAAI,EAAG,EAAIjoF,EAAI,EAAGioF,EAAI,EAAGA,GAAK,EACrC,GAAIl+E,GAAG02B,GAAIwnD,EAAGvjF,EAAG,CAAC,EAAG+7B,GAAG,YAAc,GAAI2sE,GAAG,mBAAmB3sE,EAAE,EAChE,MAAO,EACb,CACF,CACF,KAAO,CACL,MAAM,EAAI6pE,GAAG77D,CAAC,EAAG1lC,EAAIwhG,GAAG97D,EAAGhtC,CAAC,EAC5B,OAAOimG,GAAG,EAAG9kG,EAAGuqG,EAAE,EAAG,CAAC,EAAE,EAAE,cAAcA,EAAE,GAAKM,GAAG,EAAG,EAAG,EAAG,EAAG,CAAC,IAAM/F,GAAG3+F,EAAGnG,EAAGuqG,EAAE,EAAG,EAAE,cAAcA,EAAE,GAAKM,GAAG1kG,EAAG,EAAG,EAAG,EAAG,CAAC,GAC5H,CACF,CACA,MAAM2kG,GAAqB,IAAItjB,GAAMujB,GAAqB,IAAI5D,GAAM6D,GAAqB,IAAI7D,GAAM8D,GAAqB,IAAI7nB,EAAK8nB,GAAqB,IAAI9nB,EAAKvhD,GAAqB,IAAIuhD,EAAK+nB,GAAqB,IAAI/nB,EACtN,SAASgoB,GAAGv/D,EAAG,EAAG,EAAG,EAAI,CAAA,EAAI,EAAI,CAAA,EAAI7rC,EAAI,EAAGqD,EAAI,IAAO,CACrD,EAAE,aAAe,EAAE,mBAAkB,EAAI0nG,GAAG,IAAI,EAAE,YAAY,IAAK,EAAE,YAAY,IAAK,CAAC,EAAGA,GAAG,YAAc,GAC3G,MAAMlsG,EAAIgtC,EAAE,SAAU,EAAIhtC,EAAE,WAAW,SAAUyJ,EAAIzJ,EAAE,MAAOE,EAAI,EAAE,WAAW,SAAU,EAAI,EAAE,MAAOnC,EAAI0qG,GAAG,aAAY,EAAIxlG,EAAIwlG,GAAG,aAAY,EAChJ,IAAIn3G,EAAI86G,GAAInvF,EAAIovF,GAAI1iH,EAAI,KAAM4U,EAAI,KAClC,IAAM5U,EAAIq5C,GAAIzkC,EAAI+tG,IAClB,IAAIrqG,EAAI,IAAOhE,EAAI,KAAMuoF,EAAI,KAC7B,OAAOylB,GAAG,KAAK,CAAC,EAAE,OAAM,EAAIE,GAAG,OAAO,KAAKF,EAAE,EAAGj/D,EAAE,UAChD,CACE,oBAAsB/sC,GAAMisG,GAAG,cAAcjsG,CAAC,EAC9C,iBAAkB,CAACA,EAAGwmF,EAAGC,IAAMA,EAAIzkF,GAAKykF,EAAIliF,GAAKiiF,IAAM0lB,GAAG,IAAI,KAAKlsG,EAAE,GAAG,EAAGksG,GAAG,IAAI,KAAKlsG,EAAE,GAAG,EAAGksG,GAAG,YAAc,IAAK,IAAM,GAC3H,gBAAiB,CAAClsG,EAAGwmF,IAAM,CACzB,GAAI,EAAE,WACJ,OAAO,EAAE,WAAW,UAAU,CAC5B,oBAAsBG,GAAMulB,GAAG,cAAcvlB,CAAC,EAC9C,iBAAkB,CAACA,EAAGE,EAAGC,IAAMA,EAAI9kF,GAAK8kF,EAAIviF,EAC5C,gBAAiB,CAACoiF,EAAGE,IAAM,CACzB,QAASC,EAAIH,EAAGR,EAAIQ,EAAIE,EAAGC,EAAIX,EAAGW,IAAK,CACrCz+E,GAAGrF,EAAG,EAAI8jF,EAAG,EAAG7mF,CAAC,EAAG+C,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,YAAc,GACnG,QAASqjF,EAAIrmF,EAAGsmF,EAAItmF,EAAIwmF,EAAGH,EAAIC,EAAGD,IAAK,CACrCh+E,GAAGvK,EAAG,EAAIuoF,EAAG78E,EAAG,CAAC,EAAG1L,EAAE,YAAc,GACpC,MAAM3P,EAAI2P,EAAE,mBAAmBkF,EAAG3R,EAAG3H,CAAC,EACtC,GAAIyE,EAAI6T,IAAMgb,EAAE,KAAK3rB,CAAC,EAAGiN,GAAKA,EAAE,KAAK5U,CAAC,EAAGsY,EAAI7T,EAAG6P,EAAIqoF,EAAGE,EAAIO,GAAI34F,EAAI+S,EACjE,MAAO,EACX,CACF,CACF,CACZ,CAAW,EACH,CACE,MAAMulF,EAAIgf,GAAG,CAAC,EACd,QAAS9e,EAAI,EAAGE,EAAIJ,EAAGE,EAAIE,EAAGF,IAAK,CACjCt+E,GAAGrF,EAAG,EAAI2jF,EAAG,EAAG1mF,CAAC,EAAG+C,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,YAAc,GACnG,QAAS8jF,EAAI9mF,EAAGmmF,EAAInmF,EAAIwmF,EAAGM,EAAIX,EAAGW,IAAK,CACrCz+E,GAAGvK,EAAG,EAAIgpF,EAAGt9E,EAAG,CAAC,EAAG1L,EAAE,YAAc,GACpC,MAAMuoF,EAAIvoF,EAAE,mBAAmBkF,EAAG3R,EAAG3H,CAAC,EACtC,GAAI28F,EAAIrkF,IAAMgb,EAAE,KAAK3rB,CAAC,EAAGiN,GAAKA,EAAE,KAAK5U,CAAC,EAAGsY,EAAIqkF,EAAGroF,EAAI8oF,EAAGP,EAAII,GAAIN,EAAInlF,EACjE,MAAO,EACX,CACF,CACF,CACF,CACN,CACA,EAAKsnG,GAAG,iBAAiB1qG,CAAC,EAAG0qG,GAAG,iBAAiBxlG,CAAC,EAAGhB,IAAM,IAAQ,MAAQ,EAAE,MAAQ,EAAE,MAAM,KAAKgb,CAAC,EAAI,EAAE,MAAQA,EAAE,MAAK,EAAI,EAAE,SAAWhb,EAAG,EAAE,UAAYhE,EAAG,IAAM,EAAE,MAAQ,EAAE,MAAM,KAAKM,CAAC,EAAI,EAAE,MAAQA,EAAE,MAAK,EAAI,EAAE,MAAM,aAAa0tG,EAAE,EAAGhvF,EAAE,aAAagvF,EAAE,EAAG,EAAE,SAAWhvF,EAAE,IAAI,EAAE,KAAK,EAAE,OAAM,EAAI,EAAE,UAAYupE,GAAI,EAC1T,CACA,SAAShyE,GAAGw4B,EAAG,EAAI,KAAM,CACvB,GAAK,MAAM,QAAQ,CAAC,IAAM,EAAI,IAAI,IAAI,CAAC,GACvC,MAAM,EAAIA,EAAE,SAAU,EAAI,EAAE,MAAQ,EAAE,MAAM,MAAQ,KAAM,EAAI,EAAE,WAAW,SAC3E,IAAI7rC,EAAGqD,EAAGxE,EAAG,EAAGyJ,EAAI,EACpB,MAAMvJ,EAAI8sC,EAAE,OACZ,QAASjvC,EAAI,EAAGkF,EAAI/C,EAAE,OAAQnC,EAAIkF,EAAGlF,IACnCoD,EAAIjB,EAAEnC,CAAC,EAAGyG,EAAI,IAAI,YAAYrD,CAAC,EAAGnB,EAAI,IAAI,YAAYmB,CAAC,EAAG,EAAI,IAAI,aAAaA,CAAC,EAAG,EAAE,EAAGsI,CAAC,EAAGA,GAAKtI,EAAE,WACrG,SAAS,EAAEpD,EAAGkF,EAAG3R,EAAI,GAAI,CACvB,MAAM2rB,EAAIlf,EAAI,EACd,GAAI2qG,GAAGzrF,EAAGjd,CAAC,EAAG,CACZ,MAAMrW,EAAI6a,EAAEzG,EAAI,CAAC,EAAGQ,EAAIyB,EAAEid,EAAI,EAAE,EAChC,IAAIhb,EAAI,IAAOhE,EAAI,IAAOuoF,EAAI,IAAOvmF,EAAI,KAAQwmF,EAAI,KAAQC,EAAI,KACjE,QAASE,EAAIj9F,EAAGm9F,EAAIn9F,EAAI4U,EAAGqoF,EAAIE,EAAGF,IAAK,CACrC,MAAMG,EAAI,EAAI/5C,EAAE,qBAAqB45C,CAAC,EACtC,QAASR,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAIE,EAAIS,EAAIX,EACZE,EAAI,EAAI,EAAEA,CAAC,EAAIA,EACf,MAAMC,EAAI,EAAE,KAAKD,CAAC,EAAGl4F,EAAI,EAAE,KAAKk4F,CAAC,EAAG,EAAI,EAAE,KAAKA,CAAC,EAChDC,EAAItkF,IAAMA,EAAIskF,GAAIA,EAAItmF,IAAMA,EAAIsmF,GAAIn4F,EAAI6P,IAAMA,EAAI7P,GAAIA,EAAIq4F,IAAMA,EAAIr4F,GAAI,EAAIo4F,IAAMA,EAAI,GAAI,EAAIE,IAAMA,EAAI,EAC1G,CACF,CACA,OAAO,EAAE3oF,EAAI,CAAC,IAAMkE,GAAK,EAAElE,EAAI,CAAC,IAAME,GAAK,EAAEF,EAAI,CAAC,IAAMyoF,GAAK,EAAEzoF,EAAI,CAAC,IAAMkC,GAAK,EAAElC,EAAI,CAAC,IAAM0oF,GAAK,EAAE1oF,EAAI,CAAC,IAAM2oF,GAAK,EAAE3oF,EAAI,CAAC,EAAIkE,EAAG,EAAElE,EAAI,CAAC,EAAIE,EAAG,EAAEF,EAAI,CAAC,EAAIyoF,EAAG,EAAEzoF,EAAI,CAAC,EAAIkC,EAAG,EAAElC,EAAI,CAAC,EAAI0oF,EAAG,EAAE1oF,EAAI,CAAC,EAAI2oF,EAAG,IAAM,EAC/M,KAAO,CACL,MAAM/8F,EAAIk/G,GAAG9qG,CAAC,EAAGQ,EAAIuqG,GAAG/qG,EAAGyG,CAAC,EAC5B,IAAIvC,EAAI3Q,EAAG2M,EAAI,GAAIuoF,EAAI,GACvB,GAAI,GACF,GAAI,CAACvkF,EAAG,CACN,MAAM8kF,EAAIp9F,EAAI27G,GAAKriG,EAAIoiG,GAAIjf,EAAI7nF,EAAI+mG,GAAKriG,EAAIoiG,GAC5CpnG,EAAI,EAAE,IAAI8oF,CAAC,EAAGP,EAAI,EAAE,IAAIJ,CAAC,EAAGnkF,EAAI,CAAChE,GAAK,CAACuoF,CACzC,OAEAvoF,EAAI,GAAIuoF,EAAI,GACd,MAAMvmF,EAAIgC,GAAKhE,EAAGwoF,EAAIxkF,GAAKukF,EAC3B,IAAIE,EAAI,GACRzmF,IAAMymF,EAAI,EAAE/8F,EAAGsZ,EAAGhB,CAAC,GACnB,IAAI2kF,EAAI,GACRH,IAAMG,EAAI,EAAEroF,EAAG0E,EAAGhB,CAAC,GACnB,MAAM6kF,EAAIJ,GAAKE,EACf,GAAIE,EACF,QAASC,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMX,EAAIz8F,EAAIo9F,EAAGT,EAAI/nF,EAAIwoF,EAAGR,EAAI,EAAEH,CAAC,EAAGh4F,EAAI,EAAEg4F,EAAI,CAAC,EAAG,EAAI,EAAEE,CAAC,EAAGK,EAAI,EAAEL,EAAI,CAAC,EACzE,EAAEvoF,EAAIgpF,CAAC,EAAIR,EAAI,EAAIA,EAAI,EAAG,EAAExoF,EAAIgpF,EAAI,CAAC,EAAI34F,EAAIu4F,EAAIv4F,EAAIu4F,CACvD,CACF,OAAOG,CACT,CACF,CACF,CACA,SAAS0lB,GAAGx/D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAG,CAC/BykG,GAAG,UAAUj8D,EAAE,OAAO,CAAC,CAAC,EAAGy/D,GAAG,EAAGz/D,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,CAAC,EAAGykG,GAAG,YAAW,CACpE,CACA,SAASwD,GAAGz/D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAGqD,EAAG,CAC/B,KAAM,CAAE,aAAcxE,EAAG,YAAa,EAAG,YAAayJ,GAAMw/F,GAAI/oG,EAAI8sC,EAAI,EACxE,GAAI07D,GAAGxoG,EAAG,CAAC,EAAG,CACZ,MAAMnC,EAAI4qG,GAAG37D,EAAGvjC,CAAC,EAAGxG,EAAI2lG,GAAG1oG,EAAG,CAAC,EAC/BgrG,GAAG,EAAG,EAAG,EAAGntG,EAAGkF,EAAG,EAAG9B,EAAGqD,CAAC,CAC3B,KAAO,CACL,MAAMzG,EAAI8qG,GAAG77D,CAAC,EACdi+D,GAAGltG,EAAGiC,EAAG,EAAGmB,EAAGqD,CAAC,GAAKioG,GAAG1uG,EAAG,EAAG,EAAG,EAAG,EAAGoD,EAAGqD,CAAC,EAC3C,MAAMvB,EAAI6lG,GAAG97D,EAAGvjC,CAAC,EACjBwhG,GAAGhoG,EAAGjD,EAAG,EAAGmB,EAAGqD,CAAC,GAAKioG,GAAGxpG,EAAG,EAAG,EAAG,EAAG,EAAG9B,EAAGqD,CAAC,CAC7C,CACF,CACA,MAAMmQ,GAAK,CAAC,IAAK,IAAK,GAAG,EACzB,SAAS+3F,GAAG1/D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAG,CAC5B8nG,GAAG,UAAUj8D,EAAE,OAAO,CAAC,CAAC,EACxB,MAAMxoC,EAAImoG,GAAG,EAAG3/D,EAAG,EAAG,EAAG,EAAG7rC,CAAC,EAC7B,OAAO8nG,GAAG,YAAW,EAAIzkG,CAC3B,CACA,SAASmoG,GAAG3/D,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAG,CAC5B,KAAM,CAAE,aAAcqD,EAAG,YAAaxE,EAAG,YAAa,CAAC,EAAKipG,GAC5D,IAAIx/F,EAAIujC,EAAI,EACZ,GAAI07D,GAAGj/F,EAAGzJ,CAAC,EAAG,CACZ,MAAMsH,EAAIqhG,GAAG37D,EAAG,CAAC,EAAGjvC,EAAI6qG,GAAGn/F,EAAGzJ,CAAC,EAC/B,OAAOmrG,GAAG,EAAG,EAAG,EAAG7jG,EAAGvJ,EAAG,EAAGoD,CAAC,CAC/B,KAAO,CACL,MAAMmG,EAAIyhG,GAAG/7D,EAAG,CAAC,EAAGjvC,EAAI4W,GAAGrN,CAAC,EAAGhW,EAAI,EAAE,UAAUyM,CAAC,GAAK,EACrD,IAAIkf,EAAGtzB,EACP2H,GAAK2rB,EAAI4rF,GAAG77D,CAAC,EAAGrjD,EAAIm/G,GAAG97D,EAAG,CAAC,IAAM/vB,EAAI6rF,GAAG97D,EAAG,CAAC,EAAGrjD,EAAIk/G,GAAG77D,CAAC,GACvD,MAAM/qC,EAAIgpG,GAAGhuF,EAAGzY,EAAG,EAAG,EAAGrD,CAAC,EAAIwrG,GAAG1vF,EAAG,EAAG,EAAG,EAAG,EAAG9b,CAAC,EAAI,KACrD,GAAIc,EAAG,CACL,MAAMhC,EAAIgC,EAAE,MAAMlE,CAAC,EACnB,GAAIzM,EAAI2O,GAAKuE,EAAE7a,EAAI2d,CAAC,EAElBrH,GAAKuE,EAAE7a,EAAI2d,EAAI,CAAC,EAEhB,OAAOrF,CACX,CACA,MAAMukF,EAAIykB,GAAGthH,EAAG6a,EAAG,EAAG,EAAGrD,CAAC,EAAIwrG,GAAGhjH,EAAG,EAAG,EAAG,EAAG,EAAGwX,CAAC,EAAI,KACrD,OAAOc,GAAKukF,EAAIvkF,EAAE,UAAYukF,EAAE,SAAWvkF,EAAIukF,EAAIvkF,GAAKukF,GAAK,IAC/D,CACF,CACA,MAAMomB,GAAqB,IAAI/L,GAAMgM,GAAqB,IAAIzE,GAAM0E,GAAqB,IAAI1E,GAAM2E,GAAqB,IAAIpkB,GAAMqkB,GAAqB,IAAI1E,GAAM2E,GAAqB,IAAI3E,GAC1L,SAAS4E,GAAGlgE,EAAG,EAAG,EAAG,EAAG,CACtBi8D,GAAG,UAAUj8D,EAAE,OAAO,CAAC,CAAC,EACxB,MAAM,EAAImgE,GAAG,EAAGngE,EAAG,EAAG,CAAC,EACvB,OAAOi8D,GAAG,YAAW,EAAI,CAC3B,CACA,SAASkE,GAAGngE,EAAG,EAAG,EAAG,EAAG,EAAI,KAAM,CAChC,KAAM,CAAE,aAAc7rC,EAAG,YAAaqD,EAAG,YAAaxE,CAAC,EAAKipG,GAC5D,IAAI,EAAIj8D,EAAI,EACZ,GAAI,IAAM,OAAS,EAAE,aAAe,EAAE,mBAAkB,EAAIggE,GAAG,IAAI,EAAE,YAAY,IAAK,EAAE,YAAY,IAAK,CAAC,EAAG,EAAIA,IAAKtE,GAAG,EAAGlkG,CAAC,EAAG,CAC9H,MAAM,EAAI,EAAE,SAAU8C,EAAI,EAAE,MAAOvJ,EAAI,EAAE,WAAW,SAAUkF,EAAI,EAAE,MAAO,EAAI,EAAE,WAAW,SAAUga,EAAI0rF,GAAG37D,EAAGhtC,CAAC,EAAGrW,EAAIi/G,GAAG,EAAGpkG,CAAC,EAC/H,GAAIuoG,GAAG,KAAK,CAAC,EAAE,OAAM,EAAI,EAAE,WACzB,OAAO9G,GAAGj5D,EAAG7rC,EAAG8rG,EAAE,EAAGA,GAAG,OAAO,KAAKF,EAAE,EAAGE,GAAG,YAAc,GAAI,EAAE,WAAW,UAAU,CACnF,iBAAmBhrG,GAAMgrG,GAAG,cAAchrG,CAAC,EAC3C,mBAAqBA,GAAM,CACzBA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,YAAc,GAC/E,QAAShE,EAAIgf,EAAGupE,EAAI78F,EAAIszB,EAAGhf,EAAIuoF,EAAGvoF,IAChC,GAAIqK,GAAGwkG,GAAI,EAAI,EAAE,qBAAqB7uG,CAAC,EAAGqJ,EAAGvJ,CAAC,EAAG+uG,GAAG,YAAc,GAAI7qG,EAAE,mBAAmB6qG,EAAE,EAC3F,MAAO,GACX,MAAO,EACT,CACR,CAAO,EACH,CACE,MAAMvuG,EAAImnG,GAAG,CAAC,EACd,QAASzjG,EAAIgb,EAAGhf,EAAItU,EAAIszB,EAAGhb,EAAIhE,EAAGgE,IAAK,CACrC,MAAMukF,EAAI,EAAE,qBAAqBvkF,CAAC,EAClCqG,GAAGukG,GAAI,EAAIrmB,EAAGl/E,EAAGvJ,CAAC,EAAG8uG,GAAG,EAAE,aAAaE,EAAE,EAAGF,GAAG,EAAE,aAAaE,EAAE,EAAGF,GAAG,EAAE,aAAaE,EAAE,EAAGF,GAAG,YAAc,GAC3G,QAAS,EAAI,EAAGpmB,EAAIloF,EAAI,EAAG,EAAIkoF,EAAG,GAAK,EACrC,GAAIn+E,GAAGwkG,GAAI,EAAG7pG,EAAG,CAAC,EAAG6pG,GAAG,YAAc,GAAID,GAAG,mBAAmBC,EAAE,EAChE,MAAO,EACb,CACF,CACF,KAAO,CACL,MAAM,EAAIjE,GAAG77D,CAAC,EAAG1lC,EAAIwhG,GAAG97D,EAAGhtC,CAAC,EAC5B,OAAOimG,GAAG,EAAG9kG,EAAGyrG,EAAE,EAAG,CAAC,EAAE,EAAE,cAAcA,EAAE,GAAKO,GAAG,EAAG,EAAG,EAAG,EAAG,CAAC,IAAMlH,GAAG3+F,EAAGnG,EAAGyrG,EAAE,EAAG,EAAE,cAAcA,EAAE,GAAKO,GAAG7lG,EAAG,EAAG,EAAG,EAAG,CAAC,GAC5H,CACF,CACA,MAAM8lG,GAAqB,IAAIzkB,GAAM0kB,GAAqB,IAAI/E,GAAMgF,GAAqB,IAAIhF,GAAMzzF,GAAqB,IAAI0vE,EAAKgpB,GAAqB,IAAIhpB,EAAKipB,GAAqB,IAAIjpB,EAAKkpB,GAAqB,IAAIlpB,EACtN,SAASmpB,GAAG1gE,EAAG,EAAG,EAAG,EAAI,CAAA,EAAI,EAAI,CAAA,EAAI7rC,EAAI,EAAGqD,EAAI,IAAO,CACrD,EAAE,aAAe,EAAE,mBAAkB,EAAI6oG,GAAG,IAAI,EAAE,YAAY,IAAK,EAAE,YAAY,IAAK,CAAC,EAAGA,GAAG,YAAc,GAC3G,MAAMrtG,EAAIgtC,EAAE,SAAU,EAAIhtC,EAAE,WAAW,SAAUyJ,EAAIzJ,EAAE,MAAOE,EAAI,EAAE,WAAW,SAAU,EAAI,EAAE,MAAOnC,EAAI0qG,GAAG,aAAY,EAAIxlG,EAAIwlG,GAAG,aAAY,EAChJ,IAAIn3G,EAAIujB,GAAIoI,EAAIswF,GAAI5jH,EAAI,KAAM4U,EAAI,KAClC,IAAM5U,EAAI6jH,GAAIjvG,EAAIkvG,IAClB,IAAIxrG,EAAI,IAAOhE,EAAI,KAAMuoF,EAAI,KAC7B,OAAO4mB,GAAG,KAAK,CAAC,EAAE,OAAM,EAAIE,GAAG,OAAO,KAAKF,EAAE,EAAGpgE,EAAE,UAChD,CACE,oBAAsB/sC,GAAMotG,GAAG,cAAcptG,CAAC,EAC9C,iBAAkB,CAACA,EAAGwmF,EAAGC,IAAMA,EAAIzkF,GAAKykF,EAAIliF,GAAKiiF,IAAM6mB,GAAG,IAAI,KAAKrtG,EAAE,GAAG,EAAGqtG,GAAG,IAAI,KAAKrtG,EAAE,GAAG,EAAGqtG,GAAG,YAAc,IAAK,IAAM,GAC3H,gBAAiB,CAACrtG,EAAGwmF,IAAM,CACzB,GAAI,EAAE,WAAY,CAChB,MAAMC,EAAI,EAAE,WACZ,OAAOA,EAAE,UAAU,CACjB,oBAAsBE,GAAM0mB,GAAG,cAAc1mB,CAAC,EAC9C,iBAAkB,CAACA,EAAGE,EAAGC,IAAMA,EAAI9kF,GAAK8kF,EAAIviF,EAC5C,gBAAiB,CAACoiF,EAAGE,IAAM,CACzB,QAASC,EAAIH,EAAGR,EAAIQ,EAAIE,EAAGC,EAAIX,EAAGW,IAAK,CACrC,MAAMT,EAAII,EAAE,qBAAqBK,CAAC,EAClCz+E,GAAGrF,EAAG,EAAIqjF,EAAG,EAAGpmF,CAAC,EAAG+C,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,YAAc,GACnG,QAASsjF,EAAItmF,EAAG7R,EAAI6R,EAAIwmF,EAAGF,EAAIn4F,EAAGm4F,IAAK,CACrC,MAAM,EAAIv5C,EAAE,qBAAqBu5C,CAAC,EAClCj+E,GAAGvK,EAAG,EAAI,EAAG0L,EAAG,CAAC,EAAG1L,EAAE,YAAc,GACpC,MAAM4oF,EAAI5oF,EAAE,mBAAmBkF,EAAG3R,EAAG3H,CAAC,EACtC,GAAIg9F,EAAI1kF,IAAMgb,EAAE,KAAK3rB,CAAC,EAAGiN,GAAKA,EAAE,KAAK5U,CAAC,EAAGsY,EAAI0kF,EAAG1oF,EAAIsoF,EAAGC,EAAIO,GAAIJ,EAAIxlF,EACjE,MAAO,EACX,CACF,CACF,CACZ,CAAW,CACH,KAAO,CACL,MAAMulF,EAAIgf,GAAG,CAAC,EACd,QAAS9e,EAAI,EAAGE,EAAIJ,EAAGE,EAAIE,EAAGF,IAAK,CACjCt+E,GAAGrF,EAAG,EAAI2jF,EAAG,EAAG1mF,CAAC,EAAG+C,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,EAAE,aAAa,CAAC,EAAGA,EAAE,YAAc,GACnG,QAAS8jF,EAAI9mF,EAAGmmF,EAAInmF,EAAIwmF,EAAGM,EAAIX,EAAGW,IAAK,CACrC,MAAMT,EAAIt5C,EAAE,qBAAqB+5C,CAAC,EAClCz+E,GAAGvK,EAAG,EAAIuoF,EAAG78E,EAAG,CAAC,EAAG1L,EAAE,YAAc,GACpC,MAAMwoF,EAAIxoF,EAAE,mBAAmBkF,EAAG3R,EAAG3H,CAAC,EACtC,GAAI48F,EAAItkF,IAAMgb,EAAE,KAAK3rB,CAAC,EAAGiN,GAAKA,EAAE,KAAK5U,CAAC,EAAGsY,EAAIskF,EAAGtoF,EAAI8oF,EAAGP,EAAII,GAAIL,EAAIplF,EACjE,MAAO,EACX,CACF,CACF,CACF,CACN,CACA,EAAKsnG,GAAG,iBAAiB1qG,CAAC,EAAG0qG,GAAG,iBAAiBxlG,CAAC,EAAGhB,IAAM,IAAQ,MAAQ,EAAE,MAAQ,EAAE,MAAM,KAAKgb,CAAC,EAAI,EAAE,MAAQA,EAAE,MAAK,EAAI,EAAE,SAAWhb,EAAG,EAAE,UAAYhE,EAAG,IAAM,EAAE,MAAQ,EAAE,MAAM,KAAKM,CAAC,EAAI,EAAE,MAAQA,EAAE,MAAK,EAAI,EAAE,MAAM,aAAa6uG,EAAE,EAAGnwF,EAAE,aAAamwF,EAAE,EAAG,EAAE,SAAWnwF,EAAE,IAAI,EAAE,KAAK,EAAE,OAAM,EAAI,EAAE,UAAYupE,GAAI,EAC1T,CACA,SAASmnB,IAAK,CACZ,OAAO,OAAO,kBAAoB,GACpC,CACA,MAAMC,GAAqB,IAAI3E,GAAG,YAAe4E,GAAqB,IAAI5E,GAAG,YAAe6E,GAAqB,IAAIvF,GAAG,IAAM,IAAI1H,EAAI,EAAGkN,GAAqB,IAAIlN,GAAMmN,GAAqB,IAAInN,GAAMoN,GAAqB,IAAIpN,GAAMp9D,GAAqB,IAAIo9D,GAC/P,IAAIqN,GAAK,GACT,SAASC,GAAGnhE,EAAG,EAAG,EAAG,EAAG,CACtB,GAAIkhE,GACF,MAAM,IAAI,MAAM,oDAAoD,EACtEA,GAAK,GACL,MAAM,EAAIlhE,EAAE,OAAQ7rC,EAAI,EAAE,OAC1B,IAAIqD,EAAGxE,EAAI,EAAG,EAAI,EAClB,MAAMyJ,EAAI,IAAIk/E,GAAE,EAAG,KAAK,CAAC,EAAE,OAAM,EACjC,QAASzoF,EAAI,EAAG,EAAI,EAAE,OAAQA,EAAI,EAAGA,IAAK,CACxC0tG,GAAG,UAAU,EAAE1tG,CAAC,CAAC,EAAG,EAAI,EACxB,MAAMnC,EAAI+vG,GAAG,aAAY,EACzB7H,GAAG,EAAG2H,GAAG,aAAc7vG,CAAC,EAAGA,EAAE,aAAa0L,CAAC,EAC3C,QAASxG,EAAI,EAAG3R,EAAI6P,EAAE,OAAQ8B,EAAI3R,IAAMu8G,GAAG,UAAU1sG,EAAE8B,CAAC,CAAC,EAAGuB,EAAI4pG,GAC9D,EACA,EACA,EACA3kG,EACA,EACAzJ,EACA,EACA,EACA,EACAjC,CACN,EAAO8vG,GAAG,cAAe,GAAK1sG,EAAE8B,CAAC,EAAE,WAAaoiG,GAAI,CAAC7gG,GAAIvB,IACnD,CACF,GAAI6qG,GAAG,iBAAiB/vG,CAAC,EAAG6vG,GAAG,YAAW,EAAI5tG,GAAK,EAAEE,CAAC,EAAE,WAAamlG,GAAI7gG,EACvE,KACJ,CACA,OAAO0pG,GAAK,GAAI1pG,CAClB,CACA,SAAS4pG,GAAGphE,EAAG,EAAG,EAAG,EAAG,EAAG7rC,EAAI,EAAGqD,EAAI,EAAGxE,EAAI,EAAG,EAAI,EAAGyJ,EAAI,KAAMvJ,EAAI,GAAI,CACvE,IAAI,EAAGnC,EACPmC,GAAK,EAAI2tG,GAAI9vG,EAAI6vG,KAAO,EAAIA,GAAI7vG,EAAI8vG,IACpC,MAAM5qG,EAAI,EAAE,aAAc3R,EAAI,EAAE,YAAa2rB,EAAI,EAAE,YAAatzB,EAAIoU,EAAE,aAAcQ,EAAIR,EAAE,YAAakE,EAAIlE,EAAE,YAAaE,EAAI+uC,EAAI,EAAGw5C,EAAI,EAAI,EAAGvmF,EAAIyoG,GAAGzqG,EAAGgf,CAAC,EAAGwpE,EAAIiiB,GAAGliB,EAAGvkF,CAAC,EACzK,IAAIykF,EAAI,GACR,GAAID,GAAKxmF,EACPC,EAAIwmF,EAAI,EACNiiB,GAAG,EAAGpqG,CAAC,EACPqqG,GAAG,EAAI,EAAG3mG,CAAC,EACX0mG,GAAG37D,EAAG17C,CAAC,EACPs3G,GAAG57D,EAAI,EAAG/vB,CAAC,EACX,EACAzY,EAAI,EAAI8gG,GACRtlG,EACAmB,EAAI6rC,EAAIs4D,EACd,EAAQ5e,EAAI,EACNiiB,GAAG37D,EAAG17C,CAAC,EACPs3G,GAAG57D,EAAI,EAAG/vB,CAAC,EACX0rF,GAAG,EAAGpqG,CAAC,EACPqqG,GAAG,EAAI,EAAG3mG,CAAC,EACXjC,EACAmB,EAAI6rC,EAAIs4D,GACR,EACA9gG,EAAI,EAAI8gG,EACd,UACW7e,EAAG,CACV,MAAMG,EAAIknB,GAAG,aAAY,EACzB7H,GAAG,EAAGt8G,EAAGi9F,CAAC,EAAGA,EAAE,aAAa,CAAC,EAC7B,MAAME,EAAI+hB,GAAG77D,CAAC,EAAG+5C,EAAI+hB,GAAG97D,EAAG17C,CAAC,EAC5B20G,GAAGnf,EAAG7jF,EAAG8qG,EAAE,EAAG9H,GAAGlf,EAAG9jF,EAAG+qG,EAAE,EACzB,MAAM5nB,EAAIQ,EAAE,cAAcmnB,EAAE,EAAGznB,EAAIM,EAAE,cAAconB,EAAE,EACrDtnB,EAAIN,GAAKgoB,GACP,EACAtnB,EACA,EACA,EACA,EACAtiF,EACArD,EACA,EACAnB,EAAI,EACJ4mF,EACA,CAAC1mF,CACP,GAASomF,GAAK8nB,GACR,EACArnB,EACA,EACA,EACA,EACAviF,EACArD,EACA,EACAnB,EAAI,EACJ4mF,EACA,CAAC1mF,CACP,EAAO4tG,GAAG,iBAAiBlnB,CAAC,CAC1B,KAAO,CACL,MAAMA,EAAIiiB,GAAG,CAAC,EAAG/hB,EAAIgiB,GAAG,EAAGvqG,CAAC,EAC5B0nG,GAAGrf,EAAGj9F,EAAGskH,EAAE,EAAGhI,GAAGnf,EAAGn9F,EAAG85C,EAAE,EACzB,MAAMsjD,EAAIt9E,EAAE,cAAcwkG,EAAE,EAAG7nB,EAAI38E,EAAE,cAAcg6B,EAAE,EACrD,GAAIsjD,GAAKX,EACPM,EAAI0nB,GACFphE,EACA45C,EACA,EACA,EACA,EACAzlF,EACAqD,EACAxE,EACA,EAAI,EACJyJ,EACAvJ,CACR,GAAWkuG,GACHphE,EACA85C,EACA,EACA,EACA,EACA3lF,EACAqD,EACAxE,EACA,EAAI,EACJyJ,EACAvJ,CACR,UACa6mF,EACP,GAAI9mF,EACFymF,EAAI0nB,GACFphE,EACA45C,EACA,EACA,EACA,EACAzlF,EACAqD,EACAxE,EACA,EAAI,EACJyJ,EACAvJ,CACV,MACW,CACH,MAAMomF,EAAIwnB,GAAG,aAAY,EACzBxnB,EAAE,KAAK2nB,EAAE,EAAE,aAAa,CAAC,EACzB,MAAM1nB,EAAIsiB,GAAG77D,CAAC,EAAG5+C,EAAI06G,GAAG97D,EAAG17C,CAAC,EAC5B20G,GAAG1f,EAAGtjF,EAAG8qG,EAAE,EAAG9H,GAAG73G,EAAG6U,EAAG+qG,EAAE,EACzB,MAAM,EAAI1nB,EAAE,cAAcynB,EAAE,EAAGpnB,EAAIL,EAAE,cAAc0nB,EAAE,EACrDtnB,EAAI,GAAK0nB,GACPxnB,EACAL,EACA,EACA,EACA,EACA/hF,EACArD,EACA,EACAnB,EAAI,EACJsmF,EACA,CAACpmF,CACX,GAAaymF,GAAKynB,GACRxnB,EACAx4F,EACA,EACA,EACA,EACAoW,EACArD,EACA,EACAnB,EAAI,EACJsmF,EACA,CAACpmF,CACX,EAAW4tG,GAAG,iBAAiBxnB,CAAC,CAC1B,SACOF,EACP,GAAInmF,EACFymF,EAAI0nB,GACFphE,EACA85C,EACA,EACA,EACA,EACA3lF,EACAqD,EACAxE,EACA,EAAI,EACJyJ,EACAvJ,CACV,MACW,CACH,MAAMomF,EAAIwnB,GAAG,aAAY,EACzBxnB,EAAE,KAAK7iD,EAAE,EAAE,aAAa,CAAC,EACzB,MAAM8iD,EAAIsiB,GAAG77D,CAAC,EAAG5+C,EAAI06G,GAAG97D,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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mICAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","x_google_ignoreList":[12,13]} \ No newline at end of file +{"version":3,"file":"iflow-engine.umd.js","sources":["../src/locales/zh-CN.ts","../src/locales/en-US.ts","../src/services/locale.ts","../src/themes/presets.ts","../src/services/theme.ts","../src/components/button-group/index.ts","../src/components/button-group/toolbar/index.ts","../src/core/base-manager.ts","../src/managers/toolbar-manager.ts","../src/managers/button-group-manager.ts","../src/components/dialog/index.ts","../src/managers/dialog-manager.ts","../../bim_engine_base/node_modules/three/build/three.core.js","../../bim_engine_base/node_modules/three/build/three.module.js","../../bim_engine_base/dist/bim-engine-sdk.es.js","../src/components/engine/index.ts","../src/components/right-key/index.ts","../src/components/menu/index.ts","../src/managers/right-key-manager.ts","../src/managers/engine-manager.ts","../src/components/tree/types.ts","../src/components/tree/tree-node.ts","../src/components/tree/index.ts","../src/components/tab/index.ts","../src/utils/icon-manager.ts","../src/managers/construct-tree-manager-btn.ts","../src/core/base-dialog-manager.ts","../src/types/measure.ts","../src/components/measure-panel/index.ts","../src/managers/measure-dialog-manager.ts","../src/components/section-plane-panel/index.ts","../src/managers/section-plane-dialog-manager.ts","../src/components/section-axis-panel/index.ts","../src/managers/section-axis-dialog-manager.ts","../src/components/section-box-panel/index.ts","../src/managers/section-box-dialog-manager.ts","../src/components/walk-control-panel/index.ts","../src/components/walk-path-panel/index.ts","../src/managers/walk-path-dialog-manager.ts","../src/managers/walk-control-manager.ts","../src/managers/engine-info-dialog-manager.ts","../src/managers/setting-dialog-manager.ts","../src/components/collapse/index.ts","../src/managers/component-detail-manager.ts","../src/components/ai-chat/index.ts","../src/managers/ai-chat-manager.ts","../src/core/event-emitter.ts","../src/core/manager-registry.ts","../src/bim-engine.ts","../src/components/button-group/toolbar/buttons/home/index.ts","../src/components/button-group/toolbar/buttons/zoom-box/index.ts","../src/components/button-group/toolbar/buttons/walk/walk-menu/index.ts","../src/components/button-group/toolbar/buttons/map/index.ts","../src/components/button-group/toolbar/buttons/property/index.ts","../src/components/button-group/toolbar/buttons/setting/index.ts","../src/components/button-group/toolbar/buttons/info/index.ts","../src/components/button-group/toolbar/buttons/fullscreen/index.ts","../src/components/button-group/toolbar/buttons/measure/index.ts","../src/components/button-group/toolbar/buttons/section/section-menu/index.ts","../src/components/button-group/toolbar/buttons/section/section-plane/index.ts","../src/components/button-group/toolbar/buttons/section/section-axis/index.ts","../src/components/button-group/toolbar/buttons/section/section-box/index.ts","../src/components/button-group/toolbar/buttons/ai-chat/index.ts","../../bim_engine_base/dist/main-2Txx2Vau.mjs","../../bim_engine_base/dist/step-CkmZYIvn.mjs","../../bim_engine_base/dist/API文档-B1v8UcRF.mjs"],"sourcesContent":["import {TranslationDictionary} from './types';\n\nexport const zhCN: TranslationDictionary = {\n common: {\n title: 'BimEngine',\n description: '这是一个使用 BIM-ENGINE。',\n openTestDialog: '打开测试弹窗',\n openInfoDialog: '打开信息弹窗 (封装版)',\n },\n toolbar: {\n home: '首页',\n measure: '测量',\n zoomBox: '选框放大',\n info: '信息',\n location: '定位',\n setting: '设置',\n walk: '漫游',\n map: '地图',\n property: '构件详情',\n fullscreen: '全屏',\n walkMenu: '漫游菜单',\n walkPerson: '第一人称',\n walkBird: '第三人称',\n tree: '模型树',\n section: '剖切',\n sectionPlane: '拾取面剖切',\n sectionAxis: '轴向剖切',\n sectionBox: '剖切盒'\n },\n dialog: {\n testTitle: '测试弹窗',\n testContent: '
这是一个 可拖拽可缩放 的弹窗。

你可以尝试拖动标题栏,或者拖动右下角改变大小。
',\n },\n menu: {\n info: '信息',\n home: '首页',\n componentDetail: '构件详情',\n hideSelected: '隐藏选中构件',\n transparentSelected: '半透明选中构件',\n cancelTranslucent: '取消半透明',\n isolateSelected: '隔离选中构件',\n hideOthers: '其他构件隐藏',\n transparentOthers: '其他构件半透明',\n fitSectionBox: '剖切盒适应',\n showAll: '显示全部',\n quickSelect: '快速选择',\n selectSameType: '选择同类模型',\n selectSameLevel: '选择同层模型',\n selectSameLevelType: '选择同层同类模型'\n },\n tree: {\n searchPlaceholder: '请输入要搜索的内容',\n },\n constructTree: {\n title: '目录树',\n },\n tab: {\n component: '构件',\n system: '系统',\n space: '空间',\n type: '类型',\n major: '专业',\n },\n panel: {\n property: {\n title: '构件详情',\n base: '基本属性',\n material: '材质信息',\n advanced: '高级设置',\n tab: {\n props: '属性',\n material: '材质'\n }\n },\n componentDetail: {\n title: '构件详情',\n noSelection: '请先选中构件'\n }\n },\n measure: {\n btnName: '测量',\n dialogTitle: '测量',\n modes: {\n clearHeight: '净高',\n clearDistance: '净距',\n distance: '距离',\n elevation: '标高',\n point: '坐标',\n angle: '角度',\n area: '面积',\n slope: '坡度',\n },\n actions: {\n expand: '展开',\n collapse: '收起',\n clearAll: '删除全部',\n settings: '设置',\n },\n labels: {\n currentMode: '当前测量方式:',\n x: 'X:',\n y: 'Y:',\n z: 'Z:',\n value: {\n clearHeight: '净高:',\n clearDistance: '净距:',\n distance: '距离:',\n elevation: '标高:',\n point: '坐标:',\n angle: '角度:',\n area: '面积:',\n slope: '坡度:',\n }\n },\n settings: {\n title: '设置',\n unit: '单位:',\n precision: '精度:',\n hint: '距离、净距、净高和标高默认使用该单位;角度和面积有各自默认单位。',\n save: '保存设置',\n cancel: '取消',\n },\n clearHeight: {\n direction: '朝向:',\n directionDown: '朝下',\n directionUp: '朝上',\n selectType: '选择对象:',\n selectPoint: '选择点',\n selectElement: '选择构件',\n }\n },\n sectionPlane: {\n dialogTitle: '拾取面剖切',\n actions: {\n hide: '隐藏',\n reverse: '反向',\n reset: '重置'\n }\n },\n sectionAxis: {\n dialogTitle: '轴向剖切',\n actions: {\n hide: '隐藏',\n reverse: '反向',\n axisX: 'X',\n axisY: 'Y',\n axisZ: 'Z'\n }\n },\n sectionBox: {\n dialogTitle: '剖切盒',\n actions: {\n hide: '隐藏',\n reverse: '反向',\n fitToModel: '适应',\n reset: '重置'\n },\n axes: {\n x: 'X',\n y: 'Y',\n z: 'Z'\n }\n },\n walkControl: {\n speed: '移动速度:',\n gravity: '重力',\n collision: '碰撞',\n characterModel: {\n label: '建筑工人',\n constructionWorker: '建筑工人',\n officeMale: '办公室男性'\n },\n walkMode: {\n label: '行走模式',\n walk: '行走模式',\n run: '奔跑模式'\n },\n exit: '退出',\n path: {\n dialogTitle: '路径漫游',\n duration: '漫游时间',\n durationUnit: '秒',\n loop: '循环播放',\n addPoint: '添加漫游点',\n deleteAll: '删除全部',\n point: '漫游点',\n play: '播放漫游',\n stop: '停止漫游',\n noPoints: '暂无漫游点,请添加'\n }\n },\n info: {\n dialogTitle: '基本信息',\n meshCount: '构件数量',\n totalTriangles: '三角面数量',\n totalVertices: '顶点数量',\n },\n aiChat: {\n title: 'AI 助手',\n placeholder: '输入你的问题...',\n quickPrompt: {\n summarize: '总结这个模型',\n explain: '解释选中的构件',\n generate: '生成报告'\n },\n action: {\n new: '新建对话',\n history: '历史记录',\n settings: '设置',\n close: '关闭'\n },\n helper: {\n newline: 'Shift + Enter 换行',\n send: 'Enter 发送'\n },\n thinking: '正在思考...',\n other: '其他',\n otherPlaceholder: '请输入自定义答案',\n submit: '提交'\n },\n setting: {\n dialogTitle: '设置',\n renderMode: '渲染模式',\n modes: {\n simple: '性能模式',\n balance: '平衡模式',\n advanced: '效果模式',\n },\n edgeLine: '边线',\n contrast: '对比度',\n saturation: '饱和度',\n lightIntensity: '光照强度',\n environment: '环境背景',\n backgroundVisible: '显示背景',\n ground: '显示地面',\n groundElevation: '地面高度',\n groundElevationUnit: 'm',\n }\n};\n","import {TranslationDictionary} from './types';\n\nexport const enUS: TranslationDictionary = {\n common: {\n title: 'BimEngine',\n description: 'This is a BIM-ENGINE demo.',\n openTestDialog: 'Open Test Dialog',\n openInfoDialog: 'Open Info Dialog (Wrapped)',\n },\n toolbar: {\n home: 'Home',\n measure: 'Measure',\n zoomBox: 'Zoom Box',\n info: 'Info',\n location: 'Location',\n setting: 'Settings',\n walk: 'Walk',\n map: 'Map',\n property: 'Property',\n fullscreen: 'Fullscreen',\n walkPerson: 'Person',\n walkBird: 'Bird Eye',\n walkMenu: 'Menu',\n tree: 'Tree',\n section: 'Section',\n sectionPlane: 'Plane Section',\n sectionAxis: 'Axis Section',\n sectionBox: 'Section Box'\n },\n dialog: {\n testTitle: 'Test Dialog',\n testContent: '
This is a draggable and resizable dialog.

Try dragging the title bar or resizing from the bottom-right corner.
',\n },\n menu: {\n info: 'Info',\n home: 'Home',\n componentDetail: 'Component Detail',\n hideSelected: 'Hide Selected',\n transparentSelected: 'Transparent Selected',\n cancelTranslucent: 'Cancel Translucent',\n isolateSelected: 'Isolate Selected',\n hideOthers: 'Hide Others',\n transparentOthers: 'Transparent Others',\n fitSectionBox: 'Fit Section Box',\n showAll: 'Show All',\n quickSelect: 'Quick Select',\n selectSameType: 'Select Same Type',\n selectSameLevel: 'Select Same Level',\n selectSameLevelType: 'Select Same Level & Type'\n },\n tree: {\n searchPlaceholder: 'Please enter content to search',\n },\n constructTree: {\n title: 'Construct Tree',\n },\n tab: {\n component: 'Component',\n system: 'System',\n space: 'Space',\n type: 'Type',\n major: 'Major',\n },\n panel: {\n property: {\n title: 'Component Details',\n base: 'Basic Info',\n material: 'Material',\n advanced: 'Advanced',\n tab: {\n props: 'Properties',\n material: 'Material'\n }\n },\n componentDetail: {\n title: 'Component Detail',\n noSelection: 'Please select a component first'\n }\n },\n measure: {\n btnName: 'Measure',\n dialogTitle: 'Measure',\n modes: {\n clearHeight: 'Clear Height',\n clearDistance: 'Clear Distance',\n distance: 'Distance',\n elevation: 'Elevation',\n point: 'Point',\n angle: 'Angle',\n area: 'Area',\n slope: 'Slope',\n },\n actions: {\n expand: 'Expand',\n collapse: 'Collapse',\n clearAll: 'Clear All',\n settings: 'Settings',\n },\n labels: {\n currentMode: 'Mode:',\n x: 'X:',\n y: 'Y:',\n z: 'Z:',\n value: {\n clearHeight: 'Clear Height:',\n clearDistance: 'Clear Distance:',\n distance: 'Distance:',\n elevation: 'Elevation:',\n point: 'Point:',\n angle: 'Angle:',\n area: 'Area:',\n slope: 'Slope:',\n }\n },\n settings: {\n title: 'Settings',\n unit: 'Unit:',\n precision: 'Precision:',\n hint: 'Distance, clear distance, clear height and elevation use this unit by default; angle and area use their own units.',\n save: 'Save',\n cancel: 'Cancel',\n },\n clearHeight: {\n direction: 'Direction:',\n directionDown: 'Down',\n directionUp: 'Up',\n selectType: 'Select:',\n selectPoint: 'Point',\n selectElement: 'Element',\n }\n },\n sectionPlane: {\n dialogTitle: 'Plane Section',\n actions: {\n hide: 'Hide',\n reverse: 'Reverse',\n reset: 'Reset'\n }\n },\n sectionAxis: {\n dialogTitle: 'Axis Section',\n actions: {\n hide: 'Hide',\n reverse: 'Reverse',\n axisX: 'X',\n axisY: 'Y',\n axisZ: 'Z'\n }\n },\n sectionBox: {\n dialogTitle: 'Section Box',\n actions: {\n hide: 'Hide',\n reverse: 'Reverse',\n fitToModel: 'Fit',\n reset: 'Reset'\n },\n axes: {\n x: 'X',\n y: 'Y',\n z: 'Z'\n }\n },\n walkControl: {\n speed: 'Speed:',\n gravity: 'Gravity',\n collision: 'Collision',\n characterModel: {\n label: 'Construction Worker',\n constructionWorker: 'Construction Worker',\n officeMale: 'Office Male'\n },\n walkMode: {\n label: 'Walk Mode',\n walk: 'Walk',\n run: 'Run'\n },\n exit: 'Exit',\n path: {\n dialogTitle: 'Path Roaming',\n duration: 'Duration',\n durationUnit: 's',\n loop: 'Loop',\n addPoint: 'Add Point',\n deleteAll: 'Delete All',\n point: 'Point',\n play: 'Play',\n stop: 'Stop',\n noPoints: 'No points yet'\n }\n },\n info: {\n dialogTitle: 'Basic Info',\n meshCount: 'Mesh Count',\n totalTriangles: 'Total Triangles',\n totalVertices: 'Total Vertices',\n },\n aiChat: {\n title: 'AI Assistant',\n placeholder: 'Ask a question...',\n quickPrompt: {\n summarize: 'Summarize this model',\n explain: 'Explain selected component',\n generate: 'Generate report'\n },\n action: {\n new: 'New Chat',\n history: 'History',\n settings: 'Settings',\n close: 'Close'\n },\n helper: {\n newline: 'Shift + Enter for new line',\n send: 'Enter to send'\n },\n thinking: 'Thinking...',\n other: 'Other',\n otherPlaceholder: 'Enter custom answer',\n submit: 'Submit'\n },\n setting: {\n dialogTitle: 'Settings',\n renderMode: 'Render Mode',\n modes: {\n simple: 'Performance',\n balance: 'Balanced',\n advanced: 'Quality',\n },\n edgeLine: 'Edge Lines',\n contrast: 'Contrast',\n saturation: 'Saturation',\n lightIntensity: 'Light Intensity',\n environment: 'Environment',\n backgroundVisible: 'Show Background',\n ground: 'Ground',\n groundElevation: 'Ground Elevation',\n groundElevationUnit: 'm',\n }\n};\n","import { LocaleType, TranslationDictionary } from '../locales/types';\nimport { zhCN } from '../locales/zh-CN';\nimport { enUS } from '../locales/en-US';\n\ntype LocaleChangeListener = (locale: LocaleType) => void;\n\n/**\n * 语言管理器类\n */\nexport class LocaleManager {\n private currentLocale: LocaleType = 'zh-CN';\n private messages: Record = {\n 'zh-CN': zhCN,\n 'en-US': enUS,\n };\n private listeners: LocaleChangeListener[] = [];\n\n constructor() {\n // 默认初始化\n }\n\n /**\n * 获取当前语言\n */\n public getLocale(): LocaleType {\n return this.currentLocale;\n }\n\n /**\n * 切换语言\n */\n public setLocale(locale: LocaleType) {\n if (this.currentLocale === locale) return;\n this.currentLocale = locale;\n this.notifyListeners();\n }\n\n /**\n * 翻译核心方法\n */\n public t(key: string): string {\n if (!key) return '';\n \n const keys = key.split('.');\n let value: any = this.messages[this.currentLocale];\n \n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n return key;\n }\n }\n return value as string;\n }\n\n /**\n * 订阅变更\n */\n public subscribe(listener: LocaleChangeListener): () => void {\n this.listeners.push(listener);\n return () => {\n this.listeners = this.listeners.filter(l => l !== listener);\n };\n }\n\n private notifyListeners() {\n this.listeners.forEach(listener => listener(this.currentLocale));\n }\n}\n\n// --- 导出单例 ---\nexport const localeManager = new LocaleManager();\n\n// --- 导出便捷方法 ---\n/**\n * 全局翻译函数\n * @param key 键路径 (如 'toolbar.home')\n */\nexport const t = (key: string): string => localeManager.t(key);\n","import { ThemeConfig } from './types';\n\n/**\n * Tailwind CSS 调色板参考(维护者参考)\n * \n * Slate: #f8fafc #f1f5f9 #e2e8f0 #cbd5e1 #94a3b8 #64748b #475569 #334155 #1e293b #0f172a\n * Blue: #eff6ff #dbeafe #bfdbfe #93c5fd #60a5fa #3b82f6 #2563eb #1d4ed8 #1e40af #1e3a8a\n * Green: #f0fdf4 #dcfce7 #bbf7d0 #86efac #4ade80 #22c55e #16a34a #15803d #166534 #14532d\n * Amber: #fffbeb #fef3c7 #fde68a #fcd34d #fbbf24 #f59e0b #d97706 #b45309 #92400e #78350f\n * Red: #fef2f2 #fee2e2 #fecaca #fca5a5 #f87171 #ef4444 #dc2626 #b91c1c #991b1b #7f1d1d\n * Cyan: #ecfeff #cffafe #a5f3fc #67e8f9 #22d3ee #06b6d4 #0891b2 #0e7490 #155e75 #164e63\n */\n\nexport const lightTheme: ThemeConfig = {\n name: 'light',\n\n primary: '#2563eb',\n primaryHover: '#1d4ed8',\n primaryActive: '#1e40af',\n primarySubtle: 'rgba(37, 99, 235, 0.1)',\n\n success: '#16a34a',\n successHover: '#15803d',\n successSubtle: 'rgba(22, 163, 74, 0.1)',\n\n warning: '#d97706',\n warningHover: '#b45309',\n warningSubtle: 'rgba(217, 119, 6, 0.1)',\n\n danger: '#dc2626',\n dangerHover: '#b91c1c',\n dangerSubtle: 'rgba(220, 38, 38, 0.1)',\n\n info: '#0891b2',\n infoHover: '#0e7490',\n infoSubtle: 'rgba(8, 145, 178, 0.1)',\n\n bgBase: '#f8fafc',\n bgElevated: '#ffffff',\n bgOverlay: 'rgba(255, 255, 255, 0.98)',\n bgInset: '#f1f5f9',\n bgGlass: 'rgba(255, 255, 255, 0.8)',\n bgGlassBlur: '24px',\n\n textPrimary: '#0f172a',\n textSecondary: '#475569',\n textTertiary: '#94a3b8',\n textDisabled: '#cbd5e1',\n textInverse: '#ffffff',\n textLink: '#2563eb',\n textLinkHover: '#1d4ed8',\n\n iconDefault: '#64748b',\n iconHover: '#334155',\n iconActive: '#2563eb',\n iconDisabled: '#cbd5e1',\n iconInverse: '#ffffff',\n\n borderDefault: '#e2e8f0',\n borderSubtle: '#f1f5f9',\n borderStrong: '#cbd5e1',\n borderDisabled: '#f1f5f9',\n divider: '#e2e8f0',\n\n componentBg: 'transparent',\n componentBgHover: 'rgba(15, 23, 42, 0.04)',\n componentBgActive: 'rgba(15, 23, 42, 0.08)',\n componentBgSelected: 'rgba(37, 99, 235, 0.08)',\n componentBgDisabled: '#f8fafc',\n\n focusRing: 'rgba(37, 99, 235, 0.5)',\n focusRingOffset: '#ffffff',\n selectionBg: 'rgba(37, 99, 235, 0.15)',\n selectionText: '#0f172a',\n\n shadowSm: '0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)',\n shadowMd: '0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)',\n shadowLg: '0 10px 25px rgba(0, 0, 0, 0.15), 0 6px 10px rgba(0, 0, 0, 0.1)',\n shadowXl: '0 20px 40px rgba(0, 0, 0, 0.2), 0 10px 15px rgba(0, 0, 0, 0.1)',\n shadowGlow: '0 2px 8px rgba(59, 130, 246, 0.3), 0 4px 16px rgba(59, 130, 246, 0.2)',\n\n scrollbarTrack: '#f1f5f9',\n scrollbarThumb: '#cbd5e1',\n scrollbarThumbHover: '#94a3b8',\n\n floatingBg: 'rgba(255, 255, 255, 0.8)',\n floatingBorder: 'rgba(226, 232, 240, 0.5)',\n floatingShadow: '0 4px 24px rgba(0, 0, 0, 0.06)',\n floatingBtnBg: 'rgba(255, 255, 255, 0.9)',\n floatingBtnBorder: 'rgba(203, 213, 225, 0.6)',\n floatingBtnShadow: '0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)',\n floatingBtnBgHover: '#ffffff',\n floatingBtnShadowHover: '0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)',\n floatingIconColor: '#334155',\n floatingIconColorHover: '#1e293b',\n\n panelBg: 'rgba(255, 255, 255, 0.95)',\n panelBorder: 'rgba(226, 232, 240, 0.6)',\n panelHeaderBg: 'rgba(248, 250, 252, 0.9)',\n panelRadius: '12px',\n\n tabBg: '#f1f5f9',\n tabItemBg: 'transparent',\n tabItemBgHover: 'rgba(255, 255, 255, 0.6)',\n tabItemBgActive: '#ffffff',\n tabItemTextActive: '#2563eb',\n\n overrides: {\n dialog: {\n headerBg: '#f8fafc',\n },\n toolbar: {\n bg: 'rgba(255, 255, 255, 0.9)',\n buttonBg: 'rgba(255, 255, 255, 0.95)',\n buttonBgHover: '#ffffff',\n buttonBgActive: '#2563eb',\n },\n input: {\n bg: '#ffffff',\n bgFocus: '#ffffff',\n placeholder: '#94a3b8',\n },\n },\n};\n\nexport const darkTheme: ThemeConfig = {\n name: 'dark',\n\n primary: '#3b82f6',\n primaryHover: '#60a5fa',\n primaryActive: '#2563eb',\n primarySubtle: 'rgba(59, 130, 246, 0.15)',\n\n success: '#22c55e',\n successHover: '#4ade80',\n successSubtle: 'rgba(34, 197, 94, 0.15)',\n\n warning: '#f59e0b',\n warningHover: '#fbbf24',\n warningSubtle: 'rgba(245, 158, 11, 0.15)',\n\n danger: '#ef4444',\n dangerHover: '#f87171',\n dangerSubtle: 'rgba(239, 68, 68, 0.15)',\n\n info: '#06b6d4',\n infoHover: '#22d3ee',\n infoSubtle: 'rgba(6, 182, 212, 0.15)',\n\n bgBase: '#152232',\n bgElevated: '#1f2d3e',\n bgOverlay: 'rgba(21, 34, 50, 0.98)',\n bgInset: '#152232',\n bgGlass: 'rgba(21, 34, 50, 0.85)',\n bgGlassBlur: '24px',\n\n textPrimary: '#ffffff',\n textSecondary: '#94a3b8',\n textTertiary: '#64748b',\n textDisabled: '#475569',\n textInverse: '#152232',\n textLink: '#60a5fa',\n textLinkHover: '#93c5fd',\n\n iconDefault: '#ffffff',\n iconHover: '#ffffff',\n iconActive: '#3b82f6',\n iconDisabled: '#475569',\n iconInverse: '#152232',\n\n borderDefault: 'rgba(51, 65, 85, 0.5)',\n borderSubtle: 'rgba(51, 65, 85, 0.5)',\n borderStrong: '#475569',\n borderDisabled: '#1e293b',\n divider: '#334155',\n\n componentBg: 'transparent',\n componentBgHover: 'rgba(248, 250, 252, 0.06)',\n componentBgActive: 'rgba(248, 250, 252, 0.1)',\n componentBgSelected: 'rgba(59, 130, 246, 0.2)',\n componentBgDisabled: '#1e293b',\n\n focusRing: 'rgba(59, 130, 246, 0.5)',\n focusRingOffset: '#1e293b',\n selectionBg: 'rgba(59, 130, 246, 0.3)',\n selectionText: '#f8fafc',\n\n shadowSm: '0 2px 8px rgba(0, 0, 0, 0.4), 0 4px 12px rgba(0, 0, 0, 0.3)',\n shadowMd: '0 4px 12px rgba(0, 0, 0, 0.5), 0 6px 20px rgba(0, 0, 0, 0.4)',\n shadowLg: '0 10px 25px rgba(0, 0, 0, 0.6), 0 6px 10px rgba(0, 0, 0, 0.4)',\n shadowXl: '0 20px 40px rgba(0, 0, 0, 0.7), 0 10px 15px rgba(0, 0, 0, 0.5)',\n shadowGlow: '0 2px 8px rgba(59, 130, 246, 0.4), 0 4px 16px rgba(59, 130, 246, 0.25)',\n\n scrollbarTrack: '#1e293b',\n scrollbarThumb: '#475569',\n scrollbarThumbHover: '#64748b',\n\n floatingBg: 'rgba(15, 23, 42, 0.85)',\n floatingBorder: 'rgba(51, 65, 85, 0.4)',\n floatingShadow: '0 4px 24px rgba(0, 0, 0, 0.25)',\n floatingBtnBg: 'rgba(51, 65, 85, 0.6)',\n floatingBtnBorder: 'rgba(100, 116, 139, 0.5)',\n floatingBtnShadow: '0 2px 8px rgba(0, 0, 0, 0.3), 0 4px 12px rgba(0, 0, 0, 0.25)',\n floatingBtnBgHover: 'rgba(71, 85, 105, 0.7)',\n floatingBtnShadowHover: '0 4px 12px rgba(0, 0, 0, 0.35), 0 6px 20px rgba(0, 0, 0, 0.3)',\n floatingIconColor: '#e2e8f0',\n floatingIconColorHover: '#f8fafc',\n\n panelBg: 'rgba(15, 23, 42, 0.95)',\n panelBorder: 'rgba(51, 65, 85, 0.5)',\n panelHeaderBg: 'rgba(15, 23, 42, 0.9)',\n panelRadius: '12px',\n\n tabBg: 'rgba(30, 41, 59, 0.6)',\n tabItemBg: 'transparent',\n tabItemBgHover: 'rgba(51, 65, 85, 0.5)',\n tabItemBgActive: 'rgba(51, 65, 85, 0.8)',\n tabItemTextActive: '#60a5fa',\n\n overrides: {\n dialog: {\n headerBg: '#0f172a',\n },\n toolbar: {\n bg: 'rgba(30, 41, 59, 0.9)',\n buttonBg: 'rgba(51, 65, 85, 0.6)',\n buttonBgHover: 'rgba(71, 85, 105, 0.7)',\n buttonBgActive: '#3b82f6',\n },\n input: {\n bg: '#0f172a',\n bgFocus: '#1e293b',\n placeholder: '#64748b',\n },\n },\n};\n\nexport function createThemeFromPartial(base: ThemeConfig, partial: Partial): ThemeConfig {\n return {\n ...base,\n ...partial,\n overrides: {\n ...base.overrides,\n ...partial.overrides,\n },\n };\n}\n\nexport function getThemeByName(name: string): ThemeConfig {\n switch (name) {\n case 'light':\n return lightTheme;\n case 'dark':\n default:\n return darkTheme;\n }\n}\n","import { ThemeConfig } from '../themes/types';\nimport { darkTheme, lightTheme } from '../themes/presets';\n\ntype ThemeChangeListener = (theme: ThemeConfig) => void;\n\n/**\n * 主题管理器 (单例)\n */\nexport class ThemeManager {\n private currentTheme: ThemeConfig = lightTheme;\n private listeners: ThemeChangeListener[] = [];\n\n constructor() {\n // 默认初始化\n }\n\n /**\n * 获取当前主题配置\n */\n public getTheme(): ThemeConfig {\n return this.currentTheme;\n }\n\n /**\n * 切换预设主题\n * @param themeName 'dark' | 'light'\n */\n public setTheme(themeName: 'dark' | 'light') {\n if (themeName === 'light') {\n this.applyTheme(lightTheme);\n } else {\n this.applyTheme(darkTheme);\n }\n }\n\n /**\n * 应用自定义主题配置\n * @param theme 配置对象\n */\n public setCustomTheme(theme: ThemeConfig) {\n this.applyTheme(theme);\n }\n\n /**\n * 内部应用主题逻辑\n */\n private applyTheme(theme: ThemeConfig) {\n this.currentTheme = theme;\n this.notifyListeners();\n }\n\n /**\n * 订阅主题变更\n */\n public subscribe(listener: ThemeChangeListener): () => void {\n this.listeners.push(listener);\n // 立即回调一次当前状态\n listener(this.currentTheme);\n return () => {\n this.listeners = this.listeners.filter(l => l !== listener);\n };\n }\n\n private notifyListeners() {\n this.listeners.forEach(listener => listener(this.currentTheme));\n }\n}\n\n// 导出单例\nexport const themeManager = new ThemeManager();","import './index.css';\nimport type {\n OptButton,\n ButtonGroup,\n ButtonGroupOptions,\n ButtonConfig,\n ButtonGroupColors\n} from './index.type';\nimport { t, localeManager } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport type { EngineEvents } from '../../types/events';\n\nexport class BimButtonGroup implements IBimComponent {\n private container: HTMLElement;\n protected options: ButtonGroupOptions;\n private groups: ButtonGroup[] = [];\n private activeBtnIds: Set = new Set();\n private btnRefs: Map = new Map();\n private dropdownElement: HTMLElement | null = null;\n private hoverTimeout: number | null = null;\n private customColors: Set = new Set();\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n private readonly DEFAULT_ICON = '';\n\n constructor(options: ButtonGroupOptions) {\n const el = typeof options.container === 'string'\n ? document.getElementById(options.container)\n : options.container;\n\n if (!el) throw new Error('Container not found');\n\n this.container = el;\n // 合并默认配置\n this.options = {\n showLabel: true,\n visibility: {},\n direction: 'row', // 默认横向\n position: 'static', // 默认静态定位\n align: 'vertical', // 默认图标在上\n expand: 'down', // 默认向下展开\n ...options\n };\n\n // 记录初始传入的自定义颜色\n const colorKeys: (keyof ButtonGroupColors)[] = [\n 'backgroundColor', 'btnBackgroundColor', 'btnHoverColor',\n 'btnActiveColor', 'iconColor', 'iconActiveColor',\n 'textColor', 'textActiveColor'\n ];\n colorKeys.forEach(key => {\n if (options[key]) {\n this.customColors.add(key);\n }\n });\n\n this.initContainer();\n this.applyStyles();\n }\n\n protected emit(event: K, payload: EngineEvents[K]) {\n this.options.registry?.emit(event, payload);\n }\n\n private initContainer(): void {\n this.container.innerHTML = '';\n this.container.classList.add('bim-btn-group-root');\n\n if (this.options.direction === 'column') {\n this.container.classList.add('dir-column');\n } else {\n this.container.classList.add('dir-row');\n }\n\n if (this.options.className) {\n this.container.classList.add(this.options.className);\n }\n\n if (this.options.type && this.options.type !== 'default') {\n this.container.classList.add(`type-${this.options.type}`);\n }\n\n this.updatePosition();\n\n // 添加事件拦截,防止点击穿透到 3D 引擎\n this.setupEventInterception(this.container);\n }\n\n /**\n * 设置事件拦截,防止事件冒泡到下层元素(如 3D 引擎)\n */\n private setupEventInterception(el: HTMLElement): void {\n const stopPropagation = (e: Event) => {\n e.stopPropagation();\n };\n\n const events = [\n 'click', 'dblclick', 'contextmenu', 'wheel',\n 'mousedown', 'mouseup', 'mousemove',\n 'touchstart', 'touchend', 'touchmove',\n 'pointerdown', 'pointerup', 'pointermove', 'pointerenter', 'pointerleave', 'pointerover', 'pointerout'\n ];\n\n events.forEach(eventType => {\n el.addEventListener(eventType, stopPropagation, { passive: false });\n });\n }\n\n private updatePosition() {\n const pos = this.options.position;\n const style = this.container.style;\n\n style.top = ''; style.bottom = ''; style.left = ''; style.right = ''; style.transform = '';\n\n if (pos === 'static') {\n this.container.classList.add('static');\n return;\n }\n\n this.container.classList.remove('static');\n this.container.style.position = 'absolute';\n\n if (typeof pos === 'object' && 'x' in pos) {\n style.left = `${pos.x}px`;\n style.top = `${pos.y}px`;\n } else {\n const margin = '20px';\n switch (pos) {\n case 'top-left':\n style.top = margin; style.left = margin;\n break;\n case 'top-center':\n style.top = margin; style.left = '50%'; style.transform = 'translateX(-50%)';\n break;\n case 'top-right':\n style.top = margin; style.right = margin;\n break;\n case 'bottom-left':\n style.bottom = margin; style.left = margin;\n break;\n case 'bottom-center':\n style.bottom = margin; style.left = '50%'; style.transform = 'translateX(-50%)';\n break;\n case 'bottom-right':\n style.bottom = margin; style.right = margin;\n break;\n case 'left-center':\n style.left = margin; style.top = '50%'; style.transform = 'translateY(-50%)';\n break;\n case 'right-center':\n style.right = margin; style.top = '50%'; style.transform = 'translateY(-50%)';\n break;\n case 'center':\n style.top = '50%'; style.left = '50%'; style.transform = 'translate(-50%, -50%)';\n break;\n }\n }\n }\n\n /**\n * 应用样式到容器\n */\n private applyStyles(): void {\n const style = this.container.style;\n if (this.options.backgroundColor) style.setProperty('--bim-btn-group-section-bg', this.options.backgroundColor);\n if (this.options.btnBackgroundColor) style.setProperty('--bim-btn-bg', this.options.btnBackgroundColor);\n if (this.options.btnHoverColor) style.setProperty('--bim-btn-hover-bg', this.options.btnHoverColor);\n if (this.options.btnActiveColor) style.setProperty('--bim-btn-active-bg', this.options.btnActiveColor);\n if (this.options.iconColor) style.setProperty('--bim-icon-color', this.options.iconColor);\n if (this.options.iconActiveColor) style.setProperty('--bim-icon-active-color', this.options.iconActiveColor);\n if (this.options.textColor) style.setProperty('--bim-btn-text-color', this.options.textColor);\n if (this.options.textActiveColor) style.setProperty('--bim-btn-text-active-color', this.options.textActiveColor);\n\n // 同步更新所有已存在的dropdown元素的CSS变量(dropdown被添加到body,无法继承容器的CSS变量)\n const dropdowns = document.querySelectorAll('.opt-btn-dropdown');\n dropdowns.forEach(dropdown => {\n const dropdownStyle = (dropdown as HTMLElement).style;\n if (this.options.iconColor) dropdownStyle.setProperty('--bim-icon-color', this.options.iconColor);\n if (this.options.iconActiveColor) dropdownStyle.setProperty('--bim-icon-active-color', this.options.iconActiveColor);\n if (this.options.textColor) dropdownStyle.setProperty('--bim-btn-text-color', this.options.textColor);\n if (this.options.textActiveColor) dropdownStyle.setProperty('--bim-btn-text-active-color', this.options.textActiveColor);\n if (this.options.btnBackgroundColor) dropdownStyle.setProperty('--bim-btn-bg', this.options.btnBackgroundColor);\n if (this.options.btnHoverColor) dropdownStyle.setProperty('--bim-btn-hover-bg', this.options.btnHoverColor);\n if (this.options.btnActiveColor) dropdownStyle.setProperty('--bim-btn-active-bg', this.options.btnActiveColor);\n });\n }\n\n /**\n * 设置主题的primary颜色(用于边框等)\n */\n private setPrimaryColor(color: string): void {\n this.container.style.setProperty('--bim-primary-color', color);\n\n // 同步更新所有dropdown(dropdown被添加到body,无法继承容器的CSS变量)\n const dropdowns = document.querySelectorAll('.opt-btn-dropdown');\n dropdowns.forEach(dropdown => {\n (dropdown as HTMLElement).style.setProperty('--bim-primary-color', color);\n });\n }\n\n /**\n * 设置主题颜色\n * 只会应用到没有被用户自定义的颜色属性上\n */\n public setTheme(theme: ThemeConfig): void {\n const themeColors: ButtonGroupColors = {\n backgroundColor: theme.bgElevated,\n btnBackgroundColor: theme.componentBg,\n btnHoverColor: theme.componentBgHover,\n btnActiveColor: theme.componentBgActive,\n iconColor: theme.iconDefault,\n iconActiveColor: theme.iconActive,\n textColor: theme.textSecondary,\n textActiveColor: theme.textPrimary\n };\n\n Object.entries(themeColors).forEach(([key, value]) => {\n const colorKey = key as keyof ButtonGroupColors;\n if (!this.customColors.has(colorKey)) {\n this.options[colorKey] = value;\n }\n });\n\n this.container.classList.remove('theme-dark', 'theme-light');\n this.container.classList.add(`theme-${theme.name}`);\n\n this.applyStyles();\n this.setPrimaryColor(theme.primary);\n this.applyThemeCssVars(theme);\n }\n\n /**\n * 应用主题系统的 CSS 变量到容器\n * 供 glass-pill 等样式变体使用\n */\n private applyThemeCssVars(theme: ThemeConfig): void {\n const style = this.container.style;\n\n style.setProperty('--bim-primary', theme.primary);\n style.setProperty('--bim-primary-hover', theme.primaryHover);\n style.setProperty('--bim-primary-active', theme.primaryActive);\n\n style.setProperty('--bim-bg-glass', theme.bgGlass);\n style.setProperty('--bim-bg-glass-blur', theme.bgGlassBlur);\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-bg-overlay', theme.bgOverlay);\n style.setProperty('--bim-bg-inset', theme.bgInset);\n\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-secondary', theme.textSecondary);\n style.setProperty('--bim-text-tertiary', theme.textTertiary);\n style.setProperty('--bim-text-inverse', theme.textInverse);\n\n style.setProperty('--bim-icon-default', theme.iconDefault);\n style.setProperty('--bim-icon-hover', theme.iconHover);\n style.setProperty('--bim-icon-active', theme.iconActive);\n style.setProperty('--bim-icon-inverse', theme.iconInverse);\n\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-border-subtle', theme.borderSubtle);\n\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover);\n style.setProperty('--bim-component-bg-active', theme.componentBgActive);\n\n style.setProperty('--bim-shadow-sm', theme.shadowSm);\n style.setProperty('--bim-shadow-md', theme.shadowMd);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n style.setProperty('--bim-shadow-glow', theme.shadowGlow);\n\n style.setProperty('--bim-floating-bg', theme.floatingBg);\n style.setProperty('--bim-floating-border', theme.floatingBorder);\n style.setProperty('--bim-floating-shadow', theme.floatingShadow);\n style.setProperty('--bim-floating-btn-bg', theme.floatingBtnBg);\n style.setProperty('--bim-floating-btn-border', theme.floatingBtnBorder);\n style.setProperty('--bim-floating-btn-shadow', theme.floatingBtnShadow);\n style.setProperty('--bim-floating-btn-bg-hover', theme.floatingBtnBgHover);\n style.setProperty('--bim-floating-btn-shadow-hover', theme.floatingBtnShadowHover);\n style.setProperty('--bim-floating-icon-color', theme.floatingIconColor);\n style.setProperty('--bim-floating-icon-color-hover', theme.floatingIconColorHover);\n\n this.syncDropdownCssVars(theme);\n }\n\n /**\n * 同步 CSS 变量到所有 dropdown 元素\n * dropdown 被添加到 body,无法继承容器的 CSS 变量\n */\n private syncDropdownCssVars(theme: ThemeConfig): void {\n const dropdowns = document.querySelectorAll('.opt-btn-dropdown');\n dropdowns.forEach(dropdown => {\n const style = (dropdown as HTMLElement).style;\n\n style.setProperty('--bim-primary', theme.primary);\n style.setProperty('--bim-bg-overlay', theme.bgOverlay);\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-inverse', theme.textInverse);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n style.setProperty('--bim-floating-btn-bg', theme.floatingBtnBg);\n style.setProperty('--bim-floating-btn-bg-hover', theme.floatingBtnBgHover);\n style.setProperty('--bim-floating-icon-color', theme.floatingIconColor);\n });\n }\n\n /**\n * 直接设置颜色(强制覆盖)\n * 设置的颜色会被标记为自定义,后续的 setTheme 不会覆盖它们\n */\n public setColors(colors: ButtonGroupColors): void {\n // 更新 options\n this.options = { ...this.options, ...colors };\n\n // 标记这些颜色为自定义\n Object.keys(colors).forEach(key => {\n this.customColors.add(key as keyof ButtonGroupColors);\n });\n\n this.applyStyles();\n }\n\n public async init(): Promise {\n this.render();\n\n // 自动订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 自动订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n }\n\n public setLocales(): void {\n this.render();\n }\n\n public addGroup(groupId: string, beforeGroupId?: string): void {\n if (this.groups.some(g => g.id === groupId)) return;\n const newGroup: ButtonGroup = { id: groupId, buttons: [] };\n if (beforeGroupId) {\n const index = this.groups.findIndex(g => g.id === beforeGroupId);\n index !== -1 ? this.groups.splice(index, 0, newGroup) : this.groups.push(newGroup);\n } else {\n this.groups.push(newGroup);\n }\n }\n\n public addButton(config: ButtonConfig): void {\n const { groupId, parentId } = config;\n const group = this.groups.find(g => g.id === groupId);\n if (!group) return;\n\n const button: OptButton = { ...config, children: config.children || [] };\n if (parentId) {\n const parentBtn = this.findButton(group.buttons, parentId);\n if (parentBtn) {\n if (!parentBtn.children) parentBtn.children = [];\n parentBtn.children.push(button);\n }\n } else {\n group.buttons.push(button);\n }\n }\n\n private findButton(buttons: OptButton[], id: string): OptButton | undefined {\n for (const btn of buttons) {\n if (btn.id === id) return btn;\n if (btn.children) {\n const found = this.findButton(btn.children, id);\n if (found) return found;\n }\n }\n return undefined;\n }\n\n public render(): void {\n this.container.innerHTML = '';\n this.btnRefs.clear();\n\n this.groups.forEach((group, index) => {\n const groupElement = this.renderGroup(group, index, this.groups.length);\n this.container.appendChild(groupElement);\n });\n }\n\n private renderGroup(group: ButtonGroup, index: number, total: number): HTMLElement {\n const groupEl = document.createElement('div');\n groupEl.className = 'bim-btn-group-section';\n\n if (index < total - 1) {\n groupEl.classList.add('has-divider');\n }\n\n group.buttons.forEach(button => {\n if (this.isVisible(button.id)) {\n const btnWrapper = this.renderButton(button);\n groupEl.appendChild(btnWrapper);\n }\n });\n return groupEl;\n }\n\n private renderButton(button: OptButton): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'opt-btn-wrapper';\n\n const btnEl = document.createElement('div');\n btnEl.className = 'opt-btn';\n\n // 初始化时根据 button 自身的属性同步 active 状态\n if (button.isActive) {\n this.activeBtnIds.add(button.id);\n }\n\n // 按钮优先使用自己的 align,否则使用全局配置,默认为 vertical\n const align = button.align || this.options.align || 'vertical';\n if (align === 'horizontal') {\n btnEl.classList.add('align-horizontal');\n } else {\n btnEl.classList.add('align-vertical');\n }\n\n if (this.activeBtnIds.has(button.id)) btnEl.classList.add('active');\n if (button.disabled) btnEl.classList.add('disabled');\n\n // 判断是否显示 label\n const hasLabel = this.options.showLabel && button.label;\n if (!hasLabel) {\n btnEl.classList.add('no-label');\n // 当不显示 label 时,添加 title 属性作为 tooltip\n if (button.label) {\n btnEl.title = t(button.label);\n }\n }\n\n // 应用按钮的自定义样式\n const iconSize = button.iconSize || 32;\n const minWidth = button.minWidth || 50;\n btnEl.style.minWidth = `${minWidth}px`;\n\n const icon = document.createElement('div');\n icon.className = 'opt-btn-icon';\n icon.style.width = `${iconSize}px`;\n icon.style.height = `${iconSize}px`;\n icon.innerHTML = this.getIcon(button.icon);\n btnEl.appendChild(icon);\n\n // 创建文字和箭头的容器,确保它们始终在一起(无论主轴是横是竖)\n const textWrapper = document.createElement('div');\n textWrapper.className = 'opt-btn-text-wrapper';\n\n if (this.options.showLabel && button.label) {\n const label = document.createElement('span');\n label.className = 'opt-btn-label';\n label.textContent = t(button.label);\n textWrapper.appendChild(label);\n }\n\n // TODO: 暂时隐藏下拉箭头\n // if (button.children && button.children.length > 0) {\n // const arrow = document.createElement('span');\n // arrow.className = 'opt-btn-arrow';\n // arrow.textContent = '▼';\n // textWrapper.appendChild(arrow);\n // }\n\n // 只有当有内容时才添加 wrapper\n if (textWrapper.hasChildNodes()) {\n btnEl.appendChild(textWrapper);\n }\n\n btnEl.addEventListener('click', () => this.handleClick(button));\n btnEl.addEventListener('mouseenter', () => this.handleMouseEnter(button, btnEl));\n btnEl.addEventListener('mouseleave', () => this.handleMouseLeave());\n\n this.btnRefs.set(button.id, btnEl);\n wrapper.appendChild(btnEl);\n return wrapper;\n }\n\n /**\n * 设置按钮的激活状态\n * @param id 按钮 ID\n * @param active 可选,如果不传则切换(toggle)当前状态\n */\n public setBtnActive(id: string, active?: boolean): void {\n const button = this.findButtonById(id);\n if (!button) return;\n\n // 确定最终状态\n const newState = active !== undefined ? active : !this.activeBtnIds.has(id);\n\n if (newState) {\n this.activeBtnIds.add(id);\n } else {\n this.activeBtnIds.delete(id);\n }\n\n // 同步对象状态并更新 DOM\n button.isActive = newState;\n this.updateButtonState(id);\n }\n\n private handleClick(button: OptButton): void {\n if (button.disabled) return;\n if (!button.children || button.children.length === 0) {\n if (button.keepActive) {\n // 1) 先切换自身激活状态(onClick 里通常会根据 isActive 决定“打开/关闭”逻辑)\n const wasActive = this.activeBtnIds.has(button.id);\n const newState = !wasActive;\n this.setBtnActive(button.id, newState);\n\n // 2) 互斥逻辑:仅在“本次切换为激活”时触发\n // - 一级按钮:同 groupId 下其它一级按钮互斥\n // - 二级按钮:同 groupId + 同 parentId 下其它二级按钮互斥\n // - 被关闭的按钮需要触发 onClick(用于执行关闭逻辑)\n if (newState && button.exclusive && button.groupId) {\n this.deactivateExclusiveSiblings(button);\n }\n }\n this.closeDropdown();\n if (button.onClick) button.onClick(button);\n }\n }\n\n /**\n * 互斥关闭同范围内的其它已激活按钮,并触发它们的 onClick\n * @param button 当前被激活的按钮\n */\n private deactivateExclusiveSiblings(button: OptButton): void {\n const group = this.groups.find(g => g.id === button.groupId);\n if (!group) return;\n\n // 二级按钮:同 groupId + 同 parentId\n if (button.parentId) {\n const parent = this.findButton(group.buttons, button.parentId);\n const siblings = parent?.children || [];\n for (const sib of siblings) {\n if (!sib) continue;\n if (sib.id === button.id) continue;\n if (sib.parentId !== button.parentId) continue;\n if (sib.groupId !== button.groupId) continue;\n\n if (this.activeBtnIds.has(sib.id)) {\n this.setBtnActive(sib.id, false);\n // 触发被关闭按钮的 onClick(此时 sib.isActive 已经同步为 false)\n if (sib.onClick) sib.onClick(sib);\n }\n }\n return;\n }\n\n // 一级按钮:同 groupId 下其它一级按钮(不包含二级)\n for (const sib of group.buttons) {\n if (sib.id === button.id) continue;\n if (sib.groupId !== button.groupId) continue;\n if (sib.parentId) continue; // 只处理一级按钮\n\n if (this.activeBtnIds.has(sib.id)) {\n this.setBtnActive(sib.id, false);\n if (sib.onClick) sib.onClick(sib);\n }\n }\n }\n\n private handleMouseEnter(button: OptButton, btnEl: HTMLElement): void {\n if (this.hoverTimeout) clearTimeout(this.hoverTimeout);\n if (button.children && button.children.length > 0) {\n this.showDropdown(button, btnEl);\n } else {\n this.closeDropdown();\n }\n }\n\n private handleMouseLeave(): void {\n this.hoverTimeout = window.setTimeout(() => this.closeDropdown(), 200);\n }\n\n private showDropdown(button: OptButton, btnEl: HTMLElement): void {\n this.closeDropdown();\n if (!button.children) return;\n\n const dropdown = document.createElement('div');\n dropdown.className = 'opt-btn-dropdown';\n if (this.options.backgroundColor) dropdown.style.setProperty('--bim-toolbar-bg', this.options.backgroundColor);\n\n // 将主题CSS变量复制到dropdown元素上(因为dropdown被添加到body,无法继承容器的CSS变量)\n const dropdownStyle = dropdown.style;\n if (this.options.iconColor) dropdownStyle.setProperty('--bim-icon-color', this.options.iconColor);\n if (this.options.iconActiveColor) dropdownStyle.setProperty('--bim-icon-active-color', this.options.iconActiveColor);\n if (this.options.textColor) dropdownStyle.setProperty('--bim-btn-text-color', this.options.textColor);\n if (this.options.textActiveColor) dropdownStyle.setProperty('--bim-btn-text-active-color', this.options.textActiveColor);\n if (this.options.btnBackgroundColor) dropdownStyle.setProperty('--bim-btn-bg', this.options.btnBackgroundColor);\n if (this.options.btnHoverColor) dropdownStyle.setProperty('--bim-btn-hover-bg', this.options.btnHoverColor);\n if (this.options.btnActiveColor) dropdownStyle.setProperty('--bim-btn-active-bg', this.options.btnActiveColor);\n\n // 获取按钮的位置信息\n const btnRect = btnEl.getBoundingClientRect();\n const expand = this.options.expand || 'down';\n\n // 根据主按钮组的方向设置下拉菜单的布局方向\n if (this.options.direction === 'row') {\n dropdown.style.flexDirection = 'column'; // 横向按钮组,菜单纵向排列\n } else {\n dropdown.style.flexDirection = 'row'; // 纵向按钮组,菜单横向排列\n }\n\n if (this.options.type && this.options.type !== 'default') {\n dropdown.classList.add(`type-${this.options.type}`);\n }\n\n const currentTheme = themeManager.getTheme();\n dropdown.classList.add(`theme-${currentTheme.name}`);\n\n dropdownStyle.setProperty('--bim-primary', currentTheme.primary);\n dropdownStyle.setProperty('--bim-bg-overlay', currentTheme.bgOverlay);\n dropdownStyle.setProperty('--bim-border-default', currentTheme.borderDefault);\n dropdownStyle.setProperty('--bim-text-primary', currentTheme.textPrimary);\n dropdownStyle.setProperty('--bim-text-inverse', currentTheme.textInverse);\n dropdownStyle.setProperty('--bim-shadow-lg', currentTheme.shadowLg);\n dropdownStyle.setProperty('--bim-floating-btn-bg', currentTheme.floatingBtnBg);\n dropdownStyle.setProperty('--bim-floating-btn-bg-hover', currentTheme.floatingBtnBgHover);\n dropdownStyle.setProperty('--bim-floating-icon-color', currentTheme.floatingIconColor);\n\n document.body.appendChild(dropdown);\n\n // 添加事件拦截\n this.setupEventInterception(dropdown);\n\n // 添加菜单项\n button.children.forEach(subBtn => {\n if (this.isVisible(subBtn.id)) {\n const item = this.renderDropdownItem(subBtn);\n dropdown.appendChild(item);\n }\n });\n\n // 获取下拉菜单的实际尺寸\n const dropdownRect = dropdown.getBoundingClientRect();\n\n if (expand === 'up') {\n // 向上展开,与按钮水平居中对齐\n dropdown.style.bottom = (window.innerHeight - btnRect.top + 8) + 'px';\n dropdown.style.left = (btnRect.left + (btnRect.width - dropdownRect.width) / 2) + 'px';\n } else if (expand === 'down') {\n // 向下展开,与按钮水平居中对齐\n dropdown.style.top = (btnRect.bottom + 8) + 'px';\n dropdown.style.left = (btnRect.left + (btnRect.width - dropdownRect.width) / 2) + 'px';\n } else if (expand === 'right') {\n // 向右展开,与按钮垂直居中对齐\n dropdown.style.top = (btnRect.top + (btnRect.height - dropdownRect.height) / 2) + 'px';\n dropdown.style.left = (btnRect.right + 8) + 'px';\n } else if (expand === 'left') {\n // 向左展开,与按钮垂直居中对齐\n dropdown.style.top = (btnRect.top + (btnRect.height - dropdownRect.height) / 2) + 'px';\n dropdown.style.right = (window.innerWidth - btnRect.left + 8) + 'px';\n }\n\n dropdown.addEventListener('mouseenter', () => { if (this.hoverTimeout) clearTimeout(this.hoverTimeout); });\n dropdown.addEventListener('mouseleave', () => this.handleMouseLeave());\n this.dropdownElement = dropdown;\n }\n\n private renderDropdownItem(button: OptButton): HTMLElement {\n const item = document.createElement('div');\n item.className = 'opt-btn-dropdown-item';\n\n // 应用按钮的 align 设置,默认为 horizontal(图标在左)\n const align = button.align || 'horizontal';\n if (align === 'horizontal') {\n item.classList.add('align-horizontal');\n } else {\n item.classList.add('align-vertical');\n }\n\n // 二级菜单项的 active 状态渲染(修复 keepActive 在二级按钮“看起来不生效”的问题)\n // 说明:\n // - keepActive 的状态会记录在 activeBtnIds / button.isActive 上\n // - 下拉菜单每次打开都会重新渲染,因此必须在这里同步一次 active 样式\n if (this.activeBtnIds.has(button.id) || button.isActive) {\n item.classList.add('active');\n }\n\n // 应用按钮的自定义样式\n const iconSize = button.iconSize || 32; // 二级菜单默认图标更小\n const minWidth = button.minWidth; // 不设置默认值,让下拉菜单项保持紧凑\n if (minWidth) {\n item.style.minWidth = `${minWidth}px`;\n }\n\n const icon = document.createElement('div');\n icon.className = 'opt-btn-icon';\n icon.style.width = `${iconSize}px`;\n icon.style.height = `${iconSize}px`;\n icon.innerHTML = this.getIcon(button.icon);\n item.appendChild(icon);\n\n // 只有在 showLabel 为 true 时才显示 label\n if (this.options.showLabel && button.label) {\n const label = document.createElement('span');\n label.className = 'opt-btn-dropdown-label';\n label.textContent = t(button.label);\n item.appendChild(label);\n } else if (button.label) {\n // 当不显示 label 时,添加 title 属性作为 tooltip\n item.title = t(button.label);\n }\n\n item.addEventListener('click', (e) => { e.stopPropagation(); this.handleClick(button); });\n return item;\n }\n\n private closeDropdown(): void {\n if (this.dropdownElement) {\n this.dropdownElement.remove();\n this.dropdownElement = null;\n }\n this.btnRefs.forEach(btnEl => {\n const arrow = btnEl.querySelector('.opt-btn-arrow');\n if (arrow) arrow.classList.remove('rotated');\n });\n }\n\n private updateButtonState(buttonId: string): void {\n const btnEl = this.btnRefs.get(buttonId);\n if (btnEl) {\n if (this.activeBtnIds.has(buttonId)) {\n btnEl.classList.add('active');\n } else {\n btnEl.classList.remove('active');\n }\n }\n }\n\n private getIcon(icon?: string): string { return icon || this.DEFAULT_ICON; }\n\n public updateButtonVisibility(id: string, visible: boolean): void {\n if (!this.options.visibility) this.options.visibility = {};\n this.options.visibility[id] = visible;\n this.render();\n }\n\n public setShowLabel(show: boolean): void {\n this.options.showLabel = show;\n this.updateLabelsVisibility();\n }\n\n private updateLabelsVisibility(): void {\n this.btnRefs.forEach((btnEl, buttonId) => {\n // 查找按钮配置\n const button = this.findButtonById(buttonId);\n if (!button) return;\n\n const hasLabel = this.options.showLabel && button.label;\n\n // 更新 no-label 类和 title 属性\n if (hasLabel) {\n btnEl.classList.remove('no-label');\n // 显示标签时,移除 title(避免重复显示)\n btnEl.removeAttribute('title');\n } else {\n btnEl.classList.add('no-label');\n // 隐藏标签时,添加 title 作为 tooltip\n if (button.label) {\n btnEl.title = t(button.label);\n }\n }\n });\n }\n\n private findButtonById(id: string): OptButton | undefined {\n for (const group of this.groups) {\n const found = this.findButton(group.buttons, id);\n if (found) return found;\n }\n return undefined;\n }\n\n public setBackgroundColor(color: string): void { this.setColors({ backgroundColor: color }); }\n private isVisible(id: string): boolean { return this.options.visibility?.[id] !== false; }\n\n public setType(type: 'default' | 'glass-pill'): void {\n this.container.classList.remove('type-default', 'type-glass-pill');\n this.options.type = type;\n\n if (type && type !== 'default') {\n this.container.classList.add(`type-${type}`);\n }\n\n this.render();\n }\n\n public getType(): 'default' | 'glass-pill' {\n return this.options.type || 'default';\n }\n\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.closeDropdown();\n this.container.innerHTML = '';\n this.btnRefs.clear();\n }\n}\n","import { BimButtonGroup } from '../index';\nimport type { ManagerRegistry } from '../../../core/manager-registry';\n\nexport class Toolbar extends BimButtonGroup {\n public async init(): Promise {\n await super.init();\n\n const registry = this.options.registry as ManagerRegistry;\n\n const { createHomeButton } = await import('./buttons/home');\n const { createZoomBoxButton } = await import('./buttons/zoom-box');\n const { createWalkMenuButton } = await import('./buttons/walk/walk-menu');\n const { createMapButton } = await import('./buttons/map');\n const { createPropertyButton } = await import('./buttons/property');\n const { createSettingButton } = await import('./buttons/setting');\n const { createInfoButton } = await import('./buttons/info');\n const { createFullscreenButton } = await import('./buttons/fullscreen');\n const { createMeasureButton } = await import('./buttons/measure');\n const { createSectionMenuButton } = await import('./buttons/section/section-menu');\n const { createSectionPlaneButton } = await import('./buttons/section/section-plane');\n const { createSectionAxisButton } = await import('./buttons/section/section-axis');\n const { createSectionBoxButton } = await import('./buttons/section/section-box');\n const { createAiChatButton } = await import('./buttons/ai-chat');\n\n this.addGroup('group-1');\n\n this.addButton(createHomeButton(registry));\n this.addButton(createZoomBoxButton(registry));\n this.addButton(createMeasureButton(registry));\n this.addButton(createSectionMenuButton(registry));\n this.addButton(createSectionPlaneButton(registry));\n this.addButton(createSectionAxisButton(registry));\n this.addButton(createSectionBoxButton(registry));\n this.addButton(createWalkMenuButton(registry));\n this.addButton(createMapButton(registry));\n this.addButton(createPropertyButton(registry));\n this.addGroup('group-2');\n this.addButton(createAiChatButton(registry));\n this.addButton(createSettingButton(registry));\n this.addButton(createInfoButton(registry));\n this.addButton(createFullscreenButton(registry));\n\n this.render();\n }\n}\n","/**\n * Manager 基类\n * 提供所有 Manager 的通用功能\n */\nimport { ManagerRegistry } from './manager-registry';\nimport type { EngineEvents } from '../types/events';\nimport type { Engine } from '../components/engine';\n\n/**\n * Manager 抽象基类\n * - 通过构造函数接收 Registry 实例\n * - 自动管理事件订阅的清理\n */\nexport abstract class BaseManager {\n /** 注册表实例 */\n protected registry: ManagerRegistry;\n /** 事件订阅列表,用于自动清理 */\n private subscriptions: Array<() => void> = [];\n\n constructor(registry: ManagerRegistry) {\n this.registry = registry;\n }\n\n /**\n * 获取 Engine 组件实例的便捷访问器\n * 内部管理器通过此 getter 直接访问 Engine 组件的全部能力\n * 替代原来的 this.registry.engine3d?.xxx() 透传链\n */\n protected get engineComponent(): Engine | null {\n return this.registry.engine3d?.getEngineComponent?.() ?? null;\n }\n\n /**\n * 订阅事件(自动追踪,destroy 时自动取消)\n * @param event 事件名称\n * @param handler 事件处理函数\n */\n protected subscribe(\n event: K,\n handler: (payload: EngineEvents[K]) => void\n ): void {\n const unsubscribe = this.registry.on(event, handler);\n this.subscriptions.push(unsubscribe);\n }\n\n /**\n * 发送事件\n * @param event 事件名称\n * @param payload 事件数据\n */\n protected emit(\n event: K,\n payload: EngineEvents[K]\n ): void {\n this.registry.emit(event, payload);\n }\n\n /**\n * 销毁 Manager,清理所有订阅\n * 子类应该调用 super.destroy()\n */\n public destroy(): void {\n this.subscriptions.forEach(unsub => unsub());\n this.subscriptions = [];\n }\n}\n","/**\n * 工具栏管理器\n * 负责管理底部工具栏的创建、按钮配置和显示控制\n */\nimport type { ButtonGroupColors, ButtonConfig } from '../components/button-group/index.type';\nimport { Toolbar } from '../components/button-group/toolbar';\nimport type { ThemeConfig } from '../themes/types';\nimport { BaseManager } from '../core/base-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\n\n/**\n * 工具栏管理器\n * 提供工具栏按钮的添加、显示/隐藏、主题更新等功能\n */\nexport class ToolbarManager extends BaseManager {\n /** 工具栏实例 */\n private toolbar: Toolbar | null = null;\n /** 工具栏容器元素 */\n private toolbarContainer: HTMLElement | null = null;\n /** 主容器元素 */\n private container: HTMLElement;\n\n constructor(container: HTMLElement, registry: ManagerRegistry) {\n super(registry);\n this.container = container;\n this.init();\n }\n\n /** 初始化工具栏 */\n private init() {\n this.toolbarContainer = document.createElement('div');\n this.toolbarContainer.id = 'opt-btn-groups';\n this.toolbarContainer.className = 'bim-engine-opt-btn-container is-bottom-toolbar';\n this.container.appendChild(this.toolbarContainer);\n\n this.toolbar = new Toolbar({\n container: this.toolbarContainer,\n type: 'glass-pill',\n showLabel: true,\n direction: 'row',\n position: 'bottom-right',\n align: 'vertical',\n expand: 'up',\n registry: this.registry\n });\n\n this.toolbar.init();\n }\n\n /**\n * 更新工具栏主题\n * @param theme 主题配置\n */\n public updateTheme(theme: ThemeConfig) {\n this.toolbar?.setTheme(theme);\n }\n\n /** 刷新工具栏渲染 */\n public refresh() {\n this.toolbar?.render();\n }\n\n /** 销毁工具栏 */\n public destroy() {\n this.toolbar?.destroy();\n this.toolbar = null;\n super.destroy();\n }\n\n /**\n * 添加按钮组\n * @param groupId 组 ID\n * @param beforeGroupId 插入到指定组之前\n */\n public addGroup(groupId: string, beforeGroupId?: string) {\n this.toolbar?.addGroup(groupId, beforeGroupId);\n this.toolbar?.render();\n }\n\n /**\n * 添加按钮\n * @param config 按钮配置\n */\n public addButton(config: ButtonConfig) {\n this.toolbar?.addButton(config);\n this.toolbar?.render();\n }\n\n /**\n * 设置按钮可见性\n * @param id 按钮 ID\n * @param v 是否可见\n */\n public setButtonVisibility(id: string, v: boolean) {\n this.toolbar?.updateButtonVisibility(id, v);\n }\n\n /**\n * 设置是否显示标签\n * @param show 是否显示\n */\n public setShowLabel(show: boolean) {\n this.toolbar?.setShowLabel(show);\n }\n\n /**\n * 设置按钮激活状态\n * @param id 按钮 ID\n * @param active 是否激活\n */\n public setBtnActive(id: string, active?: boolean) {\n this.toolbar?.setBtnActive(id, active);\n }\n\n /**\n * 设置工具栏可见性\n * @param visible 是否可见\n */\n public setVisible(visible: boolean) {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.visibility = visible ? 'visible' : 'hidden';\n }\n }\n\n /**\n * 设置背景颜色\n * @param color 颜色值\n */\n public setBackgroundColor(color: string) {\n this.toolbar?.setBackgroundColor(color);\n }\n\n /**\n * 设置按钮组颜色\n * @param colors 颜色配置\n */\n public setColors(colors: ButtonGroupColors) {\n this.toolbar?.setColors(colors);\n }\n\n /** 隐藏工具栏 */\n public hide(): void {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.display = 'none';\n }\n }\n\n /** 显示工具栏 */\n public show(): void {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.display = '';\n }\n }\n\n /**\n * 获取工具栏容器\n * @returns 容器元素\n */\n public getContainer(): HTMLElement | null {\n return this.toolbarContainer;\n }\n\n public setType(type: 'default' | 'glass-pill'): void {\n this.toolbar?.setType(type);\n }\n\n public getType(): 'default' | 'glass-pill' {\n return this.toolbar?.getType() || 'default';\n }\n}\n","/**\n * 按钮组管理器\n * 负责创建和管理按钮组实例\n */\nimport { BimButtonGroup } from '../components/button-group';\nimport type { ButtonGroupOptions } from '../components/button-group/index.type';\nimport type { ThemeConfig } from '../themes/types';\nimport { BaseManager } from '../core/base-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\n\n/**\n * 按钮组管理器\n * 统一管理多个按钮组的创建、主题更新和销毁\n */\nexport class ButtonGroupManager extends BaseManager {\n /** 按钮组映射表 */\n private groups: Map = new Map();\n /** 容器元素 */\n private container: HTMLElement;\n\n constructor(container: HTMLElement, registry: ManagerRegistry) {\n super(registry);\n this.container = container;\n }\n\n /**\n * 创建按钮组\n * @param id 按钮组 ID\n * @param options 按钮组配置\n * @returns 按钮组实例\n */\n public create(id: string, options: Omit): BimButtonGroup {\n const group = new BimButtonGroup({\n container: this.container,\n registry: this.registry,\n ...options\n });\n\n group.init();\n this.groups.set(id, group);\n return group;\n }\n\n /**\n * 获取按钮组\n * @param id 按钮组 ID\n * @returns 按钮组实例\n */\n public get(id: string): BimButtonGroup | undefined {\n return this.groups.get(id);\n }\n\n /**\n * 更新所有按钮组的主题\n * @param theme 主题配置\n */\n public updateTheme(theme: ThemeConfig) {\n this.groups.forEach(group => group.setTheme(theme));\n }\n\n /** 销毁管理器和所有按钮组 */\n public destroy() {\n this.groups.forEach(group => group.destroy());\n this.groups.clear();\n super.destroy();\n }\n}\n","import './index.css';\nimport type { DialogOptions } from './index.type';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { themeManager } from '../../services/theme';\nimport { t, localeManager } from '../../services/locale';\n\n/**\n * 通用弹窗组件类\n * 支持拖拽、缩放、自定义内容和位置。\n */\nexport class BimDialog implements IBimComponent {\n private element: HTMLElement;\n private options: DialogOptions;\n private container: HTMLElement;\n private header: HTMLElement;\n private contentArea: HTMLElement;\n private _isDestroyed = false;\n private _isInitialized = false;\n private unsubscribeTheme: (() => void) | null = null;\n private unsubscribeLocale: (() => void) | null = null;\n\n // 性能优化:用于存储 requestAnimationFrame 的 ID\n private rafId: number | null = null;\n\n /**\n * 构造函数\n * @param options 弹窗配置选项\n */\n constructor(options: DialogOptions) {\n // 合并默认配置\n this.options = {\n title: 'Dialog',\n width: 300,\n height: 'auto',\n position: 'center',\n draggable: true,\n resizable: false,\n minWidth: 200,\n minHeight: 100,\n ...options\n };\n this.container = options.container;\n\n // 创建 DOM 结构\n this.element = this.createDom();\n this.header = this.element.querySelector('.bim-dialog-header') as HTMLElement;\n this.contentArea = this.element.querySelector('.bim-dialog-content') as HTMLElement;\n\n // 自动初始化 (为了兼容现有逻辑)\n this.init();\n }\n\n /**\n * 设置主题\n * @param theme 全局主题配置\n */\n public setTheme(theme: ThemeConfig) {\n const style = this.element.style;\n if (!this.options.backgroundColor) style.setProperty('--bim-dialog-bg', theme.bgElevated);\n if (!this.options.headerBackgroundColor) style.setProperty('--bim-dialog-header-bg', theme.bgInset);\n if (!this.options.titleColor) style.setProperty('--bim-dialog-title-color', theme.textPrimary);\n if (!this.options.textColor) style.setProperty('--bim-dialog-text-color', theme.textSecondary);\n if (!this.options.borderColor) style.setProperty('--bim-dialog-border-color', theme.borderDefault);\n\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-bg-inset', theme.bgInset);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-secondary', theme.textSecondary);\n style.setProperty('--bim-text-tertiary', theme.textTertiary);\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n }\n\n /**\n * 初始化组件功能 (接口实现)\n */\n public init() {\n if (this._isInitialized) return;\n\n this.container.appendChild(this.element);\n\n // 必须先挂载才能计算尺寸进行定位\n this.initPosition();\n\n if (this.options.draggable) {\n this.initDrag();\n }\n\n if (this.options.resizable) {\n this.initResize();\n }\n\n this._isInitialized = true;\n\n // 调用弹窗开启后回调\n if (this.options.onOpen) {\n this.options.onOpen();\n }\n\n // 自动订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 自动订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n }\n\n public setLocales(): void {\n if (this.options.title) {\n const titleEl = this.header.querySelector('.bim-dialog-title');\n if (titleEl) {\n titleEl.textContent = t(this.options.title);\n }\n }\n }\n\n /**\n * 创建弹窗的 DOM 结构\n */\n private createDom(): HTMLElement {\n const el = document.createElement('div');\n el.className = 'bim-dialog';\n\n if (this.options.id) el.id = this.options.id;\n\n // 应用颜色配置到 CSS 变量\n const style = el.style;\n if (this.options.backgroundColor) style.setProperty('--bim-dialog-bg', this.options.backgroundColor);\n if (this.options.headerBackgroundColor) style.setProperty('--bim-dialog-header-bg', this.options.headerBackgroundColor);\n if (this.options.titleColor) style.setProperty('--bim-dialog-title-color', this.options.titleColor);\n if (this.options.textColor) style.setProperty('--bim-dialog-text-color', this.options.textColor);\n if (this.options.borderColor) style.setProperty('--bim-dialog-border-color', this.options.borderColor);\n\n // 设置初始尺寸\n this.setSize(el, this.options.width, this.options.height);\n // 确保最小尺寸生效\n if (this.options.minWidth) el.style.minWidth = `${this.options.minWidth}px`;\n\n // 创建标题栏 (Header)\n const header = document.createElement('div');\n header.className = 'bim-dialog-header';\n if (this.options.draggable) header.classList.add('draggable');\n\n const title = document.createElement('span');\n title.className = 'bim-dialog-title';\n title.textContent = this.options.title ? t(this.options.title) : '';\n\n const closeBtn = document.createElement('span');\n closeBtn.className = 'bim-dialog-close';\n closeBtn.innerHTML = '×';\n // 修复 TS 报错:去掉未使用的参数 e\n closeBtn.onclick = () => {\n this.close();\n };\n\n header.appendChild(title);\n header.appendChild(closeBtn);\n\n // 创建内容区域 (Content)\n const content = document.createElement('div');\n content.className = 'bim-dialog-content';\n if (typeof this.options.content === 'string') {\n content.innerHTML = this.options.content;\n } else if (this.options.content instanceof HTMLElement) {\n content.appendChild(this.options.content);\n }\n\n el.appendChild(header);\n el.appendChild(content);\n\n // 如果允许缩放,创建缩放手柄\n if (this.options.resizable) {\n const resizeHandle = document.createElement('div');\n resizeHandle.className = 'bim-dialog-resize-handle';\n el.appendChild(resizeHandle);\n }\n\n // ==================== 事件拦截核心逻辑 ====================\n // 定义阻断逻辑:只阻止冒泡,不阻止捕获,也不阻止默认行为(除非显式阻止)\n const stopPropagation = (e: Event) => {\n e.stopPropagation();\n };\n\n // 现代浏览器和 3D 引擎 (Three.js/Cesium) 交互事件\n const events = [\n 'click', 'dblclick', 'contextmenu', 'wheel',\n 'mousedown', 'mouseup', 'mousemove',\n 'touchstart', 'touchend', 'touchmove',\n 'pointerdown', 'pointerup', 'pointermove', 'pointerenter', 'pointerleave', 'pointerover', 'pointerout'\n ];\n\n // 绑定监听器 (默认冒泡阶段)\n // 这样内部元素(如关闭按钮)先触发,然后冒泡到这里被拦截,不再传给地图\n events.forEach(eventType => {\n el.addEventListener(eventType, stopPropagation, { passive: false });\n });\n\n return el;\n }\n\n /**\n * 设置元素尺寸\n */\n private setSize(el: HTMLElement, width?: number | string, height?: number | string) {\n if (width !== undefined) {\n if (width === 'auto' || width === 'fit-content') {\n el.style.width = width;\n } else {\n el.style.width = typeof width === 'number' ? `${width}px` : width;\n }\n }\n if (height !== undefined) {\n if (height === 'auto' || height === 'fit-content') {\n el.style.height = height;\n } else {\n el.style.height = typeof height === 'number' ? `${height}px` : height;\n }\n }\n }\n\n /**\n * 根据内容自动调整弹窗宽度\n * @param recenter 是否重新计算定位(例如保持居中),默认 true\n */\n public fitWidth(recenter: boolean = false) {\n // 1. 设置为 fit-content 以获取自然宽度,高度保持不变\n this.element.style.width = 'fit-content';\n\n // 2. 如果需要重新定位\n if (recenter) {\n this.initPosition();\n }\n }\n\n /**\n * 根据内容自动调整弹窗高度\n *\n * 设计说明:\n * - 主要用于“内容展开/收起”场景(比如测量面板展开后,Dialog 高度跟随变化)\n * - 默认不改变用户拖拽后的当前位置,只做边界夹紧,避免弹窗超出容器\n *\n * @param recenter 是否根据 options.position 重新定位(默认 false)\n */\n public fitHeight(recenter: boolean = false) {\n // 1) 先让高度由内容自然撑开,便于测量真实高度\n this.element.style.height = 'auto';\n\n // 2) 获取自然高度并做约束(最小高度 + 不超过容器)\n const naturalHeight = this.element.getBoundingClientRect().height;\n const minHeight = this.options.minHeight ?? 100;\n const containerHeight = this.container.clientHeight || 0;\n\n // 如果容器高度不可用,至少保证最小高度\n let targetHeight = Math.max(minHeight, naturalHeight);\n\n // 约束最大高度:不超过容器高度(避免完全溢出)\n if (containerHeight > 0) {\n targetHeight = Math.min(targetHeight, containerHeight);\n }\n\n this.element.style.height = `${targetHeight}px`;\n\n // 3) 定位修正:recenter 则重新按 position 计算,否则只做边界夹紧\n if (recenter) {\n this.initPosition();\n } else {\n this.clampToContainer();\n }\n }\n\n /**\n * 边界夹紧:保持当前 left/top 不变的前提下,确保弹窗不超出容器\n * 说明:用于 fitHeight / fitWidth 后的\"尺寸变化\"场景,避免弹窗被裁切。\n */\n private clampToContainer(): void {\n const containerW = this.container.clientWidth;\n const containerH = this.container.clientHeight;\n const elW = this.element.offsetWidth;\n const elH = this.element.offsetHeight;\n const bottomOffset = this.options.bottomOffset ?? 70;\n\n const currentLeft = this.element.offsetLeft;\n const currentTop = this.element.offsetTop;\n\n const maxLeft = Math.max(0, containerW - elW);\n const maxTop = Math.max(0, containerH - elH - bottomOffset);\n\n const nextLeft = Math.max(0, Math.min(currentLeft, maxLeft));\n const nextTop = Math.max(0, Math.min(currentTop, maxTop));\n\n this.element.style.left = `${nextLeft}px`;\n this.element.style.top = `${nextTop}px`;\n }\n\n /**\n * 初始化弹窗位置\n */\n private initPosition() {\n const pos = this.options.position;\n const elRect = this.element.getBoundingClientRect();\n const bottomOffset = this.options.bottomOffset ?? 70;\n\n let left = 0;\n let top = 0;\n\n const pW = this.container.clientWidth;\n const pH = this.container.clientHeight;\n const elW = elRect.width;\n const elH = elRect.height;\n\n if (typeof pos === 'object' && 'x' in pos) {\n left = pos.x;\n top = pos.y;\n } else {\n switch (pos) {\n case 'center':\n left = (pW - elW) / 2;\n top = (pH - elH) / 2;\n break;\n case 'top-left': left = 0; top = 0; break;\n case 'top-center': left = (pW - elW) / 2; top = 0; break;\n case 'top-right': left = pW - elW; top = 0; break;\n case 'left-center': left = 0; top = (pH - elH) / 2; break;\n case 'right-center': left = pW - elW; top = (pH - elH) / 2; break;\n case 'bottom-left': left = 0; top = pH - elH - bottomOffset; break;\n case 'bottom-center': left = (pW - elW) / 2; top = pH - elH - bottomOffset; break;\n case 'bottom-right': left = pW - elW; top = pH - elH - bottomOffset; break;\n default:\n left = (pW - elW) / 2;\n top = (pH - elH) / 2;\n }\n }\n\n left = Math.max(0, Math.min(left, pW - elW));\n top = Math.max(0, Math.min(top, pH - elH - bottomOffset));\n\n this.element.style.left = `${left}px`;\n this.element.style.top = `${top}px`;\n }\n\n /**\n * 初始化拖拽功能 (性能优化 + 解决粘手)\n */\n private initDrag() {\n let startX = 0;\n let startY = 0;\n let startLeft = 0;\n let startTop = 0;\n let containerW = 0;\n let containerH = 0;\n let elW = 0;\n let elH = 0;\n let bottomOffset = 0;\n\n const onMouseDown = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n startX = e.clientX;\n startY = e.clientY;\n startLeft = this.element.offsetLeft;\n startTop = this.element.offsetTop;\n\n containerW = this.container.clientWidth;\n containerH = this.container.clientHeight;\n elW = this.element.offsetWidth;\n elH = this.element.offsetHeight;\n bottomOffset = this.options.bottomOffset ?? 70;\n\n document.addEventListener('mousemove', onMouseMove, { capture: true });\n document.addEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n const onMouseMove = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.rafId) return;\n\n this.rafId = requestAnimationFrame(() => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n\n let newLeft = startLeft + dx;\n let newTop = startTop + dy;\n\n const maxLeft = containerW - elW;\n const maxTop = containerH - elH - bottomOffset;\n\n newLeft = Math.max(0, Math.min(newLeft, maxLeft));\n newTop = Math.max(0, Math.min(newTop, maxTop));\n\n this.element.style.left = `${newLeft}px`;\n this.element.style.top = `${newTop}px`;\n\n this.rafId = null;\n });\n };\n\n const onMouseUp = () => {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n // 移除监听\n document.removeEventListener('mousemove', onMouseMove, { capture: true });\n document.removeEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n this.header.addEventListener('mousedown', onMouseDown);\n }\n\n /**\n * 初始化缩放功能 (性能优化 + 解决粘手)\n */\n private initResize() {\n const handle = this.element.querySelector('.bim-dialog-resize-handle') as HTMLElement;\n if (!handle) return;\n\n let startX = 0;\n let startY = 0;\n let startW = 0;\n let startH = 0;\n\n const onMouseDown = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n startX = e.clientX;\n startY = e.clientY;\n startW = this.element.offsetWidth;\n startH = this.element.offsetHeight;\n\n // 关键:使用 capture: true\n document.addEventListener('mousemove', onMouseMove, { capture: true });\n document.addEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n const onMouseMove = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.rafId) return;\n\n this.rafId = requestAnimationFrame(() => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n\n const newW = Math.max(this.options.minWidth || 100, startW + dx);\n const newH = Math.max(this.options.minHeight || 50, startH + dy);\n\n this.element.style.width = `${newW}px`;\n this.element.style.height = `${newH}px`;\n\n this.rafId = null;\n });\n };\n\n const onMouseUp = () => {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n document.removeEventListener('mousemove', onMouseMove, { capture: true });\n document.removeEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n handle.addEventListener('mousedown', onMouseDown);\n }\n\n /**\n * 动态设置内容\n * @param content 内容元素或 HTML 字符串\n */\n public setContent(content: HTMLElement | string) {\n this.contentArea.innerHTML = '';\n if (typeof content === 'string') {\n this.contentArea.innerHTML = content;\n } else {\n this.contentArea.appendChild(content);\n }\n }\n\n /**\n * 关闭弹窗并销毁\n */\n public close() {\n if (this._isDestroyed) return;\n\n // 清理可能存在的动画帧,防止报错\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n this.element.remove();\n this._isDestroyed = true;\n if (this.options.onClose) {\n this.options.onClose();\n }\n }\n\n /**\n * 销毁组件 (接口实现)\n */\n public destroy() {\n this.close();\n }\n}\n","import { BimDialog } from '../components/dialog';\nimport type { DialogOptions } from '../components/dialog/index.type';\nimport type { ThemeConfig } from '../themes/types';\nimport { themeManager } from '../services/theme';\nimport { BaseManager } from '../core/base-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\n\nexport class DialogManager extends BaseManager {\n private container: HTMLElement;\n private activeDialogs: BimDialog[] = [];\n\n constructor(container: HTMLElement, registry: ManagerRegistry) {\n super(registry);\n this.container = container;\n }\n\n public create(options: Omit): BimDialog {\n const dialog = new BimDialog({\n container: this.container,\n ...options,\n onClose: () => {\n this.activeDialogs = this.activeDialogs.filter(d => d !== dialog);\n if (options.onClose) options.onClose();\n }\n });\n\n dialog.setTheme(themeManager.getTheme());\n this.activeDialogs.push(dialog);\n return dialog;\n }\n\n public updateTheme(theme: ThemeConfig) {\n this.activeDialogs.forEach(dialog => {\n if (dialog.setTheme) {\n dialog.setTheme(theme);\n }\n });\n }\n\n public destroy() {\n this.activeDialogs.forEach(d => d.destroy());\n this.activeDialogs = [];\n super.destroy();\n }\n}\n","/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '181';\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsMouse}\n * @constant\n */\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\n\n/**\n * Represents touch interaction types in context of controls.\n *\n * @type {ConstantsTouch}\n * @constant\n */\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\n\n/**\n * Disables face culling.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceNone = 0;\n\n/**\n * Culls back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceBack = 1;\n\n/**\n * Culls front faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFront = 2;\n\n/**\n * Culls both front and back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFrontBack = 3;\n\n/**\n * Gives unfiltered shadow maps - fastest, but lowest quality.\n *\n * @type {number}\n * @constant\n */\nconst BasicShadowMap = 0;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm.\n *\n * @type {number}\n * @constant\n */\nconst PCFShadowMap = 1;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm with\n * better soft shadows especially when using low-resolution shadow maps.\n *\n * @type {number}\n * @constant\n */\nconst PCFSoftShadowMap = 2;\n\n/**\n * Filters shadow maps using the Variance Shadow Map (VSM) algorithm.\n * When using VSMShadowMap all shadow receivers will also cast shadows.\n *\n * @type {number}\n * @constant\n */\nconst VSMShadowMap = 3;\n\n/**\n * Only front faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst FrontSide = 0;\n\n/**\n * Only back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst BackSide = 1;\n\n/**\n * Both front and back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst DoubleSide = 2;\n\n/**\n * No blending is performed which effectively disables\n * alpha transparency.\n *\n * @type {number}\n * @constant\n */\nconst NoBlending = 0;\n\n/**\n * The default blending.\n *\n * @type {number}\n * @constant\n */\nconst NormalBlending = 1;\n\n/**\n * Represents additive blending.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveBlending = 2;\n\n/**\n * Represents subtractive blending.\n *\n * @type {number}\n * @constant\n */\nconst SubtractiveBlending = 3;\n\n/**\n * Represents multiply blending.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyBlending = 4;\n\n/**\n * Represents custom blending.\n *\n * @type {number}\n * @constant\n */\nconst CustomBlending = 5;\n\n/**\n * A `source + destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst AddEquation = 100;\n\n/**\n * A `source - destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst SubtractEquation = 101;\n\n/**\n * A `destination - source` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst ReverseSubtractEquation = 102;\n\n/**\n * A blend equation that uses the minimum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MinEquation = 103;\n\n/**\n * A blend equation that uses the maximum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MaxEquation = 104;\n\n/**\n * Multiplies all colors by `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroFactor = 200;\n\n/**\n * Multiplies all colors by `1`.\n *\n * @type {number}\n * @constant\n */\nconst OneFactor = 201;\n\n/**\n * Multiplies all colors by the source colors.\n *\n * @type {number}\n * @constant\n */\nconst SrcColorFactor = 202;\n\n/**\n * Multiplies all colors by `1` minus each source color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcColorFactor = 203;\n\n/**\n * Multiplies all colors by the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaFactor = 204;\n\n/**\n * Multiplies all colors by 1 minus the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcAlphaFactor = 205;\n\n/**\n * Multiplies all colors by the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst DstAlphaFactor = 206;\n\n/**\n * Multiplies all colors by `1` minus the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstAlphaFactor = 207;\n\n/**\n * Multiplies all colors by the destination color.\n *\n * @type {number}\n * @constant\n */\nconst DstColorFactor = 208;\n\n/**\n * Multiplies all colors by `1` minus each destination color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstColorFactor = 209;\n\n/**\n * Multiplies the RGB colors by the smaller of either the source alpha\n * value or the value of `1` minus the destination alpha value. The alpha\n * value is multiplied by `1`.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaSaturateFactor = 210;\n\n/**\n * Multiplies all colors by a constant color.\n *\n * @type {number}\n * @constant\n */\nconst ConstantColorFactor = 211;\n\n/**\n * Multiplies all colors by `1` minus a constant color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantColorFactor = 212;\n\n/**\n * Multiplies all colors by a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst ConstantAlphaFactor = 213;\n\n/**\n * Multiplies all colors by 1 minus a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantAlphaFactor = 214;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverDepth = 0;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysDepth = 1;\n\n/**\n * Pass if the incoming value is less than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessDepth = 2;\n\n/**\n * Pass if the incoming value is less than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualDepth = 3;\n\n/**\n * Pass if the incoming value equals the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst EqualDepth = 4;\n\n/**\n * Pass if the incoming value is greater than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualDepth = 5;\n\n/**\n * Pass if the incoming value is greater than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterDepth = 6;\n\n/**\n * Pass if the incoming value is not equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualDepth = 7;\n\n/**\n * Multiplies the environment map color with the surface color.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyOperation = 0;\n\n/**\n * Uses reflectivity to blend between the two colors.\n *\n * @type {number}\n * @constant\n */\nconst MixOperation = 1;\n\n/**\n * Adds the two colors.\n *\n * @type {number}\n * @constant\n */\nconst AddOperation = 2;\n\n/**\n * No tone mapping is applied.\n *\n * @type {number}\n * @constant\n */\nconst NoToneMapping = 0;\n\n/**\n * Linear tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearToneMapping = 1;\n\n/**\n * Reinhard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ReinhardToneMapping = 2;\n\n/**\n * Cineon tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst CineonToneMapping = 3;\n\n/**\n * ACES Filmic tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ACESFilmicToneMapping = 4;\n\n/**\n * Custom tone mapping.\n *\n * Expects a custom implementation by modifying shader code of the material's fragment shader.\n *\n * @type {number}\n * @constant\n */\nconst CustomToneMapping = 5;\n\n/**\n * AgX tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst AgXToneMapping = 6;\n\n/**\n * Neutral tone mapping.\n *\n * Implementation based on the Khronos 3D Commerce Group standard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst NeutralToneMapping = 7;\n\n/**\n * The skinned mesh shares the same world space as the skeleton.\n *\n * @type {string}\n * @constant\n */\nconst AttachedBindMode = 'attached';\n\n/**\n * The skinned mesh does not share the same world space as the skeleton.\n * This is useful when a skeleton is shared across multiple skinned meshes.\n *\n * @type {string}\n * @constant\n */\nconst DetachedBindMode = 'detached';\n\n/**\n * Maps textures using the geometry's UV coordinates.\n *\n * @type {number}\n * @constant\n */\nconst UVMapping = 300;\n\n/**\n * Reflection mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeReflectionMapping = 301;\n\n/**\n * Refraction mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeRefractionMapping = 302;\n\n/**\n * Reflection mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularReflectionMapping = 303;\n\n/**\n * Refraction mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularRefractionMapping = 304;\n\n/**\n * Reflection mapping for PMREM textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeUVReflectionMapping = 306;\n\n/**\n * The texture will simply repeat to infinity.\n *\n * @type {number}\n * @constant\n */\nconst RepeatWrapping = 1000;\n\n/**\n * The last pixel of the texture stretches to the edge of the mesh.\n *\n * @type {number}\n * @constant\n */\nconst ClampToEdgeWrapping = 1001;\n\n/**\n * The texture will repeats to infinity, mirroring on each repeat.\n *\n * @type {number}\n * @constant\n */\nconst MirroredRepeatWrapping = 1002;\n\n/**\n * Returns the value of the texture element that is nearest (in Manhattan distance)\n * to the specified texture coordinates.\n *\n * @type {number}\n * @constant\n */\nconst NearestFilter = 1003;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured\n * and uses the `NearestFilter` criterion (the texel nearest to the center of the pixel)\n * to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and\n * uses the `NearestFilter` criterion to produce a texture value from each mipmap.\n * The final texture value is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005; // legacy\n\n/**\n * Returns the weighted average of the four texture elements that are closest to the specified\n * texture coordinates, and can include items wrapped or repeated from other parts of a texture,\n * depending on the values of `wrapS` and `wrapT`, and on the exact mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearFilter = 1006;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured and uses\n * the `LinearFilter` criterion (a weighted average of the four texels that are closest to the\n * center of the pixel) to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and uses\n * the `LinearFilter` criterion to produce a texture value from each mipmap. The final texture value\n * is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008; // legacy\n\n/**\n * An unsigned byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedByteType = 1009;\n\n/**\n * A byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ByteType = 1010;\n\n/**\n * A short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ShortType = 1011;\n\n/**\n * An unsigned short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShortType = 1012;\n\n/**\n * An int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst IntType = 1013;\n\n/**\n * An unsigned int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedIntType = 1014;\n\n/**\n * A float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst FloatType = 1015;\n\n/**\n * A half float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst HalfFloatType = 1016;\n\n/**\n * An unsigned short 4_4_4_4 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort4444Type = 1017;\n\n/**\n * An unsigned short 5_5_5_1 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort5551Type = 1018;\n\n/**\n * An unsigned int 24_8 data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt248Type = 1020;\n\n/**\n * An unsigned int 5_9_9_9 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt5999Type = 35902;\n\n/**\n * An unsigned int 10_11_11 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt101111Type = 35899;\n\n/**\n * Discards the red, green and blue components and reads just the alpha component.\n *\n * @type {number}\n * @constant\n */\nconst AlphaFormat = 1021;\n\n/**\n * Discards the alpha component and reads the red, green and blue component.\n *\n * @type {number}\n * @constant\n */\nconst RGBFormat = 1022;\n\n/**\n * Reads the red, green, blue and alpha components.\n *\n * @type {number}\n * @constant\n */\nconst RGBAFormat = 1023;\n\n/**\n * Reads each element as a single depth value, converts it to floating point, and clamps to the range `[0,1]`.\n *\n * @type {number}\n * @constant\n */\nconst DepthFormat = 1026;\n\n/**\n * Reads each element is a pair of depth and stencil values. The depth component of the pair is interpreted as\n * in `DepthFormat`. The stencil component is interpreted based on the depth + stencil internal format.\n *\n * @type {number}\n * @constant\n */\nconst DepthStencilFormat = 1027;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component.\n *\n * @type {number}\n * @constant\n */\nconst RedFormat = 1028;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RedIntegerFormat = 1029;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components.\n *\n * @type {number}\n * @constant\n */\nconst RGFormat = 1030;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGIntegerFormat = 1031;\n\n/**\n * Discards the alpha component and reads the red, green and blue component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBIntegerFormat = 1032;\n\n/**\n * Reads the red, green, blue and alpha components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBAIntegerFormat = 1033;\n\n/**\n * A DXT1-compressed image in an RGB image format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_S3TC_DXT1_Format = 33776;\n\n/**\n * A DXT1-compressed image in an RGB image format with a simple on/off alpha value.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT1_Format = 33777;\n\n/**\n * A DXT3-compressed image in an RGBA image format. Compared to a 32-bit RGBA texture, it offers 4:1 compression.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT3_Format = 33778;\n\n/**\n * A DXT5-compressed image in an RGBA image format. It also provides a 4:1 compression, but differs to the DXT3\n * compression in how the alpha compression is done.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT5_Format = 33779;\n\n/**\n * PVRTC RGB compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_4BPPV1_Format = 35840;\n\n/**\n * PVRTC RGB compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_2BPPV1_Format = 35841;\n\n/**\n * PVRTC RGBA compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\n\n/**\n * PVRTC RGBA compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\n\n/**\n * ETC1 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC1_Format = 36196;\n\n/**\n * ETC2 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC2_Format = 37492;\n\n/**\n * ETC2 RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ETC2_EAC_Format = 37496;\n\n/**\n * ASTC RGBA 4x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_4x4_Format = 37808;\n\n/**\n * ASTC RGBA 5x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x4_Format = 37809;\n\n/**\n * ASTC RGBA 5x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x5_Format = 37810;\n\n/**\n * ASTC RGBA 6x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x5_Format = 37811;\n\n/**\n * ASTC RGBA 6x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x6_Format = 37812;\n\n/**\n * ASTC RGBA 8x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x5_Format = 37813;\n\n/**\n * ASTC RGBA 8x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x6_Format = 37814;\n\n/**\n * ASTC RGBA 8x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x8_Format = 37815;\n\n/**\n * ASTC RGBA 10x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x5_Format = 37816;\n\n/**\n * ASTC RGBA 10x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x6_Format = 37817;\n\n/**\n * ASTC RGBA 10x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x8_Format = 37818;\n\n/**\n * ASTC RGBA 10x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x10_Format = 37819;\n\n/**\n * ASTC RGBA 12x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x10_Format = 37820;\n\n/**\n * ASTC RGBA 12x12 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x12_Format = 37821;\n\n/**\n * BPTC RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_BPTC_Format = 36492;\n\n/**\n * BPTC Signed RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_SIGNED_Format = 36494;\n\n/**\n * BPTC Unsigned RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_UNSIGNED_Format = 36495;\n\n/**\n * RGTC1 Red format.\n *\n * @type {number}\n * @constant\n */\nconst RED_RGTC1_Format = 36283;\n\n/**\n * RGTC1 Signed Red format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_RGTC1_Format = 36284;\n\n/**\n * RGTC2 Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst RED_GREEN_RGTC2_Format = 36285;\n\n/**\n * RGTC2 Signed Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_GREEN_RGTC2_Format = 36286;\n\n/**\n * Animations are played once.\n *\n * @type {number}\n * @constant\n */\nconst LoopOnce = 2200;\n\n/**\n * Animations are played with a chosen number of repetitions, each time jumping from\n * the end of the clip directly to its beginning.\n *\n * @type {number}\n * @constant\n */\nconst LoopRepeat = 2201;\n\n/**\n * Animations are played with a chosen number of repetitions, alternately playing forward\n * and backward.\n *\n * @type {number}\n * @constant\n */\nconst LoopPingPong = 2202;\n\n/**\n * Discrete interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateDiscrete = 2300;\n\n/**\n * Linear interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateLinear = 2301;\n\n/**\n * Smooth interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateSmooth = 2302;\n\n/**\n * Zero curvature ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroCurvatureEnding = 2400;\n\n/**\n * Zero slope ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroSlopeEnding = 2401;\n\n/**\n * Wrap around ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst WrapAroundEnding = 2402;\n\n/**\n * Default animation blend mode.\n *\n * @type {number}\n * @constant\n */\nconst NormalAnimationBlendMode = 2500;\n\n/**\n * Additive animation blend mode. Can be used to layer motions on top of\n * each other to build complex performances from smaller re-usable assets.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveAnimationBlendMode = 2501;\n\n/**\n * For every three vertices draw a single triangle.\n *\n * @type {number}\n * @constant\n */\nconst TrianglesDrawMode = 0;\n\n/**\n * For each vertex draw a triangle from the last three vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleStripDrawMode = 1;\n\n/**\n * For each vertex draw a triangle from the first vertex and the last two vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleFanDrawMode = 2;\n\n/**\n * Basic depth packing.\n *\n * @type {number}\n * @constant\n */\nconst BasicDepthPacking = 3200;\n\n/**\n * A depth value is packed into 32 bit RGBA.\n *\n * @type {number}\n * @constant\n */\nconst RGBADepthPacking = 3201;\n\n/**\n * A depth value is packed into 24 bit RGB.\n *\n * @type {number}\n * @constant\n */\nconst RGBDepthPacking = 3202;\n\n/**\n * A depth value is packed into 16 bit RG.\n *\n * @type {number}\n * @constant\n */\nconst RGDepthPacking = 3203;\n\n/**\n * Normal information is relative to the underlying surface.\n *\n * @type {number}\n * @constant\n */\nconst TangentSpaceNormalMap = 0;\n\n/**\n * Normal information is relative to the object orientation.\n *\n * @type {number}\n * @constant\n */\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\n\n/**\n * No color space.\n *\n * @type {string}\n * @constant\n */\nconst NoColorSpace = '';\n\n/**\n * sRGB color space.\n *\n * @type {string}\n * @constant\n */\nconst SRGBColorSpace = 'srgb';\n\n/**\n * sRGB-linear color space.\n *\n * @type {string}\n * @constant\n */\nconst LinearSRGBColorSpace = 'srgb-linear';\n\n/**\n * Linear transfer function.\n *\n * @type {string}\n * @constant\n */\nconst LinearTransfer = 'linear';\n\n/**\n * sRGB transfer function.\n *\n * @type {string}\n * @constant\n */\nconst SRGBTransfer = 'srgb';\n\n/**\n * Sets the stencil buffer value to `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroStencilOp = 0;\n\n/**\n * Keeps the current value.\n *\n * @type {number}\n * @constant\n */\nconst KeepStencilOp = 7680;\n\n/**\n * Sets the stencil buffer value to the specified reference value.\n *\n * @type {number}\n * @constant\n */\nconst ReplaceStencilOp = 7681;\n\n/**\n * Increments the current stencil buffer value. Clamps to the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementStencilOp = 7682;\n\n/**\n * Decrements the current stencil buffer value. Clamps to `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementStencilOp = 7683;\n\n/**\n * Increments the current stencil buffer value. Wraps stencil buffer value to zero when incrementing\n * the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementWrapStencilOp = 34055;\n\n/**\n * Decrements the current stencil buffer value. Wraps stencil buffer value to the maximum representable\n * unsigned value when decrementing a stencil buffer value of `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementWrapStencilOp = 34056;\n\n/**\n * Inverts the current stencil buffer value bitwise.\n *\n * @type {number}\n * @constant\n */\nconst InvertStencilOp = 5386;\n\n/**\n * Will never return true.\n *\n * @type {number}\n * @constant\n */\nconst NeverStencilFunc = 512;\n\n/**\n * Will return true if the stencil reference value is less than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessStencilFunc = 513;\n\n/**\n * Will return true if the stencil reference value is equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst EqualStencilFunc = 514;\n\n/**\n * Will return true if the stencil reference value is less than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualStencilFunc = 515;\n\n/**\n * Will return true if the stencil reference value is greater than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterStencilFunc = 516;\n\n/**\n * Will return true if the stencil reference value is not equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualStencilFunc = 517;\n\n/**\n * Will return true if the stencil reference value is greater than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualStencilFunc = 518;\n\n/**\n * Will always return true.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysStencilFunc = 519;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverCompare = 512;\n\n/**\n * Pass if the incoming value is less than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessCompare = 513;\n\n/**\n * Pass if the incoming value equals the texture value.\n *\n * @type {number}\n * @constant\n */\nconst EqualCompare = 514;\n\n/**\n * Pass if the incoming value is less than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualCompare = 515;\n\n/**\n * Pass if the incoming value is greater than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterCompare = 516;\n\n/**\n * Pass if the incoming value is not equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualCompare = 517;\n\n/**\n * Pass if the incoming value is greater than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualCompare = 518;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysCompare = 519;\n\n/**\n * The contents are intended to be specified once by the application, and used many\n * times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticDrawUsage = 35044;\n\n/**\n * The contents are intended to be respecified repeatedly by the application, and\n * used many times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicDrawUsage = 35048;\n\n/**\n * The contents are intended to be specified once by the application, and used at most\n * a few times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamDrawUsage = 35040;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst StaticReadUsage = 35045;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst DynamicReadUsage = 35049;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried at most\n * a few times by the application\n *\n * @type {number}\n * @constant\n */\nconst StreamReadUsage = 35041;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used many times as\n * the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticCopyUsage = 35046;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and used many times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicCopyUsage = 35050;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used at most a few times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamCopyUsage = 35042;\n\n/**\n * GLSL 1 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL1 = '100';\n\n/**\n * GLSL 3 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL3 = '300 es';\n\n/**\n * WebGL coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGLCoordinateSystem = 2000;\n\n/**\n * WebGPU coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGPUCoordinateSystem = 2001;\n\n/**\n * Represents the different timestamp query types.\n *\n * @type {ConstantsTimestampQuery}\n * @constant\n */\nconst TimestampQuery = {\n\tCOMPUTE: 'compute',\n\tRENDER: 'render'\n};\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsInterpolationSamplingType}\n * @constant\n */\nconst InterpolationSamplingType = {\n\tPERSPECTIVE: 'perspective',\n\tLINEAR: 'linear',\n\tFLAT: 'flat'\n};\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @type {ConstantsInterpolationSamplingMode}\n * @constant\n */\nconst InterpolationSamplingMode = {\n\tNORMAL: 'normal',\n\tCENTROID: 'centroid',\n\tSAMPLE: 'sample',\n\tFIRST: 'first',\n\tEITHER: 'either'\n};\n\n/**\n * This type represents mouse buttons and interaction types in context of controls.\n *\n * @typedef {Object} ConstantsMouse\n * @property {number} MIDDLE - The left mouse button.\n * @property {number} LEFT - The middle mouse button.\n * @property {number} RIGHT - The right mouse button.\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} DOLLY - A dolly interaction.\n * @property {number} PAN - A pan interaction.\n **/\n\n/**\n * This type represents touch interaction types in context of controls.\n *\n * @typedef {Object} ConstantsTouch\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} PAN - A pan interaction.\n * @property {number} DOLLY_PAN - The dolly-pan interaction.\n * @property {number} DOLLY_ROTATE - A dolly-rotate interaction.\n **/\n\n/**\n * This type represents the different timestamp query types.\n *\n * @typedef {Object} ConstantsTimestampQuery\n * @property {string} COMPUTE - A `compute` timestamp query.\n * @property {string} RENDER - A `render` timestamp query.\n **/\n\n/**\n * Represents the different interpolation sampling types.\n *\n * @typedef {Object} ConstantsInterpolationSamplingType\n * @property {string} PERSPECTIVE - Perspective-correct interpolation.\n * @property {string} LINEAR - Linear interpolation.\n * @property {string} FLAT - Flat interpolation.\n */\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @typedef {Object} ConstantsInterpolationSamplingMode\n * @property {string} NORMAL - Normal sampling mode.\n * @property {string} CENTROID - Centroid sampling mode.\n * @property {string} SAMPLE - Sample-specific sampling mode.\n * @property {string} FIRST - Flat interpolation using the first vertex.\n * @property {string} EITHER - Flat interpolation using either vertex.\n */\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nconst _cache = {};\n\nlet _setConsoleFunction = null;\n\nfunction setConsoleFunction( fn ) {\n\n\t_setConsoleFunction = fn;\n\n}\n\nfunction getConsoleFunction() {\n\n\treturn _setConsoleFunction;\n\n}\n\nfunction log( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'log', message, ...params );\n\n\t} else {\n\n\t\tconsole.log( message, ...params );\n\n\t}\n\n}\n\nfunction warn( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'warn', message, ...params );\n\n\t} else {\n\n\t\tconsole.warn( message, ...params );\n\n\t}\n\n}\n\nfunction error( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'error', message, ...params );\n\n\t} else {\n\n\t\tconsole.error( message, ...params );\n\n\t}\n\n}\n\nfunction warnOnce( ...params ) {\n\n\tconst message = params.join( ' ' );\n\n\tif ( message in _cache ) return;\n\n\t_cache[ message ] = true;\n\n\twarn( ...params );\n\n}\n\nfunction probeAsync( gl, sync, interval ) {\n\n\treturn new Promise( function ( resolve, reject ) {\n\n\t\tfunction probe() {\n\n\t\t\tswitch ( gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 ) ) {\n\n\t\t\t\tcase gl.WAIT_FAILED:\n\t\t\t\t\treject();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase gl.TIMEOUT_EXPIRED:\n\t\t\t\t\tsetTimeout( probe, interval );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tresolve();\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetTimeout( probe, interval );\n\n\t} );\n\n}\n\n/**\n * This modules allows to dispatch event objects on custom JavaScript objects.\n *\n * Main repository: [eventdispatcher.js](https://github.com/mrdoob/eventdispatcher.js/)\n *\n * Code Example:\n * ```js\n * class Car extends EventDispatcher {\n * \tstart() {\n *\t\tthis.dispatchEvent( { type: 'start', message: 'vroom vroom!' } );\n *\t}\n *};\n *\n * // Using events with the custom object\n * const car = new Car();\n * car.addEventListener( 'start', function ( event ) {\n * \talert( event.message );\n * } );\n *\n * car.start();\n * ```\n */\nclass EventDispatcher {\n\n\t/**\n\t * Adds the given event listener to the given event type.\n\t *\n\t * @param {string} type - The type of event to listen to.\n\t * @param {Function} listener - The function that gets called when the event is fired.\n\t */\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === -1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the given event listener has been added to the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to check.\n\t * @return {boolean} Whether the given event listener has been added to the given event type.\n\t */\n\thasEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return false;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== -1;\n\n\t}\n\n\t/**\n\t * Removes the given event listener from the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to remove.\n\t */\n\tremoveEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispatches an event object.\n\t *\n\t * @param {Object} event - The event that gets fired.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n/**\n * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n * (universally unique identifier).\n *\n * @return {string} The UUID.\n */\nfunction generateUUID() {\n\n\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\n/**\n * Clamps the given value between min and max.\n *\n * @param {number} value - The value to clamp.\n * @param {number} min - The min value.\n * @param {number} max - The max value.\n * @return {number} The clamped value.\n */\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n/**\n * Computes the Euclidean modulo of the given parameters that\n * is `( ( n % m ) + m ) % m`.\n *\n * @param {number} n - The first parameter.\n * @param {number} m - The second parameter.\n * @return {number} The Euclidean modulo.\n */\nfunction euclideanModulo( n, m ) {\n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n/**\n * Performs a linear mapping from range `` to range ``\n * for the given value.\n *\n * @param {number} x - The value to be mapped.\n * @param {number} a1 - Minimum value for range A.\n * @param {number} a2 - Maximum value for range A.\n * @param {number} b1 - Minimum value for range B.\n * @param {number} b2 - Maximum value for range B.\n * @return {number} The mapped value.\n */\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n/**\n * Returns the percentage in the closed interval `[0, 1]` of the given value\n * between the start and end point.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} value - A value between start and end.\n * @return {number} The interpolation factor.\n */\nfunction inverseLerp( x, y, value ) {\n\n\t// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n/**\n * Returns a value linearly interpolated from two known points based on the given interval -\n * `t = 0` will return `x` and `t = 1` will return `y`.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n * @return {number} The interpolated value.\n */\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n/**\n * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta\n * time to maintain frame rate independent movement. For details, see\n * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n *\n * @param {number} x - The current point.\n * @param {number} y - The target point.\n * @param {number} lambda - A higher lambda value will make the movement more sudden,\n * and a lower value will make the movement more gradual.\n * @param {number} dt - Delta time in seconds.\n * @return {number} The interpolated value.\n */\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n/**\n * Returns a value that alternates between `0` and the given `length` parameter.\n *\n * @param {number} x - The value to pingpong.\n * @param {number} [length=1] - The positive value the function will pingpong to.\n * @return {number} The alternated value.\n */\nfunction pingpong( x, length = 1 ) {\n\n\t// https://www.desmos.com/calculator/vcsjnyz7x4\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n/**\n * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n * the `min` and `max`.\n *\n * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\n/**\n * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n/**\n * Returns a random integer from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random integer.\n */\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n/**\n * Returns a random float from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random float.\n */\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n/**\n * Returns a random integer from `<-range/2, range/2>` interval.\n *\n * @param {number} range - Defines the value range.\n * @return {number} A random float.\n */\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n/**\n * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n *\n * @param {number} [s] - The integer seed.\n * @return {number} A random float.\n */\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param {number} degrees - A value in degrees.\n * @return {number} The converted value in radians.\n */\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\n/**\n * Converts radians to degrees.\n *\n * @param {number} radians - A value in radians.\n * @return {number} The converted value in degrees.\n */\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\n/**\n * Returns `true` if the given number is a power of two.\n *\n * @param {number} value - The value to check.\n * @return {boolean} Whether the given number is a power of two or not.\n */\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\n/**\n * Returns the smallest power of two that is greater than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The smallest power of two that is greater than or equal to the given number.\n */\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Returns the largest power of two that is less than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The largest power of two that is less than or equal to the given number.\n */\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n * defined by the given angles and order.\n *\n * Rotations are applied to the axes in the order specified by order:\n * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n *\n * @param {Quaternion} q - The quaternion to set.\n * @param {number} a - The rotation applied to the first axis, in radians.\n * @param {number} b - The rotation applied to the second axis, in radians.\n * @param {number} c - The rotation applied to the third axis, in radians.\n * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n */\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n/**\n * Denormalizes the given value according to the given typed array.\n *\n * @param {number} value - The value to denormalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The denormalize (float) value in the range `[0,1]`.\n */\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, -1 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, -1 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, -1 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * Normalizes the given value according to the given typed array.\n *\n * @param {number} value - The float value in the range `[0,1]` to normalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The normalize value.\n */\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A collection of math utility functions.\n * @hideconstructor\n */\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\t/**\n\t * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n\t * (universally unique identifier).\n\t *\n\t * @static\n\t * @method\n\t * @return {string} The UUID.\n\t */\n\tgenerateUUID: generateUUID,\n\t/**\n\t * Clamps the given value between min and max.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to clamp.\n\t * @param {number} min - The min value.\n\t * @param {number} max - The max value.\n\t * @return {number} The clamped value.\n\t */\n\tclamp: clamp,\n\t/**\n\t * Computes the Euclidean modulo of the given parameters that\n\t * is `( ( n % m ) + m ) % m`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} n - The first parameter.\n\t * @param {number} m - The second parameter.\n\t * @return {number} The Euclidean modulo.\n\t */\n\teuclideanModulo: euclideanModulo,\n\t/**\n\t * Performs a linear mapping from range `` to range ``\n\t * for the given value.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to be mapped.\n\t * @param {number} a1 - Minimum value for range A.\n\t * @param {number} a2 - Maximum value for range A.\n\t * @param {number} b1 - Minimum value for range B.\n\t * @param {number} b2 - Maximum value for range B.\n\t * @return {number} The mapped value.\n\t */\n\tmapLinear: mapLinear,\n\t/**\n\t * Returns the percentage in the closed interval `[0, 1]` of the given value\n\t * between the start and end point.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} value - A value between start and end.\n\t * @return {number} The interpolation factor.\n\t */\n\tinverseLerp: inverseLerp,\n\t/**\n\t * Returns a value linearly interpolated from two known points based on the given interval -\n\t * `t = 0` will return `x` and `t = 1` will return `y`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {number} The interpolated value.\n\t */\n\tlerp: lerp,\n\t/**\n\t * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta\n\t * time to maintain frame rate independent movement. For details, see\n\t * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The current point.\n\t * @param {number} y - The target point.\n\t * @param {number} lambda - A higher lambda value will make the movement more sudden,\n\t * and a lower value will make the movement more gradual.\n\t * @param {number} dt - Delta time in seconds.\n\t * @return {number} The interpolated value.\n\t */\n\tdamp: damp,\n\t/**\n\t * Returns a value that alternates between `0` and the given `length` parameter.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to pingpong.\n\t * @param {number} [length=1] - The positive value the function will pingpong to.\n\t * @return {number} The alternated value.\n\t */\n\tpingpong: pingpong,\n\t/**\n\t * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n\t * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n\t * the `min` and `max`.\n\t *\n\t * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmoothstep: smoothstep,\n\t/**\n\t * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n\t * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmootherstep: smootherstep,\n\t/**\n\t * Returns a random integer from `` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random integer.\n\t */\n\trandInt: randInt,\n\t/**\n\t * Returns a random float from `` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random float.\n\t */\n\trandFloat: randFloat,\n\t/**\n\t * Returns a random integer from `<-range/2, range/2>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} range - Defines the value range.\n\t * @return {number} A random float.\n\t */\n\trandFloatSpread: randFloatSpread,\n\t/**\n\t * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} [s] - The integer seed.\n\t * @return {number} A random float.\n\t */\n\tseededRandom: seededRandom,\n\t/**\n\t * Converts degrees to radians.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} degrees - A value in degrees.\n\t * @return {number} The converted value in radians.\n\t */\n\tdegToRad: degToRad,\n\t/**\n\t * Converts radians to degrees.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} radians - A value in radians.\n\t * @return {number} The converted value in degrees.\n\t */\n\tradToDeg: radToDeg,\n\t/**\n\t * Returns `true` if the given number is a power of two.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to check.\n\t * @return {boolean} Whether the given number is a power of two or not.\n\t */\n\tisPowerOfTwo: isPowerOfTwo,\n\t/**\n\t * Returns the smallest power of two that is greater than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The smallest power of two that is greater than or equal to the given number.\n\t */\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\t/**\n\t * Returns the largest power of two that is less than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The largest power of two that is less than or equal to the given number.\n\t */\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\t/**\n\t * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n\t * defined by the given angles and order.\n\t *\n\t * Rotations are applied to the axes in the order specified by order:\n\t * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n\t *\n\t * @static\n\t * @method\n\t * @param {Quaternion} q - The quaternion to set.\n\t * @param {number} a - The rotation applied to the first axis, in radians.\n\t * @param {number} b - The rotation applied to the second axis, in radians.\n\t * @param {number} c - The rotation applied to the third axis, in radians.\n\t * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n\t */\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\t/**\n\t * Normalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The float value in the range `[0,1]` to normalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The normalize value.\n\t */\n\tnormalize: normalize,\n\t/**\n\t * Denormalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to denormalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The denormalize (float) value in the range `[0,1]`.\n\t */\n\tdenormalize: denormalize\n};\n\n/**\n * Class representing a 2D vector. A 2D vector is an ordered pair of numbers\n * (labeled x and y), which can be used to represent a number of things, such as:\n *\n * - A point in 2D space (i.e. a position on a plane).\n * - A direction and length across a plane. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0)` to `(x, y)`\n * and the direction is also measured from `(0, 0)` towards `(x, y)`.\n * - Any arbitrary ordered pair of numbers.\n *\n * There are other things a 2D vector can be used to represent, such as\n * momentum vectors, complex numbers and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector2( 0, 1 );\n *\n * //no arguments; will be initialised to (0, 0)\n * const b = new THREE.Vector2( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector2 {\n\n\t/**\n\t * Constructs a new 2D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t */\n\tconstructor( x = 0, y = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector2.prototype.isVector2 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#x}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#y}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @param {number} value - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to copy.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector2} v - The vector to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector2} v - The vector to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 as the 3rd component) by\n\t * the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the given vector's x or y\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is less than the given vector's x or y\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the max vector's x or y\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x or y value is less than the min vector's x or y value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector2} min - The minimum x and y values.\n\t * @param {Vector2} max - The maximum x and y values in the desired range.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x or y values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x and y = -y.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the cross product with.\n\t * @return {number} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0) to (x, y). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Computes the angle in radians of this vector with respect to the positive x-axis.\n\t *\n\t * @return {number} The angle in radians.\n\t */\n\tangle() {\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector2} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector2} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector2} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector2} v1 - The first vector.\n\t * @param {Vector2} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector2} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]` and y\n\t * value to be `array[ offset + 1 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this vector around the given center by the given angle.\n\t *\n\t * @param {Vector2} center - The point around which to rotate.\n\t * @param {number} angle - The angle to rotate, in radians.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\n/**\n * Class for representing a Quaternion. Quaternions are used in three.js to represent rotations.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n *\n * Note that three.js expects Quaternions to be normalized.\n * ```js\n * const quaternion = new THREE.Quaternion();\n * quaternion.setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 );\n *\n * const vector = new THREE.Vector3( 1, 0, 0 );\n * vector.applyQuaternion( quaternion );\n * ```\n */\nclass Quaternion {\n\n\t/**\n\t * Constructs a new quaternion.\n\t *\n\t * @param {number} [x=0] - The x value of this quaternion.\n\t * @param {number} [y=0] - The y value of this quaternion.\n\t * @param {number} [z=0] - The z value of this quaternion.\n\t * @param {number} [w=1] - The w value of this quaternion.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\t/**\n\t * Interpolates between two quaternions via SLERP. This implementation assumes the\n\t * quaternion data are managed in flat arrays.\n\t *\n\t * @param {Array} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array} src1 - The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @param {number} t - The interpolation factor in the range `[0,1]`.\n\t * @see {@link Quaternion#slerp}\n\t */\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tlet x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t <= 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t >= 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n\n\t\t\tif ( dot < 0 ) {\n\n\t\t\t\tx1 = - x1;\n\t\t\t\ty1 = - y1;\n\t\t\t\tz1 = - z1;\n\t\t\t\tw1 = - w1;\n\n\t\t\t\tdot = - dot;\n\n\t\t\t}\n\n\t\t\tlet s = 1 - t;\n\n\t\t\tif ( dot < 0.9995 ) {\n\n\t\t\t\t// slerp\n\n\t\t\t\tconst theta = Math.acos( dot );\n\t\t\t\tconst sin = Math.sin( theta );\n\n\t\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t} else {\n\n\t\t\t\t// for small angles, lerp then normalize\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\t/**\n\t * Multiplies two quaternions. This implementation assumes the quaternion data are managed\n\t * in flat arrays.\n\t *\n\t * @param {Array} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array} src1 - The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @return {Array} The destination array.\n\t * @see {@link Quaternion#multiplyQuaternions}.\n\t */\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\t/**\n\t * The x value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The y value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The z value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The w value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the quaternion components.\n\t *\n\t * @param {number} x - The x value of this quaternion.\n\t * @param {number} y - The y value of this quaternion.\n\t * @param {number} z - The z value of this quaternion.\n\t * @param {number} w - The w value of this quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new quaternion with copied values from this instance.\n\t *\n\t * @return {Quaternion} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given quaternion to this instance.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to copy.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the rotation specified by the given\n\t * Euler angles.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromEuler( euler, update = true ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\twarn( 'Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given axis and angle.\n\t *\n\t * @param {Vector3} axis - The normalized axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the rotation required to rotate the direction vector\n\t * `vFrom` to the direction vector `vTo`.\n\t *\n\t * @param {Vector3} vFrom - The first (normalized) direction vector.\n\t * @param {Vector3} vTo - The second (normalized) direction vector.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < 1e-8 ) { // the epsilon value has been discussed in #31286\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Returns the angle between this quaternion and the given one in radians.\n\t *\n\t * @param {Quaternion} q - The quaternion to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), -1, 1 ) ) );\n\n\t}\n\n\t/**\n\t * Rotates this quaternion by a given angular step to the given quaternion.\n\t * The method ensures that the final quaternion will not overshoot `q`.\n\t *\n\t * @param {Quaternion} q - The target quaternion.\n\t * @param {number} step - The angular step in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the identity quaternion; that is, to the\n\t * quaternion that represents \"no rotation\".\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\t/**\n\t * Inverts this quaternion via {@link Quaternion#conjugate}. The\n\t * quaternion is assumed to have unit length.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tinvert() {\n\n\t\treturn this.conjugate();\n\n\t}\n\n\t/**\n\t * Returns the rotational conjugate of this quaternion. The conjugate of a\n\t * quaternion represents the same rotation in the opposite direction about\n\t * the rotational axis.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tconjugate() {\n\n\t\tthis._x *= -1;\n\t\tthis._y *= -1;\n\t\tthis._z *= -1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of this quaternion and the given one.\n\t *\n\t * @param {Quaternion} v - The quaternion to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\t/**\n\t * Computes the squared Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector. This can be useful if you are comparing the\n\t * lengths of two quaternions, as this is a slightly more efficient calculation than\n\t * {@link Quaternion#length}.\n\t *\n\t * @return {number} The squared Euclidean length.\n\t */\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector.\n\t *\n\t * @return {number} The Euclidean length.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\t/**\n\t * Normalizes this quaternion - that is, calculated the quaternion that performs\n\t * the same rotation as this one, but has a length equal to `1`.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\t/**\n\t * Multiplies the given quaternions and stores the result in this instance.\n\t *\n\t * @param {Quaternion} a - The first quaternion.\n\t * @param {Quaternion} b - The second quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between quaternions.\n\t *\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerp( qb, t ) {\n\n\t\tif ( t <= 0 ) return this;\n\n\t\tif ( t >= 1 ) return this.copy( qb ); // copy calls _onChangeCallback()\n\n\t\tlet x = qb._x, y = qb._y, z = qb._z, w = qb._w;\n\n\t\tlet dot = this.dot( qb );\n\n\t\tif ( dot < 0 ) {\n\n\t\t\tx = - x;\n\t\t\ty = - y;\n\t\t\tz = - z;\n\t\t\tw = - w;\n\n\t\t\tdot = - dot;\n\n\t\t}\n\n\t\tlet s = 1 - t;\n\n\t\tif ( dot < 0.9995 ) {\n\n\t\t\t// slerp\n\n\t\t\tconst theta = Math.acos( dot );\n\t\t\tconst sin = Math.sin( theta );\n\n\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis._onChangeCallback();\n\n\t\t} else {\n\n\t\t\t// for small angles, lerp then normalize\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis.normalize(); // normalize calls _onChangeCallback()\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between the given quaternions\n\t * and stores the result in this quaternion.\n\t *\n\t * @param {Quaternion} qa - The source quaternion.\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\t/**\n\t * Sets this quaternion to a uniformly random, normalized quaternion.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trandom() {\n\n\t\t// Ken Shoemake\n\t\t// Uniform random rotations\n\t\t// D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n\n\t\tconst theta1 = 2 * Math.PI * Math.random();\n\t\tconst theta2 = 2 * Math.PI * Math.random();\n\n\t\tconst x0 = Math.random();\n\t\tconst r1 = Math.sqrt( 1 - x0 );\n\t\tconst r2 = Math.sqrt( x0 );\n\n\t\treturn this.set(\n\t\t\tr1 * Math.sin( theta1 ),\n\t\t\tr1 * Math.cos( theta1 ),\n\t\t\tr2 * Math.sin( theta2 ),\n\t\t\tr2 * Math.cos( theta2 ),\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if this quaternion is equal with the given one.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to test for equality.\n\t * @return {boolean} Whether this quaternion is equal with the given one.\n\t */\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\t/**\n\t * Sets this quaternion's components from the given array.\n\t *\n\t * @param {Array} array - An array holding the quaternion component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this quaternion to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the quaternion components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The quaternion components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this quaternion from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding quaternion data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the\n\t * numerical elements of this quaternion in an array of format `[x, y, z, w]`.\n\t *\n\t * @return {Array} The serialized quaternion.\n\t */\n\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\n/**\n * Class representing a 3D vector. A 3D vector is an ordered triplet of numbers\n * (labeled x, y and z), which can be used to represent a number of things, such as:\n *\n * - A point in 3D space.\n * - A direction and length in 3D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0)` to `(x, y, z)`\n * and the direction is also measured from `(0, 0, 0)` towards `(x, y, z)`.\n * - Any arbitrary ordered triplet of numbers.\n *\n * There are other things a 3D vector can be used to represent, such as\n * momentum vectors and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y, z)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector3( 0, 1, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0)\n * const b = new THREE.Vector3( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector3 {\n\n\t/**\n\t * Constructs a new 3D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector3.prototype.isVector3 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @param {number} value - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to copy.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector3} v - The vector to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Euler rotation to this vector.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\t/**\n\t * Applies a rotation specified by an axis and an angle to this vector.\n\t *\n\t * @param {Vector3} axis - A normalized vector representing the rotation axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector by the given normal matrix and normalizes\n\t * the result.\n\t *\n\t * @param {Matrix3} m - The normal matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and\n\t * divides by perspective.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Quaternion to this vector.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector from world space into the camera's normalized\n\t * device coordinate (NDC) space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\t/**\n\t * Unprojects this vector from the camera's normalized device coordinate (NDC)\n\t * space into world space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\t/**\n\t * Transforms the direction of this vector by a matrix (the upper left 3 x 3\n\t * subset of the given 4x4 matrix and then normalizes the result.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector3} v - The vector to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the given vector's x, y or z\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is less than the given vector's x, y or z\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the max vector's x, y or z\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y or z value is less than the min vector's x, y or z value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector3} min - The minimum x, y and z values.\n\t * @param {Vector3} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y or z values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y and z = -z.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector3} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector3} v1 - The first vector.\n\t * @param {Vector3} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the cross product with.\n\t * @return {Vector3} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vectors and stores the result\n\t * in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector onto the given one.\n\t *\n\t * @param {Vector3} v - The vector to project to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\t/**\n\t * Projects this vector onto a plane by subtracting this\n\t * vector projected onto the plane's normal from this vector.\n\t *\n\t * @param {Vector3} planeNormal - The plane normal.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\t/**\n\t * Reflects this vector off a plane orthogonal to the given normal vector.\n\t *\n\t * @param {Vector3} normal - The (normalized) normal vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\treflect( normal ) {\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector3} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector3} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {Spherical} s - The spherical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The phi angle in radians.\n\t * @param {number} theta - The theta angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {Cylindrical} c - The cylindrical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle in radians.\n\t * @param {number} y - The y value.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the scale elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given Euler angles.\n\t *\n\t * @param {Euler} e - The Euler angles to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the RGB components of the\n\t * given color.\n\t *\n\t * @param {Color} c - The color to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector3} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`\n\t * and z value to be `array[ offset + 2 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this vector to a uniformly random point on a unit sphere.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandomDirection() {\n\n\t\t// https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst theta = Math.random() * Math.PI * 2;\n\t\tconst u = Math.random() * 2 - 1;\n\t\tconst c = Math.sqrt( 1 - u * u );\n\n\t\tthis.x = c * Math.cos( theta );\n\t\tthis.y = u;\n\t\tthis.z = c * Math.sin( theta );\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\n/**\n * Represents a 3x3 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix();\n * m.set( 11, 12, 13,\n * 21, 22, 23,\n * 31, 32, 33 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31,\n * 12, 22, 32,\n * 13, 23, 33 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix3 {\n\n\t/**\n\t * Constructs a new 3x3 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 3x3 identity matrix.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix3} m - The matrix to copy.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set this matrix to the upper 3x3 matrix of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 3x3 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix3} a - The first matrix.\n\t * @param {Matrix3} b - The second matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the normal matrix which is the inverse transpose of the upper\n\t * left 3x3 portion of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\t/**\n\t * Transposes this matrix into the supplied array, and returns itself unchanged.\n\t *\n\t * @param {Array} r - An array to store the transposed matrix elements.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the UV transform matrix from offset, repeat, rotation, and center.\n\t *\n\t * @param {number} tx - Offset x.\n\t * @param {number} ty - Offset y.\n\t * @param {number} sx - Repeat x.\n\t * @param {number} sy - Repeat y.\n\t * @param {number} rotation - Rotation, in radians. Positive values rotate counterclockwise.\n\t * @param {number} cx - Center x of rotation.\n\t * @param {number} cy - Center y of rotation\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this matrix with the given scalar values.\n\t *\n\t * @param {number} sx - The amount to scale in the X axis.\n\t * @param {number} sy - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this matrix by the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates this matrix by the given scalar values.\n\t *\n\t * @param {number} tx - The amount to translate in the X axis.\n\t * @param {number} ty - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\t/**\n\t * Sets this matrix as a 2D translation transform.\n\t *\n\t * @param {number|Vector2} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y ) {\n\n\t\tif ( x.isVector2 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x.x,\n\t\t\t\t0, 1, x.y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x,\n\t\t\t\t0, 1, y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D rotational transformation.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D scale transform.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix3} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nconst LINEAR_REC709_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4123908, 0.3575843, 0.1804808,\n\t0.2126390, 0.7151687, 0.0721923,\n\t0.0193308, 0.1191948, 0.9505322\n);\n\nconst XYZ_TO_LINEAR_REC709 = /*@__PURE__*/ new Matrix3().set(\n\t3.2409699, -1.5373832, -0.4986108,\n\t-0.9692436, 1.8759675, 0.0415551,\n\t0.0556301, -0.203977, 1.0569715\n);\n\nfunction createColorManagement() {\n\n\tconst ColorManagement = {\n\n\t\tenabled: true,\n\n\t\tworkingColorSpace: LinearSRGBColorSpace,\n\n\t\t/**\n\t\t * Implementations of supported color spaces.\n\t\t *\n\t\t * Required:\n\t\t *\t- primaries: chromaticity coordinates [ rx ry gx gy bx by ]\n\t\t *\t- whitePoint: reference white [ x y ]\n\t\t *\t- transfer: transfer function (pre-defined)\n\t\t *\t- toXYZ: Matrix3 RGB to XYZ transform\n\t\t *\t- fromXYZ: Matrix3 XYZ to RGB transform\n\t\t *\t- luminanceCoefficients: RGB luminance coefficients\n\t\t *\n\t\t * Optional:\n\t\t * - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace, toneMappingMode: 'extended' | 'standard' }\n\t\t * - workingColorSpaceConfig: { unpackColorSpace: ColorSpace }\n\t\t *\n\t\t * Reference:\n\t\t * - https://www.russellcottrell.com/photo/matrixCalculator.htm\n\t\t */\n\t\tspaces: {},\n\n\t\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\t\tif ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\t\treturn color;\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = SRGBToLinear( color.r );\n\t\t\t\tcolor.g = SRGBToLinear( color.g );\n\t\t\t\tcolor.b = SRGBToLinear( color.b );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].primaries !== this.spaces[ targetColorSpace ].primaries ) {\n\n\t\t\t\tcolor.applyMatrix3( this.spaces[ sourceColorSpace ].toXYZ );\n\t\t\t\tcolor.applyMatrix3( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ targetColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = LinearToSRGB( color.r );\n\t\t\t\tcolor.g = LinearToSRGB( color.g );\n\t\t\t\tcolor.b = LinearToSRGB( color.b );\n\n\t\t\t}\n\n\t\t\treturn color;\n\n\t\t},\n\n\t\tworkingToColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\treturn this.convert( color, this.workingColorSpace, targetColorSpace );\n\n\t\t},\n\n\t\tcolorSpaceToWorking: function ( color, sourceColorSpace ) {\n\n\t\t\treturn this.convert( color, sourceColorSpace, this.workingColorSpace );\n\n\t\t},\n\n\t\tgetPrimaries: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].primaries;\n\n\t\t},\n\n\t\tgetTransfer: function ( colorSpace ) {\n\n\t\t\tif ( colorSpace === NoColorSpace ) return LinearTransfer;\n\n\t\t\treturn this.spaces[ colorSpace ].transfer;\n\n\t\t},\n\n\t\tgetToneMappingMode: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.toneMappingMode || 'standard';\n\n\t\t},\n\n\t\tgetLuminanceCoefficients: function ( target, colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn target.fromArray( this.spaces[ colorSpace ].luminanceCoefficients );\n\n\t\t},\n\n\t\tdefine: function ( colorSpaces ) {\n\n\t\t\tObject.assign( this.spaces, colorSpaces );\n\n\t\t},\n\n\t\t// Internal APIs\n\n\t\t_getMatrix: function ( targetMatrix, sourceColorSpace, targetColorSpace ) {\n\n\t\t\treturn targetMatrix\n\t\t\t\t.copy( this.spaces[ sourceColorSpace ].toXYZ )\n\t\t\t\t.multiply( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t},\n\n\t\t_getDrawingBufferColorSpace: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.drawingBufferColorSpace;\n\n\t\t},\n\n\t\t_getUnpackColorSpace: function ( colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].workingColorSpaceConfig.unpackColorSpace;\n\n\t\t},\n\n\t\t// Deprecated\n\n\t\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.workingToColorSpace( color, targetColorSpace );\n\n\t\t},\n\n\t\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.colorSpaceToWorking( color, sourceColorSpace );\n\n\t\t},\n\n\t};\n\n\t/******************************************************************************\n\t * sRGB definitions\n\t */\n\n\tconst REC709_PRIMARIES = [ 0.640, 0.330, 0.300, 0.600, 0.150, 0.060 ];\n\tconst REC709_LUMINANCE_COEFFICIENTS = [ 0.2126, 0.7152, 0.0722 ];\n\tconst D65 = [ 0.3127, 0.3290 ];\n\n\tColorManagement.define( {\n\n\t\t[ LinearSRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: LinearTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\tworkingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace },\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t\t[ SRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: SRGBTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t} );\n\n\treturn ColorManagement;\n\n}\n\nconst ColorManagement = /*@__PURE__*/ createColorManagement();\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nlet _canvas;\n\n/**\n * A class containing utility functions for images.\n *\n * @hideconstructor\n */\nclass ImageUtils {\n\n\t/**\n\t * Returns a data URI containing a representation of the given image.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement)} image - The image object.\n\t * @param {string} [type='image/png'] - Indicates the image format.\n\t * @return {string} The data URI.\n\t */\n\tstatic getDataURL( image, type = 'image/png' ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement === 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\treturn canvas.toDataURL( type );\n\n\t}\n\n\t/**\n\t * Converts the given sRGB image data to linear color space.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement|ImageBitmap|Object)} image - The image object.\n\t * @return {HTMLCanvasElement|Object} The converted image.\n\t */\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nlet _sourceId = 0;\n\n/**\n * Represents the data source of a texture.\n *\n * The main purpose of this class is to decouple the data definition from the texture\n * definition so the same data can be used with multiple texture instances.\n */\nclass Source {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {any} [data=null] - The data definition of a texture.\n\t */\n\tconstructor( data = null ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSource = true;\n\n\t\t/**\n\t\t * The ID of the source.\n\t\t *\n\t\t * @name Source#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _sourceId ++ } );\n\n\t\t/**\n\t\t * The UUID of the source.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The data definition of a texture.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.data = data;\n\n\t\t/**\n\t\t * This property is only relevant when {@link Source#needsUpdate} is set to `true` and\n\t\t * provides more control on how texture data should be processed. When `dataReady` is set\n\t\t * to `false`, the engine performs the memory allocation (if necessary) but does not transfer\n\t\t * the data into the GPU memory.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.dataReady = true;\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Source#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Returns the dimensions of the source into the given target vector.\n\t *\n\t * @param {(Vector2|Vector3)} target - The target object the result is written into.\n\t * @return {(Vector2|Vector3)} The dimensions of the source.\n\t */\n\tgetSize( target ) {\n\n\t\tconst data = this.data;\n\n\t\tif ( ( typeof HTMLVideoElement !== 'undefined' ) && ( data instanceof HTMLVideoElement ) ) {\n\n\t\t\ttarget.set( data.videoWidth, data.videoHeight, 0 );\n\n\t\t} else if ( data instanceof VideoFrame ) {\n\n\t\t\ttarget.set( data.displayHeight, data.displayWidth, 0 );\n\n\t\t} else if ( data !== null ) {\n\n\t\t\ttarget.set( data.width, data.height, data.depth || 0 );\n\n\t\t} else {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * When the property is set to `true`, the engine allocates the memory\n\t * for the texture (if necessary) and triggers the actual texture upload\n\t * to the GPU next time the source is used.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Serializes the source into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized source.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.from( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet _textureId = 0;\n\nconst _tempVec3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Base class for all textures.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments EventDispatcher\n */\nclass Texture extends EventDispatcher {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {?Object} [image=Texture.DEFAULT_IMAGE] - The image holding the texture data.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isTexture = true;\n\n\t\t/**\n\t\t * The ID of the texture.\n\t\t *\n\t\t * @name Texture#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _textureId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The data definition of a texture. A reference to the data source can be\n\t\t * shared across textures. This is often useful in context of spritesheets\n\t\t * where multiple textures render the same data but with different texture\n\t\t * transformations.\n\t\t *\n\t\t * @type {Source}\n\t\t */\n\t\tthis.source = new Source( image );\n\n\t\t/**\n\t\t * An array holding user-defined mipmaps.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.mipmaps = [];\n\n\t\t/**\n\t\t * How the texture is applied to the object. The value `UVMapping`\n\t\t * is the default, where texture or uv coordinates are used to apply the map.\n\t\t *\n\t\t * @type {(UVMapping|CubeReflectionMapping|CubeRefractionMapping|EquirectangularReflectionMapping|EquirectangularRefractionMapping|CubeUVReflectionMapping)}\n\t\t * @default UVMapping\n\t\t*/\n\t\tthis.mapping = mapping;\n\n\t\t/**\n\t\t * Lets you select the uv attribute to map the texture to. `0` for `uv`,\n\t\t * `1` for `uv1`, `2` for `uv2` and `3` for `uv3`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.channel = 0;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *U* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapS = wrapS;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *V* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapT = wrapT;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearFilter\n\t\t */\n\t\tthis.magFilter = magFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearMipmapLinearFilter\n\t\t */\n\t\tthis.minFilter = minFilter;\n\n\t\t/**\n\t\t * The number of samples taken along the axis through the pixel that has the\n\t\t * highest density of texels. By default, this value is `1`. A higher value\n\t\t * gives a less blurry result than a basic mipmap, at the cost of more\n\t\t * texture samples being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.anisotropy = anisotropy;\n\n\t\t/**\n\t\t * The format of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default RGBAFormat\n\t\t */\n\t\tthis.format = format;\n\n\t\t/**\n\t\t * The default internal format is derived from {@link Texture#format} and {@link Texture#type} and\n\t\t * defines how the texture data is going to be stored on the GPU.\n\t\t *\n\t\t * This property allows to overwrite the default format.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.internalFormat = null;\n\n\t\t/**\n\t\t * The data type of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * How much a single repetition of the texture is offset from the beginning,\n\t\t * in each direction U and V. Typical range is `0.0` to `1.0`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.offset = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How many times the texture is repeated across the surface, in each\n\t\t * direction U and V. If repeat is set greater than `1` in either direction,\n\t\t * the corresponding wrap parameter should also be set to `RepeatWrapping`\n\t\t * or `MirroredRepeatWrapping` to achieve the desired tiling effect.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The point around which rotation occurs. A value of `(0.5, 0.5)` corresponds\n\t\t * to the center of the texture. Default is `(0, 0)`, the lower left.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.center = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How much the texture is rotated around the center point, in radians.\n\t\t * Positive values are counter-clockwise.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Whether to update the texture's uv-transformation {@link Texture#matrix}\n\t\t * from the properties {@link Texture#offset}, {@link Texture#repeat},\n\t\t * {@link Texture#rotation}, and {@link Texture#center}.\n\t\t *\n\t\t * Set this to `false` if you are specifying the uv-transform matrix directly.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = true;\n\n\t\t/**\n\t\t * The uv-transformation matrix of the texture.\n\t\t *\n\t\t * @type {Matrix3}\n\t\t */\n\t\tthis.matrix = new Matrix3();\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Set this to `false` if you are creating mipmaps manually.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.generateMipmaps = true;\n\n\t\t/**\n\t\t * If set to `true`, the alpha channel, if present, is multiplied into the\n\t\t * color channels when the texture is uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure premultiply alpha on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultiplyAlpha = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure the flip on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.flipY = true;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t * The allowable values are `1` (byte-alignment), `2` (rows aligned to even-numbered bytes),\n\t\t * `4` (word-alignment), and `8` (rows start on double-word boundaries).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 4\n\t\t */\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t/**\n\t\t * Textures containing color data should be annotated with `SRGBColorSpace` or `LinearSRGBColorSpace`.\n\t\t *\n\t\t * @type {string}\n\t\t * @default NoColorSpace\n\t\t */\n\t\tthis.colorSpace = colorSpace;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the texture. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This can be used to only update a subregion or specific rows of the texture (for example, just the\n\t\t * first 3 rows). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Texture#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * A callback function, called when the texture is updated (e.g., when\n\t\t * {@link Texture#needsUpdate} has been set to true and then the texture is used).\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.onUpdate = null;\n\n\t\t/**\n\t\t * An optional back reference to the textures render target.\n\t\t *\n\t\t * @type {?(RenderTarget|WebGLRenderTarget)}\n\t\t * @default null\n\t\t */\n\t\tthis.renderTarget = null;\n\n\t\t/**\n\t\t * Indicates whether a texture belongs to a render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isRenderTargetTexture = false;\n\n\t\t/**\n\t\t * Indicates if a texture should be handled like a texture array.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isArrayTexture = image && image.depth && image.depth > 1 ? true : false;\n\n\t\t/**\n\t\t * Indicates whether this texture should be processed by `PMREMGenerator` or not\n\t\t * (only relevant for render target textures).\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.pmremVersion = 0;\n\n\t}\n\n\t/**\n\t * The width of the texture in pixels.\n\t */\n\tget width() {\n\n\t\treturn this.source.getSize( _tempVec3 ).x;\n\n\t}\n\n\t/**\n\t * The height of the texture in pixels.\n\t */\n\tget height() {\n\n\t\treturn this.source.getSize( _tempVec3 ).y;\n\n\t}\n\n\t/**\n\t * The depth of the texture in pixels.\n\t */\n\tget depth() {\n\n\t\treturn this.source.getSize( _tempVec3 ).z;\n\n\t}\n\n\t/**\n\t * The image object holding the texture data.\n\t *\n\t * @type {?Object}\n\t */\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value = null ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\t/**\n\t * Updates the texture transformation matrix from the from the properties {@link Texture#offset},\n\t * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data texture to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Returns a new texture with copied values from this instance.\n\t *\n\t * @return {Texture} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given texture to this instance.\n\t *\n\t * @param {Texture} source - The texture to copy.\n\t * @return {Texture} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\t\tthis.channel = source.channel;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.colorSpace = source.colorSpace;\n\n\t\tthis.renderTarget = source.renderTarget;\n\t\tthis.isRenderTargetTexture = source.isRenderTargetTexture;\n\t\tthis.isArrayTexture = source.isArrayTexture;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this texture's properties based on `values`.\n\t * @param {Object} values - A container with texture parameters.\n\t */\n\tsetValues( values ) {\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): property '${ key }' does not exist.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( ( currentValue && newValue ) && ( currentValue.isVector2 && newValue.isVector2 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isVector3 && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isMatrix3 && newValue.isMatrix3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the texture into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized texture.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\t\t\tchannel: this.channel,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\tinternalFormat: this.internalFormat,\n\t\t\ttype: this.type,\n\t\t\tcolorSpace: this.colorSpace,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tgenerateMipmaps: this.generateMipmaps,\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the texture has been disposed of.\n\t\t *\n\t\t * @event Texture#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Transforms the given uv vector with the textures uv transformation matrix.\n\t *\n\t * @param {Vector2} uv - The uv vector.\n\t * @return {Vector2} The transformed uv vector.\n\t */\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the texture\n\t * must be updated in the next render. This triggers a texture upload\n\t * to the GPU and ensures correct texture parameter configuration.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the PMREM\n\t * must be regenerated.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsPMREMUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.pmremVersion ++;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * The default image for all textures.\n *\n * @static\n * @type {?Image}\n * @default null\n */\nTexture.DEFAULT_IMAGE = null;\n\n/**\n * The default mapping for all textures.\n *\n * @static\n * @type {number}\n * @default UVMapping\n */\nTexture.DEFAULT_MAPPING = UVMapping;\n\n/**\n * The default anisotropy value for all textures.\n *\n * @static\n * @type {number}\n * @default 1\n */\nTexture.DEFAULT_ANISOTROPY = 1;\n\n/**\n * Class representing a 4D vector. A 4D vector is an ordered quadruplet of numbers\n * (labeled x, y, z and w), which can be used to represent a number of things, such as:\n *\n * - A point in 4D space.\n * - A direction and length in 4D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0, 0)` to `(x, y, z, w)`\n * and the direction is also measured from `(0, 0, 0, 0)` towards `(x, y, z, w)`.\n * - Any arbitrary ordered quadruplet of numbers.\n *\n * There are other things a 4D vector can be used to represent, however these\n * are the most common uses in *three.js*.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector4( 0, 1, 0, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0, 1)\n * const b = new THREE.Vector4( );\n *\n * const d = a.dot( b );\n * ```\n */\nclass Vector4 {\n\n\t/**\n\t * Constructs a new 4D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t * @param {number} [w=1] - The w value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector4.prototype.isVector4 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t\t/**\n\t\t * The w value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.w = w;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#z}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#w}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @param {number} w - The value of the w component.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's w component to the given value\n\t *\n\t * @param {number} w - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @param {number} value - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector to copy.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector4} v - The vector to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector4} v - The vector to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector4} v - The vector to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\t\tthis.w /= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the quaternion's axis and w to the angle.\n\t *\n\t * @param {Quaternion} q - The Quaternion to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the axis of rotation and w to the angle.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper left 3x3 matrix is a pure rotation matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\t\tthis.w = e[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is less than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the max vector's x, y, z or w\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y, z or w value is less than the min vector's x, y, z or w value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector4} min - The minimum x, y and z values.\n\t * @param {Vector4} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\t\tthis.w = clamp( this.w, min.w, max.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y, z or w values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\t\tthis.w = clamp( this.w, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\t\tthis.w = Math.trunc( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y, z = -z, w = -w.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0, 0) to (x, y, z, w). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector4} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector4} v1 - The first vector.\n\t * @param {Vector4} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector4} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`,\n\t * z value to be `array[ offset + 2 ]`, w value to be `array[ offset + 3 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\n/**\n * A render target is a buffer where the video card draws pixels for a scene\n * that is being rendered in the background. It is used in different effects,\n * such as applying postprocessing to a rendered image before displaying it\n * on the screen.\n *\n * @augments EventDispatcher\n */\nclass RenderTarget extends EventDispatcher {\n\n\t/**\n\t * Render target options.\n\t *\n\t * @typedef {Object} RenderTarget~Options\n\t * @property {boolean} [generateMipmaps=false] - Whether to generate mipmaps or not.\n\t * @property {number} [magFilter=LinearFilter] - The mag filter.\n\t * @property {number} [minFilter=LinearFilter] - The min filter.\n\t * @property {number} [format=RGBAFormat] - The texture format.\n\t * @property {number} [type=UnsignedByteType] - The texture type.\n\t * @property {?string} [internalFormat=null] - The texture's internal format.\n\t * @property {number} [wrapS=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [wrapT=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [anisotropy=1] - The texture's anisotropy value.\n\t * @property {string} [colorSpace=NoColorSpace] - The texture's color space.\n\t * @property {boolean} [depthBuffer=true] - Whether to allocate a depth buffer or not.\n\t * @property {boolean} [stencilBuffer=false] - Whether to allocate a stencil buffer or not.\n\t * @property {boolean} [resolveDepthBuffer=true] - Whether to resolve the depth buffer or not.\n\t * @property {boolean} [resolveStencilBuffer=true] - Whether to resolve the stencil buffer or not.\n\t * @property {?Texture} [depthTexture=null] - Reference to a depth texture.\n\t * @property {number} [samples=0] - The MSAA samples count.\n\t * @property {number} [count=1] - Defines the number of color attachments . Must be at least `1`.\n\t * @property {number} [depth=1] - The texture depth.\n\t * @property {boolean} [multiview=false] - Whether this target is used for multiview rendering.\n\t */\n\n\t/**\n\t * Constructs a new render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper();\n\n\t\toptions = Object.assign( {\n\t\t\tgenerateMipmaps: false,\n\t\t\tinternalFormat: null,\n\t\t\tminFilter: LinearFilter,\n\t\t\tdepthBuffer: true,\n\t\t\tstencilBuffer: false,\n\t\t\tresolveDepthBuffer: true,\n\t\t\tresolveStencilBuffer: true,\n\t\t\tdepthTexture: null,\n\t\t\tsamples: 0,\n\t\t\tcount: 1,\n\t\t\tdepth: 1,\n\t\t\tmultiview: false\n\t\t}, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget = true;\n\n\t\t/**\n\t\t * The width of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * The depth of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.depth = options.depth;\n\n\t\t/**\n\t\t * A rectangular area inside the render target's viewport. Fragments that are\n\t\t * outside the area will be discarded.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\n\t\t/**\n\t\t * Indicates whether the scissor test should be enabled when rendering into\n\t\t * this render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.scissorTest = false;\n\n\t\t/**\n\t\t * A rectangular area representing the render target's viewport.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: options.depth };\n\n\t\tconst texture = new Texture( image );\n\n\t\t/**\n\t\t * An array of textures. Each color attachment is represented as a separate texture.\n\t\t * Has at least a single entry for the default color attachment.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.textures = [];\n\n\t\tconst count = options.count;\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.textures[ i ] = texture.clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t}\n\n\t\tthis._setTextureOptions( options );\n\n\t\t/**\n\t\t * Whether to allocate a depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthBuffer = options.depthBuffer;\n\n\t\t/**\n\t\t * Whether to allocate a stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilBuffer = options.stencilBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveDepthBuffer = options.resolveDepthBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveStencilBuffer = options.resolveStencilBuffer;\n\n\t\tthis._depthTexture = null;\n\t\tthis.depthTexture = options.depthTexture;\n\n\t\t/**\n\t\t * The number of MSAA samples.\n\t\t *\n\t\t * A value of `0` disables MSAA.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.samples = options.samples;\n\n\t\t/**\n\t\t * Whether to this target is used in multiview rendering.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.multiview = options.multiview;\n\n\t}\n\n\t_setTextureOptions( options = {} ) {\n\n\t\tconst values = {\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\tflipY: false,\n\t\t\tinternalFormat: null\n\t\t};\n\n\t\tif ( options.mapping !== undefined ) values.mapping = options.mapping;\n\t\tif ( options.wrapS !== undefined ) values.wrapS = options.wrapS;\n\t\tif ( options.wrapT !== undefined ) values.wrapT = options.wrapT;\n\t\tif ( options.wrapR !== undefined ) values.wrapR = options.wrapR;\n\t\tif ( options.magFilter !== undefined ) values.magFilter = options.magFilter;\n\t\tif ( options.minFilter !== undefined ) values.minFilter = options.minFilter;\n\t\tif ( options.format !== undefined ) values.format = options.format;\n\t\tif ( options.type !== undefined ) values.type = options.type;\n\t\tif ( options.anisotropy !== undefined ) values.anisotropy = options.anisotropy;\n\t\tif ( options.colorSpace !== undefined ) values.colorSpace = options.colorSpace;\n\t\tif ( options.flipY !== undefined ) values.flipY = options.flipY;\n\t\tif ( options.generateMipmaps !== undefined ) values.generateMipmaps = options.generateMipmaps;\n\t\tif ( options.internalFormat !== undefined ) values.internalFormat = options.internalFormat;\n\n\t\tfor ( let i = 0; i < this.textures.length; i ++ ) {\n\n\t\t\tconst texture = this.textures[ i ];\n\t\t\ttexture.setValues( values );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The texture representing the default color attachment.\n\t *\n\t * @type {Texture}\n\t */\n\tget texture() {\n\n\t\treturn this.textures[ 0 ];\n\n\t}\n\n\tset texture( value ) {\n\n\t\tthis.textures[ 0 ] = value;\n\n\t}\n\n\tset depthTexture( current ) {\n\n\t\tif ( this._depthTexture !== null ) this._depthTexture.renderTarget = null;\n\t\tif ( current !== null ) current.renderTarget = this;\n\n\t\tthis._depthTexture = current;\n\n\t}\n\n\t/**\n\t * Instead of saving the depth in a renderbuffer, a texture\n\t * can be used instead which is useful for further processing\n\t * e.g. in context of post-processing.\n\t *\n\t * @type {?DepthTexture}\n\t * @default null\n\t */\n\tget depthTexture() {\n\n\t\treturn this._depthTexture;\n\n\t}\n\n\t/**\n\t * Sets the size of this render target.\n\t *\n\t * @param {number} width - The width.\n\t * @param {number} height - The height.\n\t * @param {number} [depth=1] - The depth.\n\t */\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.textures.length; i < il; i ++ ) {\n\n\t\t\t\tthis.textures[ i ].image.width = width;\n\t\t\t\tthis.textures[ i ].image.height = height;\n\t\t\t\tthis.textures[ i ].image.depth = depth;\n\n\t\t\t\tif ( this.textures[ i ].isData3DTexture !== true ) { // Fix for #31693\n\n\t\t\t\t\t// TODO: Reconsider setting isArrayTexture flag here and in the ctor of Texture.\n\t\t\t\t\t// Maybe a method `isArrayTexture()` or just a getter could replace a flag since\n\t\t\t\t\t// both are evaluated on each call?\n\n\t\t\t\t\tthis.textures[ i ].isArrayTexture = this.textures[ i ].image.depth > 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\t/**\n\t * Returns a new render target with copied values from this instance.\n\t *\n\t * @return {RenderTarget} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the settings of the given render target. This is a structural copy so\n\t * no resources are shared between render targets after the copy. That includes\n\t * all MRT textures and the depth texture.\n\t *\n\t * @param {RenderTarget} source - The render target to copy.\n\t * @return {RenderTarget} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.scissor.copy( source.scissor );\n\t\tthis.scissorTest = source.scissorTest;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.textures.length = 0;\n\n\t\tfor ( let i = 0, il = source.textures.length; i < il; i ++ ) {\n\n\t\t\tthis.textures[ i ] = source.textures[ i ].clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t\t// ensure image object is not shared, see #20328\n\n\t\t\tconst image = Object.assign( {}, source.textures[ i ].image );\n\t\t\tthis.textures[ i ].source = new Source( image );\n\n\t\t}\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tthis.resolveDepthBuffer = source.resolveDepthBuffer;\n\t\tthis.resolveStencilBuffer = source.resolveStencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires RenderTarget#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\n/**\n * A render target used in context of {@link WebGLRenderer}.\n *\n * @augments RenderTarget\n */\nclass WebGLRenderTarget extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderTarget = true;\n\n\t}\n\n}\n\n/**\n * Creates an array of textures directly from raw buffer data.\n *\n * @augments Texture\n */\nclass DataArrayTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataArrayTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire data texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * An array render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new array render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Creates a three-dimensional texture from raw data, with parameters to\n * divide it into width, height, and depth.\n *\n * @augments Texture\n */\nclass Data3DTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in Data3DTexture directly.\n\t\t//\n\t\t//\tconst texture = new THREE.Data3DTexture( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isData3DTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\n/**\n * A 3D render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 3D space.\n */\nclass Box3 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector3} [min=(Infinity,Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector3} [max=(-Infinity,-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox3 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector3} min - The lower boundary of the box.\n\t * @param {Vector3} max - The upper boundary of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} array - An array holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromArray( array ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromArray( array, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromBufferAttribute( attribute, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} points - An array holding 3D position data as instances of {@link Vector3}.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector3} center - The center of the box.\n\t * @param {Vector3} size - The x, y and z dimensions of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the world-axis-aligned bounding box for the given 3D object\n\t * (including its children), accounting for the object's, and children's,\n\t * world transforms. The function may result in a larger box than strictly necessary.\n\t *\n\t * @param {Object3D} object - The 3D object to compute the bounding box for.\n\t * @param {boolean} [precise=false] - If set to `true`, the method computes the smallest\n\t * world-axis-aligned bounding box at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box3} box - The box to copy.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector3} point - The point that should be included by the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions. The depth of this box will be\n\t * expanded by the z component of the vector in both directions.\n\t *\n\t * @param {Vector3} vector - The vector that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given 3D object and\n\t * its children, accounting for the object's, and children's, world\n\t * transforms. The function may result in a larger box than strictly\n\t * necessary (unless the precise parameter is set to true).\n\t *\n\t * @param {Object3D} object - The 3D object that should expand the bounding box.\n\t * @param {boolean} precise - If set to `true`, the method expands the bounding box\n\t * as little as necessary at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t// precise AABB computation based on vertex data requires at least a position attribute.\n\t\t\t// instancing isn't supported so far and uses the normal (conservative) code path.\n\n\t\t\tif ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( object.isMesh === true ) {\n\n\t\t\t\t\t\tobject.getVertexPosition( i, _vector$b );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_vector$b.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_vector$b.applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.boundingBox !== undefined ) {\n\n\t\t\t\t\t// object-level bounding box\n\n\t\t\t\t\tif ( object.boundingBox === null ) {\n\n\t\t\t\t\t\tobject.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( object.boundingBox );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// geometry-level bounding box\n\n\t\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( geometry.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\t_box$4.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y &&\n\t\t\tpoint.z >= this.min.z && point.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width, height and depth.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A point as a proportion of this box's width, height and depth.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y &&\n\t\t\tbox.max.z >= this.min.z && box.min.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with this bounding box.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with this bounding box.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given plane intersects with this bounding box.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether the given plane intersects with this bounding box.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given triangle intersects with this bounding box.\n\t *\n\t * @param {Triangle} triangle - The triangle to test.\n\t * @return {boolean} Whether the given triangle intersects with this bounding box.\n\t */\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$4.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$4, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$4 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents );\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector3} point - The point to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$b ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Returns a bounding sphere that encloses this bounding box.\n\t *\n\t * @param {Sphere} target - The target sphere that is used to store the method's result.\n\t * @return {Sphere} The bounding sphere that encloses this bounding box.\n\t */\n\tgetBoundingSphere( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\ttarget.makeEmpty();\n\n\t\t} else {\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box3} box - The bounding box to intersect with.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box3} box - The bounding box that will be unioned with this instance.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this bounding box by the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 3D space.\n\t *\n\t * @param {Vector3} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box3} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tmin: this.min.toArray(),\n\t\t\tmax: this.max.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @param {Object} json - The serialized json to set the box from.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.min.fromArray( json.min );\n\t\tthis.max.fromArray( json.max );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$4 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$4 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$3 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical 3D sphere defined by a center and radius. This class is mainly\n * used as a Bounding Sphere for 3D objects.\n */\nclass Sphere {\n\n\t/**\n\t * Constructs a new sphere.\n\t *\n\t * @param {Vector3} [center=(0,0,0)] - The center of the sphere\n\t * @param {number} [radius=-1] - The radius of the sphere.\n\t */\n\tconstructor( center = new Vector3(), radius = -1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphere = true;\n\n\t\t/**\n\t\t * The center of the sphere\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.center = center;\n\n\t\t/**\n\t\t * The radius of the sphere.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.radius = radius;\n\n\t}\n\n\t/**\n\t * Sets the sphere's components by copying the given values.\n\t *\n\t * @param {Vector3} center - The center.\n\t * @param {number} radius - The radius.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the minimum bounding sphere for list of points.\n\t * If the optional center point is given, it is used as the sphere's\n\t * center. Otherwise, the center of the axis-aligned bounding box\n\t * encompassing the points is calculated.\n\t *\n\t * @param {Array} points - A list of points in 3D space.\n\t * @param {Vector3} [optionalCenter] - The center of the sphere.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$3.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given sphere to this instance.\n\t *\n\t * @param {Sphere} sphere - The sphere to copy.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the sphere is empty (the radius set to a negative number).\n\t *\n\t * Spheres with a radius of `0` contain only their center point and are not\n\t * considered to be empty.\n\t *\n\t * @return {boolean} Whether this sphere is empty or not.\n\t */\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\t/**\n\t * Makes this sphere empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = -1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere contains the given point inclusive of\n\t * the surface of the sphere.\n\t *\n\t * @param {Vector3} point - The point to check.\n\t * @return {boolean} Whether this sphere contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\t/**\n\t * Returns the closest distance from the boundary of the sphere to the\n\t * given point. If the sphere contains the point, the distance will\n\t * be negative.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The distance to the point.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test.\n\t * @return {boolean} Whether this sphere intersects with the given one or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to test.\n\t * @return {boolean} Whether this sphere intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether this sphere intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\t/**\n\t * Clamps a point within the sphere. If the point is outside the sphere, it\n\t * will clamp it to the closest point on the edge of the sphere. Points\n\t * already inside the sphere will not be affected.\n\t *\n\t * @param {Vector3} point - The plane to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a bounding box that encloses this sphere.\n\t *\n\t * @param {Box3} target - The target box that is used to store the method's result.\n\t * @return {Box3} The bounding box that encloses this sphere.\n\t */\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Transforms this sphere with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the sphere's center by the given offset.\n\t *\n\t * @param {Vector3} offset - The offset.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this sphere to include the given point.\n\t *\n\t * @param {Vector3} point - The point to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1$6.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1$6.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1$6, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this sphere to enclose both the original sphere and the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere is equal with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test for equality.\n\t * @return {boolean} Whether this bounding sphere is equal with the given one.\n\t */\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\t/**\n\t * Returns a new sphere with copied values from this instance.\n\t *\n\t * @return {Sphere} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tradius: this.radius,\n\t\t\tcenter: this.center.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @param {Object} json - The serialized json to set the sphere from.\n\t * @return {Box3} A reference to this bounding sphere.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.radius = json.radius;\n\t\tthis.center.fromArray( json.center );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A ray that emits from an origin in a certain direction. The class is used by\n * {@link Raycaster} to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3D space the mouse is over)\n * amongst other things.\n */\nclass Ray {\n\n\t/**\n\t * Constructs a new ray.\n\t *\n\t * @param {Vector3} [origin=(0,0,0)] - The origin of the ray.\n\t * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray.\n\t */\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, -1 ) ) {\n\n\t\t/**\n\t\t * The origin of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.origin = origin;\n\n\t\t/**\n\t\t * The (normalized) direction of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.direction = direction;\n\n\t}\n\n\t/**\n\t * Sets the ray's components by copying the given values.\n\t *\n\t * @param {Vector3} origin - The origin.\n\t * @param {Vector3} direction - The direction.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given ray to this instance.\n\t *\n\t * @param {Ray} ray - The ray to copy.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector that is located at a given distance along this ray.\n\t *\n\t * @param {number} t - The distance along the ray to retrieve a position for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A position on the ray.\n\t */\n\tat( t, target ) {\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, t );\n\n\t}\n\n\t/**\n\t * Adjusts the direction of the ray to point at the given vector in world space.\n\t *\n\t * @param {Vector3} v - The target position.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Shift the origin of this ray along its direction by the given distance.\n\t *\n\t * @param {number} t - The distance along the ray to interpolate.\n\t * @return {Ray} A reference to this ray.\n\t */\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the point along this ray that is closest to the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to get the closet location on the ray for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on this ray.\n\t */\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t}\n\n\t/**\n\t * Returns the distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the squared distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\t/**\n\t * Returns the squared distance between this ray and the given line segment.\n\t *\n\t * @param {Vector3} v0 - The start point of the line segment.\n\t * @param {Vector3} v1 - The end point of the line segment.\n\t * @param {Vector3} [optionalPointOnRay] - When provided, it receives the point on this ray that is closest to the segment.\n\t * @param {Vector3} [optionalPointOnSegment] - When provided, it receives the point on the line segment that is closest to this ray.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given sphere, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if t1 is behind the ray - if so, return null\n\t\tif ( t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @return {boolean} Whether this ray intersects with the given sphere or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tif ( sphere.radius < 0 ) return false; // handle empty spheres, see #31187\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray\n\t * does not intersect with the plane.\n\t *\n\t * @param {Plane} plane - The plane to compute the distance to.\n\t * @return {?number} Whether this ray intersects with the given sphere or not.\n\t */\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given plane, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @return {boolean} Whether this ray intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given bounding box, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\t\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this ray intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given triangle, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Vector3} a - The first vertex of the triangle.\n\t * @param {Vector3} b - The second vertex of the triangle.\n\t * @param {Vector3} c - The third vertex of the triangle.\n\t * @param {boolean} backfaceCulling - Whether to use backface culling or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = -1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\t/**\n\t * Transforms this ray with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The transformation matrix.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray is equal with the given one.\n\t *\n\t * @param {Ray} ray - The ray to test for equality.\n\t * @return {boolean} Whether this ray is equal with the given one.\n\t */\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\t/**\n\t * Returns a new ray with copied values from this instance.\n\t *\n\t * @return {Ray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 4x4 matrix.\n *\n * The most common use of a 4x4 matrix in 3D computer graphics is as a transformation matrix.\n * For an introduction to transformation matrices as used in WebGL, check out [this tutorial](https://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices)\n *\n * This allows a 3D vector representing a point in 3D space to undergo\n * transformations such as translation, rotation, shear, scale, reflection,\n * orthogonal or perspective projection and so on, by being multiplied by the\n * matrix. This is known as `applying` the matrix to the vector.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix4();\n * m.set( 11, 12, 13, 14,\n * 21, 22, 23, 24,\n * 31, 32, 33, 34,\n * 41, 42, 43, 44 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31, 41,\n * 12, 22, 32, 42,\n * 13, 23, 33, 43,\n * 14, 24, 34, 44 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix4 {\n\n\t/**\n\t * Constructs a new 4x4 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 4x4 identity matrix.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix4} m - The matrix to copy.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the translation component of the given matrix\n\t * into this matrix's translation component.\n\t *\n\t * @param {Matrix4} m - The matrix to copy the translation component.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given basis vectors to this matrix.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the rotation component of the given matrix\n\t * into this matrix's rotation component.\n\t *\n\t * Note: This method does not support reflection matrices.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractRotation( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component (the upper left 3x3 matrix) of this matrix to\n\t * the rotation specified by the given Euler angles. The rest of\n\t * the matrix is set to the identity. Depending on the {@link Euler#order},\n\t * there are six possible outcomes. See [this page](https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix)\n\t * for a complete list.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component of this matrix to the rotation specified by\n\t * the given Quaternion as outlined [here](https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion)\n\t * The rest of the matrix is set to the identity.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\t/**\n\t * Sets the rotation component of the transformation matrix, looking from `eye` towards\n\t * `target`, and oriented by the up-direction.\n\t *\n\t * @param {Vector3} eye - The eye vector.\n\t * @param {Vector3} target - The target vector.\n\t * @param {Vector3} up - The up vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 4x4 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix4} a - The first matrix.\n\t * @param {Matrix4} b - The second matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * Based on the method outlined [here](http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html).\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the position component for this matrix from the given vector,\n\t * without affecting the rest of the matrix.\n\t *\n\t * @param {number|Vector3} x - The x component of the vector or alternatively the vector object.\n\t * @param {number} y - The y component of the vector.\n\t * @param {number} z - The z component of the vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the columns of this matrix by the given vector.\n\t *\n\t * @param {Vector3} v - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the maximum scale value of the three axes.\n\t *\n\t * @return {number} The maximum scale.\n\t */\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\t/**\n\t * Sets this matrix as a translation transform from the given vector.\n\t *\n\t * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @param {number} z - The amount to translate in the z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the X axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Y axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Z axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the given axis by\n\t * the given angle.\n\t *\n\t * This is a somewhat controversial but mathematically sound alternative to\n\t * rotating via Quaternions. See the discussion [here](https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199).\n\t *\n\t * @param {Vector3} axis - The normalized rotation axis.\n\t * @param {number} angle - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a scale transformation.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @param {number} z - The amount to scale in the Z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a shear transformation.\n\t *\n\t * @param {number} xy - The amount to shear X by Y.\n\t * @param {number} xz - The amount to shear X by Z.\n\t * @param {number} yx - The amount to shear Y by X.\n\t * @param {number} yz - The amount to shear Y by Z.\n\t * @param {number} zx - The amount to shear Z by X.\n\t * @param {number} zy - The amount to shear Z by Y.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the transformation composed of the given position,\n\t * rotation (Quaternion) and scale.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Decomposes this matrix into its position, rotation and scale components\n\t * and provides the result in the given objects.\n\t *\n\t * Note: Not all matrices are decomposable in this way. For example, if an\n\t * object has a non-uniformly scaled parent, then the object's world matrix\n\t * may not be decomposable, and this method may not be appropriate.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$2.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$2.elements[ 0 ] *= invSX;\n\t\t_m1$2.elements[ 1 ] *= invSX;\n\t\t_m1$2.elements[ 2 ] *= invSX;\n\n\t\t_m1$2.elements[ 4 ] *= invSY;\n\t\t_m1$2.elements[ 5 ] *= invSY;\n\t\t_m1$2.elements[ 6 ] *= invSY;\n\n\t\t_m1$2.elements[ 8 ] *= invSZ;\n\t\t_m1$2.elements[ 9 ] *= invSZ;\n\t\t_m1$2.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$2 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a perspective projection matrix. This is used internally by\n\t * {@link PerspectiveCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = near / ( far - near );\n\t\t\td = ( far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\t\td = ( -2 * far * near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = - far / ( far - near );\n\t\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a; \tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b; \tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c; \tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = -1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a orthographic projection matrix. This is used internally by\n\t * {@link OrthographicCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 / ( right - left );\n\t\tconst y = 2 / ( top - bottom );\n\n\t\tconst a = - ( right + left ) / ( right - left );\n\t\tconst b = - ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = 1 / ( far - near );\n\t\t\td = far / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = -2 / ( far - near );\n\t\t\t\td = - ( far + near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = -1 / ( far - near );\n\t\t\t\td = - near / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\t\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = a;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = y;\t\tte[ 9 ] = 0; \t\tte[ 13 ] = b;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = c;\t\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix4} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$2 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\n/**\n * A class representing Euler angles.\n *\n * Euler angles describe a rotational transformation by rotating an object on\n * its various axes in specified amounts per axis, and a specified axis\n * order.\n *\n * Iterating through an instance will yield its components (x, y, z,\n * order) in the corresponding order.\n *\n * ```js\n * const a = new THREE.Euler( 0, 1, 1.57, 'XYZ' );\n * const b = new THREE.Vector3( 1, 0, 1 );\n * b.applyEuler(a);\n * ```\n */\nclass Euler {\n\n\t/**\n\t * Constructs a new euler instance.\n\t *\n\t * @param {number} [x=0] - The angle of the x axis in radians.\n\t * @param {number} [y=0] - The angle of the y axis in radians.\n\t * @param {number} [z=0] - The angle of the z axis in radians.\n\t * @param {string} [order=Euler.DEFAULT_ORDER] - A string representing the order that the rotations are applied.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\t/**\n\t * The angle of the x axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the y axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the z axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * A string representing the order that the rotations are applied.\n\t *\n\t * @type {string}\n\t * @default 'XYZ'\n\t */\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the Euler components.\n\t *\n\t * @param {number} x - The angle of the x axis in radians.\n\t * @param {number} y - The angle of the y axis in radians.\n\t * @param {number} z - The angle of the z axis in radians.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new Euler instance with copied values from this instance.\n\t *\n\t * @return {Euler} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\t/**\n\t * Copies the values of the given Euler instance to this instance.\n\t *\n\t * @param {Euler} euler - The Euler instance to copy.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a pure rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\twarn( 'Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a normalized quaternion.\n\t *\n\t * @param {Quaternion} q - A normalized Quaternion.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$2.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$2, order, update );\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from the given vector.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\t/**\n\t * Resets the euler angle with a new order by creating a quaternion from this\n\t * euler angle and then setting this euler angle with the quaternion and the\n\t * new order.\n\t *\n\t * Warning: This discards revolution information.\n\t *\n\t * @param {string} [newOrder] - A string representing the new order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\treorder( newOrder ) {\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\t/**\n\t * Returns `true` if this Euler instance is equal with the given one.\n\t *\n\t * @param {Euler} euler - The Euler instance to test for equality.\n\t * @return {boolean} Whether this Euler instance is equal with the given one.\n\t */\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\t/**\n\t * Sets this Euler instance's components to values from the given array. The first three\n\t * entries of the array are assign to the x,y and z components. An optional fourth entry\n\t * defines the Euler order.\n\t *\n\t * @param {Array} array - An array holding the Euler component values.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this Euler instance to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the Euler components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The Euler components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\n/**\n * The default Euler angle order.\n *\n * @static\n * @type {string}\n * @default 'XYZ'\n */\nEuler.DEFAULT_ORDER = 'XYZ';\n\n/**\n * A layers object assigns an 3D object to 1 or more of 32\n * layers numbered `0` to `31` - internally the layers are stored as a\n * bit mask], and by default all 3D objects are a member of layer `0`.\n *\n * This can be used to control visibility - an object must share a layer with\n * a camera to be visible when that camera's view is\n * rendered.\n *\n * All classes that inherit from {@link Object3D} have an `layers` property which\n * is an instance of this class.\n */\nclass Layers {\n\n\t/**\n\t * Constructs a new layers instance, with membership\n\t * initially set to layer `0`.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A bit mask storing which of the 32 layers this layers object is currently\n\t\t * a member of.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\t/**\n\t * Sets membership to the given layer, and remove membership all other layers.\n\t *\n\t * @param {number} layer - The layer to set.\n\t */\n\tset( layer ) {\n\n\t\tthis.mask = ( 1 << layer | 0 ) >>> 0;\n\n\t}\n\n\t/**\n\t * Adds membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tenable( layer ) {\n\n\t\tthis.mask |= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Adds membership to all layers.\n\t */\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\t/**\n\t * Toggles the membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to toggle.\n\t */\n\ttoggle( layer ) {\n\n\t\tthis.mask ^= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Removes membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tdisable( layer ) {\n\n\t\tthis.mask &= ~ ( 1 << layer | 0 );\n\n\t}\n\n\t/**\n\t * Removes the membership from all layers.\n\t */\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if this and the given layers object have at least one\n\t * layer in common.\n\t *\n\t * @param {Layers} layers - The layers to test.\n\t * @return {boolean } Whether this and the given layers object have at least one layer in common or not.\n\t */\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given layer is enabled.\n\t *\n\t * @param {number} layer - The layer to test.\n\t * @return {boolean } Whether the given layer is enabled or not.\n\t */\n\tisEnabled( layer ) {\n\n\t\treturn ( this.mask & ( 1 << layer | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\n/**\n * Fires when the object has been added to its parent object.\n *\n * @event Object3D#added\n * @type {Object}\n */\nconst _addedEvent = { type: 'added' };\n\n/**\n * Fires when the object has been removed from its parent object.\n *\n * @event Object3D#removed\n * @type {Object}\n */\nconst _removedEvent = { type: 'removed' };\n\n/**\n * Fires when a new child object has been added.\n *\n * @event Object3D#childadded\n * @type {Object}\n */\nconst _childaddedEvent = { type: 'childadded', child: null };\n\n/**\n * Fires when a child object has been removed.\n *\n * @event Object3D#childremoved\n * @type {Object}\n */\nconst _childremovedEvent = { type: 'childremoved', child: null };\n\n/**\n * This is the base class for most objects in three.js and provides a set of\n * properties and methods for manipulating objects in 3D space.\n *\n * @augments EventDispatcher\n */\nclass Object3D extends EventDispatcher {\n\n\t/**\n\t * Constructs a new 3D object.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isObject3D = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name Object3D#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Object3D';\n\n\t\t/**\n\t\t * A reference to the parent object.\n\t\t *\n\t\t * @type {?Object3D}\n\t\t * @default null\n\t\t */\n\t\tthis.parent = null;\n\n\t\t/**\n\t\t * An array holding the child 3D objects of this instance.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.children = [];\n\n\t\t/**\n\t\t * Defines the `up` direction of the 3D object which influences\n\t\t * the orientation via methods like {@link Object3D#lookAt}.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_UP`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * Represents the object's local position.\n\t\t\t *\n\t\t\t * @name Object3D#position\n\t\t\t * @type {Vector3}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Euler angles, in radians.\n\t\t\t *\n\t\t\t * @name Object3D#rotation\n\t\t\t * @type {Euler}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Quaternions.\n\t\t\t *\n\t\t\t * @name Object3D#quaternion\n\t\t\t * @type {Quaternion}\n\t\t\t */\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local scale.\n\t\t\t *\n\t\t\t * @name Object3D#scale\n\t\t\t * @type {Vector3}\n\t\t\t * @default (1,1,1)\n\t\t\t */\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's model-view matrix.\n\t\t\t *\n\t\t\t * @name Object3D#modelViewMatrix\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's normal matrix.\n\t\t\t *\n\t\t\t * @name Object3D#normalMatrix\n\t\t\t * @type {Matrix3}\n\t\t\t */\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in local space.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in world space.\n\t\t * If the 3D object has no parent, then it's identical to the local transformation matrix\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the local matrix from position,\n\t\t * rotation and scale every frame.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the world matrix from the current local\n\t\t * matrix and the object's transformation hierarchy.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\n\t\t/**\n\t\t * When set to `true`, it calculates the world matrix in that frame and resets this property\n\t\t * to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t/**\n\t\t * The layer membership of the 3D object. The 3D object is only visible if it has\n\t\t * at least one layer in common with the camera in use. This property can also be\n\t\t * used to filter out unwanted objects in ray-intersection tests when using {@link Raycaster}.\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered into shadow maps.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.castShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is affected by shadows in the scene.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.receiveShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is honored by view frustum culling.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.frustumCulled = true;\n\n\t\t/**\n\t\t * This value allows the default rendering order of scene graph objects to be\n\t\t * overridden although opaque and transparent objects remain sorted independently.\n\t\t * When this property is set for an instance of {@link Group},all descendants\n\t\t * objects will be sorted and rendered together. Sorting is from lowest to highest\n\t\t * render order.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderOrder = 0;\n\n\t\t/**\n\t\t * An array holding the animation clips of the 3D object.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.animations = [];\n\n\t\t/**\n\t\t * Custom depth material to be used when rendering to the depth map. Can only be used\n\t\t * in context of meshes. When shadow-casting with a {@link DirectionalLight} or {@link SpotLight},\n\t\t * if you are modifying vertex positions in the vertex shader you must specify a custom depth\n\t\t * material for proper shadows.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDepthMaterial = undefined;\n\n\t\t/**\n\t\t * Same as {@link Object3D#customDepthMaterial}, but used with {@link PointLight}.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDistanceMaterial = undefined;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the 3D object. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * Applies the given transformation matrix to the object and updates the object's position,\n\t * rotation and scale.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\t/**\n\t * Applies a rotation represented by given the quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as an axis/angle couple to the 3D object.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t */\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as Euler angles to the 3D object.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t */\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as rotation matrix to the 3D object.\n\t *\n\t * @param {Matrix4} m - Although a 4x4 matrix is expected, the upper 3x3 portion must be\n\t * a pure rotation matrix (i.e, unscaled).\n\t */\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as a Quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The Quaternion\n\t */\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in world space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its X axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Y axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Z axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along the given axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its X-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Y-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Z-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's local space to world space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's word space to local space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\t/**\n\t * Rotates the object to face a point in world space.\n\t *\n\t * This method does not support objects having non-uniformly-scaled parent(s).\n\t *\n\t * @param {number|Vector3} x - The x coordinate in world space. Alternatively, a vector representing a position in world space\n\t * @param {number} [y] - The y coordinate in world space.\n\t * @param {number} [z] - The z coordinate in world space.\n\t */\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child to this 3D object. An arbitrary number of\n\t * objects may be added. Any current parent on an object passed in here will be\n\t * removed, since an object can have at most one parent.\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to add.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\terror( 'Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tobject.removeFromParent();\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t\t_childaddedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t\t_childaddedEvent.child = null;\n\n\t\t} else {\n\n\t\t\terror( 'Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given 3D object as child from this 3D object.\n\t * An arbitrary number of objects may be removed.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @param {Object3D} object - The 3D object to remove.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== -1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t\t_childremovedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childremovedEvent );\n\t\t\t_childremovedEvent.child = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes this 3D object from its current parent.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes all child objects.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tclear() {\n\n\t\treturn this.remove( ... this.children );\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child of this 3D object, while maintaining the object's world\n\t * transform. This method does not support scene graphs having non-uniformly-scaled nodes(s).\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to attach.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tobject.removeFromParent();\n\t\tobject.parent = this;\n\t\tthis.children.push( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t_childaddedEvent.child = object;\n\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t_childaddedEvent.child = null;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching ID.\n\t *\n\t * @param {number} id - The id.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching name.\n\t *\n\t * @param {string} name - The name.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns all 3D objects with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @param {Array} result - The method stores the result in this array.\n\t * @return {Array} The found 3D objects.\n\t */\n\tgetObjectsByProperty( name, value, result = [] ) {\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].getObjectsByProperty( name, value, result );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the position of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's position in world space.\n\t */\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Returns a Quaternion representing the position of the 3D object in world space.\n\t *\n\t * @param {Quaternion} target - The target Quaternion the result is stored to.\n\t * @return {Quaternion} The 3D object's rotation in world space.\n\t */\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the scale of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's scale in world space.\n\t */\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\t/**\n\t * Abstract method to get intersections between a casted ray and this\n\t * 3D object. Renderable 3D objects such as {@link Mesh}, {@link Line} or {@link Points}\n\t * implement this method in order to use raycasting.\n\t *\n\t * @abstract\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - An array holding the result of the method.\n\t */\n\traycast( /* raycaster, intersects */ ) {}\n\n\t/**\n\t * Executes the callback on this 3D object and all descendants.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for visible 3D objects.\n\t * Descendants of invisible 3D objects are not traversed.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for all ancestors.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in local space by computing it from the current\n\t * position, rotation and scale values.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in world space of this 3D objects and its descendants.\n\t *\n\t * To ensure correct results, this method also recomputes the 3D object's transformation matrix in\n\t * local space. The computation of the local and world matrix can be controlled with the\n\t * {@link Object3D#matrixAutoUpdate} and {@link Object3D#matrixWorldAutoUpdate} flags which are both\n\t * `true` by default. Set these flags to `false` if you need more control over the update matrix process.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even\n\t * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.\n\t */\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// make sure descendants are updated if required\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tchild.updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * An alternative version of {@link Object3D#updateMatrixWorld} with more control over the\n\t * update of ancestor and descendant nodes.\n\t *\n\t * @param {boolean} [updateParents=false] Whether ancestor nodes should be updated or not.\n\t * @param {boolean} [updateChildren=false] Whether descendant nodes should be updated or not.\n\t */\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// make sure descendants are updated\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the 3D object into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized 3D object.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\t\tobject.up = this.up.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\tif ( this.isBatchedMesh ) {\n\n\t\t\tobject.type = 'BatchedMesh';\n\t\t\tobject.perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\t\tobject.sortObjects = this.sortObjects;\n\n\t\t\tobject.drawRanges = this._drawRanges;\n\t\t\tobject.reservedRanges = this._reservedRanges;\n\n\t\t\tobject.geometryInfo = this._geometryInfo.map( info => ( {\n\t\t\t\t...info,\n\t\t\t\tboundingBox: info.boundingBox ? info.boundingBox.toJSON() : undefined,\n\t\t\t\tboundingSphere: info.boundingSphere ? info.boundingSphere.toJSON() : undefined\n\t\t\t} ) );\n\t\t\tobject.instanceInfo = this._instanceInfo.map( info => ( { ...info } ) );\n\n\t\t\tobject.availableInstanceIds = this._availableInstanceIds.slice();\n\t\t\tobject.availableGeometryIds = this._availableGeometryIds.slice();\n\n\t\t\tobject.nextIndexStart = this._nextIndexStart;\n\t\t\tobject.nextVertexStart = this._nextVertexStart;\n\t\t\tobject.geometryCount = this._geometryCount;\n\n\t\t\tobject.maxInstanceCount = this._maxInstanceCount;\n\t\t\tobject.maxVertexCount = this._maxVertexCount;\n\t\t\tobject.maxIndexCount = this._maxIndexCount;\n\n\t\t\tobject.geometryInitialized = this._geometryInitialized;\n\n\t\t\tobject.matricesTexture = this._matricesTexture.toJSON( meta );\n\n\t\t\tobject.indirectTexture = this._indirectTexture.toJSON( meta );\n\n\t\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\t\tobject.colorsTexture = this._colorsTexture.toJSON( meta );\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tobject.boundingSphere = this.boundingSphere.toJSON();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tobject.boundingBox = this.boundingBox.toJSON();\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new 3D object with copied values from this instance.\n\t *\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are also cloned.\n\t * @return {Object3D} A clone of this instance.\n\t */\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\t/**\n\t * Copies the values of the given 3D object to this instance.\n\t *\n\t * @param {Object3D} source - The 3D object to copy.\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are cloned.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\tthis.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.animations = source.animations.slice();\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * The default up direction for objects, also used as the default\n * position for {@link DirectionalLight} and {@link HemisphereLight}.\n *\n * @static\n * @type {Vector3}\n * @default (0,1,0)\n */\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\n\n/**\n * The default setting for {@link Object3D#matrixAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\n\n/**\n * The default setting for {@link Object3D#matrixWorldAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$2 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nconst _v40 = /*@__PURE__*/ new Vector4();\nconst _v41 = /*@__PURE__*/ new Vector4();\nconst _v42 = /*@__PURE__*/ new Vector4();\n\n/**\n * A geometric triangle as defined by three vectors representing its three corners.\n */\nclass Triangle {\n\n\t/**\n\t * Constructs a new triangle.\n\t *\n\t * @param {Vector3} [a=(0,0,0)] - The first corner of the triangle.\n\t * @param {Vector3} [b=(0,0,0)] - The second corner of the triangle.\n\t * @param {Vector3} [c=(0,0,0)] - The third corner of the triangle.\n\t */\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\t/**\n\t\t * The first corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.a = a;\n\n\t\t/**\n\t\t * The second corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.b = b;\n\n\t\t/**\n\t\t * The third corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.c = c;\n\n\t}\n\n\t/**\n\t * Computes the normal vector of a triangle.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\t// if the triangle is degenerate then we can't contain a point\n\t\tif ( this.getBarycoord( point, a, b, c, _v3$2 ) === null ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn ( _v3$2.x >= 0 ) && ( _v3$2.y >= 0 ) && ( ( _v3$2.x + _v3$2.y ) <= 1 );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} p1 - The first corner of the triangle.\n\t * @param {Vector3} p2 - The second corner of the triangle.\n\t * @param {Vector3} p3 - The third corner of the triangle.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tstatic getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {\n\n\t\tif ( this.getBarycoord( point, p1, p2, p3, _v3$2 ) === null ) {\n\n\t\t\ttarget.x = 0;\n\t\t\ttarget.y = 0;\n\t\t\tif ( 'z' in target ) target.z = 0;\n\t\t\tif ( 'w' in target ) target.w = 0;\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( v1, _v3$2.x );\n\t\ttarget.addScaledVector( v2, _v3$2.y );\n\t\ttarget.addScaledVector( v3, _v3$2.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given attribute and indices.\n\t *\n\t * @param {BufferAttribute} attr - The attribute to interpolate.\n\t * @param {number} i1 - Index of first vertex.\n\t * @param {number} i2 - Index of second vertex.\n\t * @param {number} i3 - Index of third vertex.\n\t * @param {Vector3} barycoord - The barycoordinate value to use to interpolate.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The interpolated attribute value.\n\t */\n\tstatic getInterpolatedAttribute( attr, i1, i2, i3, barycoord, target ) {\n\n\t\t_v40.setScalar( 0 );\n\t\t_v41.setScalar( 0 );\n\t\t_v42.setScalar( 0 );\n\n\t\t_v40.fromBufferAttribute( attr, i1 );\n\t\t_v41.fromBufferAttribute( attr, i2 );\n\t\t_v42.fromBufferAttribute( attr, i3 );\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( _v40, barycoord.x );\n\t\ttarget.addScaledVector( _v41, barycoord.y );\n\t\ttarget.addScaledVector( _v42, barycoord.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given values.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given array values.\n\t *\n\t * @param {Array} points - An array with 3D points.\n\t * @param {number} i0 - The array index representing the first corner of the triangle.\n\t * @param {number} i1 - The array index representing the second corner of the triangle.\n\t * @param {number} i2 - The array index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given attribute values.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute with 3D points data.\n\t * @param {number} i0 - The attribute index representing the first corner of the triangle.\n\t * @param {number} i1 - The attribute index representing the second corner of the triangle.\n\t * @param {number} i2 - The attribute index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new triangle with copied values from this instance.\n\t *\n\t * @return {Triangle} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given triangle to this instance.\n\t *\n\t * @param {Triangle} triangle - The triangle to copy.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the area of the triangle.\n\t *\n\t * @return {number} The triangle's area.\n\t */\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\t/**\n\t * Computes the midpoint of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's midpoint.\n\t */\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\t/**\n\t * Computes the normal of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes a plane the triangle lies within.\n\t *\n\t * @param {Plane} target - The target vector that is used to store the method's result.\n\t * @return {Plane} The plane the triangle lies within.\n\t */\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tgetInterpolation( point, v1, v2, v3, target ) {\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this triangle intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\t/**\n\t * Returns the closest point on the triangle to the given point.\n\t *\n\t * @param {Vector3} p - The point to compute the closest point for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the triangle.\n\t */\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle is equal with the given one.\n\t *\n\t * @param {Triangle} triangle - The triangle to test for equality.\n\t * @return {boolean} Whether this triangle is equal with the given one.\n\t */\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\n/**\n * A Color instance is represented by RGB components in the linear working\n * color space, which defaults to `LinearSRGBColorSpace`. Inputs\n * conventionally using `SRGBColorSpace` (such as hexadecimals and CSS\n * strings) are converted to the working color space automatically.\n *\n * ```js\n * // converted automatically from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setHex( 0x112233 );\n * ```\n * Source color spaces may be specified explicitly, to ensure correct conversions.\n * ```js\n * // assumed already LinearSRGBColorSpace; no conversion\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5 );\n *\n * // converted explicitly from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5, SRGBColorSpace );\n * ```\n * If THREE.ColorManagement is disabled, no conversions occur. For details,\n * see Color management. Iterating through a Color instance will yield\n * its components (r, g, b) in the corresponding order. A Color can be initialised\n * in any of the following ways:\n * ```js\n * //empty constructor - will default white\n * const color1 = new THREE.Color();\n *\n * //Hexadecimal color (recommended)\n * const color2 = new THREE.Color( 0xff0000 );\n *\n * //RGB string\n * const color3 = new THREE.Color(\"rgb(255, 0, 0)\");\n * const color4 = new THREE.Color(\"rgb(100%, 0%, 0%)\");\n *\n * //X11 color name - all 140 color names are supported.\n * //Note the lack of CamelCase in the name\n * const color5 = new THREE.Color( 'skyblue' );\n * //HSL string\n * const color6 = new THREE.Color(\"hsl(0, 100%, 50%)\");\n *\n * //Separate RGB values between 0 and 1\n * const color7 = new THREE.Color( 1, 0, 0 );\n * ```\n */\nclass Color {\n\n\t/**\n\t * Constructs a new color.\n\t *\n\t * Note that standard method of specifying color in three.js is with a hexadecimal triplet,\n\t * and that method is used throughout the rest of the documentation.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t */\n\tconstructor( r, g, b ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isColor = true;\n\n\t\t/**\n\t\t * The red component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.r = 1;\n\n\t\t/**\n\t\t * The green component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.g = 1;\n\n\t\t/**\n\t\t * The blue component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.b = 1;\n\n\t\treturn this.set( r, g, b );\n\n\t}\n\n\t/**\n\t * Sets the colors's components from the given values.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t * @return {Color} A reference to this color.\n\t */\n\tset( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\n\t\t\tconst value = r;\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.setRGB( r, g, b );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the colors's components to the given scalar value.\n\t *\n\t * @param {number} scalar - The scalar value.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a hexadecimal value.\n\t *\n\t * @param {number} hex - The hexadecimal value.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} r - Red channel value between `0.0` and `1.0`.\n\t * @param {number} g - Green channel value between `0.0` and `1.0`.\n\t * @param {number} b - Blue channel value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a CSS-style string. For example, `rgb(250, 0,0)`,\n\t * `rgb(100%, 0%, 0%)`, `hsl(0, 100%, 50%)`, `#ff0000`, `#f00`, or `red` ( or\n\t * any [X11 color name](https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart) -\n\t * all 140 color names are supported).\n\t *\n\t * @param {string} style - Color as a CSS-style string.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\twarn( 'Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^(\\w+)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 1 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 2 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 3 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 1 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 2 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 3 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL(\n\t\t\t\t\t\t\tparseFloat( color[ 1 ] ) / 360,\n\t\t\t\t\t\t\tparseFloat( color[ 2 ] ) / 100,\n\t\t\t\t\t\t\tparseFloat( color[ 3 ] ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\twarn( 'Color: Unknown color model ' + style );\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\treturn this.setRGB(\n\t\t\t\t\tparseInt( hex.charAt( 0 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 1 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 2 ), 16 ) / 15,\n\t\t\t\t\tcolorSpace\n\t\t\t\t);\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\treturn this.setHex( parseInt( hex, 16 ), colorSpace );\n\n\t\t\t} else {\n\n\t\t\t\twarn( 'Color: Invalid hex color ' + style );\n\n\t\t\t}\n\n\t\t} else if ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a color name. Faster than {@link Color#setStyle} if\n\t * you don't need the other CSS-style formats.\n\t *\n\t * For convenience, the list of names is exposed in `Color.NAMES` as a hash.\n\t * ```js\n\t * Color.NAMES.aliceblue // returns 0xF0F8FF\n\t * ```\n\t *\n\t * @param {string} style - The color name.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\twarn( 'Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new color with copied values from this instance.\n\t *\n\t * @return {Color} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\t/**\n\t * Copies the values of the given color to this instance.\n\t *\n\t * @param {Color} color - The color to copy.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {number} The hexadecimal value.\n\t */\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\treturn Math.round( clamp( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp( _color.b * 255, 0, 255 ) );\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color as a string (for example, 'FFFFFF').\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The hexadecimal value as a string.\n\t */\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( -6 );\n\n\t}\n\n\t/**\n\t * Converts the colors RGB values into the HSL format and stores them into the\n\t * given target object.\n\t *\n\t * @param {{h:number,s:number,l:number}} target - The target object that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {{h:number,s:number,l:number}} The HSL representation of this color.\n\t */\n\tgetHSL( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the RGB values of this color and stores them into the given target object.\n\t *\n\t * @param {Color} target - The target color that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} The RGB representation of this color.\n\t */\n\tgetRGB( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\ttarget.r = _color.r;\n\t\ttarget.g = _color.g;\n\t\ttarget.b = _color.b;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the value of this color as a CSS style string. Example: `rgb(255,0,0)`.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The CSS representation of this color.\n\t */\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`;\n\n\t\t}\n\n\t\treturn `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`;\n\n\t}\n\n\t/**\n\t * Adds the given HSL values to this color's values.\n\t * Internally, this converts the color's RGB values to HSL, adds HSL\n\t * and then converts the color back to RGB.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @return {Color} A reference to this color.\n\t */\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\treturn this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l );\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given color to the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to add.\n\t * @return {Color} A reference to this color.\n\t */\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given colors and stores the result in this instance.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @return {Color} A reference to this color.\n\t */\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Color} A reference to this color.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the RGB values of the given color from the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to subtract.\n\t * @return {Color} A reference to this color.\n\t */\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the RGB values of the given color with the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's RGB values toward the RGB values of the\n\t * given color. The alpha argument can be thought of as the ratio between\n\t * the two colors, where `0.0` is this color and `1.0` is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given colors and stores the result in this instance.\n\t * The alpha argument can be thought of as the ratio between the two colors, where `0.0`\n\t * is the first and `1.0` is the second color.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's HSL values toward the HSL values of the\n\t * given color. It differs from {@link Color#lerp} by not interpolating straight\n\t * from one color to the other, but instead going through all the hues in between\n\t * those two colors. The alpha argument can be thought of as the ratio between\n\t * the two colors, where 0.0 is this color and 1.0 is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the color's RGB components from the given 3D vector.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetFromVector3( v ) {\n\n\t\tthis.r = v.x;\n\t\tthis.g = v.y;\n\t\tthis.b = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this color with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix.\n\t * @return {Color} A reference to this color.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\t\tconst e = m.elements;\n\n\t\tthis.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b;\n\t\tthis.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b;\n\t\tthis.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this color is equal with the given one.\n\t *\n\t * @param {Color} c - The color to test for equality.\n\t * @return {boolean} Whether this bounding color is equal with the given one.\n\t */\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\t/**\n\t * Sets this color's RGB components from the given array.\n\t *\n\t * @param {Array} array - An array holding the RGB values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the RGB components of this color to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the color components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The color components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this color from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding color data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the color\n\t * as a hexadecimal value.\n\t *\n\t * @return {number} The hexadecimal value.\n\t */\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nconst _color = /*@__PURE__*/ new Color();\n\n/**\n * A dictionary with X11 color names.\n *\n * Note that multiple words such as Dark Orange become the string 'darkorange'.\n *\n * @static\n * @type {Object}\n */\nColor.NAMES = _colorKeywords;\n\nlet _materialId = 0;\n\n/**\n * Abstract base class for materials.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Material extends EventDispatcher {\n\n\t/**\n\t * Constructs a new material.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMaterial = true;\n\n\t\t/**\n\t\t * The ID of the material.\n\t\t *\n\t\t * @name Material#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _materialId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Material';\n\n\t\t/**\n\t\t * Defines the blending type of the material.\n\t\t *\n\t\t * It must be set to `CustomBlending` if custom blending properties like\n\t\t * {@link Material#blendSrc}, {@link Material#blendDst} or {@link Material#blendEquation}\n\t\t * should have any effect.\n\t\t *\n\t\t * @type {(NoBlending|NormalBlending|AdditiveBlending|SubtractiveBlending|MultiplyBlending|CustomBlending)}\n\t\t * @default NormalBlending\n\t\t */\n\t\tthis.blending = NormalBlending;\n\n\t\t/**\n\t\t * Defines which side of faces will be rendered - front, back or both.\n\t\t *\n\t\t * @type {(FrontSide|BackSide|DoubleSide)}\n\t\t * @default FrontSide\n\t\t */\n\t\tthis.side = FrontSide;\n\n\t\t/**\n\t\t * If set to `true`, vertex colors should be used.\n\t\t *\n\t\t * The engine supports RGB and RGBA vertex colors depending on whether a three (RGB) or\n\t\t * four (RGBA) component color buffer attribute is used.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.vertexColors = false;\n\n\t\t/**\n\t\t * Defines how transparent the material is.\n\t\t * A value of `0.0` indicates fully transparent, `1.0` is fully opaque.\n\t\t *\n\t\t * If the {@link Material#transparent} is not set to `true`,\n\t\t * the material will remain fully opaque and this value will only affect its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.opacity = 1;\n\n\t\t/**\n\t\t * Defines whether this material is transparent. This has an effect on\n\t\t * rendering as transparent objects need special treatment and are rendered\n\t\t * after non-transparent objects.\n\t\t *\n\t\t * When set to true, the extent to which the material is transparent is\n\t\t * controlled by {@link Material#opacity}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparent = false;\n\n\t\t/**\n\t\t * Enables alpha hashed transparency, an alternative to {@link Material#transparent} or\n\t\t * {@link Material#alphaTest}. The material will not be rendered if opacity is lower than\n\t\t * a random threshold. Randomization introduces some grain or noise, but approximates alpha\n\t\t * blending without the associated problems of sorting. Using TAA can reduce the resulting noise.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaHash = false;\n\n\t\t/**\n\t\t * Defines the blending source factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default SrcAlphaFactor\n\t\t */\n\t\tthis.blendSrc = SrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending destination factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default OneMinusSrcAlphaFactor\n\t\t */\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending equation.\n\t\t *\n\t\t * @type {(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default AddEquation\n\t\t */\n\t\tthis.blendEquation = AddEquation;\n\n\t\t/**\n\t\t * Defines the blending source alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendSrcAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending destination alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendDstAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending equation of the alpha channel.\n\t\t *\n\t\t * @type {?(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendEquationAlpha = null;\n\n\t\t/**\n\t\t * Represents the RGB values of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantColor` or `OneMinusConstantColor`.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.blendColor = new Color( 0, 0, 0 );\n\n\t\t/**\n\t\t * Represents the alpha value of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantAlpha` or `OneMinusConstantAlpha`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.blendAlpha = 0;\n\n\t\t/**\n\t\t * Defines the depth function.\n\t\t *\n\t\t * @type {(NeverDepth|AlwaysDepth|LessDepth|LessEqualDepth|EqualDepth|GreaterEqualDepth|GreaterDepth|NotEqualDepth)}\n\t\t * @default LessEqualDepth\n\t\t */\n\t\tthis.depthFunc = LessEqualDepth;\n\n\t\t/**\n\t\t * Whether to have depth test enabled when rendering this material.\n\t\t * When the depth test is disabled, the depth write will also be implicitly disabled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthTest = true;\n\n\t\t/**\n\t\t * Whether rendering this material has any effect on the depth buffer.\n\t\t *\n\t\t * When drawing 2D overlays it can be useful to disable the depth writing in\n\t\t * order to layer several things together without creating z-index artifacts.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthWrite = true;\n\n\t\t/**\n\t\t * The bit mask to use when writing to the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilWriteMask = 0xff;\n\n\t\t/**\n\t\t * The stencil comparison function to use.\n\t\t *\n\t\t * @type {NeverStencilFunc|LessStencilFunc|EqualStencilFunc|LessEqualStencilFunc|GreaterStencilFunc|NotEqualStencilFunc|GreaterEqualStencilFunc|AlwaysStencilFunc}\n\t\t * @default AlwaysStencilFunc\n\t\t */\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\n\t\t/**\n\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.stencilRef = 0;\n\n\t\t/**\n\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilFuncMask = 0xff;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns `false`.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` but the depth test fails.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` and the depth test passes.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZPass = KeepStencilOp;\n\n\t\t/**\n\t\t * Whether stencil operations are performed against the stencil buffer. In\n\t\t * order to perform writes or comparisons against the stencil buffer this\n\t\t * value must be `true`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilWrite = false;\n\n\t\t/**\n\t\t * User-defined clipping planes specified as THREE.Plane objects in world\n\t\t * space. These planes apply to the objects this material is attached to.\n\t\t * Points in space whose signed distance to the plane is negative are clipped\n\t\t * (not rendered). This requires {@link WebGLRenderer#localClippingEnabled} to\n\t\t * be `true`.\n\t\t *\n\t\t * @type {?Array}\n\t\t * @default null\n\t\t */\n\t\tthis.clippingPlanes = null;\n\n\t\t/**\n\t\t * Changes the behavior of clipping planes so that only their intersection is\n\t\t * clipped, rather than their union.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipIntersection = false;\n\n\t\t/**\n\t\t * Defines whether to clip shadows according to the clipping planes specified\n\t\t * on this material.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipShadows = false;\n\n\t\t/**\n\t\t * Defines which side of faces cast shadows. If `null`, the side casting shadows\n\t\t * is determined as follows:\n\t\t *\n\t\t * - When {@link Material#side} is set to `FrontSide`, the back side cast shadows.\n\t\t * - When {@link Material#side} is set to `BackSide`, the front side cast shadows.\n\t\t * - When {@link Material#side} is set to `DoubleSide`, both sides cast shadows.\n\t\t *\n\t\t * @type {?(FrontSide|BackSide|DoubleSide)}\n\t\t * @default null\n\t\t */\n\t\tthis.shadowSide = null;\n\n\t\t/**\n\t\t * Whether to render the material's color.\n\t\t *\n\t\t * This can be used in conjunction with {@link Object3D#renderOder} to create invisible\n\t\t * objects that occlude other objects.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.colorWrite = true;\n\n\t\t/**\n\t\t * Override the renderer's default precision for this material.\n\t\t *\n\t\t * @type {?('highp'|'mediump'|'lowp')}\n\t\t * @default null\n\t\t */\n\t\tthis.precision = null;\n\n\t\t/**\n\t\t * Whether to use polygon offset or not. When enabled, each fragment's depth value will\n\t\t * be offset after it is interpolated from the depth values of the appropriate vertices.\n\t\t * The offset is added before the depth test is performed and before the value is written\n\t\t * into the depth buffer.\n\t\t *\n\t\t * Can be useful for rendering hidden-line images, for applying decals to surfaces, and for\n\t\t * rendering solids with highlighted edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.polygonOffset = false;\n\n\t\t/**\n\t\t * Specifies a scale factor that is used to create a variable depth offset for each polygon.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetFactor = 0;\n\n\t\t/**\n\t\t * Is multiplied by an implementation-specific value to create a constant depth offset.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\t/**\n\t\t * Whether to apply dithering to the color to remove the appearance of banding.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.dithering = false;\n\n\t\t/**\n\t\t * Whether alpha to coverage should be enabled or not. Can only be used with MSAA-enabled contexts\n\t\t * (meaning when the renderer was created with *antialias* parameter set to `true`). Enabling this\n\t\t * will smooth aliasing on clip plane edges and alphaTest-clipped edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaToCoverage = false;\n\n\t\t/**\n\t\t * Whether to premultiply the alpha (transparency) value.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultipliedAlpha = false;\n\n\t\t/**\n\t\t * Whether double-sided, transparent objects should be rendered with a single pass or not.\n\t\t *\n\t\t * The engine renders double-sided, transparent objects with two draw calls (back faces first,\n\t\t * then front faces) to mitigate transparency artifacts. There are scenarios however where this\n\t\t * approach produces no quality gains but still doubles draw calls e.g. when rendering flat\n\t\t * vegetation like grass sprites. In these cases, set the `forceSinglePass` flag to `true` to\n\t\t * disable the two pass rendering to avoid performance issues.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.forceSinglePass = false;\n\n\t\t/**\n\t\t * Whether it's possible to override the material with {@link Scene#overrideMaterial} or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.allowOverride = true;\n\n\t\t/**\n\t\t * Defines whether 3D objects using this material are visible.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * Defines whether this material is tone mapped according to the renderer's tone mapping setting.\n\t\t *\n\t\t * It is ignored when rendering to a render target or using post processing or when using\n\t\t * `WebGPURenderer`. In all these cases, all materials are honored by tone mapping.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.toneMapped = true;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the Material. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Material#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\t/**\n\t * Sets the alpha value to be used when running an alpha test. The material\n\t * will not be rendered if the opacity is lower than this value.\n\t *\n\t * @type {number}\n\t * @readonly\n\t * @default 0\n\t */\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\t/**\n\t * An optional callback that is executed immediately before the material is used to render a 3D object.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\t/**\n\t * An optional callback that is executed immediately before the shader\n\t * program is compiled. This function is called with the shader source code\n\t * as a parameter. Useful for the modification of built-in materials.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}. The\n\t * recommended approach when customizing materials is to use `WebGPURenderer` with the new\n\t * Node Material system and [TSL](https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language).\n\t *\n\t * @param {{vertexShader:string,fragmentShader:string,uniforms:Object}} shaderobject - The object holds the uniforms and the vertex and fragment shader source.\n\t * @param {WebGLRenderer} renderer - A reference to the renderer.\n\t */\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\t/**\n\t * In case {@link Material#onBeforeCompile} is used, this callback can be used to identify\n\t * values of settings used in `onBeforeCompile()`, so three.js can reuse a cached\n\t * shader or recompile the shader for this material as needed.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @return {string} The custom program cache key.\n\t */\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\t/**\n\t * This method can be used to set default values from parameter objects.\n\t * It is a generic implementation so it can be used with different types\n\t * of materials.\n\t *\n\t * @param {Object} [values] - The material values to set.\n\t */\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Material: parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Material: '${ key }' is not a property of THREE.${ this.type }.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the material into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized material.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity !== undefined && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.sheenColorMap && this.sheenColorMap.isTexture ) {\n\n\t\t\tdata.sheenColorMap = this.sheenColorMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.sheenRoughnessMap && this.sheenRoughnessMap.isTexture ) {\n\n\t\t\tdata.sheenRoughnessMap = this.sheenRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.dispersion !== undefined ) data.dispersion = this.dispersion;\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy;\n\t\tif ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation;\n\n\t\tif ( this.anisotropyMap && this.anisotropyMap.isTexture ) {\n\n\t\t\tdata.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapRotation !== undefined ) data.envMapRotation = this.envMapRotation.toArray();\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors === true ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = true;\n\n\t\tif ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc;\n\t\tif ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst;\n\t\tif ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation;\n\t\tif ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha;\n\t\tif ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha;\n\t\tif ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha;\n\t\tif ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex();\n\t\tif ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha;\n\n\t\tif ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc;\n\t\tif ( this.depthTest === false ) data.depthTest = this.depthTest;\n\t\tif ( this.depthWrite === false ) data.depthWrite = this.depthWrite;\n\t\tif ( this.colorWrite === false ) data.colorWrite = this.colorWrite;\n\n\t\tif ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask;\n\t\tif ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc;\n\t\tif ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef;\n\t\tif ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask;\n\t\tif ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail;\n\t\tif ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail;\n\t\tif ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass;\n\t\tif ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaHash === true ) data.alphaHash = true;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = true;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true;\n\t\tif ( this.forceSinglePass === true ) data.forceSinglePass = true;\n\n\t\tif ( this.wireframe === true ) data.wireframe = true;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new material with copied values from this instance.\n\t *\n\t * @return {Material} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given material to this instance.\n\t *\n\t * @param {Material} source - The material to copy.\n\t * @return {Material} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\tthis.blendColor.copy( source.blendColor );\n\t\tthis.blendAlpha = source.blendAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaHash = source.alphaHash;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.forceSinglePass = source.forceSinglePass;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Material#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the material has been disposed of.\n\t\t *\n\t\t * @event Material#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the material\n\t * needs to be recompiled.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometries in a simple shaded (flat or wireframe) way.\n *\n * This material is not affected by lights.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshBasicMaterial\n */\nclass MeshBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshBasicMaterial = true;\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < -27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < -14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= -8388609; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n/**\n * Returns a half precision floating point value (FP16) from the given single\n * precision floating point value (FP32).\n *\n * @param {number} val - A single precision floating point value.\n * @return {number} The FP16 value.\n */\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) warn( 'DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, -65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n/**\n * Returns a single precision floating point value (FP32) from the given half\n * precision floating point value (FP16).\n *\n * @param {number} val - A half precision floating point value.\n * @return {number} The FP32 value.\n */\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\n/**\n * A class containing utility functions for data.\n *\n * @hideconstructor\n */\nclass DataUtils {\n\n\t/**\n\t * Returns a half precision floating point value (FP16) from the given single\n\t * precision floating point value (FP32).\n\t *\n\t * @param {number} val - A single precision floating point value.\n\t * @return {number} The FP16 value.\n\t */\n\tstatic toHalfFloat( val ) {\n\n\t\treturn toHalfFloat( val );\n\n\t}\n\n\t/**\n\t * Returns a single precision floating point value (FP32) from the given half\n\t * precision floating point value (FP16).\n\t *\n\t * @param {number} val - A half precision floating point value.\n\t * @return {number} The FP32 value.\n\t */\n\tstatic fromHalfFloat( val ) {\n\n\t\treturn fromHalfFloat( val );\n\n\t}\n\n}\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nlet _id$2 = 0;\n\n/**\n * This class stores data for an attribute (such as vertex positions, face\n * indices, normals, colors, UVs, and any custom attributes ) associated with\n * a geometry, which allows for more efficient passing of data to the GPU.\n *\n * When working with vector-like data, the `fromBufferAttribute( attribute, index )`\n * helper methods on vector and color class might be helpful. E.g. {@link Vector3#fromBufferAttribute}.\n */\nclass BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized = false ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferAttribute = true;\n\n\t\t/**\n\t\t * The ID of the buffer attribute.\n\t\t *\n\t\t * @name BufferAttribute#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$2 ++ } );\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The array holding the attribute data. It should have `itemSize * numVertices`\n\t\t * elements, where `numVertices` is the number of vertices in the associated geometry.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of values of the array that should be associated with a particular vertex.\n\t\t * For instance, if this attribute is storing a 3-component vector (such as a position,\n\t\t * normal, or color), then the value should be `3`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * Represents the number of items this buffer attribute stores. It is internally computed\n\t\t * by dividing the `array` length by the `itemSize`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `array` is an instance of `UInt16Array`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the array data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * Configures the bound GPU type for use in shaders.\n\t\t *\n\t\t * Note: this only has an effect for integer arrays and is not configurable for float arrays.\n\t\t * For lower precision float types, use `Float16BufferAttribute`.\n\t\t *\n\t\t * @type {(FloatType|IntType)}\n\t\t * @default FloatType\n\t\t */\n\t\tthis.gpuType = FloatType;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute\n\t * array data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this buffer attribute.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {BufferAttribute} A reference to this buffer attribute.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given buffer attribute to this instance.\n\t *\n\t * @param {BufferAttribute} source - The buffer attribute to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\t\tthis.gpuType = source.gpuType;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given buffer attribute to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this buffer attribute.\n\t * @param {BufferAttribute} attribute - The buffer attribute to copy from.\n\t * @param {number} index2 - The source index into the given buffer attribute.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given array data into this buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} array - The array to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 matrix to the given attribute. Works with\n\t * item size `2` and `3`.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this buffer attribute's array.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.itemSize + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.array[ index * this.itemSize + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the attribute array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when attribute data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * @return {BufferAttribute} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8Clamped` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint8ClampedArray)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float16` buffer attribute with\n * a plain `Array` instance.\n *\n * This class automatically converts to and from FP16 via `Uint16Array` since `Float16Array`\n * browser support is still problematic.\n *\n * @augments BufferAttribute\n */\nclass Float16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = fromHalfFloat( this.array[ index * this.itemSize ] );\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = toHalfFloat( x );\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] );\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] );\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] );\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\t\tthis.array[ index + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Float32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Float32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$1 = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\n/**\n * A representation of mesh, line, or point geometry. Includes vertex\n * positions, face indices, normals, colors, UVs, and custom attributes\n * within buffers, reducing the cost of passing all this data to the GPU.\n *\n * ```js\n * const geometry = new THREE.BufferGeometry();\n * // create a simple square shape. We duplicate the top left and bottom right\n * // vertices because each vertex needs to appear once per triangle.\n * const vertices = new Float32Array( [\n * \t-1.0, -1.0, 1.0, // v0\n * \t 1.0, -1.0, 1.0, // v1\n * \t 1.0, 1.0, 1.0, // v2\n *\n * \t 1.0, 1.0, 1.0, // v3\n * \t-1.0, 1.0, 1.0, // v4\n * \t-1.0, -1.0, 1.0 // v5\n * ] );\n * // itemSize = 3 because there are 3 values (components) per vertex\n * geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\n * const material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * ```\n *\n * @augments EventDispatcher\n */\nclass BufferGeometry extends EventDispatcher {\n\n\t/**\n\t * Constructs a new geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferGeometry = true;\n\n\t\t/**\n\t\t * The ID of the geometry.\n\t\t *\n\t\t * @name BufferGeometry#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$1 ++ } );\n\n\t\t/**\n\t\t * The UUID of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\t/**\n\t\t * Allows for vertices to be re-used across multiple triangles; this is\n\t\t * called using \"indexed triangles\". Each triangle is associated with the\n\t\t * indices of three vertices. This attribute therefore stores the index of\n\t\t * each vertex for each triangular face. If this attribute is not set, the\n\t\t * renderer assumes that each three contiguous positions represent a single triangle.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.index = null;\n\n\t\t/**\n\t\t * A (storage) buffer attribute which was generated with a compute shader and\n\t\t * now defines indirect draw calls.\n\t\t *\n\t\t * Can only be used with {@link WebGPURenderer} and a WebGPU backend.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.indirect = null;\n\n\t\t/**\n\t\t * This dictionary has as id the name of the attribute to be set and as value\n\t\t * the buffer attribute to set it to. Rather than accessing this property directly,\n\t\t * use `setAttribute()` and `getAttribute()` to access attributes of this geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.attributes = {};\n\n\t\t/**\n\t\t * This dictionary holds the morph targets of the geometry.\n\t\t *\n\t\t * Note: Once the geometry has been rendered, the morph attribute data cannot\n\t\t * be changed. You will have to call `dispose()?, and create a new geometry instance.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.morphAttributes = {};\n\n\t\t/**\n\t\t * Used to control the morph target behavior; when set to `true`, the morph\n\t\t * target data is treated as relative offsets, rather than as absolute\n\t\t * positions/normals.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.morphTargetsRelative = false;\n\n\t\t/**\n\t\t * Split the geometry into groups, each of which will be rendered in a\n\t\t * separate draw call. This allows an array of materials to be used with the geometry.\n\t\t *\n\t\t * Use `addGroup()` and `clearGroups()` to edit groups, rather than modifying this array directly.\n\t\t *\n\t\t * Every vertex and index must belong to exactly one group — groups must not share vertices or\n\t\t * indices, and must not leave vertices or indices unused.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.groups = [];\n\n\t\t/**\n\t\t * Bounding box for the geometry which can be calculated with `computeBoundingBox()`.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * Bounding sphere for the geometry which can be calculated with `computeBoundingSphere()`.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Determines the part of the geometry to render. This should not be set directly,\n\t\t * instead use `setDrawRange()`.\n\t\t *\n\t\t * @type {{start:number,count:number}}\n\t\t */\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the geometry.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * Returns the index of this geometry.\n\t *\n\t * @return {?BufferAttribute} The index. Returns `null` if no index is defined.\n\t */\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\t/**\n\t * Sets the given index to this geometry.\n\t *\n\t * @param {Array|BufferAttribute} index - The index to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given indirect attribute to this geometry.\n\t *\n\t * @param {BufferAttribute} indirect - The attribute holding indirect draw calls.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndirect( indirect ) {\n\n\t\tthis.indirect = indirect;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the indirect attribute of this geometry.\n\t *\n\t * @return {?BufferAttribute} The indirect attribute. Returns `null` if no indirect attribute is defined.\n\t */\n\tgetIndirect() {\n\n\t\treturn this.indirect;\n\n\t}\n\n\t/**\n\t * Returns the buffer attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {BufferAttribute|InterleavedBufferAttribute|undefined} The buffer attribute.\n\t * Returns `undefined` if not attribute has been found.\n\t */\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\t/**\n\t * Sets the given attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @param {BufferAttribute|InterleavedBufferAttribute} attribute - The attribute to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes the attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name to delete.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this geometry has an attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {boolean} Whether this geometry has an attribute for the given name or not.\n\t */\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\t/**\n\t * Adds a group to this geometry.\n\t *\n\t * @param {number} start - The first element in this draw call. That is the first\n\t * vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - Specifies how many vertices (or indices) are part of this group.\n\t * @param {number} [materialIndex=0] - The material array index to use.\n\t */\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Clears all groups.\n\t */\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\t/**\n\t * Sets the draw range for this geometry.\n\t *\n\t * @param {number} start - The first vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - For non-indexed BufferGeometry, `count` is the number of vertices to render.\n\t * For indexed BufferGeometry, `count` is the number of indices to render.\n\t */\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 transformation matrix to the geometry.\n\t *\n\t * @param {Matrix4} matrix - The matrix to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the rotation represented by the Quaternion to the geometry.\n\t *\n\t * @param {Quaternion} q - The Quaternion to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the X axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Y axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Z axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#position} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x offset.\n\t * @param {number} y - The y offset.\n\t * @param {number} z - The z offset.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#scale} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x scale.\n\t * @param {number} y - The y scale.\n\t * @param {number} z - The z scale.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry to face a point in 3D space. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#lookAt} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {Vector3} vector - The target point.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Center the geometry based on its bounding box.\n\t *\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines a geometry by creating a `position` attribute based on the given array of points. The array\n\t * can hold 2D or 3D vectors. When using two-dimensional data, the `z` coordinate for all vertices is\n\t * set to `0`.\n\t *\n\t * If the method is used with an existing `position` attribute, the vertex data are overwritten with the\n\t * data from the array. The length of the array must match the vertex count.\n\t *\n\t * @param {Array|Array} points - The points.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute === undefined ) {\n\n\t\t\tconst position = [];\n\n\t\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\t} else {\n\n\t\t\tconst l = Math.min( points.length, positionAttribute.count ); // make sure data do not exceed buffer size\n\n\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tpositionAttribute.setXYZ( i, point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tif ( points.length > positionAttribute.count ) {\n\n\t\t\t\twarn( 'BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry.' );\n\n\t\t\t}\n\n\t\t\tpositionAttribute.needsUpdate = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the geometry, and updates the `boundingBox` member.\n\t * The bounding box is not computed by the engine; it must be computed by your app.\n\t * You may need to recompute the bounding box if the geometry vertices are modified.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$2.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$2.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.max );\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\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the geometry, and updates the `boundingSphere` member.\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if the geometry vertices are modified.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$2.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$2.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\terror( 'BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates and adds a tangent attribute to this geometry.\n\t *\n\t * The computation is only supported for indexed geometries and if position, normal, and uv attributes\n\t * are defined. When using a tangent space normal map, prefer the MikkTSpace algorithm provided by\n\t * {@link BufferGeometryUtils#computeMikkTSpaceTangents} instead.\n\t */\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\terror( 'BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst positionAttribute = attributes.position;\n\t\tconst normalAttribute = attributes.normal;\n\t\tconst uvAttribute = attributes.uv;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * positionAttribute.count ), 4 ) );\n\n\t\t}\n\n\t\tconst tangentAttribute = this.getAttribute( 'tangent' );\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tuvA.fromBufferAttribute( uvAttribute, a );\n\t\t\tuvB.fromBufferAttribute( uvAttribute, b );\n\t\t\tuvC.fromBufferAttribute( uvAttribute, c );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: index.count\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindex.getX( j + 0 ),\n\t\t\t\t\tindex.getX( j + 1 ),\n\t\t\t\t\tindex.getX( j + 2 )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromBufferAttribute( normalAttribute, v );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? -1 : 1.0;\n\n\t\t\ttangentAttribute.setXYZW( v, tmp.x, tmp.y, tmp.z, w );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( index.getX( j + 0 ) );\n\t\t\t\thandleVertex( index.getX( j + 1 ) );\n\t\t\t\thandleVertex( index.getX( j + 2 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes vertex normals for the given vertex data. For indexed geometries, the method sets\n\t * each vertex normal to be the average of the face normals of the faces that share that vertex.\n\t * For non-indexed geometries, vertices are not shared, and the method sets each vertex normal\n\t * to be the same as the face normal.\n\t */\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Ensures every normal vector in a geometry will have a magnitude of `1`. This will\n\t * correct lighting on the geometry surfaces.\n\t */\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a new non-index version of this indexed geometry. If the geometry\n\t * is already non-indexed, the method is a NOOP.\n\t *\n\t * @return {BufferGeometry} The non-indexed version of this indexed geometry.\n\t */\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\twarn( 'BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\t/**\n\t * Serializes the geometry into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized geometry.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = boundingSphere.toJSON();\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new geometry with copied values from this instance.\n\t *\n\t * @return {BufferGeometry} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given geometry to this instance.\n\t *\n\t * @param {BufferGeometry} source - The geometry to copy.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires BufferGeometry#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$3 = /*@__PURE__*/ new Matrix4();\nconst _ray$3 = /*@__PURE__*/ new Ray();\nconst _sphere$6 = /*@__PURE__*/ new Sphere();\nconst _sphereHitAt = /*@__PURE__*/ new Vector3();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\n/**\n * Class representing triangular polygon mesh based objects.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments Object3D\n */\nclass Mesh extends Object3D {\n\n\t/**\n\t * Constructs a new mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\t/**\n\t\t * The mesh geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The mesh material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default MeshBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\t/**\n\t\t * The number of instances of this mesh.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Mesh#morphTargetDictionary} and {@link Mesh#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the local-space position of the vertex at the given index, taking into\n\t * account the current animation state of both morph targets and skinning.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * @return {Vector3} The vertex position in local space.\n\t */\n\tgetVertexPosition( index, target ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\n\t\ttarget.fromBufferAttribute( position, index );\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif ( morphPosition && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morphAttribute, index );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( target ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttarget.add( _morphA );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$6.copy( geometry.boundingSphere );\n\t\t_sphere$6.applyMatrix4( matrixWorld );\n\n\t\t// check distance from ray origin to bounding sphere\n\n\t\t_ray$3.copy( raycaster.ray ).recast( raycaster.near );\n\n\t\tif ( _sphere$6.containsPoint( _ray$3.origin ) === false ) {\n\n\t\t\tif ( _ray$3.intersectSphere( _sphere$6, _sphereHitAt ) === null ) return;\n\n\t\t\tif ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return;\n\n\t\t}\n\n\t\t// convert ray to local space of mesh\n\n\t\t_inverseMatrix$3.copy( matrixWorld ).invert();\n\t\t_ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$3 );\n\n\t}\n\n\t_computeIntersections( raycaster, intersects, rayLocalSpace ) {\n\n\t\tlet intersection;\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv1 = geometry.attributes.uv1;\n\t\tconst normal = geometry.attributes.normal;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\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} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\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} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection$1( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) {\n\n\tobject.getVertexPosition( a, _vA$1 );\n\tobject.getVertexPosition( b, _vB$1 );\n\tobject.getVertexPosition( c, _vC$1 );\n\n\tconst intersection = checkIntersection$1( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tconst barycoord = new Vector3();\n\t\tTriangle.getBarycoord( _intersectionPoint, _vA$1, _vB$1, _vC$1, barycoord );\n\n\t\tif ( uv ) {\n\n\t\t\tintersection.uv = Triangle.getInterpolatedAttribute( uv, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\tintersection.uv1 = Triangle.getInterpolatedAttribute( uv1, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\tintersection.normal = Triangle.getInterpolatedAttribute( normal, a, b, c, barycoord, new Vector3() );\n\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( -1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\t\tintersection.barycoord = barycoord;\n\n\t}\n\n\treturn intersection;\n\n}\n\n/**\n * A geometry class for a rectangular cuboid with a given width, height, and depth.\n * On creation, the cuboid is centred on the origin, with each edge parallel to one\n * of the axes.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const cube = new THREE.Mesh( geometry, material );\n * scene.add( cube );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#BoxGeometry\n */\nclass BoxGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new box geometry.\n\t *\n\t * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis.\n\t * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis.\n\t * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis.\n\t * @param {number} [widthSegments=1] - Number of segmented rectangular faces along the width of the sides.\n\t * @param {number} [heightSegments=1] - Number of segmented rectangular faces along the height of the sides.\n\t * @param {number} [depthSegments=1] - Number of segmented rectangular faces along the depth of the sides.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, -1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, -1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', -1, -1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : -1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {BoxGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Provides utility functions for managing uniforms.\n *\n * @module UniformsUtils\n */\n\n/**\n * Clones the given uniform definitions by performing a deep-copy. That means\n * if the value of a uniform refers to an object like a Vector3 or Texture,\n * the cloned uniform will refer to a new object reference.\n *\n * @param {Object} src - An object representing uniform definitions.\n * @return {Object} The cloned uniforms.\n */\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tif ( property.isRenderTargetTexture ) {\n\n\t\t\t\t\twarn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' );\n\t\t\t\t\tdst[ u ][ p ] = null;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\n/**\n * Merges the given uniform definitions into a single object. Since the\n * method internally uses cloneUniforms(), it performs a deep-copy when\n * producing the merged uniform definitions.\n *\n * @param {Array} uniforms - An array of objects containing uniform definitions.\n * @return {Object} The merged uniforms.\n */\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction getUnlitUniformColorSpace( renderer ) {\n\n\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\tif ( currentRenderTarget === null ) {\n\n\t\t// https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398\n\t\treturn renderer.outputColorSpace;\n\n\t}\n\n\t// https://github.com/mrdoob/three.js/issues/27868\n\tif ( currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\treturn currentRenderTarget.texture.colorSpace;\n\n\t}\n\n\treturn ColorManagement.workingColorSpace;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\n/**\n * A material rendered with custom shaders. A shader is a small program written in GLSL.\n * that runs on the GPU. You may want to use a custom shader if you need to implement an\n * effect not included with any of the built-in materials.\n *\n * There are the following notes to bear in mind when using a `ShaderMaterial`:\n *\n * - `ShaderMaterial` can only be used with {@link WebGLRenderer}.\n * - Built in attributes and uniforms are passed to the shaders along with your code. If\n * you don't want that, use {@link RawShaderMaterial} instead.\n * - You can use the directive `#pragma unroll_loop_start` and `#pragma unroll_loop_end`\n * in order to unroll a `for` loop in GLSL by the shader preprocessor. The directive has\n * to be placed right above the loop. The loop formatting has to correspond to a defined standard.\n * - The loop has to be [normalized](https://en.wikipedia.org/wiki/Normalized_loop).\n * - The loop variable has to be *i*.\n * - The value `UNROLLED_LOOP_INDEX` will be replaced with the explicitly\n * value of *i* for the given iteration and can be used in preprocessor\n * statements.\n *\n * ```js\n * const material = new THREE.ShaderMaterial( {\n * \tuniforms: {\n * \t\ttime: { value: 1.0 },\n * \t\tresolution: { value: new THREE.Vector2() }\n * \t},\n * \tvertexShader: document.getElementById( 'vertexShader' ).textContent,\n * \tfragmentShader: document.getElementById( 'fragmentShader' ).textContent\n * } );\n * ```\n *\n * @augments Material\n */\nclass ShaderMaterial extends Material {\n\n\t/**\n\t * Constructs a new shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\t/**\n\t\t * Defines custom constants using `#define` directives within the GLSL code\n\t\t * for both the vertex shader and the fragment shader; each key/value pair\n\t\t * yields another directive.\n\t\t * ```js\n\t\t * defines: {\n\t\t * \tFOO: 15,\n\t\t * \tBAR: true\n\t\t * }\n\t\t * ```\n\t\t * Yields the lines:\n\t\t * ```\n\t\t * #define FOO 15\n\t\t * #define BAR true\n\t\t * ```\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defines = {};\n\n\t\t/**\n\t\t * An object of the form:\n\t\t * ```js\n\t\t * {\n\t\t * \t\"uniform1\": { value: 1.0 },\n\t\t * \t\"uniform2\": { value: 2 }\n\t\t * }\n\t\t * ```\n\t\t * specifying the uniforms to be passed to the shader code; keys are uniform\n\t\t * names, values are definitions of the form\n\t\t * ```\n\t\t * {\n\t\t * \tvalue: 1.0\n\t\t * }\n\t\t * ```\n\t\t * where `value` is the value of the uniform. Names must match the name of\n\t\t * the uniform, as defined in the GLSL code. Note that uniforms are refreshed\n\t\t * on every frame, so updating the value of the uniform will immediately\n\t\t * update the value available to the GLSL code.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = {};\n\n\t\t/**\n\t\t * An array holding uniforms groups for configuring UBOs.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.uniformsGroups = [];\n\n\t\t/**\n\t\t * Vertex shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.vertexShader = default_vertex;\n\n\t\t/**\n\t\t * Fragment shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.fragmentShader = default_fragment;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * WebGL and WebGPU ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Define whether the material color is affected by global fog settings; `true`\n\t\t * to pass fog uniforms to the shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.fog = false;\n\n\t\t/**\n\t\t * Defines whether this material uses lighting; `true` to pass uniform data\n\t\t * related to lighting to this shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.lights = false;\n\n\t\t/**\n\t\t * Defines whether this material supports clipping; `true` to let the renderer\n\t\t * pass the clippingPlanes uniform.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipping = false;\n\n\t\t/**\n\t\t * Overwritten and set to `true` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.forceSinglePass = true;\n\n\t\t/**\n\t\t * This object allows to enable certain WebGL 2 extensions.\n\t\t *\n\t\t * - clipCullDistance: set to `true` to use vertex shader clipping\n\t\t * - multiDraw: set to `true` to use vertex shader multi_draw / enable gl_DrawID\n\t\t *\n\t\t * @type {{clipCullDistance:false,multiDraw:false}}\n\t\t */\n\t\tthis.extensions = {\n\t\t\tclipCullDistance: false, // set to use vertex shader clipping\n\t\t\tmultiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID\n\t\t};\n\n\t\t/**\n\t\t * When the rendered geometry doesn't include these attributes but the\n\t\t * material does, these default values will be passed to the shaders. This\n\t\t * avoids errors when buffer data is missing.\n\t\t *\n\t\t * - color: [ 1, 1, 1 ]\n\t\t * - uv: [ 0, 0 ]\n\t\t * - uv1: [ 0, 0 ]\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv1': [ 0, 0 ]\n\t\t};\n\n\t\t/**\n\t\t * If set, this calls [gl.bindAttribLocation](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bindAttribLocation)\n\t\t * to bind a generic vertex index to an attribute variable.\n\t\t *\n\t\t * @type {string|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.index0AttributeName = undefined;\n\n\t\t/**\n\t\t * Can be used to force a uniform update while changing uniforms in\n\t\t * {@link Object3D#onBeforeRender}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\t/**\n\t\t * Defines the GLSL version of custom shader code.\n\t\t *\n\t\t * @type {?(GLSL1|GLSL3)}\n\t\t * @default null\n\t\t */\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tdata.lights = this.lights;\n\t\tdata.clipping = this.clipping;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Abstract base class for cameras. This class should always be inherited\n * when you build a new camera.\n *\n * @abstract\n * @augments Object3D\n */\nclass Camera extends Object3D {\n\n\t/**\n\t * Constructs a new camera.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\t/**\n\t\t * The inverse of the camera's world matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\t/**\n\t\t * The camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The inverse of the camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The coordinate system in which the camera is used.\n\t\t *\n\t\t * @type {(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t\tthis._reversedDepth = false;\n\n\t}\n\n\t/**\n\t * The flag that indicates whether the camera uses a reversed depth buffer.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget reversedDepth() {\n\n\t\treturn this._reversedDepth;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\tthis.coordinateSystem = source.coordinateSystem;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * This method is overwritten since cameras have a different forward vector compared to other\n\t * 3D objects. A camera looks down its local, negative z-axis by default.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\treturn super.getWorldDirection( target ).negate();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _v3$1 = /*@__PURE__*/ new Vector3();\nconst _minTarget = /*@__PURE__*/ new Vector2();\nconst _maxTarget = /*@__PURE__*/ new Vector2();\n\n/**\n * Camera that uses [perspective projection](https://en.wikipedia.org/wiki/Perspective_(graphical)).\n *\n * This projection mode is designed to mimic the way the human eye sees. It\n * is the most common projection mode used for rendering a 3D scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 45, width / height, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass PerspectiveCamera extends Camera {\n\n\t/**\n\t * Constructs a new perspective camera.\n\t *\n\t * @param {number} [fov=50] - The vertical field of view.\n\t * @param {number} [aspect=1] - The aspect ratio.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\t/**\n\t\t * The vertical field of view, from bottom to top of view,\n\t\t * in degrees.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 50\n\t\t */\n\t\tthis.fov = fov;\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link PerspectiveCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link OrthographicCamera}, `0` is not a\n\t\t * valid value for a perspective camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link PerspectiveCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * Object distance used for stereoscopy and depth-of-field effects. This\n\t\t * parameter does not influence the projection matrix unless a\n\t\t * {@link StereoCamera} is being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.focus = 10;\n\n\t\t/**\n\t\t * The aspect ratio, usually the canvas width / canvas height.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = aspect;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * Film size used for the larger axis. Default is `35` (millimeters). This\n\t\t * parameter does not influence the projection matrix unless {@link PerspectiveCamera#filmOffset}\n\t\t * is set to a nonzero value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 35\n\t\t */\n\t\tthis.filmGauge = 35;\n\n\t\t/**\n\t\t * Horizontal off-center offset in the same unit as {@link PerspectiveCamera#filmGauge}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.filmOffset = 0;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * @param {number} focalLength - Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Returns the focal length from the current {@link PerspectiveCamera#fov} and\n\t * {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The computed focal length.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\t/**\n\t * Returns the current vertical field of view angle in degrees considering {@link PerspectiveCamera#zoom}.\n\t *\n\t * @return {number} The effective FOV.\n\t */\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\t/**\n\t * Returns the width of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Returns the height of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Sets `minTarget` and `maxTarget` to the coordinates of the lower-left and upper-right corners of the view rectangle.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} minTarget - The lower-left corner of the view rectangle is written into this vector.\n\t * @param {Vector2} maxTarget - The upper-right corner of the view rectangle is written into this vector.\n\t */\n\tgetViewBounds( distance, minTarget, maxTarget ) {\n\n\t\t_v3$1.set( -1, -1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tminTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t\t_v3$1.set( 1, 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tmaxTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t}\n\n\t/**\n\t * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} target - The target vector that is used to store result where x is width and y is height.\n\t * @returns {Vector2} The view size.\n\t */\n\tgetViewSize( distance, target ) {\n\n\t\tthis.getViewBounds( distance, _minTarget, _maxTarget );\n\n\t\treturn target.subVectors( _maxTarget, _minTarget );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *```\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *```\n\t * then for each monitor you would call it like this:\n\t *```js\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * // --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * // --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * // --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * // --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * // --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * // --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t * ```\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = -0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst fov = -90; // negative fov is not an error\nconst aspect = 1;\n\n/**\n * A special type of camera that is positioned in 3D space to render its surroundings into a\n * cube render target. The render target can then be used as an environment map for rendering\n * realtime reflections in your scene.\n *\n * ```js\n * // Create cube render target\n * const cubeRenderTarget = new THREE.WebGLCubeRenderTarget( 256, { generateMipmaps: true, minFilter: THREE.LinearMipmapLinearFilter } );\n *\n * // Create cube camera\n * const cubeCamera = new THREE.CubeCamera( 1, 100000, cubeRenderTarget );\n * scene.add( cubeCamera );\n *\n * // Create car\n * const chromeMaterial = new THREE.MeshLambertMaterial( { color: 0xffffff, envMap: cubeRenderTarget.texture } );\n * const car = new THREE.Mesh( carGeometry, chromeMaterial );\n * scene.add( car );\n *\n * // Update the render target cube\n * car.visible = false;\n * cubeCamera.position.copy( car.position );\n * cubeCamera.update( renderer, scene );\n *\n * // Render the scene\n * car.visible = true;\n * renderer.render( scene, camera );\n * ```\n *\n * @augments Object3D\n */\nclass CubeCamera extends Object3D {\n\n\t/**\n\t * Constructs a new cube camera.\n\t *\n\t * @param {number} near - The camera's near plane.\n\t * @param {number} far - The camera's far plane.\n\t * @param {WebGLCubeRenderTarget} renderTarget - The cube render target.\n\t */\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\t/**\n\t\t * A reference to the cube render target.\n\t\t *\n\t\t * @type {WebGLCubeRenderTarget}\n\t\t */\n\t\tthis.renderTarget = renderTarget;\n\n\t\t/**\n\t\t * The current active coordinate system.\n\t\t *\n\t\t * @type {?(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t * @default null\n\t\t */\n\t\tthis.coordinateSystem = null;\n\n\t\t/**\n\t\t * The current active mipmap level\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\t/**\n\t * Must be called when the coordinate system of the cube camera is changed.\n\t */\n\tupdateCoordinateSystem() {\n\n\t\tconst coordinateSystem = this.coordinateSystem;\n\n\t\tconst cameras = this.children.concat();\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras;\n\n\t\tfor ( const camera of cameras ) this.remove( camera );\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, 1, 0 );\n\t\t\tcameraPX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, 1, 0 );\n\t\t\tcameraNX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, -1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, 1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, -1, 0 );\n\t\t\tcameraPX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, -1, 0 );\n\t\t\tcameraNX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, -1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, -1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, -1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tfor ( const camera of cameras ) {\n\n\t\t\tthis.add( camera );\n\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calling this method will render the given scene with the given renderer\n\t * into the cube render target of the camera.\n\t *\n\t * @param {(Renderer|WebGLRenderer)} renderer - The renderer.\n\t * @param {Scene} scene - The scene to render.\n\t */\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst { renderTarget, activeMipmapLevel } = this;\n\n\t\tif ( this.coordinateSystem !== renderer.coordinateSystem ) {\n\n\t\t\tthis.coordinateSystem = renderer.coordinateSystem;\n\n\t\t\tthis.updateCoordinateSystem();\n\n\t\t}\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentActiveCubeFace = renderer.getActiveCubeFace();\n\t\tconst currentActiveMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\t// mipmaps are generated during the last call of render()\n\t\t// at this point, all sides of the cube render target are defined\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a cube texture made up of six images.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader();\n * loader.setPath( 'textures/cube/pisa/' );\n *\n * const textureCube = loader.load( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xffffff, envMap: textureCube } );\n * ```\n *\n * @augments Texture\n */\nclass CubeTexture extends Texture {\n\n\t/**\n\t * Constructs a new cube texture.\n\t *\n\t * @param {Array} [images=[]] - An array holding a image for each side of a cube.\n\t * @param {number} [mapping=CubeReflectionMapping] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space value.\n\t */\n\tconstructor( images = [], mapping = CubeReflectionMapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) {\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t}\n\n\t/**\n\t * Alias for {@link CubeTexture#image}.\n\t *\n\t * @type {Array}\n\t */\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\n/**\n * A cube render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new cube render target.\n\t *\n\t * @param {number} [size=1] - The size of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new CubeTexture( images );\n\t\tthis._setTextureOptions( options );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n\t/**\n\t * Converts the given equirectangular texture to a cube map.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Texture} texture - The equirectangular texture.\n\t * @return {WebGLCubeRenderTarget} A reference to this cube render target.\n\t */\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.colorSpace = texture.colorSpace;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Clears this cube render target.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t */\n\tclear( renderer, color = true, depth = true, stencil = true ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\n/**\n * This is almost identical to an {@link Object3D}. Its purpose is to\n * make working with groups of objects syntactically clearer.\n *\n * ```js\n * // Create a group and add the two cubes.\n * // These cubes can now be rotated / scaled etc as a group.\n * const group = new THREE.Group();\n *\n * group.add( meshA );\n * group.add( meshB );\n *\n * scene.add( group );\n * ```\n *\n * @augments Object3D\n */\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\n/**\n * Class for representing a XR controller with its\n * different coordinate systems.\n *\n * @private\n */\nclass WebXRController {\n\n\t/**\n\t * Constructs a new XR controller.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A group representing the target ray space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._targetRay = null;\n\n\t\t/**\n\t\t * A group representing the grip space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._grip = null;\n\n\t\t/**\n\t\t * A group representing the hand space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._hand = null;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand space of the XR controller.\n\t *\n\t * @return {Group} A group representing the hand space of the XR controller.\n\t */\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\t/**\n\t * Returns a group representing the target ray space of the XR controller.\n\t *\n\t * @return {Group} A group representing the target ray space of the XR controller.\n\t */\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\t/**\n\t * Returns a group representing the grip space of the XR controller.\n\t *\n\t * @return {Group} A group representing the grip space of the XR controller.\n\t */\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\t/**\n\t * Dispatches the given event to the groups representing\n\t * the different coordinate spaces of the XR controller.\n\t *\n\t * @param {Object} event - The event to dispatch.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects the controller with the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tconnect( inputSource ) {\n\n\t\tif ( inputSource && inputSource.hand ) {\n\n\t\t\tconst hand = this._hand;\n\n\t\t\tif ( hand ) {\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Initialize hand with joints when connected\n\t\t\t\t\tthis._getHandJoint( hand, inputjoint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects the controller from the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the controller with the given input source, XR frame and reference space.\n\t * This updates the transformations of the groups that represent the different\n\t * coordinate systems of the controller.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @param {XRFrame} frame - The XR frame.\n\t * @param {XRReferenceSpace} referenceSpace - The reference space.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = this._getHandJoint( hand, inputjoint );\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.matrixWorldNeedsUpdate = true;\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\t\t\t\t\t\tgrip.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\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\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\t\t\t\t\ttargetRay.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand joint for the given input joint.\n\t *\n\t * @private\n\t * @param {Group} hand - The group representing the hand space.\n\t * @param {XRJointSpace} inputjoint - The hand joint data.\n\t * @return {Group} A group representing the hand joint for the given input joint.\n\t */\n\t_getHandJoint( hand, inputjoint ) {\n\n\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\tconst joint = new Group();\n\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\tjoint.visible = false;\n\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\n\t\t\thand.add( joint );\n\n\t\t}\n\n\t\treturn hand.joints[ inputjoint.jointName ];\n\n\t}\n\n}\n\n/**\n * This class can be used to define an exponential squared fog,\n * which gives a clear view near the camera and a faster than exponentially\n * densening fog farther from the camera.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );\n * ```\n */\nclass FogExp2 {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [density=0.00025] - Defines how fast the fog will grow dense.\n\t */\n\tconstructor( color, density = 0.00025 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFogExp2 = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * Defines how fast the fog will grow dense.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.00025\n\t\t */\n\t\tthis.density = density;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {FogExp2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\n/**\n * This class can be used to define a linear fog that grows linearly denser\n * with the distance.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );\n * ```\n */\nclass Fog {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [near=1] - The minimum distance to start applying fog.\n\t * @param {number} [far=1000] - The maximum distance at which fog stops being calculated and applied.\n\t */\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFog = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The minimum distance to start applying fog. Objects that are less than\n\t\t * `near` units from the active camera won't be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The maximum distance at which fog stops being calculated and applied.\n\t\t * Objects that are more than `far` units away from the active camera won't\n\t\t * be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1000\n\t\t */\n\t\tthis.far = far;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {Fog} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\n/**\n * Scenes allow you to set up what is to be rendered and where by three.js.\n * This is where you place 3D objects like meshes, lines or lights.\n *\n * @augments Object3D\n */\nclass Scene extends Object3D {\n\n\t/**\n\t * Constructs a new scene.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\t/**\n\t\t * Defines the background of the scene. Valid inputs are:\n\t\t *\n\t\t * - A color for defining a uniform colored background.\n\t\t * - A texture for defining a (flat) textured background.\n\t\t * - Cube textures or equirectangular textures for defining a skybox.\n\t\t *\n\t\t * @type {?(Color|Texture)}\n\t\t * @default null\n\t\t */\n\t\tthis.background = null;\n\n\t\t/**\n\t\t * Sets the environment map for all physical materials in the scene. However,\n\t\t * it's not possible to overwrite an existing texture assigned to the `envMap`\n\t\t * material property.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.environment = null;\n\n\t\t/**\n\t\t * A fog instance defining the type of fog that affects everything\n\t\t * rendered in the scene.\n\t\t *\n\t\t * @type {?(Fog|FogExp2)}\n\t\t * @default null\n\t\t */\n\t\tthis.fog = null;\n\n\t\t/**\n\t\t * Sets the blurriness of the background. Only influences environment maps\n\t\t * assigned to {@link Scene#background}. Valid input is a float between `0`\n\t\t * and `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.backgroundBlurriness = 0;\n\n\t\t/**\n\t\t * Attenuates the color of the background. Only applies to background textures.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.backgroundIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the background in radians. Only influences environment maps\n\t\t * assigned to {@link Scene#background}.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.backgroundRotation = new Euler();\n\n\t\t/**\n\t\t * Attenuates the color of the environment. Only influences environment maps\n\t\t * assigned to {@link Scene#environment}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.environmentIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians. Only influences physical materials\n\t\t * in the scene when {@link Scene#environment} is used.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.environmentRotation = new Euler();\n\n\t\t/**\n\t\t * Forces everything in the scene to be rendered with the defined material. It is possible\n\t\t * to exclude materials from override by setting {@link Material#allowOverride} to `false`.\n\t\t *\n\t\t * @type {?Material}\n\t\t * @default null\n\t\t */\n\t\tthis.overrideMaterial = null;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tthis.backgroundBlurriness = source.backgroundBlurriness;\n\t\tthis.backgroundIntensity = source.backgroundIntensity;\n\t\tthis.backgroundRotation.copy( source.backgroundRotation );\n\n\t\tthis.environmentIntensity = source.environmentIntensity;\n\t\tthis.environmentRotation.copy( source.environmentRotation );\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\tif ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness;\n\t\tif ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity;\n\t\tdata.object.backgroundRotation = this.backgroundRotation.toArray();\n\n\t\tif ( this.environmentIntensity !== 1 ) data.object.environmentIntensity = this.environmentIntensity;\n\t\tdata.object.environmentRotation = this.environmentRotation.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * \"Interleaved\" means that multiple attributes, possibly of different types,\n * (e.g., position, normal, uv, color) are packed into a single array buffer.\n *\n * An introduction into interleaved arrays can be found here: [Interleaved array basics](https://blog.tojicode.com/2011/05/interleaved-array-basics.html)\n */\nclass InterleavedBuffer {\n\n\t/**\n\t * Constructs a new interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t */\n\tconstructor( array, stride ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBuffer = true;\n\n\t\t/**\n\t\t * A typed array with a shared buffer storing attribute data.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of typed-array elements per vertex.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.stride = stride;\n\n\t\t/**\n\t\t * The total number of elements in the array\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * The UUID of the interleaved buffer.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute array\n\t * data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this interleaved buffer.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {InterleavedBuffer} A reference to this interleaved buffer.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given interleaved buffer to this instance.\n\t *\n\t * @param {InterleavedBuffer} source - The interleaved buffer to copy.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given interleaved buffer to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this interleaved buffer.\n\t * @param {InterleavedBuffer} interleavedBuffer - The interleaved buffer to copy from.\n\t * @param {number} index2 - The source index into the given interleaved buffer.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopyAt( index1, interleavedBuffer, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= interleavedBuffer.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = interleavedBuffer.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the interleaved buffer.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this interleaved buffer's array.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new interleaved buffer with copied values from this instance.\n\t *\n\t * @param {Object} [data] - An object with shared array buffers that allows to retain shared structures.\n\t * @return {InterleavedBuffer} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the interleaved buffer into JSON.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized interleaved buffer.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\n/**\n * An alternative version of a buffer attribute with interleaved data. Interleaved\n * attributes share a common interleaved data storage ({@link InterleavedBuffer}) and refer with\n * different offsets into the buffer.\n */\nclass InterleavedBufferAttribute {\n\n\t/**\n\t * Constructs a new interleaved buffer attribute.\n\t *\n\t * @param {InterleavedBuffer} interleavedBuffer - The buffer holding the interleaved data.\n\t * @param {number} itemSize - The item size.\n\t * @param {number} offset - The attribute offset into the buffer.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer holding the interleaved data.\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.data = interleavedBuffer;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The attribute offset into the buffer.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.offset = offset;\n\n\t\t/**\n\t\t * Whether the data are normalized or not, see {@link BufferAttribute#normalized}\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t}\n\n\t/**\n\t * The item count of this buffer attribute.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\t/**\n\t * The array holding the interleaved buffer attribute data.\n\t *\n\t * @type {TypedArray}\n\t */\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.data.stride + this.offset + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.data.array[ index * this.data.stride + this.offset ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An object with interleaved buffers that allows to retain the interleaved property.\n\t * @return {BufferAttribute|InterleavedBufferAttribute} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// de-interleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribute\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A material for rendering instances of {@link Sprite}.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'textures/sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map, color: 0xffffff } );\n *\n * const sprite = new THREE.Sprite( material );\n * sprite.scale.set(200, 200, 1)\n * scene.add( sprite );\n * ```\n *\n * @augments Material\n */\nclass SpriteMaterial extends Material {\n\n\t/**\n\t * Constructs a new sprite material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The rotation of the sprite in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Specifies whether size of the sprite is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Overwritten since sprite materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\n/**\n * A sprite is a plane that always faces towards the camera, generally with a\n * partially transparent texture applied.\n *\n * Sprites do not cast shadows, setting {@link Object3D#castShadow} to `true` will\n * have no effect.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map } );\n *\n * const sprite = new THREE.Sprite( material );\n * scene.add( sprite );\n * ```\n *\n * @augments Object3D\n */\nclass Sprite extends Object3D {\n\n\t/**\n\t * Constructs a new sprite.\n\t *\n\t * @param {(SpriteMaterial|SpriteNodeMaterial)} [material] - The sprite material.\n\t */\n\tconstructor( material = new SpriteMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t-0.5, -0.5, 0, 0, 0,\n\t\t\t\t0.5, -0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t-0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\t/**\n\t\t * The sprite geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = _geometry;\n\n\t\t/**\n\t\t * The sprite material.\n\t\t *\n\t\t * @type {(SpriteMaterial|SpriteNodeMaterial)}\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * The sprite's anchor point, and the point around which the sprite rotates.\n\t\t * A value of `(0.5, 0.5)` corresponds to the midpoint of the sprite. A value\n\t\t * of `(0, 0)` corresponds to the lower left corner of the sprite.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0.5,0.5)\n\t\t */\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t\t/**\n\t\t * The number of instances of this sprite.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this sprite.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\terror( 'Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( -0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( -0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getInterpolation( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A component for providing a basic Level of Detail (LOD) mechanism.\n *\n * Every LOD level is associated with an object, and rendering can be switched\n * between them at the distances specified. Typically you would create, say,\n * three meshes, one for far away (low detail), one for mid range (medium\n * detail) and one for close up (high detail).\n *\n * ```js\n * const lod = new THREE.LOD();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n *\n * //Create spheres with 3 levels of detail and create new LOD levels for them\n * for( let i = 0; i < 3; i++ ) {\n *\n * \tconst geometry = new THREE.IcosahedronGeometry( 10, 3 - i );\n * \tconst mesh = new THREE.Mesh( geometry, material );\n * \tlod.addLevel( mesh, i * 75 );\n *\n * }\n *\n * scene.add( lod );\n * ```\n *\n * @augments Object3D\n */\nclass LOD extends Object3D {\n\n\t/**\n\t * Constructs a new LOD.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLOD = true;\n\n\t\t/**\n\t\t * The current LOD index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * This array holds the LOD levels.\n\t\t\t *\n\t\t\t * @name LOD#levels\n\t\t\t * @type {Array<{object:Object3D,distance:number,hysteresis:number}>}\n\t\t\t */\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Whether the LOD object is updated automatically by the renderer per frame\n\t\t * or not. If set to `false`, you have to call {@link LOD#update} in the\n\t\t * render loop by yourself.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance, level.hysteresis );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a mesh that will display at a certain distance and greater. Typically\n\t * the further away the distance, the lower the detail on the mesh.\n\t *\n\t * @param {Object3D} object - The 3D object to display at this level.\n\t * @param {number} [distance=0] - The distance at which to display this level of detail.\n\t * @param {number} [hysteresis=0] - Threshold used to avoid flickering at LOD boundaries, as a fraction of distance.\n\t * @return {LOD} A reference to this instance.\n\t */\n\taddLevel( object, distance = 0, hysteresis = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes an existing level, based on the distance from the camera.\n\t * Returns `true` when the level has been removed. Otherwise `false`.\n\t *\n\t * @param {number} distance - Distance of the level to remove.\n\t * @return {boolean} Whether the level has been removed or not.\n\t */\n\tremoveLevel( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0; i < levels.length; i ++ ) {\n\n\t\t\tif ( levels[ i ].distance === distance ) {\n\n\t\t\t\tconst removedElements = levels.splice( i, 1 );\n\t\t\t\tthis.remove( removedElements[ 0 ].object );\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns the currently active LOD level index.\n\t *\n\t * @return {number} The current active LOD level index.\n\t */\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\t/**\n\t * Returns a reference to the first 3D object that is greater than\n\t * the given distance.\n\t *\n\t * @param {number} distance - The LOD distance.\n\t * @return {?Object3D} The found 3D object. `null` if no 3D object has been found.\n\t */\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance < levelDistance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this LOD.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the LOD by computing which LOD level should be visible according\n\t * to the current distance of the given camera.\n\t *\n\t * @param {Camera} camera - The camera the scene is rendered with.\n\t */\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance >= levelDistance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance,\n\t\t\t\thysteresis: level.hysteresis\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector3 = /*@__PURE__*/ new Vector3();\nconst _matrix4 = /*@__PURE__*/ new Matrix4();\nconst _vertex = /*@__PURE__*/ new Vector3();\n\nconst _sphere$5 = /*@__PURE__*/ new Sphere();\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\n\n/**\n * A mesh that has a {@link Skeleton} that can then be used to animate the\n * vertices of the geometry with skinning/skeleton animation.\n *\n * Next to a valid skeleton, the skinned mesh requires skin indices and weights\n * as buffer attributes in its geometry. These attribute define which bones affect a single\n * vertex to a certain extend.\n *\n * Typically skinned meshes are not created manually but loaders like {@link GLTFLoader}\n * or {@link FBXLoader } import respective models.\n *\n * @augments Mesh\n * @demo scenes/bones-browser.html\n */\nclass SkinnedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new skinned mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkinnedMesh = true;\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\t/**\n\t\t * `AttachedBindMode` means the skinned mesh shares the same world space as the skeleton.\n\t\t * This is not true when using `DetachedBindMode` which is useful when sharing a skeleton\n\t\t * across multiple skinned meshes.\n\t\t *\n\t\t * @type {(AttachedBindMode|DetachedBindMode)}\n\t\t * @default AttachedBindMode\n\t\t */\n\t\tthis.bindMode = AttachedBindMode;\n\n\t\t/**\n\t\t * The base matrix that is used for the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The base matrix that is used for resetting the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The bounding box of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the skinned mesh, and updates {@link SkinnedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * If the skinned mesh is animated, the bounding box should be recomputed per frame in order to reflect\n\t * the current animation state.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingBox.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the skinned mesh, and updates {@link SkinnedMesh#boundingSphere}.\n\t * The bounding sphere is automatically computed by the engine once when it is needed, e.g., for ray casting\n\t * and view frustum culling. If the skinned mesh is animated, the bounding sphere should be recomputed\n\t * per frame in order to reflect the current animation state.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingSphere.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$5.copy( this.boundingSphere );\n\t\t_sphere$5.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$5 ) === false ) return;\n\n\t\t// convert ray to local space of skinned mesh\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( this.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$2 );\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tsuper.getVertexPosition( index, target );\n\n\t\tthis.applyBoneTransform( index, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Binds the given skeleton to the skinned mesh.\n\t *\n\t * @param {Skeleton} skeleton - The skeleton to bind.\n\t * @param {Matrix4} [bindMatrix] - The bind matrix. If no bind matrix is provided,\n\t * the skinned mesh's world matrix will be used instead.\n\t */\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\t/**\n\t * This method sets the skinned mesh in the rest pose).\n\t */\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\t/**\n\t * Normalizes the skin weights which are defined as a buffer attribute\n\t * in the skinned mesh's geometry.\n\t */\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === AttachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === DetachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\twarn( 'SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies the bone transform associated with the given index to the given\n\t * vertex position. Returns the updated vector.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * the skinned mesh's world matrix will be used instead.\n\t * @return {Vector3} The updated vertex position.\n\t */\n\tapplyBoneTransform( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( target ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\n/**\n * A bone which is part of a {@link Skeleton}. The skeleton in turn is used by\n * the {@link SkinnedMesh}.\n *\n * ```js\n * const root = new THREE.Bone();\n * const child = new THREE.Bone();\n *\n * root.add( child );\n * child.position.y = 5;\n * ```\n *\n * @augments Object3D\n */\nclass Bone extends Object3D {\n\n\t/**\n\t * Constructs a new bone.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\n/**\n * Creates a texture directly from raw buffer data.\n *\n * The interpretation of the data depends on type and format: If the type is\n * `UnsignedByteType`, a `Uint8Array` will be useful for addressing the\n * texel data. If the format is `RGBAFormat`, data needs four values for\n * one texel; Red, Green, Blue and Alpha (typically the opacity).\n *\n * @augments Texture\n */\nclass DataTexture extends Texture {\n\n\t/**\n\t * Constructs a new data texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=NearestFilter] - The mag filter value.\n\t * @param {number} [minFilter=NearestFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number}}\n\t\t */\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * Class for representing the armatures in `three.js`. The skeleton\n * is defined by a hierarchy of bones.\n *\n * ```js\n * const bones = [];\n *\n * const shoulder = new THREE.Bone();\n * const elbow = new THREE.Bone();\n * const hand = new THREE.Bone();\n *\n * shoulder.add( elbow );\n * elbow.add( hand );\n *\n * bones.push( shoulder , elbow, hand);\n *\n * shoulder.position.y = -5;\n * elbow.position.y = 0;\n * hand.position.y = 5;\n *\n * const armSkeleton = new THREE.Skeleton( bones );\n * ```\n */\nclass Skeleton {\n\n\t/**\n\t * Constructs a new skeleton.\n\t *\n\t * @param {Array} [bones] - An array of bones.\n\t * @param {Array} [boneInverses] - An array of bone inverse matrices.\n\t * If not provided, these matrices will be computed automatically via {@link Skeleton#calculateInverses}.\n\t */\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An array of bones defining the skeleton.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t/**\n\t\t * An array of bone inverse matrices.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.boneInverses = boneInverses;\n\n\t\t/**\n\t\t * An array buffer holding the bone data.\n\t\t * Input data for {@link Skeleton#boneTexture}.\n\t\t *\n\t\t * @type {?Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis.boneMatrices = null;\n\n\t\t/**\n\t\t * A texture holding the bone data for use\n\t\t * in the vertex shader.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.boneTexture = null;\n\n\t\tthis.init();\n\n\t}\n\n\t/**\n\t * Initializes the skeleton. This method gets automatically called by the constructor\n\t * but depending on how the skeleton is created it might be necessary to call this method\n\t * manually.\n\t */\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\twarn( 'Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bone inverse matrices. This method resets {@link Skeleton#boneInverses}\n\t * and fills it with new matrices.\n\t */\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new skeleton with copied values from this instance.\n\t *\n\t * @return {Skeleton} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\t/**\n\t * Computes a data texture for passing bone data to the vertex shader.\n\t *\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the skeleton's bone array and returns the first with a\n\t * matching name.\n\t *\n\t * @param {string} name - The name of the bone.\n\t * @return {Bone|undefined} The found bone. `undefined` if no bone has been found.\n\t */\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setups the skeleton by the given JSON and bones.\n\t *\n\t * @param {Object} json - The skeleton as serialized JSON.\n\t * @param {Object} bones - An array of bones.\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\twarn( 'Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the skeleton into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized skeleton.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * An instanced version of a buffer attribute.\n *\n * @augments BufferAttribute\n */\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new instanced buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t * @param {number} [meshPerAttribute=1] - How often a value of this buffer attribute should be repeated.\n\t */\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated. A\n\t\t * value of one means that each value of the instanced attribute is used for\n\t\t * a single instance. A value of two means that each value is used for two\n\t\t * consecutive instances (and so on).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _box3 = /*@__PURE__*/ new Box3();\nconst _identity = /*@__PURE__*/ new Matrix4();\nconst _mesh$1 = /*@__PURE__*/ new Mesh();\nconst _sphere$4 = /*@__PURE__*/ new Sphere();\n\n/**\n * A special version of a mesh with instanced rendering support. Use\n * this class if you have to render a large number of objects with the same\n * geometry and material(s) but with different world transformations. The usage\n * of 'InstancedMesh' will help you to reduce the number of draw calls and thus\n * improve the overall rendering performance in your application.\n *\n * @augments Mesh\n */\nclass InstancedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new instanced mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t * @param {number} count - The number of instances.\n\t */\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedMesh = true;\n\n\t\t/**\n\t\t * Represents the local transformation of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMatrixAt}.\n\t\t *\n\t\t * @type {InstancedBufferAttribute}\n\t\t */\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\n\t\t/**\n\t\t * Represents the color of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setColorAt}.\n\t\t *\n\t\t * @type {?InstancedBufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.instanceColor = null;\n\n\t\t/**\n\t\t * Represents the morph target weights of all instances. You have to set its\n\t\t * {@link Texture#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMorphAt}.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.morphTexture = null;\n\n\t\t/**\n\t\t * The number of instances.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * The bounding box of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.setMatrixAt( i, _identity );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the instanced mesh, and updates {@link InstancedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * You may need to recompute the bounding box if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingBox.union( _box3 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the instanced mesh, and updates {@link InstancedMesh#boundingSphere}\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_sphere$4.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingSphere.union( _sphere$4 );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone();\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the color of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t */\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Gets the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t */\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Gets the morph target weights of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - The target object that is used to store the method's result.\n\t */\n\tgetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tconst len = objectInfluences.length + 1; // All influences + the baseInfluenceSum\n\n\t\tconst dataIndex = index * len + 1; // Skip the baseInfluenceSum at the beginning\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tobjectInfluences[ i ] = array[ dataIndex + i ];\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh$1.geometry = this.geometry;\n\t\t_mesh$1.material = this.material;\n\n\t\tif ( _mesh$1.material === undefined ) return;\n\n\t\t// test with bounding sphere first\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$4.copy( this.boundingSphere );\n\t\t_sphere$4.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$4 ) === false ) return;\n\n\t\t// now test each instance\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh$1.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh$1.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceColor} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The instance color.\n\t */\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ).fill( 1 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceMatrix} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The local transformation.\n\t */\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Sets the morph target weights to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#morphTexture} to `true` after updating all the influences.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - A mesh which `morphTargetInfluences` property containing the morph target weights\n\t * of a single instance.\n\t */\n\tsetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst len = objectInfluences.length + 1; // morphBaseInfluence + all influences\n\n\t\tif ( this.morphTexture === null ) {\n\n\t\t\tthis.morphTexture = new DataTexture( new Float32Array( len * this.count ), len, this.count, RedFormat, FloatType );\n\n\t\t}\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tlet morphInfluencesSum = 0;\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t}\n\n\t\tconst morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\tconst dataIndex = len * index;\n\n\t\tarray[ dataIndex ] = morphBaseInfluence;\n\n\t\tarray.set( objectInfluences, dataIndex + 1 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\tif ( this.morphTexture !== null ) {\n\n\t\t\tthis.morphTexture.dispose();\n\t\t\tthis.morphTexture = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\n/**\n * A two dimensional surface that extends infinitely in 3D space, represented\n * in [Hessian normal form](http://mathworld.wolfram.com/HessianNormalForm.html)\n * by a unit length normal vector and a constant.\n */\nclass Plane {\n\n\t/**\n\t * Constructs a new plane.\n\t *\n\t * @param {Vector3} [normal=(1,0,0)] - A unit length vector defining the normal of the plane.\n\t * @param {number} [constant=0] - The signed distance from the origin to the plane.\n\t */\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPlane = true;\n\n\t\t/**\n\t\t * A unit length vector defining the normal of the plane.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.normal = normal;\n\n\t\t/**\n\t\t * The signed distance from the origin to the plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.constant = constant;\n\n\t}\n\n\t/**\n\t * Sets the plane components by copying the given values.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {number} constant - The constant.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane components by defining `x`, `y`, `z` as the\n\t * plane normal and `w` as the constant.\n\t *\n\t * @param {number} x - The value for the normal's x component.\n\t * @param {number} y - The value for the normal's y component.\n\t * @param {number} z - The value for the normal's z component.\n\t * @param {number} w - The constant value.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from the given normal and coplanar point (that is a point\n\t * that lies onto the plane).\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Vector3} point - A coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from three coplanar points. The winding order is\n\t * assumed to be counter-clockwise, and determines the direction of\n\t * the plane normal.\n\t *\n\t * @param {Vector3} a - The first coplanar point.\n\t * @param {Vector3} b - The second coplanar point.\n\t * @param {Vector3} c - The third coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given plane to this instance.\n\t *\n\t * @param {Plane} plane - The plane to copy.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Normalizes the plane normal and adjusts the constant accordingly.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Negates both the plane normal and the constant.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnegate() {\n\n\t\tthis.constant *= -1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given point to this plane.\n\t *\n\t * @param {Vector3} point - The point to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given sphere to this plane.\n\t *\n\t * @param {Sphere} sphere - The sphere to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\t/**\n\t * Projects a the given point onto the plane.\n\t *\n\t * @param {Vector3} point - The point to project.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The projected point on the plane.\n\t */\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the intersection point of the passed line and the plane. Returns\n\t * `null` if the line does not intersect. Returns the line's starting point if\n\t * the line is coplanar with the plane.\n\t *\n\t * @param {Line3} line - The line to compute the intersection for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( line.start ).addScaledVector( direction, t );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given line segment intersects with (passes through) the plane.\n\t *\n\t * @param {Line3} line - The line to test.\n\t * @return {boolean} Whether the given line segment intersects with the plane or not.\n\t */\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with the plane.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with the plane or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with the plane.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with the plane or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns a coplanar vector to the plane, by calculating the\n\t * projection of the normal at the origin onto the plane.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The coplanar point.\n\t */\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\t/**\n\t * Apply a 4x4 matrix to the plane. The matrix must be an affine, homogeneous transform.\n\t *\n\t * The optional normal matrix can be pre-computed like so:\n\t * ```js\n\t * const optionalNormalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\n\t * ```\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @param {Matrix4} [optionalNormalMatrix] - A pre-computed normal matrix.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the plane by the distance defined by the given offset vector.\n\t * Note that this only affects the plane constant and will not affect the normal vector.\n\t *\n\t * @param {Vector3} offset - The offset vector.\n\t * @return {Plane} A reference to this plane.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this plane is equal with the given one.\n\t *\n\t * @param {Plane} plane - The plane to test for equality.\n\t * @return {boolean} Whether this plane is equal with the given one.\n\t */\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\t/**\n\t * Returns a new plane with copied values from this instance.\n\t *\n\t * @return {Plane} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\nconst _defaultSpriteCenter = /*@__PURE__*/ new Vector2( 0.5, 0.5 );\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\n/**\n * Frustums are used to determine what is inside the camera's field of view.\n * They help speed up the rendering process - objects which lie outside a camera's\n * frustum can safely be excluded from rendering.\n *\n * This class is mainly intended for use internally by a renderer.\n */\nclass Frustum {\n\n\t/**\n\t * Constructs a new frustum.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t */\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\t/**\n\t\t * This array holds the planes that enclose the frustum.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\t/**\n\t * Sets the frustum planes by copying the given planes.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given frustum to this instance.\n\t *\n\t * @param {Frustum} frustum - The frustum to copy.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the frustum planes from the given projection matrix.\n\t *\n\t * @param {Matrix4} m - The projection matrix.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} coordinateSystem - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tsetFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tplanes[ 4 ].setComponents( me2, me6, me10, me14 ).normalize(); // far\n\t\t\tplanes[ 5 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // near\n\n\t\t} else {\n\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // far\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); // near\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize(); // near\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting this frustum.\n\t *\n\t * Note that the 3D object must have a geometry so that the bounding sphere can be calculated.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @return {boolean} Whether the 3D object's bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsObject( object ) {\n\n\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconst geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t}\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting this frustum.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @return {boolean} Whether the sprite is intersecting this frustum or not.\n\t */\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$3.center.set( 0, 0, 0 );\n\n\t\tconst offset = _defaultSpriteCenter.distanceTo( sprite.center );\n\n\t\t_sphere$3.radius = 0.7071067811865476 + offset;\n\t\t_sphere$3.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting this frustum.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting this frustum.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box is intersecting this frustum or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$6.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$6.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$6.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$6 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within the frustum.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the point lies within this frustum or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns a new frustum with copied values from this instance.\n\t *\n\t * @return {Frustum} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _projScreenMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _frustum$1 = /*@__PURE__*/ new Frustum();\n\n/**\n * FrustumArray is used to determine if an object is visible in at least one camera\n * from an array of cameras. This is particularly useful for multi-view renderers.\n*/\nclass FrustumArray {\n\n\t/**\n\t * Constructs a new frustum array.\n\t *\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The coordinate system to use.\n\t\t *\n\t\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t\t * @default WebGLCoordinateSystem\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the 3D object is visible in any camera.\n\t */\n\tintersectsObject( object, cameraArray ) {\n\n\t\tif ( ! cameraArray.isArrayCamera || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsObject( object ) ) {\n\n\t\t\t\treturn true; // Object is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sprite is visible in any camera.\n\t */\n\tintersectsSprite( sprite, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSprite( sprite ) ) {\n\n\t\t\t\treturn true; // Sprite is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sphere is visible in any camera.\n\t */\n\tintersectsSphere( sphere, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSphere( sphere ) ) {\n\n\t\t\t\treturn true; // Sphere is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the box is visible in any camera.\n\t */\n\tintersectsBox( box, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsBox( box ) ) {\n\n\t\t\t\treturn true; // Box is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within any frustum\n\t * from the camera array.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the point is visible in any camera.\n\t */\n\tcontainsPoint( point, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.containsPoint( point ) ) {\n\n\t\t\t\treturn true; // Point is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns a new frustum array with copied values from this instance.\n\t *\n\t * @return {FrustumArray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FrustumArray();\n\n\t}\n\n}\n\nfunction ascIdSort( a, b ) {\n\n\treturn a - b;\n\n}\n\nfunction sortOpaque( a, b ) {\n\n\treturn a.z - b.z;\n\n}\n\nfunction sortTransparent( a, b ) {\n\n\treturn b.z - a.z;\n\n}\n\nclass MultiDrawRenderList {\n\n\tconstructor() {\n\n\t\tthis.index = 0;\n\t\tthis.pool = [];\n\t\tthis.list = [];\n\n\t}\n\n\tpush( start, count, z, index ) {\n\n\t\tconst pool = this.pool;\n\t\tconst list = this.list;\n\t\tif ( this.index >= pool.length ) {\n\n\t\t\tpool.push( {\n\n\t\t\t\tstart: -1,\n\t\t\t\tcount: -1,\n\t\t\t\tz: -1,\n\t\t\t\tindex: -1,\n\n\t\t\t} );\n\n\t\t}\n\n\t\tconst item = pool[ this.index ];\n\t\tlist.push( item );\n\t\tthis.index ++;\n\n\t\titem.start = start;\n\t\titem.count = count;\n\t\titem.z = z;\n\t\titem.index = index;\n\n\t}\n\n\treset() {\n\n\t\tthis.list.length = 0;\n\t\tthis.index = 0;\n\n\t}\n\n}\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );\nconst _frustum = /*@__PURE__*/ new Frustum();\nconst _frustumArray = /*@__PURE__*/ new FrustumArray();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _forward$1 = /*@__PURE__*/ new Vector3();\nconst _temp = /*@__PURE__*/ new Vector3();\nconst _renderList = /*@__PURE__*/ new MultiDrawRenderList();\nconst _mesh = /*@__PURE__*/ new Mesh();\nconst _batchIntersects = [];\n\n// copies data from attribute \"src\" into \"target\" starting at \"targetOffset\"\nfunction copyAttributeData( src, target, targetOffset = 0 ) {\n\n\tconst itemSize = target.itemSize;\n\tif ( src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor ) {\n\n\t\t// use the component getters and setters if the array data cannot\n\t\t// be copied directly\n\t\tconst vertexCount = src.count;\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\ttarget.setComponent( i + targetOffset, c, src.getComponent( i, c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// faster copy approach using typed array set function\n\t\ttarget.array.set( src.array, targetOffset * itemSize );\n\n\t}\n\n\ttarget.needsUpdate = true;\n\n}\n\n// safely copies array contents to a potentially smaller array\nfunction copyArrayContents( src, target ) {\n\n\tif ( src.constructor !== target.constructor ) {\n\n\t\t// if arrays are of a different type (eg due to index size increasing) then data must be per-element copied\n\t\tconst len = Math.min( src.length, target.length );\n\t\tfor ( let i = 0; i < len; i ++ ) {\n\n\t\t\ttarget[ i ] = src[ i ];\n\n\t\t}\n\n\t} else {\n\n\t\t// if the arrays use the same data layout we can use a fast block copy\n\t\tconst len = Math.min( src.length, target.length );\n\t\ttarget.set( new src.constructor( src.buffer, 0, len ) );\n\n\t}\n\n}\n\n/**\n * A special version of a mesh with multi draw batch rendering support. Use\n * this class if you have to render a large number of objects with the same\n * material but with different geometries or world transformations. The usage of\n * `BatchedMesh` will help you to reduce the number of draw calls and thus improve the overall\n * rendering performance in your application.\n *\n * ```js\n * const box = new THREE.BoxGeometry( 1, 1, 1 );\n * const sphere = new THREE.SphereGeometry( 1, 12, 12 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n *\n * // initialize and add geometries into the batched mesh\n * const batchedMesh = new BatchedMesh( 10, 5000, 10000, material );\n * const boxGeometryId = batchedMesh.addGeometry( box );\n * const sphereGeometryId = batchedMesh.addGeometry( sphere );\n *\n * // create instances of those geometries\n * const boxInstancedId1 = batchedMesh.addInstance( boxGeometryId );\n * const boxInstancedId2 = batchedMesh.addInstance( boxGeometryId );\n *\n * const sphereInstancedId1 = batchedMesh.addInstance( sphereGeometryId );\n * const sphereInstancedId2 = batchedMesh.addInstance( sphereGeometryId );\n *\n * // position the geometries\n * batchedMesh.setMatrixAt( boxInstancedId1, boxMatrix1 );\n * batchedMesh.setMatrixAt( boxInstancedId2, boxMatrix2 );\n *\n * batchedMesh.setMatrixAt( sphereInstancedId1, sphereMatrix1 );\n * batchedMesh.setMatrixAt( sphereInstancedId2, sphereMatrix2 );\n *\n * scene.add( batchedMesh );\n * ```\n *\n * @augments Mesh\n */\nclass BatchedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new batched mesh.\n\t *\n\t * @param {number} maxInstanceCount - The maximum number of individual instances planned to be added and rendered.\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries.\n\t * @param {number} [maxIndexCount=maxVertexCount*2] - The maximum number of indices to be used by all unique geometries\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {\n\n\t\tsuper( new BufferGeometry(), material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBatchedMesh = true;\n\n\t\t/**\n\t\t * When set ot `true`, the individual objects of a batch are frustum culled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.perObjectFrustumCulled = true;\n\n\t\t/**\n\t\t * When set to `true`, the individual objects of a batch are sorted to improve overdraw-related artifacts.\n\t\t * If the material is marked as \"transparent\" objects are rendered back to front and if not then they are\n\t\t * rendered front to back.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t/**\n\t\t * The bounding box of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered\n\t\t * sort with.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.customSort = null;\n\n\t\t// stores visible, active, and geometry id per instance and reserved buffer ranges for geometries\n\t\tthis._instanceInfo = [];\n\t\tthis._geometryInfo = [];\n\n\t\t// instance, geometry ids that have been set as inactive, and are available to be overwritten\n\t\tthis._availableInstanceIds = [];\n\t\tthis._availableGeometryIds = [];\n\n\t\t// used to track where the next point is that geometry should be inserted\n\t\tthis._nextIndexStart = 0;\n\t\tthis._nextVertexStart = 0;\n\t\tthis._geometryCount = 0;\n\n\t\t// flags\n\t\tthis._visibilityChanged = true;\n\t\tthis._geometryInitialized = false;\n\n\t\t// cached user options\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\t// buffers for multi draw\n\t\tthis._multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawCount = 0;\n\t\tthis._multiDrawInstances = null;\n\n\t\t// Local matrix per geometry by using data texture\n\t\tthis._matricesTexture = null;\n\t\tthis._indirectTexture = null;\n\t\tthis._colorsTexture = null;\n\n\t\tthis._initMatricesTexture();\n\t\tthis._initIndirectTexture();\n\n\t}\n\n\t/**\n\t * The maximum number of individual instances that can be stored in the batch.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget maxInstanceCount() {\n\n\t\treturn this._maxInstanceCount;\n\n\t}\n\n\t/**\n\t * The instance count.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget instanceCount() {\n\n\t\treturn this._instanceInfo.length - this._availableInstanceIds.length;\n\n\t}\n\n\t/**\n\t * The number of unused vertices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedVertexCount() {\n\n\t\treturn this._maxVertexCount - this._nextVertexStart;\n\n\t}\n\n\t/**\n\t * The number of unused indices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedIndexCount() {\n\n\t\treturn this._maxIndexCount - this._nextIndexStart;\n\n\t}\n\n\t_initMatricesTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 matrices * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 matrices * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst matricesArray = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tconst matricesTexture = new DataTexture( matricesArray, size, size, RGBAFormat, FloatType );\n\n\t\tthis._matricesTexture = matricesTexture;\n\n\t}\n\n\t_initIndirectTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\tconst indirectArray = new Uint32Array( size * size );\n\t\tconst indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );\n\n\t\tthis._indirectTexture = indirectTexture;\n\n\t}\n\n\t_initColorsTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\t// 4 floats per RGBA pixel initialized to white\n\t\tconst colorsArray = new Float32Array( size * size * 4 ).fill( 1 );\n\t\tconst colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );\n\t\tcolorsTexture.colorSpace = ColorManagement.workingColorSpace;\n\n\t\tthis._colorsTexture = colorsTexture;\n\n\t}\n\n\t_initializeGeometry( reference ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst maxVertexCount = this._maxVertexCount;\n\t\tconst maxIndexCount = this._maxIndexCount;\n\t\tif ( this._geometryInitialized === false ) {\n\n\t\t\tfor ( const attributeName in reference.attributes ) {\n\n\t\t\t\tconst srcAttribute = reference.getAttribute( attributeName );\n\t\t\t\tconst { array, itemSize, normalized } = srcAttribute;\n\n\t\t\t\tconst dstArray = new array.constructor( maxVertexCount * itemSize );\n\t\t\t\tconst dstAttribute = new BufferAttribute( dstArray, itemSize, normalized );\n\n\t\t\t\tgeometry.setAttribute( attributeName, dstAttribute );\n\n\t\t\t}\n\n\t\t\tif ( reference.getIndex() !== null ) {\n\n\t\t\t\t// Reserve last u16 index for primitive restart.\n\t\t\t\tconst indexArray = maxVertexCount > 65535\n\t\t\t\t\t? new Uint32Array( maxIndexCount )\n\t\t\t\t\t: new Uint16Array( maxIndexCount );\n\n\t\t\t\tgeometry.setIndex( new BufferAttribute( indexArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tthis._geometryInitialized = true;\n\n\t\t}\n\n\t}\n\n\t// Make sure the geometry is compatible with the existing combined geometry attributes\n\t_validateGeometry( geometry ) {\n\n\t\t// check to ensure the geometries are using consistent attributes and indices\n\t\tconst batchGeometry = this.geometry;\n\t\tif ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: All geometries must consistently have \"index\".' );\n\n\t\t}\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\tif ( ! geometry.hasAttribute( attributeName ) ) {\n\n\t\t\t\tthrow new Error( `THREE.BatchedMesh: Added geometry missing \"${ attributeName }\". All geometries must have consistent attributes.` );\n\n\t\t\t}\n\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tif ( srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized ) {\n\n\t\t\t\tthrow new Error( 'THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the instance defined by the given ID.\n\t *\n\t * @param {number} instanceId - The instance to validate.\n\t */\n\tvalidateInstanceId( instanceId ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tif ( instanceId < 0 || instanceId >= instanceInfo.length || instanceInfo[ instanceId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid instanceId ${instanceId}. Instance is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the geometry defined by the given ID.\n\t *\n\t * @param {number} geometryId - The geometry to validate.\n\t */\n\tvalidateGeometryId( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId < 0 || geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid geometryId ${geometryId}. Geometry is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered sort with.\n\t *\n\t * @param {Function} func - The custom sort function.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetCustomSort( func ) {\n\n\t\tthis.customSort = func;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box, updating {@link BatchedMesh#boundingBox}.\n\t * Bounding boxes aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst boundingBox = this.boundingBox;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingBox.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingBox.union( _box$1 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}.\n\t * Bounding spheres aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingSphere.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingSphere.union( _sphere$2 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds a new instance to the batch using the geometry of the given ID and returns\n\t * a new id referring to the new instance to be used by other functions.\n\t *\n\t * @param {number} geometryId - The ID of a previously added geometry via {@link BatchedMesh#addGeometry}.\n\t * @return {number} The instance ID.\n\t */\n\taddInstance( geometryId ) {\n\n\t\tconst atCapacity = this._instanceInfo.length >= this.maxInstanceCount;\n\n\t\t// ensure we're not over geometry\n\t\tif ( atCapacity && this._availableInstanceIds.length === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum item count reached.' );\n\n\t\t}\n\n\t\tconst instanceInfo = {\n\t\t\tvisible: true,\n\t\t\tactive: true,\n\t\t\tgeometryIndex: geometryId,\n\t\t};\n\n\t\tlet drawId = null;\n\n\t\t// Prioritize using previously freed instance ids\n\t\tif ( this._availableInstanceIds.length > 0 ) {\n\n\t\t\tthis._availableInstanceIds.sort( ascIdSort );\n\n\t\t\tdrawId = this._availableInstanceIds.shift();\n\t\t\tthis._instanceInfo[ drawId ] = instanceInfo;\n\n\t\t} else {\n\n\t\t\tdrawId = this._instanceInfo.length;\n\t\t\tthis._instanceInfo.push( instanceInfo );\n\n\t\t}\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\t_matrix$1.identity().toArray( matricesTexture.image.data, drawId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\tconst colorsTexture = this._colorsTexture;\n\t\tif ( colorsTexture ) {\n\n\t\t\t_whiteColor.toArray( colorsTexture.image.data, drawId * 4 );\n\t\t\tcolorsTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn drawId;\n\n\t}\n\n\t/**\n\t * Adds the given geometry to the batch and returns the associated\n\t * geometry id referring to it to be used in other functions.\n\t *\n\t * @param {BufferGeometry} geometry - The geometry to add.\n\t * @param {number} [reservedVertexCount=-1] - Optional parameter specifying the amount of\n\t * vertex buffer space to reserve for the added geometry. This is necessary if it is planned\n\t * to set a new geometry at this index at a later time that is larger than the original geometry.\n\t * Defaults to the length of the given geometry vertex buffer.\n\t * @param {number} [reservedIndexCount=-1] - Optional parameter specifying the amount of index\n\t * buffer space to reserve for the added geometry. This is necessary if it is planned to set a\n\t * new geometry at this index at a later time that is larger than the original geometry. Defaults to\n\t * the length of the given geometry index buffer.\n\t * @return {number} The geometry ID.\n\t */\n\taddGeometry( geometry, reservedVertexCount = -1, reservedIndexCount = -1 ) {\n\n\t\tthis._initializeGeometry( geometry );\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst geometryInfo = {\n\t\t\t// geometry information\n\t\t\tvertexStart: -1,\n\t\t\tvertexCount: -1,\n\t\t\treservedVertexCount: -1,\n\n\t\t\tindexStart: -1,\n\t\t\tindexCount: -1,\n\t\t\treservedIndexCount: -1,\n\n\t\t\t// draw range information\n\t\t\tstart: -1,\n\t\t\tcount: -1,\n\n\t\t\t// state\n\t\t\tboundingBox: null,\n\t\t\tboundingSphere: null,\n\t\t\tactive: true,\n\t\t};\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tgeometryInfo.vertexStart = this._nextVertexStart;\n\t\tgeometryInfo.reservedVertexCount = reservedVertexCount === -1 ? geometry.getAttribute( 'position' ).count : reservedVertexCount;\n\n\t\tconst index = geometry.getIndex();\n\t\tconst hasIndex = index !== null;\n\t\tif ( hasIndex ) {\n\n\t\t\tgeometryInfo.indexStart = this._nextIndexStart;\n\t\t\tgeometryInfo.reservedIndexCount = reservedIndexCount === -1 ? index.count : reservedIndexCount;\n\n\t\t}\n\n\t\tif (\n\t\t\tgeometryInfo.indexStart !== -1 &&\n\t\t\tgeometryInfo.indexStart + geometryInfo.reservedIndexCount > this._maxIndexCount ||\n\t\t\tgeometryInfo.vertexStart + geometryInfo.reservedVertexCount > this._maxVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.' );\n\n\t\t}\n\n\t\t// update id\n\t\tlet geometryId;\n\t\tif ( this._availableGeometryIds.length > 0 ) {\n\n\t\t\tthis._availableGeometryIds.sort( ascIdSort );\n\n\t\t\tgeometryId = this._availableGeometryIds.shift();\n\t\t\tgeometryInfoList[ geometryId ] = geometryInfo;\n\n\n\t\t} else {\n\n\t\t\tgeometryId = this._geometryCount;\n\t\t\tthis._geometryCount ++;\n\t\t\tgeometryInfoList.push( geometryInfo );\n\n\t\t}\n\n\t\t// update the geometry\n\t\tthis.setGeometryAt( geometryId, geometry );\n\n\t\t// increment the next geometry position\n\t\tthis._nextIndexStart = geometryInfo.indexStart + geometryInfo.reservedIndexCount;\n\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Replaces the geometry at the given ID with the provided geometry. Throws an error if there\n\t * is not enough space reserved for geometry. Calling this will change all instances that are\n\t * rendering that geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry that should be replaced with the given geometry.\n\t * @param {BufferGeometry} geometry - The new geometry.\n\t * @return {number} The geometry ID.\n\t */\n\tsetGeometryAt( geometryId, geometry ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum geometry count reached.' );\n\n\t\t}\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst batchGeometry = this.geometry;\n\t\tconst hasIndex = batchGeometry.getIndex() !== null;\n\t\tconst dstIndex = batchGeometry.getIndex();\n\t\tconst srcIndex = geometry.getIndex();\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif (\n\t\t\thasIndex &&\n\t\t\tsrcIndex.count > geometryInfo.reservedIndexCount ||\n\t\t\tgeometry.attributes.position.count > geometryInfo.reservedVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space not large enough for provided geometry.' );\n\n\t\t}\n\n\t\t// copy geometry buffer data over\n\t\tconst vertexStart = geometryInfo.vertexStart;\n\t\tconst reservedVertexCount = geometryInfo.reservedVertexCount;\n\t\tgeometryInfo.vertexCount = geometry.getAttribute( 'position' ).count;\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\t// copy attribute data\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tcopyAttributeData( srcAttribute, dstAttribute, vertexStart );\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tconst itemSize = srcAttribute.itemSize;\n\t\t\tfor ( let i = srcAttribute.count, l = reservedVertexCount; i < l; i ++ ) {\n\n\t\t\t\tconst index = vertexStart + i;\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tdstAttribute.setComponent( index, c, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdstAttribute.needsUpdate = true;\n\t\t\tdstAttribute.addUpdateRange( vertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t}\n\n\t\t// copy index\n\t\tif ( hasIndex ) {\n\n\t\t\tconst indexStart = geometryInfo.indexStart;\n\t\t\tconst reservedIndexCount = geometryInfo.reservedIndexCount;\n\t\t\tgeometryInfo.indexCount = geometry.getIndex().count;\n\n\t\t\t// copy index data over\n\t\t\tfor ( let i = 0; i < srcIndex.count; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart + srcIndex.getX( i ) );\n\n\t\t\t}\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tfor ( let i = srcIndex.count, l = reservedIndexCount; i < l; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart );\n\n\t\t\t}\n\n\t\t\tdstIndex.needsUpdate = true;\n\t\t\tdstIndex.addUpdateRange( indexStart, geometryInfo.reservedIndexCount );\n\n\t\t}\n\n\t\t// update the draw range\n\t\tgeometryInfo.start = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\t\tgeometryInfo.count = hasIndex ? geometryInfo.indexCount : geometryInfo.vertexCount;\n\n\t\t// store the bounding boxes\n\t\tgeometryInfo.boundingBox = null;\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tgeometryInfo.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tgeometryInfo.boundingSphere = null;\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tgeometryInfo.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Deletes the geometry defined by the given ID from this batch. Any instances referencing\n\t * this geometry will also be removed as a side effect.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteGeometry( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t// delete any instances associated with this geometry\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active && instanceInfo[ i ].geometryIndex === geometryId ) {\n\n\t\t\t\tthis.deleteInstance( i );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometryInfoList[ geometryId ].active = false;\n\t\tthis._availableGeometryIds.push( geometryId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes an existing instance from the batch using the given ID.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteInstance( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tthis._instanceInfo[ instanceId ].active = false;\n\t\tthis._availableInstanceIds.push( instanceId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Repacks the sub geometries in [name] to remove any unused space remaining from\n\t * previously deleted geometry, freeing up space to add new geometry.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\toptimize() {\n\n\t\t// track the next indices to copy data to\n\t\tlet nextVertexStart = 0;\n\t\tlet nextIndexStart = 0;\n\n\t\t// Iterate over all geometry ranges in order sorted from earliest in the geometry buffer to latest\n\t\t// in the geometry buffer. Because draw range objects can be reused there is no guarantee of their order.\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst indices = geometryInfoList\n\t\t\t.map( ( e, i ) => i )\n\t\t\t.sort( ( a, b ) => {\n\n\t\t\t\treturn geometryInfoList[ a ].vertexStart - geometryInfoList[ b ].vertexStart;\n\n\t\t\t} );\n\n\t\tconst geometry = this.geometry;\n\t\tfor ( let i = 0, l = geometryInfoList.length; i < l; i ++ ) {\n\n\t\t\t// if a geometry range is inactive then don't copy anything\n\t\t\tconst index = indices[ i ];\n\t\t\tconst geometryInfo = geometryInfoList[ index ];\n\t\t\tif ( geometryInfo.active === false ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// if a geometry contains an index buffer then shift it, as well\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tif ( geometryInfo.indexStart !== nextIndexStart ) {\n\n\t\t\t\t\tconst { indexStart, vertexStart, reservedIndexCount } = geometryInfo;\n\t\t\t\t\tconst index = geometry.index;\n\t\t\t\t\tconst array = index.array;\n\n\t\t\t\t\t// shift the index pointers based on how the vertex data will shift\n\t\t\t\t\t// adjusting the index must happen first so the original vertex start value is available\n\t\t\t\t\tconst elementDelta = nextVertexStart - vertexStart;\n\t\t\t\t\tfor ( let j = indexStart; j < indexStart + reservedIndexCount; j ++ ) {\n\n\t\t\t\t\t\tarray[ j ] = array[ j ] + elementDelta;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tindex.array.copyWithin( nextIndexStart, indexStart, indexStart + reservedIndexCount );\n\t\t\t\t\tindex.addUpdateRange( nextIndexStart, reservedIndexCount );\n\n\t\t\t\t\tgeometryInfo.indexStart = nextIndexStart;\n\n\t\t\t\t}\n\n\t\t\t\tnextIndexStart += geometryInfo.reservedIndexCount;\n\n\t\t\t}\n\n\t\t\t// if a geometry needs to be moved then copy attribute data to overwrite unused space\n\t\t\tif ( geometryInfo.vertexStart !== nextVertexStart ) {\n\n\t\t\t\tconst { vertexStart, reservedVertexCount } = geometryInfo;\n\t\t\t\tconst attributes = geometry.attributes;\n\t\t\t\tfor ( const key in attributes ) {\n\n\t\t\t\t\tconst attribute = attributes[ key ];\n\t\t\t\t\tconst { array, itemSize } = attribute;\n\t\t\t\t\tarray.copyWithin( nextVertexStart * itemSize, vertexStart * itemSize, ( vertexStart + reservedVertexCount ) * itemSize );\n\t\t\t\t\tattribute.addUpdateRange( nextVertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tgeometryInfo.vertexStart = nextVertexStart;\n\n\t\t\t}\n\n\t\t\tnextVertexStart += geometryInfo.reservedVertexCount;\n\t\t\tgeometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\n\t\t\t// step the next geometry points to the shifted position\n\t\t\tthis._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0;\n\t\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the bounding box for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding box for.\n\t * @param {Box3} target - The target object that is used to store the method's result.\n\t * @return {?Box3} The geometry's bounding box. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingBoxAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding box\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingBox === null ) {\n\n\t\t\tconst box = new Box3();\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\tbox.expandByPoint( _vector$5.fromBufferAttribute( position, iv ) );\n\n\t\t\t}\n\n\t\t\tgeometryInfo.boundingBox = box;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingBox );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the bounding sphere for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding sphere for.\n\t * @param {Sphere} target - The target object that is used to store the method's result.\n\t * @return {?Sphere} The geometry's bounding sphere. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingSphereAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding sphere\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingSphere === null ) {\n\n\t\t\tconst sphere = new Sphere();\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 );\n\t\t\t_box$1.getCenter( sphere.center );\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet maxRadiusSq = 0;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\t_vector$5.fromBufferAttribute( position, iv );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, sphere.center.distanceToSquared( _vector$5 ) );\n\n\t\t\t}\n\n\t\t\tsphere.radius = Math.sqrt( maxRadiusSq );\n\t\t\tgeometryInfo.boundingSphere = sphere;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingSphere );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance.\n\t * Negatively scaled matrices are not supported.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the matrix of.\n\t * @param {Matrix4} matrix - A 4x4 matrix representing the local transformation of a single instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\t\tmatrix.toArray( matricesArray, instanceId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the matrix of.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t * @return {Matrix4} The instance's local transformation matrix.\n\t */\n\tgetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn matrix.fromArray( this._matricesTexture.image.data, instanceId * 16 );\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the color of.\n\t * @param {Color} color - The color to set the instance to.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._colorsTexture === null ) {\n\n\t\t\tthis._initColorsTexture();\n\n\t\t}\n\n\t\tcolor.toArray( this._colorsTexture.image.data, instanceId * 4 );\n\t\tthis._colorsTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the color of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the color of.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t * @return {Color} The instance's color.\n\t */\n\tgetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn color.fromArray( this._colorsTexture.image.data, instanceId * 4 );\n\n\t}\n\n\t/**\n\t * Sets the visibility of the instance.\n\t *\n\t * @param {number} instanceId - The id of the instance to set the visibility of.\n\t * @param {boolean} visible - Whether the instance is visible or not.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetVisibleAt( instanceId, visible ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._instanceInfo[ instanceId ].visible === visible ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis._instanceInfo[ instanceId ].visible = visible;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the visibility state of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the visibility state of.\n\t * @return {boolean} Whether the instance is visible or not.\n\t */\n\tgetVisibleAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].visible;\n\n\t}\n\n\t/**\n\t * Sets the geometry ID of the instance at the given index.\n\t *\n\t * @param {number} instanceId - The ID of the instance to set the geometry ID of.\n\t * @param {number} geometryId - The geometry ID to be use by the instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetGeometryIdAt( instanceId, geometryId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tthis._instanceInfo[ instanceId ].geometryIndex = geometryId;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the geometry ID of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the geometry ID of.\n\t * @return {number} The instance's geometry ID.\n\t */\n\tgetGeometryIdAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].geometryIndex;\n\n\t}\n\n\t/**\n\t * Get the range representing the subset of triangles related to the attached geometry,\n\t * indicating the starting offset and count, or `null` if invalid.\n\t *\n\t * @param {number} geometryId - The id of the geometry to get the range of.\n\t * @param {Object} [target] - The target object that is used to store the method's result.\n\t * @return {{\n\t * \tvertexStart:number,vertexCount:number,reservedVertexCount:number,\n\t * \tindexStart:number,indexCount:number,reservedIndexCount:number,\n\t * \tstart:number,count:number\n\t * }} The result object with range data.\n\t */\n\tgetGeometryRangeAt( geometryId, target = {} ) {\n\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\ttarget.vertexStart = geometryInfo.vertexStart;\n\t\ttarget.vertexCount = geometryInfo.vertexCount;\n\t\ttarget.reservedVertexCount = geometryInfo.reservedVertexCount;\n\n\t\ttarget.indexStart = geometryInfo.indexStart;\n\t\ttarget.indexCount = geometryInfo.indexCount;\n\t\ttarget.reservedIndexCount = geometryInfo.reservedIndexCount;\n\n\t\ttarget.start = geometryInfo.start;\n\t\ttarget.count = geometryInfo.count;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Resizes the necessary buffers to support the provided number of instances.\n\t * If the provided arguments shrink the number of instances but there are not enough\n\t * unused Ids at the end of the list then an error is thrown.\n\t *\n\t * @param {number} maxInstanceCount - The max number of individual instances that can be added and rendered by the batch.\n\t*/\n\tsetInstanceCount( maxInstanceCount ) {\n\n\t\t// shrink the available instances as much as possible\n\t\tconst availableInstanceIds = this._availableInstanceIds;\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tavailableInstanceIds.sort( ascIdSort );\n\t\twhile ( availableInstanceIds[ availableInstanceIds.length - 1 ] === instanceInfo.length - 1 ) {\n\n\t\t\tinstanceInfo.pop();\n\t\t\tavailableInstanceIds.pop();\n\n\t\t}\n\n\t\t// throw an error if it can't be shrunk to the desired size\n\t\tif ( maxInstanceCount < instanceInfo.length ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Instance ids outside the range ${ maxInstanceCount } are being used. Cannot shrink instance count.` );\n\n\t\t}\n\n\t\t// copy the multi draw counts\n\t\tconst multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tconst multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tcopyArrayContents( this._multiDrawCounts, multiDrawCounts );\n\t\tcopyArrayContents( this._multiDrawStarts, multiDrawStarts );\n\n\t\tthis._multiDrawCounts = multiDrawCounts;\n\t\tthis._multiDrawStarts = multiDrawStarts;\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\n\t\t// update texture data for instance sampling\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst colorsTexture = this._colorsTexture;\n\n\t\tindirectTexture.dispose();\n\t\tthis._initIndirectTexture();\n\t\tcopyArrayContents( indirectTexture.image.data, this._indirectTexture.image.data );\n\n\t\tmatricesTexture.dispose();\n\t\tthis._initMatricesTexture();\n\t\tcopyArrayContents( matricesTexture.image.data, this._matricesTexture.image.data );\n\n\t\tif ( colorsTexture ) {\n\n\t\t\tcolorsTexture.dispose();\n\t\t\tthis._initColorsTexture();\n\t\t\tcopyArrayContents( colorsTexture.image.data, this._colorsTexture.image.data );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resizes the available space in the batch's vertex and index buffer attributes to the provided sizes.\n\t * If the provided arguments shrink the geometry buffers but there is not enough unused space at the\n\t * end of the geometry attributes then an error is thrown.\n\t *\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries to resize to.\n\t * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries to resize to.\n\t*/\n\tsetGeometrySize( maxVertexCount, maxIndexCount ) {\n\n\t\t// Check if we can shrink to the requested vertex attribute size\n\t\tconst validRanges = [ ...this._geometryInfo ].filter( info => info.active );\n\t\tconst requiredVertexLength = Math.max( ...validRanges.map( range => range.vertexStart + range.reservedVertexCount ) );\n\t\tif ( requiredVertexLength > maxVertexCount ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Geometry vertex values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t}\n\n\t\t// Check if we can shrink to the requested index attribute size\n\t\tif ( this.geometry.index ) {\n\n\t\t\tconst requiredIndexLength = Math.max( ...validRanges.map( range => range.indexStart + range.reservedIndexCount ) );\n\t\t\tif ( requiredIndexLength > maxIndexCount ) {\n\n\t\t\t\tthrow new Error( `BatchedMesh: Geometry index values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\t// dispose of the previous geometry\n\t\tconst oldGeometry = this.geometry;\n\t\toldGeometry.dispose();\n\n\t\t// recreate the geometry needed based on the previous variant\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\tif ( this._geometryInitialized ) {\n\n\t\t\tthis._geometryInitialized = false;\n\t\t\tthis.geometry = new BufferGeometry();\n\t\t\tthis._initializeGeometry( oldGeometry );\n\n\t\t}\n\n\t\t// copy data from the previous geometry\n\t\tconst geometry = this.geometry;\n\t\tif ( oldGeometry.index ) {\n\n\t\t\tcopyArrayContents( oldGeometry.index.array, geometry.index.array );\n\n\t\t}\n\n\t\tfor ( const key in oldGeometry.attributes ) {\n\n\t\t\tcopyArrayContents( oldGeometry.attributes[ key ].array, geometry.attributes[ key ].array );\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst batchGeometry = this.geometry;\n\n\t\t// iterate over each geometry\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry.index = batchGeometry.index;\n\t\t_mesh.geometry.attributes = batchGeometry.attributes;\n\t\tif ( _mesh.geometry.boundingBox === null ) {\n\n\t\t\t_mesh.geometry.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( ! instanceInfo[ i ].visible || ! instanceInfo[ i ].active ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t_mesh.geometry.setDrawRange( geometryInfo.start, geometryInfo.count );\n\n\t\t\t// get the intersects\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\t\t\tthis.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );\n\t\t\tthis.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\t// add batch id to the intersects\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.material = null;\n\t\t_mesh.geometry.index = null;\n\t\t_mesh.geometry.attributes = {};\n\t\t_mesh.geometry.setDrawRange( 0, Infinity );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.geometry = source.geometry.clone();\n\t\tthis.perObjectFrustumCulled = source.perObjectFrustumCulled;\n\t\tthis.sortObjects = source.sortObjects;\n\t\tthis.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null;\n\t\tthis.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null;\n\n\t\tthis._geometryInfo = source._geometryInfo.map( info => ( {\n\t\t\t...info,\n\n\t\t\tboundingBox: info.boundingBox !== null ? info.boundingBox.clone() : null,\n\t\t\tboundingSphere: info.boundingSphere !== null ? info.boundingSphere.clone() : null,\n\t\t} ) );\n\t\tthis._instanceInfo = source._instanceInfo.map( info => ( { ...info } ) );\n\n\t\tthis._availableInstanceIds = source._availableInstanceIds.slice();\n\t\tthis._availableGeometryIds = source._availableGeometryIds.slice();\n\n\t\tthis._nextIndexStart = source._nextIndexStart;\n\t\tthis._nextVertexStart = source._nextVertexStart;\n\t\tthis._geometryCount = source._geometryCount;\n\n\t\tthis._maxInstanceCount = source._maxInstanceCount;\n\t\tthis._maxVertexCount = source._maxVertexCount;\n\t\tthis._maxIndexCount = source._maxIndexCount;\n\n\t\tthis._geometryInitialized = source._geometryInitialized;\n\t\tthis._multiDrawCounts = source._multiDrawCounts.slice();\n\t\tthis._multiDrawStarts = source._multiDrawStarts.slice();\n\n\t\tthis._indirectTexture = source._indirectTexture.clone();\n\t\tthis._indirectTexture.image.data = this._indirectTexture.image.data.slice();\n\n\t\tthis._matricesTexture = source._matricesTexture.clone();\n\t\tthis._matricesTexture.image.data = this._matricesTexture.image.data.slice();\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture = source._colorsTexture.clone();\n\t\t\tthis._colorsTexture.image.data = this._colorsTexture.image.data.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Assuming the geometry is not shared with other meshes\n\t\tthis.geometry.dispose();\n\n\t\tthis._matricesTexture.dispose();\n\t\tthis._matricesTexture = null;\n\n\t\tthis._indirectTexture.dispose();\n\t\tthis._indirectTexture = null;\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture.dispose();\n\t\t\tthis._colorsTexture = null;\n\n\t\t}\n\n\t}\n\n\tonBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) {\n\n\t\t// if visibility has not changed and frustum culling and object sorting is not required\n\t\t// then skip iterating over all items\n\t\tif ( ! this._visibilityChanged && ! this.perObjectFrustumCulled && ! this.sortObjects ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// the indexed version of the multi draw function requires specifying the start\n\t\t// offset in bytes.\n\t\tconst index = geometry.getIndex();\n\t\tconst bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst multiDrawStarts = this._multiDrawStarts;\n\t\tconst multiDrawCounts = this._multiDrawCounts;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst indirectArray = indirectTexture.image.data;\n\n\t\tconst frustum = camera.isArrayCamera ? _frustumArray : _frustum;\n\t\t// prepare the frustum in the local frame\n\t\tif ( perObjectFrustumCulled && ! camera.isArrayCamera ) {\n\n\t\t\t_matrix$1\n\t\t\t\t.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )\n\t\t\t\t.multiply( this.matrixWorld );\n\n\t\t\t_frustum.setFromProjectionMatrix(\n\t\t\t\t_matrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t}\n\n\t\tlet multiDrawCount = 0;\n\t\tif ( this.sortObjects ) {\n\n\t\t\t// get the camera position in the local frame\n\t\t\t_matrix$1.copy( this.matrixWorld ).invert();\n\t\t\t_vector$5.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _matrix$1 );\n\t\t\t_forward$1.set( 0, 0, -1 ).transformDirection( camera.matrixWorld ).transformDirection( _matrix$1 );\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\t// get the distance from camera used for sorting\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tconst z = _temp.subVectors( _sphere$2.center, _vector$5 ).dot( _forward$1 );\n\t\t\t\t\t\t_renderList.push( geometryInfo.start, geometryInfo.count, z, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Sort the draw ranges and prep for rendering\n\t\t\tconst list = _renderList.list;\n\t\t\tconst customSort = this.customSort;\n\t\t\tif ( customSort === null ) {\n\n\t\t\t\tlist.sort( material.transparent ? sortTransparent : sortOpaque );\n\n\t\t\t} else {\n\n\t\t\t\tcustomSort.call( this, list, camera );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = list.length; i < l; i ++ ) {\n\n\t\t\t\tconst item = list[ i ];\n\t\t\t\tmultiDrawStarts[ multiDrawCount ] = item.start * bytesPerElement;\n\t\t\t\tmultiDrawCounts[ multiDrawCount ] = item.count;\n\t\t\t\tindirectArray[ multiDrawCount ] = item.index;\n\t\t\t\tmultiDrawCount ++;\n\n\t\t\t}\n\n\t\t\t_renderList.reset();\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tmultiDrawStarts[ multiDrawCount ] = geometryInfo.start * bytesPerElement;\n\t\t\t\t\t\tmultiDrawCounts[ multiDrawCount ] = geometryInfo.count;\n\t\t\t\t\t\tindirectArray[ multiDrawCount ] = i;\n\t\t\t\t\t\tmultiDrawCount ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tindirectTexture.needsUpdate = true;\n\t\tthis._multiDrawCount = multiDrawCount;\n\t\tthis._visibilityChanged = false;\n\n\t}\n\n\tonBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial/* , group */ ) {\n\n\t\tthis.onBeforeRender( renderer, null, shadowCamera, geometry, depthMaterial );\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n * ```\n *\n * @augments Material\n */\nclass LineBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new line basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineBasicMaterial = true;\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * Sets the color of the lines using data from a texture. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}. WebGL and WebGPU\n\t\t * ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of line ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('butt'|'round'|'square')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of line joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vStart = /*@__PURE__*/ new Vector3();\nconst _vEnd = /*@__PURE__*/ new Vector3();\n\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nconst _intersectPointOnRay = /*@__PURE__*/ new Vector3();\nconst _intersectPointOnSegment = /*@__PURE__*/ new Vector3();\n\n/**\n * A continuous line. The line are rendered by connecting consecutive\n * vertices with straight lines.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0x0000ff } );\n *\n * const points = [];\n * points.push( new THREE.Vector3( - 10, 0, 0 ) );\n * points.push( new THREE.Vector3( 0, 10, 0 ) );\n * points.push( new THREE.Vector3( 10, 0, 0 ) );\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments Object3D\n */\nclass Line extends Object3D {\n\n\t/**\n\t * Constructs a new line.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\t/**\n\t\t * The line geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default LineBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes an array of distance values which are necessary for rendering dashed lines.\n\t * For each vertex in the geometry, the method calculates the cumulative length from the\n\t * current point to the very beginning of the line.\n\t *\n\t * @return {Line} A reference to this line.\n\t */\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_vStart.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_vEnd.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _vStart.distanceTo( _vEnd );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst a = index.getX( end - 1 );\n\t\t\t\tconst b = index.getX( start );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, i, i + 1, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, end - 1, start, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Line#morphTargetDictionary} and {@link Line#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection( object, raycaster, ray, thresholdSq, a, b, i ) {\n\n\tconst positionAttribute = object.geometry.attributes.position;\n\n\t_vStart.fromBufferAttribute( positionAttribute, a );\n\t_vEnd.fromBufferAttribute( positionAttribute, b );\n\n\tconst distSq = ray.distanceSqToSegment( _vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment );\n\n\tif ( distSq > thresholdSq ) return;\n\n\t_intersectPointOnRay.applyMatrix4( object.matrixWorld ); // Move back to world space for distance calculation\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectPointOnRay );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\treturn {\n\n\t\tdistance: distance,\n\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t// point: raycaster.ray.at( distance ),\n\t\tpoint: _intersectPointOnSegment.clone().applyMatrix4( object.matrixWorld ),\n\t\tindex: i,\n\t\tface: null,\n\t\tfaceIndex: null,\n\t\tbarycoord: null,\n\t\tobject: object\n\n\t};\n\n}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\n/**\n * A series of lines drawn between pairs of vertices.\n *\n * @augments Line\n */\nclass LineSegments extends Line {\n\n\t/**\n\t * Constructs a new line segments.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A continuous line. This is nearly the same as {@link Line} the only difference\n * is that the last vertex is connected with the first vertex in order to close\n * the line to form a loop.\n *\n * @augments Line\n */\nclass LineLoop extends Line {\n\n\t/**\n\t * Constructs a new line loop.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\n/**\n * A material for rendering point primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const vertices = [];\n *\n * for ( let i = 0; i < 10000; i ++ ) {\n * \tconst x = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst y = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst z = THREE.MathUtils.randFloatSpread( 2000 );\n *\n * \tvertices.push( x, y, z );\n * }\n *\n * const geometry = new THREE.BufferGeometry();\n * geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );\n * const material = new THREE.PointsMaterial( { color: 0x888888 } );\n * const points = new THREE.Points( geometry, material );\n * scene.add( points );\n * ```\n *\n * @augments Material\n */\nclass PointsMaterial extends Material {\n\n\t/**\n\t * Constructs a new points material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Defines the size of the points in pixels.\n\t\t *\n\t\t * Might be capped if the value exceeds hardware dependent parameters like [gl.ALIASED_POINT_SIZE_RANGE](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParamete).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = 1;\n\n\t\t/**\n\t\t * Specifies whether size of individual points is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\n/**\n * A class for displaying points or point clouds.\n *\n * @augments Object3D\n */\nclass Points extends Object3D {\n\n\t/**\n\t * Constructs a new point cloud.\n\t *\n\t * @param {BufferGeometry} [geometry] - The points geometry.\n\t * @param {Material|Array} [material] - The points material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\t/**\n\t\t * The points geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default PointsMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this point cloud.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Points#morphTargetDictionary} and {@link Points#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tfaceIndex: null,\n\t\t\tbarycoord: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * A texture for use with a video.\n *\n * ```js\n * // assuming you have created a HTML video element with id=\"video\"\n * const video = document.getElementById( 'video' );\n * const texture = new THREE.VideoTexture( video );\n * ```\n *\n * Note: When using video textures with {@link WebGPURenderer}, {@link Texture#colorSpace} must be\n * set to THREE.SRGBColorSpace.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments Texture\n */\nclass VideoTexture extends Texture {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {HTMLVideoElement} video - The video element to use as a data source for the texture.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( video, mapping, wrapS, wrapT, magFilter = LinearFilter, minFilter = LinearFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoTexture = true;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * The video frame request callback identifier, which is a positive integer.\n\t\t *\n\t\t * Value of 0 represents no scheduled rVFC.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t */\n\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tscope._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tthis._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\t/**\n\t * This method is called automatically by the renderer and sets {@link Texture#needsUpdate}\n\t * to `true` every time a new frame is available.\n\t *\n\t * Only relevant if `requestVideoFrameCallback` is not supported in the browser.\n\t */\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this._requestVideoFrameCallbackId !== 0 ) {\n\n\t\t\tthis.source.data.cancelVideoFrameCallback( this._requestVideoFrameCallbackId );\n\n\t\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\t}\n\n\t\tsuper.dispose();\n\n\t}\n\n}\n\n/**\n * This class can be used as an alternative way to define video data. Instead of using\n * an instance of `HTMLVideoElement` like with `VideoTexture`, `VideoFrameTexture` expects each frame is\n * defined manually via {@link VideoFrameTexture#setFrame}. A typical use case for this module is when\n * video frames are decoded with the WebCodecs API.\n *\n * ```js\n * const texture = new THREE.VideoFrameTexture();\n * texture.setFrame( frame );\n * ```\n *\n * @augments VideoTexture\n */\nclass VideoFrameTexture extends VideoTexture {\n\n\t/**\n\t * Constructs a new video frame texture.\n\t *\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( {}, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoFrameTexture = true;\n\n\t}\n\n\t/**\n\t * This method overwritten with an empty implementation since\n\t * this type of texture is updated via `setFrame()`.\n\t */\n\tupdate() {}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this ); // restoring Texture.clone()\n\n\t}\n\n\t/**\n\t * Sets the current frame of the video. This will automatically update the texture\n\t * so the data can be used for rendering.\n\t *\n\t * @param {VideoFrame} frame - The video frame.\n\t */\n\tsetFrame( frame ) {\n\n\t\tthis.image = frame;\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can only be used in combination with `copyFramebufferToTexture()` methods\n * of renderers. It extracts the contents of the current bound framebuffer and provides it\n * as a texture for further usage.\n *\n * ```js\n * const pixelRatio = window.devicePixelRatio;\n * const textureSize = 128 * pixelRatio;\n *\n * const frameTexture = new FramebufferTexture( textureSize, textureSize );\n *\n * // calculate start position for copying part of the frame data\n * const vector = new Vector2();\n * vector.x = ( window.innerWidth * pixelRatio / 2 ) - ( textureSize / 2 );\n * vector.y = ( window.innerHeight * pixelRatio / 2 ) - ( textureSize / 2 );\n *\n * renderer.render( scene, camera );\n *\n * // copy part of the rendered frame into the framebuffer texture\n * renderer.copyFramebufferToTexture( frameTexture, vector );\n * ```\n *\n * @augments Texture\n */\nclass FramebufferTexture extends Texture {\n\n\t/**\n\t * Constructs a new framebuffer texture.\n\t *\n\t * @param {number} [width] - The width of the texture.\n\t * @param {number} [height] - The height of the texture.\n\t */\n\tconstructor( width, height ) {\n\n\t\tsuper( { width, height } );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFramebufferTexture = true;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments Texture\n */\nclass CompressedTexture extends Texture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @type {{width:number,height:number}}\n\t\t */\n\t\tthis.image = { width: width, height: height };\n\n\t\t/**\n\t\t * This array holds for all mipmaps (including the bases mip) the data and dimensions.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.mipmaps = mipmaps;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not possible to\n\t\t * flip compressed textures.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not\n\t\t * possible to generate mipmaps for compressed data. Mipmaps\n\t\t * must be embedded in the compressed texture file.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\n/**\n * Creates a texture 2D array based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedArrayTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed array texture.\n\t *\n\t * @param {Array} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} depth - The depth of the texture.\n\t * @param {number} [format=RGBAFormat] - The min filter value.\n\t * @param {number} [type=UnsignedByteType] - The min filter value.\n\t */\n\tconstructor( mipmaps, width, height, depth, format, type ) {\n\n\t\tsuper( mipmaps, width, height, format, type );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedArrayTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @name CompressedArrayTexture#image\n\t\t * @type {{width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image.depth = depth;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire compressed texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * Creates a cube texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedCubeTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array} images - An array of compressed textures.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t */\n\tconstructor( images, format, type ) {\n\n\t\tsuper( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedCubeTexture = true;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.image = images;\n\n\t}\n\n}\n\n/**\n * Creates a texture from a canvas element.\n *\n * This is almost the same as the base texture class, except that it sets {@link Texture#needsUpdate}\n * to `true` immediately since a canvas can directly be used for rendering.\n *\n * @augments Texture\n */\nclass CanvasTexture extends Texture {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {HTMLCanvasElement} [canvas] - The HTML canvas element.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can be used to automatically save the depth information of a\n * rendering into a texture.\n *\n * @augments Texture\n */\nclass DepthTexture extends Texture {\n\n\t/**\n\t * Constructs a new depth texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [type=UnsignedIntType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {number} [format=DepthFormat] - The texture format.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( width, height, type = UnsignedIntType, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, format = DepthFormat, depth = 1 ) {\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tconst image = { width: width, height: height, depth: depth };\n\n\t\tsuper( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDepthTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * Code corresponding to the depth compare function.\n\t\t *\n\t\t * @type {?(NeverCompare|LessCompare|EqualCompare|LessEqualCompare|GreaterCompare|NotEqualCompare|GreaterEqualCompare|AlwaysCompare)}\n\t\t * @default null\n\t\t */\n\t\tthis.compareFunction = null;\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.source = new Source( Object.assign( {}, source.image ) ); // see #30540\n\t\tthis.compareFunction = source.compareFunction;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.compareFunction !== null ) data.compareFunction = this.compareFunction;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a texture created externally with the same renderer context.\n *\n * This may be a texture from a protected media stream, device camera feed,\n * or other data feeds like a depth sensor.\n *\n * Note that this class is only supported in {@link WebGLRenderer}, and in\n * the {@link WebGPURenderer} WebGPU backend.\n *\n * @augments Texture\n */\nclass ExternalTexture extends Texture {\n\n\t/**\n\t * Creates a new raw texture.\n\t *\n\t * @param {?(WebGLTexture|GPUTexture)} [sourceTexture=null] - The external texture.\n\t */\n\tconstructor( sourceTexture = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The external source texture.\n\t\t *\n\t\t * @type {?(WebGLTexture|GPUTexture)}\n\t\t * @default null\n\t\t */\n\t\tthis.sourceTexture = sourceTexture;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isExternalTexture = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sourceTexture = source.sourceTexture;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a capsule.\n *\n * ```js\n * const geometry = new THREE.CapsuleGeometry( 1, 1, 4, 8, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const capsule = new THREE.Mesh( geometry, material );\n * scene.add( capsule );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CapsuleGeometry\n */\nclass CapsuleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new capsule geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the capsule.\n\t * @param {number} [height=1] - Height of the middle section.\n\t * @param {number} [capSegments=4] - Number of curve segments used to build each cap.\n\t * @param {number} [radialSegments=8] - Number of segmented faces around the circumference of the capsule. Must be an integer >= 3.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the middle section. Must be an integer >= 1.\n\t */\n\tconstructor( radius = 1, height = 1, capSegments = 4, radialSegments = 8, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t};\n\n\t\theight = Math.max( 0, height );\n\t\tcapSegments = Math.max( 1, Math.floor( capSegments ) );\n\t\tradialSegments = Math.max( 3, Math.floor( radialSegments ) );\n\t\theightSegments = Math.max( 1, Math.floor( heightSegments ) );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst halfHeight = height / 2;\n\t\tconst capArcLength = ( Math.PI / 2 ) * radius;\n\t\tconst cylinderPartLength = height;\n\t\tconst totalArcLength = 2 * capArcLength + cylinderPartLength;\n\n\t\tconst numVerticalSegments = capSegments * 2 + heightSegments;\n\t\tconst verticesPerRow = radialSegments + 1;\n\n\t\tconst normal = new Vector3();\n\t\tconst vertex = new Vector3();\n\n\t\t// generate vertices, normals, and uvs\n\n\t\tfor ( let iy = 0; iy <= numVerticalSegments; iy ++ ) {\n\n\t\t\tlet currentArcLength = 0;\n\t\t\tlet profileY = 0;\n\t\t\tlet profileRadius = 0;\n\t\t\tlet normalYComponent = 0;\n\n\t\t\tif ( iy <= capSegments ) {\n\n\t\t\t\t// bottom cap\n\t\t\t\tconst segmentProgress = iy / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = - halfHeight - radius * Math.cos( angle );\n\t\t\t\tprofileRadius = radius * Math.sin( angle );\n\t\t\t\tnormalYComponent = - radius * Math.cos( angle );\n\t\t\t\tcurrentArcLength = segmentProgress * capArcLength;\n\n\t\t\t} else if ( iy <= capSegments + heightSegments ) {\n\n\t\t\t\t// middle section\n\t\t\t\tconst segmentProgress = ( iy - capSegments ) / heightSegments;\n\t\t\t\tprofileY = - halfHeight + segmentProgress * height;\n\t\t\t\tprofileRadius = radius;\n\t\t\t\tnormalYComponent = 0;\n\t\t\t\tcurrentArcLength = capArcLength + segmentProgress * cylinderPartLength;\n\n\t\t\t} else {\n\n\t\t\t\t// top cap\n\t\t\t\tconst segmentProgress =\n\t\t\t\t\t( iy - capSegments - heightSegments ) / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = halfHeight + radius * Math.sin( angle );\n\t\t\t\tprofileRadius = radius * Math.cos( angle );\n\t\t\t\tnormalYComponent = radius * Math.sin( angle );\n\t\t\t\tcurrentArcLength =\n\t\t\t\t\tcapArcLength + cylinderPartLength + segmentProgress * capArcLength;\n\n\t\t\t}\n\n\t\t\tconst v = Math.max( 0, Math.min( 1, currentArcLength / totalArcLength ) );\n\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / radialSegments;\n\n\t\t\t} else if ( iy === numVerticalSegments ) {\n\n\t\t\t\tuOffset = -0.5 / radialSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= radialSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / radialSegments;\n\t\t\t\tconst theta = u * Math.PI * 2;\n\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - profileRadius * cosTheta;\n\t\t\t\tvertex.y = profileY;\n\t\t\t\tvertex.z = profileRadius * sinTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set(\n\t\t\t\t\t- profileRadius * cosTheta,\n\t\t\t\t\tnormalYComponent,\n\t\t\t\t\tprofileRadius * sinTheta\n\t\t\t\t);\n\t\t\t\tnormal.normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, v );\n\n\t\t\t}\n\n\t\t\tif ( iy > 0 ) {\n\n\t\t\t\tconst prevIndexRow = ( iy - 1 ) * verticesPerRow;\n\t\t\t\tfor ( let ix = 0; ix < radialSegments; ix ++ ) {\n\n\t\t\t\t\tconst i1 = prevIndexRow + ix;\n\t\t\t\t\tconst i2 = prevIndexRow + ix + 1;\n\t\t\t\t\tconst i3 = iy * verticesPerRow + ix;\n\t\t\t\t\tconst i4 = iy * verticesPerRow + ix + 1;\n\n\t\t\t\t\tindices.push( i1, i2, i3 );\n\t\t\t\t\tindices.push( i2, i4, i3 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CapsuleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.height, data.capSegments, data.radialSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A simple shape of Euclidean geometry. It is constructed from a\n * number of triangular segments that are oriented around a central point and\n * extend as far out as a given radius. It is built counter-clockwise from a\n * start angle and a given central angle. It can also be used to create\n * regular polygons, where the number of segments determines the number of\n * sides.\n *\n * ```js\n * const geometry = new THREE.CircleGeometry( 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const circle = new THREE.Mesh( geometry, material );\n * scene.add( circle )\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CircleGeometry\n */\nclass CircleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new circle geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the circle.\n\t * @param {number} [segments=32] - Number of segments (triangles), minimum = `3`.\n\t * @param {number} [thetaStart=0] - Start angle for first segment in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta,\n\t * of the circular sector in radians. The default value results in a complete circle.\n\t */\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CircleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cylinder.\n *\n * ```js\n * const geometry = new THREE.CylinderGeometry( 5, 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cylinder = new THREE.Mesh( geometry, material );\n * scene.add( cylinder );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CylinderGeometry\n */\nclass CylinderGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new cylinder geometry.\n\t *\n\t * @param {number} [radiusTop=1] - Radius of the cylinder at the top.\n\t * @param {number} [radiusBottom=1] - Radius of the cylinder at the bottom.\n\t * @param {number} [height=1] - Height of the cylinder.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cylinder.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cylinder.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cylinder is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cylinder.\n\t */\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tif ( radiusTop > 0 || y !== 0 ) {\n\n\t\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( radiusBottom > 0 || y !== heightSegments - 1 ) {\n\n\t\t\t\t\t\tindices.push( b, c, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : -1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CylinderGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cone.\n *\n * ```js\n * const geometry = new THREE.ConeGeometry( 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cone = new THREE.Mesh(geometry, material );\n * scene.add( cone );\n * ```\n *\n * @augments CylinderGeometry\n * @demo scenes/geometry-browser.html#ConeGeometry\n */\nclass ConeGeometry extends CylinderGeometry {\n\n\t/**\n\t * Constructs a new cone geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the cone base.\n\t * @param {number} [height=1] - Height of the cone.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cone.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cone.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cone is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cone.\n\t */\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {ConeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A polyhedron is a solid in three dimensions with flat faces. This class\n * will take an array of vertices, project them onto a sphere, and then\n * divide them up to the desired level of detail.\n *\n * @augments BufferGeometry\n */\nclass PolyhedronGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new polyhedron geometry.\n\t *\n\t * @param {Array} [vertices] - A flat array of vertices describing the base shape.\n\t * @param {Array} [indices] - A flat array of indices describing the base shape.\n\t * @param {number} [radius=1] - The radius of the shape.\n\t * @param {number} [detail=0] - How many levels to subdivide the geometry. The more detail, the smoother the shape.\n\t */\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PolyhedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a dodecahedron.\n *\n * ```js\n * const geometry = new THREE.DodecahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const dodecahedron = new THREE.Mesh( geometry, material );\n * scene.add( dodecahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#DodecahedronGeometry\n */\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new dodecahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the dodecahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a dodecahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t-1, -1, -1,\t-1, -1, 1,\n\t\t\t-1, 1, -1, -1, 1, 1,\n\t\t\t1, -1, -1, 1, -1, 1,\n\t\t\t1, 1, -1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {DodecahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\n/**\n * Can be used as a helper object to view the edges of a geometry.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry();\n * const edges = new THREE.EdgesGeometry( geometry );\n * const line = new THREE.LineSegments( edges );\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass EdgesGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new edges geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t * @param {number} [thresholdAngle=1] - An edge is only rendered if the angle (in degrees)\n\t * between the face normals of the adjoining faces exceeds this value.\n\t */\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\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\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An abstract base class for creating an analytic curve object that contains methods\n * for interpolation.\n *\n * @abstract\n */\nclass Curve {\n\n\t/**\n\t * Constructs a new curve.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Curve';\n\n\t\t/**\n\t\t * This value determines the amount of divisions when calculating the\n\t\t * cumulative segment lengths of a curve via {@link Curve#getLengths}. To ensure\n\t\t * precision when using methods like {@link Curve#getSpacedPoints}, it is\n\t\t * recommended to increase the value of this property if the curve is very large.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.arcLengthDivisions = 200;\n\n\t\t/**\n\t\t * Must be set to `true` if the curve parameters have changed.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\t/**\n\t\t * An internal cache that holds precomputed curve length values.\n\t\t *\n\t\t * @private\n\t\t * @type {?Array}\n\t\t * @default null\n\t\t */\n\t\tthis.cacheArcLengths = null;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor.\n\t *\n\t * @abstract\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\twarn( 'Curve: .getPoint() not implemented.' );\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor. Unlike {@link Curve#getPoint}, this method honors the length\n\t * of the curve which equidistant samples.\n\t *\n\t * @param {number} u - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPoint} and returns an array of points representing\n\t * the curve shape.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPointAt} and returns an array of points representing\n\t * the curve shape. Unlike {@link Curve#getPoints}, this method returns equi-spaced points across the entire\n\t * curve.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t/**\n\t * Returns the total arc length of the curve.\n\t *\n\t * @return {number} The length of the curve.\n\t */\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t/**\n\t * Returns an array of cumulative segment lengths of the curve.\n\t *\n\t * @param {number} [divisions=this.arcLengthDivisions] - The number of divisions.\n\t * @return {Array} An array holding the cumulative segment lengths.\n\t */\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\t/**\n\t * Update the cumulative segment distance cache. The method must be called\n\t * every time curve parameters are changed. If an updated curve is part of a\n\t * composed curve like {@link CurvePath}, this method must be called on the\n\t * composed curve, too.\n\t */\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t/**\n\t * Given an interpolation factor in the range `[0,1]`, this method returns an updated\n\t * interpolation factor in the same range that can be ued to sample equidistant points\n\t * from a curve.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {?number} distance - An optional distance on the curve.\n\t * @return {number} The updated interpolation factor.\n\t */\n\tgetUtoTmapping( u, distance = null ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns a unit vector tangent for the given interpolation factor.\n\t * If the derived curve does not implement its tangent derivation,\n\t * two points a small delta apart will be used to find its gradient\n\t * which seems to give a reasonable approximation.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t */\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\t/**\n\t * Same as {@link Curve#getTangent} but with equidistant samples.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t * @see {@link Curve#getPointAt}\n\t */\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * Generates the Frenet Frames. Requires a curve definition in 3D space. Used\n\t * in geometries like {@link TubeGeometry} or {@link ExtrudeGeometry}.\n\t *\n\t * @param {number} segments - The number of segments.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @return {{tangents: Array, normals: Array, binormals: Array}} The Frenet Frames.\n\t */\n\tcomputeFrenetFrames( segments, closed = false ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), -1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), -1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a new curve with copied values from this instance.\n\t *\n\t * @return {Curve} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given curve to this instance.\n\t *\n\t * @param {Curve} source - The curve to copy.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the curve into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized curve.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Deserializes the curve from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized curve.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an ellipse.\n *\n * ```js\n * const curve = new THREE.EllipseCurve(\n * \t0, 0,\n * \t10, 10,\n * \t0, 2 * Math.PI,\n * \tfalse,\n * \t0\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const ellipse = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass EllipseCurve extends Curve {\n\n\t/**\n\t * Constructs a new ellipse curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t */\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\t/**\n\t\t * The X center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aX = aX;\n\n\t\t/**\n\t\t * The Y center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aY = aY;\n\n\t\t/**\n\t\t * The radius of the ellipse in the x direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#yRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.xRadius = xRadius;\n\n\t\t/**\n\t\t * The radius of the ellipse in the y direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#xRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.yRadius = yRadius;\n\n\t\t/**\n\t\t * The start angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aStartAngle = aStartAngle;\n\n\t\t/**\n\t\t * The end angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI*2\n\t\t */\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\t/**\n\t\t * Whether the ellipse is drawn clockwise or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.aClockwise = aClockwise;\n\n\t\t/**\n\t\t * The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an arc.\n *\n * @augments EllipseCurve\n */\nclass ArcCurve extends EllipseCurve {\n\n\t/**\n\t * Constructs a new arc curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [aRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t */\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\nfunction CubicPoly() {\n\n\t/**\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t* cusps and self-intersections in non-uniform catmull rom curves.\n\t* http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t*\n\t* curve.type accepts centripetal(default), chordal and catmullrom\n\t* curve.tension is used for catmullrom which defaults to 0.5\n\t*/\n\n\t/*\n\tBased on an optimized c++ solution in\n\t- http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t- http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = -3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\n/**\n * A curve representing a Catmull-Rom spline.\n *\n * ```js\n * //Create a closed wavey loop\n * const curve = new THREE.CatmullRomCurve3( [\n * \tnew THREE.Vector3( -10, 0, 10 ),\n * \tnew THREE.Vector3( -5, 5, 5 ),\n * \tnew THREE.Vector3( 0, 0, 0 ),\n * \tnew THREE.Vector3( 5, -5, 5 ),\n * \tnew THREE.Vector3( 10, 0, 10 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CatmullRomCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Catmull-Rom curve.\n\t *\n\t * @param {Array} [points] - An array of 3D points defining the curve.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @param {('centripetal'|'chordal'|'catmullrom')} [curveType='centripetal'] - The curve type.\n\t * @param {number} [tension=0.5] - Tension of the curve.\n\t */\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\t/**\n\t\t * An array of 3D points defining the curve.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.points = points;\n\n\t\t/**\n\t\t * Whether the curve is closed or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.closed = closed;\n\n\t\t/**\n\t\t * The curve type.\n\t\t *\n\t\t * @type {('centripetal'|'chordal'|'catmullrom')}\n\t\t * @default 'centripetal'\n\t\t */\n\t\tthis.curveType = curveType;\n\n\t\t/**\n\t\t * Tension of the curve.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.tension = tension;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Interpolations contains spline and Bézier functions internally used by concrete curve classes.\n *\n * Bezier Curves formulas obtained from: https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n *\n * @module Interpolations\n */\n\n/**\n * Computes a point on a Catmull-Rom spline.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Catmull-Rom spline.\n */\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( -3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\n/**\n * Computes a point on a Quadratic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @return {number} The calculated point on a Quadratic Bezier curve.\n */\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\n/**\n * Computes a point on a Cubic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Cubic Bezier curve.\n */\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\n/**\n * A curve representing a 2D Cubic Bezier curve.\n *\n * ```js\n * const curve = new THREE.CubicBezierCurve(\n * \tnew THREE.Vector2( - 0, 0 ),\n * \tnew THREE.Vector2( - 5, 15 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CubicBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The first control point.\n\t * @param {Vector2} [v2] - The second control point.\n\t * @param {Vector2} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Cubic Bezier curve.\n *\n * @augments Curve\n */\nclass CubicBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The first control point.\n\t * @param {Vector3} [v2] - The second control point.\n\t * @param {Vector3} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D line segment.\n *\n * @augments Curve\n */\nclass LineCurve extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector2} [v1] - The start point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector2() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D line segment.\n *\n * @augments Curve\n */\nclass LineCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector3} [v1] - The start point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D Quadratic Bezier curve.\n *\n * ```js\n * const curve = new THREE.QuadraticBezierCurve(\n * \tnew THREE.Vector2( - 10, 0 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * )\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The control point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Quadratic Bezier curve.\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The control point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D spline curve.\n *\n * ```js\n * // Create a sine-like wave\n * const curve = new THREE.SplineCurve( [\n * \tnew THREE.Vector2( -10, 0 ),\n * \tnew THREE.Vector2( -5, 5 ),\n * \tnew THREE.Vector2( 0, 0 ),\n * \tnew THREE.Vector2( 5, -5 ),\n * \tnew THREE.Vector2( 10, 0 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const splineObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass SplineCurve extends Curve {\n\n\t/**\n\t * Constructs a new 2D spline curve.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the curve.\n\t */\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\t/**\n\t\t * An array of 2D points defining the curve.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.points = points;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**\n * A base class extending {@link Curve}. `CurvePath` is simply an\n * array of connected curves, but retains the API of a curve.\n *\n * @augments Curve\n */\nclass CurvePath extends Curve {\n\n\t/**\n\t * Constructs a new curve path.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\t/**\n\t\t * An array of curves defining the\n\t\t * path.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.curves = [];\n\n\t\t/**\n\t\t * Whether the path should automatically be closed\n\t\t * by a line curve.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoClose = false;\n\n\t}\n\n\t/**\n\t * Adds a curve to this curve path.\n\t *\n\t * @param {Curve} curve - The curve to add.\n\t */\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\t/**\n\t * Adds a line curve to close the path.\n\t *\n\t * @return {CurvePath} A reference to this curve path.\n\t */\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tconst lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3';\n\t\t\tthis.curves.push( new Curves[ lineType ]( endPoint, startPoint ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definitions)\n\t * for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {?(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( t, optionalTarget ) {\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 } The curve lengths.\n\t */\n\tgetCurveLengths() {\n\n\t\t// Compute lengths and cache them\n\t\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A 2D path representation. The class provides methods for creating paths\n * and contours of 2D shapes similar to the 2D Canvas API.\n *\n * ```js\n * const path = new THREE.Path();\n *\n * path.lineTo( 0, 0.8 );\n * path.quadraticCurveTo( 0, 1, 0.2, 1 );\n * path.lineTo( 1, 1 );\n *\n * const points = path.getPoints();\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments CurvePath\n */\nclass Path extends CurvePath {\n\n\t/**\n\t * Constructs a new path.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the path.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\t/**\n\t\t * The current offset of the path. Any new curve added will start here.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a path from the given list of points. The points are added\n\t * to the path as instances of {@link LineCurve}.\n\t *\n\t * @param {Array} points - An array of 2D points.\n\t * @return {Path} A reference to this path.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Moves {@link Path#currentPoint} to the given point.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {Path} A reference to this path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array} pts - An array of points in 2D space.\n\t * @return {Path} A reference to this path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an arc as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned arc as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an ellipse as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned ellipse as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the absolute center of the ellipse.\n\t * @param {number} [aY=0] - The y coordinate of the absolute center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Defines an arbitrary 2d shape plane using paths with optional holes. It\n * can be used with {@link ExtrudeGeometry}, {@link ShapeGeometry}, to get\n * points, or to get triangulated faces.\n *\n * ```js\n * const heartShape = new THREE.Shape();\n *\n * heartShape.moveTo( 25, 25 );\n * heartShape.bezierCurveTo( 25, 25, 20, 0, 0, 0 );\n * heartShape.bezierCurveTo( - 30, 0, - 30, 35, - 30, 35 );\n * heartShape.bezierCurveTo( - 30, 55, - 10, 77, 25, 95 );\n * heartShape.bezierCurveTo( 60, 77, 80, 55, 80, 35 );\n * heartShape.bezierCurveTo( 80, 35, 80, 0, 50, 0 );\n * heartShape.bezierCurveTo( 35, 0, 25, 25, 25, 25 );\n *\n * const extrudeSettings = {\n * \tdepth: 8,\n * \tbevelEnabled: true,\n * \tbevelSegments: 2,\n * \tsteps: 2,\n * \tbevelSize: 1,\n * \tbevelThickness: 1\n * };\n *\n * const geometry = new THREE.ExtrudeGeometry( heartShape, extrudeSettings );\n * const mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial() );\n * ```\n *\n * @augments Path\n */\nclass Shape extends Path {\n\n\t/**\n\t * Constructs a new shape.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the shape.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\t/**\n\t\t * The UUID of the shape.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\t/**\n\t\t * Defines the holes in the shape. Hole definitions must use the\n\t\t * opposite winding order (CW/CCW) than the outer shape.\n\t\t *\n\t\t * @type {Array}\n\t\t * @readonly\n\t\t */\n\t\tthis.holes = [];\n\n\t}\n\n\t/**\n\t * Returns an array representing each contour of the holes\n\t * as a list of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {Array>} The holes as a series of 2D points.\n\t */\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\t/**\n\t * Returns an object that holds contour data for the shape and its holes as\n\t * arrays of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {{shape:Array,holes:Array>}} An object with contour data.\n\t */\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* eslint-disable */\n// copy of mapbox/earcut version 3.0.2\n// https://github.com/mapbox/earcut/tree/v3.0.2\n\nfunction earcut(data, holeIndices, dim = 2) {\n\n const hasHoles = holeIndices && holeIndices.length;\n const outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n let outerNode = linkedList(data, 0, outerLen, dim, true);\n const triangles = [];\n\n if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n let minX, minY, invSize;\n\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n if (data.length > 80 * dim) {\n minX = data[0];\n minY = data[1];\n let maxX = minX;\n let maxY = minY;\n\n for (let i = dim; i < outerLen; i += dim) {\n const x = data[i];\n const y = data[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n\n // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n invSize = Math.max(maxX - minX, maxY - minY);\n invSize = invSize !== 0 ? 32767 / invSize : 0;\n }\n\n earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n\n return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n let last;\n\n if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n for (let i = start; i < end; i += dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n } else {\n for (let i = end - dim; i >= start; i -= dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n }\n\n if (last && equals(last, last.next)) {\n removeNode(last);\n last = last.next;\n }\n\n return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n if (!start) return start;\n if (!end) end = start;\n\n let p = start,\n again;\n do {\n again = false;\n\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = end = p.prev;\n if (p === p.next) break;\n again = true;\n\n } else {\n p = p.next;\n }\n } while (again || p !== end);\n\n return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n if (!ear) return;\n\n // interlink polygon nodes in z-order\n if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n let stop = ear;\n\n // iterate through ears, slicing them one by one\n while (ear.prev !== ear.next) {\n const prev = ear.prev;\n const next = ear.next;\n\n if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n triangles.push(prev.i, ear.i, next.i); // cut off the triangle\n\n removeNode(ear);\n\n // skipping the next vertex leads to less sliver triangles\n ear = next.next;\n stop = next.next;\n\n continue;\n }\n\n ear = next;\n\n // if we looped through the whole remaining polygon and can't find any more ears\n if (ear === stop) {\n // try filtering points and slicing again\n if (!pass) {\n earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n // if this didn't work, try curing all small self-intersections locally\n } else if (pass === 1) {\n ear = cureLocalIntersections(filterPoints(ear), triangles);\n earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n // as a last resort, try splitting the remaining polygon into two\n } else if (pass === 2) {\n splitEarcut(ear, triangles, dim, minX, minY, invSize);\n }\n\n break;\n }\n }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n const a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // now make sure we don't have other points inside the potential ear\n const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n // triangle bbox\n const x0 = Math.min(ax, bx, cx),\n y0 = Math.min(ay, by, cy),\n x1 = Math.max(ax, bx, cx),\n y1 = Math.max(ay, by, cy);\n\n let p = c.next;\n while (p !== a) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.next;\n }\n\n return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n const a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n // triangle bbox\n const x0 = Math.min(ax, bx, cx),\n y0 = Math.min(ay, by, cy),\n x1 = Math.max(ax, bx, cx),\n y1 = Math.max(ay, by, cy);\n\n // z-order range for the current triangle bbox;\n const minZ = zOrder(x0, y0, minX, minY, invSize),\n maxZ = zOrder(x1, y1, minX, minY, invSize);\n\n let p = ear.prevZ,\n n = ear.nextZ;\n\n // look for points inside the triangle in both directions\n while (p && p.z >= minZ && n && n.z <= maxZ) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n // look for remaining points in decreasing z-order\n while (p && p.z >= minZ) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n }\n\n // look for remaining points in increasing z-order\n while (n && n.z <= maxZ) {\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles) {\n let p = start;\n do {\n const a = p.prev,\n b = p.next.next;\n\n if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n triangles.push(a.i, p.i, b.i);\n\n // remove two nodes involved\n removeNode(p);\n removeNode(p.next);\n\n p = start = b;\n }\n p = p.next;\n } while (p !== start);\n\n return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n // look for a valid diagonal that divides the polygon into two\n let a = start;\n do {\n let b = a.next.next;\n while (b !== a.prev) {\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n // split the polygon in two by the diagonal\n let c = splitPolygon(a, b);\n\n // filter colinear points around the cuts\n a = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n\n // run earcut on each half\n earcutLinked(a, triangles, dim, minX, minY, invSize, 0);\n earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n return;\n }\n b = b.next;\n }\n a = a.next;\n } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n const queue = [];\n\n for (let i = 0, len = holeIndices.length; i < len; i++) {\n const start = holeIndices[i] * dim;\n const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n const list = linkedList(data, start, end, dim, false);\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n\n queue.sort(compareXYSlope);\n\n // process holes from left to right\n for (let i = 0; i < queue.length; i++) {\n outerNode = eliminateHole(queue[i], outerNode);\n }\n\n return outerNode;\n}\n\nfunction compareXYSlope(a, b) {\n let result = a.x - b.x;\n // when the left-most point of 2 holes meet at a vertex, sort the holes counterclockwise so that when we find\n // the bridge to the outer shell is always the point that they meet at.\n if (result === 0) {\n result = a.y - b.y;\n if (result === 0) {\n const aSlope = (a.next.y - a.y) / (a.next.x - a.x);\n const bSlope = (b.next.y - b.y) / (b.next.x - b.x);\n result = aSlope - bSlope;\n }\n }\n return result;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole(hole, outerNode) {\n const bridge = findHoleBridge(hole, outerNode);\n if (!bridge) {\n return outerNode;\n }\n\n const bridgeReverse = splitPolygon(bridge, hole);\n\n // filter collinear points around the cuts\n filterPoints(bridgeReverse, bridgeReverse.next);\n return filterPoints(bridge, bridge.next);\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n let p = outerNode;\n const hx = hole.x;\n const hy = hole.y;\n let qx = -Infinity;\n let m;\n\n // find a segment intersected by a ray from the hole's leftmost point to the left;\n // segment's endpoint with lesser x will be potential connection point\n // unless they intersect at a vertex, then choose the vertex\n if (equals(hole, p)) return p;\n do {\n if (equals(hole, p.next)) return p.next;\n else if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n if (x <= hx && x > qx) {\n qx = x;\n m = p.x < p.next.x ? p : p.next;\n if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\n }\n }\n p = p.next;\n } while (p !== outerNode);\n\n if (!m) return null;\n\n // look for points inside the triangle of hole point, segment intersection and endpoint;\n // if there are no points found, we have a valid connection;\n // otherwise choose the point of the minimum angle with the ray as connection point\n\n const stop = m;\n const mx = m.x;\n const my = m.y;\n let tanMin = Infinity;\n\n p = m;\n\n do {\n if (hx >= p.x && p.x >= mx && hx !== p.x &&\n pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n const tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n if (locallyInside(p, hole) &&\n (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n m = p;\n tanMin = tan;\n }\n }\n\n p = p.next;\n } while (p !== stop);\n\n return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n let p = start;\n do {\n if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n } while (p !== start);\n\n p.prevZ.nextZ = null;\n p.prevZ = null;\n\n sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n let numMerges;\n let inSize = 1;\n\n do {\n let p = list;\n let e;\n list = null;\n let tail = null;\n numMerges = 0;\n\n while (p) {\n numMerges++;\n let q = p;\n let pSize = 0;\n for (let i = 0; i < inSize; i++) {\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n let qSize = inSize;\n\n while (pSize > 0 || (qSize > 0 && q)) {\n\n if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else {\n e = q;\n q = q.nextZ;\n qSize--;\n }\n\n if (tail) tail.nextZ = e;\n else list = e;\n\n e.prevZ = tail;\n tail = e;\n }\n\n p = q;\n }\n\n tail.nextZ = null;\n inSize *= 2;\n\n } while (numMerges > 1);\n\n return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n // coords are transformed into non-negative 15-bit integer range\n x = (x - minX) * invSize | 0;\n y = (y - minY) * invSize | 0;\n\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n\n y = (y | (y << 8)) & 0x00FF00FF;\n y = (y | (y << 4)) & 0x0F0F0F0F;\n y = (y | (y << 2)) & 0x33333333;\n y = (y | (y << 1)) & 0x55555555;\n\n return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n let p = start,\n leftmost = start;\n do {\n if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n p = p.next;\n } while (p !== start);\n\n return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&\n (ax - px) * (by - py) >= (bx - px) * (ay - py) &&\n (bx - px) * (cy - py) >= (cx - px) * (by - py);\n}\n\n// check if a point lies within a convex triangle but false if its equal to the first point of the triangle\nfunction pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, px, py) {\n return !(ax === px && ay === py) && pointInTriangle(ax, ay, bx, by, cx, cy, px, py);\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // doesn't intersect other edges\n (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n const o1 = sign(area(p1, q1, p2));\n const o2 = sign(area(p1, q1, q2));\n const o3 = sign(area(p2, q2, p1));\n const o4 = sign(area(p2, q2, q1));\n\n if (o1 !== o2 && o3 !== o4) return true; // general case\n\n if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n let p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n intersects(p, p.next, a, b)) return true;\n p = p.next;\n } while (p !== a);\n\n return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n return area(a.prev, a, a.next) < 0 ?\n area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n let p = a;\n let inside = false;\n const px = (a.x + b.x) / 2;\n const py = (a.y + b.y) / 2;\n do {\n if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n inside = !inside;\n p = p.next;\n } while (p !== a);\n\n return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n const a2 = createNode(a.i, a.x, a.y),\n b2 = createNode(b.i, b.x, b.y),\n an = a.next,\n bp = b.prev;\n\n a.next = b;\n b.prev = a;\n\n a2.next = an;\n an.prev = a2;\n\n b2.next = a2;\n a2.prev = b2;\n\n bp.next = b2;\n b2.prev = bp;\n\n return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n const p = createNode(i, x, y);\n\n if (!last) {\n p.prev = p;\n p.next = p;\n\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\n\nfunction removeNode(p) {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction createNode(i, x, y) {\n return {\n i, // vertex index in coordinates array\n x, y, // vertex coordinates\n prev: null, // previous and next vertex nodes in a polygon ring\n next: null,\n z: 0, // z-order curve value\n prevZ: null, // previous and next nodes in z-order\n nextZ: null,\n steiner: false // indicates whether this is a steiner point\n };\n}\n\nfunction signedArea(data, start, end, dim) {\n let sum = 0;\n for (let i = start, j = end - dim; i < end; i += dim) {\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n j = i;\n }\n return sum;\n}\n\n/**\n * An implementation of the earcut polygon triangulation algorithm.\n * The code is a port of [mapbox/earcut](https://github.com/mapbox/earcut).\n *\n * @see https://github.com/mapbox/earcut\n */\nclass Earcut {\n\n\t/**\n\t * Triangulates the given shape definition by returning an array of triangles.\n\t *\n\t * @param {Array} data - An array with 2D points.\n\t * @param {Array} holeIndices - An array with indices defining holes.\n\t * @param {number} [dim=2] - The number of coordinates per vertex in the input array.\n\t * @return {Array} An array representing the triangulated faces. Each face is defined by three consecutive numbers\n\t * representing vertex indices.\n\t */\n\tstatic triangulate( data, holeIndices, dim = 2 ) {\n\n\t\treturn earcut( data, holeIndices, dim );\n\n\t}\n\n}\n\n/**\n * A class containing utility functions for shapes.\n *\n * @hideconstructor\n */\nclass ShapeUtils {\n\n\t/**\n\t * Calculate area of a ( 2D ) contour polygon.\n\t *\n\t * @param {Array} contour - An array of 2D points.\n\t * @return {number} The area.\n\t */\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given contour uses a clockwise winding order.\n\t *\n\t * @param {Array} pts - An array of 2D points defining a polygon.\n\t * @return {boolean} Whether the given contour uses a clockwise winding order or not.\n\t */\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\t/**\n\t * Triangulates the given shape definition.\n\t *\n\t * @param {Array} contour - An array of 2D points defining the contour.\n\t * @param {Array>} holes - An array that holds arrays of 2D points defining the holes.\n\t * @return {Array>} An array that holds for each face definition an array with three indices.\n\t */\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * ```js\n * const length = 12, width = 8;\n *\n * const shape = new THREE.Shape();\n * shape.moveTo( 0,0 );\n * shape.lineTo( 0, width );\n * shape.lineTo( length, width );\n * shape.lineTo( length, 0 );\n * shape.lineTo( 0, 0 );\n *\n * const geometry = new THREE.ExtrudeGeometry( shape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ExtrudeGeometry\n */\nclass ExtrudeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new extrude geometry.\n\t *\n\t * @param {Shape|Array} [shapes] - A shape or an array of shapes.\n\t * @param {ExtrudeGeometry~Options} [options] - The extrude settings.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( -0.5, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/**Merges index-adjacent points that are within a threshold distance of each other. Array is modified in-place. Threshold distance is empirical, and scaled based on the magnitude of point coordinates.\n\t\t\t * @param {Array} points\n\t\t\t*/\n\t\t\tfunction mergeOverlappingPoints( points ) {\n\n\t\t\t\tconst THRESHOLD = 1e-10;\n\t\t\t\tconst THRESHOLD_SQ = THRESHOLD * THRESHOLD;\n\t\t\t\tlet prevPos = points[ 0 ];\n\t\t\t\tfor ( let i = 1; i <= points.length; i ++ ) {\n\n\t\t\t\t\tconst currentIndex = i % points.length;\n\t\t\t\t\tconst currentPos = points[ currentIndex ];\n\t\t\t\t\tconst dx = currentPos.x - prevPos.x;\n\t\t\t\t\tconst dy = currentPos.y - prevPos.y;\n\t\t\t\t\tconst distSq = dx * dx + dy * dy;\n\n\t\t\t\t\tconst scalingFactorSqrt = Math.max(\n\t\t\t\t\t\tMath.abs( currentPos.x ),\n\t\t\t\t\t\tMath.abs( currentPos.y ),\n\t\t\t\t\t\tMath.abs( prevPos.x ),\n\t\t\t\t\t\tMath.abs( prevPos.y )\n\t\t\t\t\t);\n\t\t\t\t\tconst thresholdSqScaled = THRESHOLD_SQ * scalingFactorSqrt * scalingFactorSqrt;\n\t\t\t\t\tif ( distSq <= thresholdSqScaled ) {\n\n\t\t\t\t\t\tpoints.splice( currentIndex, 1 );\n\t\t\t\t\t\ti --;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tprevPos = currentPos;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmergeOverlappingPoints( vertices );\n\t\t\tholes.forEach( mergeOverlappingPoints );\n\n\t\t\tconst numHoles = holes.length;\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0; h < numHoles; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) error( 'ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn pt.clone().addScaledVector( vec, size );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t// but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t// log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\t\t\tlet faces;\n\n\t\t\tif ( bevelSegments === 0 ) {\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contour, holes );\n\n\t\t\t} else {\n\n\t\t\t\tconst contractedContourVertices = [];\n\t\t\t\tconst expandedHoleVertices = [];\n\n\t\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t\t// contract shape\n\n\t\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\tif ( t === 0 ) contractedContourVertices.push( vert );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// expand holes\n\n\t\t\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\t\t\t\t\t\tconst oneHoleVertices = [];\n\t\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\t\tif ( t === 0 ) oneHoleVertices.push( vert );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( t === 0 ) expandedHoleVertices.push( oneHoleVertices );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contractedContourVertices, expandedHoleVertices );\n\n\t\t\t}\n\n\t\t\tconst flen = faces.length;\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\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\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t///// Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array} shapes - An array of shapes.\n\t * @return {ExtrudeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n/**\n * A geometry class for representing an icosahedron.\n *\n * ```js\n * const geometry = new THREE.IcosahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const icosahedron = new THREE.Mesh( geometry, material );\n * scene.add( icosahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#IcosahedronGeometry\n */\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new icosahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the icosahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a icosahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t-1, t, 0, \t1, t, 0, \t-1, - t, 0, \t1, - t, 0,\n\t\t\t0, -1, t, \t0, 1, t,\t0, -1, - t, \t0, 1, - t,\n\t\t\tt, 0, -1, \tt, 0, 1, \t- t, 0, -1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {IcosahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * Creates meshes with axial symmetry like vases. The lathe rotates around the Y axis.\n *\n * ```js\n * const points = [];\n * for ( let i = 0; i < 10; i ++ ) {\n * \tpoints.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );\n * }\n * const geometry = new THREE.LatheGeometry( points );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const lathe = new THREE.Mesh( geometry, material );\n * scene.add( lathe );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#LatheGeometry\n */\nclass LatheGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new lathe geometry.\n\t *\n\t * @param {Array} [points] - An array of points in 2D space. The x-coordinate of each point\n\t * must be greater than zero.\n\t * @param {number} [segments=12] - The number of circumference segments to generate.\n\t * @param {number} [phiStart=0] - The starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The radian (0 to 2PI) range of the lathed section 2PI is a\n\t * closed lathe, less than 2PI is a portion.\n\t */\n\tconstructor( points = [ new Vector2( 0, -0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {LatheGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an octahedron.\n *\n * ```js\n * const geometry = new THREE.OctahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const octahedron = new THREE.Mesh( geometry, material );\n * scene.add( octahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#OctahedronGeometry\n */\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new octahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the octahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a octahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t-1, 0, 0,\t0, 1, 0,\n\t\t\t0, -1, 0, \t0, 0, 1,\t0, 0, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {OctahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a plane.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const plane = new THREE.Mesh( geometry, material );\n * scene.add( plane );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#PlaneGeometry\n */\nclass PlaneGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new plane geometry.\n\t *\n\t * @param {number} [width=1] - The width along the X axis.\n\t * @param {number} [height=1] - The height along the Y axis\n\t * @param {number} [widthSegments=1] - The number of segments along the X axis.\n\t * @param {number} [heightSegments=1] - The number of segments along the Y axis.\n\t */\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PlaneGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A class for generating a two-dimensional ring geometry.\n *\n * ```js\n * const geometry = new THREE.RingGeometry( 1, 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#RingGeometry\n */\nclass RingGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new ring geometry.\n\t *\n\t * @param {number} [innerRadius=0.5] - The inner radius of the ring.\n\t * @param {number} [outerRadius=1] - The outer radius of the ring.\n\t * @param {number} [thetaSegments=32] - Number of segments. A higher number means the ring will be more round. Minimum is `3`.\n\t * @param {number} [phiSegments=1] - Number of segments per ring segment. Minimum is `1`.\n\t * @param {number} [thetaStart=0] - Starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {RingGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * Creates an one-sided polygonal geometry from one or more path shapes.\n *\n * ```js\n * const arcShape = new THREE.Shape()\n *\t.moveTo( 5, 1 )\n *\t.absarc( 1, 1, 4, 0, Math.PI * 2, false );\n *\n * const geometry = new THREE.ShapeGeometry( arcShape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ShapeGeometry\n */\nclass ShapeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new shape geometry.\n\t *\n\t * @param {Shape|Array} [shapes] - A shape or an array of shapes.\n\t * @param {number} [curveSegments=12] - Number of segments per shape.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array} shapes - An array of shapes.\n\t * @return {ShapeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\n/**\n * A class for generating a sphere geometry.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry( 15, 32, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const sphere = new THREE.Mesh( geometry, material );\n * scene.add( sphere );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#SphereGeometry\n */\nclass SphereGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new sphere geometry.\n\t *\n\t * @param {number} [radius=1] - The sphere radius.\n\t * @param {number} [widthSegments=32] - The number of horizontal segments. Minimum value is `3`.\n\t * @param {number} [heightSegments=16] - The number of vertical segments. Minimum value is `2`.\n\t * @param {number} [phiStart=0] - The horizontal starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The horizontal sweep angle size.\n\t * @param {number} [thetaStart=0] - The vertical starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI] - The vertical sweep angle size.\n\t */\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 && thetaStart === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy === heightSegments && thetaEnd === Math.PI ) {\n\n\t\t\t\tuOffset = -0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {SphereGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an tetrahedron.\n *\n * ```js\n * const geometry = new THREE.TetrahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const tetrahedron = new THREE.Mesh( geometry, material );\n * scene.add( tetrahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#TetrahedronGeometry\n */\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new tetrahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the tetrahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a tetrahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t-1, -1, 1, \t-1, 1, -1, \t1, -1, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TetrahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an torus.\n *\n * ```js\n * const geometry = new THREE.TorusGeometry( 10, 3, 16, 100 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torus = new THREE.Mesh( geometry, material );\n * scene.add( torus );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusGeometry\n */\nclass TorusGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus, from the center of the torus to the center of the tube.\n\t * @param {number} [tube=0.4] - Radius of the tube. Must be smaller than `radius`.\n\t * @param {number} [radialSegments=12] - The number of radial segments.\n\t * @param {number} [tubularSegments=48] - The number of tubular segments.\n\t * @param {number} [arc=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\n/**\n * Creates a torus knot, the particular shape of which is defined by a pair\n * of coprime integers, p and q. If p and q are not coprime, the result will\n * be a torus link.\n *\n * ```js\n * const geometry = new THREE.TorusKnotGeometry( 10, 3, 100, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torusKnot = new THREE.Mesh( geometry, material );\n * scene.add( torusKnot );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusKnotGeometry\n */\nclass TorusKnotGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus knot geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus knot.\n\t * @param {number} [tube=0.4] - Radius of the tube.\n\t * @param {number} [tubularSegments=64] - The number of tubular segments.\n\t * @param {number} [radialSegments=8] - The number of radial segments.\n\t * @param {number} [p=2] - This value determines, how many times the geometry winds around its axis of rotational symmetry.\n\t * @param {number} [q=3] - This value determines, how many times the geometry winds around a circle in the interior of the torus.\n\t */\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusKnotGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\n/**\n * Creates a tube that extrudes along a 3D curve.\n *\n * ```js\n * class CustomSinCurve extends THREE.Curve {\n *\n * \tgetPoint( t, optionalTarget = new THREE.Vector3() ) {\n *\n * \t\tconst tx = t * 3 - 1.5;\n * \t\tconst ty = Math.sin( 2 * Math.PI * t );\n * \t\tconst tz = 0;\n *\n * \t\treturn optionalTarget.set( tx, ty, tz );\n * \t}\n *\n * }\n *\n * const path = new CustomSinCurve( 10 );\n * const geometry = new THREE.TubeGeometry( path, 20, 2, 8, false );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TubeGeometry\n */\nclass TubeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new tube geometry.\n\t *\n\t * @param {Curve} [path=QuadraticBezierCurve3] - A 3D curve defining the path of the tube.\n\t * @param {number} [tubularSegments=64] - The number of segments that make up the tube.\n\t * @param {number} [radius=1] -The radius of the tube.\n\t * @param {number} [radialSegments=8] - The number of segments that make up the cross-section.\n\t * @param {boolean} [closed=false] - Whether the tube is closed or not.\n\t */\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( -1, -1, 0 ), new Vector3( -1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TubeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\n/**\n * Can be used as a helper object to visualize a geometry as a wireframe.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry();\n *\n * const wireframe = new THREE.WireframeGeometry( geometry );\n *\n * const line = new THREE.LineSegments( wireframe );\n * line.material.depthWrite = false;\n * line.material.opacity = 0.25;\n * line.material.transparent = true;\n *\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass WireframeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new wireframe geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t */\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\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} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\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\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\n/**\n * This material can receive shadows, but otherwise is completely transparent.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 2000, 2000 );\n * geometry.rotateX( - Math.PI / 2 );\n *\n * const material = new THREE.ShadowMaterial();\n * material.opacity = 0.2;\n *\n * const plane = new THREE.Mesh( geometry, material );\n * plane.position.y = -200;\n * plane.receiveShadow = true;\n * scene.add( plane );\n * ```\n *\n * @augments Material\n */\nclass ShadowMaterial extends Material {\n\n\t/**\n\t * Constructs a new shadow material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.color = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Overwritten since shadow materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This class works just like {@link ShaderMaterial}, except that definitions\n * of built-in uniforms and attributes are not automatically prepended to the\n * GLSL shader code.\n *\n * `RawShaderMaterial` can only be used with {@link WebGLRenderer}.\n *\n * @augments ShaderMaterial\n */\nclass RawShaderMaterial extends ShaderMaterial {\n\n\t/**\n\t * Constructs a new raw shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\n/**\n * A standard physically based material, using Metallic-Roughness workflow.\n *\n * Physically based rendering (PBR) has recently become the standard in many\n * 3D applications, such as [Unity](https://blogs.unity3d.com/2014/10/29/physically-based-shading-in-unity-5-a-primer/),\n * [Unreal](https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/PhysicallyBased/) and\n * [3D Studio Max](http://area.autodesk.com/blogs/the-3ds-max-blog/what039s-new-for-rendering-in-3ds-max-2017).\n *\n * This approach differs from older approaches in that instead of using\n * approximations for the way in which light interacts with a surface, a\n * physically correct model is used. The idea is that, instead of tweaking\n * materials to look good under specific lighting, a material can be created\n * that will react 'correctly' under all lighting scenarios.\n *\n * In practice this gives a more accurate and realistic looking result than\n * the {@link MeshLambertMaterial} or {@link MeshPhongMaterial}, at the cost of\n * being somewhat more computationally expensive. `MeshStandardMaterial` uses per-fragment\n * shading.\n *\n * Note that for best results you should always specify an environment map when using this material.\n *\n * For a non-technical introduction to the concept of PBR and how to set up a\n * PBR material, check out these articles by the people at [marmoset](https://www.marmoset.co):\n *\n * - [Basic Theory of Physically Based Rendering](https://www.marmoset.co/posts/basic-theory-of-physically-based-rendering/)\n * - [Physically Based Rendering and You Can Too](https://www.marmoset.co/posts/physically-based-rendering-and-you-can-too/)\n *\n * Technical details of the approach used in three.js (and most other PBR systems) can be found is this\n * [paper from Disney](https://media.disneyanimation.com/uploads/production/publication_asset/48/asset/s2012_pbs_disney_brdf_notes_v3.pdf)\n * (pdf), by Brent Burley.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshStandardMaterial\n */\nclass MeshStandardMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh standard material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshStandardMaterial = true;\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * How rough the material appears. `0.0` means a smooth mirror reflection, `1.0`\n\t\t * means fully diffuse. If `roughnessMap` is also provided,\n\t\t * both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.roughness = 1.0;\n\n\t\t/**\n\t\t * How much the material is like a metal. Non-metallic materials such as wood\n\t\t * or stone use `0.0`, metallic use `1.0`, with nothing (usually) in between.\n\t\t * A value between `0.0` and `1.0` could be used for a rusty metal look.\n\t\t * If `metalnessMap` is also provided, both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.metalness = 0.0;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The green channel of this texture is used to alter the roughness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.roughnessMap = null;\n\n\t\t/**\n\t\t * The blue channel of this texture is used to alter the metalness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.metalnessMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map. To ensure a physically correct rendering, environment maps\n\t\t * are internally pre-processed with {@link PMREMGenerator}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * Scales the effect of the environment map by multiplying its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An extension of the {@link MeshStandardMaterial}, providing more advanced\n * physically-based rendering properties:\n *\n * - Anisotropy: Ability to represent the anisotropic property of materials\n * as observable with brushed metals.\n * - Clearcoat: Some materials — like car paints, carbon fiber, and wet surfaces — require\n * a clear, reflective layer on top of another layer that may be irregular or rough.\n * Clearcoat approximates this effect, without the need for a separate transparent surface.\n * - Iridescence: Allows to render the effect where hue varies depending on the viewing\n * angle and illumination angle. This can be seen on soap bubbles, oil films, or on the\n * wings of many insects.\n * - Physically-based transparency: One limitation of {@link Material#opacity} is that highly\n * transparent materials are less reflective. Physically-based transmission provides a more\n * realistic option for thin, transparent surfaces like glass.\n * - Advanced reflectivity: More flexible reflectivity for non-metallic materials.\n * - Sheen: Can be used for representing cloth and fabric materials.\n *\n * As a result of these complex shading features, `MeshPhysicalMaterial` has a\n * higher performance cost, per pixel, than other three.js materials. Most\n * effects are disabled by default, and add cost as they are enabled. For\n * best results, always specify an environment map when using this material.\n *\n * @augments MeshStandardMaterial\n * @demo scenes/material-browser.html#MeshPhysicalMaterial\n */\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\t/**\n\t * Constructs a new mesh physical material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\t/**\n\t\t * The rotation of the anisotropy in tangent, bitangent space, measured in radians\n\t\t * counter-clockwise from the tangent. When `anisotropyMap` is present, this\n\t\t * property provides additional rotation to the vectors in the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.anisotropyRotation = 0;\n\n\t\t/**\n\t\t * Red and green channels represent the anisotropy direction in `[-1, 1]` tangent,\n\t\t * bitangent space, to be rotated by `anisotropyRotation`. The blue channel\n\t\t * contains strength as `[0, 1]` to be multiplied by `anisotropy`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.anisotropyMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `clearcoat`,\n\t\t * for per-pixel control over a coating's intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatMap = null;\n\n\t\t/**\n\t\t * Roughness of the clear coat layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.clearcoatRoughness = 0.0;\n\n\t\t/**\n\t\t * The green channel of this texture is multiplied against\n\t\t * `clearcoatRoughness`, for per-pixel control over a coating's roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatRoughnessMap = null;\n\n\t\t/**\n\t\t * How much `clearcoatNormalMap` affects the clear coat layer, from\n\t\t * `(0,0)` to `(1,1)`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * Can be used to enable independent normals for the clear coat layer.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatNormalMap = null;\n\n\t\t/**\n\t\t * Index-of-refraction for non-metallic materials, from `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.5\n\t\t */\n\t\tthis.ior = 1.5;\n\n\t\t/**\n\t\t * Degree of reflectivity, from `0.0` to `1.0`. Default is `0.5`, which\n\t\t * corresponds to an index-of-refraction of `1.5`.\n\t\t *\n\t\t * This models the reflectivity of non-metallic materials. It has no effect\n\t\t * when `metalness` is `1.0`\n\t\t *\n\t\t * @name MeshPhysicalMaterial#reflectivity\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `iridescence`, for per-pixel\n\t\t * control over iridescence.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceMap = null;\n\n\t\t/**\n\t\t * Strength of the iridescence RGB color shift effect, represented by an index-of-refraction.\n\t\t * Between `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.3\n\t\t */\n\t\tthis.iridescenceIOR = 1.3;\n\n\t\t/**\n\t\t *Array of exactly 2 elements, specifying minimum and maximum thickness of the iridescence layer.\n\t\t Thickness of iridescence layer has an equivalent effect of the one `thickness` has on `ior`.\n\t\t *\n\t\t * @type {Array}\n\t\t * @default [100,400]\n\t\t */\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t/**\n\t\t * A texture that defines the thickness of the iridescence layer, stored in the green channel.\n\t\t * Minimum and maximum values of thickness are defined by `iridescenceThicknessRange` array:\n\t\t * - `0.0` in the green channel will result in thickness equal to first element of the array.\n\t\t * - `1.0` in the green channel will result in thickness equal to second element of the array.\n\t\t * - Values in-between will linearly interpolate between the elements of the array.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\t/**\n\t\t * The sheen tint.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.sheenColor = new Color( 0x000000 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against `sheenColor`, for per-pixel control\n\t\t * over sheen tint.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenColorMap = null;\n\n\t\t/**\n\t\t * Roughness of the sheen layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.sheenRoughness = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `sheenRoughness`, for per-pixel control\n\t\t * over sheen roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenRoughnessMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `transmission`, for per-pixel control over\n\t\t * optical transparency.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.transmissionMap = null;\n\n\t\t/**\n\t\t * The thickness of the volume beneath the surface. The value is given in the\n\t\t * coordinate space of the mesh. If the value is `0` the material is\n\t\t * thin-walled. Otherwise the material is a volume boundary.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.thickness = 0;\n\n\t\t/**\n\t\t * A texture that defines the thickness, stored in the green channel. This will\n\t\t * be multiplied by `thickness`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.thicknessMap = null;\n\n\t\t/**\n\t\t * Density of the medium given as the average distance that light travels in\n\t\t * the medium before interacting with a particle. The value is given in world\n\t\t * space units, and must be greater than zero.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.attenuationDistance = Infinity;\n\n\t\t/**\n\t\t * The color that white light turns into due to absorption when reaching the\n\t\t * attenuation distance.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * A float that scales the amount of specular reflection for non-metals only.\n\t\t * When set to zero, the model is effectively Lambertian. From `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.specularIntensity = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `specularIntensity`,\n\t\t * for per-pixel control over specular intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularIntensityMap = null;\n\n\t\t/**\n\t\t * Tints the specular reflection at normal incidence for non-metals only.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against `specularColor`,\n\t\t * for per-pixel control over specular color.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularColorMap = null;\n\n\t\tthis._anisotropy = 0;\n\t\tthis._clearcoat = 0;\n\t\tthis._dispersion = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._sheen = 0.0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * The anisotropy strength, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget anisotropy() {\n\n\t\treturn this._anisotropy;\n\n\t}\n\n\tset anisotropy( value ) {\n\n\t\tif ( this._anisotropy > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._anisotropy = value;\n\n\t}\n\n\t/**\n\t * Represents the intensity of the clear coat layer, from `0.0` to `1.0`. Use\n\t * clear coat related properties to enable multilayer materials that have a\n\t * thin translucent layer over the base layer.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\t/**\n\t * The intensity of the iridescence layer, simulating RGB color shift based on the angle between\n\t * the surface and the viewer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\t/**\n\t * Defines the strength of the angular separation of colors (chromatic aberration) transmitting\n\t * through a relatively clear volume. Any value zero or larger is valid, the typical range of\n\t * realistic values is `[0, 1]`. This property can be only be used with transmissive objects.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget dispersion() {\n\n\t\treturn this._dispersion;\n\n\t}\n\n\tset dispersion( value ) {\n\n\t\tif ( this._dispersion > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._dispersion = value;\n\n\t}\n\n\t/**\n\t * The intensity of the sheen layer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\t/**\n\t * Degree of transmission (or optical transparency), from `0.0` to `1.0`.\n\t *\n\t * Thin, transparent or semitransparent, plastic or glass materials remain\n\t * largely reflective even if they are fully transmissive. The transmission\n\t * property can be used to model these materials.\n\t *\n\t * When transmission is non-zero, `opacity` should be set to `1`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.anisotropyRotation = source.anisotropyRotation;\n\t\tthis.anisotropyMap = source.anisotropyMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.dispersion = source.dispersion;\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for shiny surfaces with specular highlights.\n *\n * The material uses a non-physically based [Blinn-Phong](https://en.wikipedia.org/wiki/Blinn-Phong_shading_model)\n * model for calculating reflectance. Unlike the Lambertian model used in the\n * {@link MeshLambertMaterial} this can simulate shiny surfaces with specular\n * highlights (such as varnished wood). `MeshPhongMaterial` uses per-fragment shading.\n *\n * Performance will generally be greater when using this material over the\n * {@link MeshStandardMaterial} or {@link MeshPhysicalMaterial}, at the cost of\n * some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshPhongMaterial\n */\nclass MeshPhongMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh phong material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhongMaterial = true;\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * Specular color of the material. The default color is set to `0x111111` (very dark grey)\n\t\t *\n\t\t * This defines how shiny the material is and the color of its shine.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.specular = new Color( 0x111111 );\n\n\t\t/**\n\t\t * How shiny the specular highlight is; a higher value gives a sharper highlight.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 30\n\t\t */\n\t\tthis.shininess = 30;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The specular map value affects both how much the specular surface\n\t\t * highlight contributes and how much of the environment map affects the\n\t\t * surface.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material implementing toon shading.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshToonMaterial\n */\nclass MeshToonMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh toon material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Gradient map for toon shading. It's required to set\n\t\t * {@link Texture#minFilter} and {@link Texture#magFilter} to {@linkNearestFilter}\n\t\t * when using this type of texture.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.gradientMap = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material that maps the normal vectors to RGB colors.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshNormalMaterial\n */\nclass MeshNormalMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh normal material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for non-shiny surfaces, without specular highlights.\n *\n * The material uses a non-physically based [Lambertian](https://en.wikipedia.org/wiki/Lambertian_reflectance)\n * model for calculating reflectance. This can simulate some surfaces (such\n * as untreated wood or stone) well, but cannot simulate shiny surfaces with\n * specular highlights (such as varnished wood). `MeshLambertMaterial` uses per-fragment\n * shading.\n *\n * Due to the simplicity of the reflectance and illumination models,\n * performance will be greater when using this material over the\n * {@link MeshPhongMaterial}, {@link MeshStandardMaterial} or\n * {@link MeshPhysicalMaterial}, at the cost of some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshLambertMaterial\n */\nclass MeshLambertMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh lambert material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshLambertMaterial = true;\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometry by depth. Depth is based off of the camera\n * near and far plane. White is nearest, black is farthest.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshDepthMaterial\n */\nclass MeshDepthMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh depth material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\t/**\n\t\t * Type for depth packing.\n\t\t *\n\t\t * @type {(BasicDepthPacking|RGBADepthPacking|RGBDepthPacking|RGDepthPacking)}\n\t\t * @default BasicDepthPacking\n\t\t */\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material used internally for implementing shadow mapping with\n * point lights.\n *\n * Can also be used to customize the shadow casting of an object by assigning\n * an instance of `MeshDistanceMaterial` to {@link Object3D#customDistanceMaterial}.\n * The following examples demonstrates this approach in order to ensure\n * transparent parts of objects do not cast shadows.\n *\n * @augments Material\n */\nclass MeshDistanceMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh distance material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This material is defined by a MatCap (or Lit Sphere) texture, which encodes the\n * material color and shading.\n *\n * `MeshMatcapMaterial` does not respond to lights since the matcap image file encodes\n * baked lighting. It will cast a shadow onto an object that receives shadows\n * (and shadow clipping works), but it will not self-shadow or receive\n * shadows.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshMatcapMaterial\n */\nclass MeshMatcapMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh matcap material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The matcap map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.matcap = null;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineDashedMaterial( {\n * \tcolor: 0xffffff,\n * \tscale: 1,\n * \tdashSize: 3,\n * \tgapSize: 1,\n * } );\n * ```\n *\n * @augments LineBasicMaterial\n */\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\t/**\n\t * Constructs a new line dashed material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineDashedMaterial = true;\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\t/**\n\t\t * The scale of the dashed part of a line.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.scale = 1;\n\n\t\t/**\n\t\t * The size of the dash. This is both the gap with the stroke.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 3\n\t\t */\n\t\tthis.dashSize = 3;\n\n\t\t/**\n\t\t * The size of the gap.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Converts an array to a specific type.\n *\n * @param {TypedArray|Array} array - The array to convert.\n * @param {TypedArray.constructor} type - The constructor of a typed array that defines the new type.\n * @return {TypedArray} The converted array.\n */\nfunction convertArray( array, type ) {\n\n\tif ( ! array || array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\n/**\n * Returns `true` if the given object is a typed array.\n *\n * @param {any} object - The object to check.\n * @return {boolean} Whether the given object is a typed array.\n */\nfunction isTypedArray( object ) {\n\n\treturn ArrayBuffer.isView( object ) && ! ( object instanceof DataView );\n\n}\n\n/**\n * Returns an array by which times and values can be sorted.\n *\n * @param {Array} times - The keyframe time values.\n * @return {Array} The array.\n */\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n/**\n * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n *\n * @param {Array} values - The values to sort.\n * @param {number} stride - The stride.\n * @param {Array} order - The sort order.\n * @return {Array} The sorted values.\n */\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * Used for parsing AOS keyframe formats.\n *\n * @param {Array} jsonKeys - A list of JSON keyframes.\n * @param {Array} times - This array will be filled with keyframe times by this function.\n * @param {Array} values - This array will be filled with keyframe values by this function.\n * @param {string} valuePropertyName - The name of the property to use.\n */\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( ...value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\n/**\n * Creates a new clip, containing only the segment of the original clip between the given frames.\n *\n * @param {AnimationClip} sourceClip - The values to sort.\n * @param {string} name - The name of the clip.\n * @param {number} startFrame - The start frame.\n * @param {number} endFrame - The end frame.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The new sub clip.\n */\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( -1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\n/**\n * Converts the keyframes of the given animation clip to an additive format.\n *\n * @param {AnimationClip} targetClip - The clip to make additive.\n * @param {number} [referenceFrame=0] - The reference frame.\n * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The updated clip which is now additive.\n */\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = interpolant.resultBuffer.slice( startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\n/**\n * A class with various methods to assist with animations.\n *\n * @hideconstructor\n */\nclass AnimationUtils {\n\n\t/**\n\t * Converts an array to a specific type\n\t *\n\t * @static\n\t * @param {TypedArray|Array} array - The array to convert.\n\t * @param {TypedArray.constructor} type - The constructor of a type array.\n\t * @return {TypedArray} The converted array\n\t */\n\tstatic convertArray( array, type ) {\n\n\t\treturn convertArray( array, type );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given object is a typed array.\n\t *\n\t * @static\n\t * @param {any} object - The object to check.\n\t * @return {boolean} Whether the given object is a typed array.\n\t */\n\tstatic isTypedArray( object ) {\n\n\t\treturn isTypedArray( object );\n\n\t}\n\n\t/**\n\t * Returns an array by which times and values can be sorted.\n\t *\n\t * @static\n\t * @param {Array} times - The keyframe time values.\n\t * @return {Array} The array.\n\t */\n\tstatic getKeyframeOrder( times ) {\n\n\t\treturn getKeyframeOrder( times );\n\n\t}\n\n\t/**\n\t * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n\t *\n\t * @static\n\t * @param {Array} values - The values to sort.\n\t * @param {number} stride - The stride.\n\t * @param {Array} order - The sort order.\n\t * @return {Array} The sorted values.\n\t */\n\tstatic sortedArray( values, stride, order ) {\n\n\t\treturn sortedArray( values, stride, order );\n\n\t}\n\n\t/**\n\t * Used for parsing AOS keyframe formats.\n\t *\n\t * @static\n\t * @param {Array} jsonKeys - A list of JSON keyframes.\n\t * @param {Array} times - This array will be filled with keyframe times by this method.\n\t * @param {Array} values - This array will be filled with keyframe values by this method.\n\t * @param {string} valuePropertyName - The name of the property to use.\n\t */\n\tstatic flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tflattenJSON( jsonKeys, times, values, valuePropertyName );\n\n\t}\n\n\t/**\n\t * Creates a new clip, containing only the segment of the original clip between the given frames.\n\t *\n\t * @static\n\t * @param {AnimationClip} sourceClip - The values to sort.\n\t * @param {string} name - The name of the clip.\n\t * @param {number} startFrame - The start frame.\n\t * @param {number} endFrame - The end frame.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The new sub clip.\n\t */\n\tstatic subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\t\treturn subclip( sourceClip, name, startFrame, endFrame, fps );\n\n\t}\n\n\t/**\n\t * Converts the keyframes of the given animation clip to an additive format.\n\t *\n\t * @static\n\t * @param {AnimationClip} targetClip - The clip to make additive.\n\t * @param {number} [referenceFrame=0] - The reference frame.\n\t * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The updated clip which is now additive.\n\t */\n\tstatic makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\t\treturn makeClipAdditive( targetClip, referenceFrame, referenceClip, fps );\n\n\t}\n\n}\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References: {@link http://www.oodesign.com/template-method-pattern.html}\n *\n * @abstract\n */\nclass Interpolant {\n\n\t/**\n\t * Constructs a new interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\t/**\n\t\t * The parameter positions.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.parameterPositions = parameterPositions;\n\n\t\t/**\n\t\t * A cache index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._cachedIndex = 0;\n\n\t\t/**\n\t\t * The result buffer.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.resultBuffer = resultBuffer !== undefined ? resultBuffer : new sampleValues.constructor( sampleSize );\n\n\t\t/**\n\t\t * The sample values.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.sampleValues = sampleValues;\n\n\t\t/**\n\t\t * The value size.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.valueSize = sampleSize;\n\n\t\t/**\n\t\t * The interpolation settings.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.settings = null;\n\n\t\t/**\n\t\t * The default settings object.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\t/**\n\t * Evaluate the interpolant at position `t`.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\t/**\n\t * Returns the interpolation settings.\n\t *\n\t * @return {Object} The interpolation settings.\n\t */\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @param {number} index - An index into the sample value buffer.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @abstract\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t * @param {number} t1 - The next interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\t/**\n\t * Optional method that is executed when the interval has changed.\n\t *\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t */\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n *\n * @augments Interpolant\n */\nclass CubicInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new cubic interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( -1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\tconst s1 = ( -1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A basic linear interpolant.\n *\n * @augments Interpolant\n */\nclass LinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new linear interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n *\n * @augments Interpolant\n */\nclass DiscreteInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new discrete interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\n/**\n * Represents s a timed sequence of keyframes, which are composed of lists of\n * times and related values, and which are used to animate a specific property\n * of an object.\n */\nclass KeyframeTrack {\n\n\t/**\n\t * Constructs a new keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\t/**\n\t\t * The track's name can refer to morph targets or bones or\n\t\t * possibly other values within an animated object. See {@link PropertyBinding#parseTrackName}\n\t\t * for the forms of strings that can be parsed for property binding.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The keyframe times.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\n\t\t/**\n\t\t * The keyframe values.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t/**\n\t * Converts the keyframe track to JSON.\n\t *\n\t * @static\n\t * @param {KeyframeTrack} track - The keyframe track to serialize.\n\t * @return {Object} The serialized keyframe track as JSON.\n\t */\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Factory method for creating a new discrete interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {DiscreteInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new linear interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {LinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new smooth interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {CubicInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Defines the interpolation factor method for this keyframe track.\n\t *\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} interpolation - The interpolation type.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\twarn( 'KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current interpolation type.\n\t *\n\t * @return {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} The interpolation type.\n\t */\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the value size.\n\t *\n\t * @return {number} The value size.\n\t */\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t/**\n\t * Moves all keyframes either forward or backward in time.\n\t *\n\t * @param {number} timeOffset - The offset to move the time values.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scale all keyframe times by a factor (useful for frame - seconds conversions).\n\t *\n\t * @param {number} timeScale - The time scale.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes keyframes before and after animation without changing any values within the defined time range.\n\t *\n\t * Note: The method does not shift around keys to the start of the track time, because for interpolated\n\t * keys this will change their values\n\t *\n\t * @param {number} startTime - The start time.\n\t * @param {number} endTime - The end time.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== -1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = times.slice( from, to );\n\t\t\tthis.values = this.values.slice( from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on the keyframe track. Returns `true` if the values\n\t * are valid.\n\t *\n\t * @return {boolean} Whether the keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\terror( 'KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\terror( 'KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\terror( 'KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes this keyframe track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = this.times.slice(),\n\t\t\tvalues = this.values.slice(),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = times.slice( 0, writeIndex );\n\t\t\tthis.values = values.slice( 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new keyframe track with copied values from this instance.\n\t *\n\t * @return {KeyframeTrack} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst times = this.times.slice();\n\t\tconst values = this.values.slice();\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default ''\n */\nKeyframeTrack.prototype.ValueTypeName = '';\n\n/**\n * The time buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateLinear\n */\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A track for boolean keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new boolean keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'bool'\n */\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for color keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass ColorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new color keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'color'\n */\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A track for numeric keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass NumberKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new number keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'number'\n */\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n *\n * @augments Interpolant\n */\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new SLERP interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A track for Quaternion keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new Quaternion keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n\t/**\n\t * Overwritten so the method returns Quaternion based interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {QuaternionLinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'quaternion'\n */\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\n// DefaultInterpolation is inherited;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for string keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass StringKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new string keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'string'\n */\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nStringKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for vector keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass VectorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new vector keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'vector'\n */\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\n/**\n * A reusable set of keyframe tracks which represent an animation.\n */\nclass AnimationClip {\n\n\t/**\n\t * Constructs a new animation clip.\n\t *\n\t * Note: Instead of instantiating an AnimationClip directly with the constructor, you can\n\t * use the static interface of this class for creating clips. In most cases though, animation clips\n\t * will automatically be created by loaders when importing animated 3D assets.\n\t *\n\t * @param {string} [name=''] - The clip's name.\n\t * @param {number} [duration=-1] - The clip's duration in seconds. If a negative value is passed,\n\t * the duration will be calculated from the passed keyframes.\n\t * @param {Array} tracks - An array of keyframe tracks.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode=NormalAnimationBlendMode] - Defines how the animation\n\t * is blended/combined when two or more animations are simultaneously played.\n\t */\n\tconstructor( name = '', duration = -1, tracks = [], blendMode = NormalAnimationBlendMode ) {\n\n\t\t/**\n\t\t * The clip's name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * An array of keyframe tracks.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.tracks = tracks;\n\n\t\t/**\n\t\t * The clip's duration in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.duration = duration;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\t/**\n\t\t * The UUID of the animation clip.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the animation clip.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Factory method for creating an animation clip from the given JSON.\n\t *\n\t * @static\n\t * @param {Object} json - The serialized animation clip.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\tclip.userData = JSON.parse( json.userData || '{}' );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes the given animation clip into JSON.\n\t *\n\t * @static\n\t * @param {AnimationClip} clip - The animation clip to serialize.\n\t * @return {Object} The JSON object.\n\t */\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode,\n\t\t\t'userData': JSON.stringify( clip.userData ),\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip from the passed morph targets array of a\n\t * geometry, taking a name and the number of frames per second.\n\t *\n\t * Note: The fps parameter is required, but the animation speed can be\n\t * overridden via {@link AnimationAction#setDuration}.\n\t *\n\t * @static\n\t * @param {string} name - The name of the animation clip.\n\t * @param {Array} morphTargetSequence - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, -1, tracks );\n\n\t}\n\n\t/**\n\t * Searches for an animation clip by name, taking as its first parameter\n\t * either an array of clips, or a mesh or geometry that contains an\n\t * array named \"animations\" property.\n\t *\n\t * @static\n\t * @param {(Array|Object3D)} objectOrClipArray - The array or object to search through.\n\t * @param {string} name - The name to search for.\n\t * @return {?AnimationClip} The found animation clip. Returns `null` if no clip has been found.\n\t */\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Returns an array of new AnimationClips created from the morph target\n\t * sequences of a geometry, trying to sort morph target names into\n\t * animation-group-based patterns like \"Walk_001, Walk_002, Run_001, Run_002...\".\n\t *\n\t * See {@link MD2Loader#parse} as an example for how the method should be used.\n\t *\n\t * @static\n\t * @param {Array} morphTargets - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {Array} An array of new animation clips.\n\t */\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t/**\n\t * Parses the `animation.hierarchy` format and returns a new animation clip.\n\t *\n\t * @static\n\t * @deprecated since r175.\n\t * @param {Object} animation - A serialized animation clip as JSON.\n\t * @param {Array} bones - An array of bones.\n\t * @return {?AnimationClip} The new animation clip.\n\t */\n\tstatic parseAnimation( animation, bones ) {\n\n\t\twarn( 'AnimationClip: parseAnimation() is deprecated and will be removed with r185' );\n\n\t\tif ( ! animation ) {\n\n\t\t\terror( 'AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || -1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = -1;\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\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Sets the duration of this clip to the duration of its longest keyframe track.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Trims all tracks to the clip's duration.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on each track in the clip. Returns `true` if all\n\t * tracks are valid.\n\t *\n\t * @return {boolean} Whether the clip's keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes each track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip with copied values from this instance.\n\t *\n\t * @return {AnimationClip} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\tconst clip = new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t\tclip.userData = JSON.parse( JSON.stringify( this.userData ) );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes this animation clip into JSON.\n\t *\n\t * @return {Object} The JSON object.\n\t */\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A simple caching system, used internally by {@link FileLoader}.\n * To enable caching across all loaders that use {@link FileLoader}, add `THREE.Cache.enabled = true.` once in your app.\n * @hideconstructor\n */\nconst Cache = {\n\n\t/**\n\t * Whether caching is enabled or not.\n\t *\n\t * @static\n\t * @type {boolean}\n\t * @default false\n\t */\n\tenabled: false,\n\n\t/**\n\t * A dictionary that holds cached files.\n\t *\n\t * @static\n\t * @type {Object}\n\t */\n\tfiles: {},\n\n\t/**\n\t * Adds a cache entry with a key to reference the file. If this key already\n\t * holds a file, it is overwritten.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @param {Object} file - The file to be cached.\n\t */\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\t/**\n\t * Gets the cached value for the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @return {Object|undefined} The cached file. If the key does not exist `undefined` is returned.\n\t */\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\t/**\n\t * Removes the cached file associated with the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t */\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\t/**\n\t * Remove all values from the cache.\n\t *\n\t * @static\n\t */\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\n/**\n * Handles and keeps track of loaded and pending data. A default global\n * instance of this class is created and used by loaders if not supplied\n * manually.\n *\n * In general that should be sufficient, however there are times when it can\n * be useful to have separate loaders - for example if you want to show\n * separate loading bars for objects and textures.\n *\n * ```js\n * const manager = new THREE.LoadingManager();\n * manager.onLoad = () => console.log( 'Loading complete!' );\n *\n * const loader1 = new OBJLoader( manager );\n * const loader2 = new ColladaLoader( manager );\n * ```\n */\nclass LoadingManager {\n\n\t/**\n\t * Constructs a new loading manager.\n\t *\n\t * @param {Function} [onLoad] - Executes when all items have been loaded.\n\t * @param {Function} [onProgress] - Executes when single items have been loaded.\n\t * @param {Function} [onError] - Executes when an error occurs.\n\t */\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\t/**\n\t\t * Executes when an item starts loading.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onStart = undefined;\n\n\t\t/**\n\t\t * Executes when all items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onLoad = onLoad;\n\n\t\t/**\n\t\t * Executes when single items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onProgress = onProgress;\n\n\t\t/**\n\t\t * Executes when an error occurs.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onError = onError;\n\n\t\t/**\n\t\t * Used for aborting ongoing requests in loaders using this manager.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController | null}\n\t\t */\n\t\tthis._abortController = null;\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * starts loading an item.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t */\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * ended loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the loaded item.\n\t\t */\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * encounters an error when loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the item that produces an error.\n\t\t */\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Given a URL, uses the URL modifier callback (if any) and returns a\n\t\t * resolved URL. If no URL modifier is set, returns the original URL.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t * @return {string} The resolved URL.\n\t\t */\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\t/**\n\t\t * If provided, the callback will be passed each resource URL before a\n\t\t * request is sent. The callback may return the original URL, or a new URL to\n\t\t * override loading behavior. This behavior can be used to load assets from\n\t\t * .ZIP files, drag-and-drop APIs, and Data URIs.\n\t\t *\n\t\t * ```js\n\t\t * const blobs = {'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3};\n\t\t *\n\t\t * const manager = new THREE.LoadingManager();\n\t\t *\n\t\t * // Initialize loading manager with URL callback.\n\t\t * const objectURLs = [];\n\t\t * manager.setURLModifier( ( url ) => {\n\t\t *\n\t\t * \turl = URL.createObjectURL( blobs[ url ] );\n\t\t * \tobjectURLs.push( url );\n\t\t * \treturn url;\n\t\t *\n\t\t * } );\n\t\t *\n\t\t * // Load as usual, then revoke the blob URLs.\n\t\t * const loader = new GLTFLoader( manager );\n\t\t * loader.load( 'fish.gltf', (gltf) => {\n\t\t *\n\t\t * \tscene.add( gltf.scene );\n\t\t * \tobjectURLs.forEach( ( url ) => URL.revokeObjectURL( url ) );\n\t\t *\n\t\t * } );\n\t\t * ```\n\t\t *\n\t\t * @param {function(string):string} transform - URL modifier callback. Called with an URL and must return a resolved URL.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Registers a loader with the given regular expression. Can be used to\n\t\t * define what loader should be used in order to load specific files. A\n\t\t * typical use case is to overwrite the default loader for textures.\n\t\t *\n\t\t * ```js\n\t\t * // add handler for TGA textures\n\t\t * manager.addHandler( /\\.tga$/i, new TGALoader() );\n\t\t * ```\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @param {Loader} loader - A loader that should handle matched cases.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Removes the loader for the given regular expression.\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to retrieve the registered loader for the given file path.\n\t\t *\n\t\t * @param {string} file - The file path.\n\t\t * @return {?Loader} The registered loader. Returns `null` if no loader was found.\n\t\t */\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to abort ongoing loading requests in loaders using this manager.\n\t\t * The abort only works if the loaders implement {@link Loader#abort} and `AbortSignal.any()`\n\t\t * is supported in the browser.\n\t\t *\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.abort = function () {\n\n\n\t\t\tthis.abortController.abort();\n\t\t\tthis._abortController = null;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}\n\n\t// TODO: Revert this back to a single member variable once this issue has been fixed\n\t// https://github.com/cloudflare/workerd/issues/3657\n\n\t/**\n\t * Used for aborting ongoing requests in loaders using this manager.\n\t *\n\t * @type {AbortController}\n\t */\n\tget abortController() {\n\n\t\tif ( ! this._abortController ) {\n\n\t\t\tthis._abortController = new AbortController();\n\n\t\t}\n\n\t\treturn this._abortController;\n\n\t}\n\n}\n\n/**\n * The global default loading manager.\n *\n * @constant\n * @type {LoadingManager}\n */\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\n/**\n * Abstract base class for loaders.\n *\n * @abstract\n */\nclass Loader {\n\n\t/**\n\t * Constructs a new loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\t/**\n\t\t * The loading manager.\n\t\t *\n\t\t * @type {LoadingManager}\n\t\t * @default DefaultLoadingManager\n\t\t */\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t/**\n\t\t * The crossOrigin string to implement CORS for loading the url from a\n\t\t * different domain that allows CORS.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'anonymous'\n\t\t */\n\t\tthis.crossOrigin = 'anonymous';\n\n\t\t/**\n\t\t * Whether the XMLHttpRequest uses credentials.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.withCredentials = false;\n\n\t\t/**\n\t\t * The base path from which the asset will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = '';\n\n\t\t/**\n\t\t * The base path from which additional resources like textures will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.resourcePath = '';\n\n\t\t/**\n\t\t * The [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t\t * used in HTTP request.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.requestHeader = {};\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for loading assets from the backend.\n\t *\n\t * @abstract\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t */\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\t/**\n\t * A async version of {@link Loader#load}.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves when the asset has been loaded.\n\t */\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for parsing the asset into three.js entities.\n\t *\n\t * @abstract\n\t * @param {any} data - The data to parse.\n\t */\n\tparse( /* data */ ) {}\n\n\t/**\n\t * Sets the `crossOrigin` String to implement CORS for loading the URL\n\t * from a different domain that allows CORS.\n\t *\n\t * @param {string} crossOrigin - The `crossOrigin` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Whether the XMLHttpRequest uses credentials such as cookies, authorization\n\t * headers or TLS client certificates, see [XMLHttpRequest.withCredentials](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials).\n\t *\n\t * Note: This setting has no effect if you are loading files locally or from the same domain.\n\t *\n\t * @param {boolean} value - The `withCredentials` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for the asset.\n\t *\n\t * @param {string} path - The base path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for dependent resources like textures.\n\t *\n\t * @param {string} resourcePath - The resource path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given request header.\n\t *\n\t * @param {Object} requestHeader - A [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t * for configuring the HTTP request.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method can be implemented in loaders for aborting ongoing requests.\n\t *\n\t * @abstract\n\t * @return {Loader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Callback for onProgress in loaders.\n *\n * @callback onProgressCallback\n * @param {ProgressEvent} event - An instance of `ProgressEvent` that represents the current loading status.\n */\n\n/**\n * Callback for onError in loaders.\n *\n * @callback onErrorCallback\n * @param {Error} error - The error which occurred during the loading process.\n */\n\n/**\n * The default material name that is used by loaders\n * when creating materials for loaded 3D objects.\n *\n * Note: Not all loaders might honor this setting.\n *\n * @static\n * @type {string}\n * @default '__DEFAULT'\n */\nLoader.DEFAULT_MATERIAL_NAME = '__DEFAULT';\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\n/**\n * A low level class for loading resources with the Fetch API, used internally by\n * most loaders. It can also be used directly to load any file type that does\n * not have a loader.\n *\n * This loader supports caching. If you want to use it, add `THREE.Cache.enabled = true;`\n * once to your application.\n *\n * ```js\n * const loader = new THREE.FileLoader();\n * const data = await loader.loadAsync( 'example.txt' );\n * ```\n *\n * @augments Loader\n */\nclass FileLoader extends Loader {\n\n\t/**\n\t * Constructs a new file loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The expected mime type. Valid values can be found\n\t\t * [here](hhttps://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#mimetype)\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.mimeType = '';\n\n\t\t/**\n\t\t * The expected response type.\n\t\t *\n\t\t * @type {('arraybuffer'|'blob'|'document'|'json'|'')}\n\t\t * @default ''\n\t\t */\n\t\tthis.responseType = '';\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(any)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t * @return {any|undefined} The cached resource if available.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( `file:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\tsignal: ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\twarn( 'FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get( 'X-File-Size' ) || response.headers.get( 'Content-Length' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}, ( e ) => {\n\n\t\t\t\t\t\t\t\t\tcontroller.error( e );\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === '' ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( `file:${url}`, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Sets the expected response type.\n\t *\n\t * @param {('arraybuffer'|'blob'|'document'|'json'|'')} value - The response type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the expected mime type of the loaded file.\n\t *\n\t * @param {string} value - The mime type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {FileLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Class for loading animation clips in the JSON format. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.AnimationLoader();\n * const animations = await loader.loadAsync( 'animations/animation.js' );\n * ```\n *\n * @augments Loader\n */\nclass AnimationLoader extends Loader {\n\n\t/**\n\t * Constructs a new animation loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded animations as an array\n\t * holding instances of {@link AnimationClip} to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Array)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns an array of animation clips.\n\t *\n\t * @param {Object} json - The serialized animation clips.\n\t * @return {Array} The parsed animation clips.\n\t */\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading compressed texture formats S3TC, ASTC or ETC.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass CompressedTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new compressed texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded compressed texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(CompressedTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CompressedTexture} The compressed texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nconst _loading = new WeakMap();\n\n/**\n * A loader for loading images. The class loads images with the HTML `Image` API.\n *\n * ```js\n * const loader = new THREE.ImageLoader();\n * const image = await loader.loadAsync( 'image.png' );\n * ```\n * Please note that `ImageLoader` has dropped support for progress\n * events in `r84`. For an `ImageLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-275785639).\n *\n * @augments Loader\n */\nclass ImageLoader extends Loader {\n\n\t/**\n\t * Constructs a new image loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded image\n\t * to the `onLoad()` callback. The method also returns a new `Image` object which can\n\t * directly be used for texture creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Image)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Image} The image.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tif ( cached.complete === true ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tlet arr = _loading.get( cached );\n\n\t\t\t\tif ( arr === undefined ) {\n\n\t\t\t\t\tarr = [];\n\t\t\t\t\t_loading.set( cached, arr );\n\n\t\t\t\t}\n\n\t\t\t\tarr.push( { onLoad, onError } );\n\n\t\t\t}\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onLoad ) callback.onLoad( this );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tCache.remove( `image:${url}` );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tCache.add( `image:${url}`, image );\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\n/**\n * Class for loading cube textures. Images are internally loaded via {@link ImageLoader}.\n *\n * The loader returns an instance of {@link CubeTexture} and expects the cube map to\n * be defined as six separate images representing the sides of a cube. Other cube map definitions\n * like vertical and horizontal cross, column and row layouts are not supported.\n *\n * Note that, by convention, cube maps are specified in a coordinate system\n * in which positive-x is to the right when looking up the positive-z axis --\n * in other words, using a left-handed coordinate system. Since three.js uses\n * a right-handed coordinate system, environment maps used in three.js will\n * have pos-x and neg-x swapped.\n *\n * The loaded cube texture is in sRGB color space. Meaning {@link Texture#colorSpace}\n * is set to `SRGBColorSpace` by default.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader().setPath( 'textures/cubeMaps/' );\n * const cubeTexture = await loader.loadAsync( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n * scene.background = cubeTexture;\n * ```\n *\n * @augments Loader\n */\nclass CubeTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new cube texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded cube texture\n\t * to the `onLoad()` callback. The method also returns a new cube texture object which can\n\t * directly be used for material creation. If you do it this way, the cube texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {Array} urls - Array of 6 URLs to images, one for each side of the\n\t * cube texture. The urls should be specified in the following order: pos-x,\n\t * neg-x, pos-y, neg-y, pos-z, neg-z. An array of data URIs are allowed as well.\n\t * @param {function(CubeTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CubeTexture} The cube texture.\n\t */\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading binary texture formats RGBE, EXR or TGA.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass DataTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new data texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded data texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(DataTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {DataTexture} The data texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tlet texData;\n\n\t\t\ttry {\n\n\t\t\t\ttexData = scope.parse( buffer );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) {\n\n\t\t\t\t\tonError( error );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = texData.colorSpace;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Class for loading textures. Images are internally\n * loaded via {@link ImageLoader}.\n *\n * ```js\n * const loader = new THREE.TextureLoader();\n * const texture = await loader.loadAsync( 'textures/land_ocean_ice_cloud_2048.jpg' );\n *\n * const material = new THREE.MeshBasicMaterial( { map:texture } );\n * ```\n * Please note that `TextureLoader` has dropped support for progress\n * events in `r84`. For a `TextureLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-293260145).\n *\n * @augments Loader\n */\nclass TextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Texture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Texture} The texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for lights - all other light types inherit the\n * properties and methods described here.\n *\n * @abstract\n * @augments Object3D\n */\nclass Light extends Object3D {\n\n\t/**\n\t * Constructs a new light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\t/**\n\t\t * The light's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The light's intensity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = intensity;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\t\tif ( this.target !== undefined ) data.object.target = this.target.uuid;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * A light source positioned directly above the scene, with color fading from\n * the sky color to the ground color.\n *\n * This light cannot be used to cast shadows.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass HemisphereLight extends Light {\n\n\t/**\n\t * Constructs a new hemisphere light.\n\t *\n\t * @param {(number|Color|string)} [skyColor=0xffffff] - The light's sky color.\n\t * @param {(number|Color|string)} [groundColor=0xffffff] - The light's ground color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The light's ground color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * Abstract base class for light shadow classes. These classes\n * represent the shadow configuration for different light types.\n *\n * @abstract\n */\nclass LightShadow {\n\n\t/**\n\t * Constructs a new light shadow.\n\t *\n\t * @param {Camera} camera - The light's view of the world.\n\t */\n\tconstructor( camera ) {\n\n\t\t/**\n\t\t * The light's view of the world.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The intensity of the shadow. The default is `1`.\n\t\t * Valid values are in the range `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = 1;\n\n\t\t/**\n\t\t * Shadow map bias, how much to add or subtract from the normalized depth\n\t\t * when deciding whether a surface is in shadow.\n\t\t *\n\t\t * The default is `0`. Very tiny adjustments here (in the order of `0.0001`)\n\t\t * may help reduce artifacts in shadows.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bias = 0;\n\n\t\t/**\n\t\t * Defines how much the position used to query the shadow map is offset along\n\t\t * the object normal. The default is `0`. Increasing this value can be used to\n\t\t * reduce shadow acne especially in large scenes where light shines onto\n\t\t * geometry at a shallow angle. The cost is that shadows may appear distorted.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.normalBias = 0;\n\n\t\t/**\n\t\t * Setting this to values greater than 1 will blur the edges of the shadow.\n\t\t * High values will cause unwanted banding effects in the shadows - a greater\n\t\t * map size will allow for a higher value to be used here before these effects\n\t\t * become visible.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `PCFSoftShadowMap` and\n\t\t * and it is recommended to increase softness by decreasing the shadow map size instead.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `BasicShadowMap`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = 1;\n\n\t\t/**\n\t\t * The amount of samples to use when blurring a VSM shadow map.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 8\n\t\t */\n\t\tthis.blurSamples = 8;\n\n\t\t/**\n\t\t * Defines the width and height of the shadow map. Higher values give better quality\n\t\t * shadows at the cost of computation time. Values must be powers of two.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (512,512)\n\t\t */\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\t/**\n\t\t * The type of shadow texture. The default is `UnsignedByteType`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.mapType = UnsignedByteType;\n\n\t\t/**\n\t\t * The depth map generated using the internal camera; a location beyond a\n\t\t * pixel's depth is in shadow. Computed internally during rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The distribution map generated using the internal camera; an occlusion is\n\t\t * calculated based on the distribution of depths. Computed internally during\n\t\t * rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.mapPass = null;\n\n\t\t/**\n\t\t * Model to shadow camera space, to compute location and depth in shadow map.\n\t\t * This is computed internally during rendering.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Enables automatic updates of the light's shadow. If you do not require dynamic\n\t\t * lighting / shadows, you may set this to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t\t/**\n\t\t * When set to `true`, shadow maps will be updated in the next `render` call.\n\t\t * If you have set {@link LightShadow#autoUpdate} to `false`, you will need to\n\t\t * set this property to `true` and then make a render call to update the light's shadow.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\t/**\n\t * Used internally by the renderer to get the number of viewports that need\n\t * to be rendered for this shadow.\n\t *\n\t * @return {number} The viewport count.\n\t */\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\t/**\n\t * Gets the shadow cameras frustum. Used internally by the renderer to cull objects.\n\t *\n\t * @return {Frustum} The shadow camera frustum.\n\t */\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t */\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1, shadowCamera.coordinateSystem, shadowCamera.reversedDepth );\n\n\t\tif ( shadowCamera.reversedDepth ) {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 1.0, 0.0,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t}\n\n\t\tshadowMatrix.multiply( _projScreenMatrix$1 );\n\n\t}\n\n\t/**\n\t * Returns a viewport definition for the given viewport index.\n\t *\n\t * @param {number} viewportIndex - The viewport index.\n\t * @return {Vector4} The viewport.\n\t */\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\t/**\n\t * Returns the frame extends.\n\t *\n\t * @return {Vector2} The frame extends.\n\t */\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Copies the values of the given light shadow instance to this instance.\n\t *\n\t * @param {LightShadow} source - The light shadow to copy.\n\t * @return {LightShadow} A reference to this light shadow instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.intensity = source.intensity;\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.needsUpdate = source.needsUpdate;\n\t\tthis.normalBias = source.normalBias;\n\t\tthis.blurSamples = source.blurSamples;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new light shadow instance with copied values from this instance.\n\t *\n\t * @return {LightShadow} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the light shadow into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized light shadow.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.intensity !== 1 ) object.intensity = this.intensity;\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass SpotLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new spot light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLightShadow = true;\n\n\t\t/**\n\t\t * Used to focus the shadow camera. The camera's field of view is set as a\n\t\t * percentage of the spotlight's field-of-view. Range is `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.focus = 1;\n\n\t\t/**\n\t\t * Texture aspect ratio.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = ( this.mapSize.width / this.mapSize.height ) * this.aspect;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light gets emitted from a single point in one direction, along a cone\n * that increases in size the further from the light it gets.\n *\n * This light can cast shadows - see the {@link SpotLightShadow} for details.\n *\n * ```js\n * // white spotlight shining from the side, modulated by a texture\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 100, 1000, 100 );\n * spotLight.map = new THREE.TextureLoader().load( url );\n *\n * spotLight.castShadow = true;\n * spotLight.shadow.mapSize.width = 1024;\n * spotLight.shadow.mapSize.height = 1024;\n * spotLight.shadow.camera.near = 500;\n * spotLight.shadow.camera.far = 4000;\n * spotLight.shadow.camera.fov = 30;s\n * ```\n *\n * @augments Light\n */\nclass SpotLight extends Light {\n\n\t/**\n\t * Constructs a new spot light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [angle=Math.PI/3] - Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t * @param {number} [penumbra=0] - Percent of the spotlight cone that is attenuated due to penumbra. Value range is `[0,1]`.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLight = true;\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The spot light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * Maximum range of the light. `0` means no limit.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI/3\n\t\t */\n\t\tthis.angle = angle;\n\n\t\t/**\n\t\t * Percent of the spotlight cone that is attenuated due to penumbra.\n\t\t * Value range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.penumbra = penumbra;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * A texture used to modulate the color of the light. The spot light\n\t\t * color is mixed with the RGB value of this texture, with a ratio\n\t\t * corresponding to its alpha value. The cookie-like masking effect is\n\t\t * reproduced using pixel values (0, 0, 0, 1-cookie_value).\n\t\t *\n\t\t * *Warning*: This property is disabled if {@link Object3D#castShadow} is set to `false`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {SpotLightShadow}\n\t\t */\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents the shadow configuration of point lights.\n *\n * @augments LightShadow\n */\nclass PointLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new point light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLightShadow = true;\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t// xzXZ\n\t\t\t// y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( -1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, -1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, -1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, -1 )\n\t\t];\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t * @param {number} [viewportIndex=0] - The viewport index.\n\t */\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );\n\n\t}\n\n}\n\n/**\n * A light that gets emitted from a single point in all directions. A common\n * use case for this is to replicate the light emitted from a bare\n * lightbulb.\n *\n * This light can cast shadows - see the {@link PointLightShadow} for details.\n *\n * ```js\n * const light = new THREE.PointLight( 0xff0000, 1, 100 );\n * light.position.set( 50, 50, 50 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass PointLight extends Light {\n\n\t/**\n\t * Constructs a new point light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\t/**\n\t\t * When distance is zero, light will attenuate according to inverse-square\n\t\t * law to infinite distance. When distance is non-zero, light will attenuate\n\t\t * according to inverse-square law until near the distance cutoff, where it\n\t\t * will then attenuate quickly and smoothly to 0. Inherently, cutoffs are not\n\t\t * physically correct.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {PointLightShadow}\n\t\t */\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Camera that uses [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection).\n *\n * In this projection mode, an object's size in the rendered image stays\n * constant regardless of its distance from the camera. This can be useful\n * for rendering 2D scenes and UI elements, amongst other things.\n *\n * ```js\n * const camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass OrthographicCamera extends Camera {\n\n\t/**\n\t * Constructs a new orthographic camera.\n\t *\n\t * @param {number} [left=-1] - The left plane of the camera's frustum.\n\t * @param {number} [right=1] - The right plane of the camera's frustum.\n\t * @param {number} [top=1] - The top plane of the camera's frustum.\n\t * @param {number} [bottom=-1] - The bottom plane of the camera's frustum.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOrthographicCamera = true;\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * The left plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.left = left;\n\n\t\t/**\n\t\t * The right plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.right = right;\n\n\t\t/**\n\t\t * The top plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.top = top;\n\n\t\t/**\n\t\t * The bottom plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.bottom = bottom;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link OrthographicCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link PerspectiveCamera}, `0` is a\n\t\t * valid value for an orthographic camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link OrthographicCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t * @see {@link PerspectiveCamera#setViewOffset}\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass DirectionalLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new directional light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( -5, 5, 5, -5, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\n/**\n * A light that gets emitted in a specific direction. This light will behave\n * as though it is infinitely far away and the rays produced from it are all\n * parallel. The common use case for this is to simulate daylight; the sun is\n * far enough away that its position can be considered to be infinite, and\n * all light rays coming from it are parallel.\n *\n * A common point of confusion for directional lights is that setting the\n * rotation has no effect. This is because three.js's DirectionalLight is the\n * equivalent to what is often called a 'Target Direct Light' in other\n * applications.\n *\n * This means that its direction is calculated as pointing from the light's\n * {@link Object3D#position} to the {@link DirectionalLight#target} position\n * (as opposed to a 'Free Direct Light' that just has a rotation\n * component).\n *\n * This light can cast shadows - see the {@link DirectionalLightShadow} for details.\n *\n * ```js\n * // White directional light at half intensity shining from the top.\n * const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );\n * scene.add( directionalLight );\n * ```\n *\n * @augments Light\n */\nclass DirectionalLight extends Light {\n\n\t/**\n\t * Constructs a new directional light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLight = true;\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The directional light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {DirectionalLightShadow}\n\t\t */\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light globally illuminates all objects in the scene equally.\n *\n * It cannot be used to cast shadows as it does not have a direction.\n *\n * ```js\n * const light = new THREE.AmbientLight( 0x404040 ); // soft white light\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass AmbientLight extends Light {\n\n\t/**\n\t * Constructs a new ambient light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\n/**\n * This class emits light uniformly across the face a rectangular plane.\n * This light type can be used to simulate light sources such as bright\n * windows or strip lighting.\n *\n * Important Notes:\n *\n * - There is no shadow support.\n * - Only PBR materials are supported.\n * - You have to include `RectAreaLightUniformsLib` (`WebGLRenderer`) or `RectAreaLightTexturesLib` (`WebGPURenderer`)\n * into your app and init the uniforms/textures.\n *\n * ```js\n * RectAreaLightUniformsLib.init(); // only relevant for WebGLRenderer\n * THREE.RectAreaLightNode.setLTC( RectAreaLightTexturesLib.init() ); // only relevant for WebGPURenderer\n *\n * const intensity = 1; const width = 10; const height = 10;\n * const rectLight = new THREE.RectAreaLight( 0xffffff, intensity, width, height );\n * rectLight.position.set( 5, 5, 0 );\n * rectLight.lookAt( 0, 0, 0 );\n * scene.add( rectLight )\n * ```\n *\n * @augments Light\n */\nclass RectAreaLight extends Light {\n\n\t/**\n\t * Constructs a new area light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t * @param {number} [width=10] - The width of the light.\n\t * @param {number} [height=10] - The height of the light.\n\t */\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\t/**\n\t\t * The width of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.height = height;\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a third-order spherical harmonics (SH). Light probes use this class\n * to encode lighting information.\n *\n * - Primary reference: {@link https://graphics.stanford.edu/papers/envmap/envmap.pdf}\n * - Secondary reference: {@link https://www.ppsloan.org/publications/StupidSH36.pdf}\n */\nclass SphericalHarmonics3 {\n\n\t/**\n\t * Constructs a new spherical harmonics.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\t/**\n\t\t * An array holding the (9) SH coefficients.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given SH coefficients to this instance by copying\n\t * the values.\n\t *\n\t * @param {Array} coefficients - The SH coefficients.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets all SH coefficients to `0`.\n\t *\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the radiance in the direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The radiance.\n\t */\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the irradiance (radiance convolved with cosine lobe) in the\n\t * direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The irradiance.\n\t */\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Adds the given SH to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * A convenience method for performing {@link SphericalHarmonics3#add} and\n\t * {@link SphericalHarmonics3#scale} at once.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this SH by the given scale factor.\n\t *\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linear interpolates between the given SH and this instance by the given\n\t * alpha factor.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to interpolate with.\n\t * @param {number} alpha - The alpha factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this spherical harmonics is equal with the given one.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to test for equality.\n\t * @return {boolean} Whether this spherical harmonics is equal with the given one.\n\t */\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical harmonics to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to copy.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\t/**\n\t * Returns a new spherical harmonics with copied values from this instance.\n\t *\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Sets the SH coefficients of this instance from the given array.\n\t *\n\t * @param {Array} array - An array holding the SH coefficients.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns an array with the SH coefficients, or copies them into the provided\n\t * array. The coefficients are represented as numbers.\n\t *\n\t * @param {Array} [array=[]] - The target array.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {Array} An array with flat SH coefficients.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Computes the SH basis for the given normal vector.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Array} shBasis - The target array holding the SH basis.\n\t */\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\n/**\n * Light probes are an alternative way of adding light to a 3D scene. Unlike\n * classical light sources (e.g. directional, point or spot lights), light\n * probes do not emit light. Instead they store information about light\n * passing through 3D space. During rendering, the light that hits a 3D\n * object is approximated by using the data from the light probe.\n *\n * Light probes are usually created from (radiance) environment maps. The\n * class {@link LightProbeGenerator} can be used to create light probes from\n * cube textures or render targets. However, light estimation data could also\n * be provided in other forms e.g. by WebXR. This enables the rendering of\n * augmented reality content that reacts to real world lighting.\n *\n * The current probe implementation in three.js supports so-called diffuse\n * light probes. This type of light probe is functionally equivalent to an\n * irradiance environment map.\n *\n * @augments Light\n */\nclass LightProbe extends Light {\n\n\t/**\n\t * Constructs a new light probe.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics which represents encoded lighting information.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLightProbe = true;\n\n\t\t/**\n\t\t * A light probe uses spherical harmonics to encode lighting information.\n\t\t *\n\t\t * @type {SphericalHarmonics3}\n\t\t */\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deserializes the light prove from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized light probe.\n\t * @return {LightProbe} A reference to this light probe.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.MaterialLoader();\n * const material = await loader.loadAsync( 'material.json' );\n * ```\n * This loader does not support node materials. Use {@link NodeMaterialLoader} instead.\n *\n * @augments Loader\n */\nclass MaterialLoader extends Loader {\n\n\t/**\n\t * Constructs a new material loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * A dictionary holding textures used by the material.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.textures = {};\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded material to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Material)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a material.\n\t *\n\t * @param {Object} json - The serialized material.\n\t * @return {Material} The parsed material.\n\t */\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\twarn( 'MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = this.createMaterialFromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.dispersion !== undefined ) material.dispersion = json.dispersion;\n\t\tif ( json.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.anisotropy !== undefined ) material.anisotropy = json.anisotropy;\n\t\tif ( json.anisotropyRotation !== undefined ) material.anisotropyRotation = json.anisotropyRotation;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.alphaHash !== undefined ) material.alphaHash = json.alphaHash;\n\t\tif ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.blendSrc !== undefined ) material.blendSrc = json.blendSrc;\n\t\tif ( json.blendDst !== undefined ) material.blendDst = json.blendDst;\n\t\tif ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation;\n\t\tif ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha;\n\t\tif ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha;\n\t\tif ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha;\n\t\tif ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor );\n\t\tif ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== undefined ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\t\tif ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.lights !== undefined ) material.lights = json.lights;\n\t\tif ( json.clipping !== undefined ) material.clipping = json.clipping;\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapRotation !== undefined ) material.envMapRotation.fromArray( json.envMapRotation );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.anisotropyMap !== undefined ) material.anisotropyMap = getTexture( json.anisotropyMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\t/**\n\t * Textures are not embedded in the material JSON so they have\n\t * to be injected before the loading process starts.\n\t *\n\t * @param {Object} value - A dictionary holding textures for material properties.\n\t * @return {MaterialLoader} A reference to this material loader.\n\t */\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tcreateMaterialFromType( type ) {\n\n\t\treturn MaterialLoader.createMaterialFromType( type );\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @static\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\n/**\n * A class with loader utility functions.\n */\nclass LoaderUtils {\n\n\t/**\n\t * Extracts the base URL from the given URL.\n\t *\n\t * @param {string} url -The URL to extract the base URL from.\n\t * @return {string} The extracted base URL.\n\t */\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === -1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\t/**\n\t * Resolves relative URLs against the given path. Absolute paths, data urls,\n\t * and blob URLs will be returned as is. Invalid URLs will return an empty\n\t * string.\n\t *\n\t * @param {string} url -The URL to resolve.\n\t * @param {string} path - The base path for relative URLs to be resolved against.\n\t * @return {string} The resolved URL.\n\t */\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\n/**\n * An instanced version of a geometry.\n */\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new instanced buffer geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\n\t\t/**\n\t\t * The instance count.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.BufferGeometryLoader();\n * const geometry = await loader.loadAsync( 'models/json/pressure.json' );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xF5F5F5 } );\n * const object = new THREE.Mesh( geometry, material );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass BufferGeometryLoader extends Loader {\n\n\t/**\n\t * Constructs a new geometry loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded geometry to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a geometry.\n\t *\n\t * @param {Object} json - The serialized geometry.\n\t * @return {BufferGeometry} The parsed geometry.\n\t */\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tgeometry.boundingSphere = new Sphere().fromJSON( boundingSphere );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * A loader for loading a JSON resource in the [JSON Object/Scene format](https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4).\n * The files are internally loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.ObjectLoader();\n * const obj = await loader.loadAsync( 'models/json/example.json' );\n * scene.add( obj );\n *\n * // Alternatively, to parse a previously loaded JSON structure\n * const object = await loader.parseAsync( a_json_object );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass ObjectLoader extends Loader {\n\n\t/**\n\t * Constructs a new object loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded 3D object to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Object3D)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\\'t load ' + url ) );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#load}.\n\t *\n\t * @async\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves with the loaded 3D object.\n\t */\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\t/**\n\t * Parses the given JSON. This is used internally by {@link ObjectLoader#load}\n\t * but can also be used directly to parse a previously loaded JSON structure.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @param {onLoad} onLoad - Executed when all resources (e.g. textures) have been fully loaded.\n\t * @return {Object3D} The parsed 3D object.\n\t */\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#parse}.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @return {Promise} A Promise that resolves with the parsed 3D object.\n\t */\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\treturn object;\n\n\t}\n\n\t// internals\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twarn( `ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\twarn( 'ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\t\t\t\tif ( data.channel !== undefined ) texture.channel = data.channel;\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.internalFormat !== undefined ) texture.internalFormat = data.internalFormat;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.colorSpace !== undefined ) texture.colorSpace = data.colorSpace;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps;\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\t\t\t\tif ( data.compareFunction !== undefined ) texture.compareFunction = data.compareFunction;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\twarn( 'ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.fog.name !== '' ) {\n\n\t\t\t\t\t\tobject.fog.name = data.fog.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness;\n\t\t\t\tif ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity;\n\t\t\t\tif ( data.backgroundRotation !== undefined ) object.backgroundRotation.fromArray( data.backgroundRotation );\n\n\t\t\t\tif ( data.environmentIntensity !== undefined ) object.environmentIntensity = data.environmentIntensity;\n\t\t\t\tif ( data.environmentRotation !== undefined ) object.environmentRotation.fromArray( data.environmentRotation );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'BatchedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new BatchedMesh( data.maxInstanceCount, data.maxVertexCount, data.maxIndexCount, material );\n\t\t\t\tobject.geometry = geometry;\n\t\t\t\tobject.perObjectFrustumCulled = data.perObjectFrustumCulled;\n\t\t\t\tobject.sortObjects = data.sortObjects;\n\n\t\t\t\tobject._drawRanges = data.drawRanges;\n\t\t\t\tobject._reservedRanges = data.reservedRanges;\n\n\t\t\t\tobject._geometryInfo = data.geometryInfo.map( info => {\n\n\t\t\t\t\tlet box = null;\n\t\t\t\t\tlet sphere = null;\n\t\t\t\t\tif ( info.boundingBox !== undefined ) {\n\n\t\t\t\t\t\tbox = new Box3().fromJSON( info.boundingBox );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( info.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\tsphere = new Sphere().fromJSON( info.boundingSphere );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...info,\n\t\t\t\t\t\tboundingBox: box,\n\t\t\t\t\t\tboundingSphere: sphere\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\t\t\t\tobject._instanceInfo = data.instanceInfo;\n\n\t\t\t\tobject._availableInstanceIds = data._availableInstanceIds;\n\t\t\t\tobject._availableGeometryIds = data._availableGeometryIds;\n\n\t\t\t\tobject._nextIndexStart = data.nextIndexStart;\n\t\t\t\tobject._nextVertexStart = data.nextVertexStart;\n\t\t\t\tobject._geometryCount = data.geometryCount;\n\n\t\t\t\tobject._maxInstanceCount = data.maxInstanceCount;\n\t\t\t\tobject._maxVertexCount = data.maxVertexCount;\n\t\t\t\tobject._maxIndexCount = data.maxIndexCount;\n\n\t\t\t\tobject._geometryInitialized = data.geometryInitialized;\n\n\t\t\t\tobject._matricesTexture = getTexture( data.matricesTexture.uuid );\n\n\t\t\t\tobject._indirectTexture = getTexture( data.indirectTexture.uuid );\n\n\t\t\t\tif ( data.colorsTexture !== undefined ) {\n\n\t\t\t\t\tobject._colorsTexture = getTexture( data.colorsTexture.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingSphere !== undefined ) {\n\n\t\t\t\t\tobject.boundingSphere = new Sphere().fromJSON( data.boundingSphere );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingBox !== undefined ) {\n\n\t\t\t\t\tobject.boundingBox = new Box3().fromJSON( data.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.up !== undefined ) object.up.fromArray( data.up );\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.intensity !== undefined ) object.shadow.intensity = data.shadow.intensity;\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance, level.hysteresis );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tbindLightTargets( object ) {\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isDirectionalLight || child.isSpotLight ) {\n\n\t\t\t\tconst uuid = child.target;\n\n\t\t\t\tconst target = object.getObjectByProperty( 'uuid', uuid );\n\n\t\t\t\tif ( target !== undefined ) {\n\n\t\t\t\t\tchild.target = target;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.target = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nconst _errorMap = new WeakMap();\n\n/**\n * A loader for loading images as an [ImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap).\n * An `ImageBitmap` provides an asynchronous and resource efficient pathway to prepare\n * textures for rendering.\n *\n * Note that {@link Texture#flipY} and {@link Texture#premultiplyAlpha} are ignored with image bitmaps.\n * They needs these configuration on bitmap creation unlike regular images need them on uploading to GPU.\n *\n * You need to set the equivalent options via {@link ImageBitmapLoader#setOptions} instead.\n *\n * Also note that unlike {@link FileLoader}, this loader avoids multiple concurrent requests to the same URL only if `Cache` is enabled.\n *\n * ```js\n * const loader = new THREE.ImageBitmapLoader();\n * loader.setOptions( { imageOrientation: 'flipY' } ); // set options if needed\n * const imageBitmap = await loader.loadAsync( 'image.png' );\n *\n * const texture = new THREE.Texture( imageBitmap );\n * texture.needsUpdate = true;\n * ```\n *\n * @augments Loader\n */\nclass ImageBitmapLoader extends Loader {\n\n\t/**\n\t * Constructs a new image bitmap loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\t/**\n\t\t * Represents the loader options.\n\t\t *\n\t\t * @type {Object}\n\t\t * @default {premultiplyAlpha:'none'}\n\t\t */\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Sets the given loader options. The structure of the object must match the `options` parameter of\n\t * [createImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/Window/createImageBitmap).\n\t *\n\t * @param {Object} options - The loader options to set.\n\t * @return {ImageBitmapLoader} A reference to this image bitmap loader.\n\t */\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded image bitmap to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(ImageBitmap)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {ImageBitmap|undefined} The image bitmap.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image-bitmap:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\t// If cached is a promise, wait for it to resolve\n\t\t\tif ( cached.then ) {\n\n\t\t\t\tcached.then( imageBitmap => {\n\n\t\t\t\t\t// check if there is an error for the cached promise\n\n\t\t\t\t\tif ( _errorMap.has( cached ) === true ) {\n\n\t\t\t\t\t\tif ( onError ) onError( _errorMap.get( cached ) );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t\treturn imageBitmap;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// If cached is not a promise (i.e., it's already an imageBitmap)\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\t\tfetchOptions.signal = ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal;\n\n\t\tconst promise = fetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( `image-bitmap:${url}`, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t\treturn imageBitmap;\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\t_errorMap.set( promise, e );\n\n\t\t\tCache.remove( `image-bitmap:${url}` );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tCache.add( `image-bitmap:${url}`, promise );\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {ImageBitmapLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _context;\n\n/**\n * Manages the global audio context in the engine.\n *\n * @hideconstructor\n */\nclass AudioContext {\n\n\t/**\n\t * Returns the global native audio context.\n\t *\n\t * @return {AudioContext} The native audio context.\n\t */\n\tstatic getContext() {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t}\n\n\t/**\n\t * Allows to set the global native audio context from outside.\n\t *\n\t * @param {AudioContext} value - The native context to set.\n\t */\n\tstatic setContext( value ) {\n\n\t\t_context = value;\n\n\t}\n\n}\n\n/**\n * Class for loading audio buffers. Audios are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const audioListener = new THREE.AudioListener();\n * const ambientSound = new THREE.Audio( audioListener );\n *\n * const loader = new THREE.AudioLoader();\n * const audioBuffer = await loader.loadAsync( 'audio/ambient_ocean.ogg' );\n *\n * ambientSound.setBuffer( audioBuffer );\n * ambientSound.play();\n * ```\n *\n * @augments Loader\n */\nclass AudioLoader extends Loader {\n\n\t/**\n\t * Constructs a new audio loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded audio buffer\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(AudioBuffer)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} ).catch( handleError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\thandleError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\tfunction handleError( 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\terror( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\n\t\t}\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * A special type of camera that uses two perspective cameras with\n * stereoscopic projection. Can be used for rendering stereo effects\n * like [3D Anaglyph](https://en.wikipedia.org/wiki/Anaglyph_3D) or\n * [Parallax Barrier](https://en.wikipedia.org/wiki/parallax_barrier).\n */\nclass StereoCamera {\n\n\t/**\n\t * Constructs a new stereo camera.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'StereoCamera';\n\n\t\t/**\n\t\t * The aspect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t\t/**\n\t\t * The eye separation which represents the distance\n\t\t * between the left and right camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.064\n\t\t */\n\t\tthis.eyeSep = 0.064;\n\n\t\t/**\n\t\t * The camera representing the left eye. This is added to layer `1` so objects to be\n\t\t * rendered by the left camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The camera representing the right eye. This is added to layer `2` so objects to be\n\t\t * rendered by the right camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the stereo camera based on the given perspective camera.\n\t *\n\t * @param {PerspectiveCamera} camera - The perspective camera.\n\t */\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\n/**\n * This type of camera can be used in order to efficiently render a scene with a\n * predefined set of cameras. This is an important performance aspect for\n * rendering VR scenes.\n *\n * An instance of `ArrayCamera` always has an array of sub cameras. It's mandatory\n * to define for each sub camera the `viewport` property which determines the\n * part of the viewport that is rendered with this camera.\n *\n * @augments PerspectiveCamera\n */\nclass ArrayCamera extends PerspectiveCamera {\n\n\t/**\n\t * Constructs a new array camera.\n\t *\n\t * @param {Array} [array=[]] - An array of perspective sub cameras.\n\t */\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArrayCamera = true;\n\n\t\t/**\n\t\t * Whether this camera is used with multiview rendering or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isMultiViewCamera = false;\n\n\t\t/**\n\t\t * An array of perspective sub cameras.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\n/**\n * Class for keeping track of time.\n */\nclass Clock {\n\n\t/**\n\t * Constructs a new clock.\n\t *\n\t * @param {boolean} [autoStart=true] - Whether to automatically start the clock when\n\t * `getDelta()` is called for the first time.\n\t */\n\tconstructor( autoStart = true ) {\n\n\t\t/**\n\t\t * If set to `true`, the clock starts automatically when `getDelta()` is called\n\t\t * for the first time.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoStart = autoStart;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()` method was last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.startTime = 0;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()`, `getElapsedTime()` or\n\t\t * `getDelta()` methods were last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.oldTime = 0;\n\n\t\t/**\n\t\t * Keeps track of the total time that the clock has been running.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.elapsedTime = 0;\n\n\t\t/**\n\t\t * Whether the clock is running or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.running = false;\n\n\t}\n\n\t/**\n\t * Starts the clock. When `autoStart` is set to `true`, the method is automatically\n\t * called by the class.\n\t */\n\tstart() {\n\n\t\tthis.startTime = performance.now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\t/**\n\t * Stops the clock.\n\t */\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time.\n\t */\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\t/**\n\t * Returns the delta time in seconds.\n\t *\n\t * @return {number} The delta time.\n\t */\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = performance.now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\n\nconst _forward = /*@__PURE__*/ new Vector3();\nconst _up = /*@__PURE__*/ new Vector3();\n\n/**\n * The class represents a virtual listener of the all positional and non-positional audio effects\n * in the scene. A three.js application usually creates a single listener. It is a mandatory\n * constructor parameter for audios entities like {@link Audio} and {@link PositionalAudio}.\n *\n * In most cases, the listener object is a child of the camera. So the 3D transformation of the\n * camera represents the 3D transformation of the listener.\n *\n * @augments Object3D\n */\nclass AudioListener extends Object3D {\n\n\t/**\n\t * Constructs a new audio listener.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\t/**\n\t\t * The native audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = AudioContext.getContext();\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\t/**\n\t\t * An optional filter.\n\t\t *\n\t\t * Defined via {@link AudioListener#setFilter}.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.filter = null;\n\n\t\t/**\n\t\t * Time delta values required for `linearRampToValueAtTime()` usage.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\t/**\n\t * Returns the listener's input node.\n\t *\n\t * This method is used by other audio nodes to connect to this listener.\n\t *\n\t * @return {GainNode} The input node.\n\t */\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Removes the current filter from this listener.\n\t *\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filter.\n\t *\n\t * @return {?AudioNode} The filter.\n\t */\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\t/**\n\t * Sets the given filter to this listener.\n\t *\n\t * @param {AudioNode} value - The filter to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the applications master volume.\n\t *\n\t * @return {number} The master volume.\n\t */\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the applications master volume. This volume setting affects\n\t * all audio nodes in the scene.\n\t *\n\t * @param {number} value - The master volume to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t// the initial forward and up directions must be orthogonal\n\t\t_forward.set( 0, 0, -1 ).applyQuaternion( _quaternion$1 );\n\t\t_up.set( 0, 1, 0 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _forward.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _forward.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _forward.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( _up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( _up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( _up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _forward.x, _forward.y, _forward.z, _up.x, _up.y, _up.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a non-positional ( global ) audio object.\n *\n * This and related audio modules make use of the [Web Audio API](https://www.w3.org/TR/webaudio-1.1/).\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create a global audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop( true );\n * \tsound.setVolume( 0.5 );\n * \tsound.play();\n * });\n * ```\n *\n * @augments Object3D\n */\nclass Audio extends Object3D {\n\n\t/**\n\t * Constructs a new audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AudioListener}\n\t\t * @readonly\n\t\t */\n\t\tthis.listener = listener;\n\n\t\t/**\n\t\t * The audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = listener.context;\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\t/**\n\t\t * Whether to start playback automatically or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoplay = false;\n\n\t\t/**\n\t\t * A reference to an audio buffer.\n\t\t *\n\t\t * Defined via {@link Audio#setBuffer}.\n\t\t *\n\t\t * @type {?AudioBuffer}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.buffer = null;\n\n\t\t/**\n\t\t * Modify pitch, measured in cents. +/- 100 is a semitone.\n\t\t * +/- 1200 is an octave.\n\t\t *\n\t\t * Defined via {@link Audio#setDetune}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.detune = 0;\n\n\t\t/**\n\t\t * Whether the audio should loop or not.\n\t\t *\n\t\t * Defined via {@link Audio#setLoop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.loop = false;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * start, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopStart = 0;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * stop, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopEnd = 0;\n\n\t\t/**\n\t\t * An offset to the time within the audio buffer the playback\n\t\t * should begin, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.offset = 0;\n\n\t\t/**\n\t\t * Overrides the default duration of the audio.\n\t\t *\n\t\t * @type {undefined|number}\n\t\t * @default undefined\n\t\t */\n\t\tthis.duration = undefined;\n\n\t\t/**\n\t\t * The playback speed.\n\t\t *\n\t\t * Defined via {@link Audio#setPlaybackRate}.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 1\n\t\t */\n\t\tthis.playbackRate = 1;\n\n\t\t/**\n\t\t * Indicates whether the audio is playing or not.\n\t\t *\n\t\t * This flag will be automatically set when using {@link Audio#play},\n\t\t * {@link Audio#pause}, {@link Audio#stop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPlaying = false;\n\n\t\t/**\n\t\t * Indicates whether the audio playback can be controlled\n\t\t * with method like {@link Audio#play} or {@link Audio#pause}.\n\t\t *\n\t\t * This flag will be automatically set when audio sources are\n\t\t * defined.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.hasPlaybackControl = true;\n\n\t\t/**\n\t\t * Holds a reference to the current audio source.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @readonly\n\t\t * @default null\n\t\t */\n\t\tthis.source = null;\n\n\t\t/**\n\t\t * Defines the source type.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {('empty'|'audioNode'|'mediaNode'|'mediaStreamNode'|'buffer')}\n\t\t * @readonly\n\t\t * @default 'empty'\n\t\t */\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\t/**\n\t\t * Can be used to apply a variety of low-order filters to create\n\t\t * more complex sound effects e.g. via `BiquadFilterNode`.\n\t\t *\n\t\t * The property is automatically set by {@link Audio#setFilters}.\n\t\t *\n\t\t * @type {Array}\n\t\t * @readonly\n\t\t */\n\t\tthis.filters = [];\n\n\t}\n\n\t/**\n\t * Returns the output audio node.\n\t *\n\t * @return {GainNode} The output node.\n\t */\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Sets the given audio node as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `audioNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {AudioNode} audioNode - The audio node like an instance of `OscillatorNode`.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media element as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {HTMLMediaElement} mediaElement - The media element.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media stream as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaStreamNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {MediaStream} mediaStream - The media stream.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given audio buffer as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `buffer` and {@link Audio#hasPlaybackControl} to `true`.\n\t *\n\t * @param {AudioBuffer} audioBuffer - The audio buffer.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should start playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\twarn( 'Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\t/**\n\t * Pauses the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should stop playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tstop( delay = 0 ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tif ( this.source !== null ) {\n\n\t\t\tthis.source.stop( this.context.currentTime + delay );\n\t\t\tthis.source.onended = null;\n\n\t\t}\n\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio} A reference to this instance.\n\t */\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._connected === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filters.\n\t *\n\t * @return {Array} The list of filters.\n\t */\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\t/**\n\t * Sets an array of filters and connects them with the audio source.\n\t *\n\t * @param {Array} [value] - A list of filters.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines the detuning of oscillation in cents.\n\t *\n\t * @param {number} value - The detuning of oscillation in cents.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.isPlaying === true && this.source.detune !== undefined ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the detuning of oscillation in cents.\n\t *\n\t * @return {number} The detuning of oscillation in cents.\n\t */\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\t/**\n\t * Returns the first filter in the list of filters.\n\t *\n\t * @return {AudioNode|undefined} The first filter in the list of filters.\n\t */\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\t/**\n\t * Applies a single filter node to the audio.\n\t *\n\t * @param {AudioNode} [filter] - The filter to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\t/**\n\t * Sets the playback rate.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [value] - The playback rate to set.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current playback rate.\n\n\t * @return {number} The playback rate.\n\t */\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\t/**\n\t * Automatically called when playback finished.\n\t */\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\t\tthis._progress = 0;\n\n\t}\n\n\t/**\n\t * Returns the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {boolean} Whether the audio should loop or not.\n\t */\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\t/**\n\t * Sets the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {boolean} value - Whether the audio should loop or not.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop start value which defines where in the audio buffer the replay should\n\t * start, in seconds.\n\t *\n\t * @param {number} value - The loop start value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop end value which defines where in the audio buffer the replay should\n\t * stop, in seconds.\n\t *\n\t * @param {number} value - The loop end value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the volume.\n\t *\n\t * @return {number} The volume.\n\t */\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the volume.\n\t *\n\t * @param {number} value - The volume to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.sourceType !== 'buffer' ) {\n\n\t\t\twarn( 'Audio: Audio source type cannot be copied.' );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.autoplay = source.autoplay;\n\n\t\tthis.buffer = source.buffer;\n\t\tthis.detune = source.detune;\n\t\tthis.loop = source.loop;\n\t\tthis.loopStart = source.loopStart;\n\t\tthis.loopEnd = source.loopEnd;\n\t\tthis.offset = source.offset;\n\t\tthis.duration = source.duration;\n\t\tthis.playbackRate = source.playbackRate;\n\t\tthis.hasPlaybackControl = source.hasPlaybackControl;\n\t\tthis.sourceType = source.sourceType;\n\n\t\tthis.filters = source.filters.slice();\n\n\t\treturn this;\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor( this.listener ).copy( this, recursive );\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents a positional audio object.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create the PositionalAudio object (passing in the listener)\n * const sound = new THREE.PositionalAudio( listener );\n *\n * // load a sound and set it as the PositionalAudio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/song.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setRefDistance( 20 );\n * \tsound.play();\n * });\n *\n * // create an object for the sound to play from\n * const sphere = new THREE.SphereGeometry( 20, 32, 16 );\n * const material = new THREE.MeshPhongMaterial( { color: 0xff2200 } );\n * const mesh = new THREE.Mesh( sphere, material );\n * scene.add( mesh );\n *\n * // finally add the sound to the mesh\n * mesh.add( sound );\n *\n * @augments Audio\n */\nclass PositionalAudio extends Audio {\n\n\t/**\n\t * Constructs a positional audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\t/**\n\t\t * The panner node represents the location, direction, and behavior of an audio\n\t\t * source in 3D space.\n\t\t *\n\t\t * @type {PannerNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tconnect() {\n\n\t\tsuper.connect();\n\n\t\tthis.panner.connect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\t/**\n\t * Returns the current reference distance.\n\t *\n\t * @return {number} The reference distance.\n\t */\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\t/**\n\t * Defines the reference distance for reducing volume as the audio source moves\n\t * further from the listener – i.e. the distance at which the volume reduction\n\t * starts taking effect.\n\t *\n\t * @param {number} value - The reference distance to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current rolloff factor.\n\t *\n\t * @return {number} The rolloff factor.\n\t */\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\t/**\n\t * Defines how quickly the volume is reduced as the source moves away from the listener.\n\t *\n\t * @param {number} value - The rolloff factor.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current distance model.\n\t *\n\t * @return {('linear'|'inverse'|'exponential')} The distance model.\n\t */\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\t/**\n\t * Defines which algorithm to use to reduce the volume of the audio source\n\t * as it moves away from the listener.\n\t *\n\t * Read [the spec](https://www.w3.org/TR/webaudio-1.1/#enumdef-distancemodeltype)\n\t * for more details.\n\t *\n\t * @param {('linear'|'inverse'|'exponential')} value - The distance model to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current max distance.\n\t *\n\t * @return {number} The max distance.\n\t */\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\t/**\n\t * Defines the maximum distance between the audio source and the listener,\n\t * after which the volume is not reduced any further.\n\t *\n\t * This value is used only by the `linear` distance model.\n\t *\n\t * @param {number} value - The max distance.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the directional cone in which the audio can be listened.\n\t *\n\t * @param {number} coneInnerAngle - An angle, in degrees, of a cone inside of which there will be no volume reduction.\n\t * @param {number} coneOuterAngle - An angle, in degrees, of a cone outside of which the volume will be reduced by a constant value, defined by the `coneOuterGain` parameter.\n\t * @param {number} coneOuterGain - The amount of volume reduction outside the cone defined by the `coneOuterAngle`. When set to `0`, no sound can be heard.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class can be used to analyse audio data.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create an Audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop(true);\n * \tsound.setVolume(0.5);\n * \tsound.play();\n * });\n *\n * // create an AudioAnalyser, passing in the sound and desired fftSize\n * const analyser = new THREE.AudioAnalyser( sound, 32 );\n *\n * // get the average frequency of the sound\n * const data = analyser.getAverageFrequency();\n * ```\n */\nclass AudioAnalyser {\n\n\t/**\n\t * Constructs a new audio analyzer.\n\t *\n\t * @param {Audio} audio - The audio to analyze.\n\t * @param {number} [fftSize=2048] - The window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.\n\t */\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AnalyserNode}\n\t\t */\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\t/**\n\t\t * Holds the analyzed data.\n\t\t *\n\t\t * @type {Uint8Array}\n\t\t */\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\t/**\n\t * Returns an array with frequency data of the audio.\n\t *\n\t * Each item in the array represents the decibel value for a specific frequency.\n\t * The frequencies are spread linearly from 0 to 1/2 of the sample rate.\n\t * For example, for 48000 sample rate, the last item of the array will represent\n\t * the decibel value for 24000 Hz.\n\t *\n\t * @return {Uint8Array} The frequency data.\n\t */\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\t/**\n\t * Returns the average of the frequencies returned by {@link AudioAnalyser#getFrequencyData}.\n\t *\n\t * @return {number} The average frequency.\n\t */\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\n/**\n * Buffered scene graph property that allows weighted accumulation; used internally.\n */\nclass PropertyMixer {\n\n\t/**\n\t * Constructs a new property mixer.\n\t *\n\t * @param {PropertyBinding} binding - The property binding.\n\t * @param {string} typeName - The keyframe track type name.\n\t * @param {number} valueSize - The keyframe track value size.\n\t */\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\t/**\n\t\t * The property binding.\n\t\t *\n\t\t * @type {PropertyBinding}\n\t\t */\n\t\tthis.binding = binding;\n\n\t\t/**\n\t\t * The keyframe track value size.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeight = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.useCount = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `accu`.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t * @param {number} weight - The weight.\n\t */\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `add`.\n\t *\n\t * @param {number} weight - The weight.\n\t */\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t/**\n\t * Applies the state of `accu` to the binding when accus differ.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t */\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Remembers the state of the bound property and copy it to both accus.\n\t */\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t/**\n\t * Applies the state previously taken via {@link PropertyMixer#saveOriginalState} to the binding.\n\t */\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t// internals\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\n\n\n/**\n * This holds a reference to a real property in the scene graph; used internally.\n */\nclass PropertyBinding {\n\n\t/**\n\t * Constructs a new property binding.\n\t *\n\t * @param {Object} rootNode - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t */\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\t/**\n\t\t * The object path to the animated property.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = path;\n\n\t\t/**\n\t\t * An object holding information about the path.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\t/**\n\t\t * The object owns the animated property.\n\t\t *\n\t\t * @type {?Object}\n\t\t */\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName );\n\n\t\t/**\n\t\t * The root node.\n\t\t *\n\t\t * @type {Object3D|Skeleton}\n\t\t */\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\t/**\n\t * Factory method for creating a property binding from the given parameters.\n\t *\n\t * @static\n\t * @param {Object} root - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t * @return {PropertyBinding|Composite} The created property binding or composite.\n\t */\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name - Node name to be sanitized.\n\t * @return {string} The sanitized node name.\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\t/**\n\t * Parses the given track name (an object path to an animated property) and\n\t * returns an object with information about the path. Matches strings in the following forms:\n\t *\n\t * - nodeName.property\n\t * - nodeName.property[accessor]\n\t * - nodeName.material.property[accessor]\n\t * - uuid.property[accessor]\n\t * - uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t * - parentName/nodeName.property\n\t * - parentName/parentName/nodeName.property[index]\n\t * - .bone[Armature.DEF_cog].position\n\t * - scene:helium_balloon_model:helium_balloon_model.position\n\t *\n\t * @static\n\t * @param {string} trackName - The track name to parse.\n\t * @return {Object} The parsed track name as an object.\n\t */\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== -1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== -1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\t/**\n\t * Searches for a node in the hierarchy of the given root object by the given\n\t * node name.\n\t *\n\t * @static\n\t * @param {Object} root - The root object.\n\t * @param {string|number} nodeName - The name of the node.\n\t * @return {?Object} The found node. Returns `null` if no object was found.\n\t */\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t/**\n\t * Creates a getter / setter pair for the property tracked by this binding.\n\t */\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName );\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\twarn( 'PropertyBinding: No target node found for track: ' + this.path + '.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map':\n\n\t\t\t\t\tif ( 'map' in targetObject ) {\n\n\t\t\t\t\t\ttargetObject = targetObject.map;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.map ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.map as node.material does not have a map.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.map;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\terror( 'PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.isMaterial === true ) {\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.isObject3D === true ) {\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\t/**\n\t * Unbinds the property.\n\t */\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n * - Instead pass this object as 'root'.\n * - You can also add and remove objects later when the mixer is running.\n *\n * Note:\n *\n * - Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the all objects in the group.\n * - A single property can either be controlled through a target group or directly, but not both.\n */\nclass AnimationObjectGroup {\n\n\t/**\n\t * Constructs a new animation group.\n\t *\n\t * @param {...Object3D} arguments - An arbitrary number of 3D objects that share the same animation state.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * Adds an arbitrary number of objects to this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to add.\n\t */\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\terror( 'AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Removes an arbitrary number of objects to this animation group\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to remove.\n\t */\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for the passed 3D objects of this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to uncache.\n\t */\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * An instance of `AnimationAction` schedules the playback of an animation which is\n * stored in {@link AnimationClip}.\n */\nclass AnimationAction {\n\n\t/**\n\t * Constructs a new animation action.\n\t *\n\t * @param {AnimationMixer} mixer - The mixer that is controlled by this action.\n\t * @param {AnimationClip} clip - The animation clip that holds the actual keyframes.\n\t * @param {?Object3D} [localRoot=null] - The root object on which this action is performed.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t */\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\t/**\n\t\t * The loop mode, set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * @type {(LoopRepeat|LoopOnce|LoopPingPong)}\n\t\t * @default LoopRepeat\n\t\t */\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t/**\n\t\t * The local time of this action (in seconds, starting with `0`).\n\t\t *\n\t\t * The value gets clamped or wrapped to `[0,clip.duration]` (according to the\n\t\t * loop state).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * Scaling factor for the {@link AnimationAction#time}. A value of `0` causes the\n\t\t * animation to pause. Negative values cause the animation to play backwards.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\t/**\n\t\t * The degree of influence of this action (in the interval `[0, 1]`). Values\n\t\t * between `0` (no impact) and `1` (full impact) can be used to blend between\n\t\t * several actions.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\t/**\n\t\t * The number of repetitions of the performed clip over the course of this action.\n\t\t * Can be set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * Setting this number has no effect if {@link AnimationAction#loop} is set to\n\t\t * `THREE:LoopOnce`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.repetitions = Infinity;\n\n\t\t/**\n\t\t * If set to `true`, the playback of the action is paused.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.paused = false;\n\n\t\t/**\n\t\t * If set to `false`, the action is disabled so it has no impact.\n\t\t *\n\t\t * When the action is re-enabled, the animation continues from its current\n\t\t * time (setting `enabled` to `false` doesn't reset the action).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * If set to true the animation will automatically be paused on its last frame.\n\t\t *\n\t\t * If set to false, {@link AnimationAction#enabled} will automatically be switched\n\t\t * to `false` when the last loop of the action has finished, so that this action has\n\t\t * no further impact.\n\t\t *\n\t\t * Note: This member has no impact if the action is interrupted (it\n\t\t * has only an effect if its last loop has really finished).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clampWhenFinished = false;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtStart = true;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtEnd = true;\n\n\t}\n\n\t/**\n\t * Starts the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\t/**\n\t * Resets the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = -1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\t/**\n\t * Returns `true` if the animation is running.\n\t *\n\t * @return {boolean} Whether the animation is running or not.\n\t */\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Returns `true` when {@link AnimationAction#play} has been called.\n\t *\n\t * @return {boolean} Whether the animation is scheduled or not.\n\t */\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Defines the time when the animation should start.\n\t *\n\t * @param {number} time - The start time in seconds.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Configures the loop settings for this action.\n\t *\n\t * @param {(LoopRepeat|LoopOnce|LoopPingPong)} mode - The loop mode.\n\t * @param {number} repetitions - The number of repetitions.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective weight of this action.\n\t *\n\t * An action has no effect and thus an effective weight of zero when the\n\t * action is disabled.\n\t *\n\t * @param {number} weight - The weight to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t/**\n\t * Returns the effective weight of this action.\n\t *\n\t * @return {number} The effective weight.\n\t */\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\t/**\n\t * Fades the animation in by increasing its weight gradually from `0` to `1`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\t/**\n\t * Fades the animation out by decreasing its weight gradually from `1` to `0`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\t/**\n\t * Causes this action to fade in and the given action to fade out,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeOutAction - The animation action to fade out.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeFrom( fadeOutAction, duration, warp = false ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp === true ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Causes this action to fade out and the given action to fade in,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeInAction - The animation action to fade in.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeTo( fadeInAction, duration, warp = false ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\t/**\n\t * Stops any fading which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective time scale of this action.\n\t *\n\t * An action has no effect and thus an effective time scale of zero when the\n\t * action is paused.\n\t *\n\t * @param {number} timeScale - The time scale to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Returns the effective time scale of this action.\n\t *\n\t * @return {number} The effective time scale.\n\t */\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\t/**\n\t * Sets the duration for a single loop of this action.\n\t *\n\t * @param {number} duration - The duration to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Synchronizes this action with the passed other action.\n\t *\n\t * @param {AnimationAction} action - The action to sync with.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Decelerates this animation's speed to `0` within the passed time interval.\n\t *\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\t/**\n\t * Changes the playback speed, within the passed time interval, by modifying\n\t * {@link AnimationAction#timeScale} gradually from `startTimeScale` to\n\t * `endTimeScale`.\n\t *\n\t * @param {number} startTimeScale - The start time scale.\n\t * @param {number} endTimeScale - The end time scale.\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops any scheduled warping which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the animation mixer of this animation action.\n\t *\n\t * @return {AnimationMixer} The animation mixer.\n\t */\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\t/**\n\t * Returns the animation clip of this animation action.\n\t *\n\t * @return {AnimationClip} The animation clip.\n\t */\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\t/**\n\t * Returns the root object of this animation action.\n\t *\n\t * @return {Object3D} The root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\tdeltaTime = 0;\n\n\t\t\t} else {\n\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === -1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n/**\n * `AnimationMixer` is a player for animations on a particular object in\n * the scene. When multiple objects in the scene are animated independently,\n * one `AnimationMixer` may be used for each object.\n */\nclass AnimationMixer extends EventDispatcher {\n\n\t/**\n\t * Constructs a new animation mixer.\n\t *\n\t * @param {Object3D} root - The object whose animations shall be played by this mixer.\n\t */\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\t/**\n\t\t * The global mixer time (in seconds; starting with `0` on the mixer's creation).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * A scaling factor for the global time.\n\t\t *\n\t\t * Note: Setting this member to `0` and later back to `1` is a\n\t\t * possibility to pause/unpause all actions that are controlled by this\n\t\t * mixer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, _controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link AnimationAction} for the passed clip.\n\t *\n\t * If an action fitting the clip and root parameters doesn't yet exist, it\n\t * will be created by this method. Calling this method several times with the\n\t * same clip and root parameters always returns the same action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t * @return {?AnimationAction} The animation action.\n\t */\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t/**\n\t * Returns an existing animation action for the passed clip.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @return {?AnimationAction} The animation action. Returns `null` if no action was found.\n\t */\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Deactivates all previously scheduled actions on this mixer.\n\t *\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Advances the global mixer time and updates the animation.\n\t *\n\t * This is usually done in the render loop by passing the delta\n\t * time from {@link Clock} or {@link Timer}.\n\t *\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the global mixer to a specific time and updates the animation accordingly.\n\t *\n\t * This is useful when you need to jump to an exact time in an animation. The\n\t * input parameter will be scaled by {@link AnimationMixer#timeScale}\n\t *\n\t * @param {number} time - The time to set in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tsetTime( time ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( time ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t/**\n\t * Returns this mixer's root object.\n\t *\n\t * @return {Object3D} The mixer's root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a clip. Before using this method make\n\t * sure to call {@link AnimationAction#stop} for all related actions.\n\t *\n\t * @param {AnimationClip} clip - The clip to uncache.\n\t */\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a root object. Before using this\n\t * method make sure to call {@link AnimationAction#stop} for all related\n\t * actions or alternatively {@link AnimationMixer#stopAllAction} when the\n\t * mixer operates on a single root.\n\t *\n\t * @param {Object3D} root - The root object to uncache.\n\t */\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for an action. The action is identified by the\n\t * given clip and an optional root object. Before using this method make\n\t * sure to call {@link AnimationAction#stop} to deactivate the action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t */\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a 3D render target.\n *\n * @augments RenderTarget\n */\nclass RenderTarget3D extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget3D = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents a uniform which is a global shader variable. They are passed to shader programs.\n *\n * When declaring a uniform of a {@link ShaderMaterial}, it is declared by value or by object.\n * ```js\n * uniforms: {\n * \ttime: { value: 1.0 },\n * \tresolution: new Uniform( new Vector2() )\n * };\n * ```\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n */\nclass Uniform {\n\n\t/**\n\t * Constructs a new uniform.\n\t *\n\t * @param {any} value - The uniform value.\n\t */\n\tconstructor( value ) {\n\n\t\t/**\n\t\t * The uniform value.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * Returns a new uniform with copied values from this instance.\n\t * If the value has a `clone()` method, the value is cloned as well.\n\t *\n\t * @return {Uniform} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet _id = 0;\n\n/**\n * A class for managing multiple uniforms in a single group. The renderer will process\n * such a definition as a single UBO.\n *\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n *\n * @augments EventDispatcher\n */\nclass UniformsGroup extends EventDispatcher {\n\n\t/**\n\t * Constructs a new uniforms group.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isUniformsGroup = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name UniformsGroup#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\t/**\n\t\t * The name of the uniforms group.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer usage.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * An array holding the uniforms.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.uniforms = [];\n\n\t}\n\n\t/**\n\t * Adds the given uniform to this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to add.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given uniform from this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to remove.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== -1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the name of this uniforms group.\n\t *\n\t * @param {string} name - The name to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the usage of this uniforms group.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Copies the values of the given uniforms group to this instance.\n\t *\n\t * @param {UniformsGroup} source - The uniforms group to copy.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tconst uniforms = Array.isArray( uniformsSource[ i ] ) ? uniformsSource[ i ] : [ uniformsSource[ i ] ];\n\n\t\t\tfor ( let j = 0; j < uniforms.length; j ++ ) {\n\n\t\t\t\tthis.uniforms.push( uniforms[ j ].clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new uniforms group with copied values from this instance.\n\t *\n\t * @return {UniformsGroup} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * An instanced version of an interleaved buffer.\n *\n * @augments InterleavedBuffer\n */\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\t/**\n\t * Constructs a new instanced interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t * @param {number} [meshPerAttribute=1] - Defines how often a value of this interleaved buffer should be repeated.\n\t */\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated,\n\t\t * see {@link InstancedBufferAttribute#meshPerAttribute}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\n/**\n * An alternative version of a buffer attribute with more control over the VBO.\n *\n * The renderer does not construct a VBO for this kind of attribute. Instead, it uses\n * whatever VBO is passed in constructor and can later be altered via the `buffer` property.\n *\n * The most common use case for this class is when some kind of GPGPU calculation interferes\n * or even produces the VBOs in question.\n *\n * Notice that this class can only be used with {@link WebGLRenderer}.\n */\nclass GLBufferAttribute {\n\n\t/**\n\t * Constructs a new GL buffer attribute.\n\t *\n\t * @param {WebGLBuffer} buffer - The native WebGL buffer.\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} itemSize - The item size.\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @param {number} count - The expected number of vertices in VBO.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( buffer, type, itemSize, elementSize, count, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGLBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The native WebGL buffer.\n\t\t *\n\t\t * @type {WebGLBuffer}\n\t\t */\n\t\tthis.buffer = buffer;\n\n\t\t/**\n\t\t * The native data type.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The corresponding size (in bytes) for the given `type` parameter.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.elementSize = elementSize;\n\n\t\t/**\n\t\t * The expected number of vertices in VBO.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `buffer` contains data of `gl.UNSIGNED_SHORT`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the buffer data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the given native WebGL buffer.\n\t *\n\t * @param {WebGLBuffer} buffer - The buffer to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given native data type and element size.\n\t *\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the item size.\n\t *\n\t * @param {number} itemSize - The item size.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the count (the expected number of vertices in VBO).\n\t *\n\t * @param {number} count - The count.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * This class is designed to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3d space the mouse is over)\n * amongst other things.\n */\nclass Raycaster {\n\n\t/**\n\t * Constructs a new raycaster.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t * @param {number} [near=0] - All results returned are further away than near. Near can't be negative.\n\t * @param {number} [far=Infinity] - All results returned are closer than far. Far can't be lower than near.\n\t */\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\t/**\n\t\t * The ray used for raycasting.\n\t\t *\n\t\t * @type {Ray}\n\t\t */\n\t\tthis.ray = new Ray( origin, direction );\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * The camera to use when raycasting against view-dependent objects such as\n\t\t * billboarded objects like sprites. This field can be set manually or\n\t\t * is set when calling `setFromCamera()`.\n\t\t *\n\t\t * @type {?Camera}\n\t\t * @default null\n\t\t */\n\t\tthis.camera = null;\n\n\t\t/**\n\t\t * Allows to selectively ignore 3D objects when performing intersection tests.\n\t\t * The following code example ensures that only 3D objects on layer `1` will be\n\t\t * honored by raycaster.\n\t\t * ```js\n\t\t * raycaster.layers.set( 1 );\n\t\t * object.layers.enable( 1 );\n\t\t * ```\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\n\t\t/**\n\t\t * A parameter object that configures the raycasting. It has the structure:\n\t\t *\n\t\t * ```\n\t\t * {\n\t\t * \tMesh: {},\n\t\t * \tLine: { threshold: 1 },\n\t\t * \tLOD: {},\n\t\t * \tPoints: { threshold: 1 },\n\t\t * \tSprite: {}\n\t\t * }\n\t\t * ```\n\t\t * Where `threshold` is the precision of the raycaster when intersecting objects, in world units.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the ray with a new origin and direction by copying the values from the arguments.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t */\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\t/**\n\t * Uses the given coordinates and camera to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {Vector2} coords - 2D coordinates of the mouse, in normalized device coordinates (NDC).\n\t * X and Y components should be between `-1` and `1`.\n\t * @param {Camera} camera - The camera from which the ray should originate.\n\t */\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, -1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\terror( 'Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses the given WebXR controller to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {WebXRController} controller - The controller to copy the position and direction from.\n\t * @return {Raycaster} A reference to this raycaster.\n\t */\n\tsetFromXRController( controller ) {\n\n\t\t_matrix.identity().extractRotation( controller.matrixWorld );\n\n\t\tthis.ray.origin.setFromMatrixPosition( controller.matrixWorld );\n\t\tthis.ray.direction.set( 0, 0, -1 ).applyMatrix4( _matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The intersection point of a raycaster intersection test.\n\t * @typedef {Object} Raycaster~Intersection\n\t * @property {number} distance - The distance from the ray's origin to the intersection point.\n\t * @property {number} distanceToRay - Some 3D objects e.g. {@link Points} provide the distance of the\n\t * intersection to the nearest point on the ray. For other objects it will be `undefined`.\n\t * @property {Vector3} point - The intersection point, in world coordinates.\n\t * @property {Object} face - The face that has been intersected.\n\t * @property {number} faceIndex - The face index.\n\t * @property {Object3D} object - The 3D object that has been intersected.\n\t * @property {Vector2} uv - U,V coordinates at point of intersection.\n\t * @property {Vector2} uv1 - Second set of U,V coordinates at point of intersection.\n\t * @property {Vector3} uv1 - Interpolated normal vector at point of intersection.\n\t * @property {number} instanceId - The index number of the instance where the ray\n\t * intersects the {@link InstancedMesh}.\n\t */\n\n\t/**\n\t * Checks all intersection between the ray and the object with or without the\n\t * descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * `Raycaster` delegates to the `raycast()` method of the passed 3D object, when\n\t * evaluating whether the ray intersects the object or not. This allows meshes to respond\n\t * differently to ray casting than lines or points.\n\t *\n\t * Note that for meshes, faces must be pointed towards the origin of the ray in order\n\t * to be detected; intersections of the ray passing through the back of a face will not\n\t * be detected. To raycast against both faces of an object, you'll want to set {@link Material#side}\n\t * to `THREE.DoubleSide`.\n\t *\n\t * @param {Object3D} object - The 3D object to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array} An array holding the intersection points.\n\t */\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersect( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\t/**\n\t * Checks all intersection between the ray and the objects with or without\n\t * the descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * @param {Array} objects - The 3D objects to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array} An array holding the intersection points.\n\t */\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersect( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersect( object, raycaster, intersects, recursive ) {\n\n\tlet propagate = true;\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tconst result = object.raycast( raycaster, intersects );\n\n\t\tif ( result === false ) propagate = false;\n\n\t}\n\n\tif ( propagate === true && recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersect( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class is an alternative to {@link Clock} with a different API design and behavior.\n * The goal is to avoid the conceptual flaws that became apparent in `Clock` over time.\n *\n * - `Timer` has an `update()` method that updates its internal state. That makes it possible to\n * call `getDelta()` and `getElapsed()` multiple times per simulation step without getting different values.\n * - The class can make use of the Page Visibility API to avoid large time delta values when the app\n * is inactive (e.g. tab switched or browser hidden).\n *\n * ```js\n * const timer = new Timer();\n * timer.connect( document ); // use Page Visibility API\n * ```\n */\nclass Timer {\n\n\t/**\n\t * Constructs a new timer.\n\t */\n\tconstructor() {\n\n\t\tthis._previousTime = 0;\n\t\tthis._currentTime = 0;\n\t\tthis._startTime = performance.now();\n\n\t\tthis._delta = 0;\n\t\tthis._elapsed = 0;\n\n\t\tthis._timescale = 1;\n\n\t\tthis._document = null;\n\t\tthis._pageVisibilityHandler = null;\n\n\t}\n\n\t/**\n\t * Connect the timer to the given document.Calling this method is not mandatory to\n\t * use the timer but enables the usage of the Page Visibility API to avoid large time\n\t * delta values.\n\t *\n\t * @param {Document} document - The document.\n\t */\n\tconnect( document ) {\n\n\t\tthis._document = document;\n\n\t\t// use Page Visibility API to avoid large time delta values\n\n\t\tif ( document.hidden !== undefined ) {\n\n\t\t\tthis._pageVisibilityHandler = handleVisibilityChange.bind( this );\n\n\t\t\tdocument.addEventListener( 'visibilitychange', this._pageVisibilityHandler, false );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disconnects the timer from the DOM and also disables the usage of the Page Visibility API.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._pageVisibilityHandler !== null ) {\n\n\t\t\tthis._document.removeEventListener( 'visibilitychange', this._pageVisibilityHandler );\n\t\t\tthis._pageVisibilityHandler = null;\n\n\t\t}\n\n\t\tthis._document = null;\n\n\t}\n\n\t/**\n\t * Returns the time delta in seconds.\n\t *\n\t * @return {number} The time delta in second.\n\t */\n\tgetDelta() {\n\n\t\treturn this._delta / 1000;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time in second.\n\t */\n\tgetElapsed() {\n\n\t\treturn this._elapsed / 1000;\n\n\t}\n\n\t/**\n\t * Returns the timescale.\n\t *\n\t * @return {number} The timescale.\n\t */\n\tgetTimescale() {\n\n\t\treturn this._timescale;\n\n\t}\n\n\t/**\n\t * Sets the given timescale which scale the time delta computation\n\t * in `update()`.\n\t *\n\t * @param {number} timescale - The timescale to set.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tsetTimescale( timescale ) {\n\n\t\tthis._timescale = timescale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Resets the time computation for the current simulation step.\n\t *\n\t * @return {Timer} A reference to this timer.\n\t */\n\treset() {\n\n\t\tthis._currentTime = performance.now() - this._startTime;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Can be used to free all internal resources. Usually called when\n\t * the timer instance isn't required anymore.\n\t */\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Updates the internal state of the timer. This method should be called\n\t * once per simulation step and before you perform queries against the timer\n\t * (e.g. via `getDelta()`).\n\t *\n\t * @param {number} timestamp - The current time in milliseconds. Can be obtained\n\t * from the `requestAnimationFrame` callback argument. If not provided, the current\n\t * time will be determined with `performance.now`.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tupdate( timestamp ) {\n\n\t\tif ( this._pageVisibilityHandler !== null && this._document.hidden === true ) {\n\n\t\t\tthis._delta = 0;\n\n\t\t} else {\n\n\t\t\tthis._previousTime = this._currentTime;\n\t\t\tthis._currentTime = ( timestamp !== undefined ? timestamp : performance.now() ) - this._startTime;\n\n\t\t\tthis._delta = ( this._currentTime - this._previousTime ) * this._timescale;\n\t\t\tthis._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction handleVisibilityChange() {\n\n\tif ( this._document.hidden === false ) this.reset();\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Spherical coordinates](https://en.wikipedia.org/wiki/Spherical_coordinate_system).\n */\nclass Spherical {\n\n\t/**\n\t * Constructs a new spherical.\n\t *\n\t * @param {number} [radius=1] - The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t * @param {number} [phi=0] - The polar angle in radians from the y (up) axis.\n\t * @param {number} [theta=0] - The equator/azimuthal angle in radians around the y (up) axis.\n\t */\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\t/**\n\t\t * The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * The polar angle in radians from the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.phi = phi;\n\n\t\t/**\n\t\t * The equator/azimuthal angle in radians around the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t}\n\n\t/**\n\t * Sets the spherical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The polar angle.\n\t * @param {number} theta - The azimuthal angle.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical to this instance.\n\t *\n\t * @param {Spherical} other - The spherical to copy.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Restricts the polar angle [page:.phi phi] to be between `0.000001` and pi -\n\t * `0.000001`.\n\t *\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = clamp( this.phi, EPS, Math.PI - EPS );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The y value.\n\t * @param {number} z - The z value.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, -1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new spherical with copied values from this instance.\n\t *\n\t * @return {Spherical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Cylindrical coordinates](https://en.wikipedia.org/wiki/Cylindrical_coordinate_system).\n */\nclass Cylindrical {\n\n\t/**\n\t * Constructs a new cylindrical.\n\t *\n\t * @param {number} [radius=1] - The distance from the origin to a point in the x-z plane.\n\t * @param {number} [theta=0] - A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t * @param {number} [y=0] - The height above the x-z plane.\n\t */\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\t/**\n\t\t * The distance from the origin to a point in the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t\t/**\n\t\t * The height above the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle.\n\t * @param {number} y - The height value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given cylindrical to this instance.\n\t *\n\t * @param {Cylindrical} other - The cylindrical to copy.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The x value.\n\t * @param {number} z - The x value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new cylindrical with copied values from this instance.\n\t *\n\t * @return {Cylindrical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 2x2 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix2#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix2#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix2();\n * m.set( 11, 12,\n * 21, 22 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21,\n * 12, 22 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix2 {\n\n\t/**\n\t * Constructs a new 2x2 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t */\n\tconstructor( n11, n12, n21, n22 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix2.prototype.isMatrix2 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n21, n22 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 2x2 identity matrix.\n\t *\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} n11 - 1-1 matrix element.\n\t * @param {number} n12 - 1-2 matrix element.\n\t * @param {number} n21 - 2-1 matrix element.\n\t * @param {number} n22 - 2-2 matrix element.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tset( n11, n12, n21, n22 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 2 ] = n12;\n\t\tte[ 1 ] = n21; te[ 3 ] = n22;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 2D space.\n */\nclass Box2 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector2} [min=(Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector2} [max=(-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox2 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector2} min - The lower boundary of the box.\n\t * @param {Vector2} max - The upper boundary of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} points - An array holding 2D position data as instances of {@link Vector2}.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector2} center - The center of the box.\n\t * @param {Vector2} size - The x and y dimensions of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box2} box - The box to copy.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 2D.\n\t *\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector2} point - The point that should be included by the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions.\n\t *\n\t * @param {Vector2} vector - The vector that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector2} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width and height.\n\t *\n\t * @param {Vector2} point - A point in 2D space.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} A point as a proportion of this box's width and height.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector2} point - The point to clamp.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector2} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$4 ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box2} box - The bounding box to intersect with.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box2} box - The bounding box that will be unioned with this instance.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 2D space.\n\t *\n\t * @param {Vector2} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box2} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nconst _d1 = /*@__PURE__*/ new Vector3();\nconst _d2 = /*@__PURE__*/ new Vector3();\nconst _r = /*@__PURE__*/ new Vector3();\nconst _c1 = /*@__PURE__*/ new Vector3();\nconst _c2 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical line segment in 3D space represented by a start and end point.\n */\nclass Line3 {\n\n\t/**\n\t * Constructs a new line segment.\n\t *\n\t * @param {Vector3} [start=(0,0,0)] - Start of the line segment.\n\t * @param {Vector3} [end=(0,0,0)] - End of the line segment.\n\t */\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\t/**\n\t\t * Start of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.start = start;\n\n\t\t/**\n\t\t * End of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.end = end;\n\n\t}\n\n\t/**\n\t * Sets the start and end values by copying the given vectors.\n\t *\n\t * @param {Vector3} start - The start point.\n\t * @param {Vector3} end - The end point.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given line segment to this instance.\n\t *\n\t * @param {Line3} line - The line segment to copy.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the center of the line segment.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the delta vector of the line segment's start and end point.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\t/**\n\t * Returns the squared Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The squared Euclidean distance.\n\t */\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\t/**\n\t * Returns the Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The Euclidean distance.\n\t */\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\t/**\n\t * Returns a vector at a certain position along the line segment.\n\t *\n\t * @param {number} t - A value between `[0,1]` to represent a position along the line segment.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns a point parameter based on the closest point as projected on the line segment.\n\t *\n\t * @param {Vector3} point - The point for which to return a point parameter.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @return {number} The point parameter.\n\t */\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns the closest point on the line for a given point.\n\t *\n\t * @param {Vector3} point - The point to compute the closest point on the line for.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the line.\n\t */\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns the closest squared distance between this line segment and the given one.\n\t *\n\t * @param {Line3} line - The line segment to compute the closest squared distance to.\n\t * @param {Vector3} [c1] - The closest point on this line segment.\n\t * @param {Vector3} [c2] - The closest point on the given line segment.\n\t * @return {number} The squared distance between this line segment and the given one.\n\t */\n\tdistanceSqToLine3( line, c1 = _c1, c2 = _c2 ) {\n\n\t\t// from Real-Time Collision Detection by Christer Ericson, chapter 5.1.9\n\n\t\t// Computes closest points C1 and C2 of S1(s)=P1+s*(Q1-P1) and\n\t\t// S2(t)=P2+t*(Q2-P2), returning s and t. Function result is squared\n\t\t// distance between between S1(s) and S2(t)\n\n\t\tconst EPSILON = 1e-8 * 1e-8; // must be squared since we compare squared length\n\t\tlet s, t;\n\n\t\tconst p1 = this.start;\n\t\tconst p2 = line.start;\n\t\tconst q1 = this.end;\n\t\tconst q2 = line.end;\n\n\t\t_d1.subVectors( q1, p1 ); // Direction vector of segment S1\n\t\t_d2.subVectors( q2, p2 ); // Direction vector of segment S2\n\t\t_r.subVectors( p1, p2 );\n\n\t\tconst a = _d1.dot( _d1 ); // Squared length of segment S1, always nonnegative\n\t\tconst e = _d2.dot( _d2 ); // Squared length of segment S2, always nonnegative\n\t\tconst f = _d2.dot( _r );\n\n\t\t// Check if either or both segments degenerate into points\n\n\t\tif ( a <= EPSILON && e <= EPSILON ) {\n\n\t\t\t// Both segments degenerate into points\n\n\t\t\tc1.copy( p1 );\n\t\t\tc2.copy( p2 );\n\n\t\t\tc1.sub( c2 );\n\n\t\t\treturn c1.dot( c1 );\n\n\t\t}\n\n\t\tif ( a <= EPSILON ) {\n\n\t\t\t// First segment degenerates into a point\n\n\t\t\ts = 0;\n\t\t\tt = f / e; // s = 0 => t = (b*s + f) / e = f / e\n\t\t\tt = clamp( t, 0, 1 );\n\n\n\t\t} else {\n\n\t\t\tconst c = _d1.dot( _r );\n\n\t\t\tif ( e <= EPSILON ) {\n\n\t\t\t\t// Second segment degenerates into a point\n\n\t\t\t\tt = 0;\n\t\t\t\ts = clamp( - c / a, 0, 1 ); // t = 0 => s = (b*t - c) / a = -c / a\n\n\t\t\t} else {\n\n\t\t\t\t// The general nondegenerate case starts here\n\n\t\t\t\tconst b = _d1.dot( _d2 );\n\t\t\t\tconst denom = a * e - b * b; // Always nonnegative\n\n\t\t\t\t// If segments not parallel, compute closest point on L1 to L2 and\n\t\t\t\t// clamp to segment S1. Else pick arbitrary s (here 0)\n\n\t\t\t\tif ( denom !== 0 ) {\n\n\t\t\t\t\ts = clamp( ( b * f - c * e ) / denom, 0, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ts = 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Compute point on L2 closest to S1(s) using\n\t\t\t\t// t = Dot((P1 + D1*s) - P2,D2) / Dot(D2,D2) = (b*s + f) / e\n\n\t\t\t\tt = ( b * s + f ) / e;\n\n\t\t\t\t// If t in [0,1] done. Else clamp t, recompute s for the new value\n\t\t\t\t// of t using s = Dot((P2 + D2*t) - P1,D1) / Dot(D1,D1)= (t*b - c) / a\n\t\t\t\t// and clamp s to [0, 1]\n\n\t\t\t\tif ( t < 0 ) {\n\n\t\t\t\t\tt = 0.;\n\t\t\t\t\ts = clamp( - c / a, 0, 1 );\n\n\t\t\t\t} else if ( t > 1 ) {\n\n\t\t\t\t\tt = 1;\n\t\t\t\t\ts = clamp( ( b - c ) / a, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tc1.copy( p1 ).add( _d1.multiplyScalar( s ) );\n\t\tc2.copy( p2 ).add( _d2.multiplyScalar( t ) );\n\n\t\tc1.sub( c2 );\n\n\t\treturn c1.dot( c1 );\n\n\t}\n\n\t/**\n\t * Applies a 4x4 transformation matrix to this line segment.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this line segment is equal with the given one.\n\t *\n\t * @param {Line3} line - The line segment to test for equality.\n\t * @return {boolean} Whether this line segment is equal with the given one.\n\t */\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\t/**\n\t * Returns a new line segment with copied values from this instance.\n\t *\n\t * @return {Line3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * This displays a cone shaped helper object for a {@link SpotLight}.\n *\n * ```js\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 10, 10, 10 );\n * scene.add( spotLight );\n *\n * const spotLightHelper = new THREE.SpotLightHelper( spotLight );\n * scene.add( spotLightHelper );\n * ```\n *\n * @augments Object3D\n */\nclass SpotLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new spot light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {SpotLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'SpotLightHelper';\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t-1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, -1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t// update the local matrix based on the parent and light target transforms\n\t\tif ( this.parent ) {\n\n\t\t\tthis.parent.updateWorldMatrix( true );\n\n\t\t\tthis.matrix\n\t\t\t\t.copy( this.parent.matrixWorld )\n\t\t\t\t.invert()\n\t\t\t\t.multiply( this.light.matrixWorld );\n\n\t\t} else {\n\n\t\t\tthis.matrix.copy( this.light.matrixWorld );\n\n\t\t}\n\n\t\tthis.matrixWorld.copy( this.light.matrixWorld );\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n/**\n * A helper object to assist with visualizing a {@link Skeleton}.\n *\n * ```js\n * const helper = new THREE.SkeletonHelper( skinnedMesh );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass SkeletonHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new skeleton helper.\n\t *\n\t * @param {Object3D} object - Usually an instance of {@link SkinnedMesh}. However, any 3D object\n\t * can be used if it represents a hierarchy of bones (see {@link Bone}).\n\t */\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\t/**\n\t\t * The object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.root = object;\n\n\t\t/**\n\t\t * The list of bones that the helper visualizes.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t// colors\n\n\t\tconst color1 = new Color( 0x0000ff );\n\t\tconst color2 = new Color( 0x00ff00 );\n\n\t\tthis.setColors( color1, color2 );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} color1 - The first line color for each bone.\n\t * @param {Color} color2 - The second line color for each bone.\n\t * @return {SkeletonHelper} A reference to this helper.\n\t */\n\tsetColors( color1, color2 ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\tfor ( let i = 0; i < colorAttribute.count; i += 2 ) {\n\n\t\t\tcolorAttribute.setXYZ( i, color1.r, color1.g, color1.b );\n\t\t\tcolorAttribute.setXYZ( i + 1, color2.r, color2.g, color2.b );\n\n\t\t}\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push( ...getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\n/**\n * This displays a helper object consisting of a spherical mesh for\n * visualizing an instance of {@link PointLight}.\n *\n * ```js\n * const pointLight = new THREE.PointLight( 0xff0000, 1, 100 );\n * pointLight.position.set( 10, 10, 10 );\n * scene.add( pointLight );\n *\n * const sphereSize = 1;\n * const pointLightHelper = new THREE.PointLightHelper( pointLight, sphereSize );\n * scene.add( pointLightHelper );\n * ```\n *\n * @augments Mesh\n */\nclass PointLightHelper extends Mesh {\n\n\t/**\n\t * Constructs a new point light helper.\n\t *\n\t * @param {PointLight} light - The light to be visualized.\n\t * @param {number} [sphereSize=1] - The size of the sphere helper.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\n/**\n * Creates a visual aid consisting of a spherical mesh for a\n * given {@link HemisphereLight}.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * const helper = new THREE.HemisphereLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass HemisphereLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new hemisphere light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The size of the mesh used to visualize the light.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'HemisphereLightHelper';\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\n/**\n * The helper is an object to define grids. Grids are two-dimensional\n * arrays of lines.\n *\n * ```js\n * const size = 10;\n * const divisions = 10;\n *\n * const gridHelper = new THREE.GridHelper( size, divisions );\n * scene.add( gridHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass GridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new grid helper.\n\t *\n\t * @param {number} [size=10] - The size of the grid.\n\t * @param {number} [divisions=10] - The number of divisions across the grid.\n\t * @param {number|Color|string} [color1=0x444444] - The color of the center line.\n\t * @param {number|Color|string} [color2=0x888888] - The color of the lines of the grid.\n\t */\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This helper is an object to define polar grids. Grids are\n * two-dimensional arrays of lines.\n *\n * ```js\n * const radius = 10;\n * const sectors = 16;\n * const rings = 8;\n * const divisions = 64;\n *\n * const helper = new THREE.PolarGridHelper( radius, sectors, rings, divisions );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass PolarGridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new polar grid helper.\n\t *\n\t * @param {number} [radius=10] - The radius of the polar grid. This can be any positive number.\n\t * @param {number} [sectors=16] - The number of sectors the grid will be divided into. This can be any positive integer.\n\t * @param {number} [rings=16] - The number of rings. This can be any positive integer.\n\t * @param {number} [divisions=64] - The number of line segments used for each circle. This can be any positive integer.\n\t * @param {number|Color|string} [color1=0x444444] - The first color used for grid elements.\n\t * @param {number|Color|string} [color2=0x888888] - The second color used for grid elements.\n\t */\n\tconstructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\n\t\tif ( sectors > 1 ) {\n\n\t\t\tfor ( let i = 0; i < sectors; i ++ ) {\n\n\t\t\t\tconst v = ( i / sectors ) * ( Math.PI * 2 );\n\n\t\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( x, 0, z );\n\n\t\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create the rings\n\n\t\tfor ( let i = 0; i < rings; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / rings * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Helper object to assist with visualizing a {@link DirectionalLight}'s\n * effect on the scene. This consists of plane and a line representing the\n * light's position and direction.\n *\n * ```js\n * const light = new THREE.DirectionalLight( 0xFFFFFF );\n * scene.add( light );\n *\n * const helper = new THREE.DirectionalLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass DirectionalLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new directional light helper.\n\t *\n\t * @param {DirectionalLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The dimensions of the plane.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {DirectionalLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'DirectionalLightHelper';\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\t/**\n\t\t * Contains the line showing the location of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\t/**\n\t\t * Represents the target line of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n * This helps with visualizing what a camera contains in its frustum. It\n * visualizes the frustum of a camera using a line segments.\n *\n * Based on frustum visualization in [lightgl.js shadowmap example](https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html).\n *\n * `CameraHelper` must be a child of the scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );\n * const helper = new THREE.CameraHelper( camera );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass CameraHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Camera} camera - The camera to visualize.\n\t */\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\t/**\n\t\t * The camera being visualized.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * This contains the points used to visualize the camera.\n\t\t *\n\t\t * @type {Object>}\n\t\t */\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} frustum - The frustum line color.\n\t * @param {Color} cone - The cone line color.\n\t * @param {Color} up - The up line color.\n\t * @param {Color} target - The target line color.\n\t * @param {Color} cross - The cross line color.\n\t * @return {CameraHelper} A reference to this helper.\n\t */\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the helper based on the projection matrix of the camera.\n\t */\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\tlet nearZ, farZ;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// Adjust z values based on coordinate system\n\n\t\tif ( this.camera.reversedDepth === true ) {\n\n\t\t\tnearZ = 1;\n\t\t\tfarZ = 0;\n\n\t\t} else {\n\n\t\t\tif ( this.camera.coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tnearZ = -1;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else if ( this.camera.coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tnearZ = 0;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.CameraHelper.update(): Invalid coordinate system: ' + this.camera.coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// center / target\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, nearZ );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, farZ );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, nearZ );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, nearZ );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, nearZ );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, nearZ );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, farZ );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, farZ );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, farZ );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, farZ );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, nearZ );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, farZ );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, farZ );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, farZ );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, farZ );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, nearZ );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, nearZ );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, nearZ );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, nearZ );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\n/**\n * Helper object to graphically show the world-axis-aligned bounding box\n * around an object. The actual bounding box is handled with {@link Box3},\n * this is just a visual helper for debugging. It can be automatically\n * resized with {@link BoxHelper#update} when the object it's created from\n * is transformed. Note that the object must have a geometry for this to work,\n * so it won't work with sprites.\n *\n * ```js\n * const sphere = new THREE.SphereGeometry();\n * const object = new THREE.Mesh( sphere, new THREE.MeshBasicMaterial( 0xff0000 ) );\n * const box = new THREE.BoxHelper( object, 0xffff00 );\n * scene.add( box );\n * ```\n *\n * @augments LineSegments\n */\nclass BoxHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new box helper.\n\t *\n\t * @param {Object3D} [object] - The 3D object to show the world-axis-aligned bounding box.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The 3D object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Updates the helper's geometry to match the dimensions of the object,\n\t * including any children.\n\t */\n\tupdate() {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\t/**\n\t * Updates the wireframe box for the passed object.\n\t *\n\t * @param {Object3D} object - The 3D object to create the helper for.\n\t * @return {BoxHelper} A reference to this instance.\n\t */\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Box3}.\n *\n * ```js\n * const box = new THREE.Box3();\n * box.setFromCenterAndSize( new THREE.Vector3( 1, 1, 1 ), new THREE.Vector3( 2, 1, 3 ) );\n *\n * const helper = new THREE.Box3Helper( box, 0xffff00 );\n * scene.add( helper )\n * ```\n *\n * @augments LineSegments\n */\nclass Box3Helper extends LineSegments {\n\n\t/**\n\t * Constructs a new box3 helper.\n\t *\n\t * @param {Box3} box - The box to visualize.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The box being visualized.\n\t\t *\n\t\t * @type {Box3}\n\t\t */\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Plane}.\n *\n * ```js\n * const plane = new THREE.Plane( new THREE.Vector3( 1, 1, 0.2 ), 3 );\n * const helper = new THREE.PlaneHelper( plane, 1, 0xffff00 );\n * scene.add( helper );\n * ```\n *\n * @augments Line\n */\nclass PlaneHelper extends Line {\n\n\t/**\n\t * Constructs a new plane helper.\n\t *\n\t * @param {Plane} plane - The plane to be visualized.\n\t * @param {number} [size=1] - The side length of plane helper.\n\t * @param {number|Color|string} [hex=0xffff00] - The helper's color.\n\t */\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\t/**\n\t\t * The plane being visualized.\n\t\t *\n\t\t * @type {Plane}\n\t\t */\n\t\tthis.plane = plane;\n\n\t\t/**\n\t\t * The side length of plane helper.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\n/**\n * An 3D arrow object for visualizing directions.\n *\n * ```js\n * const dir = new THREE.Vector3( 1, 2, 0 );\n *\n * //normalize the direction vector (convert to vector of length 1)\n * dir.normalize();\n *\n * const origin = new THREE.Vector3( 0, 0, 0 );\n * const length = 1;\n * const hex = 0xffff00;\n *\n * const arrowHelper = new THREE.ArrowHelper( dir, origin, length, hex );\n * scene.add( arrowHelper );\n * ```\n *\n * @augments Object3D\n */\nclass ArrowHelper extends Object3D {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Vector3} [dir=(0, 0, 1)] - The (normalized) direction vector.\n\t * @param {Vector3} [origin=(0, 0, 0)] - Point at which the arrow starts.\n\t * @param {number} [length=1] - Length of the arrow in world units.\n\t * @param {(number|Color|string)} [color=0xffff00] - Color of the arrow.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new ConeGeometry( 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, -0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\t/**\n\t\t * The line part of the arrow helper.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\t/**\n\t\t * The cone part of the arrow helper.\n\t\t *\n\t\t * @type {Mesh}\n\t\t */\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\t/**\n\t * Sets the direction of the helper.\n\t *\n\t * @param {Vector3} dir - The normalized direction vector.\n\t */\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < -0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the length of the helper.\n\t *\n\t * @param {number} length - Length of the arrow in world units.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\t/**\n\t * Sets the color of the helper.\n\t *\n\t * @param {number|Color|string} color - The color to set.\n\t */\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.line.geometry.dispose();\n\t\tthis.line.material.dispose();\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n}\n\n/**\n * An axis object to visualize the 3 axes in a simple way.\n * The X axis is red. The Y axis is green. The Z axis is blue.\n *\n * ```js\n * const axesHelper = new THREE.AxesHelper( 5 );\n * scene.add( axesHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass AxesHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new axes helper.\n\t *\n\t * @param {number} [size=1] - Size of the lines representing the axes.\n\t */\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\t/**\n\t * Defines the colors of the axes helper.\n\t *\n\t * @param {number|Color|string} xAxisColor - The color for the x axis.\n\t * @param {number|Color|string} yAxisColor - The color for the y axis.\n\t * @param {number|Color|string} zAxisColor - The color for the z axis.\n\t * @return {AxesHelper} A reference to this axes helper.\n\t */\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This class is used to convert a series of paths to an array of\n * shapes. It is specifically used in context of fonts and SVG.\n */\nclass ShapePath {\n\n\t/**\n\t * Constructs a new shape path.\n\t */\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\t/**\n\t\t * The color of the shape.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color();\n\n\t\t/**\n\t\t * The paths that have been generated for this shape.\n\t\t *\n\t\t * @type {Array}\n\t\t * @default null\n\t\t */\n\t\tthis.subPaths = [];\n\n\t\t/**\n\t\t * The current path that is being generated.\n\t\t *\n\t\t * @type {?Path}\n\t\t * @default null\n\t\t */\n\t\tthis.currentPath = null;\n\n\t}\n\n\t/**\n\t * Creates a new path and moves it current point to the given one.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array} pts - An array of points in 2D space.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts the paths into an array of shapes.\n\t *\n\t * @param {boolean} isCCW - By default solid shapes are defined clockwise (CW) and holes are defined counterclockwise (CCW).\n\t * If this flag is set to `true`, then those are flipped.\n\t * @return {Array} An array of shapes.\n\t */\n\ttoShapes( isCCW ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\n/**\n * Abstract base class for controls.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Controls extends EventDispatcher {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The object that is managed by the controls.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The HTML element used for event listeners.\n\t\t *\n\t\t * @type {?HTMLElement}\n\t\t * @default null\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\t/**\n\t\t * Whether the controls responds to user input or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * The internal state of the controls.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.state = -1;\n\n\t\t/**\n\t\t * This object defines the keyboard input of the controls.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.keys = {};\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to the available mouse buttons.\n\t\t * It depends on the control implementation what kind of mouse buttons and actions are supported.\n\t\t *\n\t\t * @type {{LEFT: ?number, MIDDLE: ?number, RIGHT: ?number}}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: null, MIDDLE: null, RIGHT: null };\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to what kind of touch interaction.\n\t\t * It depends on the control implementation what kind of touch interaction and actions are supported.\n\t\t *\n\t\t * @type {{ONE: ?number, TWO: ?number}}\n\t\t */\n\t\tthis.touches = { ONE: null, TWO: null };\n\n\t}\n\n\t/**\n\t * Connects the controls to the DOM. This method has so called \"side effects\" since\n\t * it adds the module's event listeners to the DOM.\n\t *\n\t * @param {HTMLElement} element - The DOM element to connect to.\n\t */\n\tconnect( element ) {\n\n\t\tif ( element === undefined ) {\n\n\t\t\twarn( 'Controls: connect() now requires an element.' ); // @deprecated, the warning can be removed with r185\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.domElement !== null ) this.disconnect();\n\n\t\tthis.domElement = element;\n\n\t}\n\n\t/**\n\t * Disconnects the controls from the DOM.\n\t */\n\tdisconnect() {}\n\n\t/**\n\t * Call this method if you no longer want use to the controls. It frees all internal\n\t * resources and removes all event listeners.\n\t */\n\tdispose() {}\n\n\t/**\n\t * Controls should implement this method if they have to update their internal state\n\t * per simulation step.\n\t *\n\t * @param {number} [delta] - The time delta in seconds.\n\t */\n\tupdate( /* delta */ ) {}\n\n}\n\n/**\n * Scales the texture as large as possible within its surface without cropping\n * or stretching the texture. The method preserves the original aspect ratio of\n * the texture. Akin to CSS `object-fit: contain`\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction contain( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t} else {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Scales the texture to the smallest possible size to fill the surface, leaving\n * no empty space. The method preserves the original aspect ratio of the texture.\n * Akin to CSS `object-fit: cover`.\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction cover( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t} else {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n *\n * @param {Texture} texture - The texture.\n * @return {Texture} The updated texture.\n */\nfunction fill( texture ) {\n\n\ttexture.repeat.x = 1;\n\ttexture.repeat.y = 1;\n\n\ttexture.offset.x = 0;\n\ttexture.offset.y = 0;\n\n\treturn texture;\n\n}\n\n/**\n * Determines how many bytes must be used to represent the texture.\n *\n * @param {number} width - The width of the texture.\n * @param {number} height - The height of the texture.\n * @param {number} format - The texture's format.\n * @param {number} type - The texture's type.\n * @return {number} The byte length.\n */\nfunction getByteLength( width, height, format, type ) {\n\n\tconst typeByteLength = getTextureTypeByteLength( type );\n\n\tswitch ( format ) {\n\n\t\t// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml\n\t\tcase AlphaFormat:\n\t\t\treturn width * height;\n\t\tcase RedFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RedIntegerFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGIntegerFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBFormat:\n\t\t\treturn ( ( width * height * 3 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAIntegerFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/\n\t\tcase RGB_S3TC_DXT1_Format:\n\t\tcase RGBA_S3TC_DXT1_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_S3TC_DXT3_Format:\n\t\tcase RGBA_S3TC_DXT5_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/\n\t\tcase RGB_PVRTC_2BPPV1_Format:\n\t\tcase RGBA_PVRTC_2BPPV1_Format:\n\t\t\treturn ( Math.max( width, 16 ) * Math.max( height, 8 ) ) / 4;\n\t\tcase RGB_PVRTC_4BPPV1_Format:\n\t\tcase RGBA_PVRTC_4BPPV1_Format:\n\t\t\treturn ( Math.max( width, 8 ) * Math.max( height, 8 ) ) / 2;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/\n\t\tcase RGB_ETC1_Format:\n\t\tcase RGB_ETC2_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_ETC2_EAC_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/\n\t\tcase RGBA_ASTC_4x4_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x4_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x5_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x5_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x6_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x5_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_8x6_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x8_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x5_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_10x6_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_10x8_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x10_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x10_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x12_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 11 ) / 12 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/\n\t\tcase RGBA_BPTC_Format:\n\t\tcase RGB_BPTC_SIGNED_Format:\n\t\tcase RGB_BPTC_UNSIGNED_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/\n\t\tcase RED_RGTC1_Format:\n\t\tcase SIGNED_RED_RGTC1_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 8;\n\t\tcase RED_GREEN_RGTC2_Format:\n\t\tcase SIGNED_RED_GREEN_RGTC2_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t}\n\n\tthrow new Error(\n\t\t`Unable to determine texture byte length for ${format} format.`,\n\t);\n\n}\n\nfunction getTextureTypeByteLength( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase UnsignedByteType:\n\t\tcase ByteType:\n\t\t\treturn { byteLength: 1, components: 1 };\n\t\tcase UnsignedShortType:\n\t\tcase ShortType:\n\t\tcase HalfFloatType:\n\t\t\treturn { byteLength: 2, components: 1 };\n\t\tcase UnsignedShort4444Type:\n\t\tcase UnsignedShort5551Type:\n\t\t\treturn { byteLength: 2, components: 4 };\n\t\tcase UnsignedIntType:\n\t\tcase IntType:\n\t\tcase FloatType:\n\t\t\treturn { byteLength: 4, components: 1 };\n\t\tcase UnsignedInt5999Type:\n\t\tcase UnsignedInt101111Type:\n\t\t\treturn { byteLength: 4, components: 3 };\n\n\t}\n\n\tthrow new Error( `Unknown texture type ${type}.` );\n\n}\n\n/**\n * A class containing utility functions for textures.\n *\n * @hideconstructor\n */\nclass TextureUtils {\n\n\t/**\n\t * Scales the texture as large as possible within its surface without cropping\n\t * or stretching the texture. The method preserves the original aspect ratio of\n\t * the texture. Akin to CSS `object-fit: contain`\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic contain( texture, aspect ) {\n\n\t\treturn contain( texture, aspect );\n\n\t}\n\n\t/**\n\t * Scales the texture to the smallest possible size to fill the surface, leaving\n\t * no empty space. The method preserves the original aspect ratio of the texture.\n\t * Akin to CSS `object-fit: cover`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic cover( texture, aspect ) {\n\n\t\treturn cover( texture, aspect );\n\n\t}\n\n\t/**\n\t * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic fill( texture ) {\n\n\t\treturn fill( texture );\n\n\t}\n\n\t/**\n\t * Determines how many bytes must be used to represent the texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} format - The texture's format.\n\t * @param {number} type - The texture's type.\n\t * @return {number} The byte length.\n\t */\n\tstatic getByteLength( width, height, format, type ) {\n\n\t\treturn getByteLength( width, height, format, type );\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\twarn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, Controls, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, FrustumArray, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RAD2DEG, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDepthPacking, RGBFormat, RGBIntegerFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGDepthPacking, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RenderTarget3D, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGPUCoordinateSystem, WebXRController, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, arrayNeedsUint32, cloneUniforms, createCanvasElement, createElementNS, error, getByteLength, getConsoleFunction, getUnlitUniformColorSpace, log, mergeUniforms, probeAsync, setConsoleFunction, warn, warnOnce };\n","/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nimport { Matrix3, Vector2, Color, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, BackSide, cloneUniforms, Euler, Matrix4, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, IntType, warn, HalfFloatType, UnsignedByteType, FloatType, RGBAFormat, Plane, EquirectangularReflectionMapping, EquirectangularRefractionMapping, WebGLCubeRenderTarget, CubeReflectionMapping, CubeRefractionMapping, BufferGeometry, OrthographicCamera, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, error, NoBlending, WebGLRenderTarget, BufferAttribute, LinearSRGBColorSpace, LinearFilter, warnOnce, Uint32BufferAttribute, Uint16BufferAttribute, arrayNeedsUint32, Vector4, DataArrayTexture, CubeTexture, Data3DTexture, LessEqualCompare, DepthTexture, Texture, GLSL3, PCFShadowMap, PCFSoftShadowMap, VSMShadowMap, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, LinearTransfer, AddOperation, MixOperation, MultiplyOperation, UniformsUtils, DoubleSide, NormalBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, Layers, Frustum, MeshDepthMaterial, RGBADepthPacking, MeshDistanceMaterial, NearestFilter, LessEqualDepth, ReverseSubtractEquation, SubtractEquation, AddEquation, OneMinusConstantAlphaFactor, ConstantAlphaFactor, OneMinusConstantColorFactor, ConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, DstAlphaFactor, DstColorFactor, SrcAlphaSaturateFactor, SrcAlphaFactor, SrcColorFactor, OneFactor, ZeroFactor, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceNone, CullFaceBack, CullFaceFront, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, MinEquation, MaxEquation, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NotEqualCompare, GreaterCompare, GreaterEqualCompare, EqualCompare, LessCompare, AlwaysCompare, NeverCompare, NoColorSpace, DepthStencilFormat, getByteLength, DepthFormat, UnsignedIntType, UnsignedInt248Type, UnsignedShortType, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, UnsignedInt101111Type, ByteType, ShortType, AlphaFormat, RGBFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, ExternalTexture, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, DataTexture, createCanvasElement, SRGBColorSpace, REVISION, log, WebGLCoordinateSystem, probeAsync } from './three.core.js';\nexport { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls, CubeCamera, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CylinderGeometry, Cylindrical, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualStencilFunc, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, Fog, FogExp2, FramebufferTexture, FrustumArray, GLBufferAttribute, GLSL1, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverStencilFunc, NormalAnimationBlendMode, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, OctahedronGeometry, Path, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBDepthPacking, RGBIntegerFormat, RGDepthPacking, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RenderTarget, RenderTarget3D, ReplaceStencilOp, RingGeometry, Scene, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, TOUCH, TetrahedronGeometry, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroSlopeEnding, ZeroStencilOp, getConsoleFunction, setConsoleFunction } from './three.core.js';\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl ) {\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\t\tconst size = array.byteLength;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( typeof Float16Array !== 'undefined' && array instanceof Float16Array ) {\n\n\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version,\n\t\t\tsize: size\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRanges = attribute.updateRanges;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\t// Not using update ranges\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.bufferSubData`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif ( range.start <= previousRange.start + previousRange.count + 1 ) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tgl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, range.start, range.count );\n\n\t\t\t}\n\n\t\t\tattribute.clearUpdateRanges();\n\n\t\t}\n\n\t\tattribute.onUploadCallback();\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tif ( data.size !== attribute.array.byteLength ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' );\n\n\t\t\t}\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nvar alphahash_fragment = \"#ifdef USE_ALPHAHASH\\n\\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\\n#endif\";\n\nvar alphahash_pars_fragment = \"#ifdef USE_ALPHAHASH\\n\\tconst float ALPHA_HASH_SCALE = 0.05;\\n\\tfloat hash2D( vec2 value ) {\\n\\t\\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\\n\\t}\\n\\tfloat hash3D( vec3 value ) {\\n\\t\\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\\n\\t}\\n\\tfloat getAlphaHashThreshold( vec3 position ) {\\n\\t\\tfloat maxDeriv = max(\\n\\t\\t\\tlength( dFdx( position.xyz ) ),\\n\\t\\t\\tlength( dFdy( position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\\n\\t\\tvec2 pixScales = vec2(\\n\\t\\t\\texp2( floor( log2( pixScale ) ) ),\\n\\t\\t\\texp2( ceil( log2( pixScale ) ) )\\n\\t\\t);\\n\\t\\tvec2 alpha = vec2(\\n\\t\\t\\thash3D( floor( pixScales.x * position.xyz ) ),\\n\\t\\t\\thash3D( floor( pixScales.y * position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat lerpFactor = fract( log2( pixScale ) );\\n\\t\\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\\n\\t\\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\\n\\t\\tvec3 cases = vec3(\\n\\t\\t\\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\\n\\t\\t\\t( x - 0.5 * a ) / ( 1.0 - a ),\\n\\t\\t\\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\\n\\t\\t);\\n\\t\\tfloat threshold = ( x < ( 1.0 - a ) )\\n\\t\\t\\t? ( ( x < a ) ? cases.x : cases.y )\\n\\t\\t\\t: cases.z;\\n\\t\\treturn clamp( threshold , 1.0e-6, 1.0 );\\n\\t}\\n#endif\";\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\\n\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n\\t#endif\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_CLEARCOAT ) \\n\\t\\tclearcoatSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_SHEEN ) \\n\\t\\tsheenSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar batching_pars_vertex = \"#ifdef USE_BATCHING\\n\\t#if ! defined( GL_ANGLE_multi_draw )\\n\\t#define gl_DrawID _gl_DrawID\\n\\tuniform int _gl_DrawID;\\n\\t#endif\\n\\tuniform highp sampler2D batchingTexture;\\n\\tuniform highp usampler2D batchingIdTexture;\\n\\tmat4 getBatchingMatrix( const in float i ) {\\n\\t\\tint size = textureSize( batchingTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n\\tfloat getIndirectIndex( const in int i ) {\\n\\t\\tint size = textureSize( batchingIdTexture, 0 ).x;\\n\\t\\tint x = i % size;\\n\\t\\tint y = i / size;\\n\\t\\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\\n\\t}\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tuniform sampler2D batchingColorTexture;\\n\\tvec3 getBatchingColor( const in float i ) {\\n\\t\\tint size = textureSize( batchingColorTexture, 0 ).x;\\n\\t\\tint j = int( i );\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\\n\\t}\\n#endif\";\n\nvar batching_vertex = \"#ifdef USE_BATCHING\\n\\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\\n#ifdef USE_ALPHAHASH\\n\\tvPosition = vec3( position );\\n#endif\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"float G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n} // validated\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660, 0.0556434,\\n\\t\\t-1.5371385, 1.8760108, -0.2040259,\\n\\t\\t-0.4985314, 0.0415560, 1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vBumpMapUv );\\n\\t\\tvec2 dSTdy = dFdy( vBumpMapUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\\n\\t\\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\t\\tfloat distanceToPlane, distanceGradient;\\n\\t\\tfloat clipOpacity = 1.0;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\tif ( clipOpacity == 0.0 ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tfloat unionClipOpacity = 1.0;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\t\\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tclipOpacity *= 1.0 - unionClipOpacity;\\n\\t\\t#endif\\n\\t\\tdiffuseColor.a *= clipOpacity;\\n\\t\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tbool clipped = true;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tif ( clipped ) discard;\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\\n\\tvColor.xyz *= batchingColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nvec3 pow2( const in vec3 x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract( sin( sn ) * c );\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\n#ifdef USE_ALPHAHASH\\n\\tvarying vec3 vPosition;\\n#endif\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n} // validated\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define cubeUV_r0 1.0\\n\\t#define cubeUV_m0 - 2.0\\n\\t#define cubeUV_r1 0.8\\n\\t#define cubeUV_m1 - 1.0\\n\\t#define cubeUV_r4 0.4\\n\\t#define cubeUV_m4 2.0\\n\\t#define cubeUV_r5 0.305\\n\\t#define cubeUV_m5 3.0\\n\\t#define cubeUV_r6 0.21\\n\\t#define cubeUV_m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= cubeUV_r1 ) {\\n\\t\\t\\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\\n\\t\\t} else if ( roughness >= cubeUV_r4 ) {\\n\\t\\t\\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\\n\\t\\t} else if ( roughness >= cubeUV_r5 ) {\\n\\t\\t\\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\\n\\t\\t} else if ( roughness >= cubeUV_r6 ) {\\n\\t\\t\\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = objectTangent;\\n#endif\\n#ifdef USE_BATCHING\\n\\tmat3 bm = mat3( batchingMatrix );\\n\\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\\n\\ttransformedNormal = bm * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = bm * transformedTangent;\\n\\t#endif\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmat3 im = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\\n\\ttransformedNormal = im * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = im * transformedTangent;\\n\\t#endif\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\\n\\t\\temissiveColor = sRGBTransferEOTF( emissiveColor );\\n\\t#endif\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar colorspace_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar colorspace_pars_fragment = \"vec4 LinearTransferOETF( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 sRGBTransferEOTF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\\n}\\nvec4 sRGBTransferOETF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\tuniform mat3 envMapRotation;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\tvec2 fw = fwidth( coord ) * 0.5;\\n\\t\\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\\n\\t#endif\\n}\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_fragment = \"LambertMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_lambert_pars_fragment = \"varying vec3 vViewPosition;\\nstruct LambertMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Lambert\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Lambert\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\n#if defined( USE_LIGHT_PROBES )\\n\\tuniform vec3 lightProbe[ 9 ];\\n#endif\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t}\\n\\treturn distanceFalloff;\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\\n\\t\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\t\\tvec3 bentNormal = cross( bitangent, viewDir );\\n\\t\\t\\t\\tbentNormal = normalize( cross( bentNormal, bitangent ) );\\n\\t\\t\\t\\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\\n\\t\\t\\t\\treturn getIBLRadiance( viewDir, bentNormal, roughness );\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\tmaterial.ior = ior;\\n\\t#ifdef USE_SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_DISPERSION\\n\\tmaterial.dispersion = dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\\n\\t\\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\\n\\t\\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\\n\\t#else\\n\\t\\tvec2 anisotropyV = anisotropyVector;\\n\\t#endif\\n\\tmaterial.anisotropy = length( anisotropyV );\\n\\tif( material.anisotropy == 0.0 ) {\\n\\t\\tanisotropyV = vec2( 1.0, 0.0 );\\n\\t} else {\\n\\t\\tanisotropyV /= material.anisotropy;\\n\\t\\tmaterial.anisotropy = saturate( material.anisotropy );\\n\\t}\\n\\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\\n\\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\\n\\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"uniform sampler2D dfgLUT;\\nstruct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\tfloat dispersion;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n\\t#ifdef IOR\\n\\t\\tfloat ior;\\n\\t#endif\\n\\t#ifdef USE_TRANSMISSION\\n\\t\\tfloat transmission;\\n\\t\\tfloat transmissionAlpha;\\n\\t\\tfloat thickness;\\n\\t\\tfloat attenuationDistance;\\n\\t\\tvec3 attenuationColor;\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat anisotropy;\\n\\t\\tfloat alphaT;\\n\\t\\tvec3 anisotropyT;\\n\\t\\tvec3 anisotropyB;\\n\\t#endif\\n};\\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\\nvec3 sheenSpecularDirect = vec3( 0.0 );\\nvec3 sheenSpecularIndirect = vec3(0.0 );\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n float x2 = x * x;\\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\n#ifdef USE_ANISOTROPY\\n\\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\\n\\t\\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\\n\\t\\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\\n\\t\\tfloat v = 0.5 / ( gv + gl );\\n\\t\\treturn saturate(v);\\n\\t}\\n\\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\\n\\t\\tfloat a2 = alphaT * alphaB;\\n\\t\\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\\n\\t\\thighp float v2 = dot( v, v );\\n\\t\\tfloat w2 = a2 / v2;\\n\\t\\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\\n\\t}\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\\n\\t\\tvec3 f0 = material.clearcoatF0;\\n\\t\\tfloat f90 = material.clearcoatF90;\\n\\t\\tfloat roughness = material.clearcoatRoughness;\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 f0 = material.specularColor;\\n\\tfloat f90 = material.specularF90;\\n\\tfloat roughness = material.roughness;\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tF = mix( F, material.iridescenceFresnel, material.iridescence );\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat dotTL = dot( material.anisotropyT, lightDir );\\n\\t\\tfloat dotTV = dot( material.anisotropyT, viewDir );\\n\\t\\tfloat dotTH = dot( material.anisotropyT, halfDir );\\n\\t\\tfloat dotBL = dot( material.anisotropyB, lightDir );\\n\\t\\tfloat dotBV = dot( material.anisotropyB, viewDir );\\n\\t\\tfloat dotBH = dot( material.anisotropyB, halfDir );\\n\\t\\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\\n\\t\\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\\n\\t#else\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t#endif\\n\\treturn F * ( V * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 uv = vec2( roughness, dotNV );\\n\\treturn texture2D( dfgLUT, uv ).rg;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 dfgV = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNV * dotNV), 0.0, dotNV), material.roughness );\\n\\tvec2 dfgL = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNL * dotNL), 0.0, dotNL), material.roughness );\\n\\tvec3 FssEss_V = material.specularColor * dfgV.x + material.specularF90 * dfgV.y;\\n\\tvec3 FssEss_L = material.specularColor * dfgL.x + material.specularF90 * dfgL.y;\\n\\tfloat Ess_V = dfgV.x + dfgV.y;\\n\\tfloat Ess_L = dfgL.x + dfgL.y;\\n\\tfloat Ems_V = 1.0 - Ess_V;\\n\\tfloat Ems_L = 1.0 - Ess_L;\\n\\tvec3 Favg = material.specularColor + ( 1.0 - material.specularColor ) * 0.047619;\\n\\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg * Favg + EPSILON );\\n\\tfloat compensationFactor = Ems_V * Ems_L;\\n\\tvec3 multiScatter = Fms * compensationFactor;\\n\\treturn singleScatter + multiScatter;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometryNormal;\\n\\t\\tvec3 viewDir = geometryViewDir;\\n\\t\\tvec3 position = geometryPosition;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\t#endif\\n\\tvec3 totalScattering = singleScattering + multiScattering;\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nvec3 geometryPosition = - vViewPosition;\\nvec3 geometryNormal = normal;\\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\nvec3 geometryClearcoatNormal = vec3( 0.0 );\\n#ifdef USE_CLEARCOAT\\n\\tgeometryClearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometryPosition, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tvec4 spotColor;\\n\\tvec3 spotLightCoord;\\n\\tbool inSpotLightMap;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\\n\\t\\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\\n\\t\\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\\n\\t\\t#else\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#endif\\n\\t\\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\\n\\t\\t\\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\\n\\t\\t\\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\\n\\t\\t\\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\\n\\t\\t\\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\\n\\t\\t#endif\\n\\t\\t#undef SPOT_LIGHT_MAP_INDEX\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#if defined( USE_LIGHT_PROBES )\\n\\t\\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometryNormal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\\n\\t#else\\n\\t\\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvFragDepth = 1.0 + gl_Position.w;\\n\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t#if defined( USE_POINTS_UV )\\n\\t\\tvec2 uv = vUv;\\n\\t#else\\n\\t\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_POINTS_UV )\\n\\tvarying vec2 vUv;\\n#else\\n\\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t\\tuniform mat3 uvTransform;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphinstance_vertex = \"#ifdef USE_INSTANCING_MORPH\\n\\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\\n\\t}\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_INSTANCING_MORPH\\n\\t\\tuniform float morphTargetBaseInfluence;\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t#endif\\n\\tuniform sampler2DArray morphTargetsTexture;\\n\\tuniform ivec2 morphTargetsTextureSize;\\n\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t}\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = dFdx( vViewPosition );\\n\\tvec3 fdy = dFdy( vViewPosition );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal *= faceDirection;\\n\\t#endif\\n#endif\\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\\n\\t\\t#if defined( USE_NORMALMAP )\\n\\t\\t\\tvNormalMapUv\\n\\t\\t#elif defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tvClearcoatNormalMapUv\\n\\t\\t#else\\n\\t\\t\\tvUv\\n\\t\\t#endif\\n\\t\\t);\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn[0] *= faceDirection;\\n\\t\\ttbn[1] *= faceDirection;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn2[0] *= faceDirection;\\n\\t\\ttbn2[1] *= faceDirection;\\n\\t#endif\\n#endif\\nvec3 nonPerturbedNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\tnormal = normalize( tbn * mapN );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\\n\\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( uv.st );\\n\\t\\tvec2 st1 = dFdy( uv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\\n\\t\\treturn mat3( T * scale, B * scale, N );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = nonPerturbedNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar opaque_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= material.transmissionAlpha;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\\nconst float Inv255 = 1. / 255.;\\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec4( 0., 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec4( 1., 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat af = modf( v * PackFactors.a, vuf );\\n\\tfloat bf = modf( vuf * ShiftRight8, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\\n}\\nvec3 packDepthToRGB( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec3( 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec3( 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat bf = modf( v * PackFactors.b, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\\n}\\nvec2 packDepthToRG( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec2( 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec2( 1., 1. );\\n\\tfloat vuf;\\n\\tfloat gf = modf( v * 256., vuf );\\n\\treturn vec2( vuf * Inv255, gf );\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors4 );\\n}\\nfloat unpackRGBToDepth( const in vec3 v ) {\\n\\treturn dot( v, UnpackFactors3 );\\n}\\nfloat unpackRGToDepth( const in vec2 v ) {\\n\\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\\n}\\nvec4 pack2HalfToRGBA( const in vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( const in vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn depth * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * depth - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_BATCHING\\n\\tmvPosition = batchingMatrix * mvPosition;\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#if NUM_SPOT_LIGHT_MAPS > 0\\n\\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\tfloat depth = unpackRGBAToDepth( texture2D( depths, uv ) );\\n\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\treturn step( depth, compare );\\n\\t\\t#else\\n\\t\\t\\treturn step( compare, depth );\\n\\t\\t#endif\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow( sampler2D shadow, vec2 uv, float compare ) {\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\tfloat hard_shadow = step( distribution.x, compare );\\n\\t\\t#else\\n\\t\\t\\tfloat hard_shadow = step( compare, distribution.x );\\n\\t\\t#endif\\n\\t\\tif ( hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\t\\n\\t\\tfloat lightToPositionLength = length( lightToPosition );\\n\\t\\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\\n\\t\\t\\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\t\\tdp += shadowBias;\\n\\t\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\t\\tshadow = (\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\\n\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\tvec4 shadowWorldPosition;\\n#endif\\n#if defined( USE_SHADOWMAP )\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if NUM_SPOT_LIGHT_COORDS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition;\\n\\t\\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t\\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\\n\\t\\t#endif\\n\\t\\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tint size = textureSize( boneTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn saturate( toneMappingExposure * color );\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 CineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3( 1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108, 1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605, 1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.6605, - 0.1246, - 0.0182 ),\\n\\tvec3( - 0.5876, 1.1329, - 0.1006 ),\\n\\tvec3( - 0.0728, - 0.0083, 1.1187 )\\n);\\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\\n\\tvec3( 0.6274, 0.0691, 0.0164 ),\\n\\tvec3( 0.3293, 0.9195, 0.0880 ),\\n\\tvec3( 0.0433, 0.0113, 0.8956 )\\n);\\nvec3 agxDefaultContrastApprox( vec3 x ) {\\n\\tvec3 x2 = x * x;\\n\\tvec3 x4 = x2 * x2;\\n\\treturn + 15.5 * x4 * x2\\n\\t\\t- 40.14 * x4 * x\\n\\t\\t+ 31.96 * x4\\n\\t\\t- 6.868 * x2 * x\\n\\t\\t+ 0.4298 * x2\\n\\t\\t+ 0.1191 * x\\n\\t\\t- 0.00232;\\n}\\nvec3 AgXToneMapping( vec3 color ) {\\n\\tconst mat3 AgXInsetMatrix = mat3(\\n\\t\\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\\n\\t\\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\\n\\t\\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\\n\\t);\\n\\tconst mat3 AgXOutsetMatrix = mat3(\\n\\t\\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\\n\\t\\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\\n\\t\\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\\n\\t);\\n\\tconst float AgxMinEv = - 12.47393;\\tconst float AgxMaxEv = 4.026069;\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\\n\\tcolor = AgXInsetMatrix * color;\\n\\tcolor = max( color, 1e-10 );\\tcolor = log2( color );\\n\\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\tcolor = agxDefaultContrastApprox( color );\\n\\tcolor = AgXOutsetMatrix * color;\\n\\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\\n\\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\treturn color;\\n}\\nvec3 NeutralToneMapping( vec3 color ) {\\n\\tconst float StartCompression = 0.8 - 0.04;\\n\\tconst float Desaturation = 0.15;\\n\\tcolor *= toneMappingExposure;\\n\\tfloat x = min( color.r, min( color.g, color.b ) );\\n\\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\\n\\tcolor -= offset;\\n\\tfloat peak = max( color.r, max( color.g, color.b ) );\\n\\tif ( peak < StartCompression ) return color;\\n\\tfloat d = 1. - StartCompression;\\n\\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\\n\\tcolor *= newPeak / peak;\\n\\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\\n\\treturn mix( color, vec3( newPeak ), g );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tmaterial.transmission = transmission;\\n\\tmaterial.transmissionAlpha = 1.0;\\n\\tmaterial.thickness = thickness;\\n\\tmaterial.attenuationDistance = attenuationDistance;\\n\\tmaterial.attenuationColor = attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmitted = getIBLVolumeRefraction(\\n\\t\\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\\n\\t\\tmaterial.attenuationColor, material.attenuationDistance );\\n\\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\\n\\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tfloat w0( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w1( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\\n\\t}\\n\\tfloat w2( float a ){\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w3( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * a );\\n\\t}\\n\\tfloat g0( float a ) {\\n\\t\\treturn w0( a ) + w1( a );\\n\\t}\\n\\tfloat g1( float a ) {\\n\\t\\treturn w2( a ) + w3( a );\\n\\t}\\n\\tfloat h0( float a ) {\\n\\t\\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\\n\\t}\\n\\tfloat h1( float a ) {\\n\\t\\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\\n\\t}\\n\\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\\n\\t\\tuv = uv * texelSize.zw + 0.5;\\n\\t\\tvec2 iuv = floor( uv );\\n\\t\\tvec2 fuv = fract( uv );\\n\\t\\tfloat g0x = g0( fuv.x );\\n\\t\\tfloat g1x = g1( fuv.x );\\n\\t\\tfloat h0x = h0( fuv.x );\\n\\t\\tfloat h1x = h1( fuv.x );\\n\\t\\tfloat h0y = h0( fuv.y );\\n\\t\\tfloat h1y = h1( fuv.y );\\n\\t\\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\\n\\t\\t\\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\\n\\t}\\n\\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\\n\\t\\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\\n\\t\\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\\n\\t\\tvec2 fLodSizeInv = 1.0 / fLodSize;\\n\\t\\tvec2 cLodSizeInv = 1.0 / cLodSize;\\n\\t\\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\\n\\t\\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\\n\\t\\treturn mix( fSample, cSample, fract( lod ) );\\n\\t}\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\\n\\t}\\n\\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( isinf( attenuationDistance ) ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec4 transmittedLight;\\n\\t\\tvec3 transmittance;\\n\\t\\t#ifdef USE_DISPERSION\\n\\t\\t\\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\\n\\t\\t\\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\\n\\t\\t\\tfor ( int i = 0; i < 3; i ++ ) {\\n\\t\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\\n\\t\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\t\\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\\n\\t\\t\\t\\ttransmittedLight[ i ] = transmissionSample[ i ];\\n\\t\\t\\t\\ttransmittedLight.a += transmissionSample.a;\\n\\t\\t\\t\\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\\n\\t\\t\\t}\\n\\t\\t\\ttransmittedLight.a /= 3.0;\\n\\t\\t#else\\n\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\t\\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\t#endif\\n\\t\\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform mat3 mapTransform;\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform mat3 alphaMapTransform;\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tuniform mat3 lightMapTransform;\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapTransform;\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tuniform mat3 bumpMapTransform;\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tuniform mat3 normalMapTransform;\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tuniform mat3 displacementMapTransform;\\n\\tvarying vec2 vDisplacementMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapTransform;\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tuniform mat3 metalnessMapTransform;\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform mat3 roughnessMapTransform;\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tuniform mat3 anisotropyMapTransform;\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform mat3 clearcoatMapTransform;\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform mat3 clearcoatNormalMapTransform;\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform mat3 clearcoatRoughnessMapTransform;\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tuniform mat3 sheenColorMapTransform;\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tuniform mat3 sheenRoughnessMapTransform;\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tuniform mat3 iridescenceMapTransform;\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform mat3 iridescenceThicknessMapTransform;\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tuniform mat3 specularMapTransform;\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tuniform mat3 specularColorMapTransform;\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tuniform mat3 specularIntensityMapTransform;\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvUv = vec3( uv, 1 ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_BATCHING\\n\\t\\tworldPosition = batchingMatrix * worldPosition;\\n\\t#endif\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$h = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$h = \"uniform sampler2D t2D;\\nuniform float backgroundIntensity;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$g = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$g = \"#ifdef ENVMAP_TYPE_CUBE\\n\\tuniform samplerCube envMap;\\n#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\tuniform sampler2D envMap;\\n#endif\\nuniform float flipEnvMap;\\nuniform float backgroundBlurriness;\\nuniform float backgroundIntensity;\\nuniform mat3 backgroundRotation;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\\n\\t#else\\n\\t\\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = texColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$e = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\\n\\t#else\\n\\t\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\\n\\t#endif\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#elif DEPTH_PACKING == 3202\\n\\t\\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\\n\\t#elif DEPTH_PACKING == 3203\\n\\t\\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main () {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$a = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$9 = \"#define LAMBERT\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define USE_SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef USE_SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_DISPERSION\\n\\tuniform float dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\tuniform vec2 anisotropyVector;\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tuniform sampler2D anisotropyMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include \\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#ifdef USE_POINTS_UV\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\nvoid main() {\\n\\t#ifdef USE_POINTS_UV\\n\\t\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$2 = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 mvPosition = modelViewMatrix[ 3 ];\\n\\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst ShaderChunk = {\n\talphahash_fragment: alphahash_fragment,\n\talphahash_pars_fragment: alphahash_pars_fragment,\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbatching_pars_vertex: batching_pars_vertex,\n\tbatching_vertex: batching_vertex,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tiridescence_fragment: iridescence_fragment,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tcolorspace_fragment: colorspace_fragment,\n\tcolorspace_pars_fragment: colorspace_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_fragment: lights_lambert_fragment,\n\tlights_lambert_pars_fragment: lights_lambert_pars_fragment,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphinstance_vertex: morphinstance_vertex,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\topaque_fragment: opaque_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$h,\n\tbackground_frag: fragment$h,\n\tbackgroundCube_vert: vertex$g,\n\tbackgroundCube_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n// Uniforms library for shared webgl shaders\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\t\tspecularMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tenvMapRotation: { value: /*@__PURE__*/ new Matrix3() },\n\t\tflipEnvMap: { value: -1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 }, // basic, lambert, phong\n\t\tdfgLUT: { value: null } // DFG LUT for physically-based rendering\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 },\n\t\taoMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 },\n\t\tlightMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null },\n\t\temissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null },\n\t\tmetalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null },\n\t\troughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotLightMap: { value: [] },\n\t\tspotShadowMap: { value: [] },\n\t\tspotLightMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tbackgroundCube: {\n\n\t\tuniforms: {\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: -1 },\n\t\t\tbackgroundBlurriness: { value: 0 },\n\t\t\tbackgroundIntensity: { value: 1 },\n\t\t\tbackgroundRotation: { value: /*@__PURE__*/ new Matrix3() }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.backgroundCube_vert,\n\t\tfragmentShader: ShaderChunk.backgroundCube_frag\n\n\t},\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: -1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tclearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tdispersion: { value: 0 },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tiridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\tsheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tthicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t\tspecularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tanisotropyVector: { value: /*@__PURE__*/ new Vector2() },\n\t\t\tanisotropyMap: { value: null },\n\t\t\tanisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nconst _rgb = { r: 0, b: 0, g: 0 };\nconst _e1$1 = /*@__PURE__*/ new Euler();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction getBackground( scene ) {\n\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tconst usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background\n\t\t\tbackground = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );\n\n\t\t}\n\n\t\treturn background;\n\n\t}\n\n\tfunction render( scene ) {\n\n\t\tlet forceClear = false;\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tconst environmentBlendMode = renderer.xr.getEnvironmentBlendMode();\n\n\t\tif ( environmentBlendMode === 'additive' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );\n\n\t\t} else if ( environmentBlendMode === 'alpha-blend' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\t// buffers might not be writable which is required to ensure a correct clear\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t}\n\n\tfunction addToRenderList( renderList, scene ) {\n\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\t_e1$1.copy( scene.backgroundRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1$1.x *= -1; _e1$1.y *= -1; _e1$1.z *= -1;\n\n\t\t\tif ( background.isCubeTexture && background.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1$1.y *= -1;\n\t\t\t\t_e1$1.z *= -1;\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? -1 : 1;\n\t\t\tboxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;\n\t\t\tboxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tboxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4( _m1$1.makeRotationFromEuler( _e1$1 ) );\n\t\t\tboxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// add \"map\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\t\t\tplaneMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tplaneMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tcolor.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) );\n\n\t\tstate.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha );\n\n\t}\n\n\tfunction dispose() {\n\n\t\tif ( boxMesh !== undefined ) {\n\n\t\t\tboxMesh.geometry.dispose();\n\t\t\tboxMesh.material.dispose();\n\n\t\t\tboxMesh = undefined;\n\n\t\t}\n\n\t\tif ( planeMesh !== undefined ) {\n\n\t\t\tplaneMesh.geometry.dispose();\n\t\t\tplaneMesh.material.dispose();\n\n\t\t\tplaneMesh = undefined;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render,\n\t\taddToRenderList: addToRenderList,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, attributes ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tconst state = getBindingState( geometry, program, material );\n\n\t\tif ( currentState !== state ) {\n\n\t\t\tcurrentState = state;\n\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t}\n\n\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\treturn gl.createVertexArray();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\treturn gl.bindVertexArray( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\treturn gl.deleteVertexArray( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tgl.vertexAttribDivisor( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) {\n\n\t\tif ( integer === true ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\t// check for integer attributes\n\n\t\t\t\t\tconst integer = ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType );\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\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}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawArraysInstanced( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ], counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters, utils ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction textureFormatReadable( textureFormat ) {\n\n\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction textureTypeReadable( textureType ) {\n\n\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );\n\n\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\ttextureType !== FloatType && ! halfFloatSupportedByExt ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\twarn( 'WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\tconst reversedDepthBuffer = parameters.reversedDepthBuffer === true && extensions.has( 'EXT_clip_control' );\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\n\tconst maxSamples = gl.getParameter( gl.MAX_SAMPLES );\n\n\treturn {\n\n\t\tisWebGL2: true, // keeping this for backwards compatibility\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\ttextureFormatReadable: textureFormatReadable,\n\t\ttextureTypeReadable: textureTypeReadable,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\n\t};\n\n\tthis.setGlobalState = function ( planes, camera ) {\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips.\n// Used for scene blur in fromScene() method.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\n// Used for scene blur in fromScene() method.\nconst MAX_SAMPLES = 20;\n\n// GGX VNDF importance sampling configuration\nconst GGX_SAMPLES = 256;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\nlet _oldActiveCubeFace = 0;\nlet _oldActiveMipmapLevel = 0;\nlet _oldXrEnabled = false;\n\nconst _origin = /*@__PURE__*/ new Vector3();\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * The prefiltering uses GGX VNDF (Visible Normal Distribution Function)\n * importance sampling based on \"Sampling the GGX Distribution of Visible Normals\"\n * (Heitz, 2018) to generate environment maps that accurately match the GGX BRDF\n * used in material rendering for physically-based image-based lighting.\n */\nclass PMREMGenerator {\n\n\t/**\n\t * Constructs a new PMREM generator.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\t\tthis._lodMeshes = [];\n\n\t\tthis._backgroundBox = null;\n\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._blurMaterial = null;\n\t\tthis._ggxMaterial = null;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety.\n\t *\n\t * @param {Scene} scene - The scene to be captured.\n\t * @param {number} [sigma=0] - The blur radius in radians.\n\t * @param {number} [near=0.1] - The near plane distance.\n\t * @param {number} [far=100] - The far plane distance.\n\t * @param {Object} [options={}] - The configuration options.\n\t * @param {number} [options.size=256] - The texture size of the PMREM.\n\t * @param {Vector3} [options.renderTarget=origin] - The position of the internal cube camera that renders the scene.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100, options = {} ) {\n\n\t\tconst {\n\t\t\tsize = 256,\n\t\t\tposition = _origin,\n\t\t} = options;\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tthis._setSize( size );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} equirectangular - The equirectangular texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} cubemap - The cubemap texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t\tif ( this._backgroundBox !== null ) {\n\n\t\t\tthis._backgroundBox.geometry.dispose();\n\t\t\tthis._backgroundBox.material.dispose();\n\n\t\t}\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\t\tif ( this._ggxMaterial !== null ) this._ggxMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodMeshes.length; i ++ ) {\n\n\t\t\tthis._lodMeshes[ i ].geometry.dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );\n\t\tthis._renderer.xr.enabled = _oldXrEnabled;\n\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\t\t\tthis._ggxMaterial = _getGGXShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst mesh = new Mesh( new BufferGeometry(), material );\n\t\tthis._renderer.compile( mesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, -1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, -1, -1, -1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\t// https://github.com/mrdoob/three.js/issues/31413#issuecomment-3095966812\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tif ( reversedDepthBuffer ) {\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\t\trenderer.clearDepth();\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t}\n\n\t\tif ( this._backgroundBox === null ) {\n\n\t\t\tthis._backgroundBox = new Mesh(\n\t\t\t\tnew BoxGeometry(),\n\t\t\t\tnew MeshBasicMaterial( {\n\t\t\t\t\tname: 'PMREM.Background',\n\t\t\t\t\tside: BackSide,\n\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\tdepthTest: false,\n\t\t\t\t} )\n\t\t\t);\n\n\t\t}\n\n\t\tconst backgroundBox = this._backgroundBox;\n\t\tconst backgroundMaterial = backgroundBox.material;\n\n\t\tlet useSolidColor = false;\n\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x + forwardSign[ i ], position.y, position.z );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y + forwardSign[ i ], position.z );\n\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y, position.z + forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\n\t\tconst mesh = this._lodMeshes[ 0 ];\n\t\tmesh.material = material;\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tconst n = this._lodMeshes.length;\n\n\t\t// Use GGX VNDF importance sampling\n\t\tfor ( let i = 1; i < n; i ++ ) {\n\n\t\t\tthis._applyGGXFilter( cubeUVRenderTarget, i - 1, i );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * Applies GGX VNDF importance sampling filter to generate a prefiltered environment map.\n\t * Uses Monte Carlo integration with VNDF importance sampling to accurately represent the\n\t * GGX BRDF for physically-based rendering. Reads from the previous LOD level and\n\t * applies incremental roughness filtering to avoid over-blurring.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn - Source LOD level to read from\n\t * @param {number} lodOut - Target LOD level to write to\n\t */\n\t_applyGGXFilter( cubeUVRenderTarget, lodIn, lodOut ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tconst ggxMaterial = this._ggxMaterial;\n\t\tconst ggxMesh = this._lodMeshes[ lodOut ];\n\t\tggxMesh.material = ggxMaterial;\n\n\t\tconst ggxUniforms = ggxMaterial.uniforms;\n\n\t\t// Calculate incremental roughness between LOD levels\n\t\tconst targetRoughness = lodOut / ( this._lodMeshes.length - 1 );\n\t\tconst sourceRoughness = lodIn / ( this._lodMeshes.length - 1 );\n\t\tconst incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );\n\n\t\t// Apply blur strength mapping for better quality across the roughness range\n\t\tconst blurStrength = 0.05 + targetRoughness * 0.95;\n\t\tconst adjustedRoughness = incrementalRoughness * blurStrength;\n\n\t\t// Calculate viewport position based on output LOD level\n\t\tconst { _lodMax } = this;\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t// Read from previous LOD with incremental roughness\n\t\tggxUniforms[ 'envMap' ].value = cubeUVRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = adjustedRoughness;\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodIn; // Sample from input LOD\n\n\t\t_setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( pingPongRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t\t// Copy from pingPong back to cubeUV (simple direct copy)\n\t\tggxUniforms[ 'envMap' ].value = pingPongRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = 0.0; // Direct copy\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodOut; // Read from the level we just wrote\n\n\t\t_setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t *\n\t * Used for initial scene blur in fromScene() method when sigma > 0.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn\n\t * @param {number} lodOut\n\t * @param {number} sigma\n\t * @param {Vector3} [poleAxis]\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\terror(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = this._lodMeshes[ lodOut ];\n\t\tblurMesh.material = blurMaterial;\n\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\twarn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\tconst lodMeshes = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : -1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodMeshes.push( new Mesh( planes, null ) );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodMeshes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getGGXShader( lodMax, width, height ) {\n\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'PMREMGGXConvolution',\n\n\t\tdefines: {\n\t\t\t'GGX_SAMPLES': GGX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'roughness': { value: 0.0 },\n\t\t\t'mipInt': { value: 0 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// \"Sampling the GGX Distribution of Visible Normals\"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 3.2: Transform view direction to hemisphere configuration\n\t\t\t\tvec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tfloat lensq = Vh.x * Vh.x + Vh.y * Vh.y;\n\t\t\t\tvec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(Vh, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + Vh.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: -1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\tconst currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( renderTarget !== undefined ) {\n\n\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\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}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tconst extension = gl.getExtension( name );\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function () {\n\n\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\t\t\tgetExtension( 'WEBGL_clip_cull_distance' );\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\t\t\tgetExtension( 'WEBGL_render_shared_exponent' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\twarnOnce( 'WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else if ( geometryPosition !== undefined ) {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tfunction update( object, geometry, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\t// the following encodes morph targets into an array of data textures. Each layer represents a single morph target.\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet entry = morphTextures.get( geometry );\n\n\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\tlet vertexDataCount = 0;\n\n\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\tlet height = 1;\n\n\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t}\n\n\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\ttexture.type = FloatType;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\t// fill buffer\n\n\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tentry = {\n\t\t\t\tcount: morphTargetsCount,\n\t\t\t\ttexture: texture,\n\t\t\t\tsize: new Vector2( width, height )\n\t\t\t};\n\n\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\tfunction disposeTexture() {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t}\n\n\t\t//\n\t\tif ( object.isInstancedMesh === true && object.morphTexture !== null ) {\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );\n\n\t\t} else {\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tif ( updateMap.get( object ) !== frame ) {\n\n\t\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t\tupdateMap.set( object, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( updateMap.get( skeleton ) !== frame ) {\n\n\t\t\t\tskeleton.update();\n\n\t\t\t\tupdateMap.set( skeleton, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\n\nconst emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 );\n\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array or THREE.VectorN)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2i( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3i( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4i( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array or THREE.VectorN)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2ui( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3ui( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4ui( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\tlet emptyTexture2D;\n\n\tif ( this.type === gl.SAMPLER_2D_SHADOW ) {\n\n\t\temptyShadowTexture.compareFunction = LessEqualCompare; // #28670\n\t\temptyTexture2D = emptyShadowTexture;\n\n\t} else {\n\n\t\temptyTexture2D = emptyTexture;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture2D, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\n// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/\nconst COMPLETION_STATUS_KHR = 0x91B1;\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nconst _m0 = /*@__PURE__*/ new Matrix3();\n\nfunction getEncodingComponents( colorSpace ) {\n\n\tColorManagement._getMatrix( _m0, ColorManagement.workingColorSpace, colorSpace );\n\n\tconst encodingMatrix = `mat3( ${ _m0.elements.map( ( v ) => v.toFixed( 4 ) ) } )`;\n\n\tswitch ( ColorManagement.getTransfer( colorSpace ) ) {\n\n\t\tcase LinearTransfer:\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t\tcase SRGBTransfer:\n\t\t\treturn [ encodingMatrix, 'sRGBTransferOETF' ];\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported color space: ', colorSpace );\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\n\tconst shaderInfoLog = gl.getShaderInfoLog( shader ) || '';\n\tconst errors = shaderInfoLog.trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, colorSpace ) {\n\n\tconst components = getEncodingComponents( colorSpace );\n\n\treturn [\n\n\t\t`vec4 ${functionName}( vec4 value ) {`,\n\n\t\t`\treturn ${components[ 1 ]}( vec4( value.rgb * ${components[ 0 ]}, value.a ) );`,\n\n\t\t'}',\n\n\t].join( '\\n' );\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'Cineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase AgXToneMapping:\n\t\t\ttoneMappingName = 'AgX';\n\t\t\tbreak;\n\n\t\tcase NeutralToneMapping:\n\t\t\ttoneMappingName = 'Neutral';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\n\nfunction getLuminanceFunction() {\n\n\tColorManagement.getLuminanceCoefficients( _v0 );\n\n\tconst r = _v0.x.toFixed( 4 );\n\tconst g = _v0.y.toFixed( 4 );\n\tconst b = _v0.z.toFixed( 4 );\n\n\treturn [\n\n\t\t'float luminance( const in vec3 rgb ) {',\n\n\t\t`\tconst vec3 weights = vec3( ${ r }, ${ g }, ${ b } );`,\n\n\t\t'\treturn dot( weights, rgb );',\n\n\t\t'}'\n\n\t].join( '\\n' );\n\n}\n\nfunction generateVertexExtensions( parameters ) {\n\n\tconst chunks = [\n\t\tparameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : '',\n\t\tparameters.extensionMultiDraw ? '#extension GL_ANGLE_multi_draw : require' : '',\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// log( 'WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\tconst numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps;\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nconst shaderChunkMap = new Map();\n\nfunction includeReplacer( match, include ) {\n\n\tlet string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tconst newInclude = shaderChunkMap.get( include );\n\n\t\tif ( newInclude !== undefined ) {\n\n\t\t\tstring = ShaderChunk[ newInclude ];\n\t\t\twarn( 'WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.', include, newInclude );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string.replace( unrollLoopPattern, loopReplacer );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = `precision ${parameters.precision} float;\n\tprecision ${parameters.precision} int;\n\tprecision ${parameters.precision} sampler2D;\n\tprecision ${parameters.precision} samplerCube;\n\tprecision ${parameters.precision} sampler3D;\n\tprecision ${parameters.precision} sampler2DArray;\n\tprecision ${parameters.precision} sampler2DShadow;\n\tprecision ${parameters.precision} samplerCubeShadow;\n\tprecision ${parameters.precision} sampler2DArrayShadow;\n\tprecision ${parameters.precision} isampler2D;\n\tprecision ${parameters.precision} isampler3D;\n\tprecision ${parameters.precision} isamplerCube;\n\tprecision ${parameters.precision} isampler2DArray;\n\tprecision ${parameters.precision} usampler2D;\n\tprecision ${parameters.precision} usampler3D;\n\tprecision ${parameters.precision} usamplerCube;\n\tprecision ${parameters.precision} usampler2DArray;\n\t`;\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customVertexExtensions = generateVertexExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '',\n\t\t\tparameters.batching ? '#define USE_BATCHING' : '',\n\t\t\tparameters.batchingColor ? '#define USE_BATCHING_COLOR' : '',\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\t\t\tparameters.instancingMorph ? '#define USE_INSTANCING_MORPH' : '',\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\t//\n\n\t\t\tparameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '',\n\t\t\tparameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '',\n\t\t\tparameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '',\n\t\t\tparameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '',\n\t\t\tparameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '',\n\t\t\tparameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '',\n\t\t\tparameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '',\n\t\t\tparameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '',\n\n\t\t\tparameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '',\n\t\t\tparameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '',\n\n\t\t\tparameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '',\n\n\t\t\tparameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '',\n\t\t\tparameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '',\n\t\t\tparameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '',\n\n\t\t\tparameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '',\n\t\t\tparameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '',\n\n\t\t\tparameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '',\n\t\t\tparameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '',\n\n\t\t\tparameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '',\n\t\t\tparameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '',\n\t\t\tparameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '',\n\n\t\t\tparameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '',\n\t\t\tparameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '',\n\n\t\t\t//\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_MORPH',\n\n\t\t\t'\tuniform sampler2D morphTexture;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_UV1',\n\n\t\t\t'\tattribute vec2 uv1;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV2',\n\n\t\t\t'\tattribute vec2 uv2;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV3',\n\n\t\t\t'\tattribute vec2 uv3;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.alphaToCoverage ? '#define ALPHA_TO_COVERAGE' : '',\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.dispersion ? '#define USE_DISPERSION' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\t\t\tparameters.decodeVideoTextureEmissive ? '#define DECODE_VIDEO_TEXTURE_EMISSIVE' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ),\n\t\t\tgetLuminanceFunction(),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\tcustomVertexExtensions,\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// log( '*VERTEX*', vertexGlsl );\n\t// log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\tfunction onFirstUse( self ) {\n\n\t\t// check for link errors\n\t\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\t\tconst programInfoLog = gl.getProgramInfoLog( program ) || '';\n\t\t\tconst vertexShaderInfoLog = gl.getShaderInfoLog( glVertexShader ) || '';\n\t\t\tconst fragmentShaderInfoLog = gl.getShaderInfoLog( glFragmentShader ) || '';\n\n\t\t\tconst programLog = programInfoLog.trim();\n\t\t\tconst vertexLog = vertexShaderInfoLog.trim();\n\t\t\tconst fragmentLog = fragmentShaderInfoLog.trim();\n\n\t\t\tlet runnable = true;\n\t\t\tlet haveDiagnostics = true;\n\n\t\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\t\trunnable = false;\n\n\t\t\t\tif ( typeof renderer.debug.onShaderError === 'function' ) {\n\n\t\t\t\t\trenderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// default error reporting\n\n\t\t\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\t\t\terror(\n\t\t\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t\t\t'Material Name: ' + self.name + '\\n' +\n\t\t\t\t\t\t'Material Type: ' + self.type + '\\n\\n' +\n\t\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\t\tfragmentErrors\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( programLog !== '' ) {\n\n\t\t\t\twarn( 'WebGLProgram: Program Info Log:', programLog );\n\n\t\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\t\thaveDiagnostics = false;\n\n\t\t\t}\n\n\t\t\tif ( haveDiagnostics ) {\n\n\t\t\t\tself.diagnostics = {\n\n\t\t\t\t\trunnable: runnable,\n\n\t\t\t\t\tprogramLog: programLog,\n\n\t\t\t\t\tvertexShader: {\n\n\t\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t\t},\n\n\t\t\t\t\tfragmentShader: {\n\n\t\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Clean up\n\n\t\t// Crashes in iOS9 and iOS10. #18402\n\t\t// gl.detachShader( program, glVertexShader );\n\t\t// gl.detachShader( program, glFragmentShader );\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t}\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t// Populates cachedUniforms and cachedAttributes\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t// Populates cachedAttributes and cachedUniforms\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported,\n\t// flag the program as ready immediately. It may cause a stall when it's first used.\n\n\tlet programReady = ( parameters.rendererExtensionParallelShaderCompile === false );\n\n\tthis.isReady = function () {\n\n\t\tif ( programReady === false ) {\n\n\t\t\tprogramReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR );\n\n\t\t}\n\n\t\treturn programReady;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.type = parameters.shaderType;\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\t\tlet set = cache.get( material );\n\n\t\tif ( set === undefined ) {\n\n\t\t\tset = new Set();\n\t\t\tcache.set( material, set );\n\n\t\t}\n\n\t\treturn set;\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\t\tlet stage = cache.get( code );\n\n\t\tif ( stage === undefined ) {\n\n\t\t\tstage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn stage;\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst _activeChannels = new Set();\n\tconst programs = [];\n\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;\n\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getChannel( value ) {\n\n\t\t_activeChannels.add( value );\n\n\t\tif ( value === 0 ) return 'uv';\n\n\t\treturn `uv${ value }`;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\twarn( 'WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tconst IS_INSTANCEDMESH = object.isInstancedMesh === true;\n\t\tconst IS_BATCHEDMESH = object.isBatchedMesh === true;\n\n\t\tconst HAS_MAP = !! material.map;\n\t\tconst HAS_MATCAP = !! material.matcap;\n\t\tconst HAS_ENVMAP = !! envMap;\n\t\tconst HAS_AOMAP = !! material.aoMap;\n\t\tconst HAS_LIGHTMAP = !! material.lightMap;\n\t\tconst HAS_BUMPMAP = !! material.bumpMap;\n\t\tconst HAS_NORMALMAP = !! material.normalMap;\n\t\tconst HAS_DISPLACEMENTMAP = !! material.displacementMap;\n\t\tconst HAS_EMISSIVEMAP = !! material.emissiveMap;\n\n\t\tconst HAS_METALNESSMAP = !! material.metalnessMap;\n\t\tconst HAS_ROUGHNESSMAP = !! material.roughnessMap;\n\n\t\tconst HAS_ANISOTROPY = material.anisotropy > 0;\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\t\tconst HAS_DISPERSION = material.dispersion > 0;\n\t\tconst HAS_IRIDESCENCE = material.iridescence > 0;\n\t\tconst HAS_SHEEN = material.sheen > 0;\n\t\tconst HAS_TRANSMISSION = material.transmission > 0;\n\n\t\tconst HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap;\n\n\t\tconst HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap;\n\t\tconst HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap;\n\n\t\tconst HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap;\n\t\tconst HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap;\n\n\t\tconst HAS_SPECULARMAP = !! material.specularMap;\n\t\tconst HAS_SPECULAR_COLORMAP = !! material.specularColorMap;\n\t\tconst HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap;\n\n\t\tconst HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap;\n\t\tconst HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap;\n\n\t\tconst HAS_GRADIENTMAP = !! material.gradientMap;\n\n\t\tconst HAS_ALPHAMAP = !! material.alphaMap;\n\n\t\tconst HAS_ALPHATEST = material.alphaTest > 0;\n\n\t\tconst HAS_ALPHAHASH = !! material.alphaHash;\n\n\t\tconst HAS_EXTENSIONS = !! material.extensions;\n\n\t\tlet toneMapping = NoToneMapping;\n\n\t\tif ( material.toneMapped ) {\n\n\t\t\tif ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\ttoneMapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst parameters = {\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderType: material.type,\n\t\t\tshaderName: material.name,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tbatching: IS_BATCHEDMESH,\n\t\t\tbatchingColor: IS_BATCHEDMESH && object._colorsTexture !== null,\n\t\t\tinstancing: IS_INSTANCEDMESH,\n\t\t\tinstancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,\n\t\t\tinstancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null,\n\n\t\t\tsupportsVertexTextures: SUPPORTS_VERTEX_TEXTURES,\n\t\t\toutputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),\n\t\t\talphaToCoverage: !! material.alphaToCoverage,\n\n\t\t\tmap: HAS_MAP,\n\t\t\tmatcap: HAS_MATCAP,\n\t\t\tenvMap: HAS_ENVMAP,\n\t\t\tenvMapMode: HAS_ENVMAP && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\taoMap: HAS_AOMAP,\n\t\t\tlightMap: HAS_LIGHTMAP,\n\t\t\tbumpMap: HAS_BUMPMAP,\n\t\t\tnormalMap: HAS_NORMALMAP,\n\t\t\tdisplacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP,\n\t\t\temissiveMap: HAS_EMISSIVEMAP,\n\n\t\t\tnormalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,\n\t\t\tnormalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tmetalnessMap: HAS_METALNESSMAP,\n\t\t\troughnessMap: HAS_ROUGHNESSMAP,\n\n\t\t\tanisotropy: HAS_ANISOTROPY,\n\t\t\tanisotropyMap: HAS_ANISOTROPYMAP,\n\n\t\t\tclearcoat: HAS_CLEARCOAT,\n\t\t\tclearcoatMap: HAS_CLEARCOATMAP,\n\t\t\tclearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,\n\t\t\tclearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,\n\n\t\t\tdispersion: HAS_DISPERSION,\n\n\t\t\tiridescence: HAS_IRIDESCENCE,\n\t\t\tiridescenceMap: HAS_IRIDESCENCEMAP,\n\t\t\tiridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,\n\n\t\t\tsheen: HAS_SHEEN,\n\t\t\tsheenColorMap: HAS_SHEEN_COLORMAP,\n\t\t\tsheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP,\n\n\t\t\tspecularMap: HAS_SPECULARMAP,\n\t\t\tspecularColorMap: HAS_SPECULAR_COLORMAP,\n\t\t\tspecularIntensityMap: HAS_SPECULAR_INTENSITYMAP,\n\n\t\t\ttransmission: HAS_TRANSMISSION,\n\t\t\ttransmissionMap: HAS_TRANSMISSIONMAP,\n\t\t\tthicknessMap: HAS_THICKNESSMAP,\n\n\t\t\tgradientMap: HAS_GRADIENTMAP,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false,\n\n\t\t\talphaMap: HAS_ALPHAMAP,\n\t\t\talphaTest: HAS_ALPHATEST,\n\t\t\talphaHash: HAS_ALPHAHASH,\n\n\t\t\tcombine: material.combine,\n\n\t\t\t//\n\n\t\t\tmapUv: HAS_MAP && getChannel( material.map.channel ),\n\t\t\taoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ),\n\t\t\tlightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ),\n\t\t\tbumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ),\n\t\t\tnormalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ),\n\t\t\tdisplacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ),\n\t\t\temissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ),\n\n\t\t\tmetalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ),\n\t\t\troughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ),\n\n\t\t\tanisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ),\n\n\t\t\tclearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ),\n\t\t\tclearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ),\n\t\t\tclearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ),\n\n\t\t\tiridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ),\n\t\t\tiridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ),\n\n\t\t\tsheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ),\n\t\t\tsheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ),\n\n\t\t\tspecularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ),\n\t\t\tspecularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ),\n\t\t\tspecularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ),\n\n\t\t\ttransmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ),\n\t\t\tthicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ),\n\n\t\t\talphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ),\n\n\t\t\t//\n\n\t\t\tvertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\n\t\t\tpointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ),\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( !! fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: ( material.flatShading === true && material.wireframe === false ),\n\n\t\t\tsizeAttenuation: material.sizeAttenuation === true,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumSpotLightMaps: lights.spotLightMap.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\t\t\tnumSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,\n\n\t\t\tnumLightProbes: lights.numLightProbes,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: toneMapping,\n\n\t\t\tdecodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ),\n\t\t\tdecodeVideoTextureEmissive: HAS_EMISSIVEMAP && ( material.emissiveMap.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.emissiveMap.colorSpace ) === SRGBTransfer ),\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: material.depthPacking >= 0,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),\n\t\t\textensionMultiDraw: ( HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH ) && extensions.has( 'WEBGL_multi_draw' ),\n\n\t\t\trendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\t// the usage of getChannel() determines the active texture channels for this shader\n\n\t\tparameters.vertexUv1s = _activeChannels.has( 1 );\n\t\tparameters.vertexUv2s = _activeChannels.has( 2 );\n\t\tparameters.vertexUv3s = _activeChannels.has( 3 );\n\n\t\t_activeChannels.clear();\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputColorSpace );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputColorSpace );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.mapUv );\n\t\tarray.push( parameters.alphaMapUv );\n\t\tarray.push( parameters.lightMapUv );\n\t\tarray.push( parameters.aoMapUv );\n\t\tarray.push( parameters.bumpMapUv );\n\t\tarray.push( parameters.normalMapUv );\n\t\tarray.push( parameters.displacementMapUv );\n\t\tarray.push( parameters.emissiveMapUv );\n\t\tarray.push( parameters.metalnessMapUv );\n\t\tarray.push( parameters.roughnessMapUv );\n\t\tarray.push( parameters.anisotropyMapUv );\n\t\tarray.push( parameters.clearcoatMapUv );\n\t\tarray.push( parameters.clearcoatNormalMapUv );\n\t\tarray.push( parameters.clearcoatRoughnessMapUv );\n\t\tarray.push( parameters.iridescenceMapUv );\n\t\tarray.push( parameters.iridescenceThicknessMapUv );\n\t\tarray.push( parameters.sheenColorMapUv );\n\t\tarray.push( parameters.sheenRoughnessMapUv );\n\t\tarray.push( parameters.specularMapUv );\n\t\tarray.push( parameters.specularColorMapUv );\n\t\tarray.push( parameters.specularIntensityMapUv );\n\t\tarray.push( parameters.transmissionMapUv );\n\t\tarray.push( parameters.thicknessMapUv );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numSpotLightMaps );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.numSpotLightShadowsWithMaps );\n\t\tarray.push( parameters.numLightProbes );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingMorph )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.normalMapObjectSpace )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.normalMapTangentSpace )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.vertexUv1s )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.vertexUv2s )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.vertexUv3s )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.anisotropy )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.alphaHash )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.batching )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.dispersion )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.batchingColor )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 22 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.reversedDepthBuffer )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.pointsUvs )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.decodeVideoTextureEmissive )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.alphaToCoverage )\n\t\t\t_programLayers.enable( 21 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction has( object ) {\n\n\t\treturn properties.has( object );\n\n\t}\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\thas: has,\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tconst listArray = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( listArray === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= listArray.length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlistArray.push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = listArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingAndTexturingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: -1,\n\t\t\tpointLength: -1,\n\t\t\tspotLength: -1,\n\t\t\trectAreaLength: -1,\n\t\t\themiLength: -1,\n\n\t\t\tnumDirectionalShadows: -1,\n\t\t\tnumPointShadows: -1,\n\t\t\tnumSpotShadows: -1,\n\t\t\tnumSpotMaps: -1,\n\n\t\t\tnumLightProbes: -1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotLightMap: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotLightMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: [],\n\t\tnumSpotLightShadowsWithMaps: 0,\n\t\tnumLightProbes: 0\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\t\tlet numSpotMaps = 0;\n\t\tlet numSpotShadowsWithMaps = 0;\n\n\t\tlet numLightProbes = 0;\n\n\t\t// ordering : [shadow casting + map texturing, map texturing, shadow casting, none ]\n\t\tlights.sort( shadowCastingAndTexturingLightsFirst );\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t\tnumLightProbes ++;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\tif ( light.map ) {\n\n\t\t\t\t\tstate.spotLightMap[ numSpotMaps ] = light.map;\n\t\t\t\t\tnumSpotMaps ++;\n\n\t\t\t\t\t// make sure the lightMatrix is up to date\n\t\t\t\t\t// TODO : do it if required only\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t\tif ( light.castShadow ) numSpotShadowsWithMaps ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotLightMatrix[ spotLength ] = shadow.matrix;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ||\n\t\t\thash.numSpotMaps !== numSpotMaps ||\n\t\t\thash.numLightProbes !== numLightProbes ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps;\n\t\t\tstate.spotLightMap.length = numSpotMaps;\n\t\t\tstate.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps;\n\t\t\tstate.numLightProbes = numLightProbes;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\t\t\thash.numSpotMaps = numSpotMaps;\n\n\t\t\thash.numLightProbes = numLightProbes;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions ) {\n\n\tconst lights = new WebGLLights( extensions );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init( camera ) {\n\n\t\tstate.camera = camera;\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights() {\n\n\t\tlights.setup( lightsArray );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tcamera: null,\n\n\t\tlights: lights,\n\n\t\ttransmissionRenderTarget: {}\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tconst renderStateArray = renderStates.get( scene );\n\t\tlet renderState;\n\n\t\tif ( renderStateArray === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStateArray.length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\t\trenderStateArray.push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStateArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include \\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( renderer, objects, capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = capabilities.maxTextureSize;\n\n\tconst shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ -1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\tlet _previousType = this.type;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst activeCubeFace = renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst _state = renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\n\t\tif ( _state.buffers.depth.getReversed() === true ) {\n\n\t\t\t_state.buffers.color.setClear( 0, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\n\t\t}\n\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// check for shadow map type changes\n\n\t\tconst toVSM = ( _previousType !== VSMShadowMap && this.type === VSMShadowMap );\n\t\tconst fromVSM = ( _previousType === VSMShadowMap && this.type !== VSMShadowMap );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\twarn( 'WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null || toVSM === true || fromVSM === true ) {\n\n\t\t\t\tconst pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {};\n\n\t\t\t\tif ( shadow.map !== null ) {\n\n\t\t\t\t\tshadow.map.dispose();\n\n\t\t\t\t}\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\trenderer.setRenderTarget( shadow.map );\n\t\t\trenderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\t_previousType = this.type;\n\n\t\tscope.needsUpdate = false;\n\n\t\trenderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.mapPass );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.map );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t\tif ( ( renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t\t( material.alphaMap && material.alphaTest > 0 ) ||\n\t\t\t\t( material.map && material.alphaTest > 0 ) ||\n\t\t\t\t( material.alphaToCoverage === true ) ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\t\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = ( material.alphaToCoverage === true ) ? 0.5 : material.alphaTest; // approximate alphaToCoverage by using a fixed alphaTest value\n\t\tresult.map = material.map;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tconst materialProperties = renderer.properties.get( result );\n\t\t\tmaterialProperties.light = light;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, type );\n\n\t\t\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, type );\n\n\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t// make sure to remove the unique distance/depth materials used for shadow map rendering\n\n\t\tfor ( const id in _materialCache ) {\n\n\t\t\tconst cache = _materialCache[ id ];\n\n\t\t\tconst uuid = event.target.uuid;\n\n\t\t\tif ( uuid in cache ) {\n\n\t\t\t\tconst shadowMaterial = cache[ uuid ];\n\t\t\t\tshadowMaterial.dispose();\n\t\t\t\tdelete cache[ uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nconst reversedFuncs = {\n\t[ NeverDepth ]: AlwaysDepth,\n\t[ LessDepth ]: GreaterDepth,\n\t[ EqualDepth ]: NotEqualDepth,\n\t[ LessEqualDepth ]: GreaterEqualDepth,\n\n\t[ AlwaysDepth ]: NeverDepth,\n\t[ GreaterDepth ]: LessDepth,\n\t[ NotEqualDepth ]: EqualDepth,\n\t[ GreaterEqualDepth ]: LessEqualDepth,\n};\n\nfunction WebGLState( gl, extensions ) {\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( -1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentReversed = false;\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetReversed: function ( reversed ) {\n\n\t\t\t\tif ( currentReversed !== reversed ) {\n\n\t\t\t\t\tconst ext = extensions.get( 'EXT_clip_control' );\n\n\t\t\t\t\tif ( reversed ) {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.NEGATIVE_ONE_TO_ONE_EXT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentReversed = reversed;\n\n\t\t\t\t\tconst oldDepth = currentDepthClear;\n\t\t\t\t\tcurrentDepthClear = null;\n\t\t\t\t\tthis.setClear( oldDepth );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tgetReversed: function () {\n\n\t\t\t\treturn currentReversed;\n\n\t\t\t},\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentReversed ) depthFunc = reversedFuncs[ depthFunc ];\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tif ( currentReversed ) {\n\n\t\t\t\t\t\tdepth = 1 - depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\t\t\t\tcurrentReversed = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef !== stencilRef ||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgramMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentBlendColor = new Color( 0, 0, 0 );\n\tlet currentBlendAlpha = 0;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count, dimensions ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tif ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tgl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t} else {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\temptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 );\n\temptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t}\n\n\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t}\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tequationToGL[ MinEquation ] = gl.MIN;\n\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA,\n\t\t[ ConstantColorFactor ]: gl.CONSTANT_COLOR,\n\t\t[ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR,\n\t\t[ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA,\n\t\t[ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: SubtractiveBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: MultiplyBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\t\t\t\tcurrentBlendColor.set( 0, 0, 0 );\n\t\t\t\tcurrentBlendAlpha = 0;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tif ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) {\n\n\t\t\tgl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha );\n\n\t\t\tcurrentBlendColor.copy( blendColor );\n\t\t\tcurrentBlendAlpha = blendAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = false;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture, webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgramMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgramMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgramMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( program ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( program, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\t\tgl.blendColor( 0, 0, 0, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\n\t\tdepthBuffer.setReversed( false );\n\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentBlendColor = new Color( 0, 0, 0 );\n\t\tcurrentBlendAlpha = 0;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\tcompressedTexImage3D: compressedTexImage3D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\t\tcompressedTexSubImage3D: compressedTexSubImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _imageDimensions = new Vector2();\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\tconst dimensions = getDimensions( image );\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( dimensions.width > maxSize || dimensions.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( dimensions.width, dimensions.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) ) {\n\n\t\t\t\tconst width = Math.floor( scale * dimensions.width );\n\t\t\t\tconst height = Math.floor( scale * dimensions.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\twarn( 'WebGLRenderer: Texture has been resized from (' + dimensions.width + 'x' + dimensions.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\twarn( 'WebGLRenderer: Image in DataTexture is too big (' + dimensions.width + 'x' + dimensions.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture ) {\n\n\t\treturn texture.generateMipmaps;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getTargetType( texture ) {\n\n\t\tif ( texture.isWebGLCubeRenderTarget ) return _gl.TEXTURE_CUBE_MAP;\n\t\tif ( texture.isWebGL3DRenderTarget ) return _gl.TEXTURE_3D;\n\t\tif ( texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture ) return _gl.TEXTURE_2D_ARRAY;\n\t\treturn _gl.TEXTURE_2D;\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) {\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\twarn( 'WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RED_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.R8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.R16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RG16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RG32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RG8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RG16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RG32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGB8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGB16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGB32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGB8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGB16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGB32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGBA8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGBA16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGBA32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGBA8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGBA16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGBA32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = _gl.RGB9_E5;\n\t\t\tif ( glType === _gl.UNSIGNED_INT_10F_11F_11F_REV ) internalFormat = _gl.R11F_G11F_B10F;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getInternalDepthFormat( useStencil, depthType ) {\n\n\t\tlet glInternalFormat;\n\t\tif ( useStencil ) {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH32F_STENCIL8;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\t\t\t\twarn( 'DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.' );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn glInternalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\tproperties.remove( renderTarget.depthTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {\n\n\t\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {\n\n\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\tinfo.memory.textures --;\n\n\t\t\t}\n\n\t\t\tproperties.remove( textures[ i ] );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\twarn( 'WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.wrapR || 0 );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.colorSpace );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.isExternalTexture !== true && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tconst compareToGL = {\n\t\t[ NeverCompare ]: _gl.NEVER,\n\t\t[ AlwaysCompare ]: _gl.ALWAYS,\n\t\t[ LessCompare ]: _gl.LESS,\n\t\t[ LessEqualCompare ]: _gl.LEQUAL,\n\t\t[ EqualCompare ]: _gl.EQUAL,\n\t\t[ GreaterEqualCompare ]: _gl.GEQUAL,\n\t\t[ GreaterCompare ]: _gl.GREATER,\n\t\t[ NotEqualCompare ]: _gl.NOTEQUAL\n\t};\n\n\tfunction setTextureParameters( textureType, texture ) {\n\n\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false &&\n\t\t\t( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter ||\n\t\t\ttexture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter ) ) {\n\n\t\t\twarn( 'WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device.' );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\tif ( texture.compareFunction ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] );\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction getRow( index, rowLength, componentStride ) {\n\n\t\treturn Math.floor( Math.floor( index / componentStride ) / rowLength );\n\n\t}\n\n\tfunction updateTexture( texture, image, glFormat, glType ) {\n\n\t\tconst componentStride = 4; // only RGBA supported\n\n\t\tconst updateRanges = texture.updateRanges;\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.texSubImage2D`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// Only merge if in the same row and overlapping/adjacent\n\t\t\t\tconst previousEnd = previousRange.start + previousRange.count;\n\t\t\t\tconst currentRow = getRow( range.start, image.width, componentStride );\n\t\t\t\tconst previousRow = getRow( previousRange.start, image.width, componentStride );\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif (\n\t\t\t\t\trange.start <= previousEnd + 1 &&\n\t\t\t\t\tcurrentRow === previousRow &&\n\t\t\t\t\tgetRow( range.start + range.count - 1, image.width, componentStride ) === currentRow // ensure range doesn't spill\n\t\t\t\t) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tconst pixelStart = Math.floor( range.start / componentStride );\n\t\t\t\tconst pixelCount = Math.ceil( range.count / componentStride );\n\n\t\t\t\tconst x = pixelStart % image.width;\n\t\t\t\tconst y = Math.floor( pixelStart / image.width );\n\n\t\t\t\t// Assumes update ranges refer to contiguous memory\n\t\t\t\tconst width = pixelCount;\n\t\t\t\tconst height = 1;\n\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, x );\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, y );\n\n\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, x, y, width, height, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t\ttexture.clearUpdateRanges();\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tlet image = resizeImage( texture.image, false, capabilities.maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tlet glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tconst levels = getMipLevels( texture, image );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\tglInternalFormat = getInternalDepthFormat( texture.format === DepthStencilFormat, texture.type );\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tupdateTexture( texture, image, glFormat, glType );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tconst layerData = mipmap.data.subarray(\n\t\t\t\t\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData );\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\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} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\tconst layerByteLength = getByteLength( image.width, image.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\tconst layerData = image.data.subarray(\n\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / image.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\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} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tconst dimensions = getDimensions( mipmaps[ 0 ] );\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tconst dimensions = getDimensions( image );\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], true, capabilities.maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tglFormat = utils.convert( texture.format, texture.colorSpace ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tlet levels = getMipLevels( texture, image );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\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} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tconst dimensions = getDimensions( cubeImage[ 0 ] );\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\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\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tconst width = Math.max( 1, renderTarget.width >> level );\n\t\t\tconst height = Math.max( 1, renderTarget.height >> level );\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, level );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t// retrieve the depth attachment types\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tconst depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null;\n\t\t\tconst glInternalFormat = getInternalDepthFormat( renderTarget.stencilBuffer, depthType );\n\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t// set up the attachment\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\tconst isUseMultisampledRTT = useMultisampledRTT( renderTarget );\n\t\t\tif ( isUseMultisampledRTT ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( isMultisample ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\tconst textureProperties = properties.get( renderTarget.depthTexture );\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! textureProperties.__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = textureProperties.__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\t// if the bound depth texture has changed\n\t\tif ( renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture ) {\n\n\t\t\t// fire the dispose event to get rid of stored state associated with the previously bound depth buffer\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tif ( renderTargetProperties.__depthDisposeCallback ) {\n\n\t\t\t\trenderTargetProperties.__depthDisposeCallback();\n\n\t\t\t}\n\n\t\t\t// set up dispose listeners to track when the currently attached buffer is implicitly unbound\n\t\t\tif ( depthTexture ) {\n\n\t\t\t\tconst disposeEvent = () => {\n\n\t\t\t\t\tdelete renderTargetProperties.__boundDepthTexture;\n\t\t\t\t\tdelete renderTargetProperties.__depthDisposeCallback;\n\t\t\t\t\tdepthTexture.removeEventListener( 'dispose', disposeEvent );\n\n\t\t\t\t};\n\n\t\t\t\tdepthTexture.addEventListener( 'dispose', disposeEvent );\n\t\t\t\trenderTargetProperties.__depthDisposeCallback = disposeEvent;\n\n\t\t\t}\n\n\t\t\trenderTargetProperties.__boundDepthTexture = depthTexture;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer[ 0 ], renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer[ i ] === undefined ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer[ i ];\n\t\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer === undefined ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer;\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\tif ( ! isMultipleRenderTargets ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = [];\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindTexture( glTextureType, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( glTextureType, attachment );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, glTextureType, 0 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment ) ) {\n\n\t\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture );\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tconst targetType = getTargetType( renderTarget );\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( targetType, webglTexture );\n\t\t\t\tgenerateMipmap( targetType );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst invalidationArrayRead = [];\n\tconst invalidationArrayDraw = [];\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.samples > 0 ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tconst textures = renderTarget.textures;\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\t\t\t// If MRT we need to remove FBO attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTarget.resolveDepthBuffer ) {\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t\t\t\t// resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)\n\n\t\t\t\t\t\tif ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\n\t\t\t\t\tif ( supportsInvalidateFramebuffer === true ) {\n\n\t\t\t\t\t\tinvalidationArrayRead.length = 0;\n\t\t\t\t\t\tinvalidationArrayDraw.length = 0;\n\n\t\t\t\t\t\tinvalidationArrayRead.push( _gl.COLOR_ATTACHMENT0 + i );\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false ) {\n\n\t\t\t\t\t\t\tinvalidationArrayRead.push( depthStyle );\n\t\t\t\t\t\t\tinvalidationArrayDraw.push( depthStyle );\n\n\t\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, invalidationArrayDraw );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArrayRead );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t} else {\n\n\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( capabilities.maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst colorSpace = texture.colorSpace;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true ) return image;\n\n\t\tif ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) {\n\n\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\twarn( 'WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\terror( 'WebGLTextures: Unsupported texture color space:', colorSpace );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction getDimensions( image ) {\n\n\t\tif ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) {\n\n\t\t\t// if intrinsic data are not available, fallback to width/height\n\n\t\t\t_imageDimensions.width = image.naturalWidth || image.width;\n\t\t\t_imageDimensions.height = image.naturalHeight || image.height;\n\n\t\t} else if ( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) {\n\n\t\t\t_imageDimensions.width = image.displayWidth;\n\t\t\t_imageDimensions.height = image.displayHeight;\n\n\t\t} else {\n\n\t\t\t_imageDimensions.width = image.width;\n\t\t\t_imageDimensions.height = image.height;\n\n\t\t}\n\n\t\treturn _imageDimensions;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions ) {\n\n\tfunction convert( p, colorSpace = NoColorSpace ) {\n\n\t\tlet extension;\n\n\t\tconst transfer = ColorManagement.getTransfer( colorSpace );\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedInt5999Type ) return gl.UNSIGNED_INT_5_9_9_9_REV;\n\t\tif ( p === UnsignedInt101111Type ) return gl.UNSIGNED_INT_10F_11F_11F_REV;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\t\tif ( p === HalfFloatType ) return gl.HALF_FLOAT;\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return gl.RED;\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( transfer === SRGBTransfer ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC\n\n\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RED_RGTC1_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) return gl.UNSIGNED_INT_24_8;\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nconst _occlusion_vertex = `\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}`;\n\nconst _occlusion_fragment = `\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}`;\n\n/**\n * A XR module that manages the access to the Depth Sensing API.\n */\nclass WebXRDepthSensing {\n\n\t/**\n\t * Constructs a new depth sensing module.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * An opaque texture representing the depth of the user's environment.\n\t\t *\n\t\t * @type {?ExternalTexture}\n\t\t */\n\t\tthis.texture = null;\n\n\t\t/**\n\t\t * A plane mesh for visualizing the depth texture.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t */\n\t\tthis.mesh = null;\n\n\t\t/**\n\t\t * The depth near value.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthNear = 0;\n\n\t\t/**\n\t\t * The depth near far.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthFar = 0;\n\n\t}\n\n\t/**\n\t * Inits the depth sensing module\n\t *\n\t * @param {XRWebGLDepthInformation} depthData - The XR depth data.\n\t * @param {XRRenderState} renderState - The XR render state.\n\t */\n\tinit( depthData, renderState ) {\n\n\t\tif ( this.texture === null ) {\n\n\t\t\tconst texture = new ExternalTexture( depthData.texture );\n\n\t\t\tif ( ( depthData.depthNear !== renderState.depthNear ) || ( depthData.depthFar !== renderState.depthFar ) ) {\n\n\t\t\t\tthis.depthNear = depthData.depthNear;\n\t\t\t\tthis.depthFar = depthData.depthFar;\n\n\t\t\t}\n\n\t\t\tthis.texture = texture;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a plane mesh that visualizes the depth texture.\n\t *\n\t * @param {ArrayCamera} cameraXR - The XR camera.\n\t * @return {?Mesh} The plane mesh.\n\t */\n\tgetMesh( cameraXR ) {\n\n\t\tif ( this.texture !== null ) {\n\n\t\t\tif ( this.mesh === null ) {\n\n\t\t\t\tconst viewport = cameraXR.cameras[ 0 ].viewport;\n\t\t\t\tconst material = new ShaderMaterial( {\n\t\t\t\t\tvertexShader: _occlusion_vertex,\n\t\t\t\t\tfragmentShader: _occlusion_fragment,\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tdepthColor: { value: this.texture },\n\t\t\t\t\t\tdepthWidth: { value: viewport.z },\n\t\t\t\t\t\tdepthHeight: { value: viewport.w }\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.mesh = new Mesh( new PlaneGeometry( 20, 20 ), material );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this.mesh;\n\n\t}\n\n\t/**\n\t * Resets the module\n\t */\n\treset() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t}\n\n\t/**\n\t * Returns a texture representing the depth of the user's environment.\n\t *\n\t * @return {?ExternalTexture} The depth texture.\n\t */\n\tgetDepthTexture() {\n\n\t\treturn this.texture;\n\n\t}\n\n}\n\n/**\n * This class represents an abstraction of the WebXR Device API and is\n * internally used by {@link WebGLRenderer}. `WebXRManager` also provides a public\n * interface that allows users to enable/disable XR and perform XR related\n * tasks like for instance retrieving controllers.\n *\n * @augments EventDispatcher\n * @hideconstructor\n */\nclass WebXRManager extends EventDispatcher {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGL2RenderingContext} gl - The rendering context.\n\t */\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\t// Set default foveation to maximum.\n\t\tlet foveation = 1.0;\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\n\t\tconst supportsGlBinding = typeof XRWebGLBinding !== 'undefined';\n\n\t\tconst depthSensing = new WebXRDepthSensing();\n\t\tconst cameraAccessTextures = {};\n\t\tconst attributes = gl.getContextAttributes();\n\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\tconst currentSize = new Vector2();\n\t\tlet currentPixelRatio = null;\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraXR = new ArrayCamera();\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\t/**\n\t\t * Whether the manager's XR camera should be automatically updated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.cameraAutoUpdate = true;\n\n\t\t/**\n\t\t * This flag notifies the renderer to be ready for XR rendering. Set it to `true`\n\t\t * if you are going to use XR in your app.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enabled = false;\n\n\t\t/**\n\t\t * Whether XR presentation is active or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPresenting = false;\n\n\t\t/**\n\t\t * Returns a group representing the `target ray` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `target ray` space.\n\t\t */\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `grip` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * Note: If you want to show something in the user's hand AND offer a\n\t\t * pointing ray at the same time, you'll want to attached the handheld object\n\t\t * to the group returned by `getControllerGrip()` and the ray to the\n\t\t * group returned by `getController()`. The idea is to have two\n\t\t * different groups in two different coordinate spaces for the same WebXR\n\t\t * controller.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `grip` space.\n\t\t */\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `hand` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `hand` space.\n\t\t */\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace );\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\tdepthSensing.reset();\n\t\t\tfor ( const key in cameraAccessTextures ) {\n\n\t\t\t\tdelete cameraAccessTextures[ key ];\n\n\t\t\t}\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\trenderer.setPixelRatio( currentPixelRatio );\n\t\t\trenderer.setSize( currentSize.width, currentSize.height, false );\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\t/**\n\t\t * Sets the framebuffer scale factor.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {number} value - The framebuffer scale factor.\n\t\t */\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the reference space type. Can be used to configure a spatial relationship with the user's physical\n\t\t * environment. Depending on how the user moves in 3D space, setting an appropriate reference space can\n\t\t * improve tracking. Default is `local-floor`. Valid values can be found here\n\t\t * https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpace#reference_space_types.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {string} value - The reference space type.\n\t\t */\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the XR reference space.\n\t\t *\n\t\t * @return {XRReferenceSpace} The XR reference space.\n\t\t */\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom XR reference space.\n\t\t *\n\t\t * @param {XRReferenceSpace} space - The XR reference space.\n\t\t */\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current base layer.\n\t\t *\n\t\t * This is an `XRProjectionLayer` when the targeted XR device supports the\n\t\t * WebXR Layers API, or an `XRWebGLLayer` otherwise.\n\t\t *\n\t\t * @return {?(XRWebGLLayer|XRProjectionLayer)} The XR base layer.\n\t\t */\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR binding.\n\t\t *\n\t\t * Creates a new binding if needed and the browser is\n\t\t * capable of doing so.\n\t\t *\n\t\t * @return {?XRWebGLBinding} The XR binding. Returns `null` if one cannot be created.\n\t\t */\n\t\tthis.getBinding = function () {\n\n\t\t\tif ( glBinding === null && supportsGlBinding ) {\n\n\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t}\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR frame.\n\t\t *\n\t\t * @return {?XRFrame} The XR frame. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR session.\n\t\t *\n\t\t * @return {?XRSession} The XR session. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\t/**\n\t\t * After a XR session has been requested usually with one of the `*Button` modules, it\n\t\t * is injected into the renderer with this method. This method triggers the start of\n\t\t * the actual XR rendering.\n\t\t *\n\t\t * @async\n\t\t * @param {XRSession} value - The XR session to set.\n\t\t * @return {Promise} A Promise that resolves when the session has been set.\n\t\t */\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\t\trenderer.getSize( currentSize );\n\n\n\t\t\t\t// Check that the browser implements the necessary APIs to use an\n\t\t\t\t// XRProjectionLayer rather than an XRWebGLLayer\n\t\t\t\tconst supportsLayers = supportsGlBinding && 'createProjectionLayer' in XRWebGLBinding.prototype;\n\n\t\t\t\tif ( ! supportsLayers ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: attributes.antialias,\n\t\t\t\t\t\talpha: true,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glBaseLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glBaseLayer.ignoreDepthValues === false )\n\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = this.getBinding();\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glProjLayer.ignoreDepthValues === false )\n\t\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\tthis.setFoveation( foveation );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the environment blend mode from the current XR session.\n\t\t *\n\t\t * @return {'opaque'|'additive'|'alpha-blend'|undefined} The environment blend mode. Returns `undefined` when used outside of a XR session.\n\t\t */\n\t\tthis.getEnvironmentBlendMode = function () {\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\treturn session.environmentBlendMode;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current depth texture computed via depth sensing.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getDepthTexture}.\n\t\t *\n\t\t * @return {?Texture} The depth texture.\n\t\t */\n\t\tthis.getDepthTexture = function () {\n\n\t\t\treturn depthSensing.getDepthTexture();\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === -1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.connect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t *\n\t\t * @param {ArrayCamera} camera - The camera to update.\n\t\t * @param {PerspectiveCamera} cameraL - The left camera.\n\t\t * @param {PerspectiveCamera} cameraR - The right camera.\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Check if the projection uses an infinite far plane.\n\t\t\tif ( projL[ 10 ] === -1 ) {\n\n\t\t\t\t// Use the projection matrix from the left eye.\n\t\t\t\t// The camera offset is sufficient to include the view volumes\n\t\t\t\t// of both eyes (assuming symmetric projections).\n\t\t\t\tcamera.projectionMatrix.copy( cameraL.projectionMatrix );\n\t\t\t\tcamera.projectionMatrixInverse.copy( cameraL.projectionMatrixInverse );\n\n\t\t\t} else {\n\n\t\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t\t// although must now be relative to the new union camera.\n\t\t\t\tconst near2 = near + zOffset;\n\t\t\t\tconst far2 = far + zOffset;\n\t\t\t\tconst left2 = left - xOffset;\n\t\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\t/**\n\t\t * Updates the state of the XR camera. Use this method on app level if you\n\t\t * set `cameraAutoUpdate` to `false`. The method requires the non-XR\n\t\t * camera of the scene as a parameter. The passed in camera's transformation\n\t\t * is automatically adjusted to the position of the XR camera when calling\n\t\t * this method.\n\t\t *\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tlet depthNear = camera.near;\n\t\t\tlet depthFar = camera.far;\n\n\t\t\tif ( depthSensing.texture !== null ) {\n\n\t\t\t\tif ( depthSensing.depthNear > 0 ) depthNear = depthSensing.depthNear;\n\t\t\t\tif ( depthSensing.depthFar > 0 ) depthFar = depthSensing.depthFar;\n\n\t\t\t}\n\n\t\t\tcameraXR.near = cameraR.near = cameraL.near = depthNear;\n\t\t\tcameraXR.far = cameraR.far = cameraL.far = depthFar;\n\n\t\t\tif ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraXR.near,\n\t\t\t\t\tdepthFar: cameraXR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraXR.near;\n\t\t\t\t_currentDepthFar = cameraXR.far;\n\n\t\t\t}\n\n\t\t\t// inherit camera layers and enable eye layers (1 = left, 2 = right)\n\t\t\tcameraXR.layers.mask = camera.layers.mask | 0b110;\n\t\t\tcameraL.layers.mask = cameraXR.layers.mask & 0b011;\n\t\t\tcameraR.layers.mask = cameraXR.layers.mask & 0b101;\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraXR.cameras;\n\n\t\t\tupdateCamera( cameraXR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraXR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraXR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t\t// update user camera and its children\n\n\t\t\tupdateUserCamera( camera, cameraXR, parent );\n\n\t\t};\n\n\t\tfunction updateUserCamera( camera, cameraXR, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrix.copy( cameraXR.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrix.copy( parent.matrixWorld );\n\t\t\t\tcamera.matrix.invert();\n\t\t\t\tcamera.matrix.multiply( cameraXR.matrixWorld );\n\n\t\t\t}\n\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.updateMatrixWorld( true );\n\n\t\t\tcamera.projectionMatrix.copy( cameraXR.projectionMatrix );\n\t\t\tcamera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );\n\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tcamera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );\n\t\t\t\tcamera.zoom = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Returns an instance of {@link ArrayCamera} which represents the XR camera\n\t\t * of the active XR session. For each view it holds a separate camera object.\n\t\t *\n\t\t * The camera's `fov` is currently not used and does not reflect the fov of\n\t\t * the XR camera. If you need the fov on app level, you have to compute in\n\t\t * manually from the XR camera's projection matrices.\n\t\t *\n\t\t * @return {ArrayCamera} The XR camera.\n\t\t */\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraXR;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the amount of foveation used by the XR compositor for the projection layer.\n\t\t *\n\t\t * @return {number|undefined} The amount of foveation.\n\t\t */\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer === null && glBaseLayer === null ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn foveation;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the foveation value.\n\t\t *\n\t\t * @param {number} value - A number in the range `[0,1]` where `0` means no foveation (full resolution)\n\t\t * and `1` means maximum foveation (the edges render at lower resolution).\n\t\t */\n\t\tthis.setFoveation = function ( value ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tfoveation = value;\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if depth sensing is supported.\n\t\t *\n\t\t * @return {boolean} Whether depth sensing is supported or not.\n\t\t */\n\t\tthis.hasDepthSensing = function () {\n\n\t\t\treturn depthSensing.texture !== null;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the depth sensing mesh.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getMesh}.\n\t\t *\n\t\t * @return {Mesh} The depth sensing mesh.\n\t\t */\n\t\tthis.getDepthSensingMesh = function () {\n\n\t\t\treturn depthSensing.getMesh( cameraXR );\n\n\t\t};\n\n\t\t/**\n\t\t * Retrieves an opaque texture from the view-aligned {@link XRCamera}.\n\t\t * Only available during the current animation loop.\n\t\t *\n\t\t * @param {XRCamera} xrCamera - The camera to query.\n\t\t * @return {?Texture} An opaque texture representing the current raw camera frame.\n\t\t */\n\t\tthis.getCameraTexture = function ( xrCamera ) {\n\n\t\t\treturn cameraAccessTextures[ xrCamera ];\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraXRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraXR's camera list\n\n\t\t\t\tif ( views.length !== cameraXR.cameras.length ) {\n\n\t\t\t\t\tcameraXR.cameras.length = 0;\n\t\t\t\t\tcameraXRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraXR.matrix.copy( camera.matrix );\n\t\t\t\t\t\tcameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraXRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraXR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tconst enabledFeatures = session.enabledFeatures;\n\t\t\t\tconst gpuDepthSensingEnabled = enabledFeatures &&\n\t\t\t\t\tenabledFeatures.includes( 'depth-sensing' ) &&\n\t\t\t\t\tsession.depthUsage == 'gpu-optimized';\n\n\t\t\t\tif ( gpuDepthSensingEnabled && supportsGlBinding ) {\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tconst depthData = glBinding.getDepthInformation( views[ 0 ] );\n\n\t\t\t\t\tif ( depthData && depthData.isValid && depthData.texture ) {\n\n\t\t\t\t\t\tdepthSensing.init( depthData, session.renderState );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst cameraAccessEnabled = enabledFeatures &&\n\t\t\t\t enabledFeatures.includes( 'camera-access' );\n\n\t\t\t\tif ( cameraAccessEnabled && supportsGlBinding ) {\n\n\t\t\t\t\trenderer.state.unbindTexture();\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\t\tconst camera = views[ i ].camera;\n\n\t\t\t\t\t\tif ( camera ) {\n\n\t\t\t\t\t\t\tlet cameraTex = cameraAccessTextures[ camera ];\n\n\t\t\t\t\t\t\tif ( ! cameraTex ) {\n\n\t\t\t\t\t\t\t\tcameraTex = new ExternalTexture();\n\t\t\t\t\t\t\t\tcameraAccessTextures[ camera ] = cameraTex;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst glTexture = glBinding.getCameraImage( camera );\n\t\t\t\t\t\t\tcameraTex.sourceTexture = glTexture;\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\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\tif ( frame.detectedPlanes ) {\n\n\t\t\t\tscope.dispatchEvent( { type: 'planesdetected', data: frame } );\n\n\t\t\t}\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nconst _e1 = /*@__PURE__*/ new Euler();\nconst _m1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshTransformUniform( map, uniform ) {\n\n\t\tif ( map.matrixAutoUpdate === true ) {\n\n\t\t\tmap.updateMatrix();\n\n\t\t}\n\n\t\tuniform.value.copy( map.matrix );\n\n\t}\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tfog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\n\t\t\trefreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform );\n\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.bumpScale.value *= -1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\n\t\t\trefreshTransformUniform( material.normalMap, uniforms.normalMapTransform );\n\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.normalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\n\t\t\trefreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform );\n\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\trefreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t\trefreshTransformUniform( material.specularMap, uniforms.specularMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst envMap = materialProperties.envMap;\n\t\tconst envMapRotation = materialProperties.envMapRotation;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\t_e1.copy( envMapRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1.x *= -1; _e1.y *= -1; _e1.z *= -1;\n\n\t\t\tif ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1.y *= -1;\n\t\t\t\t_e1.z *= -1;\n\n\t\t\t}\n\n\t\t\tuniforms.envMapRotation.value.setFromMatrix4( _m1.makeRotationFromEuler( _e1 ) );\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\trefreshTransformUniform( material.lightMap, uniforms.lightMapTransform );\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\trefreshTransformUniform( material.aoMap, uniforms.aoMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.uvTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\trefreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform );\n\n\t\t}\n\n\t\tuniforms.roughness.value = material.roughness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\trefreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform );\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform );\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.dispersion > 0 ) {\n\n\t\t\tuniforms.dispersion.value = material.dispersion;\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t\trefreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tif ( material.anisotropy > 0 ) {\n\n\t\t\tuniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );\n\n\t\t\tif ( material.anisotropyMap ) {\n\n\t\t\t\tuniforms.anisotropyMap.value = material.anisotropyMap;\n\n\t\t\t\trefreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t\trefreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t\trefreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tconst light = properties.get( material ).light;\n\n\t\tuniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld );\n\t\tuniforms.nearDistance.value = light.shadow.camera.near;\n\t\tuniforms.farDistance.value = light.shadow.camera.far;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ); // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\t\tgl.bufferData( gl.UNIFORM_BUFFER, size, usage );\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\t\tgl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === -1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\terror( 'WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tif ( hasUniformChanged( uniform, i, j, cache ) === true ) {\n\n\t\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\t\tlet arrayOffset = 0;\n\n\t\t\t\t\tfor ( let k = 0; k < values.length; k ++ ) {\n\n\t\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\t\t// TODO add integer and struct support\n\t\t\t\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data );\n\n\t\t\t\t\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value.elements[ 0 ];\n\t\t\t\t\t\t\tuniform.__data[ 1 ] = value.elements[ 1 ];\n\t\t\t\t\t\t\tuniform.__data[ 2 ] = value.elements[ 2 ];\n\t\t\t\t\t\t\tuniform.__data[ 3 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 4 ] = value.elements[ 3 ];\n\t\t\t\t\t\t\tuniform.__data[ 5 ] = value.elements[ 4 ];\n\t\t\t\t\t\t\tuniform.__data[ 6 ] = value.elements[ 5 ];\n\t\t\t\t\t\t\tuniform.__data[ 7 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 8 ] = value.elements[ 6 ];\n\t\t\t\t\t\t\tuniform.__data[ 9 ] = value.elements[ 7 ];\n\t\t\t\t\t\t\tuniform.__data[ 10 ] = value.elements[ 8 ];\n\t\t\t\t\t\t\tuniform.__data[ 11 ] = 0;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvalue.toArray( uniform.__data, arrayOffset );\n\n\t\t\t\t\t\t\tarrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, indexArray, cache ) {\n\n\t\tconst value = uniform.value;\n\t\tconst indexString = index + '_' + indexArray;\n\n\t\tif ( cache[ indexString ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tcache[ indexString ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tcache[ indexString ] = value.clone();\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\tconst cachedObject = cache[ indexString ];\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tif ( cachedObject !== value ) {\n\n\t\t\t\t\tcache[ indexString ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( cachedObject.equals( value ) === false ) {\n\n\t\t\t\t\tcachedObject.copy( value );\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\tfor ( let k = 0, kl = values.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\tconst chunkOffset = offset % chunkSize; // offset in the current chunk\n\t\t\t\t\tconst chunkPadding = chunkOffset % info.boundary; // required padding to match boundary\n\t\t\t\t\tconst chunkStart = chunkOffset + chunkPadding; // the start position in the current chunk for the data\n\n\t\t\t\t\toffset += chunkPadding;\n\n\t\t\t\t\t// Check for chunk overflow\n\t\t\t\t\tif ( chunkStart !== 0 && ( chunkSize - chunkStart ) < info.storage ) {\n\n\t\t\t\t\t\t// Add padding and adjust offset\n\t\t\t\t\t\toffset += ( chunkSize - chunkStart );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following two properties will be used for partial buffer updates\n\t\t\t\t\tuniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\t\t\tuniform.__offset = offset;\n\n\t\t\t\t\t// Update the global offset\n\t\t\t\t\toffset += info.storage;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tconst chunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( value ) {\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t// float/int/bool\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\twarn( 'WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\twarn( 'WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Precomputed DFG LUT for Image-Based Lighting\n * Resolution: 32x32\n * Samples: 4096 per texel\n * Format: RG16F (2 half floats per texel: scale, bias)\n */\n\n\nconst DATA = new Uint16Array( [\n\t0x2cd9, 0x3b64, 0x2d0e, 0x3b43, 0x2e20, 0x3aa7, 0x3061, 0x39fb, 0x325e, 0x397c, 0x3454, 0x3908, 0x357d, 0x3893, 0x3698, 0x381e, 0x379d, 0x375b, 0x3845, 0x3689, 0x38af, 0x35ca, 0x390d, 0x351e, 0x395f, 0x3484, 0x39a8, 0x33f9, 0x39e6, 0x330a, 0x3a1c, 0x3239, 0x3a4b, 0x3183, 0x3a73, 0x30e5, 0x3a95, 0x305b, 0x3ab1, 0x2fc6, 0x3ac9, 0x2ef7, 0x3ade, 0x2e43, 0x3aee, 0x2da7, 0x3afc, 0x2d1f, 0x3b07, 0x2ca9, 0x3b10, 0x2c42, 0x3b17, 0x2bd1, 0x3b1c, 0x2b34, 0x3b1f, 0x2aaa, 0x3b22, 0x2a31, 0x3b23, 0x29c7, 0x3b23, 0x2968,\n\t0x32d4, 0x3a4b, 0x32dc, 0x3a45, 0x3308, 0x3a26, 0x3378, 0x39d0, 0x3425, 0x394a, 0x34c9, 0x38be, 0x359c, 0x383e, 0x3688, 0x3796, 0x3778, 0x36c4, 0x382f, 0x3603, 0x3898, 0x3553, 0x38f7, 0x34b3, 0x394b, 0x3424, 0x3994, 0x334c, 0x39d3, 0x326c, 0x3a08, 0x31a9, 0x3a35, 0x30fe, 0x3a5a, 0x306a, 0x3a78, 0x2fd1, 0x3a90, 0x2ef1, 0x3aa2, 0x2e2e, 0x3ab0, 0x2d86, 0x3aba, 0x2cf3, 0x3ac1, 0x2c74, 0x3ac4, 0x2c05, 0x3ac4, 0x2b49, 0x3ac2, 0x2aa1, 0x3abd, 0x2a0c, 0x3ab7, 0x298b, 0x3aaf, 0x2918, 0x3aa6, 0x28b3, 0x3a9b, 0x285a,\n\t0x3559, 0x3954, 0x355a, 0x3951, 0x3566, 0x3944, 0x3582, 0x391e, 0x35b6, 0x38d3, 0x360a, 0x386a, 0x3684, 0x37ed, 0x3720, 0x370d, 0x37d3, 0x3641, 0x3847, 0x3588, 0x38a3, 0x34e2, 0x38fa, 0x344d, 0x3948, 0x3391, 0x398d, 0x32a6, 0x39c8, 0x31d6, 0x39fa, 0x3121, 0x3a22, 0x3082, 0x3a43, 0x2ff0, 0x3a5c, 0x2f01, 0x3a6f, 0x2e32, 0x3a7c, 0x2d7e, 0x3a84, 0x2ce2, 0x3a87, 0x2c5b, 0x3a87, 0x2bcc, 0x3a83, 0x2b00, 0x3a7b, 0x2a4e, 0x3a71, 0x29b3, 0x3a66, 0x292c, 0x3a58, 0x28b4, 0x3a4b, 0x284b, 0x3a3d, 0x27dc, 0x3a2e, 0x2739,\n\t0x3709, 0x387c, 0x370a, 0x387b, 0x3710, 0x3874, 0x3720, 0x385f, 0x373d, 0x3834, 0x376a, 0x37e1, 0x37ac, 0x3732, 0x3805, 0x3675, 0x383f, 0x35bc, 0x3883, 0x3511, 0x38cb, 0x3476, 0x3912, 0x33d8, 0x3955, 0x32e2, 0x3991, 0x3208, 0x39c6, 0x3149, 0x39f1, 0x30a1, 0x3a15, 0x300f, 0x3a30, 0x2f21, 0x3a44, 0x2e45, 0x3a51, 0x2d87, 0x3a59, 0x2ce2, 0x3a5b, 0x2c53, 0x3a58, 0x2bb0, 0x3a52, 0x2ada, 0x3a49, 0x2a1f, 0x3a40, 0x297d, 0x3a34, 0x28f0, 0x3a25, 0x2874, 0x3a13, 0x2807, 0x3a00, 0x274e, 0x39eb, 0x26a6, 0x39d5, 0x2611,\n\t0x3840, 0x3780, 0x3840, 0x377e, 0x3842, 0x3776, 0x3846, 0x375e, 0x384f, 0x372a, 0x385b, 0x36d3, 0x386c, 0x3659, 0x3885, 0x35c7, 0x38a8, 0x352d, 0x38d4, 0x3497, 0x3906, 0x340c, 0x393b, 0x331a, 0x3970, 0x323a, 0x39a0, 0x3172, 0x39cb, 0x30c3, 0x39ef, 0x302a, 0x3a0c, 0x2f4a, 0x3a21, 0x2e63, 0x3a2f, 0x2d9b, 0x3a37, 0x2ced, 0x3a39, 0x2c57, 0x3a37, 0x2baa, 0x3a34, 0x2ac9, 0x3a2c, 0x2a05, 0x3a20, 0x295d, 0x3a11, 0x28ca, 0x39ff, 0x2849, 0x39eb, 0x27b2, 0x39d5, 0x26ed, 0x39be, 0x2640, 0x39a5, 0x25aa, 0x398b, 0x2523,\n\t0x38e2, 0x363b, 0x38e2, 0x363b, 0x38e3, 0x3635, 0x38e6, 0x3626, 0x38ea, 0x3606, 0x38f0, 0x35cd, 0x38f8, 0x3579, 0x3903, 0x350e, 0x3915, 0x3495, 0x392d, 0x3418, 0x394c, 0x3340, 0x3970, 0x3261, 0x3995, 0x3197, 0x39b8, 0x30e4, 0x39d8, 0x3046, 0x39f3, 0x2f76, 0x3a08, 0x2e86, 0x3a16, 0x2db5, 0x3a1e, 0x2cff, 0x3a22, 0x2c61, 0x3a24, 0x2bb3, 0x3a20, 0x2ac7, 0x3a17, 0x29fc, 0x3a0a, 0x294c, 0x39fa, 0x28b2, 0x39e7, 0x282e, 0x39d1, 0x2773, 0x39b9, 0x26a9, 0x399f, 0x25fa, 0x3985, 0x255f, 0x3968, 0x24d6, 0x394a, 0x245d,\n\t0x396e, 0x3524, 0x396e, 0x3524, 0x396e, 0x3520, 0x396f, 0x3517, 0x3971, 0x3502, 0x3973, 0x34dd, 0x3975, 0x34a5, 0x3978, 0x3458, 0x397e, 0x33f9, 0x3987, 0x3332, 0x3997, 0x326b, 0x39aa, 0x31ac, 0x39c0, 0x30fb, 0x39d7, 0x305c, 0x39eb, 0x2f9e, 0x39fc, 0x2ea7, 0x3a07, 0x2dcf, 0x3a0f, 0x2d13, 0x3a16, 0x2c70, 0x3a17, 0x2bc4, 0x3a14, 0x2ad0, 0x3a0a, 0x29fc, 0x39fd, 0x2945, 0x39ed, 0x28a6, 0x39d9, 0x281d, 0x39c2, 0x274a, 0x39a9, 0x267c, 0x398e, 0x25c7, 0x3971, 0x2528, 0x3952, 0x249e, 0x3931, 0x2425, 0x3910, 0x2374,\n\t0x39e5, 0x3436, 0x39e5, 0x3435, 0x39e5, 0x3434, 0x39e5, 0x342e, 0x39e5, 0x3420, 0x39e5, 0x3408, 0x39e3, 0x33c4, 0x39e1, 0x3359, 0x39df, 0x32d3, 0x39de, 0x323a, 0x39e1, 0x319a, 0x39e7, 0x30fb, 0x39f0, 0x3065, 0x39f9, 0x2fb6, 0x3a02, 0x2ec0, 0x3a08, 0x2de6, 0x3a0d, 0x2d26, 0x3a12, 0x2c7e, 0x3a13, 0x2bda, 0x3a0e, 0x2adc, 0x3a05, 0x2a02, 0x39f8, 0x2945, 0x39e7, 0x28a1, 0x39d3, 0x2813, 0x39bc, 0x2730, 0x39a2, 0x265c, 0x3985, 0x25a3, 0x3966, 0x2501, 0x3945, 0x2475, 0x3923, 0x23f3, 0x3901, 0x231c, 0x38dd, 0x225e,\n\t0x3a4b, 0x32d6, 0x3a4a, 0x32d6, 0x3a4a, 0x32d4, 0x3a4a, 0x32cc, 0x3a48, 0x32bb, 0x3a47, 0x329d, 0x3a43, 0x326b, 0x3a3d, 0x3222, 0x3a36, 0x31c2, 0x3a2e, 0x314f, 0x3a28, 0x30d2, 0x3a23, 0x3052, 0x3a20, 0x2fab, 0x3a1e, 0x2ec2, 0x3a1b, 0x2def, 0x3a19, 0x2d31, 0x3a1a, 0x2c89, 0x3a18, 0x2beb, 0x3a11, 0x2aea, 0x3a07, 0x2a0a, 0x39fa, 0x2948, 0x39e9, 0x28a1, 0x39d4, 0x280f, 0x39bd, 0x2721, 0x39a2, 0x2647, 0x3985, 0x258b, 0x3964, 0x24e5, 0x3942, 0x2455, 0x391f, 0x23b3, 0x38fb, 0x22d8, 0x38d4, 0x2219, 0x38ad, 0x2172,\n\t0x3aa0, 0x3180, 0x3aa0, 0x3180, 0x3aa0, 0x317f, 0x3a9f, 0x317b, 0x3a9d, 0x3170, 0x3a99, 0x315d, 0x3a95, 0x313d, 0x3a8d, 0x310c, 0x3a82, 0x30ca, 0x3a76, 0x3077, 0x3a69, 0x3019, 0x3a5c, 0x2f68, 0x3a4f, 0x2e9e, 0x3a42, 0x2dde, 0x3a37, 0x2d2b, 0x3a30, 0x2c89, 0x3a29, 0x2bef, 0x3a1f, 0x2af0, 0x3a12, 0x2a0f, 0x3a03, 0x294a, 0x39f1, 0x28a0, 0x39dc, 0x280c, 0x39c5, 0x2717, 0x39a9, 0x2638, 0x398b, 0x2578, 0x396a, 0x24d0, 0x3947, 0x243f, 0x3923, 0x2380, 0x38fc, 0x22a4, 0x38d4, 0x21e4, 0x38ac, 0x213c, 0x3883, 0x20a8,\n\t0x3ae8, 0x3062, 0x3ae8, 0x3062, 0x3ae7, 0x3061, 0x3ae6, 0x305f, 0x3ae4, 0x305a, 0x3ae0, 0x304f, 0x3ada, 0x303b, 0x3ad1, 0x301b, 0x3ac5, 0x2fdd, 0x3ab6, 0x2f6a, 0x3aa4, 0x2ede, 0x3a91, 0x2e45, 0x3a7c, 0x2da5, 0x3a67, 0x2d0a, 0x3a57, 0x2c77, 0x3a48, 0x2bdc, 0x3a38, 0x2ae5, 0x3a27, 0x2a0a, 0x3a16, 0x2947, 0x3a02, 0x289d, 0x39eb, 0x2808, 0x39d3, 0x270d, 0x39b6, 0x262b, 0x3997, 0x256a, 0x3976, 0x24bf, 0x3952, 0x242b, 0x392d, 0x2358, 0x3904, 0x227a, 0x38db, 0x21b8, 0x38b2, 0x2110, 0x3887, 0x207d, 0x385b, 0x1ff6,\n\t0x3b23, 0x2ee8, 0x3b23, 0x2ee8, 0x3b22, 0x2ee8, 0x3b21, 0x2ee7, 0x3b1f, 0x2ee3, 0x3b1a, 0x2ed6, 0x3b14, 0x2ec1, 0x3b0b, 0x2e99, 0x3afe, 0x2e60, 0x3aee, 0x2e12, 0x3ad8, 0x2dad, 0x3ac1, 0x2d3d, 0x3aa5, 0x2cc3, 0x3a8b, 0x2c48, 0x3a76, 0x2ba2, 0x3a60, 0x2ac0, 0x3a49, 0x29f2, 0x3a32, 0x2938, 0x3a1b, 0x2893, 0x3a02, 0x27ff, 0x39e8, 0x26ff, 0x39ca, 0x261e, 0x39aa, 0x255b, 0x3988, 0x24b0, 0x3964, 0x241c, 0x393d, 0x2336, 0x3913, 0x2257, 0x38e9, 0x2195, 0x38be, 0x20eb, 0x3891, 0x2059, 0x3864, 0x1fae, 0x3837, 0x1ecd,\n\t0x3b54, 0x2d61, 0x3b54, 0x2d61, 0x3b53, 0x2d61, 0x3b52, 0x2d62, 0x3b4f, 0x2d61, 0x3b4b, 0x2d5c, 0x3b45, 0x2d51, 0x3b3b, 0x2d3d, 0x3b2e, 0x2d1a, 0x3b1d, 0x2ce7, 0x3b06, 0x2ca3, 0x3aeb, 0x2c52, 0x3acb, 0x2bee, 0x3ab0, 0x2b31, 0x3a94, 0x2a74, 0x3a77, 0x29bf, 0x3a5a, 0x2915, 0x3a3f, 0x287a, 0x3a22, 0x27de, 0x3a05, 0x26e4, 0x39e5, 0x2609, 0x39c3, 0x2547, 0x39a0, 0x249f, 0x397b, 0x240c, 0x3953, 0x2314, 0x3928, 0x2238, 0x38fd, 0x2175, 0x38d0, 0x20cb, 0x38a2, 0x2038, 0x3873, 0x1f71, 0x3844, 0x1e90, 0x3815, 0x1dce,\n\t0x3b7c, 0x2c22, 0x3b7c, 0x2c22, 0x3b7b, 0x2c23, 0x3b7a, 0x2c25, 0x3b77, 0x2c27, 0x3b73, 0x2c26, 0x3b6d, 0x2c23, 0x3b64, 0x2c1a, 0x3b57, 0x2c07, 0x3b46, 0x2bd1, 0x3b2e, 0x2b79, 0x3b0f, 0x2b07, 0x3aef, 0x2a86, 0x3ad1, 0x29f8, 0x3ab0, 0x2967, 0x3a8e, 0x28d7, 0x3a6d, 0x284e, 0x3a4c, 0x279f, 0x3a2b, 0x26b7, 0x3a08, 0x25e5, 0x39e4, 0x252c, 0x39be, 0x2488, 0x3998, 0x23f0, 0x396f, 0x22f2, 0x3943, 0x2215, 0x3917, 0x2155, 0x38e8, 0x20ae, 0x38b9, 0x201c, 0x3888, 0x1f38, 0x3857, 0x1e5a, 0x3826, 0x1d9a, 0x37eb, 0x1cf0,\n\t0x3b9c, 0x2a43, 0x3b9c, 0x2a43, 0x3b9b, 0x2a46, 0x3b9a, 0x2a4a, 0x3b98, 0x2a50, 0x3b93, 0x2a54, 0x3b8e, 0x2a59, 0x3b85, 0x2a56, 0x3b79, 0x2a45, 0x3b67, 0x2a24, 0x3b4f, 0x29ee, 0x3b2f, 0x29a4, 0x3b10, 0x294b, 0x3aef, 0x28e5, 0x3ac9, 0x2877, 0x3aa4, 0x2809, 0x3a7e, 0x2739, 0x3a59, 0x266d, 0x3a34, 0x25af, 0x3a0c, 0x2503, 0x39e4, 0x2468, 0x39bb, 0x23bb, 0x3990, 0x22c6, 0x3963, 0x21f0, 0x3936, 0x2133, 0x3906, 0x208f, 0x38d5, 0x1ffd, 0x38a3, 0x1f04, 0x3870, 0x1e28, 0x383d, 0x1d69, 0x380b, 0x1cc3, 0x37b0, 0x1c32,\n\t0x3bb5, 0x28aa, 0x3bb5, 0x28ab, 0x3bb5, 0x28ad, 0x3bb4, 0x28b2, 0x3bb2, 0x28b9, 0x3bae, 0x28c2, 0x3ba8, 0x28ca, 0x3ba0, 0x28d1, 0x3b94, 0x28cd, 0x3b83, 0x28c1, 0x3b6a, 0x28a3, 0x3b4b, 0x2876, 0x3b2d, 0x283d, 0x3b09, 0x27ea, 0x3ae1, 0x274b, 0x3ab9, 0x26a6, 0x3a8f, 0x25fe, 0x3a67, 0x255d, 0x3a3d, 0x24c5, 0x3a11, 0x2439, 0x39e6, 0x2371, 0x39b9, 0x228d, 0x398a, 0x21c1, 0x395a, 0x210b, 0x3929, 0x206c, 0x38f7, 0x1fc1, 0x38c3, 0x1ecb, 0x388f, 0x1df6, 0x385a, 0x1d3a, 0x3825, 0x1c99, 0x37e1, 0x1c08, 0x3779, 0x1b1b,\n\t0x3bc9, 0x26d3, 0x3bc9, 0x26d4, 0x3bc9, 0x26d9, 0x3bc8, 0x26e3, 0x3bc6, 0x26ef, 0x3bc2, 0x2705, 0x3bbd, 0x271a, 0x3bb6, 0x2731, 0x3baa, 0x273c, 0x3b9a, 0x273d, 0x3b81, 0x2726, 0x3b65, 0x26f7, 0x3b46, 0x26af, 0x3b20, 0x2650, 0x3af7, 0x25e1, 0x3acd, 0x256a, 0x3aa1, 0x24eb, 0x3a75, 0x246f, 0x3a46, 0x23ee, 0x3a17, 0x230d, 0x39e9, 0x223e, 0x39b7, 0x2183, 0x3985, 0x20d8, 0x3953, 0x2043, 0x391e, 0x1f7a, 0x38e9, 0x1e8d, 0x38b3, 0x1dbf, 0x387c, 0x1d0b, 0x3845, 0x1c6c, 0x380e, 0x1bc4, 0x37b0, 0x1ad2, 0x3745, 0x19fd,\n\t0x3bd9, 0x24e4, 0x3bd9, 0x24e5, 0x3bd9, 0x24e8, 0x3bd8, 0x24f2, 0x3bd5, 0x24fe, 0x3bd2, 0x2512, 0x3bce, 0x252b, 0x3bc6, 0x2544, 0x3bbc, 0x255a, 0x3bac, 0x256b, 0x3b93, 0x2569, 0x3b7a, 0x2557, 0x3b5b, 0x252f, 0x3b34, 0x24f7, 0x3b0c, 0x24ad, 0x3adf, 0x2458, 0x3ab1, 0x23f8, 0x3a82, 0x233f, 0x3a4f, 0x2286, 0x3a1e, 0x21d5, 0x39eb, 0x2130, 0x39b6, 0x2098, 0x3982, 0x200e, 0x394b, 0x1f25, 0x3914, 0x1e45, 0x38dc, 0x1d83, 0x38a3, 0x1cd6, 0x386b, 0x1c3d, 0x3831, 0x1b71, 0x37f2, 0x1a87, 0x3782, 0x19bc, 0x3714, 0x1909,\n\t0x3be5, 0x22d8, 0x3be5, 0x22d9, 0x3be4, 0x22df, 0x3be4, 0x22ef, 0x3be1, 0x2305, 0x3bde, 0x232a, 0x3bda, 0x2358, 0x3bd4, 0x2392, 0x3bcb, 0x23ca, 0x3bbb, 0x23f4, 0x3ba3, 0x2405, 0x3b8c, 0x2405, 0x3b6c, 0x23ec, 0x3b47, 0x23ae, 0x3b1d, 0x2353, 0x3af0, 0x22e2, 0x3ac0, 0x2261, 0x3a8e, 0x21d9, 0x3a5a, 0x214e, 0x3a26, 0x20c7, 0x39ee, 0x2045, 0x39b7, 0x1f97, 0x397f, 0x1eba, 0x3945, 0x1df0, 0x390b, 0x1d3a, 0x38d0, 0x1c9a, 0x3895, 0x1c0a, 0x385a, 0x1b18, 0x381f, 0x1a39, 0x37c9, 0x1975, 0x3756, 0x18cc, 0x36e6, 0x1836,\n\t0x3bed, 0x20a8, 0x3bed, 0x20a9, 0x3bed, 0x20ae, 0x3bed, 0x20bb, 0x3beb, 0x20cf, 0x3be8, 0x20ef, 0x3be4, 0x2119, 0x3bde, 0x214f, 0x3bd6, 0x2189, 0x3bc6, 0x21b8, 0x3bb1, 0x21de, 0x3b9a, 0x21f2, 0x3b7b, 0x21f2, 0x3b57, 0x21d8, 0x3b2d, 0x21a4, 0x3b00, 0x215f, 0x3acf, 0x2108, 0x3a99, 0x20a8, 0x3a64, 0x2043, 0x3a2c, 0x1fba, 0x39f2, 0x1ef3, 0x39b8, 0x1e36, 0x397c, 0x1d86, 0x3940, 0x1ce5, 0x3903, 0x1c52, 0x38c6, 0x1b9e, 0x3888, 0x1ab3, 0x384a, 0x19e4, 0x380e, 0x192b, 0x37a3, 0x188b, 0x372d, 0x17f7, 0x36ba, 0x1701,\n\t0x3bf4, 0x1e23, 0x3bf4, 0x1e25, 0x3bf4, 0x1e2d, 0x3bf3, 0x1e41, 0x3bf1, 0x1e64, 0x3bef, 0x1e9c, 0x3beb, 0x1ee1, 0x3be6, 0x1f40, 0x3bde, 0x1fa7, 0x3bce, 0x2001, 0x3bbd, 0x202f, 0x3ba6, 0x204e, 0x3b88, 0x205f, 0x3b64, 0x205b, 0x3b3b, 0x2044, 0x3b0e, 0x201f, 0x3adb, 0x1fcf, 0x3aa6, 0x1f4e, 0x3a6e, 0x1ec1, 0x3a33, 0x1e2b, 0x39f7, 0x1d95, 0x39ba, 0x1d06, 0x397b, 0x1c7d, 0x393c, 0x1bfc, 0x38fc, 0x1b13, 0x38bc, 0x1a40, 0x387c, 0x1983, 0x383c, 0x18da, 0x37fa, 0x1842, 0x377f, 0x177f, 0x3706, 0x1695, 0x3691, 0x15c8,\n\t0x3bf8, 0x1bca, 0x3bf8, 0x1bcc, 0x3bf8, 0x1bd8, 0x3bf8, 0x1bf7, 0x3bf6, 0x1c1b, 0x3bf4, 0x1c45, 0x3bf1, 0x1c83, 0x3bec, 0x1cce, 0x3be4, 0x1d21, 0x3bd5, 0x1d78, 0x3bc5, 0x1dd1, 0x3bb0, 0x1e17, 0x3b93, 0x1e4a, 0x3b70, 0x1e5f, 0x3b48, 0x1e57, 0x3b1b, 0x1e35, 0x3ae7, 0x1df6, 0x3ab2, 0x1da4, 0x3a77, 0x1d44, 0x3a3a, 0x1cdb, 0x39fc, 0x1c6e, 0x39bb, 0x1c03, 0x397a, 0x1b35, 0x3938, 0x1a72, 0x38f5, 0x19bb, 0x38b3, 0x1914, 0x3870, 0x187d, 0x382e, 0x17eb, 0x37db, 0x16f9, 0x375c, 0x1621, 0x36e1, 0x1565, 0x3669, 0x14be,\n\t0x3bfb, 0x18b9, 0x3bfb, 0x18ba, 0x3bfb, 0x18c3, 0x3bfb, 0x18da, 0x3bf9, 0x190a, 0x3bf7, 0x1948, 0x3bf5, 0x19ac, 0x3bf0, 0x1a20, 0x3be9, 0x1ab3, 0x3bdb, 0x1b49, 0x3bcd, 0x1be6, 0x3bb7, 0x1c34, 0x3b9c, 0x1c6d, 0x3b7a, 0x1c8e, 0x3b54, 0x1c9e, 0x3b26, 0x1c96, 0x3af2, 0x1c75, 0x3abc, 0x1c47, 0x3a80, 0x1c09, 0x3a42, 0x1b85, 0x3a01, 0x1aec, 0x39be, 0x1a50, 0x397a, 0x19b5, 0x3935, 0x1921, 0x38f0, 0x1895, 0x38aa, 0x1814, 0x3866, 0x173a, 0x3821, 0x1665, 0x37be, 0x15a4, 0x373c, 0x14f9, 0x36be, 0x1460, 0x3644, 0x13b3,\n\t0x3bfd, 0x156b, 0x3bfd, 0x156c, 0x3bfd, 0x1578, 0x3bfd, 0x1598, 0x3bfc, 0x15dd, 0x3bfa, 0x163c, 0x3bf7, 0x16cb, 0x3bf3, 0x177b, 0x3beb, 0x1833, 0x3be0, 0x18ad, 0x3bd2, 0x192e, 0x3bbd, 0x19a6, 0x3ba4, 0x1a0c, 0x3b83, 0x1a5a, 0x3b5d, 0x1a8c, 0x3b30, 0x1a9b, 0x3afd, 0x1a86, 0x3ac6, 0x1a5c, 0x3a89, 0x1a11, 0x3a49, 0x19b7, 0x3a06, 0x194f, 0x39c1, 0x18e3, 0x397a, 0x1873, 0x3933, 0x1805, 0x38eb, 0x173a, 0x38a3, 0x1676, 0x385c, 0x15bf, 0x3816, 0x1519, 0x37a2, 0x1482, 0x371d, 0x13f7, 0x369c, 0x1306, 0x3620, 0x1231,\n\t0x3bff, 0x11cb, 0x3bff, 0x11cd, 0x3bfe, 0x11dd, 0x3bfe, 0x1219, 0x3bfd, 0x126b, 0x3bfb, 0x12e9, 0x3bf9, 0x13c5, 0x3bf5, 0x1460, 0x3bee, 0x150f, 0x3be3, 0x15c9, 0x3bd6, 0x168a, 0x3bc3, 0x174f, 0x3baa, 0x1806, 0x3b8b, 0x184f, 0x3b66, 0x1888, 0x3b39, 0x18a6, 0x3b07, 0x18ad, 0x3acf, 0x189c, 0x3a92, 0x1876, 0x3a50, 0x1840, 0x3a0c, 0x17fd, 0x39c4, 0x176a, 0x397b, 0x16ce, 0x3931, 0x1634, 0x38e6, 0x1599, 0x389c, 0x1508, 0x3852, 0x147f, 0x380a, 0x1401, 0x3788, 0x131c, 0x36ff, 0x124a, 0x367c, 0x1190, 0x35fe, 0x10ea,\n\t0x3bff, 0x0daa, 0x3bff, 0x0dad, 0x3bff, 0x0dc0, 0x3bff, 0x0e0e, 0x3bfe, 0x0e87, 0x3bfc, 0x0f14, 0x3bfb, 0x1029, 0x3bf7, 0x10d1, 0x3bf0, 0x11d3, 0x3be6, 0x12c9, 0x3bd9, 0x13fc, 0x3bc7, 0x1499, 0x3bb0, 0x152a, 0x3b92, 0x15ab, 0x3b6e, 0x1615, 0x3b42, 0x165a, 0x3b10, 0x1681, 0x3ad8, 0x1683, 0x3a9a, 0x1665, 0x3a57, 0x1629, 0x3a11, 0x15dd, 0x39c8, 0x1580, 0x397c, 0x1518, 0x3930, 0x14ae, 0x38e3, 0x1441, 0x3896, 0x13b1, 0x384a, 0x12e9, 0x37ff, 0x122f, 0x376f, 0x1182, 0x36e3, 0x10e5, 0x365e, 0x1057, 0x35de, 0x0fac,\n\t0x3c00, 0x08ea, 0x3c00, 0x08ed, 0x3c00, 0x0902, 0x3c00, 0x0961, 0x3bff, 0x09f3, 0x3bfd, 0x0abc, 0x3bfb, 0x0c1f, 0x3bf8, 0x0d15, 0x3bf1, 0x0e5b, 0x3be8, 0x0fb4, 0x3bdc, 0x10b0, 0x3bcb, 0x1190, 0x3bb5, 0x126c, 0x3b97, 0x132c, 0x3b74, 0x13de, 0x3b4a, 0x1432, 0x3b18, 0x145e, 0x3ae0, 0x1472, 0x3aa2, 0x146f, 0x3a5f, 0x1456, 0x3a17, 0x142e, 0x39cc, 0x13ee, 0x397e, 0x136b, 0x392f, 0x12e1, 0x38df, 0x124f, 0x3890, 0x11bd, 0x3842, 0x1131, 0x37eb, 0x10ac, 0x3757, 0x102e, 0x36c9, 0x0f76, 0x3640, 0x0ea3, 0x35bf, 0x0de4,\n\t0x3c00, 0x039b, 0x3c00, 0x039d, 0x3c00, 0x03b2, 0x3c00, 0x041c, 0x3bff, 0x04be, 0x3bfd, 0x05d6, 0x3bfc, 0x0764, 0x3bf8, 0x08e2, 0x3bf2, 0x0a67, 0x3bea, 0x0c1b, 0x3bde, 0x0d41, 0x3bcd, 0x0e5f, 0x3bb8, 0x0f8c, 0x3b9c, 0x1057, 0x3b7a, 0x10e5, 0x3b51, 0x1155, 0x3b20, 0x11a5, 0x3ae8, 0x11da, 0x3aaa, 0x11ef, 0x3a66, 0x11e5, 0x3a1d, 0x11c1, 0x39d0, 0x1185, 0x3980, 0x113b, 0x392e, 0x10e5, 0x38dc, 0x1087, 0x388b, 0x1028, 0x383b, 0x0f94, 0x37d9, 0x0edb, 0x3741, 0x0e2c, 0x36af, 0x0d89, 0x3625, 0x0cf2, 0x35a1, 0x0c69,\n\t0x3c00, 0x0107, 0x3c00, 0x0108, 0x3c00, 0x0110, 0x3c00, 0x0145, 0x3bff, 0x0197, 0x3bfe, 0x0224, 0x3bfc, 0x030c, 0x3bf8, 0x0478, 0x3bf3, 0x062c, 0x3beb, 0x0833, 0x3be0, 0x0979, 0x3bd0, 0x0aeb, 0x3bbc, 0x0c3d, 0x3ba0, 0x0d01, 0x3b80, 0x0dbd, 0x3b57, 0x0e69, 0x3b27, 0x0eeb, 0x3af0, 0x0f53, 0x3ab1, 0x0f8a, 0x3a6c, 0x0f9f, 0x3a22, 0x0f8b, 0x39d4, 0x0f5b, 0x3982, 0x0f0f, 0x392f, 0x0eac, 0x38da, 0x0e3d, 0x3886, 0x0dc9, 0x3834, 0x0d51, 0x37c7, 0x0cd9, 0x372c, 0x0c65, 0x3697, 0x0bef, 0x360a, 0x0b20, 0x3585, 0x0a62,\n\t0x3c00, 0x0031, 0x3c00, 0x0031, 0x3c00, 0x0034, 0x3c00, 0x004b, 0x3bff, 0x006f, 0x3bfe, 0x00c9, 0x3bfc, 0x011b, 0x3bf9, 0x0207, 0x3bf4, 0x02d6, 0x3bec, 0x0415, 0x3be1, 0x0587, 0x3bd2, 0x0703, 0x3bbf, 0x087d, 0x3ba5, 0x096a, 0x3b85, 0x0a59, 0x3b5d, 0x0b32, 0x3b2e, 0x0bee, 0x3af7, 0x0c44, 0x3ab8, 0x0c7c, 0x3a73, 0x0c9c, 0x3a28, 0x0ca4, 0x39d8, 0x0c98, 0x3985, 0x0c77, 0x392f, 0x0c4a, 0x38d9, 0x0c10, 0x3882, 0x0ba0, 0x382e, 0x0b14, 0x37b6, 0x0a84, 0x3717, 0x09f5, 0x3680, 0x0969, 0x35f0, 0x08e6, 0x356a, 0x086a,\n\t0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x000d, 0x3bff, 0x0021, 0x3bfe, 0x003b, 0x3bfd, 0x0070, 0x3bf9, 0x00c7, 0x3bf4, 0x012e, 0x3bed, 0x01c8, 0x3be3, 0x0274, 0x3bd4, 0x033b, 0x3bc1, 0x043a, 0x3ba8, 0x0534, 0x3b89, 0x0641, 0x3b62, 0x073b, 0x3b34, 0x0815, 0x3afd, 0x087c, 0x3abf, 0x08d0, 0x3a7a, 0x090a, 0x3a2e, 0x092c, 0x39dd, 0x0936, 0x3988, 0x0928, 0x3930, 0x0907, 0x38d7, 0x08d7, 0x387f, 0x089b, 0x3828, 0x0855, 0x37a7, 0x080b, 0x3704, 0x077b, 0x366a, 0x06e1, 0x35d8, 0x0649, 0x3550, 0x05b8,\n\t0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0003, 0x3bff, 0x0012, 0x3bfe, 0x001a, 0x3bfd, 0x0035, 0x3bfa, 0x0050, 0x3bf4, 0x0061, 0x3bed, 0x00a5, 0x3be4, 0x00ee, 0x3bd6, 0x0146, 0x3bc3, 0x01ab, 0x3bab, 0x0211, 0x3b8d, 0x028e, 0x3b67, 0x0303, 0x3b39, 0x0375, 0x3b04, 0x03e2, 0x3ac6, 0x0441, 0x3a80, 0x0492, 0x3a34, 0x04cd, 0x39e1, 0x04f2, 0x398b, 0x0504, 0x3931, 0x0502, 0x38d6, 0x04ec, 0x387c, 0x04c7, 0x3822, 0x0496, 0x3798, 0x045c, 0x36f2, 0x041a, 0x3655, 0x03d5, 0x35c1, 0x038e, 0x3537, 0x0347\n] );\n\nlet lut = null;\n\nfunction getDFGLUT() {\n\n\tif ( lut === null ) {\n\n\t\tlut = new DataTexture( DATA, 32, 32, RGFormat, HalfFloatType );\n\t\tlut.minFilter = LinearFilter;\n\t\tlut.magFilter = LinearFilter;\n\t\tlut.wrapS = ClampToEdgeWrapping;\n\t\tlut.wrapT = ClampToEdgeWrapping;\n\t\tlut.generateMipmaps = false;\n\t\tlut.needsUpdate = true;\n\n\t}\n\n\treturn lut;\n\n}\n\n/**\n * This renderer uses WebGL 2 to display scenes.\n *\n * WebGL 1 is not supported since `r163`.\n */\nclass WebGLRenderer {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer~Options} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tconst {\n\t\t\tcanvas = createCanvasElement(),\n\t\t\tcontext = null,\n\t\t\tdepth = true,\n\t\t\tstencil = false,\n\t\t\talpha = false,\n\t\t\tantialias = false,\n\t\t\tpremultipliedAlpha = true,\n\t\t\tpreserveDrawingBuffer = false,\n\t\t\tpowerPreference = 'default',\n\t\t\tfailIfMajorPerformanceCaveat = false,\n\t\t\treversedDepthBuffer = false,\n\t\t} = parameters;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderer = true;\n\n\t\tlet _alpha;\n\n\t\tif ( context !== null ) {\n\n\t\t\tif ( typeof WebGLRenderingContext !== 'undefined' && context instanceof WebGLRenderingContext ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer: WebGL 1 is not supported since r163.' );\n\n\t\t\t}\n\n\t\t\t_alpha = context.getContextAttributes().alpha;\n\n\t\t} else {\n\n\t\t\t_alpha = alpha;\n\n\t\t}\n\n\t\tconst INTEGER_FORMATS = new Set( [\n\t\t\tRGBAIntegerFormat,\n\t\t\tRGIntegerFormat,\n\t\t\tRedIntegerFormat\n\t\t] );\n\n\t\tconst UNSIGNED_TYPES = new Set( [\n\t\t\tUnsignedByteType,\n\t\t\tUnsignedIntType,\n\t\t\tUnsignedShortType,\n\t\t\tUnsignedInt248Type,\n\t\t\tUnsignedShort4444Type,\n\t\t\tUnsignedShort5551Type\n\t\t] );\n\n\t\tconst uintClearColor = new Uint32Array( 4 );\n\t\tconst intClearColor = new Int32Array( 4 );\n\n\t\tlet currentRenderList = null;\n\t\tlet currentRenderState = null;\n\n\t\t// render() can be called from within a callback triggered by another render.\n\t\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\t\tconst renderListStack = [];\n\t\tconst renderStateStack = [];\n\n\t\t// public properties\n\n\t\t/**\n\t\t * A canvas where the renderer draws its output.This is automatically created by the renderer\n\t\t * in the constructor (if not provided already); you just need to add it to your page like so:\n\t\t * ```js\n\t\t * document.body.appendChild( renderer.domElement );\n\t\t * ```\n\t\t *\n\t\t * @type {HTMLCanvasElement|OffscreenCanvas}\n\t\t */\n\t\tthis.domElement = canvas;\n\n\t\t/**\n\t\t * A object with debug configuration settings.\n\t\t *\n\t\t * - `checkShaderErrors`: If it is `true`, defines whether material shader programs are\n\t\t * checked for errors during compilation and linkage process. It may be useful to disable\n\t\t * this check in production for performance gain. It is strongly recommended to keep these\n\t\t * checks enabled during development. If the shader does not compile and link - it will not\n\t\t * work and associated material will not render.\n\t\t * - `onShaderError(gl, program, glVertexShader,glFragmentShader)`: A callback function that\n\t\t * can be used for custom error reporting. The callback receives the WebGL context, an instance\n\t\t * of WebGLProgram as well two instances of WebGLShader representing the vertex and fragment shader.\n\t\t * Assigning a custom function disables the default error reporting.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.debug = {\n\n\t\t\t/**\n\t\t\t * Enables error checking and reporting when shader programs are being compiled.\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tcheckShaderErrors: true,\n\t\t\t/**\n\t\t\t * Callback for custom error reporting.\n\t\t\t * @type {?Function}\n\t\t\t */\n\t\t\tonShaderError: null\n\t\t};\n\n\t\t// clearing\n\n\t\t/**\n\t\t * Whether the renderer should automatically clear its output before rendering a frame or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClear = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the color buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearColor = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearDepth = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\t/**\n\t\t * Whether the renderer should sort objects or not.\n\t\t *\n\t\t * Note: Sorting is used to attempt to properly render objects that have some\n\t\t * degree of transparency. By definition, sorting objects may not work in all\n\t\t * cases. Depending on the needs of application, it may be necessary to turn\n\t\t * off sorting and use other methods to deal with transparency rendering e.g.\n\t\t * manually determining each object's rendering order.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\t/**\n\t\t * User-defined clipping planes specified in world space. These planes apply globally.\n\t\t * Points in space whose dot product with the plane is negative are cut away.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.clippingPlanes = [];\n\n\t\t/**\n\t\t * Whether the renderer respects object-level clipping planes or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.localClippingEnabled = false;\n\n\t\t// tone mapping\n\n\t\t/**\n\t\t * The tone mapping technique of the renderer.\n\t\t *\n\t\t * @type {(NoToneMapping|LinearToneMapping|ReinhardToneMapping|CineonToneMapping|ACESFilmicToneMapping|CustomToneMapping|AgXToneMapping|NeutralToneMapping)}\n\t\t * @default NoToneMapping\n\t\t */\n\t\tthis.toneMapping = NoToneMapping;\n\n\t\t/**\n\t\t * Exposure level of tone mapping.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.toneMappingExposure = 1.0;\n\n\t\t// transmission\n\n\t\t/**\n\t\t * The normalized resolution scale for the transmission render target, measured in percentage\n\t\t * of viewport dimensions. Lowering this value can result in significant performance improvements\n\t\t * when using {@link MeshPhysicalMaterial#transmission}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.transmissionResolutionScale = 1.0;\n\n\t\t// internal properties\n\n\t\tconst _this = this;\n\n\t\tlet _isContextLost = false;\n\n\t\t// internal state cache\n\n\t\tthis._outputColorSpace = SRGBColorSpace;\n\n\t\tlet _currentActiveCubeFace = 0;\n\t\tlet _currentActiveMipmapLevel = 0;\n\t\tlet _currentRenderTarget = null;\n\t\tlet _currentMaterialId = -1;\n\n\t\tlet _currentCamera = null;\n\n\t\tconst _currentViewport = new Vector4();\n\t\tconst _currentScissor = new Vector4();\n\t\tlet _currentScissorTest = null;\n\n\t\tconst _currentClearColor = new Color( 0x000000 );\n\t\tlet _currentClearAlpha = 0;\n\n\t\t//\n\n\t\tlet _width = canvas.width;\n\t\tlet _height = canvas.height;\n\n\t\tlet _pixelRatio = 1;\n\t\tlet _opaqueSort = null;\n\t\tlet _transparentSort = null;\n\n\t\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\t\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\t\tlet _scissorTest = false;\n\n\t\t// frustum\n\n\t\tconst _frustum = new Frustum();\n\n\t\t// clipping\n\n\t\tlet _clippingEnabled = false;\n\t\tlet _localClippingEnabled = false;\n\n\t\t// camera matrices cache\n\n\t\tconst _projScreenMatrix = new Matrix4();\n\n\t\tconst _vector3 = new Vector3();\n\n\t\tconst _vector4 = new Vector4();\n\n\t\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\t\tlet _renderBackground = false;\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\t// initialize\n\n\t\tlet _gl = context;\n\n\t\tfunction getContext( contextName, contextAttributes ) {\n\n\t\t\treturn canvas.getContext( contextName, contextAttributes );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tconst contextAttributes = {\n\t\t\t\talpha: true,\n\t\t\t\tdepth,\n\t\t\t\tstencil,\n\t\t\t\tantialias,\n\t\t\t\tpremultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer,\n\t\t\t\tpowerPreference,\n\t\t\t\tfailIfMajorPerformanceCaveat,\n\t\t\t};\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t\tcanvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tconst contextName = 'webgl2';\n\n\t\t\t\t_gl = getContext( contextName, contextAttributes );\n\n\t\t\t\tif ( _gl === null ) {\n\n\t\t\t\t\tif ( getContext( contextName ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLRenderer: ' + error.message );\n\t\t\tthrow error;\n\n\t\t}\n\n\t\tlet extensions, capabilities, state, info;\n\t\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\t\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\t\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\t\tlet utils, bindingStates, uniformsGroups;\n\n\t\tfunction initGLContext() {\n\n\t\t\textensions = new WebGLExtensions( _gl );\n\t\t\textensions.init();\n\n\t\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );\n\n\t\t\tstate = new WebGLState( _gl, extensions );\n\n\t\t\tif ( capabilities.reversedDepthBuffer && reversedDepthBuffer ) {\n\n\t\t\t\tstate.buffers.depth.setReversed( true );\n\n\t\t\t}\n\n\t\t\tinfo = new WebGLInfo( _gl );\n\t\t\tproperties = new WebGLProperties();\n\t\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\t\tattributes = new WebGLAttributes( _gl );\n\t\t\tbindingStates = new WebGLBindingStates( _gl, attributes );\n\t\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\t\tclipping = new WebGLClipping( properties );\n\t\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\t\trenderLists = new WebGLRenderLists();\n\t\t\trenderStates = new WebGLRenderStates( extensions );\n\t\t\tbackground = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );\n\t\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );\n\t\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );\n\n\t\t\tinfo.programs = programCache.programs;\n\n\t\t\t/**\n\t\t\t * Holds details about the capabilities of the current rendering context.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#capabilities\n\t\t\t * @type {WebGLRenderer~Capabilities}\n\t\t\t */\n\t\t\t_this.capabilities = capabilities;\n\n\t\t\t/**\n\t\t\t * Provides methods for retrieving and testing WebGL extensions.\n\t\t\t *\n\t\t\t * - `get(extensionName:string)`: Used to check whether a WebGL extension is supported\n\t\t\t * and return the extension object if available.\n\t\t\t * - `has(extensionName:string)`: returns `true` if the extension is supported.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#extensions\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.extensions = extensions;\n\n\t\t\t/**\n\t\t\t * Used to track properties of other objects like native WebGL objects.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#properties\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.properties = properties;\n\n\t\t\t/**\n\t\t\t * Manages the render lists of the renderer.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#renderLists\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.renderLists = renderLists;\n\n\n\n\t\t\t/**\n\t\t\t * Interface for managing shadows.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#shadowMap\n\t\t\t * @type {WebGLRenderer~ShadowMap}\n\t\t\t */\n\t\t\t_this.shadowMap = shadowMap;\n\n\t\t\t/**\n\t\t\t * Interface for managing the WebGL state.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#state\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.state = state;\n\n\t\t\t/**\n\t\t\t * Holds a series of statistical information about the GPU memory\n\t\t\t * and the rendering process. Useful for debugging and monitoring.\n\t\t\t *\n\t\t\t * By default these data are reset at each render call but when having\n\t\t\t * multiple render passes per frame (e.g. when using post processing) it can\n\t\t\t * be preferred to reset with a custom pattern. First, set `autoReset` to\n\t\t\t * `false`.\n\t\t\t * ```js\n\t\t\t * renderer.info.autoReset = false;\n\t\t\t * ```\n\t\t\t * Call `reset()` whenever you have finished to render a single frame.\n\t\t\t * ```js\n\t\t\t * renderer.info.reset();\n\t\t\t * ```\n\t\t\t *\n\t\t\t * @name WebGLRenderer#info\n\t\t\t * @type {WebGLRenderer~Info}\n\t\t\t */\n\t\t\t_this.info = info;\n\n\t\t}\n\n\t\tinitGLContext();\n\n\t\t// xr\n\n\t\tconst xr = new WebXRManager( _this, _gl );\n\n\t\t/**\n\t\t * A reference to the XR manager.\n\t\t *\n\t\t * @type {WebXRManager}\n\t\t */\n\t\tthis.xr = xr;\n\n\t\t/**\n\t\t * Returns the rendering context.\n\t\t *\n\t\t * @return {WebGL2RenderingContext} The rendering context.\n\t\t */\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the rendering context attributes.\n\t\t *\n\t\t * @return {WebGLContextAttributes} The rendering context attributes.\n\t\t */\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a loss of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextLoss = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.loseContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a restore of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextRestore = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.restoreContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the pixel ratio.\n\t\t *\n\t\t * @return {number} The pixel ratio.\n\t\t */\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the given pixel ratio and resizes the canvas if necessary.\n\t\t *\n\t\t * @param {number} value - The pixel ratio.\n\t\t */\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _width, _height, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the renderer's size in logical pixels. This method does not honor the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The renderer's size in logical pixels.\n\t\t */\n\t\tthis.getSize = function ( target ) {\n\n\t\t\treturn target.set( _width, _height );\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the output canvas to (width, height) with device pixel ratio taken\n\t\t * into account, and also sets the viewport to fit that size, starting in (0,\n\t\t * 0). Setting `updateStyle` to false prevents any style changes to the output canvas.\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {boolean} [updateStyle=true] - Whether to update the `style` attribute of the canvas or not.\n\t\t */\n\t\tthis.setSize = function ( width, height, updateStyle = true ) {\n\n\t\t\tif ( xr.isPresenting ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\tcanvas.width = Math.floor( width * _pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * _pixelRatio );\n\n\t\t\tif ( updateStyle === true ) {\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the drawing buffer size in physical pixels. This method honors the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The drawing buffer size.\n\t\t */\n\t\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t\t};\n\n\t\t/**\n\t\t * This method allows to define the drawing buffer size by specifying\n\t\t * width, height and pixel ratio all at once. The size of the drawing\n\t\t * buffer is computed with this formula:\n\t\t * ```js\n\t\t * size.x = width * pixelRatio;\n\t\t * size.y = height * pixelRatio;\n\t\t * ```\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {number} pixelRatio - The pixel ratio.\n\t\t */\n\t\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_pixelRatio = pixelRatio;\n\n\t\t\tcanvas.width = Math.floor( width * pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * pixelRatio );\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current viewport definition.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The current viewport definition.\n\t\t */\n\t\tthis.getCurrentViewport = function ( target ) {\n\n\t\t\treturn target.copy( _currentViewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the viewport definition.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The viewport definition.\n\t\t */\n\t\tthis.getViewport = function ( target ) {\n\n\t\t\treturn target.copy( _viewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the viewport to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the viewport.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t\t * @param {number} width - The width of the viewport in logical pixel unit.\n\t\t * @param {number} height - The height of the viewport in logical pixel unit.\n\t\t */\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_viewport.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the scissor region.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The scissor region.\n\t\t */\n\t\tthis.getScissor = function ( target ) {\n\n\t\t\treturn target.copy( _scissor );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the scissor region to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the scissor region origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the scissor region.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the scissor region origin in logical pixel unit.\n\t\t * @param {number} width - The width of the scissor region in logical pixel unit.\n\t\t * @param {number} height - The height of the scissor region in logical pixel unit.\n\t\t */\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_scissor.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if the scissor test is enabled.\n\t\t *\n\t\t * @return {boolean} Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.getScissorTest = function () {\n\n\t\t\treturn _scissorTest;\n\n\t\t};\n\n\t\t/**\n\t\t * Enable or disable the scissor test. When this is enabled, only the pixels\n\t\t * within the defined scissor area will be affected by further renderer\n\t\t * actions.\n\t\t *\n\t\t * @param {boolean} boolean - Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom opaque sort function for the render lists. Pass `null`\n\t\t * to use the default `painterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setOpaqueSort = function ( method ) {\n\n\t\t\t_opaqueSort = method;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom transparent sort function for the render lists. Pass `null`\n\t\t * to use the default `reversePainterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setTransparentSort = function ( method ) {\n\n\t\t\t_transparentSort = method;\n\n\t\t};\n\n\t\t// Clearing\n\n\t\t/**\n\t\t * Returns the clear color.\n\t\t *\n\t\t * @param {Color} target - The method writes the result in this target object.\n\t\t * @return {Color} The clear color.\n\t\t */\n\t\tthis.getClearColor = function ( target ) {\n\n\t\t\treturn target.copy( background.getClearColor() );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear color and alpha.\n\t\t *\n\t\t * @param {Color} color - The clear color.\n\t\t * @param {number} [alpha=1] - The clear alpha.\n\t\t */\n\t\tthis.setClearColor = function () {\n\n\t\t\tbackground.setClearColor( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the clear alpha. Ranges within `[0,1]`.\n\t\t *\n\t\t * @return {number} The clear alpha.\n\t\t */\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn background.getClearAlpha();\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear alpha.\n\t\t *\n\t\t * @param {number} alpha - The clear alpha.\n\t\t */\n\t\tthis.setClearAlpha = function () {\n\n\t\t\tbackground.setClearAlpha( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Tells the renderer to clear its color, depth or stencil drawing buffer(s).\n\t\t * This method initializes the buffers to the current clear color values.\n\t\t *\n\t\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t\t */\n\t\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\t\tlet bits = 0;\n\n\t\t\tif ( color ) {\n\n\t\t\t\t// check if we're trying to clear an integer target\n\t\t\t\tlet isIntegerFormat = false;\n\t\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t\tconst targetFormat = _currentRenderTarget.texture.format;\n\t\t\t\t\tisIntegerFormat = INTEGER_FORMATS.has( targetFormat );\n\n\t\t\t\t}\n\n\t\t\t\t// use the appropriate clear functions to clear the target if it's a signed\n\t\t\t\t// or unsigned integer target\n\t\t\t\tif ( isIntegerFormat ) {\n\n\t\t\t\t\tconst targetType = _currentRenderTarget.texture.type;\n\t\t\t\t\tconst isUnsignedType = UNSIGNED_TYPES.has( targetType );\n\n\t\t\t\t\tconst clearColor = background.getClearColor();\n\t\t\t\t\tconst a = background.getClearAlpha();\n\t\t\t\t\tconst r = clearColor.r;\n\t\t\t\t\tconst g = clearColor.g;\n\t\t\t\t\tconst b = clearColor.b;\n\n\t\t\t\t\tif ( isUnsignedType ) {\n\n\t\t\t\t\t\tuintClearColor[ 0 ] = r;\n\t\t\t\t\t\tuintClearColor[ 1 ] = g;\n\t\t\t\t\t\tuintClearColor[ 2 ] = b;\n\t\t\t\t\t\tuintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tintClearColor[ 0 ] = r;\n\t\t\t\t\t\tintClearColor[ 1 ] = g;\n\t\t\t\t\t\tintClearColor[ 2 ] = b;\n\t\t\t\t\t\tintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferiv( _gl.COLOR, 0, intClearColor );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbits |= _gl.COLOR_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( depth ) {\n\n\t\t\t\tbits |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t}\n\n\t\t\tif ( stencil ) {\n\n\t\t\t\tbits |= _gl.STENCIL_BUFFER_BIT;\n\t\t\t\tthis.state.buffers.stencil.setMask( 0xffffffff );\n\n\t\t\t}\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the color buffer. Equivalent to calling `renderer.clear( true, false, false )`.\n\t\t */\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the depth buffer. Equivalent to calling `renderer.clear( false, true, false )`.\n\t\t */\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the stencil buffer. Equivalent to calling `renderer.clear( false, false, true )`.\n\t\t */\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\tcanvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tbackground.dispose();\n\t\t\trenderLists.dispose();\n\t\t\trenderStates.dispose();\n\t\t\tproperties.dispose();\n\t\t\tcubemaps.dispose();\n\t\t\tcubeuvmaps.dispose();\n\t\t\tobjects.dispose();\n\t\t\tbindingStates.dispose();\n\t\t\tuniformsGroups.dispose();\n\t\t\tprogramCache.dispose();\n\n\t\t\txr.dispose();\n\n\t\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t\tanimation.stop();\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tlog( 'WebGLRenderer: Context Lost.' );\n\n\t\t\t_isContextLost = true;\n\n\t\t}\n\n\t\tfunction onContextRestore( /* event */ ) {\n\n\t\t\tlog( 'WebGLRenderer: Context Restored.' );\n\n\t\t\t_isContextLost = false;\n\n\t\t\tconst infoAutoReset = info.autoReset;\n\t\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\t\tconst shadowMapType = shadowMap.type;\n\n\t\t\tinitGLContext();\n\n\t\t\tinfo.autoReset = infoAutoReset;\n\t\t\tshadowMap.enabled = shadowMapEnabled;\n\t\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\t\tshadowMap.type = shadowMapType;\n\n\t\t}\n\n\t\tfunction onContextCreationError( event ) {\n\n\t\t\terror( 'WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tconst material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReferences( material );\n\n\t\t\tproperties.remove( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\t\tconst programs = properties.get( material ).programs;\n\n\t\t\tif ( programs !== undefined ) {\n\n\t\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\t//\n\n\t\t\tlet index = geometry.index;\n\t\t\tlet rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\n\t\t\t\tif ( index === undefined ) return;\n\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst drawRange = geometry.drawRange;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet drawStart = drawRange.start * rangeFactor;\n\t\t\tlet drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\t\tif ( group !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, group.start * rangeFactor );\n\t\t\t\tdrawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );\n\n\t\t\t}\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, index.count );\n\n\t\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, position.count );\n\n\t\t\t}\n\n\t\t\tconst drawCount = drawEnd - drawStart;\n\n\t\t\tif ( drawCount < 0 || drawCount === Infinity ) return;\n\n\t\t\t//\n\n\t\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\t\tlet attribute;\n\t\t\tlet renderer = bufferRenderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattribute = attributes.get( index );\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( attribute );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tif ( object._multiDrawInstances !== null ) {\n\n\t\t\t\t\t// @deprecated, r174\n\t\t\t\t\twarnOnce( 'WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );\n\t\t\t\t\trenderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! extensions.get( 'WEBGL_multi_draw' ) ) {\n\n\t\t\t\t\t\tconst starts = object._multiDrawStarts;\n\t\t\t\t\t\tconst counts = object._multiDrawCounts;\n\t\t\t\t\t\tconst drawCount = object._multiDrawCount;\n\t\t\t\t\t\tconst bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1;\n\t\t\t\t\t\tconst uniforms = properties.get( material ).currentProgram.getUniforms();\n\t\t\t\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\t\t\t\tuniforms.setValue( _gl, '_gl_DrawID', i );\n\t\t\t\t\t\t\trenderer.render( starts[ i ] / bytesPerElement, counts[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\trenderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isInstancedMesh ) {\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tconst maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;\n\t\t\t\tconst instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Compile\n\n\t\tfunction prepareMaterial( material, scene, object ) {\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Compiles all materials in the scene with the camera. This is useful to precompile shaders\n\t\t * before the first rendering. If you want to add a 3D object to an existing scene, use the third\n\t\t * optional parameter for applying the target scene.\n\t\t *\n\t\t * Note that the (target) scene's lighting and environment must be configured before calling this method.\n\t\t *\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Set} The precompiled materials.\n\t\t */\n\t\tthis.compile = function ( scene, camera, targetScene = null ) {\n\n\t\t\tif ( targetScene === null ) targetScene = scene;\n\n\t\t\tcurrentRenderState = renderStates.get( targetScene );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t// gather lights from both the target scene and the new object that will be added to the scene.\n\n\t\t\ttargetScene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( scene !== targetScene ) {\n\n\t\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\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\tcurrentRenderState.setupLights();\n\n\t\t\t// Only initialize materials in the new scene, not the targetScene.\n\n\t\t\tconst materials = new Set();\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( ! ( object.isMesh || object.isPoints || object.isLine || object.isSprite ) ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material ) {\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\t\tprepareMaterial( material2, targetScene, object );\n\t\t\t\t\t\t\tmaterials.add( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tprepareMaterial( material, targetScene, object );\n\t\t\t\t\t\tmaterials.add( material );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tcurrentRenderState = renderStateStack.pop();\n\n\t\t\treturn materials;\n\n\t\t};\n\n\t\t// compileAsync\n\n\t\t/**\n\t\t * Asynchronous version of {@link WebGLRenderer#compile}.\n\t\t *\n\t\t * This method makes use of the `KHR_parallel_shader_compile` WebGL extension. Hence,\n\t\t * it is recommended to use this version of `compile()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Promise} A Promise that resolves when the given scene can be rendered without unnecessary stalling due to shader compilation.\n\t\t */\n\t\tthis.compileAsync = function ( scene, camera, targetScene = null ) {\n\n\t\t\tconst materials = this.compile( scene, camera, targetScene );\n\n\t\t\t// Wait for all the materials in the new object to indicate that they're\n\t\t\t// ready to be used before resolving the promise.\n\n\t\t\treturn new Promise( ( resolve ) => {\n\n\t\t\t\tfunction checkMaterialsReady() {\n\n\t\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\t\tconst materialProperties = properties.get( material );\n\t\t\t\t\t\tconst program = materialProperties.currentProgram;\n\n\t\t\t\t\t\tif ( program.isReady() ) {\n\n\t\t\t\t\t\t\t// remove any programs that report they're ready to use from the list\n\t\t\t\t\t\t\tmaterials.delete( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\t// once the list of compiling materials is empty, call the callback\n\n\t\t\t\t\tif ( materials.size === 0 ) {\n\n\t\t\t\t\t\tresolve( scene );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if some materials are still not ready, wait a bit and check again\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {\n\n\t\t\t\t\t// If we can check the compilation status of the materials without\n\t\t\t\t\t// blocking then do so right away.\n\n\t\t\t\t\tcheckMaterialsReady();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise start by waiting a bit to give the materials we just\n\t\t\t\t\t// initialized a chance to finish.\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time ) {\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t\t}\n\n\t\tfunction onXRSessionStart() {\n\n\t\t\tanimation.stop();\n\n\t\t}\n\n\t\tfunction onXRSessionEnd() {\n\n\t\t\tanimation.start();\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\t\t/**\n\t\t * Applications are advised to always define the animation loop\n\t\t * with this method and not manually with `requestAnimationFrame()`\n\t\t * for best compatibility.\n\t\t *\n\t\t * @param {?onAnimationCallback} callback - The application's animation loop.\n\t\t */\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\t\t\txr.setAnimationLoop( callback );\n\n\t\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t\t};\n\n\t\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t// Rendering\n\n\t\t/**\n\t\t * Renders the given scene (or other type of 3D object) using the given camera.\n\t\t *\n\t\t * The render is done to a previously specified render target set by calling {@link WebGLRenderer#setRenderTarget}\n\t\t * or to the canvas as usual.\n\t\t *\n\t\t * By default render buffers are cleared before rendering but you can prevent\n\t\t * this by setting the property `autoClear` to `false`. If you want to prevent\n\t\t * only certain buffers being cleared you can `autoClearColor`, `autoClearDepth`\n\t\t * or `autoClearStencil` to `false`. To force a clear, use {@link WebGLRenderer#clear}.\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\terror( 'WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( _isContextLost === true ) return;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix, WebGLCoordinateSystem, camera.reversedDepth );\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );\n\n\t\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\t\tcurrentRenderList.init();\n\n\t\t\trenderListStack.push( currentRenderList );\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tconst depthSensingMesh = _this.xr.getDepthSensingMesh();\n\n\t\t\t\tif ( depthSensingMesh !== null ) {\n\n\t\t\t\t\tprojectObject( depthSensingMesh, camera, - Infinity, _this.sortObjects );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\t\tcurrentRenderList.finish();\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t\t}\n\n\t\t\t_renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;\n\t\t\tif ( _renderBackground ) {\n\n\t\t\t\tbackground.addToRenderList( currentRenderList, scene );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis.info.render.frame ++;\n\n\t\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t\t//\n\n\t\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t\t// render scene\n\n\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) {\n\n\t\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\t\trenderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _currentRenderTarget !== null && _currentActiveMipmapLevel === 0 ) {\n\n\t\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t\t// _gl.finish();\n\n\t\t\tbindingStates.resetDefaultState();\n\t\t\t_currentMaterialId = -1;\n\t\t\t_currentCamera = null;\n\n\t\t\trenderStateStack.pop();\n\n\t\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera );\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderState = null;\n\n\t\t\t}\n\n\t\t\trenderListStack.pop();\n\n\t\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderList = null;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tconst visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isGroup ) {\n\n\t\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\t_vector4.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( object.boundingSphere.center );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( geometry.boundingSphere.center );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_vector4\n\t\t\t\t\t\t\t\t.applyMatrix4( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\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\tconst children = object.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\t\tconst { opaque: opaqueObjects, transmissive: transmissiveObjects, transparent: transparentObjects } = currentRenderList;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\tstate.setPolygonOffset( false );\n\n\t\t}\n\n\t\tfunction renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tif ( overrideMaterial !== null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) {\n\n\t\t\t\tcurrentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, {\n\t\t\t\t\tgenerateMipmaps: true,\n\t\t\t\t\ttype: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\t\tsamples: 4,\n\t\t\t\t\tstencilBuffer: stencil,\n\t\t\t\t\tresolveDepthBuffer: false,\n\t\t\t\t\tresolveStencilBuffer: false,\n\t\t\t\t\tcolorSpace: ColorManagement.workingColorSpace,\n\t\t\t\t} );\n\n\t\t\t\t// debug\n\n\t\t\t\t/*\n\t\t\t\tconst geometry = new PlaneGeometry();\n\t\t\t\tconst material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } );\n\n\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\tscene.add( mesh );\n\t\t\t\t*/\n\n\t\t\t}\n\n\t\t\tconst transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ];\n\n\t\t\tconst activeViewport = camera.viewport || _currentViewport;\n\t\t\ttransmissionRenderTarget.setSize( activeViewport.z * _this.transmissionResolutionScale, activeViewport.w * _this.transmissionResolutionScale );\n\n\t\t\t//\n\n\t\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t\tconst currentActiveCubeFace = _this.getActiveCubeFace();\n\t\t\tconst currentActiveMipmapLevel = _this.getActiveMipmapLevel();\n\n\t\t\t_this.setRenderTarget( transmissionRenderTarget );\n\n\t\t\t_this.getClearColor( _currentClearColor );\n\t\t\t_currentClearAlpha = _this.getClearAlpha();\n\t\t\tif ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );\n\n\t\t\t_this.clear();\n\n\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\t\tconst currentToneMapping = _this.toneMapping;\n\t\t\t_this.toneMapping = NoToneMapping;\n\n\t\t\t// Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector).\n\t\t\t// Transmission render pass requires viewport to match the transmissionRenderTarget.\n\t\t\tconst currentCameraViewport = camera.viewport;\n\t\t\tif ( camera.viewport !== undefined ) camera.viewport = undefined;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131\n\n\t\t\t\tlet renderTargetNeedsUpdate = false;\n\n\t\t\t\tfor ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst renderItem = transmissiveObjects[ i ];\n\n\t\t\t\t\tconst { object, geometry, material, group } = renderItem;\n\n\t\t\t\t\tif ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tconst currentSide = material.side;\n\n\t\t\t\t\t\tmaterial.side = BackSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t\t\tmaterial.side = currentSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderTargetNeedsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetNeedsUpdate === true ) {\n\n\t\t\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_this.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\t\t_this.setClearColor( _currentClearColor, _currentClearAlpha );\n\n\t\t\tif ( currentCameraViewport !== undefined ) camera.viewport = currentCameraViewport;\n\n\t\t\t_this.toneMapping = currentToneMapping;\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\t\tconst { object, geometry, group } = renderItem;\n\t\t\t\tlet material = renderItem.material;\n\n\t\t\t\tif ( material.allowOverride === true && overrideMaterial !== null ) {\n\n\t\t\t\t\tmaterial = overrideMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t}\n\n\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t\t}\n\n\t\tfunction getProgram( material, scene, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tconst lights = currentRenderState.state.lights;\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tconst lightsStateVersion = lights.state.version;\n\n\t\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\t\tlet programs = materialProperties.programs;\n\n\t\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tmaterialProperties.fog = scene.fog;\n\t\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\t\t\tmaterialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation;\n\n\t\t\tif ( programs === undefined ) {\n\n\t\t\t\t// new material\n\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\tprograms = new Map();\n\t\t\t\tmaterialProperties.programs = programs;\n\n\t\t\t}\n\n\t\t\tlet program = programs.get( programCacheKey );\n\n\t\t\tif ( program !== undefined ) {\n\n\t\t\t\t// early out if program and light state is identical\n\n\t\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\t\treturn program;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t\t}\n\n\t\t\tconst uniforms = materialProperties.uniforms;\n\n\t\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t\t}\n\n\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\t\tuniforms.spotLightMatrix.value = lights.state.spotLightMatrix;\n\t\t\t\tuniforms.spotLightMap.value = lights.state.spotLightMap;\n\t\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tmaterialProperties.currentProgram = program;\n\t\t\tmaterialProperties.uniformsList = null;\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction getUniformList( materialProperties ) {\n\n\t\t\tif ( materialProperties.uniformsList === null ) {\n\n\t\t\t\tconst progUniforms = materialProperties.currentProgram.getUniforms();\n\t\t\t\tmaterialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );\n\n\t\t\t}\n\n\t\t\treturn materialProperties.uniformsList;\n\n\t\t}\n\n\t\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tmaterialProperties.outputColorSpace = parameters.outputColorSpace;\n\t\t\tmaterialProperties.batching = parameters.batching;\n\t\t\tmaterialProperties.batchingColor = parameters.batchingColor;\n\t\t\tmaterialProperties.instancing = parameters.instancing;\n\t\t\tmaterialProperties.instancingColor = parameters.instancingColor;\n\t\t\tmaterialProperties.instancingMorph = parameters.instancingMorph;\n\t\t\tmaterialProperties.skinning = parameters.skinning;\n\t\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t\t}\n\n\t\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\ttextures.resetTextureUnits();\n\n\t\t\tconst fog = scene.fog;\n\t\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tconst colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );\n\t\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\t\tconst vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 );\n\t\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\t\tconst morphColors = !! geometry.morphAttributes.color;\n\n\t\t\tlet toneMapping = NoToneMapping;\n\n\t\t\tif ( material.toneMapped ) {\n\n\t\t\t\tif ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\t\ttoneMapping = _this.toneMapping;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tconst materialProperties = properties.get( material );\n\t\t\tconst lights = currentRenderState.state.lights;\n\n\t\t\tif ( _clippingEnabled === true ) {\n\n\t\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\t\tconst useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet needsProgramChange = false;\n\n\t\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.outputColorSpace !== colorSpace ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batching === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isBatchedMesh && materialProperties.batching === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tneedsProgramChange = true;\n\t\t\t\tmaterialProperties.__version = material.version;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet program = materialProperties.currentProgram;\n\n\t\t\tif ( needsProgramChange === true ) {\n\n\t\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t\tlet refreshProgram = false;\n\t\t\tlet refreshMaterial = false;\n\t\t\tlet refreshLights = false;\n\n\t\t\tconst p_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\t\t// common camera uniforms\n\n\t\t\t\tconst reversedDepthBuffer = state.buffers.depth.getReversed();\n\n\t\t\t\tif ( reversedDepthBuffer && camera.reversedDepth !== true ) {\n\n\t\t\t\t\tcamera._reversedDepth = true;\n\t\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t\t}\n\n\t\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tconst skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingIdTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingIdTexture', object._indirectTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingColorTexture' );\n\t\t\t\tif ( object._colorsTexture !== null ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'batchingColorTexture', object._colorsTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined ) ) {\n\n\t\t\t\tmorphtargets.update( object, geometry, program );\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t\t}\n\n\t\t\t// https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512\n\n\t\t\tif ( material.isMeshGouraudMaterial && material.envMap !== null ) {\n\n\t\t\t\tm_uniforms.envMap.value = envMap;\n\n\t\t\t\tm_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) {\n\n\t\t\t\tm_uniforms.envMapIntensity.value = scene.environmentIntensity;\n\n\t\t\t}\n\n\t\t\t// Set DFG LUT for physically-based materials\n\t\t\tif ( m_uniforms.dfgLUT !== undefined ) {\n\n\t\t\t\tm_uniforms.dfgLUT.value = getDFGLUT();\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] );\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\n\t\t\t}\n\n\t\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\t\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t\t}\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\t// UBOs\n\n\t\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\tfunction materialNeedsLights( material ) {\n\n\t\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t\t}\n\n\t\t/**\n\t\t * Returns the active cube face.\n\t\t *\n\t\t * @return {number} The active cube face.\n\t\t */\n\t\tthis.getActiveCubeFace = function () {\n\n\t\t\treturn _currentActiveCubeFace;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active mipmap level.\n\t\t *\n\t\t * @return {number} The active mipmap level.\n\t\t */\n\t\tthis.getActiveMipmapLevel = function () {\n\n\t\t\treturn _currentActiveMipmapLevel;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active render target.\n\t\t *\n\t\t * @return {?WebGLRenderTarget} The active render target. Returns `null` if no render target\n\t\t * is currently set.\n\t\t */\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = renderTarget.resolveDepthBuffer === false;\n\t\t\tif ( renderTargetProperties.__autoAllocateDepthBuffer === false ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t}\n\n\t\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = renderTargetProperties.__autoAllocateDepthBuffer ? undefined : depthTexture;\n\n\t\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\t};\n\n\t\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t\t};\n\n\t\tconst _scratchFrameBuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Sets the active rendertarget.\n\t\t *\n\t\t * @param {?WebGLRenderTarget} renderTarget - The render target to set. When `null` is given,\n\t\t * the canvas is set as the active render target instead.\n\t\t * @param {number} [activeCubeFace=0] - The active cube face when using a cube render target.\n\t\t * Indicates the z layer to render in to when using 3D or array render targets.\n\t\t * @param {number} [activeMipmapLevel=0] - The active mipmap level.\n\t\t */\n\t\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\t\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\t\tlet useDefaultFramebuffer = true;\n\t\t\tlet framebuffer = null;\n\t\t\tlet isCube = false;\n\t\t\tlet isRenderTarget3D = false;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\t\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t\t} else if ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t// check if the depth texture is already bound to the frame buffer and that it's been initialized\n\t\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\t\t\tif ( renderTargetProperties.__boundDepthTexture !== depthTexture ) {\n\n\t\t\t\t\t\t// check if the depth texture is compatible\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdepthTexture !== null &&\n\t\t\t\t\t\t\tproperties.has( depthTexture ) &&\n\t\t\t\t\t\t\t( renderTarget.width !== depthTexture.image.width || renderTarget.height !== depthTexture.image.height )\n\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\tthrow new Error( 'WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Swap the depth buffer to the currently attached one\n\t\t\t\t\t\ttextures.setupDepthRenderbuffer( renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst texture = renderTarget.texture;\n\n\t\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisCube = true;\n\n\t\t\t\t} else if ( ( renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t} else {\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t}\n\n\t\t\t// Use a scratch frame buffer if rendering to a mip level to avoid depth buffers\n\t\t\t// being bound that are different sizes.\n\t\t\tif ( activeMipmapLevel !== 0 ) {\n\n\t\t\t\tframebuffer = _scratchFrameBuffer;\n\n\t\t\t}\n\n\t\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( framebufferBound && useDefaultFramebuffer ) {\n\n\t\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport );\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\t\tconst layer = activeCubeFace;\n\n\t\t\t\tfor ( let i = 0; i < renderTarget.textures.length; i ++ ) {\n\n\t\t\t\t\tconst textureProperties = properties.get( renderTarget.textures[ i ] );\n\n\t\t\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, textureProperties.__webglTexture, activeMipmapLevel, layer );\n\n\t\t\t\t}\n\n\t\t\t} else if ( renderTarget !== null && activeMipmapLevel !== 0 ) {\n\n\t\t\t\t// Only bind the frame buffer if we are using a scratch frame buffer to render to a mipmap.\n\t\t\t\t// If we rebind the texture when using a multi sample buffer then an error about inconsistent samples will be thrown.\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t}\n\n\t\t\t_currentMaterialId = -1; // reset current material to ensure correct uniform bindings\n\n\t\t};\n\n\t\t/**\n\t\t * Reads the pixel data from the given render target into the given buffer.\n\t\t *\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t */\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Asynchronous, non-blocking version of {@link WebGLRenderer#readRenderTargetPixels}.\n\t\t *\n\t\t * It is recommended to use this version of `readRenderTargetPixels()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t * @return {Promise} A Promise that resolves when the read has been finished. The resolve provides the read data as a typed array.\n\t\t */\n\t\tthis.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t// set the active frame buffer to the one we want to read\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst glBuffer = _gl.createBuffer();\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );\n\n\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );\n\n\t\t\t\t\t// reset the frame buffer to the currently set buffer before waiting\n\t\t\t\t\tconst currFramebuffer = _currentRenderTarget !== null ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, currFramebuffer );\n\n\t\t\t\t\t// check if the commands have finished every 8 ms\n\t\t\t\t\tconst sync = _gl.fenceSync( _gl.SYNC_GPU_COMMANDS_COMPLETE, 0 );\n\n\t\t\t\t\t_gl.flush();\n\n\t\t\t\t\tawait probeAsync( _gl, sync, 4 );\n\n\t\t\t\t\t// read the data and delete the buffer\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.getBufferSubData( _gl.PIXEL_PACK_BUFFER, 0, buffer );\n\t\t\t\t\t_gl.deleteBuffer( glBuffer );\n\t\t\t\t\t_gl.deleteSync( sync );\n\n\t\t\t\t\treturn buffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Copies pixels from the current bound framebuffer into the given texture.\n\t\t *\n\t\t * @param {FramebufferTexture} texture - The texture.\n\t\t * @param {?Vector2} [position=null] - The start position of the copy operation.\n\t\t * @param {number} [level=0] - The mip level. The default represents the base mip.\n\t\t */\n\t\tthis.copyFramebufferToTexture = function ( texture, position = null, level = 0 ) {\n\n\t\t\tconst levelScale = Math.pow( 2, - level );\n\t\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\t\tconst x = position !== null ? position.x : 0;\n\t\t\tconst y = position !== null ? position.y : 0;\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, x, y, width, height );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tconst _srcFramebuffer = _gl.createFramebuffer();\n\t\tconst _dstFramebuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Copies data of the given source texture into a destination texture.\n\t\t *\n\t\t * When using render target textures as `srcTexture` and `dstTexture`, you must make sure both render targets are initialized\n\t\t * {@link WebGLRenderer#initRenderTarget}.\n\t\t *\n\t\t * @param {Texture} srcTexture - The source texture.\n\t\t * @param {Texture} dstTexture - The destination texture.\n\t\t * @param {?(Box2|Box3)} [srcRegion=null] - A bounding box which describes the source region. Can be two or three-dimensional.\n\t\t * @param {?(Vector2|Vector3)} [dstPosition=null] - A vector that represents the origin of the destination region. Can be two or three-dimensional.\n\t\t * @param {number} [srcLevel=0] - The source mipmap level to copy.\n\t\t * @param {?number} [dstLevel=null] - The destination mipmap level.\n\t\t */\n\t\tthis.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = null ) {\n\n\t\t\t// support the previous signature with just a single dst mipmap level\n\t\t\tif ( dstLevel === null ) {\n\n\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t// @deprecated, r171\n\t\t\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels.' );\n\t\t\t\t\tdstLevel = srcLevel;\n\t\t\t\t\tsrcLevel = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdstLevel = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// gather the necessary dimensions to copy\n\t\t\tlet width, height, depth, minX, minY, minZ;\n\t\t\tlet dstX, dstY, dstZ;\n\t\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ dstLevel ] : srcTexture.image;\n\t\t\tif ( srcRegion !== null ) {\n\n\t\t\t\twidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\t\theight = srcRegion.max.y - srcRegion.min.y;\n\t\t\t\tdepth = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1;\n\t\t\t\tminX = srcRegion.min.x;\n\t\t\t\tminY = srcRegion.min.y;\n\t\t\t\tminZ = srcRegion.isBox3 ? srcRegion.min.z : 0;\n\n\t\t\t} else {\n\n\t\t\t\tconst levelScale = Math.pow( 2, - srcLevel );\n\t\t\t\twidth = Math.floor( image.width * levelScale );\n\t\t\t\theight = Math.floor( image.height * levelScale );\n\t\t\t\tif ( srcTexture.isDataArrayTexture ) {\n\n\t\t\t\t\tdepth = image.depth;\n\n\t\t\t\t} else if ( srcTexture.isData3DTexture ) {\n\n\t\t\t\t\tdepth = Math.floor( image.depth * levelScale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdepth = 1;\n\n\t\t\t\t}\n\n\t\t\t\tminX = 0;\n\t\t\t\tminY = 0;\n\t\t\t\tminZ = 0;\n\n\t\t\t}\n\n\t\t\tif ( dstPosition !== null ) {\n\n\t\t\t\tdstX = dstPosition.x;\n\t\t\t\tdstY = dstPosition.y;\n\t\t\t\tdstZ = dstPosition.z;\n\n\t\t\t} else {\n\n\t\t\t\tdstX = 0;\n\t\t\t\tdstY = 0;\n\t\t\t\tdstZ = 0;\n\n\t\t\t}\n\n\t\t\t// Set up the destination target\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\t\t\tlet glTarget;\n\n\t\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t\t} else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D;\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\t// used for copying data from cpu\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\t\tconst currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );\n\n\t\t\t// set up the src texture\n\t\t\tconst isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture;\n\t\t\tconst isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture;\n\t\t\tif ( srcTexture.isDepthTexture ) {\n\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\t\t\t\tconst srcRenderTargetProperties = properties.get( srcTextureProperties.__renderTarget );\n\t\t\t\tconst dstRenderTargetProperties = properties.get( dstTextureProperties.__renderTarget );\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// if the source or destination are a 3d target then a layer needs to be bound\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( srcTexture ).__webglTexture, srcLevel, minZ + i );\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( dstTexture ).__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else if ( srcLevel !== 0 || srcTexture.isRenderTargetTexture || properties.has( srcTexture ) ) {\n\n\t\t\t\t// get the appropriate frame buffers\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\n\t\t\t\t// bind the frame buffer targets\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, _srcFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, _dstFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// assign the correct layers and mip maps to the frame buffers\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, srcTextureProperties.__webglTexture, srcLevel, minZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, srcTextureProperties.__webglTexture, srcLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, dstTextureProperties.__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, dstTextureProperties.__webglTexture, dstLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// copy the data using the fastest function that can achieve the copy\n\t\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.COLOR_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t\t} else if ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.copyTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ + i, minX, minY, width, height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.copyTexSubImage2D( glTarget, dstLevel, dstX, dstY, minX, minY, width, height );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// unbind read, draw buffers\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t// copy data into the 3d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// copy data into the 2d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, image.width, image.height, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// reset values\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( dstLevel === 0 && dstTexture.generateMipmaps ) {\n\n\t\t\t\t_gl.generateMipmap( glTarget );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given WebGLRenderTarget memory. Useful for initializing a render target so data\n\t\t * can be copied into it using {@link WebGLRenderer#copyTextureToTexture} before it has been\n\t\t * rendered to.\n\t\t *\n\t\t * @param {WebGLRenderTarget} target - The render target.\n\t\t */\n\t\tthis.initRenderTarget = function ( target ) {\n\n\t\t\tif ( properties.get( target ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( target );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given texture. Useful for preloading a texture rather than waiting until first\n\t\t * render (which can cause noticeable lags due to decode and GPU upload overhead).\n\t\t *\n\t\t * @param {Texture} texture - The texture.\n\t\t */\n\t\tthis.initTexture = function ( texture ) {\n\n\t\t\tif ( texture.isCubeTexture ) {\n\n\t\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to reset the internal WebGL state. This method is mostly\n\t\t * relevant for applications which share a single WebGL context across\n\t\t * multiple WebGL libraries.\n\t\t */\n\t\tthis.resetState = function () {\n\n\t\t\t_currentActiveCubeFace = 0;\n\t\t\t_currentActiveMipmapLevel = 0;\n\t\t\t_currentRenderTarget = null;\n\n\t\t\tstate.reset();\n\t\t\tbindingStates.reset();\n\n\t\t};\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Defines the coordinate system of the renderer.\n\t *\n\t * In `WebGLRenderer`, the value is always `WebGLCoordinateSystem`.\n\t *\n\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t * @default WebGLCoordinateSystem\n\t * @readonly\n\t */\n\tget coordinateSystem() {\n\n\t\treturn WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Defines the output color space of the renderer.\n\t *\n\t * @type {SRGBColorSpace|LinearSRGBColorSpace}\n\t * @default SRGBColorSpace\n\t */\n\tget outputColorSpace() {\n\n\t\treturn this._outputColorSpace;\n\n\t}\n\n\tset outputColorSpace( colorSpace ) {\n\n\t\tthis._outputColorSpace = colorSpace;\n\n\t\tconst gl = this.getContext();\n\t\tgl.drawingBufferColorSpace = ColorManagement._getDrawingBufferColorSpace( colorSpace );\n\t\tgl.unpackColorSpace = ColorManagement._getUnpackColorSpace();\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, ArrayCamera, BackSide, BoxGeometry, BufferAttribute, BufferGeometry, ByteType, CineonToneMapping, ClampToEdgeWrapping, Color, ColorManagement, ConstantAlphaFactor, ConstantColorFactor, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CustomToneMapping, Data3DTexture, DataArrayTexture, DataTexture, DepthFormat, DepthStencilFormat, DepthTexture, DoubleSide, DstAlphaFactor, DstColorFactor, EqualCompare, EqualDepth, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, FloatType, FrontSide, Frustum, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, HalfFloatType, IntType, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NoBlending, NoColorSpace, NoToneMapping, NormalBlending, NotEqualCompare, NotEqualDepth, ObjectSpaceNormalMap, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PerspectiveCamera, Plane, PlaneGeometry, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReverseSubtractEquation, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, ShaderChunk, ShaderLib, ShaderMaterial, ShortType, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, SubtractEquation, SubtractiveBlending, TangentSpaceNormalMap, Texture, Uint16BufferAttribute, Uint32BufferAttribute, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebXRController, ZeroFactor, createCanvasElement, error, log, warn, warnOnce };\n","import * as M from \"three\";\nimport { Controls as Ya, Vector3 as K, MOUSE as gn, TOUCH as dn, Quaternion as Ni, Spherical as vr, Vector2 as ue, Ray as rr, Plane as Xi, MathUtils as or, Mesh as ar, OrthographicCamera as Vo, BufferGeometry as Zi, Float32BufferAttribute as br, ShaderMaterial as tt, UniformsUtils as nt, WebGLRenderTarget as Vn, HalfFloatType as _t, NoBlending as ze, Clock as Ka, Color as st, Matrix4 as Me, DataTexture as lr, RepeatWrapping as vt, MeshNormalMaterial as Ho, AddEquation as fn, ZeroFactor as pn, DstAlphaFactor as Bs, DstColorFactor as Ns, CustomBlending as jo, DepthTexture as Go, DepthStencilFormat as Wo, UnsignedInt248Type as Xo, NearestFilter as xn, RGBAFormat as $a, UnsignedByteType as Ja, RedFormat as Qa, FloatType as Ci, RawShaderMaterial as el, ColorManagement as Fi, SRGBTransfer as tl, LinearToneMapping as nl, ReinhardToneMapping as il, CineonToneMapping as sl, ACESFilmicToneMapping as rl, AgXToneMapping as ol, NeutralToneMapping as al, CustomToneMapping as ll, Loader as Zo, FileLoader as Ui, SRGBColorSpace as Lt, LinearSRGBColorSpace as rt, BufferAttribute as ut, InterleavedBuffer as qo, InterleavedBufferAttribute as Yo, TrianglesDrawMode as cl, TriangleFanDrawMode as Fs, TriangleStripDrawMode as Ko, LoaderUtils as Nn, MeshPhysicalMaterial as ft, SpotLight as hl, PointLight as ul, DirectionalLight as dl, InstancedMesh as fl, InstancedBufferAttribute as pl, Object3D as $o, TextureLoader as ml, ImageBitmapLoader as gl, LinearMipmapLinearFilter as Jo, NearestMipmapLinearFilter as yl, LinearMipmapNearestFilter as wl, NearestMipmapNearestFilter as xl, LinearFilter as Hn, MirroredRepeatWrapping as _l, ClampToEdgeWrapping as vl, PointsMaterial as bl, Material as ns, LineBasicMaterial as Ml, MeshStandardMaterial as Qo, DoubleSide as qi, MeshBasicMaterial as On, PropertyBinding as Sl, SkinnedMesh as Tl, LineSegments as El, Line as Al, LineLoop as Cl, Points as Pl, Group as is, PerspectiveCamera as Rl, Skeleton as Dl, AnimationClip as kl, Bone as Il, InterpolateDiscrete as Ll, InterpolateLinear as ea, Texture as Mr, VectorKeyframeTrack as Sr, NumberKeyframeTrack as Tr, QuaternionKeyframeTrack as Er, FrontSide as Us, Interpolant as zl, Box3 as ot, Sphere as Ol, DataTextureLoader as Bl, DataUtils as qn, Line3 as Ke, Triangle as Ue, BackSide as Nl, REVISION as ta, Vector4 as en, Matrix3 as Fl } from \"three\";\nclass Ul {\n engine;\n scene;\n constructor(e) {\n this.engine = e, this.scene = new M.Scene();\n let t = new M.Group();\n t.name = \"groupEdge\", this.scene.add(t);\n }\n}\nclass Vl {\n engine;\n // 透视相机\n perspectiveCamera;\n // 正交相机\n orthographicCamera;\n constructor(e) {\n this.engine = e, this.perspectiveCamera = new M.PerspectiveCamera(\n 60,\n this.engine.container.clientWidth / this.engine.container.clientHeight,\n 0.1,\n 1e3\n ), this.perspectiveCamera.position.set(2, 2, 2), this.perspectiveCamera.lookAt(0, 0, 0);\n const t = 50, n = this.engine.container.clientWidth / this.engine.container.clientHeight;\n this.orthographicCamera = new M.OrthographicCamera(t * n / -2, t * n / 2, t / 2, t / -2, 0.1, 1e3);\n }\n // 切换当前相机\n switchCurrentCamera() {\n this.engine.camera === this.perspectiveCamera ? this.switchToOrthographicCamera() : this.switchToPerspectiveCamera();\n }\n // 更新合成器中的相机引用\n updateComposerCamera() {\n if (!this.engine.composerModule?.composer)\n return;\n const e = this.engine.camera, t = this.engine.composerModule.composer;\n if (t.passes)\n for (const n of t.passes)\n n.camera !== void 0 && (n.camera = e);\n }\n // 透视相机\n switchToPerspectiveCamera() {\n if (!this.engine.controls)\n return;\n const e = this.engine.camera.position.clone(), t = this.engine.controls.target.clone();\n this.engine.camera = this.perspectiveCamera, this.engine.scene.camera = this.perspectiveCamera, this.perspectiveCamera.position.copy(e), this.perspectiveCamera.lookAt(t), this.engine.controlModule.orbitControls.object = this.perspectiveCamera, this.engine.controlModule.firstPersonControls.camera = this.perspectiveCamera, this.updateComposerCamera(), this.perspectiveCamera.updateProjectionMatrix(), this.perspectiveCamera.updateMatrixWorld();\n }\n // 正交相机\n switchToOrthographicCamera() {\n if (!this.engine.controls)\n return;\n const e = this.engine.camera.position.clone(), t = this.engine.controls.target.clone();\n this.engine.camera = this.orthographicCamera, this.engine.scene.camera = this.orthographicCamera, this.orthographicCamera.position.copy(e), this.orthographicCamera.lookAt(t), this.engine.controlModule.orbitControls.object = this.orthographicCamera, this.engine.controlModule.firstPersonControls.camera = this.orthographicCamera, this.updateComposerCamera(), this.orthographicCamera.updateProjectionMatrix(), this.orthographicCamera.updateMatrixWorld();\n }\n // 获取当前相机类型\n getCameraType() {\n return this.engine.camera === this.perspectiveCamera ? \"perspective\" : this.engine.camera === this.orthographicCamera ? \"orthographic\" : \"perspective\";\n }\n // 获取当前相机姿态\n getCameraPose() {\n const e = this.engine.camera, t = this.getCameraType(), n = {\n type: t,\n position: {\n x: e.position.x,\n y: e.position.y,\n z: e.position.z\n },\n rotation: {\n x: e.rotation.x,\n y: e.rotation.y,\n z: e.rotation.z\n },\n quaternion: {\n x: e.quaternion.x,\n y: e.quaternion.y,\n z: e.quaternion.z,\n w: e.quaternion.w\n }\n };\n return this.engine.controls && this.engine.controls.target && (n.target = {\n x: this.engine.controls.target.x,\n y: this.engine.controls.target.y,\n z: this.engine.controls.target.z\n }), t === \"orthographic\" && (n.zoom = e.zoom), n;\n }\n // 通过相机姿态还原相机位置\n restoreCameraPose(e) {\n this.getCameraType() !== e.type && (e.type === \"perspective\" ? this.switchToPerspectiveCamera() : this.switchToOrthographicCamera());\n const n = this.engine.camera;\n n.position.set(e.position.x, e.position.y, e.position.z), e.quaternion ? n.quaternion.set(\n e.quaternion.x,\n e.quaternion.y,\n e.quaternion.z,\n e.quaternion.w\n ) : e.rotation && n.rotation.set(e.rotation.x, e.rotation.y, e.rotation.z), e.target && this.engine.controls && this.engine.controls.target && this.engine.controls.target.set(\n e.target.x,\n e.target.y,\n e.target.z\n ), e.type === \"orthographic\" && e.zoom !== void 0 && (n.zoom = e.zoom, n.updateProjectionMatrix()), n.updateMatrix(), n.updateMatrixWorld(!0), this.engine.controls && this.engine.controls.update && this.engine.controls.update();\n }\n}\nclass Hl {\n engine;\n deviceType;\n constructor(e) {\n this.engine = e, this.deviceType = \"PC\";\n }\n // 获取设备类型\n getDeviceType() {\n return this.deviceType;\n }\n // 获取容器尺寸\n getContainerSize() {\n return {\n width: this.engine.container.clientWidth,\n height: this.engine.container.clientHeight\n };\n }\n}\nclass jl {\n engine;\n renderer;\n constructor(e) {\n this.engine = e, this.renderer = null;\n }\n createRenderer() {\n const { width: e, height: t } = this.engine.deviceModule.getContainerSize();\n return this.renderer = new M.WebGLRenderer({\n //antialias: this.engine.options.antialias ?? true,\n alpha: !0,\n premultipliedAlpha: !1,\n stencil: !0\n }), this.renderer.setClearColor(0, 0), this.renderer.setSize(e, t), this.renderer.setPixelRatio(window.devicePixelRatio), this.renderer.shadowMap.enabled = !0, this.renderer.shadowMap.type = M.PCFSoftShadowMap, this.renderer.localClippingEnabled = !0, this.renderer.outputColorSpace = M.SRGBColorSpace, this.engine.container.appendChild(this.renderer.domElement), this.renderer;\n }\n disposeRenderer() {\n this.renderer?.dispose();\n }\n}\nconst Ar = { type: \"change\" }, cr = { type: \"start\" }, na = { type: \"end\" }, Yn = new rr(), Cr = new Xi(), Gl = Math.cos(70 * or.DEG2RAD), ve = new K(), Ne = 2 * Math.PI, fe = {\n NONE: -1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6\n}, ss = 1e-6;\nclass Wl extends Ya {\n /**\n * Constructs a new controls instance.\n *\n * @param {Object3D} object - The object that is managed by the controls.\n * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n */\n constructor(e, t, n = null) {\n super(t, n), this.engine = e, this.state = fe.NONE, this.target = new K(), this.cursor = new K(), this.origin = new K(0, 0, 0), this.showOriginIcon = !0, this.originPosition = {\n x: 0,\n y: 0\n }, this.minDistance = 0, this.maxDistance = 1 / 0, this.minZoom = 0, this.maxZoom = 1 / 0, this.minTargetRadius = 0, this.maxTargetRadius = 1 / 0, this.minPolarAngle = 0, this.maxPolarAngle = Math.PI, this.minAzimuthAngle = -1 / 0, this.maxAzimuthAngle = 1 / 0, this.enableDamping = !1, this.dampingFactor = 0.05, this.enableZoom = !0, this.zoomSpeed = 1, this.enableRotate = !0, this.rotateSpeed = 1, this.keyRotateSpeed = 1, this.enablePan = !0, this.panSpeed = 1, this.screenSpacePanning = !0, this.keyPanSpeed = 7, this.zoomToCursor = !1, this.autoRotate = !1, this.autoRotateSpeed = 2, this.keys = { LEFT: \"ArrowLeft\", UP: \"ArrowUp\", RIGHT: \"ArrowRight\", BOTTOM: \"ArrowDown\" }, this.mouseButtons = { LEFT: gn.ROTATE, MIDDLE: gn.DOLLY, RIGHT: gn.PAN }, this.touches = { ONE: dn.ROTATE, TWO: dn.DOLLY_PAN }, this.target0 = this.target.clone(), this.position0 = this.object.position.clone(), this.zoom0 = this.object.zoom, this._domElementKeyEvents = null, this._lastPosition = new K(), this._lastQuaternion = new Ni(), this._lastTargetPosition = new K(), this._quat = new Ni().setFromUnitVectors(t.up, new K(0, 1, 0)), this._quatInverse = this._quat.clone().invert(), this._spherical = new vr(), this._sphericalDelta = new vr(), this._scale = 1, this._panOffset = new K(), this._rotateStart = new ue(), this._rotateEnd = new ue(), this._rotateDelta = new ue(), this._panStart = new ue(), this._panEnd = new ue(), this._panDelta = new ue(), this._dollyStart = new ue(), this._dollyEnd = new ue(), this._dollyDelta = new ue(), this._dollyDirection = new K(), this._mouse = new ue(), this._performCursorZoom = !1, this._pointers = [], this._pointerPositions = {}, this._controlActive = !1, this._onPointerMove = Zl.bind(this), this._onPointerDown = Xl.bind(this), this._onPointerUp = ql.bind(this), this._onContextMenu = tc.bind(this), this._onMouseWheel = $l.bind(this), this._onKeyDown = Jl.bind(this), this._onTouchStart = Ql.bind(this), this._onTouchMove = ec.bind(this), this._onMouseDown = Yl.bind(this), this._onMouseMove = Kl.bind(this), this._interceptControlDown = nc.bind(this), this._interceptControlUp = ic.bind(this), this.domElement !== null && this.connect(this.domElement), this.update();\n }\n connect(e) {\n super.connect(e), this.domElement.addEventListener(\"pointerdown\", this._onPointerDown), this.domElement.addEventListener(\"pointercancel\", this._onPointerUp), this.domElement.addEventListener(\"contextmenu\", this._onContextMenu), this.domElement.addEventListener(\"wheel\", this._onMouseWheel, { passive: !1 }), this.domElement.getRootNode().addEventListener(\"keydown\", this._interceptControlDown, { passive: !0, capture: !0 }), this.domElement.style.touchAction = \"none\";\n }\n disconnect() {\n this.domElement.removeEventListener(\"pointerdown\", this._onPointerDown), this.domElement.removeEventListener(\"pointermove\", this._onPointerMove), this.domElement.removeEventListener(\"pointerup\", this._onPointerUp), this.domElement.removeEventListener(\"pointercancel\", this._onPointerUp), this.domElement.removeEventListener(\"wheel\", this._onMouseWheel), this.domElement.removeEventListener(\"contextmenu\", this._onContextMenu), this.stopListenToKeyEvents(), this.domElement.getRootNode().removeEventListener(\"keydown\", this._interceptControlDown, { capture: !0 }), this.domElement.style.touchAction = \"auto\";\n }\n dispose() {\n this.disconnect();\n }\n /**\n * Get the current vertical rotation, in radians.\n *\n * @return {number} The current vertical rotation, in radians.\n */\n getPolarAngle() {\n return this._spherical.phi;\n }\n /**\n * Get the current horizontal rotation, in radians.\n *\n * @return {number} The current horizontal rotation, in radians.\n */\n getAzimuthalAngle() {\n return this._spherical.theta;\n }\n /**\n * Returns the distance from the camera to the target.\n *\n * @return {number} The distance from the camera to the target.\n */\n getDistance() {\n return this.object.position.distanceTo(this.target);\n }\n /**\n * Adds key event listeners to the given DOM element.\n * `window` is a recommended argument for using this method.\n *\n * @param {HTMLElement} domElement - The DOM element\n */\n listenToKeyEvents(e) {\n e.addEventListener(\"keydown\", this._onKeyDown), this._domElementKeyEvents = e;\n }\n /**\n * Removes the key event listener previously defined with `listenToKeyEvents()`.\n */\n stopListenToKeyEvents() {\n this._domElementKeyEvents !== null && (this._domElementKeyEvents.removeEventListener(\"keydown\", this._onKeyDown), this._domElementKeyEvents = null);\n }\n /**\n * Save the current state of the controls. This can later be recovered with `reset()`.\n */\n saveState() {\n this.target0.copy(this.target), this.position0.copy(this.object.position), this.zoom0 = this.object.zoom;\n }\n /**\n * Reset the controls to their state from either the last time the `saveState()`\n * was called, or the initial state.\n */\n reset() {\n this.target.copy(this.target0), this.object.position.copy(this.position0), this.object.zoom = this.zoom0, this.object.updateProjectionMatrix(), this.dispatchEvent(Ar), this.update(), this.state = fe.NONE;\n }\n update(e = null) {\n this.engine && this.engine.interactionManager && this.engine.interactionManager.origin && this.origin.copy(this.engine.interactionManager.origin);\n const t = this.object.position;\n ve.copy(t).sub(this.target), ve.applyQuaternion(this._quat), this._spherical.setFromVector3(ve), this.autoRotate && this.state === fe.NONE && this._rotateLeft(this._getAutoRotationAngle(e)), this.enableDamping ? (this._spherical.theta += this._sphericalDelta.theta * this.dampingFactor, this._spherical.phi += this._sphericalDelta.phi * this.dampingFactor) : (this._spherical.theta += this._sphericalDelta.theta, this._spherical.phi += this._sphericalDelta.phi);\n let n = this.minAzimuthAngle, i = this.maxAzimuthAngle;\n isFinite(n) && isFinite(i) && (n < -Math.PI ? n += Ne : n > Math.PI && (n -= Ne), i < -Math.PI ? i += Ne : i > Math.PI && (i -= Ne), n <= i ? this._spherical.theta = Math.max(n, Math.min(i, this._spherical.theta)) : this._spherical.theta = this._spherical.theta > (n + i) / 2 ? Math.max(n, this._spherical.theta) : Math.min(i, this._spherical.theta)), this._spherical.phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this._spherical.phi)), this._spherical.makeSafe(), this.enableDamping === !0 ? this.target.addScaledVector(this._panOffset, this.dampingFactor) : this.target.add(this._panOffset), this.target.sub(this.cursor), this.target.clampLength(this.minTargetRadius, this.maxTargetRadius), this.target.add(this.cursor);\n let s = !1;\n if (this.zoomToCursor && this._performCursorZoom || this.object.isOrthographicCamera)\n this._spherical.radius = this._clampDistance(this._spherical.radius);\n else {\n const r = this._spherical.radius;\n this._spherical.radius = this._clampDistance(this._spherical.radius * this._scale), s = r != this._spherical.radius;\n }\n if (ve.setFromSpherical(this._spherical), ve.applyQuaternion(this._quatInverse), this.engine && this.engine.DeviceType === \"PC\") {\n const r = new K();\n if (r.copy(this.origin).sub(this.target), r.lengthSq() > 1e-4 && (this._sphericalDelta.theta !== 0 || this._sphericalDelta.phi !== 0)) {\n const l = this.enableDamping ? this.dampingFactor * 3 : 1, h = new K(0, 1, 0), c = new K();\n this.object.getWorldDirection(c);\n const u = c.clone().cross(h).normalize(), m = new K().copy(this.object.position).sub(this.origin);\n m.applyAxisAngle(h, Math.PI * this._sphericalDelta.theta * l), m.applyAxisAngle(u, Math.PI * this._sphericalDelta.phi * l), t.copy(this.origin).add(m);\n const f = new K().copy(this.target).sub(this.origin);\n f.applyAxisAngle(h, Math.PI * this._sphericalDelta.theta * l), f.applyAxisAngle(u, Math.PI * this._sphericalDelta.phi * l), this.target.copy(this.origin).add(f);\n } else if (this._panOffset.lengthSq() === 0 && this._sphericalDelta.phi === 0 && this._sphericalDelta.theta === 0) {\n if (this._scale !== 1) {\n const l = new K();\n this.object.getWorldDirection(l);\n const h = this._spherical.radius * 0.05 * (this._scale - 1);\n t.add(l.multiplyScalar(h));\n }\n } else\n t.copy(this.target).add(ve);\n this.object.lookAt(this.target);\n } else\n t.copy(this.target).add(ve), this.object.lookAt(this.target);\n if (this.enableDamping === !0 ? (this._sphericalDelta.theta *= 1 - this.dampingFactor, this._sphericalDelta.phi *= 1 - this.dampingFactor, this._panOffset.multiplyScalar(1 - this.dampingFactor)) : (this._sphericalDelta.set(0, 0, 0), this._panOffset.set(0, 0, 0)), this.zoomToCursor && this._performCursorZoom) {\n let r = null;\n if (this.object.isPerspectiveCamera) {\n const a = ve.length();\n r = this._clampDistance(a * this._scale);\n const l = a - r;\n this.object.position.addScaledVector(this._dollyDirection, l), this.object.updateMatrixWorld(), s = !!l;\n } else if (this.object.isOrthographicCamera) {\n const a = new K(this._mouse.x, this._mouse.y, 0);\n a.unproject(this.object);\n const l = this.object.zoom;\n this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)), this.object.updateProjectionMatrix(), s = l !== this.object.zoom;\n const h = new K(this._mouse.x, this._mouse.y, 0);\n h.unproject(this.object), this.object.position.sub(h).add(a), this.object.updateMatrixWorld(), r = ve.length();\n } else\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.\"), this.zoomToCursor = !1;\n r !== null && (this.screenSpacePanning ? this.target.set(0, 0, -1).transformDirection(this.object.matrix).multiplyScalar(r).add(this.object.position) : (Yn.origin.copy(this.object.position), Yn.direction.set(0, 0, -1).transformDirection(this.object.matrix), Math.abs(this.object.up.dot(Yn.direction)) < Gl ? this.object.lookAt(this.target) : (Cr.setFromNormalAndCoplanarPoint(this.object.up, this.target), Yn.intersectPlane(Cr, this.target))));\n } else if (this.object.isOrthographicCamera) {\n const r = this.object.zoom;\n this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)), r !== this.object.zoom && (this.object.updateProjectionMatrix(), s = !0);\n }\n return this._scale = 1, this._performCursorZoom = !1, s || this._lastPosition.distanceToSquared(this.object.position) > ss || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > ss || this._lastTargetPosition.distanceToSquared(this.target) > ss ? (this.dispatchEvent(Ar), this._lastPosition.copy(this.object.position), this._lastQuaternion.copy(this.object.quaternion), this._lastTargetPosition.copy(this.target), !0) : !1;\n }\n _getAutoRotationAngle(e) {\n return e !== null ? Ne / 60 * this.autoRotateSpeed * e : Ne / 60 / 60 * this.autoRotateSpeed;\n }\n _getZoomScale(e) {\n const t = Math.abs(e * 0.01);\n return Math.pow(0.95, this.zoomSpeed * t);\n }\n _rotateLeft(e) {\n this._sphericalDelta.theta -= e;\n }\n _rotateUp(e) {\n this._sphericalDelta.phi -= e;\n }\n _panLeft(e, t) {\n ve.setFromMatrixColumn(t, 0), ve.multiplyScalar(-e), this._panOffset.add(ve);\n }\n _panUp(e, t) {\n this.screenSpacePanning === !0 ? ve.setFromMatrixColumn(t, 1) : (ve.setFromMatrixColumn(t, 0), ve.crossVectors(this.object.up, ve)), ve.multiplyScalar(e), this._panOffset.add(ve);\n }\n // deltaX and deltaY are in pixels; right and down are positive\n _pan(e, t) {\n const n = this.domElement;\n if (this.object.isPerspectiveCamera) {\n const i = this.object.position;\n ve.copy(i).sub(this.target);\n let s = ve.length();\n s *= Math.tan(this.object.fov / 2 * Math.PI / 180), this._panLeft(2 * e * s / n.clientHeight, this.object.matrix), this._panUp(2 * t * s / n.clientHeight, this.object.matrix);\n } else this.object.isOrthographicCamera ? (this._panLeft(e * (this.object.right - this.object.left) / this.object.zoom / n.clientWidth, this.object.matrix), this._panUp(t * (this.object.top - this.object.bottom) / this.object.zoom / n.clientHeight, this.object.matrix)) : (console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\"), this.enablePan = !1);\n }\n _dollyOut(e) {\n this.object.isPerspectiveCamera || this.object.isOrthographicCamera ? this._scale /= e : (console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\"), this.enableZoom = !1);\n }\n _dollyIn(e) {\n this.object.isPerspectiveCamera || this.object.isOrthographicCamera ? this._scale *= e : (console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\"), this.enableZoom = !1);\n }\n _updateZoomParameters(e, t) {\n if (!this.zoomToCursor)\n return;\n this._performCursorZoom = !0;\n const n = this.domElement.getBoundingClientRect(), i = e - n.left, s = t - n.top, r = n.width, a = n.height;\n this._mouse.x = i / r * 2 - 1, this._mouse.y = -(s / a) * 2 + 1, this._dollyDirection.set(this._mouse.x, this._mouse.y, 1).unproject(this.object).sub(this.object.position).normalize();\n }\n _clampDistance(e) {\n return Math.max(this.minDistance, Math.min(this.maxDistance, e));\n }\n //\n // event callbacks - update the object state\n //\n _handleMouseDownRotate(e) {\n this._rotateStart.set(e.clientX, e.clientY);\n }\n _handleMouseDownDolly(e) {\n this._updateZoomParameters(e.clientX, e.clientX), this._dollyStart.set(e.clientX, e.clientY);\n }\n _handleMouseDownPan(e) {\n this._panStart.set(e.clientX, e.clientY);\n }\n _handleMouseMoveRotate(e) {\n this._rotateEnd.set(e.clientX, e.clientY), this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed);\n const t = this.domElement;\n this._rotateLeft(Ne * this._rotateDelta.x / t.clientHeight), this._rotateUp(Ne * this._rotateDelta.y / t.clientHeight), this._rotateStart.copy(this._rotateEnd), this.update();\n }\n _handleMouseMoveDolly(e) {\n this._dollyEnd.set(e.clientX, e.clientY), this._dollyDelta.subVectors(this._dollyEnd, this._dollyStart), this._dollyDelta.y > 0 ? this._dollyOut(this._getZoomScale(this._dollyDelta.y)) : this._dollyDelta.y < 0 && this._dollyIn(this._getZoomScale(this._dollyDelta.y)), this._dollyStart.copy(this._dollyEnd), this.update();\n }\n _handleMouseMovePan(e) {\n this._panEnd.set(e.clientX, e.clientY), this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed), this._pan(this._panDelta.x, this._panDelta.y), this._panStart.copy(this._panEnd), this.update();\n }\n _handleMouseWheel(e) {\n this._updateZoomParameters(e.clientX, e.clientY);\n let t;\n if (this.object.isOrthographicCamera)\n e.deltaY < 0 ? this._dollyIn(this._getZoomScale(e.deltaY)) : e.deltaY !== 0 && this._dollyOut(this._getZoomScale(e.deltaY));\n else {\n const n = Math.abs(e.deltaY * 0.01);\n t = Math.pow(1.15, this.zoomSpeed * n), e.deltaY > 0 ? this._scale /= t : e.deltaY !== 0 && (this._scale *= t);\n }\n this.update();\n }\n _handleKeyDown(e) {\n let t = !1;\n switch (e.code) {\n case this.keys.UP:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateUp(Ne * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, this.keyPanSpeed), t = !0;\n break;\n case this.keys.BOTTOM:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateUp(-Ne * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, -this.keyPanSpeed), t = !0;\n break;\n case this.keys.LEFT:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateLeft(Ne * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(this.keyPanSpeed, 0), t = !0;\n break;\n case this.keys.RIGHT:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateLeft(-Ne * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(-this.keyPanSpeed, 0), t = !0;\n break;\n }\n t && (e.preventDefault(), this.update());\n }\n _handleTouchStartRotate(e) {\n if (this._pointers.length === 1)\n this._rotateStart.set(e.pageX, e.pageY);\n else {\n const t = this._getSecondPointerPosition(e), n = 0.5 * (e.pageX + t.x), i = 0.5 * (e.pageY + t.y);\n this._rotateStart.set(n, i);\n }\n }\n _handleTouchStartPan(e) {\n if (this._pointers.length === 1)\n this._panStart.set(e.pageX, e.pageY);\n else {\n const t = this._getSecondPointerPosition(e), n = 0.5 * (e.pageX + t.x), i = 0.5 * (e.pageY + t.y);\n this._panStart.set(n, i);\n }\n }\n _handleTouchStartDolly(e) {\n const t = this._getSecondPointerPosition(e), n = e.pageX - t.x, i = e.pageY - t.y, s = Math.sqrt(n * n + i * i);\n this._dollyStart.set(0, s);\n }\n _handleTouchStartDollyPan(e) {\n this.enableZoom && this._handleTouchStartDolly(e), this.enablePan && this._handleTouchStartPan(e);\n }\n _handleTouchStartDollyRotate(e) {\n this.enableZoom && this._handleTouchStartDolly(e), this.enableRotate && this._handleTouchStartRotate(e);\n }\n _handleTouchMoveRotate(e) {\n if (this._pointers.length == 1)\n this._rotateEnd.set(e.pageX, e.pageY);\n else {\n const n = this._getSecondPointerPosition(e), i = 0.5 * (e.pageX + n.x), s = 0.5 * (e.pageY + n.y);\n this._rotateEnd.set(i, s);\n }\n this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed);\n const t = this.domElement;\n this._rotateLeft(Ne * this._rotateDelta.x / t.clientHeight), this._rotateUp(Ne * this._rotateDelta.y / t.clientHeight), this._rotateStart.copy(this._rotateEnd);\n }\n _handleTouchMovePan(e) {\n if (this._pointers.length === 1)\n this._panEnd.set(e.pageX, e.pageY);\n else {\n const t = this._getSecondPointerPosition(e), n = 0.5 * (e.pageX + t.x), i = 0.5 * (e.pageY + t.y);\n this._panEnd.set(n, i);\n }\n this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed), this._pan(this._panDelta.x, this._panDelta.y), this._panStart.copy(this._panEnd);\n }\n _handleTouchMoveDolly(e) {\n const t = this._getSecondPointerPosition(e), n = e.pageX - t.x, i = e.pageY - t.y, s = Math.sqrt(n * n + i * i);\n this._dollyEnd.set(0, s), this._dollyDelta.set(0, Math.pow(this._dollyEnd.y / this._dollyStart.y, this.zoomSpeed)), this._dollyOut(this._dollyDelta.y), this._dollyStart.copy(this._dollyEnd);\n const r = (e.pageX + t.x) * 0.5, a = (e.pageY + t.y) * 0.5;\n this._updateZoomParameters(r, a);\n }\n _handleTouchMoveDollyPan(e) {\n this.enableZoom && this._handleTouchMoveDolly(e), this.enablePan && this._handleTouchMovePan(e);\n }\n _handleTouchMoveDollyRotate(e) {\n this.enableZoom && this._handleTouchMoveDolly(e), this.enableRotate && this._handleTouchMoveRotate(e);\n }\n // pointers\n _addPointer(e) {\n this._pointers.push(e.pointerId);\n }\n _removePointer(e) {\n delete this._pointerPositions[e.pointerId];\n for (let t = 0; t < this._pointers.length; t++)\n if (this._pointers[t] == e.pointerId) {\n this._pointers.splice(t, 1);\n return;\n }\n }\n _isTrackingPointer(e) {\n for (let t = 0; t < this._pointers.length; t++)\n if (this._pointers[t] == e.pointerId) return !0;\n return !1;\n }\n _trackPointer(e) {\n let t = this._pointerPositions[e.pointerId];\n t === void 0 && (t = new ue(), this._pointerPositions[e.pointerId] = t), t.set(e.pageX, e.pageY);\n }\n _getSecondPointerPosition(e) {\n const t = e.pointerId === this._pointers[0] ? this._pointers[1] : this._pointers[0];\n return this._pointerPositions[t];\n }\n //\n _customWheelEvent(e) {\n const t = e.deltaMode, n = {\n clientX: e.clientX,\n clientY: e.clientY,\n deltaY: e.deltaY\n };\n switch (t) {\n case 1:\n n.deltaY *= 16;\n break;\n case 2:\n n.deltaY *= 100;\n break;\n }\n return e.ctrlKey && !this._controlActive && (n.deltaY *= 10), n;\n }\n}\nfunction Xl(o) {\n this.enabled !== !1 && (this._pointers.length === 0 && (this.domElement.setPointerCapture(o.pointerId), this.domElement.addEventListener(\"pointermove\", this._onPointerMove), this.domElement.addEventListener(\"pointerup\", this._onPointerUp)), !this._isTrackingPointer(o) && (this._addPointer(o), o.pointerType === \"touch\" ? this._onTouchStart(o) : this._onMouseDown(o)));\n}\nfunction Zl(o) {\n this.enabled !== !1 && (o.pointerType === \"touch\" ? this._onTouchMove(o) : this._onMouseMove(o));\n}\nfunction ql(o) {\n switch (this._removePointer(o), this._pointers.length) {\n case 0:\n this.domElement.releasePointerCapture(o.pointerId), this.domElement.removeEventListener(\"pointermove\", this._onPointerMove), this.domElement.removeEventListener(\"pointerup\", this._onPointerUp), this.dispatchEvent(na), this.state = fe.NONE;\n break;\n case 1:\n const e = this._pointers[0], t = this._pointerPositions[e];\n this._onTouchStart({ pointerId: e, pageX: t.x, pageY: t.y });\n break;\n }\n}\nfunction Yl(o) {\n if (this.showOriginIcon && this.engine && this.engine.ToolUntils) {\n const t = this.engine.scene?.camera || this.object;\n this.originPosition = this.engine.ToolUntils.WorldPointToScreenPoint(this.origin.clone(), t), console.log(\"Origin position:\", this.originPosition, \"Origin:\", this.origin);\n }\n let e;\n switch (o.button) {\n case 0:\n e = this.mouseButtons.LEFT;\n break;\n case 1:\n e = this.mouseButtons.MIDDLE;\n break;\n case 2:\n e = this.mouseButtons.RIGHT;\n break;\n default:\n e = -1;\n }\n switch (e) {\n case gn.DOLLY:\n if (this.enableZoom === !1) return;\n this._handleMouseDownDolly(o), this.state = fe.DOLLY;\n break;\n case gn.ROTATE:\n if (o.ctrlKey || o.metaKey || o.shiftKey) {\n if (this.enablePan === !1) return;\n this._handleMouseDownPan(o), this.state = fe.PAN;\n } else {\n if (this.enableRotate === !1) return;\n this._handleMouseDownRotate(o), this.state = fe.ROTATE;\n }\n break;\n case gn.PAN:\n if (o.ctrlKey || o.metaKey || o.shiftKey) {\n if (this.enableRotate === !1) return;\n this._handleMouseDownRotate(o), this.state = fe.ROTATE;\n } else {\n if (this.enablePan === !1) return;\n this._handleMouseDownPan(o), this.state = fe.PAN;\n }\n break;\n default:\n this.state = fe.NONE;\n }\n this.state !== fe.NONE && this.dispatchEvent(cr);\n}\nfunction Kl(o) {\n switch (this.state) {\n case fe.ROTATE:\n if (this.enableRotate === !1) return;\n this._handleMouseMoveRotate(o);\n break;\n case fe.DOLLY:\n if (this.enableZoom === !1) return;\n this._handleMouseMoveDolly(o);\n break;\n case fe.PAN:\n if (this.enablePan === !1) return;\n this._handleMouseMovePan(o);\n break;\n }\n}\nfunction $l(o) {\n this.enabled === !1 || this.enableZoom === !1 || this.state !== fe.NONE || (o.preventDefault(), this.dispatchEvent(cr), this._handleMouseWheel(this._customWheelEvent(o)), this.dispatchEvent(na));\n}\nfunction Jl(o) {\n this.enabled !== !1 && this._handleKeyDown(o);\n}\nfunction Ql(o) {\n switch (this._trackPointer(o), this._pointers.length) {\n case 1:\n switch (this.touches.ONE) {\n case dn.ROTATE:\n if (this.enableRotate === !1) return;\n this._handleTouchStartRotate(o), this.state = fe.TOUCH_ROTATE;\n break;\n case dn.PAN:\n if (this.enablePan === !1) return;\n this._handleTouchStartPan(o), this.state = fe.TOUCH_PAN;\n break;\n default:\n this.state = fe.NONE;\n }\n break;\n case 2:\n switch (this.touches.TWO) {\n case dn.DOLLY_PAN:\n if (this.enableZoom === !1 && this.enablePan === !1) return;\n this._handleTouchStartDollyPan(o), this.state = fe.TOUCH_DOLLY_PAN;\n break;\n case dn.DOLLY_ROTATE:\n if (this.enableZoom === !1 && this.enableRotate === !1) return;\n this._handleTouchStartDollyRotate(o), this.state = fe.TOUCH_DOLLY_ROTATE;\n break;\n default:\n this.state = fe.NONE;\n }\n break;\n default:\n this.state = fe.NONE;\n }\n this.state !== fe.NONE && this.dispatchEvent(cr);\n}\nfunction ec(o) {\n switch (this._trackPointer(o), this.state) {\n case fe.TOUCH_ROTATE:\n if (this.enableRotate === !1) return;\n this._handleTouchMoveRotate(o), this.update();\n break;\n case fe.TOUCH_PAN:\n if (this.enablePan === !1) return;\n this._handleTouchMovePan(o), this.update();\n break;\n case fe.TOUCH_DOLLY_PAN:\n if (this.enableZoom === !1 && this.enablePan === !1) return;\n this._handleTouchMoveDollyPan(o), this.update();\n break;\n case fe.TOUCH_DOLLY_ROTATE:\n if (this.enableZoom === !1 && this.enableRotate === !1) return;\n this._handleTouchMoveDollyRotate(o), this.update();\n break;\n default:\n this.state = fe.NONE;\n }\n}\nfunction tc(o) {\n this.enabled !== !1 && o.preventDefault();\n}\nfunction nc(o) {\n o.key === \"Control\" && (this._controlActive = !0, this.domElement.getRootNode().addEventListener(\"keyup\", this._interceptControlUp, { passive: !0, capture: !0 }));\n}\nfunction ic(o) {\n o.key === \"Control\" && (this._controlActive = !1, this.domElement.getRootNode().removeEventListener(\"keyup\", this._interceptControlUp, { passive: !0, capture: !0 }));\n}\nclass Pr {\n constructor(e, t, n, i) {\n this._Engine = e, this.camera = t, this.domElement = n, this._isEnabled = !1, this._rayOriginOffset = new M.Vector3(0, -1, 0), this._camerLocalDirection = new M.Vector3(), this._tmpVector = new M.Vector3(), this._rayCaster = new M.Raycaster(), this._fallingTime = 0, this._euler = new M.Euler(0, 0, 0, \"YZX\"), this._prevMouseX = 0, this._prevMouseY = 0, this.applyGravity = !1, this.gravityMinHeight = !0, this.applyCollision = !0, this.positionEasing = !0, this.lookflag = 1, this.lookSpeed = 8e-3, this.moveSpeed = 0.02, this.playerHeight = 1.4, this.maxRotateX = 0.8, this.g = 9.8, this.bindmousedown = this._Engine && this._Engine.DeviceType !== \"PC\" ? this.onTouchStart.bind(this) : this.onMouseDown.bind(this), this.bindmouseup = this._Engine && this._Engine.DeviceType !== \"PC\" ? this.onTouchEnd.bind(this) : this.onMouseUp.bind(this), this.bindmousemove = this._Engine && this._Engine.DeviceType !== \"PC\" ? this.onTouchMove.bind(this) : this.onMouseMove.bind(this), this.bindonKeyDown = this.onKeyDown.bind(this), this.bindonKeyUp = this.onKeyUp.bind(this), this.bindMousewheel = this.onMousewheel.bind(this), this.needMousewheel = !1, this.moveWheelRun = !0, this.moveWheelStop = !1, this.wheelClock, this.keydown = !1, this.GetEngine = () => e;\n }\n /**\n * @param {Object} colliders set objects for collision detection\n */\n set colliders(e) {\n this._rayCastObjects = e;\n }\n /**\n * @param {boolean} isEnabled set if this camera control is enabled\n */\n set enabled(e) {\n this._isEnabled !== e && (this._isEnabled = e, this._euler.setFromQuaternion(this.camera.quaternion), e ? this.addEvents() : this.removeEvents());\n }\n /**\n * @description: getter if current camera control is enabled.\n */\n get enabled() {\n return this._isEnabled;\n }\n addEvents() {\n const e = this._Engine?.DeviceType, t = e === \"PC\" || !e;\n console.log(\"[FirstPersonCameraControl] addEvents - DeviceType:\", e, \"isPC:\", t), t ? (console.log(\"[FirstPersonCameraControl] 添加鼠标事件监听器 - mousedown, mouseup\"), this.domElement.addEventListener(\"mousedown\", this.bindmousedown, !1), this.domElement.addEventListener(\"mouseup\", this.bindmouseup, !1)) : (console.log(\"[FirstPersonCameraControl] 添加触摸事件监听器\"), this.domElement.addEventListener(\"touchstart\", this.bindmousedown, !1), this.domElement.addEventListener(\"touchend\", this.bindmouseup, !1)), window.addEventListener(\"keydown\", this.bindonKeyDown, !1), window.addEventListener(\"keyup\", this.bindonKeyUp, !1), this.needMousewheel && (document.addEventListener && document.addEventListener(\"DOMMouseScroll\", this.bindMousewheel, !1), window.addEventListener(\"mousewheel\", this.bindMousewheel, !1));\n }\n removeEvents() {\n this._Engine && this._Engine.DeviceType !== \"PC\" ? (this.domElement.removeEventListener(\"touchstart\", this.bindmousedown), this.domElement.removeEventListener(\"touchend\", this.bindmouseup), this.domElement.removeEventListener(\"touchmove\", this.bindmousemove)) : (this.domElement.removeEventListener(\"mousedown\", this.bindmousedown), this.domElement.removeEventListener(\"mouseup\", this.bindmouseup), this.domElement.removeEventListener(\"mousemove\", this.bindmousemove)), window.removeEventListener(\"keydown\", this.bindonKeyDown), window.removeEventListener(\"keyup\", this.bindonKeyUp), this.needMousewheel && (document.addEventListener && document.removeEventListener(\"DOMMouseScroll\", this.bindMousewheel), window.removeEventListener(\"mousewheel\", this.bindMousewheel));\n }\n onMousewheel(e) {\n debugger;\n let t;\n switch (e.wheelDelta ? (e.wheelDelta > 0 && (t = \"up\"), e.wheelDelta < 0 && (t = \"down\")) : e.detail && (e.detail < 0 && (t = \"up\"), e.detail > 0 && (t = \"down\")), t) {\n case \"up\":\n this._camerLocalDirection.z = 1;\n break;\n case \"down\":\n this._camerLocalDirection.z = -1;\n break;\n }\n this.moveWheelRun == !0 ? (this.moveWheelRun = !1, this.moveWheelStop = !0, this.wheelClock = setTimeout(() => {\n this.moveWheelStop == !0 && (this.moveWheelStop = !1, this.moveWheelRun = !0, this._camerLocalDirection.z = 0);\n }, 200)) : (clearTimeout(this.wheelClock), this.wheelClock = setTimeout(() => {\n this.moveWheelStop == !0 && (this.moveWheelStop = !1, this.moveWheelRun = !0, this._camerLocalDirection.z = 0);\n }, 150));\n }\n onMouseDown(e) {\n console.log(\"[FirstPersonCameraControl] onMouseDown 被调用\", e), this.domElement.addEventListener(\"mousemove\", this.bindmousemove, !1), this._prevMouseX = e.screenX, this._prevMouseY = e.screenY;\n }\n onMouseMove(e) {\n if (this._isEnabled == !1)\n return;\n let t = this._prevMouseX ? e.screenX - this._prevMouseX : 0, n = this._prevMouseY ? e.screenY - this._prevMouseY : 0, i = this._euler.x - n * this.lookflag * this.lookSpeed;\n i >= 0 ? i < this.maxRotateX ? this._euler.x = i : this._euler.x = this.maxRotateX : i > -this.maxRotateX ? this._euler.x = i : this._euler.x = -this.maxRotateX, this._euler.y -= t * this.lookSpeed, this.camera.quaternion.setFromEuler(this._euler), this._prevMouseX = e.screenX, this._prevMouseY = e.screenY;\n let s = this.GetEngine();\n s.movefirst = !0;\n var r = new CustomEvent(\"bimengine:camerachange\", {\n detail: \"\"\n });\n window.dispatchEvent(r);\n }\n onMouseUp(e) {\n let t = this.GetEngine();\n t.movefirst = !1, this.domElement.removeEventListener(\"mousemove\", this.bindmousemove);\n }\n onTouchStart(e) {\n this.domElement.addEventListener(\"touchmove\", this.bindmousemove, !1), this._prevMouseX = e.targetTouches[0].clientX, this._prevMouseY = e.targetTouches[0].clientY;\n }\n onTouchMove(e) {\n if (this._isEnabled == !1)\n return;\n let t = this._prevMouseX ? e.targetTouches[0].clientX - this._prevMouseX : 0, n = this._prevMouseY ? e.targetTouches[0].clientY - this._prevMouseY : 0, i = this._euler.x - n * this.lookflag * this.lookSpeed;\n i >= 0 ? i < this.maxRotateX ? this._euler.x = i : this._euler.x = this.maxRotateX : i > -this.maxRotateX ? this._euler.x = i : this._euler.x = -this.maxRotateX, this._euler.y -= t * this.lookSpeed, this.camera.quaternion.setFromEuler(this._euler), this._prevMouseX = e.targetTouches[0].clientX, this._prevMouseY = e.targetTouches[0].clientY;\n let s = this.GetEngine();\n s.movefirst = !0;\n var r = new CustomEvent(\"bimengine:camerachange\", {\n detail: \"\"\n });\n window.dispatchEvent(r);\n }\n onTouchEnd(e) {\n let t = this.GetEngine();\n t.movefirst = !1, this.domElement.removeEventListener(\"touchmove\", this.bindmousemove);\n }\n onKeyDown(e) {\n var t = new CustomEvent(\"bimengine:camerachange\", {\n detail: \"\"\n });\n let n = this.GetEngine();\n switch (n.movefirst = !0, window.dispatchEvent(t), e.keyCode) {\n case 38:\n this.rotateY(-1);\n break;\n case 81:\n this.keydown = !0, this._camerLocalDirection.y = 1;\n break;\n case 69:\n this._camerLocalDirection.y = -1;\n break;\n case 87:\n this._camerLocalDirection.z = 1;\n break;\n case 37:\n this.rotateX(-1);\n break;\n case 65:\n this._camerLocalDirection.x = -1;\n break;\n case 40:\n this.rotateY(1);\n break;\n case 83:\n this._camerLocalDirection.z = -1;\n break;\n case 39:\n this.rotateX(1);\n break;\n case 68:\n this._camerLocalDirection.x = 1;\n break;\n }\n }\n onKeyUp(e) {\n let t = this.GetEngine();\n switch (t.movefirst = !1, e.keyCode) {\n case 38:\n // up\n case 87:\n this._camerLocalDirection.z = 0;\n break;\n case 37:\n // left\n case 65:\n this._camerLocalDirection.x = 0;\n break;\n case 40:\n // down\n case 83:\n this._camerLocalDirection.z = 0;\n break;\n case 39:\n // right\n case 68:\n this._camerLocalDirection.x = 0;\n break;\n case 81:\n case 69:\n this.keydown = !1, this._camerLocalDirection.y = 0;\n break;\n }\n }\n /**\n * @description: rotate camera by left/right\n * @param {Number} value\n * @return: null\n */\n rotateX(e) {\n this._euler.y -= e * this.lookSpeed, this.camera.quaternion.setFromEuler(this._euler);\n }\n /**\n * @description: rotate camera by up/down\n * @param {Number} value\n * @return: null\n */\n rotateY(e) {\n let t = this._euler.x - e * this.lookflag * 0.5 * this.lookSpeed;\n t >= 0 ? t < this.maxRotateX ? this._euler.x = t : this._euler.x = this.maxRotateX : t > -this.maxRotateX ? this._euler.x = t : this._euler.x = -this.maxRotateX, this.camera.quaternion.setFromEuler(this._euler);\n }\n /**\n * @description: update current calcuate each frame.\n */\n update() {\n this.keydown || this.gravityTest(), this.collisionTest();\n }\n gravityTest() {\n if (this.applyGravity) {\n let e = !0;\n this._fallingTime += 0.01, this._tmpVector.set(0, -1, 0);\n const t = this.hitTest();\n if (t) {\n const n = t.point.add(new M.Vector3(0, this.playerHeight, 0));\n if (this.positionEasing) {\n if (n.y >= this.camera.position.y || n.y - this.camera.position.y < 0.2) {\n this.setCameraHeight(this.camera.position.y + (n.y - this.camera.position.y) * 0.08), this._fallingTime = 0, e = !1;\n return;\n }\n } else t.distance < this.playerHeight && (this.setCameraHeight(n.y), this._fallingTime = 0, e = !1);\n }\n e && this.setCameraHeight(this.camera.position.y - this.g * Math.pow(this._fallingTime, 2));\n } else\n this.setCameraHeight(this.camera.position.y);\n }\n collisionTest() {\n this._camerLocalDirection.x !== 0 && this.collisionTestX(), this._camerLocalDirection.z !== 0 && this.collisionTestZ(), this._camerLocalDirection.y !== 0 && this.collisionTestY();\n }\n collisionTestX() {\n let e = this.GetEngine();\n if (e.movefirst = !0, this._tmpVector.setFromMatrixColumn(this.camera.matrix, 0), this._tmpVector.multiplyScalar(this._camerLocalDirection.x), this.applyCollision) {\n const t = this.hitTest();\n if (t && t.distance < 0.3)\n return;\n }\n this.camera.position.addScaledVector(this._tmpVector, this.moveSpeed);\n }\n collisionTestZ() {\n let e = this.GetEngine();\n if (e.movefirst = !0, this._tmpVector.setFromMatrixColumn(this.camera.matrix, 0), this._tmpVector.crossVectors(this.camera.up, this._tmpVector), this._tmpVector.multiplyScalar(this._camerLocalDirection.z), this.applyCollision) {\n const t = this.hitTest();\n if (t && t.distance < 0.3)\n return;\n }\n this.camera.position.addScaledVector(this._tmpVector, this.moveSpeed);\n }\n collisionTestY() {\n let e = this.GetEngine();\n if (e.movefirst = !0, this._tmpVector.setFromMatrixColumn(this.camera.matrix, 0), this._tmpVector = new M.Vector3(0, 1, 0), this._tmpVector.multiplyScalar(this._camerLocalDirection.y), this.applyCollision) {\n const n = this.hitTest();\n if (n && n.distance < 0.3)\n return;\n }\n let t = this.camera.position.clone().addScaledVector(this._tmpVector, this.moveSpeed);\n this.setCameraHeight(t.y);\n }\n // 设置相机Y方向位置\n setCameraHeight(e) {\n let t = this.getMinHeight();\n this.gravityMinHeight && t !== void 0 && e < t ? this.camera.position.y = t : this.camera.position.y = e;\n }\n // 获得所有模型最低点\n getMinHeight() {\n let e, t = this.GetEngine(), n = t.ToolUntils ? t.ToolUntils.GetBoundingBox(t) : null;\n return t && n && (e = n.min.y), e;\n }\n hitTest() {\n const e = this.camera.position.clone().add(this._rayOriginOffset);\n this._rayCaster.ray.origin = e, this._rayCaster.ray.direction = this._tmpVector;\n var n = this.GetEngine().scene.ground;\n return n && n.material.type, null;\n }\n}\nfunction hr(o) {\n const e = {\n self: null,\n // 当前激活的行为对象\n options: null,\n // 行为配置选项\n mouseDownTime: 0,\n // 鼠标按下时的时间戳\n mouseDownPosition: null,\n // 鼠标按下的位置\n lastClickTime: 0\n // 上次点击时间\n };\n e.init = function(u, m) {\n e.self != null && e.self.disActive != null && e.self.type != u.type && e.self.disActive(), e.self = u, m == null && (m = {\n showCatch: !1\n }), e.options = m;\n }, e.render = function() {\n e.self && e.self.render != null && e.self.render();\n }, e.active = function() {\n o.renderer.domElement.addEventListener(\"mousedown\", a), o.renderer.domElement.addEventListener(\"mouseup\", h), o.renderer.domElement.addEventListener(\"mousemove\", l), window.addEventListener(\"keydown\", t), window.addEventListener(\"keyup\", n);\n }, e.disActive = function() {\n o.renderer.domElement.removeEventListener(\"mousedown\", a), o.renderer.domElement.removeEventListener(\"mouseup\", h), o.renderer.domElement.removeEventListener(\"mousemove\", l), window.removeEventListener(\"keydown\", t), window.removeEventListener(\"keyup\", n);\n };\n function t(u) {\n (u.keyCode === 8 || u.keyCode === 46) && e.self && e.self.handelKeyDeleteDown != null && e.self.handelKeyDeleteDown(), u.keyCode === 27 && e.self && e.self.handelKeyEscDown != null && e.self.handelKeyEscDown(), u.keyCode === 13 && e.self && e.self.handelKeyEnterDown != null && e.self.handelKeyEnterDown(), u.keyCode === 32 && e.self && e.self.handelKeySpaceDown != null && e.self.handelKeySpaceDown(), u.key === \"Control\" && e.self && e.self.handelKeyCtrlDown != null && e.self.handelKeyCtrlDown(), u.key === \"Delete\" && e.self && e.self.handelKeyDeleteDown != null && e.self.handelKeyDeleteDown(), u.key === \"Shift\" && e.self && e.self.handelKeyShiftDown != null && e.self.handelKeyShiftDown(), u.key === \"Meta\" && e.self && e.self.handelKeyMetaDown != null && e.self.handelKeyMetaDown();\n }\n function n(u) {\n u.key === \"Alt\" && e.self && e.self.handelKeyAltUp != null && e.self.handelKeyAltUp(), u.key === \"Tab\" && e.self && e.self.handelKeyTabUp != null && e.self.handelKeyTabUp(), u.key === \"Control\" && e.self && e.self.handelKeyCtrlUp != null && e.self.handelKeyCtrlUp(), u.key === \"Shift\" && e.self && e.self.handelKeyShiftUp != null && e.self.handelKeyShiftUp(), u.key === \"Meta\" && e.self && e.self.handelKeyMetaUp != null && e.self.handelKeyMetaUp(), u.key === \"Command\" && e.self && e.self.handelKeyCommandUp != null && e.self.handelKeyCommandUp(), u.key === \"Windows\" && e.self && e.self.handelKeyWindowsUp != null && e.self.handelKeyWindowsUp();\n }\n function i(u) {\n const m = new M.Vector2(), f = o.renderer.domElement.clientWidth, d = o.renderer.domElement.clientHeight;\n return m.x = u.offsetX / f * 2 - 1, m.y = -(u.offsetY / d) * 2 + 1, m;\n }\n function s(u) {\n const m = new M.Raycaster(), f = i(u);\n return m.setFromCamera(f, o.camera), m;\n }\n function r(u, m = !1) {\n const f = s(u);\n if (u.raycaster = f, m) {\n const d = c(f, u);\n u.catch = d;\n }\n }\n function a(u) {\n u.button === 0 && (e.mouseDownTime = Date.now(), e.mouseDownPosition = new M.Vector3(u.offsetX, u.offsetY, 0), e.self && e.self.handleMouseDown != null && (o.engineStatus.isFree = !0, r(u, !0), u.catch != null && o.controlModule.orbitControls.origin.set(u.catch.point.x, u.catch.point.y, u.catch.point.z), e.self.handleMouseDown(u)));\n }\n function l(u) {\n e.self && e.self.handleMouseMove != null && (r(u, !0), e.self.handleMouseMove(u));\n }\n function h(u) {\n if (u.button !== 0)\n return;\n const m = Date.now(), f = m - e.mouseDownTime, d = new M.Vector3(u.offsetX, u.offsetY, 0);\n e.self && e.self.handleMouseUp != null && (r(u, !1), e.self.handleMouseUp(u));\n const p = d.distanceTo(e.mouseDownPosition);\n if ((f < 100 || p == 0) && e.self && e.self.handleMouseClick != null) {\n r(u, !0);\n const g = m - e.lastClickTime;\n console.log(g), g < 200 ? e.self.handleMouseDoubleClick != null && e.self.handleMouseDoubleClick(u) : e.self.handleMouseClick != null && e.self.handleMouseClick(u), e.lastClickTime = Date.now();\n }\n }\n function c(u, m) {\n if (!o.engineStatus.isFree) {\n o.hoverHighLight.clearHighlight();\n return;\n }\n o.catchSvg.innerHTML = \"\";\n const f = o.octreeBox.rayInterationModel(u);\n let d = u.intersectObjects(o.scene.children.filter((I) => I instanceof M.InstancedMesh), !0);\n if (d.length > 0 && (f.length == 0 || d[0].distance < f[0].distance)) {\n let I = d[0].object;\n if (I.ids != null && I.ids.length != 0) {\n let T = I.ids[d[0].instanceId], R = {\n object: {\n url: I.url,\n id: T,\n name: T,\n isInstance: !0\n },\n face: d[0].face,\n distance: d[0].distance,\n point: d[0].point,\n instanceId: d[0].instanceId,\n matrix: I.matrixs[d[0].instanceId]\n };\n f.splice(0, 0, R);\n }\n }\n if (f.length === 0)\n return;\n let p = f[0].object.url, g = f[0].object.name, y = o.modelEdge.getModelEdge(p, g);\n y || (y = [0, 0, []]);\n let w = [];\n y[2].forEach((I) => {\n I[0] != null && I[1] != null && w.push({\n X: I[0].X * 0.5 + I[1].X * 0.5,\n Y: I[0].Y * 0.5 + I[1].Y * 0.5,\n Z: I[0].Z * 0.5 + I[1].Z * 0.5\n });\n });\n let x = [...y[2].map((I) => I[0]), ...w], _ = \"face\", b = [], E = [], A = 10;\n if (x.forEach((I) => {\n if (I != null) {\n let T = new M.Vector3(I.X, I.Z, -I.Y), R = o.worldToScreen.worldToScreen(T), v = Math.sqrt(Math.pow(R.x - m.offsetX, 2) + Math.pow(R.y - m.offsetY, 2));\n v < A && (A = v, b.push({\n point: T,\n distance: v,\n pointxy: R\n }));\n }\n }), b.length > 0 ? (b.sort((I, T) => I.distance - T.distance), _ = \"point\") : (y[2].forEach((I) => {\n if (I[0] != null && I[1] != null) {\n let T = new M.Vector3(I[0].X, I[0].Z, -I[0].Y), R = new M.Vector3(I[1].X, I[1].Z, -I[1].Y), v = o.worldToScreen.worldToScreen(T), z = o.worldToScreen.worldToScreen(R), H = P(new M.Vector2(m.offsetX, m.offsetY), v, z);\n if (H < A) {\n let V = C(new M.Vector2(m.offsetX, m.offsetY), v, z), te = D(V, T, R);\n E.push({\n distance: H,\n point: te,\n pointxy: o.worldToScreen.worldToScreen(te),\n start: v,\n end: z\n });\n }\n }\n }), E.length > 0 && (E.sort((I, T) => I.distance - T.distance), _ = \"line\")), _ == \"point\" && e.options.showCatch) {\n const I = o.worldToScreen.worldToScreen(b[0].point);\n o.catchSvg.innerHTML = \"\";\n const T = I.x + o.reactBoundingClientRect.left, R = I.y + o.reactBoundingClientRect.top, v = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\");\n v.setAttribute(\"class\", \"catchPoint\"), v.setAttribute(\"points\", `${T},${R - 8} ${T - 7},${R + 4} ${T + 7},${R + 4}`), o.catchSvg.appendChild(v), f[0].point = b[0].point;\n } else if (_ == \"line\" && e.options.showCatch) {\n o.worldToScreen.worldToScreen(E[0].point);\n const I = E[0].start, T = E[0].end;\n o.catchSvg.innerHTML = \"\";\n const R = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n R.setAttribute(\"class\", \"catchLine\"), R.setAttribute(\"x1\", (I.x + o.reactBoundingClientRect.left).toString()), R.setAttribute(\"y1\", (I.y + o.reactBoundingClientRect.top).toString()), R.setAttribute(\"x2\", (T.x + o.reactBoundingClientRect.left).toString()), R.setAttribute(\"y2\", (T.y + o.reactBoundingClientRect.top).toString()), R.setAttribute(\"stroke\", \"rgb(8, 223, 215)\"), R.setAttribute(\"stroke-width\", \"2\"), o.catchSvg.appendChild(R), f[0].point = E[0].point;\n } else if (_ == \"face\" && e.options.showCatch) {\n let I = f[0].point.clone(), T = f[0].normal || (f[0].face ? f[0].face.normal : null);\n const R = (T ? T.clone() : new M.Vector3(0, 0, 1)).normalize(), v = Math.abs(R.y) < 0.9 ? new M.Vector3(0, 1, 0) : new M.Vector3(1, 0, 0), z = new M.Vector3().crossVectors(R, v).normalize(), H = new M.Vector3().crossVectors(R, z).normalize(), V = 0.05, $ = [\n new M.Vector3().copy(z).add(H).multiplyScalar(V),\n new M.Vector3().copy(z).sub(H).multiplyScalar(V),\n new M.Vector3().copy(z).multiplyScalar(-1).sub(H).multiplyScalar(V),\n new M.Vector3().copy(z).multiplyScalar(-1).add(H).multiplyScalar(V)\n ].map((O) => new M.Vector3().copy(I).add(O)).map((O) => o.worldToScreen.worldToScreen(O));\n o.catchSvg.innerHTML = \"\";\n const N = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\");\n N.setAttribute(\"class\", \"catchFace\"), N.setAttribute(\"points\", $.map((O) => `${O.x + o.reactBoundingClientRect.left},${O.y + o.reactBoundingClientRect.top}`).join(\" \")), N.setAttribute(\"fill\", \"rgba(1, 238, 255, 0.2)\"), N.setAttribute(\"stroke\", \"rgb(0, 255, 247)\"), N.setAttribute(\"stroke-width\", \"1\"), o.catchSvg.appendChild(N);\n }\n return f[0];\n function P(I, T, R) {\n const v = new M.Vector2().subVectors(R, T), z = v.lengthSq();\n if (z < 1e-10)\n return I.distanceTo(T);\n const H = new M.Vector2().subVectors(I, T), V = M.MathUtils.clamp(H.dot(v) / z, 0, 1), te = new M.Vector2().copy(v).multiplyScalar(V).add(T);\n return I.distanceTo(te);\n }\n function C(I, T, R) {\n const v = new M.Vector2().subVectors(R, T), z = v.lengthSq();\n if (z < 1e-10)\n return 0;\n const H = new M.Vector2().subVectors(I, T);\n return M.MathUtils.clamp(H.dot(v) / z, 0, 1);\n }\n function D(I, T, R) {\n const v = M.MathUtils.clamp(I, 0, 1);\n return new M.Vector3().lerpVectors(T, R, v);\n }\n }\n return e;\n}\nclass sc {\n engine;\n orbitControls;\n firstPersonControls;\n isActive = !0;\n originDiv = null;\n handelBehaved;\n isDragging = !1;\n isDown = !1;\n containerOffset = { left: 0, top: 0 };\n constructor(e) {\n this.engine = e, this.init(), this.handelBehaved = hr(this.engine), this.handelBehaved.init(this, null), this.handelBehaved.active();\n }\n init() {\n this.orbitControls = new Wl(this.engine, this.engine.camera, this.engine.renderer.domElement), this.orbitControls.showOriginIcon = !0, this.firstPersonControls = new Pr(this.engine, this.engine.camera, this.engine.renderer.domElement);\n const e = document.createElement(\"div\");\n this.originDiv = e, e.className = \"originDiv\", e.style.position = \"absolute\", e.style.top = \"0px\", e.style.left = \"0px\", e.style.width = \"30px\", e.style.height = \"30px\", e.style.borderRadius = \"50%\", e.style.pointerEvents = \"none\", e.style.backgroundImage = \"url(/assets/svg/rotate-orbit.svg)\", this.engine.container.appendChild(this.originDiv);\n }\n // 激活控制器\n active() {\n this.isActive = !0, this.orbitControls.enabled = !0;\n }\n // 禁用控制器\n disActive() {\n this.isActive = !1, this.orbitControls.enabled = !1;\n }\n // 设置漫游速度\n setMoveSpeed(e) {\n this.firstPersonControls.moveSpeed = e;\n }\n // 获取当前移动速度\n getMoveSpeed() {\n return this.firstPersonControls.moveSpeed;\n }\n // 设置是否碰撞\n setApplyCollision(e) {\n this.firstPersonControls.applyCollision = e;\n }\n // 获取是否开启碰撞\n getApplyCollision() {\n return this.firstPersonControls.applyCollision;\n }\n // 设置是否重力\n setApplyGravity(e) {\n this.firstPersonControls.applyGravity = e;\n }\n // 获取是否开启重力\n getApplyGravity() {\n return this.firstPersonControls.applyGravity;\n }\n // 开启和关闭小地图\n toggleMinMap() {\n this.engine.minMap.toggle();\n }\n // 切换第一人称漫游模式\n switchFirstPersonMode() {\n this.engine.cameraModule.switchToPerspectiveCamera(), this.firstPersonControls = new Pr(\n this.engine,\n this.engine.camera,\n this.engine.renderer.domElement,\n []\n ), this.orbitControls.enabled = !1, this.firstPersonControls.enabled = !0, this.firstPersonControls.isActive = !0;\n }\n // 切换默认模式\n switchDefaultMode() {\n this.firstPersonControls && (this.firstPersonControls.enabled = !1, this.engine.cameraModule.switchToOrthographicCamera()), this.orbitControls.enabled = !0;\n }\n // 控制鼠标交互\n handleMouseUp(e) {\n this.isDragging = !1, this.isDown = !1;\n }\n handleMouseMove(e) {\n this.isDown ? this.isDragging = !0 : this.isDragging = !1;\n }\n handleMouseDown(e) {\n this.isDown = !0;\n }\n handleMouseClick(e) {\n this.isDragging = !1, this.isDown = !1;\n }\n // 渲染控制器\n update() {\n if (this.firstPersonControls.enabled && this.firstPersonControls.update(), this.orbitControls.enabled) {\n const e = this.engine.controlModule.orbitControls.origin, n = this.engine.worldToScreen.worldToScreen(e);\n this.originDiv && this.isDragging ? (this.originDiv.style.left = n.x - 15 + this.engine.reactBoundingClientRect.left + \"px\", this.originDiv.style.top = n.y - 15 + this.engine.reactBoundingClientRect.top + \"px\", this.originDiv.style.display = \"block\") : this.originDiv && (this.originDiv.style.display = \"none\");\n }\n }\n}\nconst Kt = {\n name: \"CopyShader\",\n uniforms: {\n tDiffuse: { value: null },\n opacity: { value: 1 }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}`\n )\n};\nclass tn {\n /**\n * Constructs a new pass.\n */\n constructor() {\n this.isPass = !0, this.enabled = !0, this.needsSwap = !0, this.clear = !1, this.renderToScreen = !1;\n }\n /**\n * Sets the size of the pass.\n *\n * @abstract\n * @param {number} width - The width to set.\n * @param {number} height - The height to set.\n */\n setSize() {\n }\n /**\n * This method holds the render logic of a pass. It must be implemented in all derived classes.\n *\n * @abstract\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render() {\n console.error(\"THREE.Pass: .render() must be implemented in derived pass.\");\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n *\n * @abstract\n */\n dispose() {\n }\n}\nconst rc = new Vo(-1, 1, 1, -1, 0, 1);\nclass oc extends Zi {\n constructor() {\n super(), this.setAttribute(\"position\", new br([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3)), this.setAttribute(\"uv\", new br([0, 2, 0, 0, 2, 0], 2));\n }\n}\nconst ac = new oc();\nclass Yi {\n /**\n * Constructs a new full screen quad.\n *\n * @param {?Material} material - The material to render te full screen quad with.\n */\n constructor(e) {\n this._mesh = new ar(ac, e);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the instance is no longer used in your app.\n */\n dispose() {\n this._mesh.geometry.dispose();\n }\n /**\n * Renders the full screen quad.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n */\n render(e) {\n e.render(this._mesh, rc);\n }\n /**\n * The quad's material.\n *\n * @type {?Material}\n */\n get material() {\n return this._mesh.material;\n }\n set material(e) {\n this._mesh.material = e;\n }\n}\nclass Pi extends tn {\n /**\n * Constructs a new shader pass.\n *\n * @param {Object|ShaderMaterial} [shader] - A shader object holding vertex and fragment shader as well as\n * defines and uniforms. It's also valid to pass a custom shader material.\n * @param {string} [textureID='tDiffuse'] - The name of the texture uniform that should sample\n * the read buffer.\n */\n constructor(e, t = \"tDiffuse\") {\n super(), this.textureID = t, this.uniforms = null, this.material = null, e instanceof tt ? (this.uniforms = e.uniforms, this.material = e) : e && (this.uniforms = nt.clone(e.uniforms), this.material = new tt({\n name: e.name !== void 0 ? e.name : \"unspecified\",\n defines: Object.assign({}, e.defines),\n uniforms: this.uniforms,\n vertexShader: e.vertexShader,\n fragmentShader: e.fragmentShader\n })), this._fsQuad = new Yi(this.material);\n }\n /**\n * Performs the shader pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n this.uniforms[this.textureID] && (this.uniforms[this.textureID].value = n.texture), this._fsQuad.material = this.material, this.renderToScreen ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(t), this.clear && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), this._fsQuad.render(e));\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.material.dispose(), this._fsQuad.dispose();\n }\n}\nclass Rr extends tn {\n /**\n * Constructs a new mask pass.\n *\n * @param {Scene} scene - The 3D objects in this scene will define the mask.\n * @param {Camera} camera - The camera.\n */\n constructor(e, t) {\n super(), this.scene = e, this.camera = t, this.clear = !0, this.needsSwap = !1, this.inverse = !1;\n }\n /**\n * Performs a mask pass with the configured scene and camera.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n const i = e.getContext(), s = e.state;\n s.buffers.color.setMask(!1), s.buffers.depth.setMask(!1), s.buffers.color.setLocked(!0), s.buffers.depth.setLocked(!0);\n let r, a;\n this.inverse ? (r = 0, a = 1) : (r = 1, a = 0), s.buffers.stencil.setTest(!0), s.buffers.stencil.setOp(i.REPLACE, i.REPLACE, i.REPLACE), s.buffers.stencil.setFunc(i.ALWAYS, r, 4294967295), s.buffers.stencil.setClear(a), s.buffers.stencil.setLocked(!0), e.setRenderTarget(n), this.clear && e.clear(), e.render(this.scene, this.camera), e.setRenderTarget(t), this.clear && e.clear(), e.render(this.scene, this.camera), s.buffers.color.setLocked(!1), s.buffers.depth.setLocked(!1), s.buffers.color.setMask(!0), s.buffers.depth.setMask(!0), s.buffers.stencil.setLocked(!1), s.buffers.stencil.setFunc(i.EQUAL, 1, 4294967295), s.buffers.stencil.setOp(i.KEEP, i.KEEP, i.KEEP), s.buffers.stencil.setLocked(!0);\n }\n}\nclass lc extends tn {\n /**\n * Constructs a new clear mask pass.\n */\n constructor() {\n super(), this.needsSwap = !1;\n }\n /**\n * Performs the clear of the currently defined mask.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e) {\n e.state.buffers.stencil.setLocked(!1), e.state.buffers.stencil.setTest(!1);\n }\n}\nclass cc {\n /**\n * Constructs a new effect composer.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} [renderTarget] - This render target and a clone will\n * be used as the internal read and write buffers. If not given, the composer creates\n * the buffers automatically.\n */\n constructor(e, t) {\n if (this.renderer = e, this._pixelRatio = e.getPixelRatio(), t === void 0) {\n const n = e.getSize(new ue());\n this._width = n.width, this._height = n.height, t = new Vn(this._width * this._pixelRatio, this._height * this._pixelRatio, { type: _t }), t.texture.name = \"EffectComposer.rt1\";\n } else\n this._width = t.width, this._height = t.height;\n this.renderTarget1 = t, this.renderTarget2 = t.clone(), this.renderTarget2.texture.name = \"EffectComposer.rt2\", this.writeBuffer = this.renderTarget1, this.readBuffer = this.renderTarget2, this.renderToScreen = !0, this.passes = [], this.copyPass = new Pi(Kt), this.copyPass.material.blending = ze, this.clock = new Ka();\n }\n /**\n * Swaps the internal read/write buffers.\n */\n swapBuffers() {\n const e = this.readBuffer;\n this.readBuffer = this.writeBuffer, this.writeBuffer = e;\n }\n /**\n * Adds the given pass to the pass chain.\n *\n * @param {Pass} pass - The pass to add.\n */\n addPass(e) {\n this.passes.push(e), e.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio);\n }\n /**\n * Inserts the given pass at a given index.\n *\n * @param {Pass} pass - The pass to insert.\n * @param {number} index - The index into the pass chain.\n */\n insertPass(e, t) {\n this.passes.splice(t, 0, e), e.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio);\n }\n /**\n * Removes the given pass from the pass chain.\n *\n * @param {Pass} pass - The pass to remove.\n */\n removePass(e) {\n const t = this.passes.indexOf(e);\n t !== -1 && this.passes.splice(t, 1);\n }\n /**\n * Returns `true` if the pass for the given index is the last enabled pass in the pass chain.\n *\n * @param {number} passIndex - The pass index.\n * @return {boolean} Whether the pass for the given index is the last pass in the pass chain.\n */\n isLastEnabledPass(e) {\n for (let t = e + 1; t < this.passes.length; t++)\n if (this.passes[t].enabled)\n return !1;\n return !0;\n }\n /**\n * Executes all enabled post-processing passes in order to produce the final frame.\n *\n * @param {number} deltaTime - The delta time in seconds. If not given, the composer computes\n * its own time delta value.\n */\n render(e) {\n e === void 0 && (e = this.clock.getDelta());\n const t = this.renderer.getRenderTarget();\n let n = !1;\n for (let i = 0, s = this.passes.length; i < s; i++) {\n const r = this.passes[i];\n if (r.enabled !== !1) {\n if (r.renderToScreen = this.renderToScreen && this.isLastEnabledPass(i), r.render(this.renderer, this.writeBuffer, this.readBuffer, e, n), r.needsSwap) {\n if (n) {\n const a = this.renderer.getContext(), l = this.renderer.state.buffers.stencil;\n l.setFunc(a.NOTEQUAL, 1, 4294967295), this.copyPass.render(this.renderer, this.writeBuffer, this.readBuffer, e), l.setFunc(a.EQUAL, 1, 4294967295);\n }\n this.swapBuffers();\n }\n Rr !== void 0 && (r instanceof Rr ? n = !0 : r instanceof lc && (n = !1));\n }\n }\n this.renderer.setRenderTarget(t);\n }\n /**\n * Resets the internal state of the EffectComposer.\n *\n * @param {WebGLRenderTarget} [renderTarget] - This render target has the same purpose like\n * the one from the constructor. If set, it is used to setup the read and write buffers.\n */\n reset(e) {\n if (e === void 0) {\n const t = this.renderer.getSize(new ue());\n this._pixelRatio = this.renderer.getPixelRatio(), this._width = t.width, this._height = t.height, e = this.renderTarget1.clone(), e.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio);\n }\n this.renderTarget1.dispose(), this.renderTarget2.dispose(), this.renderTarget1 = e, this.renderTarget2 = e.clone(), this.writeBuffer = this.renderTarget1, this.readBuffer = this.renderTarget2;\n }\n /**\n * Resizes the internal read and write buffers as well as all passes. Similar to {@link WebGLRenderer#setSize},\n * this method honors the current pixel ration.\n *\n * @param {number} width - The width in logical pixels.\n * @param {number} height - The height in logical pixels.\n */\n setSize(e, t) {\n this._width = e, this._height = t;\n const n = this._width * this._pixelRatio, i = this._height * this._pixelRatio;\n this.renderTarget1.setSize(n, i), this.renderTarget2.setSize(n, i);\n for (let s = 0; s < this.passes.length; s++)\n this.passes[s].setSize(n, i);\n }\n /**\n * Sets device pixel ratio. This is usually used for HiDPI device to prevent blurring output.\n * Setting the pixel ratio will automatically resize the composer.\n *\n * @param {number} pixelRatio - The pixel ratio to set.\n */\n setPixelRatio(e) {\n this._pixelRatio = e, this.setSize(this._width, this._height);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the composer is no longer used in your app.\n */\n dispose() {\n this.renderTarget1.dispose(), this.renderTarget2.dispose(), this.copyPass.dispose();\n }\n}\nclass hc extends tn {\n /**\n * Constructs a new render pass.\n *\n * @param {Scene} scene - The scene to render.\n * @param {Camera} camera - The camera.\n * @param {?Material} [overrideMaterial=null] - The override material. If set, this material is used\n * for all objects in the scene.\n * @param {?(number|Color|string)} [clearColor=null] - The clear color of the render pass.\n * @param {?number} [clearAlpha=null] - The clear alpha of the render pass.\n */\n constructor(e, t, n = null, i = null, s = null) {\n super(), this.scene = e, this.camera = t, this.overrideMaterial = n, this.clearColor = i, this.clearAlpha = s, this.clear = !0, this.clearDepth = !1, this.needsSwap = !1, this._oldClearColor = new st();\n }\n /**\n * Performs a beauty pass with the configured scene and camera.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n const i = e.autoClear;\n e.autoClear = !1;\n let s, r;\n this.overrideMaterial !== null && (r = this.scene.overrideMaterial, this.scene.overrideMaterial = this.overrideMaterial), this.clearColor !== null && (e.getClearColor(this._oldClearColor), e.setClearColor(this.clearColor, e.getClearAlpha())), this.clearAlpha !== null && (s = e.getClearAlpha(), e.setClearAlpha(this.clearAlpha)), this.clearDepth == !0 && e.clearDepth(), e.setRenderTarget(this.renderToScreen ? null : n), this.clear === !0 && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), e.render(this.scene, this.camera), this.clearColor !== null && e.setClearColor(this._oldClearColor), this.clearAlpha !== null && e.setClearAlpha(s), this.overrideMaterial !== null && (this.scene.overrideMaterial = r), e.autoClear = i;\n }\n}\nconst Kn = {\n defines: {\n PERSPECTIVE_CAMERA: 1,\n SAMPLES: 16,\n NORMAL_VECTOR_TYPE: 1,\n DEPTH_SWIZZLING: \"x\",\n SCREEN_SPACE_RADIUS: 0,\n SCREEN_SPACE_RADIUS_SCALE: 100,\n SCENE_CLIP_BOX: 0\n },\n uniforms: {\n tNormal: { value: null },\n tDepth: { value: null },\n tNoise: { value: null },\n resolution: { value: new ue() },\n cameraNear: { value: null },\n cameraFar: { value: null },\n cameraProjectionMatrix: { value: new Me() },\n cameraProjectionMatrixInverse: { value: new Me() },\n cameraWorldMatrix: { value: new Me() },\n radius: { value: 0.25 },\n distanceExponent: { value: 1 },\n thickness: { value: 1 },\n distanceFallOff: { value: 1 },\n scale: { value: 1 },\n sceneBoxMin: { value: new K(-1, -1, -1) },\n sceneBoxMax: { value: new K(1, 1, 1) }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tvarying vec2 vUv;\n\t\tuniform highp sampler2D tNormal;\n\t\tuniform highp sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\t\tuniform vec2 resolution;\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform mat4 cameraProjectionMatrix;\n\t\tuniform mat4 cameraProjectionMatrixInverse;\n\t\tuniform mat4 cameraWorldMatrix;\n\t\tuniform float radius;\n\t\tuniform float distanceExponent;\n\t\tuniform float thickness;\n\t\tuniform float distanceFallOff;\n\t\tuniform float scale;\n\t\t#if SCENE_CLIP_BOX == 1\n\t\t\tuniform vec3 sceneBoxMin;\n\t\t\tuniform vec3 sceneBoxMax;\n\t\t#endif\n\n\t\t#include \n\t\t#include \n\n\t\t#ifndef FRAGMENT_OUTPUT\n\t\t#define FRAGMENT_OUTPUT vec4(vec3(ao), 1.)\n\t\t#endif\n\n\t\tvec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n\t\t\tvec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n\t\t\tvec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;\n\t\t\treturn viewSpacePosition.xyz / viewSpacePosition.w;\n\t\t}\n\n\t\tfloat getDepth(const vec2 uv) {\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).DEPTH_SWIZZLING;\n\t\t}\n\n\t\tfloat fetchDepth(const ivec2 uv) {\n\t\t\treturn texelFetch(tDepth, uv.xy, 0).DEPTH_SWIZZLING;\n\t\t}\n\n\t\tfloat getViewZ(const in float depth) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\t\treturn perspectiveDepthToViewZ(depth, cameraNear, cameraFar);\n\t\t\t#else\n\t\t\t\treturn orthographicDepthToViewZ(depth, cameraNear, cameraFar);\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 computeNormalFromDepth(const vec2 uv) {\n\t\t\tvec2 size = vec2(textureSize(tDepth, 0));\n\t\t\tivec2 p = ivec2(uv * size);\n\t\t\tfloat c0 = fetchDepth(p);\n\t\t\tfloat l2 = fetchDepth(p - ivec2(2, 0));\n\t\t\tfloat l1 = fetchDepth(p - ivec2(1, 0));\n\t\t\tfloat r1 = fetchDepth(p + ivec2(1, 0));\n\t\t\tfloat r2 = fetchDepth(p + ivec2(2, 0));\n\t\t\tfloat b2 = fetchDepth(p - ivec2(0, 2));\n\t\t\tfloat b1 = fetchDepth(p - ivec2(0, 1));\n\t\t\tfloat t1 = fetchDepth(p + ivec2(0, 1));\n\t\t\tfloat t2 = fetchDepth(p + ivec2(0, 2));\n\t\t\tfloat dl = abs((2.0 * l1 - l2) - c0);\n\t\t\tfloat dr = abs((2.0 * r1 - r2) - c0);\n\t\t\tfloat db = abs((2.0 * b1 - b2) - c0);\n\t\t\tfloat dt = abs((2.0 * t1 - t2) - c0);\n\t\t\tvec3 ce = getViewPosition(uv, c0).xyz;\n\t\t\tvec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz : -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n\t\t\tvec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz : -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n\t\t\treturn normalize(cross(dpdx, dpdy));\n\t\t}\n\n\t\tvec3 getViewNormal(const vec2 uv) {\n\t\t\t#if NORMAL_VECTOR_TYPE == 2\n\t\t\t\treturn normalize(textureLod(tNormal, uv, 0.).rgb);\n\t\t\t#elif NORMAL_VECTOR_TYPE == 1\n\t\t\t\treturn unpackRGBToNormal(textureLod(tNormal, uv, 0.).rgb);\n\t\t\t#else\n\t\t\t\treturn computeNormalFromDepth(uv);\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 getSceneUvAndDepth(vec3 sampleViewPos) {\n\t\t\tvec4 sampleClipPos = cameraProjectionMatrix * vec4(sampleViewPos, 1.);\n\t\t\tvec2 sampleUv = sampleClipPos.xy / sampleClipPos.w * 0.5 + 0.5;\n\t\t\tfloat sampleSceneDepth = getDepth(sampleUv);\n\t\t\treturn vec3(sampleUv, sampleSceneDepth);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth(vUv.xy);\n\t\t\tif (depth >= 1.0) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvec3 viewPos = getViewPosition(vUv, depth);\n\t\t\tvec3 viewNormal = getViewNormal(vUv);\n\n\t\t\tfloat radiusToUse = radius;\n\t\t\tfloat distanceFalloffToUse = thickness;\n\t\t\t#if SCREEN_SPACE_RADIUS == 1\n\t\t\t\tfloat radiusScale = getViewPosition(vec2(0.5 + float(SCREEN_SPACE_RADIUS_SCALE) / resolution.x, 0.0), depth).x;\n\t\t\t\tradiusToUse *= radiusScale;\n\t\t\t\tdistanceFalloffToUse *= radiusScale;\n\t\t\t#endif\n\n\t\t\t#if SCENE_CLIP_BOX == 1\n\t\t\t\tvec3 worldPos = (cameraWorldMatrix * vec4(viewPos, 1.0)).xyz;\n\t\t\t\tfloat boxDistance = length(max(vec3(0.0), max(sceneBoxMin - worldPos, worldPos - sceneBoxMax)));\n\t\t\t\tif (boxDistance > radiusToUse) {\n\t\t\t\t\tdiscard;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t#endif\n\n\t\t\tvec2 noiseResolution = vec2(textureSize(tNoise, 0));\n\t\t\tvec2 noiseUv = vUv * resolution / noiseResolution;\n\t\t\tvec4 noiseTexel = textureLod(tNoise, noiseUv, 0.0);\n\t\t\tvec3 randomVec = noiseTexel.xyz * 2.0 - 1.0;\n\t\t\tvec3 tangent = normalize(vec3(randomVec.xy, 0.));\n\t\t\tvec3 bitangent = vec3(-tangent.y, tangent.x, 0.);\n\t\t\tmat3 kernelMatrix = mat3(tangent, bitangent, vec3(0., 0., 1.));\n\n\t\t\tconst int DIRECTIONS = SAMPLES < 30 ? 3 : 5;\n\t\t\tconst int STEPS = (SAMPLES + DIRECTIONS - 1) / DIRECTIONS;\n\t\t\tfloat ao = 0.0;\n\t\t\tfor (int i = 0; i < DIRECTIONS; ++i) {\n\n\t\t\t\tfloat angle = float(i) / float(DIRECTIONS) * PI;\n\t\t\t\tvec4 sampleDir = vec4(cos(angle), sin(angle), 0., 0.5 + 0.5 * noiseTexel.w);\n\t\t\t\tsampleDir.xyz = normalize(kernelMatrix * sampleDir.xyz);\n\n\t\t\t\tvec3 viewDir = normalize(-viewPos.xyz);\n\t\t\t\tvec3 sliceBitangent = normalize(cross(sampleDir.xyz, viewDir));\n\t\t\t\tvec3 sliceTangent = cross(sliceBitangent, viewDir);\n\t\t\t\tvec3 normalInSlice = normalize(viewNormal - sliceBitangent * dot(viewNormal, sliceBitangent));\n\n\t\t\t\tvec3 tangentToNormalInSlice = cross(normalInSlice, sliceBitangent);\n\t\t\t\tvec2 cosHorizons = vec2(dot(viewDir, tangentToNormalInSlice), dot(viewDir, -tangentToNormalInSlice));\n\n\t\t\t\tfor (int j = 0; j < STEPS; ++j) {\n\t\t\t\t\tvec3 sampleViewOffset = sampleDir.xyz * radiusToUse * sampleDir.w * pow(float(j + 1) / float(STEPS), distanceExponent);\n\n\t\t\t\t\tvec3 sampleSceneUvDepth = getSceneUvAndDepth(viewPos + sampleViewOffset);\n\t\t\t\t\tvec3 sampleSceneViewPos = getViewPosition(sampleSceneUvDepth.xy, sampleSceneUvDepth.z);\n\t\t\t\t\tvec3 viewDelta = sampleSceneViewPos - viewPos;\n\t\t\t\t\tif (abs(viewDelta.z) < thickness) {\n\t\t\t\t\t\tfloat sampleCosHorizon = dot(viewDir, normalize(viewDelta));\n\t\t\t\t\t\tcosHorizons.x += max(0., (sampleCosHorizon - cosHorizons.x) * mix(1., 2. / float(j + 2), distanceFallOff));\n\t\t\t\t\t}\n\n\t\t\t\t\tsampleSceneUvDepth = getSceneUvAndDepth(viewPos - sampleViewOffset);\n\t\t\t\t\tsampleSceneViewPos = getViewPosition(sampleSceneUvDepth.xy, sampleSceneUvDepth.z);\n\t\t\t\t\tviewDelta = sampleSceneViewPos - viewPos;\n\t\t\t\t\tif (abs(viewDelta.z) < thickness) {\n\t\t\t\t\t\tfloat sampleCosHorizon = dot(viewDir, normalize(viewDelta));\n\t\t\t\t\t\tcosHorizons.y += max(0., (sampleCosHorizon - cosHorizons.y) * mix(1., 2. / float(j + 2), distanceFallOff));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvec2 sinHorizons = sqrt(1. - cosHorizons * cosHorizons);\n\t\t\t\tfloat nx = dot(normalInSlice, sliceTangent);\n\t\t\t\tfloat ny = dot(normalInSlice, viewDir);\n\t\t\t\tfloat nxb = 1. / 2. * (acos(cosHorizons.y) - acos(cosHorizons.x) + sinHorizons.x * cosHorizons.x - sinHorizons.y * cosHorizons.y);\n\t\t\t\tfloat nyb = 1. / 2. * (2. - cosHorizons.x * cosHorizons.x - cosHorizons.y * cosHorizons.y);\n\t\t\t\tfloat occlusion = nx * nxb + ny * nyb;\n\t\t\t\tao += occlusion;\n\t\t\t}\n\n\t\t\tao = clamp(ao / float(DIRECTIONS), 0., 1.);\n\t\t#if SCENE_CLIP_BOX == 1\n\t\t\tao = mix(ao, 1., smoothstep(0., radiusToUse, boxDistance));\n\t\t#endif\n\t\t\tao = pow(ao, scale);\n\n\t\t\tgl_FragColor = FRAGMENT_OUTPUT;\n\t\t}`\n )\n}, $n = {\n defines: {\n PERSPECTIVE_CAMERA: 1\n },\n uniforms: {\n tDepth: { value: null },\n cameraNear: { value: null },\n cameraFar: { value: null }\n },\n vertexShader: (\n /* glsl */\n `\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tuniform sampler2D tDepth;\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tvarying vec2 vUv;\n\n\t\t#include \n\n\t\tfloat getLinearDepth( const in vec2 screenPosition ) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\t\tfloat fragCoordZ = texture2D( tDepth, screenPosition ).x;\n\t\t\t\tfloat viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\n\t\t\t\treturn viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n\t\t\t#else\n\t\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\t\t\t#endif\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getLinearDepth( vUv );\n\t\t\tgl_FragColor = vec4( vec3( 1.0 - depth ), 1.0 );\n\n\t\t}`\n )\n}, rs = {\n uniforms: {\n tDiffuse: { value: null },\n intensity: { value: 1 }\n },\n vertexShader: (\n /* glsl */\n `\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tuniform float intensity;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4(mix(vec3(1.), texel.rgb, intensity), texel.a);\n\t\t}`\n )\n};\nfunction uc(o = 5) {\n const e = Math.floor(o) % 2 === 0 ? Math.floor(o) + 1 : Math.floor(o), t = dc(e), n = t.length, i = new Uint8Array(n * 4);\n for (let r = 0; r < n; ++r) {\n const a = t[r], l = 2 * Math.PI * a / n, h = new K(\n Math.cos(l),\n Math.sin(l),\n 0\n ).normalize();\n i[r * 4] = (h.x * 0.5 + 0.5) * 255, i[r * 4 + 1] = (h.y * 0.5 + 0.5) * 255, i[r * 4 + 2] = 127, i[r * 4 + 3] = 255;\n }\n const s = new lr(i, e, e);\n return s.wrapS = vt, s.wrapT = vt, s.needsUpdate = !0, s;\n}\nfunction dc(o) {\n const e = Math.floor(o) % 2 === 0 ? Math.floor(o) + 1 : Math.floor(o), t = e * e, n = Array(t).fill(0);\n let i = Math.floor(e / 2), s = e - 1;\n for (let r = 1; r <= t; ) {\n if (i === -1 && s === e ? (s = e - 2, i = 0) : (s === e && (s = 0), i < 0 && (i = e - 1)), n[i * e + s] !== 0) {\n s -= 2, i++;\n continue;\n } else\n n[i * e + s] = r++;\n s++, i--;\n }\n return n;\n}\nconst Jn = {\n defines: {\n SAMPLES: 16,\n SAMPLE_VECTORS: ia(16, 2, 1),\n NORMAL_VECTOR_TYPE: 1,\n DEPTH_VALUE_SOURCE: 0\n },\n uniforms: {\n tDiffuse: { value: null },\n tNormal: { value: null },\n tDepth: { value: null },\n tNoise: { value: null },\n resolution: { value: new ue() },\n cameraProjectionMatrixInverse: { value: new Me() },\n lumaPhi: { value: 5 },\n depthPhi: { value: 5 },\n normalPhi: { value: 5 },\n radius: { value: 4 },\n index: { value: 0 }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tNormal;\n\t\tuniform sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\t\tuniform vec2 resolution;\n\t\tuniform mat4 cameraProjectionMatrixInverse;\n\t\tuniform float lumaPhi;\n\t\tuniform float depthPhi;\n\t\tuniform float normalPhi;\n\t\tuniform float radius;\n\t\tuniform int index;\n\n\t\t#include \n\t\t#include \n\n\t\t#ifndef SAMPLE_LUMINANCE\n\t\t#define SAMPLE_LUMINANCE dot(vec3(0.2125, 0.7154, 0.0721), a)\n\t\t#endif\n\n\t\t#ifndef FRAGMENT_OUTPUT\n\t\t#define FRAGMENT_OUTPUT vec4(denoised, 1.)\n\t\t#endif\n\n\t\tfloat getLuminance(const in vec3 a) {\n\t\t\treturn SAMPLE_LUMINANCE;\n\t\t}\n\n\t\tconst vec3 poissonDisk[SAMPLES] = SAMPLE_VECTORS;\n\n\t\tvec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n\t\t\tvec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n\t\t\tvec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;\n\t\t\treturn viewSpacePosition.xyz / viewSpacePosition.w;\n\t\t}\n\n\t\tfloat getDepth(const vec2 uv) {\n\t\t#if DEPTH_VALUE_SOURCE == 1\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).a;\n\t\t#else\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).r;\n\t\t#endif\n\t\t}\n\n\t\tfloat fetchDepth(const ivec2 uv) {\n\t\t\t#if DEPTH_VALUE_SOURCE == 1\n\t\t\t\treturn texelFetch(tDepth, uv.xy, 0).a;\n\t\t\t#else\n\t\t\t\treturn texelFetch(tDepth, uv.xy, 0).r;\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 computeNormalFromDepth(const vec2 uv) {\n\t\t\tvec2 size = vec2(textureSize(tDepth, 0));\n\t\t\tivec2 p = ivec2(uv * size);\n\t\t\tfloat c0 = fetchDepth(p);\n\t\t\tfloat l2 = fetchDepth(p - ivec2(2, 0));\n\t\t\tfloat l1 = fetchDepth(p - ivec2(1, 0));\n\t\t\tfloat r1 = fetchDepth(p + ivec2(1, 0));\n\t\t\tfloat r2 = fetchDepth(p + ivec2(2, 0));\n\t\t\tfloat b2 = fetchDepth(p - ivec2(0, 2));\n\t\t\tfloat b1 = fetchDepth(p - ivec2(0, 1));\n\t\t\tfloat t1 = fetchDepth(p + ivec2(0, 1));\n\t\t\tfloat t2 = fetchDepth(p + ivec2(0, 2));\n\t\t\tfloat dl = abs((2.0 * l1 - l2) - c0);\n\t\t\tfloat dr = abs((2.0 * r1 - r2) - c0);\n\t\t\tfloat db = abs((2.0 * b1 - b2) - c0);\n\t\t\tfloat dt = abs((2.0 * t1 - t2) - c0);\n\t\t\tvec3 ce = getViewPosition(uv, c0).xyz;\n\t\t\tvec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz\n\t\t\t\t\t\t\t\t\t: -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n\t\t\tvec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz\n\t\t\t\t\t\t\t\t\t: -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n\t\t\treturn normalize(cross(dpdx, dpdy));\n\t\t}\n\n\t\tvec3 getViewNormal(const vec2 uv) {\n\t\t#if NORMAL_VECTOR_TYPE == 2\n\t\t\treturn normalize(textureLod(tNormal, uv, 0.).rgb);\n\t\t#elif NORMAL_VECTOR_TYPE == 1\n\t\t\treturn unpackRGBToNormal(textureLod(tNormal, uv, 0.).rgb);\n\t\t#else\n\t\t\treturn computeNormalFromDepth(uv);\n\t\t#endif\n\t\t}\n\n\t\tvoid denoiseSample(in vec3 center, in vec3 viewNormal, in vec3 viewPos, in vec2 sampleUv, inout vec3 denoised, inout float totalWeight) {\n\t\t\tvec4 sampleTexel = textureLod(tDiffuse, sampleUv, 0.0);\n\t\t\tfloat sampleDepth = getDepth(sampleUv);\n\t\t\tvec3 sampleNormal = getViewNormal(sampleUv);\n\t\t\tvec3 neighborColor = sampleTexel.rgb;\n\t\t\tvec3 viewPosSample = getViewPosition(sampleUv, sampleDepth);\n\n\t\t\tfloat normalDiff = dot(viewNormal, sampleNormal);\n\t\t\tfloat normalSimilarity = pow(max(normalDiff, 0.), normalPhi);\n\t\t\tfloat lumaDiff = abs(getLuminance(neighborColor) - getLuminance(center));\n\t\t\tfloat lumaSimilarity = max(1.0 - lumaDiff / lumaPhi, 0.0);\n\t\t\tfloat depthDiff = abs(dot(viewPos - viewPosSample, viewNormal));\n\t\t\tfloat depthSimilarity = max(1. - depthDiff / depthPhi, 0.);\n\t\t\tfloat w = lumaSimilarity * depthSimilarity * normalSimilarity;\n\n\t\t\tdenoised += w * neighborColor;\n\t\t\ttotalWeight += w;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth(vUv.xy);\n\t\t\tvec3 viewNormal = getViewNormal(vUv);\n\t\t\tif (depth == 1. || dot(viewNormal, viewNormal) == 0.) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvec4 texel = textureLod(tDiffuse, vUv, 0.0);\n\t\t\tvec3 center = texel.rgb;\n\t\t\tvec3 viewPos = getViewPosition(vUv, depth);\n\n\t\t\tvec2 noiseResolution = vec2(textureSize(tNoise, 0));\n\t\t\tvec2 noiseUv = vUv * resolution / noiseResolution;\n\t\t\tvec4 noiseTexel = textureLod(tNoise, noiseUv, 0.0);\n \t\tvec2 noiseVec = vec2(sin(noiseTexel[index % 4] * 2. * PI), cos(noiseTexel[index % 4] * 2. * PI));\n \t\tmat2 rotationMatrix = mat2(noiseVec.x, -noiseVec.y, noiseVec.x, noiseVec.y);\n\n\t\t\tfloat totalWeight = 1.0;\n\t\t\tvec3 denoised = texel.rgb;\n\t\t\tfor (int i = 0; i < SAMPLES; i++) {\n\t\t\t\tvec3 sampleDir = poissonDisk[i];\n\t\t\t\tvec2 offset = rotationMatrix * (sampleDir.xy * (1. + sampleDir.z * (radius - 1.)) / resolution);\n\t\t\t\tvec2 sampleUv = vUv + offset;\n\t\t\t\tdenoiseSample(center, viewNormal, viewPos, sampleUv, denoised, totalWeight);\n\t\t\t}\n\n\t\t\tif (totalWeight > 0.) {\n\t\t\t\tdenoised /= totalWeight;\n\t\t\t}\n\t\t\tgl_FragColor = FRAGMENT_OUTPUT;\n\t\t}`\n )\n};\nfunction ia(o, e, t) {\n const n = fc(\n o,\n e,\n t\n );\n let i = \"vec3[SAMPLES](\";\n for (let s = 0; s < o; s++) {\n const r = n[s];\n i += `vec3(${r.x}, ${r.y}, ${r.z})${s < o - 1 ? \",\" : \")\"}`;\n }\n return i;\n}\nfunction fc(o, e, t) {\n const n = [];\n for (let i = 0; i < o; i++) {\n const s = 2 * Math.PI * e * i / o, r = Math.pow(i / (o - 1), t);\n n.push(new K(Math.cos(s), Math.sin(s), r));\n }\n return n;\n}\nclass sa {\n /**\n * Constructs a new simplex noise object.\n *\n * @param {Object} [r=Math] - A math utility class that holds a `random()` method. This makes it\n * possible to pass in custom random number generator.\n */\n constructor(e = Math) {\n this.grad3 = [\n [1, 1, 0],\n [-1, 1, 0],\n [1, -1, 0],\n [-1, -1, 0],\n [1, 0, 1],\n [-1, 0, 1],\n [1, 0, -1],\n [-1, 0, -1],\n [0, 1, 1],\n [0, -1, 1],\n [0, 1, -1],\n [0, -1, -1]\n ], this.grad4 = [\n [0, 1, 1, 1],\n [0, 1, 1, -1],\n [0, 1, -1, 1],\n [0, 1, -1, -1],\n [0, -1, 1, 1],\n [0, -1, 1, -1],\n [0, -1, -1, 1],\n [0, -1, -1, -1],\n [1, 0, 1, 1],\n [1, 0, 1, -1],\n [1, 0, -1, 1],\n [1, 0, -1, -1],\n [-1, 0, 1, 1],\n [-1, 0, 1, -1],\n [-1, 0, -1, 1],\n [-1, 0, -1, -1],\n [1, 1, 0, 1],\n [1, 1, 0, -1],\n [1, -1, 0, 1],\n [1, -1, 0, -1],\n [-1, 1, 0, 1],\n [-1, 1, 0, -1],\n [-1, -1, 0, 1],\n [-1, -1, 0, -1],\n [1, 1, 1, 0],\n [1, 1, -1, 0],\n [1, -1, 1, 0],\n [1, -1, -1, 0],\n [-1, 1, 1, 0],\n [-1, 1, -1, 0],\n [-1, -1, 1, 0],\n [-1, -1, -1, 0]\n ], this.p = [];\n for (let t = 0; t < 256; t++)\n this.p[t] = Math.floor(e.random() * 256);\n this.perm = [];\n for (let t = 0; t < 512; t++)\n this.perm[t] = this.p[t & 255];\n this.simplex = [\n [0, 1, 2, 3],\n [0, 1, 3, 2],\n [0, 0, 0, 0],\n [0, 2, 3, 1],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [1, 2, 3, 0],\n [0, 2, 1, 3],\n [0, 0, 0, 0],\n [0, 3, 1, 2],\n [0, 3, 2, 1],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [1, 3, 2, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [1, 2, 0, 3],\n [0, 0, 0, 0],\n [1, 3, 0, 2],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [2, 3, 0, 1],\n [2, 3, 1, 0],\n [1, 0, 2, 3],\n [1, 0, 3, 2],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [2, 0, 3, 1],\n [0, 0, 0, 0],\n [2, 1, 3, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [2, 0, 1, 3],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [3, 0, 1, 2],\n [3, 0, 2, 1],\n [0, 0, 0, 0],\n [3, 1, 2, 0],\n [2, 1, 0, 3],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [3, 1, 0, 2],\n [0, 0, 0, 0],\n [3, 2, 0, 1],\n [3, 2, 1, 0]\n ];\n }\n /**\n * A 2D simplex noise method.\n *\n * @param {number} xin - The x coordinate.\n * @param {number} yin - The y coordinate.\n * @return {number} The noise value.\n */\n noise(e, t) {\n let n, i, s;\n const r = 0.5 * (Math.sqrt(3) - 1), a = (e + t) * r, l = Math.floor(e + a), h = Math.floor(t + a), c = (3 - Math.sqrt(3)) / 6, u = (l + h) * c, m = l - u, f = h - u, d = e - m, p = t - f;\n let g, y;\n d > p ? (g = 1, y = 0) : (g = 0, y = 1);\n const w = d - g + c, x = p - y + c, _ = d - 1 + 2 * c, b = p - 1 + 2 * c, E = l & 255, A = h & 255, P = this.perm[E + this.perm[A]] % 12, C = this.perm[E + g + this.perm[A + y]] % 12, D = this.perm[E + 1 + this.perm[A + 1]] % 12;\n let I = 0.5 - d * d - p * p;\n I < 0 ? n = 0 : (I *= I, n = I * I * this._dot(this.grad3[P], d, p));\n let T = 0.5 - w * w - x * x;\n T < 0 ? i = 0 : (T *= T, i = T * T * this._dot(this.grad3[C], w, x));\n let R = 0.5 - _ * _ - b * b;\n return R < 0 ? s = 0 : (R *= R, s = R * R * this._dot(this.grad3[D], _, b)), 70 * (n + i + s);\n }\n /**\n * A 3D simplex noise method.\n *\n * @param {number} xin - The x coordinate.\n * @param {number} yin - The y coordinate.\n * @param {number} zin - The z coordinate.\n * @return {number} The noise value.\n */\n noise3d(e, t, n) {\n let i, s, r, a;\n const h = (e + t + n) * 0.3333333333333333, c = Math.floor(e + h), u = Math.floor(t + h), m = Math.floor(n + h), f = 1 / 6, d = (c + u + m) * f, p = c - d, g = u - d, y = m - d, w = e - p, x = t - g, _ = n - y;\n let b, E, A, P, C, D;\n w >= x ? x >= _ ? (b = 1, E = 0, A = 0, P = 1, C = 1, D = 0) : w >= _ ? (b = 1, E = 0, A = 0, P = 1, C = 0, D = 1) : (b = 0, E = 0, A = 1, P = 1, C = 0, D = 1) : x < _ ? (b = 0, E = 0, A = 1, P = 0, C = 1, D = 1) : w < _ ? (b = 0, E = 1, A = 0, P = 0, C = 1, D = 1) : (b = 0, E = 1, A = 0, P = 1, C = 1, D = 0);\n const I = w - b + f, T = x - E + f, R = _ - A + f, v = w - P + 2 * f, z = x - C + 2 * f, H = _ - D + 2 * f, V = w - 1 + 3 * f, te = x - 1 + 3 * f, G = _ - 1 + 3 * f, $ = c & 255, N = u & 255, O = m & 255, Q = this.perm[$ + this.perm[N + this.perm[O]]] % 12, ee = this.perm[$ + b + this.perm[N + E + this.perm[O + A]]] % 12, q = this.perm[$ + P + this.perm[N + C + this.perm[O + D]]] % 12, de = this.perm[$ + 1 + this.perm[N + 1 + this.perm[O + 1]]] % 12;\n let pe = 0.6 - w * w - x * x - _ * _;\n pe < 0 ? i = 0 : (pe *= pe, i = pe * pe * this._dot3(this.grad3[Q], w, x, _));\n let se = 0.6 - I * I - T * T - R * R;\n se < 0 ? s = 0 : (se *= se, s = se * se * this._dot3(this.grad3[ee], I, T, R));\n let oe = 0.6 - v * v - z * z - H * H;\n oe < 0 ? r = 0 : (oe *= oe, r = oe * oe * this._dot3(this.grad3[q], v, z, H));\n let he = 0.6 - V * V - te * te - G * G;\n return he < 0 ? a = 0 : (he *= he, a = he * he * this._dot3(this.grad3[de], V, te, G)), 32 * (i + s + r + a);\n }\n /**\n * A 4D simplex noise method.\n *\n * @param {number} x - The x coordinate.\n * @param {number} y - The y coordinate.\n * @param {number} z - The z coordinate.\n * @param {number} w - The w coordinate.\n * @return {number} The noise value.\n */\n noise4d(e, t, n, i) {\n const s = this.grad4, r = this.simplex, a = this.perm, l = (Math.sqrt(5) - 1) / 4, h = (5 - Math.sqrt(5)) / 20;\n let c, u, m, f, d;\n const p = (e + t + n + i) * l, g = Math.floor(e + p), y = Math.floor(t + p), w = Math.floor(n + p), x = Math.floor(i + p), _ = (g + y + w + x) * h, b = g - _, E = y - _, A = w - _, P = x - _, C = e - b, D = t - E, I = n - A, T = i - P, R = C > D ? 32 : 0, v = C > I ? 16 : 0, z = D > I ? 8 : 0, H = C > T ? 4 : 0, V = D > T ? 2 : 0, te = I > T ? 1 : 0, G = R + v + z + H + V + te, $ = r[G][0] >= 3 ? 1 : 0, N = r[G][1] >= 3 ? 1 : 0, O = r[G][2] >= 3 ? 1 : 0, Q = r[G][3] >= 3 ? 1 : 0, ee = r[G][0] >= 2 ? 1 : 0, q = r[G][1] >= 2 ? 1 : 0, de = r[G][2] >= 2 ? 1 : 0, pe = r[G][3] >= 2 ? 1 : 0, se = r[G][0] >= 1 ? 1 : 0, oe = r[G][1] >= 1 ? 1 : 0, he = r[G][2] >= 1 ? 1 : 0, me = r[G][3] >= 1 ? 1 : 0, Te = C - $ + h, Ie = D - N + h, S = I - O + h, W = T - Q + h, j = C - ee + 2 * h, L = D - q + 2 * h, k = I - de + 2 * h, B = T - pe + 2 * h, X = C - se + 3 * h, Z = D - oe + 3 * h, F = I - he + 3 * h, Y = T - me + 3 * h, ne = C - 1 + 4 * h, J = D - 1 + 4 * h, ie = I - 1 + 4 * h, ce = T - 1 + 4 * h, ae = g & 255, Ee = y & 255, Je = w & 255, De = x & 255, Bt = a[ae + a[Ee + a[Je + a[De]]]] % 32, ye = a[ae + $ + a[Ee + N + a[Je + O + a[De + Q]]]] % 32, sn = a[ae + ee + a[Ee + q + a[Je + de + a[De + pe]]]] % 32, Mn = a[ae + se + a[Ee + oe + a[Je + he + a[De + me]]]] % 32, Qe = a[ae + 1 + a[Ee + 1 + a[Je + 1 + a[De + 1]]]] % 32;\n let Tt = 0.6 - C * C - D * D - I * I - T * T;\n Tt < 0 ? c = 0 : (Tt *= Tt, c = Tt * Tt * this._dot4(s[Bt], C, D, I, T));\n let Nt = 0.6 - Te * Te - Ie * Ie - S * S - W * W;\n Nt < 0 ? u = 0 : (Nt *= Nt, u = Nt * Nt * this._dot4(s[ye], Te, Ie, S, W));\n let Ft = 0.6 - j * j - L * L - k * k - B * B;\n Ft < 0 ? m = 0 : (Ft *= Ft, m = Ft * Ft * this._dot4(s[sn], j, L, k, B));\n let Ut = 0.6 - X * X - Z * Z - F * F - Y * Y;\n Ut < 0 ? f = 0 : (Ut *= Ut, f = Ut * Ut * this._dot4(s[Mn], X, Z, F, Y));\n let Et = 0.6 - ne * ne - J * J - ie * ie - ce * ce;\n return Et < 0 ? d = 0 : (Et *= Et, d = Et * Et * this._dot4(s[Qe], ne, J, ie, ce)), 27 * (c + u + m + f + d);\n }\n // private\n _dot(e, t, n) {\n return e[0] * t + e[1] * n;\n }\n _dot3(e, t, n, i) {\n return e[0] * t + e[1] * n + e[2] * i;\n }\n _dot4(e, t, n, i, s) {\n return e[0] * t + e[1] * n + e[2] * i + e[3] * s;\n }\n}\nclass Fe extends tn {\n /**\n * Constructs a new GTAO pass.\n *\n * @param {Scene} scene - The scene to compute the AO for.\n * @param {Camera} camera - The camera.\n * @param {number} [width=512] - The width of the effect.\n * @param {number} [height=512] - The height of the effect.\n * @param {Object} [parameters] - The pass parameters.\n * @param {Object} [aoParameters] - The AO parameters.\n * @param {Object} [pdParameters] - The denoise parameters.\n */\n constructor(e, t, n = 512, i = 512, s, r, a) {\n super(), this.width = n, this.height = i, this.clear = !0, this.camera = t, this.scene = e, this.output = 0, this._renderGBuffer = !0, this._visibilityCache = [], this.blendIntensity = 1, this.pdRings = 2, this.pdRadiusExponent = 2, this.pdSamples = 16, this.gtaoNoiseTexture = uc(), this.pdNoiseTexture = this._generateNoise(), this.gtaoRenderTarget = new Vn(this.width, this.height, { type: _t }), this.pdRenderTarget = this.gtaoRenderTarget.clone(), this.gtaoMaterial = new tt({\n defines: Object.assign({}, Kn.defines),\n uniforms: nt.clone(Kn.uniforms),\n vertexShader: Kn.vertexShader,\n fragmentShader: Kn.fragmentShader,\n blending: ze,\n depthTest: !1,\n depthWrite: !1\n }), this.gtaoMaterial.defines.PERSPECTIVE_CAMERA = this.camera.isPerspectiveCamera ? 1 : 0, this.gtaoMaterial.uniforms.tNoise.value = this.gtaoNoiseTexture, this.gtaoMaterial.uniforms.resolution.value.set(this.width, this.height), this.gtaoMaterial.uniforms.cameraNear.value = this.camera.near, this.gtaoMaterial.uniforms.cameraFar.value = this.camera.far, this.normalMaterial = new Ho(), this.normalMaterial.blending = ze, this.pdMaterial = new tt({\n defines: Object.assign({}, Jn.defines),\n uniforms: nt.clone(Jn.uniforms),\n vertexShader: Jn.vertexShader,\n fragmentShader: Jn.fragmentShader,\n depthTest: !1,\n depthWrite: !1\n }), this.pdMaterial.uniforms.tDiffuse.value = this.gtaoRenderTarget.texture, this.pdMaterial.uniforms.tNoise.value = this.pdNoiseTexture, this.pdMaterial.uniforms.resolution.value.set(this.width, this.height), this.pdMaterial.uniforms.lumaPhi.value = 10, this.pdMaterial.uniforms.depthPhi.value = 2, this.pdMaterial.uniforms.normalPhi.value = 3, this.pdMaterial.uniforms.radius.value = 8, this.depthRenderMaterial = new tt({\n defines: Object.assign({}, $n.defines),\n uniforms: nt.clone($n.uniforms),\n vertexShader: $n.vertexShader,\n fragmentShader: $n.fragmentShader,\n blending: ze\n }), this.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near, this.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far, this.copyMaterial = new tt({\n uniforms: nt.clone(Kt.uniforms),\n vertexShader: Kt.vertexShader,\n fragmentShader: Kt.fragmentShader,\n transparent: !0,\n depthTest: !1,\n depthWrite: !1,\n blendSrc: Ns,\n blendDst: pn,\n blendEquation: fn,\n blendSrcAlpha: Bs,\n blendDstAlpha: pn,\n blendEquationAlpha: fn\n }), this.blendMaterial = new tt({\n uniforms: nt.clone(rs.uniforms),\n vertexShader: rs.vertexShader,\n fragmentShader: rs.fragmentShader,\n transparent: !0,\n depthTest: !1,\n depthWrite: !1,\n blending: jo,\n blendSrc: Ns,\n blendDst: pn,\n blendEquation: fn,\n blendSrcAlpha: Bs,\n blendDstAlpha: pn,\n blendEquationAlpha: fn\n }), this._fsQuad = new Yi(null), this._originalClearColor = new st(), this.setGBuffer(s ? s.depthTexture : void 0, s ? s.normalTexture : void 0), r !== void 0 && this.updateGtaoMaterial(r), a !== void 0 && this.updatePdMaterial(a);\n }\n /**\n * Sets the size of the pass.\n *\n * @param {number} width - The width to set.\n * @param {number} height - The height to set.\n */\n setSize(e, t) {\n this.width = e, this.height = t, this.gtaoRenderTarget.setSize(e, t), this.normalRenderTarget.setSize(e, t), this.pdRenderTarget.setSize(e, t), this.gtaoMaterial.uniforms.resolution.value.set(e, t), this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix), this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse), this.pdMaterial.uniforms.resolution.value.set(e, t), this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.gtaoNoiseTexture.dispose(), this.pdNoiseTexture.dispose(), this.normalRenderTarget.dispose(), this.gtaoRenderTarget.dispose(), this.pdRenderTarget.dispose(), this.normalMaterial.dispose(), this.pdMaterial.dispose(), this.copyMaterial.dispose(), this.depthRenderMaterial.dispose(), this._fsQuad.dispose();\n }\n /**\n * A texture holding the computed AO.\n *\n * @type {Texture}\n * @readonly\n */\n get gtaoMap() {\n return this.pdRenderTarget.texture;\n }\n /**\n * Configures the GBuffer of this pass. If no arguments are passed,\n * the pass creates an internal render target for holding depth\n * and normal data.\n *\n * @param {DepthTexture} [depthTexture] - The depth texture.\n * @param {DepthTexture} [normalTexture] - The normal texture.\n */\n setGBuffer(e, t) {\n e !== void 0 ? (this.depthTexture = e, this.normalTexture = t, this._renderGBuffer = !1) : (this.depthTexture = new Go(), this.depthTexture.format = Wo, this.depthTexture.type = Xo, this.normalRenderTarget = new Vn(this.width, this.height, {\n minFilter: xn,\n magFilter: xn,\n type: _t,\n depthTexture: this.depthTexture\n }), this.normalTexture = this.normalRenderTarget.texture, this._renderGBuffer = !0);\n const n = this.normalTexture ? 1 : 0, i = this.depthTexture === this.normalTexture ? \"w\" : \"x\";\n this.gtaoMaterial.defines.NORMAL_VECTOR_TYPE = n, this.gtaoMaterial.defines.DEPTH_SWIZZLING = i, this.gtaoMaterial.uniforms.tNormal.value = this.normalTexture, this.gtaoMaterial.uniforms.tDepth.value = this.depthTexture, this.pdMaterial.defines.NORMAL_VECTOR_TYPE = n, this.pdMaterial.defines.DEPTH_SWIZZLING = i, this.pdMaterial.uniforms.tNormal.value = this.normalTexture, this.pdMaterial.uniforms.tDepth.value = this.depthTexture, this.depthRenderMaterial.uniforms.tDepth.value = this.normalRenderTarget.depthTexture;\n }\n /**\n * Configures the clip box of the GTAO shader with the given AABB.\n *\n * @param {?Box3} box - The AABB enclosing the scene that should receive AO. When passing\n * `null`, to clip box is used.\n */\n setSceneClipBox(e) {\n e ? (this.gtaoMaterial.needsUpdate = this.gtaoMaterial.defines.SCENE_CLIP_BOX !== 1, this.gtaoMaterial.defines.SCENE_CLIP_BOX = 1, this.gtaoMaterial.uniforms.sceneBoxMin.value.copy(e.min), this.gtaoMaterial.uniforms.sceneBoxMax.value.copy(e.max)) : (this.gtaoMaterial.needsUpdate = this.gtaoMaterial.defines.SCENE_CLIP_BOX === 0, this.gtaoMaterial.defines.SCENE_CLIP_BOX = 0);\n }\n /**\n * Updates the GTAO material from the given parameter object.\n *\n * @param {Object} parameters - The GTAO material parameters.\n */\n updateGtaoMaterial(e) {\n e.radius !== void 0 && (this.gtaoMaterial.uniforms.radius.value = e.radius), e.distanceExponent !== void 0 && (this.gtaoMaterial.uniforms.distanceExponent.value = e.distanceExponent), e.thickness !== void 0 && (this.gtaoMaterial.uniforms.thickness.value = e.thickness), e.distanceFallOff !== void 0 && (this.gtaoMaterial.uniforms.distanceFallOff.value = e.distanceFallOff, this.gtaoMaterial.needsUpdate = !0), e.scale !== void 0 && (this.gtaoMaterial.uniforms.scale.value = e.scale), e.samples !== void 0 && e.samples !== this.gtaoMaterial.defines.SAMPLES && (this.gtaoMaterial.defines.SAMPLES = e.samples, this.gtaoMaterial.needsUpdate = !0), e.screenSpaceRadius !== void 0 && (e.screenSpaceRadius ? 1 : 0) !== this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS && (this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS = e.screenSpaceRadius ? 1 : 0, this.gtaoMaterial.needsUpdate = !0);\n }\n /**\n * Updates the Denoise material from the given parameter object.\n *\n * @param {Object} parameters - The denoise parameters.\n */\n updatePdMaterial(e) {\n let t = !1;\n e.lumaPhi !== void 0 && (this.pdMaterial.uniforms.lumaPhi.value = e.lumaPhi), e.depthPhi !== void 0 && (this.pdMaterial.uniforms.depthPhi.value = e.depthPhi), e.normalPhi !== void 0 && (this.pdMaterial.uniforms.normalPhi.value = e.normalPhi), e.radius !== void 0 && e.radius !== this.radius && (this.pdMaterial.uniforms.radius.value = e.radius), e.radiusExponent !== void 0 && e.radiusExponent !== this.pdRadiusExponent && (this.pdRadiusExponent = e.radiusExponent, t = !0), e.rings !== void 0 && e.rings !== this.pdRings && (this.pdRings = e.rings, t = !0), e.samples !== void 0 && e.samples !== this.pdSamples && (this.pdSamples = e.samples, t = !0), t && (this.pdMaterial.defines.SAMPLES = this.pdSamples, this.pdMaterial.defines.SAMPLE_VECTORS = ia(this.pdSamples, this.pdRings, this.pdRadiusExponent), this.pdMaterial.needsUpdate = !0);\n }\n /**\n * Performs the GTAO pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n switch (this._renderGBuffer && (this._overrideVisibility(), this._renderOverride(e, this.normalMaterial, this.normalRenderTarget, 7829503, 1), this._restoreVisibility()), this.gtaoMaterial.uniforms.cameraNear.value = this.camera.near, this.gtaoMaterial.uniforms.cameraFar.value = this.camera.far, this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix), this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse), this.gtaoMaterial.uniforms.cameraWorldMatrix.value.copy(this.camera.matrixWorld), this._renderPass(e, this.gtaoMaterial, this.gtaoRenderTarget, 16777215, 1), this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse), this._renderPass(e, this.pdMaterial, this.pdRenderTarget, 16777215, 1), this.output) {\n case Fe.OUTPUT.Off:\n break;\n case Fe.OUTPUT.Diffuse:\n this.copyMaterial.uniforms.tDiffuse.value = n.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Fe.OUTPUT.AO:\n this.copyMaterial.uniforms.tDiffuse.value = this.gtaoRenderTarget.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Fe.OUTPUT.Denoise:\n this.copyMaterial.uniforms.tDiffuse.value = this.pdRenderTarget.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Fe.OUTPUT.Depth:\n this.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near, this.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far, this._renderPass(e, this.depthRenderMaterial, this.renderToScreen ? null : t);\n break;\n case Fe.OUTPUT.Normal:\n this.copyMaterial.uniforms.tDiffuse.value = this.normalRenderTarget.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Fe.OUTPUT.Default:\n this.copyMaterial.uniforms.tDiffuse.value = n.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t), this.blendMaterial.uniforms.intensity.value = this.blendIntensity, this.blendMaterial.uniforms.tDiffuse.value = this.pdRenderTarget.texture, this._renderPass(e, this.blendMaterial, this.renderToScreen ? null : t);\n break;\n default:\n console.warn(\"THREE.GTAOPass: Unknown output type.\");\n }\n }\n // internals\n _renderPass(e, t, n, i, s) {\n e.getClearColor(this._originalClearColor);\n const r = e.getClearAlpha(), a = e.autoClear;\n e.setRenderTarget(n), e.autoClear = !1, i != null && (e.setClearColor(i), e.setClearAlpha(s || 0), e.clear()), this._fsQuad.material = t, this._fsQuad.render(e), e.autoClear = a, e.setClearColor(this._originalClearColor), e.setClearAlpha(r);\n }\n _renderOverride(e, t, n, i, s) {\n e.getClearColor(this._originalClearColor);\n const r = e.getClearAlpha(), a = e.autoClear;\n e.setRenderTarget(n), e.autoClear = !1, i = t.clearColor || i, s = t.clearAlpha || s, i != null && (e.setClearColor(i), e.setClearAlpha(s || 0), e.clear()), this.scene.overrideMaterial = t, e.render(this.scene, this.camera), this.scene.overrideMaterial = null, e.autoClear = a, e.setClearColor(this._originalClearColor), e.setClearAlpha(r);\n }\n _overrideVisibility() {\n const e = this.scene, t = this._visibilityCache;\n e.traverse(function(n) {\n (n.isPoints || n.isLine || n.isLine2) && n.visible && (n.visible = !1, t.push(n));\n });\n }\n _restoreVisibility() {\n const e = this._visibilityCache;\n for (let t = 0; t < e.length; t++)\n e[t].visible = !0;\n e.length = 0;\n }\n _generateNoise(e = 64) {\n const t = new sa(), n = e * e * 4, i = new Uint8Array(n);\n for (let r = 0; r < e; r++)\n for (let a = 0; a < e; a++) {\n const l = r, h = a;\n i[(r * e + a) * 4] = (t.noise(l, h) * 0.5 + 0.5) * 255, i[(r * e + a) * 4 + 1] = (t.noise(l + e, h) * 0.5 + 0.5) * 255, i[(r * e + a) * 4 + 2] = (t.noise(l, h + e) * 0.5 + 0.5) * 255, i[(r * e + a) * 4 + 3] = (t.noise(l + e, h + e) * 0.5 + 0.5) * 255;\n }\n const s = new lr(i, e, e, $a, Ja);\n return s.wrapS = vt, s.wrapT = vt, s.needsUpdate = !0, s;\n }\n}\nFe.OUTPUT = {\n Off: -1,\n Default: 0,\n Diffuse: 1,\n Depth: 2,\n Normal: 3,\n AO: 4,\n Denoise: 5\n};\nconst Qn = {\n defines: {\n PERSPECTIVE_CAMERA: 1,\n KERNEL_SIZE: 32\n },\n uniforms: {\n tNormal: { value: null },\n tDepth: { value: null },\n tNoise: { value: null },\n kernel: { value: null },\n cameraNear: { value: null },\n cameraFar: { value: null },\n resolution: { value: new ue() },\n cameraProjectionMatrix: { value: new Me() },\n cameraInverseProjectionMatrix: { value: new Me() },\n kernelRadius: { value: 8 },\n minDistance: { value: 5e-3 },\n maxDistance: { value: 0.05 }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tuniform highp sampler2D tNormal;\n\t\tuniform highp sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\n\t\tuniform vec3 kernel[ KERNEL_SIZE ];\n\n\t\tuniform vec2 resolution;\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform mat4 cameraProjectionMatrix;\n\t\tuniform mat4 cameraInverseProjectionMatrix;\n\n\t\tuniform float kernelRadius;\n\t\tuniform float minDistance; // avoid artifacts caused by neighbour fragments with minimal depth difference\n\t\tuniform float maxDistance; // avoid the influence of fragments which are too far away\n\n\t\tvarying vec2 vUv;\n\n\t\t#include \n\n\t\tfloat getDepth( const in vec2 screenPosition ) {\n\n\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\n\t\t}\n\n\t\tfloat getLinearDepth( const in vec2 screenPosition ) {\n\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\n\t\t\t\tfloat fragCoordZ = texture2D( tDepth, screenPosition ).x;\n\t\t\t\tfloat viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\n\t\t\t\treturn viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n\n\t\t\t#else\n\n\t\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\n\t\t\t#endif\n\n\t\t}\n\n\t\tfloat getViewZ( const in float depth ) {\n\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\n\t\t\t\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\n\n\t\t\t#else\n\n\t\t\t\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\n\n\t\t\t#endif\n\n\t\t}\n\n\t\tvec3 getViewPosition( const in vec2 screenPosition, const in float depth, const in float viewZ ) {\n\n\t\t\tfloat clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\n\n\t\t\tvec4 clipPosition = vec4( ( vec3( screenPosition, depth ) - 0.5 ) * 2.0, 1.0 );\n\n\t\t\tclipPosition *= clipW; // unprojection.\n\n\t\t\treturn ( cameraInverseProjectionMatrix * clipPosition ).xyz;\n\n\t\t}\n\n\t\tvec3 getViewNormal( const in vec2 screenPosition ) {\n\n\t\t\treturn unpackRGBToNormal( texture2D( tNormal, screenPosition ).xyz );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tfloat depth = getDepth( vUv );\n\n\t\t\tif ( depth == 1.0 ) {\n\n\t\t\t\tgl_FragColor = vec4( 1.0 ); // don't influence background\n\n\t\t\t} else {\n\n\t\t\t\tfloat viewZ = getViewZ( depth );\n\n\t\t\t\tvec3 viewPosition = getViewPosition( vUv, depth, viewZ );\n\t\t\t\tvec3 viewNormal = getViewNormal( vUv );\n\n\t\t\t\tvec2 noiseScale = vec2( resolution.x / 4.0, resolution.y / 4.0 );\n\t\t\t\tvec3 random = vec3( texture2D( tNoise, vUv * noiseScale ).r );\n\n\t\t\t\t// compute matrix used to reorient a kernel vector\n\n\t\t\t\tvec3 tangent = normalize( random - viewNormal * dot( random, viewNormal ) );\n\t\t\t\tvec3 bitangent = cross( viewNormal, tangent );\n\t\t\t\tmat3 kernelMatrix = mat3( tangent, bitangent, viewNormal );\n\n\t\t\t\tfloat occlusion = 0.0;\n\n\t\t\t\tfor ( int i = 0; i < KERNEL_SIZE; i ++ ) {\n\n\t\t\t\t\tvec3 sampleVector = kernelMatrix * kernel[ i ]; // reorient sample vector in view space\n\t\t\t\t\tvec3 samplePoint = viewPosition + ( sampleVector * kernelRadius ); // calculate sample point\n\n\t\t\t\t\tvec4 samplePointNDC = cameraProjectionMatrix * vec4( samplePoint, 1.0 ); // project point and calculate NDC\n\t\t\t\t\tsamplePointNDC /= samplePointNDC.w;\n\n\t\t\t\t\tvec2 samplePointUv = samplePointNDC.xy * 0.5 + 0.5; // compute uv coordinates\n\n\t\t\t\t\tfloat realDepth = getLinearDepth( samplePointUv ); // get linear depth from depth texture\n\t\t\t\t\tfloat sampleDepth = viewZToOrthographicDepth( samplePoint.z, cameraNear, cameraFar ); // compute linear depth of the sample view Z value\n\t\t\t\t\tfloat delta = sampleDepth - realDepth;\n\n\t\t\t\t\tif ( delta > minDistance && delta < maxDistance ) { // if fragment is before sample point, increase occlusion\n\n\t\t\t\t\t\tocclusion += 1.0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tocclusion = clamp( occlusion / float( KERNEL_SIZE ), 0.0, 1.0 );\n\n\t\t\t\tgl_FragColor = vec4( vec3( 1.0 - occlusion ), 1.0 );\n\n\t\t\t}\n\n\t\t}`\n )\n}, ei = {\n defines: {\n PERSPECTIVE_CAMERA: 1\n },\n uniforms: {\n tDepth: { value: null },\n cameraNear: { value: null },\n cameraFar: { value: null }\n },\n vertexShader: `varying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n fragmentShader: `uniform sampler2D tDepth;\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\n\t\tvarying vec2 vUv;\n\n\t\t#include \n\n\t\tfloat getLinearDepth( const in vec2 screenPosition ) {\n\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\n\t\t\t\tfloat fragCoordZ = texture2D( tDepth, screenPosition ).x;\n\t\t\t\tfloat viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\n\t\t\t\treturn viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n\n\t\t\t#else\n\n\t\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\n\t\t\t#endif\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tfloat depth = getLinearDepth( vUv );\n\t\t\tgl_FragColor = vec4( vec3( 1.0 - depth ), 1.0 );\n\n\t\t}`\n}, ti = {\n uniforms: {\n tDiffuse: { value: null },\n resolution: { value: new ue() }\n },\n vertexShader: `varying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n fragmentShader: `uniform sampler2D tDiffuse;\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec2 texelSize = ( 1.0 / resolution );\n\t\t\tfloat result = 0.0;\n\n\t\t\tfor ( int i = - 2; i <= 2; i ++ ) {\n\n\t\t\t\tfor ( int j = - 2; j <= 2; j ++ ) {\n\n\t\t\t\t\tvec2 offset = ( vec2( float( i ), float( j ) ) ) * texelSize;\n\t\t\t\t\tresult += texture2D( tDiffuse, vUv + offset ).r;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgl_FragColor = vec4( vec3( result / ( 5.0 * 5.0 ) ), 1.0 );\n\n\t\t}`\n};\nclass xt extends tn {\n /**\n * Constructs a new SSAO pass.\n *\n * @param {Scene} scene - The scene to compute the AO for.\n * @param {Camera} camera - The camera.\n * @param {number} [width=512] - The width of the effect.\n * @param {number} [height=512] - The height of the effect.\n * @param {number} [kernelSize=32] - The kernel size.\n */\n constructor(e, t, n = 512, i = 512, s = 32) {\n super(), this.width = n, this.height = i, this.clear = !0, this.needsSwap = !1, this.camera = t, this.scene = e, this.kernelRadius = 8, this.kernel = [], this.noiseTexture = null, this.output = 0, this.minDistance = 5e-3, this.maxDistance = 0.1, this._visibilityCache = [], this._generateSampleKernel(s), this._generateRandomKernelRotations();\n const r = new Go();\n r.format = Wo, r.type = Xo, this.normalRenderTarget = new Vn(this.width, this.height, {\n minFilter: xn,\n magFilter: xn,\n type: _t,\n depthTexture: r\n }), this.ssaoRenderTarget = new Vn(this.width, this.height, { type: _t }), this.blurRenderTarget = this.ssaoRenderTarget.clone(), this.ssaoMaterial = new tt({\n defines: Object.assign({}, Qn.defines),\n uniforms: nt.clone(Qn.uniforms),\n vertexShader: Qn.vertexShader,\n fragmentShader: Qn.fragmentShader,\n blending: ze\n }), this.ssaoMaterial.defines.KERNEL_SIZE = s, this.ssaoMaterial.uniforms.tNormal.value = this.normalRenderTarget.texture, this.ssaoMaterial.uniforms.tDepth.value = this.normalRenderTarget.depthTexture, this.ssaoMaterial.uniforms.tNoise.value = this.noiseTexture, this.ssaoMaterial.uniforms.kernel.value = this.kernel, this.ssaoMaterial.uniforms.cameraNear.value = this.camera.near, this.ssaoMaterial.uniforms.cameraFar.value = this.camera.far, this.ssaoMaterial.uniforms.resolution.value.set(this.width, this.height), this.ssaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix), this.ssaoMaterial.uniforms.cameraInverseProjectionMatrix.value.copy(this.camera.projectionMatrixInverse), this.normalMaterial = new Ho(), this.normalMaterial.blending = ze, this.blurMaterial = new tt({\n defines: Object.assign({}, ti.defines),\n uniforms: nt.clone(ti.uniforms),\n vertexShader: ti.vertexShader,\n fragmentShader: ti.fragmentShader\n }), this.blurMaterial.uniforms.tDiffuse.value = this.ssaoRenderTarget.texture, this.blurMaterial.uniforms.resolution.value.set(this.width, this.height), this.depthRenderMaterial = new tt({\n defines: Object.assign({}, ei.defines),\n uniforms: nt.clone(ei.uniforms),\n vertexShader: ei.vertexShader,\n fragmentShader: ei.fragmentShader,\n blending: ze\n }), this.depthRenderMaterial.uniforms.tDepth.value = this.normalRenderTarget.depthTexture, this.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near, this.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far, this.copyMaterial = new tt({\n uniforms: nt.clone(Kt.uniforms),\n vertexShader: Kt.vertexShader,\n fragmentShader: Kt.fragmentShader,\n transparent: !0,\n depthTest: !1,\n depthWrite: !1,\n blendSrc: Ns,\n blendDst: pn,\n blendEquation: fn,\n blendSrcAlpha: Bs,\n blendDstAlpha: pn,\n blendEquationAlpha: fn\n }), this._fsQuad = new Yi(null), this._originalClearColor = new st();\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.normalRenderTarget.dispose(), this.ssaoRenderTarget.dispose(), this.blurRenderTarget.dispose(), this.normalMaterial.dispose(), this.blurMaterial.dispose(), this.copyMaterial.dispose(), this.depthRenderMaterial.dispose(), this._fsQuad.dispose();\n }\n /**\n * Performs the SSAO pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n switch (this._overrideVisibility(), this._renderOverride(e, this.normalMaterial, this.normalRenderTarget, 7829503, 1), this._restoreVisibility(), this.ssaoMaterial.uniforms.kernelRadius.value = this.kernelRadius, this.ssaoMaterial.uniforms.minDistance.value = this.minDistance, this.ssaoMaterial.uniforms.maxDistance.value = this.maxDistance, this._renderPass(e, this.ssaoMaterial, this.ssaoRenderTarget), this._renderPass(e, this.blurMaterial, this.blurRenderTarget), this.output) {\n case xt.OUTPUT.SSAO:\n this.copyMaterial.uniforms.tDiffuse.value = this.ssaoRenderTarget.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : n);\n break;\n case xt.OUTPUT.Blur:\n this.copyMaterial.uniforms.tDiffuse.value = this.blurRenderTarget.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : n);\n break;\n case xt.OUTPUT.Depth:\n this._renderPass(e, this.depthRenderMaterial, this.renderToScreen ? null : n);\n break;\n case xt.OUTPUT.Normal:\n this.copyMaterial.uniforms.tDiffuse.value = this.normalRenderTarget.texture, this.copyMaterial.blending = ze, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : n);\n break;\n case xt.OUTPUT.Default:\n this.copyMaterial.uniforms.tDiffuse.value = this.blurRenderTarget.texture, this.copyMaterial.blending = jo, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : n);\n break;\n default:\n console.warn(\"THREE.SSAOPass: Unknown output type.\");\n }\n }\n /**\n * Sets the size of the pass.\n *\n * @param {number} width - The width to set.\n * @param {number} height - The height to set.\n */\n setSize(e, t) {\n this.width = e, this.height = t, this.ssaoRenderTarget.setSize(e, t), this.normalRenderTarget.setSize(e, t), this.blurRenderTarget.setSize(e, t), this.ssaoMaterial.uniforms.resolution.value.set(e, t), this.ssaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix), this.ssaoMaterial.uniforms.cameraInverseProjectionMatrix.value.copy(this.camera.projectionMatrixInverse), this.blurMaterial.uniforms.resolution.value.set(e, t);\n }\n // internals\n _renderPass(e, t, n, i, s) {\n e.getClearColor(this._originalClearColor);\n const r = e.getClearAlpha(), a = e.autoClear;\n e.setRenderTarget(n), e.autoClear = !1, i != null && (e.setClearColor(i), e.setClearAlpha(s || 0), e.clear()), this._fsQuad.material = t, this._fsQuad.render(e), e.autoClear = a, e.setClearColor(this._originalClearColor), e.setClearAlpha(r);\n }\n _renderOverride(e, t, n, i, s) {\n e.getClearColor(this._originalClearColor);\n const r = e.getClearAlpha(), a = e.autoClear;\n e.setRenderTarget(n), e.autoClear = !1, i = t.clearColor || i, s = t.clearAlpha || s, i != null && (e.setClearColor(i), e.setClearAlpha(s || 0), e.clear()), this.scene.overrideMaterial = t, e.render(this.scene, this.camera), this.scene.overrideMaterial = null, e.autoClear = a, e.setClearColor(this._originalClearColor), e.setClearAlpha(r);\n }\n _generateSampleKernel(e) {\n const t = this.kernel;\n for (let n = 0; n < e; n++) {\n const i = new K();\n i.x = Math.random() * 2 - 1, i.y = Math.random() * 2 - 1, i.z = Math.random(), i.normalize();\n let s = n / e;\n s = or.lerp(0.1, 1, s * s), i.multiplyScalar(s), t.push(i);\n }\n }\n _generateRandomKernelRotations() {\n const n = new sa(), i = 16, s = new Float32Array(i);\n for (let r = 0; r < i; r++) {\n const a = Math.random() * 2 - 1, l = Math.random() * 2 - 1, h = 0;\n s[r] = n.noise3d(a, l, h);\n }\n this.noiseTexture = new lr(s, 4, 4, Qa, Ci), this.noiseTexture.wrapS = vt, this.noiseTexture.wrapT = vt, this.noiseTexture.needsUpdate = !0;\n }\n _overrideVisibility() {\n const e = this.scene, t = this._visibilityCache;\n e.traverse(function(n) {\n (n.isPoints || n.isLine || n.isLine2) && n.visible && (n.visible = !1, t.push(n));\n });\n }\n _restoreVisibility() {\n const e = this._visibilityCache;\n for (let t = 0; t < e.length; t++)\n e[t].visible = !0;\n e.length = 0;\n }\n}\nxt.OUTPUT = {\n Default: 0,\n SSAO: 1,\n Blur: 2,\n Depth: 3,\n Normal: 4\n};\nconst ni = {\n name: \"OutputShader\",\n uniforms: {\n tDiffuse: { value: null },\n toneMappingExposure: { value: 1 }\n },\n vertexShader: (\n /* glsl */\n `\n\t\tprecision highp float;\n\n\t\tuniform mat4 modelViewMatrix;\n\t\tuniform mat4 projectionMatrix;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\n\t\tprecision highp float;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\t#include \n\t\t#include \n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t// tone mapping\n\n\t\t\t#ifdef LINEAR_TONE_MAPPING\n\n\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( AGX_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\n\t\t\t#endif\n\n\t\t\t// color space\n\n\t\t\t#ifdef SRGB_TRANSFER\n\n\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\n\t\t\t#endif\n\n\t\t}`\n )\n};\nclass pc extends tn {\n /**\n * Constructs a new output pass.\n */\n constructor() {\n super(), this.uniforms = nt.clone(ni.uniforms), this.material = new el({\n name: ni.name,\n uniforms: this.uniforms,\n vertexShader: ni.vertexShader,\n fragmentShader: ni.fragmentShader\n }), this._fsQuad = new Yi(this.material), this._outputColorSpace = null, this._toneMapping = null;\n }\n /**\n * Performs the output pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n this.uniforms.tDiffuse.value = n.texture, this.uniforms.toneMappingExposure.value = e.toneMappingExposure, (this._outputColorSpace !== e.outputColorSpace || this._toneMapping !== e.toneMapping) && (this._outputColorSpace = e.outputColorSpace, this._toneMapping = e.toneMapping, this.material.defines = {}, Fi.getTransfer(this._outputColorSpace) === tl && (this.material.defines.SRGB_TRANSFER = \"\"), this._toneMapping === nl ? this.material.defines.LINEAR_TONE_MAPPING = \"\" : this._toneMapping === il ? this.material.defines.REINHARD_TONE_MAPPING = \"\" : this._toneMapping === sl ? this.material.defines.CINEON_TONE_MAPPING = \"\" : this._toneMapping === rl ? this.material.defines.ACES_FILMIC_TONE_MAPPING = \"\" : this._toneMapping === ol ? this.material.defines.AGX_TONE_MAPPING = \"\" : this._toneMapping === al ? this.material.defines.NEUTRAL_TONE_MAPPING = \"\" : this._toneMapping === ll && (this.material.defines.CUSTOM_TONE_MAPPING = \"\"), this.material.needsUpdate = !0), this.renderToScreen === !0 ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(t), this.clear && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), this._fsQuad.render(e));\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.material.dispose(), this._fsQuad.dispose();\n }\n}\nconst mc = {\n name: \"FXAAShader\",\n uniforms: {\n tDiffuse: { value: null },\n resolution: { value: new ue(1 / 1024, 1 / 512) }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec2 resolution;\n\t\tvarying vec2 vUv;\n\n\t\t#define EDGE_STEP_COUNT 6\n\t\t#define EDGE_GUESS 8.0\n\t\t#define EDGE_STEPS 1.0, 1.5, 2.0, 2.0, 2.0, 4.0\n\t\tconst float edgeSteps[EDGE_STEP_COUNT] = float[EDGE_STEP_COUNT]( EDGE_STEPS );\n\n\t\tfloat _ContrastThreshold = 0.0312;\n\t\tfloat _RelativeThreshold = 0.063;\n\t\tfloat _SubpixelBlending = 1.0;\n\n\t\tvec4 Sample( sampler2D tex2D, vec2 uv ) {\n\n\t\t\treturn texture( tex2D, uv );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 uv ) {\n\n\t\t\treturn dot( Sample( tex2D, uv ).rgb, vec3( 0.3, 0.59, 0.11 ) );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 texSize, vec2 uv, float uOffset, float vOffset ) {\n\n\t\t\tuv += texSize * vec2(uOffset, vOffset);\n\t\t\treturn SampleLuminance(tex2D, uv);\n\n\t\t}\n\n\t\tstruct LuminanceData {\n\n\t\t\tfloat m, n, e, s, w;\n\t\t\tfloat ne, nw, se, sw;\n\t\t\tfloat highest, lowest, contrast;\n\n\t\t};\n\n\t\tLuminanceData SampleLuminanceNeighborhood( sampler2D tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData l;\n\t\t\tl.m = SampleLuminance( tex2D, uv );\n\t\t\tl.n = SampleLuminance( tex2D, texSize, uv, 0.0, 1.0 );\n\t\t\tl.e = SampleLuminance( tex2D, texSize, uv, 1.0, 0.0 );\n\t\t\tl.s = SampleLuminance( tex2D, texSize, uv, 0.0, -1.0 );\n\t\t\tl.w = SampleLuminance( tex2D, texSize, uv, -1.0, 0.0 );\n\n\t\t\tl.ne = SampleLuminance( tex2D, texSize, uv, 1.0, 1.0 );\n\t\t\tl.nw = SampleLuminance( tex2D, texSize, uv, -1.0, 1.0 );\n\t\t\tl.se = SampleLuminance( tex2D, texSize, uv, 1.0, -1.0 );\n\t\t\tl.sw = SampleLuminance( tex2D, texSize, uv, -1.0, -1.0 );\n\n\t\t\tl.highest = max( max( max( max( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.lowest = min( min( min( min( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.contrast = l.highest - l.lowest;\n\t\t\treturn l;\n\n\t\t}\n\n\t\tbool ShouldSkipPixel( LuminanceData l ) {\n\n\t\t\tfloat threshold = max( _ContrastThreshold, _RelativeThreshold * l.highest );\n\t\t\treturn l.contrast < threshold;\n\n\t\t}\n\n\t\tfloat DeterminePixelBlendFactor( LuminanceData l ) {\n\n\t\t\tfloat f = 2.0 * ( l.n + l.e + l.s + l.w );\n\t\t\tf += l.ne + l.nw + l.se + l.sw;\n\t\t\tf *= 1.0 / 12.0;\n\t\t\tf = abs( f - l.m );\n\t\t\tf = clamp( f / l.contrast, 0.0, 1.0 );\n\n\t\t\tfloat blendFactor = smoothstep( 0.0, 1.0, f );\n\t\t\treturn blendFactor * blendFactor * _SubpixelBlending;\n\n\t\t}\n\n\t\tstruct EdgeData {\n\n\t\t\tbool isHorizontal;\n\t\t\tfloat pixelStep;\n\t\t\tfloat oppositeLuminance, gradient;\n\n\t\t};\n\n\t\tEdgeData DetermineEdge( vec2 texSize, LuminanceData l ) {\n\n\t\t\tEdgeData e;\n\t\t\tfloat horizontal =\n\t\t\t\tabs( l.n + l.s - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.se - 2.0 * l.e ) +\n\t\t\t\tabs( l.nw + l.sw - 2.0 * l.w );\n\t\t\tfloat vertical =\n\t\t\t\tabs( l.e + l.w - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.nw - 2.0 * l.n ) +\n\t\t\t\tabs( l.se + l.sw - 2.0 * l.s );\n\t\t\te.isHorizontal = horizontal >= vertical;\n\n\t\t\tfloat pLuminance = e.isHorizontal ? l.n : l.e;\n\t\t\tfloat nLuminance = e.isHorizontal ? l.s : l.w;\n\t\t\tfloat pGradient = abs( pLuminance - l.m );\n\t\t\tfloat nGradient = abs( nLuminance - l.m );\n\n\t\t\te.pixelStep = e.isHorizontal ? texSize.y : texSize.x;\n\n\t\t\tif (pGradient < nGradient) {\n\n\t\t\t\te.pixelStep = -e.pixelStep;\n\t\t\t\te.oppositeLuminance = nLuminance;\n\t\t\t\te.gradient = nGradient;\n\n\t\t\t} else {\n\n\t\t\t\te.oppositeLuminance = pLuminance;\n\t\t\t\te.gradient = pGradient;\n\n\t\t\t}\n\n\t\t\treturn e;\n\n\t\t}\n\n\t\tfloat DetermineEdgeBlendFactor( sampler2D tex2D, vec2 texSize, LuminanceData l, EdgeData e, vec2 uv ) {\n\n\t\t\tvec2 uvEdge = uv;\n\t\t\tvec2 edgeStep;\n\t\t\tif (e.isHorizontal) {\n\n\t\t\t\tuvEdge.y += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( texSize.x, 0.0 );\n\n\t\t\t} else {\n\n\t\t\t\tuvEdge.x += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( 0.0, texSize.y );\n\n\t\t\t}\n\n\t\t\tfloat edgeLuminance = ( l.m + e.oppositeLuminance ) * 0.5;\n\t\t\tfloat gradientThreshold = e.gradient * 0.25;\n\n\t\t\tvec2 puv = uvEdge + edgeStep * edgeSteps[0];\n\t\t\tfloat pLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\tbool pAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !pAtEnd; i++ ) {\n\n\t\t\t\tpuv += edgeStep * edgeSteps[i];\n\t\t\t\tpLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\t\tpAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !pAtEnd ) {\n\n\t\t\t\tpuv += edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tvec2 nuv = uvEdge - edgeStep * edgeSteps[0];\n\t\t\tfloat nLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\tbool nAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !nAtEnd; i++ ) {\n\n\t\t\t\tnuv -= edgeStep * edgeSteps[i];\n\t\t\t\tnLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\t\tnAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !nAtEnd ) {\n\n\t\t\t\tnuv -= edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tfloat pDistance, nDistance;\n\t\t\tif ( e.isHorizontal ) {\n\n\t\t\t\tpDistance = puv.x - uv.x;\n\t\t\t\tnDistance = uv.x - nuv.x;\n\n\t\t\t} else {\n\n\t\t\t\tpDistance = puv.y - uv.y;\n\t\t\t\tnDistance = uv.y - nuv.y;\n\n\t\t\t}\n\n\t\t\tfloat shortestDistance;\n\t\t\tbool deltaSign;\n\t\t\tif ( pDistance <= nDistance ) {\n\n\t\t\t\tshortestDistance = pDistance;\n\t\t\t\tdeltaSign = pLuminanceDelta >= 0.0;\n\n\t\t\t} else {\n\n\t\t\t\tshortestDistance = nDistance;\n\t\t\t\tdeltaSign = nLuminanceDelta >= 0.0;\n\n\t\t\t}\n\n\t\t\tif ( deltaSign == ( l.m - edgeLuminance >= 0.0 ) ) {\n\n\t\t\t\treturn 0.0;\n\n\t\t\t}\n\n\t\t\treturn 0.5 - shortestDistance / ( pDistance + nDistance );\n\n\t\t}\n\n\t\tvec4 ApplyFXAA( sampler2D tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData luminance = SampleLuminanceNeighborhood( tex2D, texSize, uv );\n\t\t\tif ( ShouldSkipPixel( luminance ) ) {\n\n\t\t\t\treturn Sample( tex2D, uv );\n\n\t\t\t}\n\n\t\t\tfloat pixelBlend = DeterminePixelBlendFactor( luminance );\n\t\t\tEdgeData edge = DetermineEdge( texSize, luminance );\n\t\t\tfloat edgeBlend = DetermineEdgeBlendFactor( tex2D, texSize, luminance, edge, uv );\n\t\t\tfloat finalBlend = max( pixelBlend, edgeBlend );\n\n\t\t\tif (edge.isHorizontal) {\n\n\t\t\t\tuv.y += edge.pixelStep * finalBlend;\n\n\t\t\t} else {\n\n\t\t\t\tuv.x += edge.pixelStep * finalBlend;\n\n\t\t\t}\n\n\t\t\treturn Sample( tex2D, uv );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = ApplyFXAA( tDiffuse, resolution.xy, vUv );\n\n\t\t}`\n )\n}, gc = {\n uniforms: {\n tDiffuse: { value: null },\n saturation: { value: 1.2 },\n // 饱和度值,1.0为原始,大于1.0增加饱和度\n contrast: { value: 1.2 }\n // 对比度值,1.0为原始,大于1.0增加对比度\n },\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform sampler2D tDiffuse;\n uniform float saturation;\n uniform float contrast;\n varying vec2 vUv;\n \n void main() {\n vec4 color = texture2D(tDiffuse, vUv);\n \n // 转换为灰度值用于饱和度调整\n float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));\n \n // 混合原始颜色和灰度值来调整饱和度\n color.rgb = mix(vec3(gray), color.rgb, saturation);\n \n // 调整对比度\n color.rgb = (color.rgb - 0.5) * contrast + 0.5;\n \n gl_FragColor = color;\n }\n `\n};\nclass yc {\n engine;\n composer;\n saturationPass;\n ssaoPass;\n gtaoPass;\n outputPass;\n fxaaPass;\n constructor(e) {\n this.engine = e;\n }\n resize(e, t) {\n if (e === void 0 || t === void 0) {\n const s = this.engine.deviceModule.getContainerSize();\n e = e ?? s.width, t = t ?? s.height;\n }\n if (!e || !t || !this.composer)\n return;\n const n = this.engine.renderer?.getPixelRatio?.() ?? window.devicePixelRatio ?? 1;\n this.composer.setPixelRatio(n), this.composer.setSize(e, t);\n const i = this.composer.passes.find((s) => s instanceof Pi && s.material.uniforms.resolution);\n i && (i.material.uniforms.resolution.value.x = 1 / (e * n), i.material.uniforms.resolution.value.y = 1 / (t * n));\n }\n init() {\n const { width: e, height: t } = this.engine.deviceModule.getContainerSize(), n = this.engine.scene, i = this.engine.camera, s = this.engine.renderer, r = this.engine.renderer?.getPixelRatio?.() ?? window.devicePixelRatio ?? 1, a = new M.WebGLRenderTarget(e, t, {\n minFilter: M.LinearFilter,\n magFilter: M.LinearFilter,\n format: M.RGBAFormat,\n samples: 4\n // 启用多重采样抗锯齿\n });\n this.composer = new cc(s, a), this.composer.setPixelRatio(r), this.composer.setSize(e, t);\n const l = new hc(n, i);\n this.composer.addPass(l), this.gtaoPass = new Fe(n, i, e, t), this.gtaoPass.output = Fe.OUTPUT.Default, this.gtaoPass.blendIntensity = 0.3, this.gtaoPass.enabled = !1, this.gtaoPass.updateGtaoMaterial && this.gtaoPass.updateGtaoMaterial({\n radius: 1,\n distanceExponent: 1,\n thickness: 1,\n scale: 1,\n distanceFallOff: 1,\n screenSpaceRadius: !0\n }), this.composer.addPass(this.gtaoPass), this.ssaoPass = new xt(n, i, e, t), this.ssaoPass.kernelRadius = 8, this.ssaoPass.minDistance = 5e-3, this.ssaoPass.maxDistance = 0.1, this.ssaoPass.output = xt.OUTPUT.Default, this.ssaoPass.enabled = !1, this.composer.addPass(this.ssaoPass), this.saturationPass = new Pi(gc), this.saturationPass.uniforms.saturation.value = 1.3, this.saturationPass.uniforms.contrast.value = 1.1, this.saturationPass.enabled = !1, this.composer.addPass(this.saturationPass), this.outputPass = new pc(), this.outputPass.enabled = !1, this.composer.addPass(this.outputPass), this.fxaaPass = new Pi(mc), this.fxaaPass.material.uniforms.resolution.value.x = 1 / (e * r), this.fxaaPass.material.uniforms.resolution.value.y = 1 / (t * r), this.fxaaPass.enabled = !1, this.composer.addPass(this.fxaaPass);\n }\n}\nvar ii = typeof globalThis < \"u\" ? globalThis : typeof window < \"u\" ? window : typeof global < \"u\" ? global : typeof self < \"u\" ? self : {};\nfunction ra(o) {\n return o && o.__esModule && Object.prototype.hasOwnProperty.call(o, \"default\") ? o.default : o;\n}\nfunction si(o) {\n throw new Error('Could not dynamically require \"' + o + '\". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');\n}\nvar os = { exports: {} };\nvar Dr;\nfunction wc() {\n return Dr || (Dr = 1, (function(o, e) {\n (function(t) {\n o.exports = t();\n })(function() {\n return (function t(n, i, s) {\n function r(h, c) {\n if (!i[h]) {\n if (!n[h]) {\n var u = typeof si == \"function\" && si;\n if (!c && u) return u(h, !0);\n if (a) return a(h, !0);\n var m = new Error(\"Cannot find module '\" + h + \"'\");\n throw m.code = \"MODULE_NOT_FOUND\", m;\n }\n var f = i[h] = { exports: {} };\n n[h][0].call(f.exports, function(d) {\n var p = n[h][1][d];\n return r(p || d);\n }, f, f.exports, t, n, i, s);\n }\n return i[h].exports;\n }\n for (var a = typeof si == \"function\" && si, l = 0; l < s.length; l++) r(s[l]);\n return r;\n })({ 1: [function(t, n, i) {\n var s = t(\"./utils\"), r = t(\"./support\"), a = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n i.encode = function(l) {\n for (var h, c, u, m, f, d, p, g = [], y = 0, w = l.length, x = w, _ = s.getTypeOf(l) !== \"string\"; y < l.length; ) x = w - y, u = _ ? (h = l[y++], c = y < w ? l[y++] : 0, y < w ? l[y++] : 0) : (h = l.charCodeAt(y++), c = y < w ? l.charCodeAt(y++) : 0, y < w ? l.charCodeAt(y++) : 0), m = h >> 2, f = (3 & h) << 4 | c >> 4, d = 1 < x ? (15 & c) << 2 | u >> 6 : 64, p = 2 < x ? 63 & u : 64, g.push(a.charAt(m) + a.charAt(f) + a.charAt(d) + a.charAt(p));\n return g.join(\"\");\n }, i.decode = function(l) {\n var h, c, u, m, f, d, p = 0, g = 0, y = \"data:\";\n if (l.substr(0, y.length) === y) throw new Error(\"Invalid base64 input, it looks like a data url.\");\n var w, x = 3 * (l = l.replace(/[^A-Za-z0-9+/=]/g, \"\")).length / 4;\n if (l.charAt(l.length - 1) === a.charAt(64) && x--, l.charAt(l.length - 2) === a.charAt(64) && x--, x % 1 != 0) throw new Error(\"Invalid base64 input, bad content length.\");\n for (w = r.uint8array ? new Uint8Array(0 | x) : new Array(0 | x); p < l.length; ) h = a.indexOf(l.charAt(p++)) << 2 | (m = a.indexOf(l.charAt(p++))) >> 4, c = (15 & m) << 4 | (f = a.indexOf(l.charAt(p++))) >> 2, u = (3 & f) << 6 | (d = a.indexOf(l.charAt(p++))), w[g++] = h, f !== 64 && (w[g++] = c), d !== 64 && (w[g++] = u);\n return w;\n };\n }, { \"./support\": 30, \"./utils\": 32 }], 2: [function(t, n, i) {\n var s = t(\"./external\"), r = t(\"./stream/DataWorker\"), a = t(\"./stream/Crc32Probe\"), l = t(\"./stream/DataLengthProbe\");\n function h(c, u, m, f, d) {\n this.compressedSize = c, this.uncompressedSize = u, this.crc32 = m, this.compression = f, this.compressedContent = d;\n }\n h.prototype = { getContentWorker: function() {\n var c = new r(s.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new l(\"data_length\")), u = this;\n return c.on(\"end\", function() {\n if (this.streamInfo.data_length !== u.uncompressedSize) throw new Error(\"Bug : uncompressed data size mismatch\");\n }), c;\n }, getCompressedWorker: function() {\n return new r(s.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\", this.compressedSize).withStreamInfo(\"uncompressedSize\", this.uncompressedSize).withStreamInfo(\"crc32\", this.crc32).withStreamInfo(\"compression\", this.compression);\n } }, h.createWorkerFrom = function(c, u, m) {\n return c.pipe(new a()).pipe(new l(\"uncompressedSize\")).pipe(u.compressWorker(m)).pipe(new l(\"compressedSize\")).withStreamInfo(\"compression\", u);\n }, n.exports = h;\n }, { \"./external\": 6, \"./stream/Crc32Probe\": 25, \"./stream/DataLengthProbe\": 26, \"./stream/DataWorker\": 27 }], 3: [function(t, n, i) {\n var s = t(\"./stream/GenericWorker\");\n i.STORE = { magic: \"\\0\\0\", compressWorker: function() {\n return new s(\"STORE compression\");\n }, uncompressWorker: function() {\n return new s(\"STORE decompression\");\n } }, i.DEFLATE = t(\"./flate\");\n }, { \"./flate\": 7, \"./stream/GenericWorker\": 28 }], 4: [function(t, n, i) {\n var s = t(\"./utils\"), r = (function() {\n for (var a, l = [], h = 0; h < 256; h++) {\n a = h;\n for (var c = 0; c < 8; c++) a = 1 & a ? 3988292384 ^ a >>> 1 : a >>> 1;\n l[h] = a;\n }\n return l;\n })();\n n.exports = function(a, l) {\n return a !== void 0 && a.length ? s.getTypeOf(a) !== \"string\" ? (function(h, c, u, m) {\n var f = r, d = m + u;\n h ^= -1;\n for (var p = m; p < d; p++) h = h >>> 8 ^ f[255 & (h ^ c[p])];\n return -1 ^ h;\n })(0 | l, a, a.length, 0) : (function(h, c, u, m) {\n var f = r, d = m + u;\n h ^= -1;\n for (var p = m; p < d; p++) h = h >>> 8 ^ f[255 & (h ^ c.charCodeAt(p))];\n return -1 ^ h;\n })(0 | l, a, a.length, 0) : 0;\n };\n }, { \"./utils\": 32 }], 5: [function(t, n, i) {\n i.base64 = !1, i.binary = !1, i.dir = !1, i.createFolders = !0, i.date = null, i.compression = null, i.compressionOptions = null, i.comment = null, i.unixPermissions = null, i.dosPermissions = null;\n }, {}], 6: [function(t, n, i) {\n var s = null;\n s = typeof Promise < \"u\" ? Promise : t(\"lie\"), n.exports = { Promise: s };\n }, { lie: 37 }], 7: [function(t, n, i) {\n var s = typeof Uint8Array < \"u\" && typeof Uint16Array < \"u\" && typeof Uint32Array < \"u\", r = t(\"pako\"), a = t(\"./utils\"), l = t(\"./stream/GenericWorker\"), h = s ? \"uint8array\" : \"array\";\n function c(u, m) {\n l.call(this, \"FlateWorker/\" + u), this._pako = null, this._pakoAction = u, this._pakoOptions = m, this.meta = {};\n }\n i.magic = \"\\b\\0\", a.inherits(c, l), c.prototype.processChunk = function(u) {\n this.meta = u.meta, this._pako === null && this._createPako(), this._pako.push(a.transformTo(h, u.data), !1);\n }, c.prototype.flush = function() {\n l.prototype.flush.call(this), this._pako === null && this._createPako(), this._pako.push([], !0);\n }, c.prototype.cleanUp = function() {\n l.prototype.cleanUp.call(this), this._pako = null;\n }, c.prototype._createPako = function() {\n this._pako = new r[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });\n var u = this;\n this._pako.onData = function(m) {\n u.push({ data: m, meta: u.meta });\n };\n }, i.compressWorker = function(u) {\n return new c(\"Deflate\", u);\n }, i.uncompressWorker = function() {\n return new c(\"Inflate\", {});\n };\n }, { \"./stream/GenericWorker\": 28, \"./utils\": 32, pako: 38 }], 8: [function(t, n, i) {\n function s(f, d) {\n var p, g = \"\";\n for (p = 0; p < d; p++) g += String.fromCharCode(255 & f), f >>>= 8;\n return g;\n }\n function r(f, d, p, g, y, w) {\n var x, _, b = f.file, E = f.compression, A = w !== h.utf8encode, P = a.transformTo(\"string\", w(b.name)), C = a.transformTo(\"string\", h.utf8encode(b.name)), D = b.comment, I = a.transformTo(\"string\", w(D)), T = a.transformTo(\"string\", h.utf8encode(D)), R = C.length !== b.name.length, v = T.length !== D.length, z = \"\", H = \"\", V = \"\", te = b.dir, G = b.date, $ = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };\n d && !p || ($.crc32 = f.crc32, $.compressedSize = f.compressedSize, $.uncompressedSize = f.uncompressedSize);\n var N = 0;\n d && (N |= 8), A || !R && !v || (N |= 2048);\n var O = 0, Q = 0;\n te && (O |= 16), y === \"UNIX\" ? (Q = 798, O |= (function(q, de) {\n var pe = q;\n return q || (pe = de ? 16893 : 33204), (65535 & pe) << 16;\n })(b.unixPermissions, te)) : (Q = 20, O |= (function(q) {\n return 63 & (q || 0);\n })(b.dosPermissions)), x = G.getUTCHours(), x <<= 6, x |= G.getUTCMinutes(), x <<= 5, x |= G.getUTCSeconds() / 2, _ = G.getUTCFullYear() - 1980, _ <<= 4, _ |= G.getUTCMonth() + 1, _ <<= 5, _ |= G.getUTCDate(), R && (H = s(1, 1) + s(c(P), 4) + C, z += \"up\" + s(H.length, 2) + H), v && (V = s(1, 1) + s(c(I), 4) + T, z += \"uc\" + s(V.length, 2) + V);\n var ee = \"\";\n return ee += `\n\\0`, ee += s(N, 2), ee += E.magic, ee += s(x, 2), ee += s(_, 2), ee += s($.crc32, 4), ee += s($.compressedSize, 4), ee += s($.uncompressedSize, 4), ee += s(P.length, 2), ee += s(z.length, 2), { fileRecord: u.LOCAL_FILE_HEADER + ee + P + z, dirRecord: u.CENTRAL_FILE_HEADER + s(Q, 2) + ee + s(I.length, 2) + \"\\0\\0\\0\\0\" + s(O, 4) + s(g, 4) + P + z + I };\n }\n var a = t(\"../utils\"), l = t(\"../stream/GenericWorker\"), h = t(\"../utf8\"), c = t(\"../crc32\"), u = t(\"../signature\");\n function m(f, d, p, g) {\n l.call(this, \"ZipFileWorker\"), this.bytesWritten = 0, this.zipComment = d, this.zipPlatform = p, this.encodeFileName = g, this.streamFiles = f, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];\n }\n a.inherits(m, l), m.prototype.push = function(f) {\n var d = f.meta.percent || 0, p = this.entriesCount, g = this._sources.length;\n this.accumulate ? this.contentBuffer.push(f) : (this.bytesWritten += f.data.length, l.prototype.push.call(this, { data: f.data, meta: { currentFile: this.currentFile, percent: p ? (d + 100 * (p - g - 1)) / p : 100 } }));\n }, m.prototype.openedSource = function(f) {\n this.currentSourceOffset = this.bytesWritten, this.currentFile = f.file.name;\n var d = this.streamFiles && !f.file.dir;\n if (d) {\n var p = r(f, d, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);\n this.push({ data: p.fileRecord, meta: { percent: 0 } });\n } else this.accumulate = !0;\n }, m.prototype.closedSource = function(f) {\n this.accumulate = !1;\n var d = this.streamFiles && !f.file.dir, p = r(f, d, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);\n if (this.dirRecords.push(p.dirRecord), d) this.push({ data: (function(g) {\n return u.DATA_DESCRIPTOR + s(g.crc32, 4) + s(g.compressedSize, 4) + s(g.uncompressedSize, 4);\n })(f), meta: { percent: 100 } });\n else for (this.push({ data: p.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length; ) this.push(this.contentBuffer.shift());\n this.currentFile = null;\n }, m.prototype.flush = function() {\n for (var f = this.bytesWritten, d = 0; d < this.dirRecords.length; d++) this.push({ data: this.dirRecords[d], meta: { percent: 100 } });\n var p = this.bytesWritten - f, g = (function(y, w, x, _, b) {\n var E = a.transformTo(\"string\", b(_));\n return u.CENTRAL_DIRECTORY_END + \"\\0\\0\\0\\0\" + s(y, 2) + s(y, 2) + s(w, 4) + s(x, 4) + s(E.length, 2) + E;\n })(this.dirRecords.length, p, f, this.zipComment, this.encodeFileName);\n this.push({ data: g, meta: { percent: 100 } });\n }, m.prototype.prepareNextSource = function() {\n this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();\n }, m.prototype.registerPrevious = function(f) {\n this._sources.push(f);\n var d = this;\n return f.on(\"data\", function(p) {\n d.processChunk(p);\n }), f.on(\"end\", function() {\n d.closedSource(d.previous.streamInfo), d._sources.length ? d.prepareNextSource() : d.end();\n }), f.on(\"error\", function(p) {\n d.error(p);\n }), this;\n }, m.prototype.resume = function() {\n return !!l.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));\n }, m.prototype.error = function(f) {\n var d = this._sources;\n if (!l.prototype.error.call(this, f)) return !1;\n for (var p = 0; p < d.length; p++) try {\n d[p].error(f);\n } catch {\n }\n return !0;\n }, m.prototype.lock = function() {\n l.prototype.lock.call(this);\n for (var f = this._sources, d = 0; d < f.length; d++) f[d].lock();\n }, n.exports = m;\n }, { \"../crc32\": 4, \"../signature\": 23, \"../stream/GenericWorker\": 28, \"../utf8\": 31, \"../utils\": 32 }], 9: [function(t, n, i) {\n var s = t(\"../compressions\"), r = t(\"./ZipFileWorker\");\n i.generateWorker = function(a, l, h) {\n var c = new r(l.streamFiles, h, l.platform, l.encodeFileName), u = 0;\n try {\n a.forEach(function(m, f) {\n u++;\n var d = (function(w, x) {\n var _ = w || x, b = s[_];\n if (!b) throw new Error(_ + \" is not a valid compression method !\");\n return b;\n })(f.options.compression, l.compression), p = f.options.compressionOptions || l.compressionOptions || {}, g = f.dir, y = f.date;\n f._compressWorker(d, p).withStreamInfo(\"file\", { name: m, dir: g, date: y, comment: f.comment || \"\", unixPermissions: f.unixPermissions, dosPermissions: f.dosPermissions }).pipe(c);\n }), c.entriesCount = u;\n } catch (m) {\n c.error(m);\n }\n return c;\n };\n }, { \"../compressions\": 3, \"./ZipFileWorker\": 8 }], 10: [function(t, n, i) {\n function s() {\n if (!(this instanceof s)) return new s();\n if (arguments.length) throw new Error(\"The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.\");\n this.files = /* @__PURE__ */ Object.create(null), this.comment = null, this.root = \"\", this.clone = function() {\n var r = new s();\n for (var a in this) typeof this[a] != \"function\" && (r[a] = this[a]);\n return r;\n };\n }\n (s.prototype = t(\"./object\")).loadAsync = t(\"./load\"), s.support = t(\"./support\"), s.defaults = t(\"./defaults\"), s.version = \"3.10.1\", s.loadAsync = function(r, a) {\n return new s().loadAsync(r, a);\n }, s.external = t(\"./external\"), n.exports = s;\n }, { \"./defaults\": 5, \"./external\": 6, \"./load\": 11, \"./object\": 15, \"./support\": 30 }], 11: [function(t, n, i) {\n var s = t(\"./utils\"), r = t(\"./external\"), a = t(\"./utf8\"), l = t(\"./zipEntries\"), h = t(\"./stream/Crc32Probe\"), c = t(\"./nodejsUtils\");\n function u(m) {\n return new r.Promise(function(f, d) {\n var p = m.decompressed.getContentWorker().pipe(new h());\n p.on(\"error\", function(g) {\n d(g);\n }).on(\"end\", function() {\n p.streamInfo.crc32 !== m.decompressed.crc32 ? d(new Error(\"Corrupted zip : CRC32 mismatch\")) : f();\n }).resume();\n });\n }\n n.exports = function(m, f) {\n var d = this;\n return f = s.extend(f || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: a.utf8decode }), c.isNode && c.isStream(m) ? r.Promise.reject(new Error(\"JSZip can't accept a stream when loading a zip file.\")) : s.prepareContent(\"the loaded zip file\", m, !0, f.optimizedBinaryString, f.base64).then(function(p) {\n var g = new l(f);\n return g.load(p), g;\n }).then(function(p) {\n var g = [r.Promise.resolve(p)], y = p.files;\n if (f.checkCRC32) for (var w = 0; w < y.length; w++) g.push(u(y[w]));\n return r.Promise.all(g);\n }).then(function(p) {\n for (var g = p.shift(), y = g.files, w = 0; w < y.length; w++) {\n var x = y[w], _ = x.fileNameStr, b = s.resolve(x.fileNameStr);\n d.file(b, x.decompressed, { binary: !0, optimizedBinaryString: !0, date: x.date, dir: x.dir, comment: x.fileCommentStr.length ? x.fileCommentStr : null, unixPermissions: x.unixPermissions, dosPermissions: x.dosPermissions, createFolders: f.createFolders }), x.dir || (d.file(b).unsafeOriginalName = _);\n }\n return g.zipComment.length && (d.comment = g.zipComment), d;\n });\n };\n }, { \"./external\": 6, \"./nodejsUtils\": 14, \"./stream/Crc32Probe\": 25, \"./utf8\": 31, \"./utils\": 32, \"./zipEntries\": 33 }], 12: [function(t, n, i) {\n var s = t(\"../utils\"), r = t(\"../stream/GenericWorker\");\n function a(l, h) {\n r.call(this, \"Nodejs stream input adapter for \" + l), this._upstreamEnded = !1, this._bindStream(h);\n }\n s.inherits(a, r), a.prototype._bindStream = function(l) {\n var h = this;\n (this._stream = l).pause(), l.on(\"data\", function(c) {\n h.push({ data: c, meta: { percent: 0 } });\n }).on(\"error\", function(c) {\n h.isPaused ? this.generatedError = c : h.error(c);\n }).on(\"end\", function() {\n h.isPaused ? h._upstreamEnded = !0 : h.end();\n });\n }, a.prototype.pause = function() {\n return !!r.prototype.pause.call(this) && (this._stream.pause(), !0);\n }, a.prototype.resume = function() {\n return !!r.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);\n }, n.exports = a;\n }, { \"../stream/GenericWorker\": 28, \"../utils\": 32 }], 13: [function(t, n, i) {\n var s = t(\"readable-stream\").Readable;\n function r(a, l, h) {\n s.call(this, l), this._helper = a;\n var c = this;\n a.on(\"data\", function(u, m) {\n c.push(u) || c._helper.pause(), h && h(m);\n }).on(\"error\", function(u) {\n c.emit(\"error\", u);\n }).on(\"end\", function() {\n c.push(null);\n });\n }\n t(\"../utils\").inherits(r, s), r.prototype._read = function() {\n this._helper.resume();\n }, n.exports = r;\n }, { \"../utils\": 32, \"readable-stream\": 16 }], 14: [function(t, n, i) {\n n.exports = { isNode: typeof Buffer < \"u\", newBufferFrom: function(s, r) {\n if (Buffer.from && Buffer.from !== Uint8Array.from) return Buffer.from(s, r);\n if (typeof s == \"number\") throw new Error('The \"data\" argument must not be a number');\n return new Buffer(s, r);\n }, allocBuffer: function(s) {\n if (Buffer.alloc) return Buffer.alloc(s);\n var r = new Buffer(s);\n return r.fill(0), r;\n }, isBuffer: function(s) {\n return Buffer.isBuffer(s);\n }, isStream: function(s) {\n return s && typeof s.on == \"function\" && typeof s.pause == \"function\" && typeof s.resume == \"function\";\n } };\n }, {}], 15: [function(t, n, i) {\n function s(b, E, A) {\n var P, C = a.getTypeOf(E), D = a.extend(A || {}, c);\n D.date = D.date || /* @__PURE__ */ new Date(), D.compression !== null && (D.compression = D.compression.toUpperCase()), typeof D.unixPermissions == \"string\" && (D.unixPermissions = parseInt(D.unixPermissions, 8)), D.unixPermissions && 16384 & D.unixPermissions && (D.dir = !0), D.dosPermissions && 16 & D.dosPermissions && (D.dir = !0), D.dir && (b = y(b)), D.createFolders && (P = g(b)) && w.call(this, P, !0);\n var I = C === \"string\" && D.binary === !1 && D.base64 === !1;\n A && A.binary !== void 0 || (D.binary = !I), (E instanceof u && E.uncompressedSize === 0 || D.dir || !E || E.length === 0) && (D.base64 = !1, D.binary = !0, E = \"\", D.compression = \"STORE\", C = \"string\");\n var T = null;\n T = E instanceof u || E instanceof l ? E : d.isNode && d.isStream(E) ? new p(b, E) : a.prepareContent(b, E, D.binary, D.optimizedBinaryString, D.base64);\n var R = new m(b, T, D);\n this.files[b] = R;\n }\n var r = t(\"./utf8\"), a = t(\"./utils\"), l = t(\"./stream/GenericWorker\"), h = t(\"./stream/StreamHelper\"), c = t(\"./defaults\"), u = t(\"./compressedObject\"), m = t(\"./zipObject\"), f = t(\"./generate\"), d = t(\"./nodejsUtils\"), p = t(\"./nodejs/NodejsStreamInputAdapter\"), g = function(b) {\n b.slice(-1) === \"/\" && (b = b.substring(0, b.length - 1));\n var E = b.lastIndexOf(\"/\");\n return 0 < E ? b.substring(0, E) : \"\";\n }, y = function(b) {\n return b.slice(-1) !== \"/\" && (b += \"/\"), b;\n }, w = function(b, E) {\n return E = E !== void 0 ? E : c.createFolders, b = y(b), this.files[b] || s.call(this, b, null, { dir: !0, createFolders: E }), this.files[b];\n };\n function x(b) {\n return Object.prototype.toString.call(b) === \"[object RegExp]\";\n }\n var _ = { load: function() {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }, forEach: function(b) {\n var E, A, P;\n for (E in this.files) P = this.files[E], (A = E.slice(this.root.length, E.length)) && E.slice(0, this.root.length) === this.root && b(A, P);\n }, filter: function(b) {\n var E = [];\n return this.forEach(function(A, P) {\n b(A, P) && E.push(P);\n }), E;\n }, file: function(b, E, A) {\n if (arguments.length !== 1) return b = this.root + b, s.call(this, b, E, A), this;\n if (x(b)) {\n var P = b;\n return this.filter(function(D, I) {\n return !I.dir && P.test(D);\n });\n }\n var C = this.files[this.root + b];\n return C && !C.dir ? C : null;\n }, folder: function(b) {\n if (!b) return this;\n if (x(b)) return this.filter(function(C, D) {\n return D.dir && b.test(C);\n });\n var E = this.root + b, A = w.call(this, E), P = this.clone();\n return P.root = A.name, P;\n }, remove: function(b) {\n b = this.root + b;\n var E = this.files[b];\n if (E || (b.slice(-1) !== \"/\" && (b += \"/\"), E = this.files[b]), E && !E.dir) delete this.files[b];\n else for (var A = this.filter(function(C, D) {\n return D.name.slice(0, b.length) === b;\n }), P = 0; P < A.length; P++) delete this.files[A[P].name];\n return this;\n }, generate: function() {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }, generateInternalStream: function(b) {\n var E, A = {};\n try {\n if ((A = a.extend(b || {}, { streamFiles: !1, compression: \"STORE\", compressionOptions: null, type: \"\", platform: \"DOS\", comment: null, mimeType: \"application/zip\", encodeFileName: r.utf8encode })).type = A.type.toLowerCase(), A.compression = A.compression.toUpperCase(), A.type === \"binarystring\" && (A.type = \"string\"), !A.type) throw new Error(\"No output type specified.\");\n a.checkSupport(A.type), A.platform !== \"darwin\" && A.platform !== \"freebsd\" && A.platform !== \"linux\" && A.platform !== \"sunos\" || (A.platform = \"UNIX\"), A.platform === \"win32\" && (A.platform = \"DOS\");\n var P = A.comment || this.comment || \"\";\n E = f.generateWorker(this, A, P);\n } catch (C) {\n (E = new l(\"error\")).error(C);\n }\n return new h(E, A.type || \"string\", A.mimeType);\n }, generateAsync: function(b, E) {\n return this.generateInternalStream(b).accumulate(E);\n }, generateNodeStream: function(b, E) {\n return (b = b || {}).type || (b.type = \"nodebuffer\"), this.generateInternalStream(b).toNodejsStream(E);\n } };\n n.exports = _;\n }, { \"./compressedObject\": 2, \"./defaults\": 5, \"./generate\": 9, \"./nodejs/NodejsStreamInputAdapter\": 12, \"./nodejsUtils\": 14, \"./stream/GenericWorker\": 28, \"./stream/StreamHelper\": 29, \"./utf8\": 31, \"./utils\": 32, \"./zipObject\": 35 }], 16: [function(t, n, i) {\n n.exports = t(\"stream\");\n }, { stream: void 0 }], 17: [function(t, n, i) {\n var s = t(\"./DataReader\");\n function r(a) {\n s.call(this, a);\n for (var l = 0; l < this.data.length; l++) a[l] = 255 & a[l];\n }\n t(\"../utils\").inherits(r, s), r.prototype.byteAt = function(a) {\n return this.data[this.zero + a];\n }, r.prototype.lastIndexOfSignature = function(a) {\n for (var l = a.charCodeAt(0), h = a.charCodeAt(1), c = a.charCodeAt(2), u = a.charCodeAt(3), m = this.length - 4; 0 <= m; --m) if (this.data[m] === l && this.data[m + 1] === h && this.data[m + 2] === c && this.data[m + 3] === u) return m - this.zero;\n return -1;\n }, r.prototype.readAndCheckSignature = function(a) {\n var l = a.charCodeAt(0), h = a.charCodeAt(1), c = a.charCodeAt(2), u = a.charCodeAt(3), m = this.readData(4);\n return l === m[0] && h === m[1] && c === m[2] && u === m[3];\n }, r.prototype.readData = function(a) {\n if (this.checkOffset(a), a === 0) return [];\n var l = this.data.slice(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./DataReader\": 18 }], 18: [function(t, n, i) {\n var s = t(\"../utils\");\n function r(a) {\n this.data = a, this.length = a.length, this.index = 0, this.zero = 0;\n }\n r.prototype = { checkOffset: function(a) {\n this.checkIndex(this.index + a);\n }, checkIndex: function(a) {\n if (this.length < this.zero + a || a < 0) throw new Error(\"End of data reached (data length = \" + this.length + \", asked index = \" + a + \"). Corrupted zip ?\");\n }, setIndex: function(a) {\n this.checkIndex(a), this.index = a;\n }, skip: function(a) {\n this.setIndex(this.index + a);\n }, byteAt: function() {\n }, readInt: function(a) {\n var l, h = 0;\n for (this.checkOffset(a), l = this.index + a - 1; l >= this.index; l--) h = (h << 8) + this.byteAt(l);\n return this.index += a, h;\n }, readString: function(a) {\n return s.transformTo(\"string\", this.readData(a));\n }, readData: function() {\n }, lastIndexOfSignature: function() {\n }, readAndCheckSignature: function() {\n }, readDate: function() {\n var a = this.readInt(4);\n return new Date(Date.UTC(1980 + (a >> 25 & 127), (a >> 21 & 15) - 1, a >> 16 & 31, a >> 11 & 31, a >> 5 & 63, (31 & a) << 1));\n } }, n.exports = r;\n }, { \"../utils\": 32 }], 19: [function(t, n, i) {\n var s = t(\"./Uint8ArrayReader\");\n function r(a) {\n s.call(this, a);\n }\n t(\"../utils\").inherits(r, s), r.prototype.readData = function(a) {\n this.checkOffset(a);\n var l = this.data.slice(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./Uint8ArrayReader\": 21 }], 20: [function(t, n, i) {\n var s = t(\"./DataReader\");\n function r(a) {\n s.call(this, a);\n }\n t(\"../utils\").inherits(r, s), r.prototype.byteAt = function(a) {\n return this.data.charCodeAt(this.zero + a);\n }, r.prototype.lastIndexOfSignature = function(a) {\n return this.data.lastIndexOf(a) - this.zero;\n }, r.prototype.readAndCheckSignature = function(a) {\n return a === this.readData(4);\n }, r.prototype.readData = function(a) {\n this.checkOffset(a);\n var l = this.data.slice(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./DataReader\": 18 }], 21: [function(t, n, i) {\n var s = t(\"./ArrayReader\");\n function r(a) {\n s.call(this, a);\n }\n t(\"../utils\").inherits(r, s), r.prototype.readData = function(a) {\n if (this.checkOffset(a), a === 0) return new Uint8Array(0);\n var l = this.data.subarray(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./ArrayReader\": 17 }], 22: [function(t, n, i) {\n var s = t(\"../utils\"), r = t(\"../support\"), a = t(\"./ArrayReader\"), l = t(\"./StringReader\"), h = t(\"./NodeBufferReader\"), c = t(\"./Uint8ArrayReader\");\n n.exports = function(u) {\n var m = s.getTypeOf(u);\n return s.checkSupport(m), m !== \"string\" || r.uint8array ? m === \"nodebuffer\" ? new h(u) : r.uint8array ? new c(s.transformTo(\"uint8array\", u)) : new a(s.transformTo(\"array\", u)) : new l(u);\n };\n }, { \"../support\": 30, \"../utils\": 32, \"./ArrayReader\": 17, \"./NodeBufferReader\": 19, \"./StringReader\": 20, \"./Uint8ArrayReader\": 21 }], 23: [function(t, n, i) {\n i.LOCAL_FILE_HEADER = \"PK\u0003\u0004\", i.CENTRAL_FILE_HEADER = \"PK\u0001\u0002\", i.CENTRAL_DIRECTORY_END = \"PK\u0005\u0006\", i.ZIP64_CENTRAL_DIRECTORY_LOCATOR = \"PK\u0006\\x07\", i.ZIP64_CENTRAL_DIRECTORY_END = \"PK\u0006\u0006\", i.DATA_DESCRIPTOR = \"PK\\x07\\b\";\n }, {}], 24: [function(t, n, i) {\n var s = t(\"./GenericWorker\"), r = t(\"../utils\");\n function a(l) {\n s.call(this, \"ConvertWorker to \" + l), this.destType = l;\n }\n r.inherits(a, s), a.prototype.processChunk = function(l) {\n this.push({ data: r.transformTo(this.destType, l.data), meta: l.meta });\n }, n.exports = a;\n }, { \"../utils\": 32, \"./GenericWorker\": 28 }], 25: [function(t, n, i) {\n var s = t(\"./GenericWorker\"), r = t(\"../crc32\");\n function a() {\n s.call(this, \"Crc32Probe\"), this.withStreamInfo(\"crc32\", 0);\n }\n t(\"../utils\").inherits(a, s), a.prototype.processChunk = function(l) {\n this.streamInfo.crc32 = r(l.data, this.streamInfo.crc32 || 0), this.push(l);\n }, n.exports = a;\n }, { \"../crc32\": 4, \"../utils\": 32, \"./GenericWorker\": 28 }], 26: [function(t, n, i) {\n var s = t(\"../utils\"), r = t(\"./GenericWorker\");\n function a(l) {\n r.call(this, \"DataLengthProbe for \" + l), this.propName = l, this.withStreamInfo(l, 0);\n }\n s.inherits(a, r), a.prototype.processChunk = function(l) {\n if (l) {\n var h = this.streamInfo[this.propName] || 0;\n this.streamInfo[this.propName] = h + l.data.length;\n }\n r.prototype.processChunk.call(this, l);\n }, n.exports = a;\n }, { \"../utils\": 32, \"./GenericWorker\": 28 }], 27: [function(t, n, i) {\n var s = t(\"../utils\"), r = t(\"./GenericWorker\");\n function a(l) {\n r.call(this, \"DataWorker\");\n var h = this;\n this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = \"\", this._tickScheduled = !1, l.then(function(c) {\n h.dataIsReady = !0, h.data = c, h.max = c && c.length || 0, h.type = s.getTypeOf(c), h.isPaused || h._tickAndRepeat();\n }, function(c) {\n h.error(c);\n });\n }\n s.inherits(a, r), a.prototype.cleanUp = function() {\n r.prototype.cleanUp.call(this), this.data = null;\n }, a.prototype.resume = function() {\n return !!r.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, s.delay(this._tickAndRepeat, [], this)), !0);\n }, a.prototype._tickAndRepeat = function() {\n this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (s.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));\n }, a.prototype._tick = function() {\n if (this.isPaused || this.isFinished) return !1;\n var l = null, h = Math.min(this.max, this.index + 16384);\n if (this.index >= this.max) return this.end();\n switch (this.type) {\n case \"string\":\n l = this.data.substring(this.index, h);\n break;\n case \"uint8array\":\n l = this.data.subarray(this.index, h);\n break;\n case \"array\":\n case \"nodebuffer\":\n l = this.data.slice(this.index, h);\n }\n return this.index = h, this.push({ data: l, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });\n }, n.exports = a;\n }, { \"../utils\": 32, \"./GenericWorker\": 28 }], 28: [function(t, n, i) {\n function s(r) {\n this.name = r || \"default\", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;\n }\n s.prototype = { push: function(r) {\n this.emit(\"data\", r);\n }, end: function() {\n if (this.isFinished) return !1;\n this.flush();\n try {\n this.emit(\"end\"), this.cleanUp(), this.isFinished = !0;\n } catch (r) {\n this.emit(\"error\", r);\n }\n return !0;\n }, error: function(r) {\n return !this.isFinished && (this.isPaused ? this.generatedError = r : (this.isFinished = !0, this.emit(\"error\", r), this.previous && this.previous.error(r), this.cleanUp()), !0);\n }, on: function(r, a) {\n return this._listeners[r].push(a), this;\n }, cleanUp: function() {\n this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];\n }, emit: function(r, a) {\n if (this._listeners[r]) for (var l = 0; l < this._listeners[r].length; l++) this._listeners[r][l].call(this, a);\n }, pipe: function(r) {\n return r.registerPrevious(this);\n }, registerPrevious: function(r) {\n if (this.isLocked) throw new Error(\"The stream '\" + this + \"' has already been used.\");\n this.streamInfo = r.streamInfo, this.mergeStreamInfo(), this.previous = r;\n var a = this;\n return r.on(\"data\", function(l) {\n a.processChunk(l);\n }), r.on(\"end\", function() {\n a.end();\n }), r.on(\"error\", function(l) {\n a.error(l);\n }), this;\n }, pause: function() {\n return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);\n }, resume: function() {\n if (!this.isPaused || this.isFinished) return !1;\n var r = this.isPaused = !1;\n return this.generatedError && (this.error(this.generatedError), r = !0), this.previous && this.previous.resume(), !r;\n }, flush: function() {\n }, processChunk: function(r) {\n this.push(r);\n }, withStreamInfo: function(r, a) {\n return this.extraStreamInfo[r] = a, this.mergeStreamInfo(), this;\n }, mergeStreamInfo: function() {\n for (var r in this.extraStreamInfo) Object.prototype.hasOwnProperty.call(this.extraStreamInfo, r) && (this.streamInfo[r] = this.extraStreamInfo[r]);\n }, lock: function() {\n if (this.isLocked) throw new Error(\"The stream '\" + this + \"' has already been used.\");\n this.isLocked = !0, this.previous && this.previous.lock();\n }, toString: function() {\n var r = \"Worker \" + this.name;\n return this.previous ? this.previous + \" -> \" + r : r;\n } }, n.exports = s;\n }, {}], 29: [function(t, n, i) {\n var s = t(\"../utils\"), r = t(\"./ConvertWorker\"), a = t(\"./GenericWorker\"), l = t(\"../base64\"), h = t(\"../support\"), c = t(\"../external\"), u = null;\n if (h.nodestream) try {\n u = t(\"../nodejs/NodejsStreamOutputAdapter\");\n } catch {\n }\n function m(d, p) {\n return new c.Promise(function(g, y) {\n var w = [], x = d._internalType, _ = d._outputType, b = d._mimeType;\n d.on(\"data\", function(E, A) {\n w.push(E), p && p(A);\n }).on(\"error\", function(E) {\n w = [], y(E);\n }).on(\"end\", function() {\n try {\n var E = (function(A, P, C) {\n switch (A) {\n case \"blob\":\n return s.newBlob(s.transformTo(\"arraybuffer\", P), C);\n case \"base64\":\n return l.encode(P);\n default:\n return s.transformTo(A, P);\n }\n })(_, (function(A, P) {\n var C, D = 0, I = null, T = 0;\n for (C = 0; C < P.length; C++) T += P[C].length;\n switch (A) {\n case \"string\":\n return P.join(\"\");\n case \"array\":\n return Array.prototype.concat.apply([], P);\n case \"uint8array\":\n for (I = new Uint8Array(T), C = 0; C < P.length; C++) I.set(P[C], D), D += P[C].length;\n return I;\n case \"nodebuffer\":\n return Buffer.concat(P);\n default:\n throw new Error(\"concat : unsupported type '\" + A + \"'\");\n }\n })(x, w), b);\n g(E);\n } catch (A) {\n y(A);\n }\n w = [];\n }).resume();\n });\n }\n function f(d, p, g) {\n var y = p;\n switch (p) {\n case \"blob\":\n case \"arraybuffer\":\n y = \"uint8array\";\n break;\n case \"base64\":\n y = \"string\";\n }\n try {\n this._internalType = y, this._outputType = p, this._mimeType = g, s.checkSupport(y), this._worker = d.pipe(new r(y)), d.lock();\n } catch (w) {\n this._worker = new a(\"error\"), this._worker.error(w);\n }\n }\n f.prototype = { accumulate: function(d) {\n return m(this, d);\n }, on: function(d, p) {\n var g = this;\n return d === \"data\" ? this._worker.on(d, function(y) {\n p.call(g, y.data, y.meta);\n }) : this._worker.on(d, function() {\n s.delay(p, arguments, g);\n }), this;\n }, resume: function() {\n return s.delay(this._worker.resume, [], this._worker), this;\n }, pause: function() {\n return this._worker.pause(), this;\n }, toNodejsStream: function(d) {\n if (s.checkSupport(\"nodestream\"), this._outputType !== \"nodebuffer\") throw new Error(this._outputType + \" is not supported by this method\");\n return new u(this, { objectMode: this._outputType !== \"nodebuffer\" }, d);\n } }, n.exports = f;\n }, { \"../base64\": 1, \"../external\": 6, \"../nodejs/NodejsStreamOutputAdapter\": 13, \"../support\": 30, \"../utils\": 32, \"./ConvertWorker\": 24, \"./GenericWorker\": 28 }], 30: [function(t, n, i) {\n if (i.base64 = !0, i.array = !0, i.string = !0, i.arraybuffer = typeof ArrayBuffer < \"u\" && typeof Uint8Array < \"u\", i.nodebuffer = typeof Buffer < \"u\", i.uint8array = typeof Uint8Array < \"u\", typeof ArrayBuffer > \"u\") i.blob = !1;\n else {\n var s = new ArrayBuffer(0);\n try {\n i.blob = new Blob([s], { type: \"application/zip\" }).size === 0;\n } catch {\n try {\n var r = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();\n r.append(s), i.blob = r.getBlob(\"application/zip\").size === 0;\n } catch {\n i.blob = !1;\n }\n }\n }\n try {\n i.nodestream = !!t(\"readable-stream\").Readable;\n } catch {\n i.nodestream = !1;\n }\n }, { \"readable-stream\": 16 }], 31: [function(t, n, i) {\n for (var s = t(\"./utils\"), r = t(\"./support\"), a = t(\"./nodejsUtils\"), l = t(\"./stream/GenericWorker\"), h = new Array(256), c = 0; c < 256; c++) h[c] = 252 <= c ? 6 : 248 <= c ? 5 : 240 <= c ? 4 : 224 <= c ? 3 : 192 <= c ? 2 : 1;\n h[254] = h[254] = 1;\n function u() {\n l.call(this, \"utf-8 decode\"), this.leftOver = null;\n }\n function m() {\n l.call(this, \"utf-8 encode\");\n }\n i.utf8encode = function(f) {\n return r.nodebuffer ? a.newBufferFrom(f, \"utf-8\") : (function(d) {\n var p, g, y, w, x, _ = d.length, b = 0;\n for (w = 0; w < _; w++) (64512 & (g = d.charCodeAt(w))) == 55296 && w + 1 < _ && (64512 & (y = d.charCodeAt(w + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (y - 56320), w++), b += g < 128 ? 1 : g < 2048 ? 2 : g < 65536 ? 3 : 4;\n for (p = r.uint8array ? new Uint8Array(b) : new Array(b), w = x = 0; x < b; w++) (64512 & (g = d.charCodeAt(w))) == 55296 && w + 1 < _ && (64512 & (y = d.charCodeAt(w + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (y - 56320), w++), g < 128 ? p[x++] = g : (g < 2048 ? p[x++] = 192 | g >>> 6 : (g < 65536 ? p[x++] = 224 | g >>> 12 : (p[x++] = 240 | g >>> 18, p[x++] = 128 | g >>> 12 & 63), p[x++] = 128 | g >>> 6 & 63), p[x++] = 128 | 63 & g);\n return p;\n })(f);\n }, i.utf8decode = function(f) {\n return r.nodebuffer ? s.transformTo(\"nodebuffer\", f).toString(\"utf-8\") : (function(d) {\n var p, g, y, w, x = d.length, _ = new Array(2 * x);\n for (p = g = 0; p < x; ) if ((y = d[p++]) < 128) _[g++] = y;\n else if (4 < (w = h[y])) _[g++] = 65533, p += w - 1;\n else {\n for (y &= w === 2 ? 31 : w === 3 ? 15 : 7; 1 < w && p < x; ) y = y << 6 | 63 & d[p++], w--;\n 1 < w ? _[g++] = 65533 : y < 65536 ? _[g++] = y : (y -= 65536, _[g++] = 55296 | y >> 10 & 1023, _[g++] = 56320 | 1023 & y);\n }\n return _.length !== g && (_.subarray ? _ = _.subarray(0, g) : _.length = g), s.applyFromCharCode(_);\n })(f = s.transformTo(r.uint8array ? \"uint8array\" : \"array\", f));\n }, s.inherits(u, l), u.prototype.processChunk = function(f) {\n var d = s.transformTo(r.uint8array ? \"uint8array\" : \"array\", f.data);\n if (this.leftOver && this.leftOver.length) {\n if (r.uint8array) {\n var p = d;\n (d = new Uint8Array(p.length + this.leftOver.length)).set(this.leftOver, 0), d.set(p, this.leftOver.length);\n } else d = this.leftOver.concat(d);\n this.leftOver = null;\n }\n var g = (function(w, x) {\n var _;\n for ((x = x || w.length) > w.length && (x = w.length), _ = x - 1; 0 <= _ && (192 & w[_]) == 128; ) _--;\n return _ < 0 || _ === 0 ? x : _ + h[w[_]] > x ? _ : x;\n })(d), y = d;\n g !== d.length && (r.uint8array ? (y = d.subarray(0, g), this.leftOver = d.subarray(g, d.length)) : (y = d.slice(0, g), this.leftOver = d.slice(g, d.length))), this.push({ data: i.utf8decode(y), meta: f.meta });\n }, u.prototype.flush = function() {\n this.leftOver && this.leftOver.length && (this.push({ data: i.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);\n }, i.Utf8DecodeWorker = u, s.inherits(m, l), m.prototype.processChunk = function(f) {\n this.push({ data: i.utf8encode(f.data), meta: f.meta });\n }, i.Utf8EncodeWorker = m;\n }, { \"./nodejsUtils\": 14, \"./stream/GenericWorker\": 28, \"./support\": 30, \"./utils\": 32 }], 32: [function(t, n, i) {\n var s = t(\"./support\"), r = t(\"./base64\"), a = t(\"./nodejsUtils\"), l = t(\"./external\");\n function h(p) {\n return p;\n }\n function c(p, g) {\n for (var y = 0; y < p.length; ++y) g[y] = 255 & p.charCodeAt(y);\n return g;\n }\n t(\"setimmediate\"), i.newBlob = function(p, g) {\n i.checkSupport(\"blob\");\n try {\n return new Blob([p], { type: g });\n } catch {\n try {\n var y = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();\n return y.append(p), y.getBlob(g);\n } catch {\n throw new Error(\"Bug : can't construct the Blob.\");\n }\n }\n };\n var u = { stringifyByChunk: function(p, g, y) {\n var w = [], x = 0, _ = p.length;\n if (_ <= y) return String.fromCharCode.apply(null, p);\n for (; x < _; ) g === \"array\" || g === \"nodebuffer\" ? w.push(String.fromCharCode.apply(null, p.slice(x, Math.min(x + y, _)))) : w.push(String.fromCharCode.apply(null, p.subarray(x, Math.min(x + y, _)))), x += y;\n return w.join(\"\");\n }, stringifyByChar: function(p) {\n for (var g = \"\", y = 0; y < p.length; y++) g += String.fromCharCode(p[y]);\n return g;\n }, applyCanBeUsed: { uint8array: (function() {\n try {\n return s.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;\n } catch {\n return !1;\n }\n })(), nodebuffer: (function() {\n try {\n return s.nodebuffer && String.fromCharCode.apply(null, a.allocBuffer(1)).length === 1;\n } catch {\n return !1;\n }\n })() } };\n function m(p) {\n var g = 65536, y = i.getTypeOf(p), w = !0;\n if (y === \"uint8array\" ? w = u.applyCanBeUsed.uint8array : y === \"nodebuffer\" && (w = u.applyCanBeUsed.nodebuffer), w) for (; 1 < g; ) try {\n return u.stringifyByChunk(p, y, g);\n } catch {\n g = Math.floor(g / 2);\n }\n return u.stringifyByChar(p);\n }\n function f(p, g) {\n for (var y = 0; y < p.length; y++) g[y] = p[y];\n return g;\n }\n i.applyFromCharCode = m;\n var d = {};\n d.string = { string: h, array: function(p) {\n return c(p, new Array(p.length));\n }, arraybuffer: function(p) {\n return d.string.uint8array(p).buffer;\n }, uint8array: function(p) {\n return c(p, new Uint8Array(p.length));\n }, nodebuffer: function(p) {\n return c(p, a.allocBuffer(p.length));\n } }, d.array = { string: m, array: h, arraybuffer: function(p) {\n return new Uint8Array(p).buffer;\n }, uint8array: function(p) {\n return new Uint8Array(p);\n }, nodebuffer: function(p) {\n return a.newBufferFrom(p);\n } }, d.arraybuffer = { string: function(p) {\n return m(new Uint8Array(p));\n }, array: function(p) {\n return f(new Uint8Array(p), new Array(p.byteLength));\n }, arraybuffer: h, uint8array: function(p) {\n return new Uint8Array(p);\n }, nodebuffer: function(p) {\n return a.newBufferFrom(new Uint8Array(p));\n } }, d.uint8array = { string: m, array: function(p) {\n return f(p, new Array(p.length));\n }, arraybuffer: function(p) {\n return p.buffer;\n }, uint8array: h, nodebuffer: function(p) {\n return a.newBufferFrom(p);\n } }, d.nodebuffer = { string: m, array: function(p) {\n return f(p, new Array(p.length));\n }, arraybuffer: function(p) {\n return d.nodebuffer.uint8array(p).buffer;\n }, uint8array: function(p) {\n return f(p, new Uint8Array(p.length));\n }, nodebuffer: h }, i.transformTo = function(p, g) {\n if (g = g || \"\", !p) return g;\n i.checkSupport(p);\n var y = i.getTypeOf(g);\n return d[y][p](g);\n }, i.resolve = function(p) {\n for (var g = p.split(\"/\"), y = [], w = 0; w < g.length; w++) {\n var x = g[w];\n x === \".\" || x === \"\" && w !== 0 && w !== g.length - 1 || (x === \"..\" ? y.pop() : y.push(x));\n }\n return y.join(\"/\");\n }, i.getTypeOf = function(p) {\n return typeof p == \"string\" ? \"string\" : Object.prototype.toString.call(p) === \"[object Array]\" ? \"array\" : s.nodebuffer && a.isBuffer(p) ? \"nodebuffer\" : s.uint8array && p instanceof Uint8Array ? \"uint8array\" : s.arraybuffer && p instanceof ArrayBuffer ? \"arraybuffer\" : void 0;\n }, i.checkSupport = function(p) {\n if (!s[p.toLowerCase()]) throw new Error(p + \" is not supported by this platform\");\n }, i.MAX_VALUE_16BITS = 65535, i.MAX_VALUE_32BITS = -1, i.pretty = function(p) {\n var g, y, w = \"\";\n for (y = 0; y < (p || \"\").length; y++) w += \"\\\\x\" + ((g = p.charCodeAt(y)) < 16 ? \"0\" : \"\") + g.toString(16).toUpperCase();\n return w;\n }, i.delay = function(p, g, y) {\n setImmediate(function() {\n p.apply(y || null, g || []);\n });\n }, i.inherits = function(p, g) {\n function y() {\n }\n y.prototype = g.prototype, p.prototype = new y();\n }, i.extend = function() {\n var p, g, y = {};\n for (p = 0; p < arguments.length; p++) for (g in arguments[p]) Object.prototype.hasOwnProperty.call(arguments[p], g) && y[g] === void 0 && (y[g] = arguments[p][g]);\n return y;\n }, i.prepareContent = function(p, g, y, w, x) {\n return l.Promise.resolve(g).then(function(_) {\n return s.blob && (_ instanceof Blob || [\"[object File]\", \"[object Blob]\"].indexOf(Object.prototype.toString.call(_)) !== -1) && typeof FileReader < \"u\" ? new l.Promise(function(b, E) {\n var A = new FileReader();\n A.onload = function(P) {\n b(P.target.result);\n }, A.onerror = function(P) {\n E(P.target.error);\n }, A.readAsArrayBuffer(_);\n }) : _;\n }).then(function(_) {\n var b = i.getTypeOf(_);\n return b ? (b === \"arraybuffer\" ? _ = i.transformTo(\"uint8array\", _) : b === \"string\" && (x ? _ = r.decode(_) : y && w !== !0 && (_ = (function(E) {\n return c(E, s.uint8array ? new Uint8Array(E.length) : new Array(E.length));\n })(_))), _) : l.Promise.reject(new Error(\"Can't read the data of '\" + p + \"'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\"));\n });\n };\n }, { \"./base64\": 1, \"./external\": 6, \"./nodejsUtils\": 14, \"./support\": 30, setimmediate: 54 }], 33: [function(t, n, i) {\n var s = t(\"./reader/readerFor\"), r = t(\"./utils\"), a = t(\"./signature\"), l = t(\"./zipEntry\"), h = t(\"./support\");\n function c(u) {\n this.files = [], this.loadOptions = u;\n }\n c.prototype = { checkSignature: function(u) {\n if (!this.reader.readAndCheckSignature(u)) {\n this.reader.index -= 4;\n var m = this.reader.readString(4);\n throw new Error(\"Corrupted zip or bug: unexpected signature (\" + r.pretty(m) + \", expected \" + r.pretty(u) + \")\");\n }\n }, isSignature: function(u, m) {\n var f = this.reader.index;\n this.reader.setIndex(u);\n var d = this.reader.readString(4) === m;\n return this.reader.setIndex(f), d;\n }, readBlockEndOfCentral: function() {\n this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);\n var u = this.reader.readData(this.zipCommentLength), m = h.uint8array ? \"uint8array\" : \"array\", f = r.transformTo(m, u);\n this.zipComment = this.loadOptions.decodeFileName(f);\n }, readBlockZip64EndOfCentral: function() {\n this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};\n for (var u, m, f, d = this.zip64EndOfCentralSize - 44; 0 < d; ) u = this.reader.readInt(2), m = this.reader.readInt(4), f = this.reader.readData(m), this.zip64ExtensibleData[u] = { id: u, length: m, value: f };\n }, readBlockZip64EndOfCentralLocator: function() {\n if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), 1 < this.disksCount) throw new Error(\"Multi-volumes zip are not supported\");\n }, readLocalFiles: function() {\n var u, m;\n for (u = 0; u < this.files.length; u++) m = this.files[u], this.reader.setIndex(m.localHeaderOffset), this.checkSignature(a.LOCAL_FILE_HEADER), m.readLocalPart(this.reader), m.handleUTF8(), m.processAttributes();\n }, readCentralDir: function() {\n var u;\n for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(a.CENTRAL_FILE_HEADER); ) (u = new l({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(u);\n if (this.centralDirRecords !== this.files.length && this.centralDirRecords !== 0 && this.files.length === 0) throw new Error(\"Corrupted zip or bug: expected \" + this.centralDirRecords + \" records in central dir, got \" + this.files.length);\n }, readEndOfCentral: function() {\n var u = this.reader.lastIndexOfSignature(a.CENTRAL_DIRECTORY_END);\n if (u < 0) throw this.isSignature(0, a.LOCAL_FILE_HEADER) ? new Error(\"Corrupted zip: can't find end of central directory\") : new Error(\"Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html\");\n this.reader.setIndex(u);\n var m = u;\n if (this.checkSignature(a.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === r.MAX_VALUE_16BITS || this.diskWithCentralDirStart === r.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === r.MAX_VALUE_16BITS || this.centralDirRecords === r.MAX_VALUE_16BITS || this.centralDirSize === r.MAX_VALUE_32BITS || this.centralDirOffset === r.MAX_VALUE_32BITS) {\n if (this.zip64 = !0, (u = this.reader.lastIndexOfSignature(a.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory locator\");\n if (this.reader.setIndex(u), this.checkSignature(a.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, a.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(a.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory\");\n this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(a.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();\n }\n var f = this.centralDirOffset + this.centralDirSize;\n this.zip64 && (f += 20, f += 12 + this.zip64EndOfCentralSize);\n var d = m - f;\n if (0 < d) this.isSignature(m, a.CENTRAL_FILE_HEADER) || (this.reader.zero = d);\n else if (d < 0) throw new Error(\"Corrupted zip: missing \" + Math.abs(d) + \" bytes.\");\n }, prepareReader: function(u) {\n this.reader = s(u);\n }, load: function(u) {\n this.prepareReader(u), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();\n } }, n.exports = c;\n }, { \"./reader/readerFor\": 22, \"./signature\": 23, \"./support\": 30, \"./utils\": 32, \"./zipEntry\": 34 }], 34: [function(t, n, i) {\n var s = t(\"./reader/readerFor\"), r = t(\"./utils\"), a = t(\"./compressedObject\"), l = t(\"./crc32\"), h = t(\"./utf8\"), c = t(\"./compressions\"), u = t(\"./support\");\n function m(f, d) {\n this.options = f, this.loadOptions = d;\n }\n m.prototype = { isEncrypted: function() {\n return (1 & this.bitFlag) == 1;\n }, useUTF8: function() {\n return (2048 & this.bitFlag) == 2048;\n }, readLocalPart: function(f) {\n var d, p;\n if (f.skip(22), this.fileNameLength = f.readInt(2), p = f.readInt(2), this.fileName = f.readData(this.fileNameLength), f.skip(p), this.compressedSize === -1 || this.uncompressedSize === -1) throw new Error(\"Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)\");\n if ((d = (function(g) {\n for (var y in c) if (Object.prototype.hasOwnProperty.call(c, y) && c[y].magic === g) return c[y];\n return null;\n })(this.compressionMethod)) === null) throw new Error(\"Corrupted zip : compression \" + r.pretty(this.compressionMethod) + \" unknown (inner file : \" + r.transformTo(\"string\", this.fileName) + \")\");\n this.decompressed = new a(this.compressedSize, this.uncompressedSize, this.crc32, d, f.readData(this.compressedSize));\n }, readCentralPart: function(f) {\n this.versionMadeBy = f.readInt(2), f.skip(2), this.bitFlag = f.readInt(2), this.compressionMethod = f.readString(2), this.date = f.readDate(), this.crc32 = f.readInt(4), this.compressedSize = f.readInt(4), this.uncompressedSize = f.readInt(4);\n var d = f.readInt(2);\n if (this.extraFieldsLength = f.readInt(2), this.fileCommentLength = f.readInt(2), this.diskNumberStart = f.readInt(2), this.internalFileAttributes = f.readInt(2), this.externalFileAttributes = f.readInt(4), this.localHeaderOffset = f.readInt(4), this.isEncrypted()) throw new Error(\"Encrypted zip are not supported\");\n f.skip(d), this.readExtraFields(f), this.parseZIP64ExtraField(f), this.fileComment = f.readData(this.fileCommentLength);\n }, processAttributes: function() {\n this.unixPermissions = null, this.dosPermissions = null;\n var f = this.versionMadeBy >> 8;\n this.dir = !!(16 & this.externalFileAttributes), f == 0 && (this.dosPermissions = 63 & this.externalFileAttributes), f == 3 && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || this.fileNameStr.slice(-1) !== \"/\" || (this.dir = !0);\n }, parseZIP64ExtraField: function() {\n if (this.extraFields[1]) {\n var f = s(this.extraFields[1].value);\n this.uncompressedSize === r.MAX_VALUE_32BITS && (this.uncompressedSize = f.readInt(8)), this.compressedSize === r.MAX_VALUE_32BITS && (this.compressedSize = f.readInt(8)), this.localHeaderOffset === r.MAX_VALUE_32BITS && (this.localHeaderOffset = f.readInt(8)), this.diskNumberStart === r.MAX_VALUE_32BITS && (this.diskNumberStart = f.readInt(4));\n }\n }, readExtraFields: function(f) {\n var d, p, g, y = f.index + this.extraFieldsLength;\n for (this.extraFields || (this.extraFields = {}); f.index + 4 < y; ) d = f.readInt(2), p = f.readInt(2), g = f.readData(p), this.extraFields[d] = { id: d, length: p, value: g };\n f.setIndex(y);\n }, handleUTF8: function() {\n var f = u.uint8array ? \"uint8array\" : \"array\";\n if (this.useUTF8()) this.fileNameStr = h.utf8decode(this.fileName), this.fileCommentStr = h.utf8decode(this.fileComment);\n else {\n var d = this.findExtraFieldUnicodePath();\n if (d !== null) this.fileNameStr = d;\n else {\n var p = r.transformTo(f, this.fileName);\n this.fileNameStr = this.loadOptions.decodeFileName(p);\n }\n var g = this.findExtraFieldUnicodeComment();\n if (g !== null) this.fileCommentStr = g;\n else {\n var y = r.transformTo(f, this.fileComment);\n this.fileCommentStr = this.loadOptions.decodeFileName(y);\n }\n }\n }, findExtraFieldUnicodePath: function() {\n var f = this.extraFields[28789];\n if (f) {\n var d = s(f.value);\n return d.readInt(1) !== 1 || l(this.fileName) !== d.readInt(4) ? null : h.utf8decode(d.readData(f.length - 5));\n }\n return null;\n }, findExtraFieldUnicodeComment: function() {\n var f = this.extraFields[25461];\n if (f) {\n var d = s(f.value);\n return d.readInt(1) !== 1 || l(this.fileComment) !== d.readInt(4) ? null : h.utf8decode(d.readData(f.length - 5));\n }\n return null;\n } }, n.exports = m;\n }, { \"./compressedObject\": 2, \"./compressions\": 3, \"./crc32\": 4, \"./reader/readerFor\": 22, \"./support\": 30, \"./utf8\": 31, \"./utils\": 32 }], 35: [function(t, n, i) {\n function s(d, p, g) {\n this.name = d, this.dir = g.dir, this.date = g.date, this.comment = g.comment, this.unixPermissions = g.unixPermissions, this.dosPermissions = g.dosPermissions, this._data = p, this._dataBinary = g.binary, this.options = { compression: g.compression, compressionOptions: g.compressionOptions };\n }\n var r = t(\"./stream/StreamHelper\"), a = t(\"./stream/DataWorker\"), l = t(\"./utf8\"), h = t(\"./compressedObject\"), c = t(\"./stream/GenericWorker\");\n s.prototype = { internalStream: function(d) {\n var p = null, g = \"string\";\n try {\n if (!d) throw new Error(\"No output type specified.\");\n var y = (g = d.toLowerCase()) === \"string\" || g === \"text\";\n g !== \"binarystring\" && g !== \"text\" || (g = \"string\"), p = this._decompressWorker();\n var w = !this._dataBinary;\n w && !y && (p = p.pipe(new l.Utf8EncodeWorker())), !w && y && (p = p.pipe(new l.Utf8DecodeWorker()));\n } catch (x) {\n (p = new c(\"error\")).error(x);\n }\n return new r(p, g, \"\");\n }, async: function(d, p) {\n return this.internalStream(d).accumulate(p);\n }, nodeStream: function(d, p) {\n return this.internalStream(d || \"nodebuffer\").toNodejsStream(p);\n }, _compressWorker: function(d, p) {\n if (this._data instanceof h && this._data.compression.magic === d.magic) return this._data.getCompressedWorker();\n var g = this._decompressWorker();\n return this._dataBinary || (g = g.pipe(new l.Utf8EncodeWorker())), h.createWorkerFrom(g, d, p);\n }, _decompressWorker: function() {\n return this._data instanceof h ? this._data.getContentWorker() : this._data instanceof c ? this._data : new a(this._data);\n } };\n for (var u = [\"asText\", \"asBinary\", \"asNodeBuffer\", \"asUint8Array\", \"asArrayBuffer\"], m = function() {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }, f = 0; f < u.length; f++) s.prototype[u[f]] = m;\n n.exports = s;\n }, { \"./compressedObject\": 2, \"./stream/DataWorker\": 27, \"./stream/GenericWorker\": 28, \"./stream/StreamHelper\": 29, \"./utf8\": 31 }], 36: [function(t, n, i) {\n (function(s) {\n var r, a, l = s.MutationObserver || s.WebKitMutationObserver;\n if (l) {\n var h = 0, c = new l(d), u = s.document.createTextNode(\"\");\n c.observe(u, { characterData: !0 }), r = function() {\n u.data = h = ++h % 2;\n };\n } else if (s.setImmediate || s.MessageChannel === void 0) r = \"document\" in s && \"onreadystatechange\" in s.document.createElement(\"script\") ? function() {\n var p = s.document.createElement(\"script\");\n p.onreadystatechange = function() {\n d(), p.onreadystatechange = null, p.parentNode.removeChild(p), p = null;\n }, s.document.documentElement.appendChild(p);\n } : function() {\n setTimeout(d, 0);\n };\n else {\n var m = new s.MessageChannel();\n m.port1.onmessage = d, r = function() {\n m.port2.postMessage(0);\n };\n }\n var f = [];\n function d() {\n var p, g;\n a = !0;\n for (var y = f.length; y; ) {\n for (g = f, f = [], p = -1; ++p < y; ) g[p]();\n y = f.length;\n }\n a = !1;\n }\n n.exports = function(p) {\n f.push(p) !== 1 || a || r();\n };\n }).call(this, typeof ii < \"u\" ? ii : typeof self < \"u\" ? self : typeof window < \"u\" ? window : {});\n }, {}], 37: [function(t, n, i) {\n var s = t(\"immediate\");\n function r() {\n }\n var a = {}, l = [\"REJECTED\"], h = [\"FULFILLED\"], c = [\"PENDING\"];\n function u(y) {\n if (typeof y != \"function\") throw new TypeError(\"resolver must be a function\");\n this.state = c, this.queue = [], this.outcome = void 0, y !== r && p(this, y);\n }\n function m(y, w, x) {\n this.promise = y, typeof w == \"function\" && (this.onFulfilled = w, this.callFulfilled = this.otherCallFulfilled), typeof x == \"function\" && (this.onRejected = x, this.callRejected = this.otherCallRejected);\n }\n function f(y, w, x) {\n s(function() {\n var _;\n try {\n _ = w(x);\n } catch (b) {\n return a.reject(y, b);\n }\n _ === y ? a.reject(y, new TypeError(\"Cannot resolve promise with itself\")) : a.resolve(y, _);\n });\n }\n function d(y) {\n var w = y && y.then;\n if (y && (typeof y == \"object\" || typeof y == \"function\") && typeof w == \"function\") return function() {\n w.apply(y, arguments);\n };\n }\n function p(y, w) {\n var x = !1;\n function _(A) {\n x || (x = !0, a.reject(y, A));\n }\n function b(A) {\n x || (x = !0, a.resolve(y, A));\n }\n var E = g(function() {\n w(b, _);\n });\n E.status === \"error\" && _(E.value);\n }\n function g(y, w) {\n var x = {};\n try {\n x.value = y(w), x.status = \"success\";\n } catch (_) {\n x.status = \"error\", x.value = _;\n }\n return x;\n }\n (n.exports = u).prototype.finally = function(y) {\n if (typeof y != \"function\") return this;\n var w = this.constructor;\n return this.then(function(x) {\n return w.resolve(y()).then(function() {\n return x;\n });\n }, function(x) {\n return w.resolve(y()).then(function() {\n throw x;\n });\n });\n }, u.prototype.catch = function(y) {\n return this.then(null, y);\n }, u.prototype.then = function(y, w) {\n if (typeof y != \"function\" && this.state === h || typeof w != \"function\" && this.state === l) return this;\n var x = new this.constructor(r);\n return this.state !== c ? f(x, this.state === h ? y : w, this.outcome) : this.queue.push(new m(x, y, w)), x;\n }, m.prototype.callFulfilled = function(y) {\n a.resolve(this.promise, y);\n }, m.prototype.otherCallFulfilled = function(y) {\n f(this.promise, this.onFulfilled, y);\n }, m.prototype.callRejected = function(y) {\n a.reject(this.promise, y);\n }, m.prototype.otherCallRejected = function(y) {\n f(this.promise, this.onRejected, y);\n }, a.resolve = function(y, w) {\n var x = g(d, w);\n if (x.status === \"error\") return a.reject(y, x.value);\n var _ = x.value;\n if (_) p(y, _);\n else {\n y.state = h, y.outcome = w;\n for (var b = -1, E = y.queue.length; ++b < E; ) y.queue[b].callFulfilled(w);\n }\n return y;\n }, a.reject = function(y, w) {\n y.state = l, y.outcome = w;\n for (var x = -1, _ = y.queue.length; ++x < _; ) y.queue[x].callRejected(w);\n return y;\n }, u.resolve = function(y) {\n return y instanceof this ? y : a.resolve(new this(r), y);\n }, u.reject = function(y) {\n var w = new this(r);\n return a.reject(w, y);\n }, u.all = function(y) {\n var w = this;\n if (Object.prototype.toString.call(y) !== \"[object Array]\") return this.reject(new TypeError(\"must be an array\"));\n var x = y.length, _ = !1;\n if (!x) return this.resolve([]);\n for (var b = new Array(x), E = 0, A = -1, P = new this(r); ++A < x; ) C(y[A], A);\n return P;\n function C(D, I) {\n w.resolve(D).then(function(T) {\n b[I] = T, ++E !== x || _ || (_ = !0, a.resolve(P, b));\n }, function(T) {\n _ || (_ = !0, a.reject(P, T));\n });\n }\n }, u.race = function(y) {\n var w = this;\n if (Object.prototype.toString.call(y) !== \"[object Array]\") return this.reject(new TypeError(\"must be an array\"));\n var x = y.length, _ = !1;\n if (!x) return this.resolve([]);\n for (var b = -1, E = new this(r); ++b < x; ) A = y[b], w.resolve(A).then(function(P) {\n _ || (_ = !0, a.resolve(E, P));\n }, function(P) {\n _ || (_ = !0, a.reject(E, P));\n });\n var A;\n return E;\n };\n }, { immediate: 36 }], 38: [function(t, n, i) {\n var s = {};\n (0, t(\"./lib/utils/common\").assign)(s, t(\"./lib/deflate\"), t(\"./lib/inflate\"), t(\"./lib/zlib/constants\")), n.exports = s;\n }, { \"./lib/deflate\": 39, \"./lib/inflate\": 40, \"./lib/utils/common\": 41, \"./lib/zlib/constants\": 44 }], 39: [function(t, n, i) {\n var s = t(\"./zlib/deflate\"), r = t(\"./utils/common\"), a = t(\"./utils/strings\"), l = t(\"./zlib/messages\"), h = t(\"./zlib/zstream\"), c = Object.prototype.toString, u = 0, m = -1, f = 0, d = 8;\n function p(y) {\n if (!(this instanceof p)) return new p(y);\n this.options = r.assign({ level: m, method: d, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: f, to: \"\" }, y || {});\n var w = this.options;\n w.raw && 0 < w.windowBits ? w.windowBits = -w.windowBits : w.gzip && 0 < w.windowBits && w.windowBits < 16 && (w.windowBits += 16), this.err = 0, this.msg = \"\", this.ended = !1, this.chunks = [], this.strm = new h(), this.strm.avail_out = 0;\n var x = s.deflateInit2(this.strm, w.level, w.method, w.windowBits, w.memLevel, w.strategy);\n if (x !== u) throw new Error(l[x]);\n if (w.header && s.deflateSetHeader(this.strm, w.header), w.dictionary) {\n var _;\n if (_ = typeof w.dictionary == \"string\" ? a.string2buf(w.dictionary) : c.call(w.dictionary) === \"[object ArrayBuffer]\" ? new Uint8Array(w.dictionary) : w.dictionary, (x = s.deflateSetDictionary(this.strm, _)) !== u) throw new Error(l[x]);\n this._dict_set = !0;\n }\n }\n function g(y, w) {\n var x = new p(w);\n if (x.push(y, !0), x.err) throw x.msg || l[x.err];\n return x.result;\n }\n p.prototype.push = function(y, w) {\n var x, _, b = this.strm, E = this.options.chunkSize;\n if (this.ended) return !1;\n _ = w === ~~w ? w : w === !0 ? 4 : 0, typeof y == \"string\" ? b.input = a.string2buf(y) : c.call(y) === \"[object ArrayBuffer]\" ? b.input = new Uint8Array(y) : b.input = y, b.next_in = 0, b.avail_in = b.input.length;\n do {\n if (b.avail_out === 0 && (b.output = new r.Buf8(E), b.next_out = 0, b.avail_out = E), (x = s.deflate(b, _)) !== 1 && x !== u) return this.onEnd(x), !(this.ended = !0);\n b.avail_out !== 0 && (b.avail_in !== 0 || _ !== 4 && _ !== 2) || (this.options.to === \"string\" ? this.onData(a.buf2binstring(r.shrinkBuf(b.output, b.next_out))) : this.onData(r.shrinkBuf(b.output, b.next_out)));\n } while ((0 < b.avail_in || b.avail_out === 0) && x !== 1);\n return _ === 4 ? (x = s.deflateEnd(this.strm), this.onEnd(x), this.ended = !0, x === u) : _ !== 2 || (this.onEnd(u), !(b.avail_out = 0));\n }, p.prototype.onData = function(y) {\n this.chunks.push(y);\n }, p.prototype.onEnd = function(y) {\n y === u && (this.options.to === \"string\" ? this.result = this.chunks.join(\"\") : this.result = r.flattenChunks(this.chunks)), this.chunks = [], this.err = y, this.msg = this.strm.msg;\n }, i.Deflate = p, i.deflate = g, i.deflateRaw = function(y, w) {\n return (w = w || {}).raw = !0, g(y, w);\n }, i.gzip = function(y, w) {\n return (w = w || {}).gzip = !0, g(y, w);\n };\n }, { \"./utils/common\": 41, \"./utils/strings\": 42, \"./zlib/deflate\": 46, \"./zlib/messages\": 51, \"./zlib/zstream\": 53 }], 40: [function(t, n, i) {\n var s = t(\"./zlib/inflate\"), r = t(\"./utils/common\"), a = t(\"./utils/strings\"), l = t(\"./zlib/constants\"), h = t(\"./zlib/messages\"), c = t(\"./zlib/zstream\"), u = t(\"./zlib/gzheader\"), m = Object.prototype.toString;\n function f(p) {\n if (!(this instanceof f)) return new f(p);\n this.options = r.assign({ chunkSize: 16384, windowBits: 0, to: \"\" }, p || {});\n var g = this.options;\n g.raw && 0 <= g.windowBits && g.windowBits < 16 && (g.windowBits = -g.windowBits, g.windowBits === 0 && (g.windowBits = -15)), !(0 <= g.windowBits && g.windowBits < 16) || p && p.windowBits || (g.windowBits += 32), 15 < g.windowBits && g.windowBits < 48 && (15 & g.windowBits) == 0 && (g.windowBits |= 15), this.err = 0, this.msg = \"\", this.ended = !1, this.chunks = [], this.strm = new c(), this.strm.avail_out = 0;\n var y = s.inflateInit2(this.strm, g.windowBits);\n if (y !== l.Z_OK) throw new Error(h[y]);\n this.header = new u(), s.inflateGetHeader(this.strm, this.header);\n }\n function d(p, g) {\n var y = new f(g);\n if (y.push(p, !0), y.err) throw y.msg || h[y.err];\n return y.result;\n }\n f.prototype.push = function(p, g) {\n var y, w, x, _, b, E, A = this.strm, P = this.options.chunkSize, C = this.options.dictionary, D = !1;\n if (this.ended) return !1;\n w = g === ~~g ? g : g === !0 ? l.Z_FINISH : l.Z_NO_FLUSH, typeof p == \"string\" ? A.input = a.binstring2buf(p) : m.call(p) === \"[object ArrayBuffer]\" ? A.input = new Uint8Array(p) : A.input = p, A.next_in = 0, A.avail_in = A.input.length;\n do {\n if (A.avail_out === 0 && (A.output = new r.Buf8(P), A.next_out = 0, A.avail_out = P), (y = s.inflate(A, l.Z_NO_FLUSH)) === l.Z_NEED_DICT && C && (E = typeof C == \"string\" ? a.string2buf(C) : m.call(C) === \"[object ArrayBuffer]\" ? new Uint8Array(C) : C, y = s.inflateSetDictionary(this.strm, E)), y === l.Z_BUF_ERROR && D === !0 && (y = l.Z_OK, D = !1), y !== l.Z_STREAM_END && y !== l.Z_OK) return this.onEnd(y), !(this.ended = !0);\n A.next_out && (A.avail_out !== 0 && y !== l.Z_STREAM_END && (A.avail_in !== 0 || w !== l.Z_FINISH && w !== l.Z_SYNC_FLUSH) || (this.options.to === \"string\" ? (x = a.utf8border(A.output, A.next_out), _ = A.next_out - x, b = a.buf2string(A.output, x), A.next_out = _, A.avail_out = P - _, _ && r.arraySet(A.output, A.output, x, _, 0), this.onData(b)) : this.onData(r.shrinkBuf(A.output, A.next_out)))), A.avail_in === 0 && A.avail_out === 0 && (D = !0);\n } while ((0 < A.avail_in || A.avail_out === 0) && y !== l.Z_STREAM_END);\n return y === l.Z_STREAM_END && (w = l.Z_FINISH), w === l.Z_FINISH ? (y = s.inflateEnd(this.strm), this.onEnd(y), this.ended = !0, y === l.Z_OK) : w !== l.Z_SYNC_FLUSH || (this.onEnd(l.Z_OK), !(A.avail_out = 0));\n }, f.prototype.onData = function(p) {\n this.chunks.push(p);\n }, f.prototype.onEnd = function(p) {\n p === l.Z_OK && (this.options.to === \"string\" ? this.result = this.chunks.join(\"\") : this.result = r.flattenChunks(this.chunks)), this.chunks = [], this.err = p, this.msg = this.strm.msg;\n }, i.Inflate = f, i.inflate = d, i.inflateRaw = function(p, g) {\n return (g = g || {}).raw = !0, d(p, g);\n }, i.ungzip = d;\n }, { \"./utils/common\": 41, \"./utils/strings\": 42, \"./zlib/constants\": 44, \"./zlib/gzheader\": 47, \"./zlib/inflate\": 49, \"./zlib/messages\": 51, \"./zlib/zstream\": 53 }], 41: [function(t, n, i) {\n var s = typeof Uint8Array < \"u\" && typeof Uint16Array < \"u\" && typeof Int32Array < \"u\";\n i.assign = function(l) {\n for (var h = Array.prototype.slice.call(arguments, 1); h.length; ) {\n var c = h.shift();\n if (c) {\n if (typeof c != \"object\") throw new TypeError(c + \"must be non-object\");\n for (var u in c) c.hasOwnProperty(u) && (l[u] = c[u]);\n }\n }\n return l;\n }, i.shrinkBuf = function(l, h) {\n return l.length === h ? l : l.subarray ? l.subarray(0, h) : (l.length = h, l);\n };\n var r = { arraySet: function(l, h, c, u, m) {\n if (h.subarray && l.subarray) l.set(h.subarray(c, c + u), m);\n else for (var f = 0; f < u; f++) l[m + f] = h[c + f];\n }, flattenChunks: function(l) {\n var h, c, u, m, f, d;\n for (h = u = 0, c = l.length; h < c; h++) u += l[h].length;\n for (d = new Uint8Array(u), h = m = 0, c = l.length; h < c; h++) f = l[h], d.set(f, m), m += f.length;\n return d;\n } }, a = { arraySet: function(l, h, c, u, m) {\n for (var f = 0; f < u; f++) l[m + f] = h[c + f];\n }, flattenChunks: function(l) {\n return [].concat.apply([], l);\n } };\n i.setTyped = function(l) {\n l ? (i.Buf8 = Uint8Array, i.Buf16 = Uint16Array, i.Buf32 = Int32Array, i.assign(i, r)) : (i.Buf8 = Array, i.Buf16 = Array, i.Buf32 = Array, i.assign(i, a));\n }, i.setTyped(s);\n }, {}], 42: [function(t, n, i) {\n var s = t(\"./common\"), r = !0, a = !0;\n try {\n String.fromCharCode.apply(null, [0]);\n } catch {\n r = !1;\n }\n try {\n String.fromCharCode.apply(null, new Uint8Array(1));\n } catch {\n a = !1;\n }\n for (var l = new s.Buf8(256), h = 0; h < 256; h++) l[h] = 252 <= h ? 6 : 248 <= h ? 5 : 240 <= h ? 4 : 224 <= h ? 3 : 192 <= h ? 2 : 1;\n function c(u, m) {\n if (m < 65537 && (u.subarray && a || !u.subarray && r)) return String.fromCharCode.apply(null, s.shrinkBuf(u, m));\n for (var f = \"\", d = 0; d < m; d++) f += String.fromCharCode(u[d]);\n return f;\n }\n l[254] = l[254] = 1, i.string2buf = function(u) {\n var m, f, d, p, g, y = u.length, w = 0;\n for (p = 0; p < y; p++) (64512 & (f = u.charCodeAt(p))) == 55296 && p + 1 < y && (64512 & (d = u.charCodeAt(p + 1))) == 56320 && (f = 65536 + (f - 55296 << 10) + (d - 56320), p++), w += f < 128 ? 1 : f < 2048 ? 2 : f < 65536 ? 3 : 4;\n for (m = new s.Buf8(w), p = g = 0; g < w; p++) (64512 & (f = u.charCodeAt(p))) == 55296 && p + 1 < y && (64512 & (d = u.charCodeAt(p + 1))) == 56320 && (f = 65536 + (f - 55296 << 10) + (d - 56320), p++), f < 128 ? m[g++] = f : (f < 2048 ? m[g++] = 192 | f >>> 6 : (f < 65536 ? m[g++] = 224 | f >>> 12 : (m[g++] = 240 | f >>> 18, m[g++] = 128 | f >>> 12 & 63), m[g++] = 128 | f >>> 6 & 63), m[g++] = 128 | 63 & f);\n return m;\n }, i.buf2binstring = function(u) {\n return c(u, u.length);\n }, i.binstring2buf = function(u) {\n for (var m = new s.Buf8(u.length), f = 0, d = m.length; f < d; f++) m[f] = u.charCodeAt(f);\n return m;\n }, i.buf2string = function(u, m) {\n var f, d, p, g, y = m || u.length, w = new Array(2 * y);\n for (f = d = 0; f < y; ) if ((p = u[f++]) < 128) w[d++] = p;\n else if (4 < (g = l[p])) w[d++] = 65533, f += g - 1;\n else {\n for (p &= g === 2 ? 31 : g === 3 ? 15 : 7; 1 < g && f < y; ) p = p << 6 | 63 & u[f++], g--;\n 1 < g ? w[d++] = 65533 : p < 65536 ? w[d++] = p : (p -= 65536, w[d++] = 55296 | p >> 10 & 1023, w[d++] = 56320 | 1023 & p);\n }\n return c(w, d);\n }, i.utf8border = function(u, m) {\n var f;\n for ((m = m || u.length) > u.length && (m = u.length), f = m - 1; 0 <= f && (192 & u[f]) == 128; ) f--;\n return f < 0 || f === 0 ? m : f + l[u[f]] > m ? f : m;\n };\n }, { \"./common\": 41 }], 43: [function(t, n, i) {\n n.exports = function(s, r, a, l) {\n for (var h = 65535 & s | 0, c = s >>> 16 & 65535 | 0, u = 0; a !== 0; ) {\n for (a -= u = 2e3 < a ? 2e3 : a; c = c + (h = h + r[l++] | 0) | 0, --u; ) ;\n h %= 65521, c %= 65521;\n }\n return h | c << 16 | 0;\n };\n }, {}], 44: [function(t, n, i) {\n n.exports = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 };\n }, {}], 45: [function(t, n, i) {\n var s = (function() {\n for (var r, a = [], l = 0; l < 256; l++) {\n r = l;\n for (var h = 0; h < 8; h++) r = 1 & r ? 3988292384 ^ r >>> 1 : r >>> 1;\n a[l] = r;\n }\n return a;\n })();\n n.exports = function(r, a, l, h) {\n var c = s, u = h + l;\n r ^= -1;\n for (var m = h; m < u; m++) r = r >>> 8 ^ c[255 & (r ^ a[m])];\n return -1 ^ r;\n };\n }, {}], 46: [function(t, n, i) {\n var s, r = t(\"../utils/common\"), a = t(\"./trees\"), l = t(\"./adler32\"), h = t(\"./crc32\"), c = t(\"./messages\"), u = 0, m = 4, f = 0, d = -2, p = -1, g = 4, y = 2, w = 8, x = 9, _ = 286, b = 30, E = 19, A = 2 * _ + 1, P = 15, C = 3, D = 258, I = D + C + 1, T = 42, R = 113, v = 1, z = 2, H = 3, V = 4;\n function te(S, W) {\n return S.msg = c[W], W;\n }\n function G(S) {\n return (S << 1) - (4 < S ? 9 : 0);\n }\n function $(S) {\n for (var W = S.length; 0 <= --W; ) S[W] = 0;\n }\n function N(S) {\n var W = S.state, j = W.pending;\n j > S.avail_out && (j = S.avail_out), j !== 0 && (r.arraySet(S.output, W.pending_buf, W.pending_out, j, S.next_out), S.next_out += j, W.pending_out += j, S.total_out += j, S.avail_out -= j, W.pending -= j, W.pending === 0 && (W.pending_out = 0));\n }\n function O(S, W) {\n a._tr_flush_block(S, 0 <= S.block_start ? S.block_start : -1, S.strstart - S.block_start, W), S.block_start = S.strstart, N(S.strm);\n }\n function Q(S, W) {\n S.pending_buf[S.pending++] = W;\n }\n function ee(S, W) {\n S.pending_buf[S.pending++] = W >>> 8 & 255, S.pending_buf[S.pending++] = 255 & W;\n }\n function q(S, W) {\n var j, L, k = S.max_chain_length, B = S.strstart, X = S.prev_length, Z = S.nice_match, F = S.strstart > S.w_size - I ? S.strstart - (S.w_size - I) : 0, Y = S.window, ne = S.w_mask, J = S.prev, ie = S.strstart + D, ce = Y[B + X - 1], ae = Y[B + X];\n S.prev_length >= S.good_match && (k >>= 2), Z > S.lookahead && (Z = S.lookahead);\n do\n if (Y[(j = W) + X] === ae && Y[j + X - 1] === ce && Y[j] === Y[B] && Y[++j] === Y[B + 1]) {\n B += 2, j++;\n do\n ;\n while (Y[++B] === Y[++j] && Y[++B] === Y[++j] && Y[++B] === Y[++j] && Y[++B] === Y[++j] && Y[++B] === Y[++j] && Y[++B] === Y[++j] && Y[++B] === Y[++j] && Y[++B] === Y[++j] && B < ie);\n if (L = D - (ie - B), B = ie - D, X < L) {\n if (S.match_start = W, Z <= (X = L)) break;\n ce = Y[B + X - 1], ae = Y[B + X];\n }\n }\n while ((W = J[W & ne]) > F && --k != 0);\n return X <= S.lookahead ? X : S.lookahead;\n }\n function de(S) {\n var W, j, L, k, B, X, Z, F, Y, ne, J = S.w_size;\n do {\n if (k = S.window_size - S.lookahead - S.strstart, S.strstart >= J + (J - I)) {\n for (r.arraySet(S.window, S.window, J, J, 0), S.match_start -= J, S.strstart -= J, S.block_start -= J, W = j = S.hash_size; L = S.head[--W], S.head[W] = J <= L ? L - J : 0, --j; ) ;\n for (W = j = J; L = S.prev[--W], S.prev[W] = J <= L ? L - J : 0, --j; ) ;\n k += J;\n }\n if (S.strm.avail_in === 0) break;\n if (X = S.strm, Z = S.window, F = S.strstart + S.lookahead, Y = k, ne = void 0, ne = X.avail_in, Y < ne && (ne = Y), j = ne === 0 ? 0 : (X.avail_in -= ne, r.arraySet(Z, X.input, X.next_in, ne, F), X.state.wrap === 1 ? X.adler = l(X.adler, Z, ne, F) : X.state.wrap === 2 && (X.adler = h(X.adler, Z, ne, F)), X.next_in += ne, X.total_in += ne, ne), S.lookahead += j, S.lookahead + S.insert >= C) for (B = S.strstart - S.insert, S.ins_h = S.window[B], S.ins_h = (S.ins_h << S.hash_shift ^ S.window[B + 1]) & S.hash_mask; S.insert && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[B + C - 1]) & S.hash_mask, S.prev[B & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = B, B++, S.insert--, !(S.lookahead + S.insert < C)); ) ;\n } while (S.lookahead < I && S.strm.avail_in !== 0);\n }\n function pe(S, W) {\n for (var j, L; ; ) {\n if (S.lookahead < I) {\n if (de(S), S.lookahead < I && W === u) return v;\n if (S.lookahead === 0) break;\n }\n if (j = 0, S.lookahead >= C && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + C - 1]) & S.hash_mask, j = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart), j !== 0 && S.strstart - j <= S.w_size - I && (S.match_length = q(S, j)), S.match_length >= C) if (L = a._tr_tally(S, S.strstart - S.match_start, S.match_length - C), S.lookahead -= S.match_length, S.match_length <= S.max_lazy_match && S.lookahead >= C) {\n for (S.match_length--; S.strstart++, S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + C - 1]) & S.hash_mask, j = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart, --S.match_length != 0; ) ;\n S.strstart++;\n } else S.strstart += S.match_length, S.match_length = 0, S.ins_h = S.window[S.strstart], S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + 1]) & S.hash_mask;\n else L = a._tr_tally(S, 0, S.window[S.strstart]), S.lookahead--, S.strstart++;\n if (L && (O(S, !1), S.strm.avail_out === 0)) return v;\n }\n return S.insert = S.strstart < C - 1 ? S.strstart : C - 1, W === m ? (O(S, !0), S.strm.avail_out === 0 ? H : V) : S.last_lit && (O(S, !1), S.strm.avail_out === 0) ? v : z;\n }\n function se(S, W) {\n for (var j, L, k; ; ) {\n if (S.lookahead < I) {\n if (de(S), S.lookahead < I && W === u) return v;\n if (S.lookahead === 0) break;\n }\n if (j = 0, S.lookahead >= C && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + C - 1]) & S.hash_mask, j = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart), S.prev_length = S.match_length, S.prev_match = S.match_start, S.match_length = C - 1, j !== 0 && S.prev_length < S.max_lazy_match && S.strstart - j <= S.w_size - I && (S.match_length = q(S, j), S.match_length <= 5 && (S.strategy === 1 || S.match_length === C && 4096 < S.strstart - S.match_start) && (S.match_length = C - 1)), S.prev_length >= C && S.match_length <= S.prev_length) {\n for (k = S.strstart + S.lookahead - C, L = a._tr_tally(S, S.strstart - 1 - S.prev_match, S.prev_length - C), S.lookahead -= S.prev_length - 1, S.prev_length -= 2; ++S.strstart <= k && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + C - 1]) & S.hash_mask, j = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart), --S.prev_length != 0; ) ;\n if (S.match_available = 0, S.match_length = C - 1, S.strstart++, L && (O(S, !1), S.strm.avail_out === 0)) return v;\n } else if (S.match_available) {\n if ((L = a._tr_tally(S, 0, S.window[S.strstart - 1])) && O(S, !1), S.strstart++, S.lookahead--, S.strm.avail_out === 0) return v;\n } else S.match_available = 1, S.strstart++, S.lookahead--;\n }\n return S.match_available && (L = a._tr_tally(S, 0, S.window[S.strstart - 1]), S.match_available = 0), S.insert = S.strstart < C - 1 ? S.strstart : C - 1, W === m ? (O(S, !0), S.strm.avail_out === 0 ? H : V) : S.last_lit && (O(S, !1), S.strm.avail_out === 0) ? v : z;\n }\n function oe(S, W, j, L, k) {\n this.good_length = S, this.max_lazy = W, this.nice_length = j, this.max_chain = L, this.func = k;\n }\n function he() {\n this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = w, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new r.Buf16(2 * A), this.dyn_dtree = new r.Buf16(2 * (2 * b + 1)), this.bl_tree = new r.Buf16(2 * (2 * E + 1)), $(this.dyn_ltree), $(this.dyn_dtree), $(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new r.Buf16(P + 1), this.heap = new r.Buf16(2 * _ + 1), $(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new r.Buf16(2 * _ + 1), $(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;\n }\n function me(S) {\n var W;\n return S && S.state ? (S.total_in = S.total_out = 0, S.data_type = y, (W = S.state).pending = 0, W.pending_out = 0, W.wrap < 0 && (W.wrap = -W.wrap), W.status = W.wrap ? T : R, S.adler = W.wrap === 2 ? 0 : 1, W.last_flush = u, a._tr_init(W), f) : te(S, d);\n }\n function Te(S) {\n var W = me(S);\n return W === f && (function(j) {\n j.window_size = 2 * j.w_size, $(j.head), j.max_lazy_match = s[j.level].max_lazy, j.good_match = s[j.level].good_length, j.nice_match = s[j.level].nice_length, j.max_chain_length = s[j.level].max_chain, j.strstart = 0, j.block_start = 0, j.lookahead = 0, j.insert = 0, j.match_length = j.prev_length = C - 1, j.match_available = 0, j.ins_h = 0;\n })(S.state), W;\n }\n function Ie(S, W, j, L, k, B) {\n if (!S) return d;\n var X = 1;\n if (W === p && (W = 6), L < 0 ? (X = 0, L = -L) : 15 < L && (X = 2, L -= 16), k < 1 || x < k || j !== w || L < 8 || 15 < L || W < 0 || 9 < W || B < 0 || g < B) return te(S, d);\n L === 8 && (L = 9);\n var Z = new he();\n return (S.state = Z).strm = S, Z.wrap = X, Z.gzhead = null, Z.w_bits = L, Z.w_size = 1 << Z.w_bits, Z.w_mask = Z.w_size - 1, Z.hash_bits = k + 7, Z.hash_size = 1 << Z.hash_bits, Z.hash_mask = Z.hash_size - 1, Z.hash_shift = ~~((Z.hash_bits + C - 1) / C), Z.window = new r.Buf8(2 * Z.w_size), Z.head = new r.Buf16(Z.hash_size), Z.prev = new r.Buf16(Z.w_size), Z.lit_bufsize = 1 << k + 6, Z.pending_buf_size = 4 * Z.lit_bufsize, Z.pending_buf = new r.Buf8(Z.pending_buf_size), Z.d_buf = 1 * Z.lit_bufsize, Z.l_buf = 3 * Z.lit_bufsize, Z.level = W, Z.strategy = B, Z.method = j, Te(S);\n }\n s = [new oe(0, 0, 0, 0, function(S, W) {\n var j = 65535;\n for (j > S.pending_buf_size - 5 && (j = S.pending_buf_size - 5); ; ) {\n if (S.lookahead <= 1) {\n if (de(S), S.lookahead === 0 && W === u) return v;\n if (S.lookahead === 0) break;\n }\n S.strstart += S.lookahead, S.lookahead = 0;\n var L = S.block_start + j;\n if ((S.strstart === 0 || S.strstart >= L) && (S.lookahead = S.strstart - L, S.strstart = L, O(S, !1), S.strm.avail_out === 0) || S.strstart - S.block_start >= S.w_size - I && (O(S, !1), S.strm.avail_out === 0)) return v;\n }\n return S.insert = 0, W === m ? (O(S, !0), S.strm.avail_out === 0 ? H : V) : (S.strstart > S.block_start && (O(S, !1), S.strm.avail_out), v);\n }), new oe(4, 4, 8, 4, pe), new oe(4, 5, 16, 8, pe), new oe(4, 6, 32, 32, pe), new oe(4, 4, 16, 16, se), new oe(8, 16, 32, 32, se), new oe(8, 16, 128, 128, se), new oe(8, 32, 128, 256, se), new oe(32, 128, 258, 1024, se), new oe(32, 258, 258, 4096, se)], i.deflateInit = function(S, W) {\n return Ie(S, W, w, 15, 8, 0);\n }, i.deflateInit2 = Ie, i.deflateReset = Te, i.deflateResetKeep = me, i.deflateSetHeader = function(S, W) {\n return S && S.state ? S.state.wrap !== 2 ? d : (S.state.gzhead = W, f) : d;\n }, i.deflate = function(S, W) {\n var j, L, k, B;\n if (!S || !S.state || 5 < W || W < 0) return S ? te(S, d) : d;\n if (L = S.state, !S.output || !S.input && S.avail_in !== 0 || L.status === 666 && W !== m) return te(S, S.avail_out === 0 ? -5 : d);\n if (L.strm = S, j = L.last_flush, L.last_flush = W, L.status === T) if (L.wrap === 2) S.adler = 0, Q(L, 31), Q(L, 139), Q(L, 8), L.gzhead ? (Q(L, (L.gzhead.text ? 1 : 0) + (L.gzhead.hcrc ? 2 : 0) + (L.gzhead.extra ? 4 : 0) + (L.gzhead.name ? 8 : 0) + (L.gzhead.comment ? 16 : 0)), Q(L, 255 & L.gzhead.time), Q(L, L.gzhead.time >> 8 & 255), Q(L, L.gzhead.time >> 16 & 255), Q(L, L.gzhead.time >> 24 & 255), Q(L, L.level === 9 ? 2 : 2 <= L.strategy || L.level < 2 ? 4 : 0), Q(L, 255 & L.gzhead.os), L.gzhead.extra && L.gzhead.extra.length && (Q(L, 255 & L.gzhead.extra.length), Q(L, L.gzhead.extra.length >> 8 & 255)), L.gzhead.hcrc && (S.adler = h(S.adler, L.pending_buf, L.pending, 0)), L.gzindex = 0, L.status = 69) : (Q(L, 0), Q(L, 0), Q(L, 0), Q(L, 0), Q(L, 0), Q(L, L.level === 9 ? 2 : 2 <= L.strategy || L.level < 2 ? 4 : 0), Q(L, 3), L.status = R);\n else {\n var X = w + (L.w_bits - 8 << 4) << 8;\n X |= (2 <= L.strategy || L.level < 2 ? 0 : L.level < 6 ? 1 : L.level === 6 ? 2 : 3) << 6, L.strstart !== 0 && (X |= 32), X += 31 - X % 31, L.status = R, ee(L, X), L.strstart !== 0 && (ee(L, S.adler >>> 16), ee(L, 65535 & S.adler)), S.adler = 1;\n }\n if (L.status === 69) if (L.gzhead.extra) {\n for (k = L.pending; L.gzindex < (65535 & L.gzhead.extra.length) && (L.pending !== L.pending_buf_size || (L.gzhead.hcrc && L.pending > k && (S.adler = h(S.adler, L.pending_buf, L.pending - k, k)), N(S), k = L.pending, L.pending !== L.pending_buf_size)); ) Q(L, 255 & L.gzhead.extra[L.gzindex]), L.gzindex++;\n L.gzhead.hcrc && L.pending > k && (S.adler = h(S.adler, L.pending_buf, L.pending - k, k)), L.gzindex === L.gzhead.extra.length && (L.gzindex = 0, L.status = 73);\n } else L.status = 73;\n if (L.status === 73) if (L.gzhead.name) {\n k = L.pending;\n do {\n if (L.pending === L.pending_buf_size && (L.gzhead.hcrc && L.pending > k && (S.adler = h(S.adler, L.pending_buf, L.pending - k, k)), N(S), k = L.pending, L.pending === L.pending_buf_size)) {\n B = 1;\n break;\n }\n B = L.gzindex < L.gzhead.name.length ? 255 & L.gzhead.name.charCodeAt(L.gzindex++) : 0, Q(L, B);\n } while (B !== 0);\n L.gzhead.hcrc && L.pending > k && (S.adler = h(S.adler, L.pending_buf, L.pending - k, k)), B === 0 && (L.gzindex = 0, L.status = 91);\n } else L.status = 91;\n if (L.status === 91) if (L.gzhead.comment) {\n k = L.pending;\n do {\n if (L.pending === L.pending_buf_size && (L.gzhead.hcrc && L.pending > k && (S.adler = h(S.adler, L.pending_buf, L.pending - k, k)), N(S), k = L.pending, L.pending === L.pending_buf_size)) {\n B = 1;\n break;\n }\n B = L.gzindex < L.gzhead.comment.length ? 255 & L.gzhead.comment.charCodeAt(L.gzindex++) : 0, Q(L, B);\n } while (B !== 0);\n L.gzhead.hcrc && L.pending > k && (S.adler = h(S.adler, L.pending_buf, L.pending - k, k)), B === 0 && (L.status = 103);\n } else L.status = 103;\n if (L.status === 103 && (L.gzhead.hcrc ? (L.pending + 2 > L.pending_buf_size && N(S), L.pending + 2 <= L.pending_buf_size && (Q(L, 255 & S.adler), Q(L, S.adler >> 8 & 255), S.adler = 0, L.status = R)) : L.status = R), L.pending !== 0) {\n if (N(S), S.avail_out === 0) return L.last_flush = -1, f;\n } else if (S.avail_in === 0 && G(W) <= G(j) && W !== m) return te(S, -5);\n if (L.status === 666 && S.avail_in !== 0) return te(S, -5);\n if (S.avail_in !== 0 || L.lookahead !== 0 || W !== u && L.status !== 666) {\n var Z = L.strategy === 2 ? (function(F, Y) {\n for (var ne; ; ) {\n if (F.lookahead === 0 && (de(F), F.lookahead === 0)) {\n if (Y === u) return v;\n break;\n }\n if (F.match_length = 0, ne = a._tr_tally(F, 0, F.window[F.strstart]), F.lookahead--, F.strstart++, ne && (O(F, !1), F.strm.avail_out === 0)) return v;\n }\n return F.insert = 0, Y === m ? (O(F, !0), F.strm.avail_out === 0 ? H : V) : F.last_lit && (O(F, !1), F.strm.avail_out === 0) ? v : z;\n })(L, W) : L.strategy === 3 ? (function(F, Y) {\n for (var ne, J, ie, ce, ae = F.window; ; ) {\n if (F.lookahead <= D) {\n if (de(F), F.lookahead <= D && Y === u) return v;\n if (F.lookahead === 0) break;\n }\n if (F.match_length = 0, F.lookahead >= C && 0 < F.strstart && (J = ae[ie = F.strstart - 1]) === ae[++ie] && J === ae[++ie] && J === ae[++ie]) {\n ce = F.strstart + D;\n do\n ;\n while (J === ae[++ie] && J === ae[++ie] && J === ae[++ie] && J === ae[++ie] && J === ae[++ie] && J === ae[++ie] && J === ae[++ie] && J === ae[++ie] && ie < ce);\n F.match_length = D - (ce - ie), F.match_length > F.lookahead && (F.match_length = F.lookahead);\n }\n if (F.match_length >= C ? (ne = a._tr_tally(F, 1, F.match_length - C), F.lookahead -= F.match_length, F.strstart += F.match_length, F.match_length = 0) : (ne = a._tr_tally(F, 0, F.window[F.strstart]), F.lookahead--, F.strstart++), ne && (O(F, !1), F.strm.avail_out === 0)) return v;\n }\n return F.insert = 0, Y === m ? (O(F, !0), F.strm.avail_out === 0 ? H : V) : F.last_lit && (O(F, !1), F.strm.avail_out === 0) ? v : z;\n })(L, W) : s[L.level].func(L, W);\n if (Z !== H && Z !== V || (L.status = 666), Z === v || Z === H) return S.avail_out === 0 && (L.last_flush = -1), f;\n if (Z === z && (W === 1 ? a._tr_align(L) : W !== 5 && (a._tr_stored_block(L, 0, 0, !1), W === 3 && ($(L.head), L.lookahead === 0 && (L.strstart = 0, L.block_start = 0, L.insert = 0))), N(S), S.avail_out === 0)) return L.last_flush = -1, f;\n }\n return W !== m ? f : L.wrap <= 0 ? 1 : (L.wrap === 2 ? (Q(L, 255 & S.adler), Q(L, S.adler >> 8 & 255), Q(L, S.adler >> 16 & 255), Q(L, S.adler >> 24 & 255), Q(L, 255 & S.total_in), Q(L, S.total_in >> 8 & 255), Q(L, S.total_in >> 16 & 255), Q(L, S.total_in >> 24 & 255)) : (ee(L, S.adler >>> 16), ee(L, 65535 & S.adler)), N(S), 0 < L.wrap && (L.wrap = -L.wrap), L.pending !== 0 ? f : 1);\n }, i.deflateEnd = function(S) {\n var W;\n return S && S.state ? (W = S.state.status) !== T && W !== 69 && W !== 73 && W !== 91 && W !== 103 && W !== R && W !== 666 ? te(S, d) : (S.state = null, W === R ? te(S, -3) : f) : d;\n }, i.deflateSetDictionary = function(S, W) {\n var j, L, k, B, X, Z, F, Y, ne = W.length;\n if (!S || !S.state || (B = (j = S.state).wrap) === 2 || B === 1 && j.status !== T || j.lookahead) return d;\n for (B === 1 && (S.adler = l(S.adler, W, ne, 0)), j.wrap = 0, ne >= j.w_size && (B === 0 && ($(j.head), j.strstart = 0, j.block_start = 0, j.insert = 0), Y = new r.Buf8(j.w_size), r.arraySet(Y, W, ne - j.w_size, j.w_size, 0), W = Y, ne = j.w_size), X = S.avail_in, Z = S.next_in, F = S.input, S.avail_in = ne, S.next_in = 0, S.input = W, de(j); j.lookahead >= C; ) {\n for (L = j.strstart, k = j.lookahead - (C - 1); j.ins_h = (j.ins_h << j.hash_shift ^ j.window[L + C - 1]) & j.hash_mask, j.prev[L & j.w_mask] = j.head[j.ins_h], j.head[j.ins_h] = L, L++, --k; ) ;\n j.strstart = L, j.lookahead = C - 1, de(j);\n }\n return j.strstart += j.lookahead, j.block_start = j.strstart, j.insert = j.lookahead, j.lookahead = 0, j.match_length = j.prev_length = C - 1, j.match_available = 0, S.next_in = Z, S.input = F, S.avail_in = X, j.wrap = B, f;\n }, i.deflateInfo = \"pako deflate (from Nodeca project)\";\n }, { \"../utils/common\": 41, \"./adler32\": 43, \"./crc32\": 45, \"./messages\": 51, \"./trees\": 52 }], 47: [function(t, n, i) {\n n.exports = function() {\n this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = \"\", this.comment = \"\", this.hcrc = 0, this.done = !1;\n };\n }, {}], 48: [function(t, n, i) {\n n.exports = function(s, r) {\n var a, l, h, c, u, m, f, d, p, g, y, w, x, _, b, E, A, P, C, D, I, T, R, v, z;\n a = s.state, l = s.next_in, v = s.input, h = l + (s.avail_in - 5), c = s.next_out, z = s.output, u = c - (r - s.avail_out), m = c + (s.avail_out - 257), f = a.dmax, d = a.wsize, p = a.whave, g = a.wnext, y = a.window, w = a.hold, x = a.bits, _ = a.lencode, b = a.distcode, E = (1 << a.lenbits) - 1, A = (1 << a.distbits) - 1;\n e: do {\n x < 15 && (w += v[l++] << x, x += 8, w += v[l++] << x, x += 8), P = _[w & E];\n t: for (; ; ) {\n if (w >>>= C = P >>> 24, x -= C, (C = P >>> 16 & 255) === 0) z[c++] = 65535 & P;\n else {\n if (!(16 & C)) {\n if ((64 & C) == 0) {\n P = _[(65535 & P) + (w & (1 << C) - 1)];\n continue t;\n }\n if (32 & C) {\n a.mode = 12;\n break e;\n }\n s.msg = \"invalid literal/length code\", a.mode = 30;\n break e;\n }\n D = 65535 & P, (C &= 15) && (x < C && (w += v[l++] << x, x += 8), D += w & (1 << C) - 1, w >>>= C, x -= C), x < 15 && (w += v[l++] << x, x += 8, w += v[l++] << x, x += 8), P = b[w & A];\n n: for (; ; ) {\n if (w >>>= C = P >>> 24, x -= C, !(16 & (C = P >>> 16 & 255))) {\n if ((64 & C) == 0) {\n P = b[(65535 & P) + (w & (1 << C) - 1)];\n continue n;\n }\n s.msg = \"invalid distance code\", a.mode = 30;\n break e;\n }\n if (I = 65535 & P, x < (C &= 15) && (w += v[l++] << x, (x += 8) < C && (w += v[l++] << x, x += 8)), f < (I += w & (1 << C) - 1)) {\n s.msg = \"invalid distance too far back\", a.mode = 30;\n break e;\n }\n if (w >>>= C, x -= C, (C = c - u) < I) {\n if (p < (C = I - C) && a.sane) {\n s.msg = \"invalid distance too far back\", a.mode = 30;\n break e;\n }\n if (R = y, (T = 0) === g) {\n if (T += d - C, C < D) {\n for (D -= C; z[c++] = y[T++], --C; ) ;\n T = c - I, R = z;\n }\n } else if (g < C) {\n if (T += d + g - C, (C -= g) < D) {\n for (D -= C; z[c++] = y[T++], --C; ) ;\n if (T = 0, g < D) {\n for (D -= C = g; z[c++] = y[T++], --C; ) ;\n T = c - I, R = z;\n }\n }\n } else if (T += g - C, C < D) {\n for (D -= C; z[c++] = y[T++], --C; ) ;\n T = c - I, R = z;\n }\n for (; 2 < D; ) z[c++] = R[T++], z[c++] = R[T++], z[c++] = R[T++], D -= 3;\n D && (z[c++] = R[T++], 1 < D && (z[c++] = R[T++]));\n } else {\n for (T = c - I; z[c++] = z[T++], z[c++] = z[T++], z[c++] = z[T++], 2 < (D -= 3); ) ;\n D && (z[c++] = z[T++], 1 < D && (z[c++] = z[T++]));\n }\n break;\n }\n }\n break;\n }\n } while (l < h && c < m);\n l -= D = x >> 3, w &= (1 << (x -= D << 3)) - 1, s.next_in = l, s.next_out = c, s.avail_in = l < h ? h - l + 5 : 5 - (l - h), s.avail_out = c < m ? m - c + 257 : 257 - (c - m), a.hold = w, a.bits = x;\n };\n }, {}], 49: [function(t, n, i) {\n var s = t(\"../utils/common\"), r = t(\"./adler32\"), a = t(\"./crc32\"), l = t(\"./inffast\"), h = t(\"./inftrees\"), c = 1, u = 2, m = 0, f = -2, d = 1, p = 852, g = 592;\n function y(T) {\n return (T >>> 24 & 255) + (T >>> 8 & 65280) + ((65280 & T) << 8) + ((255 & T) << 24);\n }\n function w() {\n this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new s.Buf16(320), this.work = new s.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;\n }\n function x(T) {\n var R;\n return T && T.state ? (R = T.state, T.total_in = T.total_out = R.total = 0, T.msg = \"\", R.wrap && (T.adler = 1 & R.wrap), R.mode = d, R.last = 0, R.havedict = 0, R.dmax = 32768, R.head = null, R.hold = 0, R.bits = 0, R.lencode = R.lendyn = new s.Buf32(p), R.distcode = R.distdyn = new s.Buf32(g), R.sane = 1, R.back = -1, m) : f;\n }\n function _(T) {\n var R;\n return T && T.state ? ((R = T.state).wsize = 0, R.whave = 0, R.wnext = 0, x(T)) : f;\n }\n function b(T, R) {\n var v, z;\n return T && T.state ? (z = T.state, R < 0 ? (v = 0, R = -R) : (v = 1 + (R >> 4), R < 48 && (R &= 15)), R && (R < 8 || 15 < R) ? f : (z.window !== null && z.wbits !== R && (z.window = null), z.wrap = v, z.wbits = R, _(T))) : f;\n }\n function E(T, R) {\n var v, z;\n return T ? (z = new w(), (T.state = z).window = null, (v = b(T, R)) !== m && (T.state = null), v) : f;\n }\n var A, P, C = !0;\n function D(T) {\n if (C) {\n var R;\n for (A = new s.Buf32(512), P = new s.Buf32(32), R = 0; R < 144; ) T.lens[R++] = 8;\n for (; R < 256; ) T.lens[R++] = 9;\n for (; R < 280; ) T.lens[R++] = 7;\n for (; R < 288; ) T.lens[R++] = 8;\n for (h(c, T.lens, 0, 288, A, 0, T.work, { bits: 9 }), R = 0; R < 32; ) T.lens[R++] = 5;\n h(u, T.lens, 0, 32, P, 0, T.work, { bits: 5 }), C = !1;\n }\n T.lencode = A, T.lenbits = 9, T.distcode = P, T.distbits = 5;\n }\n function I(T, R, v, z) {\n var H, V = T.state;\n return V.window === null && (V.wsize = 1 << V.wbits, V.wnext = 0, V.whave = 0, V.window = new s.Buf8(V.wsize)), z >= V.wsize ? (s.arraySet(V.window, R, v - V.wsize, V.wsize, 0), V.wnext = 0, V.whave = V.wsize) : (z < (H = V.wsize - V.wnext) && (H = z), s.arraySet(V.window, R, v - z, H, V.wnext), (z -= H) ? (s.arraySet(V.window, R, v - z, z, 0), V.wnext = z, V.whave = V.wsize) : (V.wnext += H, V.wnext === V.wsize && (V.wnext = 0), V.whave < V.wsize && (V.whave += H))), 0;\n }\n i.inflateReset = _, i.inflateReset2 = b, i.inflateResetKeep = x, i.inflateInit = function(T) {\n return E(T, 15);\n }, i.inflateInit2 = E, i.inflate = function(T, R) {\n var v, z, H, V, te, G, $, N, O, Q, ee, q, de, pe, se, oe, he, me, Te, Ie, S, W, j, L, k = 0, B = new s.Buf8(4), X = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];\n if (!T || !T.state || !T.output || !T.input && T.avail_in !== 0) return f;\n (v = T.state).mode === 12 && (v.mode = 13), te = T.next_out, H = T.output, $ = T.avail_out, V = T.next_in, z = T.input, G = T.avail_in, N = v.hold, O = v.bits, Q = G, ee = $, W = m;\n e: for (; ; ) switch (v.mode) {\n case d:\n if (v.wrap === 0) {\n v.mode = 13;\n break;\n }\n for (; O < 16; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (2 & v.wrap && N === 35615) {\n B[v.check = 0] = 255 & N, B[1] = N >>> 8 & 255, v.check = a(v.check, B, 2, 0), O = N = 0, v.mode = 2;\n break;\n }\n if (v.flags = 0, v.head && (v.head.done = !1), !(1 & v.wrap) || (((255 & N) << 8) + (N >> 8)) % 31) {\n T.msg = \"incorrect header check\", v.mode = 30;\n break;\n }\n if ((15 & N) != 8) {\n T.msg = \"unknown compression method\", v.mode = 30;\n break;\n }\n if (O -= 4, S = 8 + (15 & (N >>>= 4)), v.wbits === 0) v.wbits = S;\n else if (S > v.wbits) {\n T.msg = \"invalid window size\", v.mode = 30;\n break;\n }\n v.dmax = 1 << S, T.adler = v.check = 1, v.mode = 512 & N ? 10 : 12, O = N = 0;\n break;\n case 2:\n for (; O < 16; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (v.flags = N, (255 & v.flags) != 8) {\n T.msg = \"unknown compression method\", v.mode = 30;\n break;\n }\n if (57344 & v.flags) {\n T.msg = \"unknown header flags set\", v.mode = 30;\n break;\n }\n v.head && (v.head.text = N >> 8 & 1), 512 & v.flags && (B[0] = 255 & N, B[1] = N >>> 8 & 255, v.check = a(v.check, B, 2, 0)), O = N = 0, v.mode = 3;\n case 3:\n for (; O < 32; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n v.head && (v.head.time = N), 512 & v.flags && (B[0] = 255 & N, B[1] = N >>> 8 & 255, B[2] = N >>> 16 & 255, B[3] = N >>> 24 & 255, v.check = a(v.check, B, 4, 0)), O = N = 0, v.mode = 4;\n case 4:\n for (; O < 16; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n v.head && (v.head.xflags = 255 & N, v.head.os = N >> 8), 512 & v.flags && (B[0] = 255 & N, B[1] = N >>> 8 & 255, v.check = a(v.check, B, 2, 0)), O = N = 0, v.mode = 5;\n case 5:\n if (1024 & v.flags) {\n for (; O < 16; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n v.length = N, v.head && (v.head.extra_len = N), 512 & v.flags && (B[0] = 255 & N, B[1] = N >>> 8 & 255, v.check = a(v.check, B, 2, 0)), O = N = 0;\n } else v.head && (v.head.extra = null);\n v.mode = 6;\n case 6:\n if (1024 & v.flags && (G < (q = v.length) && (q = G), q && (v.head && (S = v.head.extra_len - v.length, v.head.extra || (v.head.extra = new Array(v.head.extra_len)), s.arraySet(v.head.extra, z, V, q, S)), 512 & v.flags && (v.check = a(v.check, z, q, V)), G -= q, V += q, v.length -= q), v.length)) break e;\n v.length = 0, v.mode = 7;\n case 7:\n if (2048 & v.flags) {\n if (G === 0) break e;\n for (q = 0; S = z[V + q++], v.head && S && v.length < 65536 && (v.head.name += String.fromCharCode(S)), S && q < G; ) ;\n if (512 & v.flags && (v.check = a(v.check, z, q, V)), G -= q, V += q, S) break e;\n } else v.head && (v.head.name = null);\n v.length = 0, v.mode = 8;\n case 8:\n if (4096 & v.flags) {\n if (G === 0) break e;\n for (q = 0; S = z[V + q++], v.head && S && v.length < 65536 && (v.head.comment += String.fromCharCode(S)), S && q < G; ) ;\n if (512 & v.flags && (v.check = a(v.check, z, q, V)), G -= q, V += q, S) break e;\n } else v.head && (v.head.comment = null);\n v.mode = 9;\n case 9:\n if (512 & v.flags) {\n for (; O < 16; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (N !== (65535 & v.check)) {\n T.msg = \"header crc mismatch\", v.mode = 30;\n break;\n }\n O = N = 0;\n }\n v.head && (v.head.hcrc = v.flags >> 9 & 1, v.head.done = !0), T.adler = v.check = 0, v.mode = 12;\n break;\n case 10:\n for (; O < 32; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n T.adler = v.check = y(N), O = N = 0, v.mode = 11;\n case 11:\n if (v.havedict === 0) return T.next_out = te, T.avail_out = $, T.next_in = V, T.avail_in = G, v.hold = N, v.bits = O, 2;\n T.adler = v.check = 1, v.mode = 12;\n case 12:\n if (R === 5 || R === 6) break e;\n case 13:\n if (v.last) {\n N >>>= 7 & O, O -= 7 & O, v.mode = 27;\n break;\n }\n for (; O < 3; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n switch (v.last = 1 & N, O -= 1, 3 & (N >>>= 1)) {\n case 0:\n v.mode = 14;\n break;\n case 1:\n if (D(v), v.mode = 20, R !== 6) break;\n N >>>= 2, O -= 2;\n break e;\n case 2:\n v.mode = 17;\n break;\n case 3:\n T.msg = \"invalid block type\", v.mode = 30;\n }\n N >>>= 2, O -= 2;\n break;\n case 14:\n for (N >>>= 7 & O, O -= 7 & O; O < 32; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if ((65535 & N) != (N >>> 16 ^ 65535)) {\n T.msg = \"invalid stored block lengths\", v.mode = 30;\n break;\n }\n if (v.length = 65535 & N, O = N = 0, v.mode = 15, R === 6) break e;\n case 15:\n v.mode = 16;\n case 16:\n if (q = v.length) {\n if (G < q && (q = G), $ < q && (q = $), q === 0) break e;\n s.arraySet(H, z, V, q, te), G -= q, V += q, $ -= q, te += q, v.length -= q;\n break;\n }\n v.mode = 12;\n break;\n case 17:\n for (; O < 14; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (v.nlen = 257 + (31 & N), N >>>= 5, O -= 5, v.ndist = 1 + (31 & N), N >>>= 5, O -= 5, v.ncode = 4 + (15 & N), N >>>= 4, O -= 4, 286 < v.nlen || 30 < v.ndist) {\n T.msg = \"too many length or distance symbols\", v.mode = 30;\n break;\n }\n v.have = 0, v.mode = 18;\n case 18:\n for (; v.have < v.ncode; ) {\n for (; O < 3; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n v.lens[X[v.have++]] = 7 & N, N >>>= 3, O -= 3;\n }\n for (; v.have < 19; ) v.lens[X[v.have++]] = 0;\n if (v.lencode = v.lendyn, v.lenbits = 7, j = { bits: v.lenbits }, W = h(0, v.lens, 0, 19, v.lencode, 0, v.work, j), v.lenbits = j.bits, W) {\n T.msg = \"invalid code lengths set\", v.mode = 30;\n break;\n }\n v.have = 0, v.mode = 19;\n case 19:\n for (; v.have < v.nlen + v.ndist; ) {\n for (; oe = (k = v.lencode[N & (1 << v.lenbits) - 1]) >>> 16 & 255, he = 65535 & k, !((se = k >>> 24) <= O); ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (he < 16) N >>>= se, O -= se, v.lens[v.have++] = he;\n else {\n if (he === 16) {\n for (L = se + 2; O < L; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (N >>>= se, O -= se, v.have === 0) {\n T.msg = \"invalid bit length repeat\", v.mode = 30;\n break;\n }\n S = v.lens[v.have - 1], q = 3 + (3 & N), N >>>= 2, O -= 2;\n } else if (he === 17) {\n for (L = se + 3; O < L; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n O -= se, S = 0, q = 3 + (7 & (N >>>= se)), N >>>= 3, O -= 3;\n } else {\n for (L = se + 7; O < L; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n O -= se, S = 0, q = 11 + (127 & (N >>>= se)), N >>>= 7, O -= 7;\n }\n if (v.have + q > v.nlen + v.ndist) {\n T.msg = \"invalid bit length repeat\", v.mode = 30;\n break;\n }\n for (; q--; ) v.lens[v.have++] = S;\n }\n }\n if (v.mode === 30) break;\n if (v.lens[256] === 0) {\n T.msg = \"invalid code -- missing end-of-block\", v.mode = 30;\n break;\n }\n if (v.lenbits = 9, j = { bits: v.lenbits }, W = h(c, v.lens, 0, v.nlen, v.lencode, 0, v.work, j), v.lenbits = j.bits, W) {\n T.msg = \"invalid literal/lengths set\", v.mode = 30;\n break;\n }\n if (v.distbits = 6, v.distcode = v.distdyn, j = { bits: v.distbits }, W = h(u, v.lens, v.nlen, v.ndist, v.distcode, 0, v.work, j), v.distbits = j.bits, W) {\n T.msg = \"invalid distances set\", v.mode = 30;\n break;\n }\n if (v.mode = 20, R === 6) break e;\n case 20:\n v.mode = 21;\n case 21:\n if (6 <= G && 258 <= $) {\n T.next_out = te, T.avail_out = $, T.next_in = V, T.avail_in = G, v.hold = N, v.bits = O, l(T, ee), te = T.next_out, H = T.output, $ = T.avail_out, V = T.next_in, z = T.input, G = T.avail_in, N = v.hold, O = v.bits, v.mode === 12 && (v.back = -1);\n break;\n }\n for (v.back = 0; oe = (k = v.lencode[N & (1 << v.lenbits) - 1]) >>> 16 & 255, he = 65535 & k, !((se = k >>> 24) <= O); ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (oe && (240 & oe) == 0) {\n for (me = se, Te = oe, Ie = he; oe = (k = v.lencode[Ie + ((N & (1 << me + Te) - 1) >> me)]) >>> 16 & 255, he = 65535 & k, !(me + (se = k >>> 24) <= O); ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n N >>>= me, O -= me, v.back += me;\n }\n if (N >>>= se, O -= se, v.back += se, v.length = he, oe === 0) {\n v.mode = 26;\n break;\n }\n if (32 & oe) {\n v.back = -1, v.mode = 12;\n break;\n }\n if (64 & oe) {\n T.msg = \"invalid literal/length code\", v.mode = 30;\n break;\n }\n v.extra = 15 & oe, v.mode = 22;\n case 22:\n if (v.extra) {\n for (L = v.extra; O < L; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n v.length += N & (1 << v.extra) - 1, N >>>= v.extra, O -= v.extra, v.back += v.extra;\n }\n v.was = v.length, v.mode = 23;\n case 23:\n for (; oe = (k = v.distcode[N & (1 << v.distbits) - 1]) >>> 16 & 255, he = 65535 & k, !((se = k >>> 24) <= O); ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if ((240 & oe) == 0) {\n for (me = se, Te = oe, Ie = he; oe = (k = v.distcode[Ie + ((N & (1 << me + Te) - 1) >> me)]) >>> 16 & 255, he = 65535 & k, !(me + (se = k >>> 24) <= O); ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n N >>>= me, O -= me, v.back += me;\n }\n if (N >>>= se, O -= se, v.back += se, 64 & oe) {\n T.msg = \"invalid distance code\", v.mode = 30;\n break;\n }\n v.offset = he, v.extra = 15 & oe, v.mode = 24;\n case 24:\n if (v.extra) {\n for (L = v.extra; O < L; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n v.offset += N & (1 << v.extra) - 1, N >>>= v.extra, O -= v.extra, v.back += v.extra;\n }\n if (v.offset > v.dmax) {\n T.msg = \"invalid distance too far back\", v.mode = 30;\n break;\n }\n v.mode = 25;\n case 25:\n if ($ === 0) break e;\n if (q = ee - $, v.offset > q) {\n if ((q = v.offset - q) > v.whave && v.sane) {\n T.msg = \"invalid distance too far back\", v.mode = 30;\n break;\n }\n de = q > v.wnext ? (q -= v.wnext, v.wsize - q) : v.wnext - q, q > v.length && (q = v.length), pe = v.window;\n } else pe = H, de = te - v.offset, q = v.length;\n for ($ < q && (q = $), $ -= q, v.length -= q; H[te++] = pe[de++], --q; ) ;\n v.length === 0 && (v.mode = 21);\n break;\n case 26:\n if ($ === 0) break e;\n H[te++] = v.length, $--, v.mode = 21;\n break;\n case 27:\n if (v.wrap) {\n for (; O < 32; ) {\n if (G === 0) break e;\n G--, N |= z[V++] << O, O += 8;\n }\n if (ee -= $, T.total_out += ee, v.total += ee, ee && (T.adler = v.check = v.flags ? a(v.check, H, ee, te - ee) : r(v.check, H, ee, te - ee)), ee = $, (v.flags ? N : y(N)) !== v.check) {\n T.msg = \"incorrect data check\", v.mode = 30;\n break;\n }\n O = N = 0;\n }\n v.mode = 28;\n case 28:\n if (v.wrap && v.flags) {\n for (; O < 32; ) {\n if (G === 0) break e;\n G--, N += z[V++] << O, O += 8;\n }\n if (N !== (4294967295 & v.total)) {\n T.msg = \"incorrect length check\", v.mode = 30;\n break;\n }\n O = N = 0;\n }\n v.mode = 29;\n case 29:\n W = 1;\n break e;\n case 30:\n W = -3;\n break e;\n case 31:\n return -4;\n case 32:\n default:\n return f;\n }\n return T.next_out = te, T.avail_out = $, T.next_in = V, T.avail_in = G, v.hold = N, v.bits = O, (v.wsize || ee !== T.avail_out && v.mode < 30 && (v.mode < 27 || R !== 4)) && I(T, T.output, T.next_out, ee - T.avail_out) ? (v.mode = 31, -4) : (Q -= T.avail_in, ee -= T.avail_out, T.total_in += Q, T.total_out += ee, v.total += ee, v.wrap && ee && (T.adler = v.check = v.flags ? a(v.check, H, ee, T.next_out - ee) : r(v.check, H, ee, T.next_out - ee)), T.data_type = v.bits + (v.last ? 64 : 0) + (v.mode === 12 ? 128 : 0) + (v.mode === 20 || v.mode === 15 ? 256 : 0), (Q == 0 && ee === 0 || R === 4) && W === m && (W = -5), W);\n }, i.inflateEnd = function(T) {\n if (!T || !T.state) return f;\n var R = T.state;\n return R.window && (R.window = null), T.state = null, m;\n }, i.inflateGetHeader = function(T, R) {\n var v;\n return T && T.state ? (2 & (v = T.state).wrap) == 0 ? f : ((v.head = R).done = !1, m) : f;\n }, i.inflateSetDictionary = function(T, R) {\n var v, z = R.length;\n return T && T.state ? (v = T.state).wrap !== 0 && v.mode !== 11 ? f : v.mode === 11 && r(1, R, z, 0) !== v.check ? -3 : I(T, R, z, z) ? (v.mode = 31, -4) : (v.havedict = 1, m) : f;\n }, i.inflateInfo = \"pako inflate (from Nodeca project)\";\n }, { \"../utils/common\": 41, \"./adler32\": 43, \"./crc32\": 45, \"./inffast\": 48, \"./inftrees\": 50 }], 50: [function(t, n, i) {\n var s = t(\"../utils/common\"), r = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], a = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], l = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], h = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];\n n.exports = function(c, u, m, f, d, p, g, y) {\n var w, x, _, b, E, A, P, C, D, I = y.bits, T = 0, R = 0, v = 0, z = 0, H = 0, V = 0, te = 0, G = 0, $ = 0, N = 0, O = null, Q = 0, ee = new s.Buf16(16), q = new s.Buf16(16), de = null, pe = 0;\n for (T = 0; T <= 15; T++) ee[T] = 0;\n for (R = 0; R < f; R++) ee[u[m + R]]++;\n for (H = I, z = 15; 1 <= z && ee[z] === 0; z--) ;\n if (z < H && (H = z), z === 0) return d[p++] = 20971520, d[p++] = 20971520, y.bits = 1, 0;\n for (v = 1; v < z && ee[v] === 0; v++) ;\n for (H < v && (H = v), T = G = 1; T <= 15; T++) if (G <<= 1, (G -= ee[T]) < 0) return -1;\n if (0 < G && (c === 0 || z !== 1)) return -1;\n for (q[1] = 0, T = 1; T < 15; T++) q[T + 1] = q[T] + ee[T];\n for (R = 0; R < f; R++) u[m + R] !== 0 && (g[q[u[m + R]]++] = R);\n if (A = c === 0 ? (O = de = g, 19) : c === 1 ? (O = r, Q -= 257, de = a, pe -= 257, 256) : (O = l, de = h, -1), T = v, E = p, te = R = N = 0, _ = -1, b = ($ = 1 << (V = H)) - 1, c === 1 && 852 < $ || c === 2 && 592 < $) return 1;\n for (; ; ) {\n for (P = T - te, D = g[R] < A ? (C = 0, g[R]) : g[R] > A ? (C = de[pe + g[R]], O[Q + g[R]]) : (C = 96, 0), w = 1 << T - te, v = x = 1 << V; d[E + (N >> te) + (x -= w)] = P << 24 | C << 16 | D | 0, x !== 0; ) ;\n for (w = 1 << T - 1; N & w; ) w >>= 1;\n if (w !== 0 ? (N &= w - 1, N += w) : N = 0, R++, --ee[T] == 0) {\n if (T === z) break;\n T = u[m + g[R]];\n }\n if (H < T && (N & b) !== _) {\n for (te === 0 && (te = H), E += v, G = 1 << (V = T - te); V + te < z && !((G -= ee[V + te]) <= 0); ) V++, G <<= 1;\n if ($ += 1 << V, c === 1 && 852 < $ || c === 2 && 592 < $) return 1;\n d[_ = N & b] = H << 24 | V << 16 | E - p | 0;\n }\n }\n return N !== 0 && (d[E + N] = T - te << 24 | 64 << 16 | 0), y.bits = H, 0;\n };\n }, { \"../utils/common\": 41 }], 51: [function(t, n, i) {\n n.exports = { 2: \"need dictionary\", 1: \"stream end\", 0: \"\", \"-1\": \"file error\", \"-2\": \"stream error\", \"-3\": \"data error\", \"-4\": \"insufficient memory\", \"-5\": \"buffer error\", \"-6\": \"incompatible version\" };\n }, {}], 52: [function(t, n, i) {\n var s = t(\"../utils/common\"), r = 0, a = 1;\n function l(k) {\n for (var B = k.length; 0 <= --B; ) k[B] = 0;\n }\n var h = 0, c = 29, u = 256, m = u + 1 + c, f = 30, d = 19, p = 2 * m + 1, g = 15, y = 16, w = 7, x = 256, _ = 16, b = 17, E = 18, A = [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], P = [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], C = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], D = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], I = new Array(2 * (m + 2));\n l(I);\n var T = new Array(2 * f);\n l(T);\n var R = new Array(512);\n l(R);\n var v = new Array(256);\n l(v);\n var z = new Array(c);\n l(z);\n var H, V, te, G = new Array(f);\n function $(k, B, X, Z, F) {\n this.static_tree = k, this.extra_bits = B, this.extra_base = X, this.elems = Z, this.max_length = F, this.has_stree = k && k.length;\n }\n function N(k, B) {\n this.dyn_tree = k, this.max_code = 0, this.stat_desc = B;\n }\n function O(k) {\n return k < 256 ? R[k] : R[256 + (k >>> 7)];\n }\n function Q(k, B) {\n k.pending_buf[k.pending++] = 255 & B, k.pending_buf[k.pending++] = B >>> 8 & 255;\n }\n function ee(k, B, X) {\n k.bi_valid > y - X ? (k.bi_buf |= B << k.bi_valid & 65535, Q(k, k.bi_buf), k.bi_buf = B >> y - k.bi_valid, k.bi_valid += X - y) : (k.bi_buf |= B << k.bi_valid & 65535, k.bi_valid += X);\n }\n function q(k, B, X) {\n ee(k, X[2 * B], X[2 * B + 1]);\n }\n function de(k, B) {\n for (var X = 0; X |= 1 & k, k >>>= 1, X <<= 1, 0 < --B; ) ;\n return X >>> 1;\n }\n function pe(k, B, X) {\n var Z, F, Y = new Array(g + 1), ne = 0;\n for (Z = 1; Z <= g; Z++) Y[Z] = ne = ne + X[Z - 1] << 1;\n for (F = 0; F <= B; F++) {\n var J = k[2 * F + 1];\n J !== 0 && (k[2 * F] = de(Y[J]++, J));\n }\n }\n function se(k) {\n var B;\n for (B = 0; B < m; B++) k.dyn_ltree[2 * B] = 0;\n for (B = 0; B < f; B++) k.dyn_dtree[2 * B] = 0;\n for (B = 0; B < d; B++) k.bl_tree[2 * B] = 0;\n k.dyn_ltree[2 * x] = 1, k.opt_len = k.static_len = 0, k.last_lit = k.matches = 0;\n }\n function oe(k) {\n 8 < k.bi_valid ? Q(k, k.bi_buf) : 0 < k.bi_valid && (k.pending_buf[k.pending++] = k.bi_buf), k.bi_buf = 0, k.bi_valid = 0;\n }\n function he(k, B, X, Z) {\n var F = 2 * B, Y = 2 * X;\n return k[F] < k[Y] || k[F] === k[Y] && Z[B] <= Z[X];\n }\n function me(k, B, X) {\n for (var Z = k.heap[X], F = X << 1; F <= k.heap_len && (F < k.heap_len && he(B, k.heap[F + 1], k.heap[F], k.depth) && F++, !he(B, Z, k.heap[F], k.depth)); ) k.heap[X] = k.heap[F], X = F, F <<= 1;\n k.heap[X] = Z;\n }\n function Te(k, B, X) {\n var Z, F, Y, ne, J = 0;\n if (k.last_lit !== 0) for (; Z = k.pending_buf[k.d_buf + 2 * J] << 8 | k.pending_buf[k.d_buf + 2 * J + 1], F = k.pending_buf[k.l_buf + J], J++, Z === 0 ? q(k, F, B) : (q(k, (Y = v[F]) + u + 1, B), (ne = A[Y]) !== 0 && ee(k, F -= z[Y], ne), q(k, Y = O(--Z), X), (ne = P[Y]) !== 0 && ee(k, Z -= G[Y], ne)), J < k.last_lit; ) ;\n q(k, x, B);\n }\n function Ie(k, B) {\n var X, Z, F, Y = B.dyn_tree, ne = B.stat_desc.static_tree, J = B.stat_desc.has_stree, ie = B.stat_desc.elems, ce = -1;\n for (k.heap_len = 0, k.heap_max = p, X = 0; X < ie; X++) Y[2 * X] !== 0 ? (k.heap[++k.heap_len] = ce = X, k.depth[X] = 0) : Y[2 * X + 1] = 0;\n for (; k.heap_len < 2; ) Y[2 * (F = k.heap[++k.heap_len] = ce < 2 ? ++ce : 0)] = 1, k.depth[F] = 0, k.opt_len--, J && (k.static_len -= ne[2 * F + 1]);\n for (B.max_code = ce, X = k.heap_len >> 1; 1 <= X; X--) me(k, Y, X);\n for (F = ie; X = k.heap[1], k.heap[1] = k.heap[k.heap_len--], me(k, Y, 1), Z = k.heap[1], k.heap[--k.heap_max] = X, k.heap[--k.heap_max] = Z, Y[2 * F] = Y[2 * X] + Y[2 * Z], k.depth[F] = (k.depth[X] >= k.depth[Z] ? k.depth[X] : k.depth[Z]) + 1, Y[2 * X + 1] = Y[2 * Z + 1] = F, k.heap[1] = F++, me(k, Y, 1), 2 <= k.heap_len; ) ;\n k.heap[--k.heap_max] = k.heap[1], (function(ae, Ee) {\n var Je, De, Bt, ye, sn, Mn, Qe = Ee.dyn_tree, Tt = Ee.max_code, Nt = Ee.stat_desc.static_tree, Ft = Ee.stat_desc.has_stree, Ut = Ee.stat_desc.extra_bits, Et = Ee.stat_desc.extra_base, Sn = Ee.stat_desc.max_length, Zn = 0;\n for (ye = 0; ye <= g; ye++) ae.bl_count[ye] = 0;\n for (Qe[2 * ae.heap[ae.heap_max] + 1] = 0, Je = ae.heap_max + 1; Je < p; Je++) Sn < (ye = Qe[2 * Qe[2 * (De = ae.heap[Je]) + 1] + 1] + 1) && (ye = Sn, Zn++), Qe[2 * De + 1] = ye, Tt < De || (ae.bl_count[ye]++, sn = 0, Et <= De && (sn = Ut[De - Et]), Mn = Qe[2 * De], ae.opt_len += Mn * (ye + sn), Ft && (ae.static_len += Mn * (Nt[2 * De + 1] + sn)));\n if (Zn !== 0) {\n do {\n for (ye = Sn - 1; ae.bl_count[ye] === 0; ) ye--;\n ae.bl_count[ye]--, ae.bl_count[ye + 1] += 2, ae.bl_count[Sn]--, Zn -= 2;\n } while (0 < Zn);\n for (ye = Sn; ye !== 0; ye--) for (De = ae.bl_count[ye]; De !== 0; ) Tt < (Bt = ae.heap[--Je]) || (Qe[2 * Bt + 1] !== ye && (ae.opt_len += (ye - Qe[2 * Bt + 1]) * Qe[2 * Bt], Qe[2 * Bt + 1] = ye), De--);\n }\n })(k, B), pe(Y, ce, k.bl_count);\n }\n function S(k, B, X) {\n var Z, F, Y = -1, ne = B[1], J = 0, ie = 7, ce = 4;\n for (ne === 0 && (ie = 138, ce = 3), B[2 * (X + 1) + 1] = 65535, Z = 0; Z <= X; Z++) F = ne, ne = B[2 * (Z + 1) + 1], ++J < ie && F === ne || (J < ce ? k.bl_tree[2 * F] += J : F !== 0 ? (F !== Y && k.bl_tree[2 * F]++, k.bl_tree[2 * _]++) : J <= 10 ? k.bl_tree[2 * b]++ : k.bl_tree[2 * E]++, Y = F, ce = (J = 0) === ne ? (ie = 138, 3) : F === ne ? (ie = 6, 3) : (ie = 7, 4));\n }\n function W(k, B, X) {\n var Z, F, Y = -1, ne = B[1], J = 0, ie = 7, ce = 4;\n for (ne === 0 && (ie = 138, ce = 3), Z = 0; Z <= X; Z++) if (F = ne, ne = B[2 * (Z + 1) + 1], !(++J < ie && F === ne)) {\n if (J < ce) for (; q(k, F, k.bl_tree), --J != 0; ) ;\n else F !== 0 ? (F !== Y && (q(k, F, k.bl_tree), J--), q(k, _, k.bl_tree), ee(k, J - 3, 2)) : J <= 10 ? (q(k, b, k.bl_tree), ee(k, J - 3, 3)) : (q(k, E, k.bl_tree), ee(k, J - 11, 7));\n Y = F, ce = (J = 0) === ne ? (ie = 138, 3) : F === ne ? (ie = 6, 3) : (ie = 7, 4);\n }\n }\n l(G);\n var j = !1;\n function L(k, B, X, Z) {\n ee(k, (h << 1) + (Z ? 1 : 0), 3), (function(F, Y, ne, J) {\n oe(F), Q(F, ne), Q(F, ~ne), s.arraySet(F.pending_buf, F.window, Y, ne, F.pending), F.pending += ne;\n })(k, B, X);\n }\n i._tr_init = function(k) {\n j || ((function() {\n var B, X, Z, F, Y, ne = new Array(g + 1);\n for (F = Z = 0; F < c - 1; F++) for (z[F] = Z, B = 0; B < 1 << A[F]; B++) v[Z++] = F;\n for (v[Z - 1] = F, F = Y = 0; F < 16; F++) for (G[F] = Y, B = 0; B < 1 << P[F]; B++) R[Y++] = F;\n for (Y >>= 7; F < f; F++) for (G[F] = Y << 7, B = 0; B < 1 << P[F] - 7; B++) R[256 + Y++] = F;\n for (X = 0; X <= g; X++) ne[X] = 0;\n for (B = 0; B <= 143; ) I[2 * B + 1] = 8, B++, ne[8]++;\n for (; B <= 255; ) I[2 * B + 1] = 9, B++, ne[9]++;\n for (; B <= 279; ) I[2 * B + 1] = 7, B++, ne[7]++;\n for (; B <= 287; ) I[2 * B + 1] = 8, B++, ne[8]++;\n for (pe(I, m + 1, ne), B = 0; B < f; B++) T[2 * B + 1] = 5, T[2 * B] = de(B, 5);\n H = new $(I, A, u + 1, m, g), V = new $(T, P, 0, f, g), te = new $(new Array(0), C, 0, d, w);\n })(), j = !0), k.l_desc = new N(k.dyn_ltree, H), k.d_desc = new N(k.dyn_dtree, V), k.bl_desc = new N(k.bl_tree, te), k.bi_buf = 0, k.bi_valid = 0, se(k);\n }, i._tr_stored_block = L, i._tr_flush_block = function(k, B, X, Z) {\n var F, Y, ne = 0;\n 0 < k.level ? (k.strm.data_type === 2 && (k.strm.data_type = (function(J) {\n var ie, ce = 4093624447;\n for (ie = 0; ie <= 31; ie++, ce >>>= 1) if (1 & ce && J.dyn_ltree[2 * ie] !== 0) return r;\n if (J.dyn_ltree[18] !== 0 || J.dyn_ltree[20] !== 0 || J.dyn_ltree[26] !== 0) return a;\n for (ie = 32; ie < u; ie++) if (J.dyn_ltree[2 * ie] !== 0) return a;\n return r;\n })(k)), Ie(k, k.l_desc), Ie(k, k.d_desc), ne = (function(J) {\n var ie;\n for (S(J, J.dyn_ltree, J.l_desc.max_code), S(J, J.dyn_dtree, J.d_desc.max_code), Ie(J, J.bl_desc), ie = d - 1; 3 <= ie && J.bl_tree[2 * D[ie] + 1] === 0; ie--) ;\n return J.opt_len += 3 * (ie + 1) + 5 + 5 + 4, ie;\n })(k), F = k.opt_len + 3 + 7 >>> 3, (Y = k.static_len + 3 + 7 >>> 3) <= F && (F = Y)) : F = Y = X + 5, X + 4 <= F && B !== -1 ? L(k, B, X, Z) : k.strategy === 4 || Y === F ? (ee(k, 2 + (Z ? 1 : 0), 3), Te(k, I, T)) : (ee(k, 4 + (Z ? 1 : 0), 3), (function(J, ie, ce, ae) {\n var Ee;\n for (ee(J, ie - 257, 5), ee(J, ce - 1, 5), ee(J, ae - 4, 4), Ee = 0; Ee < ae; Ee++) ee(J, J.bl_tree[2 * D[Ee] + 1], 3);\n W(J, J.dyn_ltree, ie - 1), W(J, J.dyn_dtree, ce - 1);\n })(k, k.l_desc.max_code + 1, k.d_desc.max_code + 1, ne + 1), Te(k, k.dyn_ltree, k.dyn_dtree)), se(k), Z && oe(k);\n }, i._tr_tally = function(k, B, X) {\n return k.pending_buf[k.d_buf + 2 * k.last_lit] = B >>> 8 & 255, k.pending_buf[k.d_buf + 2 * k.last_lit + 1] = 255 & B, k.pending_buf[k.l_buf + k.last_lit] = 255 & X, k.last_lit++, B === 0 ? k.dyn_ltree[2 * X]++ : (k.matches++, B--, k.dyn_ltree[2 * (v[X] + u + 1)]++, k.dyn_dtree[2 * O(B)]++), k.last_lit === k.lit_bufsize - 1;\n }, i._tr_align = function(k) {\n ee(k, 2, 3), q(k, x, I), (function(B) {\n B.bi_valid === 16 ? (Q(B, B.bi_buf), B.bi_buf = 0, B.bi_valid = 0) : 8 <= B.bi_valid && (B.pending_buf[B.pending++] = 255 & B.bi_buf, B.bi_buf >>= 8, B.bi_valid -= 8);\n })(k);\n };\n }, { \"../utils/common\": 41 }], 53: [function(t, n, i) {\n n.exports = function() {\n this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = \"\", this.state = null, this.data_type = 2, this.adler = 0;\n };\n }, {}], 54: [function(t, n, i) {\n (function(s) {\n (function(r, a) {\n if (!r.setImmediate) {\n var l, h, c, u, m = 1, f = {}, d = !1, p = r.document, g = Object.getPrototypeOf && Object.getPrototypeOf(r);\n g = g && g.setTimeout ? g : r, l = {}.toString.call(r.process) === \"[object process]\" ? function(_) {\n process.nextTick(function() {\n w(_);\n });\n } : (function() {\n if (r.postMessage && !r.importScripts) {\n var _ = !0, b = r.onmessage;\n return r.onmessage = function() {\n _ = !1;\n }, r.postMessage(\"\", \"*\"), r.onmessage = b, _;\n }\n })() ? (u = \"setImmediate$\" + Math.random() + \"$\", r.addEventListener ? r.addEventListener(\"message\", x, !1) : r.attachEvent(\"onmessage\", x), function(_) {\n r.postMessage(u + _, \"*\");\n }) : r.MessageChannel ? ((c = new MessageChannel()).port1.onmessage = function(_) {\n w(_.data);\n }, function(_) {\n c.port2.postMessage(_);\n }) : p && \"onreadystatechange\" in p.createElement(\"script\") ? (h = p.documentElement, function(_) {\n var b = p.createElement(\"script\");\n b.onreadystatechange = function() {\n w(_), b.onreadystatechange = null, h.removeChild(b), b = null;\n }, h.appendChild(b);\n }) : function(_) {\n setTimeout(w, 0, _);\n }, g.setImmediate = function(_) {\n typeof _ != \"function\" && (_ = new Function(\"\" + _));\n for (var b = new Array(arguments.length - 1), E = 0; E < b.length; E++) b[E] = arguments[E + 1];\n var A = { callback: _, args: b };\n return f[m] = A, l(m), m++;\n }, g.clearImmediate = y;\n }\n function y(_) {\n delete f[_];\n }\n function w(_) {\n if (d) setTimeout(w, 0, _);\n else {\n var b = f[_];\n if (b) {\n d = !0;\n try {\n (function(E) {\n var A = E.callback, P = E.args;\n switch (P.length) {\n case 0:\n A();\n break;\n case 1:\n A(P[0]);\n break;\n case 2:\n A(P[0], P[1]);\n break;\n case 3:\n A(P[0], P[1], P[2]);\n break;\n default:\n A.apply(a, P);\n }\n })(b);\n } finally {\n y(_), d = !1;\n }\n }\n }\n }\n function x(_) {\n _.source === r && typeof _.data == \"string\" && _.data.indexOf(u) === 0 && w(+_.data.slice(u.length));\n }\n })(typeof self > \"u\" ? s === void 0 ? this : s : self);\n }).call(this, typeof ii < \"u\" ? ii : typeof self < \"u\" ? self : typeof window < \"u\" ? window : {});\n }, {}] }, {}, [10])(10);\n });\n })(os)), os.exports;\n}\nvar xc = wc();\nconst oa = /* @__PURE__ */ ra(xc);\nfunction aa(o, e) {\n return function() {\n return o.apply(e, arguments);\n };\n}\nconst { toString: _c } = Object.prototype, { getPrototypeOf: ur } = Object, { iterator: Ki, toStringTag: la } = Symbol, $i = /* @__PURE__ */ ((o) => (e) => {\n const t = _c.call(e);\n return o[t] || (o[t] = t.slice(8, -1).toLowerCase());\n})(/* @__PURE__ */ Object.create(null)), at = (o) => (o = o.toLowerCase(), (e) => $i(e) === o), Ji = (o) => (e) => typeof e === o, { isArray: vn } = Array, _n = Ji(\"undefined\");\nfunction jn(o) {\n return o !== null && !_n(o) && o.constructor !== null && !_n(o.constructor) && Ve(o.constructor.isBuffer) && o.constructor.isBuffer(o);\n}\nconst ca = at(\"ArrayBuffer\");\nfunction vc(o) {\n let e;\n return typeof ArrayBuffer < \"u\" && ArrayBuffer.isView ? e = ArrayBuffer.isView(o) : e = o && o.buffer && ca(o.buffer), e;\n}\nconst bc = Ji(\"string\"), Ve = Ji(\"function\"), ha = Ji(\"number\"), Gn = (o) => o !== null && typeof o == \"object\", Mc = (o) => o === !0 || o === !1, Ri = (o) => {\n if ($i(o) !== \"object\")\n return !1;\n const e = ur(o);\n return (e === null || e === Object.prototype || Object.getPrototypeOf(e) === null) && !(la in o) && !(Ki in o);\n}, Sc = (o) => {\n if (!Gn(o) || jn(o))\n return !1;\n try {\n return Object.keys(o).length === 0 && Object.getPrototypeOf(o) === Object.prototype;\n } catch {\n return !1;\n }\n}, Tc = at(\"Date\"), Ec = at(\"File\"), Ac = at(\"Blob\"), Cc = at(\"FileList\"), Pc = (o) => Gn(o) && Ve(o.pipe), Rc = (o) => {\n let e;\n return o && (typeof FormData == \"function\" && o instanceof FormData || Ve(o.append) && ((e = $i(o)) === \"formdata\" || // detect form-data instance\n e === \"object\" && Ve(o.toString) && o.toString() === \"[object FormData]\"));\n}, Dc = at(\"URLSearchParams\"), [kc, Ic, Lc, zc] = [\"ReadableStream\", \"Request\", \"Response\", \"Headers\"].map(at), Oc = (o) => o.trim ? o.trim() : o.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\");\nfunction Wn(o, e, { allOwnKeys: t = !1 } = {}) {\n if (o === null || typeof o > \"u\")\n return;\n let n, i;\n if (typeof o != \"object\" && (o = [o]), vn(o))\n for (n = 0, i = o.length; n < i; n++)\n e.call(null, o[n], n, o);\n else {\n if (jn(o))\n return;\n const s = t ? Object.getOwnPropertyNames(o) : Object.keys(o), r = s.length;\n let a;\n for (n = 0; n < r; n++)\n a = s[n], e.call(null, o[a], a, o);\n }\n}\nfunction ua(o, e) {\n if (jn(o))\n return null;\n e = e.toLowerCase();\n const t = Object.keys(o);\n let n = t.length, i;\n for (; n-- > 0; )\n if (i = t[n], e === i.toLowerCase())\n return i;\n return null;\n}\nconst Yt = typeof globalThis < \"u\" ? globalThis : typeof self < \"u\" ? self : typeof window < \"u\" ? window : global, da = (o) => !_n(o) && o !== Yt;\nfunction Vs() {\n const { caseless: o, skipUndefined: e } = da(this) && this || {}, t = {}, n = (i, s) => {\n const r = o && ua(t, s) || s;\n Ri(t[r]) && Ri(i) ? t[r] = Vs(t[r], i) : Ri(i) ? t[r] = Vs({}, i) : vn(i) ? t[r] = i.slice() : (!e || !_n(i)) && (t[r] = i);\n };\n for (let i = 0, s = arguments.length; i < s; i++)\n arguments[i] && Wn(arguments[i], n);\n return t;\n}\nconst Bc = (o, e, t, { allOwnKeys: n } = {}) => (Wn(e, (i, s) => {\n t && Ve(i) ? o[s] = aa(i, t) : o[s] = i;\n}, { allOwnKeys: n }), o), Nc = (o) => (o.charCodeAt(0) === 65279 && (o = o.slice(1)), o), Fc = (o, e, t, n) => {\n o.prototype = Object.create(e.prototype, n), o.prototype.constructor = o, Object.defineProperty(o, \"super\", {\n value: e.prototype\n }), t && Object.assign(o.prototype, t);\n}, Uc = (o, e, t, n) => {\n let i, s, r;\n const a = {};\n if (e = e || {}, o == null) return e;\n do {\n for (i = Object.getOwnPropertyNames(o), s = i.length; s-- > 0; )\n r = i[s], (!n || n(r, o, e)) && !a[r] && (e[r] = o[r], a[r] = !0);\n o = t !== !1 && ur(o);\n } while (o && (!t || t(o, e)) && o !== Object.prototype);\n return e;\n}, Vc = (o, e, t) => {\n o = String(o), (t === void 0 || t > o.length) && (t = o.length), t -= e.length;\n const n = o.indexOf(e, t);\n return n !== -1 && n === t;\n}, Hc = (o) => {\n if (!o) return null;\n if (vn(o)) return o;\n let e = o.length;\n if (!ha(e)) return null;\n const t = new Array(e);\n for (; e-- > 0; )\n t[e] = o[e];\n return t;\n}, jc = /* @__PURE__ */ ((o) => (e) => o && e instanceof o)(typeof Uint8Array < \"u\" && ur(Uint8Array)), Gc = (o, e) => {\n const n = (o && o[Ki]).call(o);\n let i;\n for (; (i = n.next()) && !i.done; ) {\n const s = i.value;\n e.call(o, s[0], s[1]);\n }\n}, Wc = (o, e) => {\n let t;\n const n = [];\n for (; (t = o.exec(e)) !== null; )\n n.push(t);\n return n;\n}, Xc = at(\"HTMLFormElement\"), Zc = (o) => o.toLowerCase().replace(\n /[-_\\s]([a-z\\d])(\\w*)/g,\n function(t, n, i) {\n return n.toUpperCase() + i;\n }\n), kr = (({ hasOwnProperty: o }) => (e, t) => o.call(e, t))(Object.prototype), qc = at(\"RegExp\"), fa = (o, e) => {\n const t = Object.getOwnPropertyDescriptors(o), n = {};\n Wn(t, (i, s) => {\n let r;\n (r = e(i, s, o)) !== !1 && (n[s] = r || i);\n }), Object.defineProperties(o, n);\n}, Yc = (o) => {\n fa(o, (e, t) => {\n if (Ve(o) && [\"arguments\", \"caller\", \"callee\"].indexOf(t) !== -1)\n return !1;\n const n = o[t];\n if (Ve(n)) {\n if (e.enumerable = !1, \"writable\" in e) {\n e.writable = !1;\n return;\n }\n e.set || (e.set = () => {\n throw Error(\"Can not rewrite read-only method '\" + t + \"'\");\n });\n }\n });\n}, Kc = (o, e) => {\n const t = {}, n = (i) => {\n i.forEach((s) => {\n t[s] = !0;\n });\n };\n return vn(o) ? n(o) : n(String(o).split(e)), t;\n}, $c = () => {\n}, Jc = (o, e) => o != null && Number.isFinite(o = +o) ? o : e;\nfunction Qc(o) {\n return !!(o && Ve(o.append) && o[la] === \"FormData\" && o[Ki]);\n}\nconst eh = (o) => {\n const e = new Array(10), t = (n, i) => {\n if (Gn(n)) {\n if (e.indexOf(n) >= 0)\n return;\n if (jn(n))\n return n;\n if (!(\"toJSON\" in n)) {\n e[i] = n;\n const s = vn(n) ? [] : {};\n return Wn(n, (r, a) => {\n const l = t(r, i + 1);\n !_n(l) && (s[a] = l);\n }), e[i] = void 0, s;\n }\n }\n return n;\n };\n return t(o, 0);\n}, th = at(\"AsyncFunction\"), nh = (o) => o && (Gn(o) || Ve(o)) && Ve(o.then) && Ve(o.catch), pa = ((o, e) => o ? setImmediate : e ? ((t, n) => (Yt.addEventListener(\"message\", ({ source: i, data: s }) => {\n i === Yt && s === t && n.length && n.shift()();\n}, !1), (i) => {\n n.push(i), Yt.postMessage(t, \"*\");\n}))(`axios@${Math.random()}`, []) : (t) => setTimeout(t))(\n typeof setImmediate == \"function\",\n Ve(Yt.postMessage)\n), ih = typeof queueMicrotask < \"u\" ? queueMicrotask.bind(Yt) : typeof process < \"u\" && process.nextTick || pa, sh = (o) => o != null && Ve(o[Ki]), U = {\n isArray: vn,\n isArrayBuffer: ca,\n isBuffer: jn,\n isFormData: Rc,\n isArrayBufferView: vc,\n isString: bc,\n isNumber: ha,\n isBoolean: Mc,\n isObject: Gn,\n isPlainObject: Ri,\n isEmptyObject: Sc,\n isReadableStream: kc,\n isRequest: Ic,\n isResponse: Lc,\n isHeaders: zc,\n isUndefined: _n,\n isDate: Tc,\n isFile: Ec,\n isBlob: Ac,\n isRegExp: qc,\n isFunction: Ve,\n isStream: Pc,\n isURLSearchParams: Dc,\n isTypedArray: jc,\n isFileList: Cc,\n forEach: Wn,\n merge: Vs,\n extend: Bc,\n trim: Oc,\n stripBOM: Nc,\n inherits: Fc,\n toFlatObject: Uc,\n kindOf: $i,\n kindOfTest: at,\n endsWith: Vc,\n toArray: Hc,\n forEachEntry: Gc,\n matchAll: Wc,\n isHTMLForm: Xc,\n hasOwnProperty: kr,\n hasOwnProp: kr,\n // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors: fa,\n freezeMethods: Yc,\n toObjectSet: Kc,\n toCamelCase: Zc,\n noop: $c,\n toFiniteNumber: Jc,\n findKey: ua,\n global: Yt,\n isContextDefined: da,\n isSpecCompliantForm: Qc,\n toJSONObject: eh,\n isAsyncFn: th,\n isThenable: nh,\n setImmediate: pa,\n asap: ih,\n isIterable: sh\n};\nfunction re(o, e, t, n, i) {\n Error.call(this), Error.captureStackTrace ? Error.captureStackTrace(this, this.constructor) : this.stack = new Error().stack, this.message = o, this.name = \"AxiosError\", e && (this.code = e), t && (this.config = t), n && (this.request = n), i && (this.response = i, this.status = i.status ? i.status : null);\n}\nU.inherits(re, Error, {\n toJSON: function() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: U.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\nconst ma = re.prototype, ga = {};\n[\n \"ERR_BAD_OPTION_VALUE\",\n \"ERR_BAD_OPTION\",\n \"ECONNABORTED\",\n \"ETIMEDOUT\",\n \"ERR_NETWORK\",\n \"ERR_FR_TOO_MANY_REDIRECTS\",\n \"ERR_DEPRECATED\",\n \"ERR_BAD_RESPONSE\",\n \"ERR_BAD_REQUEST\",\n \"ERR_CANCELED\",\n \"ERR_NOT_SUPPORT\",\n \"ERR_INVALID_URL\"\n // eslint-disable-next-line func-names\n].forEach((o) => {\n ga[o] = { value: o };\n});\nObject.defineProperties(re, ga);\nObject.defineProperty(ma, \"isAxiosError\", { value: !0 });\nre.from = (o, e, t, n, i, s) => {\n const r = Object.create(ma);\n U.toFlatObject(o, r, function(c) {\n return c !== Error.prototype;\n }, (h) => h !== \"isAxiosError\");\n const a = o && o.message ? o.message : \"Error\", l = e == null && o ? o.code : e;\n return re.call(r, a, l, t, n, i), o && r.cause == null && Object.defineProperty(r, \"cause\", { value: o, configurable: !0 }), r.name = o && o.name || \"Error\", s && Object.assign(r, s), r;\n};\nconst rh = null;\nfunction Hs(o) {\n return U.isPlainObject(o) || U.isArray(o);\n}\nfunction ya(o) {\n return U.endsWith(o, \"[]\") ? o.slice(0, -2) : o;\n}\nfunction Ir(o, e, t) {\n return o ? o.concat(e).map(function(i, s) {\n return i = ya(i), !t && s ? \"[\" + i + \"]\" : i;\n }).join(t ? \".\" : \"\") : e;\n}\nfunction oh(o) {\n return U.isArray(o) && !o.some(Hs);\n}\nconst ah = U.toFlatObject(U, {}, null, function(e) {\n return /^is[A-Z]/.test(e);\n});\nfunction Qi(o, e, t) {\n if (!U.isObject(o))\n throw new TypeError(\"target must be an object\");\n e = e || new FormData(), t = U.toFlatObject(t, {\n metaTokens: !0,\n dots: !1,\n indexes: !1\n }, !1, function(p, g) {\n return !U.isUndefined(g[p]);\n });\n const n = t.metaTokens, i = t.visitor || c, s = t.dots, r = t.indexes, l = (t.Blob || typeof Blob < \"u\" && Blob) && U.isSpecCompliantForm(e);\n if (!U.isFunction(i))\n throw new TypeError(\"visitor must be a function\");\n function h(d) {\n if (d === null) return \"\";\n if (U.isDate(d))\n return d.toISOString();\n if (U.isBoolean(d))\n return d.toString();\n if (!l && U.isBlob(d))\n throw new re(\"Blob is not supported. Use a Buffer instead.\");\n return U.isArrayBuffer(d) || U.isTypedArray(d) ? l && typeof Blob == \"function\" ? new Blob([d]) : Buffer.from(d) : d;\n }\n function c(d, p, g) {\n let y = d;\n if (d && !g && typeof d == \"object\") {\n if (U.endsWith(p, \"{}\"))\n p = n ? p : p.slice(0, -2), d = JSON.stringify(d);\n else if (U.isArray(d) && oh(d) || (U.isFileList(d) || U.endsWith(p, \"[]\")) && (y = U.toArray(d)))\n return p = ya(p), y.forEach(function(x, _) {\n !(U.isUndefined(x) || x === null) && e.append(\n // eslint-disable-next-line no-nested-ternary\n r === !0 ? Ir([p], _, s) : r === null ? p : p + \"[]\",\n h(x)\n );\n }), !1;\n }\n return Hs(d) ? !0 : (e.append(Ir(g, p, s), h(d)), !1);\n }\n const u = [], m = Object.assign(ah, {\n defaultVisitor: c,\n convertValue: h,\n isVisitable: Hs\n });\n function f(d, p) {\n if (!U.isUndefined(d)) {\n if (u.indexOf(d) !== -1)\n throw Error(\"Circular reference detected in \" + p.join(\".\"));\n u.push(d), U.forEach(d, function(y, w) {\n (!(U.isUndefined(y) || y === null) && i.call(\n e,\n y,\n U.isString(w) ? w.trim() : w,\n p,\n m\n )) === !0 && f(y, p ? p.concat(w) : [w]);\n }), u.pop();\n }\n }\n if (!U.isObject(o))\n throw new TypeError(\"data must be an object\");\n return f(o), e;\n}\nfunction Lr(o) {\n const e = {\n \"!\": \"%21\",\n \"'\": \"%27\",\n \"(\": \"%28\",\n \")\": \"%29\",\n \"~\": \"%7E\",\n \"%20\": \"+\",\n \"%00\": \"\\0\"\n };\n return encodeURIComponent(o).replace(/[!'()~]|%20|%00/g, function(n) {\n return e[n];\n });\n}\nfunction dr(o, e) {\n this._pairs = [], o && Qi(o, this, e);\n}\nconst wa = dr.prototype;\nwa.append = function(e, t) {\n this._pairs.push([e, t]);\n};\nwa.toString = function(e) {\n const t = e ? function(n) {\n return e.call(this, n, Lr);\n } : Lr;\n return this._pairs.map(function(i) {\n return t(i[0]) + \"=\" + t(i[1]);\n }, \"\").join(\"&\");\n};\nfunction lh(o) {\n return encodeURIComponent(o).replace(/%3A/gi, \":\").replace(/%24/g, \"$\").replace(/%2C/gi, \",\").replace(/%20/g, \"+\");\n}\nfunction xa(o, e, t) {\n if (!e)\n return o;\n const n = t && t.encode || lh;\n U.isFunction(t) && (t = {\n serialize: t\n });\n const i = t && t.serialize;\n let s;\n if (i ? s = i(e, t) : s = U.isURLSearchParams(e) ? e.toString() : new dr(e, t).toString(n), s) {\n const r = o.indexOf(\"#\");\n r !== -1 && (o = o.slice(0, r)), o += (o.indexOf(\"?\") === -1 ? \"?\" : \"&\") + s;\n }\n return o;\n}\nclass zr {\n constructor() {\n this.handlers = [];\n }\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(e, t, n) {\n return this.handlers.push({\n fulfilled: e,\n rejected: t,\n synchronous: n ? n.synchronous : !1,\n runWhen: n ? n.runWhen : null\n }), this.handlers.length - 1;\n }\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {void}\n */\n eject(e) {\n this.handlers[e] && (this.handlers[e] = null);\n }\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n this.handlers && (this.handlers = []);\n }\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(e) {\n U.forEach(this.handlers, function(n) {\n n !== null && e(n);\n });\n }\n}\nconst _a = {\n silentJSONParsing: !0,\n forcedJSONParsing: !0,\n clarifyTimeoutError: !1\n}, ch = typeof URLSearchParams < \"u\" ? URLSearchParams : dr, hh = typeof FormData < \"u\" ? FormData : null, uh = typeof Blob < \"u\" ? Blob : null, dh = {\n isBrowser: !0,\n classes: {\n URLSearchParams: ch,\n FormData: hh,\n Blob: uh\n },\n protocols: [\"http\", \"https\", \"file\", \"blob\", \"url\", \"data\"]\n}, fr = typeof window < \"u\" && typeof document < \"u\", js = typeof navigator == \"object\" && navigator || void 0, fh = fr && (!js || [\"ReactNative\", \"NativeScript\", \"NS\"].indexOf(js.product) < 0), ph = typeof WorkerGlobalScope < \"u\" && // eslint-disable-next-line no-undef\nself instanceof WorkerGlobalScope && typeof self.importScripts == \"function\", mh = fr && window.location.href || \"http://localhost\", gh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n hasBrowserEnv: fr,\n hasStandardBrowserEnv: fh,\n hasStandardBrowserWebWorkerEnv: ph,\n navigator: js,\n origin: mh\n}, Symbol.toStringTag, { value: \"Module\" })), ke = {\n ...gh,\n ...dh\n};\nfunction yh(o, e) {\n return Qi(o, new ke.classes.URLSearchParams(), {\n visitor: function(t, n, i, s) {\n return ke.isNode && U.isBuffer(t) ? (this.append(n, t.toString(\"base64\")), !1) : s.defaultVisitor.apply(this, arguments);\n },\n ...e\n });\n}\nfunction wh(o) {\n return U.matchAll(/\\w+|\\[(\\w*)]/g, o).map((e) => e[0] === \"[]\" ? \"\" : e[1] || e[0]);\n}\nfunction xh(o) {\n const e = {}, t = Object.keys(o);\n let n;\n const i = t.length;\n let s;\n for (n = 0; n < i; n++)\n s = t[n], e[s] = o[s];\n return e;\n}\nfunction va(o) {\n function e(t, n, i, s) {\n let r = t[s++];\n if (r === \"__proto__\") return !0;\n const a = Number.isFinite(+r), l = s >= t.length;\n return r = !r && U.isArray(i) ? i.length : r, l ? (U.hasOwnProp(i, r) ? i[r] = [i[r], n] : i[r] = n, !a) : ((!i[r] || !U.isObject(i[r])) && (i[r] = []), e(t, n, i[r], s) && U.isArray(i[r]) && (i[r] = xh(i[r])), !a);\n }\n if (U.isFormData(o) && U.isFunction(o.entries)) {\n const t = {};\n return U.forEachEntry(o, (n, i) => {\n e(wh(n), i, t, 0);\n }), t;\n }\n return null;\n}\nfunction _h(o, e, t) {\n if (U.isString(o))\n try {\n return (e || JSON.parse)(o), U.trim(o);\n } catch (n) {\n if (n.name !== \"SyntaxError\")\n throw n;\n }\n return (t || JSON.stringify)(o);\n}\nconst Xn = {\n transitional: _a,\n adapter: [\"xhr\", \"http\", \"fetch\"],\n transformRequest: [function(e, t) {\n const n = t.getContentType() || \"\", i = n.indexOf(\"application/json\") > -1, s = U.isObject(e);\n if (s && U.isHTMLForm(e) && (e = new FormData(e)), U.isFormData(e))\n return i ? JSON.stringify(va(e)) : e;\n if (U.isArrayBuffer(e) || U.isBuffer(e) || U.isStream(e) || U.isFile(e) || U.isBlob(e) || U.isReadableStream(e))\n return e;\n if (U.isArrayBufferView(e))\n return e.buffer;\n if (U.isURLSearchParams(e))\n return t.setContentType(\"application/x-www-form-urlencoded;charset=utf-8\", !1), e.toString();\n let a;\n if (s) {\n if (n.indexOf(\"application/x-www-form-urlencoded\") > -1)\n return yh(e, this.formSerializer).toString();\n if ((a = U.isFileList(e)) || n.indexOf(\"multipart/form-data\") > -1) {\n const l = this.env && this.env.FormData;\n return Qi(\n a ? { \"files[]\": e } : e,\n l && new l(),\n this.formSerializer\n );\n }\n }\n return s || i ? (t.setContentType(\"application/json\", !1), _h(e)) : e;\n }],\n transformResponse: [function(e) {\n const t = this.transitional || Xn.transitional, n = t && t.forcedJSONParsing, i = this.responseType === \"json\";\n if (U.isResponse(e) || U.isReadableStream(e))\n return e;\n if (e && U.isString(e) && (n && !this.responseType || i)) {\n const r = !(t && t.silentJSONParsing) && i;\n try {\n return JSON.parse(e, this.parseReviver);\n } catch (a) {\n if (r)\n throw a.name === \"SyntaxError\" ? re.from(a, re.ERR_BAD_RESPONSE, this, null, this.response) : a;\n }\n }\n return e;\n }],\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n xsrfCookieName: \"XSRF-TOKEN\",\n xsrfHeaderName: \"X-XSRF-TOKEN\",\n maxContentLength: -1,\n maxBodyLength: -1,\n env: {\n FormData: ke.classes.FormData,\n Blob: ke.classes.Blob\n },\n validateStatus: function(e) {\n return e >= 200 && e < 300;\n },\n headers: {\n common: {\n Accept: \"application/json, text/plain, */*\",\n \"Content-Type\": void 0\n }\n }\n};\nU.forEach([\"delete\", \"get\", \"head\", \"post\", \"put\", \"patch\"], (o) => {\n Xn.headers[o] = {};\n});\nconst vh = U.toObjectSet([\n \"age\",\n \"authorization\",\n \"content-length\",\n \"content-type\",\n \"etag\",\n \"expires\",\n \"from\",\n \"host\",\n \"if-modified-since\",\n \"if-unmodified-since\",\n \"last-modified\",\n \"location\",\n \"max-forwards\",\n \"proxy-authorization\",\n \"referer\",\n \"retry-after\",\n \"user-agent\"\n]), bh = (o) => {\n const e = {};\n let t, n, i;\n return o && o.split(`\n`).forEach(function(r) {\n i = r.indexOf(\":\"), t = r.substring(0, i).trim().toLowerCase(), n = r.substring(i + 1).trim(), !(!t || e[t] && vh[t]) && (t === \"set-cookie\" ? e[t] ? e[t].push(n) : e[t] = [n] : e[t] = e[t] ? e[t] + \", \" + n : n);\n }), e;\n}, Or = Symbol(\"internals\");\nfunction Tn(o) {\n return o && String(o).trim().toLowerCase();\n}\nfunction Di(o) {\n return o === !1 || o == null ? o : U.isArray(o) ? o.map(Di) : String(o);\n}\nfunction Mh(o) {\n const e = /* @__PURE__ */ Object.create(null), t = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let n;\n for (; n = t.exec(o); )\n e[n[1]] = n[2];\n return e;\n}\nconst Sh = (o) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(o.trim());\nfunction as(o, e, t, n, i) {\n if (U.isFunction(n))\n return n.call(this, e, t);\n if (i && (e = t), !!U.isString(e)) {\n if (U.isString(n))\n return e.indexOf(n) !== -1;\n if (U.isRegExp(n))\n return n.test(e);\n }\n}\nfunction Th(o) {\n return o.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g, (e, t, n) => t.toUpperCase() + n);\n}\nfunction Eh(o, e) {\n const t = U.toCamelCase(\" \" + e);\n [\"get\", \"set\", \"has\"].forEach((n) => {\n Object.defineProperty(o, n + t, {\n value: function(i, s, r) {\n return this[n].call(this, e, i, s, r);\n },\n configurable: !0\n });\n });\n}\nlet He = class {\n constructor(e) {\n e && this.set(e);\n }\n set(e, t, n) {\n const i = this;\n function s(a, l, h) {\n const c = Tn(l);\n if (!c)\n throw new Error(\"header name must be a non-empty string\");\n const u = U.findKey(i, c);\n (!u || i[u] === void 0 || h === !0 || h === void 0 && i[u] !== !1) && (i[u || l] = Di(a));\n }\n const r = (a, l) => U.forEach(a, (h, c) => s(h, c, l));\n if (U.isPlainObject(e) || e instanceof this.constructor)\n r(e, t);\n else if (U.isString(e) && (e = e.trim()) && !Sh(e))\n r(bh(e), t);\n else if (U.isObject(e) && U.isIterable(e)) {\n let a = {}, l, h;\n for (const c of e) {\n if (!U.isArray(c))\n throw TypeError(\"Object iterator must return a key-value pair\");\n a[h = c[0]] = (l = a[h]) ? U.isArray(l) ? [...l, c[1]] : [l, c[1]] : c[1];\n }\n r(a, t);\n } else\n e != null && s(t, e, n);\n return this;\n }\n get(e, t) {\n if (e = Tn(e), e) {\n const n = U.findKey(this, e);\n if (n) {\n const i = this[n];\n if (!t)\n return i;\n if (t === !0)\n return Mh(i);\n if (U.isFunction(t))\n return t.call(this, i, n);\n if (U.isRegExp(t))\n return t.exec(i);\n throw new TypeError(\"parser must be boolean|regexp|function\");\n }\n }\n }\n has(e, t) {\n if (e = Tn(e), e) {\n const n = U.findKey(this, e);\n return !!(n && this[n] !== void 0 && (!t || as(this, this[n], n, t)));\n }\n return !1;\n }\n delete(e, t) {\n const n = this;\n let i = !1;\n function s(r) {\n if (r = Tn(r), r) {\n const a = U.findKey(n, r);\n a && (!t || as(n, n[a], a, t)) && (delete n[a], i = !0);\n }\n }\n return U.isArray(e) ? e.forEach(s) : s(e), i;\n }\n clear(e) {\n const t = Object.keys(this);\n let n = t.length, i = !1;\n for (; n--; ) {\n const s = t[n];\n (!e || as(this, this[s], s, e, !0)) && (delete this[s], i = !0);\n }\n return i;\n }\n normalize(e) {\n const t = this, n = {};\n return U.forEach(this, (i, s) => {\n const r = U.findKey(n, s);\n if (r) {\n t[r] = Di(i), delete t[s];\n return;\n }\n const a = e ? Th(s) : String(s).trim();\n a !== s && delete t[s], t[a] = Di(i), n[a] = !0;\n }), this;\n }\n concat(...e) {\n return this.constructor.concat(this, ...e);\n }\n toJSON(e) {\n const t = /* @__PURE__ */ Object.create(null);\n return U.forEach(this, (n, i) => {\n n != null && n !== !1 && (t[i] = e && U.isArray(n) ? n.join(\", \") : n);\n }), t;\n }\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n toString() {\n return Object.entries(this.toJSON()).map(([e, t]) => e + \": \" + t).join(`\n`);\n }\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n get [Symbol.toStringTag]() {\n return \"AxiosHeaders\";\n }\n static from(e) {\n return e instanceof this ? e : new this(e);\n }\n static concat(e, ...t) {\n const n = new this(e);\n return t.forEach((i) => n.set(i)), n;\n }\n static accessor(e) {\n const n = (this[Or] = this[Or] = {\n accessors: {}\n }).accessors, i = this.prototype;\n function s(r) {\n const a = Tn(r);\n n[a] || (Eh(i, r), n[a] = !0);\n }\n return U.isArray(e) ? e.forEach(s) : s(e), this;\n }\n};\nHe.accessor([\"Content-Type\", \"Content-Length\", \"Accept\", \"Accept-Encoding\", \"User-Agent\", \"Authorization\"]);\nU.reduceDescriptors(He.prototype, ({ value: o }, e) => {\n let t = e[0].toUpperCase() + e.slice(1);\n return {\n get: () => o,\n set(n) {\n this[t] = n;\n }\n };\n});\nU.freezeMethods(He);\nfunction ls(o, e) {\n const t = this || Xn, n = e || t, i = He.from(n.headers);\n let s = n.data;\n return U.forEach(o, function(a) {\n s = a.call(t, s, i.normalize(), e ? e.status : void 0);\n }), i.normalize(), s;\n}\nfunction ba(o) {\n return !!(o && o.__CANCEL__);\n}\nfunction bn(o, e, t) {\n re.call(this, o ?? \"canceled\", re.ERR_CANCELED, e, t), this.name = \"CanceledError\";\n}\nU.inherits(bn, re, {\n __CANCEL__: !0\n});\nfunction Ma(o, e, t) {\n const n = t.config.validateStatus;\n !t.status || !n || n(t.status) ? o(t) : e(new re(\n \"Request failed with status code \" + t.status,\n [re.ERR_BAD_REQUEST, re.ERR_BAD_RESPONSE][Math.floor(t.status / 100) - 4],\n t.config,\n t.request,\n t\n ));\n}\nfunction Ah(o) {\n const e = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(o);\n return e && e[1] || \"\";\n}\nfunction Ch(o, e) {\n o = o || 10;\n const t = new Array(o), n = new Array(o);\n let i = 0, s = 0, r;\n return e = e !== void 0 ? e : 1e3, function(l) {\n const h = Date.now(), c = n[s];\n r || (r = h), t[i] = l, n[i] = h;\n let u = s, m = 0;\n for (; u !== i; )\n m += t[u++], u = u % o;\n if (i = (i + 1) % o, i === s && (s = (s + 1) % o), h - r < e)\n return;\n const f = c && h - c;\n return f ? Math.round(m * 1e3 / f) : void 0;\n };\n}\nfunction Ph(o, e) {\n let t = 0, n = 1e3 / e, i, s;\n const r = (h, c = Date.now()) => {\n t = c, i = null, s && (clearTimeout(s), s = null), o(...h);\n };\n return [(...h) => {\n const c = Date.now(), u = c - t;\n u >= n ? r(h, c) : (i = h, s || (s = setTimeout(() => {\n s = null, r(i);\n }, n - u)));\n }, () => i && r(i)];\n}\nconst Vi = (o, e, t = 3) => {\n let n = 0;\n const i = Ch(50, 250);\n return Ph((s) => {\n const r = s.loaded, a = s.lengthComputable ? s.total : void 0, l = r - n, h = i(l), c = r <= a;\n n = r;\n const u = {\n loaded: r,\n total: a,\n progress: a ? r / a : void 0,\n bytes: l,\n rate: h || void 0,\n estimated: h && a && c ? (a - r) / h : void 0,\n event: s,\n lengthComputable: a != null,\n [e ? \"download\" : \"upload\"]: !0\n };\n o(u);\n }, t);\n}, Br = (o, e) => {\n const t = o != null;\n return [(n) => e[0]({\n lengthComputable: t,\n total: o,\n loaded: n\n }), e[1]];\n}, Nr = (o) => (...e) => U.asap(() => o(...e)), Rh = ke.hasStandardBrowserEnv ? /* @__PURE__ */ ((o, e) => (t) => (t = new URL(t, ke.origin), o.protocol === t.protocol && o.host === t.host && (e || o.port === t.port)))(\n new URL(ke.origin),\n ke.navigator && /(msie|trident)/i.test(ke.navigator.userAgent)\n) : () => !0, Dh = ke.hasStandardBrowserEnv ? (\n // Standard browser envs support document.cookie\n {\n write(o, e, t, n, i, s, r) {\n if (typeof document > \"u\") return;\n const a = [`${o}=${encodeURIComponent(e)}`];\n U.isNumber(t) && a.push(`expires=${new Date(t).toUTCString()}`), U.isString(n) && a.push(`path=${n}`), U.isString(i) && a.push(`domain=${i}`), s === !0 && a.push(\"secure\"), U.isString(r) && a.push(`SameSite=${r}`), document.cookie = a.join(\"; \");\n },\n read(o) {\n if (typeof document > \"u\") return null;\n const e = document.cookie.match(new RegExp(\"(?:^|; )\" + o + \"=([^;]*)\"));\n return e ? decodeURIComponent(e[1]) : null;\n },\n remove(o) {\n this.write(o, \"\", Date.now() - 864e5, \"/\");\n }\n }\n) : (\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {\n },\n read() {\n return null;\n },\n remove() {\n }\n }\n);\nfunction kh(o) {\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(o);\n}\nfunction Ih(o, e) {\n return e ? o.replace(/\\/?\\/$/, \"\") + \"/\" + e.replace(/^\\/+/, \"\") : o;\n}\nfunction Sa(o, e, t) {\n let n = !kh(e);\n return o && (n || t == !1) ? Ih(o, e) : e;\n}\nconst Fr = (o) => o instanceof He ? { ...o } : o;\nfunction Qt(o, e) {\n e = e || {};\n const t = {};\n function n(h, c, u, m) {\n return U.isPlainObject(h) && U.isPlainObject(c) ? U.merge.call({ caseless: m }, h, c) : U.isPlainObject(c) ? U.merge({}, c) : U.isArray(c) ? c.slice() : c;\n }\n function i(h, c, u, m) {\n if (U.isUndefined(c)) {\n if (!U.isUndefined(h))\n return n(void 0, h, u, m);\n } else return n(h, c, u, m);\n }\n function s(h, c) {\n if (!U.isUndefined(c))\n return n(void 0, c);\n }\n function r(h, c) {\n if (U.isUndefined(c)) {\n if (!U.isUndefined(h))\n return n(void 0, h);\n } else return n(void 0, c);\n }\n function a(h, c, u) {\n if (u in e)\n return n(h, c);\n if (u in o)\n return n(void 0, h);\n }\n const l = {\n url: s,\n method: s,\n data: s,\n baseURL: r,\n transformRequest: r,\n transformResponse: r,\n paramsSerializer: r,\n timeout: r,\n timeoutMessage: r,\n withCredentials: r,\n withXSRFToken: r,\n adapter: r,\n responseType: r,\n xsrfCookieName: r,\n xsrfHeaderName: r,\n onUploadProgress: r,\n onDownloadProgress: r,\n decompress: r,\n maxContentLength: r,\n maxBodyLength: r,\n beforeRedirect: r,\n transport: r,\n httpAgent: r,\n httpsAgent: r,\n cancelToken: r,\n socketPath: r,\n responseEncoding: r,\n validateStatus: a,\n headers: (h, c, u) => i(Fr(h), Fr(c), u, !0)\n };\n return U.forEach(Object.keys({ ...o, ...e }), function(c) {\n const u = l[c] || i, m = u(o[c], e[c], c);\n U.isUndefined(m) && u !== a || (t[c] = m);\n }), t;\n}\nconst Ta = (o) => {\n const e = Qt({}, o);\n let { data: t, withXSRFToken: n, xsrfHeaderName: i, xsrfCookieName: s, headers: r, auth: a } = e;\n if (e.headers = r = He.from(r), e.url = xa(Sa(e.baseURL, e.url, e.allowAbsoluteUrls), o.params, o.paramsSerializer), a && r.set(\n \"Authorization\",\n \"Basic \" + btoa((a.username || \"\") + \":\" + (a.password ? unescape(encodeURIComponent(a.password)) : \"\"))\n ), U.isFormData(t)) {\n if (ke.hasStandardBrowserEnv || ke.hasStandardBrowserWebWorkerEnv)\n r.setContentType(void 0);\n else if (U.isFunction(t.getHeaders)) {\n const l = t.getHeaders(), h = [\"content-type\", \"content-length\"];\n Object.entries(l).forEach(([c, u]) => {\n h.includes(c.toLowerCase()) && r.set(c, u);\n });\n }\n }\n if (ke.hasStandardBrowserEnv && (n && U.isFunction(n) && (n = n(e)), n || n !== !1 && Rh(e.url))) {\n const l = i && s && Dh.read(s);\n l && r.set(i, l);\n }\n return e;\n}, Lh = typeof XMLHttpRequest < \"u\", zh = Lh && function(o) {\n return new Promise(function(t, n) {\n const i = Ta(o);\n let s = i.data;\n const r = He.from(i.headers).normalize();\n let { responseType: a, onUploadProgress: l, onDownloadProgress: h } = i, c, u, m, f, d;\n function p() {\n f && f(), d && d(), i.cancelToken && i.cancelToken.unsubscribe(c), i.signal && i.signal.removeEventListener(\"abort\", c);\n }\n let g = new XMLHttpRequest();\n g.open(i.method.toUpperCase(), i.url, !0), g.timeout = i.timeout;\n function y() {\n if (!g)\n return;\n const x = He.from(\n \"getAllResponseHeaders\" in g && g.getAllResponseHeaders()\n ), b = {\n data: !a || a === \"text\" || a === \"json\" ? g.responseText : g.response,\n status: g.status,\n statusText: g.statusText,\n headers: x,\n config: o,\n request: g\n };\n Ma(function(A) {\n t(A), p();\n }, function(A) {\n n(A), p();\n }, b), g = null;\n }\n \"onloadend\" in g ? g.onloadend = y : g.onreadystatechange = function() {\n !g || g.readyState !== 4 || g.status === 0 && !(g.responseURL && g.responseURL.indexOf(\"file:\") === 0) || setTimeout(y);\n }, g.onabort = function() {\n g && (n(new re(\"Request aborted\", re.ECONNABORTED, o, g)), g = null);\n }, g.onerror = function(_) {\n const b = _ && _.message ? _.message : \"Network Error\", E = new re(b, re.ERR_NETWORK, o, g);\n E.event = _ || null, n(E), g = null;\n }, g.ontimeout = function() {\n let _ = i.timeout ? \"timeout of \" + i.timeout + \"ms exceeded\" : \"timeout exceeded\";\n const b = i.transitional || _a;\n i.timeoutErrorMessage && (_ = i.timeoutErrorMessage), n(new re(\n _,\n b.clarifyTimeoutError ? re.ETIMEDOUT : re.ECONNABORTED,\n o,\n g\n )), g = null;\n }, s === void 0 && r.setContentType(null), \"setRequestHeader\" in g && U.forEach(r.toJSON(), function(_, b) {\n g.setRequestHeader(b, _);\n }), U.isUndefined(i.withCredentials) || (g.withCredentials = !!i.withCredentials), a && a !== \"json\" && (g.responseType = i.responseType), h && ([m, d] = Vi(h, !0), g.addEventListener(\"progress\", m)), l && g.upload && ([u, f] = Vi(l), g.upload.addEventListener(\"progress\", u), g.upload.addEventListener(\"loadend\", f)), (i.cancelToken || i.signal) && (c = (x) => {\n g && (n(!x || x.type ? new bn(null, o, g) : x), g.abort(), g = null);\n }, i.cancelToken && i.cancelToken.subscribe(c), i.signal && (i.signal.aborted ? c() : i.signal.addEventListener(\"abort\", c)));\n const w = Ah(i.url);\n if (w && ke.protocols.indexOf(w) === -1) {\n n(new re(\"Unsupported protocol \" + w + \":\", re.ERR_BAD_REQUEST, o));\n return;\n }\n g.send(s || null);\n });\n}, Oh = (o, e) => {\n const { length: t } = o = o ? o.filter(Boolean) : [];\n if (e || t) {\n let n = new AbortController(), i;\n const s = function(h) {\n if (!i) {\n i = !0, a();\n const c = h instanceof Error ? h : this.reason;\n n.abort(c instanceof re ? c : new bn(c instanceof Error ? c.message : c));\n }\n };\n let r = e && setTimeout(() => {\n r = null, s(new re(`timeout ${e} of ms exceeded`, re.ETIMEDOUT));\n }, e);\n const a = () => {\n o && (r && clearTimeout(r), r = null, o.forEach((h) => {\n h.unsubscribe ? h.unsubscribe(s) : h.removeEventListener(\"abort\", s);\n }), o = null);\n };\n o.forEach((h) => h.addEventListener(\"abort\", s));\n const { signal: l } = n;\n return l.unsubscribe = () => U.asap(a), l;\n }\n}, Bh = function* (o, e) {\n let t = o.byteLength;\n if (t < e) {\n yield o;\n return;\n }\n let n = 0, i;\n for (; n < t; )\n i = n + e, yield o.slice(n, i), n = i;\n}, Nh = async function* (o, e) {\n for await (const t of Fh(o))\n yield* Bh(t, e);\n}, Fh = async function* (o) {\n if (o[Symbol.asyncIterator]) {\n yield* o;\n return;\n }\n const e = o.getReader();\n try {\n for (; ; ) {\n const { done: t, value: n } = await e.read();\n if (t)\n break;\n yield n;\n }\n } finally {\n await e.cancel();\n }\n}, Ur = (o, e, t, n) => {\n const i = Nh(o, e);\n let s = 0, r, a = (l) => {\n r || (r = !0, n && n(l));\n };\n return new ReadableStream({\n async pull(l) {\n try {\n const { done: h, value: c } = await i.next();\n if (h) {\n a(), l.close();\n return;\n }\n let u = c.byteLength;\n if (t) {\n let m = s += u;\n t(m);\n }\n l.enqueue(new Uint8Array(c));\n } catch (h) {\n throw a(h), h;\n }\n },\n cancel(l) {\n return a(l), i.return();\n }\n }, {\n highWaterMark: 2\n });\n}, Vr = 64 * 1024, { isFunction: ri } = U, Uh = (({ Request: o, Response: e }) => ({\n Request: o,\n Response: e\n}))(U.global), {\n ReadableStream: Hr,\n TextEncoder: jr\n} = U.global, Gr = (o, ...e) => {\n try {\n return !!o(...e);\n } catch {\n return !1;\n }\n}, Vh = (o) => {\n o = U.merge.call({\n skipUndefined: !0\n }, Uh, o);\n const { fetch: e, Request: t, Response: n } = o, i = e ? ri(e) : typeof fetch == \"function\", s = ri(t), r = ri(n);\n if (!i)\n return !1;\n const a = i && ri(Hr), l = i && (typeof jr == \"function\" ? /* @__PURE__ */ ((d) => (p) => d.encode(p))(new jr()) : async (d) => new Uint8Array(await new t(d).arrayBuffer())), h = s && a && Gr(() => {\n let d = !1;\n const p = new t(ke.origin, {\n body: new Hr(),\n method: \"POST\",\n get duplex() {\n return d = !0, \"half\";\n }\n }).headers.has(\"Content-Type\");\n return d && !p;\n }), c = r && a && Gr(() => U.isReadableStream(new n(\"\").body)), u = {\n stream: c && ((d) => d.body)\n };\n i && [\"text\", \"arrayBuffer\", \"blob\", \"formData\", \"stream\"].forEach((d) => {\n !u[d] && (u[d] = (p, g) => {\n let y = p && p[d];\n if (y)\n return y.call(p);\n throw new re(`Response type '${d}' is not supported`, re.ERR_NOT_SUPPORT, g);\n });\n });\n const m = async (d) => {\n if (d == null)\n return 0;\n if (U.isBlob(d))\n return d.size;\n if (U.isSpecCompliantForm(d))\n return (await new t(ke.origin, {\n method: \"POST\",\n body: d\n }).arrayBuffer()).byteLength;\n if (U.isArrayBufferView(d) || U.isArrayBuffer(d))\n return d.byteLength;\n if (U.isURLSearchParams(d) && (d = d + \"\"), U.isString(d))\n return (await l(d)).byteLength;\n }, f = async (d, p) => {\n const g = U.toFiniteNumber(d.getContentLength());\n return g ?? m(p);\n };\n return async (d) => {\n let {\n url: p,\n method: g,\n data: y,\n signal: w,\n cancelToken: x,\n timeout: _,\n onDownloadProgress: b,\n onUploadProgress: E,\n responseType: A,\n headers: P,\n withCredentials: C = \"same-origin\",\n fetchOptions: D\n } = Ta(d), I = e || fetch;\n A = A ? (A + \"\").toLowerCase() : \"text\";\n let T = Oh([w, x && x.toAbortSignal()], _), R = null;\n const v = T && T.unsubscribe && (() => {\n T.unsubscribe();\n });\n let z;\n try {\n if (E && h && g !== \"get\" && g !== \"head\" && (z = await f(P, y)) !== 0) {\n let N = new t(p, {\n method: \"POST\",\n body: y,\n duplex: \"half\"\n }), O;\n if (U.isFormData(y) && (O = N.headers.get(\"content-type\")) && P.setContentType(O), N.body) {\n const [Q, ee] = Br(\n z,\n Vi(Nr(E))\n );\n y = Ur(N.body, Vr, Q, ee);\n }\n }\n U.isString(C) || (C = C ? \"include\" : \"omit\");\n const H = s && \"credentials\" in t.prototype, V = {\n ...D,\n signal: T,\n method: g.toUpperCase(),\n headers: P.normalize().toJSON(),\n body: y,\n duplex: \"half\",\n credentials: H ? C : void 0\n };\n R = s && new t(p, V);\n let te = await (s ? I(R, D) : I(p, V));\n const G = c && (A === \"stream\" || A === \"response\");\n if (c && (b || G && v)) {\n const N = {};\n [\"status\", \"statusText\", \"headers\"].forEach((q) => {\n N[q] = te[q];\n });\n const O = U.toFiniteNumber(te.headers.get(\"content-length\")), [Q, ee] = b && Br(\n O,\n Vi(Nr(b), !0)\n ) || [];\n te = new n(\n Ur(te.body, Vr, Q, () => {\n ee && ee(), v && v();\n }),\n N\n );\n }\n A = A || \"text\";\n let $ = await u[U.findKey(u, A) || \"text\"](te, d);\n return !G && v && v(), await new Promise((N, O) => {\n Ma(N, O, {\n data: $,\n headers: He.from(te.headers),\n status: te.status,\n statusText: te.statusText,\n config: d,\n request: R\n });\n });\n } catch (H) {\n throw v && v(), H && H.name === \"TypeError\" && /Load failed|fetch/i.test(H.message) ? Object.assign(\n new re(\"Network Error\", re.ERR_NETWORK, d, R),\n {\n cause: H.cause || H\n }\n ) : re.from(H, H && H.code, d, R);\n }\n };\n}, Hh = /* @__PURE__ */ new Map(), Ea = (o) => {\n let e = o && o.env || {};\n const { fetch: t, Request: n, Response: i } = e, s = [\n n,\n i,\n t\n ];\n let r = s.length, a = r, l, h, c = Hh;\n for (; a--; )\n l = s[a], h = c.get(l), h === void 0 && c.set(l, h = a ? /* @__PURE__ */ new Map() : Vh(e)), c = h;\n return h;\n};\nEa();\nconst pr = {\n http: rh,\n xhr: zh,\n fetch: {\n get: Ea\n }\n};\nU.forEach(pr, (o, e) => {\n if (o) {\n try {\n Object.defineProperty(o, \"name\", { value: e });\n } catch {\n }\n Object.defineProperty(o, \"adapterName\", { value: e });\n }\n});\nconst Wr = (o) => `- ${o}`, jh = (o) => U.isFunction(o) || o === null || o === !1;\nfunction Gh(o, e) {\n o = U.isArray(o) ? o : [o];\n const { length: t } = o;\n let n, i;\n const s = {};\n for (let r = 0; r < t; r++) {\n n = o[r];\n let a;\n if (i = n, !jh(n) && (i = pr[(a = String(n)).toLowerCase()], i === void 0))\n throw new re(`Unknown adapter '${a}'`);\n if (i && (U.isFunction(i) || (i = i.get(e))))\n break;\n s[a || \"#\" + r] = i;\n }\n if (!i) {\n const r = Object.entries(s).map(\n ([l, h]) => `adapter ${l} ` + (h === !1 ? \"is not supported by the environment\" : \"is not available in the build\")\n );\n let a = t ? r.length > 1 ? `since :\n` + r.map(Wr).join(`\n`) : \" \" + Wr(r[0]) : \"as no adapter specified\";\n throw new re(\n \"There is no suitable adapter to dispatch the request \" + a,\n \"ERR_NOT_SUPPORT\"\n );\n }\n return i;\n}\nconst Aa = {\n /**\n * Resolve an adapter from a list of adapter names or functions.\n * @type {Function}\n */\n getAdapter: Gh,\n /**\n * Exposes all known adapters\n * @type {Object}\n */\n adapters: pr\n};\nfunction cs(o) {\n if (o.cancelToken && o.cancelToken.throwIfRequested(), o.signal && o.signal.aborted)\n throw new bn(null, o);\n}\nfunction Xr(o) {\n return cs(o), o.headers = He.from(o.headers), o.data = ls.call(\n o,\n o.transformRequest\n ), [\"post\", \"put\", \"patch\"].indexOf(o.method) !== -1 && o.headers.setContentType(\"application/x-www-form-urlencoded\", !1), Aa.getAdapter(o.adapter || Xn.adapter, o)(o).then(function(n) {\n return cs(o), n.data = ls.call(\n o,\n o.transformResponse,\n n\n ), n.headers = He.from(n.headers), n;\n }, function(n) {\n return ba(n) || (cs(o), n && n.response && (n.response.data = ls.call(\n o,\n o.transformResponse,\n n.response\n ), n.response.headers = He.from(n.response.headers))), Promise.reject(n);\n });\n}\nconst Ca = \"1.13.2\", es = {};\n[\"object\", \"boolean\", \"number\", \"function\", \"string\", \"symbol\"].forEach((o, e) => {\n es[o] = function(n) {\n return typeof n === o || \"a\" + (e < 1 ? \"n \" : \" \") + o;\n };\n});\nconst Zr = {};\nes.transitional = function(e, t, n) {\n function i(s, r) {\n return \"[Axios v\" + Ca + \"] Transitional option '\" + s + \"'\" + r + (n ? \". \" + n : \"\");\n }\n return (s, r, a) => {\n if (e === !1)\n throw new re(\n i(r, \" has been removed\" + (t ? \" in \" + t : \"\")),\n re.ERR_DEPRECATED\n );\n return t && !Zr[r] && (Zr[r] = !0, console.warn(\n i(\n r,\n \" has been deprecated since v\" + t + \" and will be removed in the near future\"\n )\n )), e ? e(s, r, a) : !0;\n };\n};\nes.spelling = function(e) {\n return (t, n) => (console.warn(`${n} is likely a misspelling of ${e}`), !0);\n};\nfunction Wh(o, e, t) {\n if (typeof o != \"object\")\n throw new re(\"options must be an object\", re.ERR_BAD_OPTION_VALUE);\n const n = Object.keys(o);\n let i = n.length;\n for (; i-- > 0; ) {\n const s = n[i], r = e[s];\n if (r) {\n const a = o[s], l = a === void 0 || r(a, s, o);\n if (l !== !0)\n throw new re(\"option \" + s + \" must be \" + l, re.ERR_BAD_OPTION_VALUE);\n continue;\n }\n if (t !== !0)\n throw new re(\"Unknown option \" + s, re.ERR_BAD_OPTION);\n }\n}\nconst ki = {\n assertOptions: Wh,\n validators: es\n}, lt = ki.validators;\nlet $t = class {\n constructor(e) {\n this.defaults = e || {}, this.interceptors = {\n request: new zr(),\n response: new zr()\n };\n }\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(e, t) {\n try {\n return await this._request(e, t);\n } catch (n) {\n if (n instanceof Error) {\n let i = {};\n Error.captureStackTrace ? Error.captureStackTrace(i) : i = new Error();\n const s = i.stack ? i.stack.replace(/^.+\\n/, \"\") : \"\";\n try {\n n.stack ? s && !String(n.stack).endsWith(s.replace(/^.+\\n.+\\n/, \"\")) && (n.stack += `\n` + s) : n.stack = s;\n } catch {\n }\n }\n throw n;\n }\n }\n _request(e, t) {\n typeof e == \"string\" ? (t = t || {}, t.url = e) : t = e || {}, t = Qt(this.defaults, t);\n const { transitional: n, paramsSerializer: i, headers: s } = t;\n n !== void 0 && ki.assertOptions(n, {\n silentJSONParsing: lt.transitional(lt.boolean),\n forcedJSONParsing: lt.transitional(lt.boolean),\n clarifyTimeoutError: lt.transitional(lt.boolean)\n }, !1), i != null && (U.isFunction(i) ? t.paramsSerializer = {\n serialize: i\n } : ki.assertOptions(i, {\n encode: lt.function,\n serialize: lt.function\n }, !0)), t.allowAbsoluteUrls !== void 0 || (this.defaults.allowAbsoluteUrls !== void 0 ? t.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls : t.allowAbsoluteUrls = !0), ki.assertOptions(t, {\n baseUrl: lt.spelling(\"baseURL\"),\n withXsrfToken: lt.spelling(\"withXSRFToken\")\n }, !0), t.method = (t.method || this.defaults.method || \"get\").toLowerCase();\n let r = s && U.merge(\n s.common,\n s[t.method]\n );\n s && U.forEach(\n [\"delete\", \"get\", \"head\", \"post\", \"put\", \"patch\", \"common\"],\n (d) => {\n delete s[d];\n }\n ), t.headers = He.concat(r, s);\n const a = [];\n let l = !0;\n this.interceptors.request.forEach(function(p) {\n typeof p.runWhen == \"function\" && p.runWhen(t) === !1 || (l = l && p.synchronous, a.unshift(p.fulfilled, p.rejected));\n });\n const h = [];\n this.interceptors.response.forEach(function(p) {\n h.push(p.fulfilled, p.rejected);\n });\n let c, u = 0, m;\n if (!l) {\n const d = [Xr.bind(this), void 0];\n for (d.unshift(...a), d.push(...h), m = d.length, c = Promise.resolve(t); u < m; )\n c = c.then(d[u++], d[u++]);\n return c;\n }\n m = a.length;\n let f = t;\n for (; u < m; ) {\n const d = a[u++], p = a[u++];\n try {\n f = d(f);\n } catch (g) {\n p.call(this, g);\n break;\n }\n }\n try {\n c = Xr.call(this, f);\n } catch (d) {\n return Promise.reject(d);\n }\n for (u = 0, m = h.length; u < m; )\n c = c.then(h[u++], h[u++]);\n return c;\n }\n getUri(e) {\n e = Qt(this.defaults, e);\n const t = Sa(e.baseURL, e.url, e.allowAbsoluteUrls);\n return xa(t, e.params, e.paramsSerializer);\n }\n};\nU.forEach([\"delete\", \"get\", \"head\", \"options\"], function(e) {\n $t.prototype[e] = function(t, n) {\n return this.request(Qt(n || {}, {\n method: e,\n url: t,\n data: (n || {}).data\n }));\n };\n});\nU.forEach([\"post\", \"put\", \"patch\"], function(e) {\n function t(n) {\n return function(s, r, a) {\n return this.request(Qt(a || {}, {\n method: e,\n headers: n ? {\n \"Content-Type\": \"multipart/form-data\"\n } : {},\n url: s,\n data: r\n }));\n };\n }\n $t.prototype[e] = t(), $t.prototype[e + \"Form\"] = t(!0);\n});\nlet Xh = class Pa {\n constructor(e) {\n if (typeof e != \"function\")\n throw new TypeError(\"executor must be a function.\");\n let t;\n this.promise = new Promise(function(s) {\n t = s;\n });\n const n = this;\n this.promise.then((i) => {\n if (!n._listeners) return;\n let s = n._listeners.length;\n for (; s-- > 0; )\n n._listeners[s](i);\n n._listeners = null;\n }), this.promise.then = (i) => {\n let s;\n const r = new Promise((a) => {\n n.subscribe(a), s = a;\n }).then(i);\n return r.cancel = function() {\n n.unsubscribe(s);\n }, r;\n }, e(function(s, r, a) {\n n.reason || (n.reason = new bn(s, r, a), t(n.reason));\n });\n }\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason)\n throw this.reason;\n }\n /**\n * Subscribe to the cancel signal\n */\n subscribe(e) {\n if (this.reason) {\n e(this.reason);\n return;\n }\n this._listeners ? this._listeners.push(e) : this._listeners = [e];\n }\n /**\n * Unsubscribe from the cancel signal\n */\n unsubscribe(e) {\n if (!this._listeners)\n return;\n const t = this._listeners.indexOf(e);\n t !== -1 && this._listeners.splice(t, 1);\n }\n toAbortSignal() {\n const e = new AbortController(), t = (n) => {\n e.abort(n);\n };\n return this.subscribe(t), e.signal.unsubscribe = () => this.unsubscribe(t), e.signal;\n }\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let e;\n return {\n token: new Pa(function(i) {\n e = i;\n }),\n cancel: e\n };\n }\n};\nfunction Zh(o) {\n return function(t) {\n return o.apply(null, t);\n };\n}\nfunction qh(o) {\n return U.isObject(o) && o.isAxiosError === !0;\n}\nconst Gs = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n WebServerIsDown: 521,\n ConnectionTimedOut: 522,\n OriginIsUnreachable: 523,\n TimeoutOccurred: 524,\n SslHandshakeFailed: 525,\n InvalidSslCertificate: 526\n};\nObject.entries(Gs).forEach(([o, e]) => {\n Gs[e] = o;\n});\nfunction Ra(o) {\n const e = new $t(o), t = aa($t.prototype.request, e);\n return U.extend(t, $t.prototype, e, { allOwnKeys: !0 }), U.extend(t, e, null, { allOwnKeys: !0 }), t.create = function(i) {\n return Ra(Qt(o, i));\n }, t;\n}\nconst xe = Ra(Xn);\nxe.Axios = $t;\nxe.CanceledError = bn;\nxe.CancelToken = Xh;\nxe.isCancel = ba;\nxe.VERSION = Ca;\nxe.toFormData = Qi;\nxe.AxiosError = re;\nxe.Cancel = xe.CanceledError;\nxe.all = function(e) {\n return Promise.all(e);\n};\nxe.spread = Zh;\nxe.isAxiosError = qh;\nxe.mergeConfig = Qt;\nxe.AxiosHeaders = He;\nxe.formToJSON = (o) => va(U.isHTMLForm(o) ? new FormData(o) : o);\nxe.getAdapter = Aa.getAdapter;\nxe.HttpStatusCode = Gs;\nxe.default = xe;\nconst {\n Axios: Op,\n AxiosError: Bp,\n CanceledError: Np,\n isCancel: Fp,\n CancelToken: Up,\n VERSION: Vp,\n all: Hp,\n Cancel: jp,\n isAxiosError: Gp,\n spread: Wp,\n toFormData: Xp,\n AxiosHeaders: Zp,\n HttpStatusCode: qp,\n formToJSON: Yp,\n getAdapter: Kp,\n mergeConfig: $p\n} = xe;\nfunction qr(o, e) {\n var t;\n if (window.XMLHttpRequest ? t = new XMLHttpRequest() : window.ActiveXObject ? t = new window.ActiveXObject() : alert(\"请升级至最新版本的浏览器\"), t != null) {\n let n = o;\n t.open(\"GET\", n, !0), t.send(null), t.onreadystatechange = function() {\n t.readyState == 4 && t.status == 200 && (t.responseText.includes(\"\", 0) && t.responseText.includes(\"\", 0) && t.responseText.includes(\"\", 0) ? e(null) : e(t.responseText));\n }, t.onloadend = function() {\n t.readyState == 4 && t.status == 404 && t.status == 502 && e(null);\n };\n }\n}\nfunction Yh(o, e) {\n xe({\n method: \"get\",\n responseType: \"blob\",\n url: o\n }).then((t) => {\n let n = new window.File([t.data], \"zipFolder\", {\n type: \"zip\"\n });\n oa.loadAsync(n).then((i) => {\n const s = /* @__PURE__ */ new Map(), r = [];\n for (let a in i.files) {\n if (i.files[a].dir)\n continue;\n const l = i.file(i.files[a].name);\n if (l) {\n const h = l.async(\"blob\").then((c) => {\n const u = URL.createObjectURL(c);\n s.set(\"/\" + i.files[a].name.replace(\"\\\\\", \"/\"), u);\n });\n r.push(h);\n }\n }\n Promise.all(r).then(() => {\n e(s);\n }).catch((a) => {\n console.error(\"解压zip文件失败:\", a), e(/* @__PURE__ */ new Map());\n });\n }).catch((i) => {\n console.error(\"加载zip文件失败:\", i), e(/* @__PURE__ */ new Map());\n });\n }).catch((t) => {\n console.error(\"下载zip文件失败:\", t), e(/* @__PURE__ */ new Map());\n });\n}\nfunction Da(o, e) {\n xe({\n method: \"get\",\n responseType: \"blob\",\n url: o\n }).then((n) => {\n let i = new window.File([n.data], \"semantics\", {\n type: \"zip\"\n });\n oa.loadAsync(i).then((s) => {\n for (let r in s.files)\n s.file(s.files[r].name).async(\"blob\").then((l) => {\n t(l, \"utf-8\", function(h, c) {\n e(c);\n });\n });\n });\n });\n function t(n, i, s) {\n var r = new FileReader(), a = new Blob([n]);\n r.onload = function(l) {\n s(null, l.target.result);\n }, r.onerror = function(l) {\n s(l.error, null);\n }, r.readAsText(a, i);\n }\n}\nconst hs = /* @__PURE__ */ new WeakMap();\nclass Kh extends Zo {\n /**\n * Constructs a new Draco loader.\n *\n * @param {LoadingManager} [manager] - The loading manager.\n */\n constructor(e) {\n super(e), this.decoderPath = \"\", this.decoderConfig = {}, this.decoderBinary = null, this.decoderPending = null, this.workerLimit = 4, this.workerPool = [], this.workerNextTaskID = 1, this.workerSourceURL = \"\", this.defaultAttributeIDs = {\n position: \"POSITION\",\n normal: \"NORMAL\",\n color: \"COLOR\",\n uv: \"TEX_COORD\"\n }, this.defaultAttributeTypes = {\n position: \"Float32Array\",\n normal: \"Float32Array\",\n color: \"Float32Array\",\n uv: \"Float32Array\"\n };\n }\n /**\n * Provides configuration for the decoder libraries. Configuration cannot be changed after decoding begins.\n *\n * @param {string} path - The decoder path.\n * @return {DRACOLoader} A reference to this loader.\n */\n setDecoderPath(e) {\n return this.decoderPath = e, this;\n }\n /**\n * Provides configuration for the decoder libraries. Configuration cannot be changed after decoding begins.\n *\n * @param {{type:('js'|'wasm')}} config - The decoder config.\n * @return {DRACOLoader} A reference to this loader.\n */\n setDecoderConfig(e) {\n return this.decoderConfig = e, this;\n }\n /**\n * Sets the maximum number of Web Workers to be used during decoding.\n * A lower limit may be preferable if workers are also for other tasks in the application.\n *\n * @param {number} workerLimit - The worker limit.\n * @return {DRACOLoader} A reference to this loader.\n */\n setWorkerLimit(e) {\n return this.workerLimit = e, this;\n }\n /**\n * Starts loading from the given URL and passes the loaded Draco asset\n * to the `onLoad()` callback.\n *\n * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n load(e, t, n, i) {\n const s = new Ui(this.manager);\n s.setPath(this.path), s.setResponseType(\"arraybuffer\"), s.setRequestHeader(this.requestHeader), s.setWithCredentials(this.withCredentials), s.load(e, (r) => {\n this.parse(r, t, i);\n }, n, i);\n }\n /**\n * Parses the given Draco data.\n *\n * @param {ArrayBuffer} buffer - The raw Draco data as an array buffer.\n * @param {function(BufferGeometry)} onLoad - Executed when the loading/parsing process has been finished.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n parse(e, t, n = () => {\n }) {\n this.decodeDracoFile(e, t, null, null, Lt, n).catch(n);\n }\n //\n decodeDracoFile(e, t, n, i, s = rt, r = () => {\n }) {\n const a = {\n attributeIDs: n || this.defaultAttributeIDs,\n attributeTypes: i || this.defaultAttributeTypes,\n useUniqueIDs: !!n,\n vertexColorSpace: s\n };\n return this.decodeGeometry(e, a).then(t).catch(r);\n }\n decodeGeometry(e, t) {\n const n = JSON.stringify(t);\n if (hs.has(e)) {\n const l = hs.get(e);\n if (l.key === n)\n return l.promise;\n if (e.byteLength === 0)\n throw new Error(\n \"THREE.DRACOLoader: Unable to re-decode a buffer with different settings. Buffer has already been transferred.\"\n );\n }\n let i;\n const s = this.workerNextTaskID++, r = e.byteLength, a = this._getWorker(s, r).then((l) => (i = l, new Promise((h, c) => {\n i._callbacks[s] = { resolve: h, reject: c }, i.postMessage({ type: \"decode\", id: s, taskConfig: t, buffer: e }, [e]);\n }))).then((l) => this._createGeometry(l.geometry));\n return a.catch(() => !0).then(() => {\n i && s && this._releaseTask(i, s);\n }), hs.set(e, {\n key: n,\n promise: a\n }), a;\n }\n _createGeometry(e) {\n const t = new Zi();\n e.index && t.setIndex(new ut(e.index.array, 1));\n for (let n = 0; n < e.attributes.length; n++) {\n const { name: i, array: s, itemSize: r, stride: a, vertexColorSpace: l } = e.attributes[n];\n let h;\n if (r === a)\n h = new ut(s, r);\n else {\n const c = new qo(s, a);\n h = new Yo(c, r, 0);\n }\n i === \"color\" && (this._assignVertexColorSpace(h, l), h.normalized = !(s instanceof Float32Array)), t.setAttribute(i, h);\n }\n return t;\n }\n _assignVertexColorSpace(e, t) {\n if (t !== Lt) return;\n const n = new st();\n for (let i = 0, s = e.count; i < s; i++)\n n.fromBufferAttribute(e, i), Fi.colorSpaceToWorking(n, Lt), e.setXYZ(i, n.r, n.g, n.b);\n }\n _loadLibrary(e, t) {\n const n = new Ui(this.manager);\n return n.setPath(this.decoderPath), n.setResponseType(t), n.setWithCredentials(this.withCredentials), new Promise((i, s) => {\n n.load(e, i, void 0, s);\n });\n }\n preload() {\n return this._initDecoder(), this;\n }\n _initDecoder() {\n if (this.decoderPending) return this.decoderPending;\n const e = typeof WebAssembly != \"object\" || this.decoderConfig.type === \"js\", t = [];\n return e ? t.push(this._loadLibrary(\"draco_decoder.js\", \"text\")) : (t.push(this._loadLibrary(\"draco_wasm_wrapper.js\", \"text\")), t.push(this._loadLibrary(\"draco_decoder.wasm\", \"arraybuffer\"))), this.decoderPending = Promise.all(t).then((n) => {\n const i = n[0];\n e || (this.decoderConfig.wasmBinary = n[1]);\n const s = $h.toString(), r = [\n \"/* draco decoder */\",\n i,\n \"\",\n \"/* worker */\",\n s.substring(s.indexOf(\"{\") + 1, s.lastIndexOf(\"}\"))\n ].join(`\n`);\n this.workerSourceURL = URL.createObjectURL(new Blob([r]));\n }), this.decoderPending;\n }\n _getWorker(e, t) {\n return this._initDecoder().then(() => {\n if (this.workerPool.length < this.workerLimit) {\n const i = new Worker(this.workerSourceURL);\n i._callbacks = {}, i._taskCosts = {}, i._taskLoad = 0, i.postMessage({ type: \"init\", decoderConfig: this.decoderConfig }), i.onmessage = function(s) {\n const r = s.data;\n switch (r.type) {\n case \"decode\":\n i._callbacks[r.id].resolve(r);\n break;\n case \"error\":\n i._callbacks[r.id].reject(r);\n break;\n default:\n console.error('THREE.DRACOLoader: Unexpected message, \"' + r.type + '\"');\n }\n }, this.workerPool.push(i);\n } else\n this.workerPool.sort(function(i, s) {\n return i._taskLoad > s._taskLoad ? -1 : 1;\n });\n const n = this.workerPool[this.workerPool.length - 1];\n return n._taskCosts[e] = t, n._taskLoad += t, n;\n });\n }\n _releaseTask(e, t) {\n e._taskLoad -= e._taskCosts[t], delete e._callbacks[t], delete e._taskCosts[t];\n }\n debug() {\n console.log(\"Task load: \", this.workerPool.map((e) => e._taskLoad));\n }\n dispose() {\n for (let e = 0; e < this.workerPool.length; ++e)\n this.workerPool[e].terminate();\n return this.workerPool.length = 0, this.workerSourceURL !== \"\" && URL.revokeObjectURL(this.workerSourceURL), this;\n }\n}\nfunction $h() {\n let o, e;\n onmessage = function(r) {\n const a = r.data;\n switch (a.type) {\n case \"init\":\n o = a.decoderConfig, e = new Promise(function(c) {\n o.onModuleLoaded = function(u) {\n c({ draco: u });\n }, DracoDecoderModule(o);\n });\n break;\n case \"decode\":\n const l = a.buffer, h = a.taskConfig;\n e.then((c) => {\n const u = c.draco, m = new u.Decoder();\n try {\n const f = t(u, m, new Int8Array(l), h), d = f.attributes.map((p) => p.array.buffer);\n f.index && d.push(f.index.array.buffer), self.postMessage({ type: \"decode\", id: a.id, geometry: f }, d);\n } catch (f) {\n console.error(f), self.postMessage({ type: \"error\", id: a.id, error: f.message });\n } finally {\n u.destroy(m);\n }\n });\n break;\n }\n };\n function t(r, a, l, h) {\n const c = h.attributeIDs, u = h.attributeTypes;\n let m, f;\n const d = a.GetEncodedGeometryType(l);\n if (d === r.TRIANGULAR_MESH)\n m = new r.Mesh(), f = a.DecodeArrayToMesh(l, l.byteLength, m);\n else if (d === r.POINT_CLOUD)\n m = new r.PointCloud(), f = a.DecodeArrayToPointCloud(l, l.byteLength, m);\n else\n throw new Error(\"THREE.DRACOLoader: Unexpected geometry type.\");\n if (!f.ok() || m.ptr === 0)\n throw new Error(\"THREE.DRACOLoader: Decoding failed: \" + f.error_msg());\n const p = { index: null, attributes: [] };\n for (const g in c) {\n const y = self[u[g]];\n let w, x;\n if (h.useUniqueIDs)\n x = c[g], w = a.GetAttributeByUniqueId(m, x);\n else {\n if (x = a.GetAttributeId(m, r[c[g]]), x === -1) continue;\n w = a.GetAttribute(m, x);\n }\n const _ = i(r, a, m, g, y, w);\n g === \"color\" && (_.vertexColorSpace = h.vertexColorSpace), p.attributes.push(_);\n }\n return d === r.TRIANGULAR_MESH && (p.index = n(r, a, m)), r.destroy(m), p;\n }\n function n(r, a, l) {\n const c = l.num_faces() * 3, u = c * 4, m = r._malloc(u);\n a.GetTrianglesUInt32Array(l, u, m);\n const f = new Uint32Array(r.HEAPF32.buffer, m, c).slice();\n return r._free(m), { array: f, itemSize: 1 };\n }\n function i(r, a, l, h, c, u) {\n const m = l.num_points(), f = u.num_components(), d = s(r, c), p = f * c.BYTES_PER_ELEMENT, g = Math.ceil(p / 4) * 4, y = g / c.BYTES_PER_ELEMENT, w = m * p, x = m * g, _ = r._malloc(w);\n a.GetAttributeDataArrayForAllPoints(l, u, d, w, _);\n const b = new c(r.HEAPF32.buffer, _, w / c.BYTES_PER_ELEMENT);\n let E;\n if (p === g)\n E = b.slice();\n else {\n E = new c(x / c.BYTES_PER_ELEMENT);\n let A = 0;\n for (let P = 0, C = b.length; P < C; P++) {\n for (let D = 0; D < f; D++)\n E[A + D] = b[P * f + D];\n A += y;\n }\n }\n return r._free(_), {\n name: h,\n count: m,\n itemSize: f,\n array: E,\n stride: y\n };\n }\n function s(r, a) {\n switch (a) {\n case Float32Array:\n return r.DT_FLOAT32;\n case Int8Array:\n return r.DT_INT8;\n case Int16Array:\n return r.DT_INT16;\n case Int32Array:\n return r.DT_INT32;\n case Uint8Array:\n return r.DT_UINT8;\n case Uint16Array:\n return r.DT_UINT16;\n case Uint32Array:\n return r.DT_UINT32;\n }\n }\n}\nvar zt = /* @__PURE__ */ ((o) => (o.ModelLoadStart = \"model-load-start\", o.ModelLoadProgress = \"model-load-progress\", o.ModelLoaded = \"model-loaded\", o.ModelError = \"model-error\", o.SelectionChanged = \"selection-changed\", o.HoverChanged = \"hover-changed\", o.Click = \"click\", o.MouseMove = \"mouse-move\", o.CameraChanged = \"camera-changed\", o.CameraIdle = \"camera-idle\", o.ViewportResize = \"viewport-resize\", o.EngineFree = \"engine-free\", o.EngineBusy = \"engine-busy\", o.MeasureChanged = \"measure-changed\", o.SectionMove = \"section-move\", o))(zt || {});\nfunction Jh(o, e, t, n) {\n let i = 0, s = 0, r = 0, a = o.models.find((f) => f.url == t), l = e.circularMeps, h = e.rectMeps.filter((f) => f.type === \"风管\"), c = e.rectMeps.filter((f) => f.type === \"桥架\"), u = e.ellipseMeps, m = o.scene;\n if (new M.MeshBasicMaterial(), new M.BufferGeometry(), l && l.length) {\n let f = [], d = 0;\n for (let p of l)\n p.color = p.color.split(\",\").map((g) => parseInt(g) / 255), p.color = new M.Color(p.color[0], p.color[1], p.color[2]), p.position = {\n x: p.startPoint.X * 0.3048 + i,\n y: p.startPoint.Z * 0.3048 + s,\n z: -p.startPoint.Y * 0.3048 + r\n }, p.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, p.indexes = [\n [o.scene.children.length, d++, 0, 0]\n ], a.nodesMap.set(Number(p.id), p), f.push(p);\n oi(\"Circle\", m, f, t);\n }\n if (h && h.length) {\n let f = [], d = 0;\n for (let p of h)\n p.color = p.color.split(\",\").map((g) => parseInt(g) / 255), p.color = new M.Color(p.color[0], p.color[1], p.color[2]), p.position = {\n x: p.startPoint.X * 0.3048 + i,\n y: p.startPoint.Z * 0.3048 + s,\n z: -p.startPoint.Y * 0.3048 + r\n }, p.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, p.indexes = [\n [o.scene.children.length, d++, 0, 0]\n ], a.nodesMap.set(Number(p.id), p), f.push(p);\n oi(\"Rect\", m, f, t);\n }\n if (u && u.length) {\n let f = [], d = 0;\n for (let p of u)\n p.color = p.color.split(\",\").map((g) => parseInt(g) / 255), p.color = new M.Color(p.color[0], p.color[1], p.color[2]), p.position = {\n x: p.startPoint.X * 0.3048 + i,\n y: p.startPoint.Z * 0.3048 + s,\n z: -p.startPoint.Y * 0.3048 + r\n }, p.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, p.indexes = [\n [o.scene.children.length, d++, 0, 0]\n ], a.nodesMap.set(Number(p.id), p), f.push(p);\n oi(\"Ellipse\", m, f, t);\n }\n if (c && c.length) {\n let f = [], d = 0;\n for (let p of c)\n p.color = p.color.split(\",\").map((g) => parseInt(g) / 255), p.color = new M.Color(p.color[0], p.color[1], p.color[2]), p.position = {\n x: p.startPoint.X * 0.3048 + i,\n y: p.startPoint.Z * 0.3048 + s,\n z: -p.startPoint.Y * 0.3048 + r\n }, p.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, p.indexes = [\n [o.scene.children.length, d++, 0, 0]\n ], a.nodesMap.set(Number(p.id), p), f.push(p);\n oi(\"Bridge\", m, f, t);\n }\n}\nfunction oi(o, e, t, n, i) {\n let s, r, a = {\n width: 1,\n height: 1,\n length: 1,\n diameter: 1,\n color: new M.Color(),\n position: {\n x: 0,\n y: 0,\n z: 0\n },\n rotation: {\n x: 0,\n y: 0,\n z: 0\n }\n };\n switch (o) {\n case \"Rect\":\n r = ai(\"Rect\", a);\n break;\n case \"Bridge\":\n r = ai(\"Bridge\", a);\n break;\n case \"Circle\":\n r = ai(\"Circle\", a);\n break;\n case \"Ellipse\":\n r = ai(\"Ellipse\", a);\n break;\n }\n r && (s = new M.InstancedMesh(r.geometry, r.material, t.length), s.url = n, e.add(s));\n let l = [], h = [];\n for (var c = 0; c < t.length; c++) {\n let f = t[c], d = new M.Vector3(f.startPoint.X, 0, -f.startPoint.Y), p = new M.Vector3(f.endPoint.X, 0, -f.endPoint.Y), g = new M.Vector3(f.startPoint.X, f.startPoint.Z, -f.startPoint.Y), y = new M.Vector3(f.endPoint.X, f.endPoint.Z, -f.endPoint.Y), w = 0, x = 0, _ = 0;\n if (Math.abs(p.clone().sub(d.clone()).z) < 0.01 && Math.abs(p.clone().sub(d.clone()).x) < 0.01) {\n if (w = (f.startPoint.Z > f.endPoint.Z ? 1 : -1) * Math.PI * 0.5, f.base_x != null) {\n var u = new M.Vector3(f.base_x.X, 0, -f.base_x.Y);\n x = (u.clone().cross(new M.Vector3(0, 0, 1)).y <= 0 ? 1 : -1) * u.angleTo(new M.Vector3(0, 0, 1)) + Math.PI * 0.5;\n }\n } else\n x = (p.clone().sub(d.clone()).cross(new M.Vector3(0, 0, 1)).y > 0 ? -1 : 1) * p.clone().sub(d.clone()).angleTo(new M.Vector3(0, 0, 1)), w = (f.startPoint.Z > f.endPoint.Z ? 1 : -1) * p.clone().sub(d.clone()).angleTo(y.clone().sub(g.clone()));\n let b = new M.Matrix4();\n const E = new M.Euler(w, x, _, \"YXZ\");\n let A = b.clone().makeRotationFromEuler(E), P, C;\n o === \"Circle\" ? (P = f.diameter, C = f.diameter) : (P = f.width, C = f.height);\n let D = b.clone().makeScale(P, C, f.length);\n b.multiplyMatrices(A, D), b.setPosition(f.position.x, f.position.y, f.position.z), s.setMatrixAt(c, b.clone()), s.setColorAt(c, f.color), s.geometry.computeBoundingBox();\n let I = s.geometry.boundingBox.min.clone().applyMatrix4(b.clone()), T = s.geometry.boundingBox.max.clone().applyMatrix4(b.clone()), R = new M.Vector3(Math.min(I.x, T.x), Math.min(I.y, T.y), Math.min(I.z, T.z)), v = new M.Vector3(Math.max(I.x, T.x), Math.max(I.y, T.y), Math.max(I.z, T.z)), z = R.clone().add(v.clone()).multiplyScalar(0.5), H = {\n name: f.name,\n min: R,\n max: v,\n center: z,\n dbid: c,\n // url: path + \"/\" + type,\n // basePath: url,\n // relativePath: relativePath,\n materialName: r.material.name\n }, V = null, te = null;\n o === \"Circle\" && (V = {\n x: f.startPoint.X * 0.3048,\n y: f.startPoint.Z * 0.3048,\n z: -f.startPoint.Y * 0.3048\n }, te = {\n x: f.endPoint.X * 0.3048,\n y: f.endPoint.Z * 0.3048,\n z: -f.endPoint.Y * 0.3048\n }, H.minC = V, H.maxC = te), s.ids || (s.ids = []), s.matrixs || (s.matrixs = []), s.matrixs.push(b.clone()), h.push(b.clone()), s.ids.push(Number(f.id)), l.push(H);\n }\n s.castShadow = !0, s.ElementInfos = l, s.name = \"rootModel\", s.TypeName = \"InstancedMesh-Pipe\", s.PipeType = o, s.MeshId = null, s.realMaterial = s.material.clone(), s.originalMaterial = s.material.clone(), s.materialClone = h;\n let m = [];\n m = {\n geometry: s.geometry,\n matrix: s.matrix,\n position: s.position,\n rotation: s.rotation\n }, s.meshs = m, s.instanceMatrix && s.instanceMatrix.array && (s.cloneInstanceMatrix = Array.from(s.instanceMatrix.array));\n}\nfunction ai(o, e, t) {\n let n = new M.Shape();\n switch (e.width = e.width * 0.3048, e.height = e.height * 0.3048, e.diameter = e.diameter * 0.3048, o) {\n case \"Rect\":\n n.moveTo(-e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, e.height / 2), n.lineTo(e.width / 2, e.height / 2), n.lineTo(e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, -e.height / 2);\n break;\n case \"Ellipse\":\n n.moveTo(-e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, e.height / 2), n.lineTo(e.width / 2, e.height / 2), n.lineTo(e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, -e.height / 2);\n break;\n case \"Bridge\":\n n.moveTo(-e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, e.height / 2), n.lineTo(-e.width / 2 + 0.01, e.height / 2), n.lineTo(-e.width / 2 + 0.01, -e.height / 2 + 0.01), n.lineTo(e.width / 2 - 0.01, -e.height / 2 + 0.01), n.lineTo(e.width / 2 - 0.01, e.height / 2), n.lineTo(e.width / 2, e.height / 2), n.lineTo(e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, -e.height / 2);\n break;\n case \"Circle\":\n n.moveTo(0, 0), n.absarc(0, 0, e.diameter * 0.5, 0, Math.PI * 2, !1);\n break;\n }\n const i = {\n depth: e.length * 0.3048,\n //拉伸长度\n bevelEnabled: !1\n };\n return s(n, i, e.color, e.position, e.rotation);\n function s(r, a, l, h, c) {\n let u = new M.ExtrudeGeometry(r, a), m = new M.MeshStandardMaterial({\n color: l,\n side: M.DoubleSide\n //metalness: 0.8, //金属度\n //roughness: 0.1, //粗糙度\n // depthTest:false\n // name: path + \"/\" + type + \"/material\"\n }), f = new M.Mesh(u, m);\n return f.position.set(h.x, h.y, h.z), f.rotation._order = \"YXZ\", f.rotation.set(c.x, c.y, c.z), f;\n }\n}\nfunction ka(o, e = !1) {\n const t = o[0].index !== null, n = new Set(Object.keys(o[0].attributes)), i = new Set(Object.keys(o[0].morphAttributes)), s = {}, r = {}, a = o[0].morphTargetsRelative, l = new Zi();\n let h = 0;\n for (let c = 0; c < o.length; ++c) {\n const u = o[c];\n let m = 0;\n if (t !== (u.index !== null))\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"), null;\n for (const f in u.attributes) {\n if (!n.has(f))\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + '. All geometries must have compatible attributes; make sure \"' + f + '\" attribute exists among all geometries, or in none of them.'), null;\n s[f] === void 0 && (s[f] = []), s[f].push(u.attributes[f]), m++;\n }\n if (m !== n.size)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". Make sure all geometries have the same number of attributes.\"), null;\n if (a !== u.morphTargetsRelative)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". .morphTargetsRelative must be consistent throughout all geometries.\"), null;\n for (const f in u.morphAttributes) {\n if (!i.has(f))\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". .morphAttributes must be consistent throughout all geometries.\"), null;\n r[f] === void 0 && (r[f] = []), r[f].push(u.morphAttributes[f]);\n }\n if (e) {\n let f;\n if (t)\n f = u.index.count;\n else if (u.attributes.position !== void 0)\n f = u.attributes.position.count;\n else\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". The geometry must have either an index or a position attribute\"), null;\n l.addGroup(h, f, c), h += f;\n }\n }\n if (t) {\n let c = 0;\n const u = [];\n for (let m = 0; m < o.length; ++m) {\n const f = o[m].index;\n for (let d = 0; d < f.count; ++d)\n u.push(f.getX(d) + c);\n c += o[m].attributes.position.count;\n }\n l.setIndex(u);\n }\n for (const c in s) {\n const u = Yr(s[c]);\n if (!u)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the \" + c + \" attribute.\"), null;\n l.setAttribute(c, u);\n }\n for (const c in r) {\n const u = r[c][0].length;\n if (u === 0) break;\n l.morphAttributes = l.morphAttributes || {}, l.morphAttributes[c] = [];\n for (let m = 0; m < u; ++m) {\n const f = [];\n for (let p = 0; p < r[c].length; ++p)\n f.push(r[c][p][m]);\n const d = Yr(f);\n if (!d)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the \" + c + \" morphAttribute.\"), null;\n l.morphAttributes[c].push(d);\n }\n }\n return l;\n}\nfunction Yr(o) {\n let e, t, n, i = -1, s = 0;\n for (let h = 0; h < o.length; ++h) {\n const c = o[h];\n if (e === void 0 && (e = c.array.constructor), e !== c.array.constructor)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"), null;\n if (t === void 0 && (t = c.itemSize), t !== c.itemSize)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"), null;\n if (n === void 0 && (n = c.normalized), n !== c.normalized)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"), null;\n if (i === -1 && (i = c.gpuType), i !== c.gpuType)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.\"), null;\n s += c.count * t;\n }\n const r = new e(s), a = new ut(r, t, n);\n let l = 0;\n for (let h = 0; h < o.length; ++h) {\n const c = o[h];\n if (c.isInterleavedBufferAttribute) {\n const u = l / t;\n for (let m = 0, f = c.count; m < f; m++)\n for (let d = 0; d < t; d++) {\n const p = c.getComponent(m, d);\n a.setComponent(m + u, d, p);\n }\n } else\n r.set(c.array, l);\n l += c.count * t;\n }\n return i !== void 0 && (a.gpuType = i), a;\n}\nfunction Kr(o, e) {\n if (e === cl)\n return console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\"), o;\n if (e === Fs || e === Ko) {\n let t = o.getIndex();\n if (t === null) {\n const r = [], a = o.getAttribute(\"position\");\n if (a !== void 0) {\n for (let l = 0; l < a.count; l++)\n r.push(l);\n o.setIndex(r), t = o.getIndex();\n } else\n return console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"), o;\n }\n const n = t.count - 2, i = [];\n if (e === Fs)\n for (let r = 1; r <= n; r++)\n i.push(t.getX(0)), i.push(t.getX(r)), i.push(t.getX(r + 1));\n else\n for (let r = 0; r < n; r++)\n r % 2 === 0 ? (i.push(t.getX(r)), i.push(t.getX(r + 1)), i.push(t.getX(r + 2))) : (i.push(t.getX(r + 2)), i.push(t.getX(r + 1)), i.push(t.getX(r)));\n i.length / 3 !== n && console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n const s = o.clone();\n return s.setIndex(i), s.clearGroups(), s;\n } else\n return console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", e), o;\n}\nclass Qh extends Zo {\n /**\n * Constructs a new glTF loader.\n *\n * @param {LoadingManager} [manager] - The loading manager.\n */\n constructor(e) {\n super(e), this.dracoLoader = null, this.ktx2Loader = null, this.meshoptDecoder = null, this.pluginCallbacks = [], this.register(function(t) {\n return new su(t);\n }), this.register(function(t) {\n return new ru(t);\n }), this.register(function(t) {\n return new pu(t);\n }), this.register(function(t) {\n return new mu(t);\n }), this.register(function(t) {\n return new gu(t);\n }), this.register(function(t) {\n return new au(t);\n }), this.register(function(t) {\n return new lu(t);\n }), this.register(function(t) {\n return new cu(t);\n }), this.register(function(t) {\n return new hu(t);\n }), this.register(function(t) {\n return new iu(t);\n }), this.register(function(t) {\n return new uu(t);\n }), this.register(function(t) {\n return new ou(t);\n }), this.register(function(t) {\n return new fu(t);\n }), this.register(function(t) {\n return new du(t);\n }), this.register(function(t) {\n return new tu(t);\n }), this.register(function(t) {\n return new yu(t);\n }), this.register(function(t) {\n return new wu(t);\n });\n }\n /**\n * Starts loading from the given URL and passes the loaded glTF asset\n * to the `onLoad()` callback.\n *\n * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n * @param {function(GLTFLoader~LoadObject)} onLoad - Executed when the loading process has been finished.\n * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n load(e, t, n, i) {\n const s = this;\n let r;\n if (this.resourcePath !== \"\")\n r = this.resourcePath;\n else if (this.path !== \"\") {\n const h = Nn.extractUrlBase(e);\n r = Nn.resolveURL(h, this.path);\n } else\n r = Nn.extractUrlBase(e);\n this.manager.itemStart(e);\n const a = function(h) {\n i ? i(h) : console.error(h), s.manager.itemError(e), s.manager.itemEnd(e);\n }, l = new Ui(this.manager);\n l.setPath(this.path), l.setResponseType(\"arraybuffer\"), l.setRequestHeader(this.requestHeader), l.setWithCredentials(this.withCredentials), l.load(e, function(h) {\n try {\n s.parse(h, r, function(c) {\n t(c), s.manager.itemEnd(e);\n }, a);\n } catch (c) {\n a(c);\n }\n }, n, a);\n }\n /**\n * Sets the given Draco loader to this loader. Required for decoding assets\n * compressed with the `KHR_draco_mesh_compression` extension.\n *\n * @param {DRACOLoader} dracoLoader - The Draco loader to set.\n * @return {GLTFLoader} A reference to this loader.\n */\n setDRACOLoader(e) {\n return this.dracoLoader = e, this;\n }\n /**\n * Sets the given KTX2 loader to this loader. Required for loading KTX2\n * compressed textures.\n *\n * @param {KTX2Loader} ktx2Loader - The KTX2 loader to set.\n * @return {GLTFLoader} A reference to this loader.\n */\n setKTX2Loader(e) {\n return this.ktx2Loader = e, this;\n }\n /**\n * Sets the given meshopt decoder. Required for decoding assets\n * compressed with the `EXT_meshopt_compression` extension.\n *\n * @param {Object} meshoptDecoder - The meshopt decoder to set.\n * @return {GLTFLoader} A reference to this loader.\n */\n setMeshoptDecoder(e) {\n return this.meshoptDecoder = e, this;\n }\n /**\n * Registers a plugin callback. This API is internally used to implement the various\n * glTF extensions but can also used by third-party code to add additional logic\n * to the loader.\n *\n * @param {function(parser:GLTFParser)} callback - The callback function to register.\n * @return {GLTFLoader} A reference to this loader.\n */\n register(e) {\n return this.pluginCallbacks.indexOf(e) === -1 && this.pluginCallbacks.push(e), this;\n }\n /**\n * Unregisters a plugin callback.\n *\n * @param {Function} callback - The callback function to unregister.\n * @return {GLTFLoader} A reference to this loader.\n */\n unregister(e) {\n return this.pluginCallbacks.indexOf(e) !== -1 && this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e), 1), this;\n }\n /**\n * Parses the given FBX data and returns the resulting group.\n *\n * @param {string|ArrayBuffer} data - The raw glTF data.\n * @param {string} path - The URL base path.\n * @param {function(GLTFLoader~LoadObject)} onLoad - Executed when the loading process has been finished.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n parse(e, t, n, i) {\n let s;\n const r = {}, a = {}, l = new TextDecoder();\n if (typeof e == \"string\")\n s = JSON.parse(e);\n else if (e instanceof ArrayBuffer)\n if (l.decode(new Uint8Array(e, 0, 4)) === Ia) {\n try {\n r[le.KHR_BINARY_GLTF] = new xu(e);\n } catch (u) {\n i && i(u);\n return;\n }\n s = JSON.parse(r[le.KHR_BINARY_GLTF].content);\n } else\n s = JSON.parse(l.decode(e));\n else\n s = e;\n if (s.asset === void 0 || s.asset.version[0] < 2) {\n i && i(new Error(\"THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.\"));\n return;\n }\n const h = new ku(s, {\n path: t || this.resourcePath || \"\",\n crossOrigin: this.crossOrigin,\n requestHeader: this.requestHeader,\n manager: this.manager,\n ktx2Loader: this.ktx2Loader,\n meshoptDecoder: this.meshoptDecoder\n });\n h.fileLoader.setRequestHeader(this.requestHeader);\n for (let c = 0; c < this.pluginCallbacks.length; c++) {\n const u = this.pluginCallbacks[c](h);\n u.name || console.error(\"THREE.GLTFLoader: Invalid plugin found: missing name\"), a[u.name] = u, r[u.name] = !0;\n }\n if (s.extensionsUsed)\n for (let c = 0; c < s.extensionsUsed.length; ++c) {\n const u = s.extensionsUsed[c], m = s.extensionsRequired || [];\n switch (u) {\n case le.KHR_MATERIALS_UNLIT:\n r[u] = new nu();\n break;\n case le.KHR_DRACO_MESH_COMPRESSION:\n r[u] = new _u(s, this.dracoLoader);\n break;\n case le.KHR_TEXTURE_TRANSFORM:\n r[u] = new vu();\n break;\n case le.KHR_MESH_QUANTIZATION:\n r[u] = new bu();\n break;\n default:\n m.indexOf(u) >= 0 && a[u] === void 0 && console.warn('THREE.GLTFLoader: Unknown extension \"' + u + '\".');\n }\n }\n h.setExtensions(r), h.setPlugins(a), h.parse(n, i);\n }\n /**\n * Async version of {@link GLTFLoader#parse}.\n *\n * @async\n * @param {string|ArrayBuffer} data - The raw glTF data.\n * @param {string} path - The URL base path.\n * @return {Promise} A Promise that resolves with the loaded glTF when the parsing has been finished.\n */\n parseAsync(e, t) {\n const n = this;\n return new Promise(function(i, s) {\n n.parse(e, t, i, s);\n });\n }\n}\nfunction eu() {\n let o = {};\n return {\n get: function(e) {\n return o[e];\n },\n add: function(e, t) {\n o[e] = t;\n },\n remove: function(e) {\n delete o[e];\n },\n removeAll: function() {\n o = {};\n }\n };\n}\nconst le = {\n KHR_BINARY_GLTF: \"KHR_binary_glTF\",\n KHR_DRACO_MESH_COMPRESSION: \"KHR_draco_mesh_compression\",\n KHR_LIGHTS_PUNCTUAL: \"KHR_lights_punctual\",\n KHR_MATERIALS_CLEARCOAT: \"KHR_materials_clearcoat\",\n KHR_MATERIALS_DISPERSION: \"KHR_materials_dispersion\",\n KHR_MATERIALS_IOR: \"KHR_materials_ior\",\n KHR_MATERIALS_SHEEN: \"KHR_materials_sheen\",\n KHR_MATERIALS_SPECULAR: \"KHR_materials_specular\",\n KHR_MATERIALS_TRANSMISSION: \"KHR_materials_transmission\",\n KHR_MATERIALS_IRIDESCENCE: \"KHR_materials_iridescence\",\n KHR_MATERIALS_ANISOTROPY: \"KHR_materials_anisotropy\",\n KHR_MATERIALS_UNLIT: \"KHR_materials_unlit\",\n KHR_MATERIALS_VOLUME: \"KHR_materials_volume\",\n KHR_TEXTURE_BASISU: \"KHR_texture_basisu\",\n KHR_TEXTURE_TRANSFORM: \"KHR_texture_transform\",\n KHR_MESH_QUANTIZATION: \"KHR_mesh_quantization\",\n KHR_MATERIALS_EMISSIVE_STRENGTH: \"KHR_materials_emissive_strength\",\n EXT_MATERIALS_BUMP: \"EXT_materials_bump\",\n EXT_TEXTURE_WEBP: \"EXT_texture_webp\",\n EXT_TEXTURE_AVIF: \"EXT_texture_avif\",\n EXT_MESHOPT_COMPRESSION: \"EXT_meshopt_compression\",\n EXT_MESH_GPU_INSTANCING: \"EXT_mesh_gpu_instancing\"\n};\nclass tu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_LIGHTS_PUNCTUAL, this.cache = { refs: {}, uses: {} };\n }\n _markDefs() {\n const e = this.parser, t = this.parser.json.nodes || [];\n for (let n = 0, i = t.length; n < i; n++) {\n const s = t[n];\n s.extensions && s.extensions[this.name] && s.extensions[this.name].light !== void 0 && e._addNodeRef(this.cache, s.extensions[this.name].light);\n }\n }\n _loadLight(e) {\n const t = this.parser, n = \"light:\" + e;\n let i = t.cache.get(n);\n if (i) return i;\n const s = t.json, l = ((s.extensions && s.extensions[this.name] || {}).lights || [])[e];\n let h;\n const c = new st(16777215);\n l.color !== void 0 && c.setRGB(l.color[0], l.color[1], l.color[2], rt);\n const u = l.range !== void 0 ? l.range : 0;\n switch (l.type) {\n case \"directional\":\n h = new dl(c), h.target.position.set(0, 0, -1), h.add(h.target);\n break;\n case \"point\":\n h = new ul(c), h.distance = u;\n break;\n case \"spot\":\n h = new hl(c), h.distance = u, l.spot = l.spot || {}, l.spot.innerConeAngle = l.spot.innerConeAngle !== void 0 ? l.spot.innerConeAngle : 0, l.spot.outerConeAngle = l.spot.outerConeAngle !== void 0 ? l.spot.outerConeAngle : Math.PI / 4, h.angle = l.spot.outerConeAngle, h.penumbra = 1 - l.spot.innerConeAngle / l.spot.outerConeAngle, h.target.position.set(0, 0, -1), h.add(h.target);\n break;\n default:\n throw new Error(\"THREE.GLTFLoader: Unexpected light type: \" + l.type);\n }\n return h.position.set(0, 0, 0), ct(h, l), l.intensity !== void 0 && (h.intensity = l.intensity), h.name = t.createUniqueName(l.name || \"light_\" + e), i = Promise.resolve(h), t.cache.add(n, i), i;\n }\n getDependency(e, t) {\n if (e === \"light\")\n return this._loadLight(t);\n }\n createNodeAttachment(e) {\n const t = this, n = this.parser, s = n.json.nodes[e], a = (s.extensions && s.extensions[this.name] || {}).light;\n return a === void 0 ? null : this._loadLight(a).then(function(l) {\n return n._getNodeRef(t.cache, a, l);\n });\n }\n}\nclass nu {\n constructor() {\n this.name = le.KHR_MATERIALS_UNLIT;\n }\n getMaterialType() {\n return On;\n }\n extendParams(e, t, n) {\n const i = [];\n e.color = new st(1, 1, 1), e.opacity = 1;\n const s = t.pbrMetallicRoughness;\n if (s) {\n if (Array.isArray(s.baseColorFactor)) {\n const r = s.baseColorFactor;\n e.color.setRGB(r[0], r[1], r[2], rt), e.opacity = r[3];\n }\n s.baseColorTexture !== void 0 && i.push(n.assignTexture(e, \"map\", s.baseColorTexture, Lt));\n }\n return Promise.all(i);\n }\n}\nclass iu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_EMISSIVE_STRENGTH;\n }\n extendMaterialParams(e, t) {\n const i = this.parser.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = i.extensions[this.name].emissiveStrength;\n return s !== void 0 && (t.emissiveIntensity = s), Promise.resolve();\n }\n}\nclass su {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_CLEARCOAT;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n if (r.clearcoatFactor !== void 0 && (t.clearcoat = r.clearcoatFactor), r.clearcoatTexture !== void 0 && s.push(n.assignTexture(t, \"clearcoatMap\", r.clearcoatTexture)), r.clearcoatRoughnessFactor !== void 0 && (t.clearcoatRoughness = r.clearcoatRoughnessFactor), r.clearcoatRoughnessTexture !== void 0 && s.push(n.assignTexture(t, \"clearcoatRoughnessMap\", r.clearcoatRoughnessTexture)), r.clearcoatNormalTexture !== void 0 && (s.push(n.assignTexture(t, \"clearcoatNormalMap\", r.clearcoatNormalTexture)), r.clearcoatNormalTexture.scale !== void 0)) {\n const a = r.clearcoatNormalTexture.scale;\n t.clearcoatNormalScale = new ue(a, a);\n }\n return Promise.all(s);\n }\n}\nclass ru {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_DISPERSION;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const i = this.parser.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = i.extensions[this.name];\n return t.dispersion = s.dispersion !== void 0 ? s.dispersion : 0, Promise.resolve();\n }\n}\nclass ou {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_IRIDESCENCE;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n return r.iridescenceFactor !== void 0 && (t.iridescence = r.iridescenceFactor), r.iridescenceTexture !== void 0 && s.push(n.assignTexture(t, \"iridescenceMap\", r.iridescenceTexture)), r.iridescenceIor !== void 0 && (t.iridescenceIOR = r.iridescenceIor), t.iridescenceThicknessRange === void 0 && (t.iridescenceThicknessRange = [100, 400]), r.iridescenceThicknessMinimum !== void 0 && (t.iridescenceThicknessRange[0] = r.iridescenceThicknessMinimum), r.iridescenceThicknessMaximum !== void 0 && (t.iridescenceThicknessRange[1] = r.iridescenceThicknessMaximum), r.iridescenceThicknessTexture !== void 0 && s.push(n.assignTexture(t, \"iridescenceThicknessMap\", r.iridescenceThicknessTexture)), Promise.all(s);\n }\n}\nclass au {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_SHEEN;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [];\n t.sheenColor = new st(0, 0, 0), t.sheenRoughness = 0, t.sheen = 1;\n const r = i.extensions[this.name];\n if (r.sheenColorFactor !== void 0) {\n const a = r.sheenColorFactor;\n t.sheenColor.setRGB(a[0], a[1], a[2], rt);\n }\n return r.sheenRoughnessFactor !== void 0 && (t.sheenRoughness = r.sheenRoughnessFactor), r.sheenColorTexture !== void 0 && s.push(n.assignTexture(t, \"sheenColorMap\", r.sheenColorTexture, Lt)), r.sheenRoughnessTexture !== void 0 && s.push(n.assignTexture(t, \"sheenRoughnessMap\", r.sheenRoughnessTexture)), Promise.all(s);\n }\n}\nclass lu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_TRANSMISSION;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n return r.transmissionFactor !== void 0 && (t.transmission = r.transmissionFactor), r.transmissionTexture !== void 0 && s.push(n.assignTexture(t, \"transmissionMap\", r.transmissionTexture)), Promise.all(s);\n }\n}\nclass cu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_VOLUME;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n t.thickness = r.thicknessFactor !== void 0 ? r.thicknessFactor : 0, r.thicknessTexture !== void 0 && s.push(n.assignTexture(t, \"thicknessMap\", r.thicknessTexture)), t.attenuationDistance = r.attenuationDistance || 1 / 0;\n const a = r.attenuationColor || [1, 1, 1];\n return t.attenuationColor = new st().setRGB(a[0], a[1], a[2], rt), Promise.all(s);\n }\n}\nclass hu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_IOR;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const i = this.parser.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = i.extensions[this.name];\n return t.ior = s.ior !== void 0 ? s.ior : 1.5, Promise.resolve();\n }\n}\nclass uu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_SPECULAR;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n t.specularIntensity = r.specularFactor !== void 0 ? r.specularFactor : 1, r.specularTexture !== void 0 && s.push(n.assignTexture(t, \"specularIntensityMap\", r.specularTexture));\n const a = r.specularColorFactor || [1, 1, 1];\n return t.specularColor = new st().setRGB(a[0], a[1], a[2], rt), r.specularColorTexture !== void 0 && s.push(n.assignTexture(t, \"specularColorMap\", r.specularColorTexture, Lt)), Promise.all(s);\n }\n}\nclass du {\n constructor(e) {\n this.parser = e, this.name = le.EXT_MATERIALS_BUMP;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n return t.bumpScale = r.bumpFactor !== void 0 ? r.bumpFactor : 1, r.bumpTexture !== void 0 && s.push(n.assignTexture(t, \"bumpMap\", r.bumpTexture)), Promise.all(s);\n }\n}\nclass fu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_ANISOTROPY;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ft;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const s = [], r = i.extensions[this.name];\n return r.anisotropyStrength !== void 0 && (t.anisotropy = r.anisotropyStrength), r.anisotropyRotation !== void 0 && (t.anisotropyRotation = r.anisotropyRotation), r.anisotropyTexture !== void 0 && s.push(n.assignTexture(t, \"anisotropyMap\", r.anisotropyTexture)), Promise.all(s);\n }\n}\nclass pu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_TEXTURE_BASISU;\n }\n loadTexture(e) {\n const t = this.parser, n = t.json, i = n.textures[e];\n if (!i.extensions || !i.extensions[this.name])\n return null;\n const s = i.extensions[this.name], r = t.options.ktx2Loader;\n if (!r) {\n if (n.extensionsRequired && n.extensionsRequired.indexOf(this.name) >= 0)\n throw new Error(\"THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures\");\n return null;\n }\n return t.loadTextureImage(e, s.source, r);\n }\n}\nclass mu {\n constructor(e) {\n this.parser = e, this.name = le.EXT_TEXTURE_WEBP;\n }\n loadTexture(e) {\n const t = this.name, n = this.parser, i = n.json, s = i.textures[e];\n if (!s.extensions || !s.extensions[t])\n return null;\n const r = s.extensions[t], a = i.images[r.source];\n let l = n.textureLoader;\n if (a.uri) {\n const h = n.options.manager.getHandler(a.uri);\n h !== null && (l = h);\n }\n return n.loadTextureImage(e, r.source, l);\n }\n}\nclass gu {\n constructor(e) {\n this.parser = e, this.name = le.EXT_TEXTURE_AVIF;\n }\n loadTexture(e) {\n const t = this.name, n = this.parser, i = n.json, s = i.textures[e];\n if (!s.extensions || !s.extensions[t])\n return null;\n const r = s.extensions[t], a = i.images[r.source];\n let l = n.textureLoader;\n if (a.uri) {\n const h = n.options.manager.getHandler(a.uri);\n h !== null && (l = h);\n }\n return n.loadTextureImage(e, r.source, l);\n }\n}\nclass yu {\n constructor(e) {\n this.name = le.EXT_MESHOPT_COMPRESSION, this.parser = e;\n }\n loadBufferView(e) {\n const t = this.parser.json, n = t.bufferViews[e];\n if (n.extensions && n.extensions[this.name]) {\n const i = n.extensions[this.name], s = this.parser.getDependency(\"buffer\", i.buffer), r = this.parser.options.meshoptDecoder;\n if (!r || !r.supported) {\n if (t.extensionsRequired && t.extensionsRequired.indexOf(this.name) >= 0)\n throw new Error(\"THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files\");\n return null;\n }\n return s.then(function(a) {\n const l = i.byteOffset || 0, h = i.byteLength || 0, c = i.count, u = i.byteStride, m = new Uint8Array(a, l, h);\n return r.decodeGltfBufferAsync ? r.decodeGltfBufferAsync(c, u, m, i.mode, i.filter).then(function(f) {\n return f.buffer;\n }) : r.ready.then(function() {\n const f = new ArrayBuffer(c * u);\n return r.decodeGltfBuffer(new Uint8Array(f), c, u, m, i.mode, i.filter), f;\n });\n });\n } else\n return null;\n }\n}\nclass wu {\n constructor(e) {\n this.name = le.EXT_MESH_GPU_INSTANCING, this.parser = e;\n }\n createNodeMesh(e) {\n const t = this.parser.json, n = t.nodes[e];\n if (!n.extensions || !n.extensions[this.name] || n.mesh === void 0)\n return null;\n const i = t.meshes[n.mesh];\n for (const h of i.primitives)\n if (h.mode !== Xe.TRIANGLES && h.mode !== Xe.TRIANGLE_STRIP && h.mode !== Xe.TRIANGLE_FAN && h.mode !== void 0)\n return null;\n const r = n.extensions[this.name].attributes, a = [], l = {};\n for (const h in r)\n a.push(this.parser.getDependency(\"accessor\", r[h]).then((c) => (l[h] = c, l[h])));\n return a.length < 1 ? null : (a.push(this.parser.createNodeMesh(e)), Promise.all(a).then((h) => {\n const c = h.pop(), u = c.isGroup ? c.children : [c], m = h[0].count, f = [];\n for (const d of u) {\n const p = new Me(), g = new K(), y = new Ni(), w = new K(1, 1, 1), x = new fl(d.geometry, d.material, m);\n for (let _ = 0; _ < m; _++)\n l.TRANSLATION && g.fromBufferAttribute(l.TRANSLATION, _), l.ROTATION && y.fromBufferAttribute(l.ROTATION, _), l.SCALE && w.fromBufferAttribute(l.SCALE, _), x.setMatrixAt(_, p.compose(g, y, w));\n for (const _ in l)\n if (_ === \"_COLOR_0\") {\n const b = l[_];\n x.instanceColor = new pl(b.array, b.itemSize, b.normalized);\n } else _ !== \"TRANSLATION\" && _ !== \"ROTATION\" && _ !== \"SCALE\" && d.geometry.setAttribute(_, l[_]);\n $o.prototype.copy.call(x, d), this.parser.assignFinalMaterial(x), f.push(x);\n }\n return c.isGroup ? (c.clear(), c.add(...f), c) : f[0];\n }));\n }\n}\nconst Ia = \"glTF\", En = 12, $r = { JSON: 1313821514, BIN: 5130562 };\nclass xu {\n constructor(e) {\n this.name = le.KHR_BINARY_GLTF, this.content = null, this.body = null;\n const t = new DataView(e, 0, En), n = new TextDecoder();\n if (this.header = {\n magic: n.decode(new Uint8Array(e.slice(0, 4))),\n version: t.getUint32(4, !0),\n length: t.getUint32(8, !0)\n }, this.header.magic !== Ia)\n throw new Error(\"THREE.GLTFLoader: Unsupported glTF-Binary header.\");\n if (this.header.version < 2)\n throw new Error(\"THREE.GLTFLoader: Legacy binary file detected.\");\n const i = this.header.length - En, s = new DataView(e, En);\n let r = 0;\n for (; r < i; ) {\n const a = s.getUint32(r, !0);\n r += 4;\n const l = s.getUint32(r, !0);\n if (r += 4, l === $r.JSON) {\n const h = new Uint8Array(e, En + r, a);\n this.content = n.decode(h);\n } else if (l === $r.BIN) {\n const h = En + r;\n this.body = e.slice(h, h + a);\n }\n r += a;\n }\n if (this.content === null)\n throw new Error(\"THREE.GLTFLoader: JSON content not found.\");\n }\n}\nclass _u {\n constructor(e, t) {\n if (!t)\n throw new Error(\"THREE.GLTFLoader: No DRACOLoader instance provided.\");\n this.name = le.KHR_DRACO_MESH_COMPRESSION, this.json = e, this.dracoLoader = t, this.dracoLoader.preload();\n }\n decodePrimitive(e, t) {\n const n = this.json, i = this.dracoLoader, s = e.extensions[this.name].bufferView, r = e.extensions[this.name].attributes, a = {}, l = {}, h = {};\n for (const c in r) {\n const u = Ws[c] || c.toLowerCase();\n a[u] = r[c];\n }\n for (const c in e.attributes) {\n const u = Ws[c] || c.toLowerCase();\n if (r[c] !== void 0) {\n const m = n.accessors[e.attributes[c]], f = yn[m.componentType];\n h[u] = f.name, l[u] = m.normalized === !0;\n }\n }\n return t.getDependency(\"bufferView\", s).then(function(c) {\n return new Promise(function(u, m) {\n i.decodeDracoFile(c, function(f) {\n for (const d in f.attributes) {\n const p = f.attributes[d], g = l[d];\n g !== void 0 && (p.normalized = g);\n }\n u(f);\n }, a, h, rt, m);\n });\n });\n }\n}\nclass vu {\n constructor() {\n this.name = le.KHR_TEXTURE_TRANSFORM;\n }\n extendTexture(e, t) {\n return (t.texCoord === void 0 || t.texCoord === e.channel) && t.offset === void 0 && t.rotation === void 0 && t.scale === void 0 || (e = e.clone(), t.texCoord !== void 0 && (e.channel = t.texCoord), t.offset !== void 0 && e.offset.fromArray(t.offset), t.rotation !== void 0 && (e.rotation = t.rotation), t.scale !== void 0 && e.repeat.fromArray(t.scale), e.needsUpdate = !0), e;\n }\n}\nclass bu {\n constructor() {\n this.name = le.KHR_MESH_QUANTIZATION;\n }\n}\nclass La extends zl {\n constructor(e, t, n, i) {\n super(e, t, n, i);\n }\n copySampleValue_(e) {\n const t = this.resultBuffer, n = this.sampleValues, i = this.valueSize, s = e * i * 3 + i;\n for (let r = 0; r !== i; r++)\n t[r] = n[s + r];\n return t;\n }\n interpolate_(e, t, n, i) {\n const s = this.resultBuffer, r = this.sampleValues, a = this.valueSize, l = a * 2, h = a * 3, c = i - t, u = (n - t) / c, m = u * u, f = m * u, d = e * h, p = d - h, g = -2 * f + 3 * m, y = f - m, w = 1 - g, x = y - m + u;\n for (let _ = 0; _ !== a; _++) {\n const b = r[p + _ + a], E = r[p + _ + l] * c, A = r[d + _ + a], P = r[d + _] * c;\n s[_] = w * b + x * E + g * A + y * P;\n }\n return s;\n }\n}\nconst Mu = new Ni();\nclass Su extends La {\n interpolate_(e, t, n, i) {\n const s = super.interpolate_(e, t, n, i);\n return Mu.fromArray(s).normalize().toArray(s), s;\n }\n}\nconst Xe = {\n POINTS: 0,\n LINES: 1,\n LINE_LOOP: 2,\n LINE_STRIP: 3,\n TRIANGLES: 4,\n TRIANGLE_STRIP: 5,\n TRIANGLE_FAN: 6\n}, yn = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array\n}, Jr = {\n 9728: xn,\n 9729: Hn,\n 9984: xl,\n 9985: wl,\n 9986: yl,\n 9987: Jo\n}, Qr = {\n 33071: vl,\n 33648: _l,\n 10497: vt\n}, us = {\n SCALAR: 1,\n VEC2: 2,\n VEC3: 3,\n VEC4: 4,\n MAT2: 4,\n MAT3: 9,\n MAT4: 16\n}, Ws = {\n POSITION: \"position\",\n NORMAL: \"normal\",\n TANGENT: \"tangent\",\n TEXCOORD_0: \"uv\",\n TEXCOORD_1: \"uv1\",\n TEXCOORD_2: \"uv2\",\n TEXCOORD_3: \"uv3\",\n COLOR_0: \"color\",\n WEIGHTS_0: \"skinWeight\",\n JOINTS_0: \"skinIndex\"\n}, At = {\n scale: \"scale\",\n translation: \"position\",\n rotation: \"quaternion\",\n weights: \"morphTargetInfluences\"\n}, Tu = {\n CUBICSPLINE: void 0,\n // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n // keyframe track will be initialized with a default interpolation type, then modified.\n LINEAR: ea,\n STEP: Ll\n}, ds = {\n OPAQUE: \"OPAQUE\",\n MASK: \"MASK\",\n BLEND: \"BLEND\"\n};\nfunction Eu(o) {\n return o.DefaultMaterial === void 0 && (o.DefaultMaterial = new Qo({\n color: 16777215,\n emissive: 0,\n metalness: 1,\n roughness: 1,\n transparent: !1,\n depthTest: !0,\n side: Us\n })), o.DefaultMaterial;\n}\nfunction Vt(o, e, t) {\n for (const n in t.extensions)\n o[n] === void 0 && (e.userData.gltfExtensions = e.userData.gltfExtensions || {}, e.userData.gltfExtensions[n] = t.extensions[n]);\n}\nfunction ct(o, e) {\n e.extras !== void 0 && (typeof e.extras == \"object\" ? Object.assign(o.userData, e.extras) : console.warn(\"THREE.GLTFLoader: Ignoring primitive type .extras, \" + e.extras));\n}\nfunction Au(o, e, t) {\n let n = !1, i = !1, s = !1;\n for (let h = 0, c = e.length; h < c; h++) {\n const u = e[h];\n if (u.POSITION !== void 0 && (n = !0), u.NORMAL !== void 0 && (i = !0), u.COLOR_0 !== void 0 && (s = !0), n && i && s) break;\n }\n if (!n && !i && !s) return Promise.resolve(o);\n const r = [], a = [], l = [];\n for (let h = 0, c = e.length; h < c; h++) {\n const u = e[h];\n if (n) {\n const m = u.POSITION !== void 0 ? t.getDependency(\"accessor\", u.POSITION) : o.attributes.position;\n r.push(m);\n }\n if (i) {\n const m = u.NORMAL !== void 0 ? t.getDependency(\"accessor\", u.NORMAL) : o.attributes.normal;\n a.push(m);\n }\n if (s) {\n const m = u.COLOR_0 !== void 0 ? t.getDependency(\"accessor\", u.COLOR_0) : o.attributes.color;\n l.push(m);\n }\n }\n return Promise.all([\n Promise.all(r),\n Promise.all(a),\n Promise.all(l)\n ]).then(function(h) {\n const c = h[0], u = h[1], m = h[2];\n return n && (o.morphAttributes.position = c), i && (o.morphAttributes.normal = u), s && (o.morphAttributes.color = m), o.morphTargetsRelative = !0, o;\n });\n}\nfunction Cu(o, e) {\n if (o.updateMorphTargets(), e.weights !== void 0)\n for (let t = 0, n = e.weights.length; t < n; t++)\n o.morphTargetInfluences[t] = e.weights[t];\n if (e.extras && Array.isArray(e.extras.targetNames)) {\n const t = e.extras.targetNames;\n if (o.morphTargetInfluences.length === t.length) {\n o.morphTargetDictionary = {};\n for (let n = 0, i = t.length; n < i; n++)\n o.morphTargetDictionary[t[n]] = n;\n } else\n console.warn(\"THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.\");\n }\n}\nfunction Pu(o) {\n let e;\n const t = o.extensions && o.extensions[le.KHR_DRACO_MESH_COMPRESSION];\n if (t ? e = \"draco:\" + t.bufferView + \":\" + t.indices + \":\" + fs(t.attributes) : e = o.indices + \":\" + fs(o.attributes) + \":\" + o.mode, o.targets !== void 0)\n for (let n = 0, i = o.targets.length; n < i; n++)\n e += \":\" + fs(o.targets[n]);\n return e;\n}\nfunction fs(o) {\n let e = \"\";\n const t = Object.keys(o).sort();\n for (let n = 0, i = t.length; n < i; n++)\n e += t[n] + \":\" + o[t[n]] + \";\";\n return e;\n}\nfunction Xs(o) {\n switch (o) {\n case Int8Array:\n return 1 / 127;\n case Uint8Array:\n return 1 / 255;\n case Int16Array:\n return 1 / 32767;\n case Uint16Array:\n return 1 / 65535;\n default:\n throw new Error(\"THREE.GLTFLoader: Unsupported normalized accessor component type.\");\n }\n}\nfunction Ru(o) {\n return o.search(/\\.jpe?g($|\\?)/i) > 0 || o.search(/^data\\:image\\/jpeg/) === 0 ? \"image/jpeg\" : o.search(/\\.webp($|\\?)/i) > 0 || o.search(/^data\\:image\\/webp/) === 0 ? \"image/webp\" : o.search(/\\.ktx2($|\\?)/i) > 0 || o.search(/^data\\:image\\/ktx2/) === 0 ? \"image/ktx2\" : \"image/png\";\n}\nconst Du = new Me();\nclass ku {\n constructor(e = {}, t = {}) {\n this.json = e, this.extensions = {}, this.plugins = {}, this.options = t, this.cache = new eu(), this.associations = /* @__PURE__ */ new Map(), this.primitiveCache = {}, this.nodeCache = {}, this.meshCache = { refs: {}, uses: {} }, this.cameraCache = { refs: {}, uses: {} }, this.lightCache = { refs: {}, uses: {} }, this.sourceCache = {}, this.textureCache = {}, this.nodeNamesUsed = {};\n let n = !1, i = -1, s = !1, r = -1;\n if (typeof navigator < \"u\") {\n const a = navigator.userAgent;\n n = /^((?!chrome|android).)*safari/i.test(a) === !0;\n const l = a.match(/Version\\/(\\d+)/);\n i = n && l ? parseInt(l[1], 10) : -1, s = a.indexOf(\"Firefox\") > -1, r = s ? a.match(/Firefox\\/([0-9]+)\\./)[1] : -1;\n }\n typeof createImageBitmap > \"u\" || n && i < 17 || s && r < 98 ? this.textureLoader = new ml(this.options.manager) : this.textureLoader = new gl(this.options.manager), this.textureLoader.setCrossOrigin(this.options.crossOrigin), this.textureLoader.setRequestHeader(this.options.requestHeader), this.fileLoader = new Ui(this.options.manager), this.fileLoader.setResponseType(\"arraybuffer\"), this.options.crossOrigin === \"use-credentials\" && this.fileLoader.setWithCredentials(!0);\n }\n setExtensions(e) {\n this.extensions = e;\n }\n setPlugins(e) {\n this.plugins = e;\n }\n parse(e, t) {\n const n = this, i = this.json, s = this.extensions;\n this.cache.removeAll(), this.nodeCache = {}, this._invokeAll(function(r) {\n return r._markDefs && r._markDefs();\n }), Promise.all(this._invokeAll(function(r) {\n return r.beforeRoot && r.beforeRoot();\n })).then(function() {\n return Promise.all([\n n.getDependencies(\"scene\"),\n n.getDependencies(\"animation\"),\n n.getDependencies(\"camera\")\n ]);\n }).then(function(r) {\n const a = {\n scene: r[0][i.scene || 0],\n scenes: r[0],\n animations: r[1],\n cameras: r[2],\n asset: i.asset,\n parser: n,\n userData: {}\n };\n return Vt(s, a, i), ct(a, i), Promise.all(n._invokeAll(function(l) {\n return l.afterRoot && l.afterRoot(a);\n })).then(function() {\n for (const l of a.scenes)\n l.updateMatrixWorld();\n e(a);\n });\n }).catch(t);\n }\n /**\n * Marks the special nodes/meshes in json for efficient parse.\n *\n * @private\n */\n _markDefs() {\n const e = this.json.nodes || [], t = this.json.skins || [], n = this.json.meshes || [];\n for (let i = 0, s = t.length; i < s; i++) {\n const r = t[i].joints;\n for (let a = 0, l = r.length; a < l; a++)\n e[r[a]].isBone = !0;\n }\n for (let i = 0, s = e.length; i < s; i++) {\n const r = e[i];\n r.mesh !== void 0 && (this._addNodeRef(this.meshCache, r.mesh), r.skin !== void 0 && (n[r.mesh].isSkinnedMesh = !0)), r.camera !== void 0 && this._addNodeRef(this.cameraCache, r.camera);\n }\n }\n /**\n * Counts references to shared node / Object3D resources. These resources\n * can be reused, or \"instantiated\", at multiple nodes in the scene\n * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n * be marked. Non-scenegraph resources (like Materials, Geometries, and\n * Textures) can be reused directly and are not marked here.\n *\n * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n *\n * @private\n * @param {Object} cache\n * @param {Object3D} index\n */\n _addNodeRef(e, t) {\n t !== void 0 && (e.refs[t] === void 0 && (e.refs[t] = e.uses[t] = 0), e.refs[t]++);\n }\n /**\n * Returns a reference to a shared resource, cloning it if necessary.\n *\n * @private\n * @param {Object} cache\n * @param {number} index\n * @param {Object} object\n * @return {Object}\n */\n _getNodeRef(e, t, n) {\n if (e.refs[t] <= 1) return n;\n const i = n.clone(), s = (r, a) => {\n const l = this.associations.get(r);\n l != null && this.associations.set(a, l);\n for (const [h, c] of r.children.entries())\n s(c, a.children[h]);\n };\n return s(n, i), i.name += \"_instance_\" + e.uses[t]++, i;\n }\n _invokeOne(e) {\n const t = Object.values(this.plugins);\n t.push(this);\n for (let n = 0; n < t.length; n++) {\n const i = e(t[n]);\n if (i) return i;\n }\n return null;\n }\n _invokeAll(e) {\n const t = Object.values(this.plugins);\n t.unshift(this);\n const n = [];\n for (let i = 0; i < t.length; i++) {\n const s = e(t[i]);\n s && n.push(s);\n }\n return n;\n }\n /**\n * Requests the specified dependency asynchronously, with caching.\n *\n * @private\n * @param {string} type\n * @param {number} index\n * @return {Promise}\n */\n getDependency(e, t) {\n const n = e + \":\" + t;\n let i = this.cache.get(n);\n if (!i) {\n switch (e) {\n case \"scene\":\n i = this.loadScene(t);\n break;\n case \"node\":\n i = this._invokeOne(function(s) {\n return s.loadNode && s.loadNode(t);\n });\n break;\n case \"mesh\":\n i = this._invokeOne(function(s) {\n return s.loadMesh && s.loadMesh(t);\n });\n break;\n case \"accessor\":\n i = this.loadAccessor(t);\n break;\n case \"bufferView\":\n i = this._invokeOne(function(s) {\n return s.loadBufferView && s.loadBufferView(t);\n });\n break;\n case \"buffer\":\n i = this.loadBuffer(t);\n break;\n case \"material\":\n i = this._invokeOne(function(s) {\n return s.loadMaterial && s.loadMaterial(t);\n });\n break;\n case \"texture\":\n i = this._invokeOne(function(s) {\n return s.loadTexture && s.loadTexture(t);\n });\n break;\n case \"skin\":\n i = this.loadSkin(t);\n break;\n case \"animation\":\n i = this._invokeOne(function(s) {\n return s.loadAnimation && s.loadAnimation(t);\n });\n break;\n case \"camera\":\n i = this.loadCamera(t);\n break;\n default:\n if (i = this._invokeOne(function(s) {\n return s != this && s.getDependency && s.getDependency(e, t);\n }), !i)\n throw new Error(\"Unknown type: \" + e);\n break;\n }\n this.cache.add(n, i);\n }\n return i;\n }\n /**\n * Requests all dependencies of the specified type asynchronously, with caching.\n *\n * @private\n * @param {string} type\n * @return {Promise>}\n */\n getDependencies(e) {\n let t = this.cache.get(e);\n if (!t) {\n const n = this, i = this.json[e + (e === \"mesh\" ? \"es\" : \"s\")] || [];\n t = Promise.all(i.map(function(s, r) {\n return n.getDependency(e, r);\n })), this.cache.add(e, t);\n }\n return t;\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n *\n * @private\n * @param {number} bufferIndex\n * @return {Promise}\n */\n loadBuffer(e) {\n const t = this.json.buffers[e], n = this.fileLoader;\n if (t.type && t.type !== \"arraybuffer\")\n throw new Error(\"THREE.GLTFLoader: \" + t.type + \" buffer type is not supported.\");\n if (t.uri === void 0 && e === 0)\n return Promise.resolve(this.extensions[le.KHR_BINARY_GLTF].body);\n const i = this.options;\n return new Promise(function(s, r) {\n n.load(Nn.resolveURL(t.uri, i.path), s, void 0, function() {\n r(new Error('THREE.GLTFLoader: Failed to load buffer \"' + t.uri + '\".'));\n });\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n *\n * @private\n * @param {number} bufferViewIndex\n * @return {Promise}\n */\n loadBufferView(e) {\n const t = this.json.bufferViews[e];\n return this.getDependency(\"buffer\", t.buffer).then(function(n) {\n const i = t.byteLength || 0, s = t.byteOffset || 0;\n return n.slice(s, s + i);\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n *\n * @private\n * @param {number} accessorIndex\n * @return {Promise}\n */\n loadAccessor(e) {\n const t = this, n = this.json, i = this.json.accessors[e];\n if (i.bufferView === void 0 && i.sparse === void 0) {\n const r = us[i.type], a = yn[i.componentType], l = i.normalized === !0, h = new a(i.count * r);\n return Promise.resolve(new ut(h, r, l));\n }\n const s = [];\n return i.bufferView !== void 0 ? s.push(this.getDependency(\"bufferView\", i.bufferView)) : s.push(null), i.sparse !== void 0 && (s.push(this.getDependency(\"bufferView\", i.sparse.indices.bufferView)), s.push(this.getDependency(\"bufferView\", i.sparse.values.bufferView))), Promise.all(s).then(function(r) {\n const a = r[0], l = us[i.type], h = yn[i.componentType], c = h.BYTES_PER_ELEMENT, u = c * l, m = i.byteOffset || 0, f = i.bufferView !== void 0 ? n.bufferViews[i.bufferView].byteStride : void 0, d = i.normalized === !0;\n let p, g;\n if (f && f !== u) {\n const y = Math.floor(m / f), w = \"InterleavedBuffer:\" + i.bufferView + \":\" + i.componentType + \":\" + y + \":\" + i.count;\n let x = t.cache.get(w);\n x || (p = new h(a, y * f, i.count * f / c), x = new qo(p, f / c), t.cache.add(w, x)), g = new Yo(x, l, m % f / c, d);\n } else\n a === null ? p = new h(i.count * l) : p = new h(a, m, i.count * l), g = new ut(p, l, d);\n if (i.sparse !== void 0) {\n const y = us.SCALAR, w = yn[i.sparse.indices.componentType], x = i.sparse.indices.byteOffset || 0, _ = i.sparse.values.byteOffset || 0, b = new w(r[1], x, i.sparse.count * y), E = new h(r[2], _, i.sparse.count * l);\n a !== null && (g = new ut(g.array.slice(), g.itemSize, g.normalized)), g.normalized = !1;\n for (let A = 0, P = b.length; A < P; A++) {\n const C = b[A];\n if (g.setX(C, E[A * l]), l >= 2 && g.setY(C, E[A * l + 1]), l >= 3 && g.setZ(C, E[A * l + 2]), l >= 4 && g.setW(C, E[A * l + 3]), l >= 5) throw new Error(\"THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.\");\n }\n g.normalized = d;\n }\n return g;\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n *\n * @private\n * @param {number} textureIndex\n * @return {Promise}\n */\n loadTexture(e) {\n const t = this.json, n = this.options, s = t.textures[e].source, r = t.images[s];\n let a = this.textureLoader;\n if (r.uri) {\n const l = n.manager.getHandler(r.uri);\n l !== null && (a = l);\n }\n return this.loadTextureImage(e, s, a);\n }\n loadTextureImage(e, t, n) {\n const i = this, s = this.json, r = s.textures[e], a = s.images[t], l = (a.uri || a.bufferView) + \":\" + r.sampler;\n if (this.textureCache[l])\n return this.textureCache[l];\n const h = this.loadImageSource(t, n).then(function(c) {\n c.flipY = !1, c.name = r.name || a.name || \"\", c.name === \"\" && typeof a.uri == \"string\" && a.uri.startsWith(\"data:image/\") === !1 && (c.name = a.uri);\n const m = (s.samplers || {})[r.sampler] || {};\n return c.magFilter = Jr[m.magFilter] || Hn, c.minFilter = Jr[m.minFilter] || Jo, c.wrapS = Qr[m.wrapS] || vt, c.wrapT = Qr[m.wrapT] || vt, c.generateMipmaps = !c.isCompressedTexture && c.minFilter !== xn && c.minFilter !== Hn, i.associations.set(c, { textures: e }), c;\n }).catch(function() {\n return null;\n });\n return this.textureCache[l] = h, h;\n }\n loadImageSource(e, t) {\n const n = this, i = this.json, s = this.options;\n if (this.sourceCache[e] !== void 0)\n return this.sourceCache[e].then((u) => u.clone());\n const r = i.images[e], a = self.URL || self.webkitURL;\n let l = r.uri || \"\", h = !1;\n if (r.bufferView !== void 0)\n l = n.getDependency(\"bufferView\", r.bufferView).then(function(u) {\n h = !0;\n const m = new Blob([u], { type: r.mimeType });\n return l = a.createObjectURL(m), l;\n });\n else if (r.uri === void 0)\n throw new Error(\"THREE.GLTFLoader: Image \" + e + \" is missing URI and bufferView\");\n const c = Promise.resolve(l).then(function(u) {\n return new Promise(function(m, f) {\n let d = m;\n t.isImageBitmapLoader === !0 && (d = function(p) {\n const g = new Mr(p);\n g.needsUpdate = !0, m(g);\n }), t.load(Nn.resolveURL(u, s.path), d, void 0, f);\n });\n }).then(function(u) {\n return h === !0 && a.revokeObjectURL(l), ct(u, r), u.userData.mimeType = r.mimeType || Ru(r.uri), u;\n }).catch(function(u) {\n throw console.error(\"THREE.GLTFLoader: Couldn't load texture\", l), u;\n });\n return this.sourceCache[e] = c, c;\n }\n /**\n * Asynchronously assigns a texture to the given material parameters.\n *\n * @private\n * @param {Object} materialParams\n * @param {string} mapName\n * @param {Object} mapDef\n * @param {string} [colorSpace]\n * @return {Promise}\n */\n assignTexture(e, t, n, i) {\n const s = this;\n return this.getDependency(\"texture\", n.index).then(function(r) {\n if (!r) return null;\n if (n.texCoord !== void 0 && n.texCoord > 0 && (r = r.clone(), r.channel = n.texCoord), s.extensions[le.KHR_TEXTURE_TRANSFORM]) {\n const a = n.extensions !== void 0 ? n.extensions[le.KHR_TEXTURE_TRANSFORM] : void 0;\n if (a) {\n const l = s.associations.get(r);\n r = s.extensions[le.KHR_TEXTURE_TRANSFORM].extendTexture(r, a), s.associations.set(r, l);\n }\n }\n return i !== void 0 && (r.colorSpace = i), e[t] = r, r;\n });\n }\n /**\n * Assigns final material to a Mesh, Line, or Points instance. The instance\n * already has a material (generated from the glTF material options alone)\n * but reuse of the same glTF material may require multiple threejs materials\n * to accommodate different primitive types, defines, etc. New materials will\n * be created if necessary, and reused from a cache.\n *\n * @private\n * @param {Object3D} mesh Mesh, Line, or Points instance.\n */\n assignFinalMaterial(e) {\n const t = e.geometry;\n let n = e.material;\n const i = t.attributes.tangent === void 0, s = t.attributes.color !== void 0, r = t.attributes.normal === void 0;\n if (e.isPoints) {\n const a = \"PointsMaterial:\" + n.uuid;\n let l = this.cache.get(a);\n l || (l = new bl(), ns.prototype.copy.call(l, n), l.color.copy(n.color), l.map = n.map, l.sizeAttenuation = !1, this.cache.add(a, l)), n = l;\n } else if (e.isLine) {\n const a = \"LineBasicMaterial:\" + n.uuid;\n let l = this.cache.get(a);\n l || (l = new Ml(), ns.prototype.copy.call(l, n), l.color.copy(n.color), l.map = n.map, this.cache.add(a, l)), n = l;\n }\n if (i || s || r) {\n let a = \"ClonedMaterial:\" + n.uuid + \":\";\n i && (a += \"derivative-tangents:\"), s && (a += \"vertex-colors:\"), r && (a += \"flat-shading:\");\n let l = this.cache.get(a);\n l || (l = n.clone(), s && (l.vertexColors = !0), r && (l.flatShading = !0), i && (l.normalScale && (l.normalScale.y *= -1), l.clearcoatNormalScale && (l.clearcoatNormalScale.y *= -1)), this.cache.add(a, l), this.associations.set(l, this.associations.get(n))), n = l;\n }\n e.material = n;\n }\n getMaterialType() {\n return Qo;\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n *\n * @private\n * @param {number} materialIndex\n * @return {Promise}\n */\n loadMaterial(e) {\n const t = this, n = this.json, i = this.extensions, s = n.materials[e];\n let r;\n const a = {}, l = s.extensions || {}, h = [];\n if (l[le.KHR_MATERIALS_UNLIT]) {\n const u = i[le.KHR_MATERIALS_UNLIT];\n r = u.getMaterialType(), h.push(u.extendParams(a, s, t));\n } else {\n const u = s.pbrMetallicRoughness || {};\n if (a.color = new st(1, 1, 1), a.opacity = 1, Array.isArray(u.baseColorFactor)) {\n const m = u.baseColorFactor;\n a.color.setRGB(m[0], m[1], m[2], rt), a.opacity = m[3];\n }\n u.baseColorTexture !== void 0 && h.push(t.assignTexture(a, \"map\", u.baseColorTexture, Lt)), a.metalness = u.metallicFactor !== void 0 ? u.metallicFactor : 1, a.roughness = u.roughnessFactor !== void 0 ? u.roughnessFactor : 1, u.metallicRoughnessTexture !== void 0 && (h.push(t.assignTexture(a, \"metalnessMap\", u.metallicRoughnessTexture)), h.push(t.assignTexture(a, \"roughnessMap\", u.metallicRoughnessTexture))), r = this._invokeOne(function(m) {\n return m.getMaterialType && m.getMaterialType(e);\n }), h.push(Promise.all(this._invokeAll(function(m) {\n return m.extendMaterialParams && m.extendMaterialParams(e, a);\n })));\n }\n s.doubleSided === !0 && (a.side = qi);\n const c = s.alphaMode || ds.OPAQUE;\n if (c === ds.BLEND ? (a.transparent = !0, a.depthWrite = !1) : (a.transparent = !1, c === ds.MASK && (a.alphaTest = s.alphaCutoff !== void 0 ? s.alphaCutoff : 0.5)), s.normalTexture !== void 0 && r !== On && (h.push(t.assignTexture(a, \"normalMap\", s.normalTexture)), a.normalScale = new ue(1, 1), s.normalTexture.scale !== void 0)) {\n const u = s.normalTexture.scale;\n a.normalScale.set(u, u);\n }\n if (s.occlusionTexture !== void 0 && r !== On && (h.push(t.assignTexture(a, \"aoMap\", s.occlusionTexture)), s.occlusionTexture.strength !== void 0 && (a.aoMapIntensity = s.occlusionTexture.strength)), s.emissiveFactor !== void 0 && r !== On) {\n const u = s.emissiveFactor;\n a.emissive = new st().setRGB(u[0], u[1], u[2], rt);\n }\n return s.emissiveTexture !== void 0 && r !== On && h.push(t.assignTexture(a, \"emissiveMap\", s.emissiveTexture, Lt)), Promise.all(h).then(function() {\n const u = new r(a);\n return s.name && (u.name = s.name), ct(u, s), t.associations.set(u, { materials: e }), s.extensions && Vt(i, u, s), u;\n });\n }\n /**\n * When Object3D instances are targeted by animation, they need unique names.\n *\n * @private\n * @param {string} originalName\n * @return {string}\n */\n createUniqueName(e) {\n const t = Sl.sanitizeNodeName(e || \"\");\n return t in this.nodeNamesUsed ? t + \"_\" + ++this.nodeNamesUsed[t] : (this.nodeNamesUsed[t] = 0, t);\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n *\n * Creates BufferGeometries from primitives.\n *\n * @private\n * @param {Array} primitives\n * @return {Promise>}\n */\n loadGeometries(e) {\n const t = this, n = this.extensions, i = this.primitiveCache;\n function s(a) {\n return n[le.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(a, t).then(function(l) {\n return eo(l, a, t);\n });\n }\n const r = [];\n for (let a = 0, l = e.length; a < l; a++) {\n const h = e[a], c = Pu(h), u = i[c];\n if (u)\n r.push(u.promise);\n else {\n let m;\n h.extensions && h.extensions[le.KHR_DRACO_MESH_COMPRESSION] ? m = s(h) : m = eo(new Zi(), h, t), i[c] = { primitive: h, promise: m }, r.push(m);\n }\n }\n return Promise.all(r);\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n *\n * @private\n * @param {number} meshIndex\n * @return {Promise}\n */\n loadMesh(e) {\n const t = this, n = this.json, i = this.extensions, s = n.meshes[e], r = s.primitives, a = [];\n for (let l = 0, h = r.length; l < h; l++) {\n const c = r[l].material === void 0 ? Eu(this.cache) : this.getDependency(\"material\", r[l].material);\n a.push(c);\n }\n return a.push(t.loadGeometries(r)), Promise.all(a).then(function(l) {\n const h = l.slice(0, l.length - 1), c = l[l.length - 1], u = [];\n for (let f = 0, d = c.length; f < d; f++) {\n const p = c[f], g = r[f];\n let y;\n const w = h[f];\n if (g.mode === Xe.TRIANGLES || g.mode === Xe.TRIANGLE_STRIP || g.mode === Xe.TRIANGLE_FAN || g.mode === void 0)\n y = s.isSkinnedMesh === !0 ? new Tl(p, w) : new ar(p, w), y.isSkinnedMesh === !0 && y.normalizeSkinWeights(), g.mode === Xe.TRIANGLE_STRIP ? y.geometry = Kr(y.geometry, Ko) : g.mode === Xe.TRIANGLE_FAN && (y.geometry = Kr(y.geometry, Fs));\n else if (g.mode === Xe.LINES)\n y = new El(p, w);\n else if (g.mode === Xe.LINE_STRIP)\n y = new Al(p, w);\n else if (g.mode === Xe.LINE_LOOP)\n y = new Cl(p, w);\n else if (g.mode === Xe.POINTS)\n y = new Pl(p, w);\n else\n throw new Error(\"THREE.GLTFLoader: Primitive mode unsupported: \" + g.mode);\n Object.keys(y.geometry.morphAttributes).length > 0 && Cu(y, s), y.name = t.createUniqueName(s.name || \"mesh_\" + e), ct(y, s), g.extensions && Vt(i, y, g), t.assignFinalMaterial(y), u.push(y);\n }\n for (let f = 0, d = u.length; f < d; f++)\n t.associations.set(u[f], {\n meshes: e,\n primitives: f\n });\n if (u.length === 1)\n return s.extensions && Vt(i, u[0], s), u[0];\n const m = new is();\n s.extensions && Vt(i, m, s), t.associations.set(m, { meshes: e });\n for (let f = 0, d = u.length; f < d; f++)\n m.add(u[f]);\n return m;\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n *\n * @private\n * @param {number} cameraIndex\n * @return {Promise|undefined}\n */\n loadCamera(e) {\n let t;\n const n = this.json.cameras[e], i = n[n.type];\n if (!i) {\n console.warn(\"THREE.GLTFLoader: Missing camera parameters.\");\n return;\n }\n return n.type === \"perspective\" ? t = new Rl(or.radToDeg(i.yfov), i.aspectRatio || 1, i.znear || 1, i.zfar || 2e6) : n.type === \"orthographic\" && (t = new Vo(-i.xmag, i.xmag, i.ymag, -i.ymag, i.znear, i.zfar)), n.name && (t.name = this.createUniqueName(n.name)), ct(t, n), Promise.resolve(t);\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n *\n * @private\n * @param {number} skinIndex\n * @return {Promise}\n */\n loadSkin(e) {\n const t = this.json.skins[e], n = [];\n for (let i = 0, s = t.joints.length; i < s; i++)\n n.push(this._loadNodeShallow(t.joints[i]));\n return t.inverseBindMatrices !== void 0 ? n.push(this.getDependency(\"accessor\", t.inverseBindMatrices)) : n.push(null), Promise.all(n).then(function(i) {\n const s = i.pop(), r = i, a = [], l = [];\n for (let h = 0, c = r.length; h < c; h++) {\n const u = r[h];\n if (u) {\n a.push(u);\n const m = new Me();\n s !== null && m.fromArray(s.array, h * 16), l.push(m);\n } else\n console.warn('THREE.GLTFLoader: Joint \"%s\" could not be found.', t.joints[h]);\n }\n return new Dl(a, l);\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n *\n * @private\n * @param {number} animationIndex\n * @return {Promise}\n */\n loadAnimation(e) {\n const t = this.json, n = this, i = t.animations[e], s = i.name ? i.name : \"animation_\" + e, r = [], a = [], l = [], h = [], c = [];\n for (let u = 0, m = i.channels.length; u < m; u++) {\n const f = i.channels[u], d = i.samplers[f.sampler], p = f.target, g = p.node, y = i.parameters !== void 0 ? i.parameters[d.input] : d.input, w = i.parameters !== void 0 ? i.parameters[d.output] : d.output;\n p.node !== void 0 && (r.push(this.getDependency(\"node\", g)), a.push(this.getDependency(\"accessor\", y)), l.push(this.getDependency(\"accessor\", w)), h.push(d), c.push(p));\n }\n return Promise.all([\n Promise.all(r),\n Promise.all(a),\n Promise.all(l),\n Promise.all(h),\n Promise.all(c)\n ]).then(function(u) {\n const m = u[0], f = u[1], d = u[2], p = u[3], g = u[4], y = [];\n for (let x = 0, _ = m.length; x < _; x++) {\n const b = m[x], E = f[x], A = d[x], P = p[x], C = g[x];\n if (b === void 0) continue;\n b.updateMatrix && b.updateMatrix();\n const D = n._createAnimationTracks(b, E, A, P, C);\n if (D)\n for (let I = 0; I < D.length; I++)\n y.push(D[I]);\n }\n const w = new kl(s, void 0, y);\n return ct(w, i), w;\n });\n }\n createNodeMesh(e) {\n const t = this.json, n = this, i = t.nodes[e];\n return i.mesh === void 0 ? null : n.getDependency(\"mesh\", i.mesh).then(function(s) {\n const r = n._getNodeRef(n.meshCache, i.mesh, s);\n return i.weights !== void 0 && r.traverse(function(a) {\n if (a.isMesh)\n for (let l = 0, h = i.weights.length; l < h; l++)\n a.morphTargetInfluences[l] = i.weights[l];\n }), r;\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n *\n * @private\n * @param {number} nodeIndex\n * @return {Promise}\n */\n loadNode(e) {\n const t = this.json, n = this, i = t.nodes[e], s = n._loadNodeShallow(e), r = [], a = i.children || [];\n for (let h = 0, c = a.length; h < c; h++)\n r.push(n.getDependency(\"node\", a[h]));\n const l = i.skin === void 0 ? Promise.resolve(null) : n.getDependency(\"skin\", i.skin);\n return Promise.all([\n s,\n Promise.all(r),\n l\n ]).then(function(h) {\n const c = h[0], u = h[1], m = h[2];\n m !== null && c.traverse(function(f) {\n f.isSkinnedMesh && f.bind(m, Du);\n });\n for (let f = 0, d = u.length; f < d; f++)\n c.add(u[f]);\n return c;\n });\n }\n // ._loadNodeShallow() parses a single node.\n // skin and child nodes are created and added in .loadNode() (no '_' prefix).\n _loadNodeShallow(e) {\n const t = this.json, n = this.extensions, i = this;\n if (this.nodeCache[e] !== void 0)\n return this.nodeCache[e];\n const s = t.nodes[e], r = s.name ? i.createUniqueName(s.name) : \"\", a = [], l = i._invokeOne(function(h) {\n return h.createNodeMesh && h.createNodeMesh(e);\n });\n return l && a.push(l), s.camera !== void 0 && a.push(i.getDependency(\"camera\", s.camera).then(function(h) {\n return i._getNodeRef(i.cameraCache, s.camera, h);\n })), i._invokeAll(function(h) {\n return h.createNodeAttachment && h.createNodeAttachment(e);\n }).forEach(function(h) {\n a.push(h);\n }), this.nodeCache[e] = Promise.all(a).then(function(h) {\n let c;\n if (s.isBone === !0 ? c = new Il() : h.length > 1 ? c = new is() : h.length === 1 ? c = h[0] : c = new $o(), c !== h[0])\n for (let u = 0, m = h.length; u < m; u++)\n c.add(h[u]);\n if (s.name && (c.userData.name = s.name, c.name = r), ct(c, s), s.extensions && Vt(n, c, s), s.matrix !== void 0) {\n const u = new Me();\n u.fromArray(s.matrix), c.applyMatrix4(u);\n } else\n s.translation !== void 0 && c.position.fromArray(s.translation), s.rotation !== void 0 && c.quaternion.fromArray(s.rotation), s.scale !== void 0 && c.scale.fromArray(s.scale);\n if (!i.associations.has(c))\n i.associations.set(c, {});\n else if (s.mesh !== void 0 && i.meshCache.refs[s.mesh] > 1) {\n const u = i.associations.get(c);\n i.associations.set(c, { ...u });\n }\n return i.associations.get(c).nodes = e, c;\n }), this.nodeCache[e];\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n *\n * @private\n * @param {number} sceneIndex\n * @return {Promise}\n */\n loadScene(e) {\n const t = this.extensions, n = this.json.scenes[e], i = this, s = new is();\n n.name && (s.name = i.createUniqueName(n.name)), ct(s, n), n.extensions && Vt(t, s, n);\n const r = n.nodes || [], a = [];\n for (let l = 0, h = r.length; l < h; l++)\n a.push(i.getDependency(\"node\", r[l]));\n return Promise.all(a).then(function(l) {\n for (let c = 0, u = l.length; c < u; c++)\n s.add(l[c]);\n const h = (c) => {\n const u = /* @__PURE__ */ new Map();\n for (const [m, f] of i.associations)\n (m instanceof ns || m instanceof Mr) && u.set(m, f);\n return c.traverse((m) => {\n const f = i.associations.get(m);\n f != null && u.set(m, f);\n }), u;\n };\n return i.associations = h(s), s;\n });\n }\n _createAnimationTracks(e, t, n, i, s) {\n const r = [], a = e.name ? e.name : e.uuid, l = [];\n At[s.path] === At.weights ? e.traverse(function(m) {\n m.morphTargetInfluences && l.push(m.name ? m.name : m.uuid);\n }) : l.push(a);\n let h;\n switch (At[s.path]) {\n case At.weights:\n h = Tr;\n break;\n case At.rotation:\n h = Er;\n break;\n case At.translation:\n case At.scale:\n h = Sr;\n break;\n default:\n switch (n.itemSize) {\n case 1:\n h = Tr;\n break;\n case 2:\n case 3:\n default:\n h = Sr;\n break;\n }\n break;\n }\n const c = i.interpolation !== void 0 ? Tu[i.interpolation] : ea, u = this._getArrayFromAccessor(n);\n for (let m = 0, f = l.length; m < f; m++) {\n const d = new h(\n l[m] + \".\" + At[s.path],\n t.array,\n u,\n c\n );\n i.interpolation === \"CUBICSPLINE\" && this._createCubicSplineTrackInterpolant(d), r.push(d);\n }\n return r;\n }\n _getArrayFromAccessor(e) {\n let t = e.array;\n if (e.normalized) {\n const n = Xs(t.constructor), i = new Float32Array(t.length);\n for (let s = 0, r = t.length; s < r; s++)\n i[s] = t[s] * n;\n t = i;\n }\n return t;\n }\n _createCubicSplineTrackInterpolant(e) {\n e.createInterpolant = function(n) {\n const i = this instanceof Er ? Su : La;\n return new i(this.times, this.values, this.getValueSize() / 3, n);\n }, e.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = !0;\n }\n}\nfunction Iu(o, e, t) {\n const n = e.attributes, i = new ot();\n if (n.POSITION !== void 0) {\n const a = t.json.accessors[n.POSITION], l = a.min, h = a.max;\n if (l !== void 0 && h !== void 0) {\n if (i.set(\n new K(l[0], l[1], l[2]),\n new K(h[0], h[1], h[2])\n ), a.normalized) {\n const c = Xs(yn[a.componentType]);\n i.min.multiplyScalar(c), i.max.multiplyScalar(c);\n }\n } else {\n console.warn(\"THREE.GLTFLoader: Missing min/max properties for accessor POSITION.\");\n return;\n }\n } else\n return;\n const s = e.targets;\n if (s !== void 0) {\n const a = new K(), l = new K();\n for (let h = 0, c = s.length; h < c; h++) {\n const u = s[h];\n if (u.POSITION !== void 0) {\n const m = t.json.accessors[u.POSITION], f = m.min, d = m.max;\n if (f !== void 0 && d !== void 0) {\n if (l.setX(Math.max(Math.abs(f[0]), Math.abs(d[0]))), l.setY(Math.max(Math.abs(f[1]), Math.abs(d[1]))), l.setZ(Math.max(Math.abs(f[2]), Math.abs(d[2]))), m.normalized) {\n const p = Xs(yn[m.componentType]);\n l.multiplyScalar(p);\n }\n a.max(l);\n } else\n console.warn(\"THREE.GLTFLoader: Missing min/max properties for accessor POSITION.\");\n }\n }\n i.expandByVector(a);\n }\n o.boundingBox = i;\n const r = new Ol();\n i.getCenter(r.center), r.radius = i.min.distanceTo(i.max) / 2, o.boundingSphere = r;\n}\nfunction eo(o, e, t) {\n const n = e.attributes, i = [];\n function s(r, a) {\n return t.getDependency(\"accessor\", r).then(function(l) {\n o.setAttribute(a, l);\n });\n }\n for (const r in n) {\n const a = Ws[r] || r.toLowerCase();\n a in o.attributes || i.push(s(n[r], a));\n }\n if (e.indices !== void 0 && !o.index) {\n const r = t.getDependency(\"accessor\", e.indices).then(function(a) {\n o.setIndex(a);\n });\n i.push(r);\n }\n return Fi.workingColorSpace !== rt && \"COLOR_0\" in n && console.warn(`THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${Fi.workingColorSpace}\" not supported.`), ct(o, e), Iu(o, e, t), Promise.all(i).then(function() {\n return e.targets !== void 0 ? Au(o, e.targets, t) : o;\n });\n}\nfunction Lu(o, e, t) {\n let n = new M.Group();\n n.name = e, o.scene.add(n), Da(e + \"/info\", (i) => {\n let s = JSON.parse(i);\n o.engineStatus.models.push({\n type: \"light\",\n info: s,\n name: s.baseInfo.name,\n status: \"loading\",\n url: e,\n elements: /* @__PURE__ */ new Map()\n }), o.models == null && (o.models = []), o.models.push({\n url: e,\n nodesMap: /* @__PURE__ */ new Map(),\n boundingBox: {\n min: new M.Vector3(s.baseInfo.min.X * 0.3048, s.baseInfo.min.Z * 0.3048, -s.baseInfo.min.Y * 0.3048),\n max: new M.Vector3(s.baseInfo.max.X * 0.3048, s.baseInfo.max.Z * 0.3048, -s.baseInfo.max.Y * 0.3048)\n }\n }), o.events.trigger(zt.EngineFree, e);\n });\n}\nfunction zu(o, e) {\n o.engineStatus.models.filter((t) => e == null || t.url == e).forEach((t) => {\n t.loadStatus == null && (t.loadStatus = {\n mep: !1,\n instance: !1,\n normal: !1\n }), t.status === \"loading\" && t.type === \"light\" && (t.loadStatus.modelMep != !0 && (t.loadStatus.modelMep = !0, Jh(o, t.info.modelMep, t.url)), t.loadStatus.normal != !0 && Ou(o, t));\n });\n}\nfunction Ou(o, e) {\n if (o.camera.position, e.size, e.info == null || e.info.lods == null)\n return;\n e.info.lods.forEach((i) => {\n if (i.status != !0)\n if (i.glbs == null)\n console.log(\"加载GLB.............\"), i.glbs = {}, Yh(e.url + i.path, (s) => {\n qr(s.get(\"/nodes.json\"), (r) => {\n let a = JSON.parse(r);\n o.models.find((c) => c.url == e.url).nodesMap == null && (o.models.find((c) => c.url == e.url).nodesMap = /* @__PURE__ */ new Map());\n let l = o.models.find((c) => c.url == e.url).nodesMap, h = 0;\n for (let c in a) {\n a[c].forEach((f) => {\n f.glb = c, l.has(f.id) == !1 ? l.set(f.id, { infos: [f] }) : l.get(f.id).infos.push(f);\n });\n let u = new Qh();\n const m = new Kh();\n m.setDecoderPath(\"/draco/\"), m.preload(), u.setDRACOLoader(m), u.load(s.get(c + \".glb\"), (f) => {\n i.glbs[c] = f.scene.children, i.glbs[c].forEach((d) => {\n d.geometry.computeVertexNormals();\n }), h++, h == Object.keys(a).length && o.engineStatus.isFree && (o.events.trigger(zt.EngineFree, e.url), o.viewCube.CameraGoHome());\n });\n }\n qr(s.get(\"/instances.json\"), (c) => {\n let u = JSON.parse(c);\n o.models.find((m) => m.url == e.url).instanceNodes = u;\n });\n });\n });\n else {\n let s = n(e, i, i.octreeBox), r = [], a = o.models.find((h) => h.url == e.url);\n s.forEach((h) => {\n a.nodesMap.has(h) && a.nodesMap.get(h).infos.forEach((c) => {\n let u = i.glbs[c.glb][c.mesh];\n if (u != null && u.geometry != null && u.material != null) {\n let m = new M.Matrix4();\n m.elements = c.matrix;\n let f = new M.Mesh(u.geometry.clone().applyMatrix4(m), u.material), d = new M.Box3().setFromObject(f);\n c.box = d, c.mesh = f, f.name = h, f.glb = c.glb, f.url = e.url, u.geometry.attributes.position != null && r.push(f);\n }\n });\n }), Bu(e.url, o, r);\n let l = a.instanceNodes;\n if (l != null)\n for (let h in l)\n (l[h].isLoaded == null || l[h].isLoaded == !1) && (l[h].isLoaded = !0, l[h].forEach((c) => {\n if (i.glbs[h] != null) {\n let u = i.glbs[h][c.mesh];\n Nu(e.url, c.mesh, o, u, c.children);\n }\n }));\n }\n });\n function n(i, s, r) {\n let a = [];\n if (r.status != !0) {\n if (!o.engineStatus.isFree)\n return a;\n let l = new M.Vector3(r.min.X, r.min.Z, -r.min.Y), h = new M.Vector3(r.max.X, r.max.Z, -r.max.Y);\n h.distanceTo(l);\n let c = o.camera.position, u = new M.Vector3(l.x + h.x / 2, l.y + h.y / 2, l.z + h.z / 2);\n c.distanceTo(u), r.elements.forEach((m) => {\n a.push(m);\n }), r.children.forEach((m) => {\n a.push(...n(i, s, m));\n }), r.children.findIndex((m) => m.status != !0) == -1 && (r.status = !0), r.children.length == 0 && (r.status = !0);\n }\n return a;\n }\n}\nfunction Bu(o, e, t) {\n let n = [];\n t.forEach((i) => {\n n.findIndex((r) => r.glb == i.glb) == -1 ? n.push({\n glb: i.glb,\n meshes: [i],\n currentIndex: i.geometry.index.count,\n indexes: /* @__PURE__ */ new Map()\n }) : (n.find((r) => r.glb == i.glb).meshes.push(i), n.find((r) => r.glb == i.glb).currentIndex += i.geometry.index.count);\n let s = n.find((r) => r.glb == i.glb);\n s.indexes.set(Number(i.name), [s.currentIndex - i.geometry.index.count, s.currentIndex]);\n }), n.forEach((i) => {\n let s = e.scene.children.find((r) => r instanceof M.Mesh && r.url == o && r.glb == i.glb);\n if (s != null)\n s.castShadow = !0, s.receiveShadow = !0;\n else {\n let r = new M.BufferGeometry(), a = Fu(i.meshes[0].material);\n r = ka(i.meshes.map((c) => c.geometry), !1);\n let l = new M.Mesh(r, a);\n l.castShadow = !0, l.receiveShadow = !0, e.scene.add(l), l.index = e.scene.children.length - 1, l.url = o, l.glb = i.glb, l.indexes = i.indexes, l.materialClone = a, l.geometrys = i.meshes.map((c) => c.geometry);\n let h = e.models.find((c) => c.url == o);\n if (h != null) {\n let c = 0;\n i.indexes.forEach((u) => {\n h.nodesMap.get(Number(i.meshes[c].name)).indexes == null && (h.nodesMap.get(Number(i.meshes[c].name)).indexes = []), h.nodesMap.get(Number(i.meshes[c].name)).indexes.push([l.index, c++, u[0], u[1]]);\n });\n }\n }\n });\n}\nfunction Nu(o, e, t, n, i) {\n if (n == null)\n return;\n let s = new M.InstancedMesh(n.geometry, n.material, i.length);\n t.scene.add(s);\n const r = new Float32Array(i.length * 3);\n for (let l = 0; l < i.length; l++)\n r[l * 3] = 1, r[l * 3 + 1] = 1, r[l * 3 + 2] = 1;\n s.instanceColor = new M.InstancedBufferAttribute(r, 3);\n let a = [];\n for (let l = 0; l < i.length; l++) {\n let h = i[l], c = new M.Matrix4();\n c.elements = h.matrix, s.setMatrixAt(l, c), s.matrixs || (s.matrixs = []), s.matrixs.push(c.clone()), a.push(c.clone()), t.models.find((u) => u.url == o).nodesMap.has(h.id) ? (t.models.find((u) => u.url == o).nodesMap.get(h.id).indexes == null && (t.models.find((u) => u.url == o).nodesMap.get(h.id).indexes = []), t.models.find((u) => u.url == o).nodesMap.get(h.id).indexes.push([t.scene.children.length - 1, l, 0, 0])) : t.models.find((u) => u.url == o).nodesMap.set(h.id, { instance: !0, info: h, indexes: [[t.scene.children.length - 1, l, 0, 0]] });\n }\n s.index = t.scene.children.length - 1, s.materialClone = n.material, s.url = o, s.glb = n.glb, s.ids = i.map((l) => l.id), s.matrixsClone = a;\n}\nfunction Fu(o) {\n return o.map != null && (o.map.colorSpace = M.SRGBColorSpace, o.map.needsUpdate = !0), o.shadowSide = M.FrontSide, o.side = o.side, o;\n}\nclass Uu {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 加载多个模型\n async loadModels(e, t) {\n console.log(\"待加载模型\", e);\n for (const i of e)\n n(i) === \"light\" && Lu(this.engine, i);\n function n(i) {\n const s = i.split(\".\").pop();\n return s === \"glb\" || s === \"gltf\" ? \"gltf\" : \"light\";\n }\n }\n}\nclass Vu {\n engine;\n isFree;\n // 高亮模型\n highlightModels;\n // 隐藏的毛线哦\n hideModels;\n // 半透明的模型\n translucentModels;\n // 已加载的模型\n models;\n constructor(e) {\n this.engine = e, this.isFree = !0, this.highlightModels = [], this.hideModels = [], this.translucentModels = [], this.models = [];\n }\n init() {\n this.engine.events.on(zt.EngineFree, (e) => {\n this.updateFree(!0), zu(this.engine, e);\n }), this.engine.events.on(zt.EngineBusy, () => {\n this.updateFree(!1);\n });\n }\n // 更新引擎空闲状态\n updateFree(e) {\n this.isFree = e;\n }\n // 关闭所有功能\n closeAllFunction = () => {\n };\n}\nclass Hu {\n // 使用字符串作为键,以确保不同来源的 EventType 枚举值能够正确匹配\n listeners = /* @__PURE__ */ new Map();\n // 是否启用调试模式(可以通过外部设置)\n debugMode = !1;\n /**\n * 设置调试模式\n * @param enabled 是否启用调试模式\n */\n setDebugMode(e) {\n this.debugMode = e;\n }\n /**\n * 订阅事件\n * @param event 事件类型\n * @param callback 回调函数\n */\n on(e, t) {\n const n = String(e);\n this.listeners.has(n) || this.listeners.set(n, []), this.listeners.get(n).push(t), this.debugMode && console.debug(`[EventModule] 注册事件监听器: ${n}, 当前监听器数量: ${this.listeners.get(n).length}`);\n }\n /**\n * 取消订阅事件\n * @param event 事件类型\n * @param callback 要移除的回调函数\n */\n off(e, t) {\n const n = String(e);\n if (!this.listeners.has(n)) {\n this.debugMode && console.warn(`[EventModule] 尝试移除不存在的事件监听器: ${n}`);\n return;\n }\n const i = this.listeners.get(n), s = i.indexOf(t);\n s !== -1 ? (i.splice(s, 1), this.debugMode && console.debug(`[EventModule] 移除事件监听器: ${n}, 剩余监听器数量: ${i.length}`)) : this.debugMode && console.warn(`[EventModule] 尝试移除的回调函数未找到: ${n}`);\n }\n /**\n * 触发事件\n * @param event 事件类型\n * @param data 事件数据\n */\n trigger(e, t) {\n const n = String(e);\n if (!this.listeners.has(n)) {\n this.debugMode && (console.warn(`[EventModule] 触发事件但未找到监听器: ${n}`), console.debug(\"[EventModule] 当前已注册的事件类型:\", Array.from(this.listeners.keys())));\n return;\n }\n const i = this.listeners.get(n);\n this.debugMode && console.debug(`[EventModule] 触发事件: ${n}, 监听器数量: ${i.length}`, t), i.forEach((s, r) => {\n try {\n s(t);\n } catch (a) {\n console.error(`[EventModule] 事件监听器执行错误 [${n}] #${r}:`, a);\n }\n });\n }\n}\nclass ju {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 加入场景基本光照\n init() {\n const e = new M.DirectionalLight(16777215, 1);\n e.position.set(100, 200, 100), e.castShadow = !0, e.shadow.mapSize.width = 2048, e.shadow.mapSize.height = 2048, e.shadow.camera.near = 0.1, e.shadow.camera.far = 5e3, e.shadow.bias = -5e-5, e.shadow.normalBias = 0.02;\n const t = 50;\n e.shadow.camera.left = -t, e.shadow.camera.right = t, e.shadow.camera.top = t, e.shadow.camera.bottom = -t, e.shadow.radius = 2;\n const n = new M.DirectionalLight(16777215, 2);\n this.engine.scene.add(e), this.engine.scene.add(n), this.engine.scene.dirLight = n;\n const i = new M.AmbientLight(16777215, 1);\n this.engine.scene.add(i);\n }\n}\nvar Se = /* @__PURE__ */ ((o) => (o.ModelLoadStart = \"model-load-start\", o.ModelLoadProgress = \"model-load-progress\", o.ModelLoaded = \"model-loaded\", o.ModelError = \"model-error\", o.SelectionChanged = \"selection-changed\", o.HoverChanged = \"hover-changed\", o.Click = \"click\", o.MouseMove = \"mouse-move\", o.CameraChanged = \"camera-changed\", o.CameraIdle = \"camera-idle\", o.EngineFree = \"engine-free\", o.EngineBusy = \"engine-busy\", o.MeasureChanged = \"measure-changed\", o.MeasureClick = \"measure-click\", o.SectionMove = \"section-move\", o))(Se || {});\nclass Gu {\n engine;\n behavior;\n isCtrlDown = !1;\n highlightedInstances = [];\n highlightColor = new M.Color(43775);\n // 高亮颜色:蓝色\n constructor(e) {\n this.engine = e;\n }\n init() {\n this.behavior = this.engine.handelBehaved, this.behavior.init(this);\n }\n active() {\n this.behavior.active();\n }\n disActive() {\n this.behavior.disActive();\n }\n // 键盘事件\n handelKeyCtrlUp() {\n this.isCtrlDown = !1;\n }\n handelKeyCtrlDown() {\n this.isCtrlDown = !0;\n }\n // 监听鼠标按下\n hoverOldId = null;\n // 鼠标移动时,触发模型高亮\n handleMouseMove(e) {\n if (!this.engine.engineStatus.isFree) {\n this.engine.hoverHighLight.clearHighlight();\n return;\n }\n let t = this.getCatchMeshs(e);\n t != null ? t.length > 0 && this.engine.hoverHighLight.hightMesh(t) : this.engine.hoverHighLight.clearHighlight();\n }\n getCatchMeshs(e) {\n if (e.catch == null)\n return this.hoverOldId = null, null;\n if (e.catch.object.isInstance) {\n let t = e.catch.object, n = e.catch.object.id, i = this.engine.models.find((a) => a.url == t.url).nodesMap.get(n), s = /* @__PURE__ */ new Map();\n i?.indexes.forEach((a) => {\n this.engine.scene.children[a[0]] instanceof M.InstancedMesh && (s.has(a[0]) ? s.get(a[0])?.push(a[1]) : s.set(a[0], [a[1]]));\n });\n let r = [];\n return s.forEach((a, l) => {\n let h = this.engine.scene.children[l];\n a.forEach((c) => {\n let u = h.geometry.clone();\n u.applyMatrix4(h.matrixs[c]), r.push(new M.Mesh(u, h.material));\n });\n }), this.hoverOldId == n ? [] : (this.hoverOldId = n, this.engine.hoverHighLight.clearHighlight(), r);\n } else {\n const t = e.catch;\n t.object;\n let n = t.object, i = n.name, a = this.engine.models.find((l) => l.url === n.url).nodesMap.get(i).infos.map((l) => l.mesh);\n return this.hoverOldId == i ? [] : (this.hoverOldId = i, this.engine.hoverHighLight.clearHighlight(), a);\n }\n }\n // 业务功能-监听鼠标谈起,点选模型\n handleMouseClick(e) {\n if (e.catch != null) {\n const t = e.catch;\n let n = t.object;\n this.isCtrlDown || this.engine.modelToolModule.unhighlightAllModels(), console.log([{ url: n.url, ids: [n.name] }]), this.engine.controlModule.orbitControls.origin.set(t.point.x, t.point.y, t.point.z), this.engine.modelToolModule.highlightModel([{ url: n.url, ids: [n.name] }]), this.engine.events.trigger(Se.Click, !0);\n } else\n this.engine.modelToolModule.unhighlightAllModels();\n }\n // 双击模型事件\n handleMouseDoubleClick(e) {\n if (e.catch) {\n const n = e.catch;\n n.object, this.engine.events.trigger(Se.Click, n);\n let i = n.object, a = this.engine.models.find((h) => h.url === i.url).nodesMap.get(i.name).infos.map((h) => h.box), l = t(a);\n this.engine.viewCube.zoomToModel(l);\n }\n function t(n) {\n let i = new M.Vector3(1e8, 1e9, 1e10), s = new M.Vector3(-1e8, -1e9, -1e10);\n return n.forEach((r) => {\n r.min.x < i.x && (i.x = r.min.x), r.min.y < i.y && (i.y = r.min.y), r.min.z < i.z && (i.z = r.min.z), r.max.x > s.x && (s.x = r.max.x), r.max.y > s.y && (s.y = r.max.y), r.max.z > s.z && (s.z = r.max.z);\n }), new M.Box3(i, s);\n }\n }\n // 判断点击instance节点\n handleMouseClickInstance(e) {\n return e.intersectObjects(this.engine.scene.children.filter((n) => n instanceof M.InstancedMesh), !0);\n }\n}\nclass Wu {\n engine;\n highlightMaterial;\n hideMaterial;\n translucentMaterial;\n // 存储克隆的高亮模型,用于后续清理 \n // 存储被隐藏的 InstancedMesh 实例的原始矩阵,用于后续恢复\n // key: 场景中 InstancedMesh 的索引,value: Map<实例索引, 原始矩阵> \n constructor(e) {\n this.engine = e, this.highlightMaterial = new M.MeshBasicMaterial({\n color: 43775,\n // 明显的蓝色\n depthTest: !1,\n // 不进行深度测试,始终显示\n depthWrite: !1,\n // 不写入深度缓冲\n transparent: !0,\n opacity: 0.5,\n // 半透明效果\n side: M.DoubleSide\n // 双面渲染\n }), this.hideMaterial = new M.MeshBasicMaterial({\n color: 0,\n // 明显的蓝色 \n transparent: !0,\n opacity: 0,\n // 半透明效果\n side: M.DoubleSide\n // 双面渲染\n }), this.translucentMaterial = new M.MeshBasicMaterial({\n color: 16777215,\n transparent: !0,\n opacity: 0.05,\n // 半透明效果\n side: M.DoubleSide\n // 双面渲染\n }), this.highlightMaterial.clippingPlanes = this.engine.sectionPlane, this.hideMaterial.clippingPlanes = this.engine.sectionPlane, this.translucentMaterial.clippingPlanes = this.engine.sectionPlane;\n }\n // ***************************************************** 模型高亮 ***************************************************** //\n // 拆分网格\n split_merge_model(e) {\n if (e.isSplit || e instanceof M.InstancedMesh)\n return;\n let t = e.materialClone.clone(), n = ka(e.geometrys, !0);\n n.groups.forEach((i) => {\n i.materialIndex = 0;\n }), e.geometry = n, e.material = [t, this.highlightMaterial, this.translucentMaterial], e.needsUpdate = !0, e.isSplit = !0;\n }\n // 合并网格\n un_split_merge_model(e) {\n }\n // 设置模型高亮\n highlightModel(e) {\n e.forEach((t) => {\n let n = /* @__PURE__ */ new Map();\n t.ids.forEach((s) => {\n let r = this.engine.models.find((a) => a.url == t.url).nodesMap.get(s);\n r != null && r.indexes != null && r.indexes.forEach((a) => {\n this.engine.scene.children[a[0]] instanceof M.InstancedMesh ? n.has(a[0]) ? n.get(a[0])?.push(a[1]) : n.set(a[0], [a[1]]) : (console.log(this.engine.scene.children[a[0]].materialClone.color), this.split_merge_model(this.engine.scene.children[a[0]]), this.engine.scene.children[a[0]].geometry.groups[a[1]].materialIndex = 1);\n });\n }), Xu(n, this.engine);\n let i = this.engine.engineStatus.highlightModels.find((s) => s.url == t.url);\n i != null ? i.ids.push(...t.ids) : this.engine.engineStatus.highlightModels.push(t);\n });\n }\n // 取消模型高亮\n unhighlightModel(e) {\n e.forEach((t) => {\n let n = /* @__PURE__ */ new Map();\n t.ids.forEach((i) => {\n let s = this.engine.models.find((r) => r.url == t.url).nodesMap.get(i);\n s != null && s.indexes != null && s.indexes.forEach((r) => {\n this.engine.scene.children[r[0]] instanceof M.InstancedMesh ? n.has(r[0]) ? n.get(r[0])?.push(r[1]) : n.set(r[0], [r[1]]) : this.engine.scene.children[r[0]].geometry.groups[r[1]].materialIndex = 0;\n });\n }), to(n, this.engine, \"highlightModel\");\n });\n }\n // 取消所有模型高亮\n unhighlightAllModels(e = !0) {\n this.engine.engineStatus.highlightModels.forEach((t) => {\n this.unhighlightModel([t]);\n }), e && (this.engine.engineStatus.highlightModels = []);\n }\n // ***************************************************** 模型高亮 ***************************************************** //\n // ***************************************************** 模型隐藏 ***************************************************** //\n // 隐藏模型\n hideModel(e) {\n e.forEach((t) => {\n let n = /* @__PURE__ */ new Map();\n t.ids.forEach((s) => {\n let r = this.engine.models.find((a) => a.url == t.url).nodesMap.get(s);\n this.engine.modelEdge.hideModelEdge(t.url, s), r != null && r.indexes != null && r.indexes.forEach((a) => {\n const l = this.engine.scene.children[a[0]];\n l instanceof M.InstancedMesh ? n.has(a[0]) ? n.get(a[0])?.push(a[1]) : n.set(a[0], [a[1]]) : (this.split_merge_model(this.engine.scene.children[a[0]]), l.geometry.groups[a[1]].materialIndex = -1, l.geometry.groups[a[1]].visible = !1);\n });\n }), n.size > 0 && qu(n, this.engine);\n let i = this.engine.engineStatus.hideModels.find((s) => s.url == t.url);\n i != null ? i.ids.push(...t.ids) : this.engine.engineStatus.hideModels.push({\n url: t.url,\n ids: t.ids\n }), this.engine.engineStatus.highlightModels = [];\n });\n }\n // 显示模型\n showModel(e) {\n e.forEach((t) => {\n let n = /* @__PURE__ */ new Map();\n t.ids.forEach((s) => {\n let r = this.engine.models.find((a) => a.url == t.url).nodesMap.get(s);\n this.engine.modelEdge.showModelEdge(t.url, s), r != null && r.indexes != null && r.indexes.forEach((a) => {\n const l = this.engine.scene.children[a[0]];\n l instanceof M.InstancedMesh ? n.has(a[0]) ? n.get(a[0])?.push(a[1]) : n.set(a[0], [a[1]]) : (l.geometry.groups[a[1]].materialIndex = 0, l.geometry.groups[a[1]].visible = !0);\n });\n }), n.size > 0 && no(n, this.engine);\n let i = this.engine.engineStatus.hideModels.find((s) => s.url == t.url);\n i && (t.ids.forEach((s) => {\n const r = i.ids.indexOf(s);\n r !== -1 && i.ids.splice(r, 1);\n }), i.ids.length === 0 && (this.engine.engineStatus.hideModels = this.engine.engineStatus.hideModels.filter((s) => s !== i)));\n });\n }\n // 隔离模型 - 只显示传入的模型,隐藏其他所有模型\n isolateModel(e) {\n let t = [];\n this.engine.models.forEach((n) => {\n let i = { url: n.url, ids: [] }, s = e.find((r) => r.url == n.url);\n for (let r of n.nodesMap)\n s == null ? i.ids.push(r[0]) : s.ids.includes(r[0]) || i.ids.push(r[0]);\n t.push(i);\n }), this.unhighlightAllModels(), this.hideModel(t);\n }\n // 隔离模型 - 只显示传入的模型,其他模型半透明\n translucentOtherModel(e) {\n let t = [];\n this.engine.models.forEach((n) => {\n let i = { url: n.url, ids: [] }, s = e.find((r) => r.url == n.url);\n for (let r of n.nodesMap)\n s == null ? i.ids.push(r[0]) : s.ids.includes(r[0]) || i.ids.push(r[0]);\n t.push(i);\n }), this.translucentModel(t);\n }\n // ***************************************************** 模型隐藏 ***************************************************** //\n // ***************************************************** 设置模型颜色 ***************************************************** //\n // 设置模型颜色\n setModelColor(e, t) {\n e.material.color.set(t);\n }\n // 设置所有模型颜色\n setAllModelsColor(e) {\n this.engine.scene.children.forEach((t) => {\n t.isMesh;\n });\n }\n // 恢复所有模型颜色\n restoreAllModelsColor() {\n this.engine.scene.children.forEach((e) => {\n e.isMesh;\n });\n }\n // ***************************************************** 设置模型颜色 ***************************************************** //\n // ***************************************************** 设置模型半透明 ***************************************************** //\n // 半透明模型(仅对普通 Mesh 生效,不影响 InstancedMesh)\n translucentModel(e) {\n this.unhighlightAllModels(), e.forEach((t) => {\n let n = /* @__PURE__ */ new Map();\n t.ids.forEach((s) => {\n let r = this.engine.models.find((a) => a.url == t.url).nodesMap.get(s);\n r != null && r.indexes != null && r.indexes.forEach((a) => {\n const l = this.engine.scene.children[a[0]];\n l instanceof M.InstancedMesh ? n.has(a[0]) ? n.get(a[0])?.push(a[1]) : n.set(a[0], [a[1]]) : (this.split_merge_model(this.engine.scene.children[a[0]]), l.geometry.groups[a[1]].materialIndex = 2);\n });\n }), Zu(n, this.engine);\n let i = this.engine.engineStatus.translucentModels.find((s) => s.url == t.url);\n i != null ? i.ids.push(...t.ids) : this.engine.engineStatus.translucentModels.push({\n url: t.url,\n ids: t.ids\n });\n }), this.engine.engineStatus.highlightModels = [];\n }\n // 取消半透明\n unTranslucentModel() {\n this.engine.engineStatus.translucentModels.forEach((t) => {\n let n = /* @__PURE__ */ new Map();\n t.ids.forEach((i) => {\n let s = this.engine.models.find((r) => r.url == t.url).nodesMap.get(i);\n s != null && s.indexes != null && s.indexes.forEach((r) => {\n const a = this.engine.scene.children[r[0]];\n a instanceof M.InstancedMesh ? n.has(r[0]) ? n.get(r[0])?.push(r[1]) : n.set(r[0], [r[1]]) : (this.split_merge_model(this.engine.scene.children[r[0]]), a.geometry.groups[r[1]].materialIndex = 0);\n });\n }), n.size > 0 && no(n, this.engine), to(n, this.engine, \"translucentModel\");\n }), this.engine.engineStatus.translucentModels = [];\n }\n // ***************************************************** 设置模型半透明 ***************************************************** //\n // 显示所有模型(恢复所有隐藏及半透明效果)\n showAllModels() {\n this.engine.engineStatus.hideModels && this.engine.engineStatus.hideModels.length > 0 && this.showModel(this.engine.engineStatus.hideModels), this.engine.engineStatus.hideModels = [], this.unhighlightAllModels();\n }\n // ***************************************************** 批量选择模型 ***************************************************** // \n // 选择同层同类构件\n batchSelectSameLevelTypeModel(e) {\n if (e.length == 0)\n return;\n let t = e[0], n = this.engine.modelMapperBatch.getModelMapper(t.url, t.ids[0]);\n this.engine.modelMapperBatch.getModelsWithLevelType(n.levelName, n.typeName, (i) => {\n this.engine.modelToolModule.highlightModel(i);\n });\n }\n // 选择同层构件\n batchSelectSameLevelModel(e) {\n if (e.length == 0)\n return;\n let t = e[0], n = this.engine.modelMapperBatch.getModelMapper(t.url, t.ids[0]);\n this.engine.modelMapperBatch.getModelsWithLevel(n.levelName, (i) => {\n this.engine.modelToolModule.highlightModel(i);\n });\n }\n // 选择同类构件\n batchSelectSameTypeModel(e) {\n if (e.length == 0)\n return;\n let t = e[0], n = this.engine.modelMapperBatch.getModelMapper(t.url, t.ids[0]);\n this.engine.modelMapperBatch.getModelsWithType(n.typeName, (i) => {\n this.engine.modelToolModule.highlightModel(i);\n });\n }\n // ***************************************************** 设置模型颜色 ***************************************************** //\n}\nfunction Xu(o, e) {\n o.forEach((t, n) => {\n const i = e.scene.children[n];\n if (!(i instanceof M.InstancedMesh))\n return;\n const s = i.geometry, r = new M.MeshBasicMaterial({\n color: 43775,\n // 明显的蓝色\n depthTest: !1,\n // 不进行深度测试,始终显示\n depthWrite: !1,\n // 不写入深度缓冲\n transparent: !0,\n // 启用透明\n opacity: 0.5,\n // 半透明效果\n side: M.DoubleSide\n // 双面渲染\n }), a = new M.InstancedMesh(s, r, t.length);\n a.name = \"highlightModel\", a.key = n;\n const l = /* @__PURE__ */ new Map(), h = new M.Matrix4(), c = new M.Matrix4();\n c.makeScale(0, 0, 0), t.forEach((u, m) => {\n i.getMatrixAt(u, h), l.set(u, h.clone()), i.setMatrixAt(u, c), a.setMatrixAt(m, h);\n }), i.instanceMatrix.needsUpdate = !0, a.instanceMatrix.needsUpdate = !0, e.scene.add(a);\n });\n}\nfunction to(o, e, t) {\n o.forEach((n, i) => {\n const s = e.scene.children[i];\n if (!(s instanceof M.InstancedMesh))\n return;\n n.forEach((a) => {\n const l = s.matrixsClone[a];\n l && s.setMatrixAt(a, l);\n }), s.instanceMatrix.needsUpdate = !0, e.scene.children.filter((a) => a.key == i && a.name == t).forEach((a) => {\n e.scene.remove(a);\n });\n });\n}\nfunction Zu(o, e) {\n o.forEach((t, n) => {\n const i = e.scene.children[n];\n if (!(i instanceof M.InstancedMesh))\n return;\n const s = i.geometry, r = new M.MeshBasicMaterial({\n color: 16777215,\n // 明显的蓝色 \n transparent: !0,\n // 启用透明\n opacity: 0.05,\n // 半透明效果\n side: M.DoubleSide\n // 双面渲染\n }), a = new M.InstancedMesh(s, r, t.length);\n a.name = \"translucentModel\", a.key = n;\n const l = /* @__PURE__ */ new Map(), h = new M.Matrix4(), c = new M.Matrix4();\n c.makeScale(0, 0, 0), t.forEach((u, m) => {\n i.getMatrixAt(u, h), l.set(u, h.clone()), i.setMatrixAt(u, c), a.setMatrixAt(m, h);\n }), i.instanceMatrix.needsUpdate = !0, a.instanceMatrix.needsUpdate = !0, e.scene.add(a);\n });\n}\nfunction qu(o, e) {\n e.scene.children.filter((t) => t.name == \"highlightModel\").forEach((t) => {\n e.scene.remove(t);\n }), o.forEach((t, n) => {\n const i = e.scene.children[n];\n if (!(i instanceof M.InstancedMesh))\n return;\n const s = /* @__PURE__ */ new Map(), r = new M.Matrix4(), a = new M.Matrix4();\n a.makeScale(0, 0, 0), t.forEach((l, h) => {\n i.getMatrixAt(l, r), s.set(l, r.clone()), i.setMatrixAt(l, a);\n }), i.instanceMatrix.needsUpdate = !0;\n });\n}\nfunction no(o, e) {\n o.forEach((t, n) => {\n const i = e.scene.children[n];\n i instanceof M.InstancedMesh && (t.forEach((s) => {\n const r = i.matrixs[s];\n r && i.setMatrixAt(s, r);\n }), i.instanceMatrix.needsUpdate = !0);\n });\n}\nclass je {\n /**\n * 构造函数\n * @param camera - Three.js 相机对象(用于投影计算)\n * @param renderer - Three.js 渲染器对象(用于获取画布尺寸)\n * @param scene - Three.js 场景对象(用于屏幕坐标转世界坐标时的射线检测,可选)\n */\n constructor(e, t, n) {\n this.camera = e, this.renderer = t, this.scene = n, this.raycaster = new M.Raycaster();\n }\n raycaster;\n /**\n * 将世界坐标转换为屏幕坐标(归一化坐标,范围 -1 到 1)\n * @param worldPos - 世界空间中的3D坐标点\n * @returns 归一化的屏幕坐标,x 和 y 的范围都是 -1 到 1\n * x: -1 表示屏幕左边缘,1 表示屏幕右边缘\n * y: -1 表示屏幕下边缘,1 表示屏幕上边缘\n */\n worldToScreenNormalized(e) {\n const t = e.clone();\n return t.project(this.camera), new M.Vector2(t.x, t.y);\n }\n /**\n * 将世界坐标转换为屏幕坐标(像素坐标)\n * @param worldPos - 世界空间中的3D坐标点\n * @returns 屏幕像素坐标,x 和 y 表示在画布上的实际像素位置\n * x: 0 表示屏幕左边缘,width 表示屏幕右边缘\n * y: 0 表示屏幕上边缘,height 表示屏幕下边缘\n */\n worldToScreen(e) {\n const t = this.worldToScreenNormalized(e), n = this.renderer.domElement.width, i = this.renderer.domElement.height, s = (t.x + 1) * n / 2, r = (1 - t.y) * i / 2;\n return new M.Vector2(s, r);\n }\n /**\n * 将屏幕坐标(像素坐标)转换为归一化坐标\n * @param screenX - 屏幕像素 X 坐标\n * @param screenY - 屏幕像素 Y 坐标\n * @returns 归一化的屏幕坐标,范围 -1 到 1\n */\n screenToNormalized(e, t) {\n const n = this.renderer.domElement.clientWidth, i = this.renderer.domElement.clientHeight, s = e / n * 2 - 1, r = -(t / i * 2 - 1);\n return new M.Vector2(s, r);\n }\n /**\n * 将屏幕坐标(像素坐标)转换为世界坐标\n * 使用射线检测,返回与场景中第一个相交对象的世界坐标点\n * @param screenX - 屏幕像素 X 坐标\n * @param screenY - 屏幕像素 Y 坐标\n * @param objects - 可选,指定要检测的对象数组。如果不提供且 scene 存在,则检测场景中的所有对象\n * @returns 世界坐标点,如果没有相交则返回 null\n */\n screenToWorld(e, t, n) {\n if (!this.scene && !n)\n return console.warn(\"WorldToScreen: 需要提供 scene 或 objects 参数才能进行屏幕坐标转世界坐标\"), null;\n const i = this.screenToNormalized(e, t);\n this.raycaster.setFromCamera(i, this.camera);\n const s = n || this.scene.children, r = this.raycaster.intersectObjects(s, !0);\n return r.length > 0 ? r[0].point : null;\n }\n /**\n * 将屏幕坐标转换为指定深度的世界坐标\n * @param screenX - 屏幕像素 X 坐标\n * @param screenY - 屏幕像素 Y 坐标\n * @param depth - 沿射线方向的距离(世界单位)\n * @returns 世界坐标点\n */\n screenToWorldWithDepth(e, t, n = 0) {\n const i = this.screenToNormalized(e, t);\n this.raycaster.setFromCamera(i, this.camera);\n const s = new M.Vector3();\n return this.raycaster.ray.at(n, s), s;\n }\n /**\n * 更新相机引用(当相机发生变化时调用)\n * @param camera - 新的相机对象\n */\n updateCamera(e) {\n this.camera = e;\n }\n /**\n * 更新渲染器引用(当渲染器发生变化时调用)\n * @param renderer - 新的渲染器对象\n */\n updateRenderer(e) {\n this.renderer = e;\n }\n /**\n * 更新场景引用(当场景发生变化时调用)\n * @param scene - 新的场景对象\n */\n updateScene(e) {\n this.scene = e;\n }\n}\nclass Yu {\n engine;\n currentMode = \"\";\n // 是否为手动设置(手动设置时,自动适配不再生效)\n isManualMode = !1;\n // Pass 引用\n gtaoPass = null;\n ssaoPass = null;\n saturationPass = null;\n outputPass = null;\n fxaaPass = null;\n constructor(e) {\n this.engine = e;\n }\n /**\n * 初始化模块\n */\n init() {\n this.cachePassReferences(), this.autoSwitch(\"advanced\");\n }\n /**\n * 手动切换渲染模式(用户调用),锁定自动适配\n * @param model - \"simple\"(性能) | \"balance\"(平衡) | \"advanced\"(效果)\n */\n switchModel(e) {\n this.isManualMode = !0, this.currentMode = e, this.applyMode(e);\n }\n /**\n * 自动切换渲染模式(引擎内部调用),若已手动设置则跳过\n * @param model - \"simple\"(性能) | \"balance\"(平衡) | \"advanced\"(效果)\n */\n autoSwitch(e) {\n this.isManualMode || (this.currentMode = e, this.applyMode(e));\n }\n /**\n * 恢复自动适配模式(解除手动锁定)\n */\n enableAutoMode() {\n this.isManualMode = !1;\n }\n /**\n * 是否处于手动锁定模式\n */\n get isManual() {\n return this.isManualMode;\n }\n /**\n * 设置模式(内部初始化使用,不影响手动锁定状态)\n * @param model - \"simple\"(性能) | \"balance\"(平衡) | \"advanced\"(效果)\n */\n setMode(e) {\n this.isManualMode = !0, this.currentMode = e, this.applyMode(e);\n }\n /**\n * 获取当前模式\n */\n getCurrentMode() {\n return this.currentMode;\n }\n /**\n * 缓存 Pass 引用\n */\n cachePassReferences() {\n this.engine.composerModule?.composer && (this.engine.composerModule.gtaoPass && (this.gtaoPass = this.engine.composerModule.gtaoPass), this.engine.composerModule.ssaoPass && (this.ssaoPass = this.engine.composerModule.ssaoPass), this.engine.composerModule.saturationPass && (this.saturationPass = this.engine.composerModule.saturationPass), this.engine.composerModule.outputPass && (this.outputPass = this.engine.composerModule.outputPass), this.engine.composerModule.fxaaPass && (this.fxaaPass = this.engine.composerModule.fxaaPass));\n }\n // 应用模式(私有方法)\n applyMode(e) {\n switch (e) {\n case \"simple\":\n this.setShadows(!1), this.setGTAO(!1), this.setSSAO(!1), this.setSaturation(!1), this.setOutputPass(!1), this.setFXAA(!1);\n break;\n case \"balance\":\n this.setShadows(!0), this.setGTAO(!1), this.setSSAO(!1), this.setSaturation(!1), this.setOutputPass(!1), this.setFXAA(!1);\n break;\n case \"advanced\":\n this.setShadows(!0), this.setSSAO(!1), this.setGTAO(!0), this.setSaturation(!0), this.setOutputPass(!0), this.setFXAA(!0);\n break;\n default:\n console.warn(`[EngineModelModule] Unknown mode: ${e}`);\n }\n this.engine.updateVersionDisplay?.();\n }\n /**\n * 设置阴影开关\n */\n setShadows(e) {\n this.engine.renderer && (this.engine.renderer.shadowMap.enabled = e);\n const t = this.engine.scene?.children.find(\n (n) => n instanceof M.DirectionalLight\n );\n t && (t.castShadow = e), this.engine.scene?.traverse((n) => {\n n.material && (n.castShadow !== void 0 && (n.castShadow = e), n.receiveShadow !== void 0 && (n.receiveShadow = e));\n });\n }\n /**\n * 设置环境光遮蔽 (GTAO) 开关\n */\n setGTAO(e) {\n this.engine.composerModule?.composer && this.gtaoPass && (this.gtaoPass.enabled = e);\n }\n /**\n * 设置环境光遮蔽 (SSAO) 开关\n */\n setSSAO(e) {\n this.engine.composerModule?.composer && this.ssaoPass && (this.ssaoPass.enabled = e);\n }\n /**\n * 设置饱和度 Pass 开关\n */\n setSaturation(e) {\n this.saturationPass && (this.saturationPass.enabled = e);\n }\n /**\n * 设置输出 Pass 开关\n */\n setOutputPass(e) {\n this.outputPass && (this.outputPass.enabled = e);\n }\n /**\n * 设置 FXAA Pass 开关\n */\n setFXAA(e) {\n this.fxaaPass && (this.fxaaPass.enabled = e);\n }\n // ============ 公共接口,供 engine 调用 ============\n /**\n * 设置性能模式\n */\n setPerformanceMode() {\n this.setMode(\"simple\");\n }\n /**\n * 设置平衡模式\n */\n setBalancedMode() {\n this.setMode(\"balance\");\n }\n /**\n * 设置效果模式(SSAO)\n */\n setQualityMode() {\n this.setMode(\"advanced\");\n }\n /**\n * 设置超高级模式(GTAO,最高质量)\n */\n setSuperQualityMode() {\n this.setMode(\"superAdvanced\");\n }\n /**\n * 设置阴影质量\n * @param quality - \"low\"(1024) | \"medium\"(2048) | \"high\"(4096)\n */\n setShadowQuality(e) {\n const t = this.engine.scene?.children.find(\n (s) => s instanceof M.DirectionalLight\n ), i = {\n low: 1024,\n medium: 2048,\n high: 2048\n }[e];\n t?.shadow && i && (t.shadow.mapSize.width = i, t.shadow.mapSize.height = i, t.shadow.map?.dispose(), t.shadow.map = null);\n }\n /**\n * 设置饱和度值\n * @param value - 饱和度值,1.0为正常\n */\n setSaturationValue(e) {\n this.saturationPass && (this.saturationPass.uniforms.saturation.value = e);\n }\n /**\n * 设置对比度值\n * @param value - 对比度值,1.0为正常\n */\n setContrastValue(e) {\n this.saturationPass && (this.saturationPass.uniforms.contrast.value = e);\n }\n /**\n * 设置 GTAO 强度\n * @param value - 强度值 0-1\n */\n setGTAOIntensity(e) {\n this.gtaoPass && (this.gtaoPass.blendIntensity = e);\n }\n}\nclass Hi {\n engine;\n overlayMaterial;\n overlayMeshes = [];\n // 动画状态\n animState = \"idle\";\n animStartTime = 0;\n static FADE_IN_MS = 200;\n static FADE_OUT_MS = 150;\n constructor(e) {\n this.engine = e, this.init();\n }\n init() {\n this.overlayMaterial = new M.MeshBasicMaterial({\n color: 16777215,\n transparent: !0,\n opacity: 0,\n blending: M.AdditiveBlending,\n depthWrite: !1\n }), this.overlayMaterial.clippingPlanes = this.engine.sectionPlane;\n }\n /**\n * 高亮一个或多个网格,在原模型同位置叠加亮化覆盖层(原模型不受修改)\n * @param meshes 目标网格或网格数组,传 null/[] 则触发淡出清除\n * @param color 叠加颜色(默认白色 0xffffff,越亮越明显)\n * @param intensity 叠加强度 0~1(默认 0.35)\n */\n hightMesh(e, t = 16777215, n = 0.15) {\n this.animState === \"fadeOut\" && this.removeOverlayMeshes();\n const i = (Array.isArray(e) ? e : e ? [e] : []).filter((s) => s?.geometry);\n if (i.length === 0) {\n this.clearHighlight();\n return;\n }\n this.overlayMaterial.color.set(t), this.overlayMaterial.opacity = 0, this.overlayMaterial.userData.targetOpacity = n;\n for (const s of i) {\n const r = new M.Mesh(s.geometry, this.overlayMaterial);\n s.updateWorldMatrix(!0, !1), r.matrix.copy(s.matrixWorld), r.matrixAutoUpdate = !1, this.engine.scene.add(r), this.overlayMeshes.push(r);\n }\n this.animState = \"fadeIn\", this.animStartTime = performance.now();\n }\n /**\n * 触发淡出动画,结束后自动从场景中移除所有覆盖层\n */\n clearHighlight() {\n this.overlayMeshes.length === 0 || this.animState === \"fadeOut\" || (this.animState = \"fadeOut\", this.animStartTime = performance.now());\n }\n /**\n * 每帧更新动画 — 由���擎 animate 循环调用\n */\n update() {\n if (this.animState === \"idle\" || this.overlayMeshes.length === 0) return;\n const e = performance.now() - this.animStartTime, t = this.overlayMaterial.userData.targetOpacity ?? 0.35;\n if (this.animState === \"fadeIn\") {\n const n = Math.min(e / Hi.FADE_IN_MS, 1);\n this.overlayMaterial.opacity = this.easeOutQuad(n) * t, n >= 1 && (this.animState = \"idle\");\n } else if (this.animState === \"fadeOut\") {\n const n = Math.min(e / Hi.FADE_OUT_MS, 1);\n this.overlayMaterial.opacity = (1 - this.easeOutQuad(n)) * t, n >= 1 && (this.removeOverlayMeshes(), this.animState = \"idle\");\n }\n }\n /** 从场景中移除所有覆盖层(不 dispose geometry,因为与原始 mesh 共享) */\n removeOverlayMeshes() {\n for (const e of this.overlayMeshes)\n this.engine.scene.remove(e);\n this.overlayMeshes = [];\n }\n /** 缓出二次方 */\n easeOutQuad(e) {\n return 1 - (1 - e) * (1 - e);\n }\n /** 销毁,释放 GPU 资源 */\n dispose() {\n this.removeOverlayMeshes(), this.overlayMaterial.dispose(), this.animState = \"idle\";\n }\n}\nvar Ii = { exports: {} }, Ku = Ii.exports, io;\nfunction $u() {\n return io || (io = 1, (function(o, e) {\n (function(t, n) {\n o.exports = n();\n })(Ku, function() {\n var t = function() {\n function n(f) {\n return r.appendChild(f.dom), f;\n }\n function i(f) {\n for (var d = 0; d < r.children.length; d++) r.children[d].style.display = d === f ? \"block\" : \"none\";\n s = f;\n }\n var s = 0, r = document.createElement(\"div\");\n r.style.cssText = \"position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000\", r.addEventListener(\"click\", function(f) {\n f.preventDefault(), i(++s % r.children.length);\n }, !1);\n var a = (performance || Date).now(), l = a, h = 0, c = n(new t.Panel(\"FPS\", \"#0ff\", \"#002\")), u = n(new t.Panel(\"MS\", \"#0f0\", \"#020\"));\n if (self.performance && self.performance.memory) var m = n(new t.Panel(\"MB\", \"#f08\", \"#201\"));\n return i(0), { REVISION: 16, dom: r, addPanel: n, showPanel: i, begin: function() {\n a = (performance || Date).now();\n }, end: function() {\n h++;\n var f = (performance || Date).now();\n if (u.update(f - a, 200), f > l + 1e3 && (c.update(1e3 * h / (f - l), 100), l = f, h = 0, m)) {\n var d = performance.memory;\n m.update(d.usedJSHeapSize / 1048576, d.jsHeapSizeLimit / 1048576);\n }\n return f;\n }, update: function() {\n a = this.end();\n }, domElement: r, setMode: i };\n };\n return t.Panel = function(n, i, s) {\n var r = 1 / 0, a = 0, l = Math.round, h = l(window.devicePixelRatio || 1), c = 80 * h, u = 48 * h, m = 3 * h, f = 2 * h, d = 3 * h, p = 15 * h, g = 74 * h, y = 30 * h, w = document.createElement(\"canvas\");\n w.width = c, w.height = u, w.style.cssText = \"width:80px;height:48px\";\n var x = w.getContext(\"2d\");\n return x.font = \"bold \" + 9 * h + \"px Helvetica,Arial,sans-serif\", x.textBaseline = \"top\", x.fillStyle = s, x.fillRect(0, 0, c, u), x.fillStyle = i, x.fillText(n, m, f), x.fillRect(d, p, g, y), x.fillStyle = s, x.globalAlpha = 0.9, x.fillRect(d, p, g, y), { dom: w, update: function(_, b) {\n r = Math.min(r, _), a = Math.max(a, _), x.fillStyle = s, x.globalAlpha = 1, x.fillRect(0, 0, c, p), x.fillStyle = i, x.fillText(l(_) + \" \" + n + \" (\" + l(r) + \"-\" + l(a) + \")\", m, f), x.drawImage(w, d + h, p, g - h, y, d, p, g - h, y), x.fillRect(d + g - h, p, h, y), x.fillStyle = s, x.globalAlpha = 0.9, x.fillRect(d + g - h, p, h, l((1 - _ / b) * y));\n } };\n }, t;\n });\n })(Ii)), Ii.exports;\n}\nvar Ju = $u();\nconst Qu = /* @__PURE__ */ ra(Ju);\nvar wn = Object.freeze({\n Linear: Object.freeze({\n None: function(o) {\n return o;\n },\n In: function(o) {\n return o;\n },\n Out: function(o) {\n return o;\n },\n InOut: function(o) {\n return o;\n }\n }),\n Quadratic: Object.freeze({\n In: function(o) {\n return o * o;\n },\n Out: function(o) {\n return o * (2 - o);\n },\n InOut: function(o) {\n return (o *= 2) < 1 ? 0.5 * o * o : -0.5 * (--o * (o - 2) - 1);\n }\n }),\n Cubic: Object.freeze({\n In: function(o) {\n return o * o * o;\n },\n Out: function(o) {\n return --o * o * o + 1;\n },\n InOut: function(o) {\n return (o *= 2) < 1 ? 0.5 * o * o * o : 0.5 * ((o -= 2) * o * o + 2);\n }\n }),\n Quartic: Object.freeze({\n In: function(o) {\n return o * o * o * o;\n },\n Out: function(o) {\n return 1 - --o * o * o * o;\n },\n InOut: function(o) {\n return (o *= 2) < 1 ? 0.5 * o * o * o * o : -0.5 * ((o -= 2) * o * o * o - 2);\n }\n }),\n Quintic: Object.freeze({\n In: function(o) {\n return o * o * o * o * o;\n },\n Out: function(o) {\n return --o * o * o * o * o + 1;\n },\n InOut: function(o) {\n return (o *= 2) < 1 ? 0.5 * o * o * o * o * o : 0.5 * ((o -= 2) * o * o * o * o + 2);\n }\n }),\n Sinusoidal: Object.freeze({\n In: function(o) {\n return 1 - Math.sin((1 - o) * Math.PI / 2);\n },\n Out: function(o) {\n return Math.sin(o * Math.PI / 2);\n },\n InOut: function(o) {\n return 0.5 * (1 - Math.sin(Math.PI * (0.5 - o)));\n }\n }),\n Exponential: Object.freeze({\n In: function(o) {\n return o === 0 ? 0 : Math.pow(1024, o - 1);\n },\n Out: function(o) {\n return o === 1 ? 1 : 1 - Math.pow(2, -10 * o);\n },\n InOut: function(o) {\n return o === 0 ? 0 : o === 1 ? 1 : (o *= 2) < 1 ? 0.5 * Math.pow(1024, o - 1) : 0.5 * (-Math.pow(2, -10 * (o - 1)) + 2);\n }\n }),\n Circular: Object.freeze({\n In: function(o) {\n return 1 - Math.sqrt(1 - o * o);\n },\n Out: function(o) {\n return Math.sqrt(1 - --o * o);\n },\n InOut: function(o) {\n return (o *= 2) < 1 ? -0.5 * (Math.sqrt(1 - o * o) - 1) : 0.5 * (Math.sqrt(1 - (o -= 2) * o) + 1);\n }\n }),\n Elastic: Object.freeze({\n In: function(o) {\n return o === 0 ? 0 : o === 1 ? 1 : -Math.pow(2, 10 * (o - 1)) * Math.sin((o - 1.1) * 5 * Math.PI);\n },\n Out: function(o) {\n return o === 0 ? 0 : o === 1 ? 1 : Math.pow(2, -10 * o) * Math.sin((o - 0.1) * 5 * Math.PI) + 1;\n },\n InOut: function(o) {\n return o === 0 ? 0 : o === 1 ? 1 : (o *= 2, o < 1 ? -0.5 * Math.pow(2, 10 * (o - 1)) * Math.sin((o - 1.1) * 5 * Math.PI) : 0.5 * Math.pow(2, -10 * (o - 1)) * Math.sin((o - 1.1) * 5 * Math.PI) + 1);\n }\n }),\n Back: Object.freeze({\n In: function(o) {\n var e = 1.70158;\n return o === 1 ? 1 : o * o * ((e + 1) * o - e);\n },\n Out: function(o) {\n var e = 1.70158;\n return o === 0 ? 0 : --o * o * ((e + 1) * o + e) + 1;\n },\n InOut: function(o) {\n var e = 2.5949095;\n return (o *= 2) < 1 ? 0.5 * (o * o * ((e + 1) * o - e)) : 0.5 * ((o -= 2) * o * ((e + 1) * o + e) + 2);\n }\n }),\n Bounce: Object.freeze({\n In: function(o) {\n return 1 - wn.Bounce.Out(1 - o);\n },\n Out: function(o) {\n return o < 1 / 2.75 ? 7.5625 * o * o : o < 2 / 2.75 ? 7.5625 * (o -= 1.5 / 2.75) * o + 0.75 : o < 2.5 / 2.75 ? 7.5625 * (o -= 2.25 / 2.75) * o + 0.9375 : 7.5625 * (o -= 2.625 / 2.75) * o + 0.984375;\n },\n InOut: function(o) {\n return o < 0.5 ? wn.Bounce.In(o * 2) * 0.5 : wn.Bounce.Out(o * 2 - 1) * 0.5 + 0.5;\n }\n }),\n generatePow: function(o) {\n return o === void 0 && (o = 4), o = o < Number.EPSILON ? Number.EPSILON : o, o = o > 1e4 ? 1e4 : o, {\n In: function(e) {\n return Math.pow(e, o);\n },\n Out: function(e) {\n return 1 - Math.pow(1 - e, o);\n },\n InOut: function(e) {\n return e < 0.5 ? Math.pow(e * 2, o) / 2 : (1 - Math.pow(2 - e * 2, o)) / 2 + 0.5;\n }\n };\n }\n}), Bn = function() {\n return performance.now();\n}, ed = (\n /** @class */\n (function() {\n function o() {\n this._tweens = {}, this._tweensAddedDuringUpdate = {};\n }\n return o.prototype.getAll = function() {\n var e = this;\n return Object.keys(this._tweens).map(function(t) {\n return e._tweens[t];\n });\n }, o.prototype.removeAll = function() {\n this._tweens = {};\n }, o.prototype.add = function(e) {\n this._tweens[e.getId()] = e, this._tweensAddedDuringUpdate[e.getId()] = e;\n }, o.prototype.remove = function(e) {\n delete this._tweens[e.getId()], delete this._tweensAddedDuringUpdate[e.getId()];\n }, o.prototype.update = function(e, t) {\n e === void 0 && (e = Bn()), t === void 0 && (t = !1);\n var n = Object.keys(this._tweens);\n if (n.length === 0)\n return !1;\n for (; n.length > 0; ) {\n this._tweensAddedDuringUpdate = {};\n for (var i = 0; i < n.length; i++) {\n var s = this._tweens[n[i]], r = !t;\n s && s.update(e, r) === !1 && !t && delete this._tweens[n[i]];\n }\n n = Object.keys(this._tweensAddedDuringUpdate);\n }\n return !0;\n }, o;\n })()\n), Zs = {\n Linear: function(o, e) {\n var t = o.length - 1, n = t * e, i = Math.floor(n), s = Zs.Utils.Linear;\n return e < 0 ? s(o[0], o[1], n) : e > 1 ? s(o[t], o[t - 1], t - n) : s(o[i], o[i + 1 > t ? t : i + 1], n - i);\n },\n Utils: {\n Linear: function(o, e, t) {\n return (e - o) * t + o;\n }\n }\n}, za = (\n /** @class */\n (function() {\n function o() {\n }\n return o.nextId = function() {\n return o._nextId++;\n }, o._nextId = 0, o;\n })()\n), qs = new ed(), td = (\n /** @class */\n (function() {\n function o(e, t) {\n t === void 0 && (t = qs), this._object = e, this._group = t, this._isPaused = !1, this._pauseStart = 0, this._valuesStart = {}, this._valuesEnd = {}, this._valuesStartRepeat = {}, this._duration = 1e3, this._isDynamic = !1, this._initialRepeat = 0, this._repeat = 0, this._yoyo = !1, this._isPlaying = !1, this._reversed = !1, this._delayTime = 0, this._startTime = 0, this._easingFunction = wn.Linear.None, this._interpolationFunction = Zs.Linear, this._chainedTweens = [], this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._id = za.nextId(), this._isChainStopped = !1, this._propertiesAreSetUp = !1, this._goToEnd = !1;\n }\n return o.prototype.getId = function() {\n return this._id;\n }, o.prototype.isPlaying = function() {\n return this._isPlaying;\n }, o.prototype.isPaused = function() {\n return this._isPaused;\n }, o.prototype.getDuration = function() {\n return this._duration;\n }, o.prototype.to = function(e, t) {\n if (t === void 0 && (t = 1e3), this._isPlaying)\n throw new Error(\"Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.\");\n return this._valuesEnd = e, this._propertiesAreSetUp = !1, this._duration = t < 0 ? 0 : t, this;\n }, o.prototype.duration = function(e) {\n return e === void 0 && (e = 1e3), this._duration = e < 0 ? 0 : e, this;\n }, o.prototype.dynamic = function(e) {\n return e === void 0 && (e = !1), this._isDynamic = e, this;\n }, o.prototype.start = function(e, t) {\n if (e === void 0 && (e = Bn()), t === void 0 && (t = !1), this._isPlaying)\n return this;\n if (this._group && this._group.add(this), this._repeat = this._initialRepeat, this._reversed) {\n this._reversed = !1;\n for (var n in this._valuesStartRepeat)\n this._swapEndStartRepeatValues(n), this._valuesStart[n] = this._valuesStartRepeat[n];\n }\n if (this._isPlaying = !0, this._isPaused = !1, this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._isChainStopped = !1, this._startTime = e, this._startTime += this._delayTime, !this._propertiesAreSetUp || t) {\n if (this._propertiesAreSetUp = !0, !this._isDynamic) {\n var i = {};\n for (var s in this._valuesEnd)\n i[s] = this._valuesEnd[s];\n this._valuesEnd = i;\n }\n this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, t);\n }\n return this;\n }, o.prototype.startFromCurrentValues = function(e) {\n return this.start(e, !0);\n }, o.prototype._setupProperties = function(e, t, n, i, s) {\n for (var r in n) {\n var a = e[r], l = Array.isArray(a), h = l ? \"array\" : typeof a, c = !l && Array.isArray(n[r]);\n if (!(h === \"undefined\" || h === \"function\")) {\n if (c) {\n var u = n[r];\n if (u.length === 0)\n continue;\n for (var m = [a], f = 0, d = u.length; f < d; f += 1) {\n var p = this._handleRelativeValue(a, u[f]);\n if (isNaN(p)) {\n c = !1, console.warn(\"Found invalid interpolation list. Skipping.\");\n break;\n }\n m.push(p);\n }\n c && (n[r] = m);\n }\n if ((h === \"object\" || l) && a && !c) {\n t[r] = l ? [] : {};\n var g = a;\n for (var y in g)\n t[r][y] = g[y];\n i[r] = l ? [] : {};\n var u = n[r];\n if (!this._isDynamic) {\n var w = {};\n for (var y in u)\n w[y] = u[y];\n n[r] = u = w;\n }\n this._setupProperties(g, t[r], u, i[r], s);\n } else\n (typeof t[r] > \"u\" || s) && (t[r] = a), l || (t[r] *= 1), c ? i[r] = n[r].slice().reverse() : i[r] = t[r] || 0;\n }\n }\n }, o.prototype.stop = function() {\n return this._isChainStopped || (this._isChainStopped = !0, this.stopChainedTweens()), this._isPlaying ? (this._group && this._group.remove(this), this._isPlaying = !1, this._isPaused = !1, this._onStopCallback && this._onStopCallback(this._object), this) : this;\n }, o.prototype.end = function() {\n return this._goToEnd = !0, this.update(1 / 0), this;\n }, o.prototype.pause = function(e) {\n return e === void 0 && (e = Bn()), this._isPaused || !this._isPlaying ? this : (this._isPaused = !0, this._pauseStart = e, this._group && this._group.remove(this), this);\n }, o.prototype.resume = function(e) {\n return e === void 0 && (e = Bn()), !this._isPaused || !this._isPlaying ? this : (this._isPaused = !1, this._startTime += e - this._pauseStart, this._pauseStart = 0, this._group && this._group.add(this), this);\n }, o.prototype.stopChainedTweens = function() {\n for (var e = 0, t = this._chainedTweens.length; e < t; e++)\n this._chainedTweens[e].stop();\n return this;\n }, o.prototype.group = function(e) {\n return e === void 0 && (e = qs), this._group = e, this;\n }, o.prototype.delay = function(e) {\n return e === void 0 && (e = 0), this._delayTime = e, this;\n }, o.prototype.repeat = function(e) {\n return e === void 0 && (e = 0), this._initialRepeat = e, this._repeat = e, this;\n }, o.prototype.repeatDelay = function(e) {\n return this._repeatDelayTime = e, this;\n }, o.prototype.yoyo = function(e) {\n return e === void 0 && (e = !1), this._yoyo = e, this;\n }, o.prototype.easing = function(e) {\n return e === void 0 && (e = wn.Linear.None), this._easingFunction = e, this;\n }, o.prototype.interpolation = function(e) {\n return e === void 0 && (e = Zs.Linear), this._interpolationFunction = e, this;\n }, o.prototype.chain = function() {\n for (var e = [], t = 0; t < arguments.length; t++)\n e[t] = arguments[t];\n return this._chainedTweens = e, this;\n }, o.prototype.onStart = function(e) {\n return this._onStartCallback = e, this;\n }, o.prototype.onEveryStart = function(e) {\n return this._onEveryStartCallback = e, this;\n }, o.prototype.onUpdate = function(e) {\n return this._onUpdateCallback = e, this;\n }, o.prototype.onRepeat = function(e) {\n return this._onRepeatCallback = e, this;\n }, o.prototype.onComplete = function(e) {\n return this._onCompleteCallback = e, this;\n }, o.prototype.onStop = function(e) {\n return this._onStopCallback = e, this;\n }, o.prototype.update = function(e, t) {\n var n = this, i;\n if (e === void 0 && (e = Bn()), t === void 0 && (t = !0), this._isPaused)\n return !0;\n var s, r = this._startTime + this._duration;\n if (!this._goToEnd && !this._isPlaying) {\n if (e > r)\n return !1;\n t && this.start(e, !0);\n }\n if (this._goToEnd = !1, e < this._startTime)\n return !0;\n this._onStartCallbackFired === !1 && (this._onStartCallback && this._onStartCallback(this._object), this._onStartCallbackFired = !0), this._onEveryStartCallbackFired === !1 && (this._onEveryStartCallback && this._onEveryStartCallback(this._object), this._onEveryStartCallbackFired = !0);\n var a = e - this._startTime, l = this._duration + ((i = this._repeatDelayTime) !== null && i !== void 0 ? i : this._delayTime), h = this._duration + this._repeat * l, c = function() {\n if (n._duration === 0 || a > h)\n return 1;\n var g = Math.trunc(a / l), y = a - g * l, w = Math.min(y / n._duration, 1);\n return w === 0 && a === n._duration ? 1 : w;\n }, u = c(), m = this._easingFunction(u);\n if (this._updateProperties(this._object, this._valuesStart, this._valuesEnd, m), this._onUpdateCallback && this._onUpdateCallback(this._object, u), this._duration === 0 || a >= this._duration)\n if (this._repeat > 0) {\n var f = Math.min(Math.trunc((a - this._duration) / l) + 1, this._repeat);\n isFinite(this._repeat) && (this._repeat -= f);\n for (s in this._valuesStartRepeat)\n !this._yoyo && typeof this._valuesEnd[s] == \"string\" && (this._valuesStartRepeat[s] = // eslint-disable-next-line\n // @ts-ignore FIXME?\n this._valuesStartRepeat[s] + parseFloat(this._valuesEnd[s])), this._yoyo && this._swapEndStartRepeatValues(s), this._valuesStart[s] = this._valuesStartRepeat[s];\n return this._yoyo && (this._reversed = !this._reversed), this._startTime += l * f, this._onRepeatCallback && this._onRepeatCallback(this._object), this._onEveryStartCallbackFired = !1, !0;\n } else {\n this._onCompleteCallback && this._onCompleteCallback(this._object);\n for (var d = 0, p = this._chainedTweens.length; d < p; d++)\n this._chainedTweens[d].start(this._startTime + this._duration, !1);\n return this._isPlaying = !1, !1;\n }\n return !0;\n }, o.prototype._updateProperties = function(e, t, n, i) {\n for (var s in n)\n if (t[s] !== void 0) {\n var r = t[s] || 0, a = n[s], l = Array.isArray(e[s]), h = Array.isArray(a), c = !l && h;\n c ? e[s] = this._interpolationFunction(a, i) : typeof a == \"object\" && a ? this._updateProperties(e[s], r, a, i) : (a = this._handleRelativeValue(r, a), typeof a == \"number\" && (e[s] = r + (a - r) * i));\n }\n }, o.prototype._handleRelativeValue = function(e, t) {\n return typeof t != \"string\" ? t : t.charAt(0) === \"+\" || t.charAt(0) === \"-\" ? e + parseFloat(t) : parseFloat(t);\n }, o.prototype._swapEndStartRepeatValues = function(e) {\n var t = this._valuesStartRepeat[e], n = this._valuesEnd[e];\n typeof n == \"string\" ? this._valuesStartRepeat[e] = this._valuesStartRepeat[e] + parseFloat(n) : this._valuesStartRepeat[e] = this._valuesEnd[e], this._valuesEnd[e] = t;\n }, o;\n })()\n);\nza.nextId;\nvar dt = qs;\ndt.getAll.bind(dt);\ndt.removeAll.bind(dt);\ndt.add.bind(dt);\ndt.remove.bind(dt);\ndt.update.bind(dt);\nvar An = {\n Easing: wn,\n Tween: td\n};\nclass nd extends Bl {\n /**\n * Constructs a new RGBE/HDR loader.\n *\n * @param {LoadingManager} [manager] - The loading manager.\n */\n constructor(e) {\n super(e), this.type = _t;\n }\n /**\n * Parses the given RGBE texture data.\n *\n * @param {ArrayBuffer} buffer - The raw texture data.\n * @return {DataTextureLoader~TexData} An object representing the parsed texture data.\n */\n parse(e) {\n const r = function(P, C) {\n switch (P) {\n case 1:\n throw new Error(\"THREE.HDRLoader: Read Error: \" + (C || \"\"));\n case 2:\n throw new Error(\"THREE.HDRLoader: Write Error: \" + (C || \"\"));\n case 3:\n throw new Error(\"THREE.HDRLoader: Bad File Format: \" + (C || \"\"));\n default:\n case 4:\n throw new Error(\"THREE.HDRLoader: Memory Error: \" + (C || \"\"));\n }\n }, u = function(P, C, D) {\n C = C || 1024;\n let T = P.pos, R = -1, v = 0, z = \"\", H = String.fromCharCode.apply(null, new Uint16Array(P.subarray(T, T + 128)));\n for (; 0 > (R = H.indexOf(`\n`)) && v < C && T < P.byteLength; )\n z += H, v += H.length, T += 128, H += String.fromCharCode.apply(null, new Uint16Array(P.subarray(T, T + 128)));\n return -1 < R ? (P.pos += v + R + 1, z + H.slice(0, R)) : !1;\n }, m = function(P) {\n const C = /^#\\?(\\S+)/, D = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/, I = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/, T = /^\\s*FORMAT=(\\S+)\\s*$/, R = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/, v = {\n valid: 0,\n /* indicate which fields are valid */\n string: \"\",\n /* the actual header string */\n comments: \"\",\n /* comments found in header */\n programtype: \"RGBE\",\n /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n format: \"\",\n /* RGBE format, default 32-bit_rle_rgbe */\n gamma: 1,\n /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n exposure: 1,\n /* a value of 1.0 in an image corresponds to watts/steradian/m^2. defaults to 1.0 */\n width: 0,\n height: 0\n /* image dimensions, width/height */\n };\n let z, H;\n for ((P.pos >= P.byteLength || !(z = u(P))) && r(1, \"no header found\"), (H = z.match(C)) || r(3, \"bad initial token\"), v.valid |= 1, v.programtype = H[1], v.string += z + `\n`; z = u(P), z !== !1; ) {\n if (v.string += z + `\n`, z.charAt(0) === \"#\") {\n v.comments += z + `\n`;\n continue;\n }\n if ((H = z.match(D)) && (v.gamma = parseFloat(H[1])), (H = z.match(I)) && (v.exposure = parseFloat(H[1])), (H = z.match(T)) && (v.valid |= 2, v.format = H[1]), (H = z.match(R)) && (v.valid |= 4, v.height = parseInt(H[1], 10), v.width = parseInt(H[2], 10)), v.valid & 2 && v.valid & 4) break;\n }\n return v.valid & 2 || r(3, \"missing format specifier\"), v.valid & 4 || r(3, \"missing image size specifier\"), v;\n }, f = function(P, C, D) {\n const I = C;\n if (\n // run length encoding is not allowed so read flat\n I < 8 || I > 32767 || // this file is not run length encoded\n P[0] !== 2 || P[1] !== 2 || P[2] & 128\n )\n return new Uint8Array(P);\n I !== (P[2] << 8 | P[3]) && r(3, \"wrong scanline width\");\n const T = new Uint8Array(4 * C * D);\n T.length || r(4, \"unable to allocate buffer space\");\n let R = 0, v = 0;\n const z = 4 * I, H = new Uint8Array(4), V = new Uint8Array(z);\n let te = D;\n for (; te > 0 && v < P.byteLength; ) {\n v + 4 > P.byteLength && r(1), H[0] = P[v++], H[1] = P[v++], H[2] = P[v++], H[3] = P[v++], (H[0] != 2 || H[1] != 2 || (H[2] << 8 | H[3]) != I) && r(3, \"bad rgbe scanline format\");\n let G = 0, $;\n for (; G < z && v < P.byteLength; ) {\n $ = P[v++];\n const O = $ > 128;\n if (O && ($ -= 128), ($ === 0 || G + $ > z) && r(3, \"bad scanline data\"), O) {\n const Q = P[v++];\n for (let ee = 0; ee < $; ee++)\n V[G++] = Q;\n } else\n V.set(P.subarray(v, v + $), G), G += $, v += $;\n }\n const N = I;\n for (let O = 0; O < N; O++) {\n let Q = 0;\n T[R] = V[O + Q], Q += I, T[R + 1] = V[O + Q], Q += I, T[R + 2] = V[O + Q], Q += I, T[R + 3] = V[O + Q], R += 4;\n }\n te--;\n }\n return T;\n }, d = function(P, C, D, I) {\n const T = P[C + 3], R = Math.pow(2, T - 128) / 255;\n D[I + 0] = P[C + 0] * R, D[I + 1] = P[C + 1] * R, D[I + 2] = P[C + 2] * R, D[I + 3] = 1;\n }, p = function(P, C, D, I) {\n const T = P[C + 3], R = Math.pow(2, T - 128) / 255;\n D[I + 0] = qn.toHalfFloat(Math.min(P[C + 0] * R, 65504)), D[I + 1] = qn.toHalfFloat(Math.min(P[C + 1] * R, 65504)), D[I + 2] = qn.toHalfFloat(Math.min(P[C + 2] * R, 65504)), D[I + 3] = qn.toHalfFloat(1);\n }, g = new Uint8Array(e);\n g.pos = 0;\n const y = m(g), w = y.width, x = y.height, _ = f(g.subarray(g.pos), w, x);\n let b, E, A;\n switch (this.type) {\n case Ci:\n A = _.length / 4;\n const P = new Float32Array(A * 4);\n for (let D = 0; D < A; D++)\n d(_, D * 4, P, D * 4);\n b = P, E = Ci;\n break;\n case _t:\n A = _.length / 4;\n const C = new Uint16Array(A * 4);\n for (let D = 0; D < A; D++)\n p(_, D * 4, C, D * 4);\n b = C, E = _t;\n break;\n default:\n throw new Error(\"THREE.HDRLoader: Unsupported type: \" + this.type);\n }\n return {\n width: w,\n height: x,\n data: b,\n header: y.string,\n gamma: y.gamma,\n exposure: y.exposure,\n type: E\n };\n }\n /**\n * Sets the texture type.\n *\n * @param {(HalfFloatType|FloatType)} value - The texture type to set.\n * @return {HDRLoader} A reference to this loader.\n */\n setDataType(e) {\n return this.type = e, this;\n }\n load(e, t, n, i) {\n function s(r, a) {\n switch (r.type) {\n case Ci:\n case _t:\n r.colorSpace = rt, r.minFilter = Hn, r.magFilter = Hn, r.generateMipmaps = !1, r.flipY = !0;\n break;\n }\n t && t(r, a);\n }\n return super.load(e, s, n, i);\n }\n}\nfunction id() {\n return new M.Scene();\n}\nfunction sd(o, e) {\n o.appendChild(e.domElement);\n}\nfunction rd(o, e, t) {\n var n = new Object();\n n.visible = !0;\n let i = null, s, r, a = [];\n n.init = function() {\n s || (h(), c(), u());\n }, n.Hide = function() {\n s.style.display = \"none\", n.visible = !1;\n }, n.Show = function() {\n s.style.display = \"block\", n.visible = !0;\n }, n.RenderScene = function() {\n n.camera.quaternion.copy(e.camera.quaternion);\n const d = new M.Vector3(0, 0, 1).applyQuaternion(e.camera.quaternion);\n n.camera.position.copy(d.multiplyScalar(100)), n.sceneOrtho.renderer.render(n.sceneOrtho, n.camera);\n }, n.ToggleDirectionView = function(d) {\n var p = new M.Vector3(0, 0, 0);\n d == \"top\" ? p = new M.Vector3(0, 1, 1e-5) : d == \"down\" ? p = new M.Vector3(0, -1, 1e-5) : d == \"front\" ? p = new M.Vector3(0, 0, 1) : d == \"left\" ? p = new M.Vector3(-1, 0, 0) : d == \"back\" ? p = new M.Vector3(0, 0, -1) : d == \"right\" ? p = new M.Vector3(1, 0, 0) : d == \"top_front\" ? p = new M.Vector3(1, 1, 0) : d == \"top_left\" ? p = new M.Vector3(0, 1, -1) : d == \"top_back\" ? p = new M.Vector3(-1, 1, 0) : d == \"top_right\" ? p = new M.Vector3(0, 1, 1) : d == \"down_front\" ? p = new M.Vector3(1, -1, 0) : d == \"down_left\" ? p = new M.Vector3(0, -1, -1) : d == \"down_back\" ? p = new M.Vector3(-1, -1, 0) : d == \"down_right\" ? p = new M.Vector3(0, -1, 1) : d == \"front_right\" ? p = new M.Vector3(1, 0, 1) : d == \"right_back\" ? p = new M.Vector3(-1, 0, 1) : d == \"back_left\" ? p = new M.Vector3(-1, 0, -1) : d == \"left_front\" ? p = new M.Vector3(1, 0, -1) : d == \"top_left_front\" ? p = new M.Vector3(1, 1, -1) : d == \"top_front_right\" ? p = new M.Vector3(1, 1, 1) : d == \"top_right_back\" ? p = new M.Vector3(-1, 1, 1) : d == \"top_back_left\" ? p = new M.Vector3(-1, 1, -1) : d == \"button_left_front\" ? p = new M.Vector3(1, -1, -1) : d == \"button_front_right\" ? p = new M.Vector3(1, -1, 1) : d == \"button_right_back\" ? p = new M.Vector3(-1, 1, 1) : d == \"button_back_left\" && (p = new M.Vector3(-1, -1, -1));\n var g = o.octreeBox.getBoundingBox(), y = g.min, w = g.max, x = y.clone().add(w.clone()).multiplyScalar(0.5), _ = x.clone().add(p.multiplyScalar(1 * w.distanceTo(y)));\n l(e.camera.position, _, o.controls.target.clone(), x);\n }, n.GetCameraPose = function() {\n var d = e.camera.quaternion, p = e.camera.position, g = o.controls.target, y = {\n quaternion: d,\n position: p,\n target: g\n };\n return y;\n }, n.ReductionCameraPose = function(d, p = 1e3, g) {\n var y = new M.Quaternion(\n d.quaternion._x,\n d.quaternion._y,\n d.quaternion._z,\n d.quaternion._w\n ), w = new M.Vector3(d.position.x, d.position.y, d.position.z), x = new M.Vector3(d.target.x, d.target.y, d.target.z);\n let _ = !1;\n l(\n e.camera.position,\n w,\n o.controls.target.clone(),\n x,\n e.camera.quaternion,\n y,\n p,\n (b) => {\n g && (_ || (g(b), _ = !0));\n }\n ), g && setTimeout(() => {\n _ || (g(!0), _ = !0);\n }, p + 10);\n }, n.CameraGoHome = function() {\n var d = o.octreeBox.getBoundingBox(), p = d.min.clone().add(d.max.clone()).multiplyScalar(0.5);\n let g = new M.Vector3(1, 1, 1);\n var y = d.max.distanceTo(d.min), w = p.clone().add(g.multiplyScalar(y));\n if (e.camera.isOrthographicCamera) {\n var x = o.container.clientWidth / o.container.clientHeight, _ = y * 0.6;\n e.camera.left = -_ * x, e.camera.right = _ * x, e.camera.top = _, e.camera.bottom = -_, e.camera.zoom = 1, e.camera.updateProjectionMatrix();\n }\n l(e.camera.position, w, o.controls.target.clone(), p);\n }, n.zoomToBox = function(d) {\n var p = d.min.clone().add(d.max.clone()).multiplyScalar(0.5), g = e.camera.position.clone().sub(o.controls.target.clone()).normalize(), y = e.camera.position.distanceTo(o.controls.target), w = p.clone().add(g.multiplyScalar(y)), x = e.camera.zoom;\n if (e.camera.isOrthographicCamera) {\n var _ = new M.Vector3(1, 0, 0).applyQuaternion(e.camera.quaternion), b = new M.Vector3(0, 1, 0).applyQuaternion(e.camera.quaternion), E = [\n new M.Vector3(d.min.x, d.min.y, d.min.z),\n new M.Vector3(d.max.x, d.min.y, d.min.z),\n new M.Vector3(d.min.x, d.max.y, d.min.z),\n new M.Vector3(d.max.x, d.max.y, d.min.z),\n new M.Vector3(d.min.x, d.min.y, d.max.z),\n new M.Vector3(d.max.x, d.min.y, d.max.z),\n new M.Vector3(d.min.x, d.max.y, d.max.z),\n new M.Vector3(d.max.x, d.max.y, d.max.z)\n ], A = 1 / 0, P = -1 / 0, C = 1 / 0, D = -1 / 0;\n for (var I of E) {\n var T = I.dot(_), R = I.dot(b);\n A = Math.min(A, T), P = Math.max(P, T), C = Math.min(C, R), D = Math.max(D, R);\n }\n var v = (P - A) / 2, z = (D - C) / 2, H = (e.camera.right - e.camera.left) / 2, V = (e.camera.top - e.camera.bottom) / 2;\n x = Math.min(H / v, V / z) * 0.75;\n }\n var te = e.camera.position.clone(), G = o.controls.target.clone(), $ = e.camera.zoom, N = new An.Tween({\n x1: te.x,\n y1: te.y,\n z1: te.z,\n x2: G.x,\n y2: G.y,\n z2: G.z,\n zoom: $\n }).to({\n x1: w.x,\n y1: w.y,\n z1: w.z,\n x2: p.x,\n y2: p.y,\n z2: p.z,\n zoom: x\n }, 1e3);\n N.onUpdate(function(Q) {\n o.controls && (e.camera.position.set(Q.x1, Q.y1, Q.z1), o.controls.target.set(Q.x2, Q.y2, Q.z2), e.camera.isOrthographicCamera && (e.camera.zoom = Q.zoom, e.camera.updateProjectionMatrix()), o.controls.auto = !0, o.controls.update(), n.RenderScene());\n }), N.onComplete(function() {\n o.controls && (o.controls.auto = !1, n.RenderScene(), cancelAnimationFrame(i), i = null);\n }), N.easing(An.Easing.Cubic.InOut), N.start();\n function O() {\n i = requestAnimationFrame(O), N.update();\n }\n O();\n };\n function l(d, p, g, y, w, x, _ = 1e3, b) {\n var E;\n w && x ? (E = new An.Tween({\n x1: d.x,\n // 相机当前位置x\n y1: d.y,\n // 相机当前位置y\n z1: d.z,\n // 相机当前位置z\n x2: g.x,\n // 控制当前的中心点x\n y2: g.y,\n // 控制当前的中心点y\n z2: g.z,\n // 控制当前的中心点z\n _x: w._x,\n // 相机当前quaternion\n _y: w._y,\n // 相机当前quaternion\n _z: w._z,\n // 相机当前quaternion\n _w: w._w\n // 相机当前quaternion\n }), E.to(\n {\n x1: p.x,\n // 新的相机位置x\n y1: p.y,\n // 新的相机位置y\n z1: p.z,\n // 新的相机位置z\n x2: y.x,\n // 新的控制中心点位置x\n y2: y.y,\n // 新的控制中心点位置x\n z2: y.z,\n // 新的控制中心点位置x\n _x: x._x,\n // 新的相机quaternion\n _y: x._y,\n // 新的相机quaternion\n _z: x._z,\n // 新的相机quaternion\n _w: x._w\n // 新的相机quaternion\n },\n _\n )) : (E = new An.Tween({\n x1: d.x,\n // 相机当前位置x\n y1: d.y,\n // 相机当前位置y\n z1: d.z,\n // 相机当前位置z\n x2: g.x,\n // 控制当前的中心点x\n y2: g.y,\n // 控制当前的中心点y\n z2: g.z\n // 控制当前的中心点z\n }), E.to(\n {\n x1: p.x,\n // 新的相机位置x\n y1: p.y,\n // 新的相机位置y\n z1: p.z,\n // 新的相机位置z\n x2: y.x,\n // 新的控制中心点位置x\n y2: y.y,\n // 新的控制中心点位置x\n z2: y.z\n // 新的控制中心点位置x\n },\n _\n )), E.onUpdate(function(P) {\n o.controls && (w && x ? (e.camera.quaternion._x = P._x, e.camera.quaternion._y = P._y, e.camera.quaternion._z = P._z, e.camera.quaternion._w = P._w) : o.controls.auto = !0, e.camera.position.x = P.x1, e.camera.position.y = P.y1, e.camera.position.z = P.z1, o.controls.target.x = P.x2, o.controls.target.y = P.y2, o.controls.target.z = P.z2, o.controls.update(), n.RenderScene());\n }), E.onComplete(function(P) {\n o.controls && (o.controls.auto = !1, n.RenderScene(), b && b(!0), cancelAnimationFrame(i), i = null);\n }), E.easing(An.Easing.Cubic.InOut);\n function A(P) {\n i = requestAnimationFrame(A), E.update();\n }\n E.start(), A();\n }\n function h() {\n s = document.createElement(\"div\"), s.className = \"ViewCube\", t.appendChild(s), r = document.createElement(\"div\"), r.className = \"viewSettingWrapper\", r.innerHTML = \"...\", s.appendChild(r);\n var d = document.createElement(\"div\");\n d.className = \"homeViewWrapper\", d.addEventListener(\"mousedown\", function() {\n console.log(\"归位\"), n.CameraGoHome();\n }), s.appendChild(d);\n const p = document.createElement(\"div\");\n p.className = \"cameraToggleWrapper\", p.title = \"切换正交/透视视图\", p.innerHTML = \"⊞\", p.addEventListener(\"mousedown\", function(_) {\n _.stopPropagation(), console.log(\"切换视图\"), n.ToggleCameraType(), w();\n }), s.appendChild(p);\n const g = document.createElement(\"div\");\n g.className = \"screenshotWrapper\", g.title = \"截图\", g.innerHTML = \"📷\", g.addEventListener(\"mousedown\", function(_) {\n _.stopPropagation(), console.log(\"截图\"), n.TakeScreenshot(), w();\n }), s.appendChild(g);\n const y = document.createElement(\"div\");\n y.className = \"fullscreenWrapper\", y.title = \"全屏\", y.innerHTML = \"⛶\", y.addEventListener(\"mousedown\", function(_) {\n _.stopPropagation(), console.log(\"全屏\"), n.ToggleFullscreen(), w();\n }), s.appendChild(y), r.addEventListener(\"mousedown\", function(_) {\n _.stopPropagation(), p.classList.contains(\"show\") ? (w(), console.log(\"隐藏功能按钮\")) : (x(), console.log(\"显示功能按钮\"));\n });\n function w() {\n p.classList.remove(\"show\"), g.classList.remove(\"show\"), y.classList.remove(\"show\");\n }\n function x() {\n p.classList.add(\"show\"), g.classList.add(\"show\"), y.classList.add(\"show\");\n }\n }\n function c() {\n n.sceneOrtho = id();\n var g = t.clientWidth, y = t.clientWidth, d = g > y ? g / y : y / g, p = 300;\n n.camera = new M.OrthographicCamera(\n p * d / -2,\n p * d / 2,\n p / 2,\n p / -2,\n 0.01,\n 1e4\n );\n var g = s.clientWidth, y = s.clientHeight, w = new M.WebGLRenderer({\n alpha: !0\n });\n w.setSize(g, y), w.setClearAlpha(0), n.sceneOrtho.renderer = w;\n let x = new M.AmbientLight(16777215, 0.8);\n n.sceneOrtho.add(x), sd(s, w);\n }\n function u() {\n const d = \"/assets/viewcube/\";\n let p = [\n {\n label: \"右\",\n icon: d + \"cn_right.png\"\n },\n {\n label: \"左\",\n icon: d + \"cn_left.png\"\n },\n {\n label: \"顶\",\n icon: d + \"cn_top.png\"\n },\n {\n label: \"底\",\n icon: d + \"cn_bottom.png\"\n },\n {\n label: \"前\",\n icon: d + \"cn_front.png\"\n },\n {\n label: \"后\",\n icon: d + \"cn_back.png\"\n }\n ];\n var g = [];\n for (const w of p)\n g.push(\n new M.MeshBasicMaterial({\n color: 16777215,\n map: new M.TextureLoader().load(w.icon)\n })\n );\n new M.MeshLambertMaterial({\n color: 255\n });\n var y = new M.Mesh(new M.BoxGeometry(110, 110, 110), g);\n n.sceneOrtho.add(y), m(122), s.addEventListener(\"mousedown\", (w) => {\n var x = {};\n x.x = w.offsetX / s.clientWidth * 2 - 1, x.y = -(w.offsetY / s.clientHeight) * 2 + 1;\n var _ = new M.Raycaster();\n _.setFromCamera(x, n.camera);\n const b = _.intersectObjects(a, !1);\n b.length > 0 && n.ToggleDirectionView(b[0].object.name);\n }), s.addEventListener(\"mousemove\", (w) => {\n var x = {};\n x.x = w.offsetX / s.clientWidth * 2 - 1, x.y = -(w.offsetY / s.clientHeight) * 2 + 1;\n var _ = new M.Raycaster();\n _.setFromCamera(x, n.camera);\n const b = _.intersectObjects(a, !1);\n for (var E of a)\n E.material.opacity = 0.01;\n b.length > 0 && (b[0].object.material.opacity = 0.2);\n });\n }\n function m(d) {\n for (var p = d * 0.5 - 20, g = [\n {\n name: \"right\",\n a: 30,\n b: 75,\n c: 75,\n point: new M.Vector3(p, 0, 0)\n },\n {\n name: \"back\",\n a: 75,\n b: 75,\n c: 30,\n point: new M.Vector3(0, 0, -p)\n },\n {\n name: \"left\",\n a: 30,\n b: 75,\n c: 75,\n point: new M.Vector3(-p, 0, 0)\n },\n {\n name: \"front\",\n a: 75,\n b: 75,\n c: 30,\n point: new M.Vector3(0, 0, p)\n },\n {\n name: \"top\",\n a: 75,\n b: 30,\n c: 75,\n point: new M.Vector3(0, p, 0)\n },\n {\n name: \"button\",\n a: 75,\n b: 30,\n c: 75,\n point: new M.Vector3(0, -p, 0)\n }\n ], y = [\n {\n name: \"top_right_back\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(-p, p, p)\n },\n {\n name: \"button_front_right\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(-p, -p, p)\n },\n {\n name: \"top_front_right\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(p, p, p)\n },\n {\n name: \"button_right_back\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(p, -p, p)\n },\n {\n name: \"top_back_left\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(-p, p, -p)\n },\n {\n name: \"button_back_left\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(-p, -p, -p)\n },\n {\n name: \"top_left_front\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(p, p, -p)\n },\n {\n name: \"button_left_front\",\n a: 30,\n b: 30,\n c: 30,\n point: new M.Vector3(p, -p, -p)\n }\n ], w = [\n {\n name: \"top_front\",\n a: 30,\n b: 30,\n c: 75,\n point: new M.Vector3(p, p, 0)\n },\n {\n name: \"top_right\",\n a: 75,\n b: 30,\n c: 30,\n point: new M.Vector3(0, p, p)\n },\n {\n name: \"top_back\",\n a: 30,\n b: 30,\n c: 75,\n point: new M.Vector3(-p, p, 0)\n },\n {\n name: \"top_left\",\n a: 75,\n b: 30,\n c: 30,\n point: new M.Vector3(0, p, -p)\n },\n {\n name: \"button_front\",\n a: 30,\n b: 30,\n c: 75,\n point: new M.Vector3(p, -p, 0)\n },\n {\n name: \"button_right\",\n a: 75,\n b: 30,\n c: 30,\n point: new M.Vector3(0, -p, p)\n },\n {\n name: \"button_back\",\n a: 30,\n b: 30,\n c: 75,\n point: new M.Vector3(-p, -p, 0)\n },\n {\n name: \"button_left\",\n a: 75,\n b: 30,\n c: 30,\n point: new M.Vector3(0, -p, -p)\n },\n {\n name: \"front_right\",\n a: 30,\n b: 75,\n c: 30,\n point: new M.Vector3(p, 0, p)\n },\n {\n name: \"right_back\",\n a: 30,\n b: 75,\n c: 30,\n point: new M.Vector3(-p, 0, p)\n },\n {\n name: \"back_left\",\n a: 30,\n b: 75,\n c: 30,\n point: new M.Vector3(-p, 0, -p)\n },\n {\n name: \"left_front\",\n a: 30,\n b: 75,\n c: 30,\n point: new M.Vector3(p, 0, -p)\n }\n ], x = 0; x < g.length; x++)\n a.push(f(g[x]));\n for (var x = 0; x < y.length; x++)\n a.push(f(y[x]));\n for (var x = 0; x < w.length; x++)\n a.push(f(w[x]));\n }\n function f(d) {\n const p = new M.BoxGeometry(d.a, d.b, d.c), g = new M.MeshBasicMaterial({\n color: \"blue\",\n transparent: !0,\n opacity: 0.01\n }), y = new M.Matrix4().makeTranslation(d.point.x, d.point.y, d.point.z);\n let w = p.applyMatrix4(y), x = new M.Mesh(w, g);\n return x.name = d.name, n.sceneOrtho.add(x), x;\n }\n return n.ToggleCameraType = function() {\n o.cameraModule.switchCurrentCamera();\n }, n.TakeScreenshot = function() {\n try {\n if (!o.renderer) {\n console.error(\"渲染器未初始化\");\n return;\n }\n o.renderer.render(e, e.camera);\n const p = o.renderer.domElement.toDataURL(\"image/png\"), g = document.createElement(\"a\"), y = (/* @__PURE__ */ new Date()).toISOString().replaceAll(/[:.]/g, \"-\");\n g.download = `screenshot_${y}.png`, g.href = p, g.click(), console.log(\"截图已保存\");\n } catch (d) {\n console.error(\"截图失败:\", d);\n }\n }, n.ToggleFullscreen = function() {\n const d = t || document.documentElement;\n !document.fullscreenElement && !document.webkitFullscreenElement && !document.mozFullScreenElement && !document.msFullscreenElement ? (d.requestFullscreen ? d.requestFullscreen() : d.webkitRequestFullscreen ? d.webkitRequestFullscreen() : d.mozRequestFullScreen ? d.mozRequestFullScreen() : d.msRequestFullscreen && d.msRequestFullscreen(), console.log(\"已进入全屏模式\")) : (document.exitFullscreen ? document.exitFullscreen() : document.webkitExitFullscreen ? document.webkitExitFullscreen() : document.mozCancelFullScreen ? document.mozCancelFullScreen() : document.msExitFullscreen && document.msExitFullscreen(), console.log(\"已退出全屏模式\"));\n }, n;\n}\nclass od {\n engine;\n cubeTool;\n constructor(e) {\n this.engine = e;\n }\n init() {\n this.cubeTool = rd(this.engine, this.engine.scene, this.engine.container), this.cubeTool.init();\n }\n // 相机回归正位\n CameraGoHome() {\n this.cubeTool.CameraGoHome();\n }\n // 缩放到指定模型\n zoomToModel(e) {\n this.cubeTool.zoomToBox(e);\n }\n // 隐藏小方块\n hide() {\n }\n}\nfunction ad(o) {\n let e = new Object();\n return e.getBoundingBox = function() {\n let t = o.models, n = new M.Vector3(1e8, 1e9, 1e10), i = new M.Vector3(-1e8, -1e9, -1e10);\n t.forEach((u) => {\n let m = u.boundingBox.min, f = u.boundingBox.max;\n m.x < n.x && (n.x = m.x), m.y < n.y && (n.y = m.y), m.z < n.z && (n.z = m.z), f.x > i.x && (i.x = f.x), f.y > i.y && (i.y = f.y), f.z > i.z && (i.z = f.z);\n });\n let s = Math.min(n.x, i.x), r = Math.min(n.y, i.y), a = Math.min(n.z, i.z), l = Math.max(n.x, i.x), h = Math.max(n.y, i.y), c = Math.max(n.z, i.z);\n return {\n min: new M.Vector3(s, r, a),\n max: new M.Vector3(l, h, c)\n };\n }, e.rayInterationModel = function(t) {\n let n = [];\n return o.engineStatus.models.forEach((r) => {\n r.info.lods.forEach((a) => {\n let l = a.octreeBox;\n s(t, l, r);\n });\n }), n = n.filter((r) => r instanceof M.Mesh), t.intersectObjects(n, !1);\n function s(r, a, l) {\n if (a == null)\n return;\n let h = new M.Vector3(a.min.X * 0.3048, a.min.Z * 0.3048, -a.min.Y * 0.3048), c = new M.Vector3(a.max.X * 0.3048, a.max.Z * 0.3048, -a.max.Y * 0.3048), u = new M.Vector3(Math.min(h.x, c.X), Math.min(h.y, c.y), Math.min(h.z, c.z)), m = new M.Vector3(Math.max(c.x, h.x), Math.max(c.y, h.y), Math.max(c.z, h.z)), f = new M.Box3(u, m), d = r.ray.intersectsBox(f);\n if (!(d == null || d == !1))\n if (a.children == null || a.children.length == 0) {\n if (a.elements != null)\n for (var p of a.elements) {\n let g = o.engineStatus.hideModels.find((_) => _.url == l.url)?.ids;\n if (g != null && g.includes(p))\n continue;\n let y = o.engineStatus.translucentModels.find((_) => _.url == l.url)?.ids;\n if (y != null && y.includes(p))\n continue;\n let x = o.models.find((_) => _.url == l.url).nodesMap.get(p);\n x != null && !x.instance && x.infos.map((b) => b.mesh).forEach((b) => {\n n.push(b);\n });\n }\n } else {\n if (a.elements != null)\n for (var p of a.elements) {\n let y = o.engineStatus.hideModels.find((b) => b.url == l.url)?.ids;\n if (y != null && y.includes(p))\n continue;\n let w = o.engineStatus.translucentModels.find((b) => b.url == l.url)?.ids;\n if (w != null && w.includes(p))\n continue;\n let _ = o.models.find((b) => b.url == l.url).nodesMap.get(p);\n _ != null && !_.instance && _.infos.map((E) => E.mesh).forEach((E) => {\n n.push(E);\n });\n }\n for (let g of a.children)\n s(r, g, l);\n }\n }\n }, e;\n}\nclass ld {\n engine;\n // 绘制状态\n isDrawing = !1;\n startPoint = new M.Vector2();\n endPoint = new M.Vector2();\n // UI绘制框元素\n selectionBox = null;\n // 坐标转换工具\n worldToScreen = null;\n // 事件处理函数绑定(用于后续移除监听器)\n boundMouseDown;\n boundMouseMove;\n boundMouseUp;\n boundKeyDown;\n constructor(e) {\n this.engine = e, this.boundMouseDown = this.onMouseDown.bind(this), this.boundMouseMove = this.onMouseMove.bind(this), this.boundMouseUp = this.onMouseUp.bind(this), this.boundKeyDown = this.onKeyDown.bind(this);\n }\n /**\n * 初始化工具\n * 创建绘制框UI元素,初始化坐标转换工具\n */\n init() {\n this.createSelectionBoxElement(), this.engine.scene && this.engine.camera && this.engine.renderer && (this.worldToScreen = new je(\n this.engine.camera,\n this.engine.renderer,\n this.engine.scene\n ));\n }\n /**\n * 激活工具\n * 禁用控制器,添加鼠标事件监听器和键盘事件监听器\n */\n active() {\n this.engine.controlModule.disActive();\n const e = this.engine.renderer?.domElement;\n e && (e.addEventListener(\"mousedown\", this.boundMouseDown), e.addEventListener(\"mousemove\", this.boundMouseMove), e.addEventListener(\"mouseup\", this.boundMouseUp), e.style.cursor = \"crosshair\"), window.addEventListener(\"keydown\", this.boundKeyDown);\n }\n /**\n * 停用工具\n * 启用控制器,移除鼠标事件监听器和键盘事件监听器\n */\n disActive() {\n this.engine.controlModule.active();\n const e = this.engine.renderer?.domElement;\n e && (e.removeEventListener(\"mousedown\", this.boundMouseDown), e.removeEventListener(\"mousemove\", this.boundMouseMove), e.removeEventListener(\"mouseup\", this.boundMouseUp), e.style.cursor = \"default\"), window.removeEventListener(\"keydown\", this.boundKeyDown), this.isDrawing && this.endDrawing();\n }\n /**\n * 创建绘制框UI元素\n * 用于在屏幕上显示用户绘制的区域\n */\n createSelectionBoxElement() {\n this.selectionBox = document.createElement(\"div\"), this.selectionBox.style.position = \"absolute\", this.selectionBox.style.border = \"2px dashed #00aaff\", this.selectionBox.style.backgroundColor = \"rgba(0, 170, 255, 0.1)\", this.selectionBox.style.pointerEvents = \"none\", this.selectionBox.style.display = \"none\", this.selectionBox.style.zIndex = \"1000\", this.selectionBox.style.boxSizing = \"border-box\";\n const e = this.engine.renderer?.domElement;\n e && e.parentElement && e.parentElement.appendChild(this.selectionBox);\n }\n /**\n * 鼠标按下事件处理\n * 开始绘制区域\n */\n onMouseDown(e) {\n e.button !== 0 || !this.engine.renderer?.domElement || (this.startPoint.set(e.offsetX, e.offsetY), this.endPoint.copy(this.startPoint), this.isDrawing = !0, this.selectionBox && (this.selectionBox.style.display = \"block\", this.updateSelectionBoxUI()), e.preventDefault(), e.stopPropagation());\n }\n /**\n * 鼠标移动事件处理\n * 更新绘制框的显示\n */\n onMouseMove(e) {\n !this.isDrawing || !this.engine.renderer?.domElement || (this.endPoint.set(e.offsetX, e.offsetY), this.updateSelectionBoxUI(), e.preventDefault(), e.stopPropagation());\n }\n /**\n * 鼠标释放事件处理\n * 结束绘制,执行缩放操作\n */\n onMouseUp(e) {\n this.isDrawing && (this.endDrawing(), this.performZoom(), e.preventDefault(), e.stopPropagation(), this.disActive());\n }\n /**\n * 键盘按下事件处理\n * 按下 ESC 键时退出功能\n */\n onKeyDown(e) {\n e.key === \"Escape\" && (this.disActive(), e.preventDefault(), e.stopPropagation());\n }\n /**\n * 结束绘制\n * 隐藏绘制框\n */\n endDrawing() {\n this.isDrawing && (this.isDrawing = !1, this.selectionBox && (this.selectionBox.style.display = \"none\"));\n }\n /**\n * 更新绘制框UI\n * 根据起点和终点更新绘制框的位置和大小\n */\n updateSelectionBoxUI() {\n if (!this.selectionBox || !this.engine.renderer?.domElement) return;\n const t = Math.min(this.startPoint.x, this.endPoint.x), n = Math.min(this.startPoint.y, this.endPoint.y), i = Math.abs(this.endPoint.x - this.startPoint.x), s = Math.abs(this.endPoint.y - this.startPoint.y);\n this.selectionBox.style.left = `${t}px`, this.selectionBox.style.top = `${n}px`, this.selectionBox.style.width = `${i}px`, this.selectionBox.style.height = `${s}px`;\n }\n /**\n * 执行缩放操作\n * 将屏幕区域转换为世界坐标,计算包围盒,调整相机视角\n */\n performZoom() {\n const e = Math.abs(this.endPoint.x - this.startPoint.x), t = Math.abs(this.endPoint.y - this.startPoint.y);\n if (e < 5 || t < 5)\n return;\n if (!this.worldToScreen) {\n console.warn(\"RangeScale: 坐标转换工具未初始化\");\n return;\n }\n const n = Math.min(this.startPoint.x, this.endPoint.x), i = Math.max(this.startPoint.x, this.endPoint.x), s = Math.min(this.startPoint.y, this.endPoint.y), r = Math.max(this.startPoint.y, this.endPoint.y), a = [], l = [\n { x: n, y: s },\n // 左上\n { x: i, y: s },\n // 右上\n { x: i, y: r },\n // 右下\n { x: n, y: r }\n // 左下\n ];\n for (const c of l) {\n const u = this.worldToScreen.screenToWorld(c.x, c.y);\n u && a.push(u);\n }\n if (a.length < 3) {\n console.warn(\"RangeScale: 框选区域未命中模型,无法执行缩放操作\");\n return;\n }\n if (a.length < 3) {\n console.warn(\"RangeScale: 无法将屏幕区域转换为世界坐标\");\n return;\n }\n const h = new M.Box3();\n for (const c of a)\n h.expandByPoint(c);\n if (h.isEmpty()) {\n console.warn(\"RangeScale: 计算得到的包围盒无效\");\n return;\n }\n this.fitCameraToBoundingBox(h);\n }\n /**\n * 调整相机视角以适应包围盒\n * @param boundingBox - 要适应的包围盒\n */\n fitCameraToBoundingBox(e) {\n const t = this.engine.camera, n = this.engine.controls;\n if (!t || !n) {\n console.warn(\"RangeScale: 相机或控制器未初始化\");\n return;\n }\n const i = new M.Vector3();\n e.getCenter(i);\n const s = new M.Vector3();\n e.getSize(s);\n const r = Math.max(s.x, s.y, s.z);\n if (t instanceof M.PerspectiveCamera) {\n const a = t.fov * (Math.PI / 180), h = r / (2 * Math.tan(a / 2)) * 1.2, c = new M.Vector3();\n t.getWorldDirection(c);\n const u = i.clone().sub(t.position);\n c.dot(u.normalize()) < 0 && c.negate();\n const f = i.clone().sub(c.multiplyScalar(h));\n t.position.copy(f), n.target && n.target.copy(i), t.lookAt(i), n.update();\n } else if (t instanceof M.OrthographicCamera) {\n const l = r * 1.2, h = this.engine.renderer?.domElement, c = h ? h.width / h.height : 1;\n t.left = -l * c / 2, t.right = l * c / 2, t.top = l / 2, t.bottom = -l / 2, t.updateProjectionMatrix();\n const u = new M.Vector3();\n t.getWorldDirection(u);\n const m = r * 1.5, f = i.clone().sub(u.multiplyScalar(m));\n t.position.copy(f), n.target && n.target.copy(i), t.lookAt(i), n.update();\n }\n }\n}\nclass cd {\n engine;\n ground = null;\n // 地面对象\n constructor(e) {\n this.engine = e;\n }\n init() {\n }\n /**\n * 隐藏或显示性能监视器\n * @param visible - true显示,false隐藏\n */\n setStatsVisible(e) {\n this.engine.stats?.dom && (this.engine.stats.dom.style.display = e ? \"block\" : \"none\");\n }\n /**\n * 设置环境光照强度\n * @param intensity - 光照强度,默认范围 0-5\n */\n setAmbientLightIntensity(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof M.AmbientLight\n );\n t && (t.intensity = e);\n }\n /**\n * 设置环境光照颜色\n * @param color - 颜色,可以是十六进制数字 (0xffffff) 或字符串 ('#ffffff')\n */\n setAmbientLightColor(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof M.AmbientLight\n );\n t && t.color.set(e);\n }\n /**\n * 设置定向光源强度\n * @param intensity - 光照强度,默认范围 0-5\n */\n setDirectionalLightIntensity(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof M.DirectionalLight\n );\n t && (t.intensity = e);\n }\n /**\n * 设置定向光源颜色\n * @param color - 颜色,可以是十六进制数字 (0xffffff) 或字符串 ('#ffffff')\n */\n setDirectionalLightColor(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof M.DirectionalLight\n );\n t && t.color.set(e);\n }\n /**\n * 设置阴影精细度(阴影贴图分辨率)\n * @param quality - 质量等级:'low' (1024), 'medium' (2048), 'high' (4096), 'ultra' (8192)\n */\n setShadowQuality(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof M.DirectionalLight\n );\n if (t?.shadow) {\n const i = {\n low: 1024,\n medium: 2048,\n high: 4096,\n ultra: 8192\n }[e];\n t.shadow.mapSize.width = i, t.shadow.mapSize.height = i, t.shadow.map?.dispose(), t.shadow.map = null;\n }\n }\n /**\n * 设置是否开启定向光阴影\n * @param enabled - true开启,false关闭\n */\n setDirectionalLightShadow(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof M.DirectionalLight\n );\n t && (t.castShadow = e), this.engine.renderer && (this.engine.renderer.shadowMap.enabled = e);\n }\n /**\n * 设置是否开启GTAO阴影(环境光遮蔽)\n * @param enabled - true开启,false关闭\n */\n setGTAOEnabled(e) {\n if (!this.engine.composerModule?.composer) {\n console.warn(\"Composer not initialized\");\n return;\n }\n const t = this.engine.composerModule.composer, n = t.passes.find((i) => i instanceof Fe);\n if (e)\n if (n)\n n.enabled = !0;\n else {\n const { width: i, height: s } = this.engine.deviceModule.getContainerSize(), r = new Fe(\n this.engine.scene,\n this.engine.camera,\n i,\n s\n );\n r.output = Fe.OUTPUT.Default, r.blendIntensity = 0.5, r.updateGtaoMaterial && r.updateGtaoMaterial({\n radius: 1,\n distanceExponent: 1,\n thickness: 1,\n scale: 1,\n distanceFallOff: 1,\n screenSpaceRadius: !0\n });\n const a = t.passes.findIndex(\n (l) => l.constructor.name === \"RenderPass\"\n );\n t.passes.splice(a + 1, 0, r);\n }\n else n && (n.enabled = !1);\n }\n /**\n * 设置场景饱和度\n * @param saturation - 饱和度值,1.0为正常,>1增强,<1降低,推荐范围 0.5-2.0\n */\n setSceneSaturation(e) {\n if (!this.engine.composerModule?.saturationPass) {\n console.warn(\"Saturation pass not initialized\");\n return;\n }\n this.engine.composerModule.saturationPass.uniforms.saturation.value = e;\n }\n /**\n * 设置场景对比度\n * @param contrast - 对比度值,1.0为正常,>1增强,<1降低,推荐范围 0.5-2.0\n */\n setSceneContrast(e) {\n if (!this.engine.composerModule?.saturationPass) {\n console.warn(\"Saturation pass not initialized\");\n return;\n }\n this.engine.composerModule.saturationPass.uniforms.contrast.value = e;\n }\n /**\n * 设置是否开启地面\n * @param enabled - true开启,false关闭\n * @param options - 地面配置选项\n */\n setGroundEnabled(e, t) {\n if (e)\n if (this.ground)\n this.ground.visible = !0;\n else {\n const n = t?.size ?? 100, i = t?.color ?? 8421504, s = t?.opacity ?? 0.3, r = new M.PlaneGeometry(n, n), a = new M.MeshStandardMaterial({\n color: i,\n transparent: !0,\n opacity: s,\n side: M.DoubleSide\n });\n this.ground = new M.Mesh(r, a), this.ground.rotation.x = -Math.PI / 2, this.ground.position.y = 0, this.ground.receiveShadow = !0, this.ground.name = \"ground\", this.engine.scene.add(this.ground);\n }\n else this.ground && (this.ground.visible = !1);\n }\n /**\n * 设置HDR背景\n * @param hdrTexture - HDR环境贴图(THREE.Texture),传入null则移除背景\n */\n setHDRBackground(e) {\n e ? (this.engine.scene.background = e, this.engine.scene.environment = e) : (this.engine.scene.background = null, this.engine.scene.environment = null);\n }\n}\nfunction bt() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(o) {\n var e = Math.random() * 16 | 0, t = o == \"x\" ? e : e & 3 | 8;\n return t.toString(16);\n });\n}\nclass St {\n engine;\n handelBehaved;\n setting;\n constructor(e) {\n this.engine = e, this.handelBehaved = hr(e), this.handelBehaved.init(this, null), this.setting = {\n // 单位\n unit: \"m\",\n // 保留几位小数,ui上还是显示0.001这样\n precision: 3\n };\n }\n // 获取设置\n getSetting() {\n return this.setting;\n }\n // 保存设置\n saveSetting(e) {\n this.setting = e;\n }\n active() {\n this.handelBehaved.active();\n }\n disActive() {\n this.handelBehaved.disActive();\n }\n // 获取展示的文字\n getMeasureText(e, t) {\n if (e == null)\n return null;\n let n = this.setting.unit, i = n;\n return t == 1 ? n == \"mm\" ? e = e * 1e3 : n == \"cm\" ? e = e * 100 : n == \"dm\" ? e = e * 10 : n == \"m\" ? e = e * 1 : n == \"km\" && (e = e * 1e-3) : t == 2 && (n == \"mm\" ? e = e * 1e3 * 1e3 : n == \"cm\" ? e = e * 100 * 100 : n == \"dm\" ? e = e * 10 * 10 : n == \"m\" ? e = e * 1 * 1 : n == \"km\" && (e = e * 1e-3 * 1e-3), i = i + \"²\"), e.toFixed(this.setting.precision) + \" \" + i;\n }\n // 取消当前选中的标注\n cancelCurrentSelectedAnnotation() {\n let e = this.engine.measure.annotationData;\n for (let t in e)\n e[t].forEach((n) => {\n n.highlight == !0 && (n.highlight = !1, n.container.classList.remove(\"Hight\"), n.container.getElementsByTagName(\"svg\")[0].classList.remove(\"Hight\"));\n });\n }\n // 监听按下esc\n handelKeyEscDown() {\n this.cancelCurrentSelectedAnnotation();\n let e = this.engine.measure.annotationData;\n for (let t in e)\n for (let n = e[t].length - 1; n >= 0; n--) {\n let i = e[t][n];\n i.isSelect == !0 && (i.container.remove(), e[t].splice(n, 1));\n }\n this.engine.measure.clearAllPoints();\n }\n // 监听按下delete\n handelKeyDeleteDown() {\n let e = this.engine.measure.annotationData;\n for (let t in e)\n for (let n = e[t].length - 1; n >= 0; n--) {\n let i = e[t][n];\n i.highlight == !0 && (i.container.remove(), e[t].splice(n, 1));\n }\n }\n clearHighlight() {\n let e = this.engine.measure.annotationData;\n for (let t in e)\n e[t].forEach((n) => {\n n.highlight = !1, n.container.classList.remove(\"Hight\"), n.container.getElementsByTagName(\"svg\")[0].classList.remove(\"Hight\");\n });\n }\n // 绘制普通标注\n drawNormalAnnotation() {\n let e = this;\n this.engine.measure.annotationData.normalAnnotation.forEach((d) => {\n f(d);\n }), this.engine.measure.annotationData.elevationAnnotation.forEach((d) => {\n m(d);\n }), this.engine.measure.annotationData.coordinateAnnotation.forEach((d) => {\n u(d);\n }), this.engine.measure.annotationData.angleAnnotation.forEach((d) => {\n l(d);\n }), this.engine.measure.annotationData.areaAnnotation.forEach((d) => {\n h(d);\n }), this.engine.measure.annotationData.slopeAnnotation.forEach((d) => {\n c(d);\n });\n function l(d) {\n if (d.container == null) {\n let A = [\n '',\n '',\n // 起点\n '',\n // 顶点\n '',\n // 终点\n '',\n // 起点到顶点的线\n '',\n // 顶点到终点的线\n '',\n '' + d.text + \"\",\n \"\"\n ].join(\"\");\n d.container = document.createElement(\"div\"), d.container.className = \"angle-annotation\", d.container.id = d.id, d.container.style.pointerEvents = \"none\", d.container.innerHTML = A, e.engine.measure.annotationContainer.appendChild(d.container), d.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), d.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), d.highlight = !0, e.engine.events.trigger(Se.MeasureClick, d);\n });\n }\n let p = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point1), g = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point2), y = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point3), w = e.engine.reactBoundingClientRect.left, x = e.engine.reactBoundingClientRect.top;\n p.x += w, p.y += x, g.x += w, g.y += x, y.x += w, y.y += x;\n let _ = d.container;\n _.getElementsByTagName(\"circle\")[0].setAttribute(\"cx\", p.x), _.getElementsByTagName(\"circle\")[0].setAttribute(\"cy\", p.y), _.getElementsByTagName(\"circle\")[1].setAttribute(\"cx\", g.x), _.getElementsByTagName(\"circle\")[1].setAttribute(\"cy\", g.y), _.getElementsByTagName(\"circle\")[2].setAttribute(\"cx\", y.x), _.getElementsByTagName(\"circle\")[2].setAttribute(\"cy\", y.y), _.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", p.x + \",\" + p.y + \" \" + g.x + \",\" + g.y), _.getElementsByTagName(\"polyline\")[1].setAttribute(\"points\", g.x + \",\" + g.y + \" \" + y.x + \",\" + y.y);\n let b = g.x, E = g.y - 30;\n _.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", b - 40), _.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", E - 12.5), _.getElementsByTagName(\"text\")[0].setAttribute(\"x\", b), _.getElementsByTagName(\"text\")[0].setAttribute(\"y\", E + 4), _.getElementsByTagName(\"text\")[0].innerHTML = d.text, _.style.top = \"0px\", _.style.left = \"0px\";\n }\n function h(d) {\n if (d.container == null) {\n let P = [\n '',\n '',\n // 填充区域\n '',\n // 边界线\n '',\n '' + e.getMeasureText(d.text, 2) + \"\",\n \"\"\n ].join(\"\");\n d.container = document.createElement(\"div\"), d.container.className = \"area-annotation\", d.container.id = d.id, d.container.innerHTML = P, e.engine.measure.annotationContainer.appendChild(d.container), d.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), d.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), d.highlight = !0, e.engine.events.trigger(Se.MeasureClick, d);\n });\n }\n if (!d.points || d.points.length < 3)\n return;\n let p = e.engine.reactBoundingClientRect.left, g = e.engine.reactBoundingClientRect.top, y = [], w = 0, x = 0;\n for (let P = 0; P < d.points.length; P++) {\n let C = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.points[P]);\n C.x += p, C.y += g, y.push(C), w += C.x, x += C.y;\n }\n w = w / y.length, x = x / y.length;\n let _ = y.map((P) => P.x + \",\" + P.y).join(\" \"), b = d.container;\n b.getElementsByTagName(\"polygon\")[0].setAttribute(\"points\", _), b.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", _);\n let E = w, A = x;\n b.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", E - 40), b.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", A - 12.5), b.getElementsByTagName(\"text\")[0].setAttribute(\"x\", E), b.getElementsByTagName(\"text\")[0].setAttribute(\"y\", A + 4), b.getElementsByTagName(\"text\")[0].innerHTML = e.getMeasureText(d.text, 2), b.style.top = \"0px\", b.style.left = \"0px\";\n }\n function c(d) {\n if (d.container == null) {\n let E = [\n '',\n \"\",\n '',\n '',\n // 箭头形状\n \"\",\n \"\",\n '',\n // 起点到终点的线,带箭头\n '',\n '' + d.text + \"\",\n \"\"\n ].join(\"\");\n d.container = document.createElement(\"div\"), d.container.className = \"slope-annotation\", d.container.id = d.id, d.container.innerHTML = E, e.engine.measure.annotationContainer.appendChild(d.container), d.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), d.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), d.highlight = !0, e.engine.events.trigger(Se.MeasureClick, d);\n });\n }\n let p = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point1), g = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point2), y = e.engine.reactBoundingClientRect.left, w = e.engine.reactBoundingClientRect.top;\n p.x += y, p.y += w, g.x += y, g.y += w;\n let x = d.container;\n x.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", p.x + \",\" + p.y + \" \" + g.x + \",\" + g.y);\n let _ = (p.x + g.x) / 2, b = (p.y + g.y) / 2 - 30;\n x.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", _ - 50), x.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", b - 12.5), x.getElementsByTagName(\"text\")[0].setAttribute(\"x\", _), x.getElementsByTagName(\"text\")[0].setAttribute(\"y\", b + 4), x.getElementsByTagName(\"text\")[0].innerHTML = d.text, x.style.top = \"0px\", x.style.left = \"0px\";\n }\n function u(d) {\n if (d.container == null) {\n let A = [\n '',\n '',\n '',\n 'X: ' + e.getMeasureText(d.textX, 1) + \"\",\n '',\n 'Y: ' + e.getMeasureText(-d.textZ, 1) + \"\",\n '',\n 'Z: ' + e.getMeasureText(d.textY, 1) + \"\",\n \"\"\n ].join(\"\");\n d.container = document.createElement(\"div\"), d.container.className = \"coordinate-annotation\", d.container.id = d.id, d.container.style.position = \"absolute\", d.container.style.pointerEvents = \"none\", d.container.innerHTML = A, e.engine.measure.annotationContainer.appendChild(d.container), d.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), d.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), d.highlight = !0, e.engine.events.trigger(Se.MeasureClick, d);\n });\n }\n let p = d.container, g = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point), y = e.engine.reactBoundingClientRect.left, w = e.engine.reactBoundingClientRect.top;\n g.x += y, g.y += w, p.style.top = \"0px\", p.style.left = \"0px\";\n let x = p.getElementsByTagName(\"circle\")[0];\n x && (x.setAttribute(\"cx\", g.x), x.setAttribute(\"cy\", g.y));\n let _ = p.getElementsByTagName(\"rect\"), b = p.getElementsByTagName(\"text\"), E = -55;\n _[0] && (_[0].setAttribute(\"x\", g.x + 10), _[0].setAttribute(\"y\", g.y + 10 + E)), b[0] && (b[0].setAttribute(\"x\", g.x + 10 + 40), b[0].setAttribute(\"y\", g.y + 10 + 16 + E)), _[1] && (_[1].setAttribute(\"x\", g.x + 10), _[1].setAttribute(\"y\", g.y + 10 + 30 + E)), b[1] && (b[1].setAttribute(\"x\", g.x + 10 + 40), b[1].setAttribute(\"y\", g.y + 10 + 46 + E)), _[2] && (_[2].setAttribute(\"x\", g.x + 10), _[2].setAttribute(\"y\", g.y + 10 + 60 + E)), b[2] && (b[2].setAttribute(\"x\", g.x + 10 + 40), b[2].setAttribute(\"y\", g.y + 10 + 76 + E)), b[0] && (b[0].innerHTML = \"X: \" + e.getMeasureText(d.textX, 1)), b[1] && (b[1].innerHTML = \"Y: \" + e.getMeasureText(-d.textZ, 1)), b[2] && (b[2].innerHTML = \"Z: \" + e.getMeasureText(d.textY, 1));\n }\n function m(d) {\n if (d.container == null) {\n let x = [\n '',\n '',\n '' + e.getMeasureText(d.text, 1) + \"\",\n '',\n \"\"\n ].join(\"\");\n d.container = document.createElement(\"div\"), d.container.className = \"elevation-annotation\", d.container.id = d.id, d.container.style.position = \"absolute\", d.container.style.pointerEvents = \"none\", d.container.innerHTML = x, e.engine.measure.annotationContainer.appendChild(d.container), d.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), d.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), d.highlight = !0, e.engine.events.trigger(Se.MeasureClick, d);\n });\n }\n let p = d.container, g = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point), y = e.engine.reactBoundingClientRect.left, w = e.engine.reactBoundingClientRect.top;\n p.style.top = g.y + w - 48 + \"px\", p.style.left = g.x + y - 16 + \"px\", p.getElementsByTagName(\"text\")[0].innerHTML = e.getMeasureText(d.text, 1);\n }\n function f(d) {\n if (d.container == null) {\n let _ = [\n '',\n '',\n '',\n '',\n '',\n '' + e.getMeasureText(d.text, 1) + \"\",\n \"\"\n ].join(\"\");\n d.container = document.createElement(\"div\"), d.container.className = \"normal-annotation\", d.container.id = d.id, d.container.innerHTML = _, e.engine.measure.annotationContainer.appendChild(d.container), d.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), d.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), d.highlight = !0, e.engine.events.trigger(Se.MeasureClick, d);\n });\n }\n let p = d.container;\n if (d.point1 == null || d.point2 == null) {\n p.style.display = \"none\";\n return;\n } else\n p.style.display = \"block\";\n let g = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point1), y = new je(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(d.point2), w = e.engine.reactBoundingClientRect.left, x = e.engine.reactBoundingClientRect.top;\n g.x += w, g.y += x, y.x += w, y.y += x, p.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", g.x + \",\" + g.y + \" \" + y.x + \",\" + y.y), p.getElementsByTagName(\"circle\")[0].setAttribute(\"cx\", g.x), p.getElementsByTagName(\"circle\")[0].setAttribute(\"cy\", g.y), p.getElementsByTagName(\"circle\")[1].setAttribute(\"cx\", y.x), p.getElementsByTagName(\"circle\")[1].setAttribute(\"cy\", y.y), p.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", g.x * 0.5 + y.x * 0.5 - 40), p.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", g.y * 0.5 + y.y * 0.5 - 12.5), p.getElementsByTagName(\"text\")[0].setAttribute(\"x\", g.x * 0.5 + y.x * 0.5 + 40 - 40), p.getElementsByTagName(\"text\")[0].setAttribute(\"y\", g.y * 0.5 + y.y * 0.5 + 16 - 12.5), p.getElementsByTagName(\"text\")[0].innerHTML = e.getMeasureText(d.text, 1), p.style.top = \"0px\", p.style.left = \"0px\";\n }\n }\n}\nclass hd {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n catchDir = 0;\n type = \"point\";\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n // 启动净高测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.isActive = !0, this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n // 停止净高测量\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 设置净高方向\n setDirection(e) {\n this.catchDir = e;\n }\n // 设置净高类型\n setSelectType(e) {\n this.type = e;\n }\n getMeshesMinMaxY(e) {\n if (!Array.isArray(e) || e.length === 0)\n return null;\n let t = Number.POSITIVE_INFINITY, n = Number.NEGATIVE_INFINITY;\n for (let i = 0; i < e.length; i++) {\n const s = e[i];\n if (!s)\n continue;\n typeof s.updateMatrixWorld == \"function\" && s.updateMatrixWorld(!0);\n const r = new M.Box3().setFromObject(s);\n !Number.isFinite(r.min.y) || !Number.isFinite(r.max.y) || (r.min.y < t && (t = r.min.y), r.max.y > n && (n = r.max.y));\n }\n return !Number.isFinite(t) || !Number.isFinite(n) ? null : { minY: t, maxY: n };\n }\n // 鼠标点击\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch.point;\n if (this.type == \"element\") {\n let s = this.engine.interactionModule.getCatchMeshs(e);\n var n = this.getMeshesMinMaxY(s);\n this.catchDir == 0 ? t.set(t.x, n?.minY, t.z) : t.set(t.x, n?.maxY, t.z);\n } else\n t = e.catch.point;\n if (this.points.length == 0) {\n this.points.push(t);\n return;\n }\n let i = this.engine.measure.annotationData.normalAnnotation.find((s) => s.isSelect == !0);\n i != null && (i.isSelect = !1);\n }\n // 鼠标移动\n handleMouseMove(e) {\n if (e.catch == null || this.points.length == 0)\n return;\n let t = this.engine.measure.annotationData.normalAnnotation.find((i) => i.isSelect == !0);\n t == null && (t = {\n text: null,\n id: bt(),\n isSelect: !0,\n type: \"clear-height\"\n }, this.engine.measure.annotationData.normalAnnotation.push(t));\n let n = e.catch;\n if (this.type == \"element\") {\n let i = e.catch.point.clone();\n i.set(i.x, this.points[0].y, i.z);\n let s = new M.Raycaster(i.add(new M.Vector3(0, 0.01, 0)), new M.Vector3(0, this.catchDir == 0 ? -1 : 1, 0));\n n.point = this.points[0];\n const r = this.engine.octreeBox.rayInterationModel(s);\n if (r.length === 0) {\n t.point2 = null;\n return;\n }\n t.point1 = i, t.point2 = r[0].point, t.text = t.point1.clone().distanceTo(t.point2.clone()), this.engine.events.trigger(Se.MeasureChanged, t);\n } else {\n let i = new M.Raycaster(e.catch.point.clone().add(new M.Vector3(0, 0.01, 0)), new M.Vector3(0, this.catchDir == 0 ? -1 : 1, 0));\n const s = this.engine.octreeBox.rayInterationModel(i);\n if (s.length === 0) {\n t.point2 = null;\n return;\n }\n t.point1 = n.point, t.point2 = s[0].point, t.text = t.point1.clone().distanceTo(t.point2.clone()), this.engine.events.trigger(Se.MeasureChanged, t);\n }\n }\n}\nclass ud {\n engine;\n tools;\n isActive = !1;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n // 启动距离测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.isActive = !0, this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this, { showCatch: !0 }), this.behavior.active();\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n // 停止距离测量\n disActive() {\n this.points = [], this.isActive = !1, this.engine.handelBehaved.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 鼠标点击\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.length == 0)\n this.points.push(t.point);\n else if (this.points.length == 1) {\n let n = this.engine.measure.annotationData.normalAnnotation.find((i) => i.isSelect == !0);\n if (n == null)\n return;\n n.point2 = t.point, n.isSelect = !1, this.points = [], this.engine.events.trigger(Se.MeasureChanged, n);\n }\n }\n // 鼠标移动\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (t != null && this.points.length == 1) {\n let n = this.engine.measure.annotationData.normalAnnotation.find((i) => i.isSelect == !0);\n n == null && (n = {\n id: bt(),\n point1: this.points[0].clone(),\n point2: t.point.clone(),\n text: this.points[0].clone().distanceTo(t.point.clone()),\n type: \"distance\",\n isSelect: !0\n }, this.engine.measure.annotationData.normalAnnotation.push(n)), n.point2 = t.point, n.text = n.point1.clone().distanceTo(n.point2.clone());\n }\n }\n // 按下esc\n}\nclass dd {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n // 启动净高测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.isActive = !0, this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n // 停止净距测量\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 鼠标点击\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n if (this.points.length == 0) {\n this.points.push(e.catch.point);\n return;\n }\n let t = this.engine.measure.annotationData.normalAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1);\n }\n // 鼠标移动\n handleMouseMove(e) {\n if (e.catch == null || this.points.length == 0)\n return;\n let t = this.engine.measure.annotationData.normalAnnotation.find((r) => r.isSelect == !0);\n t == null && (t = {\n text: null,\n id: bt(),\n isSelect: !0,\n type: \"clear-distance\"\n }, this.engine.measure.annotationData.normalAnnotation.push(t));\n let n = new M.Raycaster(e.catch.point.clone().add(e.catch.face.normal.clone().setLength(0.01)), e.catch.face.normal);\n const i = this.engine.octreeBox.rayInterationModel(n);\n if (i.length == 0) {\n t.point2 = null;\n return;\n }\n let s = e.catch;\n t.point1 = s.point, t.point2 = i[0].point, t.text = t.point1.clone().distanceTo(t.point2.clone()), this.engine.events.trigger(Se.MeasureChanged, t);\n }\n}\nclass fd {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active(), this.isActive = !0;\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.elevationAnnotation.find((n) => n.isSelect == !0);\n t == null && (t = {\n id: bt(),\n point: e.catch.point.clone(),\n text: e.catch.point.y,\n isSelect: !0,\n type: \"elevation\"\n }, this.engine.measure.annotationData.elevationAnnotation.push(t)), t.point = e.catch.point.clone(), t.text = e.catch.point.y;\n }\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.elevationAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1, t.point = e.catch.point.clone(), t.text = e.catch.point.y, this.engine.events.trigger(Se.MeasureChanged, t));\n }\n}\nclass pd {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active(), this.isActive = !0;\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.coordinateAnnotation.find((n) => n.isSelect == !0);\n t == null && (t = {\n id: bt(),\n point: e.catch.point.clone(),\n text: Math.round(e.catch.point.y) + \" m\",\n isSelect: !0,\n type: \"point\"\n }, this.engine.measure.annotationData.coordinateAnnotation.push(t)), t.point = e.catch.point.clone(), t.textX = e.catch.point.x, t.textY = e.catch.point.y, t.textZ = e.catch.point.z;\n }\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.coordinateAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1, t.point = e.catch.point.clone(), t.textX = e.catch.point.x, t.textY = e.catch.point.y, t.textZ = e.catch.point.z, this.engine.events.trigger(Se.MeasureChanged, t));\n }\n}\nclass md {\n engine;\n tools;\n // 存储三个点:起点、顶点(中间点)、终点\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n // 启动角度测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n // 停止角度测量\n disActive() {\n this.points = [], this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 计算三点形成的角度(以第二个点为顶点)\n // point1: 起点, point2: 顶点, point3: 终点\n calculateAngle(e, t, n) {\n const i = new M.Vector3().subVectors(e, t), s = new M.Vector3().subVectors(n, t), r = i.length(), a = s.length();\n if (r === 0 || a === 0)\n return 0;\n const h = i.dot(s) / (r * a), c = Math.max(-1, Math.min(1, h));\n return Math.acos(c) * (180 / Math.PI);\n }\n // 处理鼠标点击事件\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.length == 0)\n this.points.push(t.point);\n else if (this.points.length == 1)\n this.points.push(t.point);\n else if (this.points.length == 2) {\n let n = this.engine.measure.annotationData.angleAnnotation.find((i) => i.isSelect == !0);\n if (n == null)\n return;\n n.point3 = t.point.clone(), n.angle = this.calculateAngle(n.point1, n.point2, n.point3), n.text = n.angle.toFixed(2) + \"°\", n.isSelect = !1, n.type = \"angle\", this.points = [], this.engine.events.trigger(Se.MeasureChanged, n);\n }\n }\n // 处理鼠标移动事件\n handleMouseMove(e) {\n if (e.catch != null && this.points.length != 1 && this.points.length == 2) {\n let t = this.engine.measure.annotationData.angleAnnotation.find((n) => n.isSelect == !0);\n t == null && (t = {\n id: bt(),\n point1: this.points[0].clone(),\n // 起点\n point2: this.points[1].clone(),\n // 顶点(中间点)\n point3: e.catch.point.clone(),\n // 终点(实时更新)\n angle: 0,\n text: \"0.00°\",\n isSelect: !0,\n type: \"angle\"\n }, this.engine.measure.annotationData.angleAnnotation.push(t)), t.point3 = e.catch.point.clone(), t.angle = this.calculateAngle(t.point1, t.point2, t.point3), t.text = t.angle.toFixed(2) + \"°\", console.log(\"角度\", t.text);\n }\n }\n}\nclass gd {\n engine;\n tools;\n // 存储多个点,用于围成区域\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n // 启动面积测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n // 停止面积测量\n disActive() {\n this.points = [], this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 计算多边形面积(使用鞋带公式/Shoelace formula)\n // 注意:这个方法假设点在同一个平面上,使用XZ平面投影计算面积\n calculateArea(e) {\n if (e.length < 3)\n return 0;\n let t = 0;\n const n = e.length;\n for (let i = 0; i < n; i++) {\n const s = (i + 1) % n;\n t += e[i].x * e[s].z, t -= e[s].x * e[i].z;\n }\n return t = Math.abs(t) / 2, t;\n }\n // 处理鼠标点击事件\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.push(t.point.clone()), this.points.length >= 3) {\n let n = this.engine.measure.annotationData.areaAnnotation.find((i) => i.isSelect == !0);\n n == null ? (n = {\n id: bt(),\n points: this.points.map((i) => i.clone()),\n // 复制所有点\n area: 0,\n text: 0,\n isSelect: !0,\n type: \"area\"\n }, this.engine.measure.annotationData.areaAnnotation.push(n)) : (this.points.push(t.point.clone()), n.points = this.points.map((i) => i.clone())), n.area = this.calculateArea(n.points), n.text = n.area, console.log(\"面积\", n.text);\n }\n }\n // 处理鼠标移动事件\n handleMouseMove(e) {\n if (e.catch != null && this.points.length >= 2) {\n let t = this.engine.measure.annotationData.areaAnnotation.find((n) => n.isSelect == !0);\n if (t == null) {\n if (this.points.length >= 2) {\n let n = this.points.map((i) => i.clone());\n n.push(e.catch.point.clone()), n.length >= 3 && (t = {\n id: bt(),\n points: n,\n area: 0,\n text: 0,\n isSelect: !0,\n type: \"area\"\n }, this.engine.measure.annotationData.areaAnnotation.push(t));\n }\n } else if (t.points.length > 0) {\n const n = t.points.length - 1;\n t.points[n] = e.catch.point.clone();\n } else\n t.points = this.points.map((n) => n.clone()), t.points.push(e.catch.point.clone());\n t && t.points.length >= 3 && (t.area = this.calculateArea(t.points), t.text = t.area);\n }\n }\n handelKeyEnterDown() {\n this.finishMeasure();\n }\n // 完成面积测量(可以用于双击或右键完成)\n finishMeasure() {\n this.points = this.points.slice(0, this.points.length - 1);\n let e = this.engine.measure.annotationData.areaAnnotation.find((t) => t.isSelect == !0);\n e != null && e.points.length >= 3 && (e.points.length > this.points.length && (e.points = this.points.map((t) => t.clone())), e.area = this.calculateArea(e.points), e.text = e.area, e.isSelect = !1, this.points = [], this.engine.events.trigger(Se.MeasureChanged, e));\n }\n}\nclass yd {\n engine;\n tools;\n // 存储两个点:起点和终点\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new St(e);\n }\n // 启动坡度测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n let e = this.engine.measure.annotationData.normalAnnotation.find((t) => t.isSelect == !0);\n e != null && (e.isSelect = !1);\n }\n // 停止坡度测量\n disActive() {\n this.points = [], this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 计算两点之间的坡度\n // point1: 起点, point2: 终点\n // 返回:{ percentage: 坡度百分比, angle: 坡度角度(度), heightDiff: 高度差, horizontalDist: 水平距离 }\n calculateSlope(e, t) {\n const n = t.y - e.y, i = t.x - e.x, s = t.z - e.z, r = Math.sqrt(i * i + s * s);\n if (r === 0)\n return {\n percentage: 0,\n angle: 0,\n heightDiff: n,\n horizontalDist: 0,\n type: \"slope\"\n };\n const a = n / r * 100, h = Math.atan(n / r) * (180 / Math.PI);\n return {\n percentage: a,\n angle: h,\n heightDiff: n,\n horizontalDist: r,\n type: \"slope\"\n };\n }\n // 处理鼠标点击事件\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.length == 0)\n this.points.push(t.point);\n else if (this.points.length == 1) {\n let n = this.engine.measure.annotationData.slopeAnnotation.find((s) => s.isSelect == !0);\n if (n == null)\n return;\n console.log(\"进来了\"), n.point2 = t.point.clone();\n const i = this.calculateSlope(n.point1, n.point2);\n n.slopePercentage = i.percentage, n.slopeAngle = i.angle, n.heightDiff = i.heightDiff, n.horizontalDist = i.horizontalDist, n.text = i.percentage.toFixed(2) + \"% (\" + i.angle.toFixed(2) + \"°)\", n.isSelect = !1, this.points = [], this.engine.events.trigger(Se.MeasureChanged, n);\n }\n }\n // 处理鼠标移动事件\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (t != null && this.points.length == 1) {\n let n = this.engine.measure.annotationData.slopeAnnotation.find((s) => s.isSelect == !0);\n n == null && (n = {\n id: bt(),\n point1: this.points[0].clone(),\n // 起点\n point2: t.point.clone(),\n // 终点(实时更新)\n slopePercentage: 0,\n slopeAngle: 0,\n heightDiff: 0,\n horizontalDist: 0,\n text: \"0.00% (0.00°)\",\n isSelect: !0,\n type: \"slope\"\n }, this.engine.measure.annotationData.slopeAnnotation.push(n)), n.point2 = t.point.clone();\n const i = this.calculateSlope(n.point1, n.point2);\n n.slopePercentage = i.percentage, n.slopeAngle = i.angle, n.heightDiff = i.heightDiff, n.horizontalDist = i.horizontalDist, n.text = i.percentage.toFixed(2) + \"% (\" + i.angle.toFixed(2) + \"°)\";\n }\n }\n}\nclass wd {\n isActive = !1;\n engine;\n clearHeightMeasure;\n distanceMeasure;\n clearDistanceMeasure;\n elevationMeasure;\n pointMeasure;\n angleMeasure;\n areaMeasure;\n slopeMeasure;\n tools;\n annotationContainer;\n // 存储标注信息\n annotationData = {\n normalAnnotation: [],\n textAnnotation: [],\n coordinateAnnotation: [],\n angleAnnotation: [],\n distanceAnnotation: [],\n areaAnnotation: [],\n slopeAnnotation: [],\n elevationAnnotation: [],\n volumeAnnotation: []\n };\n constructor(e) {\n this.engine = e, this.clearHeightMeasure = new hd(e), this.distanceMeasure = new ud(e), this.clearDistanceMeasure = new dd(e), this.elevationMeasure = new fd(e), this.pointMeasure = new pd(e), this.angleMeasure = new md(e), this.areaMeasure = new gd(e), this.slopeMeasure = new yd(e), this.tools = new St(e), this.annotationContainer = document.createElement(\"div\"), this.annotationContainer.className = \"annotation-container\", e.container.appendChild(this.annotationContainer);\n }\n active() {\n this.isActive = !0, this.engine.modelEdge.loadModelEdge(), this.tools.active();\n }\n disActive() {\n this.tools.disActive(), this.clearAll(), this.isActive = !1, this.clearHeightMeasure.disActive(), this.distanceMeasure.disActive(), this.clearDistanceMeasure.disActive(), this.elevationMeasure.disActive(), this.pointMeasure.disActive(), this.angleMeasure.disActive(), this.areaMeasure.disActive(), this.slopeMeasure.disActive(), this.engine.interactionModule.init(), this.engine.interactionModule.active();\n }\n // 清空所有点的测量\n clearAllPoints() {\n this.clearHeightMeasure.clearAllPoints(), this.distanceMeasure.clearAllPoints(), this.clearDistanceMeasure.clearAllPoints(), this.elevationMeasure.clearAllPoints(), this.pointMeasure.clearAllPoints(), this.angleMeasure.clearAllPoints(), this.areaMeasure.clearAllPoints(), this.slopeMeasure.clearAllPoints();\n }\n // 清除所有测量\n clearAll() {\n e(this.annotationData.normalAnnotation), e(this.annotationData.textAnnotation), e(this.annotationData.coordinateAnnotation), e(this.annotationData.angleAnnotation), e(this.annotationData.distanceAnnotation), e(this.annotationData.areaAnnotation), e(this.annotationData.slopeAnnotation), e(this.annotationData.elevationAnnotation), e(this.annotationData.volumeAnnotation);\n function e(t) {\n for (let n = 0; n < t.length; n++)\n t[n].container.remove();\n t = [];\n }\n }\n // 保存设置\n saveSetting(e) {\n this.tools.saveSetting(e);\n }\n // 获取设置\n getSetting() {\n return this.tools.getSetting();\n }\n // 更新标注\n update() {\n this.isActive && this.tools.drawNormalAnnotation();\n }\n}\nconst Oa = 0, xd = 1, _d = 2, so = 2, ps = 1.25, ro = 1, Oe = 32, Ae = Oe / 4, Ba = 65535, vd = Math.pow(2, -24), ms = Symbol(\"SKIP_GENERATION\");\nfunction bd(o) {\n return o.index ? o.index.count : o.attributes.position.count;\n}\nfunction nn(o) {\n return bd(o) / 3;\n}\nfunction Md(o, e = ArrayBuffer) {\n return o > 65535 ? new Uint32Array(new e(4 * o)) : new Uint16Array(new e(2 * o));\n}\nfunction Sd(o, e) {\n if (!o.index) {\n const t = o.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = Md(t, n);\n o.setIndex(new ut(i, 1));\n for (let s = 0; s < t; s++)\n i[s] = s;\n }\n}\nfunction Na(o, e) {\n const t = nn(o), n = e || o.drawRange, i = n.start / 3, s = (n.start + n.count) / 3, r = Math.max(0, i), a = Math.min(t, s) - r;\n return [{\n offset: Math.floor(r),\n count: Math.floor(a)\n }];\n}\nfunction oo(o, e) {\n if (!o.groups || !o.groups.length)\n return Na(o, e);\n const t = [], n = e || o.drawRange, i = n.start / 3, s = (n.start + n.count) / 3, r = nn(o), a = [];\n for (const c of o.groups) {\n const { start: u, count: m } = c, f = u / 3, d = isFinite(m) ? m : r * 3 - u, p = (u + d) / 3;\n f < s && p > i && (a.push({ pos: Math.max(i, f), isStart: !0 }), a.push({ pos: Math.min(s, p), isStart: !1 }));\n }\n a.sort((c, u) => c.pos !== u.pos ? c.pos - u.pos : c.type === \"end\" ? -1 : 1);\n let l = 0, h = null;\n for (const c of a) {\n const u = c.pos;\n l !== 0 && u !== h && t.push({\n offset: h,\n count: u - h\n }), l += c.isStart ? 1 : -1, h = u;\n }\n return t;\n}\nfunction gs(o, e, t, n, i) {\n let s = 1 / 0, r = 1 / 0, a = 1 / 0, l = -1 / 0, h = -1 / 0, c = -1 / 0, u = 1 / 0, m = 1 / 0, f = 1 / 0, d = -1 / 0, p = -1 / 0, g = -1 / 0;\n const y = o.offset || 0;\n for (let w = (e - y) * 6, x = (e + t - y) * 6; w < x; w += 6) {\n const _ = o[w + 0], b = o[w + 1], E = _ - b, A = _ + b;\n E < s && (s = E), A > l && (l = A), _ < u && (u = _), _ > d && (d = _);\n const P = o[w + 2], C = o[w + 3], D = P - C, I = P + C;\n D < r && (r = D), I > h && (h = I), P < m && (m = P), P > p && (p = P);\n const T = o[w + 4], R = o[w + 5], v = T - R, z = T + R;\n v < a && (a = v), z > c && (c = z), T < f && (f = T), T > g && (g = T);\n }\n n[0] = s, n[1] = r, n[2] = a, n[3] = l, n[4] = h, n[5] = c, i[0] = u, i[1] = m, i[2] = f, i[3] = d, i[4] = p, i[5] = g;\n}\nfunction ao(o, e, t = null, n = null, i = null) {\n const s = o.attributes.position, r = o.index ? o.index.array : null, a = s.normalized;\n if (i === null)\n i = new Float32Array(t * 6), i.offset = e;\n else if (e < 0 || t + e > i.length / 6)\n throw new Error(\"MeshBVH: compute triangle bounds range is invalid.\");\n const l = s.array, h = s.offset || 0;\n let c = 3;\n s.isInterleavedBufferAttribute && (c = s.data.stride);\n const u = [\"getX\", \"getY\", \"getZ\"], m = i.offset;\n for (let f = e, d = e + t; f < d; f++) {\n const g = (n ? n[f] : f) * 3, y = (f - m) * 6;\n let w = g + 0, x = g + 1, _ = g + 2;\n r && (w = r[w], x = r[x], _ = r[_]), a || (w = w * c + h, x = x * c + h, _ = _ * c + h);\n for (let b = 0; b < 3; b++) {\n let E, A, P;\n a ? (E = s[u[b]](w), A = s[u[b]](x), P = s[u[b]](_)) : (E = l[w + b], A = l[x + b], P = l[_ + b]);\n let C = E;\n A < C && (C = A), P < C && (C = P);\n let D = E;\n A > D && (D = A), P > D && (D = P);\n const I = (D - C) / 2, T = b * 2;\n i[y + T + 0] = C + I, i[y + T + 1] = I + (Math.abs(C) + I) * vd;\n }\n }\n return i;\n}\nfunction we(o, e, t) {\n return t.min.x = e[o], t.min.y = e[o + 1], t.min.z = e[o + 2], t.max.x = e[o + 3], t.max.y = e[o + 4], t.max.z = e[o + 5], t;\n}\nfunction lo(o) {\n let e = -1, t = -1 / 0;\n for (let n = 0; n < 3; n++) {\n const i = o[n + 3] - o[n];\n i > t && (t = i, e = n);\n }\n return e;\n}\nfunction co(o, e) {\n e.set(o);\n}\nfunction ho(o, e, t) {\n let n, i;\n for (let s = 0; s < 3; s++) {\n const r = s + 3;\n n = o[s], i = e[s], t[s] = n < i ? n : i, n = o[r], i = e[r], t[r] = n > i ? n : i;\n }\n}\nfunction li(o, e, t) {\n for (let n = 0; n < 3; n++) {\n const i = e[o + 2 * n], s = e[o + 2 * n + 1], r = i - s, a = i + s;\n r < t[n] && (t[n] = r), a > t[n + 3] && (t[n + 3] = a);\n }\n}\nfunction Cn(o) {\n const e = o[3] - o[0], t = o[4] - o[1], n = o[5] - o[2];\n return 2 * (e * t + t * n + n * e);\n}\nconst yt = 32, Td = (o, e) => o.candidate - e.candidate, Ct = /* @__PURE__ */ new Array(yt).fill().map(() => ({\n count: 0,\n bounds: new Float32Array(6),\n rightCacheBounds: new Float32Array(6),\n leftCacheBounds: new Float32Array(6),\n candidate: 0\n})), ci = /* @__PURE__ */ new Float32Array(6);\nfunction Ed(o, e, t, n, i, s) {\n let r = -1, a = 0;\n if (s === Oa)\n r = lo(e), r !== -1 && (a = (e[r] + e[r + 3]) / 2);\n else if (s === xd)\n r = lo(o), r !== -1 && (a = Ad(t, n, i, r));\n else if (s === _d) {\n const l = Cn(o);\n let h = ps * i;\n const c = t.offset || 0, u = (n - c) * 6, m = (n + i - c) * 6;\n for (let f = 0; f < 3; f++) {\n const d = e[f], y = (e[f + 3] - d) / yt;\n if (i < yt / 4) {\n const w = [...Ct];\n w.length = i;\n let x = 0;\n for (let b = u; b < m; b += 6, x++) {\n const E = w[x];\n E.candidate = t[b + 2 * f], E.count = 0;\n const {\n bounds: A,\n leftCacheBounds: P,\n rightCacheBounds: C\n } = E;\n for (let D = 0; D < 3; D++)\n C[D] = 1 / 0, C[D + 3] = -1 / 0, P[D] = 1 / 0, P[D + 3] = -1 / 0, A[D] = 1 / 0, A[D + 3] = -1 / 0;\n li(b, t, A);\n }\n w.sort(Td);\n let _ = i;\n for (let b = 0; b < _; b++) {\n const E = w[b];\n for (; b + 1 < _ && w[b + 1].candidate === E.candidate; )\n w.splice(b + 1, 1), _--;\n }\n for (let b = u; b < m; b += 6) {\n const E = t[b + 2 * f];\n for (let A = 0; A < _; A++) {\n const P = w[A];\n E >= P.candidate ? li(b, t, P.rightCacheBounds) : (li(b, t, P.leftCacheBounds), P.count++);\n }\n }\n for (let b = 0; b < _; b++) {\n const E = w[b], A = E.count, P = i - E.count, C = E.leftCacheBounds, D = E.rightCacheBounds;\n let I = 0;\n A !== 0 && (I = Cn(C) / l);\n let T = 0;\n P !== 0 && (T = Cn(D) / l);\n const R = ro + ps * (I * A + T * P);\n R < h && (r = f, h = R, a = E.candidate);\n }\n } else {\n for (let _ = 0; _ < yt; _++) {\n const b = Ct[_];\n b.count = 0, b.candidate = d + y + _ * y;\n const E = b.bounds;\n for (let A = 0; A < 3; A++)\n E[A] = 1 / 0, E[A + 3] = -1 / 0;\n }\n for (let _ = u; _ < m; _ += 6) {\n let A = ~~((t[_ + 2 * f] - d) / y);\n A >= yt && (A = yt - 1);\n const P = Ct[A];\n P.count++, li(_, t, P.bounds);\n }\n const w = Ct[yt - 1];\n co(w.bounds, w.rightCacheBounds);\n for (let _ = yt - 2; _ >= 0; _--) {\n const b = Ct[_], E = Ct[_ + 1];\n ho(b.bounds, E.rightCacheBounds, b.rightCacheBounds);\n }\n let x = 0;\n for (let _ = 0; _ < yt - 1; _++) {\n const b = Ct[_], E = b.count, A = b.bounds, C = Ct[_ + 1].rightCacheBounds;\n E !== 0 && (x === 0 ? co(A, ci) : ho(A, ci, ci)), x += E;\n let D = 0, I = 0;\n x !== 0 && (D = Cn(ci) / l);\n const T = i - x;\n T !== 0 && (I = Cn(C) / l);\n const R = ro + ps * (D * x + I * T);\n R < h && (r = f, h = R, a = b.candidate);\n }\n }\n }\n } else\n console.warn(`MeshBVH: Invalid build strategy value ${s} used.`);\n return { axis: r, pos: a };\n}\nfunction Ad(o, e, t, n) {\n let i = 0;\n const s = o.offset;\n for (let r = e, a = e + t; r < a; r++)\n i += o[(r - s) * 6 + n * 2];\n return i / t;\n}\nclass ys {\n constructor() {\n this.boundingData = new Float32Array(6);\n }\n}\nfunction Cd(o, e, t, n, i, s) {\n let r = n, a = n + i - 1;\n const l = s.pos, h = s.axis * 2, c = t.offset || 0;\n for (; ; ) {\n for (; r <= a && t[(r - c) * 6 + h] < l; )\n r++;\n for (; r <= a && t[(a - c) * 6 + h] >= l; )\n a--;\n if (r < a) {\n for (let u = 0; u < 3; u++) {\n let m = e[r * 3 + u];\n e[r * 3 + u] = e[a * 3 + u], e[a * 3 + u] = m;\n }\n for (let u = 0; u < 6; u++) {\n const m = r - c, f = a - c, d = t[m * 6 + u];\n t[m * 6 + u] = t[f * 6 + u], t[f * 6 + u] = d;\n }\n r++, a--;\n } else\n return r;\n }\n}\nfunction Pd(o, e, t, n, i, s) {\n let r = n, a = n + i - 1;\n const l = s.pos, h = s.axis * 2, c = t.offset || 0;\n for (; ; ) {\n for (; r <= a && t[(r - c) * 6 + h] < l; )\n r++;\n for (; r <= a && t[(a - c) * 6 + h] >= l; )\n a--;\n if (r < a) {\n let u = o[r];\n o[r] = o[a], o[a] = u;\n for (let m = 0; m < 6; m++) {\n const f = r - c, d = a - c, p = t[f * 6 + m];\n t[f * 6 + m] = t[d * 6 + m], t[d * 6 + m] = p;\n }\n r++, a--;\n } else\n return r;\n }\n}\nlet Fa, Li, Ys, Ua;\nconst Rd = Math.pow(2, 32);\nfunction Ks(o) {\n return \"count\" in o ? 1 : 1 + Ks(o.left) + Ks(o.right);\n}\nfunction Dd(o, e, t) {\n return Fa = new Float32Array(t), Li = new Uint32Array(t), Ys = new Uint16Array(t), Ua = new Uint8Array(t), $s(o, e);\n}\nfunction $s(o, e) {\n const t = o / 4, n = o / 2, i = \"count\" in e, s = e.boundingData;\n for (let r = 0; r < 6; r++)\n Fa[t + r] = s[r];\n if (i)\n return e.buffer ? (Ua.set(new Uint8Array(e.buffer), o), o + e.buffer.byteLength) : (Li[t + 6] = e.offset, Ys[n + 14] = e.count, Ys[n + 15] = Ba, o + Oe);\n {\n const { left: r, right: a, splitAxis: l } = e, h = o + Oe;\n let c = $s(h, r);\n const u = o / Oe, f = c / Oe - u;\n if (f > Rd)\n throw new Error(\"MeshBVH: Cannot store relative child node offset greater than 32 bits.\");\n return Li[t + 6] = f, Li[t + 7] = l, $s(c, a);\n }\n}\nfunction kd(o, e, t) {\n const i = (o.index ? o.index.count : o.attributes.position.count) / 3 > 2 ** 16, s = t.reduce((c, u) => c + u.count, 0), r = i ? 4 : 2, a = e ? new SharedArrayBuffer(s * r) : new ArrayBuffer(s * r), l = i ? new Uint32Array(a) : new Uint16Array(a);\n let h = 0;\n for (let c = 0; c < t.length; c++) {\n const { offset: u, count: m } = t[c];\n for (let f = 0; f < m; f++)\n l[h + f] = u + f;\n h += m;\n }\n return l;\n}\nfunction Id(o, e, t, n, i) {\n const {\n maxDepth: s,\n verbose: r,\n maxLeafTris: a,\n strategy: l,\n onProgress: h,\n indirect: c\n } = i, u = o._indirectBuffer, m = o.geometry, f = m.index ? m.index.array : null, d = c ? Pd : Cd, p = nn(m), g = new Float32Array(6);\n let y = !1;\n const w = new ys();\n return gs(e, t, n, w.boundingData, g), _(w, t, n, g), w;\n function x(b) {\n h && h(b / p);\n }\n function _(b, E, A, P = null, C = 0) {\n if (!y && C >= s && (y = !0, r && (console.warn(`MeshBVH: Max depth of ${s} reached when generating BVH. Consider increasing maxDepth.`), console.warn(m))), A <= a || C >= s)\n return x(E + A), b.offset = E, b.count = A, b;\n const D = Ed(b.boundingData, P, e, E, A, l);\n if (D.axis === -1)\n return x(E + A), b.offset = E, b.count = A, b;\n const I = d(u, f, e, E, A, D);\n if (I === E || I === E + A)\n x(E + A), b.offset = E, b.count = A;\n else {\n b.splitAxis = D.axis;\n const T = new ys(), R = E, v = I - E;\n b.left = T, gs(e, R, v, T.boundingData, g), _(T, R, v, g, C + 1);\n const z = new ys(), H = I, V = A - v;\n b.right = z, gs(e, H, V, z.boundingData, g), _(z, H, V, g, C + 1);\n }\n return b;\n }\n}\nfunction Ld(o, e) {\n const t = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, n = o.geometry;\n let i, s;\n if (e.indirect) {\n const r = oo(n, e.range), a = kd(n, e.useSharedArrayBuffer, r);\n o._indirectBuffer = a, i = ao(n, 0, a.length, a), s = [{ offset: 0, count: a.length }];\n } else {\n Sd(n, e);\n const r = Na(n, e.range)[0];\n i = ao(n, r.offset, r.count), s = oo(n, e.range);\n }\n o._roots = s.map((r) => {\n const a = Id(o, i, r.offset, r.count, e), l = Ks(a), h = new t(Oe * l);\n return Dd(0, a, h), h;\n });\n}\nclass Mt {\n constructor() {\n this.min = 1 / 0, this.max = -1 / 0;\n }\n setFromPointsField(e, t) {\n let n = 1 / 0, i = -1 / 0;\n for (let s = 0, r = e.length; s < r; s++) {\n const l = e[s][t];\n n = l < n ? l : n, i = l > i ? l : i;\n }\n this.min = n, this.max = i;\n }\n setFromPoints(e, t) {\n let n = 1 / 0, i = -1 / 0;\n for (let s = 0, r = t.length; s < r; s++) {\n const a = t[s], l = e.dot(a);\n n = l < n ? l : n, i = l > i ? l : i;\n }\n this.min = n, this.max = i;\n }\n isSeparated(e) {\n return this.min > e.max || e.min > this.max;\n }\n}\nMt.prototype.setFromBox = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new K();\n return function(t, n) {\n const i = n.min, s = n.max;\n let r = 1 / 0, a = -1 / 0;\n for (let l = 0; l <= 1; l++)\n for (let h = 0; h <= 1; h++)\n for (let c = 0; c <= 1; c++) {\n o.x = i.x * l + s.x * (1 - l), o.y = i.y * h + s.y * (1 - h), o.z = i.z * c + s.z * (1 - c);\n const u = t.dot(o);\n r = Math.min(u, r), a = Math.max(u, a);\n }\n this.min = r, this.max = a;\n };\n})();\nconst zd = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new K(), e = /* @__PURE__ */ new K(), t = /* @__PURE__ */ new K();\n return function(i, s, r) {\n const a = i.start, l = o, h = s.start, c = e;\n t.subVectors(a, h), o.subVectors(i.end, i.start), e.subVectors(s.end, s.start);\n const u = t.dot(c), m = c.dot(l), f = c.dot(c), d = t.dot(l), g = l.dot(l) * f - m * m;\n let y, w;\n g !== 0 ? y = (u * m - d * f) / g : y = 0, w = (u + y * m) / f, r.x = y, r.y = w;\n };\n})(), mr = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new ue(), e = /* @__PURE__ */ new K(), t = /* @__PURE__ */ new K();\n return function(i, s, r, a) {\n zd(i, s, o);\n let l = o.x, h = o.y;\n if (l >= 0 && l <= 1 && h >= 0 && h <= 1) {\n i.at(l, r), s.at(h, a);\n return;\n } else if (l >= 0 && l <= 1) {\n h < 0 ? s.at(0, a) : s.at(1, a), i.closestPointToPoint(a, !0, r);\n return;\n } else if (h >= 0 && h <= 1) {\n l < 0 ? i.at(0, r) : i.at(1, r), s.closestPointToPoint(r, !0, a);\n return;\n } else {\n let c;\n l < 0 ? c = i.start : c = i.end;\n let u;\n h < 0 ? u = s.start : u = s.end;\n const m = e, f = t;\n if (i.closestPointToPoint(u, !0, e), s.closestPointToPoint(c, !0, t), m.distanceToSquared(u) <= f.distanceToSquared(c)) {\n r.copy(m), a.copy(u);\n return;\n } else {\n r.copy(c), a.copy(f);\n return;\n }\n }\n };\n})(), Od = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new K(), e = /* @__PURE__ */ new K(), t = /* @__PURE__ */ new Xi(), n = /* @__PURE__ */ new Ke();\n return function(s, r) {\n const { radius: a, center: l } = s, { a: h, b: c, c: u } = r;\n if (n.start = h, n.end = c, n.closestPointToPoint(l, !0, o).distanceTo(l) <= a || (n.start = h, n.end = u, n.closestPointToPoint(l, !0, o).distanceTo(l) <= a) || (n.start = c, n.end = u, n.closestPointToPoint(l, !0, o).distanceTo(l) <= a)) return !0;\n const p = r.getPlane(t);\n if (Math.abs(p.distanceToPoint(l)) <= a) {\n const y = p.projectPoint(l, e);\n if (r.containsPoint(y)) return !0;\n }\n return !1;\n };\n})(), Bd = [\"x\", \"y\", \"z\"], wt = 1e-15, uo = wt * wt;\nfunction We(o) {\n return Math.abs(o) < wt;\n}\nclass $e extends Ue {\n constructor(...e) {\n super(...e), this.isExtendedTriangle = !0, this.satAxes = new Array(4).fill().map(() => new K()), this.satBounds = new Array(4).fill().map(() => new Mt()), this.points = [this.a, this.b, this.c], this.plane = new Xi(), this.isDegenerateIntoSegment = !1, this.isDegenerateIntoPoint = !1, this.degenerateSegment = new Ke(), this.needsUpdate = !0;\n }\n intersectsSphere(e) {\n return Od(e, this);\n }\n update() {\n const e = this.a, t = this.b, n = this.c, i = this.points, s = this.satAxes, r = this.satBounds, a = s[0], l = r[0];\n this.getNormal(a), l.setFromPoints(a, i);\n const h = s[1], c = r[1];\n h.subVectors(e, t), c.setFromPoints(h, i);\n const u = s[2], m = r[2];\n u.subVectors(t, n), m.setFromPoints(u, i);\n const f = s[3], d = r[3];\n f.subVectors(n, e), d.setFromPoints(f, i);\n const p = h.length(), g = u.length(), y = f.length();\n this.isDegenerateIntoPoint = !1, this.isDegenerateIntoSegment = !1, p < wt ? g < wt || y < wt ? this.isDegenerateIntoPoint = !0 : (this.isDegenerateIntoSegment = !0, this.degenerateSegment.start.copy(e), this.degenerateSegment.end.copy(n)) : g < wt ? y < wt ? this.isDegenerateIntoPoint = !0 : (this.isDegenerateIntoSegment = !0, this.degenerateSegment.start.copy(t), this.degenerateSegment.end.copy(e)) : y < wt && (this.isDegenerateIntoSegment = !0, this.degenerateSegment.start.copy(n), this.degenerateSegment.end.copy(t)), this.plane.setFromNormalAndCoplanarPoint(a, e), this.needsUpdate = !1;\n }\n}\n$e.prototype.closestPointToSegment = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new K(), e = /* @__PURE__ */ new K(), t = /* @__PURE__ */ new Ke();\n return function(i, s = null, r = null) {\n const { start: a, end: l } = i, h = this.points;\n let c, u = 1 / 0;\n for (let m = 0; m < 3; m++) {\n const f = (m + 1) % 3;\n t.start.copy(h[m]), t.end.copy(h[f]), mr(t, i, o, e), c = o.distanceToSquared(e), c < u && (u = c, s && s.copy(o), r && r.copy(e));\n }\n return this.closestPointToPoint(a, o), c = a.distanceToSquared(o), c < u && (u = c, s && s.copy(o), r && r.copy(a)), this.closestPointToPoint(l, o), c = l.distanceToSquared(o), c < u && (u = c, s && s.copy(o), r && r.copy(l)), Math.sqrt(u);\n };\n})();\n$e.prototype.intersectsTriangle = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new $e(), e = /* @__PURE__ */ new Mt(), t = /* @__PURE__ */ new Mt(), n = /* @__PURE__ */ new K(), i = /* @__PURE__ */ new K(), s = /* @__PURE__ */ new K(), r = /* @__PURE__ */ new K(), a = /* @__PURE__ */ new Ke(), l = /* @__PURE__ */ new Ke(), h = /* @__PURE__ */ new K(), c = /* @__PURE__ */ new ue(), u = /* @__PURE__ */ new ue();\n function m(x, _, b, E) {\n const A = n;\n !x.isDegenerateIntoPoint && !x.isDegenerateIntoSegment ? A.copy(x.plane.normal) : A.copy(_.plane.normal);\n const P = x.satBounds, C = x.satAxes;\n for (let T = 1; T < 4; T++) {\n const R = P[T], v = C[T];\n if (e.setFromPoints(v, _.points), R.isSeparated(e) || (r.copy(A).cross(v), e.setFromPoints(r, x.points), t.setFromPoints(r, _.points), e.isSeparated(t))) return !1;\n }\n const D = _.satBounds, I = _.satAxes;\n for (let T = 1; T < 4; T++) {\n const R = D[T], v = I[T];\n if (e.setFromPoints(v, x.points), R.isSeparated(e) || (r.crossVectors(A, v), e.setFromPoints(r, x.points), t.setFromPoints(r, _.points), e.isSeparated(t))) return !1;\n }\n return b && (E || console.warn(\"ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0.\"), b.start.set(0, 0, 0), b.end.set(0, 0, 0)), !0;\n }\n function f(x, _, b, E, A, P, C, D, I, T, R) {\n let v = C / (C - D);\n T.x = E + (A - E) * v, R.start.subVectors(_, x).multiplyScalar(v).add(x), v = C / (C - I), T.y = E + (P - E) * v, R.end.subVectors(b, x).multiplyScalar(v).add(x);\n }\n function d(x, _, b, E, A, P, C, D, I, T, R) {\n if (A > 0)\n f(x.c, x.a, x.b, E, _, b, I, C, D, T, R);\n else if (P > 0)\n f(x.b, x.a, x.c, b, _, E, D, C, I, T, R);\n else if (D * I > 0 || C != 0)\n f(x.a, x.b, x.c, _, b, E, C, D, I, T, R);\n else if (D != 0)\n f(x.b, x.a, x.c, b, _, E, D, C, I, T, R);\n else if (I != 0)\n f(x.c, x.a, x.b, E, _, b, I, C, D, T, R);\n else\n return !0;\n return !1;\n }\n function p(x, _, b, E) {\n const A = _.degenerateSegment, P = x.plane.distanceToPoint(A.start), C = x.plane.distanceToPoint(A.end);\n return We(P) ? We(C) ? m(x, _, b, E) : (b && (b.start.copy(A.start), b.end.copy(A.start)), x.containsPoint(A.start)) : We(C) ? (b && (b.start.copy(A.end), b.end.copy(A.end)), x.containsPoint(A.end)) : x.plane.intersectLine(A, n) != null ? (b && (b.start.copy(n), b.end.copy(n)), x.containsPoint(n)) : !1;\n }\n function g(x, _, b) {\n const E = _.a;\n return We(x.plane.distanceToPoint(E)) && x.containsPoint(E) ? (b && (b.start.copy(E), b.end.copy(E)), !0) : !1;\n }\n function y(x, _, b) {\n const E = x.degenerateSegment, A = _.a;\n return E.closestPointToPoint(A, !0, n), A.distanceToSquared(n) < uo ? (b && (b.start.copy(A), b.end.copy(A)), !0) : !1;\n }\n function w(x, _, b, E) {\n if (x.isDegenerateIntoSegment)\n if (_.isDegenerateIntoSegment) {\n const A = x.degenerateSegment, P = _.degenerateSegment, C = i, D = s;\n A.delta(C), P.delta(D);\n const I = n.subVectors(P.start, A.start), T = C.x * D.y - C.y * D.x;\n if (We(T))\n return !1;\n const R = (I.x * D.y - I.y * D.x) / T, v = -(C.x * I.y - C.y * I.x) / T;\n if (R < 0 || R > 1 || v < 0 || v > 1)\n return !1;\n const z = A.start.z + C.z * R, H = P.start.z + D.z * v;\n return We(z - H) ? (b && (b.start.copy(A.start).addScaledVector(C, R), b.end.copy(A.start).addScaledVector(C, R)), !0) : !1;\n } else return _.isDegenerateIntoPoint ? y(x, _, b) : p(_, x, b, E);\n else {\n if (x.isDegenerateIntoPoint)\n return _.isDegenerateIntoPoint ? _.a.distanceToSquared(x.a) < uo ? (b && (b.start.copy(x.a), b.end.copy(x.a)), !0) : !1 : _.isDegenerateIntoSegment ? y(_, x, b) : g(_, x, b);\n if (_.isDegenerateIntoPoint)\n return g(x, _, b);\n if (_.isDegenerateIntoSegment)\n return p(x, _, b, E);\n }\n }\n return function(_, b = null, E = !1) {\n this.needsUpdate && this.update(), _.isExtendedTriangle ? _.needsUpdate && _.update() : (o.copy(_), o.update(), _ = o);\n const A = w(this, _, b, E);\n if (A !== void 0)\n return A;\n const P = this.plane, C = _.plane;\n let D = C.distanceToPoint(this.a), I = C.distanceToPoint(this.b), T = C.distanceToPoint(this.c);\n We(D) && (D = 0), We(I) && (I = 0), We(T) && (T = 0);\n const R = D * I, v = D * T;\n if (R > 0 && v > 0)\n return !1;\n let z = P.distanceToPoint(_.a), H = P.distanceToPoint(_.b), V = P.distanceToPoint(_.c);\n We(z) && (z = 0), We(H) && (H = 0), We(V) && (V = 0);\n const te = z * H, G = z * V;\n if (te > 0 && G > 0)\n return !1;\n i.copy(P.normal), s.copy(C.normal);\n const $ = i.cross(s);\n let N = 0, O = Math.abs($.x);\n const Q = Math.abs($.y);\n Q > O && (O = Q, N = 1), Math.abs($.z) > O && (N = 2);\n const q = Bd[N], de = this.a[q], pe = this.b[q], se = this.c[q], oe = _.a[q], he = _.b[q], me = _.c[q];\n if (d(this, de, pe, se, R, v, D, I, T, c, a))\n return m(this, _, b, E);\n if (d(_, oe, he, me, te, G, z, H, V, u, l))\n return m(this, _, b, E);\n if (c.y < c.x) {\n const Te = c.y;\n c.y = c.x, c.x = Te, h.copy(a.start), a.start.copy(a.end), a.end.copy(h);\n }\n if (u.y < u.x) {\n const Te = u.y;\n u.y = u.x, u.x = Te, h.copy(l.start), l.start.copy(l.end), l.end.copy(h);\n }\n return c.y < u.x || u.y < c.x ? !1 : (b && (u.x > c.x ? b.start.copy(l.start) : b.start.copy(a.start), u.y < c.y ? b.end.copy(l.end) : b.end.copy(a.end)), !0);\n };\n})();\n$e.prototype.distanceToPoint = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new K();\n return function(t) {\n return this.closestPointToPoint(t, o), t.distanceTo(o);\n };\n})();\n$e.prototype.distanceToTriangle = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new K(), e = /* @__PURE__ */ new K(), t = [\"a\", \"b\", \"c\"], n = /* @__PURE__ */ new Ke(), i = /* @__PURE__ */ new Ke();\n return function(r, a = null, l = null) {\n const h = a || l ? n : null;\n if (this.intersectsTriangle(r, h))\n return (a || l) && (a && h.getCenter(a), l && h.getCenter(l)), 0;\n let c = 1 / 0;\n for (let u = 0; u < 3; u++) {\n let m;\n const f = t[u], d = r[f];\n this.closestPointToPoint(d, o), m = d.distanceToSquared(o), m < c && (c = m, a && a.copy(o), l && l.copy(d));\n const p = this[f];\n r.closestPointToPoint(p, o), m = p.distanceToSquared(o), m < c && (c = m, a && a.copy(p), l && l.copy(o));\n }\n for (let u = 0; u < 3; u++) {\n const m = t[u], f = t[(u + 1) % 3];\n n.set(this[m], this[f]);\n for (let d = 0; d < 3; d++) {\n const p = t[d], g = t[(d + 1) % 3];\n i.set(r[p], r[g]), mr(n, i, o, e);\n const y = o.distanceToSquared(e);\n y < c && (c = y, a && a.copy(o), l && l.copy(e));\n }\n }\n return Math.sqrt(c);\n };\n})();\nclass Be {\n constructor(e, t, n) {\n this.isOrientedBox = !0, this.min = new K(), this.max = new K(), this.matrix = new Me(), this.invMatrix = new Me(), this.points = new Array(8).fill().map(() => new K()), this.satAxes = new Array(3).fill().map(() => new K()), this.satBounds = new Array(3).fill().map(() => new Mt()), this.alignedSatBounds = new Array(3).fill().map(() => new Mt()), this.needsUpdate = !1, e && this.min.copy(e), t && this.max.copy(t), n && this.matrix.copy(n);\n }\n set(e, t, n) {\n this.min.copy(e), this.max.copy(t), this.matrix.copy(n), this.needsUpdate = !0;\n }\n copy(e) {\n this.min.copy(e.min), this.max.copy(e.max), this.matrix.copy(e.matrix), this.needsUpdate = !0;\n }\n}\nBe.prototype.update = /* @__PURE__ */ (function() {\n return function() {\n const e = this.matrix, t = this.min, n = this.max, i = this.points;\n for (let h = 0; h <= 1; h++)\n for (let c = 0; c <= 1; c++)\n for (let u = 0; u <= 1; u++) {\n const m = 1 * h | 2 * c | 4 * u, f = i[m];\n f.x = h ? n.x : t.x, f.y = c ? n.y : t.y, f.z = u ? n.z : t.z, f.applyMatrix4(e);\n }\n const s = this.satBounds, r = this.satAxes, a = i[0];\n for (let h = 0; h < 3; h++) {\n const c = r[h], u = s[h], m = 1 << h, f = i[m];\n c.subVectors(a, f), u.setFromPoints(c, i);\n }\n const l = this.alignedSatBounds;\n l[0].setFromPointsField(i, \"x\"), l[1].setFromPointsField(i, \"y\"), l[2].setFromPointsField(i, \"z\"), this.invMatrix.copy(this.matrix).invert(), this.needsUpdate = !1;\n };\n})();\nBe.prototype.intersectsBox = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new Mt();\n return function(t) {\n this.needsUpdate && this.update();\n const n = t.min, i = t.max, s = this.satBounds, r = this.satAxes, a = this.alignedSatBounds;\n if (o.min = n.x, o.max = i.x, a[0].isSeparated(o) || (o.min = n.y, o.max = i.y, a[1].isSeparated(o)) || (o.min = n.z, o.max = i.z, a[2].isSeparated(o))) return !1;\n for (let l = 0; l < 3; l++) {\n const h = r[l], c = s[l];\n if (o.setFromBox(h, t), c.isSeparated(o)) return !1;\n }\n return !0;\n };\n})();\nBe.prototype.intersectsTriangle = /* @__PURE__ */ (function() {\n const o = /* @__PURE__ */ new $e(), e = /* @__PURE__ */ new Array(3), t = /* @__PURE__ */ new Mt(), n = /* @__PURE__ */ new Mt(), i = /* @__PURE__ */ new K();\n return function(r) {\n this.needsUpdate && this.update(), r.isExtendedTriangle ? r.needsUpdate && r.update() : (o.copy(r), o.update(), r = o);\n const a = this.satBounds, l = this.satAxes;\n e[0] = r.a, e[1] = r.b, e[2] = r.c;\n for (let m = 0; m < 3; m++) {\n const f = a[m], d = l[m];\n if (t.setFromPoints(d, e), f.isSeparated(t)) return !1;\n }\n const h = r.satBounds, c = r.satAxes, u = this.points;\n for (let m = 0; m < 3; m++) {\n const f = h[m], d = c[m];\n if (t.setFromPoints(d, u), f.isSeparated(t)) return !1;\n }\n for (let m = 0; m < 3; m++) {\n const f = l[m];\n for (let d = 0; d < 4; d++) {\n const p = c[d];\n if (i.crossVectors(f, p), t.setFromPoints(i, e), n.setFromPoints(i, u), t.isSeparated(n)) return !1;\n }\n }\n return !0;\n };\n})();\nBe.prototype.closestPointToPoint = /* @__PURE__ */ (function() {\n return function(e, t) {\n return this.needsUpdate && this.update(), t.copy(e).applyMatrix4(this.invMatrix).clamp(this.min, this.max).applyMatrix4(this.matrix), t;\n };\n})();\nBe.prototype.distanceToPoint = (function() {\n const o = new K();\n return function(t) {\n return this.closestPointToPoint(t, o), t.distanceTo(o);\n };\n})();\nBe.prototype.distanceToBox = /* @__PURE__ */ (function() {\n const o = [\"x\", \"y\", \"z\"], e = /* @__PURE__ */ new Array(12).fill().map(() => new Ke()), t = /* @__PURE__ */ new Array(12).fill().map(() => new Ke()), n = /* @__PURE__ */ new K(), i = /* @__PURE__ */ new K();\n return function(r, a = 0, l = null, h = null) {\n if (this.needsUpdate && this.update(), this.intersectsBox(r))\n return (l || h) && (r.getCenter(i), this.closestPointToPoint(i, n), r.closestPointToPoint(n, i), l && l.copy(n), h && h.copy(i)), 0;\n const c = a * a, u = r.min, m = r.max, f = this.points;\n let d = 1 / 0;\n for (let g = 0; g < 8; g++) {\n const y = f[g];\n i.copy(y).clamp(u, m);\n const w = y.distanceToSquared(i);\n if (w < d && (d = w, l && l.copy(y), h && h.copy(i), w < c))\n return Math.sqrt(w);\n }\n let p = 0;\n for (let g = 0; g < 3; g++)\n for (let y = 0; y <= 1; y++)\n for (let w = 0; w <= 1; w++) {\n const x = (g + 1) % 3, _ = (g + 2) % 3, b = y << x | w << _, E = 1 << g | y << x | w << _, A = f[b], P = f[E];\n e[p].set(A, P);\n const D = o[g], I = o[x], T = o[_], R = t[p], v = R.start, z = R.end;\n v[D] = u[D], v[I] = y ? u[I] : m[I], v[T] = w ? u[T] : m[I], z[D] = m[D], z[I] = y ? u[I] : m[I], z[T] = w ? u[T] : m[I], p++;\n }\n for (let g = 0; g <= 1; g++)\n for (let y = 0; y <= 1; y++)\n for (let w = 0; w <= 1; w++) {\n i.x = g ? m.x : u.x, i.y = y ? m.y : u.y, i.z = w ? m.z : u.z, this.closestPointToPoint(i, n);\n const x = i.distanceToSquared(n);\n if (x < d && (d = x, l && l.copy(n), h && h.copy(i), x < c))\n return Math.sqrt(x);\n }\n for (let g = 0; g < 12; g++) {\n const y = e[g];\n for (let w = 0; w < 12; w++) {\n const x = t[w];\n mr(y, x, n, i);\n const _ = n.distanceToSquared(i);\n if (_ < d && (d = _, l && l.copy(n), h && h.copy(i), _ < c))\n return Math.sqrt(_);\n }\n }\n return Math.sqrt(d);\n };\n})();\nclass gr {\n constructor(e) {\n this._getNewPrimitive = e, this._primitives = [];\n }\n getPrimitive() {\n const e = this._primitives;\n return e.length === 0 ? this._getNewPrimitive() : e.pop();\n }\n releasePrimitive(e) {\n this._primitives.push(e);\n }\n}\nclass Nd extends gr {\n constructor() {\n super(() => new $e());\n }\n}\nconst qe = /* @__PURE__ */ new Nd();\nfunction Ce(o, e) {\n return e[o + 15] === Ba;\n}\nfunction Ge(o, e) {\n return e[o + 6];\n}\nfunction Ye(o, e) {\n return e[o + 14];\n}\nfunction Pe(o) {\n return o + Ae;\n}\nfunction Re(o, e) {\n const t = e[o + 6];\n return o + t * Ae;\n}\nfunction yr(o, e) {\n return e[o + 7];\n}\nclass Fd {\n constructor() {\n this.float32Array = null, this.uint16Array = null, this.uint32Array = null;\n const e = [];\n let t = null;\n this.setBuffer = (n) => {\n t && e.push(t), t = n, this.float32Array = new Float32Array(n), this.uint16Array = new Uint16Array(n), this.uint32Array = new Uint32Array(n);\n }, this.clearBuffer = () => {\n t = null, this.float32Array = null, this.uint16Array = null, this.uint32Array = null, e.length !== 0 && this.setBuffer(e.pop());\n };\n }\n}\nconst ge = /* @__PURE__ */ new Fd();\nlet kt, mn;\nconst rn = [], hi = /* @__PURE__ */ new gr(() => new ot());\nfunction Ud(o, e, t, n, i, s) {\n kt = hi.getPrimitive(), mn = hi.getPrimitive(), rn.push(kt, mn), ge.setBuffer(o._roots[e]);\n const r = Js(0, o.geometry, t, n, i, s);\n ge.clearBuffer(), hi.releasePrimitive(kt), hi.releasePrimitive(mn), rn.pop(), rn.pop();\n const a = rn.length;\n return a > 0 && (mn = rn[a - 1], kt = rn[a - 2]), r;\n}\nfunction Js(o, e, t, n, i = null, s = 0, r = 0) {\n const { float32Array: a, uint16Array: l, uint32Array: h } = ge;\n let c = o * 2;\n if (Ce(c, l)) {\n const m = Ge(o, h), f = Ye(c, l);\n return we(o, a, kt), n(m, f, !1, r, s + o / Ae, kt);\n } else {\n let D = function(T) {\n const { uint16Array: R, uint32Array: v } = ge;\n let z = T * 2;\n for (; !Ce(z, R); )\n T = Pe(T), z = T * 2;\n return Ge(T, v);\n }, I = function(T) {\n const { uint16Array: R, uint32Array: v } = ge;\n let z = T * 2;\n for (; !Ce(z, R); )\n T = Re(T, v), z = T * 2;\n return Ge(T, v) + Ye(z, R);\n };\n const m = Pe(o), f = Re(o, h);\n let d = m, p = f, g, y, w, x;\n if (i && (w = kt, x = mn, we(d, a, w), we(p, a, x), g = i(w), y = i(x), y < g)) {\n d = f, p = m;\n const T = g;\n g = y, y = T, w = x;\n }\n w || (w = kt, we(d, a, w));\n const _ = Ce(d * 2, l), b = t(w, _, g, r + 1, s + d / Ae);\n let E;\n if (b === so) {\n const T = D(d), v = I(d) - T;\n E = n(T, v, !0, r + 1, s + d / Ae, w);\n } else\n E = b && Js(\n d,\n e,\n t,\n n,\n i,\n s,\n r + 1\n );\n if (E) return !0;\n x = mn, we(p, a, x);\n const A = Ce(p * 2, l), P = t(x, A, y, r + 1, s + p / Ae);\n let C;\n if (P === so) {\n const T = D(p), v = I(p) - T;\n C = n(T, v, !0, r + 1, s + p / Ae, x);\n } else\n C = P && Js(\n p,\n e,\n t,\n n,\n i,\n s,\n r + 1\n );\n return !!C;\n }\n}\nconst Pn = /* @__PURE__ */ new K(), ws = /* @__PURE__ */ new K();\nfunction Vd(o, e, t = {}, n = 0, i = 1 / 0) {\n const s = n * n, r = i * i;\n let a = 1 / 0, l = null;\n if (o.shapecast(\n {\n boundsTraverseOrder: (c) => (Pn.copy(e).clamp(c.min, c.max), Pn.distanceToSquared(e)),\n intersectsBounds: (c, u, m) => m < a && m < r,\n intersectsTriangle: (c, u) => {\n c.closestPointToPoint(e, Pn);\n const m = e.distanceToSquared(Pn);\n return m < a && (ws.copy(Pn), a = m, l = u), m < s;\n }\n }\n ), a === 1 / 0) return null;\n const h = Math.sqrt(a);\n return t.point ? t.point.copy(ws) : t.point = ws.clone(), t.distance = h, t.faceIndex = l, t;\n}\nconst ui = parseInt(ta) >= 169, Hd = parseInt(ta) <= 161, Ht = /* @__PURE__ */ new K(), jt = /* @__PURE__ */ new K(), Gt = /* @__PURE__ */ new K(), di = /* @__PURE__ */ new ue(), fi = /* @__PURE__ */ new ue(), pi = /* @__PURE__ */ new ue(), fo = /* @__PURE__ */ new K(), po = /* @__PURE__ */ new K(), mo = /* @__PURE__ */ new K(), Rn = /* @__PURE__ */ new K();\nfunction jd(o, e, t, n, i, s, r, a) {\n let l;\n if (s === Nl ? l = o.intersectTriangle(n, t, e, !0, i) : l = o.intersectTriangle(e, t, n, s !== qi, i), l === null) return null;\n const h = o.origin.distanceTo(i);\n return h < r || h > a ? null : {\n distance: h,\n point: i.clone()\n };\n}\nfunction go(o, e, t, n, i, s, r, a, l, h, c) {\n Ht.fromBufferAttribute(e, s), jt.fromBufferAttribute(e, r), Gt.fromBufferAttribute(e, a);\n const u = jd(o, Ht, jt, Gt, Rn, l, h, c);\n if (u) {\n if (n) {\n di.fromBufferAttribute(n, s), fi.fromBufferAttribute(n, r), pi.fromBufferAttribute(n, a), u.uv = new ue();\n const f = Ue.getInterpolation(Rn, Ht, jt, Gt, di, fi, pi, u.uv);\n ui || (u.uv = f);\n }\n if (i) {\n di.fromBufferAttribute(i, s), fi.fromBufferAttribute(i, r), pi.fromBufferAttribute(i, a), u.uv1 = new ue();\n const f = Ue.getInterpolation(Rn, Ht, jt, Gt, di, fi, pi, u.uv1);\n ui || (u.uv1 = f), Hd && (u.uv2 = u.uv1);\n }\n if (t) {\n fo.fromBufferAttribute(t, s), po.fromBufferAttribute(t, r), mo.fromBufferAttribute(t, a), u.normal = new K();\n const f = Ue.getInterpolation(Rn, Ht, jt, Gt, fo, po, mo, u.normal);\n u.normal.dot(o.direction) > 0 && u.normal.multiplyScalar(-1), ui || (u.normal = f);\n }\n const m = {\n a: s,\n b: r,\n c: a,\n normal: new K(),\n materialIndex: 0\n };\n if (Ue.getNormal(Ht, jt, Gt, m.normal), u.face = m, u.faceIndex = s, ui) {\n const f = new K();\n Ue.getBarycoord(Rn, Ht, jt, Gt, f), u.barycoord = f;\n }\n }\n return u;\n}\nfunction yo(o) {\n return o && o.isMaterial ? o.side : o;\n}\nfunction ts(o, e, t, n, i, s, r) {\n const a = n * 3;\n let l = a + 0, h = a + 1, c = a + 2;\n const { index: u, groups: m } = o;\n o.index && (l = u.getX(l), h = u.getX(h), c = u.getX(c));\n const { position: f, normal: d, uv: p, uv1: g } = o.attributes;\n if (Array.isArray(e)) {\n const y = n * 3;\n for (let w = 0, x = m.length; w < x; w++) {\n const { start: _, count: b, materialIndex: E } = m[w];\n if (y >= _ && y < _ + b) {\n const A = yo(e[E]), P = go(t, f, d, p, g, l, h, c, A, s, r);\n if (P)\n if (P.faceIndex = n, P.face.materialIndex = E, i)\n i.push(P);\n else\n return P;\n }\n }\n } else {\n const y = yo(e), w = go(t, f, d, p, g, l, h, c, y, s, r);\n if (w)\n if (w.faceIndex = n, w.face.materialIndex = 0, i)\n i.push(w);\n else\n return w;\n }\n return null;\n}\nfunction be(o, e, t, n) {\n const i = o.a, s = o.b, r = o.c;\n let a = e, l = e + 1, h = e + 2;\n t && (a = t.getX(a), l = t.getX(l), h = t.getX(h)), i.x = n.getX(a), i.y = n.getY(a), i.z = n.getZ(a), s.x = n.getX(l), s.y = n.getY(l), s.z = n.getZ(l), r.x = n.getX(h), r.y = n.getY(h), r.z = n.getZ(h);\n}\nfunction Gd(o, e, t, n, i, s, r, a) {\n const { geometry: l, _indirectBuffer: h } = o;\n for (let c = n, u = n + i; c < u; c++)\n ts(l, e, t, c, s, r, a);\n}\nfunction Wd(o, e, t, n, i, s, r) {\n const { geometry: a, _indirectBuffer: l } = o;\n let h = 1 / 0, c = null;\n for (let u = n, m = n + i; u < m; u++) {\n let f;\n f = ts(a, e, t, u, null, s, r), f && f.distance < h && (c = f, h = f.distance);\n }\n return c;\n}\nfunction Xd(o, e, t, n, i, s, r) {\n const { geometry: a } = t, { index: l } = a, h = a.attributes.position;\n for (let c = o, u = e + o; c < u; c++) {\n let m;\n if (m = c, be(r, m * 3, l, h), r.needsUpdate = !0, n(r, m, i, s))\n return !0;\n }\n return !1;\n}\nfunction Zd(o, e = null) {\n e && Array.isArray(e) && (e = new Set(e));\n const t = o.geometry, n = t.index ? t.index.array : null, i = t.attributes.position;\n let s, r, a, l, h = 0;\n const c = o._roots;\n for (let m = 0, f = c.length; m < f; m++)\n s = c[m], r = new Uint32Array(s), a = new Uint16Array(s), l = new Float32Array(s), u(0, h), h += s.byteLength;\n function u(m, f, d = !1) {\n const p = m * 2;\n if (Ce(p, a)) {\n const g = r[m + 6], y = a[p + 14];\n let w = 1 / 0, x = 1 / 0, _ = 1 / 0, b = -1 / 0, E = -1 / 0, A = -1 / 0;\n for (let P = 3 * g, C = 3 * (g + y); P < C; P++) {\n let D = n[P];\n const I = i.getX(D), T = i.getY(D), R = i.getZ(D);\n I < w && (w = I), I > b && (b = I), T < x && (x = T), T > E && (E = T), R < _ && (_ = R), R > A && (A = R);\n }\n return l[m + 0] !== w || l[m + 1] !== x || l[m + 2] !== _ || l[m + 3] !== b || l[m + 4] !== E || l[m + 5] !== A ? (l[m + 0] = w, l[m + 1] = x, l[m + 2] = _, l[m + 3] = b, l[m + 4] = E, l[m + 5] = A, !0) : !1;\n } else {\n const g = Pe(m), y = Re(m, r);\n let w = d, x = !1, _ = !1;\n if (e) {\n if (!w) {\n const D = g / Ae + f / Oe, I = y / Ae + f / Oe;\n x = e.has(D), _ = e.has(I), w = !x && !_;\n }\n } else\n x = !0, _ = !0;\n const b = w || x, E = w || _;\n let A = !1;\n b && (A = u(g, f, w));\n let P = !1;\n E && (P = u(y, f, w));\n const C = A || P;\n if (C)\n for (let D = 0; D < 3; D++) {\n const I = g + D, T = y + D, R = l[I], v = l[I + 3], z = l[T], H = l[T + 3];\n l[m + D] = R < z ? R : z, l[m + D + 3] = v > H ? v : H;\n }\n return C;\n }\n }\n}\nfunction Ot(o, e, t, n, i) {\n let s, r, a, l, h, c;\n const u = 1 / t.direction.x, m = 1 / t.direction.y, f = 1 / t.direction.z, d = t.origin.x, p = t.origin.y, g = t.origin.z;\n let y = e[o], w = e[o + 3], x = e[o + 1], _ = e[o + 3 + 1], b = e[o + 2], E = e[o + 3 + 2];\n return u >= 0 ? (s = (y - d) * u, r = (w - d) * u) : (s = (w - d) * u, r = (y - d) * u), m >= 0 ? (a = (x - p) * m, l = (_ - p) * m) : (a = (_ - p) * m, l = (x - p) * m), s > l || a > r || ((a > s || isNaN(s)) && (s = a), (l < r || isNaN(r)) && (r = l), f >= 0 ? (h = (b - g) * f, c = (E - g) * f) : (h = (E - g) * f, c = (b - g) * f), s > c || h > r) ? !1 : ((h > s || s !== s) && (s = h), (c < r || r !== r) && (r = c), s <= i && r >= n);\n}\nfunction qd(o, e, t, n, i, s, r, a) {\n const { geometry: l, _indirectBuffer: h } = o;\n for (let c = n, u = n + i; c < u; c++) {\n let m = h ? h[c] : c;\n ts(l, e, t, m, s, r, a);\n }\n}\nfunction Yd(o, e, t, n, i, s, r) {\n const { geometry: a, _indirectBuffer: l } = o;\n let h = 1 / 0, c = null;\n for (let u = n, m = n + i; u < m; u++) {\n let f;\n f = ts(a, e, t, l ? l[u] : u, null, s, r), f && f.distance < h && (c = f, h = f.distance);\n }\n return c;\n}\nfunction Kd(o, e, t, n, i, s, r) {\n const { geometry: a } = t, { index: l } = a, h = a.attributes.position;\n for (let c = o, u = e + o; c < u; c++) {\n let m;\n if (m = t.resolveTriangleIndex(c), be(r, m * 3, l, h), r.needsUpdate = !0, n(r, m, i, s))\n return !0;\n }\n return !1;\n}\nfunction $d(o, e, t, n, i, s, r) {\n ge.setBuffer(o._roots[e]), Qs(0, o, t, n, i, s, r), ge.clearBuffer();\n}\nfunction Qs(o, e, t, n, i, s, r) {\n const { float32Array: a, uint16Array: l, uint32Array: h } = ge, c = o * 2;\n if (Ce(c, l)) {\n const m = Ge(o, h), f = Ye(c, l);\n Gd(e, t, n, m, f, i, s, r);\n } else {\n const m = Pe(o);\n Ot(m, a, n, s, r) && Qs(m, e, t, n, i, s, r);\n const f = Re(o, h);\n Ot(f, a, n, s, r) && Qs(f, e, t, n, i, s, r);\n }\n}\nconst Jd = [\"x\", \"y\", \"z\"];\nfunction Qd(o, e, t, n, i, s) {\n ge.setBuffer(o._roots[e]);\n const r = er(0, o, t, n, i, s);\n return ge.clearBuffer(), r;\n}\nfunction er(o, e, t, n, i, s) {\n const { float32Array: r, uint16Array: a, uint32Array: l } = ge;\n let h = o * 2;\n if (Ce(h, a)) {\n const u = Ge(o, l), m = Ye(h, a);\n return Wd(e, t, n, u, m, i, s);\n } else {\n const u = yr(o, l), m = Jd[u], d = n.direction[m] >= 0;\n let p, g;\n d ? (p = Pe(o), g = Re(o, l)) : (p = Re(o, l), g = Pe(o));\n const w = Ot(p, r, n, i, s) ? er(p, e, t, n, i, s) : null;\n if (w) {\n const b = w.point[m];\n if (d ? b <= r[g + u] : (\n // min bounding data\n b >= r[g + u + 3]\n ))\n return w;\n }\n const _ = Ot(g, r, n, i, s) ? er(g, e, t, n, i, s) : null;\n return w && _ ? w.distance <= _.distance ? w : _ : w || _ || null;\n }\n}\nconst mi = /* @__PURE__ */ new ot(), on = /* @__PURE__ */ new $e(), an = /* @__PURE__ */ new $e(), Dn = /* @__PURE__ */ new Me(), wo = /* @__PURE__ */ new Be(), gi = /* @__PURE__ */ new Be();\nfunction ef(o, e, t, n) {\n ge.setBuffer(o._roots[e]);\n const i = tr(0, o, t, n);\n return ge.clearBuffer(), i;\n}\nfunction tr(o, e, t, n, i = null) {\n const { float32Array: s, uint16Array: r, uint32Array: a } = ge;\n let l = o * 2;\n if (i === null && (t.boundingBox || t.computeBoundingBox(), wo.set(t.boundingBox.min, t.boundingBox.max, n), i = wo), Ce(l, r)) {\n const c = e.geometry, u = c.index, m = c.attributes.position, f = t.index, d = t.attributes.position, p = Ge(o, a), g = Ye(l, r);\n if (Dn.copy(n).invert(), t.boundsTree)\n return we(o, s, gi), gi.matrix.copy(Dn), gi.needsUpdate = !0, t.boundsTree.shapecast({\n intersectsBounds: (w) => gi.intersectsBox(w),\n intersectsTriangle: (w) => {\n w.a.applyMatrix4(n), w.b.applyMatrix4(n), w.c.applyMatrix4(n), w.needsUpdate = !0;\n for (let x = p * 3, _ = (g + p) * 3; x < _; x += 3)\n if (be(an, x, u, m), an.needsUpdate = !0, w.intersectsTriangle(an))\n return !0;\n return !1;\n }\n });\n {\n const y = nn(t);\n for (let w = p * 3, x = (g + p) * 3; w < x; w += 3) {\n be(on, w, u, m), on.a.applyMatrix4(Dn), on.b.applyMatrix4(Dn), on.c.applyMatrix4(Dn), on.needsUpdate = !0;\n for (let _ = 0, b = y * 3; _ < b; _ += 3)\n if (be(an, _, f, d), an.needsUpdate = !0, on.intersectsTriangle(an))\n return !0;\n }\n }\n } else {\n const c = Pe(o), u = Re(o, a);\n return we(c, s, mi), !!(i.intersectsBox(mi) && tr(c, e, t, n, i) || (we(u, s, mi), i.intersectsBox(mi) && tr(u, e, t, n, i)));\n }\n}\nconst yi = /* @__PURE__ */ new Me(), xs = /* @__PURE__ */ new Be(), kn = /* @__PURE__ */ new Be(), tf = /* @__PURE__ */ new K(), nf = /* @__PURE__ */ new K(), sf = /* @__PURE__ */ new K(), rf = /* @__PURE__ */ new K();\nfunction of(o, e, t, n = {}, i = {}, s = 0, r = 1 / 0) {\n e.boundingBox || e.computeBoundingBox(), xs.set(e.boundingBox.min, e.boundingBox.max, t), xs.needsUpdate = !0;\n const a = o.geometry, l = a.attributes.position, h = a.index, c = e.attributes.position, u = e.index, m = qe.getPrimitive(), f = qe.getPrimitive();\n let d = tf, p = nf, g = null, y = null;\n i && (g = sf, y = rf);\n let w = 1 / 0, x = null, _ = null;\n return yi.copy(t).invert(), kn.matrix.copy(yi), o.shapecast(\n {\n boundsTraverseOrder: (b) => xs.distanceToBox(b),\n intersectsBounds: (b, E, A) => A < w && A < r ? (E && (kn.min.copy(b.min), kn.max.copy(b.max), kn.needsUpdate = !0), !0) : !1,\n intersectsRange: (b, E) => {\n if (e.boundsTree)\n return e.boundsTree.shapecast({\n boundsTraverseOrder: (P) => kn.distanceToBox(P),\n intersectsBounds: (P, C, D) => D < w && D < r,\n intersectsRange: (P, C) => {\n for (let D = P, I = P + C; D < I; D++) {\n be(f, 3 * D, u, c), f.a.applyMatrix4(t), f.b.applyMatrix4(t), f.c.applyMatrix4(t), f.needsUpdate = !0;\n for (let T = b, R = b + E; T < R; T++) {\n be(m, 3 * T, h, l), m.needsUpdate = !0;\n const v = m.distanceToTriangle(f, d, g);\n if (v < w && (p.copy(d), y && y.copy(g), w = v, x = T, _ = D), v < s)\n return !0;\n }\n }\n }\n });\n {\n const A = nn(e);\n for (let P = 0, C = A; P < C; P++) {\n be(f, 3 * P, u, c), f.a.applyMatrix4(t), f.b.applyMatrix4(t), f.c.applyMatrix4(t), f.needsUpdate = !0;\n for (let D = b, I = b + E; D < I; D++) {\n be(m, 3 * D, h, l), m.needsUpdate = !0;\n const T = m.distanceToTriangle(f, d, g);\n if (T < w && (p.copy(d), y && y.copy(g), w = T, x = D, _ = P), T < s)\n return !0;\n }\n }\n }\n }\n }\n ), qe.releasePrimitive(m), qe.releasePrimitive(f), w === 1 / 0 ? null : (n.point ? n.point.copy(p) : n.point = p.clone(), n.distance = w, n.faceIndex = x, i && (i.point ? i.point.copy(y) : i.point = y.clone(), i.point.applyMatrix4(yi), p.applyMatrix4(yi), i.distance = p.sub(i.point).length(), i.faceIndex = _), n);\n}\nfunction af(o, e = null) {\n e && Array.isArray(e) && (e = new Set(e));\n const t = o.geometry, n = t.index ? t.index.array : null, i = t.attributes.position;\n let s, r, a, l, h = 0;\n const c = o._roots;\n for (let m = 0, f = c.length; m < f; m++)\n s = c[m], r = new Uint32Array(s), a = new Uint16Array(s), l = new Float32Array(s), u(0, h), h += s.byteLength;\n function u(m, f, d = !1) {\n const p = m * 2;\n if (Ce(p, a)) {\n const g = r[m + 6], y = a[p + 14];\n let w = 1 / 0, x = 1 / 0, _ = 1 / 0, b = -1 / 0, E = -1 / 0, A = -1 / 0;\n for (let P = g, C = g + y; P < C; P++) {\n const D = 3 * o.resolveTriangleIndex(P);\n for (let I = 0; I < 3; I++) {\n let T = D + I;\n T = n ? n[T] : T;\n const R = i.getX(T), v = i.getY(T), z = i.getZ(T);\n R < w && (w = R), R > b && (b = R), v < x && (x = v), v > E && (E = v), z < _ && (_ = z), z > A && (A = z);\n }\n }\n return l[m + 0] !== w || l[m + 1] !== x || l[m + 2] !== _ || l[m + 3] !== b || l[m + 4] !== E || l[m + 5] !== A ? (l[m + 0] = w, l[m + 1] = x, l[m + 2] = _, l[m + 3] = b, l[m + 4] = E, l[m + 5] = A, !0) : !1;\n } else {\n const g = Pe(m), y = Re(m, r);\n let w = d, x = !1, _ = !1;\n if (e) {\n if (!w) {\n const D = g / Ae + f / Oe, I = y / Ae + f / Oe;\n x = e.has(D), _ = e.has(I), w = !x && !_;\n }\n } else\n x = !0, _ = !0;\n const b = w || x, E = w || _;\n let A = !1;\n b && (A = u(g, f, w));\n let P = !1;\n E && (P = u(y, f, w));\n const C = A || P;\n if (C)\n for (let D = 0; D < 3; D++) {\n const I = g + D, T = y + D, R = l[I], v = l[I + 3], z = l[T], H = l[T + 3];\n l[m + D] = R < z ? R : z, l[m + D + 3] = v > H ? v : H;\n }\n return C;\n }\n }\n}\nfunction lf(o, e, t, n, i, s, r) {\n ge.setBuffer(o._roots[e]), nr(0, o, t, n, i, s, r), ge.clearBuffer();\n}\nfunction nr(o, e, t, n, i, s, r) {\n const { float32Array: a, uint16Array: l, uint32Array: h } = ge, c = o * 2;\n if (Ce(c, l)) {\n const m = Ge(o, h), f = Ye(c, l);\n qd(e, t, n, m, f, i, s, r);\n } else {\n const m = Pe(o);\n Ot(m, a, n, s, r) && nr(m, e, t, n, i, s, r);\n const f = Re(o, h);\n Ot(f, a, n, s, r) && nr(f, e, t, n, i, s, r);\n }\n}\nconst cf = [\"x\", \"y\", \"z\"];\nfunction hf(o, e, t, n, i, s) {\n ge.setBuffer(o._roots[e]);\n const r = ir(0, o, t, n, i, s);\n return ge.clearBuffer(), r;\n}\nfunction ir(o, e, t, n, i, s) {\n const { float32Array: r, uint16Array: a, uint32Array: l } = ge;\n let h = o * 2;\n if (Ce(h, a)) {\n const u = Ge(o, l), m = Ye(h, a);\n return Yd(e, t, n, u, m, i, s);\n } else {\n const u = yr(o, l), m = cf[u], d = n.direction[m] >= 0;\n let p, g;\n d ? (p = Pe(o), g = Re(o, l)) : (p = Re(o, l), g = Pe(o));\n const w = Ot(p, r, n, i, s) ? ir(p, e, t, n, i, s) : null;\n if (w) {\n const b = w.point[m];\n if (d ? b <= r[g + u] : (\n // min bounding data\n b >= r[g + u + 3]\n ))\n return w;\n }\n const _ = Ot(g, r, n, i, s) ? ir(g, e, t, n, i, s) : null;\n return w && _ ? w.distance <= _.distance ? w : _ : w || _ || null;\n }\n}\nconst wi = /* @__PURE__ */ new ot(), ln = /* @__PURE__ */ new $e(), cn = /* @__PURE__ */ new $e(), In = /* @__PURE__ */ new Me(), xo = /* @__PURE__ */ new Be(), xi = /* @__PURE__ */ new Be();\nfunction uf(o, e, t, n) {\n ge.setBuffer(o._roots[e]);\n const i = sr(0, o, t, n);\n return ge.clearBuffer(), i;\n}\nfunction sr(o, e, t, n, i = null) {\n const { float32Array: s, uint16Array: r, uint32Array: a } = ge;\n let l = o * 2;\n if (i === null && (t.boundingBox || t.computeBoundingBox(), xo.set(t.boundingBox.min, t.boundingBox.max, n), i = xo), Ce(l, r)) {\n const c = e.geometry, u = c.index, m = c.attributes.position, f = t.index, d = t.attributes.position, p = Ge(o, a), g = Ye(l, r);\n if (In.copy(n).invert(), t.boundsTree)\n return we(o, s, xi), xi.matrix.copy(In), xi.needsUpdate = !0, t.boundsTree.shapecast({\n intersectsBounds: (w) => xi.intersectsBox(w),\n intersectsTriangle: (w) => {\n w.a.applyMatrix4(n), w.b.applyMatrix4(n), w.c.applyMatrix4(n), w.needsUpdate = !0;\n for (let x = p, _ = g + p; x < _; x++)\n if (be(cn, 3 * e.resolveTriangleIndex(x), u, m), cn.needsUpdate = !0, w.intersectsTriangle(cn))\n return !0;\n return !1;\n }\n });\n {\n const y = nn(t);\n for (let w = p, x = g + p; w < x; w++) {\n const _ = e.resolveTriangleIndex(w);\n be(ln, 3 * _, u, m), ln.a.applyMatrix4(In), ln.b.applyMatrix4(In), ln.c.applyMatrix4(In), ln.needsUpdate = !0;\n for (let b = 0, E = y * 3; b < E; b += 3)\n if (be(cn, b, f, d), cn.needsUpdate = !0, ln.intersectsTriangle(cn))\n return !0;\n }\n }\n } else {\n const c = Pe(o), u = Re(o, a);\n return we(c, s, wi), !!(i.intersectsBox(wi) && sr(c, e, t, n, i) || (we(u, s, wi), i.intersectsBox(wi) && sr(u, e, t, n, i)));\n }\n}\nconst _i = /* @__PURE__ */ new Me(), _s = /* @__PURE__ */ new Be(), Ln = /* @__PURE__ */ new Be(), df = /* @__PURE__ */ new K(), ff = /* @__PURE__ */ new K(), pf = /* @__PURE__ */ new K(), mf = /* @__PURE__ */ new K();\nfunction gf(o, e, t, n = {}, i = {}, s = 0, r = 1 / 0) {\n e.boundingBox || e.computeBoundingBox(), _s.set(e.boundingBox.min, e.boundingBox.max, t), _s.needsUpdate = !0;\n const a = o.geometry, l = a.attributes.position, h = a.index, c = e.attributes.position, u = e.index, m = qe.getPrimitive(), f = qe.getPrimitive();\n let d = df, p = ff, g = null, y = null;\n i && (g = pf, y = mf);\n let w = 1 / 0, x = null, _ = null;\n return _i.copy(t).invert(), Ln.matrix.copy(_i), o.shapecast(\n {\n boundsTraverseOrder: (b) => _s.distanceToBox(b),\n intersectsBounds: (b, E, A) => A < w && A < r ? (E && (Ln.min.copy(b.min), Ln.max.copy(b.max), Ln.needsUpdate = !0), !0) : !1,\n intersectsRange: (b, E) => {\n if (e.boundsTree) {\n const A = e.boundsTree;\n return A.shapecast({\n boundsTraverseOrder: (P) => Ln.distanceToBox(P),\n intersectsBounds: (P, C, D) => D < w && D < r,\n intersectsRange: (P, C) => {\n for (let D = P, I = P + C; D < I; D++) {\n const T = A.resolveTriangleIndex(D);\n be(f, 3 * T, u, c), f.a.applyMatrix4(t), f.b.applyMatrix4(t), f.c.applyMatrix4(t), f.needsUpdate = !0;\n for (let R = b, v = b + E; R < v; R++) {\n const z = o.resolveTriangleIndex(R);\n be(m, 3 * z, h, l), m.needsUpdate = !0;\n const H = m.distanceToTriangle(f, d, g);\n if (H < w && (p.copy(d), y && y.copy(g), w = H, x = R, _ = D), H < s)\n return !0;\n }\n }\n }\n });\n } else {\n const A = nn(e);\n for (let P = 0, C = A; P < C; P++) {\n be(f, 3 * P, u, c), f.a.applyMatrix4(t), f.b.applyMatrix4(t), f.c.applyMatrix4(t), f.needsUpdate = !0;\n for (let D = b, I = b + E; D < I; D++) {\n const T = o.resolveTriangleIndex(D);\n be(m, 3 * T, h, l), m.needsUpdate = !0;\n const R = m.distanceToTriangle(f, d, g);\n if (R < w && (p.copy(d), y && y.copy(g), w = R, x = D, _ = P), R < s)\n return !0;\n }\n }\n }\n }\n }\n ), qe.releasePrimitive(m), qe.releasePrimitive(f), w === 1 / 0 ? null : (n.point ? n.point.copy(p) : n.point = p.clone(), n.distance = w, n.faceIndex = x, i && (i.point ? i.point.copy(y) : i.point = y.clone(), i.point.applyMatrix4(_i), p.applyMatrix4(_i), i.distance = p.sub(i.point).length(), i.faceIndex = _), n);\n}\nfunction yf() {\n return typeof SharedArrayBuffer < \"u\";\n}\nconst Fn = /* @__PURE__ */ new ge.constructor(), ji = /* @__PURE__ */ new ge.constructor(), Rt = /* @__PURE__ */ new gr(() => new ot()), hn = /* @__PURE__ */ new ot(), un = /* @__PURE__ */ new ot(), vs = /* @__PURE__ */ new ot(), bs = /* @__PURE__ */ new ot();\nlet Ms = !1;\nfunction wf(o, e, t, n) {\n if (Ms)\n throw new Error(\"MeshBVH: Recursive calls to bvhcast not supported.\");\n Ms = !0;\n const i = o._roots, s = e._roots;\n let r, a = 0, l = 0;\n const h = new Me().copy(t).invert();\n for (let c = 0, u = i.length; c < u; c++) {\n Fn.setBuffer(i[c]), l = 0;\n const m = Rt.getPrimitive();\n we(0, Fn.float32Array, m), m.applyMatrix4(h);\n for (let f = 0, d = s.length; f < d && (ji.setBuffer(s[f]), r = et(\n 0,\n 0,\n t,\n h,\n n,\n a,\n l,\n 0,\n 0,\n m\n ), ji.clearBuffer(), l += s[f].byteLength / Oe, !r); f++)\n ;\n if (Rt.releasePrimitive(m), Fn.clearBuffer(), a += i[c].byteLength / Oe, r)\n break;\n }\n return Ms = !1, r;\n}\nfunction et(o, e, t, n, i, s = 0, r = 0, a = 0, l = 0, h = null, c = !1) {\n let u, m;\n c ? (u = ji, m = Fn) : (u = Fn, m = ji);\n const f = u.float32Array, d = u.uint32Array, p = u.uint16Array, g = m.float32Array, y = m.uint32Array, w = m.uint16Array, x = o * 2, _ = e * 2, b = Ce(x, p), E = Ce(_, w);\n let A = !1;\n if (E && b)\n c ? A = i(\n Ge(e, y),\n Ye(e * 2, w),\n Ge(o, d),\n Ye(o * 2, p),\n l,\n r + e / Ae,\n a,\n s + o / Ae\n ) : A = i(\n Ge(o, d),\n Ye(o * 2, p),\n Ge(e, y),\n Ye(e * 2, w),\n a,\n s + o / Ae,\n l,\n r + e / Ae\n );\n else if (E) {\n const P = Rt.getPrimitive();\n we(e, g, P), P.applyMatrix4(t);\n const C = Pe(o), D = Re(o, d);\n we(C, f, hn), we(D, f, un);\n const I = P.intersectsBox(hn), T = P.intersectsBox(un);\n A = I && et(\n e,\n C,\n n,\n t,\n i,\n r,\n s,\n l,\n a + 1,\n P,\n !c\n ) || T && et(\n e,\n D,\n n,\n t,\n i,\n r,\n s,\n l,\n a + 1,\n P,\n !c\n ), Rt.releasePrimitive(P);\n } else {\n const P = Pe(e), C = Re(e, y);\n we(P, g, vs), we(C, g, bs);\n const D = h.intersectsBox(vs), I = h.intersectsBox(bs);\n if (D && I)\n A = et(\n o,\n P,\n t,\n n,\n i,\n s,\n r,\n a,\n l + 1,\n h,\n c\n ) || et(\n o,\n C,\n t,\n n,\n i,\n s,\n r,\n a,\n l + 1,\n h,\n c\n );\n else if (D)\n if (b)\n A = et(\n o,\n P,\n t,\n n,\n i,\n s,\n r,\n a,\n l + 1,\n h,\n c\n );\n else {\n const T = Rt.getPrimitive();\n T.copy(vs).applyMatrix4(t);\n const R = Pe(o), v = Re(o, d);\n we(R, f, hn), we(v, f, un);\n const z = T.intersectsBox(hn), H = T.intersectsBox(un);\n A = z && et(\n P,\n R,\n n,\n t,\n i,\n r,\n s,\n l,\n a + 1,\n T,\n !c\n ) || H && et(\n P,\n v,\n n,\n t,\n i,\n r,\n s,\n l,\n a + 1,\n T,\n !c\n ), Rt.releasePrimitive(T);\n }\n else if (I)\n if (b)\n A = et(\n o,\n C,\n t,\n n,\n i,\n s,\n r,\n a,\n l + 1,\n h,\n c\n );\n else {\n const T = Rt.getPrimitive();\n T.copy(bs).applyMatrix4(t);\n const R = Pe(o), v = Re(o, d);\n we(R, f, hn), we(v, f, un);\n const z = T.intersectsBox(hn), H = T.intersectsBox(un);\n A = z && et(\n C,\n R,\n n,\n t,\n i,\n r,\n s,\n l,\n a + 1,\n T,\n !c\n ) || H && et(\n C,\n v,\n n,\n t,\n i,\n r,\n s,\n l,\n a + 1,\n T,\n !c\n ), Rt.releasePrimitive(T);\n }\n }\n return A;\n}\nconst vi = /* @__PURE__ */ new Be(), _o = /* @__PURE__ */ new ot(), xf = {\n strategy: Oa,\n maxDepth: 40,\n maxLeafTris: 10,\n useSharedArrayBuffer: !1,\n setBoundingBox: !0,\n onProgress: null,\n indirect: !1,\n verbose: !0,\n range: null\n};\nclass wr {\n static serialize(e, t = {}) {\n t = {\n cloneBuffers: !0,\n ...t\n };\n const n = e.geometry, i = e._roots, s = e._indirectBuffer, r = n.getIndex(), a = {\n version: 1,\n roots: null,\n index: null,\n indirectBuffer: null\n };\n return t.cloneBuffers ? (a.roots = i.map((l) => l.slice()), a.index = r ? r.array.slice() : null, a.indirectBuffer = s ? s.slice() : null) : (a.roots = i, a.index = r ? r.array : null, a.indirectBuffer = s), a;\n }\n static deserialize(e, t, n = {}) {\n n = {\n setIndex: !0,\n indirect: !!e.indirectBuffer,\n ...n\n };\n const { index: i, roots: s, indirectBuffer: r } = e;\n e.version || (console.warn(\n \"MeshBVH.deserialize: Serialization format has been changed and will be fixed up. It is recommended to regenerate any stored serialized data.\"\n ), l(s));\n const a = new wr(t, { ...n, [ms]: !0 });\n if (a._roots = s, a._indirectBuffer = r || null, n.setIndex) {\n const h = t.getIndex();\n if (h === null) {\n const c = new ut(e.index, 1, !1);\n t.setIndex(c);\n } else h.array !== i && (h.array.set(i), h.needsUpdate = !0);\n }\n return a;\n function l(h) {\n for (let c = 0; c < h.length; c++) {\n const u = h[c], m = new Uint32Array(u), f = new Uint16Array(u);\n for (let d = 0, p = u.byteLength / Oe; d < p; d++) {\n const g = Ae * d, y = 2 * g;\n Ce(y, f) || (m[g + 6] = m[g + 6] / Ae - d);\n }\n }\n }\n }\n get indirect() {\n return !!this._indirectBuffer;\n }\n constructor(e, t = {}) {\n if (e.isBufferGeometry) {\n if (e.index && e.index.isInterleavedBufferAttribute)\n throw new Error(\"MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.\");\n } else throw new Error(\"MeshBVH: Only BufferGeometries are supported.\");\n if (t = Object.assign({\n ...xf,\n // undocumented options\n // Whether to skip generating the tree. Used for deserialization.\n [ms]: !1\n }, t), t.useSharedArrayBuffer && !yf())\n throw new Error(\"MeshBVH: SharedArrayBuffer is not available.\");\n this.geometry = e, this._roots = null, this._indirectBuffer = null, t[ms] || (Ld(this, t), !e.boundingBox && t.setBoundingBox && (e.boundingBox = this.getBoundingBox(new ot()))), this.resolveTriangleIndex = t.indirect ? (n) => this._indirectBuffer[n] : (n) => n;\n }\n shiftTriangleOffsets(e) {\n const t = this._indirectBuffer;\n if (t)\n for (let n = 0, i = t.length; n < i; n++)\n t[n] += e;\n else {\n const n = this._roots;\n for (let i = 0; i < n.length; i++) {\n const s = n[i], r = new Uint32Array(s), a = new Uint16Array(s), l = s.byteLength / Oe;\n for (let h = 0; h < l; h++) {\n const c = Ae * h, u = 2 * c;\n Ce(u, a) && (r[c + 6] += e);\n }\n }\n }\n }\n refit(e = null) {\n return (this.indirect ? af : Zd)(this, e);\n }\n traverse(e, t = 0) {\n const n = this._roots[t], i = new Uint32Array(n), s = new Uint16Array(n);\n r(0);\n function r(a, l = 0) {\n const h = a * 2, c = Ce(h, s);\n if (c) {\n const u = i[a + 6], m = s[h + 14];\n e(l, c, new Float32Array(n, a * 4, 6), u, m);\n } else {\n const u = Pe(a), m = Re(a, i), f = yr(a, i);\n e(l, c, new Float32Array(n, a * 4, 6), f) || (r(u, l + 1), r(m, l + 1));\n }\n }\n }\n /* Core Cast Functions */\n raycast(e, t = Us, n = 0, i = 1 / 0) {\n const s = this._roots, r = [], a = this.indirect ? lf : $d;\n for (let l = 0, h = s.length; l < h; l++)\n a(this, l, t, e, r, n, i);\n return r;\n }\n raycastFirst(e, t = Us, n = 0, i = 1 / 0) {\n const s = this._roots;\n let r = null;\n const a = this.indirect ? hf : Qd;\n for (let l = 0, h = s.length; l < h; l++) {\n const c = a(this, l, t, e, n, i);\n c != null && (r == null || c.distance < r.distance) && (r = c);\n }\n return r;\n }\n intersectsGeometry(e, t) {\n let n = !1;\n const i = this._roots, s = this.indirect ? uf : ef;\n for (let r = 0, a = i.length; r < a && (n = s(this, r, e, t), !n); r++)\n ;\n return n;\n }\n shapecast(e) {\n const t = qe.getPrimitive(), n = this.indirect ? Kd : Xd;\n let {\n boundsTraverseOrder: i,\n intersectsBounds: s,\n intersectsRange: r,\n intersectsTriangle: a\n } = e;\n if (r && a) {\n const u = r;\n r = (m, f, d, p, g) => u(m, f, d, p, g) ? !0 : n(m, f, this, a, d, p, t);\n } else r || (a ? r = (u, m, f, d) => n(u, m, this, a, f, d, t) : r = (u, m, f) => f);\n let l = !1, h = 0;\n const c = this._roots;\n for (let u = 0, m = c.length; u < m; u++) {\n const f = c[u];\n if (l = Ud(this, u, s, r, i, h), l)\n break;\n h += f.byteLength / Oe;\n }\n return qe.releasePrimitive(t), l;\n }\n bvhcast(e, t, n) {\n let {\n intersectsRanges: i,\n intersectsTriangles: s\n } = n;\n const r = qe.getPrimitive(), a = this.geometry.index, l = this.geometry.attributes.position, h = this.indirect ? (d) => {\n const p = this.resolveTriangleIndex(d);\n be(r, p * 3, a, l);\n } : (d) => {\n be(r, d * 3, a, l);\n }, c = qe.getPrimitive(), u = e.geometry.index, m = e.geometry.attributes.position, f = e.indirect ? (d) => {\n const p = e.resolveTriangleIndex(d);\n be(c, p * 3, u, m);\n } : (d) => {\n be(c, d * 3, u, m);\n };\n if (s) {\n const d = (p, g, y, w, x, _, b, E) => {\n for (let A = y, P = y + w; A < P; A++) {\n f(A), c.a.applyMatrix4(t), c.b.applyMatrix4(t), c.c.applyMatrix4(t), c.needsUpdate = !0;\n for (let C = p, D = p + g; C < D; C++)\n if (h(C), r.needsUpdate = !0, s(r, c, C, A, x, _, b, E))\n return !0;\n }\n return !1;\n };\n if (i) {\n const p = i;\n i = function(g, y, w, x, _, b, E, A) {\n return p(g, y, w, x, _, b, E, A) ? !0 : d(g, y, w, x, _, b, E, A);\n };\n } else\n i = d;\n }\n return wf(this, e, t, i);\n }\n /* Derived Cast Functions */\n intersectsBox(e, t) {\n return vi.set(e.min, e.max, t), vi.needsUpdate = !0, this.shapecast(\n {\n intersectsBounds: (n) => vi.intersectsBox(n),\n intersectsTriangle: (n) => vi.intersectsTriangle(n)\n }\n );\n }\n intersectsSphere(e) {\n return this.shapecast(\n {\n intersectsBounds: (t) => e.intersectsBox(t),\n intersectsTriangle: (t) => t.intersectsSphere(e)\n }\n );\n }\n closestPointToGeometry(e, t, n = {}, i = {}, s = 0, r = 1 / 0) {\n return (this.indirect ? gf : of)(\n this,\n e,\n t,\n n,\n i,\n s,\n r\n );\n }\n closestPointToPoint(e, t = {}, n = 0, i = 1 / 0) {\n return Vd(\n this,\n e,\n t,\n n,\n i\n );\n }\n getBoundingBox(e) {\n return e.makeEmpty(), this._roots.forEach((n) => {\n we(0, new Float32Array(n), _o), e.union(_o);\n }), e;\n }\n}\nconst Va = 1e-6, _f = Va * 0.5, Ha = Math.pow(10, -Math.log10(Va)), vf = _f * Ha;\nfunction ht(o) {\n return ~~(o * Ha + vf);\n}\nfunction bf(o) {\n return `${ht(o.x)},${ht(o.y)}`;\n}\nfunction vo(o) {\n return `${ht(o.x)},${ht(o.y)},${ht(o.z)}`;\n}\nfunction Mf(o) {\n return `${ht(o.x)},${ht(o.y)},${ht(o.z)},${ht(o.w)}`;\n}\nfunction Sf(o, e, t) {\n t.direction.subVectors(e, o).normalize();\n const n = o.dot(t.direction);\n return t.origin.copy(o).addScaledVector(t.direction, -n), t;\n}\nfunction ja() {\n return typeof SharedArrayBuffer < \"u\";\n}\nfunction Tf(o) {\n if (o.buffer instanceof SharedArrayBuffer)\n return o;\n const e = o.constructor, t = o.buffer, n = new SharedArrayBuffer(t.byteLength), i = new Uint8Array(t);\n return new Uint8Array(n).set(i, 0), new e(n);\n}\nfunction Ef(o, e = ArrayBuffer) {\n return o > 65535 ? new Uint32Array(new e(4 * o)) : new Uint16Array(new e(2 * o));\n}\nfunction Af(o, e) {\n if (!o.index) {\n const t = o.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = Ef(t, n);\n o.setIndex(new ut(i, 1));\n for (let s = 0; s < t; s++)\n i[s] = s;\n }\n}\nfunction Cf(o) {\n return o.index ? o.index.count : o.attributes.position.count;\n}\nfunction xr(o) {\n return Cf(o) / 3;\n}\nconst Pf = 1e-8, Rf = new K();\nfunction Df(o) {\n return ~~(o / 3);\n}\nfunction kf(o) {\n return o % 3;\n}\nfunction bo(o, e) {\n return o.start - e.start;\n}\nfunction Mo(o, e) {\n return Rf.subVectors(e, o.origin).dot(o.direction);\n}\nfunction If(o, e, t, n = Pf) {\n o.sort(bo), e.sort(bo);\n for (let a = 0; a < o.length; a++) {\n const l = o[a];\n for (let h = 0; h < e.length; h++) {\n const c = e[h];\n if (!(c.start > l.end)) {\n if (l.end < c.start || c.end < l.start)\n continue;\n if (l.start <= c.start && l.end >= c.end)\n s(c.end, l.end) || o.splice(a + 1, 0, {\n start: c.end,\n end: l.end,\n index: l.index\n }), l.end = c.start, c.start = 0, c.end = 0;\n else if (l.start >= c.start && l.end <= c.end)\n s(l.end, c.end) || e.splice(h + 1, 0, {\n start: l.end,\n end: c.end,\n index: c.index\n }), c.end = l.start, l.start = 0, l.end = 0;\n else if (l.start <= c.start && l.end <= c.end) {\n const u = l.end;\n l.end = c.start, c.start = u;\n } else if (l.start >= c.start && l.end >= c.end) {\n const u = c.end;\n c.end = l.start, l.start = u;\n } else\n throw new Error();\n }\n if (t.has(l.index) || t.set(l.index, []), t.has(c.index) || t.set(c.index, []), t.get(l.index).push(c.index), t.get(c.index).push(l.index), r(c) && (e.splice(h, 1), h--), r(l)) {\n o.splice(a, 1), a--;\n break;\n }\n }\n }\n i(o), i(e);\n function i(a) {\n for (let l = 0; l < a.length; l++)\n r(a[l]) && (a.splice(l, 1), l--);\n }\n function s(a, l) {\n return Math.abs(l - a) < n;\n }\n function r(a) {\n return Math.abs(a.end - a.start) < n;\n }\n}\nconst So = 1e-5, To = 1e-4;\nclass Lf {\n constructor() {\n this._rays = [];\n }\n addRay(e) {\n this._rays.push(e);\n }\n findClosestRay(e) {\n const t = this._rays, n = e.clone();\n n.direction.multiplyScalar(-1);\n let i = 1 / 0, s = null;\n for (let l = 0, h = t.length; l < h; l++) {\n const c = t[l];\n if (r(c, e) && r(c, n))\n continue;\n const u = a(c, e), m = a(c, n), f = Math.min(u, m);\n f < i && (i = f, s = c);\n }\n return s;\n function r(l, h) {\n const c = l.origin.distanceTo(h.origin) > So;\n return l.direction.angleTo(h.direction) > To || c;\n }\n function a(l, h) {\n const c = l.origin.distanceTo(h.origin), u = l.direction.angleTo(h.direction);\n return c / So + u / To;\n }\n }\n}\nconst Ss = new K(), Ts = new K(), bi = new rr();\nfunction zf(o, e, t) {\n const n = o.attributes, i = o.index, s = n.position, r = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), l = Array.from(e), h = new Lf();\n for (let c = 0, u = l.length; c < u; c++) {\n const m = l[c], f = Df(m), d = kf(m);\n let p = 3 * f + d, g = 3 * f + (d + 1) % 3;\n i && (p = i.getX(p), g = i.getX(g)), Ss.fromBufferAttribute(s, p), Ts.fromBufferAttribute(s, g), Sf(Ss, Ts, bi);\n let y, w = h.findClosestRay(bi);\n w === null && (w = bi.clone(), h.addRay(w)), a.has(w) || a.set(w, {\n forward: [],\n reverse: [],\n ray: w\n }), y = a.get(w);\n let x = Mo(w, Ss), _ = Mo(w, Ts);\n x > _ && ([x, _] = [_, x]), bi.direction.dot(w.direction) < 0 ? y.reverse.push({ start: x, end: _, index: m }) : y.forward.push({ start: x, end: _, index: m });\n }\n return a.forEach(({ forward: c, reverse: u }, m) => {\n If(c, u, r, t), c.length === 0 && u.length === 0 && a.delete(m);\n }), {\n disjointConnectivityMap: r,\n fragmentMap: a\n };\n}\nconst Of = new ue(), Es = new K(), Bf = new en(), As = [\"\", \"\", \"\"];\nclass Nf {\n constructor(e = null) {\n this.data = null, this.disjointConnections = null, this.unmatchedDisjointEdges = null, this.unmatchedEdges = -1, this.matchedEdges = -1, this.useDrawRange = !0, this.useAllAttributes = !1, this.matchDisjointEdges = !1, this.degenerateEpsilon = 1e-8, e && this.updateFrom(e);\n }\n getSiblingTriangleIndex(e, t) {\n const n = this.data[e * 3 + t];\n return n === -1 ? -1 : ~~(n / 3);\n }\n getSiblingEdgeIndex(e, t) {\n const n = this.data[e * 3 + t];\n return n === -1 ? -1 : n % 3;\n }\n getDisjointSiblingTriangleIndices(e, t) {\n const n = e * 3 + t, i = this.disjointConnections.get(n);\n return i ? i.map((s) => ~~(s / 3)) : [];\n }\n getDisjointSiblingEdgeIndices(e, t) {\n const n = e * 3 + t, i = this.disjointConnections.get(n);\n return i ? i.map((s) => s % 3) : [];\n }\n isFullyConnected() {\n return this.unmatchedEdges === 0;\n }\n updateFrom(e) {\n const { useAllAttributes: t, useDrawRange: n, matchDisjointEdges: i, degenerateEpsilon: s } = this, r = t ? x : w, a = /* @__PURE__ */ new Map(), { attributes: l } = e, h = t ? Object.keys(l) : null, c = e.index, u = l.position;\n let m = xr(e);\n const f = m;\n let d = 0;\n n && (d = e.drawRange.start, e.drawRange.count !== 1 / 0 && (m = ~~(e.drawRange.count / 3)));\n let p = this.data;\n (!p || p.length < 3 * f) && (p = new Int32Array(3 * f)), p.fill(-1);\n let g = 0, y = /* @__PURE__ */ new Set();\n for (let _ = d, b = m * 3 + d; _ < b; _ += 3) {\n const E = _;\n for (let A = 0; A < 3; A++) {\n let P = E + A;\n c && (P = c.getX(P)), As[A] = r(P);\n }\n for (let A = 0; A < 3; A++) {\n const P = (A + 1) % 3, C = As[A], D = As[P], I = `${D}_${C}`;\n if (a.has(I)) {\n const T = E + A, R = a.get(I);\n p[T] = R, p[R] = T, a.delete(I), g += 2, y.delete(R);\n } else {\n const T = `${C}_${D}`, R = E + A;\n a.set(T, R), y.add(R);\n }\n }\n }\n if (i) {\n const {\n fragmentMap: _,\n disjointConnectivityMap: b\n } = zf(e, y, s);\n y.clear(), _.forEach(({ forward: E, reverse: A }) => {\n E.forEach(({ index: P }) => y.add(P)), A.forEach(({ index: P }) => y.add(P));\n }), this.unmatchedDisjointEdges = _, this.disjointConnections = b, g = m * 3 - y.size;\n }\n this.matchedEdges = g, this.unmatchedEdges = y.size, this.data = p;\n function w(_) {\n return Es.fromBufferAttribute(u, _), vo(Es);\n }\n function x(_) {\n let b = \"\";\n for (let E = 0, A = h.length; E < A; E++) {\n const P = l[h[E]];\n let C;\n switch (P.itemSize) {\n case 1:\n C = ht(P.getX(_));\n break;\n case 2:\n C = bf(Of.fromBufferAttribute(P, _));\n break;\n case 3:\n C = vo(Es.fromBufferAttribute(P, _));\n break;\n case 4:\n C = Mf(Bf.fromBufferAttribute(P, _));\n break;\n }\n b !== \"\" && (b += \"|\"), b += C;\n }\n return b;\n }\n }\n}\nclass Gi extends ar {\n constructor(...e) {\n super(...e), this.isBrush = !0, this._previousMatrix = new Me(), this._previousMatrix.elements.fill(0);\n }\n markUpdated() {\n this._previousMatrix.copy(this.matrix);\n }\n isDirty() {\n const { matrix: e, _previousMatrix: t } = this, n = e.elements, i = t.elements;\n for (let s = 0; s < 16; s++)\n if (n[s] !== i[s])\n return !0;\n return !1;\n }\n prepareGeometry() {\n const e = this.geometry, t = e.attributes, n = ja();\n if (n)\n for (const i in t) {\n const s = t[i];\n if (s.isInterleavedBufferAttribute)\n throw new Error(\"Brush: InterleavedBufferAttributes are not supported.\");\n s.array = Tf(s.array);\n }\n if (e.boundsTree || (Af(e, { useSharedArrayBuffer: n }), e.boundsTree = new wr(e, { maxLeafTris: 3, indirect: !0, useSharedArrayBuffer: n })), e.halfEdges || (e.halfEdges = new Nf(e)), !e.groupIndices) {\n const i = xr(e), s = new Uint16Array(i), r = e.groups;\n for (let a = 0, l = r.length; a < l; a++) {\n const { start: h, count: c } = r[a];\n for (let u = h / 3, m = (h + c) / 3; u < m; u++)\n s[u] = a;\n }\n e.groupIndices = s;\n }\n }\n disposeCacheData() {\n const { geometry: e } = this;\n e.halfEdges = null, e.boundsTree = null, e.groupIndices = null;\n }\n}\nconst Ff = 1e-14, Cs = new K(), Eo = new K(), Ao = new K();\nfunction Dt(o, e = Ff) {\n Cs.subVectors(o.b, o.a), Eo.subVectors(o.c, o.a), Ao.subVectors(o.b, o.c);\n const t = Cs.angleTo(Eo), n = Cs.angleTo(Ao), i = Math.PI - t - n;\n return Math.abs(t) < e || Math.abs(n) < e || Math.abs(i) < e || o.a.distanceToSquared(o.b) < e || o.a.distanceToSquared(o.c) < e || o.b.distanceToSquared(o.c) < e;\n}\nconst Ps = 1e-10, zn = 1e-10, Uf = 1e-10, pt = new Ke(), _e = new Ke(), mt = new K(), Rs = new K(), Co = new K(), Mi = new Xi(), Ds = new $e();\nclass Vf {\n constructor() {\n this._pool = [], this._index = 0;\n }\n getTriangle() {\n return this._index >= this._pool.length && this._pool.push(new Ue()), this._pool[this._index++];\n }\n clear() {\n this._index = 0;\n }\n reset() {\n this._pool.length = 0, this._index = 0;\n }\n}\nclass Hf {\n constructor() {\n this.trianglePool = new Vf(), this.triangles = [], this.normal = new K(), this.coplanarTriangleUsed = !1;\n }\n // initialize the class with a triangle\n initialize(e) {\n this.reset();\n const { triangles: t, trianglePool: n, normal: i } = this;\n if (Array.isArray(e))\n for (let s = 0, r = e.length; s < r; s++) {\n const a = e[s];\n if (s === 0)\n a.getNormal(i);\n else if (Math.abs(1 - a.getNormal(mt).dot(i)) > Ps)\n throw new Error(\"Triangle Splitter: Cannot initialize with triangles that have different normals.\");\n const l = n.getTriangle();\n l.copy(a), t.push(l);\n }\n else {\n e.getNormal(i);\n const s = n.getTriangle();\n s.copy(e), t.push(s);\n }\n }\n // Split the current set of triangles by passing a single triangle in. If the triangle is\n // coplanar it will attempt to split by the triangle edge planes\n splitByTriangle(e) {\n const { normal: t, triangles: n } = this;\n if (e.getNormal(Rs).normalize(), Math.abs(1 - Math.abs(Rs.dot(t))) < Uf) {\n this.coplanarTriangleUsed = !0;\n for (let s = 0, r = n.length; s < r; s++) {\n const a = n[s];\n a.coplanarCount = 0;\n }\n const i = [e.a, e.b, e.c];\n for (let s = 0; s < 3; s++) {\n const r = (s + 1) % 3, a = i[s], l = i[r];\n mt.subVectors(l, a).normalize(), Co.crossVectors(Rs, mt), Mi.setFromNormalAndCoplanarPoint(Co, a), this.splitByPlane(Mi, e);\n }\n } else\n e.getPlane(Mi), this.splitByPlane(Mi, e);\n }\n // Split the triangles by the given plan. If a triangle is provided then we ensure we\n // intersect the triangle before splitting the plane\n splitByPlane(e, t) {\n const { triangles: n, trianglePool: i } = this;\n Ds.copy(t), Ds.needsUpdate = !0;\n for (let s = 0, r = n.length; s < r; s++) {\n const a = n[s];\n if (!Ds.intersectsTriangle(a, pt, !0))\n continue;\n const { a: l, b: h, c } = a;\n let u = 0, m = -1, f = !1, d = [], p = [];\n const g = [l, h, c];\n for (let y = 0; y < 3; y++) {\n const w = (y + 1) % 3;\n pt.start.copy(g[y]), pt.end.copy(g[w]);\n const x = e.distanceToPoint(pt.start), _ = e.distanceToPoint(pt.end);\n if (Math.abs(x) < zn && Math.abs(_) < zn) {\n f = !0;\n break;\n }\n if (x > 0 ? d.push(y) : p.push(y), Math.abs(x) < zn)\n continue;\n let b = !!e.intersectLine(pt, mt);\n !b && Math.abs(_) < zn && (mt.copy(pt.end), b = !0), b && !(mt.distanceTo(pt.start) < Ps) && (mt.distanceTo(pt.end) < Ps && (m = y), u === 0 ? _e.start.copy(mt) : _e.end.copy(mt), u++);\n }\n if (!f && u === 2 && _e.distance() > zn)\n if (m !== -1) {\n m = (m + 1) % 3;\n let y = 0;\n y === m && (y = (y + 1) % 3);\n let w = y + 1;\n w === m && (w = (w + 1) % 3);\n const x = i.getTriangle();\n x.a.copy(g[w]), x.b.copy(_e.end), x.c.copy(_e.start), Dt(x) || n.push(x), a.a.copy(g[y]), a.b.copy(_e.start), a.c.copy(_e.end), Dt(a) && (n.splice(s, 1), s--, r--);\n } else {\n const y = d.length >= 2 ? p[0] : d[0];\n if (y === 0) {\n let E = _e.start;\n _e.start = _e.end, _e.end = E;\n }\n const w = (y + 1) % 3, x = (y + 2) % 3, _ = i.getTriangle(), b = i.getTriangle();\n g[w].distanceToSquared(_e.start) < g[x].distanceToSquared(_e.end) ? (_.a.copy(g[w]), _.b.copy(_e.start), _.c.copy(_e.end), b.a.copy(g[w]), b.b.copy(g[x]), b.c.copy(_e.start)) : (_.a.copy(g[x]), _.b.copy(_e.start), _.c.copy(_e.end), b.a.copy(g[w]), b.b.copy(g[x]), b.c.copy(_e.end)), a.a.copy(g[y]), a.b.copy(_e.end), a.c.copy(_e.start), Dt(_) || n.push(_), Dt(b) || n.push(b), Dt(a) && (n.splice(s, 1), s--, r--);\n }\n else u === 3 && console.warn(\"TriangleClipper: Coplanar clip not handled\");\n }\n }\n reset() {\n this.triangles.length = 0, this.trianglePool.clear(), this.coplanarTriangleUsed = !1;\n }\n}\nfunction jf(o) {\n return o = ~~o, o + 4 - o % 4;\n}\nclass Po {\n constructor(e, t = 500) {\n this.expansionFactor = 1.5, this.type = e, this.length = 0, this.array = null, this.setSize(t);\n }\n setType(e) {\n if (this.length !== 0)\n throw new Error(\"TypeBackedArray: Cannot change the type while there is used data in the buffer.\");\n const t = this.array.buffer;\n this.array = new e(t), this.type = e;\n }\n setSize(e) {\n if (this.array && e === this.array.length)\n return;\n const t = this.type, n = ja() ? SharedArrayBuffer : ArrayBuffer, i = new t(new n(jf(e * t.BYTES_PER_ELEMENT)));\n this.array && i.set(this.array, 0), this.array = i;\n }\n expand() {\n const { array: e, expansionFactor: t } = this;\n this.setSize(e.length * t);\n }\n push(...e) {\n let { array: t, length: n } = this;\n n + e.length > t.length && (this.expand(), t = this.array);\n for (let i = 0, s = e.length; i < s; i++)\n t[n + i] = e[i];\n this.length += e.length;\n }\n clear() {\n this.length = 0;\n }\n}\nclass Gf {\n constructor() {\n this.groupAttributes = [{}], this.groupCount = 0;\n }\n // returns the buffer type for the given attribute\n getType(e) {\n return this.groupAttributes[0][e].type;\n }\n getItemSize(e) {\n return this.groupAttributes[0][e].itemSize;\n }\n getNormalized(e) {\n return this.groupAttributes[0][e].normalized;\n }\n getCount(e) {\n if (this.groupCount <= e)\n return 0;\n const t = this.getGroupAttrArray(\"position\", e);\n return t.length / t.itemSize;\n }\n // returns the total length required for all groups for the given attribute\n getTotalLength(e) {\n const { groupCount: t, groupAttributes: n } = this;\n let i = 0;\n for (let s = 0; s < t; s++) {\n const r = n[s];\n i += r[e].length;\n }\n return i;\n }\n getGroupAttrSet(e = 0) {\n const { groupAttributes: t } = this;\n if (t[e])\n return this.groupCount = Math.max(this.groupCount, e + 1), t[e];\n const n = t[0];\n for (this.groupCount = Math.max(this.groupCount, e + 1); e >= t.length; ) {\n const i = {};\n t.push(i);\n for (const s in n) {\n const r = n[s], a = new Po(r.type);\n a.itemSize = r.itemSize, a.normalized = r.normalized, i[s] = a;\n }\n }\n return t[e];\n }\n // Get the raw array for the group set of data\n getGroupAttrArray(e, t = 0) {\n const { groupAttributes: n } = this;\n if (!n[0][e])\n throw new Error(`TypedAttributeData: Attribute with \"${e}\" has not been initialized`);\n return this.getGroupAttrSet(t)[e];\n }\n // initializes an attribute array with the given name, type, and size\n initializeArray(e, t, n, i) {\n const { groupAttributes: s } = this, a = s[0][e];\n if (a) {\n if (a.type !== t)\n for (let l = 0, h = s.length; l < h; l++) {\n const c = s[l][e];\n c.setType(t), c.itemSize = n, c.normalized = i;\n }\n } else\n for (let l = 0, h = s.length; l < h; l++) {\n const c = new Po(t);\n c.itemSize = n, c.normalized = i, s[l][e] = c;\n }\n }\n // Clear all the data\n clear() {\n this.groupCount = 0;\n const { groupAttributes: e } = this;\n e.forEach((t) => {\n for (const n in t)\n t[n].clear();\n });\n }\n // Remove the given key\n delete(e) {\n this.groupAttributes.forEach((t) => {\n delete t[e];\n });\n }\n // Reset the datasets completely\n reset() {\n this.groupAttributes = [], this.groupCount = 0;\n }\n}\nclass Ro {\n constructor() {\n this.intersectionSet = {}, this.ids = [];\n }\n add(e, t) {\n const { intersectionSet: n, ids: i } = this;\n n[e] || (n[e] = [], i.push(e)), n[e].push(t);\n }\n}\nconst Wf = 0, Xf = 1, Zf = 2, Ga = 3, qf = 4, Wa = 5, Xa = 6, Ze = new rr(), Do = new Me(), Le = new Ue(), gt = new K(), ko = new en(), Io = new en(), Lo = new en(), ks = new en(), Si = new en(), Ti = new en(), zo = new Ke(), Is = new K(), Ls = 1e-8, Yf = 1e-15, Zt = -1, qt = 1, zi = -2, Oi = 2, Un = 0, Wt = 1, _r = 2, Kf = 1e-14;\nlet Bi = null;\nfunction Oo(o) {\n Bi = o;\n}\nfunction Za(o, e) {\n o.getMidpoint(Ze.origin), o.getNormal(Ze.direction);\n const t = e.raycastFirst(Ze, qi);\n return !!(t && Ze.direction.dot(t.face.normal) > 0) ? Zt : qt;\n}\nfunction $f(o, e) {\n function t() {\n return Math.random() - 0.5;\n }\n o.getNormal(Is), Ze.direction.copy(Is), o.getMidpoint(Ze.origin);\n const n = 3;\n let i = 0, s = 1 / 0;\n for (let r = 0; r < n; r++) {\n Ze.direction.x += t() * Ls, Ze.direction.y += t() * Ls, Ze.direction.z += t() * Ls, Ze.direction.multiplyScalar(-1);\n const a = e.raycastFirst(Ze, qi);\n if (!!(a && Ze.direction.dot(a.face.normal) > 0) && i++, a !== null && (s = Math.min(s, a.distance)), s <= Yf)\n return a.face.normal.dot(Is) > 0 ? Oi : zi;\n if (i / n > 0.5 || (r - i + 1) / n > 0.5)\n break;\n }\n return i / n > 0.5 ? Zt : qt;\n}\nfunction Jf(o, e) {\n const t = new Ro(), n = new Ro();\n return Do.copy(o.matrixWorld).invert().multiply(e.matrixWorld), o.geometry.boundsTree.bvhcast(e.geometry.boundsTree, Do, {\n intersectsTriangles(i, s, r, a) {\n if (!Dt(i) && !Dt(s)) {\n let l = i.intersectsTriangle(s, zo, !0);\n if (!l) {\n const h = i.plane, c = s.plane, u = h.normal, m = c.normal;\n u.dot(m) === 1 && Math.abs(h.constant - c.constant) < Kf && (l = !0);\n }\n if (l) {\n let h = o.geometry.boundsTree.resolveTriangleIndex(r), c = e.geometry.boundsTree.resolveTriangleIndex(a);\n t.add(h, c), n.add(c, h), Bi && (Bi.addEdge(zo), Bi.addIntersectingTriangles(r, i, a, s));\n }\n }\n return !1;\n }\n }), { aIntersections: t, bIntersections: n };\n}\nfunction Qf(o, e, t, n, i, s, r = !1) {\n const a = t.attributes, l = t.index, h = o * 3, c = l.getX(h + 0), u = l.getX(h + 1), m = l.getX(h + 2);\n for (const f in s) {\n const d = a[f], p = s[f];\n if (!(f in a))\n throw new Error(`CSG Operations: Attribute ${f} not available on geometry.`);\n const g = d.itemSize;\n f === \"position\" ? (Le.a.fromBufferAttribute(d, c).applyMatrix4(n), Le.b.fromBufferAttribute(d, u).applyMatrix4(n), Le.c.fromBufferAttribute(d, m).applyMatrix4(n), zs(Le.a, Le.b, Le.c, e, 3, p, r)) : f === \"normal\" ? (Le.a.fromBufferAttribute(d, c).applyNormalMatrix(i), Le.b.fromBufferAttribute(d, u).applyNormalMatrix(i), Le.c.fromBufferAttribute(d, m).applyNormalMatrix(i), r && (Le.a.multiplyScalar(-1), Le.b.multiplyScalar(-1), Le.c.multiplyScalar(-1)), zs(Le.a, Le.b, Le.c, e, 3, p, r, !0)) : (ko.fromBufferAttribute(d, c), Io.fromBufferAttribute(d, u), Lo.fromBufferAttribute(d, m), zs(ko, Io, Lo, e, g, p, r));\n }\n}\nfunction ep(o, e, t, n, i, s, r, a = !1) {\n Os(o, n, i, s, r, a), Os(a ? t : e, n, i, s, r, a), Os(a ? e : t, n, i, s, r, a);\n}\nfunction qa(o, e, t = !1) {\n switch (o) {\n case Wf:\n if (e === qt || e === Oi && !t)\n return Wt;\n break;\n case Xf:\n if (t) {\n if (e === Zt)\n return Un;\n } else if (e === qt || e === zi)\n return Wt;\n break;\n case Zf:\n if (t) {\n if (e === qt || e === zi)\n return Wt;\n } else if (e === Zt)\n return Un;\n break;\n case qf:\n if (e === Zt)\n return Un;\n if (e === qt)\n return Wt;\n break;\n case Ga:\n if (e === Zt || e === Oi && !t)\n return Wt;\n break;\n case Wa:\n if (!t && (e === qt || e === zi))\n return Wt;\n break;\n case Xa:\n if (!t && (e === Zt || e === Oi))\n return Wt;\n break;\n default:\n throw new Error(`Unrecognized CSG operation enum \"${o}\".`);\n }\n return _r;\n}\nfunction zs(o, e, t, n, i, s, r = !1, a = !1) {\n const l = (h) => {\n s.push(h.x), i > 1 && s.push(h.y), i > 2 && s.push(h.z), i > 3 && s.push(h.w);\n };\n ks.set(0, 0, 0, 0).addScaledVector(o, n.a.x).addScaledVector(e, n.a.y).addScaledVector(t, n.a.z), Si.set(0, 0, 0, 0).addScaledVector(o, n.b.x).addScaledVector(e, n.b.y).addScaledVector(t, n.b.z), Ti.set(0, 0, 0, 0).addScaledVector(o, n.c.x).addScaledVector(e, n.c.y).addScaledVector(t, n.c.z), a && (ks.normalize(), Si.normalize(), Ti.normalize()), l(ks), r ? (l(Ti), l(Si)) : (l(Si), l(Ti));\n}\nfunction Os(o, e, t, n, i, s = !1) {\n for (const r in i) {\n const a = e[r], l = i[r];\n if (!(r in e))\n throw new Error(`CSG Operations: Attribute ${r} no available on geometry.`);\n const h = a.itemSize;\n r === \"position\" ? (gt.fromBufferAttribute(a, o).applyMatrix4(t), l.push(gt.x, gt.y, gt.z)) : r === \"normal\" ? (gt.fromBufferAttribute(a, o).applyNormalMatrix(n), s && gt.multiplyScalar(-1), l.push(gt.x, gt.y, gt.z)) : (l.push(a.getX(o)), h > 1 && l.push(a.getY(o)), h > 2 && l.push(a.getZ(o)), h > 3 && l.push(a.getW(o)));\n }\n}\nclass tp {\n constructor(e) {\n this.triangle = new Ue().copy(e), this.intersects = {};\n }\n addTriangle(e, t) {\n this.intersects[e] = new Ue().copy(t);\n }\n getIntersectArray() {\n const e = [], { intersects: t } = this;\n for (const n in t)\n e.push(t[n]);\n return e;\n }\n}\nclass Bo {\n constructor() {\n this.data = {};\n }\n addTriangleIntersection(e, t, n, i) {\n const { data: s } = this;\n s[e] || (s[e] = new tp(t)), s[e].addTriangle(n, i);\n }\n getTrianglesAsArray(e = null) {\n const { data: t } = this, n = [];\n if (e !== null)\n e in t && n.push(t[e].triangle);\n else\n for (const i in t)\n n.push(t[i].triangle);\n return n;\n }\n getTriangleIndices() {\n return Object.keys(this.data).map((e) => parseInt(e));\n }\n getIntersectionIndices(e) {\n const { data: t } = this;\n return t[e] ? Object.keys(t[e].intersects).map((n) => parseInt(n)) : [];\n }\n getIntersectionsAsArray(e = null, t = null) {\n const { data: n } = this, i = /* @__PURE__ */ new Set(), s = [], r = (a) => {\n if (n[a])\n if (t !== null)\n n[a].intersects[t] && s.push(n[a].intersects[t]);\n else {\n const l = n[a].intersects;\n for (const h in l)\n i.has(h) || (i.add(h), s.push(l[h]));\n }\n };\n if (e !== null)\n r(e);\n else\n for (const a in n)\n r(a);\n return s;\n }\n reset() {\n this.data = {};\n }\n}\nclass np {\n constructor() {\n this.enabled = !1, this.triangleIntersectsA = new Bo(), this.triangleIntersectsB = new Bo(), this.intersectionEdges = [];\n }\n addIntersectingTriangles(e, t, n, i) {\n const { triangleIntersectsA: s, triangleIntersectsB: r } = this;\n s.addTriangleIntersection(e, t, n, i), r.addTriangleIntersection(n, i, e, t);\n }\n addEdge(e) {\n this.intersectionEdges.push(e.clone());\n }\n reset() {\n this.triangleIntersectsA.reset(), this.triangleIntersectsB.reset(), this.intersectionEdges = [];\n }\n init() {\n this.enabled && (this.reset(), Oo(this));\n }\n complete() {\n this.enabled && Oo(null);\n }\n}\nconst It = new Me(), Wi = new Fl(), Xt = new Ue(), Ei = new Ue(), Pt = new Ue(), Ai = new Ue(), it = [], Jt = [];\nfunction ip(o) {\n for (const e of o) return e;\n}\nfunction sp(o, e, t, n, i, s = {}) {\n const { useGroups: r = !0 } = s, { aIntersections: a, bIntersections: l } = Jf(o, e), h = [];\n let c = null, u;\n return u = r ? 0 : -1, No(o, e, a, t, !1, n, i, u), Fo(o, e, a, t, !1, i, u), t.findIndex((f) => f !== Xa && f !== Wa) !== -1 && (u = r ? o.geometry.groups.length || 1 : -1, No(e, o, l, t, !0, n, i, u), Fo(e, o, l, t, !0, i, u)), it.length = 0, Jt.length = 0, {\n groups: h,\n materials: c\n };\n}\nfunction No(o, e, t, n, i, s, r, a = 0) {\n const l = o.matrixWorld.determinant() < 0;\n It.copy(e.matrixWorld).invert().multiply(o.matrixWorld), Wi.getNormalMatrix(o.matrixWorld).multiplyScalar(l ? -1 : 1);\n const h = o.geometry.groupIndices, c = o.geometry.index, u = o.geometry.attributes.position, m = e.geometry.boundsTree, f = e.geometry.index, d = e.geometry.attributes.position, p = t.ids, g = t.intersectionSet;\n for (let y = 0, w = p.length; y < w; y++) {\n const x = p[y], _ = a === -1 ? 0 : h[x] + a, b = 3 * x, E = c.getX(b + 0), A = c.getX(b + 1), P = c.getX(b + 2);\n Xt.a.fromBufferAttribute(u, E).applyMatrix4(It), Xt.b.fromBufferAttribute(u, A).applyMatrix4(It), Xt.c.fromBufferAttribute(u, P).applyMatrix4(It), s.reset(), s.initialize(Xt);\n const C = g[x];\n for (let I = 0, T = C.length; I < T; I++) {\n const R = 3 * C[I], v = f.getX(R + 0), z = f.getX(R + 1), H = f.getX(R + 2);\n Ei.a.fromBufferAttribute(d, v), Ei.b.fromBufferAttribute(d, z), Ei.c.fromBufferAttribute(d, H), s.splitByTriangle(Ei);\n }\n const D = s.triangles;\n for (let I = 0, T = D.length; I < T; I++) {\n const R = D[I], v = s.coplanarTriangleUsed ? $f(R, m) : Za(R, m);\n it.length = 0, Jt.length = 0;\n for (let z = 0, H = n.length; z < H; z++) {\n const V = qa(n[z], v, i);\n V !== _r && (Jt.push(V), it.push(r[z].getGroupAttrSet(_)));\n }\n if (it.length !== 0) {\n Xt.getBarycoord(R.a, Ai.a), Xt.getBarycoord(R.b, Ai.b), Xt.getBarycoord(R.c, Ai.c);\n for (let z = 0, H = it.length; z < H; z++) {\n const V = it[z], G = Jt[z] === Un;\n Qf(x, Ai, o.geometry, o.matrixWorld, Wi, V, l !== G);\n }\n }\n }\n }\n return p.length;\n}\nfunction Fo(o, e, t, n, i, s, r = 0) {\n const a = o.matrixWorld.determinant() < 0;\n It.copy(e.matrixWorld).invert().multiply(o.matrixWorld), Wi.getNormalMatrix(o.matrixWorld).multiplyScalar(a ? -1 : 1);\n const l = e.geometry.boundsTree, h = o.geometry.groupIndices, c = o.geometry.index, u = o.geometry.attributes, m = u.position, f = [], d = o.geometry.halfEdges, p = /* @__PURE__ */ new Set(), g = xr(o.geometry);\n for (let y = 0, w = g; y < w; y++)\n y in t.intersectionSet || p.add(y);\n for (; p.size > 0; ) {\n const y = ip(p);\n p.delete(y), f.push(y);\n const w = 3 * y, x = c.getX(w + 0), _ = c.getX(w + 1), b = c.getX(w + 2);\n Pt.a.fromBufferAttribute(m, x).applyMatrix4(It), Pt.b.fromBufferAttribute(m, _).applyMatrix4(It), Pt.c.fromBufferAttribute(m, b).applyMatrix4(It);\n const E = Za(Pt, l);\n Jt.length = 0, it.length = 0;\n for (let A = 0, P = n.length; A < P; A++) {\n const C = qa(n[A], E, i);\n C !== _r && (Jt.push(C), it.push(s[A]));\n }\n for (; f.length > 0; ) {\n const A = f.pop();\n for (let P = 0; P < 3; P++) {\n const C = d.getSiblingTriangleIndex(A, P);\n C !== -1 && p.has(C) && (f.push(C), p.delete(C));\n }\n if (it.length !== 0) {\n const P = 3 * A, C = c.getX(P + 0), D = c.getX(P + 1), I = c.getX(P + 2), T = r === -1 ? 0 : h[A] + r;\n if (Pt.a.fromBufferAttribute(m, C), Pt.b.fromBufferAttribute(m, D), Pt.c.fromBufferAttribute(m, I), !Dt(Pt))\n for (let R = 0, v = it.length; R < v; R++) {\n const z = Jt[R], H = it[R].getGroupAttrSet(T), V = z === Un;\n ep(C, D, I, u, o.matrixWorld, Wi, H, V !== a);\n }\n }\n }\n }\n}\nfunction rp(o) {\n for (let e = 0; e < o.length - 1; e++) {\n const t = o[e], n = o[e + 1];\n if (t.materialIndex === n.materialIndex) {\n const i = t.start, s = n.start + n.count;\n n.start = i, n.count = s - i, o.splice(e, 1), e--;\n }\n }\n}\nfunction op(o, e, t, n) {\n t.clear();\n const i = o.attributes;\n for (let s = 0, r = n.length; s < r; s++) {\n const a = n[s], l = i[a];\n t.initializeArray(a, l.array.constructor, l.itemSize, l.normalized);\n }\n for (const s in t.attributes)\n n.includes(s) || t.delete(s);\n for (const s in e.attributes)\n n.includes(s) || (e.deleteAttribute(s), e.dispose());\n}\nfunction ap(o, e, t) {\n let n = !1, i = -1;\n const s = o.attributes, r = e.groupAttributes[0];\n for (const l in r) {\n const h = e.getTotalLength(l), c = e.getType(l), u = e.getItemSize(l), m = e.getNormalized(l);\n let f = s[l];\n (!f || f.array.length < h) && (f = new ut(new c(h), u, m), o.setAttribute(l, f), n = !0);\n let d = 0;\n for (let p = 0, g = Math.min(t.length, e.groupCount); p < g; p++) {\n const y = t[p].index, { array: w, type: x, length: _ } = e.groupAttributes[y][l], b = new x(w.buffer, 0, _);\n f.array.set(b, d), d += b.length;\n }\n f.needsUpdate = !0, i = h / f.itemSize;\n }\n if (o.index) {\n const l = o.index.array;\n if (l.length < i)\n o.index = null, n = !0;\n else\n for (let h = 0, c = l.length; h < c; h++)\n l[h] = h;\n }\n let a = 0;\n o.clearGroups();\n for (let l = 0, h = Math.min(t.length, e.groupCount); l < h; l++) {\n const { index: c, materialIndex: u } = t[l], m = e.getCount(c);\n m !== 0 && (o.addGroup(a, m, u), a += m);\n }\n o.setDrawRange(0, i), o.boundsTree = null, n && o.dispose();\n}\nfunction Uo(o, e) {\n let t = e;\n return Array.isArray(e) || (t = [], o.forEach((n) => {\n t[n.materialIndex] = e;\n })), t;\n}\nclass lp {\n constructor() {\n this.triangleSplitter = new Hf(), this.attributeData = [], this.attributes = [\"position\", \"uv\", \"normal\"], this.useGroups = !0, this.consolidateGroups = !0, this.debug = new np();\n }\n getGroupRanges(e) {\n return !this.useGroups || e.groups.length === 0 ? [{ start: 0, count: 1 / 0, materialIndex: 0 }] : e.groups.map((t) => ({ ...t }));\n }\n evaluate(e, t, n, i = new Gi()) {\n let s = !0;\n if (Array.isArray(n) || (n = [n]), Array.isArray(i) || (i = [i], s = !1), i.length !== n.length)\n throw new Error(\"Evaluator: operations and target array passed as different sizes.\");\n e.prepareGeometry(), t.prepareGeometry();\n const {\n triangleSplitter: r,\n attributeData: a,\n attributes: l,\n useGroups: h,\n consolidateGroups: c,\n debug: u\n } = this;\n for (; a.length < i.length; )\n a.push(new Gf());\n i.forEach((y, w) => {\n op(e.geometry, y.geometry, a[w], l);\n }), u.init(), sp(e, t, n, r, a, { useGroups: h }), u.complete();\n const m = this.getGroupRanges(e.geometry), f = Uo(m, e.material), d = this.getGroupRanges(t.geometry), p = Uo(d, t.material);\n d.forEach((y) => y.materialIndex += f.length);\n let g = [...m, ...d].map((y, w) => ({ ...y, index: w }));\n if (h) {\n const y = [...f, ...p];\n c && (g = g.map((x) => {\n const _ = y[x.materialIndex];\n return x.materialIndex = y.indexOf(_), x;\n }).sort((x, _) => x.materialIndex - _.materialIndex));\n const w = [];\n for (let x = 0, _ = y.length; x < _; x++) {\n let b = !1;\n for (let E = 0, A = g.length; E < A; E++) {\n const P = g[E];\n P.materialIndex === x && (b = !0, P.materialIndex = w.length);\n }\n b && w.push(y[x]);\n }\n i.forEach((x) => {\n x.material = w;\n });\n } else\n g = [{ start: 0, count: 1 / 0, index: 0, materialIndex: 0 }], i.forEach((y) => {\n y.material = f[0];\n });\n return i.forEach((y, w) => {\n const x = y.geometry;\n ap(x, a[w], g), c && rp(x.groups);\n }), s ? i : i[0];\n }\n // TODO: fix\n evaluateHierarchy(e, t = new Gi()) {\n e.updateMatrixWorld(!0);\n const n = (s, r) => {\n const a = s.children;\n for (let l = 0, h = a.length; l < h; l++) {\n const c = a[l];\n c.isOperationGroup ? n(c, r) : r(c);\n }\n }, i = (s) => {\n const r = s.children;\n let a = !1;\n for (let h = 0, c = r.length; h < c; h++) {\n const u = r[h];\n a = i(u) || a;\n }\n const l = s.isDirty();\n if (l && s.markUpdated(), a && !s.isOperationGroup) {\n let h;\n return n(s, (c) => {\n h ? h = this.evaluate(h, c, c.operation) : h = this.evaluate(s, c, c.operation);\n }), s._cachedGeometry = h.geometry, s._cachedMaterials = h.material, !0;\n } else\n return a || l;\n };\n return i(e), t.geometry = e._cachedGeometry, t.material = e._cachedMaterials, t;\n }\n reset() {\n this.triangleSplitter.reset();\n }\n}\nclass cp {\n engine;\n planeObjects = [];\n planes = [];\n isActive = !1;\n evaluator;\n // 缓存相关\n geometryCache = /* @__PURE__ */ new Map();\n sectionMeshes = /* @__PURE__ */ new Map();\n planeGroup;\n planeSize = 1e3;\n sourceMeshes = /* @__PURE__ */ new Map();\n // 使用 Map 存储源网格\n planeThickness = 0.01;\n // 剖切平面盒子的厚度\n // 性能优化参数\n updateThrottleTime = 100;\n // 节流时间(ms)\n lastUpdateTime = 0;\n pendingUpdate = !1;\n updateTimer = null;\n // 缓存过期时间\n cacheExpireTime = 3e4;\n // 30秒\n // 平面变化检测\n planeStates = /* @__PURE__ */ new Map();\n constructor(e, t = {}) {\n this.engine = e, this.evaluator = new lp(), this.planeGroup = new M.Group(), this.planeGroup.name = \"CSG_ClippingPlanes_Optimized\", t.updateThrottleTime !== void 0 && (this.updateThrottleTime = t.updateThrottleTime), t.cacheExpireTime !== void 0 && (this.cacheExpireTime = t.cacheExpireTime), t.planeThickness !== void 0 && (this.planeThickness = t.planeThickness), this.evaluator.attributes = [\"position\", \"normal\"], this.evaluator.useGroups = !1;\n }\n /**\n * 初始化剖切补面系统\n */\n init() {\n this.calculateSceneSize(), this.engine.scene.add(this.planeGroup), this.planes.forEach((e, t) => {\n const n = this.createEmptySectionMesh(e, t);\n this.planeGroup.add(n), this.sectionMeshes.set(`plane_${t}`, n), this.planeObjects.push(n), this.planeStates.set(t, {\n constant: e.constant,\n normal: e.normal.clone()\n });\n });\n }\n /**\n * 创建空的剖切补面网格\n */\n createEmptySectionMesh(e, t) {\n const n = new M.BufferGeometry(), i = new M.MeshStandardMaterial({\n color: new M.Color(33023),\n metalness: 0.1,\n roughness: 0.75,\n side: M.DoubleSide,\n depthWrite: !0,\n depthTest: !0,\n clippingPlanes: this.planes.filter((r, a) => a !== t)\n }), s = new M.Mesh(n, i);\n return s.name = `CSG_Section_Optimized_${t}`, s.visible = !1, s.renderOrder = t + 1, s;\n }\n /**\n * 激活剖切补面\n */\n active() {\n this.isActive = !0, this.requestUpdate(), this.planeObjects.forEach((e) => {\n e.visible = !0;\n });\n }\n /**\n * 停用剖切补面\n */\n disActive() {\n this.isActive = !1, this.planeObjects.forEach((e) => {\n e.visible = !1;\n }), this.updateTimer && (clearTimeout(this.updateTimer), this.updateTimer = null);\n }\n /**\n * 设置需要剖切的源网格\n */\n setSourceMeshes(e) {\n this.sourceMeshes.clear(), e.forEach((t) => {\n const n = t.uuid;\n this.sourceMeshes.set(n, t);\n }), this.isActive && this.requestUpdate();\n }\n /**\n * 添加单个源网格\n */\n addSourceMesh(e) {\n const t = e.uuid;\n this.sourceMeshes.has(t) || (this.sourceMeshes.set(t, e), this.isActive && this.requestUpdate());\n }\n /**\n * 移除源网格\n */\n removeSourceMesh(e) {\n const t = e.uuid;\n this.sourceMeshes.delete(t) && (this.clearMeshCache(t), this.isActive && this.requestUpdate());\n }\n /**\n * 请求更新(带节流)\n */\n requestUpdate() {\n if (!this.isActive) return;\n const e = Date.now(), t = e - this.lastUpdateTime;\n t >= this.updateThrottleTime ? (this.lastUpdateTime = e, this.pendingUpdate = !1) : (this.pendingUpdate = !0, this.updateTimer && clearTimeout(this.updateTimer), this.updateTimer = setTimeout(() => {\n this.pendingUpdate && this.isActive && (this.lastUpdateTime = Date.now(), this.pendingUpdate = !1), this.updateTimer = null;\n }, this.updateThrottleTime - t));\n }\n /**\n * 更新所有剖切补面\n */\n updateAllSections() {\n this.isActive && (this.planes.forEach((e, t) => {\n if (Math.abs(e.constant) < 99999)\n this.hasPlaneChanged(t, e) && (this.updateSection(e, t), this.updatePlaneState(t, e));\n else {\n const n = this.sectionMeshes.get(`plane_${t}`);\n n && (n.visible = !1);\n }\n }), this.cleanExpiredCache());\n }\n /**\n * 检查平面是否变化\n */\n hasPlaneChanged(e, t) {\n const n = this.planeStates.get(e);\n if (!n) return !0;\n const i = Math.abs(n.constant - t.constant) > 1e-4, s = !n.normal.equals(t.normal);\n return i || s;\n }\n /**\n * 更新平面状态\n */\n updatePlaneState(e, t) {\n this.planeStates.set(e, {\n constant: t.constant,\n normal: t.normal.clone()\n });\n }\n /**\n * 生成平面哈希值(用于缓存键)\n */\n getPlaneHash(e) {\n const t = e.normal, n = e.constant;\n return `${t.x.toFixed(4)}_${t.y.toFixed(4)}_${t.z.toFixed(4)}_${n.toFixed(4)}`;\n }\n /**\n * 生成缓存键\n */\n getCacheKey(e, t) {\n return `${e}_plane_${t}`;\n }\n /**\n * 更新单个剖切面的补面(带缓存)\n */\n updateSection(e, t) {\n const n = this.sectionMeshes.get(`plane_${t}`);\n if (!n) return;\n const i = this.getPlaneHash(e), s = [];\n if (this.sourceMeshes.forEach((r, a) => {\n const l = this.getCacheKey(a, t), h = this.geometryCache.get(l);\n if (h && h.planeHash === i)\n s.push(h.geometry.clone()), h.timestamp = Date.now();\n else\n try {\n const c = this.createPlaneBrush(e), u = new Gi(r.geometry);\n r.updateMatrixWorld(!0), u.matrix.copy(r.matrixWorld), u.updateMatrixWorld();\n const m = this.evaluator.evaluate(c, u, Ga);\n m && m.geometry.attributes.position.count > 0 ? (s.push(m.geometry), this.geometryCache.set(l, {\n geometry: m.geometry.clone(),\n planeHash: i,\n timestamp: Date.now()\n })) : this.geometryCache.delete(l);\n } catch (c) {\n console.warn(`CSG intersection failed for mesh ${a}:`, c);\n }\n }), s.length > 0) {\n const r = this.mergeGeometries(s);\n n.geometry && n.geometry.dispose(), n.geometry = r, n.visible = !0, n.position.set(0, 0, 0), n.rotation.set(0, 0, 0), n.scale.set(1, 1, 1), n.updateMatrixWorld();\n } else\n n.visible = !1;\n s.forEach((r) => r.dispose());\n }\n /**\n * 清理指定网格的缓存\n */\n clearMeshCache(e) {\n const t = [];\n this.geometryCache.forEach((n, i) => {\n i.startsWith(e) && (n.geometry.dispose(), t.push(i));\n }), t.forEach((n) => this.geometryCache.delete(n));\n }\n /**\n * 清理过期缓存\n */\n cleanExpiredCache() {\n const e = Date.now(), t = [];\n this.geometryCache.forEach((n, i) => {\n e - n.timestamp > this.cacheExpireTime && (n.geometry.dispose(), t.push(i));\n }), t.forEach((n) => this.geometryCache.delete(n));\n }\n /**\n * 清理所有缓存\n */\n clearAllCache() {\n this.geometryCache.forEach((e) => {\n e.geometry.dispose();\n }), this.geometryCache.clear();\n }\n /**\n * 创建剖切平面的 Brush 对象\n * 使用极薄的盒子代替平面,以便正确进行 CSG 布尔运算\n */\n createPlaneBrush(e) {\n const t = new M.BoxGeometry(this.planeSize, this.planeThickness, this.planeSize);\n t.translate(0, e.constant, 0), t.applyQuaternion(new M.Quaternion().setFromUnitVectors(new M.Vector3(0, -1, 0), e.normal));\n const n = new M.Mesh(t), i = new Gi(t);\n return i.matrix.copy(n.matrixWorld), i.updateMatrixWorld(), i;\n }\n /**\n * 合并多个几何体\n */\n mergeGeometries(e) {\n if (e.length === 1)\n return e[0].clone();\n const t = new M.BufferGeometry(), n = [], i = [], s = [];\n let r = 0;\n return e.forEach((a) => {\n const l = a.attributes.position, h = a.attributes.normal;\n for (let c = 0; c < l.count; c++)\n n.push(l.getX(c), l.getY(c), l.getZ(c));\n if (h)\n for (let c = 0; c < h.count; c++)\n i.push(h.getX(c), h.getY(c), h.getZ(c));\n if (a.index)\n for (let c = 0; c < a.index.count; c++)\n s.push(a.index.getX(c) + r);\n r += l.count;\n }), t.setAttribute(\"position\", new M.Float32BufferAttribute(n, 3)), i.length > 0 ? t.setAttribute(\"normal\", new M.Float32BufferAttribute(i, 3)) : t.computeVertexNormals(), s.length > 0 && t.setIndex(s), t;\n }\n /**\n * 计算场景大小\n */\n calculateSceneSize() {\n const e = new M.Box3();\n if (this.engine.scene.traverse((t) => {\n if (t.isMesh && t.geometry) {\n const n = new M.Box3().setFromObject(t);\n e.union(n);\n }\n }), e.isEmpty())\n this.planeSize = 1e3;\n else {\n const t = e.getSize(new M.Vector3()), n = Math.max(t.x, t.y, t.z);\n this.planeSize = n * 3;\n }\n }\n /**\n * 更新(每帧调用)\n */\n update() {\n this.isActive && this.pendingUpdate && !this.updateTimer && this.requestUpdate();\n }\n /**\n * 清理资源\n */\n dispose() {\n this.updateTimer && (clearTimeout(this.updateTimer), this.updateTimer = null), this.clearAllCache(), this.planeObjects.forEach((e) => {\n e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((t) => t.dispose()) : e.material.dispose());\n }), this.sectionMeshes.clear(), this.planeObjects = [], this.sourceMeshes.clear(), this.planeGroup.parent && this.planeGroup.parent.remove(this.planeGroup);\n }\n /**\n * 设置补面材质颜色\n */\n setSectionColor(e) {\n this.planeObjects.forEach((t) => {\n t.material instanceof M.MeshStandardMaterial && t.material.color.set(e);\n });\n }\n /**\n * 获取缓存统计信息\n */\n getCacheStats() {\n return {\n cacheSize: this.geometryCache.size,\n sourceMeshCount: this.sourceMeshes.size,\n sectionMeshCount: this.sectionMeshes.size\n };\n }\n /**\n * 设置剖切平面的厚度\n * @param thickness 厚度值(建议 0.001 - 1.0)\n */\n setPlaneThickness(e) {\n if (e <= 0) {\n console.warn(\"Plane thickness must be positive\");\n return;\n }\n this.planeThickness = e, this.clearAllCache(), this.isActive && this.requestUpdate();\n }\n /**\n * 获取当前平面厚度\n */\n getPlaneThickness() {\n return this.planeThickness;\n }\n /**\n * 显示所有补面\n */\n showSections() {\n this.sectionMeshes.forEach((e) => {\n e.geometry?.attributes.position?.count && e.geometry.attributes.position.count > 0 && (e.visible = !0);\n });\n }\n /**\n * 隐藏所有补面\n */\n hideSections() {\n this.sectionMeshes.forEach((e) => {\n e.visible = !1;\n });\n }\n /**\n * 显示指定索引的补面\n * @param index 平面索引\n */\n showSection() {\n this.planeGroup.visible = !0;\n }\n /**\n * 隐藏指定索引的补面\n * @param index 平面索引\n */\n hideSection() {\n this.planeGroup.visible = !1;\n }\n /**\n * 切换所有补面的可见性\n * @returns 切换后的可见性状态\n */\n toggleSectionsVisibility() {\n let e = !1;\n return this.sectionMeshes.forEach((t) => {\n t.visible && (e = !0);\n }), e ? (this.hideSections(), !1) : (this.showSections(), !0);\n }\n /**\n * 切换指定索引补面的可见性\n * @param index 平面索引\n * @returns 切换后的可见性状态\n */\n toggleSectionVisibility(e) {\n const t = this.sectionMeshes.get(`plane_${e}`);\n return t ? (t.visible = !t.visible, t.visible) : !1;\n }\n}\nclass hp {\n engine;\n isActive = !1;\n box;\n pickPoint;\n pickNormal;\n pickMesh;\n box_;\n plane;\n meshs;\n isDrag = !1;\n maxBox;\n // CSG 剖切补面\n csgClipping = null;\n useCsgClipping = !1;\n // 是否使用 CSG 补面\n constructor(e, t) {\n this.engine = e, this.meshs = [], t?.useCsgClipping !== void 0 && (this.useCsgClipping = t.useCsgClipping), this.useCsgClipping && this.initCsgClipping();\n }\n /**\n * 初始化 CSG 剖切补面\n */\n initCsgClipping() {\n this.csgClipping = new cp(this.engine, {\n updateThrottleTime: 150,\n cacheExpireTime: 45e3\n }), this.csgClipping.planes = this.engine.sectionPlane, this.csgClipping.init();\n }\n active() {\n this.isActive || (this.engine.handelBehaved.init(this), this.engine.handelBehaved.active(), this.engine.scene.children.filter((e) => e.type == \"Group\" && e.name == \"ClippingBox\").forEach((e) => {\n e.children.forEach((t) => {\n t.name.includes(\"face\") || (t.visible = !0);\n });\n }), this.isActive = !0, this.init());\n }\n disActive() {\n this.init(), this.isActive = !1, this.engine.handelBehaved.disActive(), this.csgClipping && this.csgClipping.disActive(), this.engine.scene.children.filter((e) => e.type == \"Group\" && e.name == \"ClippingBox\").forEach((e) => {\n e.children.forEach((t) => {\n t.name.includes(\"face\") || (t.visible = !1);\n });\n }), this.engine.interactionModule.init(), this.engine.interactionModule.active();\n }\n // ********禁用*********\n disabled() {\n this.isActive = !1, this.engine.handelBehaved.disActive(), this.engine.interactionModule.init(), this.engine.interactionModule.active(), this.engine.scene.children.filter((e) => e.type == \"Group\" && e.name == \"ClippingBox\").forEach((e) => {\n e.children.forEach((t) => {\n t.name.includes(\"face\") || (t.visible = !1);\n });\n });\n }\n // *********恢复*********\n recover() {\n this.isActive || (this.engine.handelBehaved.init(this), this.engine.handelBehaved.active(), this.engine.scene.children.filter((e) => e.type == \"Group\" && e.name == \"ClippingBox\").forEach((e) => {\n e.children.forEach((t) => {\n t.name.includes(\"face\") || (t.visible = !0);\n });\n }), this.isActive = !0);\n }\n // 初始化\n init() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.maxBox = JSON.parse(JSON.stringify(e)), this.box = e, this.updata_face(e);\n }\n // 获取xyz值\n getboxXyz() {\n return {\n minX: this.box.min.x,\n minY: this.box.min.y,\n minZ: this.box.min.z,\n maxX: this.box.max.x,\n maxY: this.box.max.y,\n maxZ: this.box.max.z\n };\n }\n setboxXyz(e) {\n this.box.min.x = e.minX, this.box.min.y = e.minY, this.box.min.z = e.minZ, this.box.max.x = e.maxX, this.box.max.y = e.maxY, this.box.max.z = e.maxZ, this.updata_face(this.box);\n }\n // 设置剖切的box\n setBox(e) {\n this.box = e, this.updata_face(e);\n }\n // 反向剖切\n reverseBox() {\n }\n // 重写鼠标按下事件\n handleMouseDown(e) {\n this.isDrag = !0;\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0)\n if (this.pickPoint = t[0].point, this.pickNormal = t[0].face.normal, this.engine.controls.enabled = !1, this.pickMesh = t[0].object, this.box_ = {\n min: this.box.min.clone(),\n max: this.box.max.clone()\n }, this.pickNormal.y == 0) {\n const n = new M.Plane();\n n.setFromNormalAndCoplanarPoint(new M.Vector3(0, 1, 0), this.pickPoint), this.plane = n;\n } else {\n let n = new M.Vector3(this.engine.camera.position.x, this.pickPoint.y, this.engine.camera.position.z);\n const i = new M.Plane();\n i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint), this.plane = i;\n }\n }\n handleMouseUp(e) {\n this.isDrag = !1, this.pickPoint = null, this.pickNormal = null, this.pickMesh = null, this.engine.controls.enabled = !0, this.csgClipping && this.isActive;\n }\n handleMouseMove(e) {\n this.meshs.forEach((n) => {\n n.material.opacity = 0;\n });\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0 && (t[0].object.material.opacity = 0.05), this.pickPoint != null) {\n const n = new M.Vector3();\n if (e.raycaster.ray.intersectPlane(this.plane, n)) {\n let i = n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());\n this.pickMesh.name == \"前\" || this.pickMesh.name == \"左\" || this.pickMesh.name == \"底\" ? this.box.min = this.box_.min.clone().add(this.pickNormal.clone().setLength(i)) : this.box.max = this.box_.max.clone().add(this.pickNormal.clone().setLength(i)), this.updata_face(this.box), this.calculate_ratio();\n }\n }\n }\n // 计算比例\n calculate_ratio() {\n let e = this.maxBox.max.x - this.maxBox.min.x, t = this.maxBox.max.y - this.maxBox.min.y, n = this.maxBox.max.z - this.maxBox.min.z, i = (this.box.min.x - this.maxBox.min.x) / e * 100, s = (this.box.max.x - this.maxBox.min.x) / e * 100, r = (this.box.min.y - this.maxBox.min.y) / t * 100, a = (this.box.max.y - this.maxBox.min.y) / t * 100, l = (this.box.min.z - this.maxBox.min.z) / n * 100, h = (this.box.max.z - this.maxBox.min.z) / n * 100;\n i < 0 && (i = 0), s < 0 && (s = 0), r < 0 && (r = 0), a < 0 && (a = 0), l < 0 && (l = 0), h < 0 && (h = 0), i > 100 && (i = 100), s > 100 && (s = 100), r > 100 && (r = 100), a > 100 && (a = 100), l > 100 && (l = 100), h > 100 && (h = 100);\n let c = {\n x: {\n min: i,\n max: s\n },\n y: {\n min: r,\n max: a\n },\n z: {\n min: l,\n max: h\n }\n };\n this.engine.events.trigger(Se.SectionMove, c);\n }\n // 更新面\n updata_face(e) {\n let t = this, n = [\n new M.Vector3(e.min.x, e.min.y, e.min.z),\n new M.Vector3(e.max.x, e.min.y, e.min.z),\n new M.Vector3(e.max.x, e.max.y, e.min.z),\n new M.Vector3(e.min.x, e.max.y, e.min.z)\n ], i = [\n new M.Vector3(e.min.x, e.min.y, e.max.z),\n new M.Vector3(e.max.x, e.min.y, e.max.z),\n new M.Vector3(e.max.x, e.max.y, e.max.z),\n new M.Vector3(e.min.x, e.max.y, e.max.z)\n ], s = [\n new M.Vector3(e.max.x, e.min.y, e.max.z),\n new M.Vector3(e.max.x, e.min.y, e.min.z),\n new M.Vector3(e.max.x, e.max.y, e.min.z),\n new M.Vector3(e.max.x, e.max.y, e.max.z)\n ], r = [\n new M.Vector3(e.min.x, e.min.y, e.min.z),\n new M.Vector3(e.min.x, e.min.y, e.max.z),\n new M.Vector3(e.min.x, e.max.y, e.max.z),\n new M.Vector3(e.min.x, e.max.y, e.min.z)\n ], a = [\n new M.Vector3(e.min.x, e.max.y, e.min.z),\n new M.Vector3(e.max.x, e.max.y, e.min.z),\n new M.Vector3(e.max.x, e.max.y, e.max.z),\n new M.Vector3(e.min.x, e.max.y, e.max.z)\n ], l = [\n new M.Vector3(e.min.x, e.min.y, e.min.z),\n new M.Vector3(e.max.x, e.min.y, e.min.z),\n new M.Vector3(e.max.x, e.min.y, e.max.z),\n new M.Vector3(e.min.x, e.min.y, e.max.z)\n ];\n h(n, new M.Vector3(0, 0, -1), \"前\"), h(i, new M.Vector3(0, 0, 1), \"后\"), h(s, new M.Vector3(1, 0, 0), \"右\"), h(r, new M.Vector3(-1, 0, 0), \"左\"), h(a, new M.Vector3(0, 1, 0), \"顶\"), h(l, new M.Vector3(0, -1, 0), \"底\");\n function h(c, u, m) {\n const f = new M.BufferGeometry(), d = new Float32Array([\n c[0].x,\n c[0].y,\n c[0].z,\n // 点1\n c[1].x,\n c[1].y,\n c[1].z,\n // 点2\n c[2].x,\n c[2].y,\n c[2].z,\n // 点3\n c[3].x,\n c[3].y,\n c[3].z\n // 点4\n ]), p = [\n 0,\n 1,\n 2,\n // 第一个三角形\n 0,\n 2,\n 3\n // 第二个三角形\n ];\n f.setAttribute(\"position\", new M.BufferAttribute(d, 3)), f.setIndex(p);\n let g = t.engine.scene.children.find((E) => E.type == \"Group\" && E.name == \"ClippingBox\");\n g == null && (g = new M.Group(), g.name = \"ClippingBox\", t.engine.scene.add(g));\n let y = t.meshs.find((E) => E.name == m);\n if (y == null) {\n const E = new M.MeshBasicMaterial({\n color: 65280,\n // 绿色\n transparent: !0,\n opacity: 0,\n side: M.DoubleSide\n // 双面渲染\n });\n E.polygonOffset = !0, E.polygonOffsetFactor = 1, E.polygonOffsetUnits = 4;\n const A = new M.Mesh(f, E);\n A.normal = u, A.name = m, g.add(A), t.meshs.push(A);\n } else\n y.geometry = f;\n const w = new Float32Array([\n c[0].x,\n c[0].y,\n c[0].z,\n // 点1\n c[1].x,\n c[1].y,\n c[1].z,\n // 点2\n c[2].x,\n c[2].y,\n c[2].z,\n // 点3\n c[3].x,\n c[3].y,\n c[3].z,\n // 点4 \n c[0].x,\n c[0].y,\n c[0].z\n // 点1\n ]);\n let x = new M.LineBasicMaterial({ color: 255 }), _ = new M.BufferGeometry();\n _.setAttribute(\"position\", new M.BufferAttribute(w, 3));\n let b = t.meshs.find((E) => E.name == m + \"Line\");\n b == null && (b = new M.Line(_, x), b.name = m + \"Line\", g.add(b), t.meshs.push(b)), b.geometry = _, b.material = x, m == \"前\" || m == \"左\" || m == \"底\" ? t.engine.sectionPlane.find((E) => E.name == m).setFromNormalAndCoplanarPoint(u.clone().setLength(-1), e.min) : t.engine.sectionPlane.find((E) => E.name == m).setFromNormalAndCoplanarPoint(u.clone().setLength(-1), e.max), t.engine.scene.children.filter((E) => E.type == \"Mesh\" && E.url).forEach((E) => {\n E.material && Array.isArray(E.material) ? E.material.forEach((A) => {\n A.clippingPlanes = t.engine.sectionPlane;\n }) : E.material.clippingPlanes = t.engine.sectionPlane;\n });\n }\n }\n}\nclass up {\n engine;\n isActive = !1;\n isDrag = !1;\n meshs = [];\n box;\n pickPoint;\n pickNormal;\n pickMesh;\n box_;\n plane;\n angleX = 0;\n angleY = 0;\n angleZ = 0;\n direction = 1;\n normal = new M.Vector3(0, 0, 1);\n distance = 0;\n center = null;\n current_center = null;\n constructor(e) {\n this.engine = e, this.meshs = [], this.box = null;\n }\n // 启动\n active() {\n if (this.isActive == !0)\n return;\n this.isActive = !0, this.engine.scene.children.filter((t) => t.type == \"Group\" && t.name == \"ClippingBox\").forEach((t) => {\n t.children.forEach((n) => {\n n.name.includes(\"face\") && (n.visible = !0);\n });\n }), this.engine.handelBehaved.init(this), this.engine.handelBehaved.active();\n let e = this;\n e.engine.scene.children.filter((t) => t.type == \"Mesh\" && t.url).forEach((t) => {\n t.material && Array.isArray(t.material) ? t.material.forEach((n) => {\n n.clippingPlanes = e.engine.sectionPlane;\n }) : t.material.clippingPlanes = e.engine.sectionPlane, e.engine.clipping.clippingStencil?.addMesh(e.engine.sectionPlane.find((n) => n.name == \"face\"), t);\n }), this.init();\n }\n disActive() {\n this.init(), this.isActive = !1, this.engine.handelBehaved.disActive();\n const e = this.engine.sectionPlane.find((t) => t.name == \"face\");\n e && (e.constant = 1e5), this.engine.scene.children.filter((t) => t.type == \"Group\" && t.name == \"ClippingBox\").forEach((t) => {\n t.children.forEach((n) => {\n n.name.includes(\"face\") && (n.visible = !1);\n });\n });\n }\n // 初始化\n init() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.box = e, this.updata_face(0);\n }\n // ********禁用*********\n disabled() {\n this.isActive = !1, this.engine.handelBehaved.disActive(), this.engine.interactionModule.init(), this.engine.interactionModule.active(), this.engine.scene.children.filter((e) => e.type == \"Group\" && e.name == \"ClippingBox\").forEach((e) => {\n e.children.forEach((t) => {\n t.name.includes(\"face\") && (t.visible = !1);\n });\n });\n }\n // *********恢复*********\n recover() {\n this.isActive || (this.engine.handelBehaved.init(this), this.engine.handelBehaved.active(), this.engine.scene.children.filter((e) => e.type == \"Group\" && e.name == \"ClippingBox\").forEach((e) => {\n e.children.forEach((t) => {\n t.name.includes(\"face\") && (t.visible = !0);\n });\n }), this.isActive = !0);\n }\n // 设置面的角度和方向\n setFaceAngle(e, t, n) {\n this.angleX = e, this.angleY = t, this.angleZ = n, this.normal = new M.Vector3(0, 1, 0).applyAxisAngle(new M.Vector3(1, 0, 0), e).applyAxisAngle(new M.Vector3(0, 0, 1), t).applyAxisAngle(new M.Vector3(0, 1, 0), n), this.normal.normalize(), this.updata_face(0);\n }\n // 设置法向量\n setFaceNormal(e, t = 0) {\n this.normal = e, this.distance = t, this.updata_face(t);\n }\n reverse() {\n this.direction = this.direction * -1, this.updata_face(this.distance);\n }\n // 获取旋转角度\n getFaceAngle() {\n return {\n angleX: this.angleX,\n angleY: this.angleY,\n angleZ: this.angleZ,\n direction: this.direction\n };\n }\n // 更新面\n updata_face(e) {\n let t = this, n = t.engine.scene.children.find((C) => C.type == \"Group\" && C.name == \"ClippingBox\");\n n == null && (n = new M.Group(), n.name = \"ClippingBox\", t.engine.scene.add(n));\n let i = new M.Vector3(1, 0, 0), s = new M.Vector3(0, 1, 0), r = new M.Vector3(0, 0, 1), a, l, h = this.normal.clone().normalize(), c = Math.abs(h.dot(i)), u = Math.abs(h.dot(s)), m = Math.abs(h.dot(r));\n c <= u && c <= m ? a = i : u <= c && u <= m ? a = s : a = r, a = a.clone().sub(h.clone().multiplyScalar(a.dot(h))).normalize(), l = new M.Vector3().crossVectors(h, a).normalize();\n let f = null;\n this.center == null ? (f = new M.Vector3(\n (this.box.min.x + this.box.max.x) / 2,\n (this.box.min.y + this.box.max.y) / 2,\n (this.box.min.z + this.box.max.z) / 2\n ), this.center = f.clone()) : f = this.center.clone();\n let d = this.box.max.x - this.box.min.x, p = this.box.max.y - this.box.min.y, g = this.box.max.z - this.box.min.z, y = Math.max(\n Math.abs(a.x) * d,\n Math.abs(a.y) * p,\n Math.abs(a.z) * g\n ), w = Math.max(\n Math.abs(l.x) * d,\n Math.abs(l.y) * p,\n Math.abs(l.z) * g\n ), x = f.clone().add(a.clone().multiplyScalar(-y / 2)).add(l.clone().multiplyScalar(-w / 2)), _ = f.clone().add(a.clone().multiplyScalar(y / 2)).add(l.clone().multiplyScalar(-w / 2)), b = f.clone().add(a.clone().multiplyScalar(y / 2)).add(l.clone().multiplyScalar(w / 2)), E = f.clone().add(a.clone().multiplyScalar(-y / 2)).add(l.clone().multiplyScalar(w / 2));\n x.add(h.clone().multiplyScalar(e)), _.add(h.clone().multiplyScalar(e)), b.add(h.clone().multiplyScalar(e)), E.add(h.clone().multiplyScalar(e)), this.current_center = f.clone().add(h.clone().multiplyScalar(e)), P([x, _, b, E], h, \"face\");\n function P(C, D, I) {\n const T = new M.BufferGeometry(), R = new Float32Array([\n C[0].x,\n C[0].y,\n C[0].z,\n // 点1\n C[1].x,\n C[1].y,\n C[1].z,\n // 点2\n C[2].x,\n C[2].y,\n C[2].z,\n // 点3\n C[3].x,\n C[3].y,\n C[3].z\n // 点4\n ]), v = [\n 0,\n 1,\n 2,\n // 第一个三角形\n 0,\n 2,\n 3\n // 第二个三角形\n ];\n T.setAttribute(\"position\", new M.BufferAttribute(R, 3)), T.setIndex(v);\n let z = t.meshs.find(($) => $.name == I);\n if (z == null) {\n const $ = new M.MeshBasicMaterial({\n color: 65280,\n // 绿色\n transparent: !0,\n opacity: 0.02,\n side: M.DoubleSide\n // 双面渲染\n });\n $.polygonOffset = !0, $.polygonOffsetFactor = 1, $.polygonOffsetUnits = 4;\n const N = new M.Mesh(T, $);\n N.normal = D, N.name = I, n.add(N), t.meshs.push(N);\n } else\n z.geometry = T;\n const H = new Float32Array([\n C[0].x,\n C[0].y,\n C[0].z,\n // 点1\n C[1].x,\n C[1].y,\n C[1].z,\n // 点2\n C[2].x,\n C[2].y,\n C[2].z,\n // 点3\n C[3].x,\n C[3].y,\n C[3].z,\n // 点4 \n C[0].x,\n C[0].y,\n C[0].z\n // 点1\n ]);\n let V = new M.LineBasicMaterial({ color: 255 }), te = new M.BufferGeometry();\n te.setAttribute(\"position\", new M.BufferAttribute(H, 3));\n let G = t.meshs.find(($) => $.name == I + \"Line\");\n G == null && (G = new M.Line(te, V), G.name = I + \"Line\", n.add(G), t.meshs.push(G)), G.geometry = te, G.material = V, t.engine.sectionPlane.find(($) => $.name == I).setFromNormalAndCoplanarPoint(D.clone().setLength(t.direction), C[0]);\n }\n }\n // 重写鼠标按下事件\n handleMouseDown(e) {\n this.isDrag = !0;\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0)\n if (this.pickPoint = t[0].point, this.pickNormal = t[0].face.normal, this.engine.controls.enabled = !1, this.pickMesh = t[0].object, this.box_ = {\n min: this.box.min.clone(),\n max: this.box.max.clone()\n }, this.center = this.current_center.clone(), this.pickNormal.y == 0) {\n const n = new M.Plane();\n n.setFromNormalAndCoplanarPoint(new M.Vector3(0, 1, 0), this.pickPoint), this.plane = n;\n } else {\n let n = new M.Vector3(this.engine.camera.position.x, this.pickPoint.y, this.engine.camera.position.z);\n const i = new M.Plane();\n i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint), this.plane = i;\n }\n }\n handleMouseUp(e) {\n this.isDrag = !1, this.pickPoint = null, this.pickNormal = null, this.pickMesh = null, this.engine.controls.enabled = !0;\n }\n handleMouseMove(e) {\n this.meshs.forEach((n) => {\n n.material.opacity = 0;\n });\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0 && (t[0].object.material.opacity = 0.05), this.pickPoint != null) {\n const n = new M.Vector3();\n if (e.raycaster.ray.intersectPlane(this.plane, n)) {\n let i = n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());\n this.distance = i, this.updata_face(this.distance);\n }\n }\n }\n}\nclass dp {\n engine;\n callback_;\n constructor(e) {\n this.engine = e;\n }\n init() {\n this.engine.handelBehaved.init(this, { showCatch: !0 }), this.engine.handelBehaved.active();\n }\n // 选择面,用于面的剖切\n catch_face(e) {\n this.callback_ = e;\n }\n // 鼠标移动\n handleMouseMove(e) {\n }\n // 鼠标按下\n handleMouseClick(e) {\n let t = e.catch.normal;\n this.engine.handelBehaved.disActive(), this.callback_({\n dir: t,\n position: e.catch.point\n });\n }\n}\nclass fp {\n engine;\n sectionBox;\n sectionFace;\n clippingStencil;\n currentClippingMode = \"\";\n constructor(e) {\n this.engine = e;\n let t = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n t.name = \"前\";\n let n = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n n.name = \"左\";\n let i = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n i.name = \"后\";\n let s = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n s.name = \"右\";\n let r = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n r.name = \"顶\";\n let a = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n a.name = \"底\";\n let l = new M.Plane(new M.Vector3(0, 0, 1), 1e5);\n l.name = \"face\", this.engine.sectionPlane = [t, n, i, s, r, a, l];\n }\n init() {\n this.sectionBox = new hp(this.engine), this.sectionFace = new up(this.engine);\n }\n // 自动缩放适用的视图比例\n scaleBox() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.sectionBox.setBox(e);\n }\n // ****************************剖切指定摸******************************* \n clippingModel(e) {\n let t = [];\n e.forEach((s) => {\n let r = this.engine.models.find((a) => a.url === s.url);\n s.ids.forEach((a) => {\n r.nodesMap.get(a).infos.forEach((l) => {\n t.push(l.box);\n });\n });\n }), this.active(\"box\");\n let n = i(t);\n this.sectionBox.setBox(n);\n function i(s) {\n let r = new M.Vector3(1e8, 1e9, 1e10), a = new M.Vector3(-1e8, -1e9, -1e10);\n return s.forEach((l) => {\n l.min.x < r.x && (r.x = l.min.x), l.min.y < r.y && (r.y = l.min.y), l.min.z < r.z && (r.z = l.min.z), l.max.x > a.x && (a.x = l.max.x), l.max.y > a.y && (a.y = l.max.y), l.max.z > a.z && (a.z = l.max.z);\n }), new M.Box3(r, a);\n }\n }\n // ****************************更新剖切值*******************************\n updateClippingValue(e) {\n let t = this.sectionBox.maxBox, n = t.min.x + (t.max.x - t.min.x) * e.x.min * 0.01, i = t.min.y + (t.max.y - t.min.y) * e.y.min * 0.01, s = t.min.z + (t.max.z - t.min.z) * e.z.min * 0.01, r = t.min.x + (t.max.x - t.min.x) * e.x.max * 0.01, a = t.min.y + (t.max.y - t.min.y) * e.y.max * 0.01, l = t.min.z + (t.max.z - t.min.z) * e.z.max * 0.01;\n this.sectionBox.setboxXyz({\n minX: n,\n minY: i,\n minZ: s,\n maxX: r,\n maxY: a,\n maxZ: l\n });\n }\n // *********************************切换剖切模式*********************************** //\n active(e) {\n if (this.sectionFace.disActive(), this.sectionBox.disActive(), this.currentClippingMode = e, e == \"x\")\n this.sectionFace.init(), this.sectionFace.active(), this.sectionFace.setFaceAngle(Math.PI / 2, 0, 0);\n else if (e == \"y\")\n this.sectionFace.init(), this.sectionFace.active(), this.sectionFace.setFaceAngle(0, Math.PI / 2, 0);\n else if (e == \"z\")\n this.sectionFace.init(), this.sectionFace.active(), this.sectionFace.setFaceAngle(0, 0, Math.PI / 2);\n else if (e == \"box\")\n this.sectionBox.init(), this.sectionBox.active();\n else if (e == \"face\") {\n let t = new dp(this.engine);\n t.init(), t.catch_face((n) => {\n this.sectionFace.init(), this.sectionFace.active();\n let i = this.engine.octreeBox.getBoundingBox(), s = n.position.clone().sub(i.min.clone().add(i.max.clone()).setLength(0.5)), r = new M.Vector3(n.dir.x, n.dir.y, n.dir.z), a = s.dot(r);\n this.sectionFace.setFaceNormal(n.dir, a);\n });\n }\n }\n // *********************************禁用剖切*********************************\n disabled() {\n this.currentClippingMode == \"box\" ? this.sectionBox.disabled() : this.sectionFace.disabled();\n }\n // ****************************恢复剖切*********************************\n recover() {\n this.currentClippingMode == \"box\" ? this.sectionBox.recover() : this.sectionFace.recover();\n }\n // ****************************反向剖切*********************************\n reverse() {\n this.sectionFace.reverse();\n }\n // 整体禁用\n disActive() {\n this.sectionFace.disActive(), this.sectionBox.disActive(), this.currentClippingMode = \"\";\n }\n}\nclass pp {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 获取轴网的模型树\n getLevelTreeData() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n e.push({\n children: t.info.modelTree.modelTreeLevel,\n name: t.info.baseInfo.name,\n url: t.url\n });\n }), e;\n }\n // 获取类型的模型树\n getTypeTreeData() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n e.push({\n children: t.info.modelTree.modelTreeType,\n name: t.info.baseInfo.name,\n url: t.url\n });\n }), e;\n }\n // 获取专业的模型树\n getMajorTreeData() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n e.push({\n children: t.info.modelTree.modelTreeMajor,\n name: t.info.baseInfo.name,\n url: t.url\n });\n }), e;\n }\n}\nclass mp {\n engine;\n constructor(e) {\n this.engine = e;\n }\n /**\n * 获取引擎统计信息\n * 统计场景中所有网格的顶点数和三角面数\n * @returns 返回包含顶点数和三角面数的对象\n */\n getEngineInfo() {\n let e = 0, t = 0, n = 0;\n return !this.engine || !this.engine.scene ? {\n totalVertices: 0,\n totalTriangles: 0,\n meshCount: 0\n } : (this.engine.scene.traverse((i) => {\n if (i instanceof M.Mesh) {\n const s = i.geometry;\n if (s && s.attributes) {\n const r = s.attributes.position;\n if (r) {\n const a = r.count;\n e += a;\n let l = 0;\n s.index ? l = s.index.count / 3 : l = a / 3, t += l;\n }\n }\n }\n }), this.engine.engineStatus.models.forEach((i) => {\n n = n + i.info.modelEdge.length;\n }), {\n totalVertices: Math.floor(e),\n totalTriangles: Math.floor(t),\n meshCount: n\n });\n }\n}\nclass gp {\n engine;\n constructor(e) {\n this.engine = e;\n }\n init() {\n }\n // 查询构件属性\n getModelProperties(e, t, n) {\n let i = this.engine.engineStatus.models.find((r) => r.url === e);\n i.properties == null && Da(e + \"/property\", (r) => {\n let a = JSON.parse(r);\n i.properties = a, setTimeout(() => {\n s(a, t, n);\n }, 100);\n }), s(i.properties, t, n);\n function s(r, a, l) {\n let h = [], c = r.models[a.toString() || \"\"], u = c.map((m) => m[0]);\n u = u.filter((m, f) => u.indexOf(m) === f), u.forEach((m) => {\n let f = {\n name: r.categorys[m],\n children: []\n };\n h.push(f), c.filter((d) => d[0] === m).forEach((d) => {\n f.children.push({\n name: r.names[d[1]],\n value: r.values[d[2]]\n });\n });\n }), l?.({\n properties: h,\n materials: h\n });\n }\n }\n}\nclass yp {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 获取模型中所有的类型\n getModelTypes() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n t.info.modelMapper.forEach((i) => {\n e.push(i.typeName);\n });\n }), e = e.filter((t, n, i) => i.indexOf(t) === n), e;\n }\n // 获取模型中所有的专业\n getModelMajors() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n t.info.modelMapper.forEach((i) => {\n e.push(i.majorName);\n });\n }), e = e.filter((t, n, i) => i.indexOf(t) === n), e;\n }\n // 获取模型中所有的楼层\n getModelLevels() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n t.info.modelMapper.forEach((i) => {\n e.push(i.levelName);\n });\n }), e = e.filter((t, n, i) => i.indexOf(t) === n), e;\n }\n // 批量获取模型映射\n getModelMappers(e) {\n }\n // 获取模型的mapper\n getModelMapper(e, t) {\n let n = this.engine.engineStatus.models.find((r) => r.url == e);\n return n ? n.info.modelMapper.find((r) => r.id == t) : null;\n }\n // 获取同层同类构件\n getModelsWithLevelType(e, t, n = null) {\n let i = [];\n return this.engine.engineStatus.models.forEach((s) => {\n let r = {\n url: s.url,\n ids: []\n };\n i.push(r), s.info.modelMapper.filter((l) => l.levelName === e && l.typeName === t).forEach((l) => {\n r.ids.push(Number(l.id));\n });\n }), n && n(i), i;\n }\n // 获取同类型构件\n getModelsWithType(e, t = null) {\n let n = [];\n return this.engine.engineStatus.models.forEach((i) => {\n let s = {\n url: i.url,\n ids: []\n };\n n.push(s), i.info.modelMapper.filter((a) => a.typeName === e).forEach((a) => {\n s.ids.push(Number(a.id));\n });\n }), t && t(n), n;\n }\n // 获取同楼层构件\n getModelsWithLevel(e, t) {\n let n = [];\n return this.engine.engineStatus.models.forEach((i) => {\n let s = {\n url: i.url,\n ids: []\n };\n n.push(s), i.info.modelMapper.filter((a) => a.levelName === e).forEach((a) => {\n s.ids.push(Number(a.id));\n });\n }), t && t(n), n;\n }\n // 获取通专业构件 \n getModelsWithMajor(e, t) {\n let n = [];\n return this.engine.engineStatus.models.forEach((i) => {\n let s = {\n url: i.url,\n ids: []\n };\n n.push(s), i.info.modelMapper.filter((a) => a.majorName === e).forEach((a) => {\n s.ids.push(Number(a.id));\n });\n }), t && t(n), n;\n }\n}\nclass wp {\n engine;\n isActive = !1;\n groupEdge;\n material;\n modelEdgeLoaded = !1;\n indexes = /* @__PURE__ */ new Map();\n constructor(e) {\n this.engine = e, this.groupEdge = this.engine.scene.getObjectByName(\"groupEdge\"), this.material = new M.LineBasicMaterial({\n color: \"#000000\",\n depthTest: !0,\n transparent: !0,\n opacity: 0.3\n }), this.material.clippingPlanes = this.engine.sectionPlane;\n }\n // 启动\n active() {\n this.isActive = !0, this.groupEdge.visible = !0, this.engine.scene.traverse((e) => {\n e.isMesh && e.material && (Array.isArray(e.material) ? e.material : [e.material]).forEach((n) => {\n n.polygonOffset = !0, n.polygonOffsetFactor = 1, n.polygonOffsetUnits = 4;\n });\n }), this.show();\n }\n // 关闭\n disActive() {\n this.isActive = !1, this.groupEdge.visible = !1, this.engine.scene.traverse((e) => {\n e.isMesh && e.material && (Array.isArray(e.material) ? e.material : [e.material]).forEach((n) => {\n n.polygonOffset = !1;\n });\n });\n }\n loadModelEdge() {\n this.modelEdgeLoaded || (this.engine.engineStatus.models.forEach((e) => {\n if (!this.groupEdge.children.find((n) => n.url == e.url)) {\n let n = e.info, i = [], s = /* @__PURE__ */ new Map();\n n.modelEdge.forEach((r) => {\n let a = i.length;\n for (let l = 0; l < r.points.length; l++)\n r.points[l].length == 2 && (i.push(r.points[l][0].X), i.push(r.points[l][0].Z), i.push(-r.points[l][0].Y), i.push(r.points[l][1].X), i.push(r.points[l][1].Z), i.push(-r.points[l][1].Y));\n s.set(Number(r.id), [a, i.length, r.points]);\n }), this.indexes.set(e.url, s);\n }\n }), this.modelEdgeLoaded = !0);\n }\n // 显示模型边线\n show() {\n this.modelEdgeLoaded || this.loadModelEdge(), this.indexes.forEach((e, t) => {\n let n = [];\n e.forEach((r, a) => {\n r[2].forEach((l, h) => {\n l.length == 2 && (n.push(l[0].X), n.push(l[0].Z), n.push(-l[0].Y), n.push(l[1].X), n.push(l[1].Z), n.push(-l[1].Y));\n });\n });\n let i = new M.BufferGeometry();\n i.setAttribute(\"position\", new M.Float32BufferAttribute(n, 3));\n let s = new M.LineSegments(i, this.material);\n s.url = t, this.groupEdge.add(s);\n });\n }\n // 获取指定模型的边线\n getModelEdge(e, t) {\n let n = this.indexes.get(e);\n if (n) {\n let i = n.get(t);\n if (i)\n return i.slice();\n }\n return null;\n }\n //隐藏边线\n hideModelEdge(e, t) {\n let n = this.indexes.get(e);\n if (n) {\n let i = n.get(t);\n if (i) {\n let [s, r, a] = i, l = this.groupEdge.children.find((h) => h.url == e);\n if (l) {\n let h = l.geometry.attributes.position.array;\n for (let c = s; c < r; c++)\n h[c] = NaN;\n l.geometry.attributes.position.needsUpdate = !0;\n }\n }\n }\n }\n // 显示边线\n showModelEdge(e, t) {\n let n = this.indexes.get(e);\n if (n) {\n let i = n.get(t);\n if (i) {\n let [s, r, a] = i, l = this.groupEdge.children.find((h) => h.url == e);\n if (l) {\n let h = l.geometry.attributes.position.array, c = 0;\n for (let u = s; u < r; u += 3) {\n const m = Math.floor(c / 6), f = c % 6 >= 3;\n if (a[m] && a[m].length === 2) {\n const d = f ? a[m][1] : a[m][0];\n h[u] = d.X, h[u + 1] = d.Z, h[u + 2] = -d.Y;\n }\n c += 3;\n }\n l.geometry.attributes.position.needsUpdate = !0;\n }\n }\n }\n }\n}\nclass xp {\n config;\n constructor(e) {\n this.config = {\n temperature: 0.7,\n maxTokens: 2e4,\n timeout: 3e5,\n ...e\n };\n }\n /**\n * 发送消息并获取响应(非流式)\n */\n async chat(e) {\n const t = new AbortController(), n = setTimeout(() => t.abort(), this.config.timeout);\n try {\n const i = await fetch(`${this.config.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`\n },\n body: JSON.stringify({\n model: this.config.model,\n messages: e,\n temperature: this.config.temperature,\n max_tokens: this.config.maxTokens,\n stream: !1\n }),\n signal: t.signal\n });\n if (clearTimeout(n), !i.ok) {\n const r = await i.json().catch(() => ({}));\n throw new Error(\n `API请求失败 (${i.status}): ${r.error?.message || r.message || i.statusText}`\n );\n }\n return (await i.json()).choices?.[0]?.message?.content || \"\";\n } catch (i) {\n throw clearTimeout(n), i.name === \"AbortError\" ? new Error(\"请求超时,请重试\") : i.message.includes(\"Failed to fetch\") ? new Error(`网络请求失败,请检查:\n1. 网络连接\n2. API地址是否正确\n3. 是否有CORS限制`) : i;\n }\n }\n /**\n * 发送消息并获取流式响应\n */\n async chatStream(e, t) {\n const n = new AbortController(), i = setTimeout(() => n.abort(), this.config.timeout);\n try {\n const s = await fetch(`${this.config.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`\n },\n body: JSON.stringify({\n model: this.config.model,\n messages: e,\n temperature: this.config.temperature,\n max_tokens: this.config.maxTokens,\n stream: !0\n }),\n signal: n.signal\n });\n if (clearTimeout(i), !s.ok) {\n const h = await s.json().catch(() => ({}));\n throw new Error(\n `API请求失败 (${s.status}): ${h.error?.message || h.message || s.statusText}`\n );\n }\n const r = s.body?.getReader();\n if (!r)\n throw new Error(\"无法读取响应流\");\n const a = new TextDecoder();\n let l = \"\";\n for (; ; ) {\n const { done: h, value: c } = await r.read();\n if (h) {\n t(\"\", !0);\n break;\n }\n l += a.decode(c, { stream: !0 });\n const u = l.split(`\n`);\n l = u.pop() || \"\";\n for (const m of u) {\n const f = m.trim();\n if (!f || !f.startsWith(\"data: \")) continue;\n const d = f.slice(6);\n if (d !== \"[DONE]\")\n try {\n const g = JSON.parse(d).choices?.[0]?.delta?.content;\n g && t(g, !1);\n } catch (p) {\n console.warn(\"解析流式数据失败:\", p);\n }\n }\n }\n } catch (s) {\n throw clearTimeout(i), s.name === \"AbortError\" ? new Error(\"请求超时,请重试\") : s.message.includes(\"Failed to fetch\") ? new Error(\"网络请求失败,请检查网络连接\") : s;\n }\n }\n /**\n * 更新配置\n */\n updateConfig(e) {\n this.config = { ...this.config, ...e };\n }\n /**\n * 获取当前配置\n */\n getConfig() {\n return { ...this.config };\n }\n}\nclass _p {\n /** 引擎实例 */\n engine;\n /** 步骤列表 */\n steps = [];\n /** 步骤执行结果 */\n stepResults = /* @__PURE__ */ new Map();\n /** 对话历史 */\n conversationHistory = [];\n /** 当前状态 */\n state = \"idle\";\n /** 大模型API实例 */\n llmApi = null;\n /** 配置 */\n config = null;\n /** 回调信息 */\n _callback_message;\n _callback_question;\n _callback_content;\n /** 提示词缓存 */\n prompts = {};\n /**\n * 构造函数\n * @param engine 引擎实例\n */\n constructor(e) {\n this.engine = e;\n }\n /**\n * 初始化AI管理器\n * @param config 对话配置\n */\n async init(e, t, n) {\n this._callback_message = e, this._callback_question = t, this._callback_content = n, this.conversationHistory = [];\n let i = {\n llmConfig: {\n baseURL: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n apiKey: \"4041336a72f14d8fa3800bd651a80fec.vZWUxssXOXB37vlV\",\n model: \"GLM-4.5-Air\",\n temperature: 0.7,\n maxTokens: 2e3\n },\n debug: !0,\n stepExecution: {\n // 默认允许 1 次重试:当 AI 生成的代码偶发不可执行/缺参数时,会自动让 AI 修复后再跑一次\n maxRetries: 5\n },\n prompts: {\n main: \"\",\n step: \"\",\n apiDoc: \"\"\n }\n };\n try {\n this.config = i, this.llmApi = new xp(i.llmConfig);\n try {\n const s = await import(\"./main-2Txx2Vau.mjs\");\n this.prompts.main = s.default;\n const r = await import(\"./step-CkmZYIvn.mjs\");\n this.prompts.step = r.default;\n const a = await import(\"./API文档-B1v8UcRF.mjs\");\n this.prompts.apiDoc = a.default;\n } catch (s) {\n throw console.error(\"[AI Manager] 提示词文件加载失败:\", s), new Error(`提示词文件加载失败: ${s.message || \"未知错误\"}`);\n }\n } catch (s) {\n throw console.error(\"[AI Manager] 初始化失败:\", s), s;\n }\n }\n /**\n * 处理对话,与大模型进行交互\n * callback_message:\n * @param callback_message 回调消息\n * @param callback_question 回调问题\n * @param callback_content 回调内容\n */\n async conversationV2(e) {\n if (this.conversationHistory.length === 0) {\n const i = {\n role: \"system\",\n content: `${this.prompts.main}`\n }, s = {\n role: \"system\",\n content: `## BIM引擎API文档\n${this.prompts.apiDoc}`\n };\n this.conversationHistory.push(i), this.conversationHistory.push(s);\n }\n this.conversationHistory.push({\n role: \"user\",\n content: e\n });\n const t = await this.llmApi.chat(this.conversationHistory);\n this.conversationHistory.push({\n role: \"assistant\",\n content: t\n }), this.config?.debug && console.log(\"[AI Manager] 大模型响应:\", t);\n let n = await this.parseAnalysisResponse(t);\n n && n.questions && n.questions.length > 0 && this._callback_question(n.questions);\n }\n /**\n * 解析分析响应\n */\n async parseAnalysisResponse(e) {\n try {\n if (e.includes(\"##question##\")) {\n const t = e.match(/##question##\\s*([\\s\\S]*?)(?=##|$)/);\n if (t) {\n let n = t[1].trim();\n n = n.replace(/^```json\\n?/, \"\").replace(/^```\\n?/, \"\").replace(/\\n?```$/, \"\");\n const i = n.match(/(\\[[\\s\\S]*\\])/);\n i && (n = i[1]);\n const s = JSON.parse(n);\n return this.state = \"waiting_answer\", {\n state: \"waiting_answer\",\n questions: s\n };\n }\n }\n if (e.includes(\"##steps##\")) {\n const t = e.match(/##steps##\\s*([\\s\\S]*?)(?=##|$)/);\n if (t) {\n let n = t[1].trim();\n n = n.replace(/^```json\\n?/, \"\").replace(/^```\\n?/, \"\").replace(/\\n?```$/, \"\");\n const i = n.match(/(\\[[\\s\\S]*\\])/);\n return i && (n = i[1]), this.steps = JSON.parse(n), this.config?.debug && console.log(\"[AI Manager] 步骤规划完成,共\", this.steps.length, \"个步骤\"), this._callback_message(this.steps), await this.executeSteps();\n }\n }\n return {\n state: \"completed\",\n data: e\n };\n } catch (t) {\n return console.error(\"[AI Manager] 解析响应失败:\", t), {\n state: \"error\",\n error: \"解析大模型响应失败: \" + t.message\n };\n }\n }\n /**\n * 执行步骤\n */\n async executeSteps() {\n try {\n this.state = \"executing\", this.stepResults.clear();\n for (const e of this.steps) {\n this._callback_message(e), this.config?.debug && console.log(`[AI Manager] 执行步骤 ${e.id}: ${e.content}`);\n const t = await this.getDependenciesOutput(e.dependencies), n = await this.executeStep(e, t);\n this.stepResults.set(e.id, n), this.config?.debug && console.log(`[AI Manager] 步骤 ${e.id} 执行完成:`, n);\n }\n return this.state = \"completed\", {\n state: \"completed\",\n steps: this.steps,\n result: Array.from(this.stepResults.values())\n };\n } catch (e) {\n return console.error(\"[AI Manager] 步骤执行失败:\", e), {\n state: \"error\",\n error: \"步骤执行失败: \" + e.message\n };\n }\n }\n /**\n * 获取依赖步骤的输出\n */\n async getDependenciesOutput(e) {\n return e.length === 0 ? null : e.length === 1 ? this.stepResults.get(e[0]) : e.map((t) => this.stepResults.get(t));\n }\n /**\n * 执行单个步骤\n */\n async executeStep(e, t) {\n const n = this.config?.stepExecution?.maxRetries ?? 1, i = [];\n let s = null, r = !1;\n for (let a = 0; a <= n; a++)\n try {\n const l = i.length > 0 ? i[i.length - 1] : \"\", c = await (a === 0 ? this.generateCode(e, t) : r ? this.regenerateCodeAfterFailure(e, t, l, s, a) : this.generateCode(e, t));\n i.push(c), this.config?.debug && console.log(`[AI Manager] 步骤 ${e.id} 第 ${a + 1} 次生成的代码:\n${c}`);\n try {\n const u = await this.executeCode(c, t);\n if (u instanceof Object && u.success == !1 || u instanceof String && (u.includes(\"undefined\") || u.includes(\"not\"))) {\n s = u, r = !0;\n debugger;\n throw u;\n }\n debugger;\n return u;\n } catch (u) {\n debugger;\n throw s = u, r = !0, u;\n }\n } catch (l) {\n if (r || (s = l), a >= n)\n throw console.error(`[AI Manager] 执行步骤 ${e.id} 失败(已达重试上限):`, l), new Error(`步骤 ${e.id} (${e.content}) 执行失败: ${l.message}`);\n console.warn(\n `[AI Manager] 步骤 ${e.id} 第 ${a + 1} 次执行失败,将尝试让AI修复后重试(剩余重试次数:${n - a}):`,\n l\n );\n }\n throw new Error(`步骤 ${e.id} (${e.content}) 执行失败: 未知错误`);\n }\n /**\n * 从大模型响应中提取代码(容错处理)\n * 优先尝试从 ##code## 标记中提取,如果没有则尝试从 markdown 代码块中提取\n * @param response 大模型响应文本\n * @returns 提取的代码字符串\n */\n extractCodeFromResponse(e) {\n const t = e.match(/##code##\\s*([\\s\\S]*?)(?=##|$)/);\n if (t) {\n let r = t[1].trim();\n if (r = r.replace(/^```javascript\\n?/, \"\").replace(/^```js\\n?/, \"\").replace(/^```\\n?/, \"\").replace(/\\n?```$/, \"\"), r.length > 0)\n return r;\n }\n const n = [\n /```javascript\\s*([\\s\\S]*?)```/i,\n // ```javascript ... ```\n /```js\\s*([\\s\\S]*?)```/i,\n // ```js ... ```\n /```\\s*([\\s\\S]*?)```/\n // ``` ... ```(通用代码块)\n ];\n for (const r of n) {\n const a = e.match(r);\n if (a && a[1]) {\n const l = a[1].trim();\n if (l.length > 0)\n return this.config?.debug && console.warn(\"[AI Manager] 未找到 ##code## 标记,从 markdown 代码块中提取代码\"), l;\n }\n }\n const i = /[请|说明|注意|需要|应该|可以|如果|但是|因为|所以|例如|比如]/i.test(e), s = /(function|const|let|var|return|async|await|=>|engine\\.|previousStepOutput)/.test(e);\n if (!i && s) {\n const a = e.trim().replace(/^[,。:;!?\\s]+/, \"\").replace(/[,。:;!?\\s]+$/, \"\");\n if (a.length > 10)\n return this.config?.debug && console.warn(\"[AI Manager] 未找到 ##code## 标记和代码块,尝试使用整个响应作为代码\"), a;\n }\n throw new Error(`无法从大模型响应中提取代码。响应内容:${e.substring(0, 200)}...`);\n }\n /**\n * 生成代码\n */\n async generateCode(e, t) {\n try {\n const n = {\n role: \"system\",\n content: `${this.prompts.step}`\n }, i = {\n role: \"system\",\n content: `\n\n## BIM引擎API文档\n${this.prompts.apiDoc}`\n }, s = {\n role: \"user\",\n content: `请根据以下步骤描述生成可执行的JavaScript代码:\n\n步骤信息:\n${JSON.stringify(e, null, 2)}\n\n前序步骤输出数据:\n${t ? JSON.stringify(t, null, 2) : \"null\"}\n\n请严格按照##code##格式输出代码。`\n }, r = [n, i, s], a = await this.llmApi.chat(r);\n return this.extractCodeFromResponse(a);\n } catch (n) {\n throw console.error(\"[AI Manager] 代码生成失败:\", n), n;\n }\n }\n /**\n * 执行失败后,让 AI 基于“错误信息 + 上一次代码”进行修复再生成\n * @param attempt 当前是第几次重试(从 1 开始)\n */\n async regenerateCodeAfterFailure(e, t, n, i, s) {\n try {\n const r = {\n role: \"system\",\n content: `${this.prompts.step}`\n }, a = {\n role: \"system\",\n content: `\n\n## BIM引擎API文档\n${this.prompts.apiDoc}`\n }, l = {\n message: i?.message || (i instanceof Object ? JSON.stringify(i) : String(i)),\n name: i?.name,\n stack: i?.stack\n }, h = {\n role: \"user\",\n content: `上一次生成的代码在执行时失败了,请你修复后重新输出完整可执行的 JavaScript 代码(仍然要严格按 ##code## 格式输出)。\n\n当前步骤信息:\n${JSON.stringify(e, null, 2)}\n\n前序步骤输出数据:\n${t ? JSON.stringify(t, null, 2) : \"null\"}\n\n上一次生成的代码:\n${n ? `\n\\`\\`\\`javascript\n${n}\n\\`\\`\\`\n` : `\n(无)\n`}\n\n执行错误信息(第 ${s} 次重试前):\n${JSON.stringify(l, null, 2)}\n\n修复要求(请务必遵守):\n1) 不要输出解释文字,只输出 ##code## 段落里的代码\n2) 如果是语法错误/引用未定义/缺少 await/返回值不一致,请直接修复\n3) 尽量保持与步骤目标一致,避免引入与步骤无关的副作用\n4) 代码需要能在浏览器环境运行(不要使用 Node 专属 API)`\n }, c = await this.llmApi.chat([r, a, h]);\n try {\n return this.extractCodeFromResponse(c);\n } catch (u) {\n throw new Error(`无法从大模型响应中提取代码(修复重试阶段):${u.message}`);\n }\n } catch (r) {\n throw console.error(\"[AI Manager] 修复后代码生成失败:\", r), r;\n }\n }\n /**\n * 执行代码\n */\n async executeCode(e, t) {\n try {\n const n = this.engine;\n let i = e;\n i = i.replace(/\\b(const|let|var)\\s+previousStepOutput\\s*=\\s*[^;]*;/g, \"\"), i = i.replace(/\\b(const|let|var)\\s+previousStepOutput\\s*;/g, \"\");\n const r = new Function(\"engine\", \"previousStepOutput\", `\n 'use strict';\n ${i}\n `)(n, t);\n return r && typeof r.then == \"function\" ? await r : r;\n } catch (n) {\n return console.error(\"[AI Manager] 代码执行失败:\", n), \"error\" + n.message;\n }\n }\n /**\n * 重置对话\n */\n reset() {\n this.conversationHistory = [], this.steps = [], this.stepResults.clear(), this.state = \"idle\", this.config?.debug && console.log(\"[AI Manager] 对话已重置\");\n }\n /**\n * 获取当前状态\n */\n getState() {\n return this.state;\n }\n /**\n * 获取对话历史\n */\n getHistory() {\n return [...this.conversationHistory];\n }\n /**\n * 获取步骤列表\n */\n getSteps() {\n return [...this.steps];\n }\n /**\n * 获取步骤结果\n */\n getStepResults() {\n return new Map(this.stepResults);\n }\n}\nclass vp {\n engine;\n /** 点位列表 */\n points = [];\n /** 是否正在播放 */\n isPlaying = !1;\n /** 动画帧ID */\n animationFrameId = null;\n /** 播放开始时间 */\n playStartTime = 0;\n /** 当前播放的起止点位索引 */\n playFromIndex = 0;\n playToIndex = 0;\n /** 当前播放配置 */\n playOptions = {};\n /** 停留定时器ID */\n stayTimerId = null;\n /** 播放范围的结束索引 */\n playRangeToIndex = 0;\n constructor(e) {\n this.engine = e;\n }\n /**\n * 初始化管理器\n */\n init() {\n this.points = [], this.stop();\n }\n /**\n * 获取当前相机点位\n * @returns 当前相机的姿态信息\n */\n getCurrentPoint() {\n return {\n ...this.engine.cameraModule.getCameraPose(),\n stayTime: 0\n };\n }\n /**\n * 添加点位\n * @param point 可选,如果不传则使用当前相机位置\n * @param stayTime 停留时间(毫秒),默认0\n * @returns 添加后的点位列表长度\n */\n addPoint(e = 0) {\n const t = this.getCurrentPoint();\n return t.stayTime = e, this.points.push(t), this.points.length;\n }\n /**\n * 批量添加点位\n * @param points 点位数组\n * @returns 添加后的点位列表长度\n */\n addPoints(e) {\n for (const t of e)\n this.points.push({ ...t });\n return this.points.length;\n }\n /**\n * 保存点位清单(别名方法)\n * @param points 点位数组\n * @returns 添加后的点位列表长度\n */\n savePoints(e) {\n return this.addPoints(e);\n }\n /**\n * 删除指定索引的点位\n * @param index 点位索引\n * @returns 是否删除成功\n */\n removePoint(e) {\n return e >= 0 && e < this.points.length ? (this.points.splice(e, 1), !0) : !1;\n }\n /**\n * 清空所有点位\n */\n clearPoints() {\n this.stop(), this.points = [];\n }\n /**\n * 获取所有点位\n * @returns 点位数组\n */\n getPoints() {\n return [...this.points];\n }\n /**\n * 获取点位数量\n * @returns 点位数量\n */\n getPointCount() {\n return this.points.length;\n }\n /**\n * 更新指定索引的点位\n * @param index 点位索引\n * @param point 新的点位信息\n * @returns 是否更新成功\n */\n updatePoint(e, t) {\n return e >= 0 && e < this.points.length ? (this.points[e] = { ...t }, !0) : !1;\n }\n /**\n * 跳转到指定点位(无动画)\n * @param index 点位索引\n * @returns 是否跳转成功\n */\n jumpToPoint(e) {\n return e >= 0 && e < this.points.length ? (this.stop(), this.engine.cameraModule.restoreCameraPose(this.points[e]), !0) : !1;\n }\n /**\n * 播放路径动画\n * @param options 播放配置\n * @returns 是否开始播放\n */\n play(e = {}) {\n return this.points.length < 2 ? (console.warn(\"PathRoaming: 至少需要2个点位才能播放\"), !1) : (this.isPlaying && this.stop(), this.isPlaying = !0, this.playOptions = {\n duration: 3e3,\n // 默认每个过渡3秒\n loop: !1,\n ...e\n }, this.engine.controlModule.disActive(), this.playFromIndex = 0, this.playToIndex = 1, this.playRangeToIndex = this.points.length - 1, this.playStartTime = performance.now(), this.animate(), !0);\n }\n /**\n * 播放指定范围的路径\n * @param fromIndex 起始索引\n * @param toIndex 结束索引\n * @param options 播放配置\n * @returns 是否开始播放\n */\n playRange(e, t, n = {}) {\n return e < 0 || t >= this.points.length || e >= t ? (console.warn(\"PathRoaming: 无效的索引范围\"), !1) : this.points.length < 2 ? (console.warn(\"PathRoaming: 至少需要2个点位才能播放\"), !1) : (this.isPlaying && this.stop(), this.isPlaying = !0, this.playOptions = {\n duration: 3e3,\n loop: !1,\n ...n\n }, this.engine.controlModule.disActive(), this.playFromIndex = e, this.playToIndex = e + 1, this.playStartTime = performance.now(), this.playRangeToIndex = t, this.animate(), !0);\n }\n /**\n * 停止播放\n */\n stop() {\n this.isPlaying = !1, this.animationFrameId !== null && (cancelAnimationFrame(this.animationFrameId), this.animationFrameId = null), this.stayTimerId !== null && (clearTimeout(this.stayTimerId), this.stayTimerId = null), this.engine.controlModule.active();\n }\n /**\n * 暂停播放(保留当前位置)\n */\n pause() {\n this.isPlaying && (this.isPlaying = !1, this.animationFrameId !== null && (cancelAnimationFrame(this.animationFrameId), this.animationFrameId = null), this.stayTimerId !== null && (clearTimeout(this.stayTimerId), this.stayTimerId = null));\n }\n /**\n * 获取是否正在播放\n */\n getIsPlaying() {\n return this.isPlaying;\n }\n /**\n * 动画循环\n */\n animate = () => {\n if (!this.isPlaying) return;\n const t = performance.now() - this.playStartTime, n = this.playOptions.duration || 3e3, i = Math.min(t / n, 1), s = this.points[this.playFromIndex], r = this.points[this.playToIndex], a = this.interpolatePose(s, r, i);\n this.engine.cameraModule.restoreCameraPose(a), i >= 1 ? this.onSegmentComplete() : this.animationFrameId = requestAnimationFrame(this.animate);\n };\n /**\n * 段播放完成处理\n */\n onSegmentComplete() {\n const e = this.playToIndex;\n this.playOptions.onPointComplete && this.playOptions.onPointComplete(e);\n const t = this.points[e];\n t.stayTime && t.stayTime > 0 ? this.stayTimerId = globalThis.setTimeout(() => {\n this.stayTimerId = null, this.moveToNextSegment();\n }, t.stayTime) : this.moveToNextSegment();\n }\n /**\n * 移动到下一段\n */\n moveToNextSegment() {\n const e = this.playToIndex >= this.playRangeToIndex, t = this.playToIndex >= this.points.length - 1;\n e || t ? this.playOptions.loop && this.points.length >= 2 ? (this.playFromIndex = 0, this.playToIndex = 1, this.playRangeToIndex = this.points.length - 1, this.playStartTime = performance.now(), this.animate()) : this.onPlayComplete() : (this.playFromIndex = this.playToIndex, this.playToIndex = this.playToIndex + 1, this.playStartTime = performance.now(), this.animate());\n }\n /**\n * 播放完成处理\n */\n onPlayComplete() {\n this.stop(), this.playOptions.onComplete && this.playOptions.onComplete();\n }\n /**\n * 插值计算两个相机姿态之间的中间姿态\n * @param from 起始姿态\n * @param to 结束姿态\n * @param t 进度(0-1)\n * @returns 插值后的姿态\n */\n interpolatePose(e, t, n) {\n const i = this.easeInOutCubic(n), s = {\n type: t.type,\n position: {\n x: M.MathUtils.lerp(e.position.x, t.position.x, i),\n y: M.MathUtils.lerp(e.position.y, t.position.y, i),\n z: M.MathUtils.lerp(e.position.z, t.position.z, i)\n },\n rotation: {\n x: M.MathUtils.lerp(e.rotation.x, t.rotation.x, i),\n y: M.MathUtils.lerp(e.rotation.y, t.rotation.y, i),\n z: M.MathUtils.lerp(e.rotation.z, t.rotation.z, i)\n },\n quaternion: {\n x: M.MathUtils.lerp(e.quaternion.x, t.quaternion.x, i),\n y: M.MathUtils.lerp(e.quaternion.y, t.quaternion.y, i),\n z: M.MathUtils.lerp(e.quaternion.z, t.quaternion.z, i),\n w: M.MathUtils.lerp(e.quaternion.w, t.quaternion.w, i)\n }\n };\n return e.target && t.target ? s.target = {\n x: M.MathUtils.lerp(e.target.x, t.target.x, i),\n y: M.MathUtils.lerp(e.target.y, t.target.y, i),\n z: M.MathUtils.lerp(e.target.z, t.target.z, i)\n } : t.target && (s.target = { ...t.target }), e.zoom !== void 0 && t.zoom !== void 0 && (s.zoom = M.MathUtils.lerp(e.zoom, t.zoom, i)), s;\n }\n /**\n * 缓入缓出函数(三次方)\n * @param t 输入值(0-1)\n * @returns 缓动后的值\n */\n easeInOutCubic(e) {\n return e < 0.5 ? 4 * e * e * e : 1 - Math.pow(-2 * e + 2, 3) / 2;\n }\n /**\n * 销毁管理器\n */\n dispose() {\n this.stop(), this.points = [], this.playOptions = {};\n }\n}\nclass bp {\n engine;\n miniMapCamera = null;\n miniMapRenderer = null;\n miniMapContainer = null;\n overlayCanvas = null;\n overlayCtx = null;\n isVisible = !1;\n mapSize = 200;\n // 视野半径(可通过滚轮调整)\n currentHalfSize = 500;\n minHalfSize = 5;\n maxHalfSize = 1e4;\n halfSizeInitialized = !1;\n // 小地图相机高度(由 octreeBox 动态计算)\n camY = 1e3;\n // 当前帧小地图相机中心的世界 XZ(= 主相机 XZ)\n centerX = 0;\n centerZ = 0;\n // 拖拽交互状态(仅旋转模式)\n dragMode = null;\n lastMouseX = 0;\n lastMouseY = 0;\n constructor(e) {\n this.engine = e, this.init();\n }\n // 获取小地图的状态\n getstate() {\n return this.isVisible;\n }\n init() {\n this.miniMapContainer = document.createElement(\"div\"), this.miniMapContainer.style.position = \"absolute\", this.miniMapContainer.style.bottom = \"20px\", this.miniMapContainer.style.left = \"20px\", this.miniMapContainer.style.width = `${this.mapSize}px`, this.miniMapContainer.style.height = `${this.mapSize}px`, this.miniMapContainer.style.border = \"2px solid rgba(255, 255, 255, 0.4)\", this.miniMapContainer.style.borderRadius = \"4px\", this.miniMapContainer.style.overflow = \"hidden\", this.miniMapContainer.style.display = \"none\", this.miniMapContainer.style.zIndex = \"200\", this.miniMapContainer.style.pointerEvents = \"auto\", this.miniMapContainer.style.cursor = \"crosshair\", this.engine.container.appendChild(this.miniMapContainer), this.miniMapRenderer = new M.WebGLRenderer({ alpha: !0, antialias: !1 }), this.miniMapRenderer.setSize(this.mapSize, this.mapSize), this.miniMapRenderer.setPixelRatio(window.devicePixelRatio), this.miniMapRenderer.setClearColor(1710638, 0.85), this.miniMapContainer.appendChild(this.miniMapRenderer.domElement);\n const e = window.devicePixelRatio || 1;\n this.overlayCanvas = document.createElement(\"canvas\"), this.overlayCanvas.width = this.mapSize * e, this.overlayCanvas.height = this.mapSize * e, this.overlayCanvas.style.position = \"absolute\", this.overlayCanvas.style.top = \"0\", this.overlayCanvas.style.left = \"0\", this.overlayCanvas.style.width = `${this.mapSize}px`, this.overlayCanvas.style.height = `${this.mapSize}px`, this.overlayCanvas.style.pointerEvents = \"none\", this.miniMapContainer.appendChild(this.overlayCanvas), this.overlayCtx = this.overlayCanvas.getContext(\"2d\"), this.overlayCtx && this.overlayCtx.scale(e, e), this.miniMapCamera = new M.OrthographicCamera(\n -this.currentHalfSize,\n this.currentHalfSize,\n this.currentHalfSize,\n -this.currentHalfSize,\n 0.1,\n 1e5\n ), this.miniMapCamera.up.set(0, 0, -1), this.setupEvents();\n }\n // ========== 坐标转换 ==========\n /**\n * 世界坐标 XZ → 小地图像素坐标\n * 小地图 up=(0,0,-1):-Z 朝屏幕上方,+X 朝屏幕右方\n */\n worldToPixel(e, t) {\n const n = this.currentHalfSize;\n return {\n x: ((e - this.centerX) / n * 0.5 + 0.5) * this.mapSize,\n y: ((t - this.centerZ) / n * 0.5 + 0.5) * this.mapSize\n };\n }\n /** 小地图像素坐标 → 世界坐标 XZ */\n pixelToWorld(e, t) {\n const n = this.currentHalfSize;\n return {\n x: (e / this.mapSize - 0.5) * 2 * n + this.centerX,\n z: (t / this.mapSize - 0.5) * 2 * n + this.centerZ\n };\n }\n // ========== 事件处理 ==========\n setupEvents() {\n const e = this.miniMapContainer;\n e.addEventListener(\"wheel\", this.onWheel, { passive: !1 }), e.addEventListener(\"mousedown\", this.onMouseDown), e.addEventListener(\"mousemove\", this.onMouseMove), e.addEventListener(\"mouseup\", this.onMouseUp), e.addEventListener(\"mouseleave\", this.onMouseUp), e.addEventListener(\"contextmenu\", (t) => t.preventDefault()), [\"pointerdown\", \"pointermove\", \"pointerup\", \"click\", \"dblclick\"].forEach((t) => e.addEventListener(t, (n) => n.stopPropagation()));\n }\n /** 滚轮缩放小地图视野 */\n onWheel = (e) => {\n e.preventDefault(), e.stopPropagation();\n const t = e.deltaY > 0 ? 1.25 : 0.8;\n this.currentHalfSize = Math.max(\n this.minHalfSize,\n Math.min(this.maxHalfSize, this.currentHalfSize * t)\n );\n };\n /**\n * 点击指示器(中心 25px 范围)→ 进入旋转拖拽模式\n * 点击其他位置 → 计算世界坐标,直接将相机传送过去\n */\n onMouseDown = (e) => {\n e.stopPropagation();\n const t = this.miniMapContainer.getBoundingClientRect(), n = e.clientX - t.left, i = e.clientY - t.top, s = this.engine.camera;\n if (!s) return;\n const { x: r, y: a } = this.worldToPixel(s.position.x, s.position.z);\n Math.hypot(n - r, i - a) < 25 ? (this.dragMode = \"rotate\", this.miniMapContainer.style.cursor = \"alias\") : (this.dragMode = null, this.handleTeleport(n, i)), this.lastMouseX = n, this.lastMouseY = i;\n };\n onMouseMove = (e) => {\n if (e.stopPropagation(), this.dragMode !== \"rotate\") return;\n const t = this.miniMapContainer.getBoundingClientRect(), n = e.clientX - t.left, i = e.clientY - t.top;\n this.handleRotate(n, i), this.lastMouseX = n, this.lastMouseY = i;\n };\n onMouseUp = (e) => {\n e.stopPropagation(), this.dragMode = null, this.miniMapContainer && (this.miniMapContainer.style.cursor = \"crosshair\");\n };\n // ========== 相机操控 ==========\n /**\n * 传送:点击小地图空白区域 → 计算世界坐标,将相机和 target 平移过去\n */\n handleTeleport(e, t) {\n const n = this.engine.camera, i = this.engine.controls;\n if (!n || !i) return;\n const { x: s, z: r } = this.pixelToWorld(e, t), a = s - n.position.x, l = r - n.position.z;\n n.position.x += a, n.position.z += l, i.target.x += a, i.target.z += l, i.update();\n }\n /**\n * 旋转:拖动指示器尖端 → 绕 controls.target 旋转主相机水平轨道角\n */\n handleRotate(e, t) {\n const n = this.engine.camera, i = this.engine.controls;\n if (!n || !i) return;\n const s = this.mapSize / 2, r = this.mapSize / 2, a = Math.atan2(this.lastMouseY - r, this.lastMouseX - s);\n let h = Math.atan2(t - r, e - s) - a;\n h > Math.PI && (h -= 2 * Math.PI), h < -Math.PI && (h += 2 * Math.PI);\n const c = new M.Vector3().copy(i.target).sub(n.position), u = new M.Spherical().setFromVector3(c);\n u.theta -= h, c.setFromSpherical(u), i.target.copy(n.position).add(c), i.update();\n }\n // ========== 绘制 2D 覆盖层 ==========\n drawOverlay() {\n const e = this.overlayCtx, t = this.engine.camera;\n if (!e || !t) return;\n e.clearRect(0, 0, this.mapSize, this.mapSize);\n const n = this.mapSize / 2, i = this.mapSize / 2, s = new M.Vector3();\n t.getWorldDirection(s);\n const r = Math.atan2(s.x, -s.z), a = 36, l = Math.PI / 10;\n e.save(), e.translate(n, i), e.rotate(r);\n const h = e.createRadialGradient(0, 0, 2, 0, 0, a);\n h.addColorStop(0, \"rgba(0, 230, 130, 0.9)\"), h.addColorStop(1, \"rgba(0, 230, 130, 0)\");\n const c = -Math.sin(l) * a, u = -Math.cos(l) * a, m = Math.sin(l) * a, f = -Math.cos(l) * a;\n e.beginPath(), e.moveTo(0, 0), e.lineTo(c, u), e.lineTo(m, f), e.closePath(), e.fillStyle = h, e.fill(), e.fillStyle = \"rgba(255, 255, 255, 0.95)\", e.strokeStyle = \"rgba(0, 200, 110, 0.9)\", e.lineWidth = 1.5, e.beginPath(), e.arc(0, 0, 4, 0, Math.PI * 2), e.fill(), e.stroke(), e.restore();\n }\n // ========== 生命周期 ==========\n show() {\n this.isVisible = !0, this.miniMapContainer && (this.miniMapContainer.style.display = \"block\");\n }\n hide() {\n this.isVisible = !1, this.miniMapContainer && (this.miniMapContainer.style.display = \"none\");\n }\n toggle() {\n this.isVisible ? this.hide() : this.show();\n }\n update() {\n if (!this.isVisible || !this.miniMapCamera || !this.miniMapRenderer) return;\n const e = this.engine.camera;\n if (!(!e || !this.engine.scene)) {\n if (this.engine.octreeBox) {\n const t = this.engine.octreeBox.getBoundingBox();\n if (t?.min && t?.max) {\n const n = t.max.x - t.min.x, i = t.max.z - t.min.z, s = t.max.y - t.min.y;\n this.camY = t.max.y + Math.max(n, i, s), !this.halfSizeInitialized && n + i > 0 && (this.currentHalfSize = Math.max(n, i) * 2, this.halfSizeInitialized = !0);\n }\n }\n this.centerX = e.position.x, this.centerZ = e.position.z, this.miniMapCamera.left = -this.currentHalfSize, this.miniMapCamera.right = this.currentHalfSize, this.miniMapCamera.top = this.currentHalfSize, this.miniMapCamera.bottom = -this.currentHalfSize, this.miniMapCamera.updateProjectionMatrix(), this.miniMapCamera.position.set(this.centerX, this.camY, this.centerZ), this.miniMapCamera.lookAt(this.centerX, this.camY - 1, this.centerZ), this.miniMapRenderer.render(this.engine.scene, this.miniMapCamera), this.drawOverlay();\n }\n }\n dispose() {\n this.miniMapContainer && (this.miniMapContainer.removeEventListener(\"wheel\", this.onWheel), this.miniMapContainer.removeEventListener(\"mousedown\", this.onMouseDown), this.miniMapContainer.removeEventListener(\"mousemove\", this.onMouseMove), this.miniMapContainer.removeEventListener(\"mouseup\", this.onMouseUp), this.miniMapContainer.removeEventListener(\"mouseleave\", this.onMouseUp)), this.miniMapRenderer && (this.miniMapRenderer.dispose(), this.miniMapRenderer = null), this.miniMapContainer && (this.miniMapContainer.remove(), this.miniMapContainer = null), this.miniMapCamera = null, this.overlayCtx = null, this.overlayCanvas = null;\n }\n}\nconst Mp = [\n { Id: \"100001\", Name: \"1\", Points: [{ X: -2, Y: -5, Z: 0 }, { X: -2, Y: 5, Z: 0 }] },\n { Id: \"100002\", Name: \"2\", Points: [{ X: 2, Y: -5, Z: 0 }, { X: 2, Y: 5, Z: 0 }] },\n { Id: \"100003\", Name: \"A\", Points: [{ X: -5, Y: -2, Z: 0 }, { X: 5, Y: -2, Z: 0 }] },\n { Id: \"100004\", Name: \"B\", Points: [{ X: -5, Y: 2, Z: 0 }, { X: 5, Y: 2, Z: 0 }] }\n];\nclass Sp {\n engine;\n rootGroup = null;\n isVisible = !1;\n axes = [];\n /**\n * 坐标转换:BIM(X,Y,Z) → Three.js 世界坐标\n * 默认规则:BIM X=水平, Y=水平深度, Z=高度\n * → Three.js X=水平, Y=高度, Z=-深度\n * 可在外部替换此函数以适配不同坐标系。\n */\n coordinateMapper = (e) => new M.Vector3(e.X, e.Z, -e.Y);\n constructor(e) {\n this.engine = e, this._initRoot();\n }\n // ──────────────────────────────────────────────\n // 公共 API\n // ──────────────────────────────────────────────\n /** 传入轴网数据并在场景中构建对象 */\n setData(e) {\n this._clearAxes(), this.axes = e.map((t) => ({ data: t, group: null })), this.axes.forEach((t) => this._buildAxis(t));\n }\n /** 使用内置模拟数据(调试用) */\n setMockData() {\n this.setData(Mp);\n }\n /** 显示轴网 */\n show() {\n this.isVisible = !0, this.rootGroup && (this.rootGroup.visible = !0);\n }\n /** 隐藏轴网 */\n hide() {\n this.isVisible = !1, this.rootGroup && (this.rootGroup.visible = !1);\n }\n /** 切换显示/隐藏 */\n toggle() {\n this.isVisible ? this.hide() : this.show();\n }\n /**\n * 每帧更新(在动画循环中调用)\n * 根据正交相机缩放动态调整圆圈大小,保持屏幕上视觉尺寸恒定(约 30px)\n */\n update() {\n if (!this.isVisible || !this.rootGroup) return;\n const e = this.engine.camera, t = this.engine.renderer;\n if (!e || !t) return;\n let n = 0.5;\n if (e instanceof M.OrthographicCamera) {\n const i = e, s = (i.top - i.bottom) / i.zoom, r = t.domElement.clientHeight || 1;\n n = 30 * s / r;\n }\n this.rootGroup.traverse((i) => {\n i instanceof M.Sprite && i.scale.set(n, n, 1);\n });\n }\n /** 销毁,释放 Three.js 资源 */\n dispose() {\n this._clearAxes(), this.rootGroup && (this.engine.scene && this.engine.scene.remove(this.rootGroup), this.rootGroup = null);\n }\n // ──────────────────────────────────────────────\n // 内部实现\n // ──────────────────────────────────────────────\n _initRoot() {\n this.rootGroup = new M.Group(), this.rootGroup.name = \"GridRoot\", this.rootGroup.visible = !1, this.engine.scene && this.engine.scene.add(this.rootGroup);\n }\n _clearAxes() {\n this.axes.forEach((e) => {\n e.group && (this.rootGroup?.remove(e.group), e.group.traverse((t) => {\n const n = t;\n if (\"geometry\" in n && n.geometry && n.geometry.dispose(), \"material\" in n && n.material) {\n const i = n.material;\n \"map\" in i && i.map && i.map.dispose(), i.dispose();\n }\n }), e.group = null);\n }), this.axes = [];\n }\n _buildAxis(e) {\n if (!this.rootGroup) return;\n const t = this.coordinateMapper(e.data.Points[0]), n = this.coordinateMapper(e.data.Points[1]), i = e.data.Name, s = new M.Group();\n s.name = `GridAxis_${e.data.Id}`;\n const r = new M.BufferGeometry().setFromPoints([t, n]), a = new M.LineBasicMaterial({\n color: 1609983,\n depthTest: !1\n }), l = new M.Line(r, a);\n l.renderOrder = 998, s.add(l), s.add(this._makeCircleSprite(i, t)), s.add(this._makeCircleSprite(i, n)), this.rootGroup.add(s), e.group = s;\n }\n /**\n * 创建带文字的圆圈 Sprite\n * Sprite 默认朝向相机(billboard),depthTest=false 保证始终可见\n */\n _makeCircleSprite(e, t) {\n const i = document.createElement(\"canvas\");\n i.width = 128, i.height = 128;\n const s = i.getContext(\"2d\"), r = 128 / 2, a = 128 / 2, l = 128 / 2 - 4;\n s.beginPath(), s.arc(r, a, l, 0, Math.PI * 2), s.fillStyle = \"white\", s.fill(), s.strokeStyle = \"#1890ff\", s.lineWidth = 6, s.stroke(), s.fillStyle = \"#1890ff\", s.font = `bold ${Math.round(128 * 0.38)}px Arial`, s.textAlign = \"center\", s.textBaseline = \"middle\", s.fillText(e, r, a);\n const h = new M.CanvasTexture(i), c = new M.SpriteMaterial({\n map: h,\n depthTest: !1,\n transparent: !0\n }), u = new M.Sprite(c);\n return u.position.copy(t), u.scale.set(0.5, 0.5, 1), u.renderOrder = 999, u;\n }\n}\nconst Tp = [\n { Id: \"339\", Name: \"站台\", Elevation: -0.32808398950131235 },\n { Id: \"2787\", Name: \"站厅\", Elevation: 16.896325459317584 },\n { Id: \"236633\", Name: \"顶板\", Elevation: 36.745406824146976 }\n];\nclass Ep {\n engine;\n isVisible = !1;\n levels = [];\n svgContainer = null;\n svgOverlay = null;\n worldToScreen = null;\n // 水平面半尺寸(固定值,与 Three.js 世界坐标单位一致)\n halfSize = 500;\n COLOR = \"#1890ff\";\n PLANE_OPACITY = 0.08;\n constructor(e) {\n this.engine = e, this._initSvg();\n }\n _initSvg() {\n this.svgContainer = document.createElement(\"div\"), this.svgContainer.style.position = \"absolute\", this.svgContainer.style.top = \"0\", this.svgContainer.style.left = \"0\", this.svgContainer.style.width = \"100%\", this.svgContainer.style.height = \"100%\", this.svgContainer.style.pointerEvents = \"none\", this.svgContainer.style.overflow = \"hidden\", this.svgContainer.style.display = \"none\", this.engine.container.appendChild(this.svgContainer), this.svgOverlay = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\"), this.svgOverlay.style.position = \"absolute\", this.svgOverlay.style.top = \"0\", this.svgOverlay.style.left = \"0\", this.svgOverlay.style.width = \"1920px\", this.svgOverlay.style.height = \"1080px\", this.svgOverlay.style.overflow = \"visible\", this.svgContainer.appendChild(this.svgOverlay);\n }\n // ──────────────────────────────────────────────\n // 公共 API\n // ──────────────────────────────────────────────\n /** 传入标高数据并渲染 */\n setData(e) {\n this._clearAll(), this.levels = e.map((t) => ({ data: t, group: null, svgGroup: null })), this.levels.forEach((t) => this._buildThreeObject(t));\n }\n /** 使用内置模拟数据(调试用) */\n setMockData() {\n this.setData(Tp);\n }\n /** 显示标高 */\n show() {\n this.isVisible = !0, this.svgContainer && (this.svgContainer.style.display = \"block\"), this.levels.forEach((e) => {\n e.group && (e.group.visible = !0);\n });\n }\n /** 隐藏标高 */\n hide() {\n this.isVisible = !1, this.svgContainer && (this.svgContainer.style.display = \"none\"), this.levels.forEach((e) => {\n e.group && (e.group.visible = !1);\n });\n }\n /** 切换显示/隐藏 */\n toggle() {\n this.isVisible ? this.hide() : this.show();\n }\n /** 每帧刷新(需在动画循环中调用) */\n update() {\n !this.isVisible || !this.svgOverlay || !this.levels.length || !this.engine.camera || !this.engine.renderer || (this._initWorldToScreen(), this.levels.forEach((e) => this._updateSvgLabels(e)));\n }\n /** 销毁,释放资源 */\n dispose() {\n this._clearAll(), this.svgContainer && (this.svgContainer.remove(), this.svgContainer = null), this.svgOverlay = null, this.worldToScreen = null;\n }\n // ──────────────────────────────────────────────\n // 内部实现\n // ──────────────────────────────────────────────\n _initWorldToScreen() {\n this.engine.camera && this.engine.renderer && this.engine.scene && (this.worldToScreen = new je(\n this.engine.camera,\n this.engine.renderer,\n this.engine.scene\n ));\n }\n _clearAll() {\n this.levels.forEach((e) => {\n e.group && this.engine.scene && (this.engine.scene.remove(e.group), e.group.traverse((t) => {\n t.geometry && t.geometry.dispose(), t.material && (Array.isArray(t.material) ? t.material.forEach((n) => n.dispose()) : t.material.dispose());\n }), e.group = null), e.svgGroup && this.svgOverlay && (e.svgGroup.remove(), e.svgGroup = null);\n }), this.levels = [];\n }\n _buildThreeObject(e) {\n if (!this.engine.scene) return;\n const t = e.data.Elevation, n = this.halfSize, i = new M.Group(), s = new M.PlaneGeometry(n * 2, n * 2);\n s.rotateX(-Math.PI / 2);\n const r = new M.MeshBasicMaterial({\n color: this.COLOR,\n transparent: !0,\n opacity: this.PLANE_OPACITY,\n side: M.DoubleSide,\n depthWrite: !1\n }), a = new M.Mesh(s, r);\n a.position.y = t, i.add(a);\n const l = [\n new M.Vector3(-n, t, -n),\n new M.Vector3(n, t, -n),\n new M.Vector3(n, t, n),\n new M.Vector3(-n, t, n),\n new M.Vector3(-n, t, -n)\n // 闭合\n ], h = new M.BufferGeometry().setFromPoints(l), c = new M.LineBasicMaterial({\n color: this.COLOR,\n transparent: !0,\n opacity: 0.7\n });\n if (i.add(new M.Line(h, c)), i.visible = this.isVisible, this.engine.scene.add(i), e.group = i, this.svgOverlay) {\n const u = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n u.dataset.levelId = e.data.Id;\n for (let m = 0; m < 4; m++)\n u.appendChild(this._makeLabel(e.data.Name, e.data.Elevation));\n this.svgOverlay.appendChild(u), e.svgGroup = u;\n }\n }\n _updateSvgLabels(e) {\n if (!e.svgGroup || !this.worldToScreen) return;\n const t = this.halfSize, n = e.data.Elevation, i = [\n new M.Vector3(-t, n, -t),\n new M.Vector3(t, n, -t),\n new M.Vector3(t, n, t),\n new M.Vector3(-t, n, t)\n ], s = Array.from(e.svgGroup.children);\n i.forEach((r, a) => {\n const l = this.worldToScreen.worldToScreen(r);\n s[a].setAttribute(\"x\", String(l.x)), s[a].setAttribute(\"y\", String(l.y));\n });\n }\n _makeLabel(e, t) {\n const n = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n return n.textContent = `${e} ▲${t.toFixed(3)}m`, n.setAttribute(\"text-anchor\", \"middle\"), n.setAttribute(\"dominant-baseline\", \"central\"), n.setAttribute(\"fill\", this.COLOR), n.setAttribute(\"font-size\", \"12\"), n.setAttribute(\"font-family\", \"Arial, sans-serif\"), n.setAttribute(\"font-weight\", \"bold\"), n.setAttribute(\"stroke\", \"white\"), n.setAttribute(\"stroke-width\", \"2\"), n.setAttribute(\"paint-order\", \"stroke\"), n.style.pointerEvents = \"none\", n;\n }\n}\nclass Ap {\n engine;\n constructor(e) {\n }\n update() {\n }\n}\nclass Cp {\n engine;\n currentHdrId = \"0\";\n isVisible = !0;\n currentIntensity = 0.2;\n currentTexture = null;\n skybox = null;\n textureCache = /* @__PURE__ */ new Map();\n hdrList = [\n { id: \"0\", name: \"无\" },\n { id: \"1\", name: \"纯净-多云\", url: \"assets/hdr/纯净-多云.hdr\" },\n { id: \"2\", name: \"纯净-落日\", url: \"assets/hdr/纯净-落日.hdr\" },\n { id: \"3\", name: \"纯净-少云\", url: \"assets/hdr/纯净-少云.hdr\" },\n { id: \"4\", name: \"纯净-无云\", url: \"assets/hdr/纯净-无云.hdr\" },\n { id: \"5\", name: \"纯净-夜晚\", url: \"assets/hdr/纯净-夜晚.hdr\" },\n { id: \"6\", name: \"纯净-阴天\", url: \"assets/hdr/纯净-阴天.hdr\" },\n { id: \"7\", name: \"纯净-中云\", url: \"assets/hdr/纯净-中云.hdr\" }\n ];\n constructor(e) {\n this.engine = e;\n }\n /**\n * 获取 HDR 列表\n */\n getHdrList() {\n return this.hdrList;\n }\n /**\n * 切换 HDR 背景\n * @param id - HDR id,\"0\" 表示清除 HDR\n */\n async setHdr(e) {\n const t = this.hdrList.find((n) => n.id === e);\n if (!t) {\n console.warn(`[Hdr] HDR id \"${e}\" not found`);\n return;\n }\n if (e === \"0\" || !t.url) {\n this._clearHdr(), this.currentHdrId = \"0\";\n return;\n }\n if (this.textureCache.has(e)) {\n this._applyTexture(this.textureCache.get(e)), this.currentHdrId = e;\n return;\n }\n try {\n const n = await this._loadHdr(t.url);\n this.textureCache.set(e, n), this._applyTexture(n), this.currentHdrId = e;\n } catch (n) {\n console.error(`[Hdr] Failed to load HDR \"${t.url}\":`, n);\n }\n }\n /**\n * 设置 HDR 天空球可见性(不影响环境光照)\n * @param visible - true 显示,false 隐藏\n */\n setVisible(e) {\n this.isVisible = e, e && this.currentTexture && !this.skybox ? this._createSkybox(this.currentTexture) : this.skybox && (this.skybox.visible = e);\n }\n /**\n * 获取当前 HDR id\n */\n getCurrentHdrId() {\n return this.currentHdrId;\n }\n /**\n * 获取 HDR 背景是否可见\n */\n getVisible() {\n return this.isVisible;\n }\n /**\n * 设置 HDR 整体亮度\n * @param intensity - 亮度倍率,1 为原始亮度,推荐范围 0.1 ~ 3\n */\n setIntensity(e) {\n this.currentIntensity = e, this.engine.scene && (this.engine.scene.environmentIntensity = e), this.skybox && this.skybox.material.color.setScalar(e);\n }\n /**\n * 获取当前 HDR 亮度\n */\n getIntensity() {\n return this.currentIntensity;\n }\n /**\n * 动态添加自定义 HDR 条目(用于外部扩展)\n */\n addHdrItem(e) {\n const t = this.hdrList.find((n) => n.id === e.id);\n t ? Object.assign(t, e) : this.hdrList.push(e);\n }\n /**\n * 释放所有缓存纹理\n */\n dispose() {\n this._clearHdr(), this.textureCache.forEach((e) => e.dispose()), this.textureCache.clear();\n }\n // ——— 私有方法 ———\n _loadHdr(e) {\n return new Promise((t, n) => {\n new nd().load(\n e,\n (i) => {\n i.mapping = M.EquirectangularReflectionMapping, t(i);\n },\n void 0,\n (i) => n(i)\n );\n });\n }\n _applyTexture(e) {\n if (this.currentTexture = e, !this.engine.scene) return;\n const t = new M.PMREMGenerator(this.engine.renderer), n = t.fromEquirectangular(e).texture;\n t.dispose(), this.engine.scene.environment = n, this.engine.scene.environmentIntensity = this.currentIntensity, this.engine.scene.background = null, this._removeSkybox(), this.isVisible && this._createSkybox(e), this.engine.setting.setAmbientLightIntensity(0);\n }\n /**\n * 创建超大天空球,兼容正交/透视两种相机\n * - radius 5000:远超任何场景对象,确保始终在背景层\n * - BackSide:从内部观察球面\n * - depthWrite false + renderOrder -1:不写入深度缓冲,始终渲染在最底层\n * - frustumCulled false:防止大球被裁剪掉\n */\n _createSkybox(e) {\n const t = new M.SphereGeometry(500, 64, 32), n = new M.MeshBasicMaterial({\n map: e,\n side: M.BackSide,\n depthWrite: !1,\n fog: !1\n });\n this.skybox = new M.Mesh(t, n), this.skybox.name = \"hdr_skybox\", this.skybox.renderOrder = -1, this.skybox.frustumCulled = !1, n.color.setScalar(this.currentIntensity), this.engine.scene.add(this.skybox);\n }\n _removeSkybox() {\n this.skybox && (this.engine.scene.remove(this.skybox), this.skybox.geometry.dispose(), this.skybox.material.dispose(), this.skybox = null);\n }\n _clearHdr() {\n this.currentTexture = null, this._removeSkybox(), this.engine.scene && (this.engine.scene.background = null, this.engine.scene.environment = null, this.engine.setting.setAmbientLightIntensity(1));\n }\n}\nclass Pp {\n engine;\n currentId = \"0\";\n groundGroup;\n groundMesh = null;\n waterMaterial = null;\n clock;\n groundY = 0;\n groundList = [\n { id: \"0\", name: \"无\" },\n { id: \"1\", name: \"草地\", color: 4881486, roughness: 0.9, metalness: 0, map: \"/textures/ground/grass.jpg\" },\n { id: \"2\", name: \"混凝土\", color: 9474192, roughness: 0.85, metalness: 0.1, map: \"/textures/ground/concrete.jpg\" },\n { id: \"3\", name: \"地砖\", color: 13152400, roughness: 0.55, metalness: 0.1, map: \"/textures/ground/tiles.jpg\" },\n { id: \"4\", name: \"湖面\", water: !0, waterColor: 28062, waveHeight: 0.04, waveSpeed: 0.8 },\n { id: \"5\", name: \"海面\", water: !0, waterColor: 15708, waveHeight: 0.12, waveSpeed: 1.4 }\n ];\n constructor(e) {\n this.engine = e, this.groundGroup = new M.Group(), this.groundGroup.name = \"groundGroup\", this.clock = new M.Clock();\n }\n init() {\n this.engine.scene.add(this.groundGroup);\n }\n /**\n * 切换地面类型\n * @param id 地面 id:\"0\" 无 | \"1\" 草地 | \"2\" 混凝土 | \"3\" 地砖 | \"4\" 湖面 | \"5\" 海面\n */\n setGround(e, t) {\n if (this._dispose(), this.currentId = e, e === \"0\") return;\n const n = this.groundList.find((h) => h.id === e);\n if (!n) return;\n const i = t?.size ?? 300, s = n.water ? 80 : 1, r = new M.PlaneGeometry(i, i, s, s);\n r.rotateX(-Math.PI / 2);\n let a;\n if (n.water)\n a = this._createWaterMaterial(n, t), this.waterMaterial = a;\n else {\n const h = new M.MeshStandardMaterial({\n color: n.color,\n roughness: n.roughness,\n metalness: n.metalness\n }), c = t?.textureUrl ?? n.map;\n c && new M.TextureLoader().load(\n c,\n (u) => {\n u.wrapS = u.wrapT = M.RepeatWrapping, u.repeat.set(8, 8), h.map = u, h.needsUpdate = !0;\n },\n void 0,\n () => {\n }\n ), a = h;\n }\n const l = new M.Mesh(r, a);\n l.name = \"groundMesh\", l.receiveShadow = !0, l.castShadow = !1, l.position.y = -0.01, this.groundMesh = l, this.groundGroup.add(l), this.groundGroup.position.y = this.groundY, this.clock.start();\n }\n /**\n * 设置地面高度(默认 0)\n * @param y 世界空间 Y 坐标\n */\n setHeight(e) {\n this.groundY = e, this.groundGroup.position.y = e;\n }\n /** 获取当前地面高度 */\n getHeight() {\n return this.groundY;\n }\n _createWaterMaterial(e, t) {\n const n = new M.Color(e.waterColor), i = n.clone().multiplyScalar(0.35), s = t?.sunDirection ? t.sunDirection.clone().normalize() : new M.Vector3(0.5, 0.8, 0.5).normalize();\n return new M.ShaderMaterial({\n uniforms: {\n uTime: { value: 0 },\n uWaterColor: { value: n },\n uDeepColor: { value: i },\n uSunColor: { value: new M.Color(16777215) },\n uSunDir: { value: s },\n uWaveHeight: { value: e.waveHeight ?? 0.05 },\n uWaveSpeed: { value: e.waveSpeed ?? 1 },\n uOpacity: { value: t?.opacity ?? 0.82 }\n },\n vertexShader: Rp,\n fragmentShader: Dp,\n transparent: !0,\n side: M.DoubleSide\n });\n }\n /** 每帧调用,驱动水面动画 */\n update() {\n if (!this.waterMaterial) return;\n this.waterMaterial.uniforms.uTime.value = this.clock.getElapsedTime();\n const e = this.engine.scene?.dirLight;\n if (e) {\n const t = e.position.clone().normalize();\n this.waterMaterial.uniforms.uSunDir.value.copy(t);\n }\n }\n /** 获取地面列表(id + 名称) */\n getGroundList() {\n return this.groundList.map(({ id: e, name: t }) => ({ id: e, name: t }));\n }\n /** 获取当前地面 id */\n getCurrentId() {\n return this.currentId;\n }\n show() {\n this.groundGroup.visible = !0;\n }\n hide() {\n this.groundGroup.visible = !1;\n }\n dispose() {\n this._dispose(), this.engine.scene.remove(this.groundGroup);\n }\n _dispose() {\n if (!this.groundMesh) return;\n this.groundMesh.geometry.dispose();\n const e = this.groundMesh.material;\n Array.isArray(e) ? e.forEach((t) => t.dispose()) : e.dispose(), this.groundGroup.remove(this.groundMesh), this.groundMesh = null, this.waterMaterial = null;\n }\n}\nconst Rp = (\n /* glsl */\n `\nuniform float uTime;\nuniform float uWaveHeight;\nuniform float uWaveSpeed;\n\nvarying vec2 vUv;\nvarying vec3 vWorldPos;\nvarying vec3 vNormal;\n\nvoid main() {\n vUv = uv;\n vec3 pos = position;\n float t = uTime * uWaveSpeed;\n\n // 多层叠加正弦波,模拟真实水面涟漪\n float w1 = sin(pos.x * 0.80 + t * 1.20) * uWaveHeight;\n float w2 = sin(pos.z * 0.60 + t * 0.90) * uWaveHeight * 1.10;\n float w3 = sin((pos.x + pos.z) * 0.50 + t * 1.50) * uWaveHeight * 0.60;\n float w4 = sin(pos.x * 1.40 - pos.z * 0.90 + t * 0.70) * uWaveHeight * 0.40;\n pos.y += w1 + w2 + w3 + w4;\n\n // 由波形偏导数近似计算法线\n float dx = ( cos(pos.x * 0.80 + t * 1.20) * 0.80\n + cos((pos.x + pos.z) * 0.50 + t * 1.50) * 0.50\n + cos(pos.x * 1.40 - pos.z * 0.90 + t * 0.70) * 1.40 ) * uWaveHeight;\n float dz = ( cos(pos.z * 0.60 + t * 0.90) * 0.60\n + cos((pos.x + pos.z) * 0.50 + t * 1.50) * 0.50\n - cos(pos.x * 1.40 - pos.z * 0.90 + t * 0.70) * 0.90 ) * uWaveHeight;\n\n vNormal = normalize(normalMatrix * vec3(-dx, 1.0, -dz));\n\n vec4 worldPos = modelMatrix * vec4(pos, 1.0);\n vWorldPos = worldPos.xyz;\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);\n}\n`\n), Dp = (\n /* glsl */\n `\nuniform float uTime;\nuniform vec3 uWaterColor;\nuniform vec3 uDeepColor;\nuniform vec3 uSunColor;\nuniform vec3 uSunDir;\nuniform float uOpacity;\n\nvarying vec2 vUv;\nvarying vec3 vWorldPos;\nvarying vec3 vNormal;\n\nvoid main() {\n vec3 N = normalize(vNormal);\n vec3 V = normalize(cameraPosition - vWorldPos);\n vec3 L = normalize(uSunDir);\n\n // 高频细节法线扰动(模拟毛细波)\n float rx = sin(vUv.x * 55.0 + uTime * 3.2) * 0.012\n + sin(vUv.x * 30.0 - uTime * 1.8) * 0.008;\n float ry = sin(vUv.y * 50.0 + uTime * 2.8) * 0.012\n + sin(vUv.y * 25.0 - uTime * 2.2) * 0.008;\n N = normalize(N + vec3(rx, 0.0, ry));\n\n // Fresnel(Schlick 近似):掠射角反射更强\n float NdotV = clamp(dot(N, V), 0.0, 1.0);\n float fresnel = 0.02 + 0.98 * pow(1.0 - NdotV, 5.0);\n\n // 漫反射\n float diff = max(dot(N, L), 0.0);\n\n // 高光(Blinn-Phong)\n vec3 H = normalize(L + V);\n float spec = pow(max(dot(N, H), 0.0), 160.0);\n\n // 深浅水色混合\n float depthFac = clamp((N.y - 0.90) * 10.0, 0.0, 1.0);\n vec3 baseCol = mix(uDeepColor, uWaterColor, depthFac);\n\n vec3 color = baseCol * (0.30 + diff * 0.60)\n + uSunColor * spec * 1.0\n + vec3(0.72, 0.88, 1.0) * fresnel * 0.28; // 天空反射色\n\n gl_FragColor = vec4(color, uOpacity);\n}\n`\n);\nclass kp {\n // 引擎参数\n options;\n DeviceType;\n animationId = null;\n isRenderingPaused = !1;\n controlsEnabledBeforePause = !0;\n animate;\n onWindowResize;\n // 自适应渲染 FPS 监控\n _fpsFrameCount = 0;\n _fpsLastCheck = 0;\n _fpsLastSwitch = 0;\n _lowFpsCount = 0;\n // 连续低帧次数\n _highFpsCount = 0;\n // 连续高帧次数\n _fpsCheckInterval = 100;\n // 每1秒统计一次\n _fpsSwitchCooldown = 100;\n // 切换后10秒冷却\n _fpsThreshold = 30;\n // 低于30帧计入低帧\n _fpsUpgradeThreshold = 60;\n // 高于60帧计入高帧\n _lowFpsRequired = 3;\n // 连续3秒低帧才降级\n _highFpsRequired = 0.1;\n // 连续5秒高帧才升级\n // 鼠标是否按下\n isMouseDown = !1;\n // 滚轮是否正在滚动\n isWheeling = !1;\n // 基础模块\n scene;\n camera;\n renderer;\n sceneModule;\n cameraModule;\n deviceModule;\n renderModule;\n controlModule;\n composerModule;\n loaderModule;\n engineStatus;\n events;\n lightModule;\n interactionModule;\n modelToolModule;\n worldToScreen;\n handelBehaved;\n octreeBox;\n controls;\n stats;\n catchSvg;\n engineModelModule;\n // 功能模块 \n viewCube;\n rangeScale;\n setting;\n measure;\n clipping;\n modelTree;\n engineInfo;\n modelProperties;\n modelMapperBatch;\n modelEdge;\n ai;\n pathRoaming;\n hoverHighLight;\n minMap;\n grid;\n level;\n text;\n hdr;\n ground;\n // 业务数据\n models = [];\n reactBoundingClientRect = { left: 0, top: 0 };\n version = \"2.0.4\";\n versionEl = null;\n // 引擎容器\n container;\n constructor(e) {\n if (this.options = e, this.container = document.getElementById(e.containerId), !this.container)\n throw new Error(`Container ${e.containerId} not found`);\n this.engineModelModule = new Yu(this), this.engineModelModule.init(), this.ai = new _p(this), this.deviceModule = new Hl(this), this.DeviceType = this.deviceModule.getDeviceType(), this.cameraModule = new Vl(this), this.sceneModule = new Ul(this), this.scene = this.sceneModule.scene, this.renderModule = new jl(this), this.renderer = this.renderModule.createRenderer(), this.camera = this.cameraModule.orthographicCamera, this.scene.camera = this.camera, this.controlModule = new sc(this), this.controlModule.switchDefaultMode(), this.controls = this.controlModule.orbitControls, this.composerModule = new yc(this), this.composerModule.init(), this.events = new Hu(), this.engineStatus = new Vu(this), this.engineStatus.init(), this.loaderModule = new Uu(this), this.lightModule = new ju(this), this.lightModule.init(), this.viewCube = new od(this), this.viewCube.init(), this.options.showViewCube == !1 && this.viewCube.hide(), this.octreeBox = ad(this), this.rangeScale = new ld(this), this.rangeScale.init(), this.clipping = new fp(this), this.clipping.init(), this.setting = new cd(this), this.setting.init(), this.engineModelModule.init(), this.handelBehaved = hr(this), this.modelMapperBatch = new yp(this), this.measure = new wd(this), this.modelToolModule = new Wu(this), this.modelProperties = new gp(this), this.interactionModule = new Gu(this), this.interactionModule.init(), this.interactionModule.active(), this.hoverHighLight = new Hi(this), this.modelEdge = new wp(this), this.modelTree = new pp(this), this.engineInfo = new mp(this), this.pathRoaming = new vp(this), this.pathRoaming.init(), this.minMap = new bp(this), this.grid = new Sp(this), this.level = new Ep(this), this.text = new Ap(this), this.hdr = new Cp(this), this.ground = new Pp(this), this.ground.init(), this.worldToScreen = new je(this.camera, this.renderer, this.scene), this.options.showStats && (this.stats = new Qu(), this.stats.showPanel(0), this.stats.dom.style.position = \"absolute\", this.stats.dom.style.top = \"0px\", this.stats.dom.style.left = \"0px\", this.stats.dom.style.zIndex = \"1000\", this.container.appendChild(this.stats.dom));\n let t = document.createElement(\"div\");\n t.className = \"versionText\", this.versionEl = t, this.updateVersionDisplay(), this.container.appendChild(t);\n let n = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n n.style.position = \"absolute\", n.style.width = \"100%\", n.style.height = \"100%\", n.style.zIndex = \"1000\", n.style.left = \"0px\", n.style.top = \"0px\", n.style.pointerEvents = \"none\";\n const i = this.renderer?.domElement.width || 1920, s = this.renderer?.domElement.height || 1080;\n n.setAttribute(\"viewBox\", `0 0 ${i} ${s}`), n.setAttribute(\"preserveAspectRatio\", \"none\"), this.container.appendChild(n), this.catchSvg = n, this.onWindowResize = () => {\n this.handleWindowResize();\n }, window.addEventListener(\"resize\", this.onWindowResize);\n let r = this;\n this.controls.addEventListener(\"start\", () => {\n r.events.trigger(zt.EngineBusy);\n }), this.controls.addEventListener(\"end\", () => {\n r.events.trigger(zt.EngineFree);\n }), this.controls.addEventListener(\"change\", () => {\n }), this.animate = () => {\n if (!this.isRenderingPaused)\n this.animationId = requestAnimationFrame(this.animate);\n else {\n this.animationId = null;\n return;\n }\n this.stats && this.stats.begin(), this.composerModule && this.composerModule.composer.render(), this.viewCube && this.viewCube.cubeTool.RenderScene(), this.measure.update(), this.ground.update(), this.hoverHighLight.update(), this.controlModule.update(), this.minMap.update(), this.grid.update(), this.level.update(), this.text && this.text.update(), this.stats && this.stats.end(), this._fpsFrameCount++;\n const a = performance.now();\n if (a - this._fpsLastCheck >= this._fpsCheckInterval) {\n const l = a - this._fpsLastCheck, h = this._fpsFrameCount / l * 1e3;\n this._fpsFrameCount = 0, this._fpsLastCheck = a, h < this._fpsThreshold ? (this._lowFpsCount++, this._highFpsCount = 0, this._lowFpsCount >= this._lowFpsRequired && a - this._fpsLastSwitch > this._fpsSwitchCooldown && (this._adaptiveRenderingDowngrade(), this._fpsLastSwitch = a, this._lowFpsCount = 0)) : h > this._fpsUpgradeThreshold ? (this._highFpsCount++, this._lowFpsCount = 0, this._highFpsCount >= this._highFpsRequired && a - this._fpsLastSwitch > this._fpsSwitchCooldown && (this._adaptiveRenderingUpgrade(), this._fpsLastSwitch = a, this._highFpsCount = 0)) : (this._lowFpsCount = 0, this._highFpsCount = 0);\n }\n if (this.scene) {\n let l = this.scene?.dirLight;\n l && this.camera && this.updateLightPosition(this.camera, l);\n }\n }, this.animate();\n }\n updateVersionDisplay() {\n if (!this.versionEl) return;\n const e = {\n simple: \"simple\",\n balance: \"balance\",\n advanced: \"advanced\"\n }, t = this.engineModelModule?.getCurrentMode() ?? \"\", n = e[t] ?? t;\n this.versionEl.innerHTML = `v${this.version} | ${n}`;\n }\n updateLightPosition(e, t) {\n const n = new M.Vector3();\n e.getWorldDirection(n);\n const i = 100, s = new M.Vector3().copy(n).multiplyScalar(-i), r = new M.Vector3(0, 1, 0), a = new M.Vector3().crossVectors(n, r).normalize();\n s.addScaledVector(r, i * 0.5), s.addScaledVector(a, i * 0.3), t.position.copy(e.position).add(s);\n const l = new M.Vector3().copy(e.position).add(n.multiplyScalar(20));\n t.target.position.copy(l), t.target.updateMatrixWorld();\n }\n /**\n * 自适应渲染降级:将渲染模式降低一级\n */\n _adaptiveRenderingDowngrade() {\n const e = [\"simple\", \"balance\", \"advanced\"], t = this.engineModelModule.getCurrentMode(), n = e.indexOf(t);\n if (n > 0) {\n const i = e[n - 1];\n console.log(`[AdaptiveRendering] FPS低于${this._fpsThreshold},自动降级: ${t} → ${i}`), this.engineModelModule.autoSwitch(i);\n }\n }\n /**\n * 自适应渲染升级:将渲染模式提升一级\n */\n _adaptiveRenderingUpgrade() {\n const e = [\"simple\", \"balance\", \"advanced\"], t = this.engineModelModule.getCurrentMode(), n = e.indexOf(t);\n if (n < e.length - 1) {\n const i = e[n + 1];\n console.log(`[AdaptiveRendering] FPS高于${this._fpsUpgradeThreshold},自动升级: ${t} → ${i}`), this.engineModelModule.autoSwitch(i);\n }\n }\n /**\n * 暂停渲染循环\n */\n pauseRendering() {\n if (this.isRenderingPaused) {\n console.warn(\"[BimEngine] Rendering is already paused\");\n return;\n }\n this.isRenderingPaused = !0, this.controls && (this.controlsEnabledBeforePause = this.controls.enabled, this.controls.enabled = !1);\n }\n /**\n * 恢复渲染循环\n */\n resumeRendering() {\n if (!this.isRenderingPaused) {\n console.warn(\"[BimEngine] Rendering is not paused\");\n return;\n }\n this.isRenderingPaused = !1, this.controls && (this.controls.enabled = this.controlsEnabledBeforePause), this.animationId === null && this.animate();\n }\n /**\n * 检查渲染是否暂停\n */\n isRenderingPausedState() {\n return this.isRenderingPaused;\n }\n /**\n * 处理窗口大小变化\n */\n handleWindowResize(e, t) {\n if (!this.container || !this.renderer || !this.camera)\n return;\n if (e === void 0 || t === void 0) {\n const i = this.deviceModule.getContainerSize();\n e = e ?? i.width, t = t ?? i.height;\n }\n if (!e || !t)\n return;\n this.renderer.setPixelRatio(window.devicePixelRatio), this.renderer.setSize(e, t);\n const n = e / t;\n if (this.camera === this.cameraModule.perspectiveCamera)\n this.cameraModule.perspectiveCamera.aspect = n, this.cameraModule.perspectiveCamera.updateProjectionMatrix(), this.camera = this.cameraModule.perspectiveCamera;\n else if (this.camera === this.cameraModule.orthographicCamera) {\n const i = this.cameraModule.orthographicCamera, s = 50, r = this.container.clientWidth / this.container.clientHeight;\n i.left = s * r / -2, i.right = s * r / 2, i.top = s / 2, i.bottom = s / -2, i.updateProjectionMatrix();\n }\n if (this.catchSvg) {\n const i = this.renderer.domElement.width, s = this.renderer.domElement.height;\n this.catchSvg.setAttribute(\"viewBox\", `0 0 ${i} ${s}`);\n }\n this.events && this.events.trigger(zt.ViewportResize, { width: e, height: t });\n }\n /**\n * 销毁引擎,释放资源\n */\n dispose() {\n console.log(\"[BimEngine] Starting engine disposal...\"), this.animationId !== null && (cancelAnimationFrame(this.animationId), this.animationId = null), this.isRenderingPaused = !0, this.onWindowResize && window.removeEventListener(\"resize\", this.onWindowResize);\n try {\n this.measure && (this.measure.disActive(), this.measure.clearAll(), this.measure.annotationContainer && this.measure.annotationContainer.remove()), this.hdr && this.hdr.dispose(), this.minMap && this.minMap.dispose(), this.text && this.text.dispose(), this.clipping && this.clipping.disActive(), this.interactionModule && this.interactionModule.disActive(), this.viewCube && this.viewCube.cubeTool && typeof this.viewCube.cubeTool.dispose == \"function\" && this.viewCube.cubeTool.dispose();\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing managers:\", e);\n }\n try {\n this.controlModule && (this.controlModule.originDiv && this.controlModule.originDiv.remove(), this.controlModule.orbitControls && typeof this.controlModule.orbitControls.dispose == \"function\" && this.controlModule.orbitControls.dispose(), this.controlModule.firstPersonControls && typeof this.controlModule.firstPersonControls.dispose == \"function\" && this.controlModule.firstPersonControls.dispose());\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing controls:\", e);\n }\n this.scene && this.clearScene(this.scene);\n try {\n this.composerModule && this.composerModule.composer && (this.composerModule.composer.passes && this.composerModule.composer.passes.forEach((e) => {\n e.dispose && e.dispose();\n }), this.composerModule.composer.renderTarget1 && this.composerModule.composer.renderTarget1.dispose(), this.composerModule.composer.renderTarget2 && this.composerModule.composer.renderTarget2.dispose());\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing composer:\", e);\n }\n try {\n this.renderModule && this.renderModule.disposeRenderer(), this.renderer && (this.renderer.domElement && this.renderer.domElement.parentElement && this.renderer.domElement.parentElement.removeChild(this.renderer.domElement), this.renderer.dispose(), this.renderer.forceContextLoss());\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing renderer:\", e);\n }\n try {\n this.stats && this.stats.dom && this.stats.dom.parentElement && this.stats.dom.parentElement.removeChild(this.stats.dom), this.catchSvg && this.catchSvg.parentElement && this.catchSvg.parentElement.removeChild(this.catchSvg);\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing DOM elements:\", e);\n }\n try {\n this.events && this.events.listeners && this.events.listeners.clear();\n } catch (e) {\n console.warn(\"[BimEngine] Error clearing event listeners:\", e);\n }\n this.scene = null, this.camera = null, this.renderer = null, this.controls = null, this.models = [], this.container = null, console.log(\"[BimEngine] Engine disposal completed\");\n }\n /**\n * 递归清理场景中的所有对象\n */\n clearScene(e) {\n if (!e) return;\n [...e.children].forEach((n) => {\n this.clearScene(n);\n }), e.parent && e.parent.remove(e), e instanceof M.Mesh && (e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((n) => this.disposeMaterial(n)) : this.disposeMaterial(e.material))), e instanceof M.Line && (e.geometry && e.geometry.dispose(), e.material && this.disposeMaterial(e.material)), e instanceof M.Points && (e.geometry && e.geometry.dispose(), e.material && this.disposeMaterial(e.material)), e instanceof M.InstancedMesh && (e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((n) => this.disposeMaterial(n)) : this.disposeMaterial(e.material)), e.instanceMatrix && (e.instanceMatrix = null), e.instanceColor && (e.instanceColor = null)), e instanceof M.Sprite && e.material && this.disposeMaterial(e.material);\n }\n /**\n * 清理材质及其纹理\n */\n disposeMaterial(e) {\n if (!e) return;\n [\n \"map\",\n \"lightMap\",\n \"bumpMap\",\n \"normalMap\",\n \"specularMap\",\n \"envMap\",\n \"alphaMap\",\n \"aoMap\",\n \"displacementMap\",\n \"emissiveMap\",\n \"gradientMap\",\n \"metalnessMap\",\n \"roughnessMap\",\n \"clearcoatMap\",\n \"clearcoatNormalMap\",\n \"clearcoatRoughnessMap\",\n \"transmissionMap\",\n \"thicknessMap\",\n \"sheenColorMap\",\n \"sheenRoughnessMap\",\n \"specularIntensityMap\",\n \"specularColorMap\",\n \"iridescenceMap\",\n \"iridescenceThicknessMap\"\n ].forEach((n) => {\n const i = e[n];\n i && i instanceof M.Texture && i.dispose();\n }), e.dispose();\n }\n}\nfunction Jp(o) {\n return new kp(o);\n}\nexport {\n Jp as createEngine\n};\n//# sourceMappingURL=bim-engine-sdk.es.js.map\n","import type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { themeManager } from '../../services/theme';\nimport type { EngineOptions, ModelLoadOptions, EngineInfo } from './types';\nimport { type MeasureMode, type ClearHeightDirection, type ClearHeightSelectType } from '../../types/measure';\nimport type { MeasureUnit, MeasurePrecision } from '../measure-panel/types';\nimport type { SectionBoxRange } from '../section-box-panel/types';\nimport type { ManagerRegistry } from '../../core/manager-registry';\n// 导入第三方 SDK 的 createEngine 函数(从 npm 包引入)\n//import { createEngine as createEngineSDK } from 'iflow-engine-base';\nimport { createEngine as createEngineSDK } from '../../../../bim_engine_base/dist/bim-engine-sdk.es';\nimport \"../../../../bim_engine_base/dist/iflow-engine-base.css\"\n\nexport type { EngineOptions, ModelLoadOptions, EngineInfo };\n\n/**\n * 创建 Engine 实例的工厂函数\n * 兼容旧代码直接 import { createEngine } 的方式\n */\nexport const createEngine = (options: EngineOptions, registry: ManagerRegistry) => {\n return new Engine(options, registry);\n};\n\n/**\n * 3D 引擎组件\n * 负责创建和管理第三方 3D 引擎实例\n */\nexport class Engine implements IBimComponent {\n /** 第三方 3D 引擎实例 */\n /** 第三方 3D 引擎实例 */\n private engine: any = null;\n /** 管理器注册表实例 */\n private registry: ManagerRegistry;\n /** 引擎挂载的容器元素 */\n private container: HTMLElement;\n /** 引擎容器 ID(用于传递给 createEngine) */\n private containerId: string;\n /** 引擎配置选项(不包含 container) */\n private options: Omit;\n /** 是否已初始化 */\n private _isInitialized = false;\n /** 是否已销毁 */\n private _isDestroyed = false;\n /** 主题订阅取消函数 */\n private unsubscribeTheme: (() => void) | null = null;\n /** 当前激活的测量类型 */\n private currentMeasureType: MeasureMode | null = null;\n /** 主测量功能是否已激活 */\n private isMeasureActive: boolean = false;\n /** 当前激活的剖切模式 */\n private currentSectionMode: 'x' | 'y' | 'z' | 'box' | 'face' | null = null;\n /** 当前选中的构件信息 */\n private selectedComponent: { url: string; id: string } | null = null;\n\n /**\n * 构造函数\n * @param options 3D 引擎配置选项\n */\n constructor(options: EngineOptions, registry: ManagerRegistry) {\n // 保存注册表\n this.registry = registry;\n // 解析容器元素\n this.container = options.container;\n // 如果容器没有 id,生成一个唯一的 id\n if (!this.container.id) {\n this.containerId = `engine-container-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n this.container.id = this.containerId;\n } else {\n this.containerId = this.container.id;\n }\n\n // 保存配置选项(设置默认值)\n this.options = {\n backgroundColor: 'linear-gradient(to bottom, rgb(214, 224, 235), rgb(246, 250, 255))', // 固定背景渐变色\n version: options.version ?? 'v2', // 默认使用 v2 版本\n showStats: options.showStats ?? false, // 默认不显示统计\n showViewCube: options.showViewCube ?? true, // 默认显示视图立方体\n };\n }\n\n /**\n * 初始化组件 (接口实现)\n * 创建 div 容器并初始化引擎\n */\n public init(): void {\n if (this._isInitialized) {\n console.warn('[Engine] Engine already initialized.');\n return;\n }\n\n if (this._isDestroyed) {\n console.error('[Engine] Cannot initialize destroyed engine.');\n return;\n }\n\n try {\n // 应用背景色到容器\n if (typeof this.options.backgroundColor === 'string') {\n this.container.style.background = this.options.backgroundColor;\n }\n\n // 创建引擎配置对象\n const engineConfig = {\n containerId: this.containerId,\n backgroundColor: this.options.backgroundColor,\n version: this.options.version,\n showStats: this.options.showStats,\n showViewCube: this.options.showViewCube,\n };\n\n // 输出配置信息\n console.log('引擎配置信息:', engineConfig);\n\n // 调用引擎创建函数创建引擎实例\n // 将 options 中的配置复制给 createEngine\n this.engine = createEngineSDK(engineConfig);\n\n if (!this.engine) {\n throw new Error('Failed to create engine instance');\n }\n\n // 标记为已初始化\n this._isInitialized = true;\n\n // 订阅主题变化\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 应用当前主题\n this.setTheme(themeManager.getTheme());\n\n // 监听构件点击事件\n this.engine.events.on('click', (hit: any) => {\n const registry = this.registry;\n if (hit && hit.object) {\n this.selectedComponent = {\n url: hit.object.url,\n id: hit.object.name\n };\n console.log('[Engine] 构件选中:', this.selectedComponent);\n registry.emit('component:selected', this.selectedComponent);\n } else {\n this.selectedComponent = null;\n console.log('[Engine] 取消选中');\n registry.emit('component:deselected', {});\n }\n });\n\n } catch (error) {\n console.error('[Engine] Failed to initialize engine:', error);\n this._isInitialized = false;\n throw error;\n }\n }\n\n /**\n * 设置主题 (接口实现)\n * 根据主题调整 3D 引擎的视觉效果(如背景色)\n * @param theme 全局主题配置\n */\n public setTheme(_theme: ThemeConfig): void {\n\n }\n\n /**\n * 设置语言 (接口实现)\n */\n public setLocales(): void {\n // 3D 引擎组件暂时不需要本地化\n }\n\n /**\n * 检查是否已初始化\n */\n public isInitialized(): boolean {\n return this._isInitialized;\n }\n\n\n /**\n * 加载 3D 模型\n * @param urls 模型文件 URL 数组\n * @param options 加载选项(位置、旋转、缩放)\n */\n public loadModel(urls: string[], options?: ModelLoadOptions): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Engine not initialized. Please call init() first.');\n return;\n }\n if (!urls || urls.length === 0) {\n console.error('[Engine] Model URLs are required.');\n return;\n }\n this.engine.loaderModule.loadModels(urls, options);\n }\n\n /**\n * 回到主视角\n * @returns \n */\n public CameraGoHome() {\n this.engine.viewCube.CameraGoHome();\n }\n\n /**\n * 订阅原始引擎事件\n * 用于需要访问底层引擎事件的场景(如测量回调、剖切移动等)\n * @param event 事件名称\n * @param handler 事件处理函数\n */\n public onRawEvent(event: string, handler: (...args: any[]) => void): void {\n this.engine?.events?.on(event, handler);\n }\n\n /**\n * 取消订阅原始引擎事件\n * @param event 事件名称\n * @param handler 事件处理函数\n */\n public offRawEvent(event: string, handler: (...args: any[]) => void): void {\n this.engine?.events?.off(event, handler);\n }\n\n /**\n * 暂停渲染\n */\n public pauseRendering(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.pauseRendering();\n }\n\n /**\n * 恢复渲染\n */\n public resumeRendering(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.resumeRendering();\n }\n\n /**\n * 销毁 3D 引擎,释放 GPU 资源\n */\n public dispose(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.dispose();\n }\n\n /**\n * 调整渲染器尺寸\n * 容器大小变化时调用,自动更新渲染器、相机投影矩阵和后处理合成器\n */\n public resize(): void {\n if (!this._isInitialized || !this.engine) {\n return;\n }\n // this.engine.handleWindowResize();\n }\n\n // ==================== 测量功能方法 ====================\n\n // ==================== 测量功能(统一 API) ====================\n\n /**\n * 激活测量功能\n * @param mode 测量类型\n * - 'clearHeight': 净高测量\n * - 'clearDistance': 净距测量\n * - 'distance': 距离测量 y\n * - 'elevation': 标高测量 y\n * - 'point': 坐标测量\n * - 'angle': 角度测量 y\n * - 'area': 面积测量 \n * - 'slope': 坡度测量 y\n */\n public activateMeasure(mode: MeasureMode): void {\n if (!this._isInitialized || !this.engine?.measure) {\n console.error('[Engine] Cannot activate measure: engine not initialized.');\n return;\n }\n\n if (this.currentMeasureType === mode) {\n console.log(`[Engine] Measure ${mode} already active, skipping.`);\n return;\n }\n\n // 先激活测量模块\n if (!this.isMeasureActive) {\n console.log('[Engine] Activating measure module');\n this.engine.measure.active();\n this.isMeasureActive = true;\n }\n\n console.log(`[Engine] Activating measure: ${mode}`);\n const measure = this.engine.measure;\n\n switch (mode) {\n case 'clearHeight':\n measure.clearHeightMeasure.active();\n break;\n case 'clearDistance':\n measure.clearDistanceMeasure.active();\n break;\n case 'distance':\n measure.distanceMeasure.active();\n break;\n case 'elevation':\n measure.elevationMeasure.active();\n break;\n case 'point':\n measure.pointMeasure.active();\n break;\n case 'angle':\n measure.angleMeasure.active();\n break;\n case 'area':\n measure.areaMeasure.active();\n break;\n case 'slope':\n measure.slopeMeasure.active();\n break;\n default:\n console.error(`[Engine] Unknown measure type: ${mode}`);\n return;\n }\n this.currentMeasureType = mode;\n }\n\n /**\n * 获取当前激活的测量类型\n * @returns 当前测量类型,未激活时返回 null\n */\n public getCurrentMeasureType(): MeasureMode | null {\n return this.currentMeasureType;\n }\n\n /**\n * 停用测量功能\n * @remarks 关闭测量时调用,会同时清除所有测量标注\n */\n public deactivateMeasure(): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n\n console.log('[Engine] Deactivating measure');\n this.engine.measure.disActive();\n this.engine.measure.clearAll();\n this.isMeasureActive = false;\n this.currentMeasureType = null;\n }\n\n /**\n * 清除所有测量标注(不停用测量模式)\n */\n public clearAllMeasures(): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n console.log('[Engine] Clearing all measures');\n this.engine.measure.clearAll();\n }\n\n /**\n * 保存测量设置\n * @param setting 测量设置,包含单位和精度\n */\n public saveMeasureSetting(setting: { unit: MeasureUnit; precision: MeasurePrecision }): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n this.engine.measure.saveSetting?.(setting);\n }\n\n /**\n * 设置净高测量朝向\n * @param direction 0=朝下,1=朝上\n */\n public setClearHeightDirection(direction: ClearHeightDirection): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n console.log(`[Engine] Setting clearHeight direction: ${direction}`);\n this.engine.measure.clearHeightMeasure.setDirection(direction);\n }\n\n /**\n * 设置净高测量选择对象类型\n * @param selectType 'point'=选择点,'element'=选择构件\n */\n public setClearHeightSelectType(selectType: ClearHeightSelectType): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n console.log(`[Engine] Setting clearHeight selectType: ${selectType}`);\n this.engine.measure.clearHeightMeasure.setSelectType(selectType);\n }\n\n // ==================== 结束:测量功能 ====================\n\n // ==================== 剖切功能(统一 API) ====================\n\n /**\n * 激活剖切功能(统一入口)\n * @param mode 剖切模式\n * - 'x': X轴剖切面\n * - 'y': Y轴剖切面\n * - 'z': Z轴剖切面\n * - 'box': 剖切盒(六面体裁剪)\n * - 'face': 拾取面剖切(点选模型表面创建剖切面)\n * @remarks\n * - 幂等操作:如果当前模式与请求模式相同,则静默返回\n * - 切换模式时会自动停用之前的剖切\n * - 底层调用 engine.clipping.active(mode)\n * @example\n * ```typescript\n * // 激活 X 轴剖切\n * engine.activeSection('x');\n * \n * // 切换到剖切盒\n * engine.activeSection('box');\n * ```\n */\n public activeSection(mode: 'x' | 'y' | 'z' | 'box' | 'face'): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n console.error('[Engine] Cannot activate section: engine not initialized.');\n return;\n }\n if (this.currentSectionMode === mode) {\n console.log(`[Engine] Section ${mode} already active, skipping.`);\n return;\n }\n console.log(`[Engine] Activating section: ${mode}`);\n this.engine.clipping.active(mode);\n this.currentSectionMode = mode;\n }\n\n /**\n * 获取当前激活的剖切模式\n * @returns 当前剖切模式,未激活时返回 null\n * @example\n * ```typescript\n * const mode = engine.getCurrentSectionMode();\n * if (mode === 'box') {\n * console.log('剖切盒已激活');\n * }\n * ```\n */\n public getCurrentSectionMode(): 'x' | 'y' | 'z' | 'box' | 'face' | null {\n return this.currentSectionMode;\n }\n\n /**\n * 设置剖切盒范围\n * @param range 剖切范围配置,每个轴的 min/max 值为百分比 (0-100)\n * @remarks\n * - 仅在 'box' 模式下有效\n * - 底层调用 engine.clipping.updateClippingValue(range)\n * @example\n * ```typescript\n * // 设置 X 轴裁剪 20%-80%,Y/Z 轴保持完整\n * engine.setSectionBoxRange({\n * x: { min: 20, max: 80 },\n * y: { min: 0, max: 100 },\n * z: { min: 0, max: 100 }\n * });\n * ```\n */\n public setSectionBoxRange(range: SectionBoxRange): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n console.error('[Engine] Cannot set section box range: engine not initialized.');\n return;\n }\n this.engine.clipping.updateClippingValue(range);\n }\n\n /**\n * 停用所有剖切功能\n * @remarks\n * - 统一停用入口,无论当前是哪种剖切模式\n * - 关闭剖切对话框时调用此方法\n * - 底层调用 engine.clipping.disActive()\n * @example\n * ```typescript\n * // 关闭剖切\n * engine.deactivateSection();\n * ```\n */\n public deactivateSection(): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n return;\n }\n console.log('[Engine] Deactivating all sections');\n this.engine.clipping.disActive();\n this.currentSectionMode = null;\n }\n\n /**\n * 隐藏剖切面(临时隐藏,可恢复)\n * @remarks\n * - 隐藏当前剖切面,但不停用剖切功能\n * - 配合 recoverSection() 使用\n * - 底层调用 engine.clipping.disabled()\n * @example\n * ```typescript\n * // 临时隐藏剖切面\n * engine.hideSection();\n * // 稍后恢复\n * engine.recoverSection();\n * ```\n */\n public hideSection(): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n console.error('[Engine] Cannot hide section: engine not initialized.');\n return;\n }\n console.log('[Engine] Hiding section');\n this.engine.clipping.disabled();\n }\n\n /**\n * 恢复剖切面(从隐藏状态恢复)\n * @remarks\n * - 恢复被 hideSection() 隐藏的剖切面\n * - 底层调用 engine.clipping.recover()\n * @example\n * ```typescript\n * // 隐藏后恢复剖切面\n * engine.hideSection();\n * // ... 一段时间后\n * engine.recoverSection();\n * ```\n */\n public recoverSection(): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n console.error('[Engine] Cannot recover section: engine not initialized.');\n return;\n }\n console.log('[Engine] Recovering section');\n this.engine.clipping.recover();\n }\n\n /**\n * 剖切盒适应选中模型\n * @remarks 将剖切盒调整为刚好包围选中的模型\n */\n public fitSectionBoxToModel(): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot fit section box: engine not initialized.');\n return;\n }\n const model = this.engine.engineStatus?.highlightModels;\n if (model) {\n console.log('[Engine] Fitting section box to model');\n this.engine.clipping?.clippingModel(model);\n }\n }\n\n /**\n * 剖切盒适应(缩放到场景整体包围盒)\n * @remarks\n * - 对接底层 `engine.clipping.scaleBox()`\n * - 会确保当前处于剖切盒模式\n */\n public scaleSectionBox(): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n console.error('[Engine] Cannot scale section box: engine not initialized.');\n return;\n }\n this.engine.clipping.scaleBox();\n }\n\n /**\n * 反向剖切\n * @remarks 对接底层 `engine.clipping.reverse()`\n */\n public reverseSection(): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n console.error('[Engine] Cannot reverse section: engine not initialized.');\n return;\n }\n this.engine.clipping.reverse();\n }\n\n // ==================== 结束:剖切功能 ====================\n\n // ==================== 渲染模式 ====================\n\n /**\n * 获取当前渲染模式\n * @returns 'simple' | 'balance' | 'advanced'\n */\n public getRenderMode(): string {\n if (!this._isInitialized || !this.engine?.engineModelModule) {\n return 'balance';\n }\n return this.engine.engineModelModule.getCurrentMode();\n }\n\n /**\n * 设置渲染模式\n * @param mode 'simple'(性能模式) | 'balance'(平衡模式) | 'advanced'(效果模式)\n */\n public setRenderMode(mode: 'simple' | 'balance' | 'advanced'): void {\n if (!this._isInitialized || !this.engine?.engineModelModule) {\n console.warn('[Engine] Cannot set render mode: engine not initialized.');\n return;\n }\n try {\n this.engine.engineModelModule.setMode(mode);\n } catch (e) {\n console.warn('[Engine] Failed to set render mode:', e);\n }\n }\n\n // ==================== 结束:渲染模式 ====================\n\n // ==================== 设置功能 ====================\n\n // ---- 边线 ----\n\n /** 启用模型边线显示 */\n public activeModelEdge(): void {\n if (!this._isInitialized || !this.engine?.modelEdge) {\n console.warn('[Engine] Cannot active model edge: engine not initialized.');\n return;\n }\n this.engine.modelEdge.active();\n }\n\n /** 关闭模型边线显示 */\n public disActiveModelEdge(): void {\n if (!this._isInitialized || !this.engine?.modelEdge) {\n return;\n }\n this.engine.modelEdge.disActive();\n }\n\n /** 获取边线显示状态 */\n public getModelEdgeActive(): boolean {\n if (!this._isInitialized || !this.engine?.modelEdge) {\n return false;\n }\n return this.engine.modelEdge.getActive?.() ?? false;\n }\n\n // ---- 光照强度 ----\n\n /**\n * 设置环境光照强度\n * @param intensity 0-100\n */\n public setAmbientLightIntensity(intensity: number): void {\n if (!this._isInitialized || !this.engine?.setting) {\n console.warn('[Engine] Cannot set ambient light intensity: engine not initialized.');\n return;\n }\n this.engine.setting.setAmbientLightIntensity(intensity);\n }\n\n /** 获取当前环境光照强度 */\n public getAmbientLightIntensity(): number {\n if (!this._isInitialized || !this.engine?.setting) {\n return 50;\n }\n return this.engine.setting.getAmbientLightIntensity?.() ?? 50;\n }\n\n // ---- 对比度 ----\n\n /**\n * 设置场景对比度\n * @param contrast 0-100\n */\n public setSceneContrast(contrast: number): void {\n if (!this._isInitialized || !this.engine?.setting) {\n console.warn('[Engine] Cannot set scene contrast: engine not initialized.');\n return;\n }\n this.engine.setting.setSceneContrast(contrast);\n }\n\n /** 获取当前场景对比度 */\n public getSceneContrast(): number {\n if (!this._isInitialized || !this.engine?.setting) {\n return 50;\n }\n return this.engine.setting.getSceneContrast?.() ?? 50;\n }\n\n // ---- 饾和度 ----\n\n /**\n * 设置场景饾和度\n * @param saturation 0-100\n */\n public setSceneSaturation(saturation: number): void {\n if (!this._isInitialized || !this.engine?.setting) {\n console.warn('[Engine] Cannot set scene saturation: engine not initialized.');\n return;\n }\n this.engine.setting.setSceneSaturation(saturation);\n }\n\n /** 获取当前场景饾和度 */\n public getSceneSaturation(): number {\n if (!this._isInitialized || !this.engine?.setting) {\n return 50;\n }\n return this.engine.setting.getSceneSaturation?.() ?? 50;\n }\n\n // ---- 环境背景 ----\n\n /** 获取 HDR 背景列表 */\n public getHDRBackgroundList(): { name: string; id: string }[] {\n if (!this._isInitialized || !this.engine?.setting) {\n return [];\n }\n return this.engine.setting.getHDRBackground?.() ?? [];\n }\n\n /**\n * 设置当前 HDR 背景\n * @param id 背景 ID\n */\n public setHDRBackgroundId(id: string): void {\n if (!this._isInitialized || !this.engine?.setting) {\n console.warn('[Engine] Cannot set HDR background: engine not initialized.');\n return;\n }\n this.engine.setting.setHDRBackgroundId(id);\n }\n\n /** 获取当前 HDR 背景 ID */\n public getHDRBackgroundId(): string {\n if (!this._isInitialized || !this.engine?.setting) {\n return '';\n }\n return this.engine.setting.getHDRBackgroundId?.() ?? '';\n }\n\n /**\n * 设置 HDR 背景可见性\n * @param visible 是否可见\n */\n public setHDRBackgroundVisibility(visible: boolean): void {\n if (!this._isInitialized || !this.engine?.setting) {\n console.warn('[Engine] Cannot set HDR background visibility: engine not initialized.');\n return;\n }\n this.engine.setting.setHDRBackgroundVisibility(visible);\n }\n\n /** 获取 HDR 背景可见性 */\n public getHDRBackgroundVisibility(): boolean {\n if (!this._isInitialized || !this.engine?.setting) {\n return true;\n }\n return this.engine.setting.getHDRBackgroundVisibility?.() ?? true;\n }\n\n // ---- 地面 ----\n\n /** 获取地面列表 */\n public getGroundList(): { name: string; id: string }[] {\n if (!this._isInitialized || !this.engine?.setting) {\n return [];\n }\n return this.engine.setting.getGroundList?.() ?? [];\n }\n\n /**\n * 设置当前地面类型\n * @param id 地面 ID\n */\n public setGroundId(id: string): void {\n if (!this._isInitialized || !this.engine?.setting) {\n console.warn('[Engine] Cannot set ground: engine not initialized.');\n return;\n }\n this.engine.setting.setGroundId(id);\n }\n\n /** 获取当前地面 ID */\n public getGroundId(): string {\n if (!this._isInitialized || !this.engine?.setting) {\n return '';\n }\n return this.engine.setting.getGroundId?.() ?? '';\n }\n\n /**\n * 设置地面高度(单位:m)\n * @param elevation 地面高度值\n */\n public setGroundElevation(elevation: number): void {\n if (!this._isInitialized || !this.engine?.setting) {\n console.warn('[Engine] Cannot set ground elevation: engine not initialized.');\n return;\n }\n this.engine.setting.setGroundElevation(elevation);\n }\n\n /** 获取当前地面高度(单位:m) */\n public getGroundElevation(): number {\n if (!this._isInitialized || !this.engine?.setting) {\n return 0;\n }\n return this.engine.setting.getGroundElevation?.() ?? 0;\n }\n\n // ==================== 结束:设置功能 ====================\n // ==================== 漫游功能 ====================\n\n /** 漫游模式是否激活 */\n private isWalkModeActive: boolean = false;\n\n /**\n * 激活第一人称漫游模式\n * @remarks 切换到第一人称控制器,禁用轨道控制器\n */\n public activateFirstPersonMode(): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot activate first person mode: engine not initialized.');\n return;\n }\n\n if (!this.engine.controlModule) {\n console.error('[Engine] Control module not available.');\n return;\n }\n\n if (this.isWalkModeActive) {\n console.log('[Engine] First person mode already active, skipping.');\n return;\n }\n\n console.log('[Engine] Activating first person mode');\n this.engine.controlModule.switchFirstPersonMode();\n this.loadWalkSettings();\n this.isWalkModeActive = true;\n }\n\n /**\n * 停用第一人称漫游模式\n * @remarks 切换回轨道控制器\n */\n public deactivateFirstPersonMode(): void {\n if (!this._isInitialized || !this.engine?.controlModule) {\n return;\n }\n\n if (!this.isWalkModeActive) {\n return;\n }\n\n console.log('[Engine] Deactivating first person mode');\n this.engine.controlModule.switchDefaultMode();\n this.isWalkModeActive = false;\n }\n\n private static WALK_SPEED_KEY = 'bim-walk-speed';\n private static WALK_GRAVITY_KEY = 'bim-walk-gravity';\n private static WALK_COLLISION_KEY = 'bim-walk-collision';\n\n /**\n * 设置漫游移动速度\n * @param speed 移动速度值\n */\n public setWalkSpeed(speed: number): void {\n if (!this._isInitialized || !this.engine?.controlModule) {\n console.error('[Engine] Cannot set walk speed: engine not initialized.');\n return;\n }\n localStorage.setItem(Engine.WALK_SPEED_KEY, String(speed));\n this.engine.controlModule.setMoveSpeed(speed);\n }\n\n /**\n * 设置漫游重力开关\n * @param enabled 是否启用重力\n */\n public setWalkGravity(enabled: boolean): void {\n if (!this._isInitialized || !this.engine?.controlModule) {\n console.error('[Engine] Cannot set walk gravity: engine not initialized.');\n return;\n }\n localStorage.setItem(Engine.WALK_GRAVITY_KEY, String(enabled));\n this.engine.controlModule.setApplyGravity(enabled);\n }\n\n /**\n * 设置漫游碰撞检测开关\n * @param enabled 是否启用碰撞检测\n */\n public setWalkCollision(enabled: boolean): void {\n if (!this._isInitialized || !this.engine?.controlModule) {\n console.error('[Engine] Cannot set walk collision: engine not initialized.');\n return;\n }\n localStorage.setItem(Engine.WALK_COLLISION_KEY, String(enabled));\n this.engine.controlModule.setApplyCollision(enabled);\n }\n\n private loadWalkSettings(): void {\n if (!this.engine?.controlModule) return;\n\n const speed = localStorage.getItem(Engine.WALK_SPEED_KEY);\n const gravity = localStorage.getItem(Engine.WALK_GRAVITY_KEY);\n const collision = localStorage.getItem(Engine.WALK_COLLISION_KEY);\n\n this.engine.controlModule.setMoveSpeed(speed ? Number(speed) : 1);\n this.engine.controlModule.setApplyGravity(gravity === 'true');\n this.engine.controlModule.setApplyCollision(collision === 'true');\n }\n\n /**\n * 切换小地图显示状态\n */\n public toggleMiniMap(): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot toggle mini map: engine not initialized.');\n return;\n }\n this.engine.minMap?.toggle();\n }\n\n /**\n * 获取小地图显示状态\n * @returns true=显示,false=隐藏\n */\n public getMiniMapState(): boolean {\n if (!this._isInitialized || !this.engine) {\n return false;\n }\n return this.engine.minMap?.getState() ?? false;\n }\n\n /**\n * 获取漫游模式是否激活\n * @returns 是否处于漫游模式\n */\n public isFirstPersonModeActive(): boolean {\n return this.isWalkModeActive;\n }\n\n // ==================== 结束:漫游功能 ====================\n\n // ==================== 构件选中 ====================\n\n /**\n * 获取当前选中的构件\n * @returns 选中构件的 URL 和 ID,未选中时返回 null\n */\n public getSelectedComponent(): { url: string; id: string } | null {\n return this.selectedComponent;\n }\n\n /**\n * 获取构件属性\n * @param url 模型 URL\n * @param id 构件 ID\n * @param callback 回调函数,接收属性数据\n */\n public getComponentProperties(\n url: string,\n id: string,\n callback: (data: any) => void\n ): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot get component properties: engine not initialized.');\n return;\n }\n\n if (!this.engine.modelProperties) {\n console.error('[Engine] modelProperties not available');\n return;\n }\n\n console.log('[Engine] Getting component properties:', { url, id });\n this.engine.modelProperties.getModelProperties(url, id, callback);\n }\n\n // ==================== 结束:构件选中 ====================\n\n // ==================== 模型树 ====================\n\n /**\n * 获取类型树数据\n * @returns 类型树节点数组\n */\n public getTypeTreeData(): any[] {\n if (!this._isInitialized || !this.engine?.modelTree) {\n return [];\n }\n return this.engine.modelTree.getTypeTreeData();\n }\n\n /**\n * 获取楼层树数据\n * @returns 楼层树节点数组\n */\n public getLevelTreeData(): any[] {\n if (!this._isInitialized || !this.engine?.modelTree) {\n return [];\n }\n return this.engine.modelTree.getLevelTreeData();\n }\n\n /**\n * 获取专业树数据\n * @returns 专业树节点数组\n */\n public getMajorTreeData(): any[] {\n if (!this._isInitialized || !this.engine?.modelTree) {\n return [];\n }\n return this.engine.modelTree.getMajorTreeData();\n }\n\n // ==================== 结束:模型树 ====================\n\n /**\n * 激活框选放大功能\n * @remarks 允许用户通过框选区域来放大视图\n */\n public activateZoomBox(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.rangeScale?.active();\n }\n\n /**\n * 获取引擎基本信息\n * @returns 引擎信息对象,包含构件数量、三角面数量、顶点数量等\n */\n public getEngineInfo(): EngineInfo | null {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return null;\n }\n return this.engine.engineInfo.getEngineInfo() as EngineInfo;\n }\n\n // ==================== 路径漫游 ====================\n\n /**\n * 添加漫游点\n * 将当前相机位置添加为一个漫游点\n */\n public pathRoamingAddPoint(): void {\n // 检查引擎是否已初始化\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return;\n }\n // 调用底层 API 添加点位\n this.engine.pathRoaming.addPoint(0);\n }\n\n /**\n * 删除指定索引的漫游点\n * @param index 要删除的漫游点索引\n */\n public pathRoamingRemovePoint(index: number): void {\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return;\n }\n this.engine.pathRoaming.removePoint(index);\n }\n\n /**\n * 清除所有漫游点\n */\n public pathRoamingClearPoints(): void {\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return;\n }\n this.engine.pathRoaming.clearPoints();\n }\n\n /**\n * 获取所有漫游点\n * @returns 漫游点数组\n */\n public pathRoamingGetPoints(): any[] {\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return [];\n }\n return this.engine.pathRoaming.getPoints() ?? [];\n }\n\n /**\n * 跳转到指定漫游点\n * @param index 目标漫游点索引\n */\n public pathRoamingJumpToPoint(index: number): void {\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return;\n }\n this.engine.pathRoaming.jumpToPoint(index);\n }\n\n /**\n * 播放漫游\n * @param options 播放选项,包含时长、循环、回调等配置\n */\n public pathRoamingPlay(options?: {\n duration?: number;\n loop?: boolean;\n onComplete?: () => void;\n onPointComplete?: (pointIndex: number) => void;\n }): void {\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return;\n }\n this.engine.pathRoaming.play(options);\n }\n\n /**\n * 停止漫游\n */\n public pathRoamingStop(): void {\n if (!this._isInitialized || !this.engine?.pathRoaming) {\n console.warn('[Engine] pathRoaming not available');\n return;\n }\n this.engine.pathRoaming.stop();\n }\n\n // ==================== 结束:路径漫游 ====================\n\n // ==================== 构件操作 ====================\n\n /**\n * 获取当前高亮(选中)的模型\n * @returns 高亮模型对象,未选中时返回 null\n */\n public getHighlightModels(): any {\n if (!this._isInitialized || !this.engine) {\n return null;\n }\n return this.engine.engineStatus?.highlightModels ?? null;\n }\n\n /**\n * 高亮指定模型构件\n * \n * 用于在 3D 场景中高亮显示指定的构件,常用于:\n * - 点击构件树节点时高亮对应模型\n * - 搜索结果定位\n * - 批量选中构件\n * \n * @param models - 要高亮的模型数组,每个元素包含:\n * - url: 模型资源 URL\n * - ids: 构件 ID 数组\n * \n * @example\n * engine.highlightModel([\n * { url: 'https://xxx/models/xxx/', ids: [350518, 350520] }\n * ]);\n */\n public highlightModel(models: { url: string; ids: number[] }[]): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot highlight model: engine not initialized.');\n return;\n }\n const safeModels = this.sanitizeModelParams(models);\n if (!safeModels.length) return;\n try {\n this.engine.modelToolModule.highlightModel(safeModels);\n } catch (e) {\n console.warn('[Engine] highlightModel failed:', e);\n }\n }\n\n public unhighlightAllModels(): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot unhighlight models: engine not initialized.');\n return;\n }\n this.engine.modelToolModule.unhighlightAllModels();\n }\n\n public viewScaleToModel(models: { url: string; ids: number[] }[]): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot view scale to model: engine not initialized.');\n return;\n }\n const safeModels = this.sanitizeModelParams(models);\n if (!safeModels.length) return;\n try {\n this.engine.modelToolModule.viewScaleToModel(safeModels);\n } catch (e) {\n console.warn('[Engine] viewScaleToModel failed:', e);\n }\n }\n\n public hideModels(models: { url: string; ids: number[] }[]): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot hide models: engine not initialized.');\n return;\n }\n const safeModels = this.sanitizeModelParams(models);\n if (!safeModels.length) return;\n try {\n this.engine.modelToolModule.hideModel(safeModels);\n } catch (e) {\n console.warn('[Engine] hideModels failed:', e);\n }\n }\n\n public showModel(models: { url: string; ids: number[] }[]): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot show model: engine not initialized.');\n return;\n }\n const safeModels = this.sanitizeModelParams(models);\n if (!safeModels.length) return;\n try {\n this.engine.modelToolModule.showModel(safeModels);\n } catch (e) {\n console.warn('[Engine] showModel failed:', e);\n }\n }\n\n private sanitizeModelParams(models: { url: string; ids: number[] }[]): { url: string; ids: number[] }[] {\n if (!Array.isArray(models)) return [];\n\n const normalizeUrl = (url: string): string => url.replace(/\\/+$/, '');\n\n const loadedModels = Array.isArray((this.engine as any)?.models)\n ? ((this.engine as any).models as Array<{ url?: string; nodesMap?: Map }>)\n : [];\n const modelMap = new Map }>();\n for (const loadedModel of loadedModels) {\n if (loadedModel?.url) {\n modelMap.set(normalizeUrl(loadedModel.url), loadedModel);\n }\n }\n\n const result: { url: string; ids: number[] }[] = [];\n for (const model of models) {\n if (!model || typeof model.url !== 'string' || !model.url) continue;\n if (!Array.isArray(model.ids)) continue;\n\n const loadedModel = modelMap.get(normalizeUrl(model.url));\n if (!loadedModel || !(loadedModel.nodesMap instanceof Map)) {\n continue;\n }\n const idsSet = new Set();\n for (const rawId of model.ids) {\n if (!Number.isFinite(rawId)) continue;\n const id = Number(rawId);\n if (!Number.isInteger(id)) continue;\n\n const node = loadedModel.nodesMap.get(id);\n if (!node || !Array.isArray(node.indexes) || node.indexes.length === 0) {\n continue;\n }\n\n idsSet.add(id);\n }\n\n const ids = Array.from(idsSet);\n if (!ids.length) continue;\n\n result.push({ url: model.url, ids });\n }\n\n return result;\n }\n\n /**\n * 半透明指定模型\n * @param models 要半透明的模型对象\n */\n public translucentModels(models: any): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot translucent models: engine not initialized.');\n return;\n }\n if (models) {\n this.engine.modelToolModule.translucentModel(models);\n }\n }\n\n /**\n * 取消半透明\n */\n public unTranslucentModel(): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot cancel translucent: engine not initialized.');\n return;\n }\n this.engine.modelToolModule.unTranslucentModel();\n }\n\n /**\n * 隔离指定模型(隐藏其他)\n * @param models 要隔离的模型对象\n */\n public isolateModels(models: any): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot isolate models: engine not initialized.');\n return;\n }\n if (models) {\n this.engine.modelToolModule.isolateModel(models);\n }\n }\n\n /**\n * 半透明其他构件\n * @param models 选中的模型对象(其他构件将被半透明)\n */\n public translucentOtherModels(models: any): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot translucent other models: engine not initialized.');\n return;\n }\n if (models) {\n this.engine.modelToolModule.translucentOtherModel(models);\n }\n }\n\n /**\n * 显示所有模型\n */\n public showAllModels(): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot show all models: engine not initialized.');\n return;\n }\n // 取消剖切\n this.deactivateSection()\n // 显示所有模型\n this.engine.modelToolModule.showAllModels();\n }\n\n /**\n * 批量选择同类模型\n * @param models 参考模型对象\n */\n public batchSelectSameTypeModel(models: any): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot batch select: engine not initialized.');\n return;\n }\n if (models) {\n this.engine.modelToolModule.batchSelectSameTypeModel(models);\n }\n }\n\n /**\n * 批量选择同层模型\n * @param models 参考模型对象\n */\n public batchSelectSameLevelModel(models: any): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot batch select: engine not initialized.');\n return;\n }\n if (models) {\n this.engine.modelToolModule.batchSelectSameLevelModel(models);\n }\n }\n\n /**\n * 批量选择同层同类模型\n * @param models 参考模型对象\n */\n public batchSelectSameLevelTypeModel(models: any): void {\n if (!this._isInitialized || !this.engine?.modelToolModule) {\n console.warn('[Engine] Cannot batch select: engine not initialized.');\n return;\n }\n if (models) {\n this.engine.modelToolModule.batchSelectSameLevelTypeModel(models);\n }\n }\n\n // ==================== 结束:构件操作 ====================\n\n /**\n * 销毁组件 (接口实现)\n * 清理资源、取消订阅、销毁引擎实例\n */\n public destroy(): void {\n if (this._isDestroyed) {\n return;\n }\n\n // 停用测量功能\n this.deactivateMeasure();\n\n // 取消主题订阅\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n\n // 销毁 3D 引擎,释放 GPU 资源\n if (this.engine) {\n this.engine.dispose();\n this.engine = null;\n }\n\n // 清理容器\n this.container.innerHTML = '';\n\n // 更新状态\n this.currentMeasureType = null;\n this.isMeasureActive = false;\n this._isDestroyed = true;\n this._isInitialized = false;\n }\n}\n","import { IBimComponent } from '../../types/component';\nimport { ThemeConfig } from '../../themes/types';\nimport { IRightKeyContent, RightKeyOptions } from './types';\nimport './index.css';\n\n/**\n * 右键浮层容器组件 (RightKey)\n * 这是一个纯粹的定位容器,负责在屏幕指定位置显示内容。\n * 它不关心具体内容是什么,只处理定位、边界检测和关闭逻辑。\n */\nexport class BimRightKey implements IBimComponent {\n private element: HTMLElement;\n private content: IRightKeyContent | null = null;\n private isVisible: boolean = false;\n private onCloseCallback?: () => void;\n private options?: RightKeyOptions;\n \n private mouseDownTime: number = 0;\n private mouseDownX: number = 0;\n private mouseDownY: number = 0;\n private readonly CLICK_THRESHOLD: number = 200; // ms\n private readonly MOVE_THRESHOLD: number = 5; // px\n\n constructor(options?: RightKeyOptions) {\n this.options = options;\n this.element = document.createElement('div');\n this.element.className = `bim-right-key ${options?.className || ''}`;\n \n // 设置层级,默认很高以覆盖其他 UI\n if (options?.zIndex) {\n this.element.style.zIndex = options.zIndex.toString();\n }\n \n // 挂载到 body 以便进行固定定位\n document.body.appendChild(this.element);\n }\n\n public init(): void {\n // 绑定全局点击事件,用于实现\"点击外部关闭\"\n document.addEventListener('mousedown', this.handleGlobalClick);\n \n // 阻止在容器自身上触发系统默认右键菜单\n this.element.addEventListener('contextmenu', (e) => {\n e.preventDefault();\n e.stopPropagation();\n });\n\n // 绑定容器交互事件\n if (this.options?.container) {\n this.options.container.addEventListener('mousedown', this.handleContainerMouseDown);\n this.options.container.addEventListener('mouseup', this.handleContainerMouseUp);\n this.options.container.addEventListener('contextmenu', this.handleContainerContextMenu);\n }\n }\n\n public setTheme(_theme: ThemeConfig): void {\n // 容器本身通常是透明的,主题样式主要由内容组件处理\n // 如果容器需要背景色,可以在这里设置\n // 使用 _theme 前缀避免 TS 未使用变量报错\n }\n\n public setLocales(): void {\n // 容器不包含文本,无需处理国际化\n // 内容组件的国际化由内容组件自身处理\n }\n\n public destroy(): void {\n document.removeEventListener('mousedown', this.handleGlobalClick);\n \n if (this.options?.container) {\n this.options.container.removeEventListener('mousedown', this.handleContainerMouseDown);\n this.options.container.removeEventListener('mouseup', this.handleContainerMouseUp);\n this.options.container.removeEventListener('contextmenu', this.handleContainerContextMenu);\n }\n\n this.unmountContent();\n this.element.remove();\n }\n\n private handleContainerMouseDown = (e: MouseEvent): void => {\n // 记录右键按下时间和位置 (button 2 是右键)\n if (e.button === 2) {\n this.mouseDownTime = Date.now();\n this.mouseDownX = e.clientX;\n this.mouseDownY = e.clientY;\n }\n };\n\n private handleContainerMouseUp = (e: MouseEvent): void => {\n // 只处理右键 (button 2)\n if (e.button !== 2) return;\n\n // 检查点击时长,如果是长按或拖拽(时间过长),则不触发回调\n const pressDuration = Date.now() - this.mouseDownTime;\n if (pressDuration > this.CLICK_THRESHOLD) {\n return;\n }\n\n // 检查移动距离,如果鼠标移动超过阈值(用户在拖拽旋转模型),则不触发回调\n const dx = e.clientX - this.mouseDownX;\n const dy = e.clientY - this.mouseDownY;\n if (dx * dx + dy * dy > this.MOVE_THRESHOLD * this.MOVE_THRESHOLD) {\n return;\n }\n\n // 触发有效右键回调\n if (this.options?.onContext) {\n this.options.onContext(e);\n }\n };\n\n private handleContainerContextMenu = (e: MouseEvent): void => {\n // 阻止浏览器默认的右键菜单\n // 真正的菜单触发逻辑已移至 mouseup,这里只负责拦截默认行为\n e.preventDefault();\n };\n\n /**\n * 设置关闭时的回调函数\n * 通常用于通知 Manager 状态变更\n */\n public setOnClose(callback: () => void): void {\n this.onCloseCallback = callback;\n }\n\n /**\n * 挂载内容组件\n * @param content 实现了 IRightKeyContent 接口的组件实例\n */\n public mount(content: IRightKeyContent): void {\n // 先卸载旧内容,防止内存泄漏\n this.unmountContent();\n \n this.content = content;\n this.element.appendChild(content.getElement());\n }\n\n /**\n * 卸载当前内容\n */\n public unmountContent(): void {\n if (this.content) {\n this.content.destroy(); // 重要:调用组件销毁方法清理���源\n this.element.innerHTML = '';\n this.content = null;\n }\n }\n\n /**\n * 在指定位置显示容器\n * 包含智能边界检测逻辑,防止溢出屏幕\n * @param x 目标 X 坐标 (通常是鼠标点击位置)\n * @param y 目标 Y 坐标\n */\n public show(x: number, y: number): void {\n this.element.classList.add('visible');\n this.isVisible = true;\n\n // 1. 先定位到目标位置,以便测量尺寸\n this.element.style.left = `${x}px`;\n this.element.style.top = `${y}px`;\n\n // 2. 获取容器尺寸和视口尺寸\n const rect = this.element.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let newX = x;\n let newY = y;\n\n // 3. 水平方向边界检测:如果溢出右边界,则向左对齐\n if (x + rect.width > viewportWidth) {\n newX = x - rect.width;\n }\n \n // 4. 垂直方向边界检测:如果溢出下边界,则向上对齐\n if (y + rect.height > viewportHeight) {\n newY = y - rect.height;\n }\n\n // 5. 应用修正后的坐标\n this.element.style.left = `${newX}px`;\n this.element.style.top = `${newY}px`;\n }\n\n /**\n * 隐藏容器\n */\n public hide(): void {\n this.element.classList.remove('visible');\n this.isVisible = false;\n \n // 为了状态重置,通常隐藏时也卸载内容\n this.unmountContent(); \n \n if (this.onCloseCallback) {\n this.onCloseCallback();\n }\n }\n\n /**\n * 处理全局点击事件\n * 用于检测是否点击了容器外部\n */\n private handleGlobalClick = (e: MouseEvent): void => {\n if (!this.isVisible) return;\n \n // 如果点击的是容器内部,不做处理\n if (this.element.contains(e.target as Node)) {\n return;\n }\n\n // 点击外部,关闭容器\n this.hide();\n };\n}\n","import { IBimComponent } from '../../types/component';\nimport { ThemeConfig } from '../../themes/types';\nimport { localeManager, t } from '../../services/locale';\nimport { MenuItemConfig } from './item';\nimport { MenuOptions } from './types';\nimport './index.css';\nimport { themeManager } from '../../services/theme';\n\n/**\n * 通用菜单列表组件\n * 负责渲染一组菜单项,支持分组、排序、图标、快捷键提示和递归多级子菜单。\n * 它不包含定位逻辑,仅负责内容渲染。\n */\nexport class BimMenu implements IBimComponent {\n public element: HTMLElement;\n private options: MenuOptions;\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n // 当前激活的子菜单引用,用于自动关闭\n private activeSubMenu: { menu: BimMenu; container: HTMLElement } | null = null;\n\n constructor(options: MenuOptions) {\n this.options = options;\n this.element = document.createElement('ul');\n this.element.className = 'bim-menu';\n }\n\n /**\n * 初始化组件\n * 渲染 DOM 结构并订阅语言变更\n */\n public init(): void {\n this.render();\n\n // 订阅语言变更事件,实现国际化自动更新\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n // 自动订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n }\n\n /**\n * 设置主题\n * @param theme 全局主题配置\n */\n public setTheme(theme: ThemeConfig) {\n const style = this.element.style;\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-divider', theme.divider);\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n }\n\n /**\n * 响应语言变更\n * 重新渲染整个菜单以更新文本\n */\n public setLocales(): void {\n this.element.innerHTML = '';\n this.render();\n }\n\n /**\n * 销毁组件\n * 清理事件监听、子菜单和 DOM 元素\n */\n public destroy(): void {\n // 取消语言订阅\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n // 关闭并销毁所有打开的子菜单\n this.closeSubMenu();\n // 移除自身 DOM\n this.element.remove();\n }\n\n /**\n * 获取组件根元素\n * 实现 IRightKeyContent 接口,允许被 RightKey 容器挂载\n */\n public getElement(): HTMLElement {\n return this.element;\n }\n\n private hasAnyIcon(items: MenuItemConfig[]): boolean {\n return items.some(item => {\n if (item.icon) return true;\n if (item.children) return this.hasAnyIcon(item.children);\n return false;\n });\n }\n\n private render(): void {\n const { items, groupOrder } = this.options;\n\n if (this.hasAnyIcon(items)) {\n this.element.classList.add('has-icons');\n } else {\n this.element.classList.remove('has-icons');\n }\n\n const groups = new Map();\n const defaultGroup = 'default';\n\n items.forEach(item => {\n const groupName = item.group || defaultGroup;\n if (!groups.has(groupName)) {\n groups.set(groupName, []);\n }\n groups.get(groupName)!.push(item);\n });\n\n let sortedGroupKeys: string[] = [];\n if (groupOrder) {\n sortedGroupKeys = groupOrder.filter(g => groups.has(g));\n for (const key of groups.keys()) {\n if (!sortedGroupKeys.includes(key)) {\n sortedGroupKeys.push(key);\n }\n }\n } else {\n sortedGroupKeys = Array.from(groups.keys());\n }\n\n sortedGroupKeys.forEach((groupName, index) => {\n if (index > 0) {\n const divider = document.createElement('li');\n divider.className = 'bim-menu-divider';\n this.element.appendChild(divider);\n }\n\n const groupItems = groups.get(groupName)!;\n groupItems.sort((a, b) => (a.order || 0) - (b.order || 0));\n\n groupItems.forEach(item => {\n if (item.visible !== false) {\n this.element.appendChild(this.createItemElement(item));\n if (item.divider) {\n const divider = document.createElement('li');\n divider.className = 'bim-menu-divider';\n this.element.appendChild(divider);\n }\n }\n });\n });\n }\n\n /**\n * 创建单个菜单项的 DOM 元素\n */\n private createItemElement(item: MenuItemConfig): HTMLElement {\n const li = document.createElement('li');\n // 根据状态设置样式类\n const isEnabled = !item.disabled;\n li.className = `bim-menu-item ${isEnabled ? '' : 'disabled'}`;\n\n // 1. 图标区域 (Icon Slot)\n const iconDiv = document.createElement('div');\n iconDiv.className = 'bim-menu-item-icon';\n if (item.icon) {\n iconDiv.innerHTML = item.icon;\n }\n li.appendChild(iconDiv);\n\n // 2. 文本区域 (Label Slot)\n const labelDiv = document.createElement('div');\n labelDiv.className = 'bim-menu-item-label';\n // 获取翻译后的文本\n labelDiv.textContent = t(item.label);\n li.appendChild(labelDiv);\n\n // 3. 子菜单指示器 (Arrow Slot)\n const children = item.children;\n const hasChildren = children && children.length > 0;\n\n if (hasChildren) {\n const arrowDiv = document.createElement('div');\n arrowDiv.className = 'bim-menu-item-arrow';\n // 简单的右箭头 SVG\n arrowDiv.innerHTML = '';\n li.appendChild(arrowDiv);\n\n // 绑定子菜单交互事件\n // 鼠标移入:打开子菜单\n li.addEventListener('mouseenter', () => this.openSubMenu(item, li));\n } else {\n // 鼠标移入普通项:关闭当前已打开的子菜单\n li.addEventListener('mouseenter', () => this.closeSubMenu());\n }\n\n // 4. 绑定点击事件\n if (isEnabled) {\n // Debug Log: 检查是否绑定了事件\n // console.log(`[BimMenu] Binding click for ${item.id}, hasChildren: ${hasChildren}, hasOnClick: ${!!item.onClick}`);\n \n li.addEventListener('click', (e) => {\n e.stopPropagation(); // 防止冒泡\n console.log(`[BimMenu] Clicked item: ${item.id}`);\n \n // 如果是叶子节点(没有子菜单),则触发点击动作\n if (!hasChildren) {\n if (item.onClick) {\n console.log(`[BimMenu] Executing onClick for ${item.id}`);\n item.onClick();\n } else {\n console.warn(`[BimMenu] No onClick handler for ${item.id}`);\n }\n }\n });\n }\n\n return li;\n }\n\n /**\n * 打开子菜单\n * @param item 当前菜单项\n * @param parentLi 触发的 DOM 元素(用于定位)\n */\n private openSubMenu(item: MenuItemConfig, parentLi: HTMLElement): void {\n const children = item.children;\n if (!children || children.length === 0) return;\n\n // 如果当前已经打开了子菜单,先关闭它\n this.closeSubMenu();\n\n // 创建子菜单容器 (模拟一个临时的悬浮层)\n const container = document.createElement('div');\n container.style.position = 'fixed';\n container.style.zIndex = '10001'; // 确保比父菜单层级高\n\n // 初步计算位置:位于父项右侧\n const rect = parentLi.getBoundingClientRect();\n container.style.top = `${rect.top}px`;\n container.style.left = `${rect.right}px`;\n\n // 关键修复:阻止 mousedown 冒泡\n // 防止点击子菜单时触发 BimRightKey 的全局关闭逻辑(因为它认为点击发生在主菜单外部)\n container.addEventListener('mousedown', (e) => e.stopPropagation());\n\n // 递归创建新的 BimMenu 实例\n const subMenu = new BimMenu({ items: children });\n subMenu.init();\n container.appendChild(subMenu.element);\n document.body.appendChild(container);\n\n // 保存引用以便后续清理\n this.activeSubMenu = { menu: subMenu, container };\n\n // 边界检测:如果超出屏幕右侧,则向左展开\n const subRect = container.getBoundingClientRect();\n if (subRect.right > window.innerWidth) {\n container.style.left = `${rect.left - subRect.width}px`;\n }\n // TODO: 垂直方向边界检测\n }\n\n /**\n * 关闭当前激活的子菜单\n */\n private closeSubMenu(): void {\n if (this.activeSubMenu) {\n this.activeSubMenu.menu.destroy();\n this.activeSubMenu.container.remove();\n this.activeSubMenu = null;\n }\n }\n}\n\n\n","/**\n * 右键菜单管理器\n * 负责管理右键上下文菜单的显示和交互\n */\nimport { BaseManager } from '../core/base-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { BimRightKey } from '../components/right-key';\nimport { BimMenu } from '../components/menu';\nimport { MenuItemConfig } from '../components/menu/item';\n\n/**\n * 右键菜单管理器\n * 支持注册多个上下文处理器,动态生成右键菜单\n */\nexport class RightKeyManager extends BaseManager {\n /** 容器元素 */\n private container: HTMLElement;\n /** 右键面板实例 */\n private rightKeyPanel: BimRightKey;\n /** 上下文处理器列表 */\n private contextHandlers: Array<(e: MouseEvent) => MenuItemConfig[] | null> = [];\n\n constructor(container: HTMLElement, registry: ManagerRegistry) {\n super(registry);\n this.container = container;\n\n this.rightKeyPanel = new BimRightKey({\n zIndex: 9000,\n container: this.container,\n onContext: this.handleContextMenu\n });\n this.rightKeyPanel.init();\n }\n\n /** 销毁管理器 */\n public destroy(): void {\n this.rightKeyPanel.destroy();\n super.destroy();\n }\n\n /**\n * 注册上下文处理器\n * @param handler 处理器函数,返回菜单项配置\n */\n public registerHandler(handler: (e: MouseEvent) => MenuItemConfig[] | null): void {\n this.contextHandlers.push(handler);\n }\n\n /**\n * 显示菜单\n * @param x 横坐标\n * @param y 纵坐标\n * @param items 菜单项配置\n * @param groupOrder 分组顺序\n */\n public showMenu(x: number, y: number, items: MenuItemConfig[], groupOrder?: string[]): void {\n if (!items || items.length === 0) return;\n\n const menu = new BimMenu({ items, groupOrder });\n menu.init();\n\n this.rightKeyPanel.mount(menu);\n this.rightKeyPanel.show(x, y);\n }\n\n /** 隐藏菜单 */\n public hide(): void {\n this.rightKeyPanel.hide();\n }\n\n /** 处理右键点击事件 */\n private handleContextMenu = (e: MouseEvent): void => {\n let items: MenuItemConfig[] | null = null;\n for (const handler of this.contextHandlers) {\n const result = handler(e);\n if (result && result.length > 0) {\n if (!items) items = [];\n items = items.concat(result);\n }\n }\n\n if (items && items.length > 0) {\n this.showMenu(e.clientX, e.clientY, items);\n } else {\n this.hide();\n }\n };\n}\n","/**\n * 3D 引擎管理器\n * 负责管理 3D 渲染引擎的初始化、模型加载和生命周期\n *\n * 设计原则:\n * - EngineManager 只暴露面向外部用户的公共 API\n * - 内部管理器通过 getEngineComponent() 直接访问 Engine 组件\n * - 不再透传 Engine 组件的方法\n */\nimport { Engine, type EngineOptions, type ModelLoadOptions } from '../components/engine';\nimport { BaseManager } from '../core/base-manager';\nimport { RightKeyManager } from './right-key-manager';\nimport type { MenuItemConfig } from '../components/menu/item';\nimport { ManagerRegistry } from '../core/manager-registry';\n\n/**\n * 3D 引擎管理器\n * 封装底层 3D 引擎,提供模型加载、渲染控制等公共 API\n */\nexport class EngineManager extends BaseManager {\n /** 容器元素 */\n private container: HTMLElement;\n /** 引擎组件实例 */\n private engineInstance: Engine | null = null;\n /** 右键菜单管理器 */\n public rightKey: RightKeyManager | null = null;\n\n constructor(container: HTMLElement, registry: ManagerRegistry) {\n super(registry);\n this.container = container;\n }\n\n /**\n * 获取 Engine 组件实例\n * 内部管理器通过此方法直接访问 Engine 组件的全部能力\n * @returns Engine 组件实例,未初始化时返回 null\n */\n public getEngineComponent(): Engine | null {\n return this.engineInstance;\n }\n\n /**\n * 初始化 3D 引擎\n * @param options 引擎配置选项\n * @returns 是否初始化成功\n */\n public initialize(options?: Omit): boolean {\n if (this.engineInstance && this.engineInstance.isInitialized()) {\n console.warn('[EngineManager] 3D Engine already initialized. Destroying old instance...');\n this.engineInstance.destroy();\n this.engineInstance = null;\n }\n\n try {\n this.engineInstance = new Engine({\n container: this.container,\n ...options,\n }, this.registry);\n\n this.engineInstance.init();\n\n this.rightKey = new RightKeyManager(this.container, this.registry);\n\n this.rightKey.registerHandler((_e) => {\n const selected = this.engineInstance?.getSelectedComponent();\n const items: MenuItemConfig[] = [];\n\n if (selected) {\n // 1. 构件详情\n items.push({\n id: 'componentDetail',\n label: 'menu.componentDetail',\n group: 'component',\n order: 1,\n divider: true,\n onClick: () => {\n const registry = this.registry;\n registry.componentDetail?.show();\n this.rightKey?.hide();\n }\n });\n\n // 2. 隐藏选中构件\n items.push({\n id: 'hideSelected',\n label: 'menu.hideSelected',\n group: 'component',\n order: 2,\n onClick: () => {\n const models = this.engineInstance?.getHighlightModels();\n if (models) {\n this.engineInstance?.hideModels(models);\n }\n this.rightKey?.hide();\n }\n });\n\n // 3. 半透明选中构件\n items.push({\n id: 'transparentSelected',\n label: 'menu.transparentSelected',\n group: 'component',\n order: 3,\n onClick: () => {\n const models = this.engineInstance?.getHighlightModels();\n if (models) {\n this.engineInstance?.translucentModels(models);\n }\n this.rightKey?.hide();\n }\n });\n\n // 4. 取消半透明\n items.push({\n id: 'cancelTranslucent',\n label: 'menu.cancelTranslucent',\n group: 'component',\n order: 4,\n onClick: () => {\n this.engineInstance?.unTranslucentModel();\n this.rightKey?.hide();\n }\n });\n\n // 5. 隔离选中构件(带子菜单)\n items.push({\n id: 'isolateSelected',\n label: 'menu.isolateSelected',\n group: 'component',\n order: 5,\n divider: true,\n children: [\n {\n id: 'hideOthers',\n label: 'menu.hideOthers',\n onClick: () => {\n const models = this.engineInstance?.getHighlightModels();\n if (models) {\n this.engineInstance?.isolateModels(models);\n }\n this.rightKey?.hide();\n }\n },\n {\n id: 'transparentOthers',\n label: 'menu.transparentOthers',\n onClick: () => {\n const models = this.engineInstance?.getHighlightModels();\n if (models) {\n this.engineInstance?.translucentOtherModels(models);\n }\n this.rightKey?.hide();\n }\n }\n ]\n });\n\n // 6. 快速选择(带子菜单)\n items.push({\n id: 'quickSelect',\n label: 'menu.quickSelect',\n group: 'component',\n order: 6,\n children: [\n {\n id: 'selectSameType',\n label: 'menu.selectSameType',\n onClick: () => {\n const models = this.engineInstance?.getHighlightModels();\n if (models) {\n this.engineInstance?.batchSelectSameTypeModel(models);\n }\n this.rightKey?.hide();\n }\n },\n {\n id: 'selectSameLevel',\n label: 'menu.selectSameLevel',\n onClick: () => {\n const models = this.engineInstance?.getHighlightModels();\n if (models) {\n this.engineInstance?.batchSelectSameLevelModel(models);\n }\n this.rightKey?.hide();\n }\n },\n {\n id: 'selectSameLevelType',\n label: 'menu.selectSameLevelType',\n onClick: () => {\n const models = this.engineInstance?.getHighlightModels();\n if (models) {\n this.engineInstance?.batchSelectSameLevelTypeModel(models);\n }\n this.rightKey?.hide();\n }\n }\n ]\n });\n\n // 7. 剖切盒适应\n items.push({\n id: 'fitSectionBox',\n label: 'menu.fitSectionBox',\n group: 'component',\n order: 7,\n onClick: () => {\n this.engineInstance?.fitSectionBoxToModel();\n this.rightKey?.hide();\n }\n });\n }\n\n // 8. 显示全部(始终显示)\n items.push({\n id: 'showAll',\n label: 'menu.showAll',\n group: 'component',\n order: 8,\n onClick: () => {\n this.engineInstance?.showAllModels();\n this.emit('menu:show-all', {});\n this.rightKey?.hide();\n }\n });\n\n return items;\n });\n\n return this.engineInstance.isInitialized();\n } catch (error) {\n console.error('[EngineManager] Failed to initialize 3D engine:', error);\n this.engineInstance = null;\n return false;\n }\n }\n\n /**\n * 检查引擎是否已初始化\n * @returns 是否已初始化\n */\n public isInitialized(): boolean {\n return this.engineInstance !== null && this.engineInstance.isInitialized();\n }\n\n /**\n * 加载模型\n * @param urls 模型 URL 数组\n * @param options 加载选项\n */\n public loadModel(urls: string[], options?: ModelLoadOptions): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.loadModel(urls, options);\n }\n\n /** 暂停渲染 */\n public pauseRendering(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.pauseRendering();\n }\n\n /** 恢复渲染 */\n public resumeRendering(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.resumeRendering();\n }\n\n /** 销毁引擎管理器 */\n public destroy(): void {\n if (this.engineInstance) {\n this.engineInstance.destroy();\n this.engineInstance = null;\n }\n if (this.rightKey) {\n this.rightKey.destroy();\n this.rightKey = null;\n }\n super.destroy();\n }\n}\n","import type { BimTreeNode } from './tree-node';\n\n/**\n * 节点勾选状态枚举\n */\nexport enum TreeNodeCheckState {\n Unchecked = 0,\n Checked = 1,\n Indeterminate = 2 // 半选\n}\n\n/**\n * 节点点击行为类型\n */\nexport type NodeClickAction = 'select' | 'expand';\n\n/**\n * 树节点配置接口\n */\nexport interface TreeNodeConfig {\n /** 唯一标识符 */\n id: string;\n\n /** 显示文本的翻译键 */\n label: string;\n\n /** 节点图标 (SVG string 或 URL) */\n icon?: string;\n\n /** 子节点列表 */\n children?: TreeNodeConfig[];\n\n /** 初始展开状态 (默认 false) */\n expanded?: boolean;\n\n /** 初始选中状态 (默认 false) */\n checked?: boolean;\n\n /** 是否禁用 (默认 false) */\n disabled?: boolean;\n\n /** 自定义业务数据 */\n data?: any;\n\n /** 是否是叶子节点 (用于异步加载场景,暂留接口) */\n isLeaf?: boolean;\n\n /** 点击整行的行为 (默认 'select') */\n clickAction?: NodeClickAction;\n}\n\n/**\n * 树组件配置选项\n */\nexport interface TreeOptions {\n /** 树的数据源 */\n data: TreeNodeConfig[];\n\n /** 是否显示复选框 (默认 true) */\n checkable?: boolean;\n\n /** \n * 父子节点选中状态是否关联 (默认 true)\n * true: 选中父选子,子全选自动选父\n * false: 独立选中\n */\n checkStrictly?: boolean;\n\n /** 默认展开所有节点 (默认 false) */\n defaultExpandAll?: boolean;\n\n /** 缩进宽度 (像素,默认 24) */\n indent?: number;\n\n /** 是否启用搜索功能 (默认 false) */\n enableSearch?: boolean;\n\n /** 搜索框占位符 */\n searchPlaceholder?: string;\n\n /** 节点勾选回调 */\n onNodeCheck?: (node: BimTreeNode) => void;\n\n /** 节点选择回调 */\n onNodeSelect?: (node: BimTreeNode) => void;\n\n /** 节点取消选择回调(再次点击已选中节点时触发) */\n onNodeDeselect?: (node: BimTreeNode) => void;\n\n /** 节点展开/折叠回调 */\n onNodeExpand?: (node: BimTreeNode) => void;\n\n /** \n * 选中时显示的自定义操作栏渲染函数 \n * 返回 HTML 字符串或 HTMLElement\n */\n renderActions?: (node: TreeNodeConfig) => HTMLElement | string;\n}","import { TreeNodeConfig, TreeNodeCheckState, TreeOptions } from './types';\n/**\n * 树节点类\n * 负责渲染单个节点、处理交互和递归\n */\nexport class BimTreeNode {\n public config: TreeNodeConfig;\n public element: HTMLElement;\n public children: BimTreeNode[] = [];\n public parent: BimTreeNode | null = null;\n public checkState: TreeNodeCheckState = TreeNodeCheckState.Unchecked;\n\n // UI Elements\n private contentEl!: HTMLElement;\n private switcherEl!: HTMLElement;\n private checkboxEl: HTMLElement | null = null;\n private titleEl!: HTMLElement;\n private actionsEl!: HTMLElement; // 操作栏容器\n private childrenContainer!: HTMLElement;\n // 外部回调\n private onExpandChange: (node: BimTreeNode) => void;\n private onCheckChange: (node: BimTreeNode) => void;\n private onNodeClick: (node: BimTreeNode) => void;\n private renderActions?: (node: TreeNodeConfig) => HTMLElement | string;\n \n constructor(\n config: TreeNodeConfig, \n options: TreeOptions,\n callbacks: {\n onExpand: (n: BimTreeNode) => void,\n onCheck: (n: BimTreeNode) => void,\n onClick: (n: BimTreeNode) => void\n }\n ) {\n this.config = config;\n this.onExpandChange = callbacks.onExpand;\n this.onCheckChange = callbacks.onCheck;\n this.onNodeClick = callbacks.onClick;\n this.renderActions = options.renderActions;\n \n // 初始化状态\n this.checkState = config.checked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked;\n \n this.element = this.createDom(options);\n }\n /**\n * 创建节点 DOM\n */\n private createDom(options: TreeOptions): HTMLElement {\n const nodeEl = document.createElement('div');\n nodeEl.className = 'bim-tree-node';\n if (this.config.disabled) nodeEl.classList.add('is-disabled');\n\n // 1. 内容行\n this.contentEl = document.createElement('div');\n this.contentEl.className = 'bim-tree-node-content';\n\n // 1.1 展开/折叠箭头\n this.switcherEl = document.createElement('span');\n this.switcherEl.className = 'bim-tree-switcher';\n // 默认右箭头 SVG\n this.switcherEl.innerHTML = ``;\n\n const hasChildren = this.config.children && this.config.children.length > 0;\n if (!hasChildren) {\n this.switcherEl.classList.add('is-hidden');\n } else if (this.config.expanded) {\n this.switcherEl.classList.add('is-expanded');\n }\n\n this.switcherEl.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleExpand();\n });\n\n this.contentEl.appendChild(this.switcherEl);\n\n // 1.2 复选框 (可选)\n if (options.checkable !== false) {\n this.checkboxEl = document.createElement('span');\n this.checkboxEl.className = 'bim-tree-checkbox';\n this.updateCheckboxUI();\n\n this.checkboxEl.addEventListener('click', (e) => {\n e.stopPropagation();\n if (this.config.disabled) return;\n this.toggleCheck();\n });\n this.contentEl.appendChild(this.checkboxEl);\n }\n\n // 1.3 图标 (可选)\n if (this.config.icon) {\n const iconEl = document.createElement('span');\n iconEl.className = 'bim-tree-icon';\n iconEl.innerHTML = this.config.icon.includes('`;\n this.contentEl.appendChild(iconEl);\n }\n\n // 1.4 文本\n this.titleEl = document.createElement('span');\n this.titleEl.className = 'bim-tree-title';\n this.updateLabel(); // 设置文本\n this.contentEl.appendChild(this.titleEl);\n\n // 1.5 操作栏 (Actions)\n this.actionsEl = document.createElement('div');\n this.actionsEl.className = 'bim-tree-node-actions';\n this.actionsEl.addEventListener('click', (e) => {\n e.stopPropagation(); // 防止点击操作栏触发选中/展开\n });\n this.contentEl.appendChild(this.actionsEl);\n\n // 绑定整行点击\n this.contentEl.addEventListener('click', (e) => {\n e.stopPropagation();\n if (this.config.disabled) return;\n\n const action = this.config.clickAction || 'select';\n\n if (action === 'expand') {\n this.toggleExpand();\n } else {\n this.onNodeClick(this);\n }\n });\n\n nodeEl.appendChild(this.contentEl);\n\n // 2. 子节点容器\n this.childrenContainer = document.createElement('div');\n this.childrenContainer.className = 'bim-tree-children';\n // 设置缩进\n const indent = options.indent || 24;\n this.childrenContainer.style.paddingLeft = `${indent}px`; // 每一级子器左移\n\n if (this.config.expanded && hasChildren) {\n this.childrenContainer.classList.add('is-visible');\n }\n nodeEl.appendChild(this.childrenContainer);\n\n return nodeEl;\n }\n\n /**\n * 设置高亮选中状态 (Select 模式下)\n */\n public setSelected(selected: boolean) {\n if (selected) {\n this.contentEl.classList.add('is-selected');\n // 渲染自定义操作栏\n if (this.renderActions) {\n const content = this.renderActions(this.config);\n this.actionsEl.innerHTML = '';\n if (typeof content === 'string') {\n this.actionsEl.innerHTML = content;\n } else if (content instanceof HTMLElement) {\n this.actionsEl.appendChild(content);\n }\n }\n } else {\n this.contentEl.classList.remove('is-selected');\n this.actionsEl.innerHTML = ''; // 清空内容\n }\n }\n\n /**\n * 更新显示文本 (国际化支持) -> 移除国际化,直接显示\n */\n public updateLabel() {\n if (this.titleEl) {\n this.titleEl.textContent = this.config.label;\n }\n }\n\n /**\n * 切换展开状态\n */\n public toggleExpand(force?: boolean) {\n if (!this.config.children || this.config.children.length === 0) return;\n\n const newState = force !== undefined ? force : !this.config.expanded;\n this.config.expanded = newState;\n\n if (newState) {\n this.switcherEl.classList.add('is-expanded');\n this.childrenContainer.classList.add('is-visible');\n } else {\n this.switcherEl.classList.remove('is-expanded');\n this.childrenContainer.classList.remove('is-visible');\n }\n\n // 触发回调\n if (force === undefined) { // 只有用户交互才触发回调,防止初始化时无限循环\n this.onExpandChange(this);\n }\n }\n\n /**\n * 切换选中状态 (用户点击)\n */\n public toggleCheck() {\n // 如果当前是半选,点击变全选;如果全选,点击未选;如果未选,点击变全选\n // 简化逻辑:只要不是 Checked,点击都变 Checked;如果是 Checked,变 Unchecked\n const newChecked = this.checkState !== TreeNodeCheckState.Checked;\n this.setChecked(newChecked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked, true);\n }\n\n public setChecked(state: TreeNodeCheckState, fireEvent: boolean = false, force: boolean = false) {\n if (!force && this.checkState === state) return;\n\n this.checkState = state;\n this.config.checked = (state === TreeNodeCheckState.Checked);\n\n this.updateCheckboxUI();\n\n if (fireEvent) {\n this.onCheckChange(this);\n }\n }\n\n /**\n * 更新复选框 UI 样式\n */\n public updateCheckboxUI() {\n if (!this.checkboxEl) return;\n\n this.checkboxEl.classList.remove('is-checked', 'is-indeterminate');\n\n if (this.checkState === TreeNodeCheckState.Checked) {\n this.checkboxEl.classList.add('is-checked');\n } else if (this.checkState === TreeNodeCheckState.Indeterminate) {\n this.checkboxEl.classList.add('is-indeterminate');\n }\n }\n\n /**\n * 添加子节点实例\n */\n public appendChild(childNode: BimTreeNode) {\n childNode.parent = this;\n this.children.push(childNode);\n this.childrenContainer.appendChild(childNode.element);\n\n // 如果之前是隐藏的箭头,现在有了子节点,需要显示出来\n if (this.children.length === 1) {\n this.switcherEl.classList.remove('is-hidden');\n }\n }\n\n /**\n * 销毁\n */\n public destroy() {\n this.children.forEach(c => c.destroy());\n this.children = [];\n this.element.remove();\n this.parent = null;\n }\n}\n","import { IBimComponent } from '../../types/component';\nimport { ThemeConfig } from '../../themes/types';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport { TreeOptions, TreeNodeConfig, TreeNodeCheckState } from './types';\nimport { BimTreeNode } from './tree-node';\nimport './index.css';\n\n// 定义辅助事件发射器接口 (由于 BimTree 通常作为 Manager 的一部分或独立使用)\n// 为了方便,这里我们假设它会被 TreeManager 管理,TreeManager 会处理事件发射\n// 但 BimTree 本身也需要一个方式通知 Manager。\n// 我们可以通过构造函数传入 event bus 适配器,或者直接使用 CustomEvent。\n// 更好的方式:BimTree 提供 onEvent 回调。\n\nexport class BimTree implements IBimComponent {\n public element: HTMLElement;\n private contentElement: HTMLElement; // 树内容容器\n private searchInput: HTMLInputElement | null = null;\n private searchResults: HTMLElement | null = null;\n\n private options: TreeOptions;\n private nodeMap: Map = new Map();\n private rootNodes: BimTreeNode[] = [];\n private selectedNode: BimTreeNode | null = null; // 当前选中的高亮节点\n private lastRevealedNodeId: string | null = null;\n\n // 订阅清理函数\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n private clickOutsideHandler: ((e: MouseEvent) => void) | null = null;\n\n // 事件回调 (由 Manager 注入)\n public onNodeCheck?: (node: BimTreeNode) => void;\n public onNodeSelect?: (node: BimTreeNode) => void;\n public onNodeDeselect?: (node: BimTreeNode) => void;\n public onNodeExpand?: (node: BimTreeNode) => void;\n\n constructor(options: TreeOptions) {\n this.options = {\n checkable: true,\n checkStrictly: true,\n indent: 24,\n defaultExpandAll: true,\n enableSearch: false,\n searchPlaceholder: 'tree.searchPlaceholder',\n ...options\n };\n \n // 主容器\n this.element = document.createElement('div');\n this.element.className = 'bim-tree';\n\n // 搜索区域\n if (this.options.enableSearch) {\n this.createSearchDOM();\n }\n\n // 内容容器\n this.contentElement = document.createElement('div');\n this.contentElement.className = 'bim-tree-content';\n this.element.appendChild(this.contentElement);\n\n // 初始化回调\n if (options.onNodeCheck) this.onNodeCheck = options.onNodeCheck;\n if (options.onNodeSelect) this.onNodeSelect = options.onNodeSelect;\n if (options.onNodeDeselect) this.onNodeDeselect = options.onNodeDeselect;\n if (options.onNodeExpand) this.onNodeExpand = options.onNodeExpand;\n }\n\n private createSearchDOM() {\n const searchContainer = document.createElement('div');\n searchContainer.className = 'bim-tree-search';\n\n const wrapper = document.createElement('div');\n wrapper.className = 'bim-tree-search-wrapper';\n\n // 图标\n const icon = document.createElement('span');\n icon.className = 'bim-tree-search-icon';\n icon.innerHTML = ``;\n wrapper.appendChild(icon);\n\n this.searchInput = document.createElement('input');\n this.searchInput.className = 'bim-tree-search-input';\n this.searchInput.type = 'text';\n this.searchInput.placeholder = t(this.options.searchPlaceholder || '搜索...');\n\n // 绑定输入事件\n this.searchInput.addEventListener('input', (e) => {\n const query = (e.target as HTMLInputElement).value;\n this.handleSearch(query);\n });\n\n wrapper.appendChild(this.searchInput);\n searchContainer.appendChild(wrapper);\n\n // 搜索结果容器\n this.searchResults = document.createElement('div');\n this.searchResults.className = 'bim-tree-search-results';\n\n searchContainer.appendChild(this.searchResults);\n this.element.appendChild(searchContainer);\n\n // 点击外部关闭搜索结果\n this.clickOutsideHandler = (e: MouseEvent) => {\n if (this.searchResults &&\n !this.searchResults.contains(e.target as Node) &&\n !this.searchInput?.contains(e.target as Node)) {\n this.searchResults.classList.remove('is-visible');\n }\n };\n document.addEventListener('click', this.clickOutsideHandler);\n }\n\n public init(): void {\n this.render();\n\n // 订阅系统事件\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n // 初始化主题\n this.setTheme(themeManager.getTheme());\n }\n\n /**\n * 处理搜索逻辑\n */\n private handleSearch(query: string) {\n if (!this.searchResults) return;\n\n if (!query.trim()) {\n this.searchResults.classList.remove('is-visible');\n this.searchResults.innerHTML = '';\n return;\n }\n\n const results: { node: BimTreeNode, label: string, path: string }[] = [];\n const lowerQuery = query.toLowerCase();\n\n this.nodeMap.forEach(node => {\n // 直接使用 config.label,不进行翻译\n const label = node.config.label;\n if (label.toLowerCase().includes(lowerQuery)) {\n results.push({\n node,\n label,\n path: this.getNodePath(node)\n });\n }\n });\n\n this.renderSearchResults(results);\n }\n\n /**\n * 获取节点路径(面包屑)\n */\n private getNodePath(node: BimTreeNode): string {\n const path: string[] = [];\n let current: BimTreeNode | null = node.parent; // 从父级开始\n while (current) {\n // 直接使用 label\n path.unshift(current.config.label);\n current = current.parent;\n }\n return path.join(' > ');\n }\n\n /**\n * 渲染搜索结果列表\n */\n private renderSearchResults(results: { node: BimTreeNode, label: string, path: string }[]) {\n if (!this.searchResults) return;\n\n this.searchResults.innerHTML = '';\n if (results.length === 0) {\n const noData = document.createElement('div');\n noData.className = 'bim-tree-search-item';\n noData.style.cursor = 'default';\n noData.style.color = '#999';\n noData.textContent = 'No results';\n this.searchResults.appendChild(noData);\n } else {\n results.forEach(res => {\n const item = document.createElement('div');\n item.className = 'bim-tree-search-item';\n\n const title = document.createElement('span');\n title.className = 'bim-tree-search-item-title';\n title.textContent = res.label;\n\n const path = document.createElement('span');\n path.className = 'bim-tree-search-item-path';\n path.textContent = res.path;\n\n item.appendChild(title);\n if (res.path) item.appendChild(path);\n\n item.addEventListener('click', () => {\n this.revealNode(res.node);\n });\n\n this.searchResults!.appendChild(item);\n });\n }\n this.searchResults.classList.add('is-visible');\n }\n\n /**\n * 定位到指定节点\n */\n public revealNode(node: BimTreeNode) {\n if (this.lastRevealedNodeId === node.config.id && this.isNodeFullyVisible(node)) {\n return;\n }\n this.lastRevealedNodeId = node.config.id;\n\n // 1. 关闭搜索下拉\n if (this.searchResults) {\n this.searchResults.classList.remove('is-visible');\n if (this.searchInput) this.searchInput.value = ''; // 可选:清空搜索框\n }\n\n // 2. 递归展开父节点\n let current = node.parent;\n while (current) {\n current.toggleExpand(true); // 强制展开\n current = current.parent;\n }\n\n // 3. 选中节点 (Select)\n this.handleNodeSelect(node);\n\n // 4. 滚动到可视区域\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.scrollNodeIntoContentCenter(node);\n });\n });\n }\n\n private isNodeFullyVisible(node: BimTreeNode): boolean {\n const container = this.contentElement;\n if (!container || !node?.element?.isConnected) return false;\n\n const containerRect = container.getBoundingClientRect();\n const nodeRect = node.element.getBoundingClientRect();\n return nodeRect.top >= containerRect.top && nodeRect.bottom <= containerRect.bottom;\n }\n\n private scrollNodeIntoContentCenter(node: BimTreeNode): void {\n const container = this.contentElement;\n if (!container || !node?.element?.isConnected) return;\n\n const containerRect = container.getBoundingClientRect();\n const nodeRect = node.element.getBoundingClientRect();\n if (nodeRect.top >= containerRect.top && nodeRect.bottom <= containerRect.bottom) {\n return;\n }\n\n const nodeTopInContainer = nodeRect.top - containerRect.top + container.scrollTop;\n const targetTop = Math.max(0, nodeTopInContainer - (container.clientHeight - nodeRect.height) / 2);\n\n container.scrollTo({\n top: targetTop,\n behavior: 'auto'\n });\n }\n\n /**\n * 设置主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-primary', theme.primary);\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-secondary', theme.textSecondary);\n style.setProperty('--bim-text-tertiary', theme.textTertiary);\n style.setProperty('--bim-text-disabled', theme.textDisabled);\n style.setProperty('--bim-text-inverse', theme.textInverse);\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-border-disabled', theme.borderDisabled);\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover);\n style.setProperty('--bim-component-bg-selected', theme.componentBgSelected);\n style.setProperty('--bim-component-bg-disabled', theme.componentBgDisabled);\n style.setProperty('--bim-shadow-md', theme.shadowMd);\n style.setProperty('--bim-focus-ring', theme.focusRing);\n }\n\n /**\n * 响应语言变更\n */\n public setLocales(): void {\n this.nodeMap.forEach(node => node.updateLabel());\n if (this.searchInput) {\n this.searchInput.placeholder = t(this.options.searchPlaceholder || 'tree.searchPlaceholder');\n }\n }\n\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n if (this.clickOutsideHandler) {\n document.removeEventListener('click', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n this.rootNodes.forEach(node => node.destroy());\n this.rootNodes = [];\n this.nodeMap.clear();\n this.lastRevealedNodeId = null;\n this.element.remove();\n this.selectedNode = null;\n }\n\n /**\n * 核心渲染逻辑\n */\n private render(): void {\n this.contentElement.innerHTML = ''; // 清空内容区,而不是整个 element\n this.nodeMap.clear();\n this.rootNodes = [];\n\n this.options.data.forEach(config => {\n this.createNodeRecursively(config, null);\n });\n\n // 移除旧的 expandAll 调用,因为 expanded 状态已在 createNodeRecursively 中处理\n }\n\n /**\n * 递归创建节点\n */\n private createNodeRecursively(config: TreeNodeConfig, parent: BimTreeNode | null) {\n // 处理展开状态优先级: config.expanded > defaultExpandAll\n if (config.expanded === undefined) {\n config.expanded = this.options.defaultExpandAll;\n }\n\n const node = new BimTreeNode(config, this.options, {\n onExpand: (n) => { if (this.onNodeExpand) this.onNodeExpand(n); },\n onCheck: (n) => this.handleNodeCheck(n),\n onClick: (n) => this.handleNodeSelect(n)\n });\n\n this.nodeMap.set(config.id, node);\n\n if (parent) {\n parent.appendChild(node);\n } else {\n this.rootNodes.push(node);\n this.contentElement.appendChild(node.element); // 挂载到 contentElement\n }\n\n if (config.children && config.children.length > 0) {\n config.children.forEach(childConfig => {\n this.createNodeRecursively(childConfig, node);\n });\n }\n\n // 如果是初始化渲染,需要处理 checkStrictly 的向上联动(因为数据里可能只给了子节点 checked,父节点没给)\n // 这里做一个简单的后处理:如果 checkStrictly 开启,且当前节点 checked,则触发一次联动\n // 注意:这可能会导致性能问题,���化做法是在所有节点创建完后统一计算一次状态\n }\n\n /**\n * 处理节点选择 (高亮)\n * 点击已选中节点时切换为取消选中\n */\n private handleNodeSelect(node: BimTreeNode) {\n // 再次点击已选中的节点 → 取消选中\n if (this.selectedNode === node) {\n node.setSelected(false);\n this.selectedNode = null;\n if (this.onNodeDeselect) this.onNodeDeselect(node);\n return;\n }\n\n // 取消之前选中的节点\n if (this.selectedNode) {\n this.selectedNode.setSelected(false);\n }\n\n // 选中当前节点\n node.setSelected(true);\n this.selectedNode = node;\n\n if (this.onNodeSelect) this.onNodeSelect(node);\n }\n\n /**\n * 处理节点勾选逻辑 (核心算法)\n */\n private handleNodeCheck(node: BimTreeNode) {\n const isChecked = node.checkState === TreeNodeCheckState.Checked;\n\n // 1. 触发外部回调 (Event)\n if (this.onNodeCheck) this.onNodeCheck(node);\n\n // 2. 如果不联动,直接返回\n if (this.options.checkStrictly === false) return;\n\n // 3. 联动逻辑\n // 3.1 向下级联 (Cascade Down): 父变子全变\n const updateChildren = (n: BimTreeNode, state: TreeNodeCheckState) => {\n n.children.forEach(child => {\n if (child.config.disabled) return; // 跳过禁用节点\n child.setChecked(state, false); // 不再触发事件,只更新状态 UI\n updateChildren(child, state);\n });\n };\n\n // 当前节点是 Checked 或 Unchecked,子节点跟随\n if (isChecked) {\n updateChildren(node, TreeNodeCheckState.Checked);\n } else {\n updateChildren(node, TreeNodeCheckState.Unchecked);\n }\n\n // 3.2 向上冒泡 (Bubble Up): 子变父更新\n let current = node.parent;\n while (current) {\n if (current.config.disabled) {\n current = current.parent;\n continue;\n }\n\n const children = current.children;\n const allChecked = children.every(c => c.checkState === TreeNodeCheckState.Checked);\n const allUnchecked = children.every(c => c.checkState === TreeNodeCheckState.Unchecked);\n\n if (allChecked) {\n current.setChecked(TreeNodeCheckState.Checked, false);\n } else if (allUnchecked) {\n current.setChecked(TreeNodeCheckState.Unchecked, false);\n } else {\n current.setChecked(TreeNodeCheckState.Indeterminate, false);\n }\n\n current = current.parent;\n }\n }\n\n // ================== Public APIs ==================\n\n public getNode(id: string): BimTreeNode | undefined {\n return this.nodeMap.get(id);\n }\n\n public checkNode(id: string, checked: boolean) {\n const node = this.nodeMap.get(id);\n if (node) {\n node.setChecked(checked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked, true);\n // 手动调用联动处理,因为 setChecked 的 fireEvent 只触发回调,不包含内部逻辑调用?\n // 不,我们在 createNodeRecursively 里绑定的 onCheck 就是 handleNodeCheck\n // 所以只要 fireEvent=true,就会触发 handleNodeCheck,进而触发联动。\n }\n }\n\n public expandAll(expanded: boolean) {\n this.nodeMap.forEach(node => node.toggleExpand(expanded));\n }\n\n public checkAllNodes(checked: boolean): void {\n const state = checked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked;\n this.nodeMap.forEach(node => node.setChecked(state, false, true));\n }\n\n public getCheckedNodes(includeHalfChecked: boolean = false): TreeNodeConfig[] {\n const result: TreeNodeConfig[] = [];\n this.nodeMap.forEach(node => {\n if (node.checkState === TreeNodeCheckState.Checked) {\n result.push(node.config);\n } else if (includeHalfChecked && node.checkState === TreeNodeCheckState.Indeterminate) {\n result.push(node.config);\n }\n });\n return result;\n }\n}\n","import { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { ThemeConfig } from '../../themes/types';\nimport type { TabItem, TabOptions } from './index.type';\nimport './index.css';\n\n/**\n * 简单标签页组件(固定标签,不支持运行时增删)\n * - 仅处理标签头部与内容切换\n * - 主题从 ThemeManager 获取,不在配置中传入\n * - 文案通过 t() 翻译,支持传原文直接展示\n */\nexport class BimTab implements IBimComponent {\n /** 组件根节点 */\n public element: HTMLElement;\n /** 头部容器 */\n private navElement: HTMLElement;\n /** 内容容器 */\n private contentElement: HTMLElement;\n /** 业务配置 */\n private options: TabOptions;\n /** 当前激活的标签 id */\n private activeId: string | null;\n /** id -> TabItem */\n private tabMap: Map = new Map();\n /** id -> 内容容器 */\n private panelMap: Map = new Map();\n private panelTreeScrollTopMap: Map = new Map();\n /** 主题/语言订阅解除函数 */\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n /** 头部点击事件处理引用(便于销毁时解绑) */\n private navClickHandler: ((e: MouseEvent) => void) | null = null;\n\n constructor(options: TabOptions) {\n this.options = options;\n this.activeId = options.activeId || (options.tabs[0]?.id ?? null);\n\n // 预置 tabMap,方便后续查找\n options.tabs.forEach((tab) => this.tabMap.set(tab.id, tab));\n\n // 构建基础 DOM 结构\n this.element = document.createElement('div');\n this.element.className = 'bim-tab';\n\n this.navElement = document.createElement('div');\n this.navElement.className = 'bim-tab__nav';\n this.navElement.setAttribute('role', 'tablist');\n this.element.appendChild(this.navElement);\n\n this.contentElement = document.createElement('div');\n this.contentElement.className = 'bim-tab__content';\n this.element.appendChild(this.contentElement);\n\n // 挂载到容器\n this.options.container.appendChild(this.element);\n }\n\n /**\n * 初始化组件\n */\n public init(): void {\n this.renderNav();\n this.renderPanels();\n // 初始化文案与主题\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n\n // 订阅语言、主题变化\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n }\n\n /**\n * 渲染头部标签\n */\n private renderNav(): void {\n this.navElement.innerHTML = '';\n\n this.navClickHandler = (event: MouseEvent) => {\n const target = (event.target as HTMLElement).closest('.bim-tab__item');\n if (!target) return;\n const tabId = target.dataset.id;\n if (!tabId) return;\n const tab = this.tabMap.get(tabId);\n if (tab?.disabled) return;\n this.activateTab(tabId);\n };\n this.navElement.addEventListener('click', this.navClickHandler);\n\n this.options.tabs.forEach((tab) => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'bim-tab__item';\n btn.dataset.id = tab.id;\n btn.setAttribute('role', 'tab');\n btn.id = `tab-${tab.id}`;\n btn.setAttribute('aria-selected', `${tab.id === this.activeId}`);\n if (tab.disabled) {\n btn.disabled = true;\n btn.setAttribute('aria-disabled', 'true');\n btn.classList.add('is-disabled');\n }\n\n // 图标\n if (tab.icon) {\n const iconEl = document.createElement('span');\n iconEl.className = 'bim-tab__icon';\n iconEl.innerHTML = tab.icon;\n btn.appendChild(iconEl);\n }\n\n const titleEl = document.createElement('span');\n titleEl.className = 'bim-tab__title';\n titleEl.textContent = this.resolveTitle(tab.title);\n btn.appendChild(titleEl);\n\n if (tab.id === this.activeId) {\n btn.classList.add('is-active');\n }\n\n this.navElement.appendChild(btn);\n });\n }\n\n /**\n * 渲染内容面板\n */\n private renderPanels(): void {\n this.contentElement.innerHTML = '';\n this.panelMap.clear();\n\n this.options.tabs.forEach((tab) => {\n const panel = document.createElement('div');\n panel.className = 'bim-tab__panel';\n panel.dataset.id = tab.id;\n panel.setAttribute('role', 'tabpanel');\n panel.setAttribute('aria-labelledby', `tab-${tab.id}`);\n\n if (tab.content instanceof HTMLElement) {\n panel.appendChild(tab.content);\n } else if (typeof tab.content === 'string') {\n panel.innerHTML = tab.content;\n }\n\n if (tab.id === this.activeId) {\n panel.classList.add('is-active');\n } else {\n panel.style.display = 'none';\n }\n\n this.panelMap.set(tab.id, panel);\n this.contentElement.appendChild(panel);\n });\n }\n\n /**\n * 激活指定标签\n * @param tabId 目标标签 id\n */\n public activateTab(tabId: string): void {\n if (this.activeId === tabId) return;\n const targetTab = this.tabMap.get(tabId);\n if (!targetTab || targetTab.disabled) return;\n\n this.activeId = tabId;\n // 更新头部状态\n const buttons = this.navElement.querySelectorAll('.bim-tab__item');\n buttons.forEach((btn) => {\n const isActive = btn.dataset.id === tabId;\n btn.classList.toggle('is-active', isActive);\n btn.setAttribute('aria-selected', `${isActive}`);\n });\n\n // 更新面板显示\n this.panelMap.forEach((panel, id) => {\n const isActive = id === tabId;\n if (!isActive) {\n this.savePanelTreeScrollTop(id, panel);\n }\n panel.classList.toggle('is-active', isActive);\n panel.style.display = isActive ? '' : 'none';\n if (isActive) {\n this.restorePanelTreeScrollTop(id, panel);\n }\n });\n\n if (this.options.onChange) {\n this.options.onChange(tabId, targetTab);\n }\n }\n\n /**\n * 应用主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-tab-bg', theme.bgElevated);\n style.setProperty('--bim-tab-nav-bg', theme.bgElevated);\n style.setProperty('--bim-tab-text', theme.textPrimary);\n style.setProperty('--bim-tab-text-secondary', theme.textSecondary);\n style.setProperty('--bim-tab-text-active', theme.primary);\n style.setProperty('--bim-tab-border', theme.borderDefault);\n style.setProperty('--bim-tab-hover-bg', theme.componentBgHover);\n style.setProperty('--bim-tab-active-bg', theme.componentBgActive);\n style.setProperty('--bim-tab-icon', theme.iconDefault);\n }\n\n /**\n * 应用当前语言文案\n */\n public setLocales(): void {\n const buttons = this.navElement.querySelectorAll('.bim-tab__item');\n buttons.forEach((btn) => {\n const id = btn.dataset.id;\n if (!id) return;\n const tab = this.tabMap.get(id);\n if (!tab) return;\n const titleEl = btn.querySelector('.bim-tab__title');\n if (titleEl) {\n titleEl.textContent = this.resolveTitle(tab.title);\n }\n });\n }\n\n /**\n * 清理资源\n */\n public destroy(): void {\n if (this.navClickHandler) {\n this.navElement.removeEventListener('click', this.navClickHandler);\n this.navClickHandler = null;\n }\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.panelMap.clear();\n this.panelTreeScrollTopMap.clear();\n this.tabMap.clear();\n this.element.remove();\n }\n\n private savePanelTreeScrollTop(tabId: string, panel: HTMLElement): void {\n const treeContent = panel.querySelector('.bim-tree-content');\n if (!treeContent) return;\n this.panelTreeScrollTopMap.set(tabId, treeContent.scrollTop);\n }\n\n private restorePanelTreeScrollTop(tabId: string, panel: HTMLElement): void {\n const savedTop = this.panelTreeScrollTopMap.get(tabId);\n if (savedTop === undefined) return;\n const treeContent = panel.querySelector('.bim-tree-content');\n if (!treeContent) return;\n requestAnimationFrame(() => {\n treeContent.scrollTop = savedTop;\n });\n }\n\n /**\n * 工具:解析标题(优先翻译,不存在则回退原值)\n */\n private resolveTitle(title: string): string {\n try {\n const translated = t(title);\n return translated || title;\n } catch (err) {\n // 翻译失败时使用原值\n return title;\n }\n }\n}\n","/**\n * 图标管理器\n * 统一管理所有 SVG 图标\n */\n\n/**\n * 所有图标集合(静态变量)\n */\nconst ICONS: Record = {\n // ========== 来自 assets 的图标 (48x48) ==========\n 测量: '',\n 地图: '',\n 框选放大: '',\n 漫游: '',\n 目录树: '',\n 剖切: '',\n 剖切盒: '',\n 全屏: '',\n 设置: '',\n 拾曲面剖切: '',\n 轴向剖切: '',\n 主视角: '',\n 文档: '',\n 第一人称漫游: '',\n 反向: '',\n 路径漫游: '',\n 适应到模型: '',\n 隐藏: '',\n 重置: '',\n\n // ========== 测量相关图标 (32x32) ==========\n 标高: '',\n 距离: '',\n 最小距离: '',\n 激光边距: '',\n 角度: '',\n 坡度: '',\n 体积: '',\n 空间体积: '',\n\n // ========== 通用图标 (24x24) ==========\n close: '',\n check: '',\n warning: '',\n error: '',\n success: '',\n plus: '',\n minus: '',\n arrowUp: '',\n arrowUpBold: '',\n arrowDown: '',\n arrowLeft: '',\n arrowRight: '',\n search: '',\n refresh: '',\n delete: '',\n edit: '',\n save: '',\n expand: '',\n collapse: '',\n\n bot: '',\n history: '',\n settings: '',\n loader: '',\n send: '',\n\n // ========== 默认图标 ==========\n default: '',\n};\n\n/**\n * 获取图标\n * @param name 图标名称\n * @returns SVG 字符串,如果找不到返回默认图标\n */\nexport function getIcon(name: string): string {\n const icon = ICONS[name];\n\n if (!icon) {\n console.warn(`[IconManager] Icon \"${name}\" not found, using default icon`);\n return ICONS.default;\n }\n\n return icon;\n}\n","/**\n * @file construct-tree-manager-btn.ts\n * @description 构件树管理器 - 负责管理构件树按钮和对话框\n * \n * 功能概述:\n * 1. 在界面左上角显示构件树按钮\n * 2. 点击按钮打开构件树对话框,包含三个选项卡:楼层树、类型树、专业树\n * 3. 点击树节点时,如果节点有 ids,则高亮对应的 3D 模型构件\n * \n * 数据流:\n * 1. 从 3D 引擎获取原始树数据 (getLevelTreeData/getTypeTreeData/getMajorTreeData)\n * 2. 通过 transformTreeData 转换为 SDK 标准的 TreeNodeConfig 格式\n * 3. 创建 BimTree 组件渲染树结构\n * 4. 用户点击节点时,通过 onNodeSelect 回调触发模型高亮\n */\n\nimport type { ButtonGroupColors, ButtonConfig } from '../components/button-group/index.type';\nimport { BaseManager } from '../core/base-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { BimButtonGroup } from '../components/button-group';\nimport { BimTree } from '../components/tree';\nimport { TreeNodeConfig, TreeNodeCheckState } from '../components/tree/types';\nimport type { BimTreeNode } from '../components/tree/tree-node';\nimport { BimDialog } from '../components/dialog';\nimport { BimTab } from '../components/tab';\nimport { getIcon } from '../utils/icon-manager';\n\n// ============================================================================\n// 类型定义\n// ============================================================================\n\n/**\n * 3D 引擎返回的原始树节点数据结构\n * \n * @example\n * {\n * name: \"标高 1\",\n * id: null,\n * ids: [\"350518\", \"350520\", ...], // 构件 ID 数组,用于高亮模型\n * children: [...],\n * isLeaf: false\n * }\n */\ninterface EngineTreeNode {\n /** 节点显示名称 */\n name?: string;\n /** 节点 ID(可能为 null) */\n id?: string | null;\n /** 构件 ID 数组 - 用于调用 highlightModel 高亮模型 */\n ids?: string[] | null;\n /** 子节点列表 */\n children?: EngineTreeNode[] | null;\n /** 是否为叶子节点 */\n isLeaf?: boolean;\n}\n\n/**\n * 3D 引擎返回的原始模型数据结构(最外层)\n * \n * @example\n * {\n * name: \"栈桥模型\",\n * url: \"https://xxx.com/models/xxx/\", // 模型 URL,用于 highlightModel\n * children: [...]\n * }\n */\ninterface EngineModelData {\n /** 模型显示名称 */\n name?: string;\n /** 模型资源 URL - 调用 highlightModel 时需要此参数 */\n url: string;\n /** 子节点列表 */\n children?: EngineTreeNode[] | null;\n}\n\n/**\n * 扩展的节点数据,包含模型 URL\n * 转换后存储在 TreeNodeConfig.data 中\n */\ninterface TransformedNodeData extends EngineTreeNode {\n /** 模型 URL - 从最外层 model.url 传递下来 */\n _modelUrl: string;\n}\n\ninterface ModelParam {\n url: string;\n ids: number[];\n}\n\n// ============================================================================\n// 工具函数\n// ============================================================================\n\n/**\n * 使用 SHA-256 算法对 ids 数组生成唯一哈希值\n * \n * 为什么需要 hash:\n * - 原始数据中 node.id 可能为 null\n * - ids 数组可能很长(几百个元素),不适合直接作为 ID\n * - 需要一个稳定且唯一的标识符用于树组件的 nodeMap\n * \n * @param ids - 构件 ID 数组\n * @returns 64 位十六进制哈希字符串\n * \n * @example\n * hashIds([\"350518\", \"350520\"]) // => \"a1b2c3d4e5f6...\"\n */\nfunction fnv1a32(input: string, seed: number): number {\n let h = seed >>> 0;\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h ^= c & 0xff;\n h = Math.imul(h, 0x01000193);\n h ^= (c >>> 8) & 0xff;\n h = Math.imul(h, 0x01000193);\n }\n return h >>> 0;\n}\n\nasync function hashIds(ids: string[]): Promise {\n const str = JSON.stringify(ids);\n const h1 = fnv1a32(str, 0x811c9dc5);\n const h2 = fnv1a32(str, 0x811c9dc5 ^ 0x9e3779b9);\n return `${h1.toString(16).padStart(8, '0')}${h2.toString(16).padStart(8, '0')}`;\n}\n\n/**\n * 递归收集节点及其所有子孙节点的 ids\n * 用于父级节点操作时,获取其下所有叶子节点对应的构件 ids\n */\nfunction collectModelParams(node: BimTreeNode): ModelParam[] {\n const grouped = new Map>();\n\n const collect = (current: BimTreeNode): void => {\n const data = current.config.data as TransformedNodeData | undefined;\n const modelUrl = data?._modelUrl;\n if (modelUrl && data?.ids?.length) {\n let idSet = grouped.get(modelUrl);\n if (!idSet) {\n idSet = new Set();\n grouped.set(modelUrl, idSet);\n }\n for (const rawId of data.ids) {\n const id = Number(rawId);\n if (Number.isFinite(id)) {\n idSet.add(id);\n }\n }\n }\n\n for (const child of current.children || []) {\n collect(child);\n }\n };\n\n collect(node);\n\n const result: ModelParam[] = [];\n for (const [url, idSet] of grouped) {\n if (idSet.size > 0) {\n result.push({ url, ids: Array.from(idSet) });\n }\n }\n return result;\n}\n\n/**\n * 将 3D 引擎返回的原始树数据转换为 SDK 标准的 TreeNodeConfig 格式\n * \n * 转换过程:\n * 1. 遍历最外层的模型数组,提取每个模型的 url\n * 2. 递归转换每个节点,将 url 注入到所有子节点的 data 中\n * 3. 如果节点有 ids 数组,使用 SHA-256 生成唯一 ID\n * \n * 点击行为:\n * - 点击节点内容:触发 onNodeSelect(高亮+跳转)\n * - 点击箭头:展开/折叠子节点\n * \n * 数据结构转换示意:\n * \n * 输入:[{ name, url, children: [{ name, ids, children }] }]\n * 输出:[{ id, label, data: { ids, _modelUrl }, children }]\n * \n * @param apiData - 3D 引擎返回的原始树数据\n * @returns 转换后的 TreeNodeConfig 数组\n */\nlet nodeIdCounter = 0;\n\nasync function transformTreeData(apiData: EngineModelData[]): Promise {\n if (!apiData || apiData.length === 0) return [];\n\n /**\n * 递归转换单个节点\n * @param node - 原始节点数据\n * @param modelUrl - 从最外层传递的模型 URL\n */\n const transformNode = async (node: EngineTreeNode, modelUrl: string): Promise => {\n const hasChildren = node.children && node.children.length > 0;\n \n // 生成节点 ID:优先使用 ids 哈希,其次使用原始 id,最后生成唯一 ID\n let id: string;\n if (node.ids?.length) {\n id = await hashIds(node.ids);\n } else if (node.id) {\n id = node.id;\n } else {\n id = `node_${++nodeIdCounter}`;\n }\n \n return {\n id,\n label: node.name || '未命名',\n expanded: false,\n checked: true,\n children: hasChildren\n ? await Promise.all(node.children!.map(child => transformNode(child, modelUrl)))\n : undefined,\n data: {\n ...node,\n _modelUrl: modelUrl\n } as TransformedNodeData\n };\n };\n\n // 遍历最外层模型数组\n return Promise.all(apiData.map(async (model) => {\n const hasChildren = model.children && model.children.length > 0;\n // ⭐ 提取模型 URL,将传递给所有子节点\n const modelUrl = model.url;\n \n return {\n id: modelUrl,\n label: model.name || '模型',\n expanded: true,\n checked: true,\n children: hasChildren\n ? await Promise.all(model.children!.map(child => transformNode(child, modelUrl)))\n : undefined,\n data: {\n _modelUrl: modelUrl\n } as TransformedNodeData\n };\n }));\n}\n\n// ============================================================================\n// 管理器类\n// ============================================================================\n\n/**\n * 构件树管理器\n * \n * 职责:\n * 1. 管理构件树按钮的生命周期(创建、显示/隐藏、销毁)\n * 2. 管理构件树对话框(打开、关闭、内容渲染)\n * 3. 处理树节点点击事件,调用 3D 引擎高亮模型\n * \n * 使用示例:\n * ```typescript\n * const manager = new ConstructTreeManagerBtn(container);\n * manager.openConstructTreeDialog(); // 打开构件树对话框\n * ```\n */\nexport class ConstructTreeManagerBtn extends BaseManager {\n /** 按钮组实例 - 用于渲染构件树按钮 */\n private toolbar: BimButtonGroup | null = null;\n /** 按钮容器元素 */\n private toolbarContainer: HTMLElement | null = null;\n /** 主容器元素 - 按钮挂载的父容器 */\n private container: HTMLElement;\n /** 构件树对话框实例 */\n private dialog: BimDialog | null = null;\n\n /**\n * 创建构件树管理器\n * @param container - 按钮挂载的容器元素\n */\n constructor(container: HTMLElement, registry: ManagerRegistry) {\n super(registry);\n this.container = container;\n this.init();\n }\n\n /**\n * 初始化按钮\n * 创建按钮容器和按钮组,添加构件树按钮\n */\n private init() {\n // 创建按钮容器\n this.toolbarContainer = document.createElement('div');\n this.toolbarContainer.id = 'bim-construct-tree';\n this.container.appendChild(this.toolbarContainer);\n \n // 创建按钮组\n this.toolbar = new BimButtonGroup({\n container: this.toolbarContainer,\n showLabel: false,\n direction: 'column',\n position: 'top-left',\n align: 'vertical',\n expand: 'up',\n registry: this.registry\n });\n this.toolbar.init();\n this.toolbar.addGroup('construct-tree');\n \n // 添加构件树按钮\n this.toolbar.addButton({\n id: 'construct-tree-btn',\n groupId: 'construct-tree',\n type: 'button',\n label: 'construct-tree',\n icon: getIcon('目录树'),\n onClick: () => {\n this.openConstructTreeDialog();\n }\n });\n this.toolbar.render();\n }\n\n /**\n * 打开构件树对话框\n * \n * 流程:\n * 1. 隐藏按钮组\n * 2. 从 3D 引擎获取三种树数据(楼层/类型/专业)\n * 3. 转换数据格式\n * 4. 创建三个 BimTree 实例\n * 5. 创建选项卡组件\n * 6. 创建对话框并显示\n */\n public async openConstructTreeDialog() {\n // 隐藏按钮组,避免遮挡对话框\n this.setVisible(false);\n\n // 从 3D 引擎获取原始树数据\n const levelTreeData = this.engineComponent?.getLevelTreeData() ?? [];\n const typeTreeData = this.engineComponent?.getTypeTreeData() ?? [];\n const majorTreeData = this.engineComponent?.getMajorTreeData() ?? [];\n\n // 调试日志:输出原始数据\n console.log('[ConstructTree] 原始数据 (Level):', levelTreeData);\n console.log('[ConstructTree] 原始数据 (Type):', typeTreeData);\n console.log('[ConstructTree] 原始数据 (Major):', majorTreeData);\n\n /**\n * 创建树组件\n * @param data - 原始树数据\n * @param label - 调试用标签\n */\n const createTree = async (data: any[], label: string) => {\n // 转换数据格式\n const transformedData = await transformTreeData(data);\n console.log(`[ConstructTree] 转换后数据 (${label}):`, transformedData);\n \n const tree = new BimTree({\n data: transformedData,\n checkable: true,\n indent: 0,\n enableSearch: true,\n checkStrictly: true,\n defaultExpandAll: true,\n \n /**\n * 节点勾选回调 - 显示/隐藏模型构件\n * 勾选 → showModel,取消勾选 → hideModels\n */\n onNodeCheck: (node) => {\n const modelParam = collectModelParams(node);\n if (!modelParam.length) return;\n \n if (node.checkState === TreeNodeCheckState.Checked) {\n this.engineComponent?.showModel(modelParam);\n } else {\n this.engineComponent?.hideModels(modelParam);\n }\n },\n \n /**\n * 节点选中回调 - 高亮并跳转到模型构件\n */\n onNodeSelect: (node) => {\n const modelParam = collectModelParams(node);\n if (!modelParam.length) return;\n \n this.engineComponent?.unhighlightAllModels();\n this.engineComponent?.highlightModel(modelParam);\n this.engineComponent?.viewScaleToModel(modelParam);\n },\n \n // 再次点击已选中节点时取消高亮\n onNodeDeselect: () => {\n this.engineComponent?.unhighlightAllModels();\n },\n \n onNodeExpand: () => {\n this.dialog?.fitWidth();\n },\n });\n tree.init();\n return tree;\n };\n\n // 创建三个树实例\n const componentTree = await createTree(levelTreeData, 'Level');\n const typeTree = await createTree(typeTreeData, 'Type');\n const majorTree = await createTree(majorTreeData, 'Major');\n\n // 创建选项卡面板容器\n const componentPanel = document.createElement('div');\n componentPanel.className = 'construct-tab__panel-content';\n componentPanel.appendChild(componentTree.element);\n\n const typePanel = document.createElement('div');\n typePanel.className = 'construct-tab__panel-content';\n typePanel.appendChild(typeTree.element);\n\n const majorPanel = document.createElement('div');\n majorPanel.className = 'construct-tab__panel-content';\n majorPanel.appendChild(majorTree.element);\n\n // 创建选项卡组件\n const tabMount = document.createElement('div');\n tabMount.className = 'construct-tab__container';\n tabMount.style.height = '100%';\n tabMount.style.overflow = 'hidden';\n \n /**\n * 重置所有树的勾选状态并显示所有模型\n * 在 Tab 切换和对话框初始化时调用\n */\n const resetAllTrees = () => {\n this.engineComponent?.showAllModels();\n componentTree.checkAllNodes(true);\n typeTree.checkAllNodes(true);\n majorTree.checkAllNodes(true);\n };\n\n const tab = new BimTab({\n container: tabMount,\n tabs: [\n { id: 'component', title: 'tab.component', content: componentPanel },\n { id: 'type', title: 'tab.type', content: typePanel },\n { id: 'major', title: 'tab.major', content: majorPanel },\n ],\n activeId: 'component',\n onChange: () => {\n this.dialog?.fitWidth();\n }\n });\n tab.init();\n\n // BimTab 初始化时不触发 onChange,需要手动调用\n resetAllTrees();\n\n // 监听右键菜单\"显示全部\"事件\n const unsubscribeShowAll = this.registry.on('menu:show-all', () => {\n resetAllTrees();\n });\n\n // 创建对话框\n this.dialog = this.registry.dialog!.create({\n title: 'constructTree.title',\n minWidth: 320,\n height: 600,\n content: tabMount,\n position: { x: 20, y: 20 },\n resizable: false,\n onClose: () => {\n unsubscribeShowAll();\n tab.destroy();\n componentTree.destroy();\n typeTree.destroy();\n majorTree.destroy();\n this.setVisible(true);\n }\n });\n this.dialog?.fitWidth();\n }\n\n /** 刷新渲染 */\n public refresh() {\n this.toolbar?.render();\n }\n\n /** 销毁管理器 */\n public destroy() {\n this.toolbar?.destroy();\n this.toolbar = null;\n super.destroy();\n }\n\n /**\n * 添加按钮组\n * @param groupId - 组 ID\n * @param beforeGroupId - 插入位置\n */\n public addGroup(groupId: string, beforeGroupId?: string) {\n this.toolbar?.addGroup(groupId, beforeGroupId);\n this.toolbar?.render();\n }\n\n /**\n * 添加按钮\n * @param config - 按钮配置\n */\n public addButton(config: ButtonConfig) {\n this.toolbar?.addButton(config);\n this.toolbar?.render();\n }\n\n /**\n * 设置按钮可见性\n * @param id - 按钮 ID\n * @param v - 是否可见\n */\n public setButtonVisibility(id: string, v: boolean) {\n this.toolbar?.updateButtonVisibility(id, v);\n }\n\n /**\n * 设置是否显示标签\n * @param show - 是否显示\n */\n public setShowLabel(show: boolean) {\n this.toolbar?.setShowLabel(show);\n }\n\n /**\n * 设置按钮组可见性\n * @param visible - 是否可见\n */\n public setVisible(visible: boolean) {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.visibility = visible ? 'visible' : 'hidden';\n }\n }\n\n /**\n * 设置背景颜色\n * @param color - 颜色值\n */\n public setBackgroundColor(color: string) {\n this.toolbar?.setBackgroundColor(color);\n }\n\n /**\n * 设置按钮组颜色\n * @param colors - 颜色配置\n */\n public setColors(colors: ButtonGroupColors) {\n this.toolbar?.setColors(colors);\n }\n}\n","/**\n * 对话框管理器基类\n * 提供对话框的通用生命周期管理\n */\nimport { BaseManager } from './base-manager';\nimport { ManagerRegistry } from './manager-registry';\nimport { BimDialog } from '../components/dialog';\n\n/** 对话框配置选项 */\nexport interface DialogManagerOptions {\n /** 是否可拖拽 */\n draggable?: boolean;\n /** 是否可调整大小 */\n resizable?: boolean;\n}\n\n/**\n * 对话框管理器抽象基类\n * 子类需要实现 dialogId、dialogTitle 和 createContent 方法\n */\nexport abstract class BaseDialogManager extends BaseManager {\n /** 对话框实例 */\n protected dialog: BimDialog | null = null;\n /** 对话框是否可见 */\n protected isVisible: boolean = false;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n /** 对话框唯一标识(子类必须实现) */\n protected abstract get dialogId(): string;\n /** 对话框标题,支持国际化 key(子类必须实现) */\n protected abstract get dialogTitle(): string;\n\n /** 对话框宽度,默认 300 */\n protected get dialogWidth(): number {\n return 300;\n }\n\n /** 对话框高度,默认 'auto' 自适应 */\n protected get dialogHeight(): number | 'auto' {\n return 'auto';\n }\n\n /** 对话框选项,默认可拖拽不可缩放 */\n protected get dialogOptions(): DialogManagerOptions {\n return { draggable: true, resizable: false };\n }\n\n /** 创建对话框内容(子类必须实现) */\n protected abstract createContent(): HTMLElement;\n\n /** 对话框关闭时的回调,子类可重写 */\n protected onDialogClose(): void {}\n /** 对话框创建后的回调,子类可重写 */\n protected onDialogCreated(): void {}\n /** 销毁前的回调,子类可重写 */\n protected onBeforeDestroy(): void {}\n\n /**\n * 获取对话框位置\n * 默认定位在容器右侧居中,子类可重写\n */\n protected getDialogPosition(): { x: number; y: number } {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const width = this.dialogWidth;\n const height = typeof this.dialogHeight === 'number' ? this.dialogHeight : 300;\n const paddingRight = 20;\n\n return {\n x: containerWidth - width - paddingRight,\n y: (containerHeight - height) / 2\n };\n }\n\n /** 显示对话框 */\n public show(): void {\n if (!this.registry.dialog || !this.registry.container) {\n console.warn(`[${this.dialogId}] Dialog manager or container is not initialized`);\n return;\n }\n\n if (this.dialog) {\n this.destroyDialog();\n }\n\n const position = this.getDialogPosition();\n const content = this.createContent();\n const options = this.dialogOptions;\n\n this.dialog = this.registry.dialog.create({\n id: this.dialogId,\n title: this.dialogTitle,\n content,\n width: this.dialogWidth,\n height: this.dialogHeight,\n position,\n draggable: options.draggable,\n resizable: options.resizable,\n onClose: () => {\n this.onDialogClose();\n this.destroyDialog();\n }\n });\n this.dialog.init();\n this.isVisible = true;\n this.onDialogCreated();\n }\n\n /** 隐藏对话框 */\n public hide(): void {\n this.destroyDialog();\n }\n\n /** 切换对话框显示状态 */\n public toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /** 获取对话框是否打开 */\n public isOpen(): boolean {\n return this.isVisible;\n }\n\n /** 销毁对话框 */\n protected destroyDialog(): void {\n this.onBeforeDestroy();\n if (this.dialog) {\n this.dialog.destroy();\n this.dialog = null;\n }\n this.isVisible = false;\n }\n\n /** 销毁管理器 */\n public destroy(): void {\n this.destroyDialog();\n super.destroy();\n }\n}\n","const ICONS = {\n clearHeight: ``,\n clearDistance: ``,\n distance: ``,\n elevation: ``,\n point: ``,\n angle: ``,\n area: ``,\n slope: ``,\n} as const;\n\nexport const MEASURE_TYPES = {\n distance: {\n key: 'distance',\n callBackType: 'distance',\n icon: ICONS.distance,\n order: 0,\n },\n clearHeight: {\n key: 'clearHeight',\n callBackType: 'clear-height',\n icon: ICONS.clearHeight,\n order: 1,\n },\n clearDistance: {\n key: 'clearDistance',\n callBackType: 'clear-distance',\n icon: ICONS.clearDistance,\n order: 2,\n },\n\n elevation: {\n key: 'elevation',\n callBackType: 'elevation',\n icon: ICONS.elevation,\n order: 3,\n },\n point: {\n key: 'point',\n callBackType: 'point',\n icon: ICONS.point,\n order: 4,\n },\n angle: {\n key: 'angle',\n callBackType: 'angle',\n icon: ICONS.angle,\n order: 5,\n },\n area: {\n key: 'area',\n callBackType: 'area',\n icon: ICONS.area,\n order: 6,\n },\n slope: {\n key: 'slope',\n callBackType: 'slope',\n icon: ICONS.slope,\n order: 7,\n },\n} as const;\n\nexport type MeasureMode = keyof typeof MEASURE_TYPES;\nexport type CallBackType = typeof MEASURE_TYPES[MeasureMode]['callBackType'];\nexport type MeasureTypeConfig = typeof MEASURE_TYPES[MeasureMode];\nexport type MeasureValueType = 'length' | 'area' | 'angle' | 'percent' | 'point';\n\n/** 净高测量朝向:0=朝下,1=朝上 */\nexport type ClearHeightDirection = 0 | 1;\n\n/** 净高测量选择对象类型 */\nexport type ClearHeightSelectType = 'point' | 'element';\n\nexport const MEASURE_MODES_ORDERED: MeasureMode[] = Object.values(MEASURE_TYPES)\n .sort((a, b) => a.order - b.order)\n .map((t) => t.key);\n\nexport function getValueType(key: MeasureMode): MeasureValueType {\n switch (key) {\n case 'clearHeight':\n case 'clearDistance':\n case 'distance':\n case 'elevation':\n return 'length';\n case 'area':\n return 'area';\n case 'angle':\n return 'angle';\n case 'slope':\n return 'percent';\n case 'point':\n default:\n return 'point';\n }\n}\n\nexport function getModeBycallBackType(callBackType: CallBackType): MeasureMode | undefined {\n return (Object.values(MEASURE_TYPES) as MeasureTypeConfig[]).find(t => t.callBackType === callBackType)?.key;\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { MeasureConfig, MeasurePanelOptions, MeasurePrecision, MeasureResult, MeasureUnit, ClearHeightDirection, ClearHeightSelectType } from './types';\nimport { MEASURE_TYPES, MEASURE_MODES_ORDERED, getValueType, type MeasureMode, type MeasureValueType } from '../../types/measure';\n\n/**\n * 测量面板组件(只做 UI,不实现真实测量)\n *\n * 组件职责:\n * - 展示 8 种测量方式按钮(默认 4 个,可展开/收起)\n * - 维护当前选中的测量方式(current mode)\n * - 展示测量结果(由外部 setResult 注入)\n * - 提供 “删除全部 / 设置” 的 UI 与对外方法(暂不实现真实逻辑,仅回调/占位)\n *\n * 注意:\n * - 所有用户可见文本必须通过 t(key) 获取(国际化强制要求)\n * - 组件需要订阅主题/语言变更,并在 destroy 时清理订阅\n */\nexport class MeasurePanel implements IBimComponent {\n public element: HTMLElement;\n\n private options: MeasurePanelOptions;\n private activeMode: MeasureMode;\n private isExpanded: boolean;\n private result: MeasureResult | null = null;\n\n // 净高模式专属状态\n private clearHeightDirection: ClearHeightDirection = 0; // 默认朝下\n private clearHeightSelectType: ClearHeightSelectType = 'point'; // 默认选择点\n\n /**\n * 测量配置(单位/精度)\n * 说明:\n * - 你要求:创建 MeasurePanel 不传入单位和精度\n * - 默认值维护在组件内部\n * - 初始化时优先读取缓存(localStorage),否则使用默认值\n */\n private config: MeasureConfig;\n\n /** 设置面板的临时配置(用于“取消”回滚) */\n private draftConfig: MeasureConfig | null = null;\n\n /** 当前视图:主面板 / 设置面板 */\n private view: 'main' | 'settings' = 'main';\n\n /** 缓存 key(默认全局) */\n private static readonly CONFIG_CACHE_KEY = 'bim-engine:measure:config';\n\n /** 默认配置(由组件内部维护) */\n private static readonly DEFAULT_CONFIG: MeasureConfig = {\n unit: 'mm',\n precision: 2\n };\n\n // DOM 引用(便于局部更新,减少频繁 querySelector)\n private toolButtons: Map = new Map();\n private toggleBtn!: HTMLButtonElement;\n private toggleTextEl!: HTMLElement;\n private mainValueRowEl!: HTMLElement;\n private mainValueValueEl!: HTMLElement;\n private mainValueLabelEl!: HTMLElement;\n private mainNumberEl!: HTMLElement;\n private mainUnitEl!: HTMLElement;\n private xyzBoxEl!: HTMLElement;\n private xyzXEl!: HTMLElement;\n private xyzYEl!: HTMLElement;\n private xyzZEl!: HTMLElement;\n private clearBtn!: HTMLButtonElement;\n private settingsBtn!: HTMLButtonElement;\n\n // 净高模式选项 DOM\n private modeOptionsEl!: HTMLElement;\n private directionBtns: Map = new Map();\n private selectTypeBtns: Map = new Map();\n\n // Settings DOM\n private mainViewEl!: HTMLElement;\n private settingsViewEl!: HTMLElement;\n private unitSelectEl!: HTMLSelectElement;\n private precisionSelectEl!: HTMLSelectElement;\n private saveSettingsBtn!: HTMLButtonElement;\n private cancelSettingsBtn!: HTMLButtonElement;\n\n // 订阅清理\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n /**\n * 构造函数\n * @param options 组件配置\n */\n constructor(options: MeasurePanelOptions = {}) {\n this.options = options;\n this.activeMode = options.defaultMode ?? 'distance';\n this.isExpanded = options.defaultExpanded ?? false;\n\n // 读取配置:优先缓存,否则默认\n this.config = this.loadConfigFromCache() ?? { ...MeasurePanel.DEFAULT_CONFIG };\n\n this.element = this.createDom();\n }\n\n /**\n * 初始化组件(实现 IBimComponent)\n */\n public init(): void {\n // 订阅语言变更:更新所有文本/提示\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更:更新 CSS 变量(如需要)\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n\n // 初始渲染状态(按钮显隐、选中态、结果区)\n this.applyExpandedState();\n this.applyActiveModeState();\n this.applyClearHeightOptionsState();\n this.applyViewState();\n this.renderResult();\n\n // 触发初始测量模式的回调(让外部知道默认激活了哪个模式)\n if (this.options.onModeChange) {\n this.options.onModeChange(this.activeMode);\n }\n }\n\n /**\n * 设置主题(实现 IBimComponent)\n * @param theme 主题配置\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n \n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-hover', theme.primaryHover ?? '#60a5fa');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-danger', theme.danger ?? '#ef4444');\n \n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-text-secondary', theme.textSecondary ?? '#94a3b8');\n style.setProperty('--bim-text-tertiary', theme.textTertiary ?? '#64748b');\n style.setProperty('--bim-text-inverse', theme.textInverse ?? '#152232');\n \n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n \n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n /**\n * 设置语言(实现 IBimComponent)\n */\n public setLocales(): void {\n // 1) 更新按钮 tooltip(图标占位时,tooltip 是主要的可读文本)\n for (const [mode, btn] of this.toolButtons.entries()) {\n btn.title = t(this.getModeI18nKey(mode));\n btn.setAttribute('aria-label', btn.title);\n }\n\n // 2) 更新展开/收起按钮 tooltip\n this.toggleBtn.title = this.isExpanded ? t('measure.actions.collapse') : t('measure.actions.expand');\n this.toggleBtn.setAttribute('aria-label', this.toggleBtn.title);\n\n // 2.1) 更新展开/收起按钮可见文本(你要求的“文字提示”)\n if (this.toggleTextEl) {\n this.toggleTextEl.textContent = this.toggleBtn.title;\n }\n\n // 3) 更新底部按钮文本/tooltip\n this.clearBtn.textContent = t('measure.actions.clearAll');\n this.settingsBtn.title = t('measure.actions.settings');\n this.settingsBtn.setAttribute('aria-label', this.settingsBtn.title);\n\n // 4) 主值 label(随模式变化)\n this.mainValueLabelEl.textContent = t(this.getModeValueLabelI18nKey(this.activeMode));\n\n // 6) XYZ label(使用 key)\n // 这里 label 在 createDom 已经是固定文本节点,直接用 setText 更新更直观\n // 但为了减少 DOM 结构复杂度,我们把 label 写在 createDom 里,通过 data-key 更新\n const labelNodes = this.element.querySelectorAll('[data-i18n-key]');\n labelNodes.forEach((node) => {\n const key = node.dataset.i18nKey;\n if (key) node.textContent = t(key);\n });\n\n // 7) 设置面板文本\n this.saveSettingsBtn.textContent = t('measure.settings.save');\n this.cancelSettingsBtn.textContent = t('measure.settings.cancel');\n }\n\n /**\n * 销毁组件(实现 IBimComponent)\n */\n public destroy(): void {\n // 清理订阅\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n\n // 清理事件监听:由于本组件的监听都绑定在创建时的具体按钮上,\n // 且按钮会随 element 一起被 GC,这里不做逐个 removeEventListener(可读性优先)\n\n // 移除 DOM\n this.element.remove();\n }\n\n // ==========================\n // 对外 API(给 Manager / 外部业务调用)\n // ==========================\n\n /**\n * 获取当前测量方式\n */\n public getActiveMode(): MeasureMode {\n return this.activeMode;\n }\n\n public switchMode(mode: MeasureMode, triggerCallback: boolean = true): void {\n this.setActiveMode(mode, triggerCallback);\n }\n\n public setActiveMode(mode: MeasureMode, triggerCallback: boolean = true): void {\n if (this.activeMode === mode) return;\n this.activeMode = mode;\n this.applyActiveModeState();\n this.applyClearHeightOptionsState();\n\n this.mainValueLabelEl.textContent = t(this.getModeValueLabelI18nKey(this.activeMode));\n\n if (triggerCallback && this.options.onModeChange) {\n this.options.onModeChange(mode);\n }\n\n this.renderResult();\n\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n /**\n * 设置测量结果(由外部注入)\n * @param result 测量结果;传 null 表示清空\n */\n public setResult(result: MeasureResult | null): void {\n this.result = result;\n this.renderResult();\n }\n\n /**\n * 删除全部(只做 UI 状态清空 + 回调)\n */\n public clearAll(): void {\n // 先清空结果显示\n this.result = null;\n this.renderResult();\n\n // 通知外部\n if (this.options.onClearAll) {\n this.options.onClearAll();\n }\n }\n\n /**\n * 打开设置(本次只预留方法/回调)\n */\n public openSettings(): void {\n // 进入设置面板(组件内部逻辑)\n this.enterSettingsView();\n\n // 仍然保留回调(如果外部想监听)\n if (this.options.onSettings) {\n this.options.onSettings();\n }\n }\n\n /**\n * 获取当前测量配置\n */\n public getConfig(): MeasureConfig {\n return { ...this.config };\n }\n\n /**\n * 设置测量配置(可选对外调用)\n * @param partial 部分更新\n * @param persist 是否写入缓存(默认 false)\n */\n public setConfig(partial: Partial, persist: boolean = false): void {\n const next: MeasureConfig = {\n unit: partial.unit ?? this.config.unit,\n precision: partial.precision ?? this.config.precision\n };\n this.config = next;\n if (persist) {\n this.saveConfigToCache(next);\n }\n\n // 配置变化会影响数值显示(单位/精度)\n this.renderResult();\n\n // 如果当前在设置面板,表单也需要同步\n if (this.view === 'settings') {\n this.syncSettingsFormFromConfig(next);\n }\n }\n\n /**\n * 展开 / 收起(可选对外调用)\n * @param expanded 是否展开\n */\n public setExpanded(expanded: boolean): void {\n if (this.isExpanded === expanded) return;\n this.isExpanded = expanded;\n this.applyExpandedState();\n this.setLocales(); // 更新 tooltip(展开/收起)\n\n // 通知外部:用于重新计算 Dialog 高度\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n /**\n * 获取是否展开\n */\n public getExpanded(): boolean {\n return this.isExpanded;\n }\n\n // ==========================\n // 内部实现\n // ==========================\n\n private createDom(): HTMLElement {\n const root = document.createElement('div');\n root.className = 'bim-measure-panel';\n\n // 主视图容器(默认显示)\n this.mainViewEl = document.createElement('div');\n this.mainViewEl.className = 'bim-measure-main';\n\n // 顶部:工具按钮区\n const toolsBox = document.createElement('div');\n toolsBox.className = 'bim-measure-tools';\n\n const grid = document.createElement('div');\n grid.className = 'bim-measure-tool-grid';\n\n const fallbackCircleIconSvg = `\n \n \n \n `;\n\n for (let i = 0; i < MEASURE_MODES_ORDERED.length; i++) {\n const mode = MEASURE_MODES_ORDERED[i];\n const config = MEASURE_TYPES[mode];\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'bim-measure-tool-btn';\n btn.dataset.mode = mode;\n\n const icon = document.createElement('span');\n icon.className = 'bim-measure-tool-icon';\n icon.innerHTML = config.icon || fallbackCircleIconSvg;\n btn.appendChild(icon);\n\n // 点击切换模式\n btn.addEventListener('click', () => {\n this.setActiveMode(mode);\n });\n\n // 先不在这里设置 title/text(统一交给 setLocales)\n this.toolButtons.set(mode, btn);\n grid.appendChild(btn);\n }\n\n toolsBox.appendChild(grid);\n\n // 展开/收起按钮(箭头)\n const toggleBox = document.createElement('div');\n toggleBox.className = 'bim-measure-toggle';\n\n this.toggleBtn = document.createElement('button');\n this.toggleBtn.type = 'button';\n this.toggleBtn.className = 'bim-measure-toggle-btn';\n // 展开/收起按钮:更小,并带文字提示(展开/收起)\n // 注意:文本内容由 setLocales() 统一更新,这里先放一个占位容器\n this.toggleTextEl = document.createElement('span');\n this.toggleTextEl.className = 'bim-measure-toggle-text';\n const toggleIconEl = document.createElement('span');\n toggleIconEl.className = 'bim-measure-toggle-icon';\n toggleIconEl.innerHTML = `\n \n \n \n `;\n this.toggleBtn.appendChild(this.toggleTextEl);\n this.toggleBtn.appendChild(toggleIconEl);\n this.toggleBtn.addEventListener('click', () => {\n this.isExpanded = !this.isExpanded;\n this.applyExpandedState();\n this.setLocales(); // 更新 tooltip(展开/收起)\n\n // 通知外部:用于重新计算 Dialog 高度\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n });\n\n toggleBox.appendChild(this.toggleBtn);\n toolsBox.appendChild(toggleBox);\n this.mainViewEl.appendChild(toolsBox);\n\n // 净高模式选项区(朝向 + 选择对象)\n this.modeOptionsEl = this.createModeOptionsDom();\n this.mainViewEl.appendChild(this.modeOptionsEl);\n\n // 中部:结果区\n const resultBox = document.createElement('div');\n resultBox.className = 'bim-measure-result';\n\n // 主结果值(随模式变化)\n const mainValueRow = document.createElement('div');\n mainValueRow.className = 'bim-measure-row';\n this.mainValueRowEl = mainValueRow;\n const mainValueLabel = document.createElement('span');\n mainValueLabel.className = 'label';\n this.mainValueLabelEl = mainValueLabel;\n const mainValueValue = document.createElement('span');\n mainValueValue.className = 'value';\n this.mainValueValueEl = mainValueValue;\n\n // 主值拆分:数值(黄色)+ 单位(普通色)\n // 这样可以满足:\n // 1) 只让“数据”变黄,单位不变色\n // 2) 没有数据时展示 `-- 单位`\n this.mainNumberEl = document.createElement('span');\n this.mainNumberEl.className = 'bim-measure-main-number';\n this.mainUnitEl = document.createElement('span');\n this.mainUnitEl.className = 'bim-measure-main-unit';\n this.mainValueValueEl.appendChild(this.mainNumberEl);\n this.mainValueValueEl.appendChild(document.createTextNode(' '));\n this.mainValueValueEl.appendChild(this.mainUnitEl);\n mainValueRow.appendChild(mainValueLabel);\n mainValueRow.appendChild(mainValueValue);\n resultBox.appendChild(mainValueRow);\n\n // XYZ\n const xyzBox = document.createElement('div');\n xyzBox.className = 'bim-measure-xyz';\n this.xyzBoxEl = xyzBox;\n\n const makeXyzRow = (labelKey: string, valueClassName: string, valueElSetter: (el: HTMLElement) => void) => {\n const row = document.createElement('div');\n row.className = 'bim-measure-row';\n const label = document.createElement('span');\n label.className = 'label';\n label.dataset.i18nKey = labelKey;\n const value = document.createElement('span');\n value.className = `value ${valueClassName}`;\n valueElSetter(value);\n row.appendChild(label);\n row.appendChild(value);\n return row;\n };\n\n xyzBox.appendChild(makeXyzRow('measure.labels.x', 'bim-measure-xyz-x', (el) => (this.xyzXEl = el)));\n xyzBox.appendChild(makeXyzRow('measure.labels.y', 'bim-measure-xyz-y', (el) => (this.xyzYEl = el)));\n xyzBox.appendChild(makeXyzRow('measure.labels.z', 'bim-measure-xyz-z', (el) => (this.xyzZEl = el)));\n resultBox.appendChild(xyzBox);\n\n this.mainViewEl.appendChild(resultBox);\n\n // 底部:删除全部 + 设置\n const footer = document.createElement('div');\n footer.className = 'bim-measure-footer';\n\n this.clearBtn = document.createElement('button');\n this.clearBtn.type = 'button';\n this.clearBtn.className = 'bim-measure-clear-btn';\n this.clearBtn.addEventListener('click', () => {\n this.clearAll();\n });\n\n this.settingsBtn = document.createElement('button');\n this.settingsBtn.type = 'button';\n this.settingsBtn.className = 'bim-measure-settings-btn';\n this.settingsBtn.innerHTML = `\n \n \n \n `;\n this.settingsBtn.addEventListener('click', () => {\n this.openSettings();\n });\n\n footer.appendChild(this.clearBtn);\n footer.appendChild(this.settingsBtn);\n this.mainViewEl.appendChild(footer);\n\n // 设置视图容器(默认隐藏)\n this.settingsViewEl = this.createSettingsDom();\n\n root.appendChild(this.mainViewEl);\n root.appendChild(this.settingsViewEl);\n\n return root;\n }\n\n /**\n * 创建“设置面板”DOM\n */\n private createSettingsDom(): HTMLElement {\n const box = document.createElement('div');\n box.className = 'bim-measure-settings';\n\n // 标题\n const title = document.createElement('div');\n title.className = 'bim-measure-settings-title';\n title.dataset.i18nKey = 'measure.settings.title';\n box.appendChild(title);\n\n // 单位\n const unitRow = document.createElement('div');\n unitRow.className = 'bim-measure-settings-row';\n const unitLabel = document.createElement('div');\n unitLabel.className = 'label';\n unitLabel.dataset.i18nKey = 'measure.settings.unit';\n this.unitSelectEl = document.createElement('select');\n this.unitSelectEl.className = 'bim-measure-settings-select';\n this.unitSelectEl.appendChild(this.makeOption('m'));\n this.unitSelectEl.appendChild(this.makeOption('cm'));\n this.unitSelectEl.appendChild(this.makeOption('mm'));\n this.unitSelectEl.appendChild(this.makeOption('km'));\n unitRow.appendChild(unitLabel);\n unitRow.appendChild(this.unitSelectEl);\n box.appendChild(unitRow);\n\n // 提示文本:你要求放在“单位”下面\n const hint = document.createElement('div');\n hint.className = 'bim-measure-settings-hint';\n hint.dataset.i18nKey = 'measure.settings.hint';\n box.appendChild(hint);\n\n // 精度\n const precisionRow = document.createElement('div');\n precisionRow.className = 'bim-measure-settings-row';\n const precisionLabel = document.createElement('div');\n precisionLabel.className = 'label';\n precisionLabel.dataset.i18nKey = 'measure.settings.precision';\n this.precisionSelectEl = document.createElement('select');\n this.precisionSelectEl.className = 'bim-measure-settings-select';\n this.precisionSelectEl.appendChild(this.makePrecisionOption(0));\n this.precisionSelectEl.appendChild(this.makePrecisionOption(1));\n this.precisionSelectEl.appendChild(this.makePrecisionOption(2));\n this.precisionSelectEl.appendChild(this.makePrecisionOption(3));\n precisionRow.appendChild(precisionLabel);\n precisionRow.appendChild(this.precisionSelectEl);\n box.appendChild(precisionRow);\n\n // 底部按钮\n const actions = document.createElement('div');\n actions.className = 'bim-measure-settings-actions';\n\n this.saveSettingsBtn = document.createElement('button');\n this.saveSettingsBtn.type = 'button';\n this.saveSettingsBtn.className = 'bim-measure-settings-save';\n this.saveSettingsBtn.addEventListener('click', () => {\n this.saveSettings();\n });\n\n this.cancelSettingsBtn = document.createElement('button');\n this.cancelSettingsBtn.type = 'button';\n this.cancelSettingsBtn.className = 'bim-measure-settings-cancel';\n this.cancelSettingsBtn.addEventListener('click', () => {\n this.cancelSettings();\n });\n\n actions.appendChild(this.saveSettingsBtn);\n actions.appendChild(this.cancelSettingsBtn);\n box.appendChild(actions);\n\n // 初次同步表单值\n this.syncSettingsFormFromConfig(this.config);\n\n return box;\n }\n\n /**\n * 创建净高模式选项区 DOM(朝向 + 选择对象)\n */\n private createModeOptionsDom(): HTMLElement {\n const box = document.createElement('div');\n box.className = 'bim-measure-mode-options';\n\n // 朝向单选组\n const dirGroup = document.createElement('div');\n dirGroup.className = 'bim-measure-radio-group';\n const dirLabel = document.createElement('span');\n dirLabel.className = 'bim-measure-radio-label';\n dirLabel.dataset.i18nKey = 'measure.clearHeight.direction';\n const dirItems = document.createElement('div');\n dirItems.className = 'bim-measure-radio-items';\n\n const dirDown = this.createRadioItem('measure.clearHeight.directionDown', () => {\n this.setClearHeightDirection(0);\n });\n const dirUp = this.createRadioItem('measure.clearHeight.directionUp', () => {\n this.setClearHeightDirection(1);\n });\n this.directionBtns.set(0, dirDown);\n this.directionBtns.set(1, dirUp);\n\n dirItems.appendChild(dirDown);\n dirItems.appendChild(dirUp);\n dirGroup.appendChild(dirLabel);\n dirGroup.appendChild(dirItems);\n box.appendChild(dirGroup);\n\n // 选择对象单选组\n const selGroup = document.createElement('div');\n selGroup.className = 'bim-measure-radio-group';\n const selLabel = document.createElement('span');\n selLabel.className = 'bim-measure-radio-label';\n selLabel.dataset.i18nKey = 'measure.clearHeight.selectType';\n const selItems = document.createElement('div');\n selItems.className = 'bim-measure-radio-items';\n\n const selPoint = this.createRadioItem('measure.clearHeight.selectPoint', () => {\n this.setClearHeightSelectType('point');\n });\n const selElement = this.createRadioItem('measure.clearHeight.selectElement', () => {\n this.setClearHeightSelectType('element');\n });\n this.selectTypeBtns.set('point', selPoint);\n this.selectTypeBtns.set('element', selElement);\n\n selItems.appendChild(selPoint);\n selItems.appendChild(selElement);\n selGroup.appendChild(selLabel);\n selGroup.appendChild(selItems);\n box.appendChild(selGroup);\n\n return box;\n }\n\n private createRadioItem(i18nKey: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'bim-measure-radio-item';\n btn.dataset.i18nKey = i18nKey;\n btn.textContent = t(i18nKey);\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private setClearHeightDirection(direction: ClearHeightDirection): void {\n if (this.clearHeightDirection === direction) return;\n this.clearHeightDirection = direction;\n this.applyClearHeightOptionsState();\n this.options.onClearHeightDirectionChange?.(direction);\n }\n\n private setClearHeightSelectType(selectType: ClearHeightSelectType): void {\n if (this.clearHeightSelectType === selectType) return;\n this.clearHeightSelectType = selectType;\n this.applyClearHeightOptionsState();\n this.options.onClearHeightSelectTypeChange?.(selectType);\n }\n\n /**\n * 应用净高选项状态(显隐 + 选中态)\n */\n private applyClearHeightOptionsState(): void {\n // 显隐\n if (this.activeMode === 'clearHeight') {\n this.modeOptionsEl.classList.add('is-visible');\n } else {\n this.modeOptionsEl.classList.remove('is-visible');\n }\n\n // 朝向按钮选中态\n for (const [dir, btn] of this.directionBtns.entries()) {\n if (dir === this.clearHeightDirection) {\n btn.classList.add('is-active');\n } else {\n btn.classList.remove('is-active');\n }\n }\n\n // 选择对象按钮选中态\n for (const [type, btn] of this.selectTypeBtns.entries()) {\n if (type === this.clearHeightSelectType) {\n btn.classList.add('is-active');\n } else {\n btn.classList.remove('is-active');\n }\n }\n }\n\n private makeOption(unit: MeasureUnit): HTMLOptionElement {\n const opt = document.createElement('option');\n opt.value = unit;\n // 选项显示内容:直接显示单位字符串\n opt.textContent = unit;\n return opt;\n }\n\n private makePrecisionOption(precision: MeasurePrecision): HTMLOptionElement {\n const opt = document.createElement('option');\n opt.value = String(precision);\n // 显示:0 / 0.0 / 0.00 / 0.000\n opt.textContent = precision === 0 ? '0' : `0.${'0'.repeat(precision)}`;\n return opt;\n }\n\n /**\n * 进入设置视图:保存一份当前配置作为草稿基线\n */\n private enterSettingsView(): void {\n this.draftConfig = { ...this.config };\n this.view = 'settings';\n this.syncSettingsFormFromConfig(this.config);\n this.applyViewState();\n }\n\n /**\n * 保存设置:写入 config + 写缓存 + 返回主视图\n */\n private saveSettings(): void {\n const unit = (this.unitSelectEl.value as MeasureUnit) || this.config.unit;\n const precision = (Number(this.precisionSelectEl.value) as MeasurePrecision);\n const next: MeasureConfig = {\n unit,\n precision: this.isValidPrecision(precision) ? precision : this.config.precision\n };\n\n this.config = next;\n this.saveConfigToCache(next);\n this.draftConfig = null;\n this.view = 'main';\n this.applyViewState();\n\n this.renderResult();\n\n this.options.onConfigSave?.(next);\n this.options.onExpandedChange?.(this.isExpanded);\n }\n\n /**\n * 取消设置:回滚到进入设置前的配置,并返回主视图\n */\n private cancelSettings(): void {\n if (this.draftConfig) {\n this.config = { ...this.draftConfig };\n }\n this.draftConfig = null;\n this.view = 'main';\n this.applyViewState();\n this.renderResult();\n\n // 高度变化(设置面板 -> 主面板)也需要通知外部\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n private syncSettingsFormFromConfig(config: MeasureConfig): void {\n this.unitSelectEl.value = config.unit;\n this.precisionSelectEl.value = String(config.precision);\n }\n\n private applyViewState(): void {\n if (this.view === 'settings') {\n this.mainViewEl.style.display = 'none';\n // 注意:CSS 里 `.bim-measure-settings { display: none; }` 是默认隐藏\n // 因此这里必须显式设置为可见(否则会出现“进入设置页后什么都不显示”的问题)\n this.settingsViewEl.style.display = 'block';\n } else {\n // 显式恢复主视图显示(避免外部样式干扰)\n this.mainViewEl.style.display = 'block';\n this.settingsViewEl.style.display = 'none';\n }\n }\n\n /**\n * 从缓存读取配置\n * - 有缓存:返回解析后的配置\n * - 无缓存/解析失败:返回 null\n */\n private loadConfigFromCache(): MeasureConfig | null {\n try {\n const raw = localStorage.getItem(MeasurePanel.CONFIG_CACHE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial;\n if (!parsed || typeof parsed !== 'object') return null;\n\n const unit = parsed.unit;\n const precision = parsed.precision;\n\n if (!this.isValidUnit(unit) || !this.isValidPrecision(precision as number)) return null;\n\n return {\n unit,\n precision: precision as MeasurePrecision\n };\n } catch (_e) {\n // localStorage 可能被禁用或 JSON 格式不正确,直接忽略\n return null;\n }\n }\n\n /**\n * 写入缓存(localStorage)\n */\n private saveConfigToCache(config: MeasureConfig): void {\n try {\n localStorage.setItem(MeasurePanel.CONFIG_CACHE_KEY, JSON.stringify(config));\n } catch (_e) {\n // localStorage 可能被禁用:忽略即可,不影响功能\n }\n }\n\n private isValidUnit(unit: any): unit is MeasureUnit {\n return unit === 'm' || unit === 'cm' || unit === 'mm' || unit === 'km';\n }\n\n private isValidPrecision(precision: any): precision is MeasurePrecision {\n return precision === 0 || precision === 1 || precision === 2 || precision === 3;\n }\n\n /**\n * 应用“展开/收起”状态:默认只显示前 4 个按钮\n */\n private applyExpandedState(): void {\n let index = 0;\n for (const btn of this.toolButtons.values()) {\n // 默认展示前四个,其余根据展开状态显示/隐藏\n if (index >= 4) {\n btn.style.display = this.isExpanded ? '' : 'none';\n } else {\n btn.style.display = '';\n }\n index++;\n }\n\n // toggle 样式(旋转箭头)\n if (this.isExpanded) {\n this.toggleBtn.classList.add('is-expanded');\n } else {\n this.toggleBtn.classList.remove('is-expanded');\n }\n }\n\n /**\n * 应用“当前选中按钮”样式\n */\n private applyActiveModeState(): void {\n for (const [mode, btn] of this.toolButtons.entries()) {\n if (mode === this.activeMode) {\n btn.classList.add('is-active');\n } else {\n btn.classList.remove('is-active');\n }\n }\n }\n\n /**\n * 渲染结果区(根据 activeMode 从 result 里取对应字段)\n */\n private renderResult(): void {\n // 1) 根据模式决定结果区显示规则\n // 你给的规则:\n // - 距离:只显示数值\n // - 最小距离:只显示数值\n // - 角度:--°\n // - 标高:--m(固定 m)\n // - 体积:--mm³(单位随设置变动,即 unit³)\n // - 激光测距:不显示任何数值/xyz,只显示“激光测距”文字\n // - 坡度:--%\n // - 空间体积:--mm³(单位随设置变动,即 unit³)\n\n const isPointMode = this.activeMode === 'point';\n \n if (isPointMode) {\n this.mainValueRowEl.style.display = 'none';\n this.xyzBoxEl.style.display = '';\n const xyz = this.result?.xyz;\n if (!xyz) {\n this.xyzXEl.textContent = '--';\n this.xyzYEl.textContent = '--';\n this.xyzZEl.textContent = '--';\n return;\n }\n this.xyzXEl.textContent = this.convertValue('length', xyz.x) + ' ' + this.getUnitText('length');\n this.xyzYEl.textContent = this.convertValue('length', xyz.y) + ' ' + this.getUnitText('length');\n this.xyzZEl.textContent = this.convertValue('length', xyz.z) + ' ' + this.getUnitText('length');\n return;\n }\n\n this.mainValueRowEl.style.display = '';\n this.mainValueLabelEl.textContent = t(this.getModeValueLabelI18nKey(this.activeMode));\n const value = this.result ? (this.result as any)[MEASURE_TYPES[this.activeMode].callBackType] : undefined;\n \n if (this.activeMode === 'slope'||this.activeMode === 'angle') {\n this.mainNumberEl.textContent = value ?? '--';\n this.mainUnitEl.textContent = '';\n } else {\n const valueType = getValueType(this.activeMode);\n this.mainNumberEl.textContent = this.convertValue(valueType, value);\n this.mainUnitEl.textContent = this.getUnitText(valueType);\n }\n this.xyzBoxEl.style.display = 'none';\n }\n\n private getModeI18nKey(mode: MeasureMode): string {\n return `measure.modes.${mode}`;\n }\n\n /**\n * 获取“主值 label”的国际化 key(随模式变化)\n */\n private getModeValueLabelI18nKey(mode: MeasureMode): string {\n return `measure.labels.value.${mode}`;\n }\n\n /**\n * 统一的数值转换方法\n * @param type 测量值类型:length(长度)、area(面积)、angle(角度)、percent(百分比)、point(坐标)\n * @param value 原始数值(单位:长度为米,面积为平方米)\n * @returns 转换后的格式化字符串,无效值返回 '--'\n */\n private convertValue(type: MeasureValueType, value: number | undefined | null): string {\n if (value === null || value === undefined || Number.isNaN(value)) {\n return '--';\n }\n\n const unit = this.config.unit;\n const precision = this.config.precision;\n let converted: number;\n\n switch (type) {\n case 'length':\n switch (unit) {\n case 'mm': converted = value * 1000; break;\n case 'cm': converted = value * 100; break;\n case 'km': converted = value / 1000; break;\n default: converted = value;\n }\n break;\n case 'area':\n switch (unit) {\n case 'mm': converted = value * 1000 * 1000; break;\n case 'cm': converted = value * 100 * 100; break;\n case 'km': converted = value / 1000 / 1000; break;\n default: converted = value;\n }\n break;\n case 'angle':\n case 'percent':\n case 'point':\n default:\n converted = value;\n }\n\n return converted.toFixed(precision);\n }\n\n /**\n * 获取单位文本\n * @param type 测量值类型\n * @returns 对应的单位文本(如 mm、m²、°)\n */\n private getUnitText(type: MeasureValueType): string {\n const unit = this.config.unit;\n switch (type) {\n case 'length':\n case 'point':\n return unit;\n case 'area':\n return `${unit}²`;\n case 'angle':\n case 'percent':\n return '°';\n default:\n return '';\n }\n }\n\n}\n\n\n","import { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { MeasurePanel } from '../components/measure-panel';\nimport type { MeasureConfig, MeasureResult } from '../components/measure-panel/types';\nimport { MEASURE_TYPES, getModeBycallBackType, getValueType, type MeasureMode, type CallBackType } from '../types/measure';\n\ninterface EngineMeasureData {\n id: string;\n text: number;\n textX?: number;\n textY?: number;\n textZ?: number;\n type: CallBackType;\n isSelect: boolean;\n container: any;\n}\n\nexport class MeasureDialogManager extends BaseDialogManager {\n private panel: MeasurePanel | null = null;\n private config: MeasureConfig | null = null;\n private unsubscribeMeasureChanged: (() => void) | null = null;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n protected get dialogId(): string {\n return 'measure-dialog';\n }\n\n protected get dialogTitle(): string {\n return 'measure.dialogTitle';\n }\n\n protected get dialogWidth(): number {\n return 250;\n }\n\n protected createContent(): HTMLElement {\n this.panel = new MeasurePanel({\n defaultMode: 'distance',\n defaultExpanded: false,\n onModeChange: (mode) => {\n console.log('[MeasureDialogManager] 当前测量方式已切换:', mode);\n this.engineComponent?.activateMeasure(mode);\n },\n onClearAll: () => {\n console.log('[MeasureDialogManager] 删除全部');\n this.engineComponent?.clearAllMeasures();\n },\n onSettings: () => {\n console.log('[MeasureDialogManager] 打开设置');\n },\n onExpandedChange: () => {\n this.dialog?.fitHeight(false);\n },\n onConfigSave: (config) => {\n console.log('[MeasureDialogManager] 保存设置:', config);\n this.engineComponent?.saveMeasureSetting({\n unit: config.unit,\n precision: config.precision\n });\n },\n onClearHeightDirectionChange: (direction) => {\n console.log('[MeasureDialogManager] 净高朝向切换:', direction);\n this.engineComponent?.setClearHeightDirection(direction);\n },\n onClearHeightSelectTypeChange: (selectType) => {\n console.log('[MeasureDialogManager] 净高选择对象切换:', selectType);\n this.engineComponent?.setClearHeightSelectType(selectType);\n },\n });\n this.panel.init();\n\n this.config = this.panel.getConfig();\n if (this.config) {\n console.log('[MeasureDialogManager] 同步缓存设置到引擎:', this.config);\n this.engineComponent?.saveMeasureSetting({\n unit: this.config.unit,\n precision: this.config.precision\n });\n }\n\n const panelWrapper = document.createElement('div');\n panelWrapper.style.padding = '12px';\n panelWrapper.appendChild(this.panel.element);\n\n return panelWrapper;\n }\n\n protected onDialogCreated(): void {\n this.dialog?.fitHeight(false);\n\n // 同步净高默认值到引擎(朝下=0,选择点='point')\n this.engineComponent?.setClearHeightDirection(0);\n this.engineComponent?.setClearHeightSelectType('point');\n\n const ec = this.engineComponent;\n if (ec) {\n const handler = (data: EngineMeasureData) => {\n console.log('[MeasureDialogManager] 测量值回调:', data);\n if (data && this.panel) {\n this.handleMeasureChanged(data);\n }\n };\n ec.onRawEvent('measure-changed', handler);\n ec.onRawEvent('measure-click', handler);\n this.unsubscribeMeasureChanged = () => {\n ec.offRawEvent('measure-changed', handler);\n ec.offRawEvent('measure-click', handler);\n }\n }\n }\n\n private handleMeasureChanged(data: EngineMeasureData): void {\n if (!this.panel) return;\n\n const targetMode = getModeBycallBackType(data.type);\n if (!targetMode) {\n console.warn('[MeasureDialogManager] 未知测量类型:', data.type);\n return;\n }\n\n const currentMode = this.panel.getActiveMode();\n if (currentMode !== targetMode) {\n this.panel.switchMode(targetMode, false);\n }\n\n const result = this.convertToMeasureResult(data, targetMode);\n this.panel.setResult(result);\n }\n\n private convertToMeasureResult(data: EngineMeasureData, mode: MeasureMode): MeasureResult {\n const config = MEASURE_TYPES[mode];\n const result: MeasureResult = {};\n\n if (getValueType(mode) === 'point') {\n if (data.textX !== undefined && data.textY !== undefined && data.textZ !== undefined) {\n result.xyz = { x: data.textX, y: data.textY, z: data.textZ };\n }\n } else {\n (result as any)[config.callBackType] = data.text;\n }\n\n return result;\n }\n\n protected onDialogClose(): void {\n if (this.unsubscribeMeasureChanged) {\n this.unsubscribeMeasureChanged();\n this.unsubscribeMeasureChanged = null;\n }\n this.registry.toolbar?.setBtnActive('measure', false);\n }\n\n protected onBeforeDestroy(): void {\n if (this.unsubscribeMeasureChanged) {\n this.unsubscribeMeasureChanged();\n this.unsubscribeMeasureChanged = null;\n }\n this.engineComponent?.deactivateMeasure();\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n public getActiveMode(): MeasureMode | null {\n return this.panel ? this.panel.getActiveMode() : null;\n }\n\n public switchMode(mode: MeasureMode): void {\n if (!this.panel) return;\n this.panel.switchMode(mode);\n }\n\n public setMeasureResult(result: MeasureResult | null): void {\n if (!this.panel) return;\n this.panel.setResult(result);\n }\n\n public getConfig(): MeasureConfig | null {\n if (this.panel) {\n this.config = this.panel.getConfig();\n }\n return this.config ? { ...this.config } : null;\n }\n\n public setConfig(partial: Partial, persist: boolean = true): void {\n if (this.panel) {\n this.panel.setConfig(partial, persist);\n this.config = this.panel.getConfig();\n this.dialog?.fitHeight(false);\n return;\n }\n\n const prev = this.config;\n const next: MeasureConfig = {\n unit: partial.unit ?? prev?.unit ?? 'mm',\n precision: partial.precision ?? prev?.precision ?? 2\n };\n this.config = next;\n }\n\n public clearAll(): void {\n if (!this.panel) return;\n this.panel.clearAll();\n }\n\n public openSettings(): void {\n if (!this.panel) return;\n this.panel.openSettings();\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { SectionPlanePanelOptions } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\n/**\n * 拾取面剖切面板组件\n * 包含三个操作按钮:隐藏、反向、重置\n */\nexport class SectionPlanePanel implements IBimComponent {\n public element: HTMLElement;\n private options: SectionPlanePanelOptions;\n\n private isHidden: boolean = false;\n\n // DOM 引用\n private hideBtn!: HTMLButtonElement;\n private reverseBtn!: HTMLButtonElement;\n private resetBtn!: HTMLButtonElement;\n private hideLabelEl!: HTMLElement;\n private reverseLabelEl!: HTMLElement;\n private resetLabelEl!: HTMLElement;\n\n // 订阅清理\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: SectionPlanePanelOptions = {}) {\n this.options = options;\n this.isHidden = options.defaultHidden ?? false;\n this.element = this.createDom();\n }\n\n public setHiddenState(isHidden: boolean): void {\n this.isHidden = isHidden;\n this.updateButtonStates();\n }\n\n public getHiddenState(): boolean {\n return this.isHidden;\n }\n\n private updateButtonStates(): void {\n this.hideBtn?.classList.toggle('active', this.isHidden);\n }\n\n /**\n * 初始化组件\n */\n public init(): void {\n // 订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n }\n\n /**\n * 设置主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n /**\n * 设置语言\n */\n public setLocales(): void {\n this.hideLabelEl.textContent = t('sectionPlane.actions.hide');\n this.reverseLabelEl.textContent = t('sectionPlane.actions.reverse');\n this.resetLabelEl.textContent = t('sectionPlane.actions.reset');\n\n this.hideBtn.title = t('sectionPlane.actions.hide');\n this.reverseBtn.title = t('sectionPlane.actions.reverse');\n this.resetBtn.title = t('sectionPlane.actions.reset');\n }\n\n /**\n * 销毁组件\n */\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.element.remove();\n }\n\n /**\n * 创建 DOM\n */\n private createDom(): HTMLElement {\n const root = document.createElement('div');\n root.className = 'section-plane-panel';\n\n // 隐藏按钮\n this.hideBtn = this.createButton(\n 'hide',\n getIcon('隐藏'),\n () => {\n this.isHidden = !this.isHidden;\n this.updateButtonStates();\n this.options.onHideToggle?.(this.isHidden);\n }\n );\n\n // 反向按钮\n this.reverseBtn = this.createButton(\n 'reverse',\n getIcon('反向'),\n () => {\n if (this.options.onReverse) {\n this.options.onReverse();\n }\n }\n );\n\n // 重置按钮\n this.resetBtn = this.createButton(\n 'reset',\n getIcon('重置'),\n () => {\n if (this.options.onReset) {\n this.options.onReset();\n }\n }\n );\n\n root.appendChild(this.hideBtn);\n root.appendChild(this.reverseBtn);\n root.appendChild(this.resetBtn);\n\n return root;\n }\n\n /**\n * 创建按钮\n */\n private createButton(type: 'hide' | 'reverse' | 'reset', iconSvg: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'section-plane-btn';\n\n // 图标\n const icon = document.createElement('div');\n icon.className = 'section-plane-btn-icon';\n icon.innerHTML = iconSvg;\n btn.appendChild(icon);\n\n // 标签\n const label = document.createElement('div');\n label.className = 'section-plane-btn-label';\n btn.appendChild(label);\n\n // 保存 label 引用\n if (type === 'hide') {\n this.hideLabelEl = label;\n } else if (type === 'reverse') {\n this.reverseLabelEl = label;\n } else {\n this.resetLabelEl = label;\n }\n\n // 点击事件\n btn.addEventListener('click', onClick);\n\n return btn;\n }\n}\n","/**\n * 拾取面剖切对话框管理器\n * 负责管理拾取面剖切工具对话框的显示和交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { SectionPlanePanel } from '../components/section-plane-panel';\n\n/**\n * 拾取面剖切对话框管理器\n * 继承自 BaseDialogManager,提供拾取面剖切功能的对话框管理\n */\nexport class SectionPlaneDialogManager extends BaseDialogManager {\n /** 剖切面板实例 */\n private panel: SectionPlanePanel | null = null;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n /** 对话框唯一标识 */\n protected get dialogId() { return 'section-plane-dialog'; }\n /** 对话框标题(国际化 key) */\n protected get dialogTitle() { return 'sectionPlane.dialogTitle'; }\n /** 对话框宽度 */\n protected get dialogWidth() { return 240; }\n /** 对话框高度 */\n protected get dialogHeight(): number { return 120; }\n\n /** 初始化 */\n public init(): void {}\n\n /**\n * 获取对话框位置\n * 定位在容器右下角\n */\n protected getDialogPosition() {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const paddingRight = 20;\n const paddingBottom = 50;\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: containerHeight - this.dialogHeight - paddingBottom\n };\n }\n\n /** 创建对话框内容 */\n protected createContent(): HTMLElement {\n this.panel = new SectionPlanePanel({\n defaultHidden: false,\n onHideToggle: (isHidden) => {\n console.log('[SectionPlaneDialogManager] 隐藏切换:', isHidden);\n if (isHidden) {\n this.engineComponent?.hideSection();\n } else {\n this.engineComponent?.recoverSection();\n }\n },\n onReverse: () => {\n console.log('[SectionPlaneDialogManager] 反向 (not supported in new API)');\n },\n onReset: () => {\n console.log('[SectionPlaneDialogManager] 重置 (not supported in new API)');\n }\n });\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框创建后的回调 */\n protected onDialogCreated(): void {\n this.engineComponent?.activeSection('face');\n this.dialog?.fitHeight(false);\n }\n\n /** 对话框关闭时的回调 */\n protected onDialogClose(): void {\n this.registry.toolbar?.setBtnActive('section-plane', false);\n }\n\n /** 销毁前的清理 */\n protected onBeforeDestroy(): void {\n this.engineComponent?.deactivateSection();\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { SectionAxisPanelOptions, SectionAxis } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\n/**\n * 轴向剖切面板组件\n * 第一行:隐藏(toggle)、反向\n * 第二行:X、Y、Z(互斥按钮组)\n */\nexport class SectionAxisPanel implements IBimComponent {\n public element: HTMLElement;\n private options: SectionAxisPanelOptions;\n\n // 状态\n private isHidden: boolean = false;\n private activeAxis: SectionAxis = 'x';\n\n // DOM 引用 - 第一行\n private hideBtn!: HTMLButtonElement;\n private reverseBtn!: HTMLButtonElement;\n private hideLabelEl!: HTMLElement;\n private reverseLabelEl!: HTMLElement;\n\n // DOM 引用 - 第二行\n private axisXBtn!: HTMLButtonElement;\n private axisYBtn!: HTMLButtonElement;\n private axisZBtn!: HTMLButtonElement;\n\n // 订阅清理\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: SectionAxisPanelOptions = {}) {\n this.options = options;\n this.isHidden = options.defaultHidden ?? false;\n this.activeAxis = options.defaultAxis ?? 'x';\n this.element = this.createDom();\n }\n\n /**\n * 初始化组件\n */\n public init(): void {\n // 订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n\n // 初始化按钮状态\n this.updateHideButtonState();\n this.updateAxisButtonsState();\n }\n\n /**\n * 设置主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n /**\n * 设置语言\n */\n public setLocales(): void {\n this.hideLabelEl.textContent = t('sectionAxis.actions.hide');\n this.reverseLabelEl.textContent = t('sectionAxis.actions.reverse');\n // XYZ按钮的文字不需要国际化,保持为单个字母\n\n this.hideBtn.title = t('sectionAxis.actions.hide');\n this.reverseBtn.title = t('sectionAxis.actions.reverse');\n this.axisXBtn.title = t('sectionAxis.actions.axisX');\n this.axisYBtn.title = t('sectionAxis.actions.axisY');\n this.axisZBtn.title = t('sectionAxis.actions.axisZ');\n }\n\n /**\n * 设置隐藏状态\n */\n public setHiddenState(isHidden: boolean): void {\n this.isHidden = isHidden;\n this.updateHideButtonState();\n }\n\n /**\n * 获取隐藏状态\n */\n public getHiddenState(): boolean {\n return this.isHidden;\n }\n\n /**\n * 设置激活的轴向\n */\n public setActiveAxis(axis: SectionAxis): void {\n this.activeAxis = axis;\n this.updateAxisButtonsState();\n }\n\n /**\n * 获取激活的轴向\n */\n public getActiveAxis(): SectionAxis {\n return this.activeAxis;\n }\n\n /**\n * 销毁组件\n */\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.element.remove();\n }\n\n /**\n * 创建 DOM\n */\n private createDom(): HTMLElement {\n const root = document.createElement('div');\n root.className = 'section-axis-panel';\n\n // 第一行:隐藏、反向\n const row1 = document.createElement('div');\n row1.className = 'section-axis-row-1';\n\n this.hideBtn = this.createButton(\n 'hide',\n getIcon('隐藏'),\n () => this.handleHideToggle()\n );\n\n this.reverseBtn = this.createButton(\n 'reverse',\n getIcon('反向'),\n () => this.handleReverse()\n );\n\n row1.appendChild(this.hideBtn);\n row1.appendChild(this.reverseBtn);\n\n // 第二行:X、Y、Z\n const row2 = document.createElement('div');\n row2.className = 'section-axis-row-2';\n\n this.axisXBtn = this.createAxisButton('axisX', 'X', () => this.handleAxisChange('x'));\n this.axisYBtn = this.createAxisButton('axisY', 'Y', () => this.handleAxisChange('y'));\n this.axisZBtn = this.createAxisButton('axisZ', 'Z', () => this.handleAxisChange('z'));\n\n row2.appendChild(this.axisXBtn);\n row2.appendChild(this.axisYBtn);\n row2.appendChild(this.axisZBtn);\n\n root.appendChild(row1);\n root.appendChild(row2);\n\n return root;\n }\n\n /**\n * 创建按钮(带图标)\n */\n private createButton(\n type: 'hide' | 'reverse',\n iconSvg: string,\n onClick: () => void\n ): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'section-axis-btn';\n\n // 图标\n const icon = document.createElement('div');\n icon.className = 'section-axis-btn-icon';\n icon.innerHTML = iconSvg;\n btn.appendChild(icon);\n\n // 标签\n const label = document.createElement('div');\n label.className = 'section-axis-btn-label';\n btn.appendChild(label);\n\n // 保存 label 引用\n if (type === 'hide') {\n this.hideLabelEl = label;\n } else if (type === 'reverse') {\n this.reverseLabelEl = label;\n }\n\n // 点击事件\n btn.addEventListener('click', onClick);\n\n return btn;\n }\n\n /**\n * 创建轴向按钮(仅文字)\n */\n private createAxisButton(\n _type: 'axisX' | 'axisY' | 'axisZ',\n text: string,\n onClick: () => void\n ): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'section-axis-btn section-axis-btn-text';\n\n // 文字标签(既是图标也是标签)\n const label = document.createElement('div');\n label.className = 'section-axis-btn-label';\n label.textContent = text;\n btn.appendChild(label);\n\n // 点击事件\n btn.addEventListener('click', onClick);\n\n return btn;\n }\n\n /**\n * 处理隐藏按钮切换\n */\n private handleHideToggle(): void {\n this.isHidden = !this.isHidden;\n this.updateHideButtonState();\n\n if (this.options.onHideToggle) {\n this.options.onHideToggle(this.isHidden);\n }\n }\n\n /**\n * 处理反向按钮点击\n */\n private handleReverse(): void {\n if (this.options.onReverse) {\n this.options.onReverse();\n }\n }\n\n /**\n * 处理轴向切换\n */\n private handleAxisChange(axis: SectionAxis): void {\n if (this.activeAxis === axis) {\n return; // 已经是激活状态,不重复触发\n }\n\n this.activeAxis = axis;\n this.updateAxisButtonsState();\n\n if (this.options.onAxisChange) {\n this.options.onAxisChange(axis);\n }\n }\n\n /**\n * 更新隐藏按钮状态\n */\n private updateHideButtonState(): void {\n if (this.isHidden) {\n this.hideBtn.classList.add('active');\n } else {\n this.hideBtn.classList.remove('active');\n }\n }\n\n /**\n * 更新轴向按钮状态\n */\n private updateAxisButtonsState(): void {\n this.axisXBtn.classList.toggle('active', this.activeAxis === 'x');\n this.axisYBtn.classList.toggle('active', this.activeAxis === 'y');\n this.axisZBtn.classList.toggle('active', this.activeAxis === 'z');\n }\n}\n","/**\n * 轴向剖切对话框管理器\n * 负责管理轴向剖切工具对话框的显示、隐藏和剖切面板的交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { SectionAxisPanel } from '../components/section-axis-panel';\nimport type { SectionAxis } from '../components/section-axis-panel/types';\n\n/**\n * 轴向剖切对话框管理器\n * 继承自 BaseDialogManager,提供 X/Y/Z 轴向剖切的对话框管理功能\n */\nexport class SectionAxisDialogManager extends BaseDialogManager {\n /** 轴向剖切面板实例 */\n private panel: SectionAxisPanel | null = null;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n /** 对话框唯一标识 */\n protected get dialogId(): string {\n return 'section-axis-dialog';\n }\n\n /** 对话框标题(国际化 key) */\n protected get dialogTitle(): string {\n return 'sectionAxis.dialogTitle';\n }\n\n /** 对话框宽度 */\n protected get dialogWidth(): number {\n return 240;\n }\n\n /**\n * 获取对话框位置\n * 定位在容器右下角\n */\n protected getDialogPosition(): { x: number; y: number } {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const paddingRight = 20;\n const paddingBottom = 50;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: containerHeight - paddingBottom - 200\n };\n }\n\n /**\n * 创建对话框内容\n * 初始化轴向剖切面板并设置回调\n */\n protected createContent(): HTMLElement {\n this.panel = new SectionAxisPanel({\n defaultAxis: 'x',\n defaultHidden: false,\n onHideToggle: (isHidden) => {\n console.log('[SectionAxisDialogManager] 隐藏切换:', isHidden);\n if (isHidden) {\n this.engineComponent?.hideSection();\n } else {\n this.engineComponent?.recoverSection();\n }\n },\n onReverse: () => {\n // 反向功能:第三方引擎无 API,仅输出日志\n console.log('[SectionAxisDialogManager] 反向剖切(暂不支持)');\n },\n onAxisChange: (axis) => {\n console.log('[SectionAxisDialogManager] 切换轴向:', axis);\n this.engineComponent?.activeSection(axis);\n }\n });\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框创建后的回调,自适应高度 */\n protected onDialogCreated(): void {\n this.dialog?.fitHeight(false);\n \n // 检查 Engine 是否已初始化\n if (!this.engineComponent) {\n console.error('[SectionAxisDialogManager] Engine not initialized. Call initEngine() first.');\n return;\n }\n \n // 自动激活默认轴向剖切(X轴)\n this.engineComponent.activeSection('x');\n }\n\n /** 对话框关闭时的回调,取消工具栏按钮激活状态 */\n protected onDialogClose(): void {\n this.registry.toolbar?.setBtnActive('section-axis', false);\n }\n\n /** 销毁前的清理,销毁面板实例 */\n protected onBeforeDestroy(): void {\n this.engineComponent?.deactivateSection();\n \n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n /**\n * 获取剖切面隐藏状态\n * @returns 是否隐藏\n */\n public getHiddenState(): boolean {\n return this.panel?.getHiddenState() ?? false;\n }\n\n /**\n * 设置剖切面隐藏状态\n * @param isHidden 是否隐藏\n */\n public setHiddenState(isHidden: boolean): void {\n this.panel?.setHiddenState(isHidden);\n }\n\n /**\n * 获取当前激活的剖切轴向\n * @returns 当前轴向 'x' | 'y' | 'z'\n */\n public getActiveAxis(): SectionAxis {\n return this.panel?.getActiveAxis() ?? 'x';\n }\n\n /**\n * 设置剖切轴向\n * @param axis 目标轴向\n */\n public setActiveAxis(axis: SectionAxis): void {\n this.panel?.setActiveAxis(axis);\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { SectionBoxPanelOptions, SectionBoxRange } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\nconst DEFAULT_RANGE: SectionBoxRange = {\n x: { min: 0, max: 100 },\n y: { min: 0, max: 100 },\n z: { min: 0, max: 100 }\n};\n\nexport class SectionBoxPanel implements IBimComponent {\n public element!: HTMLElement;\n private options: SectionBoxPanelOptions;\n\n private isHidden: boolean = false;\n private isReversed: boolean = false;\n private range: SectionBoxRange;\n\n private hideBtn!: HTMLButtonElement;\n private reverseBtn!: HTMLButtonElement;\n private fitBtn!: HTMLButtonElement;\n private resetBtn!: HTMLButtonElement;\n\n private hideLabelEl!: HTMLElement;\n private reverseLabelEl!: HTMLElement;\n private fitLabelEl!: HTMLElement;\n private resetLabelEl!: HTMLElement;\n private xLabelEl!: HTMLElement;\n private yLabelEl!: HTMLElement;\n private zLabelEl!: HTMLElement;\n\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n private xSlider!: HTMLElement;\n private ySlider!: HTMLElement;\n private zSlider!: HTMLElement;\n\n private xMinHandle!: HTMLElement;\n private xMaxHandle!: HTMLElement;\n private yMinHandle!: HTMLElement;\n private yMaxHandle!: HTMLElement;\n private zMinHandle!: HTMLElement;\n private zMaxHandle!: HTMLElement;\n\n private dragState: {\n isDragging: boolean;\n axis: 'x' | 'y' | 'z' | null;\n handleType: 'min' | 'max' | null;\n pointerId: number | null;\n } = {\n isDragging: false,\n axis: null,\n handleType: null,\n pointerId: null\n };\n\n constructor(options: SectionBoxPanelOptions = {}) {\n this.options = options;\n this.isHidden = options.defaultHidden ?? false;\n this.isReversed = options.defaultReversed ?? false;\n this.range = JSON.parse(JSON.stringify(options.defaultRange ?? DEFAULT_RANGE));\n }\n\n public init(): void {\n this.element = this.createPanel();\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n this.updateButtonStates();\n this.updateAllSlidersUI();\n this.setupDragListeners();\n }\n\n // --- Public APIs ---\n\n public setHiddenState(isHidden: boolean): void {\n this.isHidden = isHidden;\n this.updateButtonStates();\n }\n\n public getHiddenState(): boolean {\n return this.isHidden;\n }\n\n public setReversedState(isReversed: boolean): void {\n this.isReversed = isReversed;\n this.updateButtonStates();\n }\n\n public getReversedState(): boolean {\n return this.isReversed;\n }\n\n public setRange(range: Partial): void {\n if (range.x) this.range.x = { ...this.range.x, ...range.x };\n if (range.y) this.range.y = { ...this.range.y, ...range.y };\n if (range.z) this.range.z = { ...this.range.z, ...range.z };\n this.updateAllSlidersUI();\n }\n\n public getRange(): SectionBoxRange {\n return JSON.parse(JSON.stringify(this.range));\n }\n\n public reset(): void {\n this.isHidden = this.options.defaultHidden ?? false;\n this.isReversed = this.options.defaultReversed ?? false;\n this.range = JSON.parse(JSON.stringify(this.options.defaultRange ?? DEFAULT_RANGE));\n this.updateButtonStates();\n this.updateAllSlidersUI();\n this.options.onReset?.();\n this.options.onRangeChange?.(this.range);\n }\n\n // --- Private Setup ---\n\n private createPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.className = 'section-box-panel';\n\n const buttonsContainer = document.createElement('div');\n buttonsContainer.className = 'section-box-row-buttons';\n\n this.hideBtn = this.createButton('hide', t('sectionBox.actions.hide'), () => {\n this.isHidden = !this.isHidden;\n this.updateButtonStates();\n this.options.onHideToggle?.(this.isHidden);\n }, 'hide');\n\n this.reverseBtn = this.createButton('reverse', t('sectionBox.actions.reverse'), () => {\n this.isReversed = !this.isReversed;\n this.updateButtonStates();\n this.options.onReverseToggle?.(this.isReversed);\n }, 'reverse');\n\n this.fitBtn = this.createButton('fit', t('sectionBox.actions.fitToModel'), () => {\n this.options.onFitToModel?.();\n }, 'fit');\n\n this.resetBtn = this.createButton('reset', t('sectionBox.actions.reset'), () => this.reset(), 'reset');\n\n [this.hideBtn, this.reverseBtn, this.fitBtn, this.resetBtn].forEach(btn => buttonsContainer.appendChild(btn));\n\n const slidersContainer = document.createElement('div');\n slidersContainer.className = 'section-box-sliders';\n slidersContainer.addEventListener('pointerdown', (e) => e.stopPropagation());\n\n this.xSlider = this.createSlider('x', t('sectionBox.axes.x'));\n this.ySlider = this.createSlider('y', t('sectionBox.axes.y'));\n this.zSlider = this.createSlider('z', t('sectionBox.axes.z'));\n\n [this.xSlider, this.ySlider, this.zSlider].forEach(s => slidersContainer.appendChild(s));\n\n panel.appendChild(buttonsContainer);\n panel.appendChild(slidersContainer);\n return panel;\n }\n\n private createButton(type: string, label: string, onClick: () => void, ref?: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = 'section-box-btn';\n btn.title = label;\n\n const iconMap: Record = {\n hide: '隐藏',\n reverse: '反向',\n fit: '适应到模型',\n reset: '重置'\n };\n\n const icon = document.createElement('div');\n icon.className = 'section-box-btn-icon';\n icon.innerHTML = getIcon(iconMap[type] || type);\n\n const labelEl = document.createElement('div');\n labelEl.className = 'section-box-btn-label';\n labelEl.textContent = label;\n\n if (ref === 'hide') this.hideLabelEl = labelEl;\n else if (ref === 'reverse') this.reverseLabelEl = labelEl;\n else if (ref === 'fit') this.fitLabelEl = labelEl;\n else if (ref === 'reset') this.resetLabelEl = labelEl;\n\n btn.appendChild(icon);\n btn.appendChild(labelEl);\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private createSlider(axis: 'x' | 'y' | 'z', label: string): HTMLElement {\n const slider = document.createElement('div');\n slider.className = 'section-box-slider';\n\n const labelEl = document.createElement('div');\n labelEl.className = 'section-box-slider-label';\n labelEl.textContent = label;\n if (axis === 'x') this.xLabelEl = labelEl;\n else if (axis === 'y') this.yLabelEl = labelEl;\n else this.zLabelEl = labelEl;\n\n const track = document.createElement('div');\n track.className = 'section-box-slider-track';\n\n const range = document.createElement('div');\n range.className = 'section-box-slider-range';\n\n const minHandle = document.createElement('div');\n minHandle.className = 'section-box-slider-handle';\n minHandle.setAttribute('data-axis', axis);\n minHandle.setAttribute('data-handle', 'min');\n\n const maxHandle = document.createElement('div');\n maxHandle.className = 'section-box-slider-handle';\n maxHandle.setAttribute('data-axis', axis);\n maxHandle.setAttribute('data-handle', 'max');\n\n track.append(range, minHandle, maxHandle);\n slider.append(labelEl, track);\n\n if (axis === 'x') { this.xMinHandle = minHandle; this.xMaxHandle = maxHandle; }\n else if (axis === 'y') { this.yMinHandle = minHandle; this.yMaxHandle = maxHandle; }\n else { this.zMinHandle = minHandle; this.zMaxHandle = maxHandle; }\n\n return slider;\n }\n\n private setupDragListeners(): void {\n const handles = [this.xMinHandle, this.xMaxHandle, this.yMinHandle, this.yMaxHandle, this.zMinHandle, this.zMaxHandle];\n\n handles.forEach(handle => {\n handle.addEventListener('pointerdown', (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n // 核心锁定:确保后续所有移动事件都只发给这个手柄\n handle.setPointerCapture(e.pointerId);\n\n this.dragState = {\n isDragging: true,\n axis: handle.getAttribute('data-axis') as 'x' | 'y' | 'z',\n handleType: handle.getAttribute('data-handle') as 'min' | 'max',\n pointerId: e.pointerId\n };\n\n handle.classList.add('dragging');\n (handle.closest('.section-box-slider') as HTMLElement).style.zIndex = '100';\n });\n\n handle.addEventListener('pointermove', (e: PointerEvent) => {\n if (this.dragState.isDragging && this.dragState.pointerId === e.pointerId) {\n this.onDragging(e);\n }\n });\n\n const stop = (e: PointerEvent) => {\n if (this.dragState.isDragging && this.dragState.pointerId === e.pointerId) {\n if (handle.hasPointerCapture(e.pointerId)) {\n handle.releasePointerCapture(e.pointerId);\n }\n (handle.closest('.section-box-slider') as HTMLElement).style.zIndex = '';\n handle.classList.remove('dragging');\n this.dragState = {\n isDragging: false,\n axis: null,\n handleType: null,\n pointerId: null\n };\n }\n };\n\n handle.addEventListener('pointerup', stop);\n handle.addEventListener('pointercancel', stop);\n handle.addEventListener('lostpointercapture', stop);\n });\n }\n\n private onDragging(e: PointerEvent): void {\n const { axis, handleType } = this.dragState;\n if (!axis || !handleType) return;\n\n const sliderEl = axis === 'x' ? this.xSlider : (axis === 'y' ? this.ySlider : this.zSlider);\n const track = sliderEl.querySelector('.section-box-slider-track') as HTMLElement;\n const rect = track.getBoundingClientRect();\n\n let percentage = ((e.clientX - rect.left) / rect.width) * 100;\n percentage = Math.max(0, Math.min(100, percentage));\n\n const current = this.range[axis];\n if (handleType === 'min') {\n current.min = Math.min(percentage, current.max);\n } else {\n current.max = Math.max(percentage, current.min);\n }\n\n this.updateSliderUI(axis);\n this.options.onRangeChange?.(this.range);\n }\n\n private updateSliderUI(axis: 'x' | 'y' | 'z'): void {\n const range = this.range[axis];\n const minH = axis === 'x' ? this.xMinHandle : (axis === 'y' ? this.yMinHandle : this.zMinHandle);\n const maxH = axis === 'x' ? this.xMaxHandle : (axis === 'y' ? this.yMaxHandle : this.zMaxHandle);\n const slider = axis === 'x' ? this.xSlider : (axis === 'y' ? this.ySlider : this.zSlider);\n const rangeEl = slider.querySelector('.section-box-slider-range') as HTMLElement;\n\n minH.style.left = `${range.min}%`;\n maxH.style.left = `${range.max}%`;\n rangeEl.style.left = `${range.min}%`;\n rangeEl.style.width = `${range.max - range.min}%`;\n\n minH.setAttribute('data-value', Math.round(range.min).toString());\n maxH.setAttribute('data-value', Math.round(range.max).toString());\n }\n\n private updateAllSlidersUI(): void {\n ['x', 'y', 'z'].forEach((a: any) => this.updateSliderUI(a));\n }\n\n private updateButtonStates(): void {\n if (this.hideBtn) this.hideBtn.classList.toggle('active', this.isHidden);\n if (this.reverseBtn) this.reverseBtn.classList.toggle('active', this.isReversed);\n }\n\n public setLocales(): void {\n if (!this.hideLabelEl) return;\n this.hideLabelEl.textContent = t('sectionBox.actions.hide');\n this.reverseLabelEl.textContent = t('sectionBox.actions.reverse');\n this.fitLabelEl.textContent = t('sectionBox.actions.fitToModel');\n this.resetLabelEl.textContent = t('sectionBox.actions.reset');\n this.xLabelEl.textContent = t('sectionBox.axes.x');\n this.yLabelEl.textContent = t('sectionBox.axes.y');\n this.zLabelEl.textContent = t('sectionBox.axes.z');\n this.hideBtn.title = t('sectionBox.actions.hide');\n this.reverseBtn.title = t('sectionBox.actions.reverse');\n this.fitBtn.title = t('sectionBox.actions.fitToModel');\n this.resetBtn.title = t('sectionBox.actions.reset');\n }\n\n public setTheme(theme: ThemeConfig): void {\n if (!this.element) return;\n const style = this.element.style;\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n public destroy(): void {\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n if (this.element && this.element.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}","import { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { SectionBoxPanel } from '../components/section-box-panel';\nimport type { SectionBoxRange } from '../components/section-box-panel/types';\n\nexport class SectionBoxDialogManager extends BaseDialogManager {\n private panel: SectionBoxPanel | null = null;\n private unsubscribeSectionMove: (() => void) | null = null;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n /** 对话框唯一标识 */\n protected get dialogId(): string {\n return 'section-box-dialog';\n }\n\n /** 对话框标题(国际化 key) */\n protected get dialogTitle(): string {\n return 'sectionBox.dialogTitle';\n }\n\n /** 对话框宽度 */\n protected get dialogWidth(): number {\n return 280;\n }\n\n /**\n * 获取对话框位置\n * 定位在容器右下角\n */\n protected getDialogPosition(): { x: number; y: number } {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const paddingRight = 20;\n const paddingBottom = 50;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: containerHeight - paddingBottom - 300\n };\n }\n\n /**\n * 创建对话框内容\n * 初始化剖切盒面板并设置回调\n */\n protected createContent(): HTMLElement {\n this.panel = new SectionBoxPanel({\n defaultHidden: false,\n defaultReversed: false,\n onHideToggle: (isHidden) => {\n console.log('[SectionBoxDialogManager] 隐藏切换:', isHidden);\n if (isHidden) {\n this.engineComponent?.hideSection();\n } else {\n this.engineComponent?.recoverSection();\n }\n },\n onReverseToggle: (isReversed) => {\n console.log('[SectionBoxDialogManager] 反向切换:', isReversed);\n // 底层 reverse() 为“切换一次”,这里不使用 isReversed 作为入参,只要用户点击就触发。\n this.engineComponent?.reverseSection();\n },\n onFitToModel: () => {\n // 对接底层 scaleBox():缩放剖切盒到场景整体包围盒\n this.engineComponent?.scaleSectionBox();\n },\n onReset: () => {\n // 重置定义:关闭剖切再打开剖切盒。\n // UI 侧会自行将滑块强制恢复到 0-100,并将隐藏/反向按钮恢复为关闭状态。\n this.engineComponent?.deactivateSection();\n this.engineComponent?.activeSection('box');\n // 确保剖切可见(避免上一次处于隐藏状态导致“看起来没重置”)\n this.engineComponent?.recoverSection();\n },\n onRangeChange: (range) => {\n this.engineComponent?.setSectionBoxRange(range);\n }\n });\n this.panel.init();\n return this.panel.element;\n }\n\n protected onDialogCreated(): void {\n this.engineComponent?.activeSection('box');\n this.dialog?.fitHeight(false);\n\n const ec = this.engineComponent;\n if (ec) {\n const handler = (data: any) => {\n if (data && this.panel) {\n this.panel.setRange(data as Partial);\n }\n };\n ec.onRawEvent('section-move', handler);\n this.unsubscribeSectionMove = () => ec.offRawEvent('section-move', handler);\n }\n }\n\n protected onDialogClose(): void {\n if (this.unsubscribeSectionMove) {\n this.unsubscribeSectionMove();\n this.unsubscribeSectionMove = null;\n }\n this.registry.toolbar?.setBtnActive('section-box', false);\n }\n\n protected onBeforeDestroy(): void {\n if (this.unsubscribeSectionMove) {\n this.unsubscribeSectionMove();\n this.unsubscribeSectionMove = null;\n }\n this.engineComponent?.deactivateSection();\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n /**\n * 获取剖切盒隐藏状态\n * @returns 是否隐藏\n */\n public getHiddenState(): boolean {\n return this.panel?.getHiddenState() ?? false;\n }\n\n /**\n * 设置剖切盒隐藏状态\n * @param isHidden 是否隐藏\n */\n public setHiddenState(isHidden: boolean): void {\n this.panel?.setHiddenState(isHidden);\n }\n\n /**\n * 获取剖切盒反向状态\n * @returns 是否反向(显示盒内/盒外)\n */\n public getReversedState(): boolean {\n return this.panel?.getReversedState() ?? false;\n }\n\n /**\n * 设置剖切盒反向状态\n * @param isReversed 是否反向\n */\n public setReversedState(isReversed: boolean): void {\n this.panel?.setReversedState(isReversed);\n }\n\n /**\n * 获取剖切盒范围\n * @returns 六面体范围 { minX, maxX, minY, maxY, minZ, maxZ }\n */\n public getRange(): SectionBoxRange | null {\n return this.panel?.getRange() ?? null;\n }\n\n /**\n * 设置剖切盒范围\n * @param range 部分或全部范围值\n */\n public setRange(range: Partial): void {\n this.panel?.setRange(range);\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { WalkControlPanelOptions, WalkControlState, WalkControlMode, CharacterModel, WalkMode } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\nexport class WalkControlPanel implements IBimComponent {\n public element!: HTMLElement;\n private options: WalkControlPanelOptions;\n\n // 状态\n private state: WalkControlState = {\n mode: 'none',\n isPlanViewActive: false,\n speed: 1,\n gravity: false,\n collision: false,\n characterModel: 'construction-worker',\n walkMode: 'walk'\n };\n\n // DOM 引用 - 左侧按钮\n private planViewBtn!: HTMLButtonElement;\n private pathModeBtn!: HTMLButtonElement;\n // private walkModeBtn!: HTMLButtonElement;\n\n // DOM 引用 - 中间设置区\n private settingsContainer!: HTMLElement;\n private speedControl!: HTMLElement;\n private speedDecreaseBtn!: HTMLButtonElement;\n private speedIncreaseBtn!: HTMLButtonElement;\n private speedDisplay!: HTMLElement;\n private gravityCheckbox!: HTMLInputElement;\n private gravityLabel!: HTMLElement;\n private collisionCheckbox!: HTMLInputElement;\n private collisionLabel!: HTMLElement;\n private characterModelSelect!: HTMLSelectElement;\n private characterModelLabel!: HTMLElement;\n private walkModeSelect!: HTMLSelectElement;\n private walkModeLabel!: HTMLElement;\n\n // DOM 引用 - 退出按钮\n private exitBtn!: HTMLButtonElement;\n\n // 国际化订阅\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: WalkControlPanelOptions = {}) {\n this.options = options;\n this.state.speed = options.defaultSpeed ?? 1;\n this.state.gravity = options.defaultGravity ?? false;\n this.state.collision = options.defaultCollision ?? false;\n this.state.characterModel = options.defaultCharacterModel ?? 'construction-worker';\n this.state.walkMode = options.defaultWalkMode ?? 'walk';\n }\n\n public init(): void {\n this.element = this.createPanel();\n this.updateSettingsView();\n\n // 订阅\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n }\n\n // --- 公共方法 ---\n\n public setPlanViewActive(active: boolean): void {\n this.state.isPlanViewActive = active;\n this.updateButtonStates();\n }\n\n public setPathModeActive(active: boolean): void {\n // 只有当前是路径模式时,取消才设置为 none\n // 避免在其他模式下被误设置为 none\n if (!active && this.state.mode !== 'path') {\n return;\n }\n const newMode: WalkControlMode = active ? 'path' : 'none';\n this.setMode(newMode);\n }\n\n public getState(): WalkControlState {\n return { ...this.state };\n }\n\n // --- 私有方法 ---\n\n private createPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.className = 'walk-control-panel';\n\n // 左侧按钮区\n const leftButtons = this.createLeftButtons();\n\n // 分割线1\n const divider1 = document.createElement('div');\n divider1.className = 'walk-divider';\n\n // 中间设置区\n this.settingsContainer = this.createSettingsContainer();\n\n // 分割线2\n const divider2 = document.createElement('div');\n divider2.className = 'walk-divider';\n\n // 右侧退出按钮\n const exitBtn = this.createExitButton();\n\n panel.appendChild(leftButtons);\n panel.appendChild(divider1);\n panel.appendChild(this.settingsContainer);\n panel.appendChild(divider2);\n panel.appendChild(exitBtn);\n\n return panel;\n }\n\n private createLeftButtons(): HTMLElement {\n const container = document.createElement('div');\n container.className = 'walk-control-left';\n\n this.planViewBtn = this.createIconButton('plan-view', () => {\n this.state.isPlanViewActive = !this.state.isPlanViewActive;\n this.updateButtonStates();\n this.options.onPlanViewToggle?.(this.state.isPlanViewActive);\n });\n\n this.pathModeBtn = this.createIconButton('path', () => {\n const newMode: WalkControlMode = this.state.mode === 'path' ? 'none' : 'path';\n this.setMode(newMode);\n this.options.onPathModeToggle?.(newMode === 'path');\n });\n\n // this.walkModeBtn = this.createIconButton('walk', () => {\n // const newMode: WalkControlMode = this.state.mode === 'walk' ? 'none' : 'walk';\n // this.setMode(newMode);\n // this.options.onWalkModeToggle?.(newMode === 'walk');\n // });\n\n container.appendChild(this.planViewBtn);\n container.appendChild(this.pathModeBtn);\n // container.appendChild(this.walkModeBtn);\n\n return container;\n }\n\n private createSettingsContainer(): HTMLElement {\n const container = document.createElement('div');\n container.className = 'walk-control-settings';\n\n // 移动速度控件\n this.speedControl = this.createSpeedControl();\n\n // 重力复选框\n const gravityWrapper = document.createElement('label');\n gravityWrapper.className = 'walk-checkbox-wrapper walk-checkbox-gravity';\n this.gravityCheckbox = document.createElement('input');\n this.gravityCheckbox.type = 'checkbox';\n this.gravityCheckbox.className = 'walk-checkbox';\n this.gravityCheckbox.checked = this.state.gravity;\n this.gravityCheckbox.addEventListener('change', () => {\n this.state.gravity = this.gravityCheckbox.checked;\n this.options.onGravityToggle?.(this.state.gravity);\n });\n this.gravityLabel = document.createElement('span');\n this.gravityLabel.className = 'walk-checkbox-label';\n gravityWrapper.appendChild(this.gravityCheckbox);\n gravityWrapper.appendChild(this.gravityLabel);\n\n // 碰撞复选框\n const collisionWrapper = document.createElement('label');\n collisionWrapper.className = 'walk-checkbox-wrapper walk-checkbox-collision';\n this.collisionCheckbox = document.createElement('input');\n this.collisionCheckbox.type = 'checkbox';\n this.collisionCheckbox.className = 'walk-checkbox';\n this.collisionCheckbox.checked = this.state.collision;\n this.collisionCheckbox.addEventListener('change', () => {\n this.state.collision = this.collisionCheckbox.checked;\n this.options.onCollisionToggle?.(this.state.collision);\n });\n this.collisionLabel = document.createElement('span');\n this.collisionLabel.className = 'walk-checkbox-label';\n collisionWrapper.appendChild(this.collisionCheckbox);\n collisionWrapper.appendChild(this.collisionLabel);\n\n // 角色模型选择\n const characterWrapper = document.createElement('div');\n characterWrapper.className = 'walk-select-wrapper walk-select-wrapper-character-model';\n this.characterModelLabel = document.createElement('label');\n this.characterModelLabel.className = 'walk-select-label';\n this.characterModelSelect = document.createElement('select');\n this.characterModelSelect.className = 'walk-select walk-select-character-model';\n this.characterModelSelect.addEventListener('change', () => {\n this.state.characterModel = this.characterModelSelect.value as CharacterModel;\n this.options.onCharacterModelChange?.(this.state.characterModel);\n });\n characterWrapper.appendChild(this.characterModelLabel);\n characterWrapper.appendChild(this.characterModelSelect);\n\n // 行走模式选择\n const walkModeWrapper = document.createElement('div');\n walkModeWrapper.className = 'walk-select-wrapper walk-select-wrapper-walk-mode';\n this.walkModeLabel = document.createElement('label');\n this.walkModeLabel.className = 'walk-select-label';\n this.walkModeSelect = document.createElement('select');\n this.walkModeSelect.className = 'walk-select walk-select-walk-mode';\n this.walkModeSelect.addEventListener('change', () => {\n this.state.walkMode = this.walkModeSelect.value as WalkMode;\n this.options.onWalkModeChange?.(this.state.walkMode);\n });\n walkModeWrapper.appendChild(this.walkModeLabel);\n walkModeWrapper.appendChild(this.walkModeSelect);\n\n // 添加所有控件\n // 注意:顺序为 速度、角色模型、行走模式、重力、碰撞\n // 这样在漫游模式下显示的顺序就是:角色模型、行走模式、重力、碰撞\n container.appendChild(this.speedControl);\n container.appendChild(characterWrapper);\n container.appendChild(walkModeWrapper);\n container.appendChild(gravityWrapper);\n container.appendChild(collisionWrapper);\n\n return container;\n }\n\n private createSpeedControl(): HTMLElement {\n const container = document.createElement('div');\n container.className = 'walk-speed-control';\n\n const label = document.createElement('label');\n label.className = 'walk-speed-label';\n label.textContent = t('walkControl.speed');\n\n const controlGroup = document.createElement('div');\n controlGroup.className = 'walk-speed-group';\n\n // 减速按钮\n this.speedDecreaseBtn = document.createElement('button');\n this.speedDecreaseBtn.className = 'walk-speed-btn';\n this.speedDecreaseBtn.textContent = '-';\n this.speedDecreaseBtn.addEventListener('click', () => {\n if (this.state.speed > 1) {\n this.state.speed--;\n this.updateSpeedDisplay();\n this.options.onSpeedChange?.(this.state.speed);\n }\n });\n\n // 速度显示\n this.speedDisplay = document.createElement('div');\n this.speedDisplay.className = 'walk-speed-display';\n this.speedDisplay.textContent = `${this.state.speed}X`;\n\n // 加速按钮\n this.speedIncreaseBtn = document.createElement('button');\n this.speedIncreaseBtn.className = 'walk-speed-btn';\n this.speedIncreaseBtn.textContent = '+';\n this.speedIncreaseBtn.addEventListener('click', () => {\n if (this.state.speed < 10) {\n this.state.speed++;\n this.updateSpeedDisplay();\n this.options.onSpeedChange?.(this.state.speed);\n }\n });\n\n controlGroup.appendChild(this.speedDecreaseBtn);\n controlGroup.appendChild(this.speedDisplay);\n controlGroup.appendChild(this.speedIncreaseBtn);\n\n container.appendChild(label);\n container.appendChild(controlGroup);\n\n return container;\n }\n\n private createIconButton(type: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = `walk-icon-btn walk-icon-btn-${type}`;\n btn.innerHTML = this.getIconSVG(type);\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private createExitButton(): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = 'walk-exit-btn';\n btn.addEventListener('click', () => {\n this.options.onExit?.();\n });\n this.exitBtn = btn;\n return btn;\n }\n\n private setMode(mode: WalkControlMode): void {\n const oldMode = this.state.mode;\n\n // 如果从walk模式切换到其他模式,触发walk关闭事件\n if (oldMode === 'walk' && mode !== 'walk') {\n this.options.onWalkModeToggle?.(false);\n }\n\n // 如果从path模式切换到其他模式,触发path关闭事件\n if (oldMode === 'path' && mode !== 'path') {\n this.options.onPathModeToggle?.(false);\n }\n\n this.state.mode = mode;\n\n // 路径模式:禁用重力和碰撞\n if (mode === 'path') {\n this.state.gravity = false;\n this.state.collision = false;\n this.gravityCheckbox.checked = false;\n this.gravityCheckbox.disabled = true;\n this.collisionCheckbox.checked = false;\n this.collisionCheckbox.disabled = true;\n } else {\n this.gravityCheckbox.disabled = false;\n this.collisionCheckbox.disabled = false;\n }\n\n this.updateButtonStates();\n this.updateSettingsView();\n this.updateSpeedButtonStates();\n }\n\n private updateButtonStates(): void {\n // 平面图按钮\n this.planViewBtn.classList.toggle('active', this.state.isPlanViewActive);\n\n // 路径漫游按钮\n this.pathModeBtn.classList.toggle('active', this.state.mode === 'path');\n\n // 漫游按钮\n // this.walkModeBtn.classList.toggle('active', this.state.mode === 'walk');\n }\n\n private updateSettingsView(): void {\n // 根据模式显示/隐藏不同的控件\n const speedWrapper = this.speedControl;\n const gravityWrapper = this.gravityCheckbox.parentElement!;\n const collisionWrapper = this.collisionCheckbox.parentElement!;\n const characterWrapper = this.characterModelSelect.parentElement!;\n const walkModeWrapper = this.walkModeSelect.parentElement!;\n\n if (this.state.mode === 'walk') {\n // 漫游模式:隐藏速度,显示模型、行走模式、重力、碰撞\n speedWrapper.style.display = 'none';\n gravityWrapper.style.display = 'flex';\n collisionWrapper.style.display = 'flex';\n characterWrapper.style.display = 'flex';\n walkModeWrapper.style.display = 'flex';\n } else {\n // 默认或路径模式:显示速度、重力、碰撞,隐藏模型和行走模式\n speedWrapper.style.display = 'flex';\n gravityWrapper.style.display = 'flex';\n collisionWrapper.style.display = 'flex';\n characterWrapper.style.display = 'none';\n walkModeWrapper.style.display = 'none';\n }\n }\n\n private updateSpeedDisplay(): void {\n this.speedDisplay.textContent = `${this.state.speed}X`;\n this.updateSpeedButtonStates();\n }\n\n private updateSpeedButtonStates(): void {\n this.speedDecreaseBtn.disabled = this.state.speed <= 1;\n this.speedIncreaseBtn.disabled = this.state.speed >= 10;\n }\n\n private getIconSVG(type: string): string {\n const icons: Record = {\n 'plan-view': getIcon('地图'),\n 'path': getIcon('路径漫游'),\n 'walk': getIcon('第一人称漫游')\n };\n return icons[type] || '';\n }\n\n public setLocales(): void {\n // 更新速度标签\n const speedLabel = this.speedControl.querySelector('.walk-speed-label');\n if (speedLabel) {\n speedLabel.textContent = t('walkControl.speed');\n }\n\n // 更新复选框标签\n this.gravityLabel.textContent = t('walkControl.gravity');\n this.collisionLabel.textContent = t('walkControl.collision');\n\n // 更新角色模型下拉框\n this.characterModelLabel.textContent = t('walkControl.characterModel.label');\n this.characterModelSelect.innerHTML = '';\n const constructionWorkerOption = document.createElement('option');\n constructionWorkerOption.value = 'construction-worker';\n constructionWorkerOption.textContent = t('walkControl.characterModel.constructionWorker');\n constructionWorkerOption.selected = this.state.characterModel === 'construction-worker';\n this.characterModelSelect.appendChild(constructionWorkerOption);\n\n const officeMaleOption = document.createElement('option');\n officeMaleOption.value = 'office-male';\n officeMaleOption.textContent = t('walkControl.characterModel.officeMale');\n officeMaleOption.selected = this.state.characterModel === 'office-male';\n this.characterModelSelect.appendChild(officeMaleOption);\n\n // 更新行走模式下拉框\n this.walkModeLabel.textContent = t('walkControl.walkMode.label');\n this.walkModeSelect.innerHTML = '';\n const walkOption = document.createElement('option');\n walkOption.value = 'walk';\n walkOption.textContent = t('walkControl.walkMode.walk');\n walkOption.selected = this.state.walkMode === 'walk';\n this.walkModeSelect.appendChild(walkOption);\n\n const runOption = document.createElement('option');\n runOption.value = 'run';\n runOption.textContent = t('walkControl.walkMode.run');\n runOption.selected = this.state.walkMode === 'run';\n this.walkModeSelect.appendChild(runOption);\n\n // 更新退出按钮\n this.exitBtn.textContent = t('walkControl.exit');\n }\n\n public setTheme(theme: ThemeConfig): void {\n if (!this.element) return;\n const style = this.element.style;\n\n style.setProperty('--bim-bg-base', theme.bgBase ?? '#152232');\n style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-border-subtle', theme.borderSubtle ?? '#1e293b');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n style.setProperty('--bim-shadow-xl', theme.shadowXl ?? '0 20px 40px rgba(0, 0, 0, 0.3)');\n\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-hover', theme.primaryHover ?? '#60a5fa');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-text-inverse', theme.textInverse ?? '#152232');\n\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n style.setProperty('--bim-component-bg-active', theme.componentBgActive ?? 'rgba(248, 250, 252, 0.1)');\n }\n\n public destroy(): void {\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n if (this.element && this.element.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { ManagerRegistry } from '../../core/manager-registry';\nimport type { RoamingPoint } from './types';\n\n/**\n * 路径漫游面板组件\n * 提供漫游点的添加、删除、跳转和播放功能\n */\nexport class WalkPathPanel implements IBimComponent {\n public element!: HTMLElement;\n\n /** 管理器注册表実例 */\n private registry: ManagerRegistry;\n\n /** 管理器注册表实例 */\n /** 国际化订阅取消函数 */\n private unsubscribeLocale: (() => void) | null = null;\n /** 主题订阅取消函数 */\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(registry: ManagerRegistry) {\n this.registry = registry;\n }\n\n\n /** 漫游点列表 */\n private points: RoamingPoint[] = [];\n /** 漫游时间(毫秒) */\n private duration: number = 10000;\n /** 是否循环播放 */\n private loop: boolean = false;\n /** 当前播放中的点索引,-1 表示未播放 */\n private playingPointIndex: number = -1;\n /** 是否正在播放 */\n private isPlaying: boolean = false;\n\n /**\n * 初始化组件\n * 创建 DOM 元素,订阅国际化和主题变化,加载已有漫游点\n */\n public init(): void {\n // 创建根元素\n this.element = document.createElement('div');\n this.element.className = 'walk-path-panel';\n\n // 订阅国际化变化\n this.unsubscribeLocale = localeManager.subscribe(() => this.render());\n // 订阅主题变化\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n // 从引擎加载已有的漫游点\n this.loadPointsFromEngine();\n\n // 渲染界面\n this.render();\n // 应用当前主题\n this.setTheme(themeManager.getTheme());\n }\n\n /**\n * 从引擎加载已有的漫游点\n * 在面板打开时调用,获取底层引擎中已存在的漫游点\n */\n private loadPointsFromEngine(): void {\n const enginePoints = this.registry.engine3d?.getEngineComponent()?.pathRoamingGetPoints() ?? [];\n // 将引擎返回的点转换为本地格式\n this.points = enginePoints.map((_: any, index: number) => ({\n index: index\n }));\n }\n\n /**\n * 渲染整个面板\n * 清空现有内容并重新构建界面\n */\n private render(): void {\n this.element.innerHTML = '';\n \n // 渲染路径设置区域\n const settings = this.createSettingsSection();\n this.element.appendChild(settings);\n\n // 渲染漫游点区域\n const pointsSection = this.createPointsSection();\n this.element.appendChild(pointsSection);\n\n // 渲染播放按钮\n const playBtn = this.createPlayButton();\n this.element.appendChild(playBtn);\n }\n\n /**\n * 创建路径设置区域\n * 包含漫游时间和循环播放设置\n */\n private createSettingsSection(): HTMLElement {\n const section = document.createElement('div');\n section.className = 'walk-path-settings';\n\n // ===== 漫游时间 =====\n const durationGroup = document.createElement('div');\n durationGroup.className = 'walk-path-form-group';\n \n const durationLabel = document.createElement('label');\n durationLabel.textContent = t('walkControl.path.duration');\n \n const durationWrapper = document.createElement('div');\n durationWrapper.className = 'walk-path-input-wrapper';\n \n const durationInput = document.createElement('input');\n durationInput.type = 'number';\n durationInput.className = 'walk-path-input';\n durationInput.value = String(this.duration / 1000);\n durationInput.min = '1';\n durationInput.oninput = (e) => {\n // 更新漫游时间,转换为毫秒\n const val = parseInt((e.target as HTMLInputElement).value) || 1;\n this.duration = val * 1000;\n };\n \n const durationUnit = document.createElement('span');\n durationUnit.className = 'walk-path-unit';\n durationUnit.textContent = t('walkControl.path.durationUnit');\n \n durationWrapper.appendChild(durationInput);\n durationWrapper.appendChild(durationUnit);\n durationGroup.appendChild(durationLabel);\n durationGroup.appendChild(durationWrapper);\n\n // ===== 循环播放 =====\n const loopGroup = document.createElement('div');\n loopGroup.className = 'walk-path-form-group walk-path-form-group-inline';\n \n const loopCheckbox = document.createElement('input');\n loopCheckbox.type = 'checkbox';\n loopCheckbox.id = 'walk-path-loop-checkbox';\n loopCheckbox.className = 'walk-path-checkbox';\n loopCheckbox.checked = this.loop;\n loopCheckbox.onchange = (e) => {\n // 更新循环播放状态\n this.loop = (e.target as HTMLInputElement).checked;\n };\n \n const loopLabel = document.createElement('label');\n loopLabel.htmlFor = 'walk-path-loop-checkbox';\n loopLabel.textContent = t('walkControl.path.loop');\n \n loopGroup.appendChild(loopCheckbox);\n loopGroup.appendChild(loopLabel);\n\n section.appendChild(durationGroup);\n section.appendChild(loopGroup);\n\n return section;\n }\n\n /**\n * 创建漫游点区域\n * 包含操作按钮和漫游点列表\n */\n private createPointsSection(): HTMLElement {\n const section = document.createElement('div');\n section.className = 'walk-path-points-section';\n\n // ===== 操作栏 =====\n const toolbar = document.createElement('div');\n toolbar.className = 'walk-path-points-toolbar';\n\n // 添加漫游点按钮\n const addBtn = document.createElement('button');\n addBtn.className = 'walk-path-btn walk-path-btn-small';\n addBtn.textContent = `+ ${t('walkControl.path.addPoint')}`;\n addBtn.onclick = () => this.addPoint();\n\n // 删除全部按钮\n const deleteAllBtn = document.createElement('button');\n deleteAllBtn.className = 'walk-path-btn walk-path-btn-small walk-path-btn-danger';\n deleteAllBtn.textContent = t('walkControl.path.deleteAll');\n deleteAllBtn.onclick = () => this.deleteAllPoints();\n\n toolbar.appendChild(addBtn);\n toolbar.appendChild(deleteAllBtn);\n section.appendChild(toolbar);\n\n // ===== 漫游点列表 =====\n const list = document.createElement('div');\n list.className = 'walk-path-points-list';\n\n if (this.points.length === 0) {\n // 空状态提示\n const empty = document.createElement('div');\n empty.className = 'walk-path-empty';\n empty.textContent = t('walkControl.path.noPoints');\n list.appendChild(empty);\n } else {\n // 渲染每个漫游点\n this.points.forEach((_, index) => {\n const item = this.createPointItem(index);\n list.appendChild(item);\n });\n }\n\n section.appendChild(list);\n return section;\n }\n\n /**\n * 创建单个漫游点项\n * @param index 漫游点索引\n */\n private createPointItem(index: number): HTMLElement {\n const item = document.createElement('div');\n item.className = 'walk-path-point-item';\n // 如果是当前播放的点,添加高亮样式\n if (this.playingPointIndex === index) {\n item.classList.add('walk-path-point-item-active');\n }\n\n // 漫游点名称\n const name = document.createElement('span');\n name.className = 'walk-path-point-name';\n name.textContent = `${t('walkControl.path.point')}${index}`;\n\n // 操作按钮容器\n const actions = document.createElement('div');\n actions.className = 'walk-path-point-actions';\n\n // 跳转按钮\n const jumpBtn = document.createElement('button');\n jumpBtn.className = 'walk-path-btn-icon';\n jumpBtn.innerHTML = '▶';\n jumpBtn.title = t('walkControl.path.play');\n jumpBtn.onclick = (e) => {\n e.stopPropagation();\n this.jumpToPoint(index);\n };\n\n // 删除按钮\n const deleteBtn = document.createElement('button');\n deleteBtn.className = 'walk-path-btn-icon walk-path-btn-icon-danger';\n deleteBtn.innerHTML = '×';\n deleteBtn.onclick = (e) => {\n e.stopPropagation();\n this.deletePoint(index);\n };\n\n actions.appendChild(jumpBtn);\n actions.appendChild(deleteBtn);\n\n item.appendChild(name);\n item.appendChild(actions);\n return item;\n }\n\n /**\n * 创建播放/停止按钮组\n */\n private createPlayButton(): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'walk-path-btn-group';\n\n const playBtn = document.createElement('button');\n playBtn.className = 'walk-path-btn walk-path-btn-play';\n playBtn.textContent = `▶ ${t('walkControl.path.play')}`;\n playBtn.disabled = this.points.length === 0 || this.isPlaying;\n playBtn.onclick = () => this.playPath();\n\n const stopBtn = document.createElement('button');\n stopBtn.className = 'walk-path-btn walk-path-btn-stop';\n stopBtn.textContent = `■ ${t('walkControl.path.stop')}`;\n stopBtn.disabled = !this.isPlaying;\n stopBtn.onclick = () => this.stopPath();\n\n wrapper.appendChild(playBtn);\n wrapper.appendChild(stopBtn);\n return wrapper;\n }\n\n // ==================== 操作方法 ====================\n\n /**\n * 添加漫游点\n * 将当前相机位置添加为新的漫游点\n */\n private addPoint(): void {\n // 调用引擎添加漫游点\n this.registry.engine3d?.getEngineComponent()?.pathRoamingAddPoint();\n // 更新本地状态\n const newIndex = this.points.length;\n this.points.push({ index: newIndex });\n // 重新渲染\n this.render();\n }\n\n /**\n * 删除指定漫游点\n * @param index 要删除的漫游点索引\n */\n private deletePoint(index: number): void {\n // 调用引擎删除漫游点\n this.registry.engine3d?.getEngineComponent()?.pathRoamingRemovePoint(index);\n // 从本地列表中移除\n this.points.splice(index, 1);\n // 重新索引\n this.points.forEach((p, i) => p.index = i);\n // 重新渲染\n this.render();\n }\n\n /**\n * 删除所有漫游点\n */\n private deleteAllPoints(): void {\n // 调用引擎清除所有漫游点\n this.registry.engine3d?.getEngineComponent()?.pathRoamingClearPoints();\n // 清空本地列表\n this.points = [];\n // 重新渲染\n this.render();\n }\n\n /**\n * 跳转到指定漫游点\n * @param index 目标漫游点索引\n */\n private jumpToPoint(index: number): void {\n this.registry.engine3d?.getEngineComponent()?.pathRoamingJumpToPoint(index);\n }\n\n /**\n * 播放漫游\n * 按顺序播放所有漫游点\n */\n private playPath(): void {\n if (this.points.length === 0) return;\n\n this.isPlaying = true;\n this.render();\n\n console.log('[WalkPathPanel] 开始播放漫游', { duration: this.duration, loop: this.loop, pointsCount: this.points.length });\n\n this.registry.engine3d?.getEngineComponent()?.pathRoamingPlay({\n duration: this.duration,\n loop: this.loop,\n onPointComplete: (pointIndex: number) => {\n console.log('[WalkPathPanel] onPointComplete', { pointIndex });\n this.playingPointIndex = pointIndex;\n this.render();\n },\n onComplete: () => {\n console.log('[WalkPathPanel] onComplete 播放完成');\n this.isPlaying = false;\n this.playingPointIndex = -1;\n this.render();\n }\n });\n }\n\n /**\n * 停止漫游\n */\n private stopPath(): void {\n console.log('[WalkPathPanel] 停止漫游');\n this.registry.engine3d?.getEngineComponent()?.pathRoamingStop();\n this.isPlaying = false;\n this.playingPointIndex = -1;\n this.render();\n }\n\n // ==================== 生命周期 ====================\n\n /**\n * 更新国际化文本\n * 当语言切换时重新渲染整个面板\n */\n public setLocales(): void {\n // 重新渲染以更新所有文本\n this.render();\n }\n\n /**\n * 应用主题\n * @param theme 主题配置\n */\n public setTheme(theme: ThemeConfig): void {\n if (!this.element) return;\n // 设置 CSS 变量\n this.element.style.setProperty('--bim-text-primary', theme.textPrimary ?? '#fff');\n this.element.style.setProperty('--bim-text-secondary', theme.textSecondary ?? '#94a3b8');\n this.element.style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n this.element.style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n this.element.style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n }\n\n /**\n * 销毁组件\n * 清理订阅和 DOM 元素\n */\n public destroy(): void {\n // 如果正在播放,先停止\n if (this.isPlaying) {\n this.stopPath();\n }\n // 取消订阅\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n // 移除 DOM 元素\n if (this.element?.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}\n","/**\n * 漫游路径对话框管理器\n * 负责管理漫游路径设置对话框的显示和交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { WalkPathPanel } from '../components/walk-path-panel';\n\n/**\n * 漫游路径对话框管理器\n * 继承自 BaseDialogManager,提供漫游路径配置的对话框管理功能\n */\nexport class WalkPathDialogManager extends BaseDialogManager {\n /** 漫游路径面板实例 */\n private panel: WalkPathPanel | null = null;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n /** 对话框唯一标识 */\n protected get dialogId() { return 'walk-path-dialog'; }\n /** 对话框标题(国际化 key) */\n protected get dialogTitle() { return 'walkControl.path.dialogTitle'; }\n /** 对话框宽度 */\n protected get dialogWidth() { return 300; }\n /** 对话框高度 */\n protected get dialogHeight(): number { return 450; }\n\n /** 初始化 */\n public init(): void {}\n\n /**\n * 获取对话框位置\n * 定位在容器右上角\n */\n protected getDialogPosition() {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const paddingRight = 20;\n const paddingTop = 20;\n const containerWidth = container.clientWidth;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: paddingTop\n };\n }\n\n /** 创建对话框内容 */\n protected createContent(): HTMLElement {\n this.panel = new WalkPathPanel(this.registry);\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框关闭时的回调 */\n protected onDialogClose(): void {\n if (this.registry.walkControl && this.registry.walkControl.panel) {\n this.registry.walkControl.panel.setPathModeActive(false);\n }\n }\n\n /** 销毁前的清理 */\n protected onBeforeDestroy(): void {\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n}\n","/**\n * 漫游控制管理器\n * 负责管理漫游模式的控制面板和相关交互\n */\nimport { BaseManager } from '../core/base-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { WalkControlPanel } from '../components/walk-control-panel';\nimport { WalkPathDialogManager } from './walk-path-dialog-manager';\n\n/**\n * 漫游控制管理器\n * 提供第一人称漫游、路径漫游等功能的控制界面\n */\nexport class WalkControlManager extends BaseManager {\n /** 漫游控制面板实例 */\n public panel: WalkControlPanel | null = null;\n /** 路径漫游对话框管理器 */\n private pathManager: WalkPathDialogManager | null = null;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n /** 初始化管理器 */\n public init(): void {\n this.pathManager = new WalkPathDialogManager(this.registry);\n this.pathManager.init();\n }\n\n /** 显示漫游控制面板 */\n public show(): void {\n if (!this.registry.toolbar) {\n console.warn('Toolbar not initialized');\n return;\n }\n\n this.registry.toolbar.hide();\n\n // 打开漫游面板时,默认激活第一人称模式\n console.log('[WalkControl] 打开漫游面板,激活第一人称模式');\n this.engineComponent?.activateFirstPersonMode();\n\n this.panel = new WalkControlPanel({\n onPlanViewToggle: (isActive) => {\n console.log('[WalkControl] 小地图:', isActive);\n this.engineComponent?.toggleMiniMap();\n this.emit('walk:plan-view-toggle', { isActive });\n },\n onPathModeToggle: (isActive) => {\n console.log('[WalkControl] 路径漫游:', isActive);\n if (isActive) {\n this.pathManager?.show();\n } else {\n this.pathManager?.hide();\n }\n this.emit('walk:path-mode-toggle', { isActive });\n },\n onWalkModeToggle: (isActive) => {\n console.log('[WalkControl] 第三人称漫游按钮点击:', isActive);\n if (isActive) {\n this.pathManager?.hide();\n alert('第三人称功能开发中');\n }\n this.emit('walk:walk-mode-toggle', { isActive });\n },\n onSpeedChange: (speed) => {\n console.log('[WalkControl] 速度变化:', speed);\n const engineSpeed = speed * 0.1;\n this.engineComponent?.setWalkSpeed(engineSpeed);\n this.emit('walk:speed-change', { speed });\n },\n onGravityToggle: (enabled) => {\n console.log('[WalkControl] 重力:', enabled);\n this.engineComponent?.setWalkGravity(enabled);\n this.emit('walk:gravity-toggle', { enabled });\n },\n onCollisionToggle: (enabled) => {\n console.log('[WalkControl] 碰撞:', enabled);\n this.engineComponent?.setWalkCollision(enabled);\n this.emit('walk:collision-toggle', { enabled });\n },\n onCharacterModelChange: (model) => {\n console.log('[WalkControl] 角色模型:', model);\n },\n onWalkModeChange: (mode) => {\n console.log('[WalkControl] 行走模式:', mode);\n },\n onExit: () => {\n this.hide();\n }\n });\n this.panel.init();\n\n\n\n if (this.registry.container) {\n this.panel.element.style.position = 'absolute';\n this.panel.element.style.bottom = '20px';\n this.panel.element.style.left = '50%';\n this.panel.element.style.transform = 'translateX(-50%)';\n this.panel.element.style.zIndex = '1000';\n\n this.registry.container.appendChild(this.panel.element);\n } else {\n console.warn('[WalkControlManager] Container not found');\n }\n }\n\n /** 隐藏漫游控制面板 */\n public hide(): void {\n this.pathManager?.hide();\n\n console.log('[WalkControl] 关闭漫游面板,退出第一人称模式');\n this.engineComponent?.deactivateFirstPersonMode();\n\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n\n if (this.registry.toolbar) {\n this.registry.toolbar.show();\n }\n }\n\n /** 销毁管理器 */\n public destroy(): void {\n this.hide();\n this.pathManager?.destroy();\n this.pathManager = null;\n super.destroy();\n }\n}\n","import { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { t } from '../services/locale';\nimport type { EngineInfo } from '../components/engine';\n\nexport class EngineInfoDialogManager extends BaseDialogManager {\n protected get dialogId() { return 'engine-info-dialog'; }\n protected get dialogTitle() { return 'info.dialogTitle'; }\n protected get dialogWidth() { return 280; }\n\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n public init(): void {}\n\n protected getDialogPosition() {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n return {\n x: (containerWidth - this.dialogWidth) / 2,\n y: (containerHeight - 150) / 2\n };\n }\n\n protected createContent(): HTMLElement {\n const info: EngineInfo | null = this.engineComponent?.getEngineInfo() ?? null;\n\n const content = document.createElement('div');\n content.className = 'engine-info-content';\n content.style.cssText = 'padding: 16px;';\n\n const createRow = (label: string, value: number | string) => {\n const row = document.createElement('div');\n row.style.cssText = 'display: flex; justify-content: space-between; margin-bottom: 12px; font-size: 14px;';\n \n const labelEl = document.createElement('span');\n labelEl.style.cssText = 'color: var(--bim-text-secondary, #94a3b8);';\n labelEl.textContent = label;\n \n const valueEl = document.createElement('span');\n valueEl.style.cssText = 'color: var(--bim-text-primary, #fff); font-weight: 500;';\n valueEl.textContent = String(value);\n \n row.appendChild(labelEl);\n row.appendChild(valueEl);\n return row;\n };\n\n content.appendChild(createRow(t('info.meshCount'), info?.meshCount ?? '-'));\n content.appendChild(createRow(t('info.totalTriangles'), info?.totalTriangles ?? '-'));\n content.appendChild(createRow(t('info.totalVertices'), info?.totalVertices ?? '-'));\n\n return content;\n }\n}\n","import { BaseDialogManager } from '../core/base-dialog-manager';\nimport { ManagerRegistry } from '../core/manager-registry';\nimport { t } from '../services/locale';\n\n/** 渲染模式类型 */\ntype RenderMode = 'simple' | 'balance' | 'advanced';\n\n/** 设置项列表项(环境背景/地面类型由底层引擎动态返回) */\ntype SettingListItem = { name: string; id: string };\n\n// ======================== 通用样式常量 ========================\n// 全部使用项目主题 CSS 变量(--bim-*),同时提供浅色/深色皆可见的 fallback\n\n/** 分节标签样式 */\nconst SECTION_LABEL_STYLE = 'font-size: 13px; color: var(--bim-text-secondary, #475569); margin-bottom: 8px;';\n\n/** 分隔线样式 —— 使用 --bim-divider,浅色=#e2e8f0,深色=#334155 */\nconst DIVIDER_STYLE = 'height: 1px; background: var(--bim-divider, #e2e8f0); margin: 14px 0;';\n\n/** 设置行样式(标签 + 控件水平排列) */\nconst ROW_STYLE = 'display: flex; align-items: center; justify-content: space-between; gap: 12px;';\n\n/** 滑块输入框右侧数值样式 */\nconst SLIDER_VALUE_STYLE = 'font-size: 12px; color: var(--bim-text-secondary, #475569); min-width: 32px; text-align: right;';\n\n/** 边框颜色 —— 使用 --bim-border-default */\nconst BORDER_COLOR = 'var(--bim-border-default, #e2e8f0)';\n\n/** 输入框/下拉背景 —— 使用 --bim-bg-inset */\nconst INPUT_BG = 'var(--bim-bg-inset, #f1f5f9)';\n\n/** 主色 */\nconst PRIMARY = 'var(--bim-primary, #3b82f6)';\n\n/** 文字主色 */\nconst TEXT_PRIMARY = 'var(--bim-text-primary, #0f172a)';\n\n/** 反色文字 */\nconst TEXT_INVERSE = 'var(--bim-text-inverse, #ffffff)';\n\n/** 悬停背景 */\nconst HOVER_BG = 'var(--bim-component-bg-hover, rgba(0,0,0,0.04))';\n\n/**\n * 设置弹窗管理器\n * 管理全局设置面板,包含渲染模式、边线、光照/对比度/饱和度、环境背景、地面等设置项\n */\nexport class SettingDialogManager extends BaseDialogManager {\n protected get dialogId() { return 'setting-dialog'; }\n protected get dialogTitle() { return 'setting.dialogTitle'; }\n protected get dialogWidth() { return 320; }\n\n // ================ 本地 UI 状态(不持久化) ================\n\n /** 边线开关状态 */\n private edgeLineEnabled: boolean = false;\n /** 对比度(0-100,50为默认值) */\n private contrastValue: number = 50;\n /** 饱和度(0-100,50为默认值) */\n private saturationValue: number = 50;\n /** 光照强度(0-100,50为默认值) */\n private lightIntensityValue: number = 50;\n /** 环境背景列表(从底层引擎动态获取) */\n private environmentList: SettingListItem[] = [];\n /** 当前选中的环境背景 ID */\n private environmentId: string = '';\n /** 是否显示背景 */\n private backgroundVisible: boolean = true;\n /** 地面列表(从底层引擎动态获取) */\n private groundList: SettingListItem[] = [];\n /** 当前选中的地面 ID */\n private groundId: string = '';\n /** 地面高度(单位:m) */\n private groundElevation: number = 0;\n /** 保存的对话框位置(用于 hide/show 时保持位置不变) */\n private savedPosition: { x: number; y: number } | null = null;\n\n constructor(registry: ManagerRegistry) {\n super(registry);\n }\n\n public init(): void { }\n\n /** 对话框位置:若有保存的位置则恢复,否则居中 */\n protected getDialogPosition() {\n // 若上次 hide/show 保存了位置,则恢复到原位\n if (this.savedPosition) {\n const pos = this.savedPosition;\n this.savedPosition = null;\n return pos;\n }\n\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n return {\n x: (containerWidth - this.dialogWidth) / 2,\n y: Math.max(20, (containerHeight - 520) / 2)\n };\n }\n\n /**\n * 从底层引擎加载当前状态(回显)\n * 在 createContent() 前调用,保证 UI 和引擎状态同步\n */\n private loadEngineState(): void {\n const engine = this.engineComponent;\n if (!engine) return;\n\n // 边线\n this.edgeLineEnabled = engine.getModelEdgeActive();\n\n // 光照 / 对比度 / 饱和度\n this.lightIntensityValue = engine.getAmbientLightIntensity();\n this.contrastValue = engine.getSceneContrast();\n this.saturationValue = engine.getSceneSaturation();\n\n // 环境背景\n this.environmentList = engine.getHDRBackgroundList();\n this.environmentId = engine.getHDRBackgroundId();\n this.backgroundVisible = engine.getHDRBackgroundVisibility();\n\n // 地面\n this.groundList = engine.getGroundList();\n this.groundId = engine.getGroundId();\n this.groundElevation = engine.getGroundElevation();\n }\n\n // ======================== 主内容构建 ========================\n\n protected createContent(): HTMLElement {\n // 从引擎加载当前状态(回显)\n this.loadEngineState();\n\n // 注入一次全局滑块样式\n this.ensureSliderStyle();\n\n const content = document.createElement('div');\n content.style.cssText = 'padding: 16px; max-height: 480px; overflow-y: auto;';\n\n // 1. 渲染模式(按钮组)\n content.appendChild(this.createRenderModeSection());\n content.appendChild(this.createDivider());\n\n // 2. 边线开关\n content.appendChild(this.createEdgeLineSection());\n content.appendChild(this.createDivider());\n\n // 3. 光照强度\n content.appendChild(this.createSliderSection(\n t('setting.lightIntensity'),\n this.lightIntensityValue,\n 0, 100,\n (v) => {\n this.lightIntensityValue = v;\n this.engineComponent?.setAmbientLightIntensity(v);\n }\n ));\n\n // 4. 对比度\n content.appendChild(this.createSliderSection(\n t('setting.contrast'),\n this.contrastValue,\n 0, 100,\n (v) => {\n this.contrastValue = v;\n this.engineComponent?.setSceneContrast(v);\n }\n ));\n\n // 5. 饱和度\n content.appendChild(this.createSliderSection(\n t('setting.saturation'),\n this.saturationValue,\n 0, 100,\n (v) => {\n this.saturationValue = v;\n this.engineComponent?.setSceneSaturation(v);\n }\n ));\n content.appendChild(this.createDivider());\n\n // 6. 环境背景(动态列表 + 显示开关)\n content.appendChild(this.createEnvironmentSection());\n content.appendChild(this.createDivider());\n\n // 7. 地面(动态列表 + 地面高度)\n content.appendChild(this.createGroundSection());\n\n return content;\n }\n\n // ======================== 分隔线 ========================\n\n /** 创建分隔线 */\n private createDivider(): HTMLElement {\n const div = document.createElement('div');\n div.style.cssText = DIVIDER_STYLE;\n return div;\n }\n\n // ======================== 1. 渲染模式(按钮组) ========================\n\n /** 创建渲染模式按钮组 */\n private createRenderModeSection(): HTMLElement {\n const currentMode = (this.engineComponent?.getRenderMode() ?? 'balance') as RenderMode;\n\n const section = document.createElement('div');\n\n // 标签\n const label = document.createElement('div');\n label.style.cssText = SECTION_LABEL_STYLE;\n label.textContent = t('setting.renderMode');\n section.appendChild(label);\n\n // 按钮组容器\n const group = document.createElement('div');\n group.style.cssText = `\n display: flex; gap: 0; border-radius: 6px; overflow: hidden;\n border: 1px solid ${BORDER_COLOR};\n `;\n\n const modes: { key: RenderMode; labelKey: string }[] = [\n { key: 'simple', labelKey: 'setting.modes.simple' },\n { key: 'balance', labelKey: 'setting.modes.balance' },\n { key: 'advanced', labelKey: 'setting.modes.advanced' },\n ];\n\n for (let i = 0; i < modes.length; i++) {\n const mode = modes[i];\n const isActive = mode.key === currentMode;\n\n const btn = document.createElement('div');\n btn.style.cssText = `\n flex: 1; text-align: center; padding: 7px 0; cursor: pointer;\n font-size: 13px; font-weight: 500; transition: all 0.15s;\n background: ${isActive ? PRIMARY : 'transparent'};\n color: ${isActive ? TEXT_INVERSE : TEXT_PRIMARY};\n ${i < modes.length - 1 ? `border-right: 1px solid ${BORDER_COLOR};` : ''}\n `;\n btn.textContent = t(mode.labelKey);\n\n // 悬停效果\n btn.addEventListener('mouseenter', () => {\n if (!isActive) btn.style.background = HOVER_BG;\n });\n btn.addEventListener('mouseleave', () => {\n if (!isActive) btn.style.background = 'transparent';\n });\n\n btn.addEventListener('click', () => {\n this.engineComponent?.setRenderMode(mode.key);\n // 保存当前对话框位置,重建后恢复\n const el = document.getElementById(this.dialogId);\n if (el) {\n this.savedPosition = { x: el.offsetLeft, y: el.offsetTop };\n }\n this.hide();\n this.show();\n });\n\n group.appendChild(btn);\n }\n\n section.appendChild(group);\n return section;\n }\n\n // ======================== 2. 边线开关 ========================\n\n /** 创建边线开关行 */\n private createEdgeLineSection(): HTMLElement {\n return this.createToggleRow(\n t('setting.edgeLine'),\n this.edgeLineEnabled,\n (enabled) => {\n this.edgeLineEnabled = enabled;\n if (enabled) {\n this.engineComponent?.activeModelEdge();\n } else {\n this.engineComponent?.disActiveModelEdge();\n }\n }\n );\n }\n\n // ======================== 3/4/5. 通用滑块 ========================\n\n /**\n * 创建一个滑块设置区块(标签 + 滑块 + 数值)\n * @param labelText 标签文本\n * @param value 当前值\n * @param min 最小值\n * @param max 最大值\n * @param onChange 值变化回调\n */\n private createSliderSection(\n labelText: string,\n value: number,\n min: number,\n max: number,\n onChange: (val: number) => void\n ): HTMLElement {\n const section = document.createElement('div');\n section.style.cssText = 'margin-bottom: 4px;';\n\n // 上部:标签 + 数值\n const header = document.createElement('div');\n header.style.cssText = ROW_STYLE + ' margin-bottom: 6px;';\n\n const label = document.createElement('span');\n label.style.cssText = 'font-size: 13px; color: var(--bim-text-secondary, #475569);';\n label.textContent = labelText;\n header.appendChild(label);\n\n const valueDisplay = document.createElement('span');\n valueDisplay.style.cssText = SLIDER_VALUE_STYLE;\n valueDisplay.textContent = String(value);\n header.appendChild(valueDisplay);\n\n section.appendChild(header);\n\n // 滑块 —— 轨道使用 --bim-border-strong 保证在浅色/深色下都可见\n const slider = document.createElement('input');\n slider.type = 'range';\n slider.min = String(min);\n slider.max = String(max);\n slider.value = String(value);\n slider.className = 'bim-setting-slider';\n slider.style.cssText = `\n width: 100%; height: 4px; -webkit-appearance: none; appearance: none;\n background: var(--bim-border-strong, #cbd5e1); border-radius: 2px;\n outline: none; cursor: pointer;\n `;\n\n slider.addEventListener('input', () => {\n const v = Number(slider.value);\n valueDisplay.textContent = String(v);\n onChange(v);\n });\n\n section.appendChild(slider);\n return section;\n }\n\n /**\n * 注入全局滑块拇指样式(只注入一次)\n * 使用 ::-webkit-slider-thumb / ::-moz-range-thumb 伪元素\n */\n private ensureSliderStyle(): void {\n if (document.querySelector('#bim-setting-slider-style')) return;\n\n const style = document.createElement('style');\n style.id = 'bim-setting-slider-style';\n style.textContent = `\n .bim-setting-slider::-webkit-slider-thumb {\n -webkit-appearance: none; appearance: none;\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--bim-primary, #3b82f6);\n cursor: pointer;\n border: 2px solid var(--bim-bg-elevated, #fff);\n box-shadow: 0 1px 3px rgba(0,0,0,0.2);\n }\n .bim-setting-slider::-moz-range-thumb {\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--bim-primary, #3b82f6);\n cursor: pointer;\n border: 2px solid var(--bim-bg-elevated, #fff);\n box-shadow: 0 1px 3px rgba(0,0,0,0.2);\n }\n .bim-setting-slider::-moz-range-track {\n background: var(--bim-border-strong, #cbd5e1);\n height: 4px; border-radius: 2px; border: none;\n }\n `;\n document.head.appendChild(style);\n }\n\n // ======================== 6. 环境背景(动态列表 + 显示开关) ========================\n\n /** 创建环境背景区 */\n private createEnvironmentSection(): HTMLElement {\n const section = document.createElement('div');\n\n // 标签\n const label = document.createElement('div');\n label.style.cssText = SECTION_LABEL_STYLE;\n label.textContent = t('setting.environment');\n section.appendChild(label);\n\n // 下拉列表(从底层引擎动态获取)\n const select = this.createSelect(\n this.environmentList.map(item => ({ value: item.id, label: item.name })),\n this.environmentId,\n (val) => {\n this.environmentId = val;\n this.engineComponent?.setHDRBackgroundId(val);\n }\n );\n section.appendChild(select);\n\n // 显示背景开关\n const toggleRow = this.createToggleRow(\n t('setting.backgroundVisible'),\n this.backgroundVisible,\n (enabled) => {\n this.backgroundVisible = enabled;\n this.engineComponent?.setHDRBackgroundVisibility(enabled);\n }\n );\n toggleRow.style.marginTop = '10px';\n section.appendChild(toggleRow);\n\n return section;\n }\n\n // ======================== 7. 地面(动态列表 + 地面高度) ========================\n\n /** 创建地面设置区 */\n private createGroundSection(): HTMLElement {\n const section = document.createElement('div');\n\n // 标签\n const label = document.createElement('div');\n label.style.cssText = SECTION_LABEL_STYLE;\n label.textContent = t('setting.ground');\n section.appendChild(label);\n\n // 下拉列表(从底层引擎动态获取)\n const select = this.createSelect(\n this.groundList.map(item => ({ value: item.id, label: item.name })),\n this.groundId,\n (val) => {\n this.groundId = val;\n this.engineComponent?.setGroundId(val);\n }\n );\n section.appendChild(select);\n\n // 地面高度输入行\n const elevationRow = document.createElement('div');\n elevationRow.style.cssText = ROW_STYLE + ' margin-top: 10px;';\n\n const elevationLabel = document.createElement('span');\n elevationLabel.style.cssText = 'font-size: 13px; color: var(--bim-text-secondary, #475569);';\n elevationLabel.textContent = t('setting.groundElevation');\n elevationRow.appendChild(elevationLabel);\n\n // 输入框 + 单位容器\n const inputWrapper = document.createElement('div');\n inputWrapper.style.cssText = 'display: flex; align-items: center; gap: 4px;';\n\n const elevationInput = document.createElement('input');\n elevationInput.type = 'number';\n elevationInput.value = String(this.groundElevation);\n elevationInput.style.cssText = `\n width: 72px; padding: 4px 8px; border-radius: 4px;\n border: 1px solid ${BORDER_COLOR};\n background: ${INPUT_BG};\n color: ${TEXT_PRIMARY};\n font-size: 13px; outline: none; text-align: right;\n `;\n elevationInput.addEventListener('input', () => {\n const v = Number(elevationInput.value);\n if (!isNaN(v)) {\n this.groundElevation = v;\n this.engineComponent?.setGroundElevation(v);\n }\n });\n elevationInput.addEventListener('focus', () => {\n elevationInput.style.borderColor = PRIMARY;\n });\n elevationInput.addEventListener('blur', () => {\n elevationInput.style.borderColor = BORDER_COLOR;\n });\n\n const unitLabel = document.createElement('span');\n unitLabel.style.cssText = 'font-size: 13px; color: var(--bim-text-secondary, #475569);';\n unitLabel.textContent = t('setting.groundElevationUnit');\n\n inputWrapper.appendChild(elevationInput);\n inputWrapper.appendChild(unitLabel);\n elevationRow.appendChild(inputWrapper);\n section.appendChild(elevationRow);\n\n return section;\n }\n\n // ======================== 通用下拉框 ========================\n\n /**\n * 创建一个自定义样式的 \n
\n \n \n
\n \n \n \n \n `;\n\n // 获取子元素引用\n this.messagesContainer = el.querySelector('.bim-ai-chat-messages');\n this.textarea = el.querySelector('.bim-ai-textarea');\n\n // 绑定事件\n this.bindEvents(el);\n this.updateQuickPrompts(el);\n\n return el;\n }\n\n /**\n * 绑定事件监听\n * @param el 组件根元素\n */\n private bindEvents(el: HTMLElement): void {\n // 顶部操作按钮事件\n el.querySelectorAll('.bim-ai-chat-action-btn').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const action = (e.currentTarget as HTMLElement).dataset.action;\n switch (action) {\n case 'new':\n this.options.onNewChat?.();\n break;\n case 'history':\n this.options.onHistory?.();\n break;\n case 'settings':\n this.options.onSettings?.();\n break;\n case 'close':\n this.hide();\n this.options.onClose?.();\n break;\n }\n });\n });\n\n // 初始化拖拽功能\n const header = el.querySelector('.bim-ai-chat-header') as HTMLElement;\n if (header) {\n this.initDrag(header);\n }\n\n // 发送按钮点击事件\n const sendBtn = el.querySelector('.bim-ai-send-btn');\n sendBtn?.addEventListener('click', () => this.handleSend());\n\n // 输入框键盘事件:Enter 发送,Shift+Enter 换行\n this.textarea?.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n this.handleSend();\n }\n });\n\n // 输入框自动调整高度\n this.textarea?.addEventListener('input', () => {\n if (this.textarea) {\n this.textarea.style.height = 'auto';\n this.textarea.style.height = Math.min(this.textarea.scrollHeight, 100) + 'px';\n }\n });\n\n // 阻止事件冒泡,避免影响底层 3D 场景\n const stopPropagation = (e: Event) => e.stopPropagation();\n const events = ['click', 'dblclick', 'mousedown', 'mouseup', 'mousemove', 'wheel', 'touchstart', 'touchend', 'touchmove'];\n events.forEach(eventType => {\n el.addEventListener(eventType, stopPropagation, { passive: false });\n });\n }\n\n /**\n * 处理发送消息\n */\n private handleSend(): void {\n if (!this.textarea) return;\n const content = this.textarea.value.trim();\n if (!content) return;\n\n // 清空输入框并重置高度\n this.textarea.value = '';\n this.textarea.style.height = 'auto';\n // 触发回调\n this.options.onSend?.(content);\n }\n\n /**\n * 初始化拖拽功能\n * 使用 requestAnimationFrame 优化性能,避免拖拽卡顿\n * @param header 标题栏元素(拖拽手柄)\n */\n private initDrag(header: HTMLElement): void {\n // 拖拽状态变量\n let startX = 0; // 鼠标起始 X 坐标\n let startY = 0; // 鼠标起始 Y 坐标\n let startLeft = 0; // 元素起始 left 值\n let startTop = 0; // 元素起始 top 值\n let containerW = 0; // 容器宽度\n let containerH = 0; // 容器高度\n let elW = 0; // 元素宽度\n let elH = 0; // 元素高度\n\n /**\n * 鼠标按下事件处理\n */\n const onMouseDown = (e: MouseEvent) => {\n // 如果点击的是操作按钮,不触发拖拽\n if ((e.target as HTMLElement).closest('.bim-ai-chat-action-btn')) return;\n e.preventDefault();\n e.stopPropagation();\n\n // 记录起始状态\n startX = e.clientX;\n startY = e.clientY;\n startLeft = this.element.offsetLeft;\n startTop = this.element.offsetTop;\n\n // 记录容器和元素尺寸(用于边界检测)\n containerW = this.container.clientWidth;\n containerH = this.container.clientHeight;\n elW = this.element.offsetWidth;\n elH = this.element.offsetHeight;\n\n // 添加全局鼠标事件监听(使用 capture 确保优先处理)\n document.addEventListener('mousemove', onMouseMove, { capture: true });\n document.addEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n /**\n * 鼠标移动事件处理\n * 使用 requestAnimationFrame 节流,提升性能\n */\n const onMouseMove = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n // 如果上一帧还没处理完,跳过本次\n if (this.rafId) return;\n\n this.rafId = requestAnimationFrame(() => {\n // 计算鼠标移动的增量\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n\n // 计算新位置\n let newLeft = startLeft + dx;\n let newTop = startTop + dy;\n\n // 边界检测:限制在容器范围内\n const maxLeft = containerW - elW;\n const maxTop = containerH - elH;\n\n newLeft = Math.max(0, Math.min(newLeft, maxLeft));\n newTop = Math.max(0, Math.min(newTop, maxTop));\n\n // 应用新位置\n this.element.style.left = `${newLeft}px`;\n this.element.style.top = `${newTop}px`;\n\n this.rafId = null;\n });\n };\n\n /**\n * 鼠标释放事件处理\n */\n const onMouseUp = () => {\n // 取消未完成的动画帧\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n // 移除全局事件监听\n document.removeEventListener('mousemove', onMouseMove, { capture: true });\n document.removeEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n // 绑定标题栏鼠标按下事件\n header.addEventListener('mousedown', onMouseDown);\n }\n\n /**\n * 更新快捷提示按钮\n * @param el 可选的根元素(初始化时使用)\n */\n private updateQuickPrompts(el?: HTMLElement): void {\n const root = el || this.element;\n const container = root.querySelector('.bim-ai-quick-prompts');\n if (!container || !this.options.quickPrompts) return;\n\n // 渲染快捷提示按钮\n container.innerHTML = this.options.quickPrompts.map(prompt => `\n \n `).join('');\n\n // 绑定点击事件:点击后填充到输入框\n container.querySelectorAll('.bim-ai-quick-prompt').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const promptId = (e.currentTarget as HTMLElement).dataset.promptId;\n const prompt = this.options.quickPrompts?.find(p => p.id === promptId);\n if (prompt && this.textarea) {\n this.textarea.value = t(prompt.label);\n this.textarea.focus();\n }\n });\n });\n }\n\n /**\n * 渲染消息列表\n * 根据消息类型渲染不同的消息卡片\n */\n private renderMessages(): void {\n if (!this.messagesContainer) return;\n\n this.messagesContainer.innerHTML = this.messages.map(msg => {\n switch (msg.type) {\n case 'user':\n return this.renderUserMessage(msg.content);\n case 'ai':\n return this.renderAiMessage(msg.content);\n case 'step':\n return this.renderStepMessage(msg.status, msg.content);\n case 'thinking':\n return this.renderThinkingMessage();\n case 'question':\n return msg.answered\n ? this.renderAnsweredQuestion(msg)\n : this.renderActiveQuestion(msg);\n default:\n return '';\n }\n }).join('');\n\n // 重新绑定问答卡片的事件\n this.bindQuestionEvents();\n }\n\n /**\n * 渲染用户消息气泡\n */\n private renderUserMessage(content: string): string {\n return `\n
\n
\n
${this.escapeHtml(content)}
\n
\n
\n `;\n }\n\n /**\n * 渲染 AI 消息气泡\n */\n private renderAiMessage(content: string): string {\n return `\n
\n
\n
${this.escapeHtml(content)}
\n
\n
\n `;\n }\n\n /**\n * 渲染步骤消息卡片\n * @param status 状态:running/done/error\n * @param content 步骤描述\n */\n private renderStepMessage(status: StepStatus, content: string): string {\n // 状态对应的图标映射\n const iconMap: Record = {\n running: 'loader',\n done: 'check',\n error: 'error'\n };\n return `\n
\n ${getIcon(iconMap[status])}\n ${this.escapeHtml(content)}\n
\n `;\n }\n\n /**\n * 渲染思考中卡片\n */\n private renderThinkingMessage(): string {\n return `\n
\n ${getIcon('loader')}\n ${t('aiChat.thinking')}\n
\n `;\n }\n\n /**\n * 渲染未回答的问答卡片\n * @param msg 问答消息对象\n */\n private renderActiveQuestion(msg: QuestionMessage): string {\n // 渲染选项列表\n const optionsHtml = msg.options.map(opt => `\n
\n
\n
\n
\n ${opt.isOther ? t('aiChat.other') : this.escapeHtml(opt.label)}\n
\n ${opt.isOther && msg.selectedOptionId === opt.id ? `\n \n ` : ''}\n `).join('');\n\n return `\n
\n
\n
${getIcon('bot')}
\n ${this.escapeHtml(msg.title)}\n
\n
\n
${this.escapeHtml(msg.question)}
\n
${optionsHtml}
\n
\n
\n \n
\n
\n `;\n }\n\n /**\n * 渲染已回答的问答卡片(简洁模式)\n * @param msg 问答消息对象\n */\n private renderAnsweredQuestion(msg: QuestionMessage): string {\n const selectedOption = msg.options.find(o => o.id === msg.selectedOptionId);\n const answer = selectedOption?.isOther ? msg.customAnswer : selectedOption?.label;\n\n return `\n
\n
\n
Q
\n ${this.escapeHtml(msg.question)}\n
\n
\n
A
\n ${this.escapeHtml(answer || '')}\n
\n
\n `;\n }\n\n /**\n * 绑定问答卡片的交互事件\n * 包括:选项点击、自定义输入、提交按钮\n */\n private bindQuestionEvents(): void {\n // 选项点击事件\n this.messagesContainer?.querySelectorAll('.bim-ai-option').forEach(option => {\n option.addEventListener('click', (e) => {\n const target = e.currentTarget as HTMLElement;\n const questionId = target.dataset.questionId;\n const optionId = target.dataset.optionId;\n\n if (questionId && optionId) {\n const msg = this.messages.find(m => m.id === questionId) as QuestionMessage;\n if (msg && !msg.answered) {\n msg.selectedOptionId = optionId;\n this.renderMessages();\n }\n }\n });\n });\n\n // 自定义输入框事件\n this.messagesContainer?.querySelectorAll('.bim-ai-option-input').forEach(input => {\n input.addEventListener('input', (e) => {\n const target = e.target as HTMLInputElement;\n const questionId = target.dataset.questionId;\n\n if (questionId) {\n const msg = this.messages.find(m => m.id === questionId) as QuestionMessage;\n if (msg) {\n msg.customAnswer = target.value;\n }\n }\n });\n });\n\n // 提交按钮事件\n this.messagesContainer?.querySelectorAll('.bim-ai-question-submit').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const target = e.currentTarget as HTMLElement;\n const questionId = target.dataset.questionId;\n\n if (questionId) {\n const msg = this.messages.find(m => m.id === questionId) as QuestionMessage;\n if (msg && msg.selectedOptionId) {\n msg.answered = true;\n this.renderMessages();\n this.options.onQuestionSubmit?.(questionId, msg.selectedOptionId, msg.customAnswer);\n }\n }\n });\n });\n }\n\n /**\n * 滚动消息列表到底部\n */\n private scrollToBottom(): void {\n if (this.messagesContainer) {\n this.messagesContainer.scrollTop = this.messagesContainer.scrollHeight;\n }\n }\n\n /**\n * HTML 转义,防止 XSS 攻击\n * @param str 原始字符串\n * @returns 转义后的字符串\n */\n private escapeHtml(str: string): string {\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n /**\n * 销毁组件\n * 取消订阅并移除 DOM 元素\n */\n public destroy(): void {\n if (this._isDestroyed) return;\n\n // 取消主题订阅\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n\n // 取消语言订阅\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n\n // 移除 DOM 元素\n this.element.remove();\n this._isDestroyed = true;\n }\n}\n","/**\n * AI 聊天管理器\n * 负责管理 AI 聊天抽屉的显示、隐藏和消息交互\n */\nimport { AiChat } from '../components/ai-chat';\nimport type { Message, QuestionOption, StepStatus } from '../components/ai-chat/types';\nimport { ManagerRegistry } from '../core/manager-registry';\n\n/**\n * AI 聊天管理器\n * 管理 AI 聊天组件的生命周期和消息交互\n */\nexport class AiChatManager {\n /** AI 聊天组件实例 */\n private aiChat: AiChat | null = null;\n /** Manager 注册表 */\n private registry: ManagerRegistry;\n /** 是否已初始化 */\n private initialized = false;\n\n constructor(registry: ManagerRegistry) {\n this.registry = registry;\n }\n\n /**\n * 初始化 AI 聊天组件\n * 创建 AiChat 实例并注册事件\n */\n public init(): void {\n if (this.initialized) return;\n\n const wrapper = this.registry.wrapper;\n if (!wrapper) {\n console.warn('[AiChatManager] wrapper 不存在,无法初始化');\n return;\n }\n\n this.aiChat = new AiChat({\n container: wrapper,\n width: 440,\n title: 'aiChat.title',\n placeholder: 'aiChat.placeholder',\n quickPrompts: [\n { id: 'summarize', label: 'aiChat.quickPrompt.summarize' },\n { id: 'explain', label: 'aiChat.quickPrompt.explain' },\n { id: 'generate', label: 'aiChat.quickPrompt.generate' }\n ],\n onSend: (message) => {\n console.log('[AiChatManager] 用户发送消息:', message);\n this.aiChat?.addUserMessage(message);\n this.registry.emit('aiChat:message-sent', { message });\n },\n onQuestionSubmit: (questionId, optionId, customAnswer) => {\n console.log('[AiChatManager] 用户回答问题:', { questionId, optionId, customAnswer });\n this.registry.emit('aiChat:question-answered', { questionId, optionId, customAnswer });\n },\n onNewChat: () => {\n console.log('[AiChatManager] 新建对话');\n this.registry.emit('aiChat:new-chat', {});\n },\n onHistory: () => {\n console.log('[AiChatManager] 打开历史');\n this.registry.emit('aiChat:history-opened', {});\n },\n onSettings: () => {\n console.log('[AiChatManager] 打开设置');\n this.registry.emit('aiChat:settings-opened', {});\n },\n onClose: () => {\n console.log('[AiChatManager] 关闭 AI 聊天');\n this.registry.emit('aiChat:closed', {});\n this.registry.toolbar?.setBtnActive('aiChat', false);\n }\n });\n\n this.initialized = true;\n }\n\n /**\n * 显示 AI 聊天抽屉\n */\n public show(): void {\n if (!this.aiChat) {\n this.init();\n }\n this.aiChat?.show();\n this.registry.emit('aiChat:opened', {});\n this.registry.toolbar?.setBtnActive('aiChat', true);\n }\n\n /**\n * 隐藏 AI 聊天抽屉\n */\n public hide(): void {\n this.aiChat?.hide();\n this.registry.emit('aiChat:closed', {});\n this.registry.toolbar?.setBtnActive('aiChat', false);\n }\n\n /**\n * 切换 AI 聊天抽屉显示状态\n */\n public toggle(): void {\n if (this.aiChat?.isVisible()) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /**\n * 检查 AI 聊天抽屉是否可见\n */\n public isVisible(): boolean {\n return this.aiChat?.isVisible() ?? false;\n }\n\n /**\n * 添加用户消息\n * @param content 消息内容\n * @returns 消息 ID\n */\n public addUserMessage(content: string): string {\n return this.aiChat?.addUserMessage(content) ?? '';\n }\n\n /**\n * 添加 AI 消息\n * @param content 消息内容\n * @returns 消息 ID\n */\n public addAiMessage(content: string): string {\n return this.aiChat?.addAiMessage(content) ?? '';\n }\n\n /**\n * 添加步骤消息\n * @param status 步骤状态\n * @param content 步骤描述\n * @returns 消息 ID\n */\n public addStepMessage(status: StepStatus, content: string): string {\n return this.aiChat?.addStepMessage(status, content) ?? '';\n }\n\n /**\n * 添加思考中消息\n * @returns 消息 ID\n */\n public addThinkingMessage(): string {\n return this.aiChat?.addThinkingMessage() ?? '';\n }\n\n /**\n * 添加问答卡片消息\n * @param title 问题标题\n * @param question 问题内容\n * @param options 选项列表\n * @returns 消息 ID\n */\n public addQuestionMessage(title: string, question: string, options: QuestionOption[]): string {\n return this.aiChat?.addQuestionMessage(title, question, options) ?? '';\n }\n\n /**\n * 更新消息\n * @param id 消息 ID\n * @param updates 更新内容\n */\n public updateMessage(id: string, updates: Partial): void {\n this.aiChat?.updateMessage(id, updates);\n }\n\n /**\n * 删除消息\n * @param id 消息 ID\n */\n public removeMessage(id: string): void {\n this.aiChat?.removeMessage(id);\n }\n\n /**\n * 清空所有消息\n */\n public clearMessages(): void {\n this.aiChat?.clearMessages();\n }\n\n /**\n * 销毁 AI 聊天管理器\n */\n public destroy(): void {\n if (this.aiChat) {\n this.aiChat.destroy();\n this.aiChat = null;\n }\n this.initialized = false;\n }\n}\n","/**\n * 事件发射器\n * 提供简单的发布/订阅模式实现\n */\n\n/** 事件监听器类型 */\ntype Listener = (payload: T) => void;\n\n/**\n * 事件发射器类\n * 用于组件间的事件通信\n */\nexport class EventEmitter {\n /** 事件监听器映射表 */\n private events: Map = new Map();\n\n /**\n * 订阅事件\n * @param event 事件名称\n * @param listener 事件处理函数\n * @returns 取消订阅的函数\n */\n public on(event: string, listener: Listener): () => void {\n if (!this.events.has(event)) {\n this.events.set(event, []);\n }\n this.events.get(event)!.push(listener);\n\n return () => this.off(event, listener);\n }\n\n /**\n * 取消订阅事件\n * @param event 事件名称\n * @param listener 要移除的事件处理函数\n */\n public off(event: string, listener: Listener): void {\n const listeners = this.events.get(event);\n if (!listeners) return;\n\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n\n /**\n * 发送事件\n * @param event 事件名称\n * @param payload 事件数据\n */\n public emit(event: string, payload?: any): void {\n const listeners = this.events.get(event);\n if (listeners) {\n listeners.forEach(listener => {\n try {\n listener(payload);\n } catch (error) {\n console.error(`[EventEmitter] Error in listener for event \"${event}\":`, error);\n }\n });\n }\n }\n\n /** 清除所有事件监听器 */\n public clear(): void {\n this.events.clear();\n }\n}\n","/**\n * Manager 注册表\n * 每个 BimEngine 实例持有独立的 Registry,实现多实例隔离\n */\nimport { EventEmitter } from './event-emitter';\nimport type { EngineEvents } from '../types/events';\n\nimport type { ToolbarManager } from '../managers/toolbar-manager';\nimport type { DialogManager } from '../managers/dialog-manager';\nimport type { EngineManager } from '../managers/engine-manager';\nimport type { ButtonGroupManager } from '../managers/button-group-manager';\nimport type { RightKeyManager } from '../managers/right-key-manager';\nimport type { ConstructTreeManagerBtn } from '../managers/construct-tree-manager-btn';\n\nimport type { MeasureDialogManager } from '../managers/measure-dialog-manager';\nimport type { WalkControlManager } from '../managers/walk-control-manager';\nimport type { SectionPlaneDialogManager } from '../managers/section-plane-dialog-manager';\nimport type { SectionAxisDialogManager } from '../managers/section-axis-dialog-manager';\nimport type { SectionBoxDialogManager } from '../managers/section-box-dialog-manager';\nimport type { WalkPathDialogManager } from '../managers/walk-path-dialog-manager';\nimport type { WalkPlanViewDialogManager } from '../managers/walk-plan-view-dialog-manager';\nimport type { EngineInfoDialogManager } from '../managers/engine-info-dialog-manager';\nimport type { SettingDialogManager } from '../managers/setting-dialog-manager';\nimport type { ComponentDetailManager } from '../managers/component-detail-manager';\nimport type { AiChatManager } from '../managers/ai-chat-manager';\n\n/**\n * Manager 注册表 - 实例模式\n * 每个 BimEngine 创建独立的 Registry 实例,替代旧的全局单例\n */\nexport class ManagerRegistry {\n /** 事件发射器 */\n private eventEmitter: EventEmitter = new EventEmitter();\n\n /** 主容器元素 */\n public container: HTMLElement | null = null;\n /** 包装容器元素 */\n public wrapper: HTMLElement | null = null;\n\n /** 工具栏管理器 */\n public toolbar: ToolbarManager | null = null;\n /** 对话框管理器 */\n public dialog: DialogManager | null = null;\n /** 3D 引擎管理器 */\n public engine3d: EngineManager | null = null;\n /** 按钮组管理器 */\n public buttonGroup: ButtonGroupManager | null = null;\n /** 右键菜单管理器 */\n public rightKey: RightKeyManager | null = null;\n /** 构件树管理器 */\n public constructTree: ConstructTreeManagerBtn | null = null;\n\n /** 测量对话框管理器 */\n public measure: MeasureDialogManager | null = null;\n /** 漫游控制管理器 */\n public walkControl: WalkControlManager | null = null;\n /** 拾取面剖切对话框管理器 */\n public sectionPlane: SectionPlaneDialogManager | null = null;\n /** 轴向剖切对话框管理器 */\n public sectionAxis: SectionAxisDialogManager | null = null;\n /** 剖切盒对话框管理器 */\n public sectionBox: SectionBoxDialogManager | null = null;\n /** 漫游路径对话框管理器 */\n public walkPath: WalkPathDialogManager | null = null;\n /** 漫游平面图对话框管理器 */\n public walkPlanView: WalkPlanViewDialogManager | null = null;\n /** 引擎信息对话框管理器 */\n public engineInfo: EngineInfoDialogManager | null = null;\n /** 构件详情管理器 */\n public componentDetail: ComponentDetailManager | null = null;\n /** AI 聊天管理器 */\n public aiChat: AiChatManager | null = null;\n /** 设置对话框管理器 */\n public setting: SettingDialogManager | null = null;\n\n constructor() {}\n\n /** 重置(清理事件和引用) */\n public reset(): void {\n this.eventEmitter.clear();\n this.container = null;\n this.wrapper = null;\n this.toolbar = null;\n this.dialog = null;\n this.engine3d = null;\n this.buttonGroup = null;\n this.rightKey = null;\n this.constructTree = null;\n this.measure = null;\n this.walkControl = null;\n this.sectionPlane = null;\n this.sectionAxis = null;\n this.sectionBox = null;\n this.walkPath = null;\n this.walkPlanView = null;\n this.engineInfo = null;\n this.componentDetail = null;\n this.aiChat = null;\n this.setting = null;\n }\n\n /**\n * 发送事件\n * @param event 事件名称\n * @param payload 事件数据\n */\n public emit(event: K, payload: EngineEvents[K]): void {\n this.eventEmitter.emit(event, payload);\n }\n\n /**\n * 订阅事件\n * @param event 事件名称\n * @param listener 事件处理函数\n * @returns 取消订阅的函数\n */\n public on(\n event: K,\n listener: (payload: EngineEvents[K]) => void\n ): () => void {\n return this.eventEmitter.on(event, listener);\n }\n\n /**\n * 取消订阅事件\n * @param event 事件名称\n * @param listener 事件处理函数\n */\n public off(\n event: K,\n listener: (payload: EngineEvents[K]) => void\n ): void {\n this.eventEmitter.off(event, listener);\n }\n\n /** 清除所有事件监听器 */\n public clearEvents(): void {\n this.eventEmitter.clear();\n }\n}\n","declare const __APP_VERSION__: string;\nimport './bim-engine.css';\nimport { ToolbarManager } from './managers/toolbar-manager';\nimport { ButtonGroupManager } from './managers/button-group-manager';\nimport { DialogManager } from './managers/dialog-manager';\nimport { EngineManager } from './managers/engine-manager';\nimport { RightKeyManager } from './managers/right-key-manager';\nimport { ConstructTreeManagerBtn } from './managers/construct-tree-manager-btn';\n\nimport { MeasureDialogManager } from './managers/measure-dialog-manager';\nimport { SectionPlaneDialogManager } from './managers/section-plane-dialog-manager';\nimport { SectionAxisDialogManager } from './managers/section-axis-dialog-manager';\nimport { SectionBoxDialogManager } from './managers/section-box-dialog-manager';\nimport { WalkControlManager } from './managers/walk-control-manager';\nimport { EngineInfoDialogManager } from './managers/engine-info-dialog-manager';\nimport { SettingDialogManager } from './managers/setting-dialog-manager';\nimport { ComponentDetailManager } from './managers/component-detail-manager';\nimport { AiChatManager } from './managers/ai-chat-manager';\nimport type { EngineOptions, ModelLoadOptions } from './components/engine';\nimport { localeManager } from './services/locale';\nimport { themeManager } from './services/theme';\nimport type { LocaleType } from './locales/types';\nimport type { ThemeType, ThemeConfig } from './themes/types';\nimport { ManagerRegistry } from './core/manager-registry';\nimport { EngineEvents } from './types/events';\n\nexport type { EngineOptions, ModelLoadOptions };\n\nexport class BimEngine {\n public container: HTMLElement;\n private wrapper: HTMLElement | null = null;\n private registry: ManagerRegistry;\n\n public toolbar: ToolbarManager | null = null;\n public constructTreeBtn: ConstructTreeManagerBtn | null = null;\n public buttonGroup: ButtonGroupManager | null = null;\n public dialog: DialogManager | null = null;\n public engine: EngineManager | null = null;\n public rightKey: RightKeyManager | null = null;\n\n public measure: MeasureDialogManager | null = null;\n public sectionPlane: SectionPlaneDialogManager | null = null;\n public sectionAxis: SectionAxisDialogManager | null = null;\n public sectionBox: SectionBoxDialogManager | null = null;\n public walkControl: WalkControlManager | null = null;\n public engineInfo: EngineInfoDialogManager | null = null;\n public componentDetail: ComponentDetailManager | null = null;\n public aiChat: AiChatManager | null = null;\n public setting: SettingDialogManager | null = null;\n\n constructor(\n container: HTMLElement | string,\n options?: {\n locale?: LocaleType;\n theme?: ThemeType;\n }\n ) {\n const el = typeof container === 'string' ? document.getElementById(container) : container;\n if (!el) throw new Error('Container not found');\n this.container = el;\n\n this.registry = new ManagerRegistry();\n\n if (options?.locale) localeManager.setLocale(options.locale);\n if (options?.theme) {\n if (options.theme === 'custom') {\n console.warn('Custom theme should be set via setCustomTheme().');\n } else {\n themeManager.setTheme(options.theme);\n }\n }\n\n this.init();\n }\n\n public emit(event: K, payload: EngineEvents[K]) {\n this.registry.emit(event, payload);\n }\n\n public on(event: K, listener: (payload: EngineEvents[K]) => void): () => void {\n return this.registry.on(event, listener);\n }\n\n public setLocale(locale: LocaleType) {\n localeManager.setLocale(locale);\n }\n\n public getLocale(): LocaleType {\n return localeManager.getLocale();\n }\n\n public setTheme(theme: 'dark' | 'light') {\n themeManager.setTheme(theme);\n }\n\n public setCustomTheme(theme: ThemeConfig) {\n themeManager.setCustomTheme(theme);\n }\n\n private init() {\n this.container.innerHTML = '';\n this.wrapper = document.createElement('div');\n this.wrapper.className = 'bim-engine-wrapper';\n this.container.appendChild(this.wrapper);\n\n const versionEl = document.createElement('div');\n versionEl.className = 'bim-engine-version';\n versionEl.textContent = `v${__APP_VERSION__}`;\n this.wrapper.appendChild(versionEl);\n\n this.registry.container = this.container;\n this.registry.wrapper = this.wrapper;\n\n this.engine = new EngineManager(this.wrapper, this.registry);\n this.dialog = new DialogManager(this.wrapper, this.registry);\n this.toolbar = new ToolbarManager(this.wrapper, this.registry);\n this.buttonGroup = new ButtonGroupManager(this.wrapper, this.registry);\n this.rightKey = new RightKeyManager(this.wrapper, this.registry);\n this.constructTreeBtn = new ConstructTreeManagerBtn(this.wrapper, this.registry);\n\n this.measure = new MeasureDialogManager(this.registry);\n this.sectionPlane = new SectionPlaneDialogManager(this.registry);\n this.sectionAxis = new SectionAxisDialogManager(this.registry);\n this.sectionBox = new SectionBoxDialogManager(this.registry);\n this.walkControl = new WalkControlManager(this.registry);\n this.walkControl.init();\n this.engineInfo = new EngineInfoDialogManager(this.registry);\n this.engineInfo.init();\n\n this.registry.engine3d = this.engine;\n this.registry.dialog = this.dialog;\n this.registry.toolbar = this.toolbar;\n this.registry.buttonGroup = this.buttonGroup;\n this.registry.rightKey = this.rightKey;\n this.registry.constructTree = this.constructTreeBtn;\n\n this.registry.measure = this.measure;\n this.registry.sectionPlane = this.sectionPlane;\n this.registry.sectionAxis = this.sectionAxis;\n this.registry.sectionBox = this.sectionBox;\n this.registry.walkControl = this.walkControl;\n this.registry.engineInfo = this.engineInfo;\n\n this.componentDetail = new ComponentDetailManager(this.registry);\n this.registry.componentDetail = this.componentDetail;\n this.componentDetail.init();\n\n this.aiChat = new AiChatManager(this.registry);\n this.registry.aiChat = this.aiChat;\n this.aiChat.init();\n\n this.setting = new SettingDialogManager(this.registry);\n this.registry.setting = this.setting;\n this.setting.init();\n\n this.updateTheme(themeManager.getTheme());\n themeManager.subscribe((theme) => {\n this.updateTheme(theme);\n });\n }\n\n private updateTheme(theme: ThemeConfig) {\n if (this.wrapper) {\n this.wrapper.style.color = theme.textPrimary;\n }\n }\n\n public destroy() {\n this.toolbar?.destroy();\n this.buttonGroup?.destroy();\n this.engine?.destroy();\n this.dialog?.destroy();\n this.rightKey?.destroy();\n\n this.measure?.destroy();\n this.sectionPlane?.destroy();\n this.sectionAxis?.destroy();\n this.sectionBox?.destroy();\n this.walkControl?.destroy();\n this.aiChat?.destroy();\n this.setting?.destroy();\n this.container.innerHTML = '';\n this.registry.reset();\n }\n}\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createHomeButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'home',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.home',\n icon: getIcon('主视角'),\n keepActive: false,\n onClick: (button) => {\n console.log('首页按钮被点击:', button.id);\n registry.engine3d?.getEngineComponent()?.CameraGoHome();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createZoomBoxButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'zoom-box',\n groupId: 'group-1',\n keepActive: false,\n type: 'button',\n label: 'toolbar.zoomBox',\n icon: getIcon('框选放大'),\n onClick: () => {\n registry.engine3d?.getEngineComponent()?.activateZoomBox();\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createWalkMenuButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'walk',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.walk',\n align: 'vertical',\n icon: getIcon('漫游'),\n onClick: () => {\n console.log('漫游按钮被点击');\n registry.walkControl?.show();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createMapButton = (registry: ManagerRegistry): ButtonConfig => {\n\n\n return {\n id: 'map',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.map',\n align: 'vertical',\n keepActive: true,\n icon: getIcon('地图'),\n onClick: () => {\n registry.engine3d?.getEngineComponent()?.toggleMiniMap();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createPropertyButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'property',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.property',\n align: 'vertical',\n icon: getIcon('文档'),\n onClick: () => {\n console.log('构件详情按钮被点击');\n registry.componentDetail?.show();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createSettingButton = (registry?: ManagerRegistry): ButtonConfig => {\n return {\n id: 'setting',\n groupId: 'group-2',\n type: 'button',\n label: 'toolbar.setting',\n icon: getIcon('设置'),\n keepActive: false,\n onClick: (_button) => {\n registry?.setting?.toggle();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createInfoButton = (registry: ManagerRegistry): ButtonConfig => {\n\n \n return {\n id: 'info',\n groupId: 'group-2',\n type: 'button',\n label: 'toolbar.info',\n icon: getIcon('信息'),\n keepActive: false,\n onClick: () => {\n registry.engineInfo?.show();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createFullscreenButton = (_registry?: ManagerRegistry): ButtonConfig => {\n return {\n id: 'fullscreen',\n groupId: 'group-2',\n type: 'button',\n label: 'toolbar.fullscreen',\n align: 'vertical',\n icon: getIcon('全屏'),\n onClick: async () => {\n console.log('全屏按钮被点击');\n\n const isIframe = window.self !== window.top;\n if (isIframe) {\n console.warn('检测到在 Iframe 中运行,请确保父级 iframe 标签拥有 allow=\"fullscreen\" 属性');\n }\n\n try {\n const doc = document as any;\n const fullscreenElement = doc.fullscreenElement ||\n doc.webkitFullscreenElement ||\n doc.mozFullScreenElement ||\n doc.msFullscreenElement;\n\n const isFullscreen = !!fullscreenElement;\n console.log('当前是否全屏:', isFullscreen);\n\n const bimContainer = document.querySelector('.bim-engine-container') as HTMLElement;\n const targetElem = bimContainer || document.body;\n const el = targetElem as any;\n\n if (!isFullscreen) {\n console.log('准备进入全屏...');\n\n if (targetElem.style.backgroundColor === '' || targetElem.style.backgroundColor === 'transparent') {\n targetElem.style.backgroundColor = '#ffffff';\n }\n\n const requestMethod = el.requestFullscreen ||\n el.webkitRequestFullscreen ||\n el.mozRequestFullScreen ||\n el.msRequestFullscreen;\n\n if (requestMethod) {\n await requestMethod.call(el, { navigationUI: 'hide' });\n console.log('全屏请求已发送');\n } else {\n console.warn('当前浏览器不支持全屏 API');\n alert('当前浏览器不支持全屏功能');\n }\n } else {\n console.log('准备退出全屏...');\n\n const exitMethod = doc.exitFullscreen ||\n doc.webkitExitFullscreen ||\n doc.mozCancelFullScreen ||\n doc.msExitFullscreen;\n\n if (exitMethod) {\n await exitMethod.call(doc);\n console.log('退出全屏请求已发送');\n }\n }\n } catch (error: any) {\n console.error('全屏操作失败:', error);\n if (error && error.message && error.message.includes('denied')) {\n console.error('全屏请求被拒绝。如果是 Iframe,请检查 allow=\"fullscreen\"。如果是自动触发,请确保由用户点击触发。');\n }\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createMeasureButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'measure',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.measure',\n icon: getIcon('测量'),\n keepActive: true,\n onClick: (button) => {\n if (button.isActive) {\n registry.measure?.show();\n } else {\n registry.measure?.destroy();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionMenuButton = (_registry?: ManagerRegistry): ButtonConfig => {\n return {\n id: 'section',\n groupId: 'group-1',\n type: 'menu',\n label: 'toolbar.section',\n align: 'vertical',\n icon: getIcon('剖切'),\n keepActive: true,\n onClick: (button) => {\n console.log('剖切按钮被点击:', button.id);\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionPlaneButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'section-plane',\n groupId: 'group-1',\n parentId: 'section',\n type: 'button',\n keepActive: true,\n exclusive: true,\n align: 'vertical',\n label: 'toolbar.sectionPlane',\n icon: getIcon('拾曲面剖切'),\n onClick: (button) => {\n console.log('拾取面剖切被点击:', button.id, '激活状态:', button.isActive);\n if (button.isActive) {\n registry.sectionPlane?.show();\n } else {\n registry.sectionPlane?.hide();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionAxisButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'section-axis',\n groupId: 'group-1',\n parentId: 'section',\n type: 'button',\n keepActive: true,\n exclusive: true,\n align: 'vertical',\n label: 'toolbar.sectionAxis',\n icon: getIcon('轴向剖切'),\n onClick: (button) => {\n if (button.isActive) {\n registry.sectionAxis?.show();\n } else {\n registry.sectionAxis?.destroy();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionBoxButton = (registry: ManagerRegistry): ButtonConfig => {\n return {\n id: 'section-box',\n groupId: 'group-1',\n parentId: 'section',\n type: 'button',\n keepActive: true,\n exclusive: true,\n align: 'vertical',\n label: 'toolbar.sectionBox',\n icon: getIcon('剖切盒'),\n onClick: (button) => {\n console.log('剖切盒被点击:', button.id, '激活状态:', button.isActive);\n if (button.isActive) {\n registry.sectionBox?.show();\n } else {\n registry.sectionBox?.hide();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport type { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createAiChatButton = (registry: ManagerRegistry): ButtonConfig => {\n\n\n registry.on('aiChat:opened', () => {\n registry.toolbar?.setBtnActive('aiChat', true);\n });\n\n registry.on('aiChat:closed', () => {\n registry.toolbar?.setBtnActive('aiChat', false);\n });\n\n return {\n id: 'aiChat',\n groupId: 'group-2',\n type: 'button',\n label: 'aiChat.title',\n align: 'vertical',\n keepActive: true,\n icon: getIcon('bot'),\n onClick: () => {\n registry.aiChat?.toggle();\n }\n };\n};\n","const n = `# BIM引擎AI助手 - 需求分析与步骤规划专家\n\n## 角色定位\n\n你是一位资深的**AI+BIM轻量化引擎架构专家**,具备以下核心能力:\n\n1. **深度理解BIM引擎架构**:精通BIM引擎的模块化设计、API体系、数据结构和交互模式\n2. **需求分析能力**:能够准确理解用户意图,识别模糊需求,提出精准的澄清问题\n3. **任务分解能力**:将复杂需求拆解为可执行的、原子化的操作步骤\n4. **技术决策能力**:根据需求特点选择最优的API组合和实现路径\n\n你的职责是通过分析用户需求,生成结构化的执行步骤,指导代码生成模块完成BIM引擎的功能实现。\n\n## 工作流程\n\n如果存在疑问,你就不能输出最终的步骤,只有当你把所有的疑问清楚后,你才可以输出步骤,如果存在疑问,你要以bim模型为载体,不能问一下和bim模型不想干的问题,尽量没有或减少问题\n\n### 阶段一:需求理解与分析\n\n当接收到用户需求时,你需要:\n\n1. **深度分析需求**:\n - 理解用户的核心目标\n - 识别涉及到的BIM引擎模块(场景、相机、模型、测量、剖切等)\n - 分析数据流向和依赖关系\n - 评估需求的复杂度和可行性\n\n2. **识别模糊点**:\n - 检查需求中是否存在歧义、缺失信息或边界条件不明确的情况\n - 判断是否需要用户澄清才能继续\n\n3. **决策是否需要提问**:\n - **仅在必要时提问**:如果需求足够清晰,直接进入步骤规划阶段\n - **避免过度提问**:不要为了提问而提问,不要询问可以从上下文推断的信息\n - **精准提问**:每个问题都应该针对关键决策点,影响后续实现路径\n\n### 阶段二:需求澄清(如需要)\n\n如果需要用户澄清,请按照以下格式输出:\n\n**输出格式**:\n\\`\\`\\`\n##question## \njson内容\n\\`\\`\\`\n\n**JSON格式规范**:\n\\`\\`\\`json\n[\n {\n \"id\": 0,\n \"question\": \"您是否需要设置所有的构件?\",\n \"answers\": [\n \"A. 是的,设置所有构件\",\n \"B. 只设置1F层的构件\",\n \"C. 根据特定条件筛选构件\"\n ]\n },\n {\n \"id\": 1,\n \"question\": \"颜色设置的优先级是什么?\",\n \"answers\": [\n \"A. 按构件类型设置\",\n \"B. 按楼层设置\",\n \"C. 按自定义属性设置\"\n ]\n }\n]\n\\`\\`\\`\n\n**提问原则**:\n- 每个问题必须针对一个明确的决策点\n- 答案选项应该互斥且覆盖主要场景\n- 问题数量控制在3个以内,优先询问最关键的问题\n- 问题描述清晰、具体,避免模糊表述\n- 不要强行提问,尽量减少或不提问题\n### 阶段三:步骤规划\n\n当需求清晰后,你需要将用户意图拆解为一系列可执行的步骤。\n\n**输出格式**:\n\\`\\`\\`\n##steps## \njson内容\n\n\\`\\`\\`\n\n**JSON格式规范**:\n\\`\\`\\`json\n[\n {\n \"id\": 0,\n \"content\": \"获取所有桩基模型\",\n \"description\": \"通过modelTree模块遍历模型树,筛选出类型为'桩基'的所有构件,返回构件ID数组和构件对象数组\",\n \"output\": \"{\\\\\"modelIds\\\\\": [\\\\\"id1\\\\\", \\\\\"id2\\\\\", ...], \\\\\"models\\\\\": [modelObject1, modelObject2, ...]}\",\n \"dependencies\": [],\n \"apiModules\": [\"modelTree\", \"dataModule\"]\n },\n {\n \"id\": 1,\n \"content\": \"设置桩基模型颜色为红色\",\n \"description\": \"使用modelMapperBatch模块的批量设置方法,将上一步获取的所有桩基模型的颜色属性设置为红色(RGB: 255, 0, 0)\",\n \"output\": \"{\\\\\"success\\\\\": true, \\\\\"count\\\\\": 10, \\\\\"failedIds\\\\\": []}\",\n \"dependencies\": [0],\n \"apiModules\": [\"modelMapperBatch\"]\n }\n]\n\\`\\`\\`\n\n**字段说明**:\n- \\`id\\`: 步骤唯一标识符,从0开始递增\n- \\`content\\`: 步骤的简短描述(一句话概括)\n- \\`description\\`: 步骤的详细功能说明,包括:\n - 具体要做什么\n - 使用哪些API模块\n - 如何处理数据\n - 可能的边界情况\n- \\`output\\`: 步骤输出的数据格式说明(JSON Schema格式),用于:\n - 指导代码生成模块返回正确的数据结构\n - 确保步骤间的数据传递正确\n- \\`dependencies\\`: 依赖的步骤ID数组,表示此步骤需要等待哪些步骤完成\n- \\`apiModules\\`: 此步骤涉及到的BIM引擎模块名称数组(如:modelTree, cameraModule, measure等)\n\n**步骤规划原则**:\n1. **原子化**:每个步骤应该只完成一个明确的功能点\n2. **可执行**:每个步骤都应该能够独立生成可执行的代码\n3. **依赖清晰**:明确标注步骤间的依赖关系,确保执行顺序正确\n4. **数据流转**:每个步骤的输出格式要明确,便于后续步骤使用\n5. **模块化**:合理利用BIM引擎的模块化设计,选择最合适的API\n6. **错误处理**:在关键步骤中考虑异常情况的处理\n\n## 硬性要求\n\n### 1. 输出格式规范\n- **必须严格遵循**上述JSON格式,字段名称和类型不能改变\n- JSON必须是有效的、可解析的格式\n- 步骤ID必须连续且从0开始\n- 依赖关系必须正确,不能出现循环依赖\n\n### 2. 需求理解要求\n- **深度理解**:不能停留在表面理解,要理解用户的真实意图和业务场景\n- **上下文感知**:结合BIM引擎的特性,理解每个需求在BIM场景下的实际意义\n- **技术可行性**:确保规划的步骤在BIM引擎API能力范围内\n\n### 3. 步骤质量要求\n- **完整性**:步骤应该覆盖用户需求的所有方面,不能遗漏关键环节\n- **准确性**:步骤描述要准确,不能有歧义或错误\n- **可执行性**:每个步骤都应该能够生成可执行的代码\n- **效率性**:优先选择高效的API组合,避免不必要的中间步骤\n\n### 4. 错误预防\n- 检查步骤间的数据格式是否匹配\n- 确保依赖关系正确,避免执行顺序错误\n- 验证API模块名称是否正确\n- 考虑边界情况和异常处理\n\n### 5. 代码生成友好\n- 步骤描述要足够详细,让代码生成模块能够准确理解意图\n- 输出格式说明要具体,使用JSON Schema或示例数据\n- 明确标注使用的API模块,便于代码生成时快速定位\n\n## 最佳实践\n\n1. **先理解后规划**:充分理解需求后再开始规划步骤,避免返工\n2. **模块优先**:优先使用BIM引擎提供的功能模块,而不是底层API\n3. **数据驱动**:明确每个步骤的输入输出,确保数据流清晰\n4. **可扩展性**:考虑未来可能的扩展需求,设计灵活的步骤结构\n5. **用户友好**:步骤描述要清晰易懂,便于用户理解整个执行流程\n\n\n''`;\nexport {\n n as default\n};\n//# sourceMappingURL=main-2Txx2Vau.mjs.map\n","const n = `# BIM引擎AI助手 - 代码生成专家\n\n## 角色定位\n\n你是一位资深的**BIM引擎代码生成专家**,具备以下核心能力:\n\n1. **BIM引擎API精通**:深度掌握BIM引擎的所有模块API、方法签名、参数类型和返回值\n2. **代码生成能力**:能够根据步骤描述,生成高质量、可执行、符合规范的JavaScript代码\n3. **上下文理解**:能够理解步骤间的数据流转,正确处理前序步骤的输出结果\n4. **错误处理能力**:具备完善的异常处理和边界情况处理能力\n5. **代码质量意识**:生成的代码应该具备良好的可读性、可维护性和性能\n\n你的职责是根据步骤规划模块提供的步骤描述,生成可直接在BIM引擎环境中执行的JavaScript代码片段。\n\n## 工作流程\n\n### 阶段一:理解步骤要求\n\n当接收到步骤执行请求时,你需要:\n\n1. **解析步骤信息**:\n - 理解步骤的\\`content\\`(简短描述)和\\`description\\`(详细说明)\n - 识别步骤涉及到的BIM引擎模块(\\`apiModules\\`字段)\n - 理解步骤的依赖关系(\\`dependencies\\`字段)\n - 明确步骤的预期输出格式(\\`output\\`字段)\n\n2. **分析上下文数据**:\n - 如果有前序步骤的输出结果,分析其数据结构\n - 理解当前步骤需要使用的输入数据\n - 验证数据格式是否匹配步骤要求\n\n3. **确定实现方案**:\n - 根据步骤描述,选择最合适的BIM引擎API\n - 设计数据转换和处理逻辑\n - 规划错误处理策略\n\n### 阶段二:生成代码\n\n根据步骤要求生成可执行的JavaScript代码。\n\n**输出格式**:\n\\`\\`\\`\n##code##\n[可执行的JavaScript代码]\n\\`\\`\\`\n\n**代码生成规范**:\n\n1. **代码结构**:\n - 代码必须是一个完整的、可执行的JavaScript代码片段\n - 可以是函数、立即执行函数(IIFE)或代码块\n - 代码应该能够直接运行,不需要额外的包装\n\n2. **引擎实例访问**:\n - 假设BIM引擎实例通过变量\\`engine\\`访问(全局作用域)\n - 通过\\`engine.moduleName\\`访问各个功能模块\n - 例如:\\`engine.modelTree\\`、\\`engine.cameraModule\\`、\\`engine.measure\\`等\n\n3. **数据输入处理**:\n - 如果步骤有依赖,使用前序步骤的输出数据\n - 假设前序步骤的输出数据存储在变量\\`previousStepOutput\\`中(如果是第一步,则为\\`null\\`)\n - 需要根据\\`output\\`字段的格式说明,正确解析和使用输入数据\n\n4. **API调用规范**:\n - 严格按照BIM引擎API文档使用API\n - 参数类型和数量必须正确\n - 处理API的返回值和可能的异常\n\n5. **数据输出规范**:\n - 代码执行后,必须返回符合步骤\\`output\\`字段要求的数据格式\n - 使用\\`return\\`语句返回结果\n - 返回的数据必须是可序列化的(JSON格式)\n\n6. **错误处理**:\n - 必须包含完善的错误处理逻辑\n - 使用try-catch捕获可能的异常\n - 对于关键操作,添加参数验证\n - 错误信息要清晰,便于调试\n\n7. **代码质量要求**:\n - 代码要有清晰的注释,说明关键逻辑\n - 变量命名要有意义,符合JavaScript命名规范\n - 避免使用过于复杂的嵌套结构\n - 优先使用可读性高的写法,而不是过于\"高级\"的技巧\n\n## 硬性要求\n\n### 1. 代码格式要求\n- **单一代码块**:输出必须且只能包含一个JavaScript代码片段\n- **可执行性**:代码必须能够直接执行,不需要额外的依赖或配置\n- **完整性**:代码必须完整,不能有语法错误或未定义的变量\n\n### 2. 数据格式要求\n- **输入解析**:正确解析和使用前序步骤的输出数据\n- **输出格式**:严格按照步骤\\`output\\`字段的格式要求返回数据\n- **类型安全**:确保数据类型正确,必要时进行类型转换\n\n### 3. API使用要求\n- **准确性**:API调用必须准确,参数必须正确\n- **模块识别**:正确识别和使用BIM引擎的各个模块\n- **方法调用**:使用正确的方法名和参数签名\n\n### 4. 错误处理要求\n- **异常捕获**:所有可能抛出异常的操作都要有try-catch保护\n- **参数验证**:对关键参数进行验证,避免无效输入\n- **错误信息**:错误信息要清晰,包含足够的上下文信息\n- **优雅降级**:在可能的情况下,提供降级方案\n\n### 5. 代码质量要求\n- **可读性**:代码结构清晰,逻辑易懂\n- **注释完整**:关键逻辑要有注释说明\n- **命名规范**:变量和函数命名要有意义\n- **性能考虑**:避免不必要的循环和计算\n\n## 代码生成示例\n\n### 示例1:获取模型数据\n\n**步骤描述**:\n\\`\\`\\`json\n{\n \"id\": 0,\n \"content\": \"获取所有桩基模型\",\n \"description\": \"通过modelTree模块遍历模型树,筛选出类型为'桩基'的所有构件\",\n \"output\": \"{\\\\\"modelIds\\\\\": [\\\\\"id1\\\\\", \\\\\"id2\\\\\"], \\\\\"models\\\\\": [modelObject1, modelObject2]}\",\n \"dependencies\": [],\n \"apiModules\": [\"modelTree\"]\n}\n\\`\\`\\`\n\n**生成代码**:\n\\`\\`\\`javascript\n// 获取所有桩基模型\ntry {\n // 获取模型树模块\n const modelTree = engine.modelTree;\n if (!modelTree) {\n throw new Error('模型树模块未初始化');\n }\n \n // 获取所有模型\n const allModels = modelTree.getAllModels();\n if (!allModels || allModels.length === 0) {\n return {\n modelIds: [],\n models: []\n };\n }\n \n // 筛选桩基模型\n const pileModels = [];\n const pileModelIds = [];\n \n for (let i = 0; i < allModels.length; i++) {\n const model = allModels[i];\n // 根据模型属性判断是否为桩基\n const modelType = model.getProperty('类型') || model.getProperty('category');\n if (modelType && (modelType.includes('桩基') || modelType.includes('Pile'))) {\n pileModels.push(model);\n pileModelIds.push(model.id || model.uuid);\n }\n }\n \n // 返回结果\n return {\n modelIds: pileModelIds,\n models: pileModels\n };\n} catch (error) {\n console.error('获取桩基模型失败:', error);\n return {\n modelIds: [],\n models: [],\n error: error.message\n };\n}\n\\`\\`\\`\n\n### 示例2:使用前序步骤的输出\n\n**步骤描述**:\n\\`\\`\\`json\n{\n \"id\": 1,\n \"content\": \"设置桩基模型颜色为红色\",\n \"description\": \"使用modelMapperBatch模块批量设置上一步获取的桩基模型颜色\",\n \"output\": \"{\\\\\"success\\\\\": true, \\\\\"count\\\\\": 10}\",\n \"dependencies\": [0],\n \"apiModules\": [\"modelMapperBatch\"]\n}\n\\`\\`\\`\n\n**生成代码**:\n\\`\\`\\`javascript\n// 设置桩基模型颜色为红色\ntry {\n // 获取前序步骤的输出数据\n if (!previousStepOutput || !previousStepOutput.modelIds) {\n throw new Error('前序步骤输出数据无效,缺少modelIds字段');\n }\n \n const modelIds = previousStepOutput.modelIds;\n if (modelIds.length === 0) {\n return {\n success: true,\n count: 0,\n message: '没有需要设置的模型'\n };\n }\n \n // 获取批量映射模块\n const modelMapperBatch = engine.modelMapperBatch;\n if (!modelMapperBatch) {\n throw new Error('批量映射模块未初始化');\n }\n \n // 设置颜色为红色 (RGB: 255, 0, 0)\n const redColor = { r: 255, g: 0, b: 0 };\n \n // 批量设置模型颜色\n const result = modelMapperBatch.setModelColor(modelIds, redColor);\n \n return {\n success: result.success !== false,\n count: result.count || modelIds.length,\n failedIds: result.failedIds || []\n };\n} catch (error) {\n console.error('设置模型颜色失败:', error);\n return {\n success: false,\n count: 0,\n error: error.message\n };\n}\n\\`\\`\\`\n\n## 最佳实践\n\n1. **充分理解步骤**:仔细阅读步骤描述,确保理解每个细节\n2. **查阅API文档**:不确定的API用法,参考BIM引擎API文档\n3. **数据验证优先**:在处理数据前,先验证数据的有效性\n4. **错误处理完善**:考虑各种可能的异常情况\n5. **代码可读性**:优先保证代码的可读性,而不是追求\"高级\"写法\n6. **注释清晰**:关键逻辑要有注释,但不要过度注释\n7. **性能考虑**:对于大量数据的处理,考虑性能优化\n8. **测试友好**:生成的代码应该便于测试和调试 `;\nexport {\n n as default\n};\n//# sourceMappingURL=step-CkmZYIvn.mjs.map\n","const n = `# BIM Engine SDK API 文档\n\n本文档为 BIM Engine SDK 的完整 API 参考,适合大模型阅读和理解引擎的功能结构。\n\n## 目录\n\n1. [核心引擎类](#1-核心引擎类)\n2. [基础模块](#2-基础模块)\n3. [功能管理器](#3-功能管理器)\n4. [状态管理](#4-状态管理)\n\n---\n\n## 1. 核心引擎类\n\n### EngineKernelV2\n\n引擎核心组件,负责整合和管理所有模块。\n\n**文件路径**: \\`src/core/v2/EngineKernel.ts\\`\n\n#### 构造函数\n\n\\`\\`\\`typescript\nconstructor(options: any)\n\\`\\`\\`\n\n**参数**:\n- \\`options.containerId\\`: string - 容器元素的 ID\n\n**功能**:\n- 初始化所有基础模块(场景、相机、渲染器、控制器等)\n- 初始化所有功能管理器(测量、剖切、模型树等)\n- 设置渲染循环\n- 添加性能监视器\n\n#### 公共属性\n\n\\`\\`\\`typescript\n// 基础对象\npublic scene: THREE.Scene | null // 三维场景\npublic camera: THREE.Camera | null // 当前使用的相机\npublic renderer: THREE.WebGLRenderer | null // 渲染器\npublic controls: any // 控制器(轨道控制或第一人称)\n\n// 基础模块\npublic sceneModule: SceneModule // 场景模块\npublic cameraModule: CameraModule // 相机模块\npublic deviceModule: DeviceModule // 设备模块\npublic renderModule: RenderModule // 渲染模块\npublic controlModule: ControlModule // 控制模块\npublic composerModule: ComposerModule // 合成器模块\npublic loaderModule: LoaderModule // 加载器模块\npublic lightModule: LightModule // 光照模块\npublic interactionModule: InteractionModule // 交互模块\npublic modelToolModule: ModelToolModule // 模型工具模块\n\n// 功能管理器\npublic viewCube: ViewCube // 视图立方体\npublic rangeScale: RangeScale // 范围缩放\npublic setting: Setting // 设置\npublic measure: Measure // 测量\npublic clipping: Clipping // 剖切\npublic modelTree: ModelTree // 模型树\npublic engineInfo: EngineInfo // 引擎信息统计\npublic modelProperties: ModelProperties // 模型属性\npublic modelMapperBatch: ModelMapperBatch // 模型批量映射\npublic modelEdge: ModelEdge // 模型边线\n\n// 状态管理\npublic engineStatus: EngineStatus // 引擎状态\npublic events: EventModule // 事件模块\n\n// 业务数据\npublic models: any[] // 已加载的模型数组\npublic reactBoundingClientRect: { left: number; top: number } // 容器的边界矩形\n\\`\\`\\`\n\n#### 公共方法\n\n##### pauseRendering()\n\n\\`\\`\\`typescript\npublic pauseRendering(): void\n\\`\\`\\`\n\n**功能**: 暂停渲染循环\n- 停止动画帧请求\n- 禁用控制器\n- 用于性能优化或后台运行\n\n##### resumeRendering()\n\n\\`\\`\\`typescript\npublic resumeRendering(): void\n\\`\\`\\`\n\n**功能**: 恢复渲染循环\n- 重新启动动画帧请求\n- 恢复控制器状态\n\n##### isRenderingPausedState()\n\n\\`\\`\\`typescript\npublic isRenderingPausedState(): boolean\n\\`\\`\\`\n\n**功能**: 检查渲染是否暂停\n\n**返回值**: boolean - true 表示已暂停\n\n##### dispose()\n\n\\`\\`\\`typescript\npublic dispose(): void\n\\`\\`\\`\n\n**功能**: 销毁引擎,释放所有资源\n- 停止渲染循环\n- 清理所有模块\n- 释放几何体、材质、纹理\n- 移除 DOM 元素\n- 清理事件监听器\n\n**注意**: 调用此方法后引擎不可再使用\n\n---\n\n## 2. 基础模块\n\n### 2.1 SceneModule - 场景模块\n\n**文件路径**: \\`src/core/v2/modules/sceneModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic scene: THREE.Scene | null // 三维场景对象\n\\`\\`\\`\n\n**功能**:\n- 创建并管理 THREE.Scene\n- 初始化边线组(groupEdge)用于存储模型边线\n\n---\n\n### 2.2 CameraModule - 相机模块\n\n**文件路径**: \\`src/core/v2/modules/cameraModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic perspectiveCamera: THREE.PerspectiveCamera // 透视相机\npublic orthographicCamera: THREE.OrthographicCamera // 正交相机\n\\`\\`\\`\n\n#### 公共方法\n\n##### switchCurrentCamera()\n\n\\`\\`\\`typescript\npublic switchCurrentCamera(): void\n\\`\\`\\`\n\n**功能**: 切换当前相机类型(透视 ↔ 正交)\n\n##### switchToPerspectiveCamera()\n\n\\`\\`\\`typescript\npublic switchToPerspectiveCamera(): void\n\\`\\`\\`\n\n**功能**: 切换到透视相机\n- 保持当前位置和目标点\n- 更新控制器\n- 重新初始化合成器\n\n##### switchToOrthographicCamera()\n\n\\`\\`\\`typescript\npublic switchToOrthographicCamera(): void\n\\`\\`\\`\n\n**功能**: 切换到正交相机\n- 保持当前位置和目标点\n- 更新控制器\n- 重新初始化合成器\n\n##### getCameraType()\n\n\\`\\`\\`typescript\npublic getCameraType(): CameraType\n\\`\\`\\`\n\n**功能**: 获取当前相机类型\n\n**返回值**:\n- \\`CameraType.PERSPECTIVE\\` - 透视相机\n- \\`CameraType.ORTHOGRAPHIC\\` - 正交相机\n\n##### getCameraPose()\n\n\\`\\`\\`typescript\npublic getCameraPose(): ICameraPose\n\\`\\`\\`\n\n**功能**: 获取当前相机姿态(位置、旋转、目标点、缩放等)\n\n**返回值**: ICameraPose 对象\n\\`\\`\\`typescript\ninterface ICameraPose {\n type: CameraType;\n position: { x: number; y: number; z: number };\n rotation: { x: number; y: number; z: number };\n quaternion: { x: number; y: number; z: number; w: number };\n target?: { x: number; y: number; z: number };\n zoom?: number;\n}\n\\`\\`\\`\n\n##### restoreCameraPose()\n\n\\`\\`\\`typescript\npublic restoreCameraPose(pose: ICameraPose): void\n\\`\\`\\`\n\n**功能**: 通过相机姿态还原相机位置\n- 自动切换相机类型\n- 恢复位置、旋转、目标点\n- 恢复正交相机的缩放值\n\n**参数**:\n- \\`pose\\`: ICameraPose - 相机姿态对象\n\n---\n\n### 2.3 DeviceModule - 设备模块\n\n**文件路径**: \\`src/core/v2/modules/deviceModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic deviceType: string // 设备类型(默认 'PC')\n\\`\\`\\`\n\n#### 公共方法\n\n##### getDeviceType()\n\n\\`\\`\\`typescript\npublic getDeviceType(): string\n\\`\\`\\`\n\n**功能**: 获取设备类型\n\n**返回值**: 'PC' 或其他设备标识\n\n##### getContainerSize()\n\n\\`\\`\\`typescript\npublic getContainerSize(): { width: number; height: number }\n\\`\\`\\`\n\n**功能**: 获取容器尺寸\n\n**返回值**: 容器的宽度和高度\n\n---\n\n### 2.4 RenderModule - 渲染模块\n\n**文件路径**: \\`src/core/v2/modules/renderModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic renderer: THREE.WebGLRenderer | null // WebGL 渲染器\n\\`\\`\\`\n\n#### 公共方法\n\n##### createRenderer()\n\n\\`\\`\\`typescript\npublic createRenderer(): THREE.WebGLRenderer\n\\`\\`\\`\n\n**功能**: 创建并配置 WebGL 渲染器\n- 启用抗锯齿\n- 启用阴影映射(PCFSoftShadowMap)\n- 启用本地裁剪(用于剖切平面)\n- 配置色彩空间和色调映射\n\n**返回值**: 配置好的渲染器实例\n\n##### disposeRenderer()\n\n\\`\\`\\`typescript\npublic disposeRenderer(): void\n\\`\\`\\`\n\n**功能**: 释放渲染器资源\n\n---\n\n### 2.5 ControlModule - 控制模块\n\n**文件路径**: \\`src/core/v2/modules/controlModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic orbitControls: any // 轨道控制器\npublic firstPersonControls: any // 第一人称控制器\npublic isActive: boolean // 控制器是否激活\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化控制器\n- 创建轨道控制器和第一人称控制器\n- 创建旋转中心指示器 UI\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活控制器\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 禁用控制器\n\n##### switchFirstPersonMode()\n\n\\`\\`\\`typescript\npublic switchFirstPersonMode(): void\n\\`\\`\\`\n\n**功能**: 切换到第一人称漫游模式\n- 禁用轨道控制器\n- 启用第一人称控制器\n\n##### switchDefaultMode()\n\n\\`\\`\\`typescript\npublic switchDefaultMode(): void\n\\`\\`\\`\n\n**功能**: 切换到默认模式(轨道控制)\n- 禁用第一人称控制器\n- 启用轨道控制器\n\n##### update()\n\n\\`\\`\\`typescript\npublic update(): void\n\\`\\`\\`\n\n**功能**: 更新控制器状态\n- 更新旋转中心指示器位置\n- 在渲染循环中调用\n\n---\n\n### 2.6 ComposerModule - 合成器模块\n\n**文件路径**: \\`src/core/v2/modules/composerModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic composer: any // 效果合成器\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化后处理管线\n- RenderPass - 基础渲染\n- GTAOPass - 环境光遮蔽(默认禁用)\n- UnrealBloomPass - 辉光效果(默认禁用)\n- SaturationPass - 饱和度和对比度调整\n- OutputPass - 色调映射和颜色校正\n- FXAAPass - 抗锯齿\n\n##### resize()\n\n\\`\\`\\`typescript\npublic resize(): void\n\\`\\`\\`\n\n**功能**: 调整合成器大小\n- 更新所有 pass 的分辨率\n- 更新 FXAA 的分辨率参数\n\n---\n\n### 2.7 LoaderModule - 加载器模块\n\n**文件路径**: \\`src/core/v2/modules/loaderModule.ts\\`\n\n#### 公共方法\n\n##### loadModels()\n\n\\`\\`\\`typescript\nasync loadModels(urls: string[], options?: LoadModelOptions): Promise\n\\`\\`\\`\n\n**功能**: 加载多个模型\n- 支持轻量化模型格式\n- 支持 GLTF/GLB 格式\n- 异步加载\n\n**参数**:\n- \\`urls\\`: string[] - 模型 URL 数组\n- \\`options\\`: LoadModelOptions - 加载选项(可选)\n\n---\n\n### 2.8 EventModule - 事件模块\n\n**文件路径**: \\`src/core/v2/modules/eventModule.ts\\`\n\n#### 公共方法\n\n##### on()\n\n\\`\\`\\`typescript\non(event: EventType, callback: (data: T) => void): void\n\\`\\`\\`\n\n**功能**: 注册事件监听器\n\n**参数**:\n- \\`event\\`: EventType - 事件类型\n- \\`callback\\`: 回调函数\n\n##### off()\n\n\\`\\`\\`typescript\noff(event: EventType, callback: (data: T) => void): void\n\\`\\`\\`\n\n**功能**: 移除事件监听器\n\n**参数**:\n- \\`event\\`: EventType - 事件类型\n- \\`callback\\`: 要移除的回调函数\n\n##### trigger()\n\n\\`\\`\\`typescript\ntrigger(event: EventType, data?: any): void\n\\`\\`\\`\n\n**功能**: 触发事件\n\n**参数**:\n- \\`event\\`: EventType - 事件类型\n- \\`data\\`: 传递给监听器的数据\n\n**常用事件类型**:\n- \\`EventType.Click\\` - 点击事件\n- \\`EventType.ViewportResize\\` - 视口大小改变\n- \\`EventType.EngineFree\\` - 引擎空闲\n- \\`EventType.EngineBusy\\` - 引擎繁忙\n\n---\n\n### 2.9 LightModule - 光照模块\n\n**文件路径**: \\`src/core/v2/modules/lightModule.ts\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化场景基本光照\n- 添加定向光(DirectionalLight)\n - 强度: 2\n - 位置: (10, 20, 10)\n - 阴影贴图: 4096x4096(高质量)\n- 添加环境光(AmbientLight)\n - 强度: 1\n\n---\n\n### 2.10 InteractionModule - 交互模块\n\n**文件路径**: \\`src/core/v2/modules/interactionModule.ts\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化交互行为处理器\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活交互功能\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 禁用交互功能\n\n##### handleMouseClick()\n\n\\`\\`\\`typescript\npublic handleMouseClick(event: any): void\n\\`\\`\\`\n\n**功能**: 处理鼠标单击事件\n- 射线检测点击的模型\n- 高亮选中的模型\n- 设置旋转中心\n- 支持 Ctrl 多选\n\n##### handleMouseDoubleClick()\n\n\\`\\`\\`typescript\npublic handleMouseDoubleClick(event: any): void\n\\`\\`\\`\n\n**功能**: 处理鼠标双击事件\n- 双击模型后缩放到该模型\n- 计算模型包围盒并调整相机视角\n\n##### handleMouseClickInstance()\n\n\\`\\`\\`typescript\npublic handleMouseClickInstance(raycaster: any): any\n\\`\\`\\`\n\n**功能**: 判断点击实例化网格节点\n\n**参数**:\n- \\`raycaster\\`: 射线投射器\n\n**返回值**: 相交结果数组\n\n---\n\n### 2.11 ModelToolModule - 模型工具模块\n\n**文件路径**: \\`src/core/v2/modules/modelToolModule.ts\\`\n\n#### 公共方法\n\n##### highlightModel()\n\n\\`\\`\\`typescript\npublic highlightModel(models: any): void\n\\`\\`\\`\n\n**功能**: 设置模型高亮显示\n\n**参数**:\n- \\`models\\`: 模型数组,格式: \\`[{url: string, ids: string[]}]\\`\n\n##### unhighlightModel()\n\n\\`\\`\\`typescript\npublic unhighlightModel(models: any): void\n\\`\\`\\`\n\n**功能**: 取消模型高亮\n\n**参数**:\n- \\`models\\`: 模型数组\n\n##### unhighlightAllModels()\n\n\\`\\`\\`typescript\npublic unhighlightAllModels(): void\n\\`\\`\\`\n\n**功能**: 取消所有模型高亮\n\n##### hideModel()\n\n\\`\\`\\`typescript\npublic hideModel(models: any): void\n\\`\\`\\`\n\n**功能**: 隐藏模型\n\n**参数**:\n- \\`models\\`: 模型数组,格式: \\`[{url: string, ids: string[]}]\\`\n\n##### showModel()\n\n\\`\\`\\`typescript\npublic showModel(models: any): void\n\\`\\`\\`\n\n**功能**: 显示模型\n\n**参数**:\n- \\`models\\`: 模型数组\n\n##### isolateModel()\n\n\\`\\`\\`typescript\npublic isolateModel(models: any): void\n\\`\\`\\`\n\n**功能**: 隔离模型(只显示指定模型,隐藏其他)\n\n**参数**:\n- \\`models\\`: 要显示的模型数组\n\n##### showAllModels()\n\n\\`\\`\\`typescript\npublic showAllModels(): void\n\\`\\`\\`\n\n**功能**: 显示所有模型\n\n##### getModelsBox()\n\n\\`\\`\\`typescript\npublic getModelsBox(models: any): THREE.Box3\n\\`\\`\\`\n\n**功能**: 获取模型的包围盒\n\n**参数**:\n- \\`models\\`: 模型数组\n\n**返回值**: THREE.Box3 包围盒对象\n\n---\n\n## 3. 功能管理器\n\n### 3.1 ViewCube - 视图立方体\n\n**文件路径**: \\`src/core/v2/managers/viewCube/index.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic cubeTool: any // 视图立方体工具\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化视图立方体\n- 创建 3D 小立方体辅助视图\n- 支持六个面和边角视图切换\n\n##### CameraGoHome()\n\n\\`\\`\\`typescript\npublic CameraGoHome(): void\n\\`\\`\\`\n\n**功能**: 相机回归正位(默认视角)\n\n##### zoomToModel()\n\n\\`\\`\\`typescript\npublic zoomToModel(box: THREE.Box3): void\n\\`\\`\\`\n\n**功能**: 缩放到指定模型包围盒\n\n**参数**:\n- \\`box\\`: THREE.Box3 - 目标包围盒\n\n---\n\n### 3.2 RangeScale - 范围缩放工具\n\n**文件路径**: \\`src/core/v2/managers/rangeScale/index.ts\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化范围缩放工具\n- 创建绘制框 UI 元素\n- 初始化坐标转换工具\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活范围缩放工具\n- 禁用控制器\n- 启用框选功能\n- 鼠标变为十字光标\n\n**使用方式**:\n1. 激活工具\n2. 鼠标拖拽绘制矩形区域\n3. 松开鼠标自动缩放到该区域\n4. 按 ESC 键退出\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 停用范围缩放工具\n- 恢复控制器\n- 移除事件监听\n\n---\n\n### 3.3 Setting - 设置管理器\n\n**文件路径**: \\`src/core/v2/managers/setting/index.ts\\`\n\n#### 公共方法\n\n##### setStatsVisible()\n\n\\`\\`\\`typescript\npublic setStatsVisible(visible: boolean): void\n\\`\\`\\`\n\n**功能**: 显示/隐藏性能监视器\n\n**参数**:\n- \\`visible\\`: true 显示,false 隐藏\n\n##### setAmbientLightIntensity()\n\n\\`\\`\\`typescript\npublic setAmbientLightIntensity(intensity: number): void\n\\`\\`\\`\n\n**功能**: 设置环境光照强度\n\n**参数**:\n- \\`intensity\\`: 光照强度,范围 0-5\n\n##### setAmbientLightColor()\n\n\\`\\`\\`typescript\npublic setAmbientLightColor(color: number | string): void\n\\`\\`\\`\n\n**功能**: 设置环境光照颜色\n\n**参数**:\n- \\`color\\`: 颜色(0xffffff 或 '#ffffff')\n\n##### setDirectionalLightIntensity()\n\n\\`\\`\\`typescript\npublic setDirectionalLightIntensity(intensity: number): void\n\\`\\`\\`\n\n**功能**: 设置定向光源强度\n\n**参数**:\n- \\`intensity\\`: 光照强度,范围 0-5\n\n##### setDirectionalLightColor()\n\n\\`\\`\\`typescript\npublic setDirectionalLightColor(color: number | string): void\n\\`\\`\\`\n\n**功能**: 设置定向光源颜色\n\n**参数**:\n- \\`color\\`: 颜色\n\n##### setShadowQuality()\n\n\\`\\`\\`typescript\npublic setShadowQuality(quality: 'low' | 'medium' | 'high' | 'ultra'): void\n\\`\\`\\`\n\n**功能**: 设置阴影精细度\n\n**参数**:\n- \\`quality\\`: 质量等级\n - 'low': 1024\n - 'medium': 2048\n - 'high': 4096\n - 'ultra': 8192\n\n##### setDirectionalLightShadow()\n\n\\`\\`\\`typescript\npublic setDirectionalLightShadow(enabled: boolean): void\n\\`\\`\\`\n\n**功能**: 开启/关闭定向光阴影\n\n**参数**:\n- \\`enabled\\`: true 开启,false 关闭\n\n##### setGTAOEnabled()\n\n\\`\\`\\`typescript\npublic setGTAOEnabled(enabled: boolean): void\n\\`\\`\\`\n\n**功能**: 开启/关闭 GTAO 环境光遮蔽\n\n**参数**:\n- \\`enabled\\`: true 开启,false 关闭\n\n##### setSceneSaturation()\n\n\\`\\`\\`typescript\npublic setSceneSaturation(saturation: number): void\n\\`\\`\\`\n\n**功能**: 设置场景饱和度\n\n**参数**:\n- \\`saturation\\`: 饱和度值,1.0 为正常,推荐范围 0.5-2.0\n\n##### setSceneContrast()\n\n\\`\\`\\`typescript\npublic setSceneContrast(contrast: number): void\n\\`\\`\\`\n\n**功能**: 设置场景对比度\n\n**参数**:\n- \\`contrast\\`: 对比度值,1.0 为正常,推荐范围 0.5-2.0\n\n##### setGroundEnabled()\n\n\\`\\`\\`typescript\npublic setGroundEnabled(enabled: boolean, options?: {\n size?: number;\n color?: number | string;\n opacity?: number;\n}): void\n\\`\\`\\`\n\n**功能**: 开启/关闭地面\n\n**参数**:\n- \\`enabled\\`: true 开启,false 关闭\n- \\`options\\`: 地面配置选项\n - \\`size\\`: 地面大小(默认 100)\n - \\`color\\`: 地面颜色(默认 0x808080)\n - \\`opacity\\`: 透明度(默认 0.3)\n\n##### setHDRBackground()\n\n\\`\\`\\`typescript\npublic setHDRBackground(hdrTexture: THREE.Texture | null): void\n\\`\\`\\`\n\n**功能**: 设置 HDR 背景\n\n**参数**:\n- \\`hdrTexture\\`: HDR 环境贴图,null 则移除\n\n---\n\n### 3.4 Measure - 测量工具\n\n**文件路径**: \\`src/core/v2/managers/measure/index.ts\\`\n\n#### 公共方法\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活测量工具\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 停用测量工具\n- 清除所有测量\n- 恢复点选功能\n\n##### clearAllPoints()\n\n\\`\\`\\`typescript\npublic clearAllPoints(): void\n\\`\\`\\`\n\n**功能**: 清空所有测量点\n\n##### clearAll()\n\n\\`\\`\\`typescript\npublic clearAll(): void\n\\`\\`\\`\n\n**功能**: 清除所有测量标注\n\n##### update()\n\n\\`\\`\\`typescript\nupdate(): void\n\\`\\`\\`\n\n**功能**: 更新测量标注\n- 在渲染循环中调用\n- 更新屏幕坐标\n\n**测量类型**:\n- 距离测量(DistanceMeasure)\n- 净高测量(ClearHeightMeasure)\n- 净距测量(ClearDistanceMeasure)\n- 标高测量(ElevationMeasure)\n- 点测量(PointMeasure)\n- 角度测量(AngleMeasure)\n- 面积测量(AreaMeasure)\n- 坡度测量(SlopeMeasure)\n\n---\n\n### 3.5 Clipping - 剖切管理器\n\n**文件路径**: \\`src/core/v2/managers/clipping/index.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic sectionPlaneX: any // X 轴剖切平面\npublic sectionPlaneY: any // Y 轴剖切平面\npublic sectionPlaneZ: any // Z 轴剖切平面\npublic sectionBox: any // 剖切盒\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化剖切管理器\n- 创建 6 个剖切平面(前、后、左、右、顶、底)\n- 初始化 X/Y/Z 轴剖切工具\n- 初始化剖切盒工具\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 停用所有剖切工具\n\n---\n\n### 3.6 ModelTree - 模型树\n\n**文件路径**: \\`src/core/v2/managers/modelTree/index.ts\\`\n\n#### 公共方法\n\n##### getTreeData()\n\n\\`\\`\\`typescript\npublic getTreeData(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型树数据\n\n**返回值**: 模型树数组\n\\`\\`\\`typescript\n[{\n name: string, // 模型名称\n children: any[] // 模型层级树\n}]\n\\`\\`\\`\n\n---\n\n### 3.7 EngineInfo - 引擎信息统计\n\n**文件路径**: \\`src/core/v2/managers/engineInfo/index.ts\\`\n\n#### 公共方法\n\n##### getEngineInfo()\n\n\\`\\`\\`typescript\npublic getEngineInfo(): {\n totalVertices: number;\n totalTriangles: number;\n meshCount: number;\n}\n\\`\\`\\`\n\n**功能**: 获取引擎统计信息\n- 统计所有网格的顶点数\n- 统计所有网格的三角面数\n- 统计网格数量\n\n**返回值**:\n- \\`totalVertices\\`: 总顶点数\n- \\`totalTriangles\\`: 总三角面数\n- \\`meshCount\\`: 网格数量\n\n---\n\n### 3.8 ModelProperties - 模型属性\n\n**文件路径**: \\`src/core/v2/managers/modelProperties/index.ts\\`\n\n#### 公共方法\n\n##### getModelProperties()\n\n\\`\\`\\`typescript\npublic getModelProperties(url: string, id: string, callback: (properties: any) => void): void\n\\`\\`\\`\n\n**功能**: 查询构件属性\n- 异步加载属性数据(如果未加载)\n- 从压缩的 JSON 中解析属性\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n- \\`callback\\`: 回调函数,接收属性对象\n\n**返回值格式**:\n\\`\\`\\`typescript\n{\n properties: [{\n name: string, // 分类名称\n children: [{\n name: string, // 属性名\n value: any // 属性值\n }]\n }],\n materials: []\n}\n\\`\\`\\`\n\n---\n\n### 3.9 ModelMapperBatch - 模型批量映射\n\n**文件路径**: \\`src/core/v2/managers/modelMapperBatch/index.ts\\`\n\n#### 公共方法\n\n##### getModelTypes()\n\n\\`\\`\\`typescript\npublic getModelTypes(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型中所有的构件类型\n\n##### getModelMajors()\n\n\\`\\`\\`typescript\npublic getModelMajors(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型中所有的专业\n\n##### getModelLevels()\n\n\\`\\`\\`typescript\npublic getModelLevels(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型中所有的楼层\n\n##### getModelMapper()\n\n\\`\\`\\`typescript\npublic getModelMapper(url: string, id: number): any\n\\`\\`\\`\n\n**功能**: 获取指定构件的映射信息\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n**返回值**: Mapper 对象(包含类型、专业、楼层等信息)\n\n##### getModelSWithType()\n\n\\`\\`\\`typescript\npublic getModelSWithType(type: string, callback: any): any[]\n\\`\\`\\`\n\n**功能**: 获取同类型的所有构件\n\n**参数**:\n- \\`type\\`: 构件类型名称\n- \\`callback\\`: 回调函数\n\n**返回值**: \\`[{url: string, ids: number[]}]\\`\n\n##### getModelSWithLevel()\n\n\\`\\`\\`typescript\npublic getModelSWithLevel(level: string, callback: any): any[]\n\\`\\`\\`\n\n**功能**: 获取同楼层的所有构件\n\n**参数**:\n- \\`level\\`: 楼层名称\n- \\`callback\\`: 回调函数\n\n**返回值**: \\`[{url: string, ids: number[]}]\\`\n\n##### getModelsWithMajor()\n\n\\`\\`\\`typescript\npublic getModelsWithMajor(major: string, callback: any): any[]\n\\`\\`\\`\n\n**功能**: 获取同专业的所有构件\n\n**参数**:\n- \\`major\\`: 专业名称\n- \\`callback\\`: 回调函数\n\n**返回值**: \\`[{url: string, ids: number[]}]\\`\n\n---\n\n### 3.10 ModelEdge - 模型边线管理器\n\n**文件路径**: \\`src/core/v2/managers/modelEdge/index.ts\\`\n\n#### 公共方法\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 启动边线显示\n- 显示所有模型的边线\n- 用于技术制图风格渲染\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 关闭边线显示\n\n##### getModelEdge()\n\n\\`\\`\\`typescript\npublic getModelEdge(url: string, id: Number): any\n\\`\\`\\`\n\n**功能**: 获取指定模型的边线数据\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n**返回值**: 边线数据 \\`[startIndex, endIndex, points]\\`\n\n##### hideModelEdge()\n\n\\`\\`\\`typescript\npublic hideModelEdge(url: string, id: Number): void\n\\`\\`\\`\n\n**功能**: 隐藏指定构件的边线\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n##### showModelEdge()\n\n\\`\\`\\`typescript\npublic showModelEdge(url: string, id: Number): void\n\\`\\`\\`\n\n**功能**: 显示指定构件的边线\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n---\n\n## 4. 状态管理\n\n### 4.1 EngineStatus - 引擎状态\n\n**文件路径**: \\`src/core/v2/status/engineStatus.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic isFree: boolean // 引擎是否空闲\npublic highlightModels: any[] // 高亮的模型数组\npublic hideModels: any[] // 隐藏的模型数组\npublic models: any[] // 已加载的模型数组\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化引擎状态监听\n- 监听 \\`EventType.EngineFree\\` 事件\n- 监听 \\`EventType.EngineBusy\\` 事件\n\n##### updateFree()\n\n\\`\\`\\`typescript\npublic updateFree(status: boolean): void\n\\`\\`\\`\n\n**功能**: 更新引擎空闲状态\n\n**参数**:\n- \\`status\\`: true 表示空闲,false 表示繁忙\n\n##### closeAllFunction()\n\n\\`\\`\\`typescript\npublic closeAllFunction(): void\n\\`\\`\\`\n\n**功能**: 关闭所有功能\n\n---\n\n### 4.2 HandelBehaved - 行为处理器\n\n**文件路径**: \\`src/core/v2/status/handelBehaved.ts\\`\n\n这是一个工厂函数,返回行为处理器对象。\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\ninit(self: any, options: any): void\n\\`\\`\\`\n\n**功能**: 初始化行为处理器\n\n**参数**:\n- \\`self\\`: 当前激活的行为对象\n- \\`options\\`: 行为配置选项\n - \\`showCatch\\`: boolean - 是否显示捕捉点\n\n##### active()\n\n\\`\\`\\`typescript\nactive(): void\n\\`\\`\\`\n\n**功能**: 开启事务(激活事件监听)\n- 监听鼠标事件(mousedown, mouseup, mousemove)\n- 监听键盘事件(keydown, keyup)\n\n##### disActive()\n\n\\`\\`\\`typescript\ndisActive(): void\n\\`\\`\\`\n\n**功能**: 关闭事务(禁用事件监听)\n\n**支持的键盘事件**:\n- Delete / Backspace - 删除\n- Escape - 取消\n- Enter - 确认\n- Space - 空格\n- Ctrl / Control - 控制键\n- Shift - 切换键\n- Alt - 辅助键\n- Meta / Command - 命令键\n\n**支持的鼠标事件**:\n- handleMouseDown - 鼠标按下\n- handleMouseMove - 鼠标移动\n- handleMouseUp - 鼠标弹起\n- handleMouseClick - 鼠标单击\n- handleMouseDoubleClick - 鼠标双击\n\n**捕捉功能**:\n- 点捕捉(距离 < 5 像素)\n- 线捕捉(距离 < 5 像素)\n- 面捕捉(默认)\n\n---\n\n## 使用示例\n\n### 初始化引擎\n\n\\`\\`\\`typescript\nimport { EngineKernelV2 } from './src/core/v2/EngineKernel';\n\nconst engine = new EngineKernelV2({\n containerId: 'canvas-container',\n antialias: true\n});\n\\`\\`\\`\n\n### 加载模型\n\n\\`\\`\\`typescript\nawait engine.loaderModule.loadModels([\n 'https://example.com/model1.light',\n 'https://example.com/model2.light'\n]);\n\\`\\`\\`\n\n### 高亮模型\n\n\\`\\`\\`typescript\nengine.modelToolModule.highlightModel([\n { url: 'model1.light', ids: ['wall-001', 'wall-002'] }\n]);\n\\`\\`\\`\n\n### 切换相机\n\n\\`\\`\\`typescript\n// 切换到正交相机\nengine.cameraModule.switchToOrthographicCamera();\n\n// 或切换当前相机类型\nengine.cameraModule.switchCurrentCamera();\n\\`\\`\\`\n\n### 保存和恢复相机姿态\n\n\\`\\`\\`typescript\n// 保存当前相机姿态\nconst pose = engine.cameraModule.getCameraPose();\n\n// 恢复相机姿态\nengine.cameraModule.restoreCameraPose(pose);\n\\`\\`\\`\n\n### 设置光照和渲染质量\n\n\\`\\`\\`typescript\n// 设置环境光强度\nengine.setting.setAmbientLightIntensity(1.5);\n\n// 设置阴影质量\nengine.setting.setShadowQuality('ultra');\n\n// 开启 GTAO\nengine.setting.setGTAOEnabled(true);\n\n// 调整饱和度和对比度\nengine.setting.setSceneSaturation(1.3);\nengine.setting.setSceneContrast(1.1);\n\\`\\`\\`\n\n### 获取模型属性\n\n\\`\\`\\`typescript\nengine.modelProperties.getModelProperties('model.light', 'wall-001', (data) => {\n console.log('属性:', data.properties);\n});\n\\`\\`\\`\n\n### 按类型筛选构件\n\n\\`\\`\\`typescript\nengine.modelMapperBatch.getModelSWithType('墙', (models) => {\n // 高亮所有墙体\n engine.modelToolModule.highlightModel(models);\n});\n\\`\\`\\`\n\n### 监听事件\n\n\\`\\`\\`typescript\n// 监听点击事件\nengine.events.on(EventType.Click, (hit) => {\n console.log('点击了:', hit.object.name);\n});\n\n// 监听视口大小改变\nengine.events.on(EventType.ViewportResize, ({ width, height }) => {\n console.log('视口大小:', width, height);\n});\n\\`\\`\\`\n\n### 暂停和恢复渲染\n\n\\`\\`\\`typescript\n// 暂停渲染(节省性能)\nengine.pauseRendering();\n\n// 恢复渲染\nengine.resumeRendering();\n\n// 检查渲染状态\nif (engine.isRenderingPausedState()) {\n console.log('渲染已暂停');\n}\n\\`\\`\\`\n\n### 销毁引擎\n\n\\`\\`\\`typescript\n// 释放所有资源\nengine.dispose();\n\\`\\`\\`\n\n---\n\n## 总结\n\nBIM Engine SDK 提供了完整的 3D BIM 模型渲染和交互能力,主要特性包括:\n\n- **完整的相机系统**: 支持透视和正交相机,可保存和恢复相机姿态\n- **强大的模型操作**: 高亮、隐藏、隔离、批量筛选\n- **丰富的测量工具**: 距离、净高、净距、标高、角度、面积、坡度\n- **灵活的剖切功能**: 支持 X/Y/Z 轴剖切和剖切盒\n- **可配置的渲染质量**: 阴影、环境光遮蔽、饱和度、对比度\n- **事件驱动架构**: 支持自定义事件监听和触发\n- **性能优化**: 支持暂停/恢复渲染,八叉树加速\n- **完善的资源管理**: 自动释放几何体、材质、纹理等资源\n\n适用场景:\n- BIM 模型在线浏览\n- 建筑设计审查\n- 施工模拟\n- 运维管理\n- AI 辅助设计\n`;\nexport {\n n as default\n};\n//# sourceMappingURL=API文档-B1v8UcRF.mjs.map\n"],"names":["zhCN","enUS","LocaleManager","locale","key","keys","value","k","listener","l","localeManager","t","lightTheme","darkTheme","ThemeManager","themeName","theme","themeManager","BimButtonGroup","options","el","event","payload","stopPropagation","e","eventType","pos","style","margin","dropdown","dropdownStyle","color","themeColors","colorKey","colors","groupId","beforeGroupId","g","newGroup","index","config","parentId","group","button","parentBtn","buttons","id","btn","found","groupElement","total","groupEl","btnWrapper","wrapper","btnEl","iconSize","minWidth","icon","textWrapper","label","active","newState","siblings","sib","btnRect","expand","currentTheme","subBtn","item","dropdownRect","arrow","buttonId","visible","show","type","Toolbar","registry","createHomeButton","index$d","createZoomBoxButton","index$c","createWalkMenuButton","index$b","createMapButton","index$a","createPropertyButton","index$9","createSettingButton","index$8","createInfoButton","index$7","createFullscreenButton","index$6","createMeasureButton","index$5","createSectionMenuButton","index$4","createSectionPlaneButton","index$3","createSectionAxisButton","index$2","createSectionBoxButton","index$1","createAiChatButton","BaseManager","handler","unsubscribe","unsub","ToolbarManager","container","v","ButtonGroupManager","BimDialog","titleEl","header","title","closeBtn","content","resizeHandle","width","height","recenter","naturalHeight","minHeight","containerHeight","targetHeight","containerW","containerH","elW","elH","bottomOffset","currentLeft","currentTop","maxLeft","maxTop","nextLeft","nextTop","elRect","left","top","pW","pH","startX","startY","startLeft","startTop","onMouseDown","onMouseMove","onMouseUp","dx","dy","newLeft","newTop","handle","startW","startH","newW","newH","DialogManager","dialog","d","REVISION","MOUSE","TOUCH","CullFaceNone","CullFaceBack","CullFaceFront","PCFShadowMap","PCFSoftShadowMap","VSMShadowMap","FrontSide","BackSide","DoubleSide","NoBlending","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","CustomBlending","AddEquation","SubtractEquation","ReverseSubtractEquation","MinEquation","MaxEquation","ZeroFactor","OneFactor","SrcColorFactor","OneMinusSrcColorFactor","SrcAlphaFactor","OneMinusSrcAlphaFactor","DstAlphaFactor","OneMinusDstAlphaFactor","DstColorFactor","OneMinusDstColorFactor","SrcAlphaSaturateFactor","ConstantColorFactor","OneMinusConstantColorFactor","ConstantAlphaFactor","OneMinusConstantAlphaFactor","NeverDepth","AlwaysDepth","LessDepth","LessEqualDepth","EqualDepth","GreaterEqualDepth","GreaterDepth","NotEqualDepth","MultiplyOperation","MixOperation","AddOperation","NoToneMapping","LinearToneMapping","ReinhardToneMapping","CineonToneMapping","ACESFilmicToneMapping","CustomToneMapping","AgXToneMapping","NeutralToneMapping","AttachedBindMode","DetachedBindMode","UVMapping","CubeReflectionMapping","CubeRefractionMapping","EquirectangularReflectionMapping","EquirectangularRefractionMapping","CubeUVReflectionMapping","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipmapNearestFilter","NearestMipmapLinearFilter","LinearFilter","LinearMipmapNearestFilter","LinearMipmapLinearFilter","UnsignedByteType","ByteType","ShortType","UnsignedShortType","IntType","UnsignedIntType","FloatType","HalfFloatType","UnsignedShort4444Type","UnsignedShort5551Type","UnsignedInt248Type","UnsignedInt5999Type","UnsignedInt101111Type","AlphaFormat","RGBFormat","RGBAFormat","DepthFormat","DepthStencilFormat","RedFormat","RedIntegerFormat","RGFormat","RGIntegerFormat","RGBAIntegerFormat","RGB_S3TC_DXT1_Format","RGBA_S3TC_DXT1_Format","RGBA_S3TC_DXT3_Format","RGBA_S3TC_DXT5_Format","RGB_PVRTC_4BPPV1_Format","RGB_PVRTC_2BPPV1_Format","RGBA_PVRTC_4BPPV1_Format","RGBA_PVRTC_2BPPV1_Format","RGB_ETC1_Format","RGB_ETC2_Format","RGBA_ETC2_EAC_Format","RGBA_ASTC_4x4_Format","RGBA_ASTC_5x4_Format","RGBA_ASTC_5x5_Format","RGBA_ASTC_6x5_Format","RGBA_ASTC_6x6_Format","RGBA_ASTC_8x5_Format","RGBA_ASTC_8x6_Format","RGBA_ASTC_8x8_Format","RGBA_ASTC_10x5_Format","RGBA_ASTC_10x6_Format","RGBA_ASTC_10x8_Format","RGBA_ASTC_10x10_Format","RGBA_ASTC_12x10_Format","RGBA_ASTC_12x12_Format","RGBA_BPTC_Format","RGB_BPTC_SIGNED_Format","RGB_BPTC_UNSIGNED_Format","RED_RGTC1_Format","SIGNED_RED_RGTC1_Format","RED_GREEN_RGTC2_Format","SIGNED_RED_GREEN_RGTC2_Format","InterpolateDiscrete","InterpolateLinear","InterpolateSmooth","ZeroCurvatureEnding","ZeroSlopeEnding","WrapAroundEnding","NormalAnimationBlendMode","TrianglesDrawMode","TriangleStripDrawMode","TriangleFanDrawMode","BasicDepthPacking","RGBADepthPacking","TangentSpaceNormalMap","ObjectSpaceNormalMap","NoColorSpace","SRGBColorSpace","LinearSRGBColorSpace","LinearTransfer","SRGBTransfer","KeepStencilOp","AlwaysStencilFunc","NeverCompare","LessCompare","EqualCompare","LessEqualCompare","GreaterCompare","NotEqualCompare","GreaterEqualCompare","AlwaysCompare","StaticDrawUsage","GLSL3","WebGLCoordinateSystem","WebGPUCoordinateSystem","arrayNeedsUint32","array","i","createElementNS","name","createCanvasElement","canvas","_cache","log","params","message","warn","error","warnOnce","probeAsync","gl","sync","interval","resolve","reject","probe","EventDispatcher","listeners","listenerArray","_lut","_seed","DEG2RAD","RAD2DEG","generateUUID","d0","d1","d2","d3","clamp","min","max","euclideanModulo","n","m","mapLinear","x","a1","a2","b1","b2","inverseLerp","y","lerp","damp","lambda","dt","pingpong","length","smoothstep","smootherstep","randInt","low","high","randFloat","randFloatSpread","range","seededRandom","degToRad","degrees","radToDeg","radians","isPowerOfTwo","ceilPowerOfTwo","floorPowerOfTwo","setQuaternionFromProperEuler","q","a","b","c","order","cos","sin","c2","s2","c13","s13","c1_3","s1_3","c3_1","s3_1","denormalize","normalize","MathUtils","Vector2","scalar","s","minVal","maxVal","denominator","theta","alpha","v1","v2","offset","attribute","center","angle","Quaternion","z","w","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","dot","f","quaternion","euler","update","c1","c3","s1","s3","axis","halfAngle","te","m11","m12","m13","m21","m22","m23","m31","m32","m33","trace","vFrom","vTo","r","step","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","qb","qa","theta1","theta2","r1","r2","callback","Vector3","_quaternion$4","vx","vy","vz","qx","qy","qz","qw","tx","ty","tz","camera","ax","ay","az","bx","by","bz","planeNormal","_vector$c","normal","dz","radius","phi","sinPhiRadius","sx","sy","sz","u","Matrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","me","xAxis","yAxis","zAxis","ae","be","a11","a12","a13","a21","a22","a23","a31","a32","a33","b11","b12","b13","b21","b22","b23","b31","b32","b33","h","t11","t12","t13","det","detInv","tmp","matrix4","rotation","cx","cy","_m3","matrix","LINEAR_REC709_TO_XYZ","XYZ_TO_LINEAR_REC709","createColorManagement","ColorManagement","sourceColorSpace","targetColorSpace","SRGBToLinear","LinearToSRGB","colorSpace","target","colorSpaces","targetMatrix","REC709_PRIMARIES","REC709_LUMINANCE_COEFFICIENTS","D65","_canvas","ImageUtils","image","context","imageData","data","_sourceId","Source","meta","isRootObject","output","url","serializeImage","_textureId","_tempVec3","Texture","mapping","wrapS","wrapT","magFilter","minFilter","format","anisotropy","start","count","source","values","newValue","currentValue","uv","Vector4","xx","yy","zz","xy","xz","yz","RenderTarget","texture","current","depth","il","WebGLRenderTarget","DataArrayTexture","layerIndex","Data3DTexture","Box3","_vector$b","points","size","halfSize","object","precise","box","point","vector","geometry","positionAttribute","_box$4","children","sphere","plane","triangle","_center","_extents","_v0$2","_v1$7","_v2$4","_f0","_f1","_f2","axes","satForAxes","_triangleNormal","_points","json","_testAxis","v0","extents","j","p0","p1","p2","_box$3","_v1$6","_v2$3","Sphere","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","lengthSq","delta","_vector$a","_segCenter","_segDir","_diff","_edge1","_edge2","_normal$1","Ray","origin","direction","ray","directionDistance","optionalPointOnRay","optionalPointOnSegment","segExtent","a01","b0","s0","sqrDist","extDet","invDet","tca","radius2","thc","t0","t1","distToPoint","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","backfaceCulling","DdN","sign","DdQxE2","DdE1xQ","QdN","Matrix4","n14","n24","n34","n41","n42","n43","n44","scaleX","_v1$5","scaleY","scaleZ","af","bf","ce","cf","de","df","ac","ad","bc","bd","_zero","_one","eye","up","_z","_x","_y","a14","a24","a34","a41","a42","a43","a44","b14","b24","b34","b41","b42","b43","b44","t14","scaleXSq","scaleYSq","scaleZSq","yx","zx","zy","position","scale","x2","y2","z2","wx","wy","wz","_m1$2","invSX","invSY","invSZ","right","bottom","near","far","coordinateSystem","reversedDepth","_matrix$2","_quaternion$3","Euler","newOrder","Layers","layer","layers","_object3DId","_v1$4","_q1","_m1$1","_target","_position$3","_scale$2","_quaternion$2","_xAxis","_yAxis","_zAxis","_addedEvent","_removedEvent","_childaddedEvent","_childremovedEvent","Object3D","onRotationChange","onQuaternionChange","distance","parent","result","force","updateParents","updateChildren","info","serialize","library","element","parameters","shapes","shape","uuids","animation","geometries","extractFromCache","materials","textures","images","skeletons","animations","nodes","cache","recursive","child","_v0$1","_v1$3","_v2$2","_v3$2","_vab","_vac","_vbc","_vap","_vbp","_vcp","_v40","_v41","_v42","Triangle","targetLengthSq","dot00","dot01","dot02","dot11","dot12","denom","invDenom","p3","v3","attr","i1","i2","i3","barycoord","i0","p","d4","vc","d5","d6","vb","va","_colorKeywords","_hslA","_hslB","hue2rgb","Color","hex","handleAlpha","string","components","_color","hue","saturation","lightness","color1","color2","_materialId","Material","srcPlanes","dstPlanes","MeshBasicMaterial","_tables","_generateTables","buffer","floatView","uint32View","baseTable","shiftTable","mantissaTable","exponentTable","offsetTable","toHalfFloat","val","fromHalfFloat","DataUtils","_vector$9","_vector2$1","_id$2","BufferAttribute","itemSize","normalized","index1","index2","component","Uint16BufferAttribute","Uint32BufferAttribute","Float32BufferAttribute","_id$1","_m1","_obj","_offset","_box$2","_boxMorphTargets","_vector$8","BufferGeometry","indirect","materialIndex","normalMatrix","tangent","morphAttributesPosition","morphAttribute","morphTargetsRelative","jl","attributes","normalAttribute","uvAttribute","tangentAttribute","tan1","tan2","vA","vB","vC","uvA","uvB","uvC","sdir","tdir","handleTriangle","groups","tmp2","n2","handleVertex","pA","pB","pC","nA","nB","nC","cb","ab","normals","convertBufferAttribute","indices","array2","geometry2","newAttribute","morphAttributes","morphArray","hasMorphAttributes","attributeArray","boundingSphere","boundingBox","_inverseMatrix$3","_ray$3","_sphere$6","_sphereHitAt","_vA$1","_vB$1","_vC$1","_tempA","_morphA","_intersectionPoint","_intersectionPointWorld","Mesh","material","ml","morphPosition","morphInfluences","influence","raycaster","intersects","matrixWorld","rayLocalSpace","intersection","uv1","drawRange","groupMaterial","end","checkGeometryIntersection","checkIntersection$1","intersect","face","BoxGeometry","widthSegments","heightSegments","depthSegments","scope","vertices","uvs","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","iy","ix","cloneUniforms","src","property","mergeUniforms","uniforms","merged","cloneUniformsGroups","getUnlitUniformColorSpace","renderer","currentRenderTarget","UniformsUtils","default_vertex","default_fragment","ShaderMaterial","extensions","Camera","_v3$1","_minTarget","_maxTarget","PerspectiveCamera","fov","aspect","focalLength","vExtentSlope","minTarget","maxTarget","fullWidth","fullHeight","view","skew","CubeCamera","renderTarget","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","cameras","scene","activeMipmapLevel","currentActiveCubeFace","currentActiveMipmapLevel","currentXrEnabled","generateMipmaps","CubeTexture","WebGLCubeRenderTarget","shader","mesh","currentMinFilter","stencil","Group","_moveEvent","WebXRController","inputSource","hand","inputjoint","frame","referenceSpace","inputPose","gripPose","handPose","targetRay","grip","jointPose","joint","indexTip","thumbTip","distanceToPinch","threshold","Scene","InterleavedBuffer","stride","interleavedBuffer","ib","_vector$7","InterleavedBufferAttribute","SpriteMaterial","_geometry","_intersectPoint","_worldScale","_mvPosition","_alignedPosition","_rotatedPosition","_viewWorldMatrix","_vA","_vB","_vC","_uvA","_uvB","_uvC","Sprite","float32Array","transformVertex","vertexPosition","mvPosition","_basePosition","_skinIndex","_skinWeight","_vector3","_matrix4","_vertex","_sphere$5","_inverseMatrix$2","_ray$2","SkinnedMesh","skeleton","bindMatrix","skinWeight","weight","boneIndex","Bone","DataTexture","_offsetMatrix","_identityMatrix","Skeleton","bones","boneInverses","inverse","bone","boneMatrices","boneTexture","uuid","boneInverse","InstancedBufferAttribute","meshPerAttribute","_instanceLocalMatrix","_instanceWorldMatrix","_instanceIntersects","_box3","_identity","_mesh$1","_sphere$4","InstancedMesh","objectInfluences","len","dataIndex","raycastTimes","instanceId","morphInfluencesSum","morphBaseInfluence","_vector1","_vector2","_normalMatrix","Plane","constant","inverseNormalLength","line","startSign","endSign","optionalNormalMatrix","referencePoint","_sphere$3","_defaultSpriteCenter","_vector$6","Frustum","p4","p5","planes","frustum","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","sprite","negRadius","LineBasicMaterial","_vStart","_vEnd","_inverseMatrix$1","_ray$1","_sphere$1","_intersectPointOnRay","_intersectPointOnSegment","Line","lineDistances","localThreshold","localThresholdSq","checkIntersection","thresholdSq","_start","_end","LineSegments","LineLoop","PointsMaterial","_inverseMatrix","_ray","_sphere","_position$2","Points","testPoint","rayPointDistanceSq","intersectPoint","CanvasTexture","DepthTexture","ExternalTexture","sourceTexture","Curve","optionalTarget","divisions","lengths","last","sum","arcLengths","targetArcLength","comparison","lengthBefore","segmentLength","segmentFraction","t2","pt1","pt2","segments","closed","tangents","binormals","vec","mat","EllipseCurve","aX","aY","xRadius","yRadius","aStartAngle","aEndAngle","aClockwise","aRotation","twoPi","deltaAngle","samePoints","ArcCurve","aRadius","CubicPoly","c0","init","x3","tension","dt0","dt1","dt2","t3","px","py","pz","CatmullRomCurve3","curveType","intPoint","pow","CatmullRom","QuadraticBezierP0","QuadraticBezierP1","QuadraticBezierP2","QuadraticBezier","CubicBezierP0","CubicBezierP1","CubicBezierP2","CubicBezierP3","CubicBezier","CubicBezierCurve","CubicBezierCurve3","LineCurve","LineCurve3","QuadraticBezierCurve","QuadraticBezierCurve3","SplineCurve","Curves","CurvePath","curve","startPoint","endPoint","lineType","curveLengths","diff","lens","sums","curves","resolution","pts","Path","aCPx","aCPy","aCP1x","aCP1y","aCP2x","aCP2y","npts","firstPoint","lastPoint","Shape","holesPts","hole","earcut","holeIndices","dim","hasHoles","outerLen","outerNode","linkedList","triangles","minX","minY","invSize","eliminateHoles","maxX","maxY","earcutLinked","clockwise","signedArea","insertNode","equals","removeNode","filterPoints","again","area","ear","pass","indexCurve","stop","prev","next","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangleExceptFirst","minZ","zOrder","maxZ","locallyInside","isValidDiagonal","splitPolygon","queue","list","getLeftmost","compareXYSlope","eliminateHole","aSlope","bSlope","bridge","findHoleBridge","bridgeReverse","hx","hy","mx","my","tanMin","pointInTriangle","tan","sectorContainsSector","sortLinked","numMerges","inSize","tail","pSize","qSize","leftmost","intersectsPolygon","middleInside","q1","q2","o1","o2","o3","o4","onSegment","num","inside","createNode","an","bp","Earcut","ShapeUtils","contour","holes","faces","removeDupEndPts","addContour","holeIndex","ExtrudeGeometry","verticesArray","uvArray","addShape","placeholder","curveSegments","steps","bevelEnabled","bevelThickness","bevelSize","bevelOffset","bevelSegments","extrudePath","uvgen","WorldUVGenerator","extrudePts","extrudeByPath","splineTube","binormal","position2","shapePoints","hl","ahole","mergeOverlappingPoints","THRESHOLD_SQ","prevPos","currentIndex","currentPos","distSq","scalingFactorSqrt","thresholdSqScaled","numHoles","scalePt2","pt","vlen","getBevelVec","inPt","inPrev","inNext","v_trans_x","v_trans_y","shrink_by","v_prev_x","v_prev_y","v_next_x","v_next_y","v_prev_lensq","collinear0","v_prev_len","v_next_len","ptPrevShift_x","ptPrevShift_y","ptNextShift_x","ptNextShift_y","sf","v_trans_lensq","direction_eq","contourMovements","holesMovements","oneHoleMovements","verticesMovements","contractedContourVertices","expandedHoleVertices","bs","vert","oneHoleVertices","flen","buildLidFaces","buildSideFaces","f3","layeroffset","sidewalls","sl","slen1","slen2","f4","addVertex","nextIndex","addUV","vector2","toJSON$1","geometryShapes","indexA","indexB","indexC","a_x","a_y","b_x","b_y","c_x","c_y","indexD","a_z","b_z","c_z","d_x","d_y","d_z","PlaneGeometry","width_half","height_half","segment_width","segment_height","SphereGeometry","phiStart","phiLength","thetaStart","thetaLength","thetaEnd","grid","vertex","verticesRow","uOffset","RawShaderMaterial","MeshStandardMaterial","MeshPhysicalMaterial","reflectivity","MeshNormalMaterial","MeshLambertMaterial","MeshDepthMaterial","MeshDistanceMaterial","convertArray","isTypedArray","getKeyframeOrder","times","compareTime","sortedArray","nValues","srcOffset","flattenJSON","jsonKeys","valuePropertyName","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","pp","validate_interval","seek","linear_scan","forward_scan","giveUpAt","t1global","mid","CubicInterpolant","iPrev","iNext","tPrev","tNext","halfDt","o0","oP","oN","wP","wN","ppp","sP","sN","LinearInterpolant","offset1","offset0","weight1","weight0","DiscreteInterpolant","KeyframeTrack","interpolation","track","trackType","factoryMethod","timeOffset","timeScale","startTime","endTime","nKeys","from","to","valid","valueSize","prevTime","currTime","smoothInterpolation","lastIndex","writeIndex","keep","time","timeNext","offsetP","offsetN","readOffset","writeOffset","TypedKeyframeTrack","BooleanKeyframeTrack","ColorKeyframeTrack","NumberKeyframeTrack","QuaternionLinearInterpolant","QuaternionKeyframeTrack","StringKeyframeTrack","VectorKeyframeTrack","AnimationClip","duration","tracks","blendMode","jsonTracks","frameTime","parseKeyframeTrack","clip","clipTracks","morphTargetSequence","fps","noLoop","numMorphTargets","objectOrClipArray","clipArray","o","morphTargets","animationToMorphTargets","pattern","morphTarget","parts","animationMorphTargets","clips","addNonemptyTrack","trackName","animationKeys","propertyName","destTracks","clipName","hierarchyTracks","morphTargetNames","morphTargetName","animationKey","boneName","getTrackTypeForValueTypeName","typeName","Cache","file","LoadingManager","onLoad","onProgress","onError","isLoading","itemsLoaded","itemsTotal","urlModifier","handlers","transform","regex","loader","DefaultLoadingManager","Loader","manager","crossOrigin","path","resourcePath","requestHeader","loading","HttpError","response","FileLoader","cached","req","mimeType","responseType","callbacks","reader","contentLength","lengthComputable","loaded","stream","controller","readData","done","text","exec","decoder","err","_loading","ImageLoader","arr","onImageLoad","removeEventListeners","onImageError","DataTextureLoader","texData","TextureLoader","Light","intensity","_projScreenMatrix$1","_lightPositionWorld$1","_lookTarget$1","LightShadow","light","shadowCamera","shadowMatrix","viewportIndex","SpotLightShadow","SpotLight","penumbra","decay","power","_projScreenMatrix","_lightPositionWorld","_lookTarget","PointLightShadow","PointLight","OrthographicCamera","scaleW","scaleH","DirectionalLightShadow","DirectionalLight","AmbientLight","LoaderUtils","_errorMap","ImageBitmapLoader","imageBitmap","fetchOptions","promise","res","blob","ArrayCamera","Clock","autoStart","newTime","_RESERVED_CHARS_RE","_reservedRe","_wordChar","_wordCharOrDot","_directoryRe","_nodeRe","_objectRe","_propertyRe","_trackRe","_supportedObjectNames","Composite","targetGroup","optionalParsedPath","parsedPath","PropertyBinding","firstValidIndex","binding","bindings","rootNode","root","matches","results","lastDot","objectName","nodeName","searchNodeSubtree","childNode","subTreeNode","dest","targetArray","sourceArray","targetObject","propertyIndex","objectIndex","nodeProperty","versioning","bindingType","_matrix","Raycaster","coords","ascSort","objects","propagate","Spherical","other","_startP","_startEnd","_d1","_d2","_r","_c1","_c2","Line3","clampToLine","startEnd2","EPSILON","Controls","domElement","getByteLength","typeByteLength","getTextureTypeByteLength","WebGLAnimation","isAnimating","animationLoop","requestId","onAnimationFrame","WebGLAttributes","buffers","createBuffer","bufferType","usage","updateBuffer","updateRanges","mergeIndex","previousRange","get","remove","alphahash_fragment","alphahash_pars_fragment","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","alphatest_pars_fragment","aomap_fragment","aomap_pars_fragment","batching_pars_vertex","batching_vertex","begin_vertex","beginnormal_vertex","bsdfs","iridescence_fragment","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","common","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","colorspace_fragment","colorspace_pars_fragment","envmap_fragment","envmap_common_pars_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_pars_fragment","lights_lambert_fragment","lights_lambert_pars_fragment","lights_pars_begin","envmap_physical_pars_fragment","lights_toon_fragment","lights_toon_pars_fragment","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphinstance_vertex","morphcolor_vertex","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normal_pars_fragment","normal_pars_vertex","normal_vertex","normalmap_pars_fragment","clearcoat_normal_fragment_begin","clearcoat_normal_fragment_maps","clearcoat_pars_fragment","iridescence_pars_fragment","opaque_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","transmission_fragment","transmission_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","worldpos_vertex","ShaderChunk","UniformsLib","ShaderLib","_rgb","_e1$1","WebGLBackground","cubemaps","cubeuvmaps","state","premultipliedAlpha","clearColor","clearAlpha","planeMesh","boxMesh","currentBackground","currentBackgroundVersion","currentTonemapping","getBackground","background","render","forceClear","setClear","environmentBlendMode","addToRenderList","renderList","dispose","WebGLBindingStates","maxVertexAttributes","bindingStates","defaultState","createBindingState","currentState","forceUpdate","setup","program","updateBuffers","getBindingState","bindVertexArrayObject","needsUpdate","saveCache","setupVertexAttributes","createVertexArrayObject","vao","deleteVertexArrayObject","wireframe","programMap","stateMap","newAttributes","enabledAttributes","attributeDivisors","cachedAttributes","geometryAttributes","attributesNum","programAttributes","cachedAttribute","geometryAttribute","initAttributes","enableAttribute","enableAttributeAndDivisor","disableUnusedAttributes","vertexAttribPointer","integer","materialDefaultAttributeValues","programAttribute","bytesPerElement","reset","geometryId","programId","releaseStatesOfGeometry","releaseStatesOfProgram","resetDefaultState","WebGLBufferRenderer","mode","setMode","renderInstances","primcount","renderMultiDraw","starts","counts","drawCount","elementCount","renderMultiDrawInstances","extension","WebGLCapabilities","utils","maxAnisotropy","getMaxAnisotropy","textureFormatReadable","textureFormat","textureTypeReadable","textureType","halfFloatSupportedByExt","getMaxPrecision","precision","maxPrecision","logarithmicDepthBuffer","reversedDepthBuffer","maxTextures","maxVertexTextures","maxTextureSize","maxCubemapSize","maxAttributes","maxVertexUniforms","maxVaryings","maxFragmentUniforms","vertexTextures","maxSamples","WebGLClipping","properties","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","uniform","enableLocalClipping","enabled","projectPlanes","useCache","clipIntersection","clipShadows","materialProperties","resetGlobalState","nGlobal","lGlobal","dstArray","skipTransform","nPlanes","flatSize","viewMatrix","i4","WebGLCubeMaps","mapTextureMapping","cubemap","onTextureDispose","LOD_MIN","EXTRA_LOD_SIGMA","MAX_SAMPLES","GGX_SAMPLES","_flatCamera","_clearColor","_oldTarget","_oldActiveCubeFace","_oldActiveMipmapLevel","_oldXrEnabled","_origin","PMREMGenerator","sigma","cubeUVRenderTarget","equirectangular","_getCubemapMaterial","_getEquirectMaterial","cubeSize","outputTarget","_setViewport","_createRenderTarget","_lodMax","_createPlanes","_getBlurShader","_getGGXShader","cubeCamera","upSign","forwardSign","originalAutoClear","toneMapping","backgroundBox","backgroundMaterial","useSolidColor","col","isCubeTexture","autoClear","lodIn","lodOut","pingPongRenderTarget","ggxMaterial","ggxMesh","ggxUniforms","targetRoughness","sourceRoughness","incrementalRoughness","blurStrength","adjustedRoughness","outputSize","poleAxis","targetIn","targetOut","sigmaRadians","blurMaterial","STANDARD_DEVIATIONS","blurMesh","blurUniforms","pixels","radiansPerPixel","sigmaPixels","samples","weights","lodMax","sizeLods","sigmas","lodMeshes","lod","totalLods","sizeLod","texelSize","cubeFaces","positionSize","uvSize","faceIndexSize","faceIndex","coordinates","fill","_getCommonVertexShader","WebGLCubeUVMaps","cubeUVmaps","pmremGenerator","isEquirectMap","isCubeMap","currentPMREMVersion","isCubeTextureComplete","cubemapUV","WebGLExtensions","getExtension","WebGLGeometries","wireframeAttributes","onGeometryDispose","updateWireframeAttribute","geometryIndex","geometryPosition","version","previousAttribute","getWireframeAttribute","currentAttribute","WebGLIndexedBufferRenderer","setIndex","WebGLInfo","memory","instanceCount","WebGLMorphtargets","capabilities","morphTextures","morph","morphTargetsCount","entry","disposeTexture","hasMorphPosition","hasMorphNormals","hasMorphColors","morphNormals","morphColors","vertexDataCount","vertexDataStride","morphNormal","morphColor","WebGLObjects","updateMap","buffergeometry","onInstancedMeshDispose","instancedMesh","emptyTexture","emptyShadowTexture","emptyArrayTexture","empty3dTexture","emptyCubeTexture","arrayCacheF32","arrayCacheI32","mat4array","mat3array","mat2array","flatten","nBlocks","blockSize","firstElem","arraysEqual","copyArray","allocTexUnits","setValueV1f","setValueV2f","setValueV3f","setValueV4f","setValueM2","elements","setValueM3","setValueM4","setValueV1i","setValueV2i","setValueV3i","setValueV4i","setValueV1ui","setValueV2ui","setValueV3ui","setValueV4ui","setValueT1","unit","emptyTexture2D","setValueT3D1","setValueT6","setValueT2DArray1","getSingularSetter","setValueV1fArray","setValueV2fArray","setValueV3fArray","setValueV4fArray","setValueM2Array","setValueM3Array","setValueM4Array","setValueV1iArray","setValueV2iArray","setValueV3iArray","setValueV4iArray","setValueV1uiArray","setValueV2uiArray","setValueV3uiArray","setValueV4uiArray","setValueT1Array","units","setValueT3DArray","setValueT6Array","setValueT2DArrayArray","getPureArraySetter","SingleUniform","activeInfo","addr","PureArrayUniform","StructuredUniform","seq","RePathPart","addUniform","uniformObject","parseUniform","pathLength","match","matchEnd","idIsIndex","subscript","WebGLUniforms","WebGLShader","COMPLETION_STATUS_KHR","programIdCount","handleSource","errorLine","lines","lines2","_m0","getEncodingComponents","encodingMatrix","getShaderErrors","status","errors","errorMatches","getTexelEncodingFunction","functionName","getToneMappingFunction","toneMappingName","_v0","getLuminanceFunction","generateVertexExtensions","filterEmptyLine","generateDefines","defines","chunks","fetchAttributeLocations","locationSize","replaceLightNums","numSpotLightCoords","replaceClippingPlaneNums","includePattern","resolveIncludes","includeReplacer","shaderChunkMap","include","newInclude","unrollLoopPattern","unrollLoops","loopReplacer","snippet","generatePrecision","precisionstring","generateShadowMapTypeDefine","shadowMapTypeDefine","generateEnvMapTypeDefine","envMapTypeDefine","generateEnvMapModeDefine","envMapModeDefine","generateEnvMapBlendingDefine","envMapBlendingDefine","generateCubeUVSize","imageHeight","maxMip","texelHeight","WebGLProgram","cacheKey","vertexShader","fragmentShader","envMapCubeUVSize","customVertexExtensions","customDefines","prefixVertex","prefixFragment","versionString","vertexGlsl","fragmentGlsl","glVertexShader","glFragmentShader","onFirstUse","self","programInfoLog","vertexShaderInfoLog","fragmentShaderInfoLog","programLog","vertexLog","fragmentLog","runnable","haveDiagnostics","vertexErrors","fragmentErrors","cachedUniforms","programReady","_id","WebGLShaderCache","vertexShaderStage","fragmentShaderStage","materialShaders","shaderStage","set","code","stage","WebGLShaderStage","WebGLPrograms","clipping","_programLayers","_customShaders","_activeChannels","programs","SUPPORTS_VERTEX_TEXTURES","shaderIDs","getChannel","getParameters","lights","shadows","fog","environment","envMap","envMapCubeUVHeight","shaderID","morphTextureStride","customVertexShaderID","customFragmentShaderID","IS_INSTANCEDMESH","IS_BATCHEDMESH","HAS_MAP","HAS_MATCAP","HAS_ENVMAP","HAS_AOMAP","HAS_LIGHTMAP","HAS_BUMPMAP","HAS_NORMALMAP","HAS_DISPLACEMENTMAP","HAS_EMISSIVEMAP","HAS_METALNESSMAP","HAS_ROUGHNESSMAP","HAS_ANISOTROPY","HAS_CLEARCOAT","HAS_DISPERSION","HAS_IRIDESCENCE","HAS_SHEEN","HAS_TRANSMISSION","HAS_ANISOTROPYMAP","HAS_CLEARCOATMAP","HAS_CLEARCOAT_NORMALMAP","HAS_CLEARCOAT_ROUGHNESSMAP","HAS_IRIDESCENCEMAP","HAS_IRIDESCENCE_THICKNESSMAP","HAS_SHEEN_COLORMAP","HAS_SHEEN_ROUGHNESSMAP","HAS_SPECULARMAP","HAS_SPECULAR_COLORMAP","HAS_SPECULAR_INTENSITYMAP","HAS_TRANSMISSIONMAP","HAS_THICKNESSMAP","HAS_GRADIENTMAP","HAS_ALPHAMAP","HAS_ALPHATEST","HAS_ALPHAHASH","HAS_EXTENSIONS","getProgramCacheKey","getProgramCacheKeyParameters","getProgramCacheKeyBooleans","getUniforms","acquireProgram","pl","preexistingProgram","releaseProgram","releaseShaderCache","WebGLProperties","has","map","painterSortStable","reversePainterSortStable","WebGLRenderList","renderItems","renderItemsIndex","opaque","transmissive","transparent","getNextRenderItem","groupOrder","renderItem","push","unshift","sort","customOpaqueSort","customTransparentSort","finish","WebGLRenderLists","lists","renderCallDepth","listArray","UniformsCache","ShadowUniformsCache","nextVersion","shadowCastingAndTexturingLightsFirst","lightA","lightB","WebGLLights","shadowCache","vector3","matrix42","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","numDirectionalShadows","numPointShadows","numSpotShadows","numSpotMaps","numSpotShadowsWithMaps","numLightProbes","shadowMap","shadow","shadowUniforms","hash","setupView","WebGLRenderState","lightsArray","shadowsArray","pushLight","pushShadow","shadowLight","setupLights","setupLightsView","WebGLRenderStates","renderStates","renderStateArray","renderState","fragment","WebGLShadowMap","_frustum","_shadowMapSize","_viewportSize","_viewport","_depthMaterial","_distanceMaterial","_materialCache","_maxTextureSize","shadowSide","shadowMaterialVertical","shadowMaterialHorizontal","fullScreenTri","fullScreenMesh","_previousType","activeCubeFace","_state","toVSM","fromVSM","shadowFrameExtents","pars","viewportCount","vp","viewport","renderObject","VSMPass","getDepthMaterial","customMaterial","keyA","keyB","materialsForVariant","cachedMaterial","onMaterialDispose","kl","depthMaterial","reversedFuncs","WebGLState","ColorBuffer","locked","currentColorMask","currentColorClear","colorMask","lock","DepthBuffer","currentReversed","currentDepthMask","currentDepthFunc","currentDepthClear","reversed","ext","oldDepth","depthTest","enable","disable","depthMask","depthFunc","StencilBuffer","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","stencilMask","stencilFunc","stencilRef","stencilFail","stencilZFail","stencilZPass","colorBuffer","depthBuffer","stencilBuffer","uboBindings","uboProgramMap","enabledCapabilities","currentBoundFramebuffers","currentDrawbuffers","defaultDrawbuffers","currentProgram","currentBlendingEnabled","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentBlendColor","currentBlendAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","lineWidthAvailable","glVersion","currentTextureSlot","currentBoundTextures","scissorParam","viewportParam","currentScissor","currentViewport","createTexture","dimensions","emptyTextures","setFlipSided","setCullFace","setBlending","bindFramebuffer","framebuffer","drawBuffers","useProgram","equationToGL","factorToGL","blending","blendEquation","blendSrc","blendDst","blendEquationAlpha","blendSrcAlpha","blendDstAlpha","blendColor","blendAlpha","setMaterial","frontFaceCW","flipSided","stencilWrite","setPolygonOffset","cullFace","setLineWidth","polygonOffset","factor","setScissorTest","scissorTest","activeTexture","webglSlot","bindTexture","webglType","webglTexture","boundTexture","unbindTexture","compressedTexImage2D","compressedTexImage3D","texSubImage2D","texSubImage3D","compressedTexSubImage2D","compressedTexSubImage3D","texStorage2D","texStorage3D","texImage2D","texImage3D","scissor","updateUBOMapping","uniformsGroup","blockIndex","uniformBlockBinding","WebGLTextures","_gl","multisampledRTTExt","supportsInvalidateFramebuffer","_imageDimensions","_videoTextures","_sources","useOffscreenCanvas","createCanvas","resizeImage","needsNewCanvas","maxSize","getDimensions","textureNeedsGenerateMipmaps","generateMipmap","getTargetType","getInternalFormat","internalFormatName","glFormat","glType","forceLinearTransfer","internalFormat","transfer","getInternalDepthFormat","useStencil","depthType","glInternalFormat","getMipLevels","deallocateTexture","onRenderTargetDispose","deallocateRenderTarget","textureProperties","webglTextures","deleteTexture","renderTargetProperties","level","attachmentProperties","textureUnits","resetTextureUnits","allocateTextureUnit","textureUnit","getTextureCacheKey","setTexture2D","slot","updateVideoTexture","uploadTexture","setTexture2DArray","setTexture3D","setTextureCube","uploadCubeTexture","wrappingToGL","filterToGL","compareToGL","setTextureParameters","initTexture","forceUpload","textureCacheKey","getRow","rowLength","componentStride","updateTexture","previousEnd","currentRow","previousRow","currentUnpackRowLen","currentUnpackSkipPixels","currentUnpackSkipRows","pixelStart","pixelCount","sourceProperties","workingPrimaries","texturePrimaries","unpackConversion","verifyColorSpace","mipmap","mipmaps","useTexStorage","allocateMemory","dataReady","levels","layerByteLength","layerData","isCompressed","isDataTexture","cubeImage","mipmapImage","setupFrameBufferTexture","attachment","textureTarget","useMultisampledRTT","getRenderTargetSamples","setupRenderBufferStorage","renderbuffer","isMultisample","depthTexture","glAttachmentType","setupDepthTexture","webglDepthTexture","setupDepthRenderbuffer","isCube","disposeEvent","rebindTextures","colorTexture","setupRenderTarget","isMultipleRenderTargets","glTextureType","updateRenderTargetMipmap","targetType","invalidationArrayRead","invalidationArrayDraw","updateMultisampleRenderTarget","mask","depthStyle","WebGLUtils","convert","_occlusion_vertex","_occlusion_fragment","WebXRDepthSensing","depthData","cameraXR","WebXRManager","session","framebufferScaleFactor","referenceSpaceType","foveation","customReferenceSpace","pose","glBinding","glProjLayer","glBaseLayer","xrFrame","supportsGlBinding","depthSensing","cameraAccessTextures","initialRenderTarget","newRenderTarget","controllers","controllerInputSources","currentSize","currentPixelRatio","cameraL","cameraR","_currentDepthNear","_currentDepthFar","onSessionEvent","controllerIndex","onSessionEnd","onInputSourcesChange","space","depthFormat","glDepthFormat","projectionlayerInit","layerInit","cameraLPos","cameraRPos","setProjectionFromUnion","ipd","projL","projR","topFov","bottomFov","leftFov","rightFov","zOffset","xOffset","near2","far2","left2","right2","top2","bottom2","updateCamera","depthNear","depthFar","updateUserCamera","xrCamera","onAnimationFrameCallback","views","cameraXRNeedsUpdate","glSubImage","enabledFeatures","cameraTex","glTexture","_e1","WebGLMaterials","refreshTransformUniform","refreshFogUniforms","refreshMaterialUniforms","pixelRatio","transmissionRenderTarget","refreshUniformsCommon","refreshUniformsToon","refreshUniformsPhong","refreshUniformsStandard","refreshUniformsPhysical","refreshUniformsMatcap","refreshUniformsDistance","refreshUniformsLine","refreshUniformsDash","refreshUniformsPoints","refreshUniformsSprites","envMapRotation","WebGLUniformsGroups","updateList","allocatedBindingPoints","maxBindingPoints","bind","webglProgram","prepareUniformsGroup","onUniformsGroupsDispose","updateBufferData","bindingPointIndex","allocateBindingPointIndex","uniformArray","hasUniformChanged","arrayOffset","getUniformSize","indexArray","indexString","cachedObject","chunkSize","chunkOffset","chunkPadding","chunkStart","DATA","lut","getDFGLUT","WebGLRenderer","antialias","preserveDrawingBuffer","powerPreference","failIfMajorPerformanceCaveat","_alpha","INTEGER_FORMATS","UNSIGNED_TYPES","uintClearColor","intClearColor","currentRenderList","currentRenderState","renderListStack","renderStateStack","_this","_isContextLost","_currentActiveCubeFace","_currentActiveMipmapLevel","_currentRenderTarget","_currentMaterialId","_currentCamera","_currentViewport","_currentScissor","_currentScissorTest","_currentClearColor","_currentClearAlpha","_width","_height","_pixelRatio","_opaqueSort","_transparentSort","_scissor","_scissorTest","_clippingEnabled","_localClippingEnabled","_vector4","_emptyScene","_renderBackground","getTargetPixelRatio","getContext","contextName","contextAttributes","onContextLost","onContextRestore","onContextCreationError","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","uniformsGroups","initGLContext","xr","updateStyle","boolean","method","bits","isIntegerFormat","targetFormat","isUnsignedType","onXRSessionStart","onXRSessionEnd","infoAutoReset","shadowMapEnabled","shadowMapAutoUpdate","shadowMapNeedsUpdate","shadowMapType","deallocateMaterial","releaseMaterialProgramReferences","setProgram","rangeFactor","drawStart","drawEnd","lineWidth","maxInstanceCount","prepareMaterial","getProgram","targetScene","material2","checkMaterialsReady","depthSensingMesh","projectObject","opaqueObjects","transmissiveObjects","camera2","renderTransmissionPass","renderScene","sortObjects","transparentObjects","renderObjects","activeViewport","currentToneMapping","currentCameraViewport","renderTargetNeedsUpdate","currentSide","overrideMaterial","lightsStateVersion","programCacheKey","updateCommonMaterialProperties","materialNeedsLights","getUniformList","progUniforms","vertexAlphas","vertexTangents","needsProgramChange","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","uCamPos","markUniformsLightsNeedsUpdate","defaultFramebuffer","_scratchFrameBuffer","useDefaultFramebuffer","isRenderTarget3D","__webglFramebuffer","activeCubeFaceIndex","textureIndex","glBuffer","currFramebuffer","levelScale","_srcFramebuffer","_dstFramebuffer","srcTexture","dstTexture","srcRegion","dstPosition","srcLevel","dstLevel","dstX","dstY","dstZ","glTarget","currentUnpackImageHeight","currentUnpackSkipImages","isSrc3D","isDst3D","srcTextureProperties","dstTextureProperties","srcRenderTargetProperties","dstRenderTargetProperties","Ul","M.Scene","M.Group","Vl","M.PerspectiveCamera","M.OrthographicCamera","Hl","M.WebGLRenderer","M.PCFSoftShadowMap","M.SRGBColorSpace","Ar","cr","na","Yn","rr","Cr","Xi","Gl","or","ve","K","Ne","fe","ss","Wl","Ya","gn","dn","Ni","vr","ue","Zl","Xl","ql","tc","$l","Jl","Ql","ec","Yl","Kl","nc","ic","Pr","M.Vector3","M.Raycaster","M.Euler","hr","M.Vector2","I","M.InstancedMesh","T","R","_","E","A","H","P","V","C","D","$","O","N","M.MathUtils","sc","Kt","tn","rc","Vo","oc","Zi","br","Yi","ar","Pi","tt","nt","Rr","lc","cc","Vn","_t","ze","Ka","hc","st","Kn","Me","$n","rs","uc","dc","lr","vt","Jn","ia","fc","sa","G","Q","ee","pe","se","oe","he","Te","Ie","S","W","L","B","X","Z","F","Y","ne","J","ie","Ee","Je","De","Bt","ye","sn","Mn","Qe","Tt","Nt","Ft","Ut","Et","Fe","Ho","Ns","pn","fn","Bs","jo","Go","Wo","Xo","xn","$a","Ja","Qn","ei","ti","xt","Qa","Ci","ni","pc","Fi","tl","nl","rl","ol","al","ll","mc","gc","yc","M.WebGLRenderTarget","M.LinearFilter","M.RGBAFormat","ii","ra","si","os","Dr","wc","Sn","Zn","xc","oa","aa","_c","ur","Ki","la","$i","at","Ji","vn","_n","jn","Ve","ca","ha","Gn","Mc","Ri","Sc","Tc","Ec","Ac","Cc","Pc","Rc","Dc","kc","Ic","Lc","zc","Oc","Wn","ua","Yt","da","Vs","Bc","Nc","Fc","Uc","Vc","Hc","jc","Gc","Wc","Xc","Zc","kr","qc","fa","Yc","Kc","$c","Jc","Qc","eh","th","nh","pa","ih","sh","U","re","ma","ga","rh","Hs","ya","Ir","oh","ah","Qi","Lr","dr","wa","lh","xa","zr","_a","ch","hh","uh","dh","fr","js","fh","ph","mh","gh","ke","yh","wh","xh","_h","Xn","vh","bh","Or","Tn","Di","Mh","Sh","as","Th","Eh","He","ls","ba","bn","Ma","Ah","Ch","Ph","Vi","Br","Nr","Rh","Dh","kh","Ih","Sa","Fr","Qt","Ta","Lh","zh","Oh","Bh","Nh","Fh","Ur","Vr","ri","Uh","Hr","jr","Gr","Vh","Hh","Ea","pr","Wr","jh","Gh","Aa","cs","Xr","Ca","es","Zr","Wh","ki","lt","$t","Xh","Pa","Zh","qh","Gs","Ra","xe","Op","Bp","Np","Fp","Up","Vp","Hp","jp","Gp","Wp","Xp","Zp","qp","Yp","Kp","$p","qr","Yh","Da","hs","Kh","Zo","Ui","Lt","rt","ut","qo","Yo","$h","zt","Jh","M.MeshBasicMaterial","M.BufferGeometry","M.Color","oi","ai","M.Matrix4","M.Shape","M.ExtrudeGeometry","M.MeshStandardMaterial","M.DoubleSide","M.Mesh","ka","Yr","Kr","cl","Fs","Ko","Qh","su","ru","pu","mu","gu","au","lu","cu","hu","iu","uu","ou","fu","du","tu","yu","wu","Nn","Ia","le","xu","ku","nu","_u","vu","bu","eu","dl","ul","ct","On","ft","Xe","fl","$o","En","$r","Ws","yn","La","zl","Mu","Su","Jr","Hn","xl","wl","yl","Jo","Qr","vl","_l","us","At","Tu","ea","Ll","ds","Eu","Qo","Us","Vt","Au","Cu","Pu","fs","Xs","Ru","Du","Mr","bl","ns","Ml","qi","Sl","eo","Tl","El","Al","Cl","Pl","is","Rl","Dl","Il","Tr","Er","Sr","Iu","ot","Ol","Lu","zu","Ou","M.Box3","Bu","Nu","Fu","M.InstancedBufferAttribute","M.FrontSide","Uu","Vu","Hu","ju","M.DirectionalLight","M.AmbientLight","Se","Gu","Wu","Xu","qu","no","Zu","je","Yu","Hi","M.AdditiveBlending","Ii","Ku","io","$u","Ju","Qu","wn","Bn","ed","Zs","za","qs","td","An","nd","Bl","qn","sd","rd","M.Quaternion","M.TextureLoader","M.MeshLambertMaterial","M.BoxGeometry","od","ld","cd","M.PlaneGeometry","bt","St","hd","ud","dd","fd","pd","md","gd","yd","wd","Oa","xd","_d","so","ps","ro","Oe","Ae","Ba","vd","ms","nn","Md","Sd","Na","oo","gs","ao","we","lo","co","ho","li","Cn","yt","Td","Ct","ci","Ed","Ad","ys","Cd","Pd","Fa","Li","Ys","Ua","Rd","Ks","Dd","$s","kd","Id","Ld","Mt","zd","mr","Od","Ke","Bd","wt","uo","We","$e","Ue","Be","gr","Nd","qe","Ce","Ge","Ye","Pe","Re","yr","Fd","ge","kt","mn","rn","hi","Ud","Js","Pn","ws","Vd","ui","ta","Hd","Ht","jt","Gt","di","fi","pi","fo","po","mo","Rn","jd","Nl","go","yo","ts","Gd","Wd","Xd","Zd","Ot","qd","Yd","Kd","$d","Qs","Jd","Qd","er","mi","on","Dn","wo","gi","ef","tr","yi","xs","kn","tf","nf","rf","of","lf","nr","hf","ir","wi","ln","cn","In","xo","xi","uf","sr","_i","_s","Ln","ff","pf","mf","gf","yf","Fn","ji","Rt","hn","un","vs","Ms","wf","et","vi","_o","xf","wr","Va","_f","Ha","vf","ht","vo","Mf","Sf","ja","Tf","Ef","Af","Cf","Pf","Rf","Df","kf","bo","Mo","If","So","To","Lf","Ss","Ts","bi","zf","Of","Es","Bf","en","As","Nf","Gi","Ff","Cs","Eo","Ao","Dt","Ps","zn","Uf","_e","mt","Rs","Co","Mi","Ds","Vf","Hf","jf","Po","Gf","Ro","Wf","Xf","Zf","Ga","qf","Wa","Xa","Ze","Do","Le","gt","ko","Io","Lo","ks","Si","Ti","zo","Is","Ls","Yf","Zt","qt","zi","Oi","Un","Wt","Kf","Bi","Oo","Za","$f","Jf","Qf","zs","ep","Os","tp","Bo","np","It","Wi","Fl","Xt","Ei","Pt","Ai","it","Jt","ip","sp","No","Fo","rp","op","ap","Uo","lp","cp","M.Float32BufferAttribute","hp","M.Plane","M.BufferAttribute","M.LineBasicMaterial","M.Line","dp","fp","mp","gp","yp","wp","M.LineSegments","xp","_p","main2Txx2Vau","stepCkmZYIvn","API__B1v8UcRF","M.Spherical","Mp","Sp","M.Sprite","M.CanvasTexture","M.SpriteMaterial","Tp","Ep","Ap","Cp","M.EquirectangularReflectionMapping","M.PMREMGenerator","M.SphereGeometry","M.BackSide","Pp","M.Clock","M.RepeatWrapping","M.ShaderMaterial","Rp","Dp","kp","M.Points","M.Texture","Jp","Engine","engineConfig","createEngineSDK","hit","_theme","urls","measure","setting","selectType","model","contrast","elevation","speed","gravity","collision","models","safeModels","normalizeUrl","loadedModels","modelMap","loadedModel","idsSet","rawId","node","ids","BimRightKey","rect","viewportWidth","viewportHeight","newX","newY","BimMenu","items","defaultGroup","groupName","sortedGroupKeys","divider","groupItems","isEnabled","iconDiv","labelDiv","hasChildren","arrowDiv","parentLi","subMenu","subRect","RightKeyManager","menu","EngineManager","selected","TreeNodeCheckState","BimTreeNode","nodeEl","iconEl","indent","newChecked","fireEvent","BimTree","searchContainer","query","lowerQuery","noData","containerRect","nodeRect","nodeTopInContainer","targetTop","childConfig","isChecked","allChecked","allUnchecked","checked","expanded","includeHalfChecked","BimTab","tab","tabId","panel","targetTab","isActive","treeContent","savedTop","ICONS","getIcon","fnv1a32","input","seed","hashIds","str","h1","h2","collectModelParams","grouped","collect","modelUrl","idSet","nodeIdCounter","transformTreeData","apiData","transformNode","ConstructTreeManagerBtn","levelTreeData","typeTreeData","majorTreeData","createTree","transformedData","tree","modelParam","componentTree","typeTree","majorTree","componentPanel","typePanel","majorPanel","tabMount","resetAllTrees","unsubscribeShowAll","BaseDialogManager","containerWidth","MEASURE_TYPES","MEASURE_MODES_ORDERED","getValueType","getModeBycallBackType","callBackType","MeasurePanel","triggerCallback","partial","persist","toolsBox","fallbackCircleIconSvg","toggleBox","toggleIconEl","resultBox","mainValueRow","mainValueLabel","mainValueValue","xyzBox","makeXyzRow","labelKey","valueClassName","valueElSetter","row","footer","unitRow","unitLabel","hint","precisionRow","precisionLabel","actions","dirGroup","dirLabel","dirItems","dirDown","dirUp","selGroup","selLabel","selItems","selPoint","selElement","i18nKey","onClick","dir","opt","raw","parsed","xyz","valueType","converted","MeasureDialogManager","panelWrapper","targetMode","SectionPlanePanel","isHidden","iconSvg","SectionPlaneDialogManager","paddingRight","paddingBottom","SectionAxisPanel","row1","row2","_type","SectionAxisDialogManager","DEFAULT_RANGE","SectionBoxPanel","isReversed","buttonsContainer","slidersContainer","ref","iconMap","labelEl","slider","minHandle","maxHandle","handleType","percentage","minH","maxH","rangeEl","SectionBoxDialogManager","WalkControlPanel","newMode","leftButtons","divider1","divider2","exitBtn","gravityWrapper","collisionWrapper","characterWrapper","walkModeWrapper","controlGroup","oldMode","speedWrapper","speedLabel","constructionWorkerOption","officeMaleOption","walkOption","runOption","WalkPathPanel","enginePoints","settings","pointsSection","playBtn","section","durationGroup","durationLabel","durationWrapper","durationInput","durationUnit","loopGroup","loopCheckbox","loopLabel","toolbar","addBtn","deleteAllBtn","empty","jumpBtn","deleteBtn","stopBtn","newIndex","pointIndex","WalkPathDialogManager","WalkControlManager","engineSpeed","EngineInfoDialogManager","createRow","valueEl","SECTION_LABEL_STYLE","DIVIDER_STYLE","ROW_STYLE","SLIDER_VALUE_STYLE","BORDER_COLOR","INPUT_BG","PRIMARY","TEXT_PRIMARY","TEXT_INVERSE","HOVER_BG","SettingDialogManager","engine","div","currentMode","modes","labelText","onChange","valueDisplay","select","toggleRow","elevationRow","elevationLabel","inputWrapper","elevationInput","option","toggleOffBg","toggleOnBg","toggle","knob","BimCollapseItem","itemEl","extraEl","BimCollapse","itemConfig","ComponentDetailManager","propertiesPanel","materialsPanel","collapseItems","category","AiChat","isDark","placeholderEl","helperL","helperR","updates","question","prompt","promptId","msg","optionsHtml","selectedOption","answer","questionId","optionId","AiChatManager","customAnswer","EventEmitter","ManagerRegistry","BimEngine","versionEl","_button","_registry","doc","isFullscreen","targetElem","exitMethod","requestMethod"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAE3BC,GAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEhCC,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAExBC,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEvBC,GAAsB;AAAA;A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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAE7BC,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEnBC,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEjBC,GAAY;AAAA;AAAA;AAAA;AAAA;AA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AQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,EAAQ,MAAQ,EAAQ,MAAQ,EAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,EAAQ,MAAQ,EAAQ,MAAQ,EAAQ,MAAQ,EAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAA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EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,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E,EAAG7nB,EAAI38E,EAAE,cAAcg6B,EAAE,EACrD,GAAIsjD,GAAKX,EACPM,EAAI0nB,GACFphE,EACA45C,EACA,EACA,EACA,EACAzlF,EACAqD,EACAxE,EACA,EAAI,EACJyJ,EACAvJ,CACR,GAAWkuG,GACHphE,EACA85C,EACA,EACA,EACA,EACA3lF,EACAqD,EACAxE,EACA,EAAI,EACJyJ,EACAvJ,CACR,UACa6mF,EACP,GAAI9mF,EACFymF,EAAI0nB,GACFphE,EACA45C,EACA,EACA,EACA,EACAzlF,EACAqD,EACAxE,EACA,EAAI,EACJyJ,EACAvJ,CACV,MACW,CACH,MAAMomF,EAAIwnB,GAAG,aAAY,EACzBxnB,EAAE,KAAK2nB,EAAE,EAAE,aAAa,CAAC,EACzB,MAAM1nB,EAAIsiB,GAAG77D,CAAC,EAAG5+C,EAAI06G,GAAG97D,EAAG17C,CAAC,EAC5B20G,GAAG1f,EAAGtjF,EAAG8qG,EAAE,EAAG9H,GAAG73G,EAAG6U,EAAG+qG,EAAE,EACzB,MAAM,EAAI1nB,EAAE,cAAcynB,EAAE,EAAGpnB,EAAIL,EAAE,cAAc0nB,EAAE,EACrDtnB,EAAI,GAAK0nB,GACPxnB,EACAL,EACA,EACA,EACA,EACA/hF,EACArD,EACA,EACAnB,EAAI,EACJsmF,EACA,CAACpmF,CACX,GAAaymF,GAAKynB,GACRxnB,EACAx4F,EACA,EACA,EACA,EACAoW,EACArD,EACA,EACAnB,EAAI,EACJsmF,EACA,CAACpmF,CACX,EAAW4tG,GAAG,iBAAiBxnB,CAAC,CAC1B,SACOF,EACP,GAAInmF,EACFymF,EAAI0nB,GACFphE,EACA85C,EACA,EACA,EACA,EACA3lF,EACAqD,EACAxE,EACA,EAAI,EACJyJ,EACAvJ,CACV,MACW,CACH,MAAMomF,EAAIwnB,GAAG,aAAY,EACzBxnB,EAAE,KAAK7iD,EAAE,EAAE,aAAa,CAAC,EACzB,MAAM8iD,EAAIsiB,GAAG77D,CAAC,EAAG5+C,EAAI06G,GAAG97D,EAAG17C,CAAC,EAC5B20G,GAAG1f,EAAGtjF,EAAG8qG,EA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CAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mICAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","x_google_ignoreList":[12,13]} \ No newline at end of file diff --git a/docs/API调用链.md b/docs/API调用链.md index c62dd83..8423c0a 100644 --- a/docs/API调用链.md +++ b/docs/API调用链.md @@ -1,1188 +1,214 @@ -# BIM Engine SDK - API 调用链文档 +# BIM Engine SDK API 调用链 -本文档详细记录 BIM Engine SDK 中各功能模块的完整调用链,从用户交互到底层 3D 引擎 API。 +本文档记录当前版本(2026-03)主要功能的真实调用路径。 + +## 关键更新 + +- `EngineManager` 不再承载 1:1 透传 +- 内部 Manager 统一走 `this.engineComponent?.xxx()` +- 非 Manager 组件走 `registry.engine3d?.getEngineComponent()?.xxx()` +- `Engine.getEngine()` 已移除,事件订阅改为 `onRawEvent()/offRawEvent()` --- -## 目录 +## 分层调用模型 -### 第一章:工具栏 (Toolbar) +```text +L1 Button / Panel / Dialog + -> L2 Manager (编排) + -> L3 Engine 组件 (能力实现) + -> L4 iflow-engine-base (底层 API) +``` -1. [首页 (Home)](#1-首页-home) -2. [框选放大 (Zoom Box)](#2-框选放大-zoom-box) -3. [测量 (Measure)](#3-测量-measure) -4. [剖切菜单 (Section)](#4-剖切菜单-section) - - [拾取面剖切 (Section Plane)](#41-拾取面剖切-section-plane) - - [轴向剖切 (Section Axis)](#42-轴向剖切-section-axis) - - [剖切盒 (Section Box)](#43-剖切盒-section-box) -5. [漫游 (Walk)](#5-漫游-walk) -6. [地图 (Map)](#6-地图-map) -7. [构件详情 (Property)](#7-构件详情-property) -8. [设置 (Setting)](#8-设置-setting) -9. [信息 (Info)](#9-信息-info) -10. [全屏 (Fullscreen)](#10-全屏-fullscreen) +说明: -### 第二章:右键菜单 (Context Menu) - -1. [构件详情 (Component Detail)](#21-构件详情-component-detail) -2. [显示全部 (Show All)](#22-显示全部-show-all) -3. [信息 (Info)](#23-信息-info-1) -4. [首页 (Home)](#24-首页-home-1) - -### 第三章:构件交互 (Component Interaction) - -1. [构件选中 (Component Selection)](#31-构件选中-component-selection) -2. [取消选中 (Deselection)](#32-取消选中-deselection) +- 只有“外部入口 API”仍通过 `EngineManager` 暴露 +- 内部业务调用尽量不经过 `EngineManager` 透传 --- -# 第一章:工具栏 (Toolbar) +## 1) Home(回到主视角) ---- +文件:`src/components/button-group/toolbar/buttons/home/index.ts` -## 目录 - -1. [首页 (Home)](#1-首页-home) -2. [框选放大 (Zoom Box)](#2-框选放大-zoom-box) -3. [测量 (Measure)](#3-测量-measure) -4. [剖切菜单 (Section)](#4-剖切菜单-section) - - [拾取面剖切 (Section Plane)](#41-拾取面剖切-section-plane) - - [轴向剖切 (Section Axis)](#42-轴向剖切-section-axis) - - [剖切盒 (Section Box)](#43-剖切盒-section-box) -5. [漫游 (Walk)](#5-漫游-walk) -6. [地图 (Map)](#6-地图-map) -7. [构件详情 (Property)](#7-构件详情-property) -8. [设置 (Setting)](#8-设置-setting) -9. [信息 (Info)](#9-信息-info) -10. [全屏 (Fullscreen)](#10-全屏-fullscreen) - ---- - -## 1. 首页 (Home) - -**按钮 ID**: `home` -**功能**: 相机回到初始位置(主视角) -**保持激活**: 否 - -### 调用链 - -``` -用户点击 [首页] 按钮 - │ - ▼ -Button onClick (buttons/home/index.ts) - │ registry.engine3d?.CameraGoHome() - ▼ -EngineManager.CameraGoHome() (managers/engine-manager.ts) - │ this.engineInstance.CameraGoHome() - ▼ -Engine.CameraGoHome() (components/engine/index.ts) - │ this.engine.viewCube.CameraGoHome() - ▼ -底层引擎 API: engine.viewCube.CameraGoHome() -``` - -### 代码摘要 - -**按钮定义** (`buttons/home/index.ts`): -```typescript -onClick: (button) => { - const registry = ManagerRegistry.getInstance(); - registry.engine3d?.CameraGoHome(); -} -``` - -**EngineManager** (`managers/engine-manager.ts`): -```typescript -public CameraGoHome(): void { - this.engineInstance.CameraGoHome(); -} -``` - -**Engine 组件** (`components/engine/index.ts`): -```typescript -public CameraGoHome() { - this.engine.viewCube.CameraGoHome(); -} +```text +点击 Home + -> registry.engine3d?.getEngineComponent()?.CameraGoHome() + -> Engine.CameraGoHome() + -> rawEngine.viewCube.CameraGoHome() ``` --- -## 2. 框选放大 (Zoom Box) +## 2) Zoom Box(框选放大) -**按钮 ID**: `zoom-box` -**功能**: 激活框选放大模式,用户可以框选区域进行放大 -**保持激活**: 否 +文件:`src/components/button-group/toolbar/buttons/zoom-box/index.ts` -### 调用链 - -``` -用户点击 [框选放大] 按钮 - │ - ▼ -Button onClick (buttons/zoom-box/index.ts) - │ registry.engine3d?.activateZoomBox() - ▼ -EngineManager.activateZoomBox() (managers/engine-manager.ts) - │ this.engineInstance.activateZoomBox() - ▼ -Engine.activateZoomBox() (components/engine/index.ts) - │ this.engine.rangeScale?.active() - ▼ -底层引擎 API: engine.rangeScale.active() -``` - -### 代码摘要 - -**按钮定义** (`buttons/zoom-box/index.ts`): -```typescript -onClick: () => { - const registry = ManagerRegistry.getInstance(); - registry.engine3d?.activateZoomBox(); -} -``` - -**EngineManager** (`managers/engine-manager.ts`): -```typescript -public activateZoomBox(): void { - this.engineInstance.activateZoomBox(); -} -``` - -**Engine 组件** (`components/engine/index.ts`): -```typescript -public activateZoomBox(): void { - this.engine.rangeScale?.active(); -} +```text +点击 Zoom Box + -> registry.engine3d?.getEngineComponent()?.activateZoomBox() + -> Engine.activateZoomBox() + -> rawEngine.rangeScale.active() ``` --- -## 3. 测量 (Measure) +## 3) Map / MiniMap(小地图开关) -**按钮 ID**: `measure` -**功能**: 打开测量对话框,支持距离、角度、标高、体积等多种测量 -**保持激活**: 是 - -### 调用链 - -#### 3.1 打开测量对话框 +文件:`src/components/button-group/toolbar/buttons/map/index.ts` +```text +点击 Map + -> registry.engine3d?.getEngineComponent()?.toggleMiniMap() + -> Engine.toggleMiniMap() + -> rawEngine.controlModule.toggleMiniMap()/相关底层实现 ``` -用户点击 [测量] 按钮(激活) - │ - ▼ -Button onClick (buttons/measure/index.ts) - │ registry.measure?.show() - ▼ -MeasureDialogManager.show() (继承自 BaseDialogManager) - │ createContent() → 创建 MeasurePanel - │ onDialogCreated() - ▼ -对话框显示,等待用户选择测量模式 -``` - -#### 3.2 用户选择测量模式 - -``` -用户在 Panel 中选择测量模式(如:距离测量) - │ - ▼ -MeasurePanel.onModeChange('distance') - │ - ▼ -MeasureDialogManager 回调 (managers/measure-dialog-manager.ts) - │ registry.engine3d?.activateMeasure(mode) - ▼ -EngineManager.activateMeasure('distance') (managers/engine-manager.ts) - │ this.engineInstance.activateMeasure(mode) - ▼ -Engine.activateMeasure('distance') (components/engine/index.ts) - │ switch(mode) → activateDistanceMeasure() - ▼ -Engine.activateDistanceMeasure() - │ this.engine.measure.active() // 激活主测量模块 - │ this.engine.measure.distanceMeasure.active() // 激活距离测量 - ▼ -底层引擎 API: - - engine.measure.active() - - engine.measure.distanceMeasure.active() -``` - -#### 3.3 清除所有测量 - -``` -用户点击 [删除全部] 按钮 - │ - ▼ -MeasurePanel.onClearAll() - │ - ▼ -MeasureDialogManager 回调 - │ registry.engine3d?.clearAllMeasures() - ▼ -EngineManager.clearAllMeasures() - │ this.engineInstance.clearAllMeasures() - ▼ -Engine.clearAllMeasures() - │ this.engine.measure.clearAll() - ▼ -底层引擎 API: engine.measure.clearAll() -``` - -#### 3.4 关闭测量对话框 - -``` -用户关闭对话框 / 再次点击按钮 - │ - ▼ -MeasureDialogManager.onBeforeDestroy() - │ registry.engine3d.deactivateMeasure() - ▼ -EngineManager.deactivateMeasure() - │ this.engineInstance.deactivateMeasure() - ▼ -Engine.deactivateMeasure() - │ this.engine.measure.disActive() - ▼ -底层引擎 API: engine.measure.disActive() -``` - -### 测量模式与底层 API 对照表 - -| 模式 | Engine 方法 | 底层 API | -|------|-------------|----------| -| distance (距离) | `activateDistanceMeasure()` | `engine.measure.distanceMeasure.active()` | -| minDistance (最小距离) | `activateMinDistanceMeasure()` | `engine.measure.clearDistanceMeasure.active()` | -| angle (角度) | `activateAngleMeasure()` | `engine.measure.angleMeasure.active()` | -| elevation (标高) | `activateElevationMeasure()` | `engine.measure.elevationMeasure.active()` | -| volume (体积) | `activateVolumeMeasure()` | `engine.measure.areaMeasure.active()` | -| slope (坡度) | `activateSlopeMeasure()` | `engine.measure.slopeMeasure.active()` | -| laserDistance (激光测距) | `activateLaserDistanceMeasure()` | ⚠️ 暂未实现 | -| spaceVolume (空间体积) | `activateSpaceVolumeMeasure()` | ⚠️ 暂未实现 | --- -## 4. 剖切菜单 (Section) +## 4) Measure(测量) -**按钮 ID**: `section` -**类型**: 菜单按钮,展开后显示子按钮 +### 4.1 打开测量对话框 -### 4.1 拾取面剖切 (Section Plane) - -**按钮 ID**: `section-plane` -**功能**: 拾取模型表面进行剖切 -**保持激活**: 是 -**互斥**: 是(同一时间只能激活一种剖切) - -#### 调用链 - -``` -用户点击 [拾取面剖切] 按钮(激活) - │ - ▼ -Button onClick (buttons/section/section-plane/index.ts) - │ registry.sectionPlane?.show() - ▼ -SectionPlaneDialogManager.show() (继承自 BaseDialogManager) - │ createContent() → 创建 SectionPlanePanel - │ onDialogCreated() - ▼ -对话框显示(拾取面剖切需要用户在3D场景中点击表面) +```text +Toolbar measure button + -> registry.measure?.show() + -> MeasureDialogManager.show() (BaseDialogManager) ``` -> ⚠️ **注意**: 拾取面剖切的底层 API 对接尚未完成,目前仅显示 UI 面板。 +### 4.2 切换测量模式 + +```text +MeasurePanel.onModeChange(mode) + -> MeasureDialogManager 回调 + -> this.engineComponent?.activateMeasure(mode) + -> Engine.activateMeasure(mode) + -> rawEngine.measure.* +``` + +### 4.3 测量回调事件 + +```text +MeasureDialogManager.onDialogCreated() + -> this.engineComponent?.onRawEvent('measure-changed', handler) + -> this.engineComponent?.onRawEvent('measure-click', handler) + -> handler 更新 MeasurePanel +``` --- -### 4.2 轴向剖切 (Section Axis) +## 5) Section(剖切) -**按钮 ID**: `section-axis` -**功能**: 沿 X/Y/Z 轴向进行剖切 -**保持激活**: 是 -**互斥**: 是 +### 5.1 轴向剖切 -#### 调用链 - 打开对话框 - -``` -用户点击 [轴向剖切] 按钮(激活) - │ - ▼ -Button onClick (buttons/section/section-axis/index.ts) - │ registry.sectionAxis?.show() - ▼ -SectionAxisDialogManager.show() (继承自 BaseDialogManager) - │ createContent() → 创建 SectionAxisPanel - │ onDialogCreated() - │ └── registry.engine3d.activeSection('x') // 默认激活 X 轴 - ▼ -EngineManager.activeSection('x') - │ this.engineInstance.activeSection(mode) - ▼ -Engine.activeSection('x') - │ this.engine.clipping.active('x') - ▼ -底层引擎 API: engine.clipping.active('x') +```text +SectionAxisDialogManager.onDialogCreated() + -> this.engineComponent?.activeSection('x') + -> Engine.activeSection('x') + -> rawEngine.clipping.active('x') ``` -#### 调用链 - 切换轴向 +### 5.2 剖切盒范围变更 -``` -用户在 Panel 中切换轴向(如:Y 轴) - │ - ▼ -SectionAxisPanel.onAxisChange('y') - │ - ▼ -SectionAxisDialogManager 回调 - │ registry.engine3d?.activeSection('y') - ▼ -EngineManager.activeSection('y') - │ this.engineInstance.activeSection(mode) - ▼ -Engine.activeSection('y') - │ this.engine.clipping.active('y') - ▼ -底层引擎 API: engine.clipping.active('y') -``` - -#### 调用链 - 关闭对话框 - -``` -用户关闭对话框 / 再次点击按钮 - │ - ▼ -SectionAxisDialogManager.onBeforeDestroy() - │ registry.engine3d?.deactivateSection() - ▼ -EngineManager.deactivateSection() - │ this.engineInstance.deactivateSection() - ▼ -Engine.deactivateSection() - │ this.engine.clipping.disActive() - ▼ -底层引擎 API: engine.clipping.disActive() -``` - -#### 剖切模式与底层 API 对照表 - -| 模式 | Engine 调用 | 底层 API | -|------|-------------|----------| -| x | `activeSection('x')` | `engine.clipping.active('x')` | -| y | `activeSection('y')` | `engine.clipping.active('y')` | -| z | `activeSection('z')` | `engine.clipping.active('z')` | -| box | `activeSection('box')` | `engine.clipping.active('box')` | -| face | `activeSection('face')` | `engine.clipping.active('face')` | - ---- - -### 4.3 剖切盒 (Section Box) - -**按钮 ID**: `section-box` -**功能**: 六面体剖切盒,可调节 X/Y/Z 轴的最小/最大范围 -**保持激活**: 是 -**互斥**: 是 - -#### 调用链 - 打开对话框 - -``` -用户点击 [剖切盒] 按钮(激活) - │ - ▼ -Button onClick (buttons/section/section-box/index.ts) - │ registry.sectionBox?.show() - ▼ -SectionBoxDialogManager.show() (继承自 BaseDialogManager) - │ createContent() → 创建 SectionBoxPanel - │ onDialogCreated() - │ └── registry.engine3d?.activeSection('box') - ▼ -EngineManager.activeSection('box') - │ this.engineInstance.activeSection(mode) - ▼ -Engine.activeSection('box') - │ this.engine.clipping.active('box') - ▼ -底层引擎 API: engine.clipping.active('box') -``` - -#### 调用链 - 调整范围(拖动滑块) - -``` -用户拖动 X/Y/Z 轴滑块调整范围 - │ - ▼ +```text SectionBoxPanel.onRangeChange(range) - │ range = { x: {min, max}, y: {min, max}, z: {min, max} } // 百分比 0-100 - ▼ -SectionBoxDialogManager 回调 - │ registry.engine3d?.setSectionBoxRange(range) - ▼ -EngineManager.setSectionBoxRange(range) - │ this.engineInstance.setSectionBoxRange(range) - ▼ -Engine.setSectionBoxRange(range) - │ this.engine.clipping.updateClippingValue(range) - ▼ -底层引擎 API: engine.clipping.updateClippingValue(range) + -> SectionBoxDialogManager 回调 + -> this.engineComponent?.setSectionBoxRange(range) + -> Engine.setSectionBoxRange(range) + -> rawEngine.clipping.updateClippingValue(range) ``` -#### 调用链 - 适应到模型 / 重置 (已废弃) +### 5.3 剖切盒移动事件 -**注意**: `fitSectionBoxToModel()` 和 `resetSectionBox()` 已从新 API 中移除。 -- 用户点击这些按钮时,现在仅输出日志,不执行任何操作 -- 统一使用 `setSectionBoxRange()` 和 `updateClippingValue()` 调整范围 - -#### 调用链 - 关闭对话框 - -``` -用户关闭对话框 / 再次点击按钮 - │ - ▼ -SectionBoxDialogManager.onBeforeDestroy() - │ registry.engine3d?.deactivateSection() - ▼ -EngineManager.deactivateSection() - │ this.engineInstance.deactivateSection() - ▼ -Engine.deactivateSection() - │ this.engine.clipping.disActive() - ▼ -底层引擎 API: engine.clipping.disActive() -``` - -#### 剖切盒 API 汇总 (新版统一 API) - -| 操作 | Engine 方法 | 底层 API | -|------|-------------|----------| -| 激活 | `activeSection('box')` | `engine.clipping.active('box')` | -| 停用 | `deactivateSection()` | `engine.clipping.disActive()` | -| 设置范围 | `setSectionBoxRange(range)` | `engine.clipping.updateClippingValue(range)` | -| ~~适应到模型~~ | ~~`fitSectionBoxToModel()`~~ (已废弃) | - | -| ~~重置~~ | ~~`resetSectionBox()`~~ (已废弃) | - | - -#### 数据格式说明 - -| 层级 | 数据格式 | 示例 | -|------|----------|------| -| UI / SDK | 百分比 (0-100) | `{ x: {min: 20, max: 80}, y: {...}, z: {...} }` | -| 底层引擎 | 百分比 → 内部转换为坐标 | 底层负责转换 | - ---- - -## 5. 漫游 (Walk) - 第一人称漫游 - -> 标注说明: `[SDK]` = SDK 层代码, `[底层]` = bim_engine_base 底层引擎 - -**按钮 ID**: `walk` -**功能**: 打开漫游控制面板,支持第一人称漫游模式 -**保持激活**: 否 - -### 5.1 第一人称漫游模式开关 - -``` -UI 点击漫游按钮 - → [SDK] WalkControlPanel.onWalkModeToggle(isActive) - → [SDK] WalkControlManager.onWalkModeToggle - → [SDK] EngineManager.activateFirstPersonMode() / deactivateFirstPersonMode() - → [SDK] Engine.activateFirstPersonMode() / deactivateFirstPersonMode() - → [底层] engine.controlModule.switchFirstPersonMode() / switchDefaultMode() -``` - -### 5.2 速度调节 - -``` -UI 速度按钮 (1-10) - → [SDK] WalkControlPanel.onSpeedChange(speed) - → [SDK] WalkControlManager.onSpeedChange - → [SDK] EngineManager.setWalkSpeed(speed * 0.01) // 值转换: UI 1-10 → 引擎 0.01-0.1 - → [SDK] Engine.setWalkSpeed(speed) - → [底层] engine.controlModule.firstPersonControls.moveSpeed = speed -``` - -### 5.3 重力开关 - -``` -UI 重力复选框 - → [SDK] WalkControlPanel.onGravityToggle(enabled) - → [SDK] WalkControlManager.onGravityToggle - → [SDK] EngineManager.setWalkGravity(enabled) - → [SDK] Engine.setWalkGravity(enabled) - → [底层] engine.controlModule.firstPersonControls.applyGravity = enabled -``` - -### 5.4 碰撞检测开关 - -``` -UI 碰撞复选框 - → [SDK] WalkControlPanel.onCollisionToggle(enabled) - → [SDK] WalkControlManager.onCollisionToggle - → [SDK] EngineManager.setWalkCollision(enabled) - → [SDK] Engine.setWalkCollision(enabled) - → [底层] engine.controlModule.firstPersonControls.applyCollision = enabled +```text +SectionBoxDialogManager.onDialogCreated() + -> this.engineComponent?.onRawEvent('section-move', handler) + -> handler 同步 UI range ``` --- -## 6. 地图 (Map) +## 6) Walk(第一人称 + 路径漫游) -**按钮 ID**: `map` -**功能**: 打开/关闭地图对话框 -**保持激活**: 是 +### 6.1 第一人称模式 -### 调用链 - -``` -用户点击 [地图] 按钮 - │ - ▼ -Button onClick (buttons/map/index.ts) - │ if (registry.map?.isOpen()) { - │ registry.map?.hide() - │ } else { - │ registry.map?.show() - │ } - ▼ -MapDialogManager.show() / hide() - │ - ▼ -地图对话框显示/隐藏 +```text +WalkControlManager.show() + -> this.engineComponent?.activateFirstPersonMode() + -> Engine.activateFirstPersonMode() + -> rawEngine.controlModule.switchFirstPersonMode() ``` -### 事件监听 +### 6.2 速度 / 重力 / 碰撞 -```typescript -// 按钮定义中监听地图开关事件,同步按钮激活状态 -registry.on('map:opened', () => { - registry.toolbar?.setBtnActive('map', true); -}); +```text +WalkControlPanel 回调 + -> WalkControlManager + -> this.engineComponent?.setWalkSpeed()/setWalkGravity()/setWalkCollision() + -> Engine 对应方法 + -> rawEngine.controlModule 对应方法 +``` -registry.on('map:closed', () => { - registry.toolbar?.setBtnActive('map', false); -}); +### 6.3 路径漫游(非 Manager 组件) + +文件:`src/components/walk-path-panel/index.ts` + +```text +WalkPathPanel + -> registry.engine3d?.getEngineComponent()?.pathRoamingXxx() + -> Engine.pathRoamingXxx() + -> rawEngine.pathRoaming.* ``` --- -## 7. 构件详情 (Property) +## 7) 构件树 / 构件详情 -**按钮 ID**: `property` -**功能**: 打开构件属性面板 -**保持激活**: 否 - -### 调用链 +### 7.1 构件树 +```text +ConstructTreeManagerBtn + -> this.engineComponent?.getLevelTreeData()/getTypeTreeData()/... + -> Engine 对应方法 + -> rawEngine.modelTree / modelToolModule ``` -用户点击 [构件详情] 按钮 - │ - ▼ -Button onClick (buttons/property/index.ts) - │ registry.componentDetail?.show() - ▼ -ComponentDetailManager.show() - │ - ▼ -属性面板显示 + +### 7.2 构件详情 + +```text +ComponentDetailManager + -> this.engineComponent?.getComponentProperties(url, id, cb) + -> Engine.getComponentProperties(...) + -> rawEngine.modelProperties.getModelProperties(...) ``` --- -## 8. 设置 (Setting) - -**按钮 ID**: `setting` -**功能**: 打开设置面板 -**保持激活**: 否 - -### 调用链 +## 8) 对外公共入口链路(仍走 EngineManager) +```text +外部业务代码 + -> bimEngine.engine?.loadModel(...) + -> EngineManager.loadModel(...) + -> Engine.loadModel(...) + -> rawEngine.loaderModule.loadModels(...) ``` -用户点击 [设置] 按钮 - │ - ▼ -Button onClick (buttons/setting/index.ts) - │ console.log('设置按钮被点击') - ▼ -⚠️ 暂未实现具体功能 -``` + +保留在 `EngineManager` 的公共 API: + +- `initialize(options?)` +- `isInitialized()` +- `loadModel(urls, options?)` +- `pauseRendering()` +- `resumeRendering()` +- `getEngineComponent()` +- `destroy()` --- -## 9. 信息 (Info) +## 9) 注意事项 -**按钮 ID**: `info` -**功能**: 打开信息对话框 -**保持激活**: 否 - -### 调用链 - -``` -用户点击 [信息] 按钮 - │ - ▼ -Button onClick (buttons/info/index.ts) - │ registry.emit('ui:open-dialog', { id: 'info' }) - ▼ -事件系统广播 'ui:open-dialog' 事件 - │ - ▼ -监听该事件的组件响应并打开信息对话框 -``` - ---- - -## 10. 全屏 (Fullscreen) - -**按钮 ID**: `fullscreen` -**功能**: 切换全屏模式 -**保持激活**: 否 - -### 调用链 - -``` -用户点击 [全屏] 按钮 - │ - ▼ -Button onClick (buttons/fullscreen/index.ts) - │ // 检测当前是否全屏 - │ const isFullscreen = !!document.fullscreenElement - │ - ├── 如果不是全屏: - │ targetElem.requestFullscreen({ navigationUI: 'hide' }) - │ ▼ - │ 浏览器 API: Element.requestFullscreen() - │ - └── 如果是全屏: - document.exitFullscreen() - ▼ - 浏览器 API: Document.exitFullscreen() -``` - -### 注意事项 - -- 全屏功能使用浏览器原生 API,不涉及底层 3D 引擎 -- 支持多种浏览器前缀:`webkitRequestFullscreen`、`mozRequestFullScreen`、`msRequestFullscreen` -- 在 iframe 中使用需要父级 iframe 标签添加 `allow="fullscreen"` 属性 - ---- - -## 附录:调用链层级说明 - -``` -┌─────────────────────────────────────────────────────────────────────┐ -│ L1: Toolbar Button │ -│ 文件: src/components/button-group/toolbar/buttons/*/index.ts │ -│ 职责: 定义按钮配置,处理 onClick 事件 │ -└────────────────────────────────┬────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────────┐ -│ L2: DialogManager │ -│ 文件: src/managers/*-dialog-manager.ts │ -│ 职责: 管理对话框生命周期,绑定 Panel 回调到 EngineManager │ -└────────────────────────────────┬────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────────┐ -│ L3: EngineManager │ -│ 文件: src/managers/engine-manager.ts │ -│ 职责: 代理 Engine 组件,提供统一 API,检查初始化状态 │ -└────────────────────────────────┬────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────────┐ -│ L4: Engine Component │ -│ 文件: src/components/engine/index.ts │ -│ 职责: 封装底层引擎,维护状态,进行数据转换 │ -└────────────────────────────────┬────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────────┐ -│ L5: 底层 3D 引擎 (iflow-engine-base) │ -│ 来源: 第三方 SDK │ -│ 职责: 实际 3D 渲染和功能实现 │ -└─────────────────────────────────────────────────────────────────────┘ -``` - ---- - -## 附录:ManagerRegistry 访问方式 - -```typescript -// 在 Button 中获取 Registry -const registry = ManagerRegistry.getInstance(); - -// 访问各个 Manager -registry.engine3d // EngineManager - 3D 引擎 -registry.toolbar // ToolbarManager - 工具栏 -registry.dialog // DialogManager - 对话框 -registry.measure // MeasureDialogManager - 测量 -registry.sectionPlane // SectionPlaneDialogManager - 拾取面剖切 -registry.sectionAxis // SectionAxisDialogManager - 轴向剖切 -registry.sectionBox // SectionBoxDialogManager - 剖切盒 -registry.walkControl // WalkControlManager - 漫游控制 -registry.map // MapDialogManager - 地图 -registry.componentDetail // ComponentDetailManager - 构件详情弹窗 -registry.componentDetail // ComponentDetailManager - 构件详情弹窗 -``` - ---- - -# 第二章:右键菜单 (Context Menu) - -右键菜单系统提供上下文相关的操作选项,根据当前状态动态生成菜单项。 - -## 2.1 构件详情 (Component Detail) - -**触发条件**: 用户右键点击,且有构件被选中 -**功能**: 打开构件详情弹窗,展示构件属性信息 - -### 调用链 - -``` -用户右键点击 3D 场景(有构件选中) - │ - ▼ -RightKeyManager.handleContextMenu() (managers/right-key-manager.ts) - │ 获取当前选中构件: registry.engine3d.getSelectedComponent() - │ 动态生成菜单项(包含"构件详情") - ▼ -用户点击 [构件详情] 菜单项 - │ - ▼ -MenuItem onClick (managers/engine-manager.ts:63-68) - │ registry.componentDetail?.show(selected.url, selected.id) - ▼ -ComponentDetailManager.show(url, id) (managers/component-detail-manager.ts) - │ 1. createDialog() - 创建右侧对话框(400px 宽) - │ 2. showLoading() - 显示"加载中..." - │ 3. registry.engine3d.getComponentProperties(url, id, callback) - ▼ -EngineManager.getComponentProperties(url, id, callback) - │ this.engineInstance.getComponentProperties(url, id, callback) - ▼ -Engine.getComponentProperties(url, id, callback) - │ this.engine.modelProperties.getModelProperties(url, id, callback) - ▼ -底层引擎 API: engine.modelProperties.getModelProperties(url, id, callback) - │ 异步回调返回属性数据 - ▼ -ComponentDetailManager.renderProperties(data) - │ 使用 BimCollapse + BimDescription 渲染属性 - ▼ -对话框显示构件属性(分类折叠面板 + 键值对列表) -``` - -### 数据流 - -```typescript -// 1. 选中信息 (从 Engine) -{ - url: string, // 模型 URL - id: string // 构件 ID -} - -// 2. 属性数据 (从底层引擎回调) -[ - { - categoryName: "基本属性", - items: [ - { key: "名称", value: "墙-001" }, - { key: "类型", value: "承重墙" } - ] - }, - { - categoryName: "尺寸", - items: [ - { key: "长度", value: "5000mm" }, - { key: "高度", value: "3000mm" } - ] - } -] - -// 3. UI 渲染 (BimCollapse) -- 每个 category → 一个折叠面板 -- items[] → BimDescription 键值对列表 -``` - -### 代码摘要 - -**动态菜单生成** (`managers/engine-manager.ts`): -```typescript -const selected = this.getSelectedComponent(); -if (selected) { - menuItems.push({ - id: 'component-detail', - label: 'menu.componentDetail', - group: 'component', - onClick: () => { - const registry = ManagerRegistry.getInstance(); - registry.componentDetail?.show(selected.url, selected.id); - this.rightKey?.hide(); - } - }); -} -``` - -**ComponentDetailManager** (`managers/component-detail-manager.ts`): -```typescript -public show(modelUrl: string, componentId: string): void { - this.createDialog(); - this.showLoading(); - - const registry = ManagerRegistry.getInstance(); - registry.engine3d?.getComponentProperties( - modelUrl, - componentId, - (data) => { - this.renderProperties(data); - } - ); -} -``` - ---- - -## 2.2 显示全部 (Show All) - -**触发条件**: 用户右键点击(任何情况) -**功能**: 显示所有已加载的模型构件 - -### 调用链 - -``` -用户右键点击 3D 场景 - │ - ▼ -RightKeyManager.handleContextMenu() - │ 动态生成菜单项(始终包含"显示全部") - ▼ -用户点击 [显示全部] 菜单项 - │ - ▼ -MenuItem onClick (managers/engine-manager.ts:71-77) - │ registry.engine3d?.showAllComponents() - ▼ -EngineManager.showAllComponents() - │ ⚠️ 方法尚未实现,当前为空方法 - ▼ -⚠️ 待实现:调用底层引擎 API 显示所有构件 -``` - -> **注意**: "显示全部"功能的底层 API 对接尚未完成,当前仅显示菜单项。 - ---- - -## 2.3 信息 (Info) - -**触发条件**: 用户右键点击(任何情况) -**功能**: 打开信息对话框 - -### 调用链 - -``` -用户右键点击 3D 场景 - │ - ▼ -RightKeyManager.handleContextMenu() - │ 动态生成菜单项(始终包含"信息") - ▼ -用户点击 [信息] 菜单项 - │ - ▼ -MenuItem onClick (managers/engine-manager.ts) - │ registry.emit('ui:open-dialog', { id: 'info' }) - │ this.rightKey?.hide() - ▼ -事件系统广播 'ui:open-dialog' 事件 - │ - ▼ -监听该事件的组件响应并打开信息对话框 -``` - ---- - -## 2.4 首页 (Home) - -**触发条件**: 用户右键点击(任何情况) -**功能**: 相机回到初始位置 - -### 调用链 - -``` -用户右键点击 3D 场景 - │ - ▼ -RightKeyManager.handleContextMenu() - │ 动态生成菜单项(始终包含"首页") - ▼ -用户点击 [首页] 菜单项 - │ - ▼ -MenuItem onClick (managers/engine-manager.ts) - │ registry.engine3d?.CameraGoHome() - │ this.rightKey?.hide() - ▼ -(调用链同 Toolbar 首页按钮) -``` - ---- - -## 右键菜单系统架构 - -### 动态菜单机制 - -```typescript -// 1. 注册处理器 (EngineManager.initialize) -const handler: RightKeyHandler = () => { - const menuItems: MenuItemConfig[] = []; - - // 根据选中状态动态生成菜单 - const selected = this.getSelectedComponent(); - if (selected) { - menuItems.push({ /* 构件详情 */ }); - } - - // 通用菜单项 - menuItems.push({ /* 显示全部 */ }); - menuItems.push({ /* 信息 */ }); - menuItems.push({ /* 首页 */ }); - - return menuItems; -}; - -registry.rightKey?.registerHandler('engine', handler); -``` - -### 菜单项配置结构 - -```typescript -interface MenuItemConfig { - id: string; // 唯一标识 - label: string; // 国际化 key - group?: string; // 分组(可选) - onClick: () => void; // 点击回调 -} -``` - ---- - -# 第三章:构件交互 (Component Interaction) - -构件交互系统处理用户与 3D 场景中构件的交互事件,包括选中和取消选中。 - -## 3.1 构件选中 (Component Selection) - -**触发**: 用户点击 3D 场景中的构件 -**效果**: 记录选中状态,可用于后续操作(如右键菜单、属性面板等) - -### 调用链 - -``` -用户点击 3D 场景中的构件 - │ - ▼ -[底层] interactionModule.handleMouseClick() (bim_engine_base) - │ 检测鼠标点击并进行射线拾取 - │ 获取点击到的物体信息 (hit) - ▼ -[底层] engine.events.trigger('click', hit) - │ hit = { object: { url, name }, point, distance, ... } - ▼ -[SDK] Engine.init() 中的 'click' 事件监听器 (components/engine/index.ts:127-136) - │ if (hit && hit.object) { - │ this.selectedComponent = { - │ url: hit.object.url, - │ id: hit.object.name - │ }; - │ console.log('[Engine] 构件选中:', this.selectedComponent); - │ } - ▼ -选中状态已记录在 Engine.selectedComponent -``` - -### 状态存储 - -```typescript -// Engine 组件 (components/engine/index.ts) -private selectedComponent: { url: string; id: string } | null = null; - -// 点击事件监听器 -this.engine.events.on('click', (hit: any) => { - if (hit && hit.object) { - this.selectedComponent = { - url: hit.object.url, - id: hit.object.name - }; - console.log('[Engine] 构件选中:', this.selectedComponent); - } else { - this.selectedComponent = null; - console.log('[Engine] 取消选中'); - } -}); -``` - -### 获取选中状态 - -```typescript -// Engine 方法 -public getSelectedComponent(): { url: string; id: string } | null { - return this.selectedComponent; -} - -// EngineManager 代理 -public getSelectedComponent(): { url: string; id: string } | null { - if (!this.engineInstance) { - console.warn('[EngineManager] Engine 尚未初始化'); - return null; - } - return this.engineInstance.getSelectedComponent(); -} - -// 使用示例 -const registry = ManagerRegistry.getInstance(); -const selected = registry.engine3d?.getSelectedComponent(); -if (selected) { - console.log(`选中构件: ${selected.url}#${selected.id}`); -} -``` - ---- - -## 3.2 取消选中 (Deselection) - -**触发**: 用户点击 3D 场景的空白区域 -**效果**: 清除选中状态 - -### 调用链 - -``` -用户点击 3D 场景空白区域 - │ - ▼ -[底层] interactionModule.handleMouseClick() - │ 射线拾取未命中任何物体 - ▼ -[底层] engine.events.trigger('click', null) - │ hit = null(表示未点击到任何物体) - ▼ -[SDK] Engine.init() 中的 'click' 事件监听器 - │ if (hit && hit.object) { ... } - │ else { - │ this.selectedComponent = null; - │ console.log('[Engine] 取消选中'); - │ } - ▼ -选中状态已清除 -``` - ---- - -## 构件交互数据流 - -``` -┌─────────────────────────────────────────────────────────────────┐ -│ [底层] 3D 引擎 - 事件系统 │ -│ engine.events.trigger('click', hit) │ -└────────────────────────────┬────────────────────────────────────┘ - │ - ▼ hit: { object: {url, name}, ... } | null -┌─────────────────────────────────────────────────────────────────┐ -│ [SDK] Engine 组件 - 事件监听 + 状态管理 │ -│ - 监听 'click' 事件 │ -│ - 更新 selectedComponent 状态 │ -│ - 提供 getSelectedComponent() 方法 │ -└────────────────────────────┬────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────┐ -│ [SDK] EngineManager - 状态代理 │ -│ - 代理 getSelectedComponent() 方法 │ -│ - 供其他 Manager 调用 │ -└────────────────────────────┬────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────┐ -│ [SDK] 消费者 - 使用选中状态 │ -│ - RightKeyManager: 动态生成右键菜单 │ -│ - ComponentDetailManager: 显示构件详情 │ -│ - ComponentDetailManager: 显示构件详情弹窗 │ -│ - ... 其他需要选中状态的功能 │ -└─────────────────────────────────────────────────────────────────┘ -``` - ---- - -## 使用场景示例 - -### 场景 1: 右键菜单根据选中状态显示不同菜单项 - -```typescript -// RightKeyManager.handleContextMenu() -const handler: RightKeyHandler = () => { - const menuItems: MenuItemConfig[] = []; - - // 检查是否有选中的构件 - const selected = registry.engine3d?.getSelectedComponent(); - - if (selected) { - // 有选中构件:显示"构件详情"菜单 - menuItems.push({ - id: 'component-detail', - label: 'menu.componentDetail', - onClick: () => { - registry.componentDetail?.show(selected.url, selected.id); - } - }); - } - - // 通用菜单项(无论是否选中都显示) - menuItems.push({ - id: 'show-all', - label: 'menu.showAll', - onClick: () => { /* ... */ } - }); - - return menuItems; -}; -``` - -### 场景 2: 构件详情面板获取当前选中构件 - -```typescript -// ComponentDetailManager -public showCurrentSelection(): void { - const registry = ManagerRegistry.getInstance(); - const selected = registry.engine3d?.getSelectedComponent(); - - if (!selected) { - console.warn('未选中任何构件'); - return; - } - - // 使用选中信息加载构件详情 - this.show(selected.url, selected.id); -} -``` - ---- - -## 附录:完整 ManagerRegistry 访问方式(更新) - -```typescript -// 在任意位置获取 Registry -const registry = ManagerRegistry.getInstance(); - -// 访问各个 Manager -registry.engine3d // EngineManager - 3D 引擎 -registry.toolbar // ToolbarManager - 工具栏 -registry.dialog // DialogManager - 对话框 -registry.rightKey // RightKeyManager - 右键菜单 -registry.measure // MeasureDialogManager - 测量 -registry.sectionPlane // SectionPlaneDialogManager - 拾取面剖切 -registry.sectionAxis // SectionAxisDialogManager - 轴向剖切 -registry.sectionBox // SectionBoxDialogManager - 剖切盒 -registry.walkControl // WalkControlManager - 漫游控制 -registry.map // MapDialogManager - 地图 -registry.componentDetail // ComponentDetailManager - 构件详情弹窗 -registry.componentDetail // ComponentDetailManager - 构件详情弹窗(新增) -``` +- 旧写法 `registry.engine3d?.xxx()`(大量透传)已不再推荐 +- 旧接口 `Engine.getEngine()` 已删除 +- 事件订阅请统一使用 `onRawEvent/offRawEvent` +- `menu/buttons/*` 中 `registry.engine3d?.rightKey?.hide()` 仍可用(`rightKey` 保留在 `EngineManager`) diff --git a/docs/ENGINNE_3D/API文档.md b/docs/ENGINNE_3D/API文档.md index cf5f06d..e94c018 100644 --- a/docs/ENGINNE_3D/API文档.md +++ b/docs/ENGINNE_3D/API文档.md @@ -2,6 +2,21 @@ 本文档为 BIM Engine SDK 的完整 API 参考,适合大模型阅读和理解引擎的功能结构。 +> 2026-03 更新说明(SDK 接入层) +> +> 本文档主体描述的是底层 3D 内核与模块能力。SDK 接入层在本次重构后有以下关键变化: +> +> 1. `EngineManager` 已收敛为少量公共 API,不再作为全量透传层。 +> 2. SDK 内部 Manager 统一通过 `BaseManager.engineComponent` 直接访问 `Engine` 组件能力。 +> 3. 非 Manager 组件通过 `registry.engine3d?.getEngineComponent()?.xxx()` 访问 `Engine` 组件。 +> 4. `Engine.getEngine()` 已移除,原始事件访问改为 `onRawEvent()/offRawEvent()`。 +> +> 若你在接入层实现新功能,请优先参考: +> +> - `docs/架构设计.md` +> - `docs/API调用链.md` +> - `docs/引擎API对接.md` + ## 目录 1. [核心引擎类](#1-核心引擎类) diff --git a/docs/MODULES/管理器模块.md b/docs/MODULES/管理器模块.md index 19db008..3922cbf 100644 --- a/docs/MODULES/管理器模块.md +++ b/docs/MODULES/管理器模块.md @@ -2,39 +2,45 @@ ## 模块概述 -| 项目 | 内容 | -|------|------| -| **模块名** | managers | -| **职责** | 处理业务逻辑,协调组件交互,管理组件生命周期 | -| **公开 API** | 15 个 Manager 类 | -| **状态** | ✅ 稳定 | +`src/managers/` 负责业务编排与生命周期管理,不直接承载底层 3D 细节。 + +2026-03 更新后,管理器层的核心变化: + +- `EngineManager` 从“全量透传”改为“对外公共 API + 初始化编排” +- `BaseManager` 新增 `engineComponent` getter,内部管理器直接调用 `Engine` 组件 +- Manager 层统一收敛为“编排者”,而不是“透传中间层” + +--- ## 代码地图 -``` +```text src/managers/ -├── engine-manager.ts # 3D 引擎管理器 -├── toolbar-manager.ts # 工具栏管理器 -├── dialog-manager.ts # 对话框管理器 -├── button-group-manager.ts # 按钮组管理器 -├── right-key-manager.ts # 右键菜单管理器 -├── component-detail-manager.ts # 构件详情弹窗管理器 -├── construct-tree-manager-btn.ts # 构件树管理器 -├── walk-control-manager.ts # 漫游控制管理器 -├── measure-dialog-manager.ts # 测量对话框管理器 -├── section-plane-dialog-manager.ts # 平面剖切对话框管理器 -├── section-box-dialog-manager.ts # 剖切盒对话框管理器 -├── section-axis-dialog-manager.ts # 轴向剖切对话框管理器 -├── map-dialog-manager.ts # 地图对话框管理器 -├── walk-path-dialog-manager.ts # 漫游路径对话框管理器 -└── walk-plan-view-dialog-manager.ts # 漫游平面图对话框管理器 +├── engine-manager.ts +├── toolbar-manager.ts +├── dialog-manager.ts +├── button-group-manager.ts +├── right-key-manager.ts +├── component-detail-manager.ts +├── construct-tree-manager-btn.ts +├── walk-control-manager.ts +├── measure-dialog-manager.ts +├── section-plane-dialog-manager.ts +├── section-axis-dialog-manager.ts +├── section-box-dialog-manager.ts +├── map-dialog-manager.ts +├── walk-path-dialog-manager.ts +├── walk-plan-view-dialog-manager.ts +├── setting-dialog-manager.ts +├── engine-info-dialog-manager.ts +└── ai-chat-manager.ts ``` -## 管理器分类 +--- -### 按继承关系 +## 继承关系 -``` +```text BaseManager ├── EngineManager ├── ToolbarManager @@ -43,9 +49,12 @@ BaseManager ├── RightKeyManager ├── ComponentDetailManager ├── ConstructTreeManagerBtn -└── WalkControlManager +├── WalkControlManager +├── SettingDialogManager +├── EngineInfoDialogManager +└── AiChatManager -BaseDialogManager (继承自 BaseManager) +BaseDialogManager (extends BaseManager) ├── MeasureDialogManager ├── SectionPlaneDialogManager ├── SectionAxisDialogManager @@ -55,435 +64,100 @@ BaseDialogManager (继承自 BaseManager) └── WalkPlanViewDialogManager ``` -### 按功能分类 +--- -| 类别 | 管理器 | 职责 | -|------|--------|------| -| **核心** | EngineManager | 3D 引擎管理 | -| **UI 容器** | ToolbarManager, DialogManager, ButtonGroupManager | 容器组件管理 | -| **交互** | RightKeyManager, ComponentDetailManager, ConstructTreeManagerBtn | 用户交互 | -| **3D 工具** | MeasureDialogManager, SectionPlaneDialogManager, SectionAxisDialogManager, SectionBoxDialogManager | 3D 操作工具 | -| **漫游** | WalkControlManager, WalkPathDialogManager, WalkPlanViewDialogManager, MapDialogManager | 漫游功能 | +## BaseManager 统一能力 + +文件:`src/core/base-manager.ts` + +```ts +protected get engineComponent(): Engine | null; +``` + +用途: + +- 内部 manager 直接调用 `Engine` 组件能力 +- 替代历史写法 `this.registry.engine3d?.xxx()` + +示例: + +```ts +this.engineComponent?.activeSection('box'); +this.engineComponent?.setWalkSpeed(speed); +``` --- -## EngineManager +## EngineManager(最新职责) -### 概述 +文件:`src/managers/engine-manager.ts` -管理 3D 引擎的初始化、模型加载和测量功能。 +### 职责 -### API +1. 创建/销毁 `Engine` 组件 +2. 创建/销毁 `RightKeyManager` +3. 组装右键菜单逻辑 +4. 暴露外部公共 API -```typescript +### 公共 API + +```ts class EngineManager extends BaseManager { - initialize(options?: EngineOptions): void; + rightKey: RightKeyManager | null; + + getEngineComponent(): Engine | null; + initialize(options?: Omit): boolean; isInitialized(): boolean; - loadModel(url: string, options?: ModelLoadOptions): void; - getEngine(): any; - CameraGoHome(): void; - activateMeasure(mode: MeasureMode): void; - deactivateMeasure(): void; - getCurrentMeasureType(): MeasureMode | null; + loadModel(urls: string[], options?: ModelLoadOptions): void; + pauseRendering(): void; + resumeRendering(): void; destroy(): void; } ``` -### 使用示例 +说明: -```typescript -const engine = new EngineManager(container); -engine.initialize(); -engine.loadModel('model.gltf', { autoFit: true }); -engine.activateMeasure('distance'); +- 不再提供 `activateMeasure()/activeSection()/setWalkSpeed()` 等透传 API +- 这些能力由内部 manager 直接调用 `engineComponent` + +--- + +## 各管理器职责分层 + +| 类别 | 代表 Manager | 主要职责 | +|---|---|---| +| 核心入口 | `EngineManager` | 引擎生命周期与外部 API | +| UI 容器 | `ToolbarManager`, `DialogManager`, `ButtonGroupManager` | UI 容器与通用交互 | +| 业务编排 | `MeasureDialogManager`, `Section*DialogManager`, `WalkControlManager`, `SettingDialogManager` | 对话框/面板回调与引擎能力编排 | +| 数据/交互 | `ConstructTreeManagerBtn`, `ComponentDetailManager`, `RightKeyManager` | 构件树、属性、右键菜单 | + +--- + +## 推荐调用方式 + +### Manager 内部 + +```ts +// 推荐 +this.engineComponent?.setSectionBoxRange(range); + +// 不推荐 +this.registry.engine3d?.setSectionBoxRange(range); +``` + +### 非 Manager 组件 + +```ts +registry.engine3d?.getEngineComponent()?.toggleMiniMap(); ``` --- -## ToolbarManager +## 迁移约束(团队规范) -### 概述 +新增功能时遵循: -管理底部工具栏的按钮配置、显示控制、主题管理。 - -### API - -```typescript -class ToolbarManager extends BaseManager { - addGroup(groupId: string, beforeGroupId?: string): void; - addButton(config: ButtonConfig): void; - setBtnActive(id: string, active?: boolean): void; - setButtonVisibility(id: string, visible: boolean): void; - setShowLabel(show: boolean): void; - updateTheme(theme: ThemeConfig): void; - setBackgroundColor(color: string): void; - setColors(colors: ButtonGroupColors): void; - show(): void; - hide(): void; - setVisible(visible: boolean): void; - refresh(): void; - destroy(): void; -} -``` - -### 使用示例 - -```typescript -const toolbar = new ToolbarManager(container); - -toolbar.addGroup('custom-group'); -toolbar.addButton({ - id: 'custom-btn', - groupId: 'custom-group', - type: 'button', - label: 'Custom', - icon: '...', - onClick: () => console.log('Clicked') -}); - -toolbar.setBtnActive('custom-btn', true); -``` - ---- - -## DialogManager - -### 概述 - -创建和管理通用对话框实例。 - -### API - -```typescript -class DialogManager extends BaseManager { - create(options: DialogOptions): BimDialog; - showInfoDialog(): void; - updateTheme(theme: ThemeConfig): void; - destroy(): void; -} -``` - -### 使用示例 - -```typescript -const dialogManager = new DialogManager(container); - -const dialog = dialogManager.create({ - title: 'My Dialog', - content: element, - width: 400, - onClose: () => console.log('Closed') -}); -``` - ---- - -## MeasureDialogManager - -### 概述 - -管理测量工具的对话框和测量面板。 - -### API - -```typescript -class MeasureDialogManager extends BaseDialogManager { - getActiveMode(): MeasureMode; - switchMode(mode: MeasureMode): void; - setMeasureResult(result: MeasureResult | null): void; - getConfig(): MeasureConfig; - setConfig(partial: Partial, persist?: boolean): void; - clearAll(): void; - openSettings(): void; - show(): void; - hide(): void; - toggle(): void; -} -``` - -### 测量模式 - -| 模式 | 说明 | -|------|------| -| `distance` | 距离测量 | -| `minDistance` | 最小距离 | -| `angle` | 角度测量 | -| `elevation` | 标高测量 | -| `volume` | 体积测量 | -| `laserDistance` | 激光测距 | -| `slope` | 坡度测量 | -| `spaceVolume` | 空间体积 | - -### 使用示例 - -```typescript -const measure = new MeasureDialogManager(); -measure.show(); -measure.switchMode('distance'); - -const config = measure.getConfig(); -measure.setConfig({ unit: 'cm', precision: 1 }); -``` - ---- - -## SectionPlaneDialogManager - -### 概述 - -管理平面剖切工具对话框。 - -### API - -```typescript -class SectionPlaneDialogManager extends BaseDialogManager { - show(): void; - hide(): void; - toggle(): void; - isOpen(): boolean; -} -``` - ---- - -## SectionAxisDialogManager - -### 概述 - -管理轴向剖切工具对话框。 - -### API - -```typescript -class SectionAxisDialogManager extends BaseDialogManager { - getHiddenState(): boolean; - setHiddenState(isHidden: boolean): void; - getActiveAxis(): 'x' | 'y' | 'z'; - setActiveAxis(axis: 'x' | 'y' | 'z'): void; - show(): void; - hide(): void; - toggle(): void; -} -``` - -### 使用示例 - -```typescript -const sectionAxis = new SectionAxisDialogManager(); -sectionAxis.show(); -sectionAxis.setActiveAxis('y'); -``` - ---- - -## SectionBoxDialogManager - -### 概述 - -管理剖切盒工具对话框。 - -### API - -```typescript -class SectionBoxDialogManager extends BaseDialogManager { - getHiddenState(): boolean; - setHiddenState(isHidden: boolean): void; - getReversedState(): boolean; - setReversedState(isReversed: boolean): void; - getRange(): SectionBoxRange; - setRange(range: Partial): void; - show(): void; - hide(): void; - toggle(): void; -} - -interface SectionBoxRange { - minX: number; - maxX: number; - minY: number; - maxY: number; - minZ: number; - maxZ: number; -} -``` - -### 使用示例 - -```typescript -const sectionBox = new SectionBoxDialogManager(); -sectionBox.show(); - -const range = sectionBox.getRange(); -sectionBox.setRange({ minX: 0, maxX: 100 }); -sectionBox.setReversedState(true); -``` - ---- - -## WalkControlManager - -### 概述 - -管理漫游控制面板和相关交互。 - -### API - -```typescript -class WalkControlManager extends BaseManager { - init(): void; - show(): void; - hide(): void; - destroy(): void; -} -``` - -### 事件 - -| 事件 | 说明 | -|------|------| -| `walk:plan-view-toggle` | 平面图切换 | -| `walk:path-mode-toggle` | 路径模式切换 | -| `walk:walk-mode-toggle` | 漫游模式切换 | -| `walk:speed-change` | 速度变化 | -| `walk:gravity-toggle` | 重力开关 | -| `walk:collision-toggle` | 碰撞开关 | - ---- - -## ComponentDetailManager - -### 概述 - -管理构件详情弹窗(属性展示)的显示。 - -### API - -```typescript -class ComponentDetailManager extends BaseManager { - init(): void; - show(): void; - isOpen(): boolean; - hide(): void; - destroy(): void; -} -``` - ---- - -## ConstructTreeManagerBtn - -### 概述 - -管理构件树按钮和对话框。 - -### API - -```typescript -class ConstructTreeManagerBtn extends BaseManager { - openConstructTreeDialog(): void; - addGroup(groupId: string, beforeGroupId?: string): void; - addButton(config: ButtonConfig): void; - setButtonVisibility(id: string, visible: boolean): void; - setShowLabel(show: boolean): void; - setVisible(visible: boolean): void; - setBackgroundColor(color: string): void; - setColors(colors: ButtonGroupColors): void; - refresh(): void; - destroy(): void; -} -``` - ---- - -## RightKeyManager - -### 概述 - -管理右键上下文菜单。 - -### API - -```typescript -class RightKeyManager extends BaseManager { - registerHandler(handler: ContextMenuHandler): void; - showMenu(x: number, y: number, items: MenuItemConfig[], groupOrder?: string[]): void; - hide(): void; - destroy(): void; -} - -type ContextMenuHandler = (e: MouseEvent) => MenuItemConfig[]; -``` - -### 使用示例 - -```typescript -const rightKey = new RightKeyManager(container); - -rightKey.registerHandler((e) => [ - { id: 'view', label: 'View', onClick: () => {} }, - { id: 'delete', label: 'Delete', onClick: () => {} } -]); -``` - ---- - -## ButtonGroupManager - -### 概述 - -创建和管理多个按钮组实例。 - -### API - -```typescript -class ButtonGroupManager extends BaseManager { - create(id: string, options: ButtonGroupOptions): BimButtonGroup; - get(id: string): BimButtonGroup | undefined; - updateTheme(theme: ThemeConfig): void; - destroy(): void; -} -``` - ---- - -## 交互流程 - -### 工具栏按钮触发测量 - -``` -ToolbarManager (按钮点击) - ↓ -MeasureDialogManager.show() - ↓ -onModeChange 事件 - ↓ -EngineManager.activateMeasure(mode) - ↓ -3D 引擎进入测量模式 -``` - -### 漫游模式激活 - -``` -ToolbarManager (walk 按钮) - ↓ -WalkControlManager.show() - ↓ -隐藏底部工具栏 - ↓ -显示漫游控制面板 -``` - ---- - -## 依赖关系 - -所有 Manager 都依赖: -- `BaseManager` 或 `BaseDialogManager` -- `ManagerRegistry` - -各 Manager 之间通过事件系统通信,避免直接依赖。 - ---- - -**文档生成时间**: 2026-01-23 +1. 先在 `Engine` 组件实现能力 +2. 内部 manager 通过 `engineComponent` 访问 +3. 仅当确有外部 SDK 需求时,才新增 `EngineManager` 公共方法 +4. 不新增大规模透传方法 diff --git a/docs/引擎API对接.md b/docs/引擎API对接.md index 7c57f88..f24f7af 100644 --- a/docs/引擎API对接.md +++ b/docs/引擎API对接.md @@ -1,679 +1,173 @@ -# Engine API 接口对接指南 +# Engine API 对接指南(2026-03) -本文档详细说明 iflow-engine SDK 中 Toolbar 按钮如何调用底层 3D 引擎 API 的完整调用链。 +本文档说明 SDK 层与底层 `iflow-engine-base` 的最新对接方式。 + +## 核心原则 + +1. `Engine` 组件是底层能力封装层(状态管理 + 参数转换 + 底层调用) +2. `EngineManager` 只保留少量对外公共 API,不再做全量透传 +3. 内部 Manager 直接通过 `this.engineComponent` 调 `Engine` +4. 非 Manager 组件通过 `registry.engine3d?.getEngineComponent()` 调 `Engine` +5. 不暴露 raw engine 实例,事件订阅走 `onRawEvent/offRawEvent` --- -## 目录 +## 对接层级 -1. [架构概览](#架构概览) -2. [调用链层级](#调用链层级) -3. [完整调用链示例:剖切盒](#完整调用链示例剖切盒) -4. [各层职责说明](#各层职责说明) -5. [新增功能对接步骤](#新增功能对接步骤) -6. [数据流向](#数据流向) - ---- - -## 架构概览 - -``` -┌─────────────────────────────────────────────────────────────────────┐ -│ 用户交互层 │ -│ Toolbar Button (src/components/button-group/toolbar/buttons/*) │ -└────────────────────────────────┬────────────────────────────────────┘ - │ onClick → registry.xxxManager.show() - ▼ -┌─────────────────────────────────────────────────────────────────────┐ -│ 对话框管理层 (DialogManager) │ -│ src/managers/*-dialog-manager.ts │ -│ 继承自 BaseDialogManager,管理 UI 面板生命周期 │ -└────────────────────────────────┬────────────────────────────────────┘ - │ Panel 回调 → registry.engine3d.xxx() - ▼ -┌─────────────────────────────────────────────────────────────────────┐ -│ 引擎管理层 (EngineManager) │ -│ src/managers/engine-manager.ts │ -│ 封装 Engine 组件,提供统一 API │ -└────────────────────────────────┬────────────────────────────────────┘ - │ 调用 this.engineInstance.xxx() - ▼ -┌─────────────────────────────────────────────────────────────────────┐ -│ 引擎组件层 (Engine Component) │ -│ src/components/engine/index.ts │ -│ 封装底层 3D 引擎,处理状态管理和数据转换 │ -└────────────────────────────────┬────────────────────────────────────┘ - │ 调用 this.engine.xxx.xxx() - ▼ -┌─────────────────────────────────────────────────────────────────────┐ -│ 底层 3D 引擎 (iflow-engine-base) │ -│ 第三方 SDK,通过 createEngine() 创建实例 │ -└─────────────────────────────────────────────────────────────────────┘ +```text +L1 UI 层(Button/Panel/Dialog) + -> L2 Manager 层(业务编排) + -> L3 Engine 组件(统一封装) + -> L4 iflow-engine-base(底层能力) ``` --- -## 调用链层级 +## A. 对外 API(EngineManager) -| 层级 | 文件位置 | 职责 | -|------|----------|------| -| **L1: Toolbar Button** | `src/components/button-group/toolbar/buttons/` | 定义按钮配置,处理点击事件 | -| **L2: DialogManager** | `src/managers/*-dialog-manager.ts` | 管理对话框/面板 UI,绑定回调 | -| **L3: EngineManager** | `src/managers/engine-manager.ts` | 封装引擎组件,提供公共 API | -| **L4: Engine Component** | `src/components/engine/index.ts` | 封装底层引擎,处理状态和转换 | -| **L5: 底层引擎** | `iflow-engine-base` (npm 包) | 实际 3D 渲染和功能实现 | +对外稳定入口:`bimEngine.engine` ---- - -## 完整调用链示例:剖切盒 - -以剖切盒(Section Box)功能为例,展示完整的调用链: - -### 1. Toolbar Button 定义 - -**文件**: `src/components/button-group/toolbar/buttons/section/section-box/index.ts` - -```typescript -export const createSectionBoxButton = (): ButtonConfig => { - return { - id: 'section-box', - groupId: 'group-1', - parentId: 'section', // 父菜单 ID - type: 'button', - keepActive: true, // 保持激活状态 - exclusive: true, // 互斥(同组只能激活一个) - label: 'toolbar.sectionBox', // 国际化 key - icon: getIcon('剖切盒'), - onClick: (button) => { - const registry = ManagerRegistry.getInstance(); - if (button.isActive) { - registry.sectionBox?.show(); // ← 调用 DialogManager - } else { - registry.sectionBox?.hide(); - } - } - }; -}; -``` - -**要点**: -- 通过 `ManagerRegistry.getInstance()` 获取全局管理器实例 -- `button.isActive` 表示当前激活状态 -- 调用 `registry.sectionBox.show()` 打开对话框 - -### 2. DialogManager 处理 - -**文件**: `src/managers/section-box-dialog-manager.ts` - -```typescript -export class SectionBoxDialogManager extends BaseDialogManager { - private panel: SectionBoxPanel | null = null; - - // 创建对话框内容,绑定 Panel 回调 - protected createContent(): HTMLElement { - this.panel = new SectionBoxPanel({ - onFitToModel: () => { - console.log('[SectionBoxDialogManager] Fit to model not supported'); - }, - onReset: () => { - console.log('[SectionBoxDialogManager] Reset not supported'); - }, - onRangeChange: (range) => { - this.registry.engine3d?.setSectionBoxRange(range); - } - }); - this.panel.init(); - return this.panel.element; - } - - // 对话框创建后,激活剖切盒 - protected onDialogCreated(): void { - this.registry.engine3d?.activeSection('box'); // ← 调用 EngineManager 统一 API - this.dialog?.fitHeight(false); - } - - // 对话框销毁前,停用剖切 - protected onBeforeDestroy(): void { - this.registry.engine3d?.deactivateSection(); // ← 统一停用方法 - // ... 清理 - } - - // 对话框关闭时,取消工具栏按钮激活 - protected onDialogClose(): void { - this.registry.toolbar?.setBtnActive('section-box', false); - } +```ts +interface EngineManagerPublicApi { + initialize(options?: Omit): boolean; + isInitialized(): boolean; + loadModel(urls: string[], options?: ModelLoadOptions): void; + pauseRendering(): void; + resumeRendering(): void; + getEngineComponent(): Engine | null; + destroy(): void; } ``` -**要点**: -- 继承 `BaseDialogManager`,自动获得 `show()/hide()/toggle()` 方法 -- 通过 `this.registry.engine3d` 访问 EngineManager -- Panel 的回调函数中调用 EngineManager 方法 -- 生命周期钩子:`onDialogCreated` / `onBeforeDestroy` / `onDialogClose` +`EngineManager` 内部仍负责: -### 3. EngineManager 封装 +- 创建 `Engine` 实例 +- 创建并持有 `RightKeyManager` +- 组装右键菜单逻辑 -**文件**: `src/managers/engine-manager.ts` +--- -```typescript -export class EngineManager extends BaseManager { - private engineInstance: Engine | null = null; +## B. 内部 Manager 对接(推荐) - // 激活剖切(统一入口) - public activeSection(mode: 'x' | 'y' | 'z' | 'box' | 'face'): void { - if (!this.engineInstance) { - console.warn('[EngineManager] 3D Engine not initialized.'); - return; - } - this.engineInstance.activeSection(mode); // ← 调用 Engine 组件 - } +`BaseManager` 已提供: - // 获取当前剖切模式 - public getCurrentSectionMode(): 'x' | 'y' | 'z' | 'box' | 'face' | null { - if (!this.engineInstance) { - return null; - } - return this.engineInstance.getCurrentSectionMode(); - } - - // 停用剖切(统一出口) - public deactivateSection(): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.deactivateSection(); - } - - // 设置剖切盒范围 - public setSectionBoxRange(range: SectionBoxRange): void { - if (!this.engineInstance) { - console.warn('[EngineManager] 3D Engine not initialized.'); - return; - } - this.engineInstance.setSectionBoxRange(range); - } - - // ... 其他方法 -} +```ts +protected get engineComponent(): Engine | null; ``` -**要点**: -- 每个方法都要检查 `engineInstance` 是否存在 -- 方法签名与 Engine 组件一致,起到代理作用 -- 负责错误处理和日志输出 +### 示例:剖切盒 -### 4. Engine 组件实现 - -**文件**: `src/components/engine/index.ts` - -```typescript -export class Engine implements IBimComponent { - private engine: any = null; // 底层引擎实例 - private currentSectionMode: 'x' | 'y' | 'z' | 'box' | 'face' | null = null; // 当前剖切模式 - - // 激活剖切(统一入口) - public activeSection(mode: 'x' | 'y' | 'z' | 'box' | 'face'): void { - if (!this._isInitialized || !this.engine) { - console.error('[Engine] Cannot activate section box: engine not initialized.'); - return; - } - - if (!this.engine.clipping?.sectionBox) { - console.error('[Engine] Section box module not available.'); - return; - } - - if (this.isSectionBoxActive) { - return; // 幂等操作 - } - - // 保存模型包围盒(用于百分比计算) - this.sectionBoxFullBounds = this.engine.octreeBox?.getBoundingBox()?.clone(); - - // 调用底层 API - this.engine.clipping.sectionBox.active(); // ← 底层引擎 API - this.isSectionBoxActive = true; - } - - // 设置剖切盒范围(百分比 → 坐标转换) - public setSectionBoxRange(range: SectionBoxRange): void { - if (!this.sectionBoxFullBounds) { - console.error('[Engine] Cannot set section box range: full bounds not available.'); - return; - } - - const full = this.sectionBoxFullBounds; - - // 百分比转实际坐标 - const toCoord = (percent: number, min: number, max: number): number => { - return min + (max - min) * (percent / 100); - }; - - const xyz = { - minX: toCoord(range.x.min, full.min.x, full.max.x), - maxX: toCoord(range.x.max, full.min.x, full.max.x), - minY: toCoord(range.y.min, full.min.y, full.max.y), - maxY: toCoord(range.y.max, full.min.y, full.max.y), - minZ: toCoord(range.z.min, full.min.z, full.max.z), - maxZ: toCoord(range.z.max, full.min.z, full.max.z), - }; - - // 调用底层 API - this.engine.clipping.sectionBox.setboxXyz(xyz); // ← 底层引擎 API - } -} +```ts +this.engineComponent?.activeSection('box'); +this.engineComponent?.setSectionBoxRange(range); +this.engineComponent?.deactivateSection(); ``` -**要点**: -- 维护功能状态(`isSectionBoxActive`) -- 缓存必要数据(`sectionBoxFullBounds`) -- 进行数据转换(百分比 → 坐标) -- 调用底层引擎的实际 API +### 示例:漫游 -### 5. 底层引擎 API - -**来源**: `iflow-engine-base` (第三方 SDK) - -```typescript -// 剖切盒相关 API -engine.clipping.sectionBox.active() // 激活剖切盒 -engine.clipping.sectionBox.disActive() // 停用剖切盒 -engine.clipping.sectionBox.getboxXyz() // 获取范围 { minX, maxX, minY, maxY, minZ, maxZ } -engine.clipping.sectionBox.setboxXyz(xyz) // 设置范围 -engine.clipping.sectionBox.setBox(box) // 设置 THREE.Box3 格式范围 -engine.clipping.sectionBox.reverseBox() // 反向剖切(当前为空实现) - -// 获取模型包围盒 -engine.octreeBox.getBoundingBox() // 返回 THREE.Box3 +```ts +this.engineComponent?.activateFirstPersonMode(); +this.engineComponent?.setWalkSpeed(speed); +this.engineComponent?.deactivateFirstPersonMode(); ``` --- -## 各层职责说明 +## C. 非 Manager 组件对接 -### L1: Toolbar Button +适用于 toolbar 按钮、独立组件(如 `WalkPathPanel`): -| 职责 | 说明 | -|------|------| -| 定义按钮配置 | `id`, `label`, `icon`, `groupId`, `parentId` 等 | -| 处理点击事件 | 在 `onClick` 中调用 DialogManager 的 `show()`/`hide()` | -| 控制激活状态 | `keepActive`, `exclusive` 等属性控制按钮行为 | - -### L2: DialogManager - -| 职责 | 说明 | -|------|------| -| 管理对话框生命周期 | `show()` / `hide()` / `toggle()` | -| 创建 UI 面板 | 在 `createContent()` 中实例化 Panel 组件 | -| 绑定回调函数 | 将 Panel 的事件回调连接到 EngineManager | -| 处理生命周期钩子 | `onDialogCreated` / `onBeforeDestroy` / `onDialogClose` | -| 同步工具栏状态 | 关闭时调用 `toolbar.setBtnActive(id, false)` | - -### L3: EngineManager - -| 职责 | 说明 | -|------|------| -| 代理 Engine 组件 | 提供统一的公共 API | -| 检查初始化状态 | 每个方法都检查 `engineInstance` 是否存在 | -| 错误处理 | 输出警告日志 | -| 暴露给 Registry | 通过 `registry.engine3d` 访问 | - -### L4: Engine Component - -| 职责 | 说明 | -|------|------| -| 封装底层引擎 | 隔离第三方 SDK 的具体实现 | -| 状态管理 | 维护 `isSectionBoxActive` 等状态标记 | -| 数据转换 | UI 层数据格式 ↔ 底层引擎数据格式 | -| 缓存数据 | 保存 `sectionBoxFullBounds` 等中间数据 | -| 幂等操作 | 防止重复激活/停用 | - -### L5: 底层引擎 - -| 职责 | 说明 | -|------|------| -| 3D 渲染 | WebGL/Three.js 渲染 | -| 功能实现 | 测量、剖切、漫游等实际功能 | -| 场景管理 | 模型加载、相机控制等 | +```ts +registry.engine3d?.getEngineComponent()?.CameraGoHome(); +registry.engine3d?.getEngineComponent()?.activateZoomBox(); +registry.engine3d?.getEngineComponent()?.toggleMiniMap(); +``` --- -## 新增功能对接步骤 +## D. 原始事件对接(替代 getEngine) -以新增一个 "XX 功能" 为例: +`Engine.getEngine()` 已删除,改为事件桥接: -### Step 1: 创建 Toolbar Button - -**文件**: `src/components/button-group/toolbar/buttons/xx/index.ts` - -```typescript -import type { ButtonConfig } from '../../../index.type'; -import { getIcon } from '../../../../../utils/icon-manager'; -import { ManagerRegistry } from '../../../../../core/manager-registry'; - -export const createXxButton = (): ButtonConfig => { - return { - id: 'xx-feature', - groupId: 'group-1', - type: 'button', - keepActive: true, - label: 'toolbar.xxFeature', - icon: getIcon('XX图标'), - onClick: (button) => { - const registry = ManagerRegistry.getInstance(); - if (button.isActive) { - registry.xxFeature?.show(); - } else { - registry.xxFeature?.hide(); - } - } - }; -}; +```ts +engineComponent?.onRawEvent('measure-changed', handler); +engineComponent?.offRawEvent('measure-changed', handler); ``` -### Step 2: 注册按钮到 Toolbar +适用场景: -**文件**: `src/components/button-group/toolbar/index.ts` +- 测量回调(`measure-changed` / `measure-click`) +- 剖切盒拖动回调(`section-move`) -```typescript -// 添加导入 -const { createXxButton } = await import('./buttons/xx'); +--- -// 添加按钮 -this.addButton(createXxButton()); -``` +## E. 新功能对接步骤(最新模板) -### Step 3: 创建 DialogManager +### Step 1: 在 Engine 组件实现能力 -**文件**: `src/managers/xx-dialog-manager.ts` +文件:`src/components/engine/index.ts` -```typescript -import { BaseDialogManager } from '../core/base-dialog-manager'; -import { XxPanel } from '../components/xx-panel'; - -export class XxDialogManager extends BaseDialogManager { - private panel: XxPanel | null = null; - - protected get dialogId(): string { - return 'xx-dialog'; - } - - protected get dialogTitle(): string { - return 'xxFeature.dialogTitle'; - } - - protected createContent(): HTMLElement { - this.panel = new XxPanel({ - onSomeAction: () => { - this.registry.engine3d?.doSomething(); - } - }); - this.panel.init(); - return this.panel.element; - } - - protected onDialogCreated(): void { - this.registry.engine3d?.activateXx(); - } - - protected onBeforeDestroy(): void { - this.registry.engine3d?.deactivateXx(); - this.panel?.destroy(); - this.panel = null; - } - - protected onDialogClose(): void { - this.registry.toolbar?.setBtnActive('xx-feature', false); - } -} -``` - -### Step 4: 注册到 ManagerRegistry - -**文件**: `src/core/manager-registry.ts` - -```typescript -// 添加类型导入 -import type { XxDialogManager } from '../managers/xx-dialog-manager'; - -// 添加属性 -public xxFeature: XxDialogManager | null = null; -``` - -### Step 5: 在 BimEngine 中初始化 - -**文件**: `src/bim-engine.ts` - -```typescript -// 添加导入 -import { XxDialogManager } from './managers/xx-dialog-manager'; - -// 添加属性 -public xxFeature: XxDialogManager | null = null; - -// 在 init() 中初始化 -this.xxFeature = new XxDialogManager(); -this.registry.xxFeature = this.xxFeature; - -// 在 destroy() 中销毁 -this.xxFeature?.destroy(); -``` - -### Step 6: 在 EngineManager 中添加方法 - -**文件**: `src/managers/engine-manager.ts` - -```typescript +```ts public activateXx(): void { - if (!this.engineInstance) { - console.warn('[EngineManager] 3D Engine not initialized.'); - return; - } - this.engineInstance.activateXx(); + if (!this._isInitialized || !this.engine?.xxModule) return; + this.engine.xxModule.active(); } public deactivateXx(): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.deactivateXx(); -} - -public doSomething(): void { - if (!this.engineInstance) { - console.warn('[EngineManager] 3D Engine not initialized.'); - return; - } - this.engineInstance.doSomething(); + if (!this._isInitialized || !this.engine?.xxModule) return; + this.engine.xxModule.disActive(); } ``` -### Step 7: 在 Engine 组件中实现 +### Step 2: 在 Manager 中调用(不要新增 EngineManager 透传) -**文件**: `src/components/engine/index.ts` +文件:`src/managers/xx-dialog-manager.ts` -```typescript -private isXxActive: boolean = false; - -public activateXx(): void { - if (!this._isInitialized || !this.engine) { - console.error('[Engine] Cannot activate XX: engine not initialized.'); - return; - } - - if (this.isXxActive) { - return; - } - - // 调用底层 API - this.engine.xxModule.active(); - this.isXxActive = true; +```ts +protected onDialogCreated(): void { + this.engineComponent?.activateXx(); } -public deactivateXx(): void { - if (!this._isInitialized || !this.engine?.xxModule) { - return; - } - - if (!this.isXxActive) { - return; - } - - this.engine.xxModule.disActive(); - this.isXxActive = false; -} - -public doSomething(): void { - if (!this._isInitialized || !this.engine?.xxModule) { - return; - } - this.engine.xxModule.doSomething(); +protected onBeforeDestroy(): void { + this.engineComponent?.deactivateXx(); } ``` +### Step 3: 若是非 Manager 组件,走 getEngineComponent + +```ts +registry.engine3d?.getEngineComponent()?.activateXx(); +``` + +### Step 4: 仅当需要“对外 SDK 公共 API”时,再考虑给 EngineManager 增加方法 + +判定标准: + +- 该能力是否需要 `bimEngine.engine?.xxx()` 供外部用户直接调用 +- 若仅为内部链路使用,不应在 `EngineManager` 再包一层 + --- -## 数据流向 +## F. 常见反模式 -### 用户操作 → 底层引擎 +- ❌ 在 `EngineManager` 里新增大批 `this.engineInstance?.xxx()` 透传 +- ❌ 内部 Manager 继续写 `this.registry.engine3d?.xxx()` +- ❌ 通过 `Engine.getEngine()` 暴露 raw engine -``` -用户点击按钮 - ↓ -Button.onClick(button) - ↓ -registry.xxxManager.show() - ↓ -BaseDialogManager.show() - ↓ -createContent() → 创建 Panel - ↓ -onDialogCreated() → registry.engine3d.activateXxx() - ↓ -EngineManager.activateXxx() - ↓ -Engine.activateXxx() - ↓ -this.engine.xxxModule.active() ← 底层引擎 API -``` +对应正确方式: -### UI 面板操作 → 底层引擎 - -``` -用户操作 Panel(拖动滑块、点击按钮等) - ↓ -Panel 回调触发 onXxxChange(data) - ↓ -DialogManager 中的回调:registry.engine3d.setXxx(data) - ↓ -EngineManager.setXxx(data) - ↓ -Engine.setXxx(data) - ↓ -数据转换(如百分比 → 坐标) - ↓ -this.engine.xxxModule.setXxx(convertedData) ← 底层引擎 API -``` - -### 关闭对话框 - -``` -用户点击关闭按钮 / 再次点击工具栏按钮 - ↓ -BimDialog.onClose() / Button.onClick() - ↓ -BaseDialogManager.hide() / registry.xxxManager.hide() - ↓ -destroyDialog() - ↓ -onBeforeDestroy() → registry.engine3d.deactivateXxx() - ↓ -EngineManager.deactivateXxx() - ↓ -Engine.deactivateXxx() - ↓ -this.engine.xxxModule.disActive() ← 底层引擎 API - ↓ -onDialogClose() → registry.toolbar.setBtnActive('xxx', false) -``` +- ✅ 内部 Manager 使用 `this.engineComponent?.xxx()` +- ✅ 非 Manager 使用 `registry.engine3d?.getEngineComponent()?.xxx()` +- ✅ 原始事件使用 `onRawEvent/offRawEvent` --- -## 常见问题 +## G. 验收清单 -### Q1: 如何确保激活/停用的幂等性? +重构或新增功能后,至少检查: -在 Engine 组件中维护状态标记,在方法开头检查: - -```typescript -public activateSectionBox(): void { - // ... - if (this.isSectionBoxActive) { - console.log('[Engine] Section box already active, skipping.'); - return; // 幂等:已激活则跳过 - } - // ... -} -``` - -### Q2: 如何处理底层 API 不支持的功能? - -在 DialogManager 的回调中输出日志说明: - -```typescript -onReverseToggle: (isReversed) => { - // 底层暂不支持反向功能 - console.log('[SectionBoxDialogManager] 反向切换(底层暂不支持):', isReversed); -} -``` - -### Q3: 如何进行数据格式转换? - -在 Engine 组件中进行,不要在 DialogManager 或 EngineManager 中: - -```typescript -// Engine 组件中 -public setSectionBoxRange(range: SectionBoxRange): void { - // UI 层:百分比 (0-100) - // 底层:实际坐标 - - const toCoord = (percent: number, min: number, max: number): number => { - return min + (max - min) * (percent / 100); - }; - - const xyz = { - minX: toCoord(range.x.min, full.min.x, full.max.x), - // ... - }; - - this.engine.clipping.sectionBox.setboxXyz(xyz); -} -``` - -### Q4: 如何访问其他 Manager? - -通过 `ManagerRegistry` 单例访问: - -```typescript -// 在 Button 中 -const registry = ManagerRegistry.getInstance(); -registry.sectionBox?.show(); - -// 在 DialogManager 中(继承自 BaseManager,自动获得 this.registry) -this.registry.engine3d?.activateSectionBox(); -this.registry.toolbar?.setBtnActive('section-box', false); -``` - ---- - -## 总结 - -| 层级 | 关注点 | -|------|--------| -| **Button** | 按钮配置、点击事件、调用 DialogManager | -| **DialogManager** | UI 生命周期、Panel 回调绑定、调用 EngineManager | -| **EngineManager** | API 代理、初始化检查、错误处理 | -| **Engine** | 状态管理、数据转换、调用底层 API | -| **底层引擎** | 实际功能实现 | - -遵循这个分层架构,可以保持代码的清晰性和可维护性。 +1. `EngineManager` 是否只保留必要公共 API +2. Manager 层是否统一走 `engineComponent` +3. 是否无 `getEngine()` 调用 +4. 事件订阅是否成对 `onRawEvent/offRawEvent` +5. `npm run build` 是否通过 diff --git a/docs/架构设计.md b/docs/架构设计.md index dd5a77c..754d167 100644 --- a/docs/架构设计.md +++ b/docs/架构设计.md @@ -1,502 +1,153 @@ -# iflow-engine SDK 架构文档 +# iflow-engine SDK 架构设计 ## 概述 -iflow-engine 是一个面向开发者的 BIM 3D 引擎 SDK,采用分层架构设计,提供模型查看、测量、剖切、漫游等功能。 +iflow-engine 采用分层架构:`BimEngine` 作为入口,`ManagerRegistry` 作为实例级注册表,Manager 层负责编排,Component 层负责 UI/引擎封装,Services/Core 层提供基础能力。 -## 架构图 +2026-03 的核心调整: -``` -┌─────────────────────────────────────────────────────────────────┐ -│ BimEngine │ -│ (主入口 / 门面模式) │ -├─────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌─────────────────────────────────────────────────────────┐ │ -│ │ ManagerRegistry │ │ -│ │ (单例 / 全局注册表) │ │ -│ │ ┌─────────────────────────────────────────────────┐ │ │ -│ │ │ EventEmitter (事件总线) │ │ │ -│ │ └─────────────────────────────────────────────────┘ │ │ -│ └─────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────────────────────────────────────────────────┐ │ -│ │ Managers Layer │ │ -│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ -│ │ │EngineManager │ │ToolbarManager│ │ DialogManager│ │ │ -│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ -│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ -│ │ │MeasureDialog │ │SectionDialog │ │WalkControl │ │ │ -│ │ │Manager │ │Manager │ │Manager │ │ │ -│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ -│ │ ... (15 个管理器) │ │ -│ └─────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────────────────────────────────────────────────┐ │ -│ │ Components Layer │ │ -│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ -│ │ │ Engine │ │ Dialog │ │ Tree │ │ Menu │ │ButtonGr│ │ │ -│ │ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │ │ -│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ -│ │ │Collapse│ │ Tab │ │Descript│ │Measure │ │Section │ │ │ -│ │ │ │ │ │ │ │ │Panel │ │Panel │ │ │ -│ │ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │ │ -│ │ ... (20+ 个组件) │ │ -│ └─────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────────────────────────────────────────────────┐ │ -│ │ Services Layer │ │ -│ │ ┌──────────────────┐ ┌──────────────────┐ │ │ -│ │ │ LocaleManager │ │ ThemeManager │ │ │ -│ │ │ (国际化服务) │ │ (主题服务) │ │ │ -│ │ └──────────────────┘ └──────────────────┘ │ │ -│ └─────────────────────────────────────────────────────────┘ │ -│ │ -│ ┌─────────────────────────────────────────────────────────┐ │ -│ │ Core Layer │ │ -│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ -│ │ │ EventEmitter │ │ BaseManager │ │BaseDialog │ │ │ -│ │ │ │ │ │ │Manager │ │ │ -│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ -│ └─────────────────────────────────────────────────────────┘ │ -│ │ -└─────────────────────────────────────────────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────┐ -│ External Dependencies │ -│ ┌──────────────────────┐ ┌──────────────────────┐ │ -│ │ iflow-engine-base │ │ Three.js │ │ -│ │ (第三方 3D 引擎核心) │ │ (3D 渲染库) │ │ -│ └──────────────────────┘ └──────────────────────┘ │ -└─────────────────────────────────────────────────────────────────┘ -``` - -## 分层说明 - -### 1. BimEngine (入口层) - -**职责**: 作为 SDK 的唯一入口,整合所有功能,提供简洁的公开 API。 - -**设计模式**: 门面模式 (Facade Pattern) - -**核心 API**: -- 初始化引擎和容器 -- 设置主题和语言 -- 访问各个管理器 - -```typescript -const engine = new BimEngine('container', { - locale: 'zh-CN', - theme: 'dark' -}); - -// 访问管理器 -engine.engine.loadModel('model.gltf'); -engine.toolbar.show(); -engine.measure.show(); -``` - -### 2. ManagerRegistry (注册表层) - -**职责**: 全局单例,集中管理所有 Manager 实例,提供跨 Manager 通信。 - -**设计模式**: 单例模式 (Singleton) + 服务定位器 (Service Locator) - -**特点**: -- 避免 Manager 之间的循环依赖 -- 提供类型安全的事件系统 -- 支持动态访问任意 Manager - -```typescript -const registry = ManagerRegistry.getInstance(); -registry.toolbar?.show(); -registry.emit('engine:model-loaded', { url: 'model.gltf' }); -``` - -### 3. Managers Layer (管理器层) - -**职责**: 处理业务逻辑,协调组件交互,管理组件生命周期。 - -**设计模式**: 模板方法模式 (Template Method) - -**管理器分类**: - -| 类别 | 管理器 | 职责 | -|------|--------|------| -| 核心 | EngineManager | 3D 引擎管理 | -| UI 容器 | ToolbarManager, DialogManager, ButtonGroupManager | 容器组件管理 | -| 交互 | RightKeyManager, ComponentDetailManager, ConstructTreeManagerBtn | 用户交互 | -| 工具 | MeasureDialogManager, SectionPlaneDialogManager, SectionAxisDialogManager, SectionBoxDialogManager | 3D 操作工具 | -| 漫游 | WalkControlManager, WalkPathDialogManager, WalkPlanViewDialogManager, MapDialogManager | 漫游功能 | - -### 4. Components Layer (组件层) - -**职责**: 纯 UI 渲染,不包含业务逻辑。 - -**设计模式**: 组合模式 (Composite Pattern) - -**组件接口**: -```typescript -interface IBimComponent { - element: HTMLElement; - init(): void; - setTheme(theme: ThemeConfig): void; - setLocales?(): void; - destroy(): void; -} -``` - -**组件分类**: - -| 类别 | 组件 | 说明 | -|------|------|------| -| 核心 | Engine | 3D 视口容器 | -| 容器 | Dialog, Tree, Menu, ButtonGroup | 承载内容的容器组件 | -| 面板 | MeasurePanel, SectionPlanePanel, WalkControlPanel | 功能面板 | -| 展示 | Collapse, Tab, Description | 数据展示组件 | - -### 5. Services Layer (服务层) - -**职责**: 提供横切关注点的全局服务。 - -**设计模式**: 单例模式 + 观察者模式 - -| 服务 | 职责 | -|------|------| -| LocaleManager | 国际化,多语言支持 | -| ThemeManager | 主题管理,明暗切换 | - -### 6. Core Layer (核心层) - -**职责**: 提供基础设施和抽象。 - -| 类 | 职责 | -|-----|------| -| EventEmitter | 事件发布/订阅 | -| BaseManager | Manager 基类,提供注册表访问和事件管理 | -| BaseDialogManager | 对话框 Manager 基类,封装对话框生命周期 | - -## 设计模式详解 - -### 1. 单例模式 (Singleton) - -**应用**: ManagerRegistry, LocaleManager, ThemeManager - -**目的**: 确保全局唯一实例,提供全局访问点。 - -```typescript -export class ManagerRegistry { - private static instance: ManagerRegistry | null = null; - - public static getInstance(): ManagerRegistry { - if (!ManagerRegistry.instance) { - ManagerRegistry.instance = new ManagerRegistry(); - } - return ManagerRegistry.instance; - } - - public static reset(): void { - ManagerRegistry.instance = null; - } -} -``` - -### 2. 观察者模式 (Observer) - -**应用**: EventEmitter, 服务订阅 - -**目的**: 解耦事件发送者和接收者,支持多对多通信。 - -```typescript -// 订阅 -const unsubscribe = registry.on('engine:model-loaded', (payload) => { - console.log('Model loaded:', payload.url); -}); - -// 发布 -registry.emit('engine:model-loaded', { url: 'model.gltf' }); - -// 取消订阅 -unsubscribe(); -``` - -### 3. 模板方法模式 (Template Method) - -**应用**: BaseManager, BaseDialogManager - -**目的**: 定义算法骨架,允许子类重写特定步骤。 - -```typescript -export abstract class BaseDialogManager extends BaseManager { - // 模板方法 - public show(): void { - this.destroyDialog(); - const content = this.createContent(); // 抽象方法 - this.createDialog(content); - this.onDialogCreated(); // 钩子方法 - } - - // 抽象方法 - 子类必须实现 - protected abstract createContent(): HTMLElement; - - // 钩子方法 - 子类可选重写 - protected onDialogCreated(): void {} - protected onDialogClose(): void {} -} -``` - -### 4. 工厂模式 (Factory) - -**应用**: BimEngine 初始化 - -**目的**: 封装对象创建逻辑,统一创建流程。 - -```typescript -private init() { - this.engine = new EngineManager(this.wrapper); - this.dialog = new DialogManager(this.wrapper); - this.toolbar = new ToolbarManager(this.wrapper); - // ... 创建其他管理器 -} -``` - -## 数据流 - -### 1. 用户交互流 - -``` -用户操作 (点击按钮) - ↓ -Toolbar 组件捕获事件 - ↓ -ToolbarManager 处理 - ↓ -发送事件到 Registry - ↓ -目标 Manager 响应 - ↓ -更新相关组件 UI -``` - -### 2. 主题变更流 - -``` -用户调用 setTheme('dark') - ↓ -ThemeManager.setTheme() - ↓ -更新内部状态 - ↓ -通知所有订阅者 - ↓ -各组件 setTheme() 被调用 - ↓ -更新 CSS 变量和样式 -``` - -### 3. 国际化变更流 - -``` -用户调用 setLocale('en-US') - ↓ -LocaleManager.setLocale() - ↓ -更新内部状态 - ↓ -通知所有订阅者 - ↓ -各组件 setLocales() 被调用 - ↓ -重新渲染文本内容 -``` - -## 模块依赖关系 - -```mermaid -graph TD - BimEngine --> ManagerRegistry - BimEngine --> LocaleManager - BimEngine --> ThemeManager - - ManagerRegistry --> EventEmitter - - EngineManager --> BaseManager - ToolbarManager --> BaseManager - DialogManager --> BaseManager - - MeasureDialogManager --> BaseDialogManager - SectionPlaneDialogManager --> BaseDialogManager - WalkControlManager --> BaseManager - - BaseDialogManager --> BaseManager - BaseManager --> ManagerRegistry - - Engine --> ThemeManager - Dialog --> ThemeManager - Tree --> ThemeManager - Tree --> LocaleManager - Menu --> ThemeManager - Menu --> LocaleManager - - ThemeManager --> darkTheme - ThemeManager --> lightTheme - LocaleManager --> zhCN - LocaleManager --> enUS -``` - -## 扩展点 - -### 1. 添加新 Manager - -```typescript -import { BaseManager } from '../core/base-manager'; - -export class CustomManager extends BaseManager { - constructor() { - super(); - } - - public initialize(): void { - this.subscribe('engine:model-loaded', this.onModelLoaded.bind(this)); - } - - private onModelLoaded(payload: any): void { - // 处理逻辑 - } - - public destroy(): void { - super.destroy(); - } -} -``` - -### 2. 添加新对话框 Manager - -```typescript -import { BaseDialogManager } from '../core/base-dialog-manager'; - -export class CustomDialogManager extends BaseDialogManager { - protected get dialogId(): string { - return 'custom-dialog'; - } - - protected get dialogTitle(): string { - return 'custom.dialogTitle'; - } - - protected createContent(): HTMLElement { - const div = document.createElement('div'); - // 创建内容 - return div; - } -} -``` - -### 3. 添加新组件 - -```typescript -import type { ThemeConfig } from '../themes/types'; - -export class CustomComponent { - public element: HTMLElement; - - constructor(private options: CustomOptions) { - this.element = document.createElement('div'); - } - - public init(): void { - // 初始化 - } - - public setTheme(theme: ThemeConfig): void { - // 应用主题 - } - - public destroy(): void { - this.element.remove(); - } -} -``` - -### 4. 添加新语言 - -1. 创建语言文件 `src/locales/ja-JP.ts` -2. 更新类型 `src/locales/types.ts` -3. 注册到 LocaleManager - -### 5. 添加新主题 - -```typescript -import { createThemeFromPartial, lightTheme } from 'iflow-engine'; - -const customTheme = createThemeFromPartial(lightTheme, { - name: 'custom', - primary: '#ff6b6b', - // 其他自定义属性 -}); - -themeManager.setCustomTheme(customTheme); -``` - -## 事件系统 - -### 事件类型 - -| 类别 | 事件 | 数据 | -|------|------|------| -| UI | `ui:open-dialog` | `{ id: string; data?: any }` | -| UI | `ui:close-dialog` | `{ id: string }` | -| 引擎 | `engine:model-loaded` | `{ url: string }` | -| 引擎 | `engine:object-clicked` | `{ objectId: string; position: Point3D }` | -| 树 | `ui:tree-node-check` | `{ id: string; checked: boolean; node: any }` | -| 树 | `ui:tree-node-select` | `{ id: string; selected: boolean; node: any }` | -| 系统 | `sys:theme-changed` | `{ theme: string }` | -| 系统 | `sys:locale-changed` | `{ locale: string }` | -| 漫游 | `walk:speed-change` | `{ speed: number }` | -| 漫游 | `walk:path-mode-toggle` | `{ isActive: boolean }` | -| 地图 | `map:opened` | `{}` | -| 地图 | `map:closed` | `{}` | - -### 事件使用 - -```typescript -// 发送事件 -registry.emit('engine:model-loaded', { url: 'model.gltf' }); - -// 订阅事件 -const unsubscribe = registry.on('engine:model-loaded', (payload) => { - console.log('Model loaded:', payload.url); -}); - -// 在 Manager 中使用 -this.subscribe('engine:model-loaded', this.handleModelLoaded.bind(this)); -this.emit('custom:action', { data: 'value' }); -``` - -## 性能考虑 - -### 1. 懒加载 - -- 组件按需创建,不预先实例化 -- 对话框在首次 show() 时才创建 DOM - -### 2. 事件清理 - -- BaseManager 自动追踪订阅,destroy 时统一清理 -- 避免内存泄漏 - -### 3. DOM 操作优化 - -- 使用 requestAnimationFrame 节流拖拽/缩放 -- 批量 DOM 更新 - -### 4. 主题切换 - -- 使用 CSS 变量,避免重绘整个组件树 -- 订阅机制确保只更新必要的组件 +- `EngineManager` 从“大量透传”收敛为“少量公共 API + 生命周期编排” +- 内部 Manager 不再通过 `registry.engine3d?.xxx()` 间接透传,而是通过 `BaseManager.engineComponent` 直接访问 `Engine` 组件 +- 非 Manager 组件(如 toolbar 按钮、walk-path-panel)通过 `registry.engine3d?.getEngineComponent()?.xxx()` 访问 `Engine` +- `Engine.getEngine()` 已移除,改为 `onRawEvent()/offRawEvent()` 订阅底层事件 --- -**文档生成时间**: 2026-01-23 -**文档版本**: 1.0.0 +## 分层结构 + +```text +BimEngine (入口 / Facade) + └─ ManagerRegistry (实例级,不是全局单例) + ├─ Managers (业务编排) + │ ├─ EngineManager (公共 API + 初始化 + 右键菜单组装) + │ ├─ *DialogManager / *ControlManager + │ └─ ... + ├─ Components (UI + Engine 封装) + │ ├─ Engine (封装 iflow-engine-base) + │ ├─ Dialog/Toolbar/Panel... + │ └─ ... + ├─ Services (Theme / Locale) + └─ Core (EventEmitter / BaseManager / BaseDialogManager) +``` + +--- + +## ManagerRegistry 设计 + +`ManagerRegistry` 是 **实例模式**:每个 `BimEngine` 都创建独立 registry,支持多实例隔离。 + +- ✅ 无全局共享状态污染 +- ✅ 多画布/多引擎实例可并行 +- ✅ 事件总线隔离 + +关键文件:`src/core/manager-registry.ts` + +--- + +## Engine 访问策略(最新) + +### 1) 外部 SDK 用户 + +通过 `bimEngine.engine`(`EngineManager`)调用稳定公共 API: + +- `initialize(options?)` +- `isInitialized()` +- `loadModel(urls, options?)` +- `pauseRendering()` +- `resumeRendering()` +- `destroy()` + +### 2) 内部 Manager(BaseManager 子类) + +通过 `BaseManager` 新增 getter: + +```ts +protected get engineComponent(): Engine | null +``` + +直接调用 `Engine` 组件方法,例如: + +```ts +this.engineComponent?.activeSection('box'); +this.engineComponent?.setWalkSpeed(speed); +``` + +### 3) 非 Manager 组件 + +通过 registry 获取组件实例: + +```ts +registry.engine3d?.getEngineComponent()?.toggleMiniMap(); +``` + +--- + +## EngineManager 职责边界 + +`EngineManager` 现在聚焦在“入口能力 + 组装能力”: + +1. 创建并持有 `Engine` 组件实例 +2. 初始化并持有 `RightKeyManager` +3. 注册右键菜单项并编排右键行为 +4. 对外暴露少量稳定 API + +不再承担: + +- 对 `Engine` 全量方法的 1:1 透传 + +关键文件:`src/managers/engine-manager.ts` + +--- + +## 原始引擎事件订阅策略 + +为避免暴露底层 raw engine 实例,`Engine` 组件提供: + +- `onRawEvent(event, handler)` +- `offRawEvent(event, handler)` + +例如测量与剖切盒事件: + +```ts +this.engineComponent?.onRawEvent('measure-changed', handler); +this.engineComponent?.offRawEvent('measure-changed', handler); +``` + +关键文件:`src/components/engine/index.ts` + +--- + +## 典型调用链 + +### Toolbar Home + +```text +Button onClick + -> registry.engine3d?.getEngineComponent()?.CameraGoHome() + -> Engine.CameraGoHome() + -> rawEngine.viewCube.CameraGoHome() +``` + +### Section Box + +```text +SectionBoxDialogManager (BaseDialogManager) + -> this.engineComponent?.activeSection('box') + -> Engine.activeSection('box') + -> rawEngine.clipping.active('box') +``` + +--- + +## 设计收益 + +- 降低中间层重复代码:`EngineManager` 大幅瘦身 +- 减少三层转发链:Manager 可直接访问 `Engine` 组件 +- 对外 API 稳定:仍保留 `bimEngine.engine` 作为入口 +- 保持封装边界:不暴露 raw engine,仅开放受控事件桥接 + +--- + +## 后续建议 + +当前已完成“Manager 瘦身”阶段。若后续继续演进,可考虑将 `Engine` 组件按领域继续拆分(measure/section/walk/model/scene),进一步降低单类复杂度。 diff --git a/src/components/button-group/toolbar/buttons/home/index.ts b/src/components/button-group/toolbar/buttons/home/index.ts index ef8563f..a75b311 100644 --- a/src/components/button-group/toolbar/buttons/home/index.ts +++ b/src/components/button-group/toolbar/buttons/home/index.ts @@ -12,7 +12,7 @@ export const createHomeButton = (registry: ManagerRegistry): ButtonConfig => { keepActive: false, onClick: (button) => { console.log('首页按钮被点击:', button.id); - registry.engine3d?.CameraGoHome(); + registry.engine3d?.getEngineComponent()?.CameraGoHome(); } }; }; diff --git a/src/components/button-group/toolbar/buttons/map/index.ts b/src/components/button-group/toolbar/buttons/map/index.ts index 0bb06d7..ee26cc9 100644 --- a/src/components/button-group/toolbar/buttons/map/index.ts +++ b/src/components/button-group/toolbar/buttons/map/index.ts @@ -14,7 +14,7 @@ export const createMapButton = (registry: ManagerRegistry): ButtonConfig => { keepActive: true, icon: getIcon('地图'), onClick: () => { - registry.engine3d?.toggleMiniMap(); + registry.engine3d?.getEngineComponent()?.toggleMiniMap(); } }; }; diff --git a/src/components/button-group/toolbar/buttons/zoom-box/index.ts b/src/components/button-group/toolbar/buttons/zoom-box/index.ts index 8393e73..4c08227 100644 --- a/src/components/button-group/toolbar/buttons/zoom-box/index.ts +++ b/src/components/button-group/toolbar/buttons/zoom-box/index.ts @@ -11,7 +11,7 @@ export const createZoomBoxButton = (registry: ManagerRegistry): ButtonConfig => label: 'toolbar.zoomBox', icon: getIcon('框选放大'), onClick: () => { - registry.engine3d?.activateZoomBox(); + registry.engine3d?.getEngineComponent()?.activateZoomBox(); } }; }; diff --git a/src/components/engine/index.ts b/src/components/engine/index.ts index 4a62d38..09c4e54 100644 --- a/src/components/engine/index.ts +++ b/src/components/engine/index.ts @@ -204,10 +204,22 @@ export class Engine implements IBimComponent { } /** - * 获取原始 3D 引擎实例 + * 订阅原始引擎事件 + * 用于需要访问底层引擎事件的场景(如测量回调、剖切移动等) + * @param event 事件名称 + * @param handler 事件处理函数 */ - public getEngine(): any { - return this.engine; + public onRawEvent(event: string, handler: (...args: any[]) => void): void { + this.engine?.events?.on(event, handler); + } + + /** + * 取消订阅原始引擎事件 + * @param event 事件名称 + * @param handler 事件处理函数 + */ + public offRawEvent(event: string, handler: (...args: any[]) => void): void { + this.engine?.events?.off(event, handler); } /** @@ -612,6 +624,202 @@ export class Engine implements IBimComponent { // ==================== 结束:渲染模式 ==================== + // ==================== 设置功能 ==================== + + // ---- 边线 ---- + + /** 启用模型边线显示 */ + public activeModelEdge(): void { + if (!this._isInitialized || !this.engine?.modelEdge) { + console.warn('[Engine] Cannot active model edge: engine not initialized.'); + return; + } + this.engine.modelEdge.active(); + } + + /** 关闭模型边线显示 */ + public disActiveModelEdge(): void { + if (!this._isInitialized || !this.engine?.modelEdge) { + return; + } + this.engine.modelEdge.disActive(); + } + + /** 获取边线显示状态 */ + public getModelEdgeActive(): boolean { + if (!this._isInitialized || !this.engine?.modelEdge) { + return false; + } + return this.engine.modelEdge.getActive?.() ?? false; + } + + // ---- 光照强度 ---- + + /** + * 设置环境光照强度 + * @param intensity 0-100 + */ + public setAmbientLightIntensity(intensity: number): void { + if (!this._isInitialized || !this.engine?.setting) { + console.warn('[Engine] Cannot set ambient light intensity: engine not initialized.'); + return; + } + this.engine.setting.setAmbientLightIntensity(intensity); + } + + /** 获取当前环境光照强度 */ + public getAmbientLightIntensity(): number { + if (!this._isInitialized || !this.engine?.setting) { + return 50; + } + return this.engine.setting.getAmbientLightIntensity?.() ?? 50; + } + + // ---- 对比度 ---- + + /** + * 设置场景对比度 + * @param contrast 0-100 + */ + public setSceneContrast(contrast: number): void { + if (!this._isInitialized || !this.engine?.setting) { + console.warn('[Engine] Cannot set scene contrast: engine not initialized.'); + return; + } + this.engine.setting.setSceneContrast(contrast); + } + + /** 获取当前场景对比度 */ + public getSceneContrast(): number { + if (!this._isInitialized || !this.engine?.setting) { + return 50; + } + return this.engine.setting.getSceneContrast?.() ?? 50; + } + + // ---- 饾和度 ---- + + /** + * 设置场景饾和度 + * @param saturation 0-100 + */ + public setSceneSaturation(saturation: number): void { + if (!this._isInitialized || !this.engine?.setting) { + console.warn('[Engine] Cannot set scene saturation: engine not initialized.'); + return; + } + this.engine.setting.setSceneSaturation(saturation); + } + + /** 获取当前场景饾和度 */ + public getSceneSaturation(): number { + if (!this._isInitialized || !this.engine?.setting) { + return 50; + } + return this.engine.setting.getSceneSaturation?.() ?? 50; + } + + // ---- 环境背景 ---- + + /** 获取 HDR 背景列表 */ + public getHDRBackgroundList(): { name: string; id: string }[] { + if (!this._isInitialized || !this.engine?.setting) { + return []; + } + return this.engine.setting.getHDRBackground?.() ?? []; + } + + /** + * 设置当前 HDR 背景 + * @param id 背景 ID + */ + public setHDRBackgroundId(id: string): void { + if (!this._isInitialized || !this.engine?.setting) { + console.warn('[Engine] Cannot set HDR background: engine not initialized.'); + return; + } + this.engine.setting.setHDRBackgroundId(id); + } + + /** 获取当前 HDR 背景 ID */ + public getHDRBackgroundId(): string { + if (!this._isInitialized || !this.engine?.setting) { + return ''; + } + return this.engine.setting.getHDRBackgroundId?.() ?? ''; + } + + /** + * 设置 HDR 背景可见性 + * @param visible 是否可见 + */ + public setHDRBackgroundVisibility(visible: boolean): void { + if (!this._isInitialized || !this.engine?.setting) { + console.warn('[Engine] Cannot set HDR background visibility: engine not initialized.'); + return; + } + this.engine.setting.setHDRBackgroundVisibility(visible); + } + + /** 获取 HDR 背景可见性 */ + public getHDRBackgroundVisibility(): boolean { + if (!this._isInitialized || !this.engine?.setting) { + return true; + } + return this.engine.setting.getHDRBackgroundVisibility?.() ?? true; + } + + // ---- 地面 ---- + + /** 获取地面列表 */ + public getGroundList(): { name: string; id: string }[] { + if (!this._isInitialized || !this.engine?.setting) { + return []; + } + return this.engine.setting.getGroundList?.() ?? []; + } + + /** + * 设置当前地面类型 + * @param id 地面 ID + */ + public setGroundId(id: string): void { + if (!this._isInitialized || !this.engine?.setting) { + console.warn('[Engine] Cannot set ground: engine not initialized.'); + return; + } + this.engine.setting.setGroundId(id); + } + + /** 获取当前地面 ID */ + public getGroundId(): string { + if (!this._isInitialized || !this.engine?.setting) { + return ''; + } + return this.engine.setting.getGroundId?.() ?? ''; + } + + /** + * 设置地面高度(单位:m) + * @param elevation 地面高度值 + */ + public setGroundElevation(elevation: number): void { + if (!this._isInitialized || !this.engine?.setting) { + console.warn('[Engine] Cannot set ground elevation: engine not initialized.'); + return; + } + this.engine.setting.setGroundElevation(elevation); + } + + /** 获取当前地面高度(单位:m) */ + public getGroundElevation(): number { + if (!this._isInitialized || !this.engine?.setting) { + return 0; + } + return this.engine.setting.getGroundElevation?.() ?? 0; + } + + // ==================== 结束:设置功能 ==================== // ==================== 漫游功能 ==================== /** 漫游模式是否激活 */ diff --git a/src/components/walk-path-panel/index.ts b/src/components/walk-path-panel/index.ts index 399c6b5..1d6ba47 100644 --- a/src/components/walk-path-panel/index.ts +++ b/src/components/walk-path-panel/index.ts @@ -66,7 +66,7 @@ export class WalkPathPanel implements IBimComponent { * 在面板打开时调用,获取底层引擎中已存在的漫游点 */ private loadPointsFromEngine(): void { - const enginePoints = this.registry.engine3d?.pathRoamingGetPoints() ?? []; + const enginePoints = this.registry.engine3d?.getEngineComponent()?.pathRoamingGetPoints() ?? []; // 将引擎返回的点转换为本地格式 this.points = enginePoints.map((_: any, index: number) => ({ index: index @@ -288,7 +288,7 @@ export class WalkPathPanel implements IBimComponent { */ private addPoint(): void { // 调用引擎添加漫游点 - this.registry.engine3d?.pathRoamingAddPoint(); + this.registry.engine3d?.getEngineComponent()?.pathRoamingAddPoint(); // 更新本地状态 const newIndex = this.points.length; this.points.push({ index: newIndex }); @@ -302,7 +302,7 @@ export class WalkPathPanel implements IBimComponent { */ private deletePoint(index: number): void { // 调用引擎删除漫游点 - this.registry.engine3d?.pathRoamingRemovePoint(index); + this.registry.engine3d?.getEngineComponent()?.pathRoamingRemovePoint(index); // 从本地列表中移除 this.points.splice(index, 1); // 重新索引 @@ -316,7 +316,7 @@ export class WalkPathPanel implements IBimComponent { */ private deleteAllPoints(): void { // 调用引擎清除所有漫游点 - this.registry.engine3d?.pathRoamingClearPoints(); + this.registry.engine3d?.getEngineComponent()?.pathRoamingClearPoints(); // 清空本地列表 this.points = []; // 重新渲染 @@ -328,7 +328,7 @@ export class WalkPathPanel implements IBimComponent { * @param index 目标漫游点索引 */ private jumpToPoint(index: number): void { - this.registry.engine3d?.pathRoamingJumpToPoint(index); + this.registry.engine3d?.getEngineComponent()?.pathRoamingJumpToPoint(index); } /** @@ -343,7 +343,7 @@ export class WalkPathPanel implements IBimComponent { console.log('[WalkPathPanel] 开始播放漫游', { duration: this.duration, loop: this.loop, pointsCount: this.points.length }); - this.registry.engine3d?.pathRoamingPlay({ + this.registry.engine3d?.getEngineComponent()?.pathRoamingPlay({ duration: this.duration, loop: this.loop, onPointComplete: (pointIndex: number) => { @@ -365,7 +365,7 @@ export class WalkPathPanel implements IBimComponent { */ private stopPath(): void { console.log('[WalkPathPanel] 停止漫游'); - this.registry.engine3d?.pathRoamingStop(); + this.registry.engine3d?.getEngineComponent()?.pathRoamingStop(); this.isPlaying = false; this.playingPointIndex = -1; this.render(); diff --git a/src/core/base-manager.ts b/src/core/base-manager.ts index 2240806..ca3f3d2 100644 --- a/src/core/base-manager.ts +++ b/src/core/base-manager.ts @@ -4,6 +4,7 @@ */ import { ManagerRegistry } from './manager-registry'; import type { EngineEvents } from '../types/events'; +import type { Engine } from '../components/engine'; /** * Manager 抽象基类 @@ -20,6 +21,15 @@ export abstract class BaseManager { this.registry = registry; } + /** + * 获取 Engine 组件实例的便捷访问器 + * 内部管理器通过此 getter 直接访问 Engine 组件的全部能力 + * 替代原来的 this.registry.engine3d?.xxx() 透传链 + */ + protected get engineComponent(): Engine | null { + return this.registry.engine3d?.getEngineComponent?.() ?? null; + } + /** * 订阅事件(自动追踪,destroy 时自动取消) * @param event 事件名称 diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts index b2a37a2..9a3c03c 100644 --- a/src/locales/en-US.ts +++ b/src/locales/en-US.ts @@ -227,27 +227,13 @@ export const enUS: TranslationDictionary = { advanced: 'Quality', }, edgeLine: 'Edge Lines', - ground: 'Ground', - groundSize: 'Size', - groundTypes: { - none: 'None', - concrete: 'Concrete', - grass: 'Grass', - tile: 'Tile', - water: 'Water', - wood: 'Wood', - }, contrast: 'Contrast', saturation: 'Saturation', lightIntensity: 'Light Intensity', environment: 'Environment', - environments: { - default: 'Default', - outdoor: 'Outdoor', - indoor: 'Indoor', - night: 'Night', - overcast: 'Overcast', - studio: 'Studio', - }, + backgroundVisible: 'Show Background', + ground: 'Ground', + groundElevation: 'Ground Elevation', + groundElevationUnit: 'm', } }; diff --git a/src/locales/types.ts b/src/locales/types.ts index 7e8348f..423a54b 100644 --- a/src/locales/types.ts +++ b/src/locales/types.ts @@ -250,17 +250,6 @@ export interface TranslationDictionary { }; /** 边线 */ edgeLine: string; - /** 显示地面 */ - ground: string; - groundSize: string; - groundTypes: { - none: string; - concrete: string; - grass: string; - tile: string; - water: string; - wood: string; - }; /** 对比度 */ contrast: string; /** 饱和度 */ @@ -269,14 +258,14 @@ export interface TranslationDictionary { lightIntensity: string; /** 环境背景 */ environment: string; - environments: { - default: string; - outdoor: string; - indoor: string; - night: string; - overcast: string; - studio: string; - }; + /** 显示背景 */ + backgroundVisible: string; + /** 显示地面 */ + ground: string; + /** 地面高度 */ + groundElevation: string; + /** 地面高度单位 */ + groundElevationUnit: string; }; } diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index aef6666..9565d54 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -227,27 +227,13 @@ export const zhCN: TranslationDictionary = { advanced: '效果模式', }, edgeLine: '边线', - ground: '显示地面', - groundSize: '大小', - groundTypes: { - none: '无', - concrete: '混凝土', - grass: '草地', - tile: '瓷砖', - water: '水面', - wood: '木地板', - }, contrast: '对比度', saturation: '饱和度', lightIntensity: '光照强度', environment: '环境背景', - environments: { - default: '默认', - outdoor: '室外', - indoor: '室内', - night: '夜晚', - overcast: '阴天', - studio: '工作室', - }, + backgroundVisible: '显示背景', + ground: '显示地面', + groundElevation: '地面高度', + groundElevationUnit: 'm', } }; diff --git a/src/managers/component-detail-manager.ts b/src/managers/component-detail-manager.ts index 5e98e9c..f3d5ba8 100644 --- a/src/managers/component-detail-manager.ts +++ b/src/managers/component-detail-manager.ts @@ -71,14 +71,12 @@ export class ComponentDetailManager extends BaseManager { this.showLoading(); - this.registry.engine3d?.getComponentProperties( - this.currentSelection.url, - this.currentSelection.id, - (data) => { - this.propertiesData = data; - this.renderTabbedContent(); - } - ); + this.engineComponent?.getComponentProperties(this.currentSelection.url, + this.currentSelection.id, + (data) => { + this.propertiesData = data; + this.renderTabbedContent(); + }); } private showLoading(): void { diff --git a/src/managers/construct-tree-manager-btn.ts b/src/managers/construct-tree-manager-btn.ts index 7a4aa7b..6a95403 100644 --- a/src/managers/construct-tree-manager-btn.ts +++ b/src/managers/construct-tree-manager-btn.ts @@ -334,9 +334,9 @@ export class ConstructTreeManagerBtn extends BaseManager { this.setVisible(false); // 从 3D 引擎获取原始树数据 - const levelTreeData = this.registry.engine3d?.getLevelTreeData() ?? []; - const typeTreeData = this.registry.engine3d?.getTypeTreeData() ?? []; - const majorTreeData = this.registry.engine3d?.getMajorTreeData() ?? []; + const levelTreeData = this.engineComponent?.getLevelTreeData() ?? []; + const typeTreeData = this.engineComponent?.getTypeTreeData() ?? []; + const majorTreeData = this.engineComponent?.getMajorTreeData() ?? []; // 调试日志:输出原始数据 console.log('[ConstructTree] 原始数据 (Level):', levelTreeData); @@ -370,9 +370,9 @@ export class ConstructTreeManagerBtn extends BaseManager { if (!modelParam.length) return; if (node.checkState === TreeNodeCheckState.Checked) { - this.registry.engine3d?.showModel(modelParam); + this.engineComponent?.showModel(modelParam); } else { - this.registry.engine3d?.hideModels(modelParam); + this.engineComponent?.hideModels(modelParam); } }, @@ -383,14 +383,14 @@ export class ConstructTreeManagerBtn extends BaseManager { const modelParam = collectModelParams(node); if (!modelParam.length) return; - this.registry.engine3d?.unhighlightAllModels(); - this.registry.engine3d?.highlightModel(modelParam); - this.registry.engine3d?.viewScaleToModel(modelParam); + this.engineComponent?.unhighlightAllModels(); + this.engineComponent?.highlightModel(modelParam); + this.engineComponent?.viewScaleToModel(modelParam); }, // 再次点击已选中节点时取消高亮 onNodeDeselect: () => { - this.registry.engine3d?.unhighlightAllModels(); + this.engineComponent?.unhighlightAllModels(); }, onNodeExpand: () => { @@ -430,7 +430,7 @@ export class ConstructTreeManagerBtn extends BaseManager { * 在 Tab 切换和对话框初始化时调用 */ const resetAllTrees = () => { - this.registry.engine3d?.showAllModels(); + this.engineComponent?.showAllModels(); componentTree.checkAllNodes(true); typeTree.checkAllNodes(true); majorTree.checkAllNodes(true); diff --git a/src/managers/engine-info-dialog-manager.ts b/src/managers/engine-info-dialog-manager.ts index aa3e71d..e7b2e9f 100644 --- a/src/managers/engine-info-dialog-manager.ts +++ b/src/managers/engine-info-dialog-manager.ts @@ -29,7 +29,7 @@ export class EngineInfoDialogManager extends BaseDialogManager { } protected createContent(): HTMLElement { - const info: EngineInfo | null = this.registry.engine3d?.getEngineInfo() ?? null; + const info: EngineInfo | null = this.engineComponent?.getEngineInfo() ?? null; const content = document.createElement('div'); content.className = 'engine-info-content'; diff --git a/src/managers/engine-manager.ts b/src/managers/engine-manager.ts index cccbafc..a00db03 100644 --- a/src/managers/engine-manager.ts +++ b/src/managers/engine-manager.ts @@ -1,24 +1,26 @@ /** * 3D 引擎管理器 - * 负责管理 3D 渲染引擎的初始化、模型加载和测量功能 + * 负责管理 3D 渲染引擎的初始化、模型加载和生命周期 + * + * 设计原则: + * - EngineManager 只暴露面向外部用户的公共 API + * - 内部管理器通过 getEngineComponent() 直接访问 Engine 组件 + * - 不再透传 Engine 组件的方法 */ -import { Engine, type EngineOptions, type ModelLoadOptions, type EngineInfo } from '../components/engine'; +import { Engine, type EngineOptions, type ModelLoadOptions } from '../components/engine'; import { BaseManager } from '../core/base-manager'; import { RightKeyManager } from './right-key-manager'; -import type { MeasureMode, ClearHeightDirection, ClearHeightSelectType } from '../types/measure'; -import type { MeasureUnit, MeasurePrecision } from '../components/measure-panel/types'; -import type { SectionBoxRange } from '../components/section-box-panel/types'; import type { MenuItemConfig } from '../components/menu/item'; import { ManagerRegistry } from '../core/manager-registry'; /** * 3D 引擎管理器 - * 封装底层 3D 引擎,提供模型加载、相机控制、测量等功能 + * 封装底层 3D 引擎,提供模型加载、渲染控制等公共 API */ export class EngineManager extends BaseManager { /** 容器元素 */ private container: HTMLElement; - /** 引擎实例 */ + /** 引擎组件实例 */ private engineInstance: Engine | null = null; /** 右键菜单管理器 */ public rightKey: RightKeyManager | null = null; @@ -28,6 +30,15 @@ export class EngineManager extends BaseManager { this.container = container; } + /** + * 获取 Engine 组件实例 + * 内部管理器通过此方法直接访问 Engine 组件的全部能力 + * @returns Engine 组件实例,未初始化时返回 null + */ + public getEngineComponent(): Engine | null { + return this.engineInstance; + } + /** * 初始化 3D 引擎 * @param options 引擎配置选项 @@ -51,7 +62,7 @@ export class EngineManager extends BaseManager { this.rightKey = new RightKeyManager(this.container, this.registry); this.rightKey.registerHandler((_e) => { - const selected = this.getSelectedComponent(); + const selected = this.engineInstance?.getSelectedComponent(); const items: MenuItemConfig[] = []; if (selected) { @@ -76,9 +87,9 @@ export class EngineManager extends BaseManager { group: 'component', order: 2, onClick: () => { - const models = this.getHighlightModels(); + const models = this.engineInstance?.getHighlightModels(); if (models) { - this.hideModels(models); + this.engineInstance?.hideModels(models); } this.rightKey?.hide(); } @@ -91,9 +102,9 @@ export class EngineManager extends BaseManager { group: 'component', order: 3, onClick: () => { - const models = this.getHighlightModels(); + const models = this.engineInstance?.getHighlightModels(); if (models) { - this.translucentModels(models); + this.engineInstance?.translucentModels(models); } this.rightKey?.hide(); } @@ -106,7 +117,7 @@ export class EngineManager extends BaseManager { group: 'component', order: 4, onClick: () => { - this.unTranslucentModel(); + this.engineInstance?.unTranslucentModel(); this.rightKey?.hide(); } }); @@ -123,9 +134,9 @@ export class EngineManager extends BaseManager { id: 'hideOthers', label: 'menu.hideOthers', onClick: () => { - const models = this.getHighlightModels(); + const models = this.engineInstance?.getHighlightModels(); if (models) { - this.isolateModels(models); + this.engineInstance?.isolateModels(models); } this.rightKey?.hide(); } @@ -134,9 +145,9 @@ export class EngineManager extends BaseManager { id: 'transparentOthers', label: 'menu.transparentOthers', onClick: () => { - const models = this.getHighlightModels(); + const models = this.engineInstance?.getHighlightModels(); if (models) { - this.translucentOtherModels(models); + this.engineInstance?.translucentOtherModels(models); } this.rightKey?.hide(); } @@ -155,9 +166,9 @@ export class EngineManager extends BaseManager { id: 'selectSameType', label: 'menu.selectSameType', onClick: () => { - const models = this.getHighlightModels(); + const models = this.engineInstance?.getHighlightModels(); if (models) { - this.batchSelectSameTypeModel(models); + this.engineInstance?.batchSelectSameTypeModel(models); } this.rightKey?.hide(); } @@ -166,9 +177,9 @@ export class EngineManager extends BaseManager { id: 'selectSameLevel', label: 'menu.selectSameLevel', onClick: () => { - const models = this.getHighlightModels(); + const models = this.engineInstance?.getHighlightModels(); if (models) { - this.batchSelectSameLevelModel(models); + this.engineInstance?.batchSelectSameLevelModel(models); } this.rightKey?.hide(); } @@ -177,9 +188,9 @@ export class EngineManager extends BaseManager { id: 'selectSameLevelType', label: 'menu.selectSameLevelType', onClick: () => { - const models = this.getHighlightModels(); + const models = this.engineInstance?.getHighlightModels(); if (models) { - this.batchSelectSameLevelTypeModel(models); + this.engineInstance?.batchSelectSameLevelTypeModel(models); } this.rightKey?.hide(); } @@ -194,7 +205,7 @@ export class EngineManager extends BaseManager { group: 'component', order: 7, onClick: () => { - this.fitSectionBoxToModel(); + this.engineInstance?.fitSectionBoxToModel(); this.rightKey?.hide(); } }); @@ -207,7 +218,7 @@ export class EngineManager extends BaseManager { group: 'component', order: 8, onClick: () => { - this.showAllModels(); + this.engineInstance?.showAllModels(); this.emit('menu:show-all', {}); this.rightKey?.hide(); } @@ -245,27 +256,6 @@ export class EngineManager extends BaseManager { this.engineInstance.loadModel(urls, options); } - /** - * 获取底层引擎实例 - * @returns 引擎实例 - */ - public getEngine(): any { - if (!this.engineInstance) { - console.warn('[EngineManager] 3D Engine not initialized.'); - return null; - } - return this.engineInstance.getEngine(); - } - - /** 相机回到初始位置 */ - public CameraGoHome(): void { - if (!this.engineInstance) { - console.warn('[EngineManager] 3D Engine not initialized.'); - return; - } - this.engineInstance.CameraGoHome(); - } - /** 暂停渲染 */ public pauseRendering(): void { if (!this.engineInstance) { @@ -284,457 +274,6 @@ export class EngineManager extends BaseManager { this.engineInstance.resumeRendering(); } - /** - * 激活测量模式 - * @param mode 测量模式 - */ - public activateMeasure(mode: MeasureMode): void { - if (!this.engineInstance) { - console.warn('[EngineManager] 3D Engine not initialized.'); - return; - } - this.engineInstance.activateMeasure(mode); - } - - /** 停用测量模式 */ - public deactivateMeasure(): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.deactivateMeasure(); - } - - /** - * 获取当前测量类型 - * @returns 当前测量模式 - */ - public getCurrentMeasureType(): MeasureMode | null { - if (!this.engineInstance) { - return null; - } - return this.engineInstance.getCurrentMeasureType(); - } - - public clearAllMeasures(): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.clearAllMeasures(); - } - - public saveMeasureSetting(setting: { unit: MeasureUnit; precision: MeasurePrecision }): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.saveMeasureSetting(setting); - } - - /** - * 设置净高测量朝向 - * @param direction 0=朝下,1=朝上 - */ - public setClearHeightDirection(direction: ClearHeightDirection): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.setClearHeightDirection(direction); - } - - /** - * 设置净高测量选择对象类型 - * @param selectType 'point'=选择点,'element'=选择构件 - */ - public setClearHeightSelectType(selectType: ClearHeightSelectType): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.setClearHeightSelectType(selectType); - } - - public activeSection(mode: 'x' | 'y' | 'z' | 'box' | 'face'): void { - if (!this.engineInstance) { - console.warn('[EngineManager] 3D Engine not initialized.'); - return; - } - this.engineInstance.activeSection(mode); - } - - /** - * 获取当前激活的剖切模式 - * @returns 当前剖切模式,未激活时返回 null - */ - public getCurrentSectionMode(): 'x' | 'y' | 'z' | 'box' | 'face' | null { - if (!this.engineInstance) { - return null; - } - return this.engineInstance.getCurrentSectionMode(); - } - - /** - * 停用所有剖切功能 - * @remarks 关闭剖切对话框时调用 - */ - public deactivateSection(): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.deactivateSection(); - } - - /** - * 设置剖切盒范围 - * @param range 各轴的剖切范围 (百分比 0-100) - * @remarks 仅在 'box' 模式下有效 - */ - public setSectionBoxRange(range: SectionBoxRange): void { - if (!this.engineInstance) { - console.warn('[EngineManager] 3D Engine not initialized.'); - return; - } - this.engineInstance.setSectionBoxRange(range); - } - - /** - * 隐藏剖切面(临时隐藏,可恢复) - * @remarks 配合 recoverSection() 使用 - */ - public hideSection(): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.hideSection(); - } - - /** - * 恢复剖切面(从隐藏状态恢复) - * @remarks 恢复被 hideSection() 隐藏的剖切面 - */ - public recoverSection(): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.recoverSection(); - } - - public fitSectionBoxToModel(): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.fitSectionBoxToModel(); - } - - /** - * 剖切盒适应(缩放到场景整体包围盒) - * @remarks 对接底层 clipping.scaleBox() - */ - public scaleSectionBox(): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.scaleSectionBox(); - } - - /** - * 反向剖切 - * @remarks 对接底层 clipping.reverse() - */ - public reverseSection(): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.reverseSection(); - } - - /** 激活框选放大功能 */ - public activateZoomBox(): void { - if (!this.engineInstance) { - console.warn('[EngineManager] 3D Engine not initialized.'); - return; - } - this.engineInstance.activateZoomBox(); - } - - // ==================== 漫游功能 ==================== - - /** 激活第一人称漫游模式 */ - public activateFirstPersonMode(): void { - if (!this.engineInstance) { - console.warn('[EngineManager] 3D Engine not initialized.'); - return; - } - this.engineInstance.activateFirstPersonMode(); - } - - /** 停用第一人称漫游模式 */ - public deactivateFirstPersonMode(): void { - if (!this.engineInstance) { - return; - } - this.engineInstance.deactivateFirstPersonMode(); - } - - public setWalkSpeed(speed: number): void { - this.engineInstance?.setWalkSpeed(speed); - } - - public setWalkGravity(enabled: boolean): void { - this.engineInstance?.setWalkGravity(enabled); - } - - public setWalkCollision(enabled: boolean): void { - this.engineInstance?.setWalkCollision(enabled); - } - - public toggleMiniMap(): void { - this.engineInstance?.toggleMiniMap(); - } - - /** - * 获取小地图显示状态 - * @returns true=显示,false=隐藏 - */ - public getMiniMapState(): boolean { - return this.engineInstance?.getMiniMapState() ?? false; - } - - public isFirstPersonModeActive(): boolean { - return this.engineInstance?.isFirstPersonModeActive() ?? false; - } - - // ==================== 结束:漫游功能 ==================== - - // ==================== 构件选中 ==================== - - /** - * 获取当前选中的构件 - * @returns 选中构件的 URL 和 ID,未选中时返回 null - */ - public getSelectedComponent(): { url: string; id: string } | null { - return this.engineInstance?.getSelectedComponent() ?? null; - } - - /** - * 获取构件属性 - * @param url 模型 URL - * @param id 构件 ID - * @param callback 回调函数,接收属性数据 - */ - public getComponentProperties( - url: string, - id: string, - callback: (data: any) => void - ): void { - this.engineInstance?.getComponentProperties(url, id, callback); - } - - // ==================== 结束:构件选中 ==================== - - // ==================== 模型树 ==================== - - public getTypeTreeData(): any[] { - return this.engineInstance?.getTypeTreeData() ?? []; - } - - public getLevelTreeData(): any[] { - return this.engineInstance?.getLevelTreeData() ?? []; - } - - public getMajorTreeData(): any[] { - return this.engineInstance?.getMajorTreeData() ?? []; - } - - public getEngineInfo(): EngineInfo | null { - return this.engineInstance?.getEngineInfo() ?? null; - } - // ==================== 结束:模型树 ==================== - - // ==================== 路径漫游 ==================== - - /** - * 添加漫游点 - * 将当前相机位置添加为一个漫游点 - */ - public pathRoamingAddPoint(): void { - this.engineInstance?.pathRoamingAddPoint(); - } - - /** - * 删除指定索引的漫游点 - * @param index 要删除的漫游点索引 - */ - public pathRoamingRemovePoint(index: number): void { - this.engineInstance?.pathRoamingRemovePoint(index); - } - - /** - * 清除所有漫游点 - */ - public pathRoamingClearPoints(): void { - this.engineInstance?.pathRoamingClearPoints(); - } - - /** - * 获取所有漫游点 - * @returns 漫游点数组 - */ - public pathRoamingGetPoints(): any[] { - return this.engineInstance?.pathRoamingGetPoints() ?? []; - } - - /** - * 跳转到指定漫游点 - * @param index 目标漫游点索引 - */ - public pathRoamingJumpToPoint(index: number): void { - this.engineInstance?.pathRoamingJumpToPoint(index); - } - - /** - * 播放漫游 - * @param options 播放选项,包含时长、循环、回调等配置 - */ - public pathRoamingPlay(options?: { - duration?: number; - loop?: boolean; - onComplete?: () => void; - onPointComplete?: (pointIndex: number) => void; - }): void { - this.engineInstance?.pathRoamingPlay(options); - } - - /** - * 停止漫游 - */ - public pathRoamingStop(): void { - this.engineInstance?.pathRoamingStop(); - } - - // ==================== 结束:路径漫游 ==================== - - // ==================== 构件操作 ==================== - - /** - * 获取当前高亮(选中)的模型 - * @returns 高亮模型对象,未选中时返回 null - */ - public getHighlightModels(): any { - return this.engineInstance?.getHighlightModels() ?? null; - } - - /** - * 高亮指定模型构件 - * - * @param models - 要高亮的模型数组,格式: [{ url: string, ids: string[] }] - * - * @example - * manager.highlightModel([ - * { url: 'https://xxx/models/xxx/', ids: [350518, 350520] } - * ]); - */ - public highlightModel(models: { url: string; ids: number[] }[]): void { - this.engineInstance?.highlightModel(models); - } - - public unhighlightAllModels(): void { - this.engineInstance?.unhighlightAllModels(); - } - - public viewScaleToModel(models: { url: string; ids: number[] }[]): void { - this.engineInstance?.viewScaleToModel(models); - } - - public hideModels(models: { url: string; ids: number[] }[]): void { - this.engineInstance?.hideModels(models); - } - - public showModel(models: { url: string; ids: number[] }[]): void { - this.engineInstance?.showModel(models); - } - - /** - * 半透明指定模型 - * @param models 要半透明的模型对象 - */ - public translucentModels(models: any): void { - this.engineInstance?.translucentModels(models); - } - - /** - * 取消半透明 - */ - public unTranslucentModel(): void { - this.engineInstance?.unTranslucentModel(); - } - - /** - * 隔离指定模型(隐藏其他) - * @param models 要隔离的模型对象 - */ - public isolateModels(models: any): void { - this.engineInstance?.isolateModels(models); - } - - /** - * 半透明其他构件 - * @param models 基准模型对象 - */ - public translucentOtherModels(models: any): void { - this.engineInstance?.translucentOtherModels(models); - } - - /** - * 显示所有模型 - */ - public showAllModels(): void { - this.engineInstance?.showAllModels(); - } - - /** - * 批量选择同类模型 - * @param models 基准模型对象 - */ - public batchSelectSameTypeModel(models: any): void { - this.engineInstance?.batchSelectSameTypeModel(models); - } - - /** - * 批量选择同层模型 - * @param models 基准模型对象 - */ - public batchSelectSameLevelModel(models: any): void { - this.engineInstance?.batchSelectSameLevelModel(models); - } - - /** - * 批量选择同层同类模型 - * @param models 基准模型对象 - */ - public batchSelectSameLevelTypeModel(models: any): void { - this.engineInstance?.batchSelectSameLevelTypeModel(models); - } - - // ==================== 结束:构件操作 ==================== - - // ==================== 渲染模式 ==================== - - /** - * 获取当前渲染模式 - * @returns 'simple' | 'balance' | 'advanced' - */ - public getRenderMode(): string { - return this.engineInstance?.getRenderMode() ?? 'balance'; - } - - /** - * 设置渲染模式 - * @param mode 'simple' | 'balance' | 'advanced' - */ - public setRenderMode(mode: 'simple' | 'balance' | 'advanced'): void { - this.engineInstance?.setRenderMode(mode); - } - - // ==================== 结束:渲染模式 ==================== - /** 销毁引擎管理器 */ public destroy(): void { if (this.engineInstance) { diff --git a/src/managers/measure-dialog-manager.ts b/src/managers/measure-dialog-manager.ts index 89a38de..3bfb571 100644 --- a/src/managers/measure-dialog-manager.ts +++ b/src/managers/measure-dialog-manager.ts @@ -42,11 +42,11 @@ export class MeasureDialogManager extends BaseDialogManager { defaultExpanded: false, onModeChange: (mode) => { console.log('[MeasureDialogManager] 当前测量方式已切换:', mode); - this.registry.engine3d?.activateMeasure(mode); + this.engineComponent?.activateMeasure(mode); }, onClearAll: () => { console.log('[MeasureDialogManager] 删除全部'); - this.registry.engine3d?.clearAllMeasures(); + this.engineComponent?.clearAllMeasures(); }, onSettings: () => { console.log('[MeasureDialogManager] 打开设置'); @@ -56,18 +56,18 @@ export class MeasureDialogManager extends BaseDialogManager { }, onConfigSave: (config) => { console.log('[MeasureDialogManager] 保存设置:', config); - this.registry.engine3d?.saveMeasureSetting({ + this.engineComponent?.saveMeasureSetting({ unit: config.unit, precision: config.precision }); }, onClearHeightDirectionChange: (direction) => { console.log('[MeasureDialogManager] 净高朝向切换:', direction); - this.registry.engine3d?.setClearHeightDirection(direction); + this.engineComponent?.setClearHeightDirection(direction); }, onClearHeightSelectTypeChange: (selectType) => { console.log('[MeasureDialogManager] 净高选择对象切换:', selectType); - this.registry.engine3d?.setClearHeightSelectType(selectType); + this.engineComponent?.setClearHeightSelectType(selectType); }, }); this.panel.init(); @@ -75,7 +75,7 @@ export class MeasureDialogManager extends BaseDialogManager { this.config = this.panel.getConfig(); if (this.config) { console.log('[MeasureDialogManager] 同步缓存设置到引擎:', this.config); - this.registry.engine3d?.saveMeasureSetting({ + this.engineComponent?.saveMeasureSetting({ unit: this.config.unit, precision: this.config.precision }); @@ -92,22 +92,22 @@ export class MeasureDialogManager extends BaseDialogManager { this.dialog?.fitHeight(false); // 同步净高默认值到引擎(朝下=0,选择点='point') - this.registry.engine3d?.setClearHeightDirection(0); - this.registry.engine3d?.setClearHeightSelectType('point'); + this.engineComponent?.setClearHeightDirection(0); + this.engineComponent?.setClearHeightSelectType('point'); - const engine = this.registry.engine3d?.getEngine(); - if (engine?.events) { + const ec = this.engineComponent; + if (ec) { const handler = (data: EngineMeasureData) => { console.log('[MeasureDialogManager] 测量值回调:', data); if (data && this.panel) { this.handleMeasureChanged(data); } }; - engine.events.on('measure-changed', handler); - engine.events.on('measure-click', handler); + ec.onRawEvent('measure-changed', handler); + ec.onRawEvent('measure-click', handler); this.unsubscribeMeasureChanged = () => { - engine.events.off('measure-changed', handler); - engine.events.off('measure-click', handler); + ec.offRawEvent('measure-changed', handler); + ec.offRawEvent('measure-click', handler); } } } @@ -158,9 +158,7 @@ export class MeasureDialogManager extends BaseDialogManager { this.unsubscribeMeasureChanged(); this.unsubscribeMeasureChanged = null; } - if (this.registry.engine3d) { - this.registry.engine3d.deactivateMeasure(); - } + this.engineComponent?.deactivateMeasure(); if (this.panel) { this.panel.destroy(); this.panel = null; diff --git a/src/managers/section-axis-dialog-manager.ts b/src/managers/section-axis-dialog-manager.ts index bd9e1e4..20f8390 100644 --- a/src/managers/section-axis-dialog-manager.ts +++ b/src/managers/section-axis-dialog-manager.ts @@ -64,9 +64,9 @@ export class SectionAxisDialogManager extends BaseDialogManager { onHideToggle: (isHidden) => { console.log('[SectionAxisDialogManager] 隐藏切换:', isHidden); if (isHidden) { - this.registry.engine3d?.hideSection(); + this.engineComponent?.hideSection(); } else { - this.registry.engine3d?.recoverSection(); + this.engineComponent?.recoverSection(); } }, onReverse: () => { @@ -75,7 +75,7 @@ export class SectionAxisDialogManager extends BaseDialogManager { }, onAxisChange: (axis) => { console.log('[SectionAxisDialogManager] 切换轴向:', axis); - this.registry.engine3d?.activeSection(axis); + this.engineComponent?.activeSection(axis); } }); this.panel.init(); @@ -87,13 +87,13 @@ export class SectionAxisDialogManager extends BaseDialogManager { this.dialog?.fitHeight(false); // 检查 Engine 是否已初始化 - if (!this.registry.engine3d) { + if (!this.engineComponent) { console.error('[SectionAxisDialogManager] Engine not initialized. Call initEngine() first.'); return; } // 自动激活默认轴向剖切(X轴) - this.registry.engine3d.activeSection('x'); + this.engineComponent.activeSection('x'); } /** 对话框关闭时的回调,取消工具栏按钮激活状态 */ @@ -103,7 +103,7 @@ export class SectionAxisDialogManager extends BaseDialogManager { /** 销毁前的清理,销毁面板实例 */ protected onBeforeDestroy(): void { - this.registry.engine3d?.deactivateSection(); + this.engineComponent?.deactivateSection(); if (this.panel) { this.panel.destroy(); diff --git a/src/managers/section-box-dialog-manager.ts b/src/managers/section-box-dialog-manager.ts index 4486213..b74d64f 100644 --- a/src/managers/section-box-dialog-manager.ts +++ b/src/managers/section-box-dialog-manager.ts @@ -56,30 +56,30 @@ export class SectionBoxDialogManager extends BaseDialogManager { onHideToggle: (isHidden) => { console.log('[SectionBoxDialogManager] 隐藏切换:', isHidden); if (isHidden) { - this.registry.engine3d?.hideSection(); + this.engineComponent?.hideSection(); } else { - this.registry.engine3d?.recoverSection(); + this.engineComponent?.recoverSection(); } }, onReverseToggle: (isReversed) => { console.log('[SectionBoxDialogManager] 反向切换:', isReversed); // 底层 reverse() 为“切换一次”,这里不使用 isReversed 作为入参,只要用户点击就触发。 - this.registry.engine3d?.reverseSection(); + this.engineComponent?.reverseSection(); }, onFitToModel: () => { // 对接底层 scaleBox():缩放剖切盒到场景整体包围盒 - this.registry.engine3d?.scaleSectionBox(); + this.engineComponent?.scaleSectionBox(); }, onReset: () => { // 重置定义:关闭剖切再打开剖切盒。 // UI 侧会自行将滑块强制恢复到 0-100,并将隐藏/反向按钮恢复为关闭状态。 - this.registry.engine3d?.deactivateSection(); - this.registry.engine3d?.activeSection('box'); + this.engineComponent?.deactivateSection(); + this.engineComponent?.activeSection('box'); // 确保剖切可见(避免上一次处于隐藏状态导致“看起来没重置”) - this.registry.engine3d?.recoverSection(); + this.engineComponent?.recoverSection(); }, onRangeChange: (range) => { - this.registry.engine3d?.setSectionBoxRange(range); + this.engineComponent?.setSectionBoxRange(range); } }); this.panel.init(); @@ -87,18 +87,18 @@ export class SectionBoxDialogManager extends BaseDialogManager { } protected onDialogCreated(): void { - this.registry.engine3d?.activeSection('box'); + this.engineComponent?.activeSection('box'); this.dialog?.fitHeight(false); - const engine = this.registry.engine3d?.getEngine(); - if (engine?.events) { + const ec = this.engineComponent; + if (ec) { const handler = (data: any) => { if (data && this.panel) { this.panel.setRange(data as Partial); } }; - engine.events.on('section-move', handler); - this.unsubscribeSectionMove = () => engine.events.off('section-move', handler); + ec.onRawEvent('section-move', handler); + this.unsubscribeSectionMove = () => ec.offRawEvent('section-move', handler); } } @@ -115,7 +115,7 @@ export class SectionBoxDialogManager extends BaseDialogManager { this.unsubscribeSectionMove(); this.unsubscribeSectionMove = null; } - this.registry.engine3d?.deactivateSection(); + this.engineComponent?.deactivateSection(); if (this.panel) { this.panel.destroy(); this.panel = null; diff --git a/src/managers/section-plane-dialog-manager.ts b/src/managers/section-plane-dialog-manager.ts index 19638c7..e89fcb2 100644 --- a/src/managers/section-plane-dialog-manager.ts +++ b/src/managers/section-plane-dialog-manager.ts @@ -56,9 +56,9 @@ export class SectionPlaneDialogManager extends BaseDialogManager { onHideToggle: (isHidden) => { console.log('[SectionPlaneDialogManager] 隐藏切换:', isHidden); if (isHidden) { - this.registry.engine3d?.hideSection(); + this.engineComponent?.hideSection(); } else { - this.registry.engine3d?.recoverSection(); + this.engineComponent?.recoverSection(); } }, onReverse: () => { @@ -74,7 +74,7 @@ export class SectionPlaneDialogManager extends BaseDialogManager { /** 对话框创建后的回调 */ protected onDialogCreated(): void { - this.registry.engine3d?.activeSection('face'); + this.engineComponent?.activeSection('face'); this.dialog?.fitHeight(false); } @@ -85,7 +85,7 @@ export class SectionPlaneDialogManager extends BaseDialogManager { /** 销毁前的清理 */ protected onBeforeDestroy(): void { - this.registry.engine3d?.deactivateSection(); + this.engineComponent?.deactivateSection(); if (this.panel) { this.panel.destroy(); this.panel = null; diff --git a/src/managers/setting-dialog-manager.ts b/src/managers/setting-dialog-manager.ts index 30a7c07..e1b0a0d 100644 --- a/src/managers/setting-dialog-manager.ts +++ b/src/managers/setting-dialog-manager.ts @@ -5,11 +5,8 @@ import { t } from '../services/locale'; /** 渲染模式类型 */ type RenderMode = 'simple' | 'balance' | 'advanced'; -/** 地面类型 */ -type GroundType = 'none' | 'concrete' | 'grass' | 'tile' | 'water' | 'wood'; - -/** 环境背景类型 */ -type EnvironmentType = 'default' | 'outdoor' | 'indoor' | 'night' | 'overcast' | 'studio'; +/** 设置项列表项(环境背景/地面类型由底层引擎动态返回) */ +type SettingListItem = { name: string; id: string }; // ======================== 通用样式常量 ======================== // 全部使用项目主题 CSS 变量(--bim-*),同时提供浅色/深色皆可见的 fallback @@ -46,7 +43,7 @@ const HOVER_BG = 'var(--bim-component-bg-hover, rgba(0,0,0,0.04))'; /** * 设置弹窗管理器 - * 管理全局设置面板,包含渲染模式、边线、地面、对比度/饱和度、光照强度、环境背景等设置项 + * 管理全局设置面板,包含渲染模式、边线、光照/对比度/饱和度、环境背景、地面等设置项 */ export class SettingDialogManager extends BaseDialogManager { protected get dialogId() { return 'setting-dialog'; } @@ -57,18 +54,26 @@ export class SettingDialogManager extends BaseDialogManager { /** 边线开关状态 */ private edgeLineEnabled: boolean = false; - /** 当前选中的地面类型 */ - private groundType: GroundType = 'none'; - /** 地面大小 */ - private groundSize: number = 100; - /** 对比度(0-200,100为默认值) */ - private contrastValue: number = 100; - /** 饱和度(0-200,100为默认值) */ - private saturationValue: number = 100; - /** 光照强度(0-200,100为默认值) */ - private lightIntensityValue: number = 100; - /** 当前选中的环境背景 */ - private environmentType: EnvironmentType = 'default'; + /** 对比度(0-100,50为默认值) */ + private contrastValue: number = 50; + /** 饱和度(0-100,50为默认值) */ + private saturationValue: number = 50; + /** 光照强度(0-100,50为默认值) */ + private lightIntensityValue: number = 50; + /** 环境背景列表(从底层引擎动态获取) */ + private environmentList: SettingListItem[] = []; + /** 当前选中的环境背景 ID */ + private environmentId: string = ''; + /** 是否显示背景 */ + private backgroundVisible: boolean = true; + /** 地面列表(从底层引擎动态获取) */ + private groundList: SettingListItem[] = []; + /** 当前选中的地面 ID */ + private groundId: string = ''; + /** 地面高度(单位:m) */ + private groundElevation: number = 0; + /** 保存的对话框位置(用于 hide/show 时保持位置不变) */ + private savedPosition: { x: number; y: number } | null = null; constructor(registry: ManagerRegistry) { super(registry); @@ -76,8 +81,15 @@ export class SettingDialogManager extends BaseDialogManager { public init(): void { } - /** 对话框居中显示 */ + /** 对话框位置:若有保存的位置则恢复,否则居中 */ protected getDialogPosition() { + // 若上次 hide/show 保存了位置,则恢复到原位 + if (this.savedPosition) { + const pos = this.savedPosition; + this.savedPosition = null; + return pos; + } + const container = this.registry.container; if (!container) return { x: 100, y: 100 }; @@ -90,9 +102,39 @@ export class SettingDialogManager extends BaseDialogManager { }; } + /** + * 从底层引擎加载当前状态(回显) + * 在 createContent() 前调用,保证 UI 和引擎状态同步 + */ + private loadEngineState(): void { + const engine = this.engineComponent; + if (!engine) return; + + // 边线 + this.edgeLineEnabled = engine.getModelEdgeActive(); + + // 光照 / 对比度 / 饱和度 + this.lightIntensityValue = engine.getAmbientLightIntensity(); + this.contrastValue = engine.getSceneContrast(); + this.saturationValue = engine.getSceneSaturation(); + + // 环境背景 + this.environmentList = engine.getHDRBackgroundList(); + this.environmentId = engine.getHDRBackgroundId(); + this.backgroundVisible = engine.getHDRBackgroundVisibility(); + + // 地面 + this.groundList = engine.getGroundList(); + this.groundId = engine.getGroundId(); + this.groundElevation = engine.getGroundElevation(); + } + // ======================== 主内容构建 ======================== protected createContent(): HTMLElement { + // 从引擎加载当前状态(回显) + this.loadEngineState(); + // 注入一次全局滑块样式 this.ensureSliderStyle(); @@ -111,32 +153,41 @@ export class SettingDialogManager extends BaseDialogManager { content.appendChild(this.createSliderSection( t('setting.lightIntensity'), this.lightIntensityValue, - 0, 200, - (v) => { this.lightIntensityValue = v; } + 0, 100, + (v) => { + this.lightIntensityValue = v; + this.engineComponent?.setAmbientLightIntensity(v); + } )); // 4. 对比度 content.appendChild(this.createSliderSection( t('setting.contrast'), this.contrastValue, - 0, 200, - (v) => { this.contrastValue = v; } + 0, 100, + (v) => { + this.contrastValue = v; + this.engineComponent?.setSceneContrast(v); + } )); // 5. 饱和度 content.appendChild(this.createSliderSection( t('setting.saturation'), this.saturationValue, - 0, 200, - (v) => { this.saturationValue = v; } + 0, 100, + (v) => { + this.saturationValue = v; + this.engineComponent?.setSceneSaturation(v); + } )); content.appendChild(this.createDivider()); - // 6. 环境背景(下拉) + // 6. 环境背景(动态列表 + 显示开关) content.appendChild(this.createEnvironmentSection()); content.appendChild(this.createDivider()); - // 7. 显示地面(下拉 + 大小输入) + // 7. 地面(动态列表 + 地面高度) content.appendChild(this.createGroundSection()); return content; @@ -155,7 +206,7 @@ export class SettingDialogManager extends BaseDialogManager { /** 创建渲染模式按钮组 */ private createRenderModeSection(): HTMLElement { - const currentMode = (this.registry.engine3d?.getRenderMode() ?? 'balance') as RenderMode; + const currentMode = (this.engineComponent?.getRenderMode() ?? 'balance') as RenderMode; const section = document.createElement('div'); @@ -201,8 +252,12 @@ export class SettingDialogManager extends BaseDialogManager { }); btn.addEventListener('click', () => { - this.registry.engine3d?.setRenderMode(mode.key); - // 重建弹窗以刷新状态 + this.engineComponent?.setRenderMode(mode.key); + // 保存当前对话框位置,重建后恢复 + const el = document.getElementById(this.dialogId); + if (el) { + this.savedPosition = { x: el.offsetLeft, y: el.offsetTop }; + } this.hide(); this.show(); }); @@ -218,45 +273,18 @@ export class SettingDialogManager extends BaseDialogManager { /** 创建边线开关行 */ private createEdgeLineSection(): HTMLElement { - const row = document.createElement('div'); - row.style.cssText = ROW_STYLE; - - // 标签 - const label = document.createElement('span'); - label.style.cssText = 'font-size: 13px; color: var(--bim-text-secondary, #475569);'; - label.textContent = t('setting.edgeLine'); - row.appendChild(label); - - // 开关容器 —— 关闭态使用 --bim-border-strong 保证浅色主题可见 - const toggleOffBg = 'var(--bim-border-strong, #cbd5e1)'; - const toggleOnBg = PRIMARY; - - const toggle = document.createElement('div'); - toggle.style.cssText = ` - width: 40px; height: 22px; border-radius: 11px; cursor: pointer; - position: relative; transition: background 0.2s; - background: ${this.edgeLineEnabled ? toggleOnBg : toggleOffBg}; - `; - - // 滑块圆点 - const knob = document.createElement('div'); - knob.style.cssText = ` - width: 18px; height: 18px; border-radius: 50%; - background: #fff; position: absolute; top: 2px; - transition: left 0.2s; - box-shadow: 0 1px 3px rgba(0,0,0,0.2); - left: ${this.edgeLineEnabled ? '20px' : '2px'}; - `; - toggle.appendChild(knob); - - toggle.addEventListener('click', () => { - this.edgeLineEnabled = !this.edgeLineEnabled; - toggle.style.background = this.edgeLineEnabled ? toggleOnBg : toggleOffBg; - knob.style.left = this.edgeLineEnabled ? '20px' : '2px'; - }); - - row.appendChild(toggle); - return row; + return this.createToggleRow( + t('setting.edgeLine'), + this.edgeLineEnabled, + (enabled) => { + this.edgeLineEnabled = enabled; + if (enabled) { + this.engineComponent?.activeModelEdge(); + } else { + this.engineComponent?.disActiveModelEdge(); + } + } + ); } // ======================== 3/4/5. 通用滑块 ======================== @@ -351,98 +379,112 @@ export class SettingDialogManager extends BaseDialogManager { document.head.appendChild(style); } - // ======================== 6. 环境背景(下拉) ======================== + // ======================== 6. 环境背景(动态列表 + 显示开关) ======================== - /** 创建环境背景下拉选择区 */ + /** 创建环境背景区 */ private createEnvironmentSection(): HTMLElement { const section = document.createElement('div'); + // 标签 const label = document.createElement('div'); label.style.cssText = SECTION_LABEL_STYLE; label.textContent = t('setting.environment'); section.appendChild(label); - const envKeys: EnvironmentType[] = ['default', 'outdoor', 'indoor', 'night', 'overcast', 'studio']; - + // 下拉列表(从底层引擎动态获取) const select = this.createSelect( - envKeys.map(key => ({ - value: key, - label: t(`setting.environments.${key}` as any) - })), - this.environmentType, - (val) => { this.environmentType = val as EnvironmentType; } + this.environmentList.map(item => ({ value: item.id, label: item.name })), + this.environmentId, + (val) => { + this.environmentId = val; + this.engineComponent?.setHDRBackgroundId(val); + } ); - section.appendChild(select); + + // 显示背景开关 + const toggleRow = this.createToggleRow( + t('setting.backgroundVisible'), + this.backgroundVisible, + (enabled) => { + this.backgroundVisible = enabled; + this.engineComponent?.setHDRBackgroundVisibility(enabled); + } + ); + toggleRow.style.marginTop = '10px'; + section.appendChild(toggleRow); + return section; } - // ======================== 7. 显示地面(下拉 + 大小) ======================== + // ======================== 7. 地面(动态列表 + 地面高度) ======================== /** 创建地面设置区 */ private createGroundSection(): HTMLElement { const section = document.createElement('div'); - // 地面类型标签 + 下拉 + // 标签 const label = document.createElement('div'); label.style.cssText = SECTION_LABEL_STYLE; label.textContent = t('setting.ground'); section.appendChild(label); - const groundKeys: GroundType[] = ['none', 'concrete', 'grass', 'tile', 'water', 'wood']; - + // 下拉列表(从底层引擎动态获取) const select = this.createSelect( - groundKeys.map(key => ({ - value: key, - label: t(`setting.groundTypes.${key}` as any) - })), - this.groundType, + this.groundList.map(item => ({ value: item.id, label: item.name })), + this.groundId, (val) => { - this.groundType = val as GroundType; - // 显示/隐藏大小输入 - sizeRow.style.display = val === 'none' ? 'none' : 'flex'; + this.groundId = val; + this.engineComponent?.setGroundId(val); } ); section.appendChild(select); - // 大小输入行 - const sizeRow = document.createElement('div'); - sizeRow.style.cssText = ROW_STYLE + ' margin-top: 10px;'; - sizeRow.style.display = this.groundType === 'none' ? 'none' : 'flex'; + // 地面高度输入行 + const elevationRow = document.createElement('div'); + elevationRow.style.cssText = ROW_STYLE + ' margin-top: 10px;'; - const sizeLabel = document.createElement('span'); - sizeLabel.style.cssText = 'font-size: 13px; color: var(--bim-text-secondary, #475569);'; - sizeLabel.textContent = t('setting.groundSize'); - sizeRow.appendChild(sizeLabel); + const elevationLabel = document.createElement('span'); + elevationLabel.style.cssText = 'font-size: 13px; color: var(--bim-text-secondary, #475569);'; + elevationLabel.textContent = t('setting.groundElevation'); + elevationRow.appendChild(elevationLabel); - const sizeInput = document.createElement('input'); - sizeInput.type = 'number'; - sizeInput.value = String(this.groundSize); - sizeInput.min = '1'; - sizeInput.max = '10000'; - sizeInput.style.cssText = ` - width: 80px; padding: 4px 8px; border-radius: 4px; + // 输入框 + 单位容器 + const inputWrapper = document.createElement('div'); + inputWrapper.style.cssText = 'display: flex; align-items: center; gap: 4px;'; + + const elevationInput = document.createElement('input'); + elevationInput.type = 'number'; + elevationInput.value = String(this.groundElevation); + elevationInput.style.cssText = ` + width: 72px; padding: 4px 8px; border-radius: 4px; border: 1px solid ${BORDER_COLOR}; background: ${INPUT_BG}; color: ${TEXT_PRIMARY}; font-size: 13px; outline: none; text-align: right; `; - sizeInput.addEventListener('input', () => { - const v = Number(sizeInput.value); - if (!isNaN(v) && v > 0) { - this.groundSize = v; + elevationInput.addEventListener('input', () => { + const v = Number(elevationInput.value); + if (!isNaN(v)) { + this.groundElevation = v; + this.engineComponent?.setGroundElevation(v); } }); - // 聚焦时高亮边框 - sizeInput.addEventListener('focus', () => { - sizeInput.style.borderColor = PRIMARY; + elevationInput.addEventListener('focus', () => { + elevationInput.style.borderColor = PRIMARY; }); - sizeInput.addEventListener('blur', () => { - sizeInput.style.borderColor = BORDER_COLOR; + elevationInput.addEventListener('blur', () => { + elevationInput.style.borderColor = BORDER_COLOR; }); - sizeRow.appendChild(sizeInput); - section.appendChild(sizeRow); + const unitLabel = document.createElement('span'); + unitLabel.style.cssText = 'font-size: 13px; color: var(--bim-text-secondary, #475569);'; + unitLabel.textContent = t('setting.groundElevationUnit'); + + inputWrapper.appendChild(elevationInput); + inputWrapper.appendChild(unitLabel); + elevationRow.appendChild(inputWrapper); + section.appendChild(elevationRow); return section; } @@ -493,7 +535,7 @@ export class SettingDialogManager extends BaseDialogManager { onChange(select.value); }); - // 聚焦高亮 + // 聚焦��亮 select.addEventListener('focus', () => { select.style.borderColor = PRIMARY; }); @@ -503,4 +545,61 @@ export class SettingDialogManager extends BaseDialogManager { return select; } + + // ======================== 通用开关行 ======================== + + /** + * 创建一个标签 + 开关的行 + * @param labelText 标签文本 + * @param enabled 当前开关状态 + * @param onChange 状态变化回调 + */ + private createToggleRow( + labelText: string, + enabled: boolean, + onChange: (enabled: boolean) => void + ): HTMLElement { + const row = document.createElement('div'); + row.style.cssText = ROW_STYLE; + + // 标签 + const label = document.createElement('span'); + label.style.cssText = 'font-size: 13px; color: var(--bim-text-secondary, #475569);'; + label.textContent = labelText; + row.appendChild(label); + + // 开关容器 + const toggleOffBg = 'var(--bim-border-strong, #cbd5e1)'; + const toggleOnBg = PRIMARY; + + let currentState = enabled; + + const toggle = document.createElement('div'); + toggle.style.cssText = ` + width: 40px; height: 22px; border-radius: 11px; cursor: pointer; + position: relative; transition: background 0.2s; + background: ${currentState ? toggleOnBg : toggleOffBg}; + `; + + // 滑块圆点 + const knob = document.createElement('div'); + knob.style.cssText = ` + width: 18px; height: 18px; border-radius: 50%; + background: #fff; position: absolute; top: 2px; + transition: left 0.2s; + box-shadow: 0 1px 3px rgba(0,0,0,0.2); + left: ${currentState ? '20px' : '2px'}; + `; + toggle.appendChild(knob); + + toggle.addEventListener('click', () => { + currentState = !currentState; + toggle.style.background = currentState ? toggleOnBg : toggleOffBg; + knob.style.left = currentState ? '20px' : '2px'; + onChange(currentState); + }); + + row.appendChild(toggle); + return row; + } } diff --git a/src/managers/walk-control-manager.ts b/src/managers/walk-control-manager.ts index 4d98446..0b2632f 100644 --- a/src/managers/walk-control-manager.ts +++ b/src/managers/walk-control-manager.ts @@ -38,12 +38,12 @@ export class WalkControlManager extends BaseManager { // 打开漫游面板时,默认激活第一人称模式 console.log('[WalkControl] 打开漫游面板,激活第一人称模式'); - this.registry.engine3d?.activateFirstPersonMode(); + this.engineComponent?.activateFirstPersonMode(); this.panel = new WalkControlPanel({ onPlanViewToggle: (isActive) => { console.log('[WalkControl] 小地图:', isActive); - this.registry.engine3d?.toggleMiniMap(); + this.engineComponent?.toggleMiniMap(); this.emit('walk:plan-view-toggle', { isActive }); }, onPathModeToggle: (isActive) => { @@ -66,17 +66,17 @@ export class WalkControlManager extends BaseManager { onSpeedChange: (speed) => { console.log('[WalkControl] 速度变化:', speed); const engineSpeed = speed * 0.1; - this.registry.engine3d?.setWalkSpeed(engineSpeed); + this.engineComponent?.setWalkSpeed(engineSpeed); this.emit('walk:speed-change', { speed }); }, onGravityToggle: (enabled) => { console.log('[WalkControl] 重力:', enabled); - this.registry.engine3d?.setWalkGravity(enabled); + this.engineComponent?.setWalkGravity(enabled); this.emit('walk:gravity-toggle', { enabled }); }, onCollisionToggle: (enabled) => { console.log('[WalkControl] 碰撞:', enabled); - this.registry.engine3d?.setWalkCollision(enabled); + this.engineComponent?.setWalkCollision(enabled); this.emit('walk:collision-toggle', { enabled }); }, onCharacterModelChange: (model) => { @@ -111,7 +111,7 @@ export class WalkControlManager extends BaseManager { this.pathManager?.hide(); console.log('[WalkControl] 关闭漫游面板,退出第一人称模式'); - this.registry.engine3d?.deactivateFirstPersonMode(); + this.engineComponent?.deactivateFirstPersonMode(); if (this.panel) { this.panel.destroy();