@open-slot-ui/pixi 0.12.0 → 0.13.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/views/PopoverView.ts","../src/views/PanelView.ts","../src/views/PanelBodyView.ts","../src/infoMenu.ts","../src/mountHud.ts","../src/buyFeatureModal.ts","../src/bootError.ts"],"names":["Graphics","Container","esc","host","vars","renderBlocks","opts","on","GAP","Text","Rectangle","formatAmountPrecise"],"mappings":"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","file":"index.js","sourcesContent":["import { type Ticker, type Texture } from 'pixi.js';\nimport { type PanelControl, type SliderControl, type ButtonControl, type OpenUI } from '@open-slot-ui/core';\nimport { ControlView } from './ControlView';\nimport { SliderView } from './SliderView';\nimport { ButtonView } from './ButtonView';\n\nexport interface PopoverParts {\n music: SliderControl;\n sfx: SliderControl;\n rules: ButtonControl;\n}\n\nexport interface PopoverArt {\n rulesTexture?: Texture;\n musicTrack?: Texture;\n soundTrack?: Texture;\n}\n\ninterface FanItem {\n view: ControlView;\n tx: number;\n ty: number;\n prog: number;\n}\n\nconst GAP = 80; // vertical spacing between fanned items (ref px)\nconst RISE = 26; // how far each item rises into place\nconst STAGGER = 38; // ms between pops — snappy \"pop-pop-pop\"\n// slider track is 290x60 @ ~0.9 → its visual centre, used as the scale pivot\nconst SLIDER_PIVOT_X = 130;\nconst SLIDER_PIVOT_Y = 27;\n\n/**\n * The settings flyout as a VERTICAL FAN: on open, the options swoosh up and pop\n * in one-by-one (bottom→top); on close they retract together. Items are\n * right-aligned and rise above the (right-side) menu button. No static panel.\n */\nexport class PopoverView extends ControlView {\n private readonly music: SliderView;\n private readonly sfx: SliderView;\n private readonly rules: ButtonView;\n private readonly items: FanItem[];\n private phase = 0;\n private running = false;\n private readonly tick: (t: Ticker) => void;\n\n constructor(private readonly panel: PanelControl, parts: PopoverParts, ui: OpenUI, private readonly ticker: Ticker, art: PopoverArt = {}) {\n super(panel, ui);\n\n this.rules = new ButtonView(parts.rules, ui, ticker, { shape: 'pill', height: 50, iconTexture: art.rulesTexture, iconTarget: 50 });\n this.music = new SliderView(parts.music, ui, art.musicTrack);\n this.sfx = new SliderView(parts.sfx, ui, art.soundTrack);\n // pivot sliders at their centre so they scale from the middle, not the left edge\n this.music.pivot.set(SLIDER_PIVOT_X, SLIDER_PIVOT_Y);\n this.sfx.pivot.set(SLIDER_PIVOT_X, SLIDER_PIVOT_Y);\n\n // Right-aligned column rising above the button; pop order = bottom → top.\n // tx/ty are the item CENTRES (rules ButtonView is already centre-origin).\n this.items = [\n { view: this.sfx, tx: -130, ty: -GAP, prog: 0 },\n { view: this.music, tx: -130, ty: -GAP * 2, prog: 0 },\n { view: this.rules, tx: -132, ty: -GAP * 3, prog: 0 },\n ];\n for (const it of this.items) {\n it.view.position.set(it.tx, it.ty);\n it.view.scale.set(0);\n it.view.alpha = 0;\n it.view.visible = false;\n this.addChild(it.view);\n }\n\n this.tick = (t) => this.update(t.deltaMS);\n this.applyState();\n this.disposers.push(this.panel.state.subscribe(() => this.applyState()));\n }\n\n private applyState(): void {\n this.phase = 0;\n const open = this.panel.isOpen;\n this.eventMode = open ? 'auto' : 'none';\n if (open) for (const it of this.items) it.view.visible = true;\n if (!this.running) {\n this.running = true;\n this.ticker.add(this.tick);\n }\n }\n\n private update(dt: number): void {\n this.phase += Math.min(dt, 40); // cap stalls so the stagger never gets skipped\n const open = this.panel.isOpen;\n const finalTarget = open ? 1 : 0;\n let settled = true;\n for (let i = 0; i < this.items.length; i++) {\n const it = this.items[i]!;\n const target = open && this.phase > i * STAGGER ? 1 : 0; // staggered easing target\n it.prog += (target - it.prog) * Math.min(1, dt / (open ? 50 : 80));\n const s = it.prog;\n it.view.scale.set(s);\n it.view.alpha = Math.min(1, s * 1.5);\n it.view.position.set(it.tx, it.ty + (1 - s) * RISE);\n it.view.visible = s > 0.01;\n // settle against the FINAL target so the loop keeps running until every item arrives\n if (Math.abs(it.prog - finalTarget) > 0.01) settled = false;\n }\n if (settled) {\n this.running = false;\n this.ticker.remove(this.tick);\n }\n }\n\n override dispose(): void {\n if (this.running) {\n this.ticker.remove(this.tick);\n this.running = false;\n }\n this.music.dispose();\n this.sfx.dispose();\n this.rules.dispose();\n super.dispose();\n }\n}\n","import { Container, Graphics, Text, Rectangle, type Texture, type FederatedPointerEvent, type Ticker } from 'pixi.js';\nimport { type PanelControl, type ButtonControl, type OpenUI, type ScreenState, type Theme } from '@open-slot-ui/core';\nimport { ControlView } from './ControlView';\nimport { ButtonView } from './ButtonView';\n\nexport type InfoContentBuilder = (theme: Theme, width: number) => Container;\n\nexport interface PanelViewOptions {\n closeTexture?: Texture;\n content?: InfoContentBuilder;\n}\n\n// The modal is an intentionally LIGHT surface (per the design), distinct from the dark HUD theme.\nconst INK = 0x15171c;\nconst CARD = 0xffffff;\nconst HEADER_BG = 0x20242b;\nconst PAD = 16;\nconst HEADER_H = 56;\nconst MAX_W = 600;\n\n/**\n * Full-screen modal: dim backdrop + dark header (title + ✕ close) + a white,\n * scrollable content card. Content is built dynamically (so it scrolls and is\n * data-driven). Faithful to the provided Mobile Rules design.\n */\nexport class PanelView extends ControlView {\n private readonly backdrop = new Graphics();\n private readonly card = new Graphics();\n private readonly headerBg = new Graphics();\n private readonly title: Text;\n private readonly viewport = new Container();\n private readonly maskG = new Graphics();\n private readonly catcher = new Graphics();\n private readonly close: ButtonView;\n private content: Container | undefined;\n private builtWidth = -1;\n private scrollY = 0;\n private contentH = 0;\n private viewportH = 0;\n private dragging = false;\n private lastY = 0;\n private wheelHandler: ((e: WheelEvent) => void) | undefined;\n\n constructor(\n private readonly panel: PanelControl,\n closeBtn: ButtonControl,\n ui: OpenUI,\n ticker: Ticker,\n private readonly opts: PanelViewOptions = {},\n ) {\n super(panel, ui);\n this.zIndex = 100;\n\n this.backdrop.eventMode = 'static';\n this.backdrop.on('pointertap', () => this.panel.closePanel());\n\n this.title = new Text({\n text: panel.title ?? '',\n style: { fontFamily: ui.theme.type.family, fontSize: 22, fill: 0xffffff, fontWeight: '800', letterSpacing: 1 },\n });\n this.title.anchor.set(0.5);\n\n this.viewport.mask = this.maskG;\n this.catcher.eventMode = 'static';\n this.catcher.on('pointerdown', this.onDown);\n this.catcher.on('globalpointermove', this.onMove);\n this.catcher.on('pointerup', this.onUp);\n this.catcher.on('pointerupoutside', this.onUp);\n\n this.close = new ButtonView(closeBtn, ui, ticker, { iconTexture: opts.closeTexture, iconTarget: 44, glyph: 'close', radius: 24 });\n\n this.addChild(this.backdrop, this.card, this.viewport, this.maskG, this.catcher, this.headerBg, this.title, this.close);\n\n this.applyOpen(this.panel.isOpen);\n this.disposers.push(this.panel.state.subscribe(() => this.applyOpen(this.panel.isOpen)));\n }\n\n override applyLayout(screen: ScreenState): void {\n const W = screen.width;\n const H = screen.height;\n this.position.set(0, 0);\n this.scale.set(1);\n\n this.backdrop.clear().rect(0, 0, W, H).fill({ color: 0x000000, alpha: 0.6 });\n this.backdrop.hitArea = new Rectangle(0, 0, W, H);\n\n const cardW = Math.min(W - PAD * 2, MAX_W);\n const cx = (W - cardW) / 2;\n const hy = PAD;\n this.headerBg.clear().roundRect(cx, hy, cardW, HEADER_H, HEADER_H / 2).fill({ color: HEADER_BG });\n this.title.position.set(W / 2, hy + HEADER_H / 2);\n this.close.position.set(cx + cardW - HEADER_H / 2, hy + HEADER_H / 2);\n\n const cardY = hy + HEADER_H + 12;\n const cardH = H - cardY - PAD;\n this.card.clear().roundRect(cx, cardY, cardW, cardH, 22).fill({ color: CARD });\n\n const inset = 20;\n const vpX = cx + inset;\n const vpY = cardY + inset;\n const vpW = cardW - inset * 2;\n const vpH = cardH - inset * 2;\n this.viewport.position.set(vpX, vpY);\n this.viewportH = vpH;\n this.maskG.clear().rect(vpX, vpY, vpW, vpH).fill({ color: 0xffffff });\n this.catcher.clear().rect(vpX, vpY, vpW, vpH).fill({ color: 0xffffff, alpha: 0.0001 });\n\n // (re)build content to the current viewport width\n if (Math.abs(vpW - this.builtWidth) > 1) {\n this.content?.destroy({ children: true });\n this.content = this.opts.content?.(this.ui.theme, vpW) ?? this.fallback(vpW);\n this.viewport.addChild(this.content);\n this.builtWidth = vpW;\n }\n if (this.content) this.content.x = 0;\n this.contentH = this.content?.height ?? 0;\n this.clampScroll();\n }\n\n private fallback(width: number): Container {\n const c = new Container();\n const t = new Text({ text: 'No content provided.', style: { fontFamily: this.ui.theme.type.family, fontSize: 18, fill: INK, wordWrap: true, wordWrapWidth: width } });\n c.addChild(t);\n return c;\n }\n\n private readonly onDown = (e: FederatedPointerEvent): void => {\n this.dragging = true;\n this.lastY = e.global.y;\n };\n private readonly onMove = (e: FederatedPointerEvent): void => {\n if (!this.dragging) return;\n this.scrollY += e.global.y - this.lastY;\n this.lastY = e.global.y;\n this.clampScroll();\n };\n private readonly onUp = (): void => {\n this.dragging = false;\n };\n\n private clampScroll(): void {\n const min = Math.min(0, this.viewportH - this.contentH);\n this.scrollY = Math.max(min, Math.min(0, this.scrollY));\n if (this.content) this.content.y = this.scrollY;\n }\n\n private applyOpen(open: boolean): void {\n this.visible = open;\n this.eventMode = open ? 'static' : 'none';\n this.alpha = open ? 1 : 0;\n if (open) {\n this.scrollY = 0;\n this.clampScroll();\n if (!this.wheelHandler) {\n this.wheelHandler = (e: WheelEvent) => {\n this.scrollY -= e.deltaY;\n this.clampScroll();\n };\n window.addEventListener('wheel', this.wheelHandler, { passive: true });\n }\n } else if (this.wheelHandler) {\n window.removeEventListener('wheel', this.wheelHandler);\n this.wheelHandler = undefined;\n }\n }\n\n override dispose(): void {\n if (this.wheelHandler) window.removeEventListener('wheel', this.wheelHandler);\n this.close.dispose();\n super.dispose();\n }\n}\n","import { Container, Graphics, type Ticker } from 'pixi.js';\nimport { type OpenUI, type PanelControl, type Control, type BlockSpec } from '@open-slot-ui/core';\nimport { ControlView } from './ControlView';\nimport { buildBlockColumn, type ControlViewFactory } from './blockColumn';\n\nexport interface PanelBodyOptions {\n width?: number;\n controlSkins?: Partial<Record<string, ControlViewFactory>>;\n}\n\n/**\n * A small, CENTERED panel body (the settings popover / declarative panels): walks\n * a `BlockSpec[]` via the shared {@link buildBlockColumn} renderer, draws a branded\n * card behind it, and follows the PanelControl's open/closed state. A `modal`\n * variant also gets a dismissable backdrop. Text re-renders on `ui.locale` change.\n * (The big scrollable menu uses {@link MenuView}, which shares the same renderer.)\n */\nexport class PanelBodyView extends ControlView {\n private readonly backdrop = new Graphics();\n private readonly card = new Graphics();\n private readonly content = new Container();\n private childViews: ControlView[] = [];\n private readonly bodyW: number;\n\n constructor(\n private readonly panelControl: PanelControl,\n private readonly controls: Control[],\n private readonly blocks: BlockSpec[],\n ui: OpenUI,\n private readonly ticker: Ticker,\n private readonly opts: PanelBodyOptions = {},\n ) {\n super(panelControl, ui);\n this.bodyW = opts.width ?? 360;\n\n this.addChild(this.backdrop, this.card, this.content);\n this.rebuild();\n this.applyVisibility();\n\n this.disposers.push(\n this.panelControl.state.subscribe(() => this.applyVisibility()),\n this.ui.locale.subscribe(() => {\n if (!this.destroyed) this.rebuild();\n }),\n );\n\n if (this.panelControl.variant === 'modal') {\n this.backdrop.eventMode = 'static';\n this.backdrop.on('pointertap', () => this.panelControl.closePanel());\n }\n }\n\n private rebuild(): void {\n for (const v of this.childViews) v.dispose();\n this.childViews.length = 0;\n // Destroy direct children (wraps/static nodes) WITHOUT children:true so the\n // already-disposed control views aren't re-destroyed (matches the prior code).\n for (const child of this.content.removeChildren()) child.destroy();\n\n const col = buildBlockColumn(this.blocks, this.controls, this.ui, this.ticker, this.bodyW, { controlSkins: this.opts.controlSkins });\n this.childViews = col.views;\n this.content.addChild(...col.content.removeChildren());\n this.content.position.set(0, -col.height / 2);\n this.drawChrome(this.bodyW, col.height);\n }\n\n private drawChrome(width: number, height: number): void {\n const t = this.ui.theme;\n this.card.clear()\n .roundRect(-width / 2, -height / 2, width, height, t.radius.card)\n .fill({ color: t.color.surface })\n .stroke({ width: 3, color: t.color.accent });\n\n this.backdrop.clear();\n if (this.panelControl.variant === 'modal') {\n this.backdrop.rect(-3000, -3000, 6000, 6000).fill({ color: 0x000000, alpha: 0.6 });\n }\n }\n\n private applyVisibility(): void {\n const open = this.panelControl.isOpen;\n this.visible = open;\n this.eventMode = open ? 'auto' : 'none';\n }\n\n override dispose(): void {\n for (const v of this.childViews) v.dispose();\n this.childViews.length = 0;\n super.dispose();\n }\n}\n","// The info menu (☰ → Settings · Paytable · Rules) as the library's ONE polished design:\n// a white card with gold accents + section rules, driven ENTIRELY by the `UISpec.menu`\n// (banner · settings · paytable · rules) and wired to the live `OpenUI` state. It renders\n// the full modular BlockSpec palette, is fully localized (every string flows through\n// `ui.t`, re-translates on locale change), and is a DOM overlay over the canvas (works in\n// every browser + the Stake iframe). `mountHud` mounts it by default; pass `menu:false` to\n// supply your own instead. The look matches the Open-UI Figma reference.\n\nimport type { Application } from 'pixi.js';\nimport {\n INFO_MENU_CSS,\n INFO_MENU_VARS,\n LOCALE_LABELS,\n auditRules,\n escapeHtml as esc,\n factsVars,\n renderBlocksHtml as renderBlocks,\n renderRulesAuditHtml,\n type BlockSpec,\n type MenuSpec,\n type OpenUI,\n} from '@open-slot-ui/core';\n\n// The block renderer + the stylesheet live in CORE (`spec/rulesHtml.ts`) so the\n// SAME code that draws this menu in-game powers external tooling (the stakeplate\n// rules editor's WYSIWYG preview) — one source of truth for how a block looks.\n/* removed local renderBlocks — see @open-slot-ui/core renderBlocksHtml */\n/** Render the game's extra settings blocks (label-left / control-right, with a hint). */\nfunction renderSettingBlock(b: BlockSpec, tr: (s: string) => string): string {\n const hint = 'hint' in b && b.hint ? `<div class=\"ohm-hint\">${esc(tr(b.hint))}</div>` : '';\n const label = 'label' in b && b.label ? esc(tr(b.label)) : '';\n switch (b.kind) {\n case 'toggle':\n return `<div class=\"ohm-setting\"><label class=\"ohm-row ohm-check\"><span>${label}</span><span class=\"ohm-ctl\"><input data-set=\"${b.id}\" type=\"checkbox\"${b.on ? ' checked' : ''}></span></label>${hint}</div>`;\n case 'slider':\n return `<div class=\"ohm-setting\"><label class=\"ohm-row\"><span>${label}</span><input data-set=\"${b.id}\" type=\"range\" min=\"0\" max=\"1\" step=\"0.01\" value=\"${b.initial ?? 1}\"></label>${hint}</div>`;\n case 'select': {\n const opts = b.options.map((o, i) => `<option value=\"${esc(o.value)}\"${i === (b.index ?? 0) ? ' selected' : ''}>${esc(tr(o.label))}</option>`).join('');\n return `<div class=\"ohm-setting\"><label class=\"ohm-row\"><span>${label}</span><select data-set=\"${b.id}\">${opts}</select></label>${hint}</div>`;\n }\n default:\n return '';\n }\n}\n\n/**\n * Mount the info menu overlay for a booted `OpenUI`. Reads `ui.spec.menu`; opens/closes with\n * `ui.settingsPanel` (the canvas ☰ drives it). Returns a leak-free teardown.\n */\nexport function mountInfoMenu(app: Application, ui: OpenUI): () => void {\n const menu: MenuSpec = ui.spec?.menu ?? {};\n const tr = (k: string): string => ui.t(k);\n const disposers: Array<() => void> = [];\n\n const host = document.createElement('div');\n host.className = 'ohm-root';\n const vars: Record<string, string> = { ...INFO_MENU_VARS, '--font': ui.theme.type.family };\n for (const [k, v] of Object.entries(vars)) host.style.setProperty(k, v);\n\n // Built-in settings: Sound · Language (2+ locales) · Quick spin (turbo). Plus any custom\n // `menu.settings` the game supplied — all label-left / control-right, each with a hint.\n const locales = ui.spec?.locale ? Array.from(new Set([ui.spec.locale.locale, ...Object.keys(ui.spec.locale.messages)])) : [];\n const langRow = locales.length > 1\n ? `<div class=\"ohm-setting\"><label class=\"ohm-row\"><span>${tr('Language')}</span><select id=\"ohm-lang\">${locales.map((c) => `<option value=\"${c}\"${c === ui.locale.get() ? ' selected' : ''}>${esc(LOCALE_LABELS[c] ?? c)}</option>`).join('')}</select></label></div>`\n : '';\n const turbo = ui.turbo;\n const cap = (m: string): string => m.charAt(0).toUpperCase() + m.slice(1);\n const turboCtl = turbo.modeCount <= 2\n ? `<span class=\"ohm-ctl\"><input id=\"ohm-turbo\" type=\"checkbox\"></span>`\n : `<span class=\"ohm-ctl\"><div class=\"ohm-segmented\" id=\"ohm-turbo-seg\">${turbo.modes.map((m, i) => `<button class=\"ohm-seg\" data-i=\"${i}\">${esc(tr(cap(m)))}</button>`).join('')}</div></span>`;\n const customSettings = (menu.settings ?? []).map((b) => renderSettingBlock(b, tr)).join('');\n\n // Sound config: a toggle only, + a master Volume slider, or + Music & Effects sliders.\n const soundMode = menu.sound ?? 'sliders';\n const volRow = (id: string, label: string, hint: string, val: number): string =>\n `<div class=\"ohm-setting\"><label class=\"ohm-row\"><span>${esc(tr(label))}</span><input class=\"ohm-slider\" data-vol=\"${id}\" type=\"range\" min=\"0\" max=\"1\" step=\"0.01\" value=\"${val}\"></label><div class=\"ohm-hint\">${esc(tr(hint))}</div></div>`;\n const soundSliders =\n soundMode === 'master'\n ? volRow('master', 'Volume', 'Adjust the overall game volume.', ui.sfxSlider.value.get())\n : soundMode === 'sliders'\n ? volRow('music', 'Music', 'Adjust the background music volume.', ui.musicSlider.value.get()) +\n volRow('sfx', 'Effects', 'Adjust the sound-effects volume.', ui.sfxSlider.value.get())\n : '';\n\n // ── rules-completeness audit (\"forgotten declarations\") ─────────────────────\n // The declared game facts (spec.facts + runtime declareFacts — the buy-feature\n // modal auto-declares its features) are audited against the rules blocks. Every\n // missing REQUIRED declaration (a mode's RTP / max win, an undescribed feature)\n // and each HIGHLY RECOMMENDED one (free-spins count + retrigger, legal, controls)\n // renders as an explicit warning card at the top of the Rules section — a\n // forgotten declaration is stated when the rules open, never silent.\n // Rules copy translates WITH the facts interpolation vars: `{{rtp.base}}`-style\n // tokens (see `factsVars`) resolve from the LIVE declared facts + the game info,\n // so a stated RTP / max win / price can never drift from the configuration. The\n // audit resolves through the exact same function — copy is audited AS RENDERED.\n const rulesTr = (): ((s: string) => string) => {\n const vars = factsVars(ui.facts.get(), { 'game.name': ui.gameInfo.name ?? '', 'game.version': ui.gameInfo.version ?? '' });\n return (s: string): string => ui.t(s, vars);\n };\n const auditCardHtml = (trr: (s: string) => string): string => {\n if (!menu.rules?.length) return '';\n return renderRulesAuditHtml(auditRules(ui.facts.get(), menu.rules, { resolve: trr }), tr);\n };\n const rulesInnerHtml = (): string => {\n if (!menu.rules) return '';\n const trr = rulesTr();\n return auditCardHtml(trr) + renderBlocks(menu.rules, trr, ui.facts.get());\n };\n\n const paytableHtml = menu.paytable ? renderBlocks(menu.paytable, tr, ui.facts.get()) : '';\n const rulesHtml = rulesInnerHtml();\n const banner = menu.banner\n ? `<img class=\"ohm-logo\" alt=\"\" src=\"${menu.banner.src}\"${menu.banner.width ? ` width=\"${menu.banner.width}\"` : ''}${menu.banner.height ? ` height=\"${menu.banner.height}\"` : ''}>`\n : ui.gameInfo.name\n ? `<h1 class=\"ohm-logo-text\">${esc(ui.gameInfo.name)}</h1>`\n : '';\n\n host.innerHTML = `\n <div class=\"ohm-backdrop\" data-close></div>\n <button class=\"ohm-x\" data-close aria-label=\"Close\">✕</button>\n <div class=\"ohm-card\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"ohm-body\">\n ${banner}\n <div class=\"ohm-sec\"><span>${tr('Settings')}</span></div>\n <div class=\"ohm-setting\"><label class=\"ohm-row ohm-check\"><span>${tr('Sound')}</span><span class=\"ohm-ctl\"><input id=\"ohm-sound\" type=\"checkbox\" checked></span></label><div class=\"ohm-hint\">${tr('Turn all game sound and music on or off.')}</div></div>\n ${soundSliders}\n ${langRow}\n <div class=\"ohm-setting\"><div class=\"ohm-row ohm-check\"><span>${tr('Quick spin')}</span>${turboCtl}</div><div class=\"ohm-hint\">${tr('Speed up rounds by shortening the animation. The result is identical.')}</div></div>\n ${customSettings}\n ${paytableHtml ? `<div class=\"ohm-sec\"><span>${tr('Paytable')}</span></div>${paytableHtml}` : ''}\n ${rulesHtml ? `<div class=\"ohm-sec\"><span>${tr('Rules')}</span></div><div class=\"ohm-rules\" id=\"ohm-rules\">${rulesHtml}</div>` : ''}\n </div>\n </div>`;\n const style = document.createElement('style');\n style.textContent = INFO_MENU_CSS;\n host.appendChild(style);\n document.body.appendChild(host);\n\n const $ = <T extends Element>(sel: string): T | null => host.querySelector(sel) as T | null;\n\n // Sound → mute state.\n const sound = $<HTMLInputElement>('#ohm-sound');\n if (sound) {\n sound.checked = !ui.muted.get();\n sound.addEventListener('change', () => ui.setMuted(!sound.checked));\n disposers.push(ui.muted.subscribe((m) => { sound.checked = !m; }));\n }\n // Volume sliders → the music / sfx slider controls (which emit valueChanged for the host).\n host.querySelectorAll<HTMLInputElement>('[data-vol]').forEach((el) => {\n const which = el.dataset.vol!;\n el.addEventListener('input', () => {\n const v = Number(el.value);\n if (which === 'music') ui.musicSlider.setNormalized(v);\n else if (which === 'sfx') ui.sfxSlider.setNormalized(v);\n else { ui.musicSlider.setNormalized(v); ui.sfxSlider.setNormalized(v); } // master\n });\n // reflect external changes (e.g. mute drops both to 0, unmute restores).\n const src = which === 'music' ? ui.musicSlider : ui.sfxSlider;\n disposers.push(src.value.subscribe((v) => { el.value = String(v); }));\n });\n // Language.\n const lang = $<HTMLSelectElement>('#ohm-lang');\n if (lang) lang.addEventListener('change', () => ui.setLocale(lang.value));\n // Quick spin → turbo.\n if (turbo.modeCount <= 2) {\n const tg = $<HTMLInputElement>('#ohm-turbo');\n if (tg) {\n tg.checked = turbo.isOn;\n tg.addEventListener('change', () => turbo.set(tg.checked));\n disposers.push(turbo.index.subscribe(() => { tg.checked = turbo.isOn; }));\n }\n } else {\n const segs = Array.from(host.querySelectorAll<HTMLButtonElement>('.ohm-seg'));\n segs.forEach((b) => b.addEventListener('click', () => turbo.setIndex(Number(b.dataset.i))));\n const sync = (): void => segs.forEach((b, i) => b.classList.toggle('active', i === turbo.index.get()));\n disposers.push(turbo.index.subscribe(sync));\n sync();\n }\n // Custom settings → emit events the host can handle.\n host.querySelectorAll<HTMLElement>('[data-set]').forEach((el) => {\n const id = el.dataset.set!;\n if (el instanceof HTMLInputElement && el.type === 'checkbox') el.addEventListener('change', () => ui.bus.emit('toggled', { id, on: el.checked }));\n else if (el instanceof HTMLInputElement && el.type === 'range') el.addEventListener('input', () => ui.bus.emit('valueChanged', { id, value: Number(el.value) }));\n else if (el instanceof HTMLSelectElement) el.addEventListener('change', () => ui.bus.emit('optionSelected', { id, value: el.value, index: el.selectedIndex }));\n });\n\n host.querySelectorAll('[data-close]').forEach((b) => b.addEventListener('click', () => ui.settingsPanel.closePanel()));\n\n // Re-translate the whole menu on locale change (labels + the rules body), and\n // re-audit + re-render the rules whenever the declared game facts change (e.g.\n // the buy-feature modal declaring its features after this menu mounted).\n const refreshRules = (): void => {\n const rulesEl = host.querySelector('#ohm-rules');\n if (rulesEl && menu.rules) rulesEl.innerHTML = rulesInnerHtml();\n };\n disposers.push(\n ui.locale.subscribe(() => {\n const body = host.querySelector('.ohm-body');\n if (body) {\n // simplest robust path: rebuild the localized rules body\n refreshRules();\n if (lang) lang.value = ui.locale.get();\n }\n }),\n ui.facts.subscribe(refreshRules),\n );\n\n // Open/close follows the settings panel state. While open, LOCK the HUD (ref-counted) so\n // pointer/keyboard input can't fall through the menu overlay onto the controls underneath.\n let menuLocked = false;\n disposers.push(\n ui.settingsPanel.state.subscribe(() => {\n const isOpen = ui.settingsPanel.isOpen;\n host.classList.toggle('open', isOpen);\n if (isOpen && !menuLocked) { ui.lock(); menuLocked = true; }\n else if (!isOpen && menuLocked) { ui.unlock(); menuLocked = false; }\n }),\n );\n\n return () => {\n for (const d of disposers.splice(0)) d();\n if (menuLocked) { ui.unlock(); menuLocked = false; } // don't leak the lock on teardown\n host.remove();\n };\n}\n","import { type Application } from 'pixi.js';\nimport {\n createUI,\n buildPanel,\n composeMenu,\n formatAmountPrecise,\n type OpenUI,\n type UISpec,\n type HostHooks,\n type CurrencySpec,\n type EventLog,\n type ControlSnapshot,\n type Signal,\n type OpenUIEvents,\n type Dispose,\n type JurisdictionConfig,\n type BlockSpec,\n type NoticeAction,\n type NoticeOptions,\n type RgsErrorOptions,\n} from '@open-slot-ui/core';\nimport { OpenUIPixi, type OpenUIPixiOptions } from './OpenUIPixi';\nimport { PanelBodyView } from './views/PanelBodyView';\nimport { mountInfoMenu } from './infoMenu';\n\n/** Shared BLOCKING replay modal — the round's facts + one button, non-dismissible\n * (no ✕, no backdrop close; only the button advances). Used for both the start (\"Play\")\n * and the end (\"Replay\") of a replay so it's a strict modal → round → modal loop. */\nfunction showReplayModal(ui: OpenUI, info: ReplayInfo, buttonKey: string, onSelect: () => void): void {\n const cur = info.currency ?? ui.balance.currency.get();\n const money = (n: number): string => formatAmountPrecise(n, cur); // sub-unit replay amounts show in full\n ui.showNotice(\n [\n { kind: 'heading', id: 'openui-replay-h', text: 'openui.replay.title' },\n {\n kind: 'stat-grid',\n id: 'openui-replay-g',\n items: [\n { label: 'openui.replay.baseBet', value: money(info.baseBet) },\n { label: 'openui.replay.costMultiplier', value: `${info.costMultiplier}×` },\n { label: 'openui.replay.payoutMultiplier', value: `${info.payoutMultiplier}×` },\n { label: 'openui.replay.amount', value: money(info.amount) },\n ],\n },\n ],\n [{ label: buttonKey, variant: 'primary', onSelect: () => { ui.hideNotice(); onSelect(); } }],\n { blocking: true },\n );\n}\n\n/** The round facts shown at the start of a replay (Stake \"Replay Support\"). */\nexport interface ReplayInfo {\n /** The base bet (before the mode's cost multiplier). */\n baseBet: number;\n /** The mode's cost multiplier (×), e.g. a 185× bonus buy. */\n costMultiplier: number;\n /** The round's payout multiplier (× the base bet). */\n payoutMultiplier: number;\n /** The final amount the round paid. */\n amount: number;\n /** Currency for the money values (defaults to the balance currency). */\n currency?: CurrencySpec;\n}\n\nexport interface HudOptions extends OpenUIPixiOptions {\n hooks?: HostHooks;\n /**\n * Opt IN to the legacy white **HTML info menu** (a DOM overlay). By default the menu now\n * renders as the in-canvas **Pixi `MenuView`** (Settings · Paytable · Rules, driven by\n * `spec.menu`) so the whole HUD stays on the canvas — no DOM UI. Set `infoMenu: true` to\n * use the old DOM overlay instead. `menu: false` opts out of BOTH (host supplies its own).\n */\n infoMenu?: boolean;\n}\n\n/**\n * The complete-HUD handle returned by `mountHud`. Wraps the headless OpenUI + the\n * Pixi controller with the day-to-day game verbs, so the host rarely touches the\n * lower layers. `dispose()` is the single, leak-free teardown (Charter P12).\n */\nexport interface BootedHud {\n readonly ui: OpenUI;\n readonly pixi: OpenUIPixi;\n on<K extends keyof OpenUIEvents>(type: K, fn: (p: OpenUIEvents[K]) => void): Dispose;\n setBalance(major: number): void;\n setBet(major: number): void;\n /** Set the bonus total-win amount (major units). Shown in the buy-feature slot while\n * the spin button is in free-spins mode (`setFreeSpins(n > 0)`). */\n setTotalWin(major: number): void;\n setCurrency(spec: CurrencySpec): void;\n /** Apply a Stake Engine jurisdiction config (the compliance switchboard) at runtime. */\n applyJurisdiction(jur: JurisdictionConfig): void;\n /** Report a settled round (major units): updates net position + enforces autoplay limits. */\n reportRound(win: number, bet: number): void;\n /** Set the RTP percentage shown by the RTP readout (when `displayRTP`). */\n setRtp(percent: number): void;\n /** Master mute / unmute (music + sfx). */\n setMuted(muted: boolean): void;\n /** Show a menu-style notice modal: declarative blocks + optional action buttons. */\n showNotice(blocks: BlockSpec[], actions?: NoticeAction[]): void;\n /** Show a menu-style error modal — `message`/`opts.title` are literal text OR i18n\n * keys, and `opts.actions` adds custom buttons (e.g. a \"Reload\"). */\n showError(message: string, opts?: NoticeOptions): void;\n /** Show the default (localizable, per-call overridable) message for an RGS status\n * code (e.g. `'ERR_IPB'`, `'ERR_IS'`, `'ERR_MAINTENANCE'`). */\n showRgsError(code: string, opts?: RgsErrorOptions): void;\n /** Show a FATAL error: a blocking modal that LOCKS the HUD and is dismissable only\n * in code (`hideNotice`) — for unrecoverable RGS states. */\n showFatal(message: string, opts?: NoticeOptions): void;\n /** Dismiss the notice / error modal. */\n hideNotice(): void;\n /** Social / sweepstakes mode: one switch swaps gambling wording (+ a coin → GC/SC). */\n setSocial(on: boolean, coin?: string): void;\n /** Switch the spin button to / from its free-spins face: `n > 0` shows \"N FS\". */\n setFreeSpins(n: number): void;\n /** Enter/leave replay mode (Stake `replay=true`) — locks the HUD + shows a REPLAY badge. */\n setReplay(on: boolean): void;\n /** Replay support (Stake \"Replay Support\"): at the START of a replay show the round's\n * Base Bet, its Cost + Payout multipliers and the final amount in an open-ui panel;\n * `onPlay` begins the playback. Labels are social-aware (Base Bet → Base Play, etc.);\n * amounts format with `info.currency` (defaults to the balance currency). Also flips\n * the HUD into replay mode (badge + lock). */\n replayStart(info: ReplayInfo, onPlay?: () => void): void;\n /** At the END of a replay, show the SAME facts + a \"Replay\" button that re-runs it.\n * Non-dismissible (no ✕ / backdrop close) — it's a strict modal → round → modal loop. */\n replayEnd(info: ReplayInfo, onReplay: () => void): void;\n /** Show a buy-feature confirm modal (Cancel / Confirm). Texts are literal-or-key. */\n confirmBuy(opts: { title?: string; message?: string; onConfirm: () => void; confirmLabel?: string; cancelLabel?: string }): void;\n /** Confirm-GATE a buy / bet-mode activation: when its `cost` (× base bet) exceeds\n * the configured `confirmBuyAboveCost` threshold, show a confirm popup naming the\n * feature + `price` and run `onConfirm` only on confirm; otherwise run `onConfirm`\n * straight away. This is how a game honors Stake's \"no one-click activation above\n * 2×\" rule — the library owns the threshold + popup, the game just calls this. */\n requestBuyFeature(opts: {\n cost: number;\n name?: string;\n price?: string;\n onConfirm: () => void;\n title?: string;\n message?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n }): void;\n /** Read-back: would a play of this `cost` (× base bet) require confirmation? */\n shouldConfirmBuy(cost: number): boolean;\n /** Slide the whole interactive HUD in / out — bottom controls go down, top ones up\n * (behind the status-bar plaque). Non-interactive while moving. */\n showControls(): void;\n hideControls(): void;\n setControlsVisible(visible: boolean): void;\n snapshot(): ControlSnapshot[];\n readonly events: EventLog | undefined;\n readonly inputLocked: Signal<boolean>;\n lockInput(): void;\n unlockInput(): void;\n unmount(): void;\n dispose(): void;\n}\n\n/**\n * The one-call, out-of-the-box entry: `mountHud(app)` boots the full reference\n * HUD; `mountHud(app, spec, opts)` configures it from one JSON UISpec + renderer\n * art/skins. Pure assembly over `createUI` + `OpenUIPixi` (Charter B9).\n */\nexport function mountHud(app: Application, spec: UISpec = {}, opts: HudOptions = {}): BootedHud {\n const { hooks, infoMenu, ...pixiOpts } = opts;\n const ui = createUI(spec, hooks);\n // The in-canvas Pixi menu (`MenuView`) is the default — keeps the whole HUD on the canvas.\n // `infoMenu:true` opts into the legacy DOM overlay; `menu:false` opts out of any library menu.\n const useInfoMenu = infoMenu === true && pixiOpts.menu !== false;\n // Compose the unified Pixi menu (Settings → Paytable → Rules) only when NOT using the HTML\n // menu. A Language switch is added when 2+ locales are configured; `spec.rules` folds in.\n const locales = spec.locale ? Array.from(new Set([spec.locale.locale, ...Object.keys(spec.locale.messages)])) : [];\n const menu = pixiOpts.menu === false || useInfoMenu ? false : composeMenu(spec.menu, { locales, localeSelectId: spec.localeSelectId, rulesFallback: spec.rules });\n // Game name + version footer (support / certification) — appended to the Pixi menu.\n if (menu && spec.game && (spec.game.name || spec.game.version)) {\n menu.push({ kind: 'legal', id: 'openui-game-info', text: [spec.game.name, spec.game.version ? `v${spec.game.version}` : ''].filter(Boolean).join(' · ') });\n }\n const pixi = new OpenUIPixi(ui, { ...pixiOpts, menu });\n pixi.mount(app);\n // Mount the white HTML info menu overlay (opens/closes off the canvas ☰).\n const disposeInfoMenu = useInfoMenu ? mountInfoMenu(app, ui) : undefined;\n\n // Mobile robustness: Pixi v8 SWALLOWS native `pointercancel` — it dispatches no release to\n // the pressed display object, so a button that got pointerdown (its press anim plays) but\n // then a pointercancel stays stuck `pressed` and NEVER activates. A real finger sends a\n // clean pointerup (production/iframe is fine), but touch-EMULATED taps trip it: DevTools\n // device mode fires pointercancel from its scroll-gesture recogniser, as do some in-app\n // webviews — the control \"flashes but doesn't fire\". Translate a cancel into a pointerup at\n // the same point so Pixi's normal (tap-slop-aware) handling runs and the control resolves.\n const canvas = app.canvas as HTMLCanvasElement | undefined;\n const cancelToUp = (e: PointerEvent): void => {\n canvas?.dispatchEvent(new PointerEvent('pointerup', {\n pointerId: e.pointerId, pointerType: e.pointerType, isPrimary: e.isPrimary,\n clientX: e.clientX, clientY: e.clientY, pressure: 0, bubbles: true, cancelable: true, composed: true,\n }));\n };\n canvas?.addEventListener('pointercancel', cancelToUp, true);\n\n // The reality-check reminder (RTS 13) is now wired in `createUI` (core), so it runs\n // on a wall-clock timer regardless of renderer — nothing to schedule here.\n\n // Extra declarative panels (beyond the settings menu) render as their own layers.\n const extra: PanelBodyView[] = [];\n if (spec.panels?.length) {\n for (const ps of spec.panels) {\n const built = buildPanel(ps, ui.bus);\n ui.register(built.panel);\n for (const c of built.controls) ui.register(c);\n const view = new PanelBodyView(built.panel, built.controls, built.blocks, ui, app.ticker, {\n controlSkins: pixiOpts.controlSkins,\n });\n pixi.root.addChild(view);\n view.applyLayout(ui.screen.get());\n extra.push(view);\n }\n }\n const offRelayout = ui.screen.subscribe(() => {\n const s = ui.screen.get();\n for (const v of extra) v.applyLayout(s);\n });\n\n const teardown = (): void => {\n offRelayout();\n canvas?.removeEventListener('pointercancel', cancelToUp, true);\n disposeInfoMenu?.();\n for (const v of extra) v.dispose();\n extra.length = 0;\n pixi.unmount();\n ui.dispose(); // tear down the headless subscriptions too (Charter P12)\n };\n\n function on<K extends keyof OpenUIEvents>(type: K, fn: (p: OpenUIEvents[K]) => void): Dispose {\n return ui.on(type, fn);\n }\n\n return {\n ui,\n pixi,\n on,\n setBalance: (n) => ui.balance.set(n),\n setBet: (n) => ui.bet.set(n),\n setTotalWin: (n) => ui.totalWin.set(n),\n setCurrency: (c) => {\n ui.balance.setCurrency(c);\n ui.bet.setCurrency(c);\n ui.totalWin.setCurrency(c);\n ui.netPosition.setCurrency(c);\n },\n applyJurisdiction: (j) => ui.applyJurisdiction(j),\n reportRound: (win, bet) => ui.reportRound(win, bet),\n setRtp: (p) => ui.rtp.set(p),\n setMuted: (m) => ui.setMuted(m),\n showNotice: (blocks, actions) => ui.showNotice(blocks, actions),\n showError: (message, opts) => ui.showError(message, opts),\n showRgsError: (code, opts) => ui.showRgsError(code, opts),\n showFatal: (message, opts) => ui.showFatal(message, opts),\n hideNotice: () => ui.hideNotice(),\n setSocial: (on, coin) => ui.setSocial(on, coin),\n setFreeSpins: (n) => ui.spin.setFreeSpins(n),\n setReplay: (on) => ui.setReplay(on),\n replayStart: (info, onPlay) => {\n ui.setReplay(true); // REPLAY badge + locked HUD\n showReplayModal(ui, info, 'openui.replay.play', () => onPlay?.());\n },\n replayEnd: (info, onReplay) => {\n showReplayModal(ui, info, 'openui.replay.again', onReplay);\n },\n confirmBuy: (o) => {\n // Real guard: a jurisdiction that disabled buy-feature makes this a no-op.\n if (ui.isDisabled('buyFeature')) return;\n ui.showNotice(\n [\n { kind: 'heading', id: 'buy-title', text: o.title ?? 'openui.buyFeature.title' },\n { kind: 'text', id: 'buy-body', text: o.message ?? 'openui.buyFeature.message' },\n ],\n [\n { label: o.cancelLabel ?? 'openui.cancel', variant: 'secondary' },\n { label: o.confirmLabel ?? 'openui.confirm', variant: 'primary', onSelect: o.onConfirm },\n ],\n );\n },\n shouldConfirmBuy: (cost) => ui.shouldConfirmBuy(cost),\n requestBuyFeature: (o) => {\n if (ui.isDisabled('buyFeature')) return; // jurisdiction fully disabled the feature\n if (!ui.shouldConfirmBuy(o.cost)) {\n o.onConfirm(); // cost at/under the threshold → one click is allowed\n return;\n }\n // The ONE universal confirm — the in-canvas Pixi notice modal (`DialogView`, via\n // `ui.showNotice`), same as `confirmBuy`, so every confirm across the HUD is on-canvas\n // and looks identical (social/locale-aware).\n const message =\n o.message ??\n (o.name\n ? ui.t('openui.buyFeature.confirm', { name: ui.t(o.name), price: o.price ?? '' })\n : ui.t('openui.buyFeature.message'));\n ui.showNotice(\n [\n { kind: 'heading', id: 'buy-confirm-title', text: o.title ?? 'openui.buyFeature.title' },\n { kind: 'text', id: 'buy-confirm-body', text: message },\n ],\n [\n { label: o.cancelLabel ?? 'openui.cancel', variant: 'secondary' },\n { label: o.confirmLabel ?? 'openui.confirm', variant: 'primary', onSelect: () => { ui.hideNotice(); o.onConfirm(); } },\n ],\n );\n },\n showControls: () => pixi.setControlsVisible(true),\n hideControls: () => pixi.setControlsVisible(false),\n setControlsVisible: (v) => pixi.setControlsVisible(v),\n snapshot: () => ui.snapshot(),\n events: pixi.eventLog,\n inputLocked: ui.locked,\n lockInput: () => ui.lock(),\n unlockInput: () => ui.unlock(),\n unmount: teardown,\n dispose: teardown,\n };\n}\n","// The BUY-FEATURE modal — the open-slot-ui host component opened by the bonus button.\n// The bonus (☰ coin) button opens a card LIST of the game's buyable/activatable features;\n// each card has its own Buy/Activate action, and buying (or activating a boost) is gated by\n// the shared Pixi confirm notice. Rendered ENTIRELY in Pixi (in-canvas Container on the HUD\n// root) — no DOM overlay — so the whole HUD stays on the canvas. One biased white design\n// (independent of the game theme), matching the notice/menu; fully localized + social-aware.\n//\n// Each feature is a card: `buy` = one-tap purchase (start that mode once), `boost` = an\n// activatable per-spin bet surcharge that toggles on/off. Actions emit `cardActivated` on the\n// bus AND call the `onBuy`/`onActivate` host hooks. Returns a leak-free teardown.\n\nimport { Container, Graphics, Sprite, Text, Texture, Rectangle, Assets, type FederatedPointerEvent } from 'pixi.js';\nimport type { Application } from 'pixi.js';\nimport type { BootedHud } from './mountHud';\nimport { formatAmountPrecise, type CurrencySpec, type OpenUI, type ScreenState } from '@open-slot-ui/core';\n\n/** A buy-feature card. */\nexport interface FeatureSpec {\n id: string;\n name: string;\n variant: 'buy' | 'boost';\n /** Cost as a multiple of the base bet. For `buy` this is the FULL stake multiple\n * (deducted = cost × bet); for `boost` it is the SURCHARGE over the base bet, so the\n * full per-spin cost shown/deducted is (1 + cost) × bet. */\n cost: number;\n /** Card image URL (or data URI). Optional — a neutral gradient is used when absent. */\n image?: string;\n}\n\n/** Configurable behavior of the activatable bet-boost cards. */\nexport interface BuyFeatureOptions {\n /** `'single'` → only one boost active at a time · `'multi'` → combine them. Default `'multi'`. */\n activation?: 'single' | 'multi';\n /** When any boost is active, disable the Buy buttons. Default `false`. */\n activationBlocksBuy?: boolean;\n /** Host hook for a confirmed Buy (the modal has just closed): deduct + start the feature. */\n onBuy?: (id: string, cost: number) => void;\n /** Host hook whenever the active-boost set changes (the modal stays open). */\n onActivate?: (activeIds: string[], id: string, active: boolean) => void;\n /** BASE bet source for pricing. Default reads ui.bet — pass this when ui.bet\n * displays a modified EFFECTIVE stake (boost active) instead of the base bet. */\n getBet?: () => number;\n}\n\n/** The Figma \"default\" white card look (independent of the dark game theme) — matches\n * the notice/menu sheets: dark text on white, black border, gold accent. */\nconst LIGHT = {\n surface: '#ffffff',\n surfaceAlt: '#eef1f6',\n text: '#181b20',\n textDim: '#5b6472',\n border: '#000000',\n accent: '#d99000',\n accentText: '#1a1200',\n scrim: '#080604',\n} as const;\n\n// Base (design) geometry — the whole sheet is uniformly scaled to fit any viewport.\nconst CARD_W = 200;\nconst IMG_H = 120;\nconst STRIP_H = 8;\nconst CARD_H = 214; // frame: image + strip + name/price body\nconst ACT_GAP = 12;\nconst ACT_H = 50;\nconst CELL_H = CARD_H + ACT_GAP + ACT_H;\nconst GAP = 18;\nconst STEP_R = 27;\nconst BET_W = 220;\nconst BET_H = 60;\nconst TITLE_H = 40;\nconst ROW_GAP = 22;\nconst TAP_SLOP = 24; // a press that lifts within this many screen px still counts as a tap\n\n/** Texture cache so a card image loads once, not on every re-render. */\nconst texCache = new Map<string, Promise<Texture>>();\nfunction loadTex(url: string): Promise<Texture> {\n let p = texCache.get(url);\n if (!p) { p = Assets.load<Texture>(url).catch(() => Texture.EMPTY); texCache.set(url, p); }\n return p;\n}\n\n/** Make a Container tap-interactive with tap-slop (a lift within TAP_SLOP of the press still\n * fires) + a subtle alpha press. Robust on touch; the mountHud pointercancel→pointerup fix\n * covers emulated-touch cancels. */\nfunction wireTap(node: Container, hit: Rectangle, onTap: () => void): void {\n node.eventMode = 'static';\n node.cursor = 'pointer';\n node.hitArea = hit;\n let down: { x: number; y: number } | null = null;\n node.on('pointerdown', (e: FederatedPointerEvent) => { down = { x: e.global.x, y: e.global.y }; node.alpha = 0.82; });\n const end = (e: FederatedPointerEvent, inside: boolean): void => {\n node.alpha = 1;\n const p = down; down = null;\n if (!p) return;\n if (inside || Math.hypot(e.global.x - p.x, e.global.y - p.y) <= TAP_SLOP) onTap();\n };\n node.on('pointerup', (e) => end(e, true));\n node.on('pointerupoutside', (e) => end(e, false));\n}\n\n/** One feature card (image + gold strip + name + price + action button). Built once; only\n * the price + action state update on bet/boost change. */\nclass FeatureCard extends Container {\n private readonly priceText: Text;\n private readonly actionBg = new Graphics();\n private readonly actionLabel: Text;\n private readonly action = new Container();\n\n constructor(spec: FeatureSpec, ui: OpenUI, onAction: () => void) {\n super();\n const fam = ui.theme.type.family;\n\n // Rounded white frame (fill under, black stroke over the clipped content).\n const fill = new Graphics().roundRect(0, 0, CARD_W, CARD_H, 14).fill({ color: LIGHT.surface });\n const clip = new Container();\n const clipMask = new Graphics().roundRect(0, 0, CARD_W, CARD_H, 14).fill({ color: 0xffffff });\n clip.mask = clipMask;\n\n // Image (or neutral gradient placeholder) in the top band.\n const placeholder = new Graphics().rect(0, 0, CARD_W, IMG_H).fill({ color: LIGHT.surfaceAlt });\n clip.addChild(placeholder);\n if (spec.image) {\n void loadTex(spec.image).then((tex) => {\n if (this.destroyed || tex === Texture.EMPTY) return;\n const sp = new Sprite(tex);\n const s = Math.max(CARD_W / tex.width, IMG_H / tex.height); // cover\n sp.scale.set(s);\n sp.x = (CARD_W - tex.width * s) / 2;\n sp.y = (IMG_H - tex.height * s) / 2;\n clip.addChildAt(sp, 1);\n });\n }\n const strip = new Graphics().rect(0, IMG_H, CARD_W, STRIP_H).fill({ color: LIGHT.accent });\n const name = new Text({ text: ui.t(spec.name), style: { fontFamily: fam, fontSize: 16, fontWeight: '600', fill: LIGHT.text } });\n name.anchor.set(0.5, 0);\n name.position.set(CARD_W / 2, IMG_H + STRIP_H + 12);\n this.priceText = new Text({ text: '', style: { fontFamily: fam, fontSize: 22, fontWeight: '800', fill: LIGHT.text } });\n this.priceText.anchor.set(0.5, 0);\n this.priceText.position.set(CARD_W / 2, IMG_H + STRIP_H + 36);\n clip.addChild(strip, name, this.priceText);\n\n const stroke = new Graphics().roundRect(0, 0, CARD_W, CARD_H, 14).stroke({ width: 4, color: LIGHT.border });\n this.addChild(fill, clip, clipMask, stroke);\n\n // Action button (Buy / Activate / Activated), pinned below the card.\n this.actionLabel = new Text({ text: '', style: { fontFamily: fam, fontSize: 15, fontWeight: '800', fill: LIGHT.text, letterSpacing: 0.5 } });\n this.actionLabel.anchor.set(0.5);\n this.actionLabel.position.set(CARD_W / 2, CARD_H + ACT_GAP + ACT_H / 2);\n this.action.addChild(this.actionBg, this.actionLabel);\n wireTap(this.action, new Rectangle(0, CARD_H + ACT_GAP, CARD_W, ACT_H), onAction);\n this.addChild(this.action);\n }\n\n /** Update price + action label/state for the current bet + boost state. */\n update(price: string, label: string, active: boolean, blocked: boolean): void {\n this.priceText.text = price;\n this.actionLabel.text = label;\n this.actionLabel.style.fill = active ? LIGHT.accentText : LIGHT.text;\n this.actionBg.clear().roundRect(0, CARD_H + ACT_GAP, CARD_W, ACT_H, 12)\n .fill({ color: active ? LIGHT.accent : LIGHT.surface }).stroke({ width: 4, color: LIGHT.border });\n this.action.eventMode = blocked ? 'none' : 'static';\n this.action.alpha = blocked ? 0.38 : 1;\n }\n}\n\nclass BuyFeatureModalView extends Container {\n private readonly backdrop = new Graphics();\n private readonly content = new Container();\n private readonly closeBtn = new Container();\n private readonly title: Text;\n private readonly betValue: Text;\n private readonly cardsRow = new Container();\n private readonly cards: FeatureCard[] = [];\n private readonly list: FeatureSpec[];\n private readonly boosts = new Set<string>();\n private readonly disposers: Array<() => void> = [];\n private screen: ScreenState | undefined;\n\n constructor(private readonly hud: BootedHud, features: FeatureSpec[], private readonly opts: BuyFeatureOptions) {\n super();\n const ui = hud.ui;\n const fam = ui.theme.type.family;\n this.list = features.slice(0, 4);\n this.zIndex = 125; // above the menu (120), below the confirm notice (DialogView, 130)\n this.visible = false;\n this.eventMode = 'none';\n\n // Declare the configured features as GAME FACTS (rules-completeness audit reads these).\n ui.declareFacts({ modes: this.list.map((f) => ({ id: f.id, name: f.name, kind: f.variant, cost: f.cost })) });\n\n // Backdrop — dim scrim; a tap on it closes the modal.\n this.backdrop.eventMode = 'static';\n this.backdrop.on('pointertap', () => this.close());\n\n // Title.\n this.title = new Text({ text: ui.t('Buy Feature'), style: { fontFamily: fam, fontSize: 30, fontWeight: '800', fill: '#ffffff', letterSpacing: 1 } });\n this.title.anchor.set(0.5, 0);\n\n // Bet stepper row: − [ BET / value ] +\n const minus = this.stepButton('−', () => ui.betStepper.dec());\n const plus = this.stepButton('+', () => ui.betStepper.inc());\n const betBox = new Container();\n const betBg = new Graphics().roundRect(-BET_W / 2, -BET_H / 2, BET_W, BET_H, 12).fill({ color: LIGHT.surface }).stroke({ width: 3, color: LIGHT.border });\n const betLabel = new Text({ text: ui.t('Bet'), style: { fontFamily: fam, fontSize: 12, fontWeight: '700', fill: LIGHT.textDim, letterSpacing: 1 } });\n betLabel.anchor.set(0.5, 0); betLabel.position.set(0, -BET_H / 2 + 8);\n this.betValue = new Text({ text: '', style: { fontFamily: fam, fontSize: 24, fontWeight: '800', fill: LIGHT.text } });\n this.betValue.anchor.set(0.5, 1); this.betValue.position.set(0, BET_H / 2 - 8);\n betBox.addChild(betBg, betLabel, this.betValue);\n const betRow = new Container();\n minus.position.set(STEP_R, 0); // center at STEP_R → left edge at x=0\n betBox.position.set(STEP_R * 2 + 16 + BET_W / 2, 0);\n plus.position.set(STEP_R * 2 + 16 + BET_W + 16 + STEP_R, 0);\n betRow.addChild(minus, betBox, plus);\n this.betRow = betRow;\n\n // Feature cards.\n for (const spec of this.list) {\n const card = new FeatureCard(spec, ui, () => this.onAction(spec.id, spec.variant));\n this.cards.push(card);\n this.cardsRow.addChild(card);\n }\n\n this.content.addChild(this.title, betRow, this.cardsRow);\n\n // Close ✕ — dark circle top-right of the viewport (not scaled with content).\n const cbg = new Graphics().circle(0, 0, 23).fill({ color: LIGHT.scrim, alpha: 0.85 });\n const cx = new Graphics().moveTo(-7, -7).lineTo(7, 7).moveTo(7, -7).lineTo(-7, 7).stroke({ width: 3, color: '#ffffff', cap: 'round' });\n this.closeBtn.addChild(cbg, cx);\n wireTap(this.closeBtn, new Rectangle(-23, -23, 46, 46), () => this.close());\n\n this.addChild(this.backdrop, this.content, this.closeBtn);\n\n this.disposers.push(\n ui.bet.value.subscribe(() => this.refresh()),\n ui.locale.subscribe(() => {\n this.title.text = ui.t('Buy Feature');\n betLabel.text = ui.t('Bet');\n this.refresh();\n this.relayout();\n }),\n );\n }\n\n private betRow!: Container;\n\n private stepButton(glyph: string, onTap: () => void): Container {\n const c = new Container();\n const fam = this.hud.ui.theme.type.family;\n const bg = new Graphics().circle(0, 0, STEP_R).fill({ color: LIGHT.surface }).stroke({ width: 3, color: LIGHT.border });\n const t = new Text({ text: glyph, style: { fontFamily: fam, fontSize: 28, fontWeight: '800', fill: LIGHT.text } });\n t.anchor.set(0.5); t.position.set(0, -1);\n c.addChild(bg, t);\n wireTap(c, new Rectangle(-STEP_R, -STEP_R, STEP_R * 2, STEP_R * 2), onTap);\n return c;\n }\n\n /** Price + action state per current bet + boosts. */\n private refresh(): void {\n const ui = this.hud.ui;\n const bet = this.opts.getBet ? this.opts.getBet() : ui.bet.get();\n const cur = ui.bet.currency.get();\n const money = (n: number): string => formatAmountPrecise(n, cur);\n this.betValue.text = money(bet);\n const blocksBuy = this.opts.activationBlocksBuy ?? false;\n this.list.forEach((f, i) => {\n const active = this.boosts.has(f.id);\n const perSpin = (f.variant === 'buy' ? f.cost : 1 + f.cost) * bet;\n const label = f.variant === 'buy' ? ui.t('Buy') : active ? ui.t('Activated') : ui.t('Activate');\n const blocked = f.variant === 'buy' && blocksBuy && this.boosts.size > 0;\n this.cards[i]!.update(money(perSpin), label, active, blocked);\n });\n }\n\n private onAction(id: string, variant: FeatureSpec['variant']): void {\n const ui = this.hud.ui;\n const f = this.list.find((x) => x.id === id);\n const bet = this.opts.getBet ? this.opts.getBet() : ui.bet.get();\n const cur = ui.bet.currency.get();\n const money = (n: number): string => formatAmountPrecise(n, cur);\n const activation = this.opts.activation ?? 'multi';\n const blocksBuy = this.opts.activationBlocksBuy ?? false;\n\n if (variant === 'boost') {\n const wasActive = this.boosts.has(id);\n const commit = (): void => {\n if (activation === 'single') this.boosts.clear();\n if (wasActive) this.boosts.delete(id); else this.boosts.add(id);\n ui.bus.emit('cardActivated', { id });\n this.refresh();\n this.opts.onActivate?.([...this.boosts], id, this.boosts.has(id));\n };\n if (wasActive) { commit(); return; } // turning a boost OFF never needs confirming\n const total = 1 + (f?.cost ?? 0);\n this.askConfirm(f?.name ?? id, money(total * bet), commit);\n } else {\n if (blocksBuy && this.boosts.size > 0) return;\n const cost = (f?.cost ?? 0) * bet;\n this.askConfirm(f?.name ?? id, money(cost), () => {\n ui.bus.emit('cardActivated', { id });\n this.close();\n this.opts.onBuy?.(id, cost);\n });\n }\n }\n\n /** The ONE universal confirm — the in-canvas Pixi notice (DialogView, zIndex 130), so it\n * layers over this modal. Message + labels come from the library's i18n (social-aware). */\n private askConfirm(name: string, price: string, onYes: () => void): void {\n const ui = this.hud.ui;\n const message = ui.t('openui.buyFeature.confirm', { name: ui.t(name), price });\n ui.showNotice(\n [\n { kind: 'heading', id: 'bfm-confirm-h', text: 'Buy Feature' },\n { kind: 'text', id: 'bfm-confirm-b', text: message },\n ],\n [\n { label: 'openui.cancel', variant: 'secondary' },\n { label: 'openui.confirm', variant: 'primary', onSelect: () => { ui.hideNotice(); onYes(); } },\n ],\n );\n }\n\n layout(screen: ScreenState): void {\n this.screen = screen;\n if (this.visible) this.relayout();\n }\n\n private relayout(): void {\n const s = this.screen;\n if (!s) return;\n const W = s.width;\n const H = s.height;\n\n this.backdrop.clear().rect(0, 0, W, H).fill({ color: LIGHT.scrim, alpha: 0.55 });\n this.backdrop.hitArea = new Rectangle(0, 0, W, H);\n\n // Column count — 4 across only when there's real width (else 2, which scales taller/bigger).\n const n = this.list.length;\n const cols = W >= 720 && (W >= 900 || H <= 540) ? Math.min(4, n) : Math.min(2, n);\n const rows = Math.ceil(n / cols);\n\n // Lay the cards into a grid.\n this.cards.forEach((card, i) => {\n const r = Math.floor(i / cols);\n const c = i % cols;\n card.position.set(c * (CARD_W + GAP), r * (CELL_H + GAP));\n });\n const gridW = cols * CARD_W + (cols - 1) * GAP;\n const gridH = rows * CELL_H + (rows - 1) * GAP;\n\n // Stack: title, bet row, cards grid — all centered on the content's x.\n const betW = 4 * STEP_R + BET_W + 32; // − [ betbox ] + (see constructor layout)\n const contentW = Math.max(gridW, betW, 340);\n this.title.position.set(contentW / 2, 0);\n this.betRow.position.set((contentW - betW) / 2, TITLE_H + ROW_GAP + STEP_R);\n this.cardsRow.position.set((contentW - gridW) / 2, TITLE_H + ROW_GAP + BET_H + ROW_GAP);\n const contentH = TITLE_H + ROW_GAP + BET_H + ROW_GAP + gridH;\n\n // Uniform scale to fit, centered.\n const scale = Math.min(1, (W * 0.94) / contentW, (H * 0.92) / contentH);\n this.content.scale.set(scale);\n this.content.position.set((W - contentW * scale) / 2, (H - contentH * scale) / 2);\n\n this.closeBtn.position.set(W - 34, 34);\n }\n\n open(): void {\n if (this.visible) return;\n this.hud.ui.lock();\n this.visible = true;\n this.eventMode = 'static';\n this.refresh();\n this.relayout();\n }\n\n close(): void {\n if (!this.visible) return;\n this.visible = false;\n this.eventMode = 'none';\n this.hud.ui.unlock();\n }\n\n get isOpen(): boolean {\n return this.visible;\n }\n\n dispose(): void {\n if (this.visible) this.hud.ui.unlock(); // don't leak the lock on teardown-while-open\n for (const d of this.disposers.splice(0)) d();\n if (!this.destroyed) this.destroy({ children: true });\n }\n}\n\n/** Mount the buy-feature modal (in-canvas Pixi). Returns a leak-free teardown. */\nexport function mountBuyFeatureModal(\n _app: Application,\n hud: BootedHud,\n features: FeatureSpec[],\n opts: BuyFeatureOptions = {},\n): () => void {\n const ui = hud.ui;\n const view = new BuyFeatureModalView(hud, features, opts);\n hud.pixi.root.addChild(view);\n view.layout(ui.screen.get());\n const offScreen = ui.screen.subscribe(() => view.layout(ui.screen.get()));\n const offOpen = ui.on('buttonActivated', ({ id }) => { if (id === 'bonus') view.open(); });\n return () => {\n offScreen();\n offOpen();\n view.dispose();\n };\n}\n","// Standalone boot / fatal ERROR screen — a full-screen block shown when the game\n// cannot reach or authenticate with the RGS BEFORE the HUD mounts (so the HUD's own\n// `showFatal` isn't available yet). It uses the open-ui dark + yellow palette so it\n// looks like the HUD's own modals, and it PREVENTS PLAY (non-dismissible; the only way\n// out is Reload, which re-runs the whole handshake) — Stake requires that a failed\n// connection/auth never silently continues. Pure DOM, no pixi needed.\n\nexport interface BootErrorOptions {\n title?: string;\n message?: string;\n /** Small technical detail for support (e.g. the RGS status line). */\n detail?: string;\n reloadLabel?: string;\n /** Reload handler (default: `window.location.reload()`). Pass `null` for no button. */\n onReload?: (() => void) | null;\n}\n\nlet host: HTMLElement | null = null;\n\nconst esc = (s: string): string => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n/** Show the open-ui-themed blocking boot error. Idempotent (replaces its content). */\nexport function showBootError(opts: BootErrorOptions = {}): void {\n const title = opts.title ?? 'Connection lost';\n const message = opts.message ?? 'The game could not reach the game server. Please reload to reconnect and continue.';\n const showReload = opts.onReload !== null;\n host ??= document.createElement('div');\n host.className = 'openui-boot-error';\n host.setAttribute('role', 'alertdialog');\n host.setAttribute('aria-modal', 'true');\n host.innerHTML = `\n <div class=\"openui-be-card\">\n <div class=\"openui-be-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 48 48\" width=\"48\" height=\"48\"><path d=\"M24 4 3 42h42L24 4Z\" fill=\"none\" stroke=\"#ffc935\" stroke-width=\"3\" stroke-linejoin=\"round\"/><rect x=\"22\" y=\"18\" width=\"4\" height=\"12\" rx=\"2\" fill=\"#ffc935\"/><circle cx=\"24\" cy=\"35\" r=\"2.4\" fill=\"#ffc935\"/></svg>\n </div>\n <h1 class=\"openui-be-title\">${esc(title)}</h1>\n <p class=\"openui-be-msg\">${esc(message)}</p>\n ${opts.detail ? `<p class=\"openui-be-detail\">${esc(opts.detail)}</p>` : ''}\n ${showReload ? `<button class=\"openui-be-reload\" type=\"button\">${esc(opts.reloadLabel ?? 'Reload')}</button>` : ''}\n </div>\n <style>\n .openui-boot-error { position: fixed; inset: 0; z-index: 2147483000; display: grid; place-items: center;\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif; color: #e9edf2;\n background: rgba(6,8,11,.92); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }\n .openui-be-card { width: min(90%, 440px); text-align: center; padding: 38px 32px 34px;\n background: #161b22; border: 1.5px solid #ffc935; border-radius: 16px; box-shadow: 0 30px 80px rgba(0,0,0,.6); }\n .openui-be-icon { margin-bottom: 14px; line-height: 0; }\n .openui-be-title { margin: 0 0 12px; font-size: 24px; font-weight: 800; color: #ffc935; letter-spacing: .3px; }\n .openui-be-msg { margin: 0 0 20px; font-size: 15px; line-height: 1.55; color: #c4ccd6; }\n .openui-be-detail { margin: 0 0 20px; font-size: 12px; line-height: 1.4; color: #78828f; word-break: break-word; }\n .openui-be-reload { appearance: none; border: 0; cursor: pointer; padding: 13px 42px; border-radius: 999px;\n background: #ffc935; color: #161b22; font-weight: 800; font-size: 15px; letter-spacing: .3px;\n box-shadow: 0 8px 22px rgba(255,201,53,.32); transition: transform .12s, filter .12s; }\n .openui-be-reload:hover { filter: brightness(1.06); }\n .openui-be-reload:active { transform: scale(.96); }\n </style>`;\n if (showReload) {\n host.querySelector('.openui-be-reload')?.addEventListener('click', () => (opts.onReload ?? (() => window.location.reload()))());\n }\n if (!host.isConnected) document.body.appendChild(host);\n}\n\n/** Remove the boot error screen (e.g. after a successful retry). */\nexport function hideBootError(): void {\n host?.remove();\n host = null;\n}\n"]}
1
+ {"version":3,"sources":["../src/views/PopoverView.ts","../src/views/PanelView.ts","../src/views/PanelBodyView.ts","../src/infoMenu.ts","../src/mountHud.ts","../src/buyFeatureModal.ts","../src/bootError.ts"],"names":["Graphics","Container","esc","host","vars","renderBlocks","opts","on","GAP","Text","Rectangle","formatAmountPrecise"],"mappings":";;;;;AA0BA,IAAM,IAAA,GAAO,EAAA;AACb,IAAM,OAAA,GAAU,EAAA;AAEhB,IAAM,cAAA,GAAiB,GAAA;AACvB,IAAM,cAAA,GAAiB,EAAA;AAOhB,IAAM,WAAA,GAAN,cAA0B,WAAA,CAAY;AAAA,EAS3C,YAA6B,KAAA,EAAqB,KAAA,EAAqB,IAA6B,MAAA,EAAgB,GAAA,GAAkB,EAAC,EAAG;AACxI,IAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AADY,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAuE,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGlG,IAAA,IAAA,CAAK,QAAQ,IAAI,UAAA,CAAW,KAAA,CAAM,KAAA,EAAO,IAAI,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAQ,EAAA,EAAI,WAAA,EAAa,IAAI,YAAA,EAAc,UAAA,EAAY,IAAI,CAAA;AACjI,IAAA,IAAA,CAAK,QAAQ,IAAI,UAAA,CAAW,MAAM,KAAA,EAAO,EAAA,EAAI,IAAI,UAAU,CAAA;AAC3D,IAAA,IAAA,CAAK,MAAM,IAAI,UAAA,CAAW,MAAM,GAAA,EAAK,EAAA,EAAI,IAAI,UAAU,CAAA;AAEvD,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,cAAA,EAAgB,cAAc,CAAA;AACnD,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,cAAA,EAAgB,cAAc,CAAA;AAIjD,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,EAAE,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,EAAA,EAAI,MAAM,EAAA,EAAI,GAAC,EAAK,IAAA,EAAM,CAAA,EAAE;AAAA,MAC9C,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,GAAC,GAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,MACpD,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,GAAC,GAAM,CAAA,EAAG,IAAA,EAAM,CAAA;AAAE,KACtD;AACA,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO;AAC3B,MAAA,EAAA,CAAG,KAAK,QAAA,CAAS,GAAA,CAAI,EAAA,CAAG,EAAA,EAAI,GAAG,EAAE,CAAA;AACjC,MAAA,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AACnB,MAAA,EAAA,CAAG,KAAK,KAAA,GAAQ,CAAA;AAChB,MAAA,EAAA,CAAG,KAAK,OAAA,GAAU,KAAA;AAClB,MAAA,IAAA,CAAK,QAAA,CAAS,GAAG,IAAI,CAAA;AAAA,IACvB;AAEA,IAAA,IAAA,CAAK,OAAO,CAAC,CAAA,KAAM,IAAA,CAAK,MAAA,CAAO,EAAE,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,UAAU,MAAM,IAAA,CAAK,UAAA,EAAY,CAAC,CAAA;AAAA,EACzE;AAAA,EA5B6B,KAAA;AAAA,EAAuE,MAAA;AAAA,EARnF,KAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACT,KAAA,GAAQ,CAAA;AAAA,EACR,OAAA,GAAU,KAAA;AAAA,EACD,IAAA;AAAA,EAgCT,UAAA,GAAmB;AACzB,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA;AACxB,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,MAAA,GAAS,MAAA;AACjC,IAAA,IAAI,MAAM,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO,EAAA,CAAG,KAAK,OAAA,GAAU,IAAA;AACzD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,OAAO,EAAA,EAAkB;AAC/B,IAAA,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA;AACxB,IAAA,MAAM,WAAA,GAAc,OAAO,CAAA,GAAI,CAAA;AAC/B,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACvB,MAAA,MAAM,SAAS,IAAA,IAAQ,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,UAAU,CAAA,GAAI,CAAA;AACtD,MAAA,EAAA,CAAG,IAAA,IAAA,CAAS,MAAA,GAAS,EAAA,CAAG,IAAA,IAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,EAAA,IAAM,IAAA,GAAO,EAAA,GAAK,EAAA,CAAG,CAAA;AACjE,MAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,MAAA,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AACnB,MAAA,EAAA,CAAG,KAAK,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,GAAG,CAAA;AACnC,MAAA,EAAA,CAAG,IAAA,CAAK,SAAS,GAAA,CAAI,EAAA,CAAG,IAAI,EAAA,CAAG,EAAA,GAAA,CAAM,CAAA,GAAI,CAAA,IAAK,IAAI,CAAA;AAClD,MAAA,EAAA,CAAG,IAAA,CAAK,UAAU,CAAA,GAAI,IAAA;AAEtB,MAAA,IAAI,KAAK,GAAA,CAAI,EAAA,CAAG,OAAO,WAAW,CAAA,GAAI,MAAM,OAAA,GAAU,KAAA;AAAA,IACxD;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAES,OAAA,GAAgB;AACvB,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC5B,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,IACjB;AACA,IAAA,IAAA,CAAK,MAAM,OAAA,EAAQ;AACnB,IAAA,IAAA,CAAK,IAAI,OAAA,EAAQ;AACjB,IAAA,IAAA,CAAK,MAAM,OAAA,EAAQ;AACnB,IAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,EAChB;AACF;AC3GA,IAAM,GAAA,GAAM,OAAA;AACZ,IAAM,IAAA,GAAO,QAAA;AACb,IAAM,SAAA,GAAY,OAAA;AAClB,IAAM,GAAA,GAAM,EAAA;AACZ,IAAM,QAAA,GAAW,EAAA;AACjB,IAAM,KAAA,GAAQ,GAAA;AAOP,IAAM,SAAA,GAAN,cAAwB,WAAA,CAAY;AAAA,EAkBzC,YACmB,KAAA,EACjB,QAAA,EACA,IACA,MAAA,EACiB,IAAA,GAAyB,EAAC,EAC3C;AACA,IAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AANE,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAIA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAGjB,IAAA,IAAA,CAAK,MAAA,GAAS,GAAA;AAEd,IAAA,IAAA,CAAK,SAAS,SAAA,GAAY,QAAA;AAC1B,IAAA,IAAA,CAAK,SAAS,EAAA,CAAG,YAAA,EAAc,MAAM,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAE5D,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,IAAA,CAAK;AAAA,MACpB,IAAA,EAAM,MAAM,KAAA,IAAS,EAAA;AAAA,MACrB,KAAA,EAAO,EAAE,UAAA,EAAY,EAAA,CAAG,MAAM,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,eAAe,CAAA;AAAE,KAC9G,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAEzB,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,IAAA,CAAK,KAAA;AAC1B,IAAA,IAAA,CAAK,QAAQ,SAAA,GAAY,QAAA;AACzB,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,aAAA,EAAe,IAAA,CAAK,MAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,mBAAA,EAAqB,IAAA,CAAK,MAAM,CAAA;AAChD,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,WAAA,EAAa,IAAA,CAAK,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,kBAAA,EAAoB,IAAA,CAAK,IAAI,CAAA;AAE7C,IAAA,IAAA,CAAK,QAAQ,IAAI,UAAA,CAAW,QAAA,EAAU,EAAA,EAAI,QAAQ,EAAE,WAAA,EAAa,IAAA,CAAK,YAAA,EAAc,YAAY,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,IAAI,CAAA;AAEhI,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,KAAK,QAAA,EAAU,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,SAAS,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,KAAA,EAAO,KAAK,KAAK,CAAA;AAEtH,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,SAAA,CAAU,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAC,CAAA;AAAA,EACzF;AAAA,EA/BmB,KAAA;AAAA,EAIA,IAAA;AAAA,EAtBF,QAAA,GAAW,IAAI,QAAA,EAAS;AAAA,EACxB,IAAA,GAAO,IAAI,QAAA,EAAS;AAAA,EACpB,QAAA,GAAW,IAAI,QAAA,EAAS;AAAA,EACxB,KAAA;AAAA,EACA,QAAA,GAAW,IAAI,SAAA,EAAU;AAAA,EACzB,KAAA,GAAQ,IAAI,QAAA,EAAS;AAAA,EACrB,OAAA,GAAU,IAAI,QAAA,EAAS;AAAA,EACvB,KAAA;AAAA,EACT,OAAA;AAAA,EACA,UAAA,GAAa,EAAA;AAAA,EACb,OAAA,GAAU,CAAA;AAAA,EACV,QAAA,GAAW,CAAA;AAAA,EACX,SAAA,GAAY,CAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,KAAA,GAAQ,CAAA;AAAA,EACR,YAAA;AAAA,EAoCC,YAAY,MAAA,EAA2B;AAC9C,IAAA,MAAM,IAAI,MAAA,CAAO,KAAA;AACjB,IAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AACtB,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAEhB,IAAA,IAAA,CAAK,QAAA,CAAS,KAAA,EAAM,CAAE,IAAA,CAAK,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,CAAA,EAAU,KAAA,EAAO,KAAK,CAAA;AAC3E,IAAA,IAAA,CAAK,SAAS,OAAA,GAAU,IAAI,UAAU,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAEhD,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAA,GAAM,GAAG,KAAK,CAAA;AACzC,IAAA,MAAM,EAAA,GAAA,CAAM,IAAI,KAAA,IAAS,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,GAAA;AACX,IAAA,IAAA,CAAK,QAAA,CAAS,KAAA,EAAM,CAAE,SAAA,CAAU,IAAI,EAAA,EAAI,KAAA,EAAO,QAAA,EAAU,QAAA,GAAW,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAW,CAAA;AAChG,IAAA,IAAA,CAAK,MAAM,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG,EAAA,GAAK,WAAW,CAAC,CAAA;AAChD,IAAA,IAAA,CAAK,KAAA,CAAM,SAAS,GAAA,CAAI,EAAA,GAAK,QAAQ,QAAA,GAAW,CAAA,EAAG,EAAA,GAAK,QAAA,GAAW,CAAC,CAAA;AAEpE,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,GAAW,EAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,GAAQ,GAAA;AAC1B,IAAA,IAAA,CAAK,IAAA,CAAK,KAAA,EAAM,CAAE,SAAA,CAAU,IAAI,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,MAAM,CAAA;AAE7E,IAAA,MAAM,KAAA,GAAQ,EAAA;AACd,IAAA,MAAM,MAAM,EAAA,GAAK,KAAA;AACjB,IAAA,MAAM,MAAM,KAAA,GAAQ,KAAA;AACpB,IAAA,MAAM,GAAA,GAAM,QAAQ,KAAA,GAAQ,CAAA;AAC5B,IAAA,MAAM,GAAA,GAAM,QAAQ,KAAA,GAAQ,CAAA;AAC5B,IAAA,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AACnC,IAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AACjB,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,EAAM,CAAE,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,UAAU,CAAA;AACpE,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAM,CAAE,IAAA,CAAK,KAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,MAAQ,CAAA;AAGrF,IAAA,IAAI,KAAK,GAAA,CAAI,GAAA,GAAM,IAAA,CAAK,UAAU,IAAI,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,OAAA,EAAS,OAAA,CAAQ,EAAE,QAAA,EAAU,MAAM,CAAA;AACxC,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AAC3E,MAAA,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AACnC,MAAA,IAAA,CAAK,UAAA,GAAa,GAAA;AAAA,IACpB;AACA,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,CAAA,GAAI,CAAA;AACnC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,OAAA,EAAS,MAAA,IAAU,CAAA;AACxC,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA,EAEQ,SAAS,KAAA,EAA0B;AACzC,IAAA,MAAM,CAAA,GAAI,IAAI,SAAA,EAAU;AACxB,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,EAAE,MAAM,sBAAA,EAAwB,KAAA,EAAO,EAAE,UAAA,EAAY,IAAA,CAAK,EAAA,CAAG,MAAM,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,GAAA,EAAK,UAAU,IAAA,EAAM,aAAA,EAAe,KAAA,EAAM,EAAG,CAAA;AACpK,IAAA,CAAA,CAAE,SAAS,CAAC,CAAA;AACZ,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEiB,MAAA,GAAS,CAAC,CAAA,KAAmC;AAC5D,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,MAAA,CAAO,CAAA;AAAA,EACxB,CAAA;AAAA,EACiB,MAAA,GAAS,CAAC,CAAA,KAAmC;AAC5D,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AACpB,IAAA,IAAA,CAAK,OAAA,IAAW,CAAA,CAAE,MAAA,CAAO,CAAA,GAAI,IAAA,CAAK,KAAA;AAClC,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,MAAA,CAAO,CAAA;AACtB,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB,CAAA;AAAA,EACiB,OAAO,MAAY;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EAClB,CAAA;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,SAAA,GAAY,KAAK,QAAQ,CAAA;AACtD,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AACtD,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,IAAI,IAAA,CAAK,OAAA;AAAA,EAC1C;AAAA,EAEQ,UAAU,IAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,QAAA,GAAW,MAAA;AACnC,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,CAAA,GAAI,CAAA;AACxB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AACf,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,QAAA,IAAA,CAAK,YAAA,GAAe,CAAC,CAAA,KAAkB;AACrC,UAAA,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA;AAClB,UAAA,IAAA,CAAK,WAAA,EAAY;AAAA,QACnB,CAAA;AACA,QAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,IAAA,CAAK,cAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,MACvE;AAAA,IACF,CAAA,MAAA,IAAW,KAAK,YAAA,EAAc;AAC5B,MAAA,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,IAAA,CAAK,YAAY,CAAA;AACrD,MAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAES,OAAA,GAAgB;AACvB,IAAA,IAAI,KAAK,YAAA,EAAc,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,KAAK,YAAY,CAAA;AAC5E,IAAA,IAAA,CAAK,MAAM,OAAA,EAAQ;AACnB,IAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,EAChB;AACF;AC1JO,IAAM,aAAA,GAAN,cAA4B,WAAA,CAAY;AAAA,EAO7C,WAAA,CACmB,cACA,QAAA,EACA,MAAA,EACjB,IACiB,MAAA,EACA,IAAA,GAAyB,EAAC,EAC3C;AACA,IAAA,KAAA,CAAM,cAAc,EAAE,CAAA;AAPL,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAGjB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,IAAS,GAAA;AAE3B,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,KAAK,OAAO,CAAA;AACpD,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA;AAAA,MACb,KAAK,YAAA,CAAa,KAAA,CAAM,UAAU,MAAM,IAAA,CAAK,iBAAiB,CAAA;AAAA,MAC9D,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,SAAA,CAAU,MAAM;AAC7B,QAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,OAAA,EAAQ;AAAA,MACpC,CAAC;AAAA,KACH;AAEA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,KAAY,OAAA,EAAS;AACzC,MAAA,IAAA,CAAK,SAAS,SAAA,GAAY,QAAA;AAC1B,MAAA,IAAA,CAAK,SAAS,EAAA,CAAG,YAAA,EAAc,MAAM,IAAA,CAAK,YAAA,CAAa,YAAY,CAAA;AAAA,IACrE;AAAA,EACF;AAAA,EAzBmB,YAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EAEA,MAAA;AAAA,EACA,IAAA;AAAA,EAZF,QAAA,GAAW,IAAIA,QAAAA,EAAS;AAAA,EACxB,IAAA,GAAO,IAAIA,QAAAA,EAAS;AAAA,EACpB,OAAA,GAAU,IAAIC,SAAAA,EAAU;AAAA,EACjC,aAA4B,EAAC;AAAA,EACpB,KAAA;AAAA,EA8BT,OAAA,GAAgB;AACtB,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ;AAC3C,IAAA,IAAA,CAAK,WAAW,MAAA,GAAS,CAAA;AAGzB,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAe,QAAS,OAAA,EAAQ;AAEjE,IAAA,MAAM,MAAM,gBAAA,CAAiB,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,UAAU,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,KAAA,EAAO,EAAE,cAAc,IAAA,CAAK,IAAA,CAAK,cAAc,CAAA;AACnI,IAAA,IAAA,CAAK,aAAa,GAAA,CAAI,KAAA;AACtB,IAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,GAAG,GAAA,CAAI,OAAA,CAAQ,gBAAgB,CAAA;AACrD,IAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,GAAA,CAAI,GAAG,CAAC,GAAA,CAAI,SAAS,CAAC,CAAA;AAC5C,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,GAAA,CAAI,MAAM,CAAA;AAAA,EACxC;AAAA,EAEQ,UAAA,CAAW,OAAe,MAAA,EAAsB;AACtD,IAAA,MAAM,CAAA,GAAI,KAAK,EAAA,CAAG,KAAA;AAClB,IAAA,IAAA,CAAK,IAAA,CAAK,KAAA,EAAM,CACb,SAAA,CAAU,CAAC,KAAA,GAAQ,CAAA,EAAG,CAAC,MAAA,GAAS,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAE,OAAO,IAAI,CAAA,CAC/D,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,OAAA,EAAS,CAAA,CAC/B,MAAA,CAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA;AAE7C,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,KAAY,OAAA,EAAS;AACzC,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,EAAO,IAAA,EAAO,GAAA,EAAM,GAAI,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAU,KAAA,EAAO,KAAK,CAAA;AAAA,IACnF;AAAA,EACF;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,MAAM,IAAA,GAAO,KAAK,YAAA,CAAa,MAAA;AAC/B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,MAAA,GAAS,MAAA;AAAA,EACnC;AAAA,EAES,OAAA,GAAgB;AACvB,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ;AAC3C,IAAA,IAAA,CAAK,WAAW,MAAA,GAAS,CAAA;AACzB,IAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,EAChB;AACF;AC9DA,SAAS,kBAAA,CAAmB,GAAc,EAAA,EAAmC;AAC3E,EAAA,MAAM,IAAA,GAAO,MAAA,IAAU,CAAA,IAAK,CAAA,CAAE,IAAA,GAAO,CAAA,sBAAA,EAAyBC,UAAA,CAAI,EAAA,CAAG,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA,MAAA,CAAA,GAAW,EAAA;AACxF,EAAA,MAAM,KAAA,GAAQ,OAAA,IAAW,CAAA,IAAK,CAAA,CAAE,KAAA,GAAQA,WAAI,EAAA,CAAG,CAAA,CAAE,KAAK,CAAC,CAAA,GAAI,EAAA;AAC3D,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,gEAAA,EAAmE,KAAK,CAAA,8CAAA,EAAiD,CAAA,CAAE,EAAE,CAAA,iBAAA,EAAoB,CAAA,CAAE,EAAA,GAAK,UAAA,GAAa,EAAE,CAAA,gBAAA,EAAmB,IAAI,CAAA,MAAA,CAAA;AAAA,IACvM,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,sDAAA,EAAyD,KAAK,CAAA,wBAAA,EAA2B,CAAA,CAAE,EAAE,qDAAqD,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,UAAA,EAAa,IAAI,CAAA,MAAA,CAAA;AAAA,IAC1L,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,eAAA,EAAkBA,UAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,EAAI,CAAA,MAAO,CAAA,CAAE,KAAA,IAAS,CAAA,CAAA,GAAK,WAAA,GAAc,EAAE,CAAA,CAAA,EAAIA,UAAA,CAAI,EAAA,CAAG,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA,SAAA,CAAW,CAAA,CAAE,KAAK,EAAE,CAAA;AACtJ,MAAA,OAAO,CAAA,sDAAA,EAAyD,KAAK,CAAA,yBAAA,EAA4B,CAAA,CAAE,EAAE,CAAA,EAAA,EAAK,IAAI,oBAAoB,IAAI,CAAA,MAAA,CAAA;AAAA,IACxI;AAAA,IACA;AACE,MAAA,OAAO,EAAA;AAAA;AAEb;AAMO,SAAS,aAAA,CAAc,KAAkB,EAAA,EAAwB;AACtE,EAAA,MAAM,IAAA,GAAiB,EAAA,CAAG,IAAA,EAAM,IAAA,IAAQ,EAAC;AACzC,EAAA,MAAM,EAAA,GAAK,CAAC,CAAA,KAAsB,EAAA,CAAG,EAAE,CAAC,CAAA;AACxC,EAAA,MAAM,YAA+B,EAAC;AAEtC,EAAA,MAAMC,KAAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,EAAAA,MAAK,SAAA,GAAY,UAAA;AACjB,EAAA,MAAM,IAAA,GAA+B,EAAE,GAAG,cAAA,EAAgB,UAAU,EAAA,CAAG,KAAA,CAAM,KAAK,MAAA,EAAO;AACzF,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAGA,KAAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAG,CAAC,CAAA;AAItE,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,IAAA,EAAM,MAAA,GAAS,KAAA,CAAM,qBAAK,IAAI,GAAA,CAAI,CAAC,EAAA,CAAG,IAAA,CAAK,MAAA,CAAO,QAAQ,GAAG,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAC,CAAA,GAAI,EAAC;AAC3H,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,GAAS,CAAA,GAC7B,yDAAyD,EAAA,CAAG,UAAU,CAAC,CAAA,6BAAA,EAAgC,QAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,eAAA,EAAkB,CAAC,CAAA,CAAA,EAAI,CAAA,KAAM,EAAA,CAAG,MAAA,CAAO,KAAI,GAAI,WAAA,GAAc,EAAE,CAAA,CAAA,EAAID,WAAI,aAAA,CAAc,CAAC,CAAA,IAAK,CAAC,CAAC,CAAA,SAAA,CAAW,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,uBAAA,CAAA,GAC5O,EAAA;AACJ,EAAA,MAAM,QAAQ,EAAA,CAAG,KAAA;AACjB,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAsB,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACxE,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,IAAa,CAAA,GAChC,CAAA,mEAAA,CAAA,GACA,CAAA,oEAAA,EAAuE,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,gCAAA,EAAmC,CAAC,CAAA,EAAA,EAAKA,UAAA,CAAI,EAAA,CAAG,GAAA,CAAI,CAAC,CAAC,CAAC,CAAC,CAAA,SAAA,CAAW,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,aAAA,CAAA;AAClL,EAAA,MAAM,cAAA,GAAA,CAAkB,IAAA,CAAK,QAAA,IAAY,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,kBAAA,CAAmB,CAAA,EAAG,EAAE,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAG1F,EAAA,MAAM,SAAA,GAAY,KAAK,KAAA,IAAS,SAAA;AAChC,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,EAAY,KAAA,EAAe,MAAc,GAAA,KACvD,CAAA,sDAAA,EAAyDA,WAAI,EAAA,CAAG,KAAK,CAAC,CAAC,CAAA,2CAAA,EAA8C,EAAE,CAAA,kDAAA,EAAqD,GAAG,mCAAmCA,UAAA,CAAI,EAAA,CAAG,IAAI,CAAC,CAAC,CAAA,YAAA,CAAA;AACjO,EAAA,MAAM,YAAA,GACJ,SAAA,KAAc,QAAA,GACV,MAAA,CAAO,UAAU,QAAA,EAAU,iCAAA,EAAmC,EAAA,CAAG,SAAA,CAAU,MAAM,GAAA,EAAK,CAAA,GACtF,SAAA,KAAc,YACZ,MAAA,CAAO,OAAA,EAAS,OAAA,EAAS,qCAAA,EAAuC,EAAA,CAAG,WAAA,CAAY,KAAA,CAAM,GAAA,EAAK,CAAA,GAC1F,MAAA,CAAO,KAAA,EAAO,SAAA,EAAW,oCAAoC,EAAA,CAAG,SAAA,CAAU,KAAA,CAAM,GAAA,EAAK,CAAA,GACrF,EAAA;AAaR,EAAA,MAAM,UAAU,MAA+B;AAC7C,IAAA,MAAME,QAAO,SAAA,CAAU,EAAA,CAAG,KAAA,CAAM,GAAA,IAAO,EAAE,WAAA,EAAa,EAAA,CAAG,QAAA,CAAS,QAAQ,EAAA,EAAI,cAAA,EAAgB,GAAG,QAAA,CAAS,OAAA,IAAW,IAAI,CAAA;AACzH,IAAA,OAAO,CAAC,CAAA,KAAsB,EAAA,CAAG,CAAA,CAAE,GAAGA,KAAI,CAAA;AAAA,EAC5C,CAAA;AACA,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAAuC;AAC5D,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,OAAO,EAAA;AAChC,IAAA,OAAO,oBAAA,CAAqB,UAAA,CAAW,EAAA,CAAG,KAAA,CAAM,GAAA,EAAI,EAAG,IAAA,CAAK,KAAA,EAAO,EAAE,OAAA,EAAS,GAAA,EAAK,GAAG,EAAE,CAAA;AAAA,EAC1F,CAAA;AACA,EAAA,MAAM,iBAAiB,MAAc;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,EAAA;AACxB,IAAA,MAAM,MAAM,OAAA,EAAQ;AACpB,IAAA,OAAO,aAAA,CAAc,GAAG,CAAA,GAAIC,gBAAA,CAAa,IAAA,CAAK,OAAO,GAAA,EAAK,EAAA,CAAG,KAAA,CAAM,GAAA,EAAK,CAAA;AAAA,EAC1E,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,GAAWA,gBAAA,CAAa,IAAA,CAAK,QAAA,EAAU,EAAA,EAAI,EAAA,CAAG,KAAA,CAAM,GAAA,EAAK,CAAA,GAAI,EAAA;AACvF,EAAA,MAAM,YAAY,cAAA,EAAe;AACjC,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA,GAChB,CAAA,kCAAA,EAAqC,IAAA,CAAK,OAAO,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,QAAA,EAAW,IAAA,CAAK,MAAA,CAAO,KAAK,MAAM,EAAE,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,SAAA,EAAY,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,EAAE,CAAA,CAAA,CAAA,GAC9K,EAAA,CAAG,QAAA,CAAS,OACV,CAAA,0BAAA,EAA6BH,UAAA,CAAI,GAAG,QAAA,CAAS,IAAI,CAAC,CAAA,KAAA,CAAA,GAClD,EAAA;AAEN,EAAAC,MAAK,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAKT,MAAM;AAAA,mCAAA,EACqB,EAAA,CAAG,UAAU,CAAC,CAAA;AAAA,wEAAA,EACuB,GAAG,OAAO,CAAC,CAAA,gHAAA,EAAmH,EAAA,CAAG,0CAA0C,CAAC,CAAA;AAAA,QAAA,EAC5O,YAAY;AAAA,QAAA,EACZ,OAAO;AAAA,sEAAA,EACuD,EAAA,CAAG,YAAY,CAAC,CAAA,OAAA,EAAU,QAAQ,CAAA,4BAAA,EAA+B,EAAA,CAAG,uEAAuE,CAAC,CAAA;AAAA,QAAA,EAC1M,cAAc;AAAA,QAAA,EACd,YAAA,GAAe,8BAA8B,EAAA,CAAG,UAAU,CAAC,CAAA,aAAA,EAAgB,YAAY,KAAK,EAAE;AAAA,QAAA,EAC9F,SAAA,GAAY,8BAA8B,EAAA,CAAG,OAAO,CAAC,CAAA,mDAAA,EAAsD,SAAS,WAAW,EAAE;AAAA;AAAA,UAAA,CAAA;AAGzI,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,WAAA,GAAc,aAAA;AACpB,EAAAA,KAAAA,CAAK,YAAY,KAAK,CAAA;AACtB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAYA,KAAI,CAAA;AAE9B,EAAA,MAAM,CAAA,GAAI,CAAoB,GAAA,KAA0BA,KAAAA,CAAK,cAAc,GAAG,CAAA;AAG9E,EAAA,MAAM,KAAA,GAAQ,EAAoB,YAAY,CAAA;AAC9C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,KAAA,CAAM,OAAA,GAAU,CAAC,EAAA,CAAG,KAAA,CAAM,GAAA,EAAI;AAC9B,IAAA,KAAA,CAAM,gBAAA,CAAiB,UAAU,MAAM,EAAA,CAAG,SAAS,CAAC,KAAA,CAAM,OAAO,CAAC,CAAA;AAClE,IAAA,SAAA,CAAU,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM;AAAE,MAAA,KAAA,CAAM,UAAU,CAAC,CAAA;AAAA,IAAG,CAAC,CAAC,CAAA;AAAA,EACnE;AAEA,EAAAA,MAAK,gBAAA,CAAmC,YAAY,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAO;AACpE,IAAA,MAAM,KAAA,GAAQ,GAAG,OAAA,CAAQ,GAAA;AACzB,IAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,MAAM;AACjC,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AACzB,MAAA,IAAI,KAAA,KAAU,OAAA,EAAS,EAAA,CAAG,WAAA,CAAY,cAAc,CAAC,CAAA;AAAA,WAAA,IAC5C,KAAA,KAAU,KAAA,EAAO,EAAA,CAAG,SAAA,CAAU,cAAc,CAAC,CAAA;AAAA,WACjD;AAAE,QAAA,EAAA,CAAG,WAAA,CAAY,cAAc,CAAC,CAAA;AAAG,QAAA,EAAA,CAAG,SAAA,CAAU,cAAc,CAAC,CAAA;AAAA,MAAG;AAAA,IACzE,CAAC,CAAA;AAED,IAAA,MAAM,GAAA,GAAM,KAAA,KAAU,OAAA,GAAU,EAAA,CAAG,cAAc,EAAA,CAAG,SAAA;AACpD,IAAA,SAAA,CAAU,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM;AAAE,MAAA,EAAA,CAAG,KAAA,GAAQ,OAAO,CAAC,CAAA;AAAA,IAAG,CAAC,CAAC,CAAA;AAAA,EACtE,CAAC,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,EAAqB,WAAW,CAAA;AAC7C,EAAA,IAAI,IAAA,OAAW,gBAAA,CAAiB,QAAA,EAAU,MAAM,EAAA,CAAG,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA;AAExE,EAAA,IAAI,KAAA,CAAM,aAAa,CAAA,EAAG;AACxB,IAAA,MAAM,EAAA,GAAK,EAAoB,YAAY,CAAA;AAC3C,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,EAAA,CAAG,UAAU,KAAA,CAAM,IAAA;AACnB,MAAA,EAAA,CAAG,iBAAiB,QAAA,EAAU,MAAM,MAAM,GAAA,CAAI,EAAA,CAAG,OAAO,CAAC,CAAA;AACzD,MAAA,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,SAAA,CAAU,MAAM;AAAE,QAAA,EAAA,CAAG,UAAU,KAAA,CAAM,IAAA;AAAA,MAAM,CAAC,CAAC,CAAA;AAAA,IAC1E;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAKA,KAAAA,CAAK,gBAAA,CAAoC,UAAU,CAAC,CAAA;AAC5E,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAiB,OAAA,EAAS,MAAM,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;AAC1F,IAAA,MAAM,OAAO,MAAY,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA,KAAM,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,CAAC,CAAA;AACrG,IAAA,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,SAAA,CAAU,IAAI,CAAC,CAAA;AAC1C,IAAA,IAAA,EAAK;AAAA,EACP;AAEA,EAAAA,MAAK,gBAAA,CAA8B,YAAY,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAO;AAC/D,IAAA,MAAM,EAAA,GAAK,GAAG,OAAA,CAAQ,GAAA;AACtB,IAAA,IAAI,cAAc,gBAAA,IAAoB,EAAA,CAAG,SAAS,UAAA,EAAY,EAAA,CAAG,iBAAiB,QAAA,EAAU,MAAM,GAAG,GAAA,CAAI,IAAA,CAAK,WAAW,EAAE,EAAA,EAAI,IAAI,EAAA,CAAG,OAAA,EAAS,CAAC,CAAA;AAAA,SAAA,IACvI,EAAA,YAAc,oBAAoB,EAAA,CAAG,IAAA,KAAS,SAAS,EAAA,CAAG,gBAAA,CAAiB,SAAS,MAAM,EAAA,CAAG,IAAI,IAAA,CAAK,cAAA,EAAgB,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,EAAA,CAAG,KAAK,CAAA,EAAG,CAAC,CAAA;AAAA,SAAA,IACtJ,cAAc,iBAAA,EAAmB,EAAA,CAAG,iBAAiB,QAAA,EAAU,MAAM,GAAG,GAAA,CAAI,IAAA,CAAK,kBAAkB,EAAE,EAAA,EAAI,OAAO,EAAA,CAAG,KAAA,EAAO,OAAO,EAAA,CAAG,aAAA,EAAe,CAAC,CAAA;AAAA,EAC/J,CAAC,CAAA;AAED,EAAAA,KAAAA,CAAK,gBAAA,CAAiB,cAAc,CAAA,CAAE,QAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,gBAAA,CAAiB,SAAS,MAAM,EAAA,CAAG,aAAA,CAAc,UAAA,EAAY,CAAC,CAAA;AAKrH,EAAA,MAAM,eAAe,MAAY;AAC/B,IAAA,MAAM,OAAA,GAAUA,KAAAA,CAAK,aAAA,CAAc,YAAY,CAAA;AAC/C,IAAA,IAAI,OAAA,IAAW,IAAA,CAAK,KAAA,EAAO,OAAA,CAAQ,YAAY,cAAA,EAAe;AAAA,EAChE,CAAA;AACA,EAAA,SAAA,CAAU,IAAA;AAAA,IACR,EAAA,CAAG,MAAA,CAAO,SAAA,CAAU,MAAM;AACxB,MAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAC3C,MAAA,IAAI,IAAA,EAAM;AAER,QAAA,YAAA,EAAa;AACb,QAAA,IAAI,IAAA,EAAM,IAAA,CAAK,KAAA,GAAQ,EAAA,CAAG,OAAO,GAAA,EAAI;AAAA,MACvC;AAAA,IACF,CAAC,CAAA;AAAA,IACD,EAAA,CAAG,KAAA,CAAM,SAAA,CAAU,YAAY;AAAA,GACjC;AAIA,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,SAAA,CAAU,IAAA;AAAA,IACR,EAAA,CAAG,aAAA,CAAc,KAAA,CAAM,SAAA,CAAU,MAAM;AACrC,MAAA,MAAM,MAAA,GAAS,GAAG,aAAA,CAAc,MAAA;AAChC,MAAAA,KAAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,MAAM,CAAA;AACpC,MAAA,IAAI,MAAA,IAAU,CAAC,UAAA,EAAY;AAAE,QAAA,EAAA,CAAG,IAAA,EAAK;AAAG,QAAA,UAAA,GAAa,IAAA;AAAA,MAAM,CAAA,MAAA,IAClD,CAAC,MAAA,IAAU,UAAA,EAAY;AAAE,QAAA,EAAA,CAAG,MAAA,EAAO;AAAG,QAAA,UAAA,GAAa,KAAA;AAAA,MAAO;AAAA,IACrE,CAAC;AAAA,GACH;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,KAAA,MAAW,CAAA,IAAK,SAAA,CAAU,MAAA,CAAO,CAAC,GAAG,CAAA,EAAE;AACvC,IAAA,IAAI,UAAA,EAAY;AAAE,MAAA,EAAA,CAAG,MAAA,EAAO;AAAG,MAAA,UAAA,GAAa,KAAA;AAAA,IAAO;AACnD,IAAAA,MAAK,MAAA,EAAO;AAAA,EACd,CAAA;AACF;;;ACpMA,SAAS,eAAA,CAAgB,EAAA,EAAY,IAAA,EAAkB,SAAA,EAAmB,QAAA,EAA4B;AACpG,EAAA,MAAM,MAAM,IAAA,CAAK,QAAA,IAAY,EAAA,CAAG,OAAA,CAAQ,SAAS,GAAA,EAAI;AACrD,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAsB,mBAAA,CAAoB,GAAG,GAAG,CAAA;AAC/D,EAAA,EAAA,CAAG,UAAA;AAAA,IACD;AAAA,MACE,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,iBAAA,EAAmB,MAAM,qBAAA,EAAsB;AAAA,MACtE;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,EAAA,EAAI,iBAAA;AAAA,QACJ,KAAA,EAAO;AAAA,UACL,EAAE,KAAA,EAAO,uBAAA,EAAyB,OAAO,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,EAAE;AAAA,UAC7D,EAAE,KAAA,EAAO,8BAAA,EAAgC,OAAO,CAAA,EAAG,IAAA,CAAK,cAAc,CAAA,IAAA,CAAA,EAAI;AAAA,UAC1E,EAAE,KAAA,EAAO,gCAAA,EAAkC,OAAO,CAAA,EAAG,IAAA,CAAK,gBAAgB,CAAA,IAAA,CAAA,EAAI;AAAA,UAC9E,EAAE,KAAA,EAAO,sBAAA,EAAwB,OAAO,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAAE;AAC7D;AACF,KACF;AAAA,IACA,CAAC,EAAE,KAAA,EAAO,WAAW,OAAA,EAAS,SAAA,EAAW,UAAU,MAAM;AAAE,MAAA,EAAA,CAAG,UAAA,EAAW;AAAG,MAAA,QAAA,EAAS;AAAA,IAAG,GAAG,CAAA;AAAA,IAC3F,EAAE,UAAU,IAAA;AAAK,GACnB;AACF;AAoHO,SAAS,SAAS,GAAA,EAAkB,IAAA,GAAe,EAAC,EAAG,IAAA,GAAmB,EAAC,EAAc;AAC9F,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,GAAG,UAAS,GAAI,IAAA;AACzC,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,IAAA,EAAM,KAAK,CAAA;AAG/B,EAAA,MAAM,WAAA,GAAc,QAAA,KAAa,IAAA,IAAQ,QAAA,CAAS,IAAA,KAAS,KAAA;AAG3D,EAAA,MAAM,OAAA,GAAU,KAAK,MAAA,GAAS,KAAA,CAAM,qBAAK,IAAI,GAAA,CAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAQ,GAAG,MAAA,CAAO,KAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAC,CAAA,GAAI,EAAC;AACjH,EAAA,MAAM,OAAO,QAAA,CAAS,IAAA,KAAS,KAAA,IAAS,WAAA,GAAc,QAAQ,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,EAAE,SAAS,cAAA,EAAgB,IAAA,CAAK,gBAAgB,aAAA,EAAe,IAAA,CAAK,OAAO,CAAA;AAEhK,EAAA,IAAI,IAAA,IAAQ,KAAK,IAAA,KAAS,IAAA,CAAK,KAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,OAAA,CAAA,EAAU;AAC9D,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,kBAAA,EAAoB,IAAA,EAAM,CAAC,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,OAAA,GAAU,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,UAAO,CAAA,EAAG,CAAA;AAAA,EAC7J;AACA,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,EAAA,EAAI,EAAE,GAAG,QAAA,EAAU,MAAM,CAAA;AACrD,EAAA,IAAA,CAAK,MAAM,GAAG,CAAA;AAEd,EAAA,MAAM,eAAA,GAAkB,WAAA,GAAc,aAAA,CAAc,GAAA,EAAK,EAAE,CAAA,GAAI,MAAA;AAS/D,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAA0B;AAC5C,IAAA,MAAA,EAAQ,aAAA,CAAc,IAAI,YAAA,CAAa,WAAA,EAAa;AAAA,MAClD,WAAW,CAAA,CAAE,SAAA;AAAA,MAAW,aAAa,CAAA,CAAE,WAAA;AAAA,MAAa,WAAW,CAAA,CAAE,SAAA;AAAA,MACjE,SAAS,CAAA,CAAE,OAAA;AAAA,MAAS,SAAS,CAAA,CAAE,OAAA;AAAA,MAAS,QAAA,EAAU,CAAA;AAAA,MAAG,OAAA,EAAS,IAAA;AAAA,MAAM,UAAA,EAAY,IAAA;AAAA,MAAM,QAAA,EAAU;AAAA,KACjG,CAAC,CAAA;AAAA,EACJ,CAAA;AACA,EAAA,MAAA,EAAQ,gBAAA,CAAiB,eAAA,EAAiB,UAAA,EAAY,IAAI,CAAA;AAM1D,EAAA,MAAM,QAAyB,EAAC;AAChC,EAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,MAAA,EAAQ;AAC5B,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,EAAA,EAAI,EAAA,CAAG,GAAG,CAAA;AACnC,MAAA,EAAA,CAAG,QAAA,CAAS,MAAM,KAAK,CAAA;AACvB,MAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,QAAA,EAAU,EAAA,CAAG,SAAS,CAAC,CAAA;AAC7C,MAAA,MAAM,IAAA,GAAO,IAAI,aAAA,CAAc,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,MAAA,EAAQ,EAAA,EAAI,GAAA,CAAI,MAAA,EAAQ;AAAA,QACxF,cAAc,QAAA,CAAS;AAAA,OACxB,CAAA;AACD,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,IAAI,CAAA;AACvB,MAAA,IAAA,CAAK,WAAA,CAAY,EAAA,CAAG,MAAA,CAAO,GAAA,EAAK,CAAA;AAChC,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,MAAM,WAAA,GAAc,EAAA,CAAG,MAAA,CAAO,SAAA,CAAU,MAAM;AAC5C,IAAA,MAAM,CAAA,GAAI,EAAA,CAAG,MAAA,CAAO,GAAA,EAAI;AACxB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,CAAA,CAAE,WAAA,CAAY,CAAC,CAAA;AAAA,EACxC,CAAC,CAAA;AAED,EAAA,MAAM,WAAW,MAAY;AAC3B,IAAA,WAAA,EAAY;AACZ,IAAA,MAAA,EAAQ,mBAAA,CAAoB,eAAA,EAAiB,UAAA,EAAY,IAAI,CAAA;AAC7D,IAAA,eAAA,IAAkB;AAClB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,CAAA,CAAE,OAAA,EAAQ;AACjC,IAAA,KAAA,CAAM,MAAA,GAAS,CAAA;AACf,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,EAAA,CAAG,OAAA,EAAQ;AAAA,EACb,CAAA;AAEA,EAAA,SAAS,EAAA,CAAiC,MAAS,EAAA,EAA2C;AAC5F,IAAA,OAAO,EAAA,CAAG,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA;AAAA,EACvB;AAEA,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,IAAA;AAAA,IACA,EAAA;AAAA,IACA,YAAY,CAAC,CAAA,KAAM,EAAA,CAAG,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,IACnC,QAAQ,CAAC,CAAA,KAAM,EAAA,CAAG,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IAC3B,aAAa,CAAC,CAAA,KAAM,EAAA,CAAG,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,IACrC,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,MAAA,EAAA,CAAG,OAAA,CAAQ,YAAY,CAAC,CAAA;AACxB,MAAA,EAAA,CAAG,GAAA,CAAI,YAAY,CAAC,CAAA;AACpB,MAAA,EAAA,CAAG,QAAA,CAAS,YAAY,CAAC,CAAA;AACzB,MAAA,EAAA,CAAG,WAAA,CAAY,YAAY,CAAC,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,iBAAA,EAAmB,CAAC,CAAA,KAAM,EAAA,CAAG,kBAAkB,CAAC,CAAA;AAAA,IAChD,aAAa,CAAC,GAAA,EAAK,QAAQ,EAAA,CAAG,WAAA,CAAY,KAAK,GAAG,CAAA;AAAA,IAClD,QAAQ,CAAC,CAAA,KAAM,EAAA,CAAG,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IAC3B,QAAA,EAAU,CAAC,CAAA,KAAM,EAAA,CAAG,SAAS,CAAC,CAAA;AAAA,IAC9B,YAAY,CAAC,MAAA,EAAQ,YAAY,EAAA,CAAG,UAAA,CAAW,QAAQ,OAAO,CAAA;AAAA,IAC9D,WAAW,CAAC,OAAA,EAASG,UAAS,EAAA,CAAG,SAAA,CAAU,SAASA,KAAI,CAAA;AAAA,IACxD,cAAc,CAAC,IAAA,EAAMA,UAAS,EAAA,CAAG,YAAA,CAAa,MAAMA,KAAI,CAAA;AAAA,IACxD,WAAW,CAAC,OAAA,EAASA,UAAS,EAAA,CAAG,SAAA,CAAU,SAASA,KAAI,CAAA;AAAA,IACxD,UAAA,EAAY,MAAM,EAAA,CAAG,UAAA,EAAW;AAAA,IAChC,WAAW,CAACC,GAAAA,EAAI,SAAS,EAAA,CAAG,SAAA,CAAUA,KAAI,IAAI,CAAA;AAAA,IAC9C,cAAc,CAAC,CAAA,KAAM,EAAA,CAAG,IAAA,CAAK,aAAa,CAAC,CAAA;AAAA,IAC3C,SAAA,EAAW,CAACA,GAAAA,KAAO,EAAA,CAAG,UAAUA,GAAE,CAAA;AAAA,IAClC,WAAA,EAAa,CAAC,IAAA,EAAM,MAAA,KAAW;AAC7B,MAAA,EAAA,CAAG,UAAU,IAAI,CAAA;AACjB,MAAA,eAAA,CAAgB,EAAA,EAAI,IAAA,EAAM,oBAAA,EAAsB,MAAM,UAAU,CAAA;AAAA,IAClE,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,IAAA,EAAM,QAAA,KAAa;AAC7B,MAAA,eAAA,CAAgB,EAAA,EAAI,IAAA,EAAM,qBAAA,EAAuB,QAAQ,CAAA;AAAA,IAC3D,CAAA;AAAA,IACA,UAAA,EAAY,CAAC,CAAA,KAAM;AAEjB,MAAA,IAAI,EAAA,CAAG,UAAA,CAAW,YAAY,CAAA,EAAG;AACjC,MAAA,EAAA,CAAG,UAAA;AAAA,QACD;AAAA,UACE,EAAE,MAAM,SAAA,EAAW,EAAA,EAAI,aAAa,IAAA,EAAM,CAAA,CAAE,SAAS,yBAAA,EAA0B;AAAA,UAC/E,EAAE,MAAM,MAAA,EAAQ,EAAA,EAAI,YAAY,IAAA,EAAM,CAAA,CAAE,WAAW,2BAAA;AAA4B,SACjF;AAAA,QACA;AAAA,UACE,EAAE,KAAA,EAAO,CAAA,CAAE,WAAA,IAAe,eAAA,EAAiB,SAAS,WAAA,EAAY;AAAA,UAChE,EAAE,OAAO,CAAA,CAAE,YAAA,IAAgB,kBAAkB,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,CAAA,CAAE,SAAA;AAAU;AACzF,OACF;AAAA,IACF,CAAA;AAAA,IACA,gBAAA,EAAkB,CAAC,IAAA,KAAS,EAAA,CAAG,iBAAiB,IAAI,CAAA;AAAA,IACpD,iBAAA,EAAmB,CAAC,CAAA,KAAM;AACxB,MAAA,IAAI,EAAA,CAAG,UAAA,CAAW,YAAY,CAAA,EAAG;AACjC,MAAA,IAAI,CAAC,EAAA,CAAG,gBAAA,CAAiB,CAAA,CAAE,IAAI,CAAA,EAAG;AAChC,QAAA,CAAA,CAAE,SAAA,EAAU;AACZ,QAAA;AAAA,MACF;AAIA,MAAA,MAAM,OAAA,GACJ,EAAE,OAAA,KACD,CAAA,CAAE,OACC,EAAA,CAAG,CAAA,CAAE,2BAAA,EAA6B,EAAE,IAAA,EAAM,EAAA,CAAG,EAAE,CAAA,CAAE,IAAI,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,KAAA,IAAS,IAAI,CAAA,GAC9E,EAAA,CAAG,CAAA,CAAE,2BAA2B,CAAA,CAAA;AACtC,MAAA,EAAA,CAAG,UAAA;AAAA,QACD;AAAA,UACE,EAAE,MAAM,SAAA,EAAW,EAAA,EAAI,qBAAqB,IAAA,EAAM,CAAA,CAAE,SAAS,yBAAA,EAA0B;AAAA,UACvF,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,kBAAA,EAAoB,MAAM,OAAA;AAAQ,SACxD;AAAA,QACA;AAAA,UACE,EAAE,KAAA,EAAO,CAAA,CAAE,WAAA,IAAe,eAAA,EAAiB,SAAS,WAAA,EAAY;AAAA,UAChE,EAAE,OAAO,CAAA,CAAE,YAAA,IAAgB,kBAAkB,OAAA,EAAS,SAAA,EAAW,UAAU,MAAM;AAAE,YAAA,EAAA,CAAG,UAAA,EAAW;AAAG,YAAA,CAAA,CAAE,SAAA,EAAU;AAAA,UAAG,CAAA;AAAE;AACvH,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAA,EAAc,MAAM,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAAA,IAChD,YAAA,EAAc,MAAM,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAA;AAAA,IACjD,kBAAA,EAAoB,CAAC,CAAA,KAAM,IAAA,CAAK,mBAAmB,CAAC,CAAA;AAAA,IACpD,QAAA,EAAU,MAAM,EAAA,CAAG,QAAA,EAAS;AAAA,IAC5B,QAAQ,IAAA,CAAK,QAAA;AAAA,IACb,aAAa,EAAA,CAAG,MAAA;AAAA,IAChB,SAAA,EAAW,MAAM,EAAA,CAAG,IAAA,EAAK;AAAA,IACzB,WAAA,EAAa,MAAM,EAAA,CAAG,MAAA,EAAO;AAAA,IAC7B,OAAA,EAAS,QAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AACF;ACjRA,IAAM,KAAA,GAAQ;AAAA,EACZ,OAAA,EAAS,SAAA;AAAA,EACT,UAAA,EAAY,SAAA;AAAA,EACZ,IAAA,EAAM,SAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,MAAA,EAAQ,SAAA;AAAA,EACR,UAAA,EAAY,SAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAA;AAGA,IAAM,MAAA,GAAS,GAAA;AACf,IAAM,KAAA,GAAQ,GAAA;AACd,IAAM,OAAA,GAAU,CAAA;AAChB,IAAM,MAAA,GAAS,GAAA;AACf,IAAM,OAAA,GAAU,EAAA;AAChB,IAAM,KAAA,GAAQ,EAAA;AACd,IAAM,MAAA,GAAS,SAAS,OAAA,GAAU,KAAA;AAClC,IAAMC,IAAAA,GAAM,EAAA;AACZ,IAAM,MAAA,GAAS,EAAA;AACf,IAAM,KAAA,GAAQ,GAAA;AACd,IAAM,KAAA,GAAQ,EAAA;AACd,IAAM,OAAA,GAAU,EAAA;AAChB,IAAM,OAAA,GAAU,EAAA;AAChB,IAAM,QAAA,GAAW,EAAA;AAGjB,IAAM,QAAA,uBAAe,GAAA,EAA8B;AACnD,SAAS,QAAQ,GAAA,EAA+B;AAC9C,EAAA,IAAI,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACxB,EAAA,IAAI,CAAC,CAAA,EAAG;AAAE,IAAA,CAAA,GAAI,OAAO,IAAA,CAAc,GAAG,EAAE,KAAA,CAAM,MAAM,QAAQ,KAAK,CAAA;AAAG,IAAA,QAAA,CAAS,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EAAG;AAC1F,EAAA,OAAO,CAAA;AACT;AAKA,SAAS,OAAA,CAAQ,IAAA,EAAiB,GAAA,EAAgB,KAAA,EAAyB;AACzE,EAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AACjB,EAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,EAAA,IAAA,CAAK,OAAA,GAAU,GAAA;AACf,EAAA,IAAI,IAAA,GAAwC,IAAA;AAC5C,EAAA,IAAA,CAAK,EAAA,CAAG,aAAA,EAAe,CAAC,CAAA,KAA6B;AAAE,IAAA,IAAA,GAAO,EAAE,GAAG,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA,EAAE;AAAG,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EAAM,CAAC,CAAA;AACpH,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,EAA0B,MAAA,KAA0B;AAC/D,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,MAAM,CAAA,GAAI,IAAA;AAAM,IAAA,IAAA,GAAO,IAAA;AACvB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAI,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,OAAO,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,UAAU,KAAA,EAAM;AAAA,EAClF,CAAA;AACA,EAAA,IAAA,CAAK,GAAG,WAAA,EAAa,CAAC,MAAM,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AACxC,EAAA,IAAA,CAAK,GAAG,kBAAA,EAAoB,CAAC,MAAM,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAClD;AAIA,IAAM,WAAA,GAAN,cAA0BP,SAAAA,CAAU;AAAA,EACjB,SAAA;AAAA,EACA,QAAA,GAAW,IAAID,QAAAA,EAAS;AAAA,EACxB,WAAA;AAAA,EACA,MAAA,GAAS,IAAIC,SAAAA,EAAU;AAAA,EAExC,WAAA,CAAY,IAAA,EAAmB,EAAA,EAAY,QAAA,EAAsB;AAC/D,IAAA,KAAA,EAAM;AACN,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,CAAM,IAAA,CAAK,MAAA;AAG1B,IAAA,MAAM,OAAO,IAAID,QAAAA,EAAS,CAAE,SAAA,CAAU,GAAG,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAQ,EAAE,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AAC7F,IAAA,MAAM,IAAA,GAAO,IAAIC,SAAAA,EAAU;AAC3B,IAAA,MAAM,QAAA,GAAW,IAAID,QAAAA,EAAS,CAAE,UAAU,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,UAAU,CAAA;AAC5F,IAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AAGZ,IAAA,MAAM,WAAA,GAAc,IAAIA,QAAAA,EAAS,CAAE,KAAK,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,KAAK,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,CAAM,YAAY,CAAA;AAC7F,IAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AACzB,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,KAAK,QAAQ,IAAA,CAAK,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,KAAQ;AACrC,QAAA,IAAI,IAAA,CAAK,SAAA,IAAa,GAAA,KAAQ,OAAA,CAAQ,KAAA,EAAO;AAC7C,QAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAO,GAAG,CAAA;AACzB,QAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,MAAA,GAAS,IAAI,KAAA,EAAO,KAAA,GAAQ,IAAI,MAAM,CAAA;AACzD,QAAA,EAAA,CAAG,KAAA,CAAM,IAAI,CAAC,CAAA;AACd,QAAA,EAAA,CAAG,CAAA,GAAA,CAAK,MAAA,GAAS,GAAA,CAAI,KAAA,GAAQ,CAAA,IAAK,CAAA;AAClC,QAAA,EAAA,CAAG,CAAA,GAAA,CAAK,KAAA,GAAQ,GAAA,CAAI,MAAA,GAAS,CAAA,IAAK,CAAA;AAClC,QAAA,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,MACvB,CAAC,CAAA;AAAA,IACH;AACA,IAAA,MAAM,KAAA,GAAQ,IAAIA,QAAAA,EAAS,CAAE,KAAK,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AACzF,IAAA,MAAM,IAAA,GAAO,IAAIS,IAAAA,CAAK,EAAE,MAAM,EAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,EAAO,EAAE,UAAA,EAAY,GAAA,EAAK,UAAU,EAAA,EAAI,UAAA,EAAY,OAAO,IAAA,EAAM,KAAA,CAAM,IAAA,EAAK,EAAG,CAAA;AAC9H,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA;AACtB,IAAA,IAAA,CAAK,SAAS,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,KAAA,GAAQ,UAAU,EAAE,CAAA;AAClD,IAAA,IAAA,CAAK,YAAY,IAAIA,IAAAA,CAAK,EAAE,IAAA,EAAM,EAAA,EAAI,OAAO,EAAE,UAAA,EAAY,GAAA,EAAK,QAAA,EAAU,IAAI,UAAA,EAAY,KAAA,EAAO,MAAM,KAAA,CAAM,IAAA,IAAQ,CAAA;AACrH,IAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA;AAChC,IAAA,IAAA,CAAK,UAAU,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG,KAAA,GAAQ,UAAU,EAAE,CAAA;AAC5D,IAAA,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,SAAS,CAAA;AAEzC,IAAA,MAAM,SAAS,IAAIT,QAAAA,GAAW,SAAA,CAAU,CAAA,EAAG,GAAG,MAAA,EAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,OAAO,EAAE,KAAA,EAAO,GAAG,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AAC1G,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAG1C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAIS,IAAAA,CAAK,EAAE,MAAM,EAAA,EAAI,KAAA,EAAO,EAAE,UAAA,EAAY,GAAA,EAAK,UAAU,EAAA,EAAI,UAAA,EAAY,OAAO,IAAA,EAAM,KAAA,CAAM,MAAM,aAAA,EAAe,GAAA,IAAO,CAAA;AAC3I,IAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,IAAA,CAAK,WAAA,CAAY,SAAS,GAAA,CAAI,MAAA,GAAS,GAAG,MAAA,GAAS,OAAA,GAAU,QAAQ,CAAC,CAAA;AACtE,IAAA,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,KAAK,WAAW,CAAA;AACpD,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,IAAIC,SAAAA,CAAU,CAAA,EAAG,SAAS,OAAA,EAAS,MAAA,EAAQ,KAAK,CAAA,EAAG,QAAQ,CAAA;AAChF,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,EAC3B;AAAA;AAAA,EAGA,MAAA,CAAO,KAAA,EAAe,KAAA,EAAe,MAAA,EAAiB,OAAA,EAAwB;AAC5E,IAAA,IAAA,CAAK,UAAU,IAAA,GAAO,KAAA;AACtB,IAAA,IAAA,CAAK,YAAY,IAAA,GAAO,KAAA;AACxB,IAAA,IAAA,CAAK,YAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,KAAA,CAAM,aAAa,KAAA,CAAM,IAAA;AAChE,IAAA,IAAA,CAAK,QAAA,CAAS,KAAA,EAAM,CAAE,SAAA,CAAU,CAAA,EAAG,MAAA,GAAS,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,EAAE,CAAA,CACnE,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,MAAA,EAAQ,CAAA;AAClG,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,OAAA,GAAU,MAAA,GAAS,QAAA;AAC3C,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,OAAA,GAAU,IAAA,GAAO,CAAA;AAAA,EACvC;AACF,CAAA;AAEA,IAAM,mBAAA,GAAN,cAAkCT,SAAAA,CAAU;AAAA,EAa1C,WAAA,CAA6B,GAAA,EAAgB,QAAA,EAA0C,IAAA,EAAyB;AAC9G,IAAA,KAAA,EAAM;AADqB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAA0D,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAErF,IAAA,MAAM,KAAK,GAAA,CAAI,EAAA;AACf,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,KAAA,CAAM,IAAA,CAAK,MAAA;AAC1B,IAAA,IAAA,CAAK,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,GAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAGjB,IAAA,EAAA,CAAG,YAAA,CAAa,EAAE,KAAA,EAAO,IAAA,CAAK,KAAK,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,IAAI,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,OAAA,EAAS,MAAM,CAAA,CAAE,IAAA,EAAK,CAAE,CAAA,EAAG,CAAA;AAG5G,IAAA,IAAA,CAAK,SAAS,SAAA,GAAY,QAAA;AAC1B,IAAA,IAAA,CAAK,SAAS,EAAA,CAAG,YAAA,EAAc,MAAM,IAAA,CAAK,OAAO,CAAA;AAGjD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAIQ,IAAAA,CAAK,EAAE,MAAM,EAAA,CAAG,CAAA,CAAE,aAAa,CAAA,EAAG,KAAA,EAAO,EAAE,YAAY,GAAA,EAAK,QAAA,EAAU,IAAI,UAAA,EAAY,KAAA,EAAO,MAAM,SAAA,EAAW,aAAA,EAAe,CAAA,EAAE,EAAG,CAAA;AACnJ,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA;AAG5B,IAAA,MAAM,KAAA,GAAQ,KAAK,UAAA,CAAW,QAAA,EAAK,MAAM,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA;AAC5D,IAAA,MAAM,IAAA,GAAO,KAAK,UAAA,CAAW,GAAA,EAAK,MAAM,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA;AAC3D,IAAA,MAAM,MAAA,GAAS,IAAIR,SAAAA,EAAU;AAC7B,IAAA,MAAM,KAAA,GAAQ,IAAID,QAAAA,EAAS,CAAE,SAAA,CAAU,CAAC,KAAA,GAAQ,CAAA,EAAG,CAAC,KAAA,GAAQ,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AACxJ,IAAA,MAAM,QAAA,GAAW,IAAIS,IAAAA,CAAK,EAAE,MAAM,EAAA,CAAG,CAAA,CAAE,KAAK,CAAA,EAAG,KAAA,EAAO,EAAE,YAAY,GAAA,EAAK,QAAA,EAAU,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,IAAA,EAAM,MAAM,OAAA,EAAS,aAAA,EAAe,CAAA,EAAE,EAAG,CAAA;AACnJ,IAAA,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA;AAAG,IAAA,QAAA,CAAS,SAAS,GAAA,CAAI,CAAA,EAAG,CAAC,KAAA,GAAQ,IAAI,CAAC,CAAA;AACpE,IAAA,IAAA,CAAK,WAAW,IAAIA,IAAAA,CAAK,EAAE,IAAA,EAAM,EAAA,EAAI,OAAO,EAAE,UAAA,EAAY,GAAA,EAAK,QAAA,EAAU,IAAI,UAAA,EAAY,KAAA,EAAO,MAAM,KAAA,CAAM,IAAA,IAAQ,CAAA;AACpH,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA;AAAG,IAAA,IAAA,CAAK,SAAS,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,IAAI,CAAC,CAAA;AAC7E,IAAA,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,IAAIR,SAAAA,EAAU;AAC7B,IAAA,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA;AAC5B,IAAA,MAAA,CAAO,SAAS,GAAA,CAAI,MAAA,GAAS,IAAI,EAAA,GAAK,KAAA,GAAQ,GAAG,CAAC,CAAA;AAClD,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,MAAA,GAAS,CAAA,GAAI,KAAK,KAAA,GAAQ,EAAA,GAAK,QAAQ,CAAC,CAAA;AAC1D,IAAA,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,MAAA,EAAQ,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,IAAA,EAAM;AAC5B,MAAA,MAAM,IAAA,GAAO,IAAI,WAAA,CAAY,IAAA,EAAM,EAAA,EAAI,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,OAAO,CAAC,CAAA;AACjF,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AACpB,MAAA,IAAA,CAAK,QAAA,CAAS,SAAS,IAAI,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAGvD,IAAA,MAAM,MAAM,IAAID,QAAAA,EAAS,CAAE,MAAA,CAAO,GAAG,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AACpF,IAAA,MAAM,EAAA,GAAK,IAAIA,QAAAA,EAAS,CAAE,MAAA,CAAO,EAAA,EAAI,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,EAAE,CAAA,CAAE,MAAA,CAAO,EAAA,EAAI,CAAC,CAAA,CAAE,MAAA,CAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,SAAA,EAAW,GAAA,EAAK,OAAA,EAAS,CAAA;AACrI,IAAA,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA;AAC9B,IAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,IAAIU,SAAAA,CAAU,GAAA,EAAK,GAAA,EAAK,EAAA,EAAI,EAAE,CAAA,EAAG,MAAM,IAAA,CAAK,KAAA,EAAO,CAAA;AAE1E,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAA,EAAS,KAAK,QAAQ,CAAA;AAExD,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA;AAAA,MACb,GAAG,GAAA,CAAI,KAAA,CAAM,UAAU,MAAM,IAAA,CAAK,SAAS,CAAA;AAAA,MAC3C,EAAA,CAAG,MAAA,CAAO,SAAA,CAAU,MAAM;AACxB,QAAA,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,EAAA,CAAG,CAAA,CAAE,aAAa,CAAA;AACpC,QAAA,QAAA,CAAS,IAAA,GAAO,EAAA,CAAG,CAAA,CAAE,KAAK,CAAA;AAC1B,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,IAAA,CAAK,QAAA,EAAS;AAAA,MAChB,CAAC;AAAA,KACH;AAAA,EACF;AAAA,EA/D6B,GAAA;AAAA,EAA0D,IAAA;AAAA,EAZtE,QAAA,GAAW,IAAIV,QAAAA,EAAS;AAAA,EACxB,OAAA,GAAU,IAAIC,SAAAA,EAAU;AAAA,EACxB,QAAA,GAAW,IAAIA,SAAAA,EAAU;AAAA,EACzB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,IAAIA,SAAAA,EAAU;AAAA,EACzB,QAAuB,EAAC;AAAA,EACxB,IAAA;AAAA,EACA,MAAA,uBAAa,GAAA,EAAY;AAAA,EACzB,YAA+B,EAAC;AAAA,EACzC,MAAA;AAAA,EAmEA,MAAA;AAAA,EAEA,UAAA,CAAW,OAAe,KAAA,EAA8B;AAC9D,IAAA,MAAM,CAAA,GAAI,IAAIA,SAAAA,EAAU;AACxB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,MAAM,IAAA,CAAK,MAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAID,QAAAA,EAAS,CAAE,OAAO,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,CAAK,EAAE,OAAO,KAAA,CAAM,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,EAAE,OAAO,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,MAAA,EAAQ,CAAA;AACtH,IAAA,MAAM,IAAI,IAAIS,IAAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,EAAE,UAAA,EAAY,GAAA,EAAK,QAAA,EAAU,IAAI,UAAA,EAAY,KAAA,EAAO,MAAM,KAAA,CAAM,IAAA,IAAQ,CAAA;AACjH,IAAA,CAAA,CAAE,MAAA,CAAO,IAAI,GAAG,CAAA;AAAG,IAAA,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AACvC,IAAA,CAAA,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA;AAChB,IAAA,OAAA,CAAQ,CAAA,EAAG,IAAIC,SAAAA,CAAU,CAAC,MAAA,EAAQ,CAAC,MAAA,EAAQ,MAAA,GAAS,CAAA,EAAG,MAAA,GAAS,CAAC,CAAA,EAAG,KAAK,CAAA;AACzE,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA,EAGQ,OAAA,GAAgB;AACtB,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,EAAA;AACpB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,KAAK,MAAA,EAAO,GAAI,EAAA,CAAG,GAAA,CAAI,GAAA,EAAI;AAC/D,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,GAAA,CAAI,QAAA,CAAS,GAAA,EAAI;AAChC,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAsBC,mBAAAA,CAAoB,GAAG,GAAG,CAAA;AAC/D,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,GAAG,CAAA;AAC9B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,mBAAA,IAAuB,KAAA;AACnD,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC1B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,EAAE,CAAA;AACnC,MAAA,MAAM,OAAA,GAAA,CAAW,EAAE,OAAA,KAAY,KAAA,GAAQ,EAAE,IAAA,GAAO,CAAA,GAAI,EAAE,IAAA,IAAQ,GAAA;AAC9D,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,KAAY,KAAA,GAAQ,GAAG,CAAA,CAAE,KAAK,CAAA,GAAI,MAAA,GAAS,GAAG,CAAA,CAAE,WAAW,CAAA,GAAI,EAAA,CAAG,EAAE,UAAU,CAAA;AAC9F,MAAA,MAAM,UAAU,CAAA,CAAE,OAAA,KAAY,SAAS,SAAA,IAAa,IAAA,CAAK,OAAO,IAAA,GAAO,CAAA;AACvE,MAAA,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAG,MAAA,CAAO,MAAM,OAAO,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC9D,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,QAAA,CAAS,IAAY,OAAA,EAAuC;AAClE,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,EAAA;AACpB,IAAA,MAAM,CAAA,GAAI,KAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC3C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,KAAK,MAAA,EAAO,GAAI,EAAA,CAAG,GAAA,CAAI,GAAA,EAAI;AAC/D,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,GAAA,CAAI,QAAA,CAAS,GAAA,EAAI;AAChC,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAsBA,mBAAAA,CAAoB,GAAG,GAAG,CAAA;AAC/D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,UAAA,IAAc,OAAA;AAC3C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,mBAAA,IAAuB,KAAA;AAEnD,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AACpC,MAAA,MAAM,SAAS,MAAY;AACzB,QAAA,IAAI,UAAA,KAAe,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM;AAC/C,QAAA,IAAI,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,aAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAC9D,QAAA,EAAA,CAAG,GAAA,CAAI,IAAA,CAAK,eAAA,EAAiB,EAAE,IAAI,CAAA;AACnC,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,IAAA,CAAK,IAAA,CAAK,UAAA,GAAa,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA,EAAG,EAAA,EAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAC,CAAA;AAAA,MAClE,CAAA;AACA,MAAA,IAAI,SAAA,EAAW;AAAE,QAAA,MAAA,EAAO;AAAG,QAAA;AAAA,MAAQ;AACnC,MAAA,MAAM,KAAA,GAAQ,CAAA,IAAK,CAAA,EAAG,IAAA,IAAQ,CAAA,CAAA;AAC9B,MAAA,IAAA,CAAK,UAAA,CAAW,GAAG,IAAA,IAAQ,EAAA,EAAI,MAAM,KAAA,GAAQ,GAAG,GAAG,MAAM,CAAA;AAAA,IAC3D,CAAA,MAAO;AACL,MAAA,IAAI,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,IAAA,GAAO,CAAA,EAAG;AACvC,MAAA,MAAM,IAAA,GAAA,CAAQ,CAAA,EAAG,IAAA,IAAQ,CAAA,IAAK,GAAA;AAC9B,MAAA,IAAA,CAAK,WAAW,CAAA,EAAG,IAAA,IAAQ,IAAI,KAAA,CAAM,IAAI,GAAG,MAAM;AAChD,QAAA,EAAA,CAAG,GAAA,CAAI,IAAA,CAAK,eAAA,EAAiB,EAAE,IAAI,CAAA;AACnC,QAAA,IAAA,CAAK,KAAA,EAAM;AACX,QAAA,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,EAAA,EAAI,IAAI,CAAA;AAAA,MAC5B,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA,EAIQ,UAAA,CAAW,IAAA,EAAc,KAAA,EAAe,KAAA,EAAyB;AACvE,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,EAAA;AACpB,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,CAAA,CAAE,2BAAA,EAA6B,EAAE,IAAA,EAAM,EAAA,CAAG,CAAA,CAAE,IAAI,CAAA,EAAG,KAAA,EAAO,CAAA;AAC7E,IAAA,EAAA,CAAG,UAAA;AAAA,MACD;AAAA,QACE,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,eAAA,EAAiB,MAAM,aAAA,EAAc;AAAA,QAC5D,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,eAAA,EAAiB,MAAM,OAAA;AAAQ,OACrD;AAAA,MACA;AAAA,QACE,EAAE,KAAA,EAAO,eAAA,EAAiB,OAAA,EAAS,WAAA,EAAY;AAAA,QAC/C,EAAE,KAAA,EAAO,gBAAA,EAAkB,OAAA,EAAS,SAAA,EAAW,UAAU,MAAM;AAAE,UAAA,EAAA,CAAG,UAAA,EAAW;AAAG,UAAA,KAAA,EAAM;AAAA,QAAG,CAAA;AAAE;AAC/F,KACF;AAAA,EACF;AAAA,EAEA,OAAO,MAAA,EAA2B;AAChC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,QAAA,EAAS;AAAA,EAClC;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,IAAI,CAAA,CAAE,KAAA;AACZ,IAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AAEZ,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM,CAAE,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAC/E,IAAA,IAAA,CAAK,SAAS,OAAA,GAAU,IAAID,UAAU,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAGhD,IAAA,MAAM,CAAA,GAAI,KAAK,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,IAAA,GAAO,CAAA,IAAK,GAAA,KAAQ,CAAA,IAAK,OAAO,CAAA,IAAK,GAAA,CAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAChF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,IAAI,CAAA;AAG/B,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AAC9B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,IAAI,CAAA;AAC7B,MAAA,MAAM,IAAI,CAAA,GAAI,IAAA;AACd,MAAA,IAAA,CAAK,SAAS,GAAA,CAAI,CAAA,IAAK,SAASF,IAAAA,CAAAA,EAAM,CAAA,IAAK,SAASA,IAAAA,CAAI,CAAA;AAAA,IAC1D,CAAC,CAAA;AACD,IAAA,MAAM,KAAA,GAAQ,IAAA,GAAO,MAAA,GAAA,CAAU,IAAA,GAAO,CAAA,IAAKA,IAAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,IAAA,GAAO,MAAA,GAAA,CAAU,IAAA,GAAO,CAAA,IAAKA,IAAAA;AAG3C,IAAA,MAAM,IAAA,GAAO,CAAA,GAAI,MAAA,GAAS,KAAA,GAAQ,EAAA;AAClC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,GAAG,CAAA;AAC1C,IAAA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,QAAA,GAAW,GAAG,CAAC,CAAA;AACvC,IAAA,IAAA,CAAK,MAAA,CAAO,SAAS,GAAA,CAAA,CAAK,QAAA,GAAW,QAAQ,CAAA,EAAG,OAAA,GAAU,UAAU,MAAM,CAAA;AAC1E,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,GAAA,CAAA,CAAK,QAAA,GAAW,SAAS,CAAA,EAAG,OAAA,GAAU,OAAA,GAAU,KAAA,GAAQ,OAAO,CAAA;AACtF,IAAA,MAAM,QAAA,GAAW,OAAA,GAAU,OAAA,GAAU,KAAA,GAAQ,OAAA,GAAU,KAAA;AAGvD,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAI,IAAI,IAAA,GAAQ,QAAA,EAAW,CAAA,GAAI,IAAA,GAAQ,QAAQ,CAAA;AACtE,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AAC5B,IAAA,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAA,CAAK,CAAA,GAAI,QAAA,GAAW,SAAS,CAAA,EAAA,CAAI,CAAA,GAAI,QAAA,GAAW,KAAA,IAAS,CAAC,CAAA;AAEhF,IAAA,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAA,GAAI,IAAI,EAAE,CAAA;AAAA,EACvC;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,EAAK;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AACjB,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,EAAO;AAAA,EACrB;AAAA,EAEA,IAAI,MAAA,GAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,EAAO;AACrC,IAAA,KAAA,MAAW,KAAK,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,CAAC,GAAG,CAAA,EAAE;AAC5C,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW,IAAA,CAAK,QAAQ,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA,EACtD;AACF,CAAA;AAGO,SAAS,qBACd,IAAA,EACA,GAAA,EACA,QAAA,EACA,IAAA,GAA0B,EAAC,EACf;AACZ,EAAA,MAAM,KAAK,GAAA,CAAI,EAAA;AACf,EAAA,MAAM,IAAA,GAAO,IAAI,mBAAA,CAAoB,GAAA,EAAK,UAAU,IAAI,CAAA;AACxD,EAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAC3B,EAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,MAAA,CAAO,GAAA,EAAK,CAAA;AAC3B,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,MAAA,CAAO,SAAA,CAAU,MAAM,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,MAAA,CAAO,GAAA,EAAK,CAAC,CAAA;AACxE,EAAA,MAAM,UAAU,EAAA,CAAG,EAAA,CAAG,mBAAmB,CAAC,EAAE,IAAG,KAAM;AAAE,IAAA,IAAI,EAAA,KAAO,OAAA,EAAS,IAAA,CAAK,IAAA,EAAK;AAAA,EAAG,CAAC,CAAA;AACzF,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,EAAU;AACV,IAAA,OAAA,EAAQ;AACR,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf,CAAA;AACF;;;ACzYA,IAAI,IAAA,GAA2B,IAAA;AAE/B,IAAMN,IAAAA,GAAM,CAAC,CAAA,KAAsB,CAAA,CAAE,QAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,MAAM,CAAA;AAG/F,SAAS,aAAA,CAAc,IAAA,GAAyB,EAAC,EAAS;AAC/D,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,iBAAA;AAC5B,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,oFAAA;AAChC,EAAA,MAAM,UAAA,GAAa,KAAK,QAAA,KAAa,IAAA;AACrC,EAAA,IAAA,KAAS,QAAA,CAAS,cAAc,KAAK,CAAA;AACrC,EAAA,IAAA,CAAK,SAAA,GAAY,mBAAA;AACjB,EAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,aAAa,CAAA;AACvC,EAAA,IAAA,CAAK,YAAA,CAAa,cAAc,MAAM,CAAA;AACtC,EAAA,IAAA,CAAK,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,EAKiBA,IAAAA,CAAI,KAAK,CAAC,CAAA;AAAA,+BAAA,EACbA,IAAAA,CAAI,OAAO,CAAC,CAAA;AAAA,MAAA,EACrC,IAAA,CAAK,SAAS,CAAA,4BAAA,EAA+BA,IAAAA,CAAI,KAAK,MAAM,CAAC,SAAS,EAAE;AAAA,MAAA,EACxE,UAAA,GAAa,kDAAkDA,IAAAA,CAAI,IAAA,CAAK,eAAe,QAAQ,CAAC,cAAc,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA;AAsBtH,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAA,CAAK,aAAA,CAAc,mBAAmB,CAAA,EAAG,gBAAA,CAAiB,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,QAAA,KAAa,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA,MAAY,CAAA;AAAA,EAChI;AACA,EAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AACvD;AAGO,SAAS,aAAA,GAAsB;AACpC,EAAA,IAAA,EAAM,MAAA,EAAO;AACb,EAAA,IAAA,GAAO,IAAA;AACT","file":"index.js","sourcesContent":["import { type Ticker, type Texture } from 'pixi.js';\nimport { type PanelControl, type SliderControl, type ButtonControl, type OpenUI } from '@open-slot-ui/core';\nimport { ControlView } from './ControlView';\nimport { SliderView } from './SliderView';\nimport { ButtonView } from './ButtonView';\n\nexport interface PopoverParts {\n music: SliderControl;\n sfx: SliderControl;\n rules: ButtonControl;\n}\n\nexport interface PopoverArt {\n rulesTexture?: Texture;\n musicTrack?: Texture;\n soundTrack?: Texture;\n}\n\ninterface FanItem {\n view: ControlView;\n tx: number;\n ty: number;\n prog: number;\n}\n\nconst GAP = 80; // vertical spacing between fanned items (ref px)\nconst RISE = 26; // how far each item rises into place\nconst STAGGER = 38; // ms between pops — snappy \"pop-pop-pop\"\n// slider track is 290x60 @ ~0.9 → its visual centre, used as the scale pivot\nconst SLIDER_PIVOT_X = 130;\nconst SLIDER_PIVOT_Y = 27;\n\n/**\n * The settings flyout as a VERTICAL FAN: on open, the options swoosh up and pop\n * in one-by-one (bottom→top); on close they retract together. Items are\n * right-aligned and rise above the (right-side) menu button. No static panel.\n */\nexport class PopoverView extends ControlView {\n private readonly music: SliderView;\n private readonly sfx: SliderView;\n private readonly rules: ButtonView;\n private readonly items: FanItem[];\n private phase = 0;\n private running = false;\n private readonly tick: (t: Ticker) => void;\n\n constructor(private readonly panel: PanelControl, parts: PopoverParts, ui: OpenUI, private readonly ticker: Ticker, art: PopoverArt = {}) {\n super(panel, ui);\n\n this.rules = new ButtonView(parts.rules, ui, ticker, { shape: 'pill', height: 50, iconTexture: art.rulesTexture, iconTarget: 50 });\n this.music = new SliderView(parts.music, ui, art.musicTrack);\n this.sfx = new SliderView(parts.sfx, ui, art.soundTrack);\n // pivot sliders at their centre so they scale from the middle, not the left edge\n this.music.pivot.set(SLIDER_PIVOT_X, SLIDER_PIVOT_Y);\n this.sfx.pivot.set(SLIDER_PIVOT_X, SLIDER_PIVOT_Y);\n\n // Right-aligned column rising above the button; pop order = bottom → top.\n // tx/ty are the item CENTRES (rules ButtonView is already centre-origin).\n this.items = [\n { view: this.sfx, tx: -130, ty: -GAP, prog: 0 },\n { view: this.music, tx: -130, ty: -GAP * 2, prog: 0 },\n { view: this.rules, tx: -132, ty: -GAP * 3, prog: 0 },\n ];\n for (const it of this.items) {\n it.view.position.set(it.tx, it.ty);\n it.view.scale.set(0);\n it.view.alpha = 0;\n it.view.visible = false;\n this.addChild(it.view);\n }\n\n this.tick = (t) => this.update(t.deltaMS);\n this.applyState();\n this.disposers.push(this.panel.state.subscribe(() => this.applyState()));\n }\n\n private applyState(): void {\n this.phase = 0;\n const open = this.panel.isOpen;\n this.eventMode = open ? 'auto' : 'none';\n if (open) for (const it of this.items) it.view.visible = true;\n if (!this.running) {\n this.running = true;\n this.ticker.add(this.tick);\n }\n }\n\n private update(dt: number): void {\n this.phase += Math.min(dt, 40); // cap stalls so the stagger never gets skipped\n const open = this.panel.isOpen;\n const finalTarget = open ? 1 : 0;\n let settled = true;\n for (let i = 0; i < this.items.length; i++) {\n const it = this.items[i]!;\n const target = open && this.phase > i * STAGGER ? 1 : 0; // staggered easing target\n it.prog += (target - it.prog) * Math.min(1, dt / (open ? 50 : 80));\n const s = it.prog;\n it.view.scale.set(s);\n it.view.alpha = Math.min(1, s * 1.5);\n it.view.position.set(it.tx, it.ty + (1 - s) * RISE);\n it.view.visible = s > 0.01;\n // settle against the FINAL target so the loop keeps running until every item arrives\n if (Math.abs(it.prog - finalTarget) > 0.01) settled = false;\n }\n if (settled) {\n this.running = false;\n this.ticker.remove(this.tick);\n }\n }\n\n override dispose(): void {\n if (this.running) {\n this.ticker.remove(this.tick);\n this.running = false;\n }\n this.music.dispose();\n this.sfx.dispose();\n this.rules.dispose();\n super.dispose();\n }\n}\n","import { Container, Graphics, Text, Rectangle, type Texture, type FederatedPointerEvent, type Ticker } from 'pixi.js';\nimport { type PanelControl, type ButtonControl, type OpenUI, type ScreenState, type Theme } from '@open-slot-ui/core';\nimport { ControlView } from './ControlView';\nimport { ButtonView } from './ButtonView';\n\nexport type InfoContentBuilder = (theme: Theme, width: number) => Container;\n\nexport interface PanelViewOptions {\n closeTexture?: Texture;\n content?: InfoContentBuilder;\n}\n\n// The modal is an intentionally LIGHT surface (per the design), distinct from the dark HUD theme.\nconst INK = 0x15171c;\nconst CARD = 0xffffff;\nconst HEADER_BG = 0x20242b;\nconst PAD = 16;\nconst HEADER_H = 56;\nconst MAX_W = 600;\n\n/**\n * Full-screen modal: dim backdrop + dark header (title + ✕ close) + a white,\n * scrollable content card. Content is built dynamically (so it scrolls and is\n * data-driven). Faithful to the provided Mobile Rules design.\n */\nexport class PanelView extends ControlView {\n private readonly backdrop = new Graphics();\n private readonly card = new Graphics();\n private readonly headerBg = new Graphics();\n private readonly title: Text;\n private readonly viewport = new Container();\n private readonly maskG = new Graphics();\n private readonly catcher = new Graphics();\n private readonly close: ButtonView;\n private content: Container | undefined;\n private builtWidth = -1;\n private scrollY = 0;\n private contentH = 0;\n private viewportH = 0;\n private dragging = false;\n private lastY = 0;\n private wheelHandler: ((e: WheelEvent) => void) | undefined;\n\n constructor(\n private readonly panel: PanelControl,\n closeBtn: ButtonControl,\n ui: OpenUI,\n ticker: Ticker,\n private readonly opts: PanelViewOptions = {},\n ) {\n super(panel, ui);\n this.zIndex = 100;\n\n this.backdrop.eventMode = 'static';\n this.backdrop.on('pointertap', () => this.panel.closePanel());\n\n this.title = new Text({\n text: panel.title ?? '',\n style: { fontFamily: ui.theme.type.family, fontSize: 22, fill: 0xffffff, fontWeight: '800', letterSpacing: 1 },\n });\n this.title.anchor.set(0.5);\n\n this.viewport.mask = this.maskG;\n this.catcher.eventMode = 'static';\n this.catcher.on('pointerdown', this.onDown);\n this.catcher.on('globalpointermove', this.onMove);\n this.catcher.on('pointerup', this.onUp);\n this.catcher.on('pointerupoutside', this.onUp);\n\n this.close = new ButtonView(closeBtn, ui, ticker, { iconTexture: opts.closeTexture, iconTarget: 44, glyph: 'close', radius: 24 });\n\n this.addChild(this.backdrop, this.card, this.viewport, this.maskG, this.catcher, this.headerBg, this.title, this.close);\n\n this.applyOpen(this.panel.isOpen);\n this.disposers.push(this.panel.state.subscribe(() => this.applyOpen(this.panel.isOpen)));\n }\n\n override applyLayout(screen: ScreenState): void {\n const W = screen.width;\n const H = screen.height;\n this.position.set(0, 0);\n this.scale.set(1);\n\n this.backdrop.clear().rect(0, 0, W, H).fill({ color: 0x000000, alpha: 0.6 });\n this.backdrop.hitArea = new Rectangle(0, 0, W, H);\n\n const cardW = Math.min(W - PAD * 2, MAX_W);\n const cx = (W - cardW) / 2;\n const hy = PAD;\n this.headerBg.clear().roundRect(cx, hy, cardW, HEADER_H, HEADER_H / 2).fill({ color: HEADER_BG });\n this.title.position.set(W / 2, hy + HEADER_H / 2);\n this.close.position.set(cx + cardW - HEADER_H / 2, hy + HEADER_H / 2);\n\n const cardY = hy + HEADER_H + 12;\n const cardH = H - cardY - PAD;\n this.card.clear().roundRect(cx, cardY, cardW, cardH, 22).fill({ color: CARD });\n\n const inset = 20;\n const vpX = cx + inset;\n const vpY = cardY + inset;\n const vpW = cardW - inset * 2;\n const vpH = cardH - inset * 2;\n this.viewport.position.set(vpX, vpY);\n this.viewportH = vpH;\n this.maskG.clear().rect(vpX, vpY, vpW, vpH).fill({ color: 0xffffff });\n this.catcher.clear().rect(vpX, vpY, vpW, vpH).fill({ color: 0xffffff, alpha: 0.0001 });\n\n // (re)build content to the current viewport width\n if (Math.abs(vpW - this.builtWidth) > 1) {\n this.content?.destroy({ children: true });\n this.content = this.opts.content?.(this.ui.theme, vpW) ?? this.fallback(vpW);\n this.viewport.addChild(this.content);\n this.builtWidth = vpW;\n }\n if (this.content) this.content.x = 0;\n this.contentH = this.content?.height ?? 0;\n this.clampScroll();\n }\n\n private fallback(width: number): Container {\n const c = new Container();\n const t = new Text({ text: 'No content provided.', style: { fontFamily: this.ui.theme.type.family, fontSize: 18, fill: INK, wordWrap: true, wordWrapWidth: width } });\n c.addChild(t);\n return c;\n }\n\n private readonly onDown = (e: FederatedPointerEvent): void => {\n this.dragging = true;\n this.lastY = e.global.y;\n };\n private readonly onMove = (e: FederatedPointerEvent): void => {\n if (!this.dragging) return;\n this.scrollY += e.global.y - this.lastY;\n this.lastY = e.global.y;\n this.clampScroll();\n };\n private readonly onUp = (): void => {\n this.dragging = false;\n };\n\n private clampScroll(): void {\n const min = Math.min(0, this.viewportH - this.contentH);\n this.scrollY = Math.max(min, Math.min(0, this.scrollY));\n if (this.content) this.content.y = this.scrollY;\n }\n\n private applyOpen(open: boolean): void {\n this.visible = open;\n this.eventMode = open ? 'static' : 'none';\n this.alpha = open ? 1 : 0;\n if (open) {\n this.scrollY = 0;\n this.clampScroll();\n if (!this.wheelHandler) {\n this.wheelHandler = (e: WheelEvent) => {\n this.scrollY -= e.deltaY;\n this.clampScroll();\n };\n window.addEventListener('wheel', this.wheelHandler, { passive: true });\n }\n } else if (this.wheelHandler) {\n window.removeEventListener('wheel', this.wheelHandler);\n this.wheelHandler = undefined;\n }\n }\n\n override dispose(): void {\n if (this.wheelHandler) window.removeEventListener('wheel', this.wheelHandler);\n this.close.dispose();\n super.dispose();\n }\n}\n","import { Container, Graphics, type Ticker } from 'pixi.js';\nimport { type OpenUI, type PanelControl, type Control, type BlockSpec } from '@open-slot-ui/core';\nimport { ControlView } from './ControlView';\nimport { buildBlockColumn, type ControlViewFactory } from './blockColumn';\n\nexport interface PanelBodyOptions {\n width?: number;\n controlSkins?: Partial<Record<string, ControlViewFactory>>;\n}\n\n/**\n * A small, CENTERED panel body (the settings popover / declarative panels): walks\n * a `BlockSpec[]` via the shared {@link buildBlockColumn} renderer, draws a branded\n * card behind it, and follows the PanelControl's open/closed state. A `modal`\n * variant also gets a dismissable backdrop. Text re-renders on `ui.locale` change.\n * (The big scrollable menu uses {@link MenuView}, which shares the same renderer.)\n */\nexport class PanelBodyView extends ControlView {\n private readonly backdrop = new Graphics();\n private readonly card = new Graphics();\n private readonly content = new Container();\n private childViews: ControlView[] = [];\n private readonly bodyW: number;\n\n constructor(\n private readonly panelControl: PanelControl,\n private readonly controls: Control[],\n private readonly blocks: BlockSpec[],\n ui: OpenUI,\n private readonly ticker: Ticker,\n private readonly opts: PanelBodyOptions = {},\n ) {\n super(panelControl, ui);\n this.bodyW = opts.width ?? 360;\n\n this.addChild(this.backdrop, this.card, this.content);\n this.rebuild();\n this.applyVisibility();\n\n this.disposers.push(\n this.panelControl.state.subscribe(() => this.applyVisibility()),\n this.ui.locale.subscribe(() => {\n if (!this.destroyed) this.rebuild();\n }),\n );\n\n if (this.panelControl.variant === 'modal') {\n this.backdrop.eventMode = 'static';\n this.backdrop.on('pointertap', () => this.panelControl.closePanel());\n }\n }\n\n private rebuild(): void {\n for (const v of this.childViews) v.dispose();\n this.childViews.length = 0;\n // Destroy direct children (wraps/static nodes) WITHOUT children:true so the\n // already-disposed control views aren't re-destroyed (matches the prior code).\n for (const child of this.content.removeChildren()) child.destroy();\n\n const col = buildBlockColumn(this.blocks, this.controls, this.ui, this.ticker, this.bodyW, { controlSkins: this.opts.controlSkins });\n this.childViews = col.views;\n this.content.addChild(...col.content.removeChildren());\n this.content.position.set(0, -col.height / 2);\n this.drawChrome(this.bodyW, col.height);\n }\n\n private drawChrome(width: number, height: number): void {\n const t = this.ui.theme;\n this.card.clear()\n .roundRect(-width / 2, -height / 2, width, height, t.radius.card)\n .fill({ color: t.color.surface })\n .stroke({ width: 3, color: t.color.accent });\n\n this.backdrop.clear();\n if (this.panelControl.variant === 'modal') {\n this.backdrop.rect(-3000, -3000, 6000, 6000).fill({ color: 0x000000, alpha: 0.6 });\n }\n }\n\n private applyVisibility(): void {\n const open = this.panelControl.isOpen;\n this.visible = open;\n this.eventMode = open ? 'auto' : 'none';\n }\n\n override dispose(): void {\n for (const v of this.childViews) v.dispose();\n this.childViews.length = 0;\n super.dispose();\n }\n}\n","// The info menu (☰ → Settings · Paytable · Rules) as the library's ONE polished design:\n// a white card with gold accents + section rules, driven ENTIRELY by the `UISpec.menu`\n// (banner · settings · paytable · rules) and wired to the live `OpenUI` state. It renders\n// the full modular BlockSpec palette, is fully localized (every string flows through\n// `ui.t`, re-translates on locale change), and is a DOM overlay over the canvas (works in\n// every browser + the Stake iframe). `mountHud` mounts it by default; pass `menu:false` to\n// supply your own instead. The look matches the Open-UI Figma reference.\n\nimport type { Application } from 'pixi.js';\nimport {\n INFO_MENU_CSS,\n INFO_MENU_VARS,\n LOCALE_LABELS,\n auditRules,\n escapeHtml as esc,\n factsVars,\n renderBlocksHtml as renderBlocks,\n renderRulesAuditHtml,\n type BlockSpec,\n type MenuSpec,\n type OpenUI,\n} from '@open-slot-ui/core';\n\n// The block renderer + the stylesheet live in CORE (`spec/rulesHtml.ts`) so the\n// SAME code that draws this menu in-game powers external tooling (the stakeplate\n// rules editor's WYSIWYG preview) — one source of truth for how a block looks.\n/* removed local renderBlocks — see @open-slot-ui/core renderBlocksHtml */\n/** Render the game's extra settings blocks (label-left / control-right, with a hint). */\nfunction renderSettingBlock(b: BlockSpec, tr: (s: string) => string): string {\n const hint = 'hint' in b && b.hint ? `<div class=\"ohm-hint\">${esc(tr(b.hint))}</div>` : '';\n const label = 'label' in b && b.label ? esc(tr(b.label)) : '';\n switch (b.kind) {\n case 'toggle':\n return `<div class=\"ohm-setting\"><label class=\"ohm-row ohm-check\"><span>${label}</span><span class=\"ohm-ctl\"><input data-set=\"${b.id}\" type=\"checkbox\"${b.on ? ' checked' : ''}></span></label>${hint}</div>`;\n case 'slider':\n return `<div class=\"ohm-setting\"><label class=\"ohm-row\"><span>${label}</span><input data-set=\"${b.id}\" type=\"range\" min=\"0\" max=\"1\" step=\"0.01\" value=\"${b.initial ?? 1}\"></label>${hint}</div>`;\n case 'select': {\n const opts = b.options.map((o, i) => `<option value=\"${esc(o.value)}\"${i === (b.index ?? 0) ? ' selected' : ''}>${esc(tr(o.label))}</option>`).join('');\n return `<div class=\"ohm-setting\"><label class=\"ohm-row\"><span>${label}</span><select data-set=\"${b.id}\">${opts}</select></label>${hint}</div>`;\n }\n default:\n return '';\n }\n}\n\n/**\n * Mount the info menu overlay for a booted `OpenUI`. Reads `ui.spec.menu`; opens/closes with\n * `ui.settingsPanel` (the canvas ☰ drives it). Returns a leak-free teardown.\n */\nexport function mountInfoMenu(app: Application, ui: OpenUI): () => void {\n const menu: MenuSpec = ui.spec?.menu ?? {};\n const tr = (k: string): string => ui.t(k);\n const disposers: Array<() => void> = [];\n\n const host = document.createElement('div');\n host.className = 'ohm-root';\n const vars: Record<string, string> = { ...INFO_MENU_VARS, '--font': ui.theme.type.family };\n for (const [k, v] of Object.entries(vars)) host.style.setProperty(k, v);\n\n // Built-in settings: Sound · Language (2+ locales) · Quick spin (turbo). Plus any custom\n // `menu.settings` the game supplied — all label-left / control-right, each with a hint.\n const locales = ui.spec?.locale ? Array.from(new Set([ui.spec.locale.locale, ...Object.keys(ui.spec.locale.messages)])) : [];\n const langRow = locales.length > 1\n ? `<div class=\"ohm-setting\"><label class=\"ohm-row\"><span>${tr('Language')}</span><select id=\"ohm-lang\">${locales.map((c) => `<option value=\"${c}\"${c === ui.locale.get() ? ' selected' : ''}>${esc(LOCALE_LABELS[c] ?? c)}</option>`).join('')}</select></label></div>`\n : '';\n const turbo = ui.turbo;\n const cap = (m: string): string => m.charAt(0).toUpperCase() + m.slice(1);\n const turboCtl = turbo.modeCount <= 2\n ? `<span class=\"ohm-ctl\"><input id=\"ohm-turbo\" type=\"checkbox\"></span>`\n : `<span class=\"ohm-ctl\"><div class=\"ohm-segmented\" id=\"ohm-turbo-seg\">${turbo.modes.map((m, i) => `<button class=\"ohm-seg\" data-i=\"${i}\">${esc(tr(cap(m)))}</button>`).join('')}</div></span>`;\n const customSettings = (menu.settings ?? []).map((b) => renderSettingBlock(b, tr)).join('');\n\n // Sound config: a toggle only, + a master Volume slider, or + Music & Effects sliders.\n const soundMode = menu.sound ?? 'sliders';\n const volRow = (id: string, label: string, hint: string, val: number): string =>\n `<div class=\"ohm-setting\"><label class=\"ohm-row\"><span>${esc(tr(label))}</span><input class=\"ohm-slider\" data-vol=\"${id}\" type=\"range\" min=\"0\" max=\"1\" step=\"0.01\" value=\"${val}\"></label><div class=\"ohm-hint\">${esc(tr(hint))}</div></div>`;\n const soundSliders =\n soundMode === 'master'\n ? volRow('master', 'Volume', 'Adjust the overall game volume.', ui.sfxSlider.value.get())\n : soundMode === 'sliders'\n ? volRow('music', 'Music', 'Adjust the background music volume.', ui.musicSlider.value.get()) +\n volRow('sfx', 'Effects', 'Adjust the sound-effects volume.', ui.sfxSlider.value.get())\n : '';\n\n // ── rules-completeness audit (\"forgotten declarations\") ─────────────────────\n // The declared game facts (spec.facts + runtime declareFacts — the buy-feature\n // modal auto-declares its features) are audited against the rules blocks. Every\n // missing REQUIRED declaration (a mode's RTP / max win, an undescribed feature)\n // and each HIGHLY RECOMMENDED one (free-spins count + retrigger, legal, controls)\n // renders as an explicit warning card at the top of the Rules section — a\n // forgotten declaration is stated when the rules open, never silent.\n // Rules copy translates WITH the facts interpolation vars: `{{rtp.base}}`-style\n // tokens (see `factsVars`) resolve from the LIVE declared facts + the game info,\n // so a stated RTP / max win / price can never drift from the configuration. The\n // audit resolves through the exact same function — copy is audited AS RENDERED.\n const rulesTr = (): ((s: string) => string) => {\n const vars = factsVars(ui.facts.get(), { 'game.name': ui.gameInfo.name ?? '', 'game.version': ui.gameInfo.version ?? '' });\n return (s: string): string => ui.t(s, vars);\n };\n const auditCardHtml = (trr: (s: string) => string): string => {\n if (!menu.rules?.length) return '';\n return renderRulesAuditHtml(auditRules(ui.facts.get(), menu.rules, { resolve: trr }), tr);\n };\n const rulesInnerHtml = (): string => {\n if (!menu.rules) return '';\n const trr = rulesTr();\n return auditCardHtml(trr) + renderBlocks(menu.rules, trr, ui.facts.get());\n };\n\n const paytableHtml = menu.paytable ? renderBlocks(menu.paytable, tr, ui.facts.get()) : '';\n const rulesHtml = rulesInnerHtml();\n const banner = menu.banner\n ? `<img class=\"ohm-logo\" alt=\"\" src=\"${menu.banner.src}\"${menu.banner.width ? ` width=\"${menu.banner.width}\"` : ''}${menu.banner.height ? ` height=\"${menu.banner.height}\"` : ''}>`\n : ui.gameInfo.name\n ? `<h1 class=\"ohm-logo-text\">${esc(ui.gameInfo.name)}</h1>`\n : '';\n\n host.innerHTML = `\n <div class=\"ohm-backdrop\" data-close></div>\n <button class=\"ohm-x\" data-close aria-label=\"Close\">✕</button>\n <div class=\"ohm-card\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"ohm-body\">\n ${banner}\n <div class=\"ohm-sec\"><span>${tr('Settings')}</span></div>\n <div class=\"ohm-setting\"><label class=\"ohm-row ohm-check\"><span>${tr('Sound')}</span><span class=\"ohm-ctl\"><input id=\"ohm-sound\" type=\"checkbox\" checked></span></label><div class=\"ohm-hint\">${tr('Turn all game sound and music on or off.')}</div></div>\n ${soundSliders}\n ${langRow}\n <div class=\"ohm-setting\"><div class=\"ohm-row ohm-check\"><span>${tr('Quick spin')}</span>${turboCtl}</div><div class=\"ohm-hint\">${tr('Speed up rounds by shortening the animation. The result is identical.')}</div></div>\n ${customSettings}\n ${paytableHtml ? `<div class=\"ohm-sec\"><span>${tr('Paytable')}</span></div>${paytableHtml}` : ''}\n ${rulesHtml ? `<div class=\"ohm-sec\"><span>${tr('Rules')}</span></div><div class=\"ohm-rules\" id=\"ohm-rules\">${rulesHtml}</div>` : ''}\n </div>\n </div>`;\n const style = document.createElement('style');\n style.textContent = INFO_MENU_CSS;\n host.appendChild(style);\n document.body.appendChild(host);\n\n const $ = <T extends Element>(sel: string): T | null => host.querySelector(sel) as T | null;\n\n // Sound → mute state.\n const sound = $<HTMLInputElement>('#ohm-sound');\n if (sound) {\n sound.checked = !ui.muted.get();\n sound.addEventListener('change', () => ui.setMuted(!sound.checked));\n disposers.push(ui.muted.subscribe((m) => { sound.checked = !m; }));\n }\n // Volume sliders → the music / sfx slider controls (which emit valueChanged for the host).\n host.querySelectorAll<HTMLInputElement>('[data-vol]').forEach((el) => {\n const which = el.dataset.vol!;\n el.addEventListener('input', () => {\n const v = Number(el.value);\n if (which === 'music') ui.musicSlider.setNormalized(v);\n else if (which === 'sfx') ui.sfxSlider.setNormalized(v);\n else { ui.musicSlider.setNormalized(v); ui.sfxSlider.setNormalized(v); } // master\n });\n // reflect external changes (e.g. mute drops both to 0, unmute restores).\n const src = which === 'music' ? ui.musicSlider : ui.sfxSlider;\n disposers.push(src.value.subscribe((v) => { el.value = String(v); }));\n });\n // Language.\n const lang = $<HTMLSelectElement>('#ohm-lang');\n if (lang) lang.addEventListener('change', () => ui.setLocale(lang.value));\n // Quick spin → turbo.\n if (turbo.modeCount <= 2) {\n const tg = $<HTMLInputElement>('#ohm-turbo');\n if (tg) {\n tg.checked = turbo.isOn;\n tg.addEventListener('change', () => turbo.set(tg.checked));\n disposers.push(turbo.index.subscribe(() => { tg.checked = turbo.isOn; }));\n }\n } else {\n const segs = Array.from(host.querySelectorAll<HTMLButtonElement>('.ohm-seg'));\n segs.forEach((b) => b.addEventListener('click', () => turbo.setIndex(Number(b.dataset.i))));\n const sync = (): void => segs.forEach((b, i) => b.classList.toggle('active', i === turbo.index.get()));\n disposers.push(turbo.index.subscribe(sync));\n sync();\n }\n // Custom settings → emit events the host can handle.\n host.querySelectorAll<HTMLElement>('[data-set]').forEach((el) => {\n const id = el.dataset.set!;\n if (el instanceof HTMLInputElement && el.type === 'checkbox') el.addEventListener('change', () => ui.bus.emit('toggled', { id, on: el.checked }));\n else if (el instanceof HTMLInputElement && el.type === 'range') el.addEventListener('input', () => ui.bus.emit('valueChanged', { id, value: Number(el.value) }));\n else if (el instanceof HTMLSelectElement) el.addEventListener('change', () => ui.bus.emit('optionSelected', { id, value: el.value, index: el.selectedIndex }));\n });\n\n host.querySelectorAll('[data-close]').forEach((b) => b.addEventListener('click', () => ui.settingsPanel.closePanel()));\n\n // Re-translate the whole menu on locale change (labels + the rules body), and\n // re-audit + re-render the rules whenever the declared game facts change (e.g.\n // the buy-feature modal declaring its features after this menu mounted).\n const refreshRules = (): void => {\n const rulesEl = host.querySelector('#ohm-rules');\n if (rulesEl && menu.rules) rulesEl.innerHTML = rulesInnerHtml();\n };\n disposers.push(\n ui.locale.subscribe(() => {\n const body = host.querySelector('.ohm-body');\n if (body) {\n // simplest robust path: rebuild the localized rules body\n refreshRules();\n if (lang) lang.value = ui.locale.get();\n }\n }),\n ui.facts.subscribe(refreshRules),\n );\n\n // Open/close follows the settings panel state. While open, LOCK the HUD (ref-counted) so\n // pointer/keyboard input can't fall through the menu overlay onto the controls underneath.\n let menuLocked = false;\n disposers.push(\n ui.settingsPanel.state.subscribe(() => {\n const isOpen = ui.settingsPanel.isOpen;\n host.classList.toggle('open', isOpen);\n if (isOpen && !menuLocked) { ui.lock(); menuLocked = true; }\n else if (!isOpen && menuLocked) { ui.unlock(); menuLocked = false; }\n }),\n );\n\n return () => {\n for (const d of disposers.splice(0)) d();\n if (menuLocked) { ui.unlock(); menuLocked = false; } // don't leak the lock on teardown\n host.remove();\n };\n}\n","import { type Application } from 'pixi.js';\nimport {\n createUI,\n buildPanel,\n composeMenu,\n formatAmountPrecise,\n type OpenUI,\n type UISpec,\n type HostHooks,\n type CurrencySpec,\n type EventLog,\n type ControlSnapshot,\n type Signal,\n type OpenUIEvents,\n type Dispose,\n type JurisdictionConfig,\n type BlockSpec,\n type NoticeAction,\n type NoticeOptions,\n type RgsErrorOptions,\n} from '@open-slot-ui/core';\nimport { OpenUIPixi, type OpenUIPixiOptions } from './OpenUIPixi';\nimport { PanelBodyView } from './views/PanelBodyView';\nimport { mountInfoMenu } from './infoMenu';\n\n/** Shared BLOCKING replay modal — the round's facts + one button, non-dismissible\n * (no ✕, no backdrop close; only the button advances). Used for both the start (\"Play\")\n * and the end (\"Replay\") of a replay so it's a strict modal → round → modal loop. */\nfunction showReplayModal(ui: OpenUI, info: ReplayInfo, buttonKey: string, onSelect: () => void): void {\n const cur = info.currency ?? ui.balance.currency.get();\n const money = (n: number): string => formatAmountPrecise(n, cur); // sub-unit replay amounts show in full\n ui.showNotice(\n [\n { kind: 'heading', id: 'openui-replay-h', text: 'openui.replay.title' },\n {\n kind: 'stat-grid',\n id: 'openui-replay-g',\n items: [\n { label: 'openui.replay.baseBet', value: money(info.baseBet) },\n { label: 'openui.replay.costMultiplier', value: `${info.costMultiplier}×` },\n { label: 'openui.replay.payoutMultiplier', value: `${info.payoutMultiplier}×` },\n { label: 'openui.replay.amount', value: money(info.amount) },\n ],\n },\n ],\n [{ label: buttonKey, variant: 'primary', onSelect: () => { ui.hideNotice(); onSelect(); } }],\n { blocking: true },\n );\n}\n\n/** The round facts shown at the start of a replay (Stake \"Replay Support\"). */\nexport interface ReplayInfo {\n /** The base bet (before the mode's cost multiplier). */\n baseBet: number;\n /** The mode's cost multiplier (×), e.g. a 185× bonus buy. */\n costMultiplier: number;\n /** The round's payout multiplier (× the base bet). */\n payoutMultiplier: number;\n /** The final amount the round paid. */\n amount: number;\n /** Currency for the money values (defaults to the balance currency). */\n currency?: CurrencySpec;\n}\n\nexport interface HudOptions extends OpenUIPixiOptions {\n hooks?: HostHooks;\n /**\n * Opt IN to the legacy white **HTML info menu** (a DOM overlay). By default the menu now\n * renders as the in-canvas **Pixi `MenuView`** (Settings · Paytable · Rules, driven by\n * `spec.menu`) so the whole HUD stays on the canvas — no DOM UI. Set `infoMenu: true` to\n * use the old DOM overlay instead. `menu: false` opts out of BOTH (host supplies its own).\n */\n infoMenu?: boolean;\n}\n\n/**\n * The complete-HUD handle returned by `mountHud`. Wraps the headless OpenUI + the\n * Pixi controller with the day-to-day game verbs, so the host rarely touches the\n * lower layers. `dispose()` is the single, leak-free teardown (Charter P12).\n */\nexport interface BootedHud {\n readonly ui: OpenUI;\n readonly pixi: OpenUIPixi;\n on<K extends keyof OpenUIEvents>(type: K, fn: (p: OpenUIEvents[K]) => void): Dispose;\n setBalance(major: number): void;\n setBet(major: number): void;\n /** Set the bonus total-win amount (major units). Shown in the buy-feature slot while\n * the spin button is in free-spins mode (`setFreeSpins(n > 0)`). */\n setTotalWin(major: number): void;\n setCurrency(spec: CurrencySpec): void;\n /** Apply a Stake Engine jurisdiction config (the compliance switchboard) at runtime. */\n applyJurisdiction(jur: JurisdictionConfig): void;\n /** Report a settled round (major units): updates net position + enforces autoplay limits. */\n reportRound(win: number, bet: number): void;\n /** Set the RTP percentage shown by the RTP readout (when `displayRTP`). */\n setRtp(percent: number): void;\n /** Master mute / unmute (music + sfx). */\n setMuted(muted: boolean): void;\n /** Show a menu-style notice modal: declarative blocks + optional action buttons. */\n showNotice(blocks: BlockSpec[], actions?: NoticeAction[]): void;\n /** Show a menu-style error modal — `message`/`opts.title` are literal text OR i18n\n * keys, and `opts.actions` adds custom buttons (e.g. a \"Reload\"). */\n showError(message: string, opts?: NoticeOptions): void;\n /** Show the default (localizable, per-call overridable) message for an RGS status\n * code (e.g. `'ERR_IPB'`, `'ERR_IS'`, `'ERR_MAINTENANCE'`). */\n showRgsError(code: string, opts?: RgsErrorOptions): void;\n /** Show a FATAL error: a blocking modal that LOCKS the HUD and is dismissable only\n * in code (`hideNotice`) — for unrecoverable RGS states. */\n showFatal(message: string, opts?: NoticeOptions): void;\n /** Dismiss the notice / error modal. */\n hideNotice(): void;\n /** Social / sweepstakes mode: one switch swaps gambling wording (+ a coin → GC/SC). */\n setSocial(on: boolean, coin?: string): void;\n /** Switch the spin button to / from its free-spins face: `n > 0` shows \"N FS\". */\n setFreeSpins(n: number): void;\n /** Enter/leave replay mode (Stake `replay=true`) — locks the HUD + shows a REPLAY badge. */\n setReplay(on: boolean): void;\n /** Replay support (Stake \"Replay Support\"): at the START of a replay show the round's\n * Base Bet, its Cost + Payout multipliers and the final amount in an open-ui panel;\n * `onPlay` begins the playback. Labels are social-aware (Base Bet → Base Play, etc.);\n * amounts format with `info.currency` (defaults to the balance currency). Also flips\n * the HUD into replay mode (badge + lock). */\n replayStart(info: ReplayInfo, onPlay?: () => void): void;\n /** At the END of a replay, show the SAME facts + a \"Replay\" button that re-runs it.\n * Non-dismissible (no ✕ / backdrop close) — it's a strict modal → round → modal loop. */\n replayEnd(info: ReplayInfo, onReplay: () => void): void;\n /** Show a buy-feature confirm modal (Cancel / Confirm). Texts are literal-or-key. */\n confirmBuy(opts: { title?: string; message?: string; onConfirm: () => void; confirmLabel?: string; cancelLabel?: string }): void;\n /** Confirm-GATE a buy / bet-mode activation: when its `cost` (× base bet) exceeds\n * the configured `confirmBuyAboveCost` threshold, show a confirm popup naming the\n * feature + `price` and run `onConfirm` only on confirm; otherwise run `onConfirm`\n * straight away. This is how a game honors Stake's \"no one-click activation above\n * 2×\" rule — the library owns the threshold + popup, the game just calls this. */\n requestBuyFeature(opts: {\n cost: number;\n name?: string;\n price?: string;\n onConfirm: () => void;\n title?: string;\n message?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n }): void;\n /** Read-back: would a play of this `cost` (× base bet) require confirmation? */\n shouldConfirmBuy(cost: number): boolean;\n /** Slide the whole interactive HUD in / out — bottom controls go down, top ones up\n * (behind the status-bar plaque). Non-interactive while moving. */\n showControls(): void;\n hideControls(): void;\n setControlsVisible(visible: boolean): void;\n snapshot(): ControlSnapshot[];\n readonly events: EventLog | undefined;\n readonly inputLocked: Signal<boolean>;\n lockInput(): void;\n unlockInput(): void;\n unmount(): void;\n dispose(): void;\n}\n\n/**\n * The one-call, out-of-the-box entry: `mountHud(app)` boots the full reference\n * HUD; `mountHud(app, spec, opts)` configures it from one JSON UISpec + renderer\n * art/skins. Pure assembly over `createUI` + `OpenUIPixi` (Charter B9).\n */\nexport function mountHud(app: Application, spec: UISpec = {}, opts: HudOptions = {}): BootedHud {\n const { hooks, infoMenu, ...pixiOpts } = opts;\n const ui = createUI(spec, hooks);\n // The in-canvas Pixi menu (`MenuView`) is the default — keeps the whole HUD on the canvas.\n // `infoMenu:true` opts into the legacy DOM overlay; `menu:false` opts out of any library menu.\n const useInfoMenu = infoMenu === true && pixiOpts.menu !== false;\n // Compose the unified Pixi menu (Settings → Paytable → Rules) only when NOT using the HTML\n // menu. A Language switch is added when 2+ locales are configured; `spec.rules` folds in.\n const locales = spec.locale ? Array.from(new Set([spec.locale.locale, ...Object.keys(spec.locale.messages)])) : [];\n const menu = pixiOpts.menu === false || useInfoMenu ? false : composeMenu(spec.menu, { locales, localeSelectId: spec.localeSelectId, rulesFallback: spec.rules });\n // Game name + version footer (support / certification) — appended to the Pixi menu.\n if (menu && spec.game && (spec.game.name || spec.game.version)) {\n menu.push({ kind: 'legal', id: 'openui-game-info', text: [spec.game.name, spec.game.version ? `v${spec.game.version}` : ''].filter(Boolean).join(' · ') });\n }\n const pixi = new OpenUIPixi(ui, { ...pixiOpts, menu });\n pixi.mount(app);\n // Mount the white HTML info menu overlay (opens/closes off the canvas ☰).\n const disposeInfoMenu = useInfoMenu ? mountInfoMenu(app, ui) : undefined;\n\n // Mobile robustness: Pixi v8 SWALLOWS native `pointercancel` — it dispatches no release to\n // the pressed display object, so a button that got pointerdown (its press anim plays) but\n // then a pointercancel stays stuck `pressed` and NEVER activates. A real finger sends a\n // clean pointerup (production/iframe is fine), but touch-EMULATED taps trip it: DevTools\n // device mode fires pointercancel from its scroll-gesture recogniser, as do some in-app\n // webviews — the control \"flashes but doesn't fire\". Translate a cancel into a pointerup at\n // the same point so Pixi's normal (tap-slop-aware) handling runs and the control resolves.\n const canvas = app.canvas as HTMLCanvasElement | undefined;\n const cancelToUp = (e: PointerEvent): void => {\n canvas?.dispatchEvent(new PointerEvent('pointerup', {\n pointerId: e.pointerId, pointerType: e.pointerType, isPrimary: e.isPrimary,\n clientX: e.clientX, clientY: e.clientY, pressure: 0, bubbles: true, cancelable: true, composed: true,\n }));\n };\n canvas?.addEventListener('pointercancel', cancelToUp, true);\n\n // The reality-check reminder (RTS 13) is now wired in `createUI` (core), so it runs\n // on a wall-clock timer regardless of renderer — nothing to schedule here.\n\n // Extra declarative panels (beyond the settings menu) render as their own layers.\n const extra: PanelBodyView[] = [];\n if (spec.panels?.length) {\n for (const ps of spec.panels) {\n const built = buildPanel(ps, ui.bus);\n ui.register(built.panel);\n for (const c of built.controls) ui.register(c);\n const view = new PanelBodyView(built.panel, built.controls, built.blocks, ui, app.ticker, {\n controlSkins: pixiOpts.controlSkins,\n });\n pixi.root.addChild(view);\n view.applyLayout(ui.screen.get());\n extra.push(view);\n }\n }\n const offRelayout = ui.screen.subscribe(() => {\n const s = ui.screen.get();\n for (const v of extra) v.applyLayout(s);\n });\n\n const teardown = (): void => {\n offRelayout();\n canvas?.removeEventListener('pointercancel', cancelToUp, true);\n disposeInfoMenu?.();\n for (const v of extra) v.dispose();\n extra.length = 0;\n pixi.unmount();\n ui.dispose(); // tear down the headless subscriptions too (Charter P12)\n };\n\n function on<K extends keyof OpenUIEvents>(type: K, fn: (p: OpenUIEvents[K]) => void): Dispose {\n return ui.on(type, fn);\n }\n\n return {\n ui,\n pixi,\n on,\n setBalance: (n) => ui.balance.set(n),\n setBet: (n) => ui.bet.set(n),\n setTotalWin: (n) => ui.totalWin.set(n),\n setCurrency: (c) => {\n ui.balance.setCurrency(c);\n ui.bet.setCurrency(c);\n ui.totalWin.setCurrency(c);\n ui.netPosition.setCurrency(c);\n },\n applyJurisdiction: (j) => ui.applyJurisdiction(j),\n reportRound: (win, bet) => ui.reportRound(win, bet),\n setRtp: (p) => ui.rtp.set(p),\n setMuted: (m) => ui.setMuted(m),\n showNotice: (blocks, actions) => ui.showNotice(blocks, actions),\n showError: (message, opts) => ui.showError(message, opts),\n showRgsError: (code, opts) => ui.showRgsError(code, opts),\n showFatal: (message, opts) => ui.showFatal(message, opts),\n hideNotice: () => ui.hideNotice(),\n setSocial: (on, coin) => ui.setSocial(on, coin),\n setFreeSpins: (n) => ui.spin.setFreeSpins(n),\n setReplay: (on) => ui.setReplay(on),\n replayStart: (info, onPlay) => {\n ui.setReplay(true); // REPLAY badge + locked HUD\n showReplayModal(ui, info, 'openui.replay.play', () => onPlay?.());\n },\n replayEnd: (info, onReplay) => {\n showReplayModal(ui, info, 'openui.replay.again', onReplay);\n },\n confirmBuy: (o) => {\n // Real guard: a jurisdiction that disabled buy-feature makes this a no-op.\n if (ui.isDisabled('buyFeature')) return;\n ui.showNotice(\n [\n { kind: 'heading', id: 'buy-title', text: o.title ?? 'openui.buyFeature.title' },\n { kind: 'text', id: 'buy-body', text: o.message ?? 'openui.buyFeature.message' },\n ],\n [\n { label: o.cancelLabel ?? 'openui.cancel', variant: 'secondary' },\n { label: o.confirmLabel ?? 'openui.confirm', variant: 'primary', onSelect: o.onConfirm },\n ],\n );\n },\n shouldConfirmBuy: (cost) => ui.shouldConfirmBuy(cost),\n requestBuyFeature: (o) => {\n if (ui.isDisabled('buyFeature')) return; // jurisdiction fully disabled the feature\n if (!ui.shouldConfirmBuy(o.cost)) {\n o.onConfirm(); // cost at/under the threshold → one click is allowed\n return;\n }\n // The ONE universal confirm — the in-canvas Pixi notice modal (`DialogView`, via\n // `ui.showNotice`), same as `confirmBuy`, so every confirm across the HUD is on-canvas\n // and looks identical (social/locale-aware).\n const message =\n o.message ??\n (o.name\n ? ui.t('openui.buyFeature.confirm', { name: ui.t(o.name), price: o.price ?? '' })\n : ui.t('openui.buyFeature.message'));\n ui.showNotice(\n [\n { kind: 'heading', id: 'buy-confirm-title', text: o.title ?? 'openui.buyFeature.title' },\n { kind: 'text', id: 'buy-confirm-body', text: message },\n ],\n [\n { label: o.cancelLabel ?? 'openui.cancel', variant: 'secondary' },\n { label: o.confirmLabel ?? 'openui.confirm', variant: 'primary', onSelect: () => { ui.hideNotice(); o.onConfirm(); } },\n ],\n );\n },\n showControls: () => pixi.setControlsVisible(true),\n hideControls: () => pixi.setControlsVisible(false),\n setControlsVisible: (v) => pixi.setControlsVisible(v),\n snapshot: () => ui.snapshot(),\n events: pixi.eventLog,\n inputLocked: ui.locked,\n lockInput: () => ui.lock(),\n unlockInput: () => ui.unlock(),\n unmount: teardown,\n dispose: teardown,\n };\n}\n","// The BUY-FEATURE modal — the open-slot-ui host component opened by the bonus button.\n// The bonus (☰ coin) button opens a card LIST of the game's buyable/activatable features;\n// each card has its own Buy/Activate action, and buying (or activating a boost) is gated by\n// the shared Pixi confirm notice. Rendered ENTIRELY in Pixi (in-canvas Container on the HUD\n// root) — no DOM overlay — so the whole HUD stays on the canvas. One biased white design\n// (independent of the game theme), matching the notice/menu; fully localized + social-aware.\n//\n// Each feature is a card: `buy` = one-tap purchase (start that mode once), `boost` = an\n// activatable per-spin bet surcharge that toggles on/off. Actions emit `cardActivated` on the\n// bus AND call the `onBuy`/`onActivate` host hooks. Returns a leak-free teardown.\n\nimport { Container, Graphics, Sprite, Text, Texture, Rectangle, Assets, type FederatedPointerEvent } from 'pixi.js';\nimport type { Application } from 'pixi.js';\nimport type { BootedHud } from './mountHud';\nimport { formatAmountPrecise, type CurrencySpec, type OpenUI, type ScreenState } from '@open-slot-ui/core';\n\n/** A buy-feature card. */\nexport interface FeatureSpec {\n id: string;\n name: string;\n variant: 'buy' | 'boost';\n /** Cost as a multiple of the base bet. For `buy` this is the FULL stake multiple\n * (deducted = cost × bet); for `boost` it is the SURCHARGE over the base bet, so the\n * full per-spin cost shown/deducted is (1 + cost) × bet. */\n cost: number;\n /** Card image URL (or data URI). Optional — a neutral gradient is used when absent. */\n image?: string;\n}\n\n/** Configurable behavior of the activatable bet-boost cards. */\nexport interface BuyFeatureOptions {\n /** `'single'` → only one boost active at a time · `'multi'` → combine them. Default `'multi'`. */\n activation?: 'single' | 'multi';\n /** When any boost is active, disable the Buy buttons. Default `false`. */\n activationBlocksBuy?: boolean;\n /** Host hook for a confirmed Buy (the modal has just closed): deduct + start the feature. */\n onBuy?: (id: string, cost: number) => void;\n /** Host hook whenever the active-boost set changes (the modal stays open). */\n onActivate?: (activeIds: string[], id: string, active: boolean) => void;\n /** BASE bet source for pricing. Default reads ui.bet — pass this when ui.bet\n * displays a modified EFFECTIVE stake (boost active) instead of the base bet. */\n getBet?: () => number;\n}\n\n/** The Figma \"default\" white card look (independent of the dark game theme) — matches\n * the notice/menu sheets: dark text on white, black border, gold accent. */\nconst LIGHT = {\n surface: '#ffffff',\n surfaceAlt: '#eef1f6',\n text: '#181b20',\n textDim: '#5b6472',\n border: '#000000',\n accent: '#d99000',\n accentText: '#1a1200',\n scrim: '#080604',\n} as const;\n\n// Base (design) geometry — the whole sheet is uniformly scaled to fit any viewport.\nconst CARD_W = 200;\nconst IMG_H = 120;\nconst STRIP_H = 8;\nconst CARD_H = 214; // frame: image + strip + name/price body\nconst ACT_GAP = 12;\nconst ACT_H = 50;\nconst CELL_H = CARD_H + ACT_GAP + ACT_H;\nconst GAP = 18;\nconst STEP_R = 27;\nconst BET_W = 220;\nconst BET_H = 60;\nconst TITLE_H = 40;\nconst ROW_GAP = 22;\nconst TAP_SLOP = 24; // a press that lifts within this many screen px still counts as a tap\n\n/** Texture cache so a card image loads once, not on every re-render. */\nconst texCache = new Map<string, Promise<Texture>>();\nfunction loadTex(url: string): Promise<Texture> {\n let p = texCache.get(url);\n if (!p) { p = Assets.load<Texture>(url).catch(() => Texture.EMPTY); texCache.set(url, p); }\n return p;\n}\n\n/** Make a Container tap-interactive with tap-slop (a lift within TAP_SLOP of the press still\n * fires) + a subtle alpha press. Robust on touch; the mountHud pointercancel→pointerup fix\n * covers emulated-touch cancels. */\nfunction wireTap(node: Container, hit: Rectangle, onTap: () => void): void {\n node.eventMode = 'static';\n node.cursor = 'pointer';\n node.hitArea = hit;\n let down: { x: number; y: number } | null = null;\n node.on('pointerdown', (e: FederatedPointerEvent) => { down = { x: e.global.x, y: e.global.y }; node.alpha = 0.82; });\n const end = (e: FederatedPointerEvent, inside: boolean): void => {\n node.alpha = 1;\n const p = down; down = null;\n if (!p) return;\n if (inside || Math.hypot(e.global.x - p.x, e.global.y - p.y) <= TAP_SLOP) onTap();\n };\n node.on('pointerup', (e) => end(e, true));\n node.on('pointerupoutside', (e) => end(e, false));\n}\n\n/** One feature card (image + gold strip + name + price + action button). Built once; only\n * the price + action state update on bet/boost change. */\nclass FeatureCard extends Container {\n private readonly priceText: Text;\n private readonly actionBg = new Graphics();\n private readonly actionLabel: Text;\n private readonly action = new Container();\n\n constructor(spec: FeatureSpec, ui: OpenUI, onAction: () => void) {\n super();\n const fam = ui.theme.type.family;\n\n // Rounded white frame (fill under, black stroke over the clipped content).\n const fill = new Graphics().roundRect(0, 0, CARD_W, CARD_H, 14).fill({ color: LIGHT.surface });\n const clip = new Container();\n const clipMask = new Graphics().roundRect(0, 0, CARD_W, CARD_H, 14).fill({ color: 0xffffff });\n clip.mask = clipMask;\n\n // Image (or neutral gradient placeholder) in the top band.\n const placeholder = new Graphics().rect(0, 0, CARD_W, IMG_H).fill({ color: LIGHT.surfaceAlt });\n clip.addChild(placeholder);\n if (spec.image) {\n void loadTex(spec.image).then((tex) => {\n if (this.destroyed || tex === Texture.EMPTY) return;\n const sp = new Sprite(tex);\n const s = Math.max(CARD_W / tex.width, IMG_H / tex.height); // cover\n sp.scale.set(s);\n sp.x = (CARD_W - tex.width * s) / 2;\n sp.y = (IMG_H - tex.height * s) / 2;\n clip.addChildAt(sp, 1);\n });\n }\n const strip = new Graphics().rect(0, IMG_H, CARD_W, STRIP_H).fill({ color: LIGHT.accent });\n const name = new Text({ text: ui.t(spec.name), style: { fontFamily: fam, fontSize: 16, fontWeight: '600', fill: LIGHT.text } });\n name.anchor.set(0.5, 0);\n name.position.set(CARD_W / 2, IMG_H + STRIP_H + 12);\n this.priceText = new Text({ text: '', style: { fontFamily: fam, fontSize: 22, fontWeight: '800', fill: LIGHT.text } });\n this.priceText.anchor.set(0.5, 0);\n this.priceText.position.set(CARD_W / 2, IMG_H + STRIP_H + 36);\n clip.addChild(strip, name, this.priceText);\n\n const stroke = new Graphics().roundRect(0, 0, CARD_W, CARD_H, 14).stroke({ width: 4, color: LIGHT.border });\n this.addChild(fill, clip, clipMask, stroke);\n\n // Action button (Buy / Activate / Activated), pinned below the card.\n this.actionLabel = new Text({ text: '', style: { fontFamily: fam, fontSize: 15, fontWeight: '800', fill: LIGHT.text, letterSpacing: 0.5 } });\n this.actionLabel.anchor.set(0.5);\n this.actionLabel.position.set(CARD_W / 2, CARD_H + ACT_GAP + ACT_H / 2);\n this.action.addChild(this.actionBg, this.actionLabel);\n wireTap(this.action, new Rectangle(0, CARD_H + ACT_GAP, CARD_W, ACT_H), onAction);\n this.addChild(this.action);\n }\n\n /** Update price + action label/state for the current bet + boost state. */\n update(price: string, label: string, active: boolean, blocked: boolean): void {\n this.priceText.text = price;\n this.actionLabel.text = label;\n this.actionLabel.style.fill = active ? LIGHT.accentText : LIGHT.text;\n this.actionBg.clear().roundRect(0, CARD_H + ACT_GAP, CARD_W, ACT_H, 12)\n .fill({ color: active ? LIGHT.accent : LIGHT.surface }).stroke({ width: 4, color: LIGHT.border });\n this.action.eventMode = blocked ? 'none' : 'static';\n this.action.alpha = blocked ? 0.38 : 1;\n }\n}\n\nclass BuyFeatureModalView extends Container {\n private readonly backdrop = new Graphics();\n private readonly content = new Container();\n private readonly closeBtn = new Container();\n private readonly title: Text;\n private readonly betValue: Text;\n private readonly cardsRow = new Container();\n private readonly cards: FeatureCard[] = [];\n private readonly list: FeatureSpec[];\n private readonly boosts = new Set<string>();\n private readonly disposers: Array<() => void> = [];\n private screen: ScreenState | undefined;\n\n constructor(private readonly hud: BootedHud, features: FeatureSpec[], private readonly opts: BuyFeatureOptions) {\n super();\n const ui = hud.ui;\n const fam = ui.theme.type.family;\n this.list = features.slice(0, 4);\n this.zIndex = 125; // above the menu (120), below the confirm notice (DialogView, 130)\n this.visible = false;\n this.eventMode = 'none';\n\n // Declare the configured features as GAME FACTS (rules-completeness audit reads these).\n ui.declareFacts({ modes: this.list.map((f) => ({ id: f.id, name: f.name, kind: f.variant, cost: f.cost })) });\n\n // Backdrop — dim scrim; a tap on it closes the modal.\n this.backdrop.eventMode = 'static';\n this.backdrop.on('pointertap', () => this.close());\n\n // Title.\n this.title = new Text({ text: ui.t('Buy Feature'), style: { fontFamily: fam, fontSize: 30, fontWeight: '800', fill: '#ffffff', letterSpacing: 1 } });\n this.title.anchor.set(0.5, 0);\n\n // Bet stepper row: − [ BET / value ] +\n const minus = this.stepButton('−', () => ui.betStepper.dec());\n const plus = this.stepButton('+', () => ui.betStepper.inc());\n const betBox = new Container();\n const betBg = new Graphics().roundRect(-BET_W / 2, -BET_H / 2, BET_W, BET_H, 12).fill({ color: LIGHT.surface }).stroke({ width: 3, color: LIGHT.border });\n const betLabel = new Text({ text: ui.t('Bet'), style: { fontFamily: fam, fontSize: 12, fontWeight: '700', fill: LIGHT.textDim, letterSpacing: 1 } });\n betLabel.anchor.set(0.5, 0); betLabel.position.set(0, -BET_H / 2 + 8);\n this.betValue = new Text({ text: '', style: { fontFamily: fam, fontSize: 24, fontWeight: '800', fill: LIGHT.text } });\n this.betValue.anchor.set(0.5, 1); this.betValue.position.set(0, BET_H / 2 - 8);\n betBox.addChild(betBg, betLabel, this.betValue);\n const betRow = new Container();\n minus.position.set(STEP_R, 0); // center at STEP_R → left edge at x=0\n betBox.position.set(STEP_R * 2 + 16 + BET_W / 2, 0);\n plus.position.set(STEP_R * 2 + 16 + BET_W + 16 + STEP_R, 0);\n betRow.addChild(minus, betBox, plus);\n this.betRow = betRow;\n\n // Feature cards.\n for (const spec of this.list) {\n const card = new FeatureCard(spec, ui, () => this.onAction(spec.id, spec.variant));\n this.cards.push(card);\n this.cardsRow.addChild(card);\n }\n\n this.content.addChild(this.title, betRow, this.cardsRow);\n\n // Close ✕ — dark circle top-right of the viewport (not scaled with content).\n const cbg = new Graphics().circle(0, 0, 23).fill({ color: LIGHT.scrim, alpha: 0.85 });\n const cx = new Graphics().moveTo(-7, -7).lineTo(7, 7).moveTo(7, -7).lineTo(-7, 7).stroke({ width: 3, color: '#ffffff', cap: 'round' });\n this.closeBtn.addChild(cbg, cx);\n wireTap(this.closeBtn, new Rectangle(-23, -23, 46, 46), () => this.close());\n\n this.addChild(this.backdrop, this.content, this.closeBtn);\n\n this.disposers.push(\n ui.bet.value.subscribe(() => this.refresh()),\n ui.locale.subscribe(() => {\n this.title.text = ui.t('Buy Feature');\n betLabel.text = ui.t('Bet');\n this.refresh();\n this.relayout();\n }),\n );\n }\n\n private betRow!: Container;\n\n private stepButton(glyph: string, onTap: () => void): Container {\n const c = new Container();\n const fam = this.hud.ui.theme.type.family;\n const bg = new Graphics().circle(0, 0, STEP_R).fill({ color: LIGHT.surface }).stroke({ width: 3, color: LIGHT.border });\n const t = new Text({ text: glyph, style: { fontFamily: fam, fontSize: 28, fontWeight: '800', fill: LIGHT.text } });\n t.anchor.set(0.5); t.position.set(0, -1);\n c.addChild(bg, t);\n wireTap(c, new Rectangle(-STEP_R, -STEP_R, STEP_R * 2, STEP_R * 2), onTap);\n return c;\n }\n\n /** Price + action state per current bet + boosts. */\n private refresh(): void {\n const ui = this.hud.ui;\n const bet = this.opts.getBet ? this.opts.getBet() : ui.bet.get();\n const cur = ui.bet.currency.get();\n const money = (n: number): string => formatAmountPrecise(n, cur);\n this.betValue.text = money(bet);\n const blocksBuy = this.opts.activationBlocksBuy ?? false;\n this.list.forEach((f, i) => {\n const active = this.boosts.has(f.id);\n const perSpin = (f.variant === 'buy' ? f.cost : 1 + f.cost) * bet;\n const label = f.variant === 'buy' ? ui.t('Buy') : active ? ui.t('Activated') : ui.t('Activate');\n const blocked = f.variant === 'buy' && blocksBuy && this.boosts.size > 0;\n this.cards[i]!.update(money(perSpin), label, active, blocked);\n });\n }\n\n private onAction(id: string, variant: FeatureSpec['variant']): void {\n const ui = this.hud.ui;\n const f = this.list.find((x) => x.id === id);\n const bet = this.opts.getBet ? this.opts.getBet() : ui.bet.get();\n const cur = ui.bet.currency.get();\n const money = (n: number): string => formatAmountPrecise(n, cur);\n const activation = this.opts.activation ?? 'multi';\n const blocksBuy = this.opts.activationBlocksBuy ?? false;\n\n if (variant === 'boost') {\n const wasActive = this.boosts.has(id);\n const commit = (): void => {\n if (activation === 'single') this.boosts.clear();\n if (wasActive) this.boosts.delete(id); else this.boosts.add(id);\n ui.bus.emit('cardActivated', { id });\n this.refresh();\n this.opts.onActivate?.([...this.boosts], id, this.boosts.has(id));\n };\n if (wasActive) { commit(); return; } // turning a boost OFF never needs confirming\n const total = 1 + (f?.cost ?? 0);\n this.askConfirm(f?.name ?? id, money(total * bet), commit);\n } else {\n if (blocksBuy && this.boosts.size > 0) return;\n const cost = (f?.cost ?? 0) * bet;\n this.askConfirm(f?.name ?? id, money(cost), () => {\n ui.bus.emit('cardActivated', { id });\n this.close();\n this.opts.onBuy?.(id, cost);\n });\n }\n }\n\n /** The ONE universal confirm — the in-canvas Pixi notice (DialogView, zIndex 130), so it\n * layers over this modal. Message + labels come from the library's i18n (social-aware). */\n private askConfirm(name: string, price: string, onYes: () => void): void {\n const ui = this.hud.ui;\n const message = ui.t('openui.buyFeature.confirm', { name: ui.t(name), price });\n ui.showNotice(\n [\n { kind: 'heading', id: 'bfm-confirm-h', text: 'Buy Feature' },\n { kind: 'text', id: 'bfm-confirm-b', text: message },\n ],\n [\n { label: 'openui.cancel', variant: 'secondary' },\n { label: 'openui.confirm', variant: 'primary', onSelect: () => { ui.hideNotice(); onYes(); } },\n ],\n );\n }\n\n layout(screen: ScreenState): void {\n this.screen = screen;\n if (this.visible) this.relayout();\n }\n\n private relayout(): void {\n const s = this.screen;\n if (!s) return;\n const W = s.width;\n const H = s.height;\n\n this.backdrop.clear().rect(0, 0, W, H).fill({ color: LIGHT.scrim, alpha: 0.55 });\n this.backdrop.hitArea = new Rectangle(0, 0, W, H);\n\n // Column count — 4 across only when there's real width (else 2, which scales taller/bigger).\n const n = this.list.length;\n const cols = W >= 720 && (W >= 900 || H <= 540) ? Math.min(4, n) : Math.min(2, n);\n const rows = Math.ceil(n / cols);\n\n // Lay the cards into a grid.\n this.cards.forEach((card, i) => {\n const r = Math.floor(i / cols);\n const c = i % cols;\n card.position.set(c * (CARD_W + GAP), r * (CELL_H + GAP));\n });\n const gridW = cols * CARD_W + (cols - 1) * GAP;\n const gridH = rows * CELL_H + (rows - 1) * GAP;\n\n // Stack: title, bet row, cards grid — all centered on the content's x.\n const betW = 4 * STEP_R + BET_W + 32; // − [ betbox ] + (see constructor layout)\n const contentW = Math.max(gridW, betW, 340);\n this.title.position.set(contentW / 2, 0);\n this.betRow.position.set((contentW - betW) / 2, TITLE_H + ROW_GAP + STEP_R);\n this.cardsRow.position.set((contentW - gridW) / 2, TITLE_H + ROW_GAP + BET_H + ROW_GAP);\n const contentH = TITLE_H + ROW_GAP + BET_H + ROW_GAP + gridH;\n\n // Uniform scale to fit, centered.\n const scale = Math.min(1, (W * 0.94) / contentW, (H * 0.92) / contentH);\n this.content.scale.set(scale);\n this.content.position.set((W - contentW * scale) / 2, (H - contentH * scale) / 2);\n\n this.closeBtn.position.set(W - 34, 34);\n }\n\n open(): void {\n if (this.visible) return;\n this.hud.ui.lock();\n this.visible = true;\n this.eventMode = 'static';\n this.refresh();\n this.relayout();\n }\n\n close(): void {\n if (!this.visible) return;\n this.visible = false;\n this.eventMode = 'none';\n this.hud.ui.unlock();\n }\n\n get isOpen(): boolean {\n return this.visible;\n }\n\n dispose(): void {\n if (this.visible) this.hud.ui.unlock(); // don't leak the lock on teardown-while-open\n for (const d of this.disposers.splice(0)) d();\n if (!this.destroyed) this.destroy({ children: true });\n }\n}\n\n/** Mount the buy-feature modal (in-canvas Pixi). Returns a leak-free teardown. */\nexport function mountBuyFeatureModal(\n _app: Application,\n hud: BootedHud,\n features: FeatureSpec[],\n opts: BuyFeatureOptions = {},\n): () => void {\n const ui = hud.ui;\n const view = new BuyFeatureModalView(hud, features, opts);\n hud.pixi.root.addChild(view);\n view.layout(ui.screen.get());\n const offScreen = ui.screen.subscribe(() => view.layout(ui.screen.get()));\n const offOpen = ui.on('buttonActivated', ({ id }) => { if (id === 'bonus') view.open(); });\n return () => {\n offScreen();\n offOpen();\n view.dispose();\n };\n}\n","// Standalone boot / fatal ERROR screen — a full-screen block shown when the game\n// cannot reach or authenticate with the RGS BEFORE the HUD mounts (so the HUD's own\n// `showFatal` isn't available yet). It is deliberately MONOCHROME (a black-and-white\n// card — white surface, black border/mark/button, no theme accent) so it reads as a\n// neutral, out-of-game system notice over ANY game's art, and it PREVENTS PLAY\n// (non-dismissible; the only way out is Reload, which re-runs the whole handshake) —\n// Stake requires that a failed connection/auth never silently continues. Pure DOM.\n\nexport interface BootErrorOptions {\n title?: string;\n message?: string;\n /** Small technical detail for support (e.g. the RGS status line). */\n detail?: string;\n reloadLabel?: string;\n /** Reload handler (default: `window.location.reload()`). Pass `null` for no button. */\n onReload?: (() => void) | null;\n}\n\nlet host: HTMLElement | null = null;\n\nconst esc = (s: string): string => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n/** Show the open-ui-themed blocking boot error. Idempotent (replaces its content). */\nexport function showBootError(opts: BootErrorOptions = {}): void {\n const title = opts.title ?? 'Connection lost';\n const message = opts.message ?? 'The game could not reach the game server. Please reload to reconnect and continue.';\n const showReload = opts.onReload !== null;\n host ??= document.createElement('div');\n host.className = 'openui-boot-error';\n host.setAttribute('role', 'alertdialog');\n host.setAttribute('aria-modal', 'true');\n host.innerHTML = `\n <div class=\"openui-be-card\">\n <div class=\"openui-be-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 48 48\" width=\"46\" height=\"46\"><path d=\"M24 5 4 41h40L24 5Z\" fill=\"none\" stroke=\"#000\" stroke-width=\"4\" stroke-linejoin=\"round\"/><rect x=\"22\" y=\"19\" width=\"4\" height=\"12\" rx=\"2\" fill=\"#000\"/><circle cx=\"24\" cy=\"35.5\" r=\"2.5\" fill=\"#000\"/></svg>\n </div>\n <h1 class=\"openui-be-title\">${esc(title)}</h1>\n <p class=\"openui-be-msg\">${esc(message)}</p>\n ${opts.detail ? `<p class=\"openui-be-detail\">${esc(opts.detail)}</p>` : ''}\n ${showReload ? `<button class=\"openui-be-reload\" type=\"button\">${esc(opts.reloadLabel ?? 'Reload')}</button>` : ''}\n </div>\n <style>\n /* MONOCHROME by design — a neutral black-and-white system card, no theme accent. */\n .openui-boot-error { position: fixed; inset: 0; z-index: 2147483000; display: grid; place-items: center;\n font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif; color: #181b20;\n background: rgba(8,8,8,.62); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); }\n .openui-be-card { width: min(90%, 440px); text-align: center; padding: 40px 36px 32px;\n display: flex; flex-direction: column; align-items: center; gap: 14px;\n background: #fff; border: 4px solid #000; border-radius: 24px; box-shadow: 0 24px 60px rgba(0,0,0,.55); }\n .openui-be-icon { display: grid; place-items: center; width: 72px; height: 72px; border-radius: 999px;\n border: 4px solid #000; line-height: 0; }\n .openui-be-title { margin: 0; font-size: 26px; font-weight: 800; color: #000; letter-spacing: .01em; }\n .openui-be-msg { margin: 0; font-size: 16px; line-height: 1.5; font-weight: 600; color: #3a3f47; max-width: 34ch; }\n .openui-be-detail { margin: 0; font-size: 12px; line-height: 1.4; color: #8a9099; word-break: break-word;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace; max-width: 40ch; }\n .openui-be-reload { appearance: none; cursor: pointer; margin-top: 8px; padding: 14px 42px; border-radius: 999px;\n border: 4px solid #000; background: #000; color: #fff; font-weight: 800; font-size: 16px; letter-spacing: .03em;\n transition: transform .1s ease, background .12s ease; }\n .openui-be-reload:hover { background: #1c1c1c; }\n .openui-be-reload:active { transform: scale(.96); }\n </style>`;\n if (showReload) {\n host.querySelector('.openui-be-reload')?.addEventListener('click', () => (opts.onReload ?? (() => window.location.reload()))());\n }\n if (!host.isConnected) document.body.appendChild(host);\n}\n\n/** Remove the boot error screen (e.g. after a successful retry). */\nexport function hideBootError(): void {\n host?.remove();\n host = null;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-slot-ui/pixi",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "PixiJS v8 view + controller binding for open-ui — mount a themeable, responsive, fully-tested slot-game HUD onto your Pixi scene in one call.",
5
5
  "keywords": [
6
6
  "pixijs",
@@ -58,18 +58,18 @@
58
58
  "publishConfig": {
59
59
  "access": "public"
60
60
  },
61
+ "scripts": {
62
+ "build": "tsup",
63
+ "typecheck": "tsc --noEmit"
64
+ },
61
65
  "dependencies": {
62
- "@open-slot-ui/core": "0.12.0"
66
+ "@open-slot-ui/core": "workspace:*"
63
67
  },
64
68
  "peerDependencies": {
65
69
  "pixi.js": "^8"
66
70
  },
67
71
  "devDependencies": {
68
- "tsup": "^8.3.5",
69
- "pixi-text-counter": "0.2.0"
70
- },
71
- "scripts": {
72
- "build": "tsup",
73
- "typecheck": "tsc --noEmit"
72
+ "pixi-text-counter": "workspace:*",
73
+ "tsup": "^8.3.5"
74
74
  }
75
- }
75
+ }