@adatechnology/game-interactables 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +202 -2
- package/dist/index.d.ts +831 -0
- package/dist/index.global.js +1765 -0
- package/dist/index.global.js.map +1 -0
- package/dist/index.js +1740 -0
- package/dist/index.js.map +1 -0
- package/package.json +52 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/colliders.ts","../src/rng.ts","../src/loot.ts","../src/locale.ts","../src/math.ts","../src/world.ts"],"sourcesContent":["export type * from './types'\nexport { createWorld } from './world'\nexport { rng, hashString } from './rng'\nexport { generateLoot, fitsSize, fitsSlot } from './loot'\nexport { poseOf, localToWorld, worldToLocal, rotY, rotateAxis } from './math'\nexport type { Pose } from './math'\nexport { resolveStrings, locales, format, pickLocale } from './locale'\nexport { mergeColliders } from './colliders'\n","import type { ColliderOptions, WorldCollider } from './types'\n\ninterface Box {\n ids: string[]\n object: string\n u0: number\n u1: number\n v0: number\n v1: number\n y0: number\n y1: number\n}\n\nconst volume = (b: Box): number => (b.u1 - b.u0) * (b.v1 - b.v0) * (b.y1 - b.y0)\nconst overlap = (a0: number, a1: number, b0: number, b1: number): number => Math.max(0, Math.min(a1, b1) - Math.max(a0, b0))\n\nfunction tryMerge(a: Box, b: Box, gap: number, slack: number): Box | null {\n if (a.u0 - gap > b.u1 || b.u0 - gap > a.u1) return null\n if (a.v0 - gap > b.v1 || b.v0 - gap > a.v1) return null\n if (a.y0 - gap > b.y1 || b.y0 - gap > a.y1) return null\n const u0 = Math.min(a.u0, b.u0)\n const u1 = Math.max(a.u1, b.u1)\n const v0 = Math.min(a.v0, b.v0)\n const v1 = Math.max(a.v1, b.v1)\n const y0 = Math.min(a.y0, b.y0)\n const y1 = Math.max(a.y1, b.y1)\n const hull = (u1 - u0) * (v1 - v0) * (y1 - y0)\n const common = overlap(a.u0, a.u1, b.u0, b.u1) * overlap(a.v0, a.v1, b.v0, b.v1) * overlap(a.y0, a.y1, b.y0, b.y1)\n const real = volume(a) + volume(b) - common\n if (hull > real * (1 + slack) + 1e-9) return null\n return { ids: [...a.ids, ...b.ids], object: a.object, u0, u1, v0, v1, y0, y1 }\n}\n\n/**\n * Union overlapping or adjacent colliders of the same object (same rotation) into fewer OBBs.\n * A merge happens only when the merged box adds at most `slack` extra volume over the real union, so coverage is never lost\n * and never grows noticeably. Colliders of different objects or rotations are left alone.\n */\nexport function mergeColliders(list: WorldCollider[], options: Pick<ColliderOptions, 'gap' | 'slack'> = {}): WorldCollider[] {\n const gap = options.gap ?? 0.02\n const slack = options.slack ?? 0.1\n const groups = new Map<string, WorldCollider[]>()\n for (const c of list) {\n const key = `${c.object}|${Math.round(c.ry * 1000)}`\n const g = groups.get(key)\n if (g) g.push(c)\n else groups.set(key, [c])\n }\n const out: WorldCollider[] = []\n for (const g of groups.values()) {\n const ry = g[0]?.ry ?? 0\n const cs = Math.cos(ry)\n const sn = Math.sin(ry)\n let boxes: Box[] = g.map((c) => {\n const u = c.cx * cs - c.cz * sn\n const v = c.cx * sn + c.cz * cs\n return { ids: [c.id], object: c.object, u0: u - c.hw, u1: u + c.hw, v0: v - c.hd, v1: v + c.hd, y0: c.y0, y1: c.y1 }\n })\n let changed = boxes.length > 1\n while (changed) {\n changed = false\n outer: for (let i = 0; i < boxes.length; i++) {\n for (let j = i + 1; j < boxes.length; j++) {\n const m = tryMerge(boxes[i] as Box, boxes[j] as Box, gap, slack)\n if (!m) continue\n boxes = boxes.filter((_, k) => k !== i && k !== j)\n boxes.push(m)\n changed = true\n break outer\n }\n }\n }\n for (const b of boxes) {\n const u = (b.u0 + b.u1) / 2\n const v = (b.v0 + b.v1) / 2\n out.push({\n id: b.ids.length === 1 ? (b.ids[0] as string) : `${b.ids[0]}+${b.ids.length - 1}`,\n object: b.object,\n cx: u * cs + v * sn,\n cz: -u * sn + v * cs,\n hw: (b.u1 - b.u0) / 2,\n hd: (b.v1 - b.v0) / 2,\n ry,\n y0: b.y0,\n y1: b.y1,\n })\n }\n }\n return out\n}\n","/** FNV-1a hash of a string to a 32-bit unsigned integer. */\nexport function hashString(text: string): number {\n let h = 2166136261\n for (let i = 0; i < text.length; i++) {\n h ^= text.charCodeAt(i)\n h = Math.imul(h, 16777619)\n }\n return h >>> 0\n}\n\n/** Deterministic random generator (mulberry32). Returns a function producing floats in [0, 1). Numbers and strings are accepted as seeds. */\nexport function rng(seed: number | string = 1): () => number {\n let a = (typeof seed === 'number' ? Math.floor(seed) >>> 0 : hashString(seed)) || 0x9e3779b9\n return () => {\n a = (a + 0x6d2b79f5) >>> 0\n let t = a\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n","import { rng } from './rng'\nimport type { ItemCatalog, ItemStack, LootTables, SlotSpec, Vec3 } from './types'\n\n/** True when an item of `size` [w, h, d] fits in a slot of `max`; width and depth may be swapped (the item is turned). */\nexport function fitsSize(size: Vec3, max: Vec3): boolean {\n const eps = 1e-9\n if (size[1] > max[1] + eps) return false\n return (size[0] <= max[0] + eps && size[2] <= max[2] + eps) || (size[2] <= max[0] + eps && size[0] <= max[2] + eps)\n}\n\n/** Does the item type fit the slot. Types missing from the catalog are accepted (the host owns unknown items). */\nexport function fitsSlot(type: string, slot: SlotSpec, items?: ItemCatalog): boolean {\n const def = items?.[type]\n return def ? fitsSize(def.size, slot.max) : true\n}\n\n/**\n * Deterministic contents for a container: one entry per slot. A slot is filled with probability `fill`; the entry is a weighted pick\n * among the table entries whose item fits the slot. Same seed, same table and same slots always give the same result.\n */\nexport function generateLoot(\n tables: LootTables | undefined,\n tableId: string,\n slots: SlotSpec[],\n seed: number | string,\n items?: ItemCatalog,\n): Array<ItemStack | null> {\n const table = tables?.[tableId]\n const out: Array<ItemStack | null> = slots.map(() => null)\n if (!table) return out\n const rand = rng(seed)\n slots.forEach((slot, i) => {\n // Always draw the same number of random values per slot so a change in one slot does not shift the others.\n const roll = rand()\n const pick = rand()\n const q = rand()\n if (roll >= table.fill) return\n const candidates = table.entries.filter((e) => e.weight > 0 && fitsSlot(e.type, slot, items))\n const total = candidates.reduce((s, e) => s + e.weight, 0)\n if (total <= 0) return\n let r = pick * total\n let chosen = candidates[candidates.length - 1]\n for (const e of candidates) {\n r -= e.weight\n if (r < 0) {\n chosen = e\n break\n }\n }\n const [lo, hi] = chosen.qty ?? [1, 1]\n const def = items?.[chosen.type]\n const stackMax = def ? (def.stack ?? 1) : Number.POSITIVE_INFINITY\n const qty = Math.max(1, Math.min(stackMax, lo + Math.floor(q * (hi - lo + 1))))\n out[i] = { type: chosen.type, qty }\n })\n return out\n}\n","import type { InteractablesLocale, Strings } from './types'\n\n/** Engine-level prompts and messages. Content packs add their own keys through `WorldOptions.strings`. */\nexport const locales: Record<InteractablesLocale, Strings> = {\n en: {\n 'prompt.open': 'Open {name}',\n 'prompt.close': 'Close {name}',\n 'prompt.turn_on': 'Turn on {name}',\n 'prompt.turn_off': 'Turn off {name}',\n 'prompt.take': 'Take',\n 'prompt.sit': 'Sit',\n 'prompt.lie_down': 'Lie down',\n 'prompt.get_up': 'Get up',\n 'prompt.light': 'Light',\n 'prompt.change_channel': 'Change channel',\n 'prompt.read': 'Read',\n 'prompt.breaker_on': 'Switch on {circuit}',\n 'prompt.breaker_off': 'Switch off {circuit}',\n 'prompt.open_valve': 'Open valve',\n 'prompt.close_valve': 'Close valve',\n no_power: 'No power',\n no_gas: 'No gas',\n no_water: 'No water',\n locked: 'Locked',\n requires_open: 'Open it first',\n already_lit: 'Already lit',\n needs_ignition: 'Light it first',\n turn_on_first: 'Turn it on first',\n empty: 'Empty',\n full: 'Full',\n },\n 'pt-BR': {\n 'prompt.open': 'Abrir {name}',\n 'prompt.close': 'Fechar {name}',\n 'prompt.turn_on': 'Ligar {name}',\n 'prompt.turn_off': 'Desligar {name}',\n 'prompt.take': 'Pegar',\n 'prompt.sit': 'Sentar',\n 'prompt.lie_down': 'Deitar',\n 'prompt.get_up': 'Levantar',\n 'prompt.light': 'Acender',\n 'prompt.change_channel': 'Trocar de canal',\n 'prompt.read': 'Ler',\n 'prompt.breaker_on': 'Ligar {circuit}',\n 'prompt.breaker_off': 'Desligar {circuit}',\n 'prompt.open_valve': 'Abrir registro',\n 'prompt.close_valve': 'Fechar registro',\n no_power: 'Sem energia',\n no_gas: 'Sem gás',\n no_water: 'Sem água',\n locked: 'Trancado',\n requires_open: 'Abra primeiro',\n already_lit: 'Já está aceso',\n needs_ignition: 'Acenda primeiro',\n turn_on_first: 'Ligue primeiro',\n empty: 'Vazio',\n full: 'Cheio',\n },\n}\n\n/** Pick a built-in locale for an arbitrary tag (`pt`, `pt-br`, `en-GB`...). Unknown tags give `en`. */\nexport function pickLocale(locale: string | undefined): InteractablesLocale {\n if (!locale) return 'en'\n const l = locale.toLowerCase()\n if (l === 'pt-br' || l === 'pt') return 'pt-BR'\n return 'en'\n}\n\n/**\n * Merged table for a locale: built-in `en`, then the built-in table of `locale`, then the extra strings for `en` and for `locale`.\n * Lookup therefore falls back to English, and the caller never gets undefined for engine keys.\n */\nexport function resolveStrings(locale?: string, extra?: Partial<Record<InteractablesLocale, Strings>>): Strings {\n const loc = pickLocale(locale)\n return { ...locales.en, ...locales[loc], ...(extra?.en ?? {}), ...(loc === 'en' ? {} : (extra?.[loc] ?? {})) }\n}\n\n/** Replace `{name}` placeholders. Unknown placeholders are left untouched. */\nexport function format(text: string, vars?: Record<string, string | number>): string {\n if (!vars) return text\n return text.replace(/\\{(\\w+)\\}/g, (m, k: string) => (k in vars ? String(vars[k]) : m))\n}\n","import type { Motion, Transform, Vec3 } from './types'\n\nexport interface Pose {\n /** Translation relative to the pivot. */\n position: Vec3\n /** Rotation around `axis` (in the part frame) by `angle` radians. */\n rotation: { axis: Vec3; angle: number }\n scale: Vec3\n}\n\nconst DEFAULT_AXIS: Vec3 = [0, 1, 0]\n\n/**\n * Pose of a part at animation value `t` (0..1), relative to its pivot, so any renderer can apply it:\n * `position`, then `rotation` around the pivot, then `scale` along the axis.\n */\nexport function poseOf(motion: Motion, t: number): Pose {\n const tt = Math.max(0, Math.min(1, t))\n const axis = motion.axis ?? DEFAULT_AXIS\n const pose: Pose = { position: [0, 0, 0], rotation: { axis: [axis[0], axis[1], axis[2]], angle: 0 }, scale: [1, 1, 1] }\n switch (motion.kind) {\n case 'hinge':\n case 'rocker':\n case 'knob':\n pose.rotation.angle = (motion.angle ?? Math.PI / 2) * tt\n break\n case 'slide': {\n const d = (motion.distance ?? 0.4) * tt\n pose.position = [axis[0] * d, axis[1] * d, axis[2] * d]\n break\n }\n case 'scale': {\n const k = 1 + ((motion.scale ?? 0.2) - 1) * tt\n pose.scale = [axis[0] !== 0 ? k : 1, axis[1] !== 0 ? k : 1, axis[2] !== 0 ? k : 1]\n break\n }\n }\n return pose\n}\n\n/** Rotate a vector around +y by `ry` radians (same convention as three.js `rotation.y`). */\nexport function rotY(v: Vec3, ry: number): Vec3 {\n const c = Math.cos(ry)\n const s = Math.sin(ry)\n return [c * v[0] + s * v[2], v[1], -s * v[0] + c * v[2]]\n}\n\n/** Object-local point to world space. */\nexport function localToWorld(transform: Transform, v: Vec3): Vec3 {\n const r = rotY(v, transform.ry)\n return [transform.x + r[0], transform.y + r[1], transform.z + r[2]]\n}\n\n/** World point to object-local space. */\nexport function worldToLocal(transform: Transform, v: Vec3): Vec3 {\n return rotY([v[0] - transform.x, v[1] - transform.y, v[2] - transform.z], -transform.ry)\n}\n\n/** Rodrigues rotation of `v` around a unit-length-normalised `axis` by `angle`. */\nexport function rotateAxis(v: Vec3, axis: Vec3, angle: number): Vec3 {\n const len = Math.hypot(axis[0], axis[1], axis[2]) || 1\n const k: Vec3 = [axis[0] / len, axis[1] / len, axis[2] / len]\n const c = Math.cos(angle)\n const s = Math.sin(angle)\n const dot = k[0] * v[0] + k[1] * v[1] + k[2] * v[2]\n const cross: Vec3 = [k[1] * v[2] - k[2] * v[1], k[2] * v[0] - k[0] * v[2], k[0] * v[1] - k[1] * v[0]]\n return [v[0] * c + cross[0] * s + k[0] * dot * (1 - c), v[1] * c + cross[1] * s + k[1] * dot * (1 - c), v[2] * c + cross[2] * s + k[2] * dot * (1 - c)]\n}\n\nexport function clamp(v: number, lo: number, hi: number): number {\n return v < lo ? lo : v > hi ? hi : v\n}\n\nexport function dist3(a: Vec3, b: Vec3): number {\n return Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2])\n}\n","import { mergeColliders } from './colliders'\nimport { fitsSlot, generateLoot } from './loot'\nimport { format, resolveStrings } from './locale'\nimport { clamp, dist3, localToWorld, rotateAxis, rotY, worldToLocal } from './math'\nimport type {\n ActiveEmitter,\n BurnerSpec,\n ColliderOptions,\n DeviceSpec,\n FixtureSpec,\n FuelSourceSpec,\n Interactable,\n InteractionSpec,\n ItemStack,\n ObjectSpec,\n PartSpec,\n SeatResult,\n SoftSpec,\n TankSpec,\n TargetOptions,\n Transform,\n Vec3,\n World,\n WorldCollider,\n WorldEvent,\n WorldObject,\n WorldOptions,\n WorldState,\n} from './types'\n\n// ---------------------------------------------------------------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------------------------------------------------------------\n\nconst DEFAULT_ACTOR = 'player'\nconst DEFAULT_RADIUS = 1.2\nconst AUTO_RANGE = 2\nconst SMOKE_TAIL = 20\nconst FLUSH_SECONDS = 2\nconst ACTOR_HEIGHT = 1.7\nconst PUSH_GAIN = 1.2\nconst SWEEP_STEPS = 24\nconst FLOW_DEFAULTS: Record<string, number> = { tap: 6, shower: 8, utility_sink: 6, flush: 0, hose: 10, filter: 1 }\n\n// ---------------------------------------------------------------------------------------------------------------------------------\n// Internal state\n// ---------------------------------------------------------------------------------------------------------------------------------\n\ninterface PartState {\n spec: PartSpec\n t: number\n target: number\n maxT: number\n}\n\ninterface DeviceState {\n spec: DeviceSpec\n on: boolean\n channel: number\n}\n\ninterface FuelState {\n spec: FuelSourceSpec\n level: number\n}\n\ninterface BurnerState {\n spec: BurnerSpec\n on: boolean\n lit: boolean\n /** Seconds of smoke left after a solid-fuel fire went out. */\n smoke: number\n}\n\ninterface TankState {\n spec: TankSpec\n level: number\n}\n\ninterface FixtureState {\n spec: FixtureSpec\n on: boolean\n flowing: boolean\n /** Delivered / wanted in the last step, 0..1. */\n frac: number\n /** Seconds left of a flush. */\n timer: number\n}\n\ninterface SoftState {\n spec: SoftSpec\n ax: number\n az: number\n vax: number\n vaz: number\n phase: number\n}\n\ninterface DamageState {\n max: number\n hp: number\n}\n\ninterface ObjState {\n id: string\n public: WorldObject\n spec: ObjectSpec\n parts: Map<string, PartState>\n contents: Map<string, Array<ItemStack | null>>\n devices: Map<string, DeviceState>\n fuels: Map<string, FuelState>\n burners: Map<string, BurnerState>\n tanks: Map<string, TankState>\n fixtures: Map<string, FixtureState>\n soft: Map<string, SoftState>\n hp: Map<string, DamageState>\n interactions: InteractionSpec[]\n}\n\nfunction cloneStack(s: ItemStack | null): ItemStack | null {\n return s ? { type: s.type, qty: s.qty, ...(s.data ? { data: JSON.parse(JSON.stringify(s.data)) as Record<string, unknown> } : {}) } : null\n}\n\nfunction humanize(id: string): string {\n const s = id.replace(/[_-]+/g, ' ').trim()\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\n// ---------------------------------------------------------------------------------------------------------------------------------\n// World\n// ---------------------------------------------------------------------------------------------------------------------------------\n\nexport function createWorld(options: WorldOptions = {}): World {\n const seed = options.seed ?? 1\n const objs = new Map<string, ObjState>()\n const breakers = new Map<string, boolean>()\n const seats = new Map<string, { object: string; seat: string }>()\n const plugs = new Map<string, string | null>()\n let locale = options.locale ?? 'en'\n let table = resolveStrings(locale, options.strings)\n let grid = options.grid ?? true\n let rain = options.rain ?? 0\n let wind: [number, number] = options.wind ? [options.wind[0], options.wind[1]] : [0, 0]\n let defaultTank: string | null = null\n let defaultTankExplicit = false\n let time = 0\n\n // ------------------------------------------------------------------ text & events\n function t(key: string, vars?: Record<string, string | number>): string {\n return format(table[key] ?? key, vars)\n }\n\n function emit(e: WorldEvent): void {\n options.onEvent?.(e)\n }\n\n function message(key: string): void {\n emit({ type: 'message', key, text: t(key) })\n }\n\n // ------------------------------------------------------------------ lookup helpers\n function gid(o: ObjState, local: string): string {\n return `${o.id}:${local}`\n }\n\n /** Find the first entity matching a world-wide id `objectId:localId`. */\n function findGlobal<T>(id: string, pick: (o: ObjState, local: string) => T | undefined): { o: ObjState; value: T; local: string } | null {\n for (const o of objs.values()) {\n if (!id.startsWith(o.id + ':')) continue\n const local = id.slice(o.id.length + 1)\n const value = pick(o, local)\n if (value !== undefined) return { o, value, local }\n }\n return null\n }\n\n function objectOrThrow(id: string): ObjState {\n const o = objs.get(id)\n if (!o) throw new Error(`Unknown object \"${id}\"`)\n return o\n }\n\n function originOf(o: ObjState): Vec3 {\n const tr = o.public.transform\n return [tr.x, tr.y, tr.z]\n }\n\n function toWorld(o: ObjState, v: Vec3): Vec3 {\n return localToWorld(o.public.transform, v)\n }\n\n // ------------------------------------------------------------------ parts\n function openThreshold(p: PartState): number {\n return Math.min(0.5, p.maxT * 0.9)\n }\n\n function isOpen(o: ObjState, partId: string | undefined): boolean {\n if (!partId) return true\n const p = o.parts.get(partId)\n if (!p) return true\n return p.maxT >= 0.1 && p.t >= openThreshold(p)\n }\n\n function targetIsOpen(p: PartState): boolean {\n return p.maxT >= 0.1 && p.target >= openThreshold(p)\n }\n\n function writeT(o: ObjState, p: PartState, v: number): void {\n p.t = v\n o.public.parts[p.spec.id] = v\n }\n\n function gated(o: ObjState, p: PartState): boolean {\n return !!p.spec.requires && o.parts.has(p.spec.requires) && !isOpen(o, p.spec.requires)\n }\n\n function setOnePart(o: ObjState, p: PartState, target: number, instant: boolean): void {\n const next = clamp(target, 0, p.maxT)\n const changed = next !== p.target\n p.target = next\n if (instant) writeT(o, p, next)\n if (changed || instant) emit({ type: 'part', object: o.id, part: p.spec.id, t: p.t, target: p.target })\n }\n\n function setPartTarget(o: ObjState, partId: string, target: number, instant = false): void {\n const p = o.parts.get(partId)\n if (!p) return\n const group = p.spec.group\n const members = group ? [...o.parts.values()].filter((q) => q.spec.group === group) : [p]\n for (const q of members) {\n setOne(o, q, target, instant)\n }\n }\n\n function setOne(o: ObjState, p: PartState, target: number, instant: boolean): void {\n setOnePart(o, p, target, instant)\n // a part that other parts require closes them with it (the drawer behind a door closes with the door)\n if (!targetIsOpen(p)) {\n for (const q of o.parts.values()) {\n if (q.spec.requires === p.spec.id && q.target > 0) setPartTarget(o, q.spec.id, 0, instant)\n }\n }\n }\n\n /** Frame of a part right now: rotation (axis in object-local, angle) and translation, both about its pivot. */\n function partFrame(o: ObjState, partId: string | undefined): { pivot: Vec3; axis: Vec3; angle: number; offset: Vec3 } | null {\n if (!partId) return null\n const p = o.parts.get(partId)\n if (!p) return null\n const m = p.spec.motion\n const axis = rotY(m.axis ?? [0, 1, 0], p.spec.ry ?? 0)\n const frame = { pivot: p.spec.pivot, axis, angle: 0, offset: [0, 0, 0] as Vec3 }\n if (m.kind === 'slide') {\n const d = (m.distance ?? 0.4) * p.t\n frame.offset = [axis[0] * d, axis[1] * d, axis[2] * d]\n } else if (m.kind !== 'scale') {\n frame.angle = (m.angle ?? Math.PI / 2) * p.t\n }\n return frame\n }\n\n function applyPart(o: ObjState, partId: string | undefined, local: Vec3): Vec3 {\n const f = partFrame(o, partId)\n if (!f) return local\n const rel: Vec3 = [local[0] - f.pivot[0], local[1] - f.pivot[1], local[2] - f.pivot[2]]\n const r = f.angle !== 0 ? rotateAxis(rel, f.axis, f.angle) : rel\n return [f.pivot[0] + r[0] + f.offset[0], f.pivot[1] + r[1] + f.offset[1], f.pivot[2] + r[2] + f.offset[2]]\n }\n\n /** Moves the full closed-pose slab of a part and returns the largest t whose pose keeps every sampled point clear. */\n function fitBounds(o: ObjState, p: PartState, b: NonNullable<PartSpec['bounds']>, blockedAt: (x: number, z: number) => boolean): number {\n const STEP = 0.05\n const ANGLES = 48\n const m = p.spec.motion\n const axis = rotY(m.axis ?? [0, 1, 0], p.spec.ry ?? 0)\n const lo: Vec3 = [Math.min(b[0], b[3]), Math.min(b[1], b[4]), Math.min(b[2], b[5])]\n const hi: Vec3 = [Math.max(b[0], b[3]), Math.max(b[1], b[4]), Math.max(b[2], b[5])]\n const axisPoints = (i: number): number[] => {\n const n = Math.max(1, Math.ceil((hi[i] - lo[i]) / STEP))\n return Array.from({ length: n + 1 }, (_, k) => lo[i] + ((hi[i] - lo[i]) * k) / n)\n }\n const xs = axisPoints(0)\n const ys = axisPoints(1)\n const zs = axisPoints(2)\n // `blocked` only sees x/z, so only the floor footprint matters. About a vertical axis (and for slides) y never changes\n // the footprint, so the x/z outline is enough; otherwise the footprint boundary is the projection of the box edges.\n const flat = m.kind === 'slide' || Math.abs(axis[1]) > 0.999\n const seen = new Set<string>()\n const pts: Vec3[] = []\n const add = (x: number, y: number, z: number): void => {\n const key = `${x.toFixed(5)},${y.toFixed(5)},${z.toFixed(5)}`\n if (seen.has(key)) return\n seen.add(key)\n pts.push([x, y, z])\n }\n if (flat) {\n for (const x of xs) for (const z of [lo[2], hi[2]]) add(x, lo[1], z)\n for (const z of zs) for (const x of [lo[0], hi[0]]) add(x, lo[1], z)\n } else {\n for (const x of xs) for (const y of [lo[1], hi[1]]) for (const z of [lo[2], hi[2]]) add(x, y, z)\n for (const y of ys) for (const x of [lo[0], hi[0]]) for (const z of [lo[2], hi[2]]) add(x, y, z)\n for (const z of zs) for (const x of [lo[0], hi[0]]) for (const y of [lo[1], hi[1]]) add(x, y, z)\n }\n const tr = o.public.transform\n const pivot = p.spec.pivot\n for (let i = 1; i <= ANGLES; i++) {\n const tt = i / ANGLES\n const angle = m.kind === 'slide' ? 0 : (m.angle ?? Math.PI / 2) * tt\n const d = m.kind === 'slide' ? (m.distance ?? 0.4) * tt : 0\n for (const [x, y, z] of pts) {\n let q: Vec3 = [x, y, z]\n if (angle !== 0) {\n const r = rotateAxis([x - pivot[0], y - pivot[1], z - pivot[2]], axis, angle)\n q = [pivot[0] + r[0], pivot[1] + r[1], pivot[2] + r[2]]\n }\n const w = localToWorld(tr, [q[0] + axis[0] * d, 0, q[2] + axis[2] * d])\n if (blockedAt(w[0], w[2])) return (i - 1) / ANGLES\n }\n }\n return 1\n }\n\n function fitSweep(objectId: string, partId: string, blocked: (x: number, z: number) => boolean): number {\n const o = objectOrThrow(objectId)\n const p = o.parts.get(partId)\n if (!p) throw new Error(`Unknown part \"${partId}\" on \"${objectId}\"`)\n const sweep = p.spec.sweep\n let result = 1\n const bounds = p.spec.bounds\n const mk = p.spec.motion.kind\n if (bounds && (mk === 'hinge' || mk === 'rocker' || mk === 'knob' || mk === 'slide')) {\n result = fitBounds(o, p, bounds, blocked)\n } else if (sweep) {\n const x0 = Math.min(sweep[0], sweep[2])\n const x1 = Math.max(sweep[0], sweep[2])\n const z0 = Math.min(sweep[1], sweep[3])\n const z1 = Math.max(sweep[1], sweep[3])\n const tr = o.public.transform\n const hit = (lx: number, lz: number): boolean => {\n const w = localToWorld(tr, [lx, 0, lz])\n return blocked(w[0], w[2])\n }\n const m = p.spec.motion\n const axis = rotY(m.axis ?? [0, 1, 0], p.spec.ry ?? 0)\n if (m.kind === 'hinge' || m.kind === 'rocker' || m.kind === 'knob') {\n if (Math.abs(axis[1]) >= 0.5) {\n const angle = m.angle ?? Math.PI / 2\n const total = -angle * Math.sign(axis[1])\n const [px, , pz] = p.spec.pivot\n const cx = (x0 + x1) / 2\n const cz = (z0 + z1) / 2\n const w = x1 - x0\n const d = z1 - z0\n const radius = Math.abs(angle) > 1.7 ? Math.min(w, d) : Math.max(w, d)\n const tol = 0.05\n const inRect = (x: number, z: number) => x >= x0 - tol && x <= x1 + tol && z >= z0 - tol && z <= z1 + tol\n const centered = Math.hypot(cx - px, cz - pz) < 1e-6\n const mid = Math.atan2(cz - pz, cx - px)\n for (let i = 1; i <= SWEEP_STEPS && result === 1; i++) {\n const tt = i / SWEEP_STEPS\n let isHit = false\n if (centered) {\n for (let x = x0; x <= x1 + 1e-9 && !isHit; x += 0.1) for (let z = z0; z <= z1 + 1e-9 && !isHit; z += 0.1) isHit = hit(x, z)\n } else {\n const phi = mid - total / 2 + total * tt\n const steps = Math.max(2, Math.ceil(radius / 0.1))\n for (let k = 1; k <= steps && !isHit; k++) {\n const r = (radius * k) / steps\n const x = px + Math.cos(phi) * r\n const z = pz + Math.sin(phi) * r\n if (inRect(x, z)) isHit = hit(x, z)\n }\n }\n if (isHit) result = (i - 1) / SWEEP_STEPS\n }\n }\n } else if (m.kind === 'slide') {\n const len = Math.hypot(axis[0], axis[2])\n if (len > 1e-6) {\n const dx = axis[0] / len\n const dz = axis[2] / len\n const proj = [x0 * dx + z0 * dz, x1 * dx + z0 * dz, x0 * dx + z1 * dz, x1 * dx + z1 * dz]\n const pmin = Math.min(...proj)\n const pmax = Math.max(...proj)\n const nx = Math.max(1, Math.ceil((x1 - x0) / 0.1))\n const nz = Math.max(1, Math.ceil((z1 - z0) / 0.1))\n for (let i = 1; i <= SWEEP_STEPS && result === 1; i++) {\n const limit = pmin + (pmax - pmin) * (i / SWEEP_STEPS)\n let isHit = false\n for (let a = 0; a <= nx && !isHit; a++) {\n for (let b = 0; b <= nz && !isHit; b++) {\n const x = x0 + ((x1 - x0) * a) / nx\n const z = z0 + ((z1 - z0) * b) / nz\n if (x * dx + z * dz <= limit + 1e-9 && hit(x, z)) isHit = true\n }\n }\n if (isHit) result = (i - 1) / SWEEP_STEPS\n }\n }\n }\n }\n p.maxT = result\n if (p.target > result) p.target = result\n if (p.t > result) writeT(o, p, result)\n return result\n }\n\n // ------------------------------------------------------------------ containers\n function containerOf(o: ObjState, id: string) {\n return o.spec.containers?.find((c) => c.id === id)\n }\n\n function accessible(objectId: string, containerId: string): boolean {\n const o = objs.get(objectId)\n if (!o) return false\n const c = containerOf(o, containerId)\n if (!c) return false\n return isOpen(o, c.access)\n }\n\n function contents(objectId: string, containerId: string): Array<ItemStack | null> {\n return (objs.get(objectId)?.contents.get(containerId) ?? []).map(cloneStack)\n }\n\n function take(objectId: string, containerId: string, slot: number, actor: string = DEFAULT_ACTOR): ItemStack | null {\n const o = objs.get(objectId)\n if (!o) return null\n const list = o.contents.get(containerId)\n if (!list || !accessible(objectId, containerId)) return null\n const stack = list[slot]\n if (!stack) return null\n const def = options.items?.[stack.type]\n if (def && def.pickable === false) return null\n list[slot] = null\n emit({ type: 'pickup', object: objectId, container: containerId, slot, stack: cloneStack(stack) as ItemStack, actor })\n return stack\n }\n\n function put(objectId: string, containerId: string, stack: ItemStack): number | null {\n const o = objs.get(objectId)\n if (!o) return null\n const c = containerOf(o, containerId)\n const list = o.contents.get(containerId)\n if (!c || !list || !accessible(objectId, containerId)) return null\n const maxStack = options.items?.[stack.type]?.stack ?? 1\n for (let i = 0; i < list.length; i++) {\n const cur = list[i]\n if (cur && cur.type === stack.type && !cur.data && !stack.data && cur.qty + stack.qty <= maxStack) {\n cur.qty += stack.qty\n return i\n }\n }\n for (let i = 0; i < list.length; i++) {\n if (!list[i] && fitsSlot(stack.type, c.slots[i], options.items)) {\n list[i] = cloneStack(stack)\n return i\n }\n }\n message('full')\n return null\n }\n\n function slotPosition(objectId: string, containerId: string, slot: number): Vec3 {\n const o = objectOrThrow(objectId)\n const c = containerOf(o, containerId)\n const s = c?.slots[slot]\n if (!c || !s) throw new Error(`Unknown slot ${slot} of \"${containerId}\" on \"${objectId}\"`)\n return toWorld(o, applyPart(o, s.part, s.pos))\n }\n\n // ------------------------------------------------------------------ power\n function rebuildPlugs(): void {\n plugs.clear()\n const sockets: Array<{ id: string; pos: Vec3; circuit?: string; local: string }> = []\n for (const o of objs.values()) {\n for (const s of o.spec.sockets ?? []) sockets.push({ id: gid(o, s.id), local: s.id, pos: toWorld(o, s.pos), circuit: s.circuit })\n }\n const used = new Set<string>()\n const autos: Array<{ o: ObjState; d: DeviceState }> = []\n for (const o of objs.values()) {\n for (const d of o.devices.values()) {\n const key = gid(o, d.spec.id)\n const want = d.spec.socket\n if (want === undefined || d.spec.circuit) {\n plugs.set(key, null)\n } else if (want === 'auto') {\n plugs.set(key, null)\n autos.push({ o, d })\n } else {\n const s = sockets.find((x) => x.id === want) ?? sockets.find((x) => x.id === gid(o, want)) ?? sockets.find((x) => x.local === want)\n plugs.set(key, s ? s.id : null)\n if (s) used.add(s.id)\n }\n }\n }\n for (const { o, d } of autos) {\n const from = d.spec.plug ? toWorld(o, d.spec.plug) : originOf(o)\n let best: (typeof sockets)[number] | null = null\n let bestD = AUTO_RANGE\n for (const s of sockets) {\n if (used.has(s.id)) continue\n const dd = dist3(from, s.pos)\n if (dd <= bestD) {\n best = s\n bestD = dd\n }\n }\n if (best) {\n used.add(best.id)\n plugs.set(gid(o, d.spec.id), best.id)\n }\n }\n }\n\n function breaker(circuit: string): boolean {\n return breakers.get(circuit) ?? true\n }\n\n function devicePowered(o: ObjState, d: DeviceState): boolean {\n if (d.spec.electric === false) return true\n if (!grid) return false\n if (d.spec.circuit) return breaker(d.spec.circuit)\n if (d.spec.socket === undefined) return false\n const sid = plugs.get(gid(o, d.spec.id))\n if (!sid) return false\n const found = findGlobal(sid, (oo, local) => oo.spec.sockets?.find((s) => s.id === local))\n if (!found) return false\n return found.value.circuit ? breaker(found.value.circuit) : true\n }\n\n function getDevice(objectId: string, deviceId: string): { o: ObjState; d: DeviceState } | null {\n const o = objs.get(objectId)\n const d = o?.devices.get(deviceId)\n return o && d ? { o, d } : null\n }\n\n function powerSnapshot(): Map<string, boolean> {\n const m = new Map<string, boolean>()\n for (const o of objs.values()) for (const d of o.devices.values()) m.set(gid(o, d.spec.id), d.on && devicePowered(o, d))\n return m\n }\n\n function emitPowerChanges(before: Map<string, boolean>): void {\n for (const o of objs.values()) {\n for (const d of o.devices.values()) {\n const key = gid(o, d.spec.id)\n const now = d.on && devicePowered(o, d)\n if (before.get(key) !== now && d.on) emit({ type: 'device', object: o.id, device: d.spec.id, on: d.on, powered: devicePowered(o, d), channel: d.spec.kind === 'screen' ? d.channel : undefined })\n }\n }\n }\n\n function setDeviceOn(o: ObjState, d: DeviceState, on: boolean): void {\n d.on = on\n if (d.spec.part) setPartTarget(o, d.spec.part, on ? 1 : 0)\n const powered = devicePowered(o, d)\n emit({ type: 'device', object: o.id, device: d.spec.id, on, powered, channel: d.spec.kind === 'screen' ? d.channel : undefined })\n if (on && !powered) message('no_power')\n }\n\n function setDevice(objectId: string, deviceId: string, on: boolean): boolean {\n const f = getDevice(objectId, deviceId)\n if (!f) return false\n if (f.d.on !== on) setDeviceOn(f.o, f.d, on)\n return true\n }\n\n function setFixture(objectId: string, fixtureId: string, on: boolean): boolean {\n const fx = objs.get(objectId)?.fixtures.get(fixtureId)\n if (!fx) return false\n if (fx.on !== on) toggleFixture(objs.get(objectId) as ObjState, fixtureId)\n return fx.on === on\n }\n\n function setBurner(objectId: string, burnerId: string, on: boolean): boolean {\n const o = objs.get(objectId)\n const b = o?.burners.get(burnerId)\n if (!o || !b) return false\n const isOn = b.on || b.lit\n if (on === isOn) return true\n if (!on) return toggleBurner(o, burnerId)\n return b.spec.needsIgnition ? ignite(o, burnerId) : toggleBurner(o, burnerId)\n }\n\n function resolveDevice(o: ObjState, id: string): { o: ObjState; d: DeviceState } | null {\n if (id.includes(':')) {\n const f = findGlobal(id, (oo, local) => oo.devices.get(local))\n return f ? { o: f.o, d: f.value } : null\n }\n const local = o.devices.get(id)\n if (local) return { o, d: local }\n for (const oo of objs.values()) {\n const d = oo.devices.get(id)\n if (d) return { o: oo, d }\n }\n return null\n }\n\n function switchIsOn(o: ObjState, spec: { part?: string; controls: string[] }): boolean {\n if (spec.part && o.parts.has(spec.part)) return targetIsOpen(o.parts.get(spec.part) as PartState)\n return spec.controls.some((id) => resolveDevice(o, id)?.d.on)\n }\n\n function toggleSwitch(o: ObjState, id: string): boolean {\n const sw = o.spec.switches?.find((s) => s.id === id)\n if (!sw) return false\n const on = !switchIsOn(o, sw)\n if (sw.part) setPartTarget(o, sw.part, on ? 1 : 0)\n let unpowered = false\n for (const ref of sw.controls) {\n const r = resolveDevice(o, ref)\n if (!r) continue\n r.d.on = on\n if (r.d.spec.part) setPartTarget(r.o, r.d.spec.part, on ? 1 : 0)\n const powered = devicePowered(r.o, r.d)\n if (on && !powered) unpowered = true\n emit({ type: 'device', object: r.o.id, device: r.d.spec.id, on, powered })\n }\n emit({ type: 'switch', object: o.id, switch: sw.id, on })\n if (unpowered) message('no_power')\n return true\n }\n\n // ------------------------------------------------------------------ fuel\n function resolveFuel(o: ObjState, b: BurnerState): { o: ObjState; f: FuelState } | null {\n const want = b.spec.fuel\n if (want === 'auto') {\n const from = toWorld(o, b.spec.pos)\n let best: { o: ObjState; f: FuelState } | null = null\n let bestD = AUTO_RANGE\n for (const oo of objs.values()) {\n for (const f of oo.fuels.values()) {\n if (f.spec.kind !== 'gas') continue\n const d = dist3(from, originOf(oo))\n if (d <= bestD) {\n best = { o: oo, f }\n bestD = d\n }\n }\n }\n return best\n }\n if (want.includes(':')) {\n const f = findGlobal(want, (oo, local) => oo.fuels.get(local))\n return f ? { o: f.o, f: f.value } : null\n }\n const local = o.fuels.get(want)\n return local ? { o, f: local } : null\n }\n\n function valveOpen(o: ObjState, f: FuelState): boolean {\n const v = f.spec.valve\n if (!v || !o.parts.has(v)) return true\n return targetIsOpen(o.parts.get(v) as PartState)\n }\n\n function canBurn(b: BurnerState, ref: { o: ObjState; f: FuelState } | null): boolean {\n return !!ref && ref.f.level > 0 && valveOpen(ref.o, ref.f)\n }\n\n function isSolid(ref: { f: FuelState } | null): boolean {\n return !!ref && ref.f.spec.kind !== 'gas'\n }\n\n function emitBurner(o: ObjState, b: BurnerState): void {\n emit({ type: 'burner', object: o.id, burner: b.spec.id, on: b.on, lit: b.lit })\n }\n\n function extinguish(o: ObjState, b: BurnerState, turnOff: boolean): void {\n const ref = resolveFuel(o, b)\n const wasLit = b.lit\n b.lit = false\n if (turnOff) b.on = false\n if (b.spec.part) setPartTarget(o, b.spec.part, b.on ? 1 : 0)\n if (wasLit && isSolid(ref)) b.smoke = SMOKE_TAIL\n emitBurner(o, b)\n }\n\n function toggleBurner(o: ObjState, id: string): boolean {\n const b = o.burners.get(id)\n if (!b) return false\n if (b.on || b.lit) {\n extinguish(o, b, true)\n return true\n }\n if (b.spec.needsIgnition) return false\n const ref = resolveFuel(o, b)\n b.on = true\n b.lit = canBurn(b, ref)\n if (b.lit) b.smoke = 0\n if (b.spec.part) setPartTarget(o, b.spec.part, 1)\n emitBurner(o, b)\n if (!b.lit) message(ref && ref.f.level <= 0 ? 'empty' : 'no_gas')\n return true\n }\n\n function ignite(o: ObjState, id: string): boolean {\n const b = o.burners.get(id)\n if (!b || b.lit) return false\n const ref = resolveFuel(o, b)\n if (!canBurn(b, ref)) {\n message(ref && ref.f.level <= 0 ? 'empty' : 'no_gas')\n return false\n }\n b.on = true\n b.lit = true\n b.smoke = 0\n if (b.spec.part) setPartTarget(o, b.spec.part, 1)\n emitBurner(o, b)\n return true\n }\n\n function toggleFuel(o: ObjState, id: string): boolean {\n const f = o.fuels.get(id)\n if (!f || !f.spec.valve || !o.parts.has(f.spec.valve)) return false\n const p = o.parts.get(f.spec.valve) as PartState\n setPartTarget(o, f.spec.valve, targetIsOpen(p) ? 0 : 1)\n return true\n }\n\n // ------------------------------------------------------------------ water\n function resolveTank(o: ObjState, id: string | undefined): { o: ObjState; t: TankState } | null {\n const want = id === undefined || id === 'auto' ? defaultTank : id\n if (!want) return null\n const f = findGlobal(want, (oo, local) => oo.tanks.get(local))\n if (f) return { o: f.o, t: f.value }\n const local = o.tanks.get(want)\n return local ? { o, t: local } : null\n }\n\n function drawWater(o: ObjState, fx: FixtureState, liters: number): number {\n if (liters <= 0) return 0\n if (options.waterSupply) return Math.max(0, Math.min(liters, options.waterSupply.draw(gid(o, fx.spec.id), liters)))\n const tank = resolveTank(o, fx.spec.tank)\n if (!tank) return 0\n const got = Math.min(liters, tank.t.level)\n tank.t.level -= got\n return got\n }\n\n function emitFixture(o: ObjState, fx: FixtureState): void {\n emit({ type: 'fixture', object: o.id, fixture: fx.spec.id, on: fx.on, flowing: fx.flowing })\n }\n\n function flowOf(fx: FixtureState): number {\n return fx.spec.flow ?? FLOW_DEFAULTS[fx.spec.kind] ?? 6\n }\n\n function stepFixture(o: ObjState, fx: FixtureState, dt: number): void {\n if (!fx.on) return\n if (fx.spec.kind === 'flush') {\n fx.timer -= dt\n if (fx.timer <= 0) {\n fx.on = false\n fx.flowing = false\n fx.frac = 0\n if (fx.spec.part) setPartTarget(o, fx.spec.part, 0)\n emitFixture(o, fx)\n }\n return\n }\n if (dt <= 0) return\n const wanted = (flowOf(fx) / 60) * dt\n const got = drawWater(o, fx, wanted)\n const flowing = got > 1e-9\n fx.frac = wanted > 0 ? Math.min(1, got / wanted) : 0\n if (flowing !== fx.flowing) {\n fx.flowing = flowing\n emitFixture(o, fx)\n }\n }\n\n function toggleFixture(o: ObjState, id: string): boolean {\n const fx = o.fixtures.get(id)\n if (!fx) return false\n if (fx.on) {\n fx.on = false\n fx.flowing = false\n fx.frac = 0\n if (fx.spec.part) setPartTarget(o, fx.spec.part, 0)\n emitFixture(o, fx)\n return true\n }\n fx.on = true\n if (fx.spec.part) setPartTarget(o, fx.spec.part, 1)\n if (fx.spec.kind === 'flush') {\n const volume = fx.spec.volume ?? 6\n const got = drawWater(o, fx, volume)\n fx.flowing = got > 1e-9\n fx.frac = fx.flowing ? 1 : 0\n fx.timer = FLUSH_SECONDS\n if (!fx.flowing) {\n fx.on = false\n if (fx.spec.part) setPartTarget(o, fx.spec.part, 0)\n }\n } else {\n fx.flowing = false\n fx.frac = 0\n stepFixture(o, fx, 1 / 60)\n }\n emitFixture(o, fx)\n if (!fx.flowing) message('no_water')\n return true\n }\n\n // ------------------------------------------------------------------ seats\n function seatTaken(objectId: string, seatId: string): string | null {\n for (const [actor, s] of seats) if (s.object === objectId && s.seat === seatId) return actor\n return null\n }\n\n function stand(actor: string = DEFAULT_ACTOR): Vec3 | null {\n const s = seats.get(actor)\n if (!s) return null\n seats.delete(actor)\n const o = objs.get(s.object)\n const spec = o?.spec.seats?.find((x) => x.id === s.seat)\n emit({ type: 'seat', object: s.object, seat: s.seat, actor, seated: false })\n if (!o || !spec) return null\n return toWorld(o, spec.exit)\n }\n\n function sit(objectId: string, seatId: string, actor: string = DEFAULT_ACTOR): SeatResult | null {\n const o = objs.get(objectId)\n const seat = o?.spec.seats?.find((s) => s.id === seatId)\n if (!o || !seat) return null\n const holder = seatTaken(objectId, seatId)\n if (holder && holder !== actor) return null\n if (seats.has(actor) && !holder) stand(actor)\n seats.set(actor, { object: objectId, seat: seatId })\n const eye = seat.eye ?? (seat.pose === 'lie' ? 0.18 : 0.62)\n emit({ type: 'seat', object: objectId, seat: seatId, actor, seated: true })\n return { eye: toWorld(o, [seat.pos[0], seat.pos[1] + eye, seat.pos[2]]), yaw: o.public.transform.ry + seat.ry + Math.PI, pose: seat.pose }\n }\n\n // ------------------------------------------------------------------ soft volumes\n function push(pos: Vec3, radius: number, vel: Vec3): void {\n for (const o of objs.values()) {\n if (!o.soft.size) continue\n const tr = o.public.transform\n const lp = worldToLocal(tr, pos)\n const lv = rotY(vel, -tr.ry)\n for (const s of o.soft.values()) {\n const [w, h, d] = s.spec.size\n const hx = w / 2\n const hz = Math.max(d, 0.1) / 2\n const dx = Math.max(Math.abs(lp[0] - s.spec.anchor[0]) - hx, 0)\n const dz = Math.max(Math.abs(lp[2] - s.spec.anchor[2]) - hz, 0)\n if (Math.hypot(dx, dz) > radius) continue\n const top = tr.y + s.spec.anchor[1]\n if (pos[1] + ACTOR_HEIGHT < top - h || pos[1] > top) continue\n const cap = 8\n s.vax = clamp(s.vax - lv[2] * PUSH_GAIN, -cap, cap)\n s.vaz = clamp(s.vaz + lv[0] * PUSH_GAIN, -cap, cap)\n if (s.spec.kind === 'panel' && s.spec.part && lv[2] < -0.05 && lp[2] > s.spec.anchor[2]) setPartTarget(o, s.spec.part, 1)\n }\n }\n }\n\n function stepSoft(dt: number): void {\n const sub = Math.max(1, Math.ceil(dt / (1 / 120)))\n const h = dt / sub\n for (const o of objs.values()) {\n if (!o.soft.size) continue\n const wl = rotY([wind[0], 0, wind[1]], -o.public.transform.ry)\n for (const s of o.soft.values()) {\n const k = s.spec.stiffness ?? 30\n const c = s.spec.damping ?? 4\n const max = s.spec.maxAngle ?? 0.7\n const gain = s.spec.wind ?? (s.spec.kind === 'panel' ? 0 : 1)\n const gust = gain * (0.6 + 0.4 * Math.sin(time * 1.7 + s.phase)) * 0.1\n const fx = -wl[2] * gust\n const fz = wl[0] * gust\n for (let i = 0; i < sub; i++) {\n s.vax += (-k * s.ax - c * s.vax + fx) * h\n s.vaz += (-k * s.az - c * s.vaz + fz) * h\n s.ax += s.vax * h\n s.az += s.vaz * h\n }\n if (Math.abs(s.ax) > max) {\n s.ax = Math.sign(s.ax) * max\n s.vax = 0\n }\n if (Math.abs(s.az) > max) {\n s.az = Math.sign(s.az) * max\n s.vaz = 0\n }\n }\n }\n }\n\n // ------------------------------------------------------------------ damage\n function damage(objectId: string, target: string, amount: number, _kind?: string): { hp: number; destroyed: boolean } | null {\n const o = objs.get(objectId)\n if (o && options.destruction) {\n const pos = toWorld(o, [0, 0.5, 0])\n const type = _kind === 'gas' ? 'explosive' : _kind === 'fabric' ? 'slash' : 'blunt'\n const result = options.destruction.hitPart(objectId, target, { type, point: pos, energy: Math.max(0, amount), source: 'interactables' }) as { events?: Array<{ type?: string; part?: string }> } | null | undefined\n const destroyed = !!result?.events?.some((e) => e.type === 'fracture' && e.part === target)\n emit({ type: 'damage', object: objectId, target, hp: -1, destroyed })\n return { hp: -1, destroyed }\n }\n const st = o?.hp.get(target)\n if (!o || !st) return null\n if (st.hp <= 0) return { hp: 0, destroyed: true }\n const before = st.hp\n st.hp = Math.max(0, st.hp - Math.max(0, amount))\n const destroyed = st.hp <= 0\n emit({ type: 'damage', object: objectId, target, hp: st.hp, destroyed })\n const pos = toWorld(o, [0, 0.5, 0])\n const fuel = o.fuels.get(target)\n if (fuel && destroyed && fuel.spec.kind === 'gas' && fuel.level > 0) {\n emit({ type: 'explosion', object: objectId, pos, radius: 2 + fuel.level / 5 })\n fuel.level = 0\n }\n const tank = o.tanks.get(target)\n if (tank && before === st.max && st.hp < before) emit({ type: 'leak', object: objectId, target, pos })\n return { hp: st.hp, destroyed }\n }\n\n // ------------------------------------------------------------------ interactions\n function deriveInteractions(spec: ObjectSpec): InteractionSpec[] {\n const out: InteractionSpec[] = []\n const used = new Set<string>()\n const partPos = (id: string | undefined, fallback: Vec3): Vec3 => spec.parts?.find((p) => p.id === id)?.pivot ?? fallback\n const partLabel = (id: string | undefined): string => spec.parts?.find((p) => p.id === id)?.label ?? ''\n const claim = (id: string | undefined) => {\n if (id) used.add(id)\n }\n for (const d of spec.devices ?? []) {\n claim(d.part)\n const pos = d.part ? partPos(d.part, [0, 1, 0]) : (d.plug ?? [0, 1, 0])\n // a hard-wired lamp (circuit, no plug, no part to press) is driven by switches and `setDevice`: it never steals the interact key\n if (d.kind === 'lamp' && !d.part && !d.plug && d.electric !== false) continue\n out.push({ id: `device.${d.id}`, pos, action: { do: 'toggle_device', device: d.id }, label: partLabel(d.part) })\n if (d.kind === 'screen' && (d.channels ?? 1) > 1) out.push({ id: `channel.${d.id}`, pos, action: { do: 'cycle_device', device: d.id }, label: '' })\n }\n for (const s of spec.switches ?? []) {\n claim(s.part)\n out.push({ id: `switch.${s.id}`, pos: partPos(s.part, [0, 1.2, 0]), action: { do: 'toggle_switch', switch: s.id }, label: partLabel(s.part) })\n }\n const driven = new Set((spec.devices ?? []).map((d) => d.fixture))\n for (const f of spec.fixtures ?? []) {\n claim(f.part)\n if (driven.has(f.id)) continue\n out.push({ id: `fixture.${f.id}`, pos: f.part ? partPos(f.part, f.outlet) : f.outlet, action: { do: 'toggle_fixture', fixture: f.id }, label: partLabel(f.part) })\n }\n for (const b of spec.burners ?? []) {\n claim(b.part)\n const pos = b.part ? partPos(b.part, b.pos) : b.pos\n if (b.needsIgnition) out.push({ id: `ignite.${b.id}`, pos, action: { do: 'ignite', burner: b.id }, label: '' })\n out.push({ id: `burner.${b.id}`, pos, action: { do: 'toggle_burner', burner: b.id }, label: partLabel(b.part) })\n }\n for (const f of spec.fuels ?? []) {\n if (!f.valve) continue\n claim(f.valve)\n out.push({ id: `fuel.${f.id}`, pos: partPos(f.valve, [0, 0.5, 0]), action: { do: 'toggle_fuel', fuel: f.id }, label: partLabel(f.valve) })\n }\n for (const c of spec.containers ?? []) {\n if (!c.access) out.push({ id: `open.${c.id}`, pos: c.volume.center, action: { do: 'open_container', container: c.id }, label: '' })\n }\n for (const p of spec.parts ?? []) {\n if (used.has(p.id)) continue\n if (p.label) out.push({ id: `part.${p.id}`, pos: p.pivot, action: { do: 'toggle_part', part: p.id }, label: p.label })\n }\n for (const c of spec.containers ?? []) {\n if (c.access && !spec.parts?.find((p) => p.id === c.access)?.label) {\n out.push({ id: `open.${c.id}`, pos: partPos(c.access, c.volume.center), action: { do: 'open_container', container: c.id }, label: '' })\n }\n }\n for (const s of spec.seats ?? []) out.push({ id: `seat.${s.id}`, pos: s.pos, action: { do: 'sit', seat: s.id }, label: '' })\n return out\n }\n\n function typeName(o: ObjState): string {\n return table[`type.${o.spec.type}`] ?? humanize(o.spec.type)\n }\n\n function promptOf(o: ObjState, i: InteractionSpec): { label: string; verb: string; object: string } {\n const a = i.action\n let state: string | null = null\n let def = ''\n switch (a.do) {\n case 'toggle_part': {\n const p = o.parts.get(a.part)\n const open = !!p && targetIsOpen(p)\n state = open ? 'open' : 'closed'\n def = open ? 'prompt.close' : 'prompt.open'\n break\n }\n case 'open_container': {\n const c = containerOf(o, a.container)\n const p = c?.access ? o.parts.get(c.access) : undefined\n const open = p ? targetIsOpen(p) : false\n state = p ? (open ? 'open' : 'closed') : null\n def = open ? 'prompt.close' : 'prompt.open'\n break\n }\n case 'toggle_device': {\n const on = !!o.devices.get(a.device)?.on\n state = on ? 'on' : 'off'\n def = on ? 'prompt.turn_off' : 'prompt.turn_on'\n break\n }\n case 'toggle_switch': {\n const sw = o.spec.switches?.find((s) => s.id === a.switch)\n const on = !!sw && switchIsOn(o, sw)\n state = on ? 'on' : 'off'\n def = on ? 'prompt.turn_off' : 'prompt.turn_on'\n break\n }\n case 'toggle_breaker': {\n const on = breaker(a.circuit)\n state = on ? 'on' : 'off'\n def = on ? 'prompt.breaker_off' : 'prompt.breaker_on'\n break\n }\n case 'toggle_fixture': {\n const on = !!o.fixtures.get(a.fixture)?.on\n state = on ? 'on' : 'off'\n def = on ? 'prompt.turn_off' : 'prompt.turn_on'\n break\n }\n case 'toggle_burner': {\n const b = o.burners.get(a.burner)\n const on = !!b && (b.on || b.lit)\n state = on ? 'on' : 'off'\n def = on ? 'prompt.turn_off' : 'prompt.turn_on'\n break\n }\n case 'toggle_fuel': {\n const f = o.fuels.get(a.fuel)\n const open = !!f && valveOpen(o, f)\n state = open ? 'open' : 'closed'\n def = open ? 'prompt.close_valve' : 'prompt.open_valve'\n break\n }\n case 'take':\n def = 'prompt.take'\n break\n case 'read':\n def = 'prompt.read'\n break\n case 'ignite':\n def = 'prompt.light'\n break\n case 'cycle_device':\n def = 'prompt.change_channel'\n break\n case 'sit': {\n const seat = o.spec.seats?.find((s) => s.id === a.seat)\n const mine = seats.get(DEFAULT_ACTOR)\n def = mine && mine.object === o.id && mine.seat === a.seat ? 'prompt.get_up' : seat?.pose === 'lie' ? 'prompt.lie_down' : 'prompt.sit'\n break\n }\n }\n let key = def\n if (i.label) {\n if (state && table[`${i.label}.${state}`] !== undefined) key = `${i.label}.${state}`\n else if (table[i.label] !== undefined) key = i.label\n }\n const vars = { name: typeName(o), circuit: a.do === 'toggle_breaker' ? (a.name ?? a.circuit) : '' }\n const label = t(key, vars)\n // structured prompt: explicit `<key>.verb` / `<key>.object` entries win; otherwise the first word is the verb and the rest the object\n let verb: string\n let object: string\n if (table[`${key}.verb`] !== undefined) {\n verb = t(`${key}.verb`, vars)\n object = table[`${key}.object`] ? t(`${key}.object`, vars) : vars.name\n } else {\n const sp = label.indexOf(' ')\n verb = sp < 0 ? label : label.slice(0, sp)\n object = sp < 0 ? vars.name : label.slice(sp + 1)\n }\n return { label, verb, object }\n }\n\n /** Locale key of the reason an interaction cannot be used right now, or null when it can. */\n function unavailableReason(o: ObjState, i: InteractionSpec): string | null {\n const a = i.action\n if (!requirementMet(i)) return 'requires_open'\n switch (a.do) {\n case 'toggle_part': {\n const p = o.parts.get(a.part)\n return p && gated(o, p) ? 'requires_open' : null\n }\n case 'open_container': {\n const c = containerOf(o, a.container)\n const p = c?.access ? o.parts.get(c.access) : undefined\n return p && gated(o, p) ? 'requires_open' : null\n }\n case 'toggle_breaker': {\n const rocker = a.part ? o.parts.get(a.part) : undefined\n return rocker && gated(o, rocker) ? 'requires_open' : null\n }\n case 'take':\n case 'read':\n return accessible(o.id, a.container) ? null : 'requires_open'\n case 'ignite':\n return o.burners.get(a.burner)?.lit ? 'already_lit' : null\n case 'toggle_burner': {\n const b = o.burners.get(a.burner)\n return !b?.spec.needsIgnition || b.lit ? null : 'needs_ignition'\n }\n case 'cycle_device': {\n const d = o.devices.get(a.device)\n if (!d || !d.on) return 'turn_on_first'\n return devicePowered(o, d) ? null : 'no_power'\n }\n default:\n return null\n }\n }\n\n function requirementMet(i: InteractionSpec): boolean {\n if (!i.requires) return true\n const p = objs.get(i.requires.object)?.parts.get(i.requires.part)\n return !!p && targetIsOpen(p)\n }\n\n function interactablesOf(o: ObjState): Array<{ item: Interactable; spec: InteractionSpec; o: ObjState }> {\n return o.interactions.map((i) => {\n const id = gid(o, i.id)\n const p = promptOf(o, i)\n const item: Interactable = {\n id,\n object: o.id,\n kind: i.action.do,\n pos: toWorld(o, i.pos),\n radius: i.radius ?? DEFAULT_RADIUS,\n label: p.label,\n verb: p.verb,\n noun: p.object,\n available: true,\n act: (actor) => act(id, actor),\n }\n const reason = unavailableReason(o, i) ?? (options.canInteract?.(item, DEFAULT_ACTOR) === false ? 'locked' : null)\n if (reason) {\n item.available = false\n item.reason = reason\n }\n return { item, spec: i, o }\n })\n }\n\n function interactables(): Interactable[] {\n const out: Interactable[] = []\n for (const o of objs.values()) for (const e of interactablesOf(o)) out.push(e.item)\n return out\n }\n\n function target(eye: { x: number; y: number; z: number; yaw: number; pitch: number }, opts: TargetOptions = {}): Interactable | null {\n const reach = opts.reach ?? 1.8\n const cone = opts.cone ?? 0.45\n const dir: Vec3 = [-Math.sin(eye.yaw) * Math.cos(eye.pitch), Math.sin(eye.pitch), -Math.cos(eye.yaw) * Math.cos(eye.pitch)]\n let best: Interactable | null = null\n let bestScore = Infinity\n for (const o of objs.values()) {\n for (const e of interactablesOf(o)) {\n if (!e.item.available && !opts.includeUnavailable) continue\n if (opts.kinds && !opts.kinds.includes(e.item.kind)) continue\n if (opts.filter && !opts.filter(e.item)) continue\n const v: Vec3 = [e.item.pos[0] - eye.x, e.item.pos[1] - eye.y, e.item.pos[2] - eye.z]\n const d = Math.hypot(v[0], v[1], v[2])\n if (d > reach) continue\n const cos = d < 1e-6 ? 1 : clamp((v[0] * dir[0] + v[1] * dir[1] + v[2] * dir[2]) / d, -1, 1)\n const angle = Math.acos(cos)\n if (angle > cone) continue\n const score = (angle / cone) * 0.6 + (d / reach) * 0.4\n if (score < bestScore) {\n bestScore = score\n best = e.item\n }\n }\n }\n return best\n }\n\n function act(interactableId: string, actor: string = DEFAULT_ACTOR): boolean {\n let found: { item: Interactable; spec: InteractionSpec; o: ObjState } | null = null\n for (const o of objs.values()) {\n if (!interactableId.startsWith(o.id + ':')) continue\n const local = interactableId.slice(o.id.length + 1)\n if (!o.interactions.some((i) => i.id === local)) continue\n found = interactablesOf(o).find((e) => e.spec.id === local) ?? null\n if (found) break\n }\n if (!found) return false\n if (!requirementMet(found.spec)) return false\n if (options.canInteract?.(found.item, actor) === false) return false\n return execute(found.o, found.spec.action, actor)\n }\n\n function execute(o: ObjState, a: InteractionSpec['action'], actor: string): boolean {\n switch (a.do) {\n case 'toggle_part': {\n const p = o.parts.get(a.part)\n if (!p || gated(o, p)) return false\n setPartTarget(o, a.part, targetIsOpen(p) ? 0 : 1)\n return true\n }\n case 'open_container': {\n const c = containerOf(o, a.container)\n if (!c) return false\n if (c.access) return execute(o, { do: 'toggle_part', part: c.access }, actor)\n emit({ type: 'container', object: o.id, container: c.id, open: true })\n return true\n }\n case 'take': {\n if (!accessible(o.id, a.container)) return false\n const list = o.contents.get(a.container)\n if (!list) return false\n const slot = a.slot ?? list.findIndex((s) => s !== null)\n if (slot < 0 || !list[slot]) {\n message('empty')\n return false\n }\n return take(o.id, a.container, slot, actor) !== null\n }\n case 'read': {\n if (!accessible(o.id, a.container)) return false\n const stack = o.contents.get(a.container)?.[a.slot]\n if (!stack) {\n message('empty')\n return false\n }\n const key = typeof stack.data?.text === 'string' ? stack.data.text : null\n if (!key) return false\n message(key)\n return true\n }\n case 'toggle_device': {\n const d = o.devices.get(a.device)\n if (!d) return false\n setDeviceOn(o, d, !d.on)\n return true\n }\n case 'cycle_device': {\n const d = o.devices.get(a.device)\n if (!d || !d.on) return false\n if (!devicePowered(o, d)) {\n message('no_power')\n return false\n }\n d.channel = (d.channel + 1) % Math.max(1, d.spec.channels ?? 1)\n emit({ type: 'device', object: o.id, device: d.spec.id, on: true, powered: true, channel: d.channel })\n return true\n }\n case 'toggle_switch':\n return toggleSwitch(o, a.switch)\n case 'toggle_breaker': {\n const rocker = a.part ? o.parts.get(a.part) : undefined\n if (rocker && gated(o, rocker)) return false\n const on = !breaker(a.circuit)\n if (a.part) setPartTarget(o, a.part, on ? 1 : 0)\n world.power.setBreaker(a.circuit, on)\n return true\n }\n case 'toggle_fixture':\n return toggleFixture(o, a.fixture)\n case 'toggle_burner':\n return toggleBurner(o, a.burner)\n case 'ignite':\n return ignite(o, a.burner)\n case 'toggle_fuel':\n return toggleFuel(o, a.fuel)\n case 'sit': {\n const mine = seats.get(actor)\n if (mine && mine.object === o.id && mine.seat === a.seat) {\n stand(actor)\n return true\n }\n return sit(o.id, a.seat, actor) !== null\n }\n }\n }\n\n // ------------------------------------------------------------------ emitters, mirrors, colliders\n function emitters(): ActiveEmitter[] {\n const out: ActiveEmitter[] = []\n for (const o of objs.values()) {\n for (const e of o.spec.emitters ?? []) {\n let intensity = 0\n const b = o.burners.get(e.source)\n const fx = o.fixtures.get(e.source)\n const dev = o.devices.get(e.source)\n const fuel = o.fuels.get(e.source)\n if (b) {\n const ref = resolveFuel(o, b)\n const frac = ref ? clamp(ref.f.level / ref.f.spec.capacity, 0, 1) : 0\n if (b.lit) intensity = 0.35 + 0.65 * frac\n else if (e.kind === 'smoke' && b.smoke > 0) intensity = 0.6 * (b.smoke / SMOKE_TAIL)\n } else if (fx) {\n if (fx.on && fx.flowing) intensity = fx.frac\n } else if (dev) {\n if (dev.on && devicePowered(o, dev)) intensity = 1\n } else if (fuel) {\n const lit = [...o.burners.values()].some((bb) => bb.lit && resolveFuel(o, bb)?.f === fuel)\n if (lit) intensity = 0.35 + 0.65 * clamp(fuel.level / fuel.spec.capacity, 0, 1)\n }\n if (intensity <= 0) continue\n const dir = rotY(e.dir ?? [0, 1, 0], o.public.transform.ry)\n out.push({ id: gid(o, e.id), object: o.id, kind: e.kind, pos: toWorld(o, e.pos), dir, size: e.size ?? 0.3, ...(e.reach !== undefined ? { reach: e.reach } : {}), intensity: clamp(intensity, 0, 1) })\n }\n }\n return out\n }\n\n function mirrors(eye: Vec3, maxDistance = 10, count = 4) {\n const out: Array<{ id: string; center: Vec3; normal: Vec3; w: number; h: number; distance: number }> = []\n for (const o of objs.values()) {\n for (const m of o.spec.mirrors ?? []) {\n const center = toWorld(o, applyPart(o, m.part, m.center))\n const f = partFrame(o, m.part)\n const ln = f && f.angle !== 0 ? rotateAxis(m.normal, f.axis, f.angle) : m.normal\n const normal = rotY(ln, o.public.transform.ry)\n const len = Math.hypot(normal[0], normal[1], normal[2]) || 1\n const n: Vec3 = [normal[0] / len, normal[1] / len, normal[2] / len]\n const to: Vec3 = [eye[0] - center[0], eye[1] - center[1], eye[2] - center[2]]\n if (n[0] * to[0] + n[1] * to[1] + n[2] * to[2] <= 0) continue\n const distance = Math.hypot(to[0], to[1], to[2])\n if (distance > maxDistance) continue\n out.push({ id: gid(o, m.id), center, normal: n, w: m.w, h: m.h, distance })\n }\n }\n return out.sort((a, b) => a.distance - b.distance).slice(0, count)\n }\n\n function colliders(opts: ColliderOptions = {}): WorldCollider[] {\n const out: WorldCollider[] = []\n const fixed: WorldCollider[] = []\n for (const o of objs.values()) {\n const tr = o.public.transform\n for (const c of o.spec.colliders ?? []) {\n if (c.part && c.offWhenOpen && (o.parts.get(c.part)?.t ?? 0) > 0.5) continue\n let extra = 0\n if (c.part) {\n const f = partFrame(o, c.part)\n if (f && f.angle !== 0 && Math.abs(f.axis[1]) >= 0.5) extra = f.angle * Math.sign(f.axis[1])\n }\n const center = toWorld(o, applyPart(o, c.part, c.center))\n ;(c.part ? out : fixed).push({\n id: gid(o, c.id),\n object: o.id,\n cx: center[0],\n cz: center[2],\n hw: c.half[0],\n hd: c.half[2],\n ry: tr.ry + (c.ry ?? 0) + extra,\n y0: center[1] - c.half[1],\n y1: center[1] + c.half[1],\n })\n }\n }\n if (opts.merge) return [...mergeColliders(fixed, { gap: opts.gap, slack: opts.slack }), ...out]\n return [...fixed, ...out]\n }\n\n // ------------------------------------------------------------------ update\n function update(dt: number): void {\n if (!(dt > 0)) return\n time += dt\n for (const o of objs.values()) {\n for (const p of o.parts.values()) {\n if (p.t === p.target) continue\n if (gated(o, p) && p.target > p.t) continue // a gated part may still close\n const step = (p.spec.motion.speed ?? 2.5) * dt\n const next = p.t < p.target ? Math.min(p.target, p.t + step) : Math.max(p.target, p.t - step)\n writeT(o, p, next)\n if (next === p.target) emit({ type: 'part', object: o.id, part: p.spec.id, t: next, target: p.target })\n }\n }\n stepSoft(dt)\n for (const o of objs.values()) {\n for (const b of o.burners.values()) {\n if (b.lit) {\n const ref = resolveFuel(o, b)\n if (!ref || !valveOpen(ref.o, ref.f)) {\n extinguish(o, b, !!b.spec.needsIgnition)\n } else {\n ref.f.level = Math.max(0, ref.f.level - b.spec.rate * dt)\n if (ref.f.level <= 0) extinguish(o, b, !!b.spec.needsIgnition)\n }\n } else if (b.on && !b.spec.needsIgnition && canBurn(b, resolveFuel(o, b))) {\n // a gas knob left open without gas lights as soon as the bottle valve opens\n b.lit = true\n b.smoke = 0\n emitBurner(o, b)\n } else if (b.smoke > 0) {\n b.smoke = Math.max(0, b.smoke - dt)\n }\n }\n if (rain > 0) {\n for (const tk of o.tanks.values()) {\n if (tk.spec.rainArea) tk.level = Math.min(tk.spec.capacity, tk.level + ((rain * tk.spec.rainArea) / 3600) * dt)\n }\n }\n for (const tk of o.tanks.values()) {\n const st = o.hp.get(tk.spec.id)\n if (st && st.hp < st.max && tk.level > 0) {\n const rate = 0.5 + 2.5 * (1 - st.hp / st.max)\n tk.level = Math.max(0, tk.level - rate * dt)\n }\n }\n }\n for (const o of objs.values()) {\n for (const d of o.devices.values()) {\n const fx = d.spec.fixture ? o.fixtures.get(d.spec.fixture) : undefined\n if (!fx) continue\n const run = d.on && devicePowered(o, d)\n if (fx.on === run) continue\n fx.on = run\n if (!run) {\n fx.flowing = false\n fx.frac = 0\n emitFixture(o, fx)\n }\n }\n for (const fx of o.fixtures.values()) stepFixture(o, fx, dt)\n }\n }\n\n // ------------------------------------------------------------------ add / remove\n function add(id: string, spec: ObjectSpec, transform: Transform): WorldObject {\n if (objs.has(id)) throw new Error(`Object \"${id}\" already exists`)\n const pub: WorldObject = { id, spec, transform: { ...transform }, parts: {} }\n const o: ObjState = {\n id,\n public: pub,\n spec,\n parts: new Map(),\n contents: new Map(),\n devices: new Map(),\n fuels: new Map(),\n burners: new Map(),\n tanks: new Map(),\n fixtures: new Map(),\n soft: new Map(),\n hp: new Map(),\n interactions: spec.interactions ?? deriveInteractions(spec),\n }\n for (const p of spec.parts ?? []) {\n const t0 = clamp(p.t0 ?? 0, 0, 1)\n o.parts.set(p.id, { spec: p, t: t0, target: t0, maxT: 1 })\n pub.parts[p.id] = t0\n }\n for (const c of spec.containers ?? []) {\n let list: Array<ItemStack | null>\n if (c.contents) list = c.slots.map((_, i) => cloneStack(c.contents?.[i] ?? null))\n else if (c.loot) list = generateLoot(options.loot, c.loot, c.slots, `${seed}|${id}|${c.id}`, options.items)\n else list = c.slots.map(() => null)\n o.contents.set(c.id, list)\n }\n for (const d of spec.devices ?? []) {\n o.devices.set(d.id, { spec: d, on: !!d.on, channel: 0 })\n if (d.on && d.part) {\n const p = o.parts.get(d.part)\n if (p) {\n p.target = p.maxT\n writeT(o, p, p.maxT)\n }\n }\n }\n for (const f of spec.fuels ?? []) o.fuels.set(f.id, { spec: f, level: clamp(f.level ?? f.capacity, 0, f.capacity) })\n for (const b of spec.burners ?? []) o.burners.set(b.id, { spec: b, on: false, lit: false, smoke: 0 })\n for (const tk of spec.tanks ?? []) o.tanks.set(tk.id, { spec: tk, level: clamp(tk.level ?? tk.capacity, 0, tk.capacity) })\n for (const f of spec.fixtures ?? []) o.fixtures.set(f.id, { spec: f, on: false, flowing: false, frac: 0, timer: 0 })\n let n = 0\n for (const s of spec.soft ?? []) {\n o.soft.set(s.id, { spec: s, ax: 0, az: 0, vax: 0, vaz: 0, phase: (n++ * 2.399963) % (Math.PI * 2) })\n }\n for (const d of spec.damage ?? []) o.hp.set(d.target, { max: d.hp, hp: d.hp })\n objs.set(id, o)\n if (!defaultTankExplicit && defaultTank === null && o.tanks.size) defaultTank = gid(o, [...o.tanks.keys()][0])\n rebuildPlugs()\n return pub\n }\n\n function remove(id: string): void {\n const o = objs.get(id)\n if (!o) return\n for (const [actor, s] of [...seats]) if (s.object === id) seats.delete(actor)\n objs.delete(id)\n if (defaultTank && defaultTank.startsWith(id + ':')) defaultTank = null\n rebuildPlugs()\n }\n\n // ------------------------------------------------------------------ save / load\n function serialize(): WorldState {\n const objects: WorldState['objects'] = {}\n for (const o of objs.values()) {\n objects[o.id] = {\n parts: Object.fromEntries([...o.parts].map(([k, p]) => [k, p.t])),\n contents: Object.fromEntries([...o.contents].map(([k, v]) => [k, v.map(cloneStack)])),\n devices: Object.fromEntries([...o.devices].map(([k, d]) => [k, { on: d.on, channel: d.channel }])),\n fuels: Object.fromEntries([...o.fuels].map(([k, f]) => [k, { level: f.level, open: valveOpen(o, f) }])),\n burners: Object.fromEntries([...o.burners].map(([k, b]) => [k, { on: b.on, lit: b.lit }])),\n tanks: Object.fromEntries([...o.tanks].map(([k, tk]) => [k, tk.level])),\n fixtures: Object.fromEntries([...o.fixtures].map(([k, f]) => [k, f.on])),\n hp: Object.fromEntries([...o.hp].map(([k, h]) => [k, h.hp])),\n }\n }\n return {\n version: 1,\n objects,\n grid,\n breakers: Object.fromEntries(breakers),\n seats: Object.fromEntries([...seats].map(([a, s]) => [a, { object: s.object, seat: s.seat }])),\n defaultTank,\n }\n }\n\n function load(state: WorldState): void {\n for (const [id, st] of Object.entries(state.objects)) {\n const o = objs.get(id)\n if (!o) continue\n for (const [k, v] of Object.entries(st.parts)) {\n const p = o.parts.get(k)\n if (p) {\n // keep the limit found by fitSweep: a loaded save must not let a door open through a wall again\n p.target = clamp(v, 0, p.maxT)\n writeT(o, p, p.target)\n }\n }\n for (const [k, v] of Object.entries(st.contents)) {\n const c = containerOf(o, k)\n if (c) o.contents.set(k, c.slots.map((_, i) => cloneStack(v[i] ?? null)))\n }\n for (const [k, v] of Object.entries(st.devices)) {\n const d = o.devices.get(k)\n if (d) {\n d.on = v.on\n d.channel = v.channel\n }\n }\n for (const [k, v] of Object.entries(st.fuels)) {\n const f = o.fuels.get(k)\n if (f) f.level = v.level\n }\n for (const [k, v] of Object.entries(st.burners)) {\n const b = o.burners.get(k)\n if (b) {\n b.on = v.on\n b.lit = v.lit\n b.smoke = 0\n }\n }\n for (const [k, v] of Object.entries(st.tanks)) {\n const tk = o.tanks.get(k)\n if (tk) tk.level = v\n }\n for (const [k, v] of Object.entries(st.fixtures)) {\n const f = o.fixtures.get(k)\n if (f) {\n f.on = v\n f.flowing = false\n f.frac = 0\n f.timer = v && f.spec.kind === 'flush' ? FLUSH_SECONDS : 0\n }\n }\n for (const [k, v] of Object.entries(st.hp)) {\n const h = o.hp.get(k)\n if (h) h.hp = v\n }\n }\n grid = state.grid\n breakers.clear()\n for (const [k, v] of Object.entries(state.breakers)) breakers.set(k, v)\n seats.clear()\n for (const [a, s] of Object.entries(state.seats)) if (objs.has(s.object)) seats.set(a, { object: s.object, seat: s.seat })\n defaultTank = state.defaultTank\n defaultTankExplicit = true\n }\n\n // ------------------------------------------------------------------ public surface\n const world: World = {\n add,\n remove,\n get: (id) => objs.get(id)?.public,\n objects: () => [...objs.values()].map((o) => o.public),\n update,\n interactables,\n target,\n act,\n partT: (objectId, partId) => objs.get(objectId)?.parts.get(partId)?.t ?? 0,\n setDevice,\n setFixture,\n setBurner,\n setPart: (objectId, partId, targetT, instant) => {\n const o = objs.get(objectId)\n if (o) setPartTarget(o, partId, targetT, instant)\n },\n fitSweep,\n contents,\n accessible,\n take,\n put,\n slotPosition,\n power: {\n get grid() {\n return grid\n },\n set grid(on: boolean) {\n world.power.setGrid(on)\n },\n setGrid(on) {\n if (on === grid) return\n const before = powerSnapshot()\n grid = on\n emit({ type: 'power', grid })\n emitPowerChanges(before)\n },\n setBreaker(circuit, on) {\n if (breaker(circuit) === on) {\n breakers.set(circuit, on)\n return\n }\n const before = powerSnapshot()\n breakers.set(circuit, on)\n emitPowerChanges(before)\n },\n breaker,\n isPowered: (objectId, deviceId) => {\n const r = getDevice(objectId, deviceId)\n return r ? devicePowered(r.o, r.d) : false\n },\n isOn: (objectId, deviceId) => getDevice(objectId, deviceId)?.d.on ?? false,\n pluggedInto: (objectId, deviceId) => plugs.get(`${objectId}:${deviceId}`) ?? null,\n channel: (objectId, deviceId) => getDevice(objectId, deviceId)?.d.channel ?? 0,\n },\n fuelLevel: (objectId, fuelId) => objs.get(objectId)?.fuels.get(fuelId)?.level ?? 0,\n isLit: (objectId, burnerId) => objs.get(objectId)?.burners.get(burnerId)?.lit ?? false,\n water: {\n setDefaultTank(tankId) {\n defaultTank = tankId\n defaultTankExplicit = true\n },\n level(tankId) {\n return findGlobal(tankId, (oo, local) => oo.tanks.get(local))?.value.level ?? 0\n },\n refill(tankId, liters) {\n const f = findGlobal(tankId, (oo, local) => oo.tanks.get(local))\n if (!f) return 0\n const added = Math.max(0, Math.min(liters, f.value.spec.capacity - f.value.level))\n f.value.level += added\n return added\n },\n setRain(mm) {\n rain = Math.max(0, mm)\n },\n isFlowing: (objectId, fixtureId) => {\n const fx = objs.get(objectId)?.fixtures.get(fixtureId)\n return !!fx && fx.on && fx.flowing\n },\n },\n sit,\n stand,\n seatOf: (actor = DEFAULT_ACTOR) => {\n const s = seats.get(actor)\n return s ? { object: s.object, seat: s.seat } : null\n },\n push,\n sway: (objectId, softId) => {\n const s = objs.get(objectId)?.soft.get(softId)\n return s ? { ax: s.ax, az: s.az } : { ax: 0, az: 0 }\n },\n setWind: (x, z) => {\n wind = [x, z]\n },\n emitters,\n mirrors,\n colliders,\n damage,\n hp: (objectId, target) => (options.destruction ? null : (objs.get(objectId)?.hp.get(target)?.hp ?? null)),\n t,\n setLocale: (l) => {\n locale = l\n table = resolveStrings(locale, options.strings)\n },\n serialize,\n load,\n }\n return world\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACaA,MAAM,SAAS,CAAC,OAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;AAC7E,MAAM,UAAU,CAAC,IAAY,IAAY,IAAY,OAAuB,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;AAE3H,WAAS,SAAS,GAAQ,GAAQ,KAAa,OAA2B;AACxE,QAAI,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,GAAI,QAAO;AACnD,QAAI,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,GAAI,QAAO;AACnD,QAAI,EAAE,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,GAAI,QAAO;AACnD,UAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE;AAC9B,UAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE;AAC9B,UAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE;AAC9B,UAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE;AAC9B,UAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE;AAC9B,UAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE;AAC9B,UAAM,QAAQ,KAAK,OAAO,KAAK,OAAO,KAAK;AAC3C,UAAM,SAAS,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;AACjH,UAAM,OAAO,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI;AACrC,QAAI,OAAO,QAAQ,IAAI,SAAS,KAAM,QAAO;AAC7C,WAAO,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,GAAG,EAAE,GAAG,GAAG,QAAQ,EAAE,QAAQ,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA,EAC/E;AAOO,WAAS,eAAe,MAAuB,UAAkD,CAAC,GAAoB;AAC3H,UAAM,MAAM,QAAQ,OAAO;AAC3B,UAAM,QAAQ,QAAQ,SAAS;AAC/B,UAAM,SAAS,oBAAI,IAA6B;AAChD,eAAW,KAAK,MAAM;AACpB,YAAM,MAAM,GAAG,EAAE,MAAM,IAAI,KAAK,MAAM,EAAE,KAAK,GAAI,CAAC;AAClD,YAAM,IAAI,OAAO,IAAI,GAAG;AACxB,UAAI,EAAG,GAAE,KAAK,CAAC;AAAA,UACV,QAAO,IAAI,KAAK,CAAC,CAAC,CAAC;AAAA,IAC1B;AACA,UAAM,MAAuB,CAAC;AAC9B,eAAW,KAAK,OAAO,OAAO,GAAG;AAC/B,YAAM,KAAK,EAAE,CAAC,GAAG,MAAM;AACvB,YAAM,KAAK,KAAK,IAAI,EAAE;AACtB,YAAM,KAAK,KAAK,IAAI,EAAE;AACtB,UAAI,QAAe,EAAE,IAAI,CAAC,MAAM;AAC9B,cAAM,IAAI,EAAE,KAAK,KAAK,EAAE,KAAK;AAC7B,cAAM,IAAI,EAAE,KAAK,KAAK,EAAE,KAAK;AAC7B,eAAO,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,QAAQ,EAAE,QAAQ,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG;AAAA,MACrH,CAAC;AACD,UAAI,UAAU,MAAM,SAAS;AAC7B,aAAO,SAAS;AACd,kBAAU;AACV,cAAO,UAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAC5C,mBAAS,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACzC,kBAAM,IAAI,SAAS,MAAM,CAAC,GAAU,MAAM,CAAC,GAAU,KAAK,KAAK;AAC/D,gBAAI,CAAC,EAAG;AACR,oBAAQ,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,MAAM,CAAC;AACjD,kBAAM,KAAK,CAAC;AACZ,sBAAU;AACV,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,iBAAW,KAAK,OAAO;AACrB,cAAM,KAAK,EAAE,KAAK,EAAE,MAAM;AAC1B,cAAM,KAAK,EAAE,KAAK,EAAE,MAAM;AAC1B,YAAI,KAAK;AAAA,UACP,IAAI,EAAE,IAAI,WAAW,IAAK,EAAE,IAAI,CAAC,IAAe,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;AAAA,UAC/E,QAAQ,EAAE;AAAA,UACV,IAAI,IAAI,KAAK,IAAI;AAAA,UACjB,IAAI,CAAC,IAAI,KAAK,IAAI;AAAA,UAClB,KAAK,EAAE,KAAK,EAAE,MAAM;AAAA,UACpB,KAAK,EAAE,KAAK,EAAE,MAAM;AAAA,UACpB;AAAA,UACA,IAAI,EAAE;AAAA,UACN,IAAI,EAAE;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO;AAAA,EACT;;;ACxFO,WAAS,WAAW,MAAsB;AAC/C,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,WAAK,KAAK,WAAW,CAAC;AACtB,UAAI,KAAK,KAAK,GAAG,QAAQ;AAAA,IAC3B;AACA,WAAO,MAAM;AAAA,EACf;AAGO,WAAS,IAAI,OAAwB,GAAiB;AAC3D,QAAI,KAAK,OAAO,SAAS,WAAW,KAAK,MAAM,IAAI,MAAM,IAAI,WAAW,IAAI,MAAM;AAClF,WAAO,MAAM;AACX,UAAK,IAAI,eAAgB;AACzB,UAAI,IAAI;AACR,UAAI,KAAK,KAAK,IAAK,MAAM,IAAK,IAAI,CAAC;AACnC,WAAK,IAAI,KAAK,KAAK,IAAK,MAAM,GAAI,IAAI,EAAE;AACxC,eAAS,IAAK,MAAM,QAAS,KAAK;AAAA,IACpC;AAAA,EACF;;;AChBO,WAAS,SAAS,MAAY,KAAoB;AACvD,UAAM,MAAM;AACZ,QAAI,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,IAAK,QAAO;AACnC,WAAQ,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,OAAS,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI;AAAA,EACjH;AAGO,WAAS,SAAS,MAAc,MAAgB,OAA8B;AACnF,UAAM,MAAM,QAAQ,IAAI;AACxB,WAAO,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG,IAAI;AAAA,EAC9C;AAMO,WAAS,aACd,QACA,SACA,OACA,MACA,OACyB;AACzB,UAAM,QAAQ,SAAS,OAAO;AAC9B,UAAM,MAA+B,MAAM,IAAI,MAAM,IAAI;AACzD,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,OAAO,IAAI,IAAI;AACrB,UAAM,QAAQ,CAAC,MAAM,MAAM;AAEzB,YAAM,OAAO,KAAK;AAClB,YAAM,OAAO,KAAK;AAClB,YAAM,IAAI,KAAK;AACf,UAAI,QAAQ,MAAM,KAAM;AACxB,YAAM,aAAa,MAAM,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS,EAAE,MAAM,MAAM,KAAK,CAAC;AAC5F,YAAM,QAAQ,WAAW,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC;AACzD,UAAI,SAAS,EAAG;AAChB,UAAI,IAAI,OAAO;AACf,UAAI,SAAS,WAAW,WAAW,SAAS,CAAC;AAC7C,iBAAW,KAAK,YAAY;AAC1B,aAAK,EAAE;AACP,YAAI,IAAI,GAAG;AACT,mBAAS;AACT;AAAA,QACF;AAAA,MACF;AACA,YAAM,CAAC,IAAI,EAAE,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC;AACpC,YAAM,MAAM,QAAQ,OAAO,IAAI;AAC/B,YAAM,WAAW,MAAO,IAAI,SAAS,IAAK,OAAO;AACjD,YAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;AAC9E,UAAI,CAAC,IAAI,EAAE,MAAM,OAAO,MAAM,IAAI;AAAA,IACpC,CAAC;AACD,WAAO;AAAA,EACT;;;ACrDO,MAAM,UAAgD;AAAA,IAC3D,IAAI;AAAA,MACF,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,eAAe;AAAA,MACf,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA,SAAS;AAAA,MACP,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,eAAe;AAAA,MACf,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF;AAGO,WAAS,WAAW,QAAiD;AAC1E,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,IAAI,OAAO,YAAY;AAC7B,QAAI,MAAM,WAAW,MAAM,KAAM,QAAO;AACxC,WAAO;AAAA,EACT;AAMO,WAAS,eAAe,QAAiB,OAAgE;AAC9G,UAAM,MAAM,WAAW,MAAM;AAC7B,WAAO,EAAE,GAAG,QAAQ,IAAI,GAAG,QAAQ,GAAG,GAAG,GAAI,OAAO,MAAM,CAAC,GAAI,GAAI,QAAQ,OAAO,CAAC,IAAK,QAAQ,GAAG,KAAK,CAAC,EAAI;AAAA,EAC/G;AAGO,WAAS,OAAO,MAAc,MAAgD;AACnF,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,KAAK,QAAQ,cAAc,CAAC,GAAG,MAAe,KAAK,OAAO,OAAO,KAAK,CAAC,CAAC,IAAI,CAAE;AAAA,EACvF;;;ACvEA,MAAM,eAAqB,CAAC,GAAG,GAAG,CAAC;AAM5B,WAAS,OAAO,QAAgB,GAAiB;AACtD,UAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC;AACrC,UAAM,OAAO,OAAO,QAAQ;AAC5B,UAAM,OAAa,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,EAAE;AACtH,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,aAAK,SAAS,SAAS,OAAO,SAAS,KAAK,KAAK,KAAK;AACtD;AAAA,MACF,KAAK,SAAS;AACZ,cAAM,KAAK,OAAO,YAAY,OAAO;AACrC,aAAK,WAAW,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;AACtD;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,IAAI,MAAM,OAAO,SAAS,OAAO,KAAK;AAC5C,aAAK,QAAQ,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;AACjF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGO,WAAS,KAAK,GAAS,IAAkB;AAC9C,UAAM,IAAI,KAAK,IAAI,EAAE;AACrB,UAAM,IAAI,KAAK,IAAI,EAAE;AACrB,WAAO,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AAAA,EACzD;AAGO,WAAS,aAAa,WAAsB,GAAe;AAChE,UAAM,IAAI,KAAK,GAAG,UAAU,EAAE;AAC9B,WAAO,CAAC,UAAU,IAAI,EAAE,CAAC,GAAG,UAAU,IAAI,EAAE,CAAC,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;AAAA,EACpE;AAGO,WAAS,aAAa,WAAsB,GAAe;AAChE,WAAO,KAAK,CAAC,EAAE,CAAC,IAAI,UAAU,GAAG,EAAE,CAAC,IAAI,UAAU,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE;AAAA,EACzF;AAGO,WAAS,WAAW,GAAS,MAAY,OAAqB;AACnE,UAAM,MAAM,KAAK,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK;AACrD,UAAM,IAAU,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG;AAC5D,UAAM,IAAI,KAAK,IAAI,KAAK;AACxB,UAAM,IAAI,KAAK,IAAI,KAAK;AACxB,UAAM,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAClD,UAAM,QAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACpG,WAAO,CAAC,EAAE,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,OAAO,IAAI,EAAE;AAAA,EACxJ;AAEO,WAAS,MAAM,GAAW,IAAY,IAAoB;AAC/D,WAAO,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,EACrC;AAEO,WAAS,MAAM,GAAS,GAAiB;AAC9C,WAAO,KAAK,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAAA,EACzD;;;ACzCA,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AACvB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,gBAAgB;AACtB,MAAM,eAAe;AACrB,MAAM,YAAY;AAClB,MAAM,cAAc;AACpB,MAAM,gBAAwC,EAAE,KAAK,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,GAAG,MAAM,IAAI,QAAQ,EAAE;AA6ElH,WAAS,WAAW,GAAuC;AACzD,WAAO,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,EAAE,KAAK,GAAI,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,KAAK,UAAU,EAAE,IAAI,CAAC,EAA6B,IAAI,CAAC,EAAG,IAAI;AAAA,EACxI;AAEA,WAAS,SAAS,IAAoB;AACpC,UAAM,IAAI,GAAG,QAAQ,UAAU,GAAG,EAAE,KAAK;AACzC,WAAO,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC;AAAA,EAC9C;AAMO,WAAS,YAAY,UAAwB,CAAC,GAAU;AAC7D,UAAM,OAAO,QAAQ,QAAQ;AAC7B,UAAM,OAAO,oBAAI,IAAsB;AACvC,UAAM,WAAW,oBAAI,IAAqB;AAC1C,UAAM,QAAQ,oBAAI,IAA8C;AAChE,UAAM,QAAQ,oBAAI,IAA2B;AAC7C,QAAI,SAAS,QAAQ,UAAU;AAC/B,QAAI,QAAQ,eAAe,QAAQ,QAAQ,OAAO;AAClD,QAAI,OAAO,QAAQ,QAAQ;AAC3B,QAAI,OAAO,QAAQ,QAAQ;AAC3B,QAAI,OAAyB,QAAQ,OAAO,CAAC,QAAQ,KAAK,CAAC,GAAG,QAAQ,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACtF,QAAI,cAA6B;AACjC,QAAI,sBAAsB;AAC1B,QAAI,OAAO;AAGX,aAAS,EAAE,KAAa,MAAgD;AACtE,aAAO,OAAO,MAAM,GAAG,KAAK,KAAK,IAAI;AAAA,IACvC;AAEA,aAAS,KAAK,GAAqB;AACjC,cAAQ,UAAU,CAAC;AAAA,IACrB;AAEA,aAAS,QAAQ,KAAmB;AAClC,WAAK,EAAE,MAAM,WAAW,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC;AAAA,IAC7C;AAGA,aAAS,IAAI,GAAa,OAAuB;AAC/C,aAAO,GAAG,EAAE,EAAE,IAAI,KAAK;AAAA,IACzB;AAGA,aAAS,WAAc,IAAY,MAAsG;AACvI,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,YAAI,CAAC,GAAG,WAAW,EAAE,KAAK,GAAG,EAAG;AAChC,cAAM,QAAQ,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AACtC,cAAM,QAAQ,KAAK,GAAG,KAAK;AAC3B,YAAI,UAAU,OAAW,QAAO,EAAE,GAAG,OAAO,MAAM;AAAA,MACpD;AACA,aAAO;AAAA,IACT;AAEA,aAAS,cAAc,IAAsB;AAC3C,YAAM,IAAI,KAAK,IAAI,EAAE;AACrB,UAAI,CAAC,EAAG,OAAM,IAAI,MAAM,mBAAmB,EAAE,GAAG;AAChD,aAAO;AAAA,IACT;AAEA,aAAS,SAAS,GAAmB;AACnC,YAAM,KAAK,EAAE,OAAO;AACpB,aAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,IAC1B;AAEA,aAAS,QAAQ,GAAa,GAAe;AAC3C,aAAO,aAAa,EAAE,OAAO,WAAW,CAAC;AAAA,IAC3C;AAGA,aAAS,cAAc,GAAsB;AAC3C,aAAO,KAAK,IAAI,KAAK,EAAE,OAAO,GAAG;AAAA,IACnC;AAEA,aAAS,OAAO,GAAa,QAAqC;AAChE,UAAI,CAAC,OAAQ,QAAO;AACpB,YAAM,IAAI,EAAE,MAAM,IAAI,MAAM;AAC5B,UAAI,CAAC,EAAG,QAAO;AACf,aAAO,EAAE,QAAQ,OAAO,EAAE,KAAK,cAAc,CAAC;AAAA,IAChD;AAEA,aAAS,aAAa,GAAuB;AAC3C,aAAO,EAAE,QAAQ,OAAO,EAAE,UAAU,cAAc,CAAC;AAAA,IACrD;AAEA,aAAS,OAAO,GAAa,GAAc,GAAiB;AAC1D,QAAE,IAAI;AACN,QAAE,OAAO,MAAM,EAAE,KAAK,EAAE,IAAI;AAAA,IAC9B;AAEA,aAAS,MAAM,GAAa,GAAuB;AACjD,aAAO,CAAC,CAAC,EAAE,KAAK,YAAY,EAAE,MAAM,IAAI,EAAE,KAAK,QAAQ,KAAK,CAAC,OAAO,GAAG,EAAE,KAAK,QAAQ;AAAA,IACxF;AAEA,aAAS,WAAW,GAAa,GAAcA,SAAgB,SAAwB;AACrF,YAAM,OAAO,MAAMA,SAAQ,GAAG,EAAE,IAAI;AACpC,YAAM,UAAU,SAAS,EAAE;AAC3B,QAAE,SAAS;AACX,UAAI,QAAS,QAAO,GAAG,GAAG,IAAI;AAC9B,UAAI,WAAW,QAAS,MAAK,EAAE,MAAM,QAAQ,QAAQ,EAAE,IAAI,MAAM,EAAE,KAAK,IAAI,GAAG,EAAE,GAAG,QAAQ,EAAE,OAAO,CAAC;AAAA,IACxG;AAEA,aAAS,cAAc,GAAa,QAAgBA,SAAgB,UAAU,OAAa;AACzF,YAAM,IAAI,EAAE,MAAM,IAAI,MAAM;AAC5B,UAAI,CAAC,EAAG;AACR,YAAM,QAAQ,EAAE,KAAK;AACrB,YAAM,UAAU,QAAQ,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,UAAU,KAAK,IAAI,CAAC,CAAC;AACxF,iBAAW,KAAK,SAAS;AACvB,eAAO,GAAG,GAAGA,SAAQ,OAAO;AAAA,MAC9B;AAAA,IACF;AAEA,aAAS,OAAO,GAAa,GAAcA,SAAgB,SAAwB;AACjF,iBAAW,GAAG,GAAGA,SAAQ,OAAO;AAEhC,UAAI,CAAC,aAAa,CAAC,GAAG;AACpB,mBAAW,KAAK,EAAE,MAAM,OAAO,GAAG;AAChC,cAAI,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,SAAS,EAAG,eAAc,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO;AAAA,QAC3F;AAAA,MACF;AAAA,IACF;AAGA,aAAS,UAAU,GAAa,QAA6F;AAC3H,UAAI,CAAC,OAAQ,QAAO;AACpB,YAAM,IAAI,EAAE,MAAM,IAAI,MAAM;AAC5B,UAAI,CAAC,EAAG,QAAO;AACf,YAAM,IAAI,EAAE,KAAK;AACjB,YAAM,OAAO,KAAK,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,MAAM,CAAC;AACrD,YAAM,QAAQ,EAAE,OAAO,EAAE,KAAK,OAAO,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAU;AAC/E,UAAI,EAAE,SAAS,SAAS;AACtB,cAAM,KAAK,EAAE,YAAY,OAAO,EAAE;AAClC,cAAM,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;AAAA,MACvD,WAAW,EAAE,SAAS,SAAS;AAC7B,cAAM,SAAS,EAAE,SAAS,KAAK,KAAK,KAAK,EAAE;AAAA,MAC7C;AACA,aAAO;AAAA,IACT;AAEA,aAAS,UAAU,GAAa,QAA4B,OAAmB;AAC7E,YAAM,IAAI,UAAU,GAAG,MAAM;AAC7B,UAAI,CAAC,EAAG,QAAO;AACf,YAAM,MAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACtF,YAAM,IAAI,EAAE,UAAU,IAAI,WAAW,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI;AAC7D,aAAO,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAAA,IAC3G;AAGA,aAAS,UAAU,GAAa,GAAc,GAAoC,WAAsD;AACtI,YAAM,OAAO;AACb,YAAM,SAAS;AACf,YAAM,IAAI,EAAE,KAAK;AACjB,YAAM,OAAO,KAAK,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,MAAM,CAAC;AACrD,YAAM,KAAW,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAClF,YAAM,KAAW,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAClF,YAAM,aAAa,CAAC,MAAwB;AAC1C,cAAM,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC;AACvD,eAAO,MAAM,KAAK,EAAE,QAAQ,IAAI,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,KAAM,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,IAAK,CAAC;AAAA,MAClF;AACA,YAAM,KAAK,WAAW,CAAC;AACvB,YAAM,KAAK,WAAW,CAAC;AACvB,YAAM,KAAK,WAAW,CAAC;AAGvB,YAAM,OAAO,EAAE,SAAS,WAAW,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI;AACvD,YAAM,OAAO,oBAAI,IAAY;AAC7B,YAAM,MAAc,CAAC;AACrB,YAAMC,OAAM,CAAC,GAAW,GAAW,MAAoB;AACrD,cAAM,MAAM,GAAG,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC3D,YAAI,KAAK,IAAI,GAAG,EAAG;AACnB,aAAK,IAAI,GAAG;AACZ,YAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,MACpB;AACA,UAAI,MAAM;AACR,mBAAW,KAAK,GAAI,YAAW,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAG,CAAAA,KAAI,GAAG,GAAG,CAAC,GAAG,CAAC;AACnE,mBAAW,KAAK,GAAI,YAAW,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAG,CAAAA,KAAI,GAAG,GAAG,CAAC,GAAG,CAAC;AAAA,MACrE,OAAO;AACL,mBAAW,KAAK,GAAI,YAAW,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAG,YAAW,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAG,CAAAA,KAAI,GAAG,GAAG,CAAC;AAC/F,mBAAW,KAAK,GAAI,YAAW,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAG,YAAW,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAG,CAAAA,KAAI,GAAG,GAAG,CAAC;AAC/F,mBAAW,KAAK,GAAI,YAAW,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAG,YAAW,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAG,CAAAA,KAAI,GAAG,GAAG,CAAC;AAAA,MACjG;AACA,YAAM,KAAK,EAAE,OAAO;AACpB,YAAM,QAAQ,EAAE,KAAK;AACrB,eAAS,IAAI,GAAG,KAAK,QAAQ,KAAK;AAChC,cAAM,KAAK,IAAI;AACf,cAAM,QAAQ,EAAE,SAAS,UAAU,KAAK,EAAE,SAAS,KAAK,KAAK,KAAK;AAClE,cAAM,IAAI,EAAE,SAAS,WAAW,EAAE,YAAY,OAAO,KAAK;AAC1D,mBAAW,CAAC,GAAG,GAAG,CAAC,KAAK,KAAK;AAC3B,cAAI,IAAU,CAAC,GAAG,GAAG,CAAC;AACtB,cAAI,UAAU,GAAG;AACf,kBAAM,IAAI,WAAW,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,GAAG,MAAM,KAAK;AAC5E,gBAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AAAA,UACxD;AACA,gBAAM,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;AACtE,cAAI,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAG,SAAQ,IAAI,KAAK;AAAA,QAC9C;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,aAAS,SAAS,UAAkB,QAAgB,SAAoD;AACtG,YAAM,IAAI,cAAc,QAAQ;AAChC,YAAM,IAAI,EAAE,MAAM,IAAI,MAAM;AAC5B,UAAI,CAAC,EAAG,OAAM,IAAI,MAAM,iBAAiB,MAAM,SAAS,QAAQ,GAAG;AACnE,YAAM,QAAQ,EAAE,KAAK;AACrB,UAAI,SAAS;AACb,YAAM,SAAS,EAAE,KAAK;AACtB,YAAM,KAAK,EAAE,KAAK,OAAO;AACzB,UAAI,WAAW,OAAO,WAAW,OAAO,YAAY,OAAO,UAAU,OAAO,UAAU;AACpF,iBAAS,UAAU,GAAG,GAAG,QAAQ,OAAO;AAAA,MAC1C,WAAW,OAAO;AAChB,cAAM,KAAK,KAAK,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AACtC,cAAM,KAAK,KAAK,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AACtC,cAAM,KAAK,KAAK,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AACtC,cAAM,KAAK,KAAK,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AACtC,cAAM,KAAK,EAAE,OAAO;AACpB,cAAM,MAAM,CAAC,IAAY,OAAwB;AAC/C,gBAAM,IAAI,aAAa,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;AACtC,iBAAO,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,QAC3B;AACA,cAAM,IAAI,EAAE,KAAK;AACjB,cAAM,OAAO,KAAK,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,MAAM,CAAC;AACrD,YAAI,EAAE,SAAS,WAAW,EAAE,SAAS,YAAY,EAAE,SAAS,QAAQ;AAClE,cAAI,KAAK,IAAI,KAAK,CAAC,CAAC,KAAK,KAAK;AAC5B,kBAAM,QAAQ,EAAE,SAAS,KAAK,KAAK;AACnC,kBAAM,QAAQ,CAAC,QAAQ,KAAK,KAAK,KAAK,CAAC,CAAC;AACxC,kBAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK;AAC1B,kBAAM,MAAM,KAAK,MAAM;AACvB,kBAAM,MAAM,KAAK,MAAM;AACvB,kBAAM,IAAI,KAAK;AACf,kBAAM,IAAI,KAAK;AACf,kBAAM,SAAS,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC;AACrE,kBAAM,MAAM;AACZ,kBAAM,SAAS,CAAC,GAAW,MAAc,KAAK,KAAK,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK;AACtG,kBAAM,WAAW,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,IAAI;AAChD,kBAAM,MAAM,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE;AACvC,qBAAS,IAAI,GAAG,KAAK,eAAe,WAAW,GAAG,KAAK;AACrD,oBAAM,KAAK,IAAI;AACf,kBAAI,QAAQ;AACZ,kBAAI,UAAU;AACZ,yBAAS,IAAI,IAAI,KAAK,KAAK,QAAQ,CAAC,OAAO,KAAK,IAAK,UAAS,IAAI,IAAI,KAAK,KAAK,QAAQ,CAAC,OAAO,KAAK,IAAK,SAAQ,IAAI,GAAG,CAAC;AAAA,cAC5H,OAAO;AACL,sBAAM,MAAM,MAAM,QAAQ,IAAI,QAAQ;AACtC,sBAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,SAAS,GAAG,CAAC;AACjD,yBAAS,IAAI,GAAG,KAAK,SAAS,CAAC,OAAO,KAAK;AACzC,wBAAM,IAAK,SAAS,IAAK;AACzB,wBAAM,IAAI,KAAK,KAAK,IAAI,GAAG,IAAI;AAC/B,wBAAM,IAAI,KAAK,KAAK,IAAI,GAAG,IAAI;AAC/B,sBAAI,OAAO,GAAG,CAAC,EAAG,SAAQ,IAAI,GAAG,CAAC;AAAA,gBACpC;AAAA,cACF;AACA,kBAAI,MAAO,WAAU,IAAI,KAAK;AAAA,YAChC;AAAA,UACF;AAAA,QACF,WAAW,EAAE,SAAS,SAAS;AAC7B,gBAAM,MAAM,KAAK,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AACvC,cAAI,MAAM,MAAM;AACd,kBAAM,KAAK,KAAK,CAAC,IAAI;AACrB,kBAAM,KAAK,KAAK,CAAC,IAAI;AACrB,kBAAM,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE;AACxF,kBAAM,OAAO,KAAK,IAAI,GAAG,IAAI;AAC7B,kBAAM,OAAO,KAAK,IAAI,GAAG,IAAI;AAC7B,kBAAM,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC;AACjD,kBAAM,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC;AACjD,qBAAS,IAAI,GAAG,KAAK,eAAe,WAAW,GAAG,KAAK;AACrD,oBAAM,QAAQ,QAAQ,OAAO,SAAS,IAAI;AAC1C,kBAAI,QAAQ;AACZ,uBAAS,IAAI,GAAG,KAAK,MAAM,CAAC,OAAO,KAAK;AACtC,yBAAS,IAAI,GAAG,KAAK,MAAM,CAAC,OAAO,KAAK;AACtC,wBAAM,IAAI,MAAO,KAAK,MAAM,IAAK;AACjC,wBAAM,IAAI,MAAO,KAAK,MAAM,IAAK;AACjC,sBAAI,IAAI,KAAK,IAAI,MAAM,QAAQ,QAAQ,IAAI,GAAG,CAAC,EAAG,SAAQ;AAAA,gBAC5D;AAAA,cACF;AACA,kBAAI,MAAO,WAAU,IAAI,KAAK;AAAA,YAChC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,QAAE,OAAO;AACT,UAAI,EAAE,SAAS,OAAQ,GAAE,SAAS;AAClC,UAAI,EAAE,IAAI,OAAQ,QAAO,GAAG,GAAG,MAAM;AACrC,aAAO;AAAA,IACT;AAGA,aAAS,YAAY,GAAa,IAAY;AAC5C,aAAO,EAAE,KAAK,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,IACnD;AAEA,aAAS,WAAW,UAAkB,aAA8B;AAClE,YAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,UAAI,CAAC,EAAG,QAAO;AACf,YAAM,IAAI,YAAY,GAAG,WAAW;AACpC,UAAI,CAAC,EAAG,QAAO;AACf,aAAO,OAAO,GAAG,EAAE,MAAM;AAAA,IAC3B;AAEA,aAAS,SAAS,UAAkB,aAA8C;AAChF,cAAQ,KAAK,IAAI,QAAQ,GAAG,SAAS,IAAI,WAAW,KAAK,CAAC,GAAG,IAAI,UAAU;AAAA,IAC7E;AAEA,aAAS,KAAK,UAAkB,aAAqB,MAAc,QAAgB,eAAiC;AAClH,YAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,UAAI,CAAC,EAAG,QAAO;AACf,YAAM,OAAO,EAAE,SAAS,IAAI,WAAW;AACvC,UAAI,CAAC,QAAQ,CAAC,WAAW,UAAU,WAAW,EAAG,QAAO;AACxD,YAAM,QAAQ,KAAK,IAAI;AACvB,UAAI,CAAC,MAAO,QAAO;AACnB,YAAM,MAAM,QAAQ,QAAQ,MAAM,IAAI;AACtC,UAAI,OAAO,IAAI,aAAa,MAAO,QAAO;AAC1C,WAAK,IAAI,IAAI;AACb,WAAK,EAAE,MAAM,UAAU,QAAQ,UAAU,WAAW,aAAa,MAAM,OAAO,WAAW,KAAK,GAAgB,MAAM,CAAC;AACrH,aAAO;AAAA,IACT;AAEA,aAAS,IAAI,UAAkB,aAAqB,OAAiC;AACnF,YAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,UAAI,CAAC,EAAG,QAAO;AACf,YAAM,IAAI,YAAY,GAAG,WAAW;AACpC,YAAM,OAAO,EAAE,SAAS,IAAI,WAAW;AACvC,UAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,UAAU,WAAW,EAAG,QAAO;AAC9D,YAAM,WAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG,SAAS;AACvD,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAM,MAAM,KAAK,CAAC;AAClB,YAAI,OAAO,IAAI,SAAS,MAAM,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,QAAQ,IAAI,MAAM,MAAM,OAAO,UAAU;AACjG,cAAI,OAAO,MAAM;AACjB,iBAAO;AAAA,QACT;AAAA,MACF;AACA,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAI,CAAC,KAAK,CAAC,KAAK,SAAS,MAAM,MAAM,EAAE,MAAM,CAAC,GAAG,QAAQ,KAAK,GAAG;AAC/D,eAAK,CAAC,IAAI,WAAW,KAAK;AAC1B,iBAAO;AAAA,QACT;AAAA,MACF;AACA,cAAQ,MAAM;AACd,aAAO;AAAA,IACT;AAEA,aAAS,aAAa,UAAkB,aAAqB,MAAoB;AAC/E,YAAM,IAAI,cAAc,QAAQ;AAChC,YAAM,IAAI,YAAY,GAAG,WAAW;AACpC,YAAM,IAAI,GAAG,MAAM,IAAI;AACvB,UAAI,CAAC,KAAK,CAAC,EAAG,OAAM,IAAI,MAAM,gBAAgB,IAAI,QAAQ,WAAW,SAAS,QAAQ,GAAG;AACzF,aAAO,QAAQ,GAAG,UAAU,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC;AAAA,IAC/C;AAGA,aAAS,eAAqB;AAC5B,YAAM,MAAM;AACZ,YAAM,UAA6E,CAAC;AACpF,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,mBAAW,KAAK,EAAE,KAAK,WAAW,CAAC,EAAG,SAAQ,KAAK,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,KAAK,QAAQ,GAAG,EAAE,GAAG,GAAG,SAAS,EAAE,QAAQ,CAAC;AAAA,MAClI;AACA,YAAM,OAAO,oBAAI,IAAY;AAC7B,YAAM,QAAgD,CAAC;AACvD,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,mBAAW,KAAK,EAAE,QAAQ,OAAO,GAAG;AAClC,gBAAM,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE;AAC5B,gBAAM,OAAO,EAAE,KAAK;AACpB,cAAI,SAAS,UAAa,EAAE,KAAK,SAAS;AACxC,kBAAM,IAAI,KAAK,IAAI;AAAA,UACrB,WAAW,SAAS,QAAQ;AAC1B,kBAAM,IAAI,KAAK,IAAI;AACnB,kBAAM,KAAK,EAAE,GAAG,EAAE,CAAC;AAAA,UACrB,OAAO;AACL,kBAAM,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,GAAG,IAAI,CAAC,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,IAAI;AAClI,kBAAM,IAAI,KAAK,IAAI,EAAE,KAAK,IAAI;AAC9B,gBAAI,EAAG,MAAK,IAAI,EAAE,EAAE;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AACA,iBAAW,EAAE,GAAG,EAAE,KAAK,OAAO;AAC5B,cAAM,OAAO,EAAE,KAAK,OAAO,QAAQ,GAAG,EAAE,KAAK,IAAI,IAAI,SAAS,CAAC;AAC/D,YAAI,OAAwC;AAC5C,YAAI,QAAQ;AACZ,mBAAW,KAAK,SAAS;AACvB,cAAI,KAAK,IAAI,EAAE,EAAE,EAAG;AACpB,gBAAM,KAAK,MAAM,MAAM,EAAE,GAAG;AAC5B,cAAI,MAAM,OAAO;AACf,mBAAO;AACP,oBAAQ;AAAA,UACV;AAAA,QACF;AACA,YAAI,MAAM;AACR,eAAK,IAAI,KAAK,EAAE;AAChB,gBAAM,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAEA,aAAS,QAAQ,SAA0B;AACzC,aAAO,SAAS,IAAI,OAAO,KAAK;AAAA,IAClC;AAEA,aAAS,cAAc,GAAa,GAAyB;AAC3D,UAAI,EAAE,KAAK,aAAa,MAAO,QAAO;AACtC,UAAI,CAAC,KAAM,QAAO;AAClB,UAAI,EAAE,KAAK,QAAS,QAAO,QAAQ,EAAE,KAAK,OAAO;AACjD,UAAI,EAAE,KAAK,WAAW,OAAW,QAAO;AACxC,YAAM,MAAM,MAAM,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC;AACvC,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,QAAQ,WAAW,KAAK,CAAC,IAAI,UAAU,GAAG,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,CAAC;AACzF,UAAI,CAAC,MAAO,QAAO;AACnB,aAAO,MAAM,MAAM,UAAU,QAAQ,MAAM,MAAM,OAAO,IAAI;AAAA,IAC9D;AAEA,aAAS,UAAU,UAAkB,UAA0D;AAC7F,YAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,YAAM,IAAI,GAAG,QAAQ,IAAI,QAAQ;AACjC,aAAO,KAAK,IAAI,EAAE,GAAG,EAAE,IAAI;AAAA,IAC7B;AAEA,aAAS,gBAAsC;AAC7C,YAAM,IAAI,oBAAI,IAAqB;AACnC,iBAAW,KAAK,KAAK,OAAO,EAAG,YAAW,KAAK,EAAE,QAAQ,OAAO,EAAG,GAAE,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,GAAG,CAAC,CAAC;AACvH,aAAO;AAAA,IACT;AAEA,aAAS,iBAAiB,QAAoC;AAC5D,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,mBAAW,KAAK,EAAE,QAAQ,OAAO,GAAG;AAClC,gBAAM,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE;AAC5B,gBAAM,MAAM,EAAE,MAAM,cAAc,GAAG,CAAC;AACtC,cAAI,OAAO,IAAI,GAAG,MAAM,OAAO,EAAE,GAAI,MAAK,EAAE,MAAM,UAAU,QAAQ,EAAE,IAAI,QAAQ,EAAE,KAAK,IAAI,IAAI,EAAE,IAAI,SAAS,cAAc,GAAG,CAAC,GAAG,SAAS,EAAE,KAAK,SAAS,WAAW,EAAE,UAAU,OAAU,CAAC;AAAA,QAClM;AAAA,MACF;AAAA,IACF;AAEA,aAAS,YAAY,GAAa,GAAgB,IAAmB;AACnE,QAAE,KAAK;AACP,UAAI,EAAE,KAAK,KAAM,eAAc,GAAG,EAAE,KAAK,MAAM,KAAK,IAAI,CAAC;AACzD,YAAM,UAAU,cAAc,GAAG,CAAC;AAClC,WAAK,EAAE,MAAM,UAAU,QAAQ,EAAE,IAAI,QAAQ,EAAE,KAAK,IAAI,IAAI,SAAS,SAAS,EAAE,KAAK,SAAS,WAAW,EAAE,UAAU,OAAU,CAAC;AAChI,UAAI,MAAM,CAAC,QAAS,SAAQ,UAAU;AAAA,IACxC;AAEA,aAAS,UAAU,UAAkB,UAAkB,IAAsB;AAC3E,YAAM,IAAI,UAAU,UAAU,QAAQ;AACtC,UAAI,CAAC,EAAG,QAAO;AACf,UAAI,EAAE,EAAE,OAAO,GAAI,aAAY,EAAE,GAAG,EAAE,GAAG,EAAE;AAC3C,aAAO;AAAA,IACT;AAEA,aAAS,WAAW,UAAkB,WAAmB,IAAsB;AAC7E,YAAM,KAAK,KAAK,IAAI,QAAQ,GAAG,SAAS,IAAI,SAAS;AACrD,UAAI,CAAC,GAAI,QAAO;AAChB,UAAI,GAAG,OAAO,GAAI,eAAc,KAAK,IAAI,QAAQ,GAAe,SAAS;AACzE,aAAO,GAAG,OAAO;AAAA,IACnB;AAEA,aAAS,UAAU,UAAkB,UAAkB,IAAsB;AAC3E,YAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,YAAM,IAAI,GAAG,QAAQ,IAAI,QAAQ;AACjC,UAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,YAAM,OAAO,EAAE,MAAM,EAAE;AACvB,UAAI,OAAO,KAAM,QAAO;AACxB,UAAI,CAAC,GAAI,QAAO,aAAa,GAAG,QAAQ;AACxC,aAAO,EAAE,KAAK,gBAAgB,OAAO,GAAG,QAAQ,IAAI,aAAa,GAAG,QAAQ;AAAA,IAC9E;AAEA,aAAS,cAAc,GAAa,IAAoD;AACtF,UAAI,GAAG,SAAS,GAAG,GAAG;AACpB,cAAM,IAAI,WAAW,IAAI,CAAC,IAAIC,WAAU,GAAG,QAAQ,IAAIA,MAAK,CAAC;AAC7D,eAAO,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,MAAM,IAAI;AAAA,MACtC;AACA,YAAM,QAAQ,EAAE,QAAQ,IAAI,EAAE;AAC9B,UAAI,MAAO,QAAO,EAAE,GAAG,GAAG,MAAM;AAChC,iBAAW,MAAM,KAAK,OAAO,GAAG;AAC9B,cAAM,IAAI,GAAG,QAAQ,IAAI,EAAE;AAC3B,YAAI,EAAG,QAAO,EAAE,GAAG,IAAI,EAAE;AAAA,MAC3B;AACA,aAAO;AAAA,IACT;AAEA,aAAS,WAAW,GAAa,MAAsD;AACrF,UAAI,KAAK,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,EAAG,QAAO,aAAa,EAAE,MAAM,IAAI,KAAK,IAAI,CAAc;AAChG,aAAO,KAAK,SAAS,KAAK,CAAC,OAAO,cAAc,GAAG,EAAE,GAAG,EAAE,EAAE;AAAA,IAC9D;AAEA,aAAS,aAAa,GAAa,IAAqB;AACtD,YAAM,KAAK,EAAE,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD,UAAI,CAAC,GAAI,QAAO;AAChB,YAAM,KAAK,CAAC,WAAW,GAAG,EAAE;AAC5B,UAAI,GAAG,KAAM,eAAc,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC;AACjD,UAAI,YAAY;AAChB,iBAAW,OAAO,GAAG,UAAU;AAC7B,cAAM,IAAI,cAAc,GAAG,GAAG;AAC9B,YAAI,CAAC,EAAG;AACR,UAAE,EAAE,KAAK;AACT,YAAI,EAAE,EAAE,KAAK,KAAM,eAAc,EAAE,GAAG,EAAE,EAAE,KAAK,MAAM,KAAK,IAAI,CAAC;AAC/D,cAAM,UAAU,cAAc,EAAE,GAAG,EAAE,CAAC;AACtC,YAAI,MAAM,CAAC,QAAS,aAAY;AAChC,aAAK,EAAE,MAAM,UAAU,QAAQ,EAAE,EAAE,IAAI,QAAQ,EAAE,EAAE,KAAK,IAAI,IAAI,QAAQ,CAAC;AAAA,MAC3E;AACA,WAAK,EAAE,MAAM,UAAU,QAAQ,EAAE,IAAI,QAAQ,GAAG,IAAI,GAAG,CAAC;AACxD,UAAI,UAAW,SAAQ,UAAU;AACjC,aAAO;AAAA,IACT;AAGA,aAAS,YAAY,GAAa,GAAsD;AACtF,YAAM,OAAO,EAAE,KAAK;AACpB,UAAI,SAAS,QAAQ;AACnB,cAAM,OAAO,QAAQ,GAAG,EAAE,KAAK,GAAG;AAClC,YAAI,OAA6C;AACjD,YAAI,QAAQ;AACZ,mBAAW,MAAM,KAAK,OAAO,GAAG;AAC9B,qBAAW,KAAK,GAAG,MAAM,OAAO,GAAG;AACjC,gBAAI,EAAE,KAAK,SAAS,MAAO;AAC3B,kBAAM,IAAI,MAAM,MAAM,SAAS,EAAE,CAAC;AAClC,gBAAI,KAAK,OAAO;AACd,qBAAO,EAAE,GAAG,IAAI,EAAE;AAClB,sBAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,MACT;AACA,UAAI,KAAK,SAAS,GAAG,GAAG;AACtB,cAAM,IAAI,WAAW,MAAM,CAAC,IAAIA,WAAU,GAAG,MAAM,IAAIA,MAAK,CAAC;AAC7D,eAAO,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,MAAM,IAAI;AAAA,MACtC;AACA,YAAM,QAAQ,EAAE,MAAM,IAAI,IAAI;AAC9B,aAAO,QAAQ,EAAE,GAAG,GAAG,MAAM,IAAI;AAAA,IACnC;AAEA,aAAS,UAAU,GAAa,GAAuB;AACrD,YAAM,IAAI,EAAE,KAAK;AACjB,UAAI,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,EAAG,QAAO;AAClC,aAAO,aAAa,EAAE,MAAM,IAAI,CAAC,CAAc;AAAA,IACjD;AAEA,aAAS,QAAQ,GAAgB,KAAoD;AACnF,aAAO,CAAC,CAAC,OAAO,IAAI,EAAE,QAAQ,KAAK,UAAU,IAAI,GAAG,IAAI,CAAC;AAAA,IAC3D;AAEA,aAAS,QAAQ,KAAuC;AACtD,aAAO,CAAC,CAAC,OAAO,IAAI,EAAE,KAAK,SAAS;AAAA,IACtC;AAEA,aAAS,WAAW,GAAa,GAAsB;AACrD,WAAK,EAAE,MAAM,UAAU,QAAQ,EAAE,IAAI,QAAQ,EAAE,KAAK,IAAI,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,CAAC;AAAA,IAChF;AAEA,aAAS,WAAW,GAAa,GAAgB,SAAwB;AACvE,YAAM,MAAM,YAAY,GAAG,CAAC;AAC5B,YAAM,SAAS,EAAE;AACjB,QAAE,MAAM;AACR,UAAI,QAAS,GAAE,KAAK;AACpB,UAAI,EAAE,KAAK,KAAM,eAAc,GAAG,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI,CAAC;AAC3D,UAAI,UAAU,QAAQ,GAAG,EAAG,GAAE,QAAQ;AACtC,iBAAW,GAAG,CAAC;AAAA,IACjB;AAEA,aAAS,aAAa,GAAa,IAAqB;AACtD,YAAM,IAAI,EAAE,QAAQ,IAAI,EAAE;AAC1B,UAAI,CAAC,EAAG,QAAO;AACf,UAAI,EAAE,MAAM,EAAE,KAAK;AACjB,mBAAW,GAAG,GAAG,IAAI;AACrB,eAAO;AAAA,MACT;AACA,UAAI,EAAE,KAAK,cAAe,QAAO;AACjC,YAAM,MAAM,YAAY,GAAG,CAAC;AAC5B,QAAE,KAAK;AACP,QAAE,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAI,EAAE,IAAK,GAAE,QAAQ;AACrB,UAAI,EAAE,KAAK,KAAM,eAAc,GAAG,EAAE,KAAK,MAAM,CAAC;AAChD,iBAAW,GAAG,CAAC;AACf,UAAI,CAAC,EAAE,IAAK,SAAQ,OAAO,IAAI,EAAE,SAAS,IAAI,UAAU,QAAQ;AAChE,aAAO;AAAA,IACT;AAEA,aAAS,OAAO,GAAa,IAAqB;AAChD,YAAM,IAAI,EAAE,QAAQ,IAAI,EAAE;AAC1B,UAAI,CAAC,KAAK,EAAE,IAAK,QAAO;AACxB,YAAM,MAAM,YAAY,GAAG,CAAC;AAC5B,UAAI,CAAC,QAAQ,GAAG,GAAG,GAAG;AACpB,gBAAQ,OAAO,IAAI,EAAE,SAAS,IAAI,UAAU,QAAQ;AACpD,eAAO;AAAA,MACT;AACA,QAAE,KAAK;AACP,QAAE,MAAM;AACR,QAAE,QAAQ;AACV,UAAI,EAAE,KAAK,KAAM,eAAc,GAAG,EAAE,KAAK,MAAM,CAAC;AAChD,iBAAW,GAAG,CAAC;AACf,aAAO;AAAA,IACT;AAEA,aAAS,WAAW,GAAa,IAAqB;AACpD,YAAM,IAAI,EAAE,MAAM,IAAI,EAAE;AACxB,UAAI,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,MAAM,IAAI,EAAE,KAAK,KAAK,EAAG,QAAO;AAC9D,YAAM,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,KAAK;AAClC,oBAAc,GAAG,EAAE,KAAK,OAAO,aAAa,CAAC,IAAI,IAAI,CAAC;AACtD,aAAO;AAAA,IACT;AAGA,aAAS,YAAY,GAAa,IAA8D;AAC9F,YAAM,OAAO,OAAO,UAAa,OAAO,SAAS,cAAc;AAC/D,UAAI,CAAC,KAAM,QAAO;AAClB,YAAM,IAAI,WAAW,MAAM,CAAC,IAAIA,WAAU,GAAG,MAAM,IAAIA,MAAK,CAAC;AAC7D,UAAI,EAAG,QAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,MAAM;AACnC,YAAM,QAAQ,EAAE,MAAM,IAAI,IAAI;AAC9B,aAAO,QAAQ,EAAE,GAAG,GAAG,MAAM,IAAI;AAAA,IACnC;AAEA,aAAS,UAAU,GAAa,IAAkB,QAAwB;AACxE,UAAI,UAAU,EAAG,QAAO;AACxB,UAAI,QAAQ,YAAa,QAAO,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,QAAQ,YAAY,KAAK,IAAI,GAAG,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC;AAClH,YAAM,OAAO,YAAY,GAAG,GAAG,KAAK,IAAI;AACxC,UAAI,CAAC,KAAM,QAAO;AAClB,YAAM,MAAM,KAAK,IAAI,QAAQ,KAAK,EAAE,KAAK;AACzC,WAAK,EAAE,SAAS;AAChB,aAAO;AAAA,IACT;AAEA,aAAS,YAAY,GAAa,IAAwB;AACxD,WAAK,EAAE,MAAM,WAAW,QAAQ,EAAE,IAAI,SAAS,GAAG,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,GAAG,QAAQ,CAAC;AAAA,IAC7F;AAEA,aAAS,OAAO,IAA0B;AACxC,aAAO,GAAG,KAAK,QAAQ,cAAc,GAAG,KAAK,IAAI,KAAK;AAAA,IACxD;AAEA,aAAS,YAAY,GAAa,IAAkB,IAAkB;AACpE,UAAI,CAAC,GAAG,GAAI;AACZ,UAAI,GAAG,KAAK,SAAS,SAAS;AAC5B,WAAG,SAAS;AACZ,YAAI,GAAG,SAAS,GAAG;AACjB,aAAG,KAAK;AACR,aAAG,UAAU;AACb,aAAG,OAAO;AACV,cAAI,GAAG,KAAK,KAAM,eAAc,GAAG,GAAG,KAAK,MAAM,CAAC;AAClD,sBAAY,GAAG,EAAE;AAAA,QACnB;AACA;AAAA,MACF;AACA,UAAI,MAAM,EAAG;AACb,YAAM,SAAU,OAAO,EAAE,IAAI,KAAM;AACnC,YAAM,MAAM,UAAU,GAAG,IAAI,MAAM;AACnC,YAAM,UAAU,MAAM;AACtB,SAAG,OAAO,SAAS,IAAI,KAAK,IAAI,GAAG,MAAM,MAAM,IAAI;AACnD,UAAI,YAAY,GAAG,SAAS;AAC1B,WAAG,UAAU;AACb,oBAAY,GAAG,EAAE;AAAA,MACnB;AAAA,IACF;AAEA,aAAS,cAAc,GAAa,IAAqB;AACvD,YAAM,KAAK,EAAE,SAAS,IAAI,EAAE;AAC5B,UAAI,CAAC,GAAI,QAAO;AAChB,UAAI,GAAG,IAAI;AACT,WAAG,KAAK;AACR,WAAG,UAAU;AACb,WAAG,OAAO;AACV,YAAI,GAAG,KAAK,KAAM,eAAc,GAAG,GAAG,KAAK,MAAM,CAAC;AAClD,oBAAY,GAAG,EAAE;AACjB,eAAO;AAAA,MACT;AACA,SAAG,KAAK;AACR,UAAI,GAAG,KAAK,KAAM,eAAc,GAAG,GAAG,KAAK,MAAM,CAAC;AAClD,UAAI,GAAG,KAAK,SAAS,SAAS;AAC5B,cAAMC,UAAS,GAAG,KAAK,UAAU;AACjC,cAAM,MAAM,UAAU,GAAG,IAAIA,OAAM;AACnC,WAAG,UAAU,MAAM;AACnB,WAAG,OAAO,GAAG,UAAU,IAAI;AAC3B,WAAG,QAAQ;AACX,YAAI,CAAC,GAAG,SAAS;AACf,aAAG,KAAK;AACR,cAAI,GAAG,KAAK,KAAM,eAAc,GAAG,GAAG,KAAK,MAAM,CAAC;AAAA,QACpD;AAAA,MACF,OAAO;AACL,WAAG,UAAU;AACb,WAAG,OAAO;AACV,oBAAY,GAAG,IAAI,IAAI,EAAE;AAAA,MAC3B;AACA,kBAAY,GAAG,EAAE;AACjB,UAAI,CAAC,GAAG,QAAS,SAAQ,UAAU;AACnC,aAAO;AAAA,IACT;AAGA,aAAS,UAAU,UAAkB,QAA+B;AAClE,iBAAW,CAAC,OAAO,CAAC,KAAK,MAAO,KAAI,EAAE,WAAW,YAAY,EAAE,SAAS,OAAQ,QAAO;AACvF,aAAO;AAAA,IACT;AAEA,aAAS,MAAM,QAAgB,eAA4B;AACzD,YAAM,IAAI,MAAM,IAAI,KAAK;AACzB,UAAI,CAAC,EAAG,QAAO;AACf,YAAM,OAAO,KAAK;AAClB,YAAM,IAAI,KAAK,IAAI,EAAE,MAAM;AAC3B,YAAM,OAAO,GAAG,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI;AACvD,WAAK,EAAE,MAAM,QAAQ,QAAQ,EAAE,QAAQ,MAAM,EAAE,MAAM,OAAO,QAAQ,MAAM,CAAC;AAC3E,UAAI,CAAC,KAAK,CAAC,KAAM,QAAO;AACxB,aAAO,QAAQ,GAAG,KAAK,IAAI;AAAA,IAC7B;AAEA,aAAS,IAAI,UAAkB,QAAgB,QAAgB,eAAkC;AAC/F,YAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,YAAM,OAAO,GAAG,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACvD,UAAI,CAAC,KAAK,CAAC,KAAM,QAAO;AACxB,YAAM,SAAS,UAAU,UAAU,MAAM;AACzC,UAAI,UAAU,WAAW,MAAO,QAAO;AACvC,UAAI,MAAM,IAAI,KAAK,KAAK,CAAC,OAAQ,OAAM,KAAK;AAC5C,YAAM,IAAI,OAAO,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AACnD,YAAM,MAAM,KAAK,QAAQ,KAAK,SAAS,QAAQ,OAAO;AACtD,WAAK,EAAE,MAAM,QAAQ,QAAQ,UAAU,MAAM,QAAQ,OAAO,QAAQ,KAAK,CAAC;AAC1E,aAAO,EAAE,KAAK,QAAQ,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,OAAO,UAAU,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK;AAAA,IAC3I;AAGA,aAAS,KAAK,KAAW,QAAgB,KAAiB;AACxD,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,YAAI,CAAC,EAAE,KAAK,KAAM;AAClB,cAAM,KAAK,EAAE,OAAO;AACpB,cAAM,KAAK,aAAa,IAAI,GAAG;AAC/B,cAAM,KAAK,KAAK,KAAK,CAAC,GAAG,EAAE;AAC3B,mBAAW,KAAK,EAAE,KAAK,OAAO,GAAG;AAC/B,gBAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK;AACzB,gBAAM,KAAK,IAAI;AACf,gBAAM,KAAK,KAAK,IAAI,GAAG,GAAG,IAAI;AAC9B,gBAAM,KAAK,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC;AAC9D,gBAAM,KAAK,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC;AAC9D,cAAI,KAAK,MAAM,IAAI,EAAE,IAAI,OAAQ;AACjC,gBAAM,MAAM,GAAG,IAAI,EAAE,KAAK,OAAO,CAAC;AAClC,cAAI,IAAI,CAAC,IAAI,eAAe,MAAM,KAAK,IAAI,CAAC,IAAI,IAAK;AACrD,gBAAM,MAAM;AACZ,YAAE,MAAM,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,KAAK,GAAG;AAClD,YAAE,MAAM,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,KAAK,GAAG;AAClD,cAAI,EAAE,KAAK,SAAS,WAAW,EAAE,KAAK,QAAQ,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,EAAG,eAAc,GAAG,EAAE,KAAK,MAAM,CAAC;AAAA,QAC1H;AAAA,MACF;AAAA,IACF;AAEA,aAAS,SAAS,IAAkB;AAClC,YAAM,MAAM,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC;AACjD,YAAM,IAAI,KAAK;AACf,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,YAAI,CAAC,EAAE,KAAK,KAAM;AAClB,cAAM,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,UAAU,EAAE;AAC7D,mBAAW,KAAK,EAAE,KAAK,OAAO,GAAG;AAC/B,gBAAM,IAAI,EAAE,KAAK,aAAa;AAC9B,gBAAM,IAAI,EAAE,KAAK,WAAW;AAC5B,gBAAM,MAAM,EAAE,KAAK,YAAY;AAC/B,gBAAM,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,UAAU,IAAI;AAC3D,gBAAM,OAAO,QAAQ,MAAM,MAAM,KAAK,IAAI,OAAO,MAAM,EAAE,KAAK,KAAK;AACnE,gBAAM,KAAK,CAAC,GAAG,CAAC,IAAI;AACpB,gBAAM,KAAK,GAAG,CAAC,IAAI;AACnB,mBAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,cAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM;AACxC,cAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM;AACxC,cAAE,MAAM,EAAE,MAAM;AAChB,cAAE,MAAM,EAAE,MAAM;AAAA,UAClB;AACA,cAAI,KAAK,IAAI,EAAE,EAAE,IAAI,KAAK;AACxB,cAAE,KAAK,KAAK,KAAK,EAAE,EAAE,IAAI;AACzB,cAAE,MAAM;AAAA,UACV;AACA,cAAI,KAAK,IAAI,EAAE,EAAE,IAAI,KAAK;AACxB,cAAE,KAAK,KAAK,KAAK,EAAE,EAAE,IAAI;AACzB,cAAE,MAAM;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,aAAS,OAAO,UAAkBH,SAAgB,QAAgB,OAA2D;AAC3H,YAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,UAAI,KAAK,QAAQ,aAAa;AAC5B,cAAMI,OAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;AAClC,cAAM,OAAO,UAAU,QAAQ,cAAc,UAAU,WAAW,UAAU;AAC5E,cAAM,SAAS,QAAQ,YAAY,QAAQ,UAAUJ,SAAQ,EAAE,MAAM,OAAOI,MAAK,QAAQ,KAAK,IAAI,GAAG,MAAM,GAAG,QAAQ,gBAAgB,CAAC;AACvI,cAAMC,aAAY,CAAC,CAAC,QAAQ,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,SAASL,OAAM;AAC1F,aAAK,EAAE,MAAM,UAAU,QAAQ,UAAU,QAAAA,SAAQ,IAAI,IAAI,WAAAK,WAAU,CAAC;AACpE,eAAO,EAAE,IAAI,IAAI,WAAAA,WAAU;AAAA,MAC7B;AACA,YAAM,KAAK,GAAG,GAAG,IAAIL,OAAM;AAC3B,UAAI,CAAC,KAAK,CAAC,GAAI,QAAO;AACtB,UAAI,GAAG,MAAM,EAAG,QAAO,EAAE,IAAI,GAAG,WAAW,KAAK;AAChD,YAAM,SAAS,GAAG;AAClB,SAAG,KAAK,KAAK,IAAI,GAAG,GAAG,KAAK,KAAK,IAAI,GAAG,MAAM,CAAC;AAC/C,YAAM,YAAY,GAAG,MAAM;AAC3B,WAAK,EAAE,MAAM,UAAU,QAAQ,UAAU,QAAAA,SAAQ,IAAI,GAAG,IAAI,UAAU,CAAC;AACvE,YAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;AAClC,YAAM,OAAO,EAAE,MAAM,IAAIA,OAAM;AAC/B,UAAI,QAAQ,aAAa,KAAK,KAAK,SAAS,SAAS,KAAK,QAAQ,GAAG;AACnE,aAAK,EAAE,MAAM,aAAa,QAAQ,UAAU,KAAK,QAAQ,IAAI,KAAK,QAAQ,EAAE,CAAC;AAC7E,aAAK,QAAQ;AAAA,MACf;AACA,YAAM,OAAO,EAAE,MAAM,IAAIA,OAAM;AAC/B,UAAI,QAAQ,WAAW,GAAG,OAAO,GAAG,KAAK,OAAQ,MAAK,EAAE,MAAM,QAAQ,QAAQ,UAAU,QAAAA,SAAQ,IAAI,CAAC;AACrG,aAAO,EAAE,IAAI,GAAG,IAAI,UAAU;AAAA,IAChC;AAGA,aAAS,mBAAmB,MAAqC;AAC/D,YAAM,MAAyB,CAAC;AAChC,YAAM,OAAO,oBAAI,IAAY;AAC7B,YAAM,UAAU,CAAC,IAAwB,aAAyB,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS;AACjH,YAAM,YAAY,CAAC,OAAmC,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS;AACrG,YAAM,QAAQ,CAAC,OAA2B;AACxC,YAAI,GAAI,MAAK,IAAI,EAAE;AAAA,MACrB;AACA,iBAAW,KAAK,KAAK,WAAW,CAAC,GAAG;AAClC,cAAM,EAAE,IAAI;AACZ,cAAM,MAAM,EAAE,OAAO,QAAQ,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,IAAK,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC;AAErE,YAAI,EAAE,SAAS,UAAU,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,aAAa,MAAO;AACrE,YAAI,KAAK,EAAE,IAAI,UAAU,EAAE,EAAE,IAAI,KAAK,QAAQ,EAAE,IAAI,iBAAiB,QAAQ,EAAE,GAAG,GAAG,OAAO,UAAU,EAAE,IAAI,EAAE,CAAC;AAC/G,YAAI,EAAE,SAAS,aAAa,EAAE,YAAY,KAAK,EAAG,KAAI,KAAK,EAAE,IAAI,WAAW,EAAE,EAAE,IAAI,KAAK,QAAQ,EAAE,IAAI,gBAAgB,QAAQ,EAAE,GAAG,GAAG,OAAO,GAAG,CAAC;AAAA,MACpJ;AACA,iBAAW,KAAK,KAAK,YAAY,CAAC,GAAG;AACnC,cAAM,EAAE,IAAI;AACZ,YAAI,KAAK,EAAE,IAAI,UAAU,EAAE,EAAE,IAAI,KAAK,QAAQ,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,QAAQ,EAAE,IAAI,iBAAiB,QAAQ,EAAE,GAAG,GAAG,OAAO,UAAU,EAAE,IAAI,EAAE,CAAC;AAAA,MAC/I;AACA,YAAM,SAAS,IAAI,KAAK,KAAK,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AACjE,iBAAW,KAAK,KAAK,YAAY,CAAC,GAAG;AACnC,cAAM,EAAE,IAAI;AACZ,YAAI,OAAO,IAAI,EAAE,EAAE,EAAG;AACtB,YAAI,KAAK,EAAE,IAAI,WAAW,EAAE,EAAE,IAAI,KAAK,EAAE,OAAO,QAAQ,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,QAAQ,QAAQ,EAAE,IAAI,kBAAkB,SAAS,EAAE,GAAG,GAAG,OAAO,UAAU,EAAE,IAAI,EAAE,CAAC;AAAA,MACnK;AACA,iBAAW,KAAK,KAAK,WAAW,CAAC,GAAG;AAClC,cAAM,EAAE,IAAI;AACZ,cAAM,MAAM,EAAE,OAAO,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE;AAChD,YAAI,EAAE,cAAe,KAAI,KAAK,EAAE,IAAI,UAAU,EAAE,EAAE,IAAI,KAAK,QAAQ,EAAE,IAAI,UAAU,QAAQ,EAAE,GAAG,GAAG,OAAO,GAAG,CAAC;AAC9G,YAAI,KAAK,EAAE,IAAI,UAAU,EAAE,EAAE,IAAI,KAAK,QAAQ,EAAE,IAAI,iBAAiB,QAAQ,EAAE,GAAG,GAAG,OAAO,UAAU,EAAE,IAAI,EAAE,CAAC;AAAA,MACjH;AACA,iBAAW,KAAK,KAAK,SAAS,CAAC,GAAG;AAChC,YAAI,CAAC,EAAE,MAAO;AACd,cAAM,EAAE,KAAK;AACb,YAAI,KAAK,EAAE,IAAI,QAAQ,EAAE,EAAE,IAAI,KAAK,QAAQ,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,QAAQ,EAAE,IAAI,eAAe,MAAM,EAAE,GAAG,GAAG,OAAO,UAAU,EAAE,KAAK,EAAE,CAAC;AAAA,MAC3I;AACA,iBAAW,KAAK,KAAK,cAAc,CAAC,GAAG;AACrC,YAAI,CAAC,EAAE,OAAQ,KAAI,KAAK,EAAE,IAAI,QAAQ,EAAE,EAAE,IAAI,KAAK,EAAE,OAAO,QAAQ,QAAQ,EAAE,IAAI,kBAAkB,WAAW,EAAE,GAAG,GAAG,OAAO,GAAG,CAAC;AAAA,MACpI;AACA,iBAAW,KAAK,KAAK,SAAS,CAAC,GAAG;AAChC,YAAI,KAAK,IAAI,EAAE,EAAE,EAAG;AACpB,YAAI,EAAE,MAAO,KAAI,KAAK,EAAE,IAAI,QAAQ,EAAE,EAAE,IAAI,KAAK,EAAE,OAAO,QAAQ,EAAE,IAAI,eAAe,MAAM,EAAE,GAAG,GAAG,OAAO,EAAE,MAAM,CAAC;AAAA,MACvH;AACA,iBAAW,KAAK,KAAK,cAAc,CAAC,GAAG;AACrC,YAAI,EAAE,UAAU,CAAC,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;AAClE,cAAI,KAAK,EAAE,IAAI,QAAQ,EAAE,EAAE,IAAI,KAAK,QAAQ,EAAE,QAAQ,EAAE,OAAO,MAAM,GAAG,QAAQ,EAAE,IAAI,kBAAkB,WAAW,EAAE,GAAG,GAAG,OAAO,GAAG,CAAC;AAAA,QACxI;AAAA,MACF;AACA,iBAAW,KAAK,KAAK,SAAS,CAAC,EAAG,KAAI,KAAK,EAAE,IAAI,QAAQ,EAAE,EAAE,IAAI,KAAK,EAAE,KAAK,QAAQ,EAAE,IAAI,OAAO,MAAM,EAAE,GAAG,GAAG,OAAO,GAAG,CAAC;AAC3H,aAAO;AAAA,IACT;AAEA,aAAS,SAAS,GAAqB;AACrC,aAAO,MAAM,QAAQ,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,IAAI;AAAA,IAC7D;AAEA,aAAS,SAAS,GAAa,GAAqE;AAClG,YAAM,IAAI,EAAE;AACZ,UAAI,QAAuB;AAC3B,UAAI,MAAM;AACV,cAAQ,EAAE,IAAI;AAAA,QACZ,KAAK,eAAe;AAClB,gBAAM,IAAI,EAAE,MAAM,IAAI,EAAE,IAAI;AAC5B,gBAAM,OAAO,CAAC,CAAC,KAAK,aAAa,CAAC;AAClC,kBAAQ,OAAO,SAAS;AACxB,gBAAM,OAAO,iBAAiB;AAC9B;AAAA,QACF;AAAA,QACA,KAAK,kBAAkB;AACrB,gBAAM,IAAI,YAAY,GAAG,EAAE,SAAS;AACpC,gBAAM,IAAI,GAAG,SAAS,EAAE,MAAM,IAAI,EAAE,MAAM,IAAI;AAC9C,gBAAM,OAAO,IAAI,aAAa,CAAC,IAAI;AACnC,kBAAQ,IAAK,OAAO,SAAS,WAAY;AACzC,gBAAM,OAAO,iBAAiB;AAC9B;AAAA,QACF;AAAA,QACA,KAAK,iBAAiB;AACpB,gBAAM,KAAK,CAAC,CAAC,EAAE,QAAQ,IAAI,EAAE,MAAM,GAAG;AACtC,kBAAQ,KAAK,OAAO;AACpB,gBAAM,KAAK,oBAAoB;AAC/B;AAAA,QACF;AAAA,QACA,KAAK,iBAAiB;AACpB,gBAAM,KAAK,EAAE,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM;AACzD,gBAAM,KAAK,CAAC,CAAC,MAAM,WAAW,GAAG,EAAE;AACnC,kBAAQ,KAAK,OAAO;AACpB,gBAAM,KAAK,oBAAoB;AAC/B;AAAA,QACF;AAAA,QACA,KAAK,kBAAkB;AACrB,gBAAM,KAAK,QAAQ,EAAE,OAAO;AAC5B,kBAAQ,KAAK,OAAO;AACpB,gBAAM,KAAK,uBAAuB;AAClC;AAAA,QACF;AAAA,QACA,KAAK,kBAAkB;AACrB,gBAAM,KAAK,CAAC,CAAC,EAAE,SAAS,IAAI,EAAE,OAAO,GAAG;AACxC,kBAAQ,KAAK,OAAO;AACpB,gBAAM,KAAK,oBAAoB;AAC/B;AAAA,QACF;AAAA,QACA,KAAK,iBAAiB;AACpB,gBAAM,IAAI,EAAE,QAAQ,IAAI,EAAE,MAAM;AAChC,gBAAM,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE;AAC7B,kBAAQ,KAAK,OAAO;AACpB,gBAAM,KAAK,oBAAoB;AAC/B;AAAA,QACF;AAAA,QACA,KAAK,eAAe;AAClB,gBAAM,IAAI,EAAE,MAAM,IAAI,EAAE,IAAI;AAC5B,gBAAM,OAAO,CAAC,CAAC,KAAK,UAAU,GAAG,CAAC;AAClC,kBAAQ,OAAO,SAAS;AACxB,gBAAM,OAAO,uBAAuB;AACpC;AAAA,QACF;AAAA,QACA,KAAK;AACH,gBAAM;AACN;AAAA,QACF,KAAK;AACH,gBAAM;AACN;AAAA,QACF,KAAK;AACH,gBAAM;AACN;AAAA,QACF,KAAK;AACH,gBAAM;AACN;AAAA,QACF,KAAK,OAAO;AACV,gBAAM,OAAO,EAAE,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI;AACtD,gBAAM,OAAO,MAAM,IAAI,aAAa;AACpC,gBAAM,QAAQ,KAAK,WAAW,EAAE,MAAM,KAAK,SAAS,EAAE,OAAO,kBAAkB,MAAM,SAAS,QAAQ,oBAAoB;AAC1H;AAAA,QACF;AAAA,MACF;AACA,UAAI,MAAM;AACV,UAAI,EAAE,OAAO;AACX,YAAI,SAAS,MAAM,GAAG,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,OAAW,OAAM,GAAG,EAAE,KAAK,IAAI,KAAK;AAAA,iBACzE,MAAM,EAAE,KAAK,MAAM,OAAW,OAAM,EAAE;AAAA,MACjD;AACA,YAAM,OAAO,EAAE,MAAM,SAAS,CAAC,GAAG,SAAS,EAAE,OAAO,mBAAoB,EAAE,QAAQ,EAAE,UAAW,GAAG;AAClG,YAAM,QAAQ,EAAE,KAAK,IAAI;AAEzB,UAAI;AACJ,UAAI;AACJ,UAAI,MAAM,GAAG,GAAG,OAAO,MAAM,QAAW;AACtC,eAAO,EAAE,GAAG,GAAG,SAAS,IAAI;AAC5B,iBAAS,MAAM,GAAG,GAAG,SAAS,IAAI,EAAE,GAAG,GAAG,WAAW,IAAI,IAAI,KAAK;AAAA,MACpE,OAAO;AACL,cAAM,KAAK,MAAM,QAAQ,GAAG;AAC5B,eAAO,KAAK,IAAI,QAAQ,MAAM,MAAM,GAAG,EAAE;AACzC,iBAAS,KAAK,IAAI,KAAK,OAAO,MAAM,MAAM,KAAK,CAAC;AAAA,MAClD;AACA,aAAO,EAAE,OAAO,MAAM,OAAO;AAAA,IAC/B;AAGA,aAAS,kBAAkB,GAAa,GAAmC;AACzE,YAAM,IAAI,EAAE;AACZ,UAAI,CAAC,eAAe,CAAC,EAAG,QAAO;AAC/B,cAAQ,EAAE,IAAI;AAAA,QACZ,KAAK,eAAe;AAClB,gBAAM,IAAI,EAAE,MAAM,IAAI,EAAE,IAAI;AAC5B,iBAAO,KAAK,MAAM,GAAG,CAAC,IAAI,kBAAkB;AAAA,QAC9C;AAAA,QACA,KAAK,kBAAkB;AACrB,gBAAM,IAAI,YAAY,GAAG,EAAE,SAAS;AACpC,gBAAM,IAAI,GAAG,SAAS,EAAE,MAAM,IAAI,EAAE,MAAM,IAAI;AAC9C,iBAAO,KAAK,MAAM,GAAG,CAAC,IAAI,kBAAkB;AAAA,QAC9C;AAAA,QACA,KAAK,kBAAkB;AACrB,gBAAM,SAAS,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE,IAAI,IAAI;AAC9C,iBAAO,UAAU,MAAM,GAAG,MAAM,IAAI,kBAAkB;AAAA,QACxD;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,WAAW,EAAE,IAAI,EAAE,SAAS,IAAI,OAAO;AAAA,QAChD,KAAK;AACH,iBAAO,EAAE,QAAQ,IAAI,EAAE,MAAM,GAAG,MAAM,gBAAgB;AAAA,QACxD,KAAK,iBAAiB;AACpB,gBAAM,IAAI,EAAE,QAAQ,IAAI,EAAE,MAAM;AAChC,iBAAO,CAAC,GAAG,KAAK,iBAAiB,EAAE,MAAM,OAAO;AAAA,QAClD;AAAA,QACA,KAAK,gBAAgB;AACnB,gBAAM,IAAI,EAAE,QAAQ,IAAI,EAAE,MAAM;AAChC,cAAI,CAAC,KAAK,CAAC,EAAE,GAAI,QAAO;AACxB,iBAAO,cAAc,GAAG,CAAC,IAAI,OAAO;AAAA,QACtC;AAAA,QACA;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAEA,aAAS,eAAe,GAA6B;AACnD,UAAI,CAAC,EAAE,SAAU,QAAO;AACxB,YAAM,IAAI,KAAK,IAAI,EAAE,SAAS,MAAM,GAAG,MAAM,IAAI,EAAE,SAAS,IAAI;AAChE,aAAO,CAAC,CAAC,KAAK,aAAa,CAAC;AAAA,IAC9B;AAEA,aAAS,gBAAgB,GAAgF;AACvG,aAAO,EAAE,aAAa,IAAI,CAAC,MAAM;AAC/B,cAAM,KAAK,IAAI,GAAG,EAAE,EAAE;AACtB,cAAM,IAAI,SAAS,GAAG,CAAC;AACvB,cAAM,OAAqB;AAAA,UACzB;AAAA,UACA,QAAQ,EAAE;AAAA,UACV,MAAM,EAAE,OAAO;AAAA,UACf,KAAK,QAAQ,GAAG,EAAE,GAAG;AAAA,UACrB,QAAQ,EAAE,UAAU;AAAA,UACpB,OAAO,EAAE;AAAA,UACT,MAAM,EAAE;AAAA,UACR,MAAM,EAAE;AAAA,UACR,WAAW;AAAA,UACX,KAAK,CAAC,UAAU,IAAI,IAAI,KAAK;AAAA,QAC/B;AACA,cAAM,SAAS,kBAAkB,GAAG,CAAC,MAAM,QAAQ,cAAc,MAAM,aAAa,MAAM,QAAQ,WAAW;AAC7G,YAAI,QAAQ;AACV,eAAK,YAAY;AACjB,eAAK,SAAS;AAAA,QAChB;AACA,eAAO,EAAE,MAAM,MAAM,GAAG,EAAE;AAAA,MAC5B,CAAC;AAAA,IACH;AAEA,aAAS,gBAAgC;AACvC,YAAM,MAAsB,CAAC;AAC7B,iBAAW,KAAK,KAAK,OAAO,EAAG,YAAW,KAAK,gBAAgB,CAAC,EAAG,KAAI,KAAK,EAAE,IAAI;AAClF,aAAO;AAAA,IACT;AAEA,aAAS,OAAO,KAAsE,OAAsB,CAAC,GAAwB;AACnI,YAAM,QAAQ,KAAK,SAAS;AAC5B,YAAM,OAAO,KAAK,QAAQ;AAC1B,YAAM,MAAY,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,IAAI,KAAK,GAAG,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC;AAC1H,UAAI,OAA4B;AAChC,UAAI,YAAY;AAChB,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,mBAAW,KAAK,gBAAgB,CAAC,GAAG;AAClC,cAAI,CAAC,EAAE,KAAK,aAAa,CAAC,KAAK,mBAAoB;AACnD,cAAI,KAAK,SAAS,CAAC,KAAK,MAAM,SAAS,EAAE,KAAK,IAAI,EAAG;AACrD,cAAI,KAAK,UAAU,CAAC,KAAK,OAAO,EAAE,IAAI,EAAG;AACzC,gBAAM,IAAU,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC;AACpF,gBAAM,IAAI,KAAK,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACrC,cAAI,IAAI,MAAO;AACf,gBAAM,MAAM,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AAC3F,gBAAM,QAAQ,KAAK,KAAK,GAAG;AAC3B,cAAI,QAAQ,KAAM;AAClB,gBAAM,QAAS,QAAQ,OAAQ,MAAO,IAAI,QAAS;AACnD,cAAI,QAAQ,WAAW;AACrB,wBAAY;AACZ,mBAAO,EAAE;AAAA,UACX;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,aAAS,IAAI,gBAAwB,QAAgB,eAAwB;AAC3E,UAAI,QAA2E;AAC/E,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,YAAI,CAAC,eAAe,WAAW,EAAE,KAAK,GAAG,EAAG;AAC5C,cAAM,QAAQ,eAAe,MAAM,EAAE,GAAG,SAAS,CAAC;AAClD,YAAI,CAAC,EAAE,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,EAAG;AACjD,gBAAQ,gBAAgB,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,OAAO,KAAK,KAAK;AAC/D,YAAI,MAAO;AAAA,MACb;AACA,UAAI,CAAC,MAAO,QAAO;AACnB,UAAI,CAAC,eAAe,MAAM,IAAI,EAAG,QAAO;AACxC,UAAI,QAAQ,cAAc,MAAM,MAAM,KAAK,MAAM,MAAO,QAAO;AAC/D,aAAO,QAAQ,MAAM,GAAG,MAAM,KAAK,QAAQ,KAAK;AAAA,IAClD;AAEA,aAAS,QAAQ,GAAa,GAA8B,OAAwB;AAClF,cAAQ,EAAE,IAAI;AAAA,QACZ,KAAK,eAAe;AAClB,gBAAM,IAAI,EAAE,MAAM,IAAI,EAAE,IAAI;AAC5B,cAAI,CAAC,KAAK,MAAM,GAAG,CAAC,EAAG,QAAO;AAC9B,wBAAc,GAAG,EAAE,MAAM,aAAa,CAAC,IAAI,IAAI,CAAC;AAChD,iBAAO;AAAA,QACT;AAAA,QACA,KAAK,kBAAkB;AACrB,gBAAM,IAAI,YAAY,GAAG,EAAE,SAAS;AACpC,cAAI,CAAC,EAAG,QAAO;AACf,cAAI,EAAE,OAAQ,QAAO,QAAQ,GAAG,EAAE,IAAI,eAAe,MAAM,EAAE,OAAO,GAAG,KAAK;AAC5E,eAAK,EAAE,MAAM,aAAa,QAAQ,EAAE,IAAI,WAAW,EAAE,IAAI,MAAM,KAAK,CAAC;AACrE,iBAAO;AAAA,QACT;AAAA,QACA,KAAK,QAAQ;AACX,cAAI,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,EAAG,QAAO;AAC3C,gBAAM,OAAO,EAAE,SAAS,IAAI,EAAE,SAAS;AACvC,cAAI,CAAC,KAAM,QAAO;AAClB,gBAAM,OAAO,EAAE,QAAQ,KAAK,UAAU,CAAC,MAAM,MAAM,IAAI;AACvD,cAAI,OAAO,KAAK,CAAC,KAAK,IAAI,GAAG;AAC3B,oBAAQ,OAAO;AACf,mBAAO;AAAA,UACT;AACA,iBAAO,KAAK,EAAE,IAAI,EAAE,WAAW,MAAM,KAAK,MAAM;AAAA,QAClD;AAAA,QACA,KAAK,QAAQ;AACX,cAAI,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,EAAG,QAAO;AAC3C,gBAAM,QAAQ,EAAE,SAAS,IAAI,EAAE,SAAS,IAAI,EAAE,IAAI;AAClD,cAAI,CAAC,OAAO;AACV,oBAAQ,OAAO;AACf,mBAAO;AAAA,UACT;AACA,gBAAM,MAAM,OAAO,MAAM,MAAM,SAAS,WAAW,MAAM,KAAK,OAAO;AACrE,cAAI,CAAC,IAAK,QAAO;AACjB,kBAAQ,GAAG;AACX,iBAAO;AAAA,QACT;AAAA,QACA,KAAK,iBAAiB;AACpB,gBAAM,IAAI,EAAE,QAAQ,IAAI,EAAE,MAAM;AAChC,cAAI,CAAC,EAAG,QAAO;AACf,sBAAY,GAAG,GAAG,CAAC,EAAE,EAAE;AACvB,iBAAO;AAAA,QACT;AAAA,QACA,KAAK,gBAAgB;AACnB,gBAAM,IAAI,EAAE,QAAQ,IAAI,EAAE,MAAM;AAChC,cAAI,CAAC,KAAK,CAAC,EAAE,GAAI,QAAO;AACxB,cAAI,CAAC,cAAc,GAAG,CAAC,GAAG;AACxB,oBAAQ,UAAU;AAClB,mBAAO;AAAA,UACT;AACA,YAAE,WAAW,EAAE,UAAU,KAAK,KAAK,IAAI,GAAG,EAAE,KAAK,YAAY,CAAC;AAC9D,eAAK,EAAE,MAAM,UAAU,QAAQ,EAAE,IAAI,QAAQ,EAAE,KAAK,IAAI,IAAI,MAAM,SAAS,MAAM,SAAS,EAAE,QAAQ,CAAC;AACrG,iBAAO;AAAA,QACT;AAAA,QACA,KAAK;AACH,iBAAO,aAAa,GAAG,EAAE,MAAM;AAAA,QACjC,KAAK,kBAAkB;AACrB,gBAAM,SAAS,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE,IAAI,IAAI;AAC9C,cAAI,UAAU,MAAM,GAAG,MAAM,EAAG,QAAO;AACvC,gBAAM,KAAK,CAAC,QAAQ,EAAE,OAAO;AAC7B,cAAI,EAAE,KAAM,eAAc,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAC/C,gBAAM,MAAM,WAAW,EAAE,SAAS,EAAE;AACpC,iBAAO;AAAA,QACT;AAAA,QACA,KAAK;AACH,iBAAO,cAAc,GAAG,EAAE,OAAO;AAAA,QACnC,KAAK;AACH,iBAAO,aAAa,GAAG,EAAE,MAAM;AAAA,QACjC,KAAK;AACH,iBAAO,OAAO,GAAG,EAAE,MAAM;AAAA,QAC3B,KAAK;AACH,iBAAO,WAAW,GAAG,EAAE,IAAI;AAAA,QAC7B,KAAK,OAAO;AACV,gBAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,cAAI,QAAQ,KAAK,WAAW,EAAE,MAAM,KAAK,SAAS,EAAE,MAAM;AACxD,kBAAM,KAAK;AACX,mBAAO;AAAA,UACT;AACA,iBAAO,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAGA,aAAS,WAA4B;AACnC,YAAM,MAAuB,CAAC;AAC9B,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,mBAAW,KAAK,EAAE,KAAK,YAAY,CAAC,GAAG;AACrC,cAAI,YAAY;AAChB,gBAAM,IAAI,EAAE,QAAQ,IAAI,EAAE,MAAM;AAChC,gBAAM,KAAK,EAAE,SAAS,IAAI,EAAE,MAAM;AAClC,gBAAM,MAAM,EAAE,QAAQ,IAAI,EAAE,MAAM;AAClC,gBAAM,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM;AACjC,cAAI,GAAG;AACL,kBAAM,MAAM,YAAY,GAAG,CAAC;AAC5B,kBAAM,OAAO,MAAM,MAAM,IAAI,EAAE,QAAQ,IAAI,EAAE,KAAK,UAAU,GAAG,CAAC,IAAI;AACpE,gBAAI,EAAE,IAAK,aAAY,OAAO,OAAO;AAAA,qBAC5B,EAAE,SAAS,WAAW,EAAE,QAAQ,EAAG,aAAY,OAAO,EAAE,QAAQ;AAAA,UAC3E,WAAW,IAAI;AACb,gBAAI,GAAG,MAAM,GAAG,QAAS,aAAY,GAAG;AAAA,UAC1C,WAAW,KAAK;AACd,gBAAI,IAAI,MAAM,cAAc,GAAG,GAAG,EAAG,aAAY;AAAA,UACnD,WAAW,MAAM;AACf,kBAAM,MAAM,CAAC,GAAG,EAAE,QAAQ,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO,YAAY,GAAG,EAAE,GAAG,MAAM,IAAI;AACzF,gBAAI,IAAK,aAAY,OAAO,OAAO,MAAM,KAAK,QAAQ,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,UAChF;AACA,cAAI,aAAa,EAAG;AACpB,gBAAM,MAAM,KAAK,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,OAAO,UAAU,EAAE;AAC1D,cAAI,KAAK,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,GAAG,QAAQ,EAAE,IAAI,MAAM,EAAE,MAAM,KAAK,QAAQ,GAAG,EAAE,GAAG,GAAG,KAAK,MAAM,EAAE,QAAQ,KAAK,GAAI,EAAE,UAAU,SAAY,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,GAAI,WAAW,MAAM,WAAW,GAAG,CAAC,EAAE,CAAC;AAAA,QACtM;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,aAAS,QAAQ,KAAW,cAAc,IAAI,QAAQ,GAAG;AACvD,YAAM,MAAiG,CAAC;AACxG,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,mBAAW,KAAK,EAAE,KAAK,WAAW,CAAC,GAAG;AACpC,gBAAM,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC;AACxD,gBAAM,IAAI,UAAU,GAAG,EAAE,IAAI;AAC7B,gBAAM,KAAK,KAAK,EAAE,UAAU,IAAI,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1E,gBAAM,SAAS,KAAK,IAAI,EAAE,OAAO,UAAU,EAAE;AAC7C,gBAAM,MAAM,KAAK,MAAM,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK;AAC3D,gBAAM,IAAU,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,GAAG;AAClE,gBAAM,KAAW,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;AAC5E,cAAI,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,EAAG;AACrD,gBAAM,WAAW,KAAK,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AAC/C,cAAI,WAAW,YAAa;AAC5B,cAAI,KAAK,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,GAAG,QAAQ,QAAQ,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,SAAS,CAAC;AAAA,QAC5E;AAAA,MACF;AACA,aAAO,IAAI,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK;AAAA,IACnE;AAEA,aAAS,UAAU,OAAwB,CAAC,GAAoB;AAC9D,YAAM,MAAuB,CAAC;AAC9B,YAAM,QAAyB,CAAC;AAChC,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,cAAM,KAAK,EAAE,OAAO;AACpB,mBAAW,KAAK,EAAE,KAAK,aAAa,CAAC,GAAG;AACtC,cAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,IAAI,EAAE,IAAI,GAAG,KAAK,KAAK,IAAK;AACpE,cAAI,QAAQ;AACZ,cAAI,EAAE,MAAM;AACV,kBAAM,IAAI,UAAU,GAAG,EAAE,IAAI;AAC7B,gBAAI,KAAK,EAAE,UAAU,KAAK,KAAK,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,IAAK,SAAQ,EAAE,QAAQ,KAAK,KAAK,EAAE,KAAK,CAAC,CAAC;AAAA,UAC7F;AACA,gBAAM,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC;AACvD,WAAC,EAAE,OAAO,MAAM,OAAO,KAAK;AAAA,YAC3B,IAAI,IAAI,GAAG,EAAE,EAAE;AAAA,YACf,QAAQ,EAAE;AAAA,YACV,IAAI,OAAO,CAAC;AAAA,YACZ,IAAI,OAAO,CAAC;AAAA,YACZ,IAAI,EAAE,KAAK,CAAC;AAAA,YACZ,IAAI,EAAE,KAAK,CAAC;AAAA,YACZ,IAAI,GAAG,MAAM,EAAE,MAAM,KAAK;AAAA,YAC1B,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;AAAA,YACxB,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,KAAK,MAAO,QAAO,CAAC,GAAG,eAAe,OAAO,EAAE,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,CAAC,GAAG,GAAG,GAAG;AAC9F,aAAO,CAAC,GAAG,OAAO,GAAG,GAAG;AAAA,IAC1B;AAGA,aAAS,OAAO,IAAkB;AAChC,UAAI,EAAE,KAAK,GAAI;AACf,cAAQ;AACR,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,mBAAW,KAAK,EAAE,MAAM,OAAO,GAAG;AAChC,cAAI,EAAE,MAAM,EAAE,OAAQ;AACtB,cAAI,MAAM,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAG;AACnC,gBAAM,QAAQ,EAAE,KAAK,OAAO,SAAS,OAAO;AAC5C,gBAAM,OAAO,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI;AAC5F,iBAAO,GAAG,GAAG,IAAI;AACjB,cAAI,SAAS,EAAE,OAAQ,MAAK,EAAE,MAAM,QAAQ,QAAQ,EAAE,IAAI,MAAM,EAAE,KAAK,IAAI,GAAG,MAAM,QAAQ,EAAE,OAAO,CAAC;AAAA,QACxG;AAAA,MACF;AACA,eAAS,EAAE;AACX,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,mBAAW,KAAK,EAAE,QAAQ,OAAO,GAAG;AAClC,cAAI,EAAE,KAAK;AACT,kBAAM,MAAM,YAAY,GAAG,CAAC;AAC5B,gBAAI,CAAC,OAAO,CAAC,UAAU,IAAI,GAAG,IAAI,CAAC,GAAG;AACpC,yBAAW,GAAG,GAAG,CAAC,CAAC,EAAE,KAAK,aAAa;AAAA,YACzC,OAAO;AACL,kBAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,OAAO,EAAE;AACxD,kBAAI,IAAI,EAAE,SAAS,EAAG,YAAW,GAAG,GAAG,CAAC,CAAC,EAAE,KAAK,aAAa;AAAA,YAC/D;AAAA,UACF,WAAW,EAAE,MAAM,CAAC,EAAE,KAAK,iBAAiB,QAAQ,GAAG,YAAY,GAAG,CAAC,CAAC,GAAG;AAEzE,cAAE,MAAM;AACR,cAAE,QAAQ;AACV,uBAAW,GAAG,CAAC;AAAA,UACjB,WAAW,EAAE,QAAQ,GAAG;AACtB,cAAE,QAAQ,KAAK,IAAI,GAAG,EAAE,QAAQ,EAAE;AAAA,UACpC;AAAA,QACF;AACA,YAAI,OAAO,GAAG;AACZ,qBAAW,MAAM,EAAE,MAAM,OAAO,GAAG;AACjC,gBAAI,GAAG,KAAK,SAAU,IAAG,QAAQ,KAAK,IAAI,GAAG,KAAK,UAAU,GAAG,QAAU,OAAO,GAAG,KAAK,WAAY,OAAQ,EAAE;AAAA,UAChH;AAAA,QACF;AACA,mBAAW,MAAM,EAAE,MAAM,OAAO,GAAG;AACjC,gBAAM,KAAK,EAAE,GAAG,IAAI,GAAG,KAAK,EAAE;AAC9B,cAAI,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG;AACxC,kBAAM,OAAO,MAAM,OAAO,IAAI,GAAG,KAAK,GAAG;AACzC,eAAG,QAAQ,KAAK,IAAI,GAAG,GAAG,QAAQ,OAAO,EAAE;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AACA,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,mBAAW,KAAK,EAAE,QAAQ,OAAO,GAAG;AAClC,gBAAM,KAAK,EAAE,KAAK,UAAU,EAAE,SAAS,IAAI,EAAE,KAAK,OAAO,IAAI;AAC7D,cAAI,CAAC,GAAI;AACT,gBAAM,MAAM,EAAE,MAAM,cAAc,GAAG,CAAC;AACtC,cAAI,GAAG,OAAO,IAAK;AACnB,aAAG,KAAK;AACR,cAAI,CAAC,KAAK;AACR,eAAG,UAAU;AACb,eAAG,OAAO;AACV,wBAAY,GAAG,EAAE;AAAA,UACnB;AAAA,QACF;AACA,mBAAW,MAAM,EAAE,SAAS,OAAO,EAAG,aAAY,GAAG,IAAI,EAAE;AAAA,MAC7D;AAAA,IACF;AAGA,aAAS,IAAI,IAAY,MAAkB,WAAmC;AAC5E,UAAI,KAAK,IAAI,EAAE,EAAG,OAAM,IAAI,MAAM,WAAW,EAAE,kBAAkB;AACjE,YAAM,MAAmB,EAAE,IAAI,MAAM,WAAW,EAAE,GAAG,UAAU,GAAG,OAAO,CAAC,EAAE;AAC5E,YAAM,IAAc;AAAA,QAClB;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA,OAAO,oBAAI,IAAI;AAAA,QACf,UAAU,oBAAI,IAAI;AAAA,QAClB,SAAS,oBAAI,IAAI;AAAA,QACjB,OAAO,oBAAI,IAAI;AAAA,QACf,SAAS,oBAAI,IAAI;AAAA,QACjB,OAAO,oBAAI,IAAI;AAAA,QACf,UAAU,oBAAI,IAAI;AAAA,QAClB,MAAM,oBAAI,IAAI;AAAA,QACd,IAAI,oBAAI,IAAI;AAAA,QACZ,cAAc,KAAK,gBAAgB,mBAAmB,IAAI;AAAA,MAC5D;AACA,iBAAW,KAAK,KAAK,SAAS,CAAC,GAAG;AAChC,cAAM,KAAK,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;AAChC,UAAE,MAAM,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;AACzD,YAAI,MAAM,EAAE,EAAE,IAAI;AAAA,MACpB;AACA,iBAAW,KAAK,KAAK,cAAc,CAAC,GAAG;AACrC,YAAI;AACJ,YAAI,EAAE,SAAU,QAAO,EAAE,MAAM,IAAI,CAAC,GAAG,MAAM,WAAW,EAAE,WAAW,CAAC,KAAK,IAAI,CAAC;AAAA,iBACvE,EAAE,KAAM,QAAO,aAAa,QAAQ,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,QAAQ,KAAK;AAAA,YACrG,QAAO,EAAE,MAAM,IAAI,MAAM,IAAI;AAClC,UAAE,SAAS,IAAI,EAAE,IAAI,IAAI;AAAA,MAC3B;AACA,iBAAW,KAAK,KAAK,WAAW,CAAC,GAAG;AAClC,UAAE,QAAQ,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,SAAS,EAAE,CAAC;AACvD,YAAI,EAAE,MAAM,EAAE,MAAM;AAClB,gBAAM,IAAI,EAAE,MAAM,IAAI,EAAE,IAAI;AAC5B,cAAI,GAAG;AACL,cAAE,SAAS,EAAE;AACb,mBAAO,GAAG,GAAG,EAAE,IAAI;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AACA,iBAAW,KAAK,KAAK,SAAS,CAAC,EAAG,GAAE,MAAM,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,EAAE,QAAQ,EAAE,CAAC;AACnH,iBAAW,KAAK,KAAK,WAAW,CAAC,EAAG,GAAE,QAAQ,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,OAAO,KAAK,OAAO,OAAO,EAAE,CAAC;AACpG,iBAAW,MAAM,KAAK,SAAS,CAAC,EAAG,GAAE,MAAM,IAAI,GAAG,IAAI,EAAE,MAAM,IAAI,OAAO,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,GAAG,QAAQ,EAAE,CAAC;AACzH,iBAAW,KAAK,KAAK,YAAY,CAAC,EAAG,GAAE,SAAS,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,OAAO,SAAS,OAAO,MAAM,GAAG,OAAO,EAAE,CAAC;AACnH,UAAI,IAAI;AACR,iBAAW,KAAK,KAAK,QAAQ,CAAC,GAAG;AAC/B,UAAE,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,OAAQ,MAAM,YAAa,KAAK,KAAK,GAAG,CAAC;AAAA,MACrG;AACA,iBAAW,KAAK,KAAK,UAAU,CAAC,EAAG,GAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,GAAG,CAAC;AAC7E,WAAK,IAAI,IAAI,CAAC;AACd,UAAI,CAAC,uBAAuB,gBAAgB,QAAQ,EAAE,MAAM,KAAM,eAAc,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;AAC7G,mBAAa;AACb,aAAO;AAAA,IACT;AAEA,aAAS,OAAO,IAAkB;AAChC,YAAM,IAAI,KAAK,IAAI,EAAE;AACrB,UAAI,CAAC,EAAG;AACR,iBAAW,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,EAAG,KAAI,EAAE,WAAW,GAAI,OAAM,OAAO,KAAK;AAC5E,WAAK,OAAO,EAAE;AACd,UAAI,eAAe,YAAY,WAAW,KAAK,GAAG,EAAG,eAAc;AACnE,mBAAa;AAAA,IACf;AAGA,aAAS,YAAwB;AAC/B,YAAM,UAAiC,CAAC;AACxC,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC7B,gBAAQ,EAAE,EAAE,IAAI;AAAA,UACd,OAAO,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAA,UAChE,UAAU,OAAO,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC;AAAA,UACpF,SAAS,OAAO,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAAA,UACjG,OAAO,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,MAAM,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,UACtG,SAAS,OAAO,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAAA,UACzF,OAAO,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;AAAA,UACtE,UAAU,OAAO,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAAA,UACvE,IAAI,OAAO,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAAA,QAC7D;AAAA,MACF;AACA,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,UAAU,OAAO,YAAY,QAAQ;AAAA,QACrC,OAAO,OAAO,YAAY,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAAA,QAC7F;AAAA,MACF;AAAA,IACF;AAEA,aAAS,KAAK,OAAyB;AACrC,iBAAW,CAAC,IAAI,EAAE,KAAK,OAAO,QAAQ,MAAM,OAAO,GAAG;AACpD,cAAM,IAAI,KAAK,IAAI,EAAE;AACrB,YAAI,CAAC,EAAG;AACR,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,KAAK,GAAG;AAC7C,gBAAM,IAAI,EAAE,MAAM,IAAI,CAAC;AACvB,cAAI,GAAG;AAEL,cAAE,SAAS,MAAM,GAAG,GAAG,EAAE,IAAI;AAC7B,mBAAO,GAAG,GAAG,EAAE,MAAM;AAAA,UACvB;AAAA,QACF;AACA,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,QAAQ,GAAG;AAChD,gBAAM,IAAI,YAAY,GAAG,CAAC;AAC1B,cAAI,EAAG,GAAE,SAAS,IAAI,GAAG,EAAE,MAAM,IAAI,CAAC,GAAG,MAAM,WAAW,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;AAAA,QAC1E;AACA,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,OAAO,GAAG;AAC/C,gBAAM,IAAI,EAAE,QAAQ,IAAI,CAAC;AACzB,cAAI,GAAG;AACL,cAAE,KAAK,EAAE;AACT,cAAE,UAAU,EAAE;AAAA,UAChB;AAAA,QACF;AACA,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,KAAK,GAAG;AAC7C,gBAAM,IAAI,EAAE,MAAM,IAAI,CAAC;AACvB,cAAI,EAAG,GAAE,QAAQ,EAAE;AAAA,QACrB;AACA,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,OAAO,GAAG;AAC/C,gBAAM,IAAI,EAAE,QAAQ,IAAI,CAAC;AACzB,cAAI,GAAG;AACL,cAAE,KAAK,EAAE;AACT,cAAE,MAAM,EAAE;AACV,cAAE,QAAQ;AAAA,UACZ;AAAA,QACF;AACA,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,KAAK,GAAG;AAC7C,gBAAM,KAAK,EAAE,MAAM,IAAI,CAAC;AACxB,cAAI,GAAI,IAAG,QAAQ;AAAA,QACrB;AACA,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,QAAQ,GAAG;AAChD,gBAAM,IAAI,EAAE,SAAS,IAAI,CAAC;AAC1B,cAAI,GAAG;AACL,cAAE,KAAK;AACP,cAAE,UAAU;AACZ,cAAE,OAAO;AACT,cAAE,QAAQ,KAAK,EAAE,KAAK,SAAS,UAAU,gBAAgB;AAAA,UAC3D;AAAA,QACF;AACA,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,EAAE,GAAG;AAC1C,gBAAM,IAAI,EAAE,GAAG,IAAI,CAAC;AACpB,cAAI,EAAG,GAAE,KAAK;AAAA,QAChB;AAAA,MACF;AACA,aAAO,MAAM;AACb,eAAS,MAAM;AACf,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,QAAQ,EAAG,UAAS,IAAI,GAAG,CAAC;AACtE,YAAM,MAAM;AACZ,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,KAAK,EAAG,KAAI,KAAK,IAAI,EAAE,MAAM,EAAG,OAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,QAAQ,MAAM,EAAE,KAAK,CAAC;AACzH,oBAAc,MAAM;AACpB,4BAAsB;AAAA,IACxB;AAGA,UAAM,QAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,GAAG;AAAA,MAC3B,SAAS,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,MACrD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,CAAC,UAAU,WAAW,KAAK,IAAI,QAAQ,GAAG,MAAM,IAAI,MAAM,GAAG,KAAK;AAAA,MACzE;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,CAAC,UAAU,QAAQ,SAAS,YAAY;AAC/C,cAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,YAAI,EAAG,eAAc,GAAG,QAAQ,SAAS,OAAO;AAAA,MAClD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,IAAI,OAAO;AACT,iBAAO;AAAA,QACT;AAAA,QACA,IAAI,KAAK,IAAa;AACpB,gBAAM,MAAM,QAAQ,EAAE;AAAA,QACxB;AAAA,QACA,QAAQ,IAAI;AACV,cAAI,OAAO,KAAM;AACjB,gBAAM,SAAS,cAAc;AAC7B,iBAAO;AACP,eAAK,EAAE,MAAM,SAAS,KAAK,CAAC;AAC5B,2BAAiB,MAAM;AAAA,QACzB;AAAA,QACA,WAAW,SAAS,IAAI;AACtB,cAAI,QAAQ,OAAO,MAAM,IAAI;AAC3B,qBAAS,IAAI,SAAS,EAAE;AACxB;AAAA,UACF;AACA,gBAAM,SAAS,cAAc;AAC7B,mBAAS,IAAI,SAAS,EAAE;AACxB,2BAAiB,MAAM;AAAA,QACzB;AAAA,QACA;AAAA,QACA,WAAW,CAAC,UAAU,aAAa;AACjC,gBAAM,IAAI,UAAU,UAAU,QAAQ;AACtC,iBAAO,IAAI,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;AAAA,QACvC;AAAA,QACA,MAAM,CAAC,UAAU,aAAa,UAAU,UAAU,QAAQ,GAAG,EAAE,MAAM;AAAA,QACrE,aAAa,CAAC,UAAU,aAAa,MAAM,IAAI,GAAG,QAAQ,IAAI,QAAQ,EAAE,KAAK;AAAA,QAC7E,SAAS,CAAC,UAAU,aAAa,UAAU,UAAU,QAAQ,GAAG,EAAE,WAAW;AAAA,MAC/E;AAAA,MACA,WAAW,CAAC,UAAU,WAAW,KAAK,IAAI,QAAQ,GAAG,MAAM,IAAI,MAAM,GAAG,SAAS;AAAA,MACjF,OAAO,CAAC,UAAU,aAAa,KAAK,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,GAAG,OAAO;AAAA,MACjF,OAAO;AAAA,QACL,eAAe,QAAQ;AACrB,wBAAc;AACd,gCAAsB;AAAA,QACxB;AAAA,QACA,MAAM,QAAQ;AACZ,iBAAO,WAAW,QAAQ,CAAC,IAAI,UAAU,GAAG,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,SAAS;AAAA,QAChF;AAAA,QACA,OAAO,QAAQ,QAAQ;AACrB,gBAAM,IAAI,WAAW,QAAQ,CAAC,IAAI,UAAU,GAAG,MAAM,IAAI,KAAK,CAAC;AAC/D,cAAI,CAAC,EAAG,QAAO;AACf,gBAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,EAAE,MAAM,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AACjF,YAAE,MAAM,SAAS;AACjB,iBAAO;AAAA,QACT;AAAA,QACA,QAAQ,IAAI;AACV,iBAAO,KAAK,IAAI,GAAG,EAAE;AAAA,QACvB;AAAA,QACA,WAAW,CAAC,UAAU,cAAc;AAClC,gBAAM,KAAK,KAAK,IAAI,QAAQ,GAAG,SAAS,IAAI,SAAS;AACrD,iBAAO,CAAC,CAAC,MAAM,GAAG,MAAM,GAAG;AAAA,QAC7B;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,CAAC,QAAQ,kBAAkB;AACjC,cAAM,IAAI,MAAM,IAAI,KAAK;AACzB,eAAO,IAAI,EAAE,QAAQ,EAAE,QAAQ,MAAM,EAAE,KAAK,IAAI;AAAA,MAClD;AAAA,MACA;AAAA,MACA,MAAM,CAAC,UAAU,WAAW;AAC1B,cAAM,IAAI,KAAK,IAAI,QAAQ,GAAG,KAAK,IAAI,MAAM;AAC7C,eAAO,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,MACrD;AAAA,MACA,SAAS,CAAC,GAAG,MAAM;AACjB,eAAO,CAAC,GAAG,CAAC;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,CAAC,UAAUA,YAAY,QAAQ,cAAc,OAAQ,KAAK,IAAI,QAAQ,GAAG,GAAG,IAAIA,OAAM,GAAG,MAAM;AAAA,MACnG;AAAA,MACA,WAAW,CAAC,MAAM;AAChB,iBAAS;AACT,gBAAQ,eAAe,QAAQ,QAAQ,OAAO;AAAA,MAChD;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;","names":["target","add","local","volume","pos","destroyed"]}
|